@atomic-chat/core 0.5.1 → 0.13.2
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 +22 -0
- package/dist/app-daemon.js +20 -67
- package/dist/app-daemon.js.map +1 -1
- package/dist/backend/advisor/advisor.d.ts +132 -0
- package/dist/backend/advisor/advisor.js +537 -0
- package/dist/backend/advisor/advisor.js.map +1 -0
- package/dist/backend/advisor/index.d.ts +6 -0
- package/dist/backend/advisor/index.js +7 -0
- package/dist/backend/advisor/index.js.map +1 -0
- package/dist/backend/advisor/policy.d.ts +81 -0
- package/dist/backend/advisor/policy.js +154 -0
- package/dist/backend/advisor/policy.js.map +1 -0
- package/dist/backend/catalog/archive.d.ts +21 -7
- package/dist/backend/catalog/archive.js +57 -17
- package/dist/backend/catalog/archive.js.map +1 -1
- package/dist/backend/catalog/bundled-manifest-baseline.js +42 -26
- package/dist/backend/catalog/bundled-manifest-baseline.js.map +1 -1
- package/dist/backend/catalog/cuda-family.d.ts +12 -2
- package/dist/backend/catalog/cuda-family.js +30 -7
- package/dist/backend/catalog/cuda-family.js.map +1 -1
- package/dist/backend/catalog/index.d.ts +5 -0
- package/dist/backend/catalog/index.js +5 -0
- package/dist/backend/catalog/index.js.map +1 -1
- package/dist/backend/catalog/manifest.d.ts +5 -3
- package/dist/backend/catalog/manifest.js +12 -9
- package/dist/backend/catalog/manifest.js.map +1 -1
- package/dist/backend/catalog/migrate.d.ts +8 -6
- package/dist/backend/catalog/migrate.js +26 -15
- package/dist/backend/catalog/migrate.js.map +1 -1
- package/dist/backend/catalog/prism-catalog.d.ts +42 -0
- package/dist/backend/catalog/prism-catalog.js +101 -0
- package/dist/backend/catalog/prism-catalog.js.map +1 -0
- package/dist/backend/catalog/prism-manifest-baseline.d.ts +2 -0
- package/dist/backend/catalog/prism-manifest-baseline.js +11 -0
- package/dist/backend/catalog/prism-manifest-baseline.js.map +1 -0
- package/dist/backend/catalog/prism-manifest-baseline.json +134 -0
- package/dist/backend/catalog/prism-manifest.d.ts +90 -0
- package/dist/backend/catalog/prism-manifest.js +171 -0
- package/dist/backend/catalog/prism-manifest.js.map +1 -0
- package/dist/backend/catalog/turboquant-catalog.d.ts +60 -0
- package/dist/backend/catalog/turboquant-catalog.js +162 -0
- package/dist/backend/catalog/turboquant-catalog.js.map +1 -0
- package/dist/backend/catalog/turboquant-index.d.ts +104 -0
- package/dist/backend/catalog/turboquant-index.js +260 -0
- package/dist/backend/catalog/turboquant-index.js.map +1 -0
- package/dist/backend/index.d.ts +1 -0
- package/dist/backend/index.js +1 -0
- package/dist/backend/index.js.map +1 -1
- package/dist/backend/install/runtime-backend.d.ts +6 -6
- package/dist/backend/install/runtime-backend.js +23 -20
- package/dist/backend/install/runtime-backend.js.map +1 -1
- package/dist/backend/install/service.d.ts +106 -5
- package/dist/backend/install/service.js +247 -21
- package/dist/backend/install/service.js.map +1 -1
- package/dist/backend/installed/bundled.d.ts +19 -0
- package/dist/backend/installed/bundled.js +45 -0
- package/dist/backend/installed/bundled.js.map +1 -0
- package/dist/backend/installed/index.d.ts +1 -0
- package/dist/backend/installed/index.js +1 -0
- package/dist/backend/installed/index.js.map +1 -1
- package/dist/backend/installed/installed.js +3 -0
- package/dist/backend/installed/installed.js.map +1 -1
- package/dist/backend/optimal/optimal-cache.d.ts +27 -8
- package/dist/backend/optimal/optimal-cache.js +38 -19
- package/dist/backend/optimal/optimal-cache.js.map +1 -1
- package/dist/backend/optimal/optimal-store.js +1 -1
- package/dist/backend/optimal/optimal-store.js.map +1 -1
- package/dist/backend/select/categories.d.ts +2 -1
- package/dist/backend/select/categories.js +8 -1
- package/dist/backend/select/categories.js.map +1 -1
- package/dist/backend/select/features.d.ts +13 -5
- package/dist/backend/select/features.js +36 -6
- package/dist/backend/select/features.js.map +1 -1
- package/dist/backend/select/index.d.ts +2 -0
- package/dist/backend/select/index.js +2 -0
- package/dist/backend/select/index.js.map +1 -1
- package/dist/backend/select/prism.d.ts +54 -0
- package/dist/backend/select/prism.js +212 -0
- package/dist/backend/select/prism.js.map +1 -0
- package/dist/backend/select/recovery.d.ts +4 -2
- package/dist/backend/select/recovery.js +17 -5
- package/dist/backend/select/recovery.js.map +1 -1
- package/dist/backend/select/tiers.d.ts +20 -11
- package/dist/backend/select/tiers.js +49 -11
- package/dist/backend/select/tiers.js.map +1 -1
- package/dist/backend/select/turboquant-tiers.d.ts +45 -0
- package/dist/backend/select/turboquant-tiers.js +114 -0
- package/dist/backend/select/turboquant-tiers.js.map +1 -0
- package/dist/backend/types.d.ts +6 -69
- package/dist/cli/commands/backends.d.ts +10 -0
- package/dist/cli/commands/backends.js +142 -0
- package/dist/cli/commands/backends.js.map +1 -0
- package/dist/cli/commands/hardware.d.ts +13 -0
- package/dist/cli/commands/hardware.js +71 -0
- package/dist/cli/commands/hardware.js.map +1 -0
- package/dist/cli/commands/host-step.d.ts +28 -0
- package/dist/cli/commands/host-step.js +67 -0
- package/dist/cli/commands/host-step.js.map +1 -0
- package/dist/cli/commands/index.d.ts +4 -1
- package/dist/cli/commands/index.js +4 -1
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/serve.js +4 -4
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/shared.d.ts +6 -1
- package/dist/cli/commands/shared.js +7 -0
- package/dist/cli/commands/shared.js.map +1 -1
- package/dist/cli/io.d.ts +11 -0
- package/dist/cli/io.js +28 -3
- package/dist/cli/io.js.map +1 -1
- package/dist/cli/launch.js +2 -2
- package/dist/cli/launch.js.map +1 -1
- package/dist/cli/main.d.ts +1 -1
- package/dist/cli/main.js +11 -1
- package/dist/cli/main.js.map +1 -1
- package/dist/client/control-client.d.ts +128 -7
- package/dist/client/control-client.js +211 -12
- package/dist/client/control-client.js.map +1 -1
- package/dist/cloud/registry.js +9 -1
- package/dist/cloud/registry.js.map +1 -1
- package/dist/config/paths.d.ts +137 -0
- package/dist/config/paths.js +163 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/contracts/backend-advisor.d.ts +225 -0
- package/dist/contracts/backend-advisor.js +14 -0
- package/dist/contracts/backend-advisor.js.map +1 -0
- package/dist/contracts/control-api.d.ts +7 -1
- package/dist/contracts/control-api.js +7 -1
- package/dist/contracts/control-api.js.map +1 -1
- package/dist/contracts/decision.d.ts +394 -0
- package/dist/contracts/decision.js +69 -0
- package/dist/contracts/decision.js.map +1 -0
- package/dist/contracts/diffusion.d.ts +62 -9
- package/dist/contracts/embedding.d.ts +103 -0
- package/dist/contracts/embedding.js +24 -0
- package/dist/contracts/embedding.js.map +1 -0
- package/dist/contracts/engine-builds.d.ts +108 -0
- package/dist/contracts/engine-builds.js +11 -0
- package/dist/contracts/engine-builds.js.map +1 -0
- package/dist/contracts/engines.d.ts +157 -0
- package/dist/contracts/engines.js +50 -0
- package/dist/contracts/engines.js.map +1 -0
- package/dist/contracts/environment.d.ts +774 -0
- package/dist/contracts/environment.js +116 -0
- package/dist/contracts/environment.js.map +1 -0
- package/dist/contracts/errors.d.ts +43 -2
- package/dist/contracts/errors.js +41 -0
- package/dist/contracts/errors.js.map +1 -1
- package/dist/contracts/events.d.ts +82 -4
- package/dist/contracts/hardware.d.ts +79 -6
- package/dist/contracts/hardware.js +9 -5
- package/dist/contracts/hardware.js.map +1 -1
- package/dist/contracts/index.d.ts +8 -0
- package/dist/contracts/index.js +8 -0
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/model-compatibility.d.ts +97 -0
- package/dist/contracts/model-compatibility.js +6 -0
- package/dist/contracts/model-compatibility.js.map +1 -0
- package/dist/contracts/model-setup.d.ts +115 -0
- package/dist/contracts/model-setup.js +33 -0
- package/dist/contracts/model-setup.js.map +1 -0
- package/dist/contracts/model-yml.d.ts +14 -0
- package/dist/contracts/model-yml.js +1 -0
- package/dist/contracts/model-yml.js.map +1 -1
- package/dist/contracts/session.d.ts +45 -2
- package/dist/contracts/session.js +14 -1
- package/dist/contracts/session.js.map +1 -1
- package/dist/contracts/settings.d.ts +44 -1
- package/dist/contracts/settings.js.map +1 -1
- package/dist/core/atomic-core.d.ts +44 -5
- package/dist/core/atomic-core.js +24 -0
- package/dist/core/atomic-core.js.map +1 -1
- package/dist/core/create.js +517 -23
- package/dist/core/create.js.map +1 -1
- package/dist/core/gpu/index.d.ts +6 -0
- package/dist/core/gpu/index.js +7 -0
- package/dist/core/gpu/index.js.map +1 -0
- package/dist/core/gpu/policy.d.ts +68 -0
- package/dist/core/gpu/policy.js +99 -0
- package/dist/core/gpu/policy.js.map +1 -0
- package/dist/core/gpu/residency.d.ts +44 -0
- package/dist/core/gpu/residency.js +101 -0
- package/dist/core/gpu/residency.js.map +1 -0
- package/dist/core/gpu-residency.d.ts +39 -0
- package/dist/core/gpu-residency.js +32 -0
- package/dist/core/gpu-residency.js.map +1 -0
- package/dist/core/index.d.ts +1 -1
- package/dist/core/managed-engines.d.ts +207 -0
- package/dist/core/managed-engines.js +579 -0
- package/dist/core/managed-engines.js.map +1 -0
- package/dist/core/managed-environment.d.ts +72 -0
- package/dist/core/managed-environment.js +218 -0
- package/dist/core/managed-environment.js.map +1 -0
- package/dist/core/model-setup/index.d.ts +4 -0
- package/dist/core/model-setup/index.js +5 -0
- package/dist/core/model-setup/index.js.map +1 -0
- package/dist/core/model-setup/plan.d.ts +56 -0
- package/dist/core/model-setup/plan.js +158 -0
- package/dist/core/model-setup/plan.js.map +1 -0
- package/dist/core/model-setup/service.d.ts +92 -0
- package/dist/core/model-setup/service.js +329 -0
- package/dist/core/model-setup/service.js.map +1 -0
- package/dist/core/model-setup/store.d.ts +29 -0
- package/dist/core/model-setup/store.js +116 -0
- package/dist/core/model-setup/store.js.map +1 -0
- package/dist/core/model-setup/wiring.d.ts +59 -0
- package/dist/core/model-setup/wiring.js +132 -0
- package/dist/core/model-setup/wiring.js.map +1 -0
- package/dist/core/prism.d.ts +36 -0
- package/dist/core/prism.js +42 -0
- package/dist/core/prism.js.map +1 -0
- package/dist/core/public-server.d.ts +7 -0
- package/dist/core/public-server.js +2 -0
- package/dist/core/public-server.js.map +1 -1
- package/dist/core/sessions.d.ts +6 -1
- package/dist/core/sessions.js +18 -14
- package/dist/core/sessions.js.map +1 -1
- package/dist/core/types.d.ts +27 -1
- package/dist/core/types.js.map +1 -1
- package/dist/decision/args.d.ts +110 -0
- package/dist/decision/args.js +126 -0
- package/dist/decision/args.js.map +1 -0
- package/dist/decision/backoff.d.ts +25 -0
- package/dist/decision/backoff.js +33 -0
- package/dist/decision/backoff.js.map +1 -0
- package/dist/decision/engine-candidates.d.ts +52 -0
- package/dist/decision/engine-candidates.js +138 -0
- package/dist/decision/engine-candidates.js.map +1 -0
- package/dist/decision/engine-fallback.d.ts +41 -0
- package/dist/decision/engine-fallback.js +57 -0
- package/dist/decision/engine-fallback.js.map +1 -0
- package/dist/decision/engine-version.d.ts +27 -0
- package/dist/decision/engine-version.js +54 -0
- package/dist/decision/engine-version.js.map +1 -0
- package/dist/decision/engine.d.ts +114 -0
- package/dist/decision/engine.js +253 -0
- package/dist/decision/engine.js.map +1 -0
- package/dist/decision/http.d.ts +36 -0
- package/dist/decision/http.js +73 -0
- package/dist/decision/http.js.map +1 -0
- package/dist/decision/index.d.ts +20 -0
- package/dist/decision/index.js +21 -0
- package/dist/decision/index.js.map +1 -0
- package/dist/decision/model-facts.d.ts +32 -0
- package/dist/decision/model-facts.js +40 -0
- package/dist/decision/model-facts.js.map +1 -0
- package/dist/decision/outcome.d.ts +35 -0
- package/dist/decision/outcome.js +105 -0
- package/dist/decision/outcome.js.map +1 -0
- package/dist/decision/process.d.ts +67 -0
- package/dist/decision/process.js +133 -0
- package/dist/decision/process.js.map +1 -0
- package/dist/decision/readiness.d.ts +74 -0
- package/dist/decision/readiness.js +165 -0
- package/dist/decision/readiness.js.map +1 -0
- package/dist/decision/request.d.ts +11 -0
- package/dist/decision/request.js +56 -0
- package/dist/decision/request.js.map +1 -0
- package/dist/decision/service.d.ts +202 -0
- package/dist/decision/service.js +711 -0
- package/dist/decision/service.js.map +1 -0
- package/dist/decision/upstream-version.d.ts +23 -0
- package/dist/decision/upstream-version.js +34 -0
- package/dist/decision/upstream-version.js.map +1 -0
- package/dist/decision/wiring.d.ts +67 -0
- package/dist/decision/wiring.js +101 -0
- package/dist/decision/wiring.js.map +1 -0
- package/dist/diffusion/args.d.ts +4 -2
- package/dist/diffusion/args.js +10 -3
- package/dist/diffusion/args.js.map +1 -1
- package/dist/diffusion/image-job.js +1 -1
- package/dist/diffusion/image-job.js.map +1 -1
- package/dist/diffusion/install.d.ts +35 -11
- package/dist/diffusion/install.js +74 -49
- package/dist/diffusion/install.js.map +1 -1
- package/dist/diffusion/job-kind.d.ts +33 -7
- package/dist/diffusion/jobs.d.ts +6 -1
- package/dist/diffusion/jobs.js +60 -18
- package/dist/diffusion/jobs.js.map +1 -1
- package/dist/diffusion/parse.d.ts +1 -2
- package/dist/diffusion/parse.js +1 -13
- package/dist/diffusion/parse.js.map +1 -1
- package/dist/diffusion/progress.js +3 -0
- package/dist/diffusion/progress.js.map +1 -1
- package/dist/diffusion/server-process.d.ts +6 -0
- package/dist/diffusion/server-process.js +3 -2
- package/dist/diffusion/server-process.js.map +1 -1
- package/dist/diffusion/service.d.ts +52 -6
- package/dist/diffusion/service.js +215 -40
- package/dist/diffusion/service.js.map +1 -1
- package/dist/diffusion/session.d.ts +27 -3
- package/dist/diffusion/session.js +108 -17
- package/dist/diffusion/session.js.map +1 -1
- package/dist/diffusion/state.d.ts +19 -1
- package/dist/diffusion/state.js +10 -0
- package/dist/diffusion/state.js.map +1 -1
- package/dist/diffusion/tracker.d.ts +15 -1
- package/dist/diffusion/tracker.js +32 -6
- package/dist/diffusion/tracker.js.map +1 -1
- package/dist/diffusion/types.d.ts +7 -0
- package/dist/diffusion/types.js +11 -0
- package/dist/diffusion/types.js.map +1 -1
- package/dist/diffusion/video-estimate.d.ts +214 -0
- package/dist/diffusion/video-estimate.js +402 -0
- package/dist/diffusion/video-estimate.js.map +1 -0
- package/dist/diffusion/video-eta.d.ts +90 -0
- package/dist/diffusion/video-eta.js +248 -0
- package/dist/diffusion/video-eta.js.map +1 -0
- package/dist/diffusion/video-history.d.ts +45 -0
- package/dist/diffusion/video-history.js +121 -0
- package/dist/diffusion/video-history.js.map +1 -0
- package/dist/diffusion/video-job.d.ts +13 -5
- package/dist/diffusion/video-job.js +42 -15
- package/dist/diffusion/video-job.js.map +1 -1
- package/dist/diffusion/video-recipe.js +3 -0
- package/dist/diffusion/video-recipe.js.map +1 -1
- package/dist/diffusion/video-tiling.d.ts +54 -0
- package/dist/diffusion/video-tiling.js +70 -0
- package/dist/diffusion/video-tiling.js.map +1 -0
- package/dist/diffusion/wiring.d.ts +14 -1
- package/dist/diffusion/wiring.js +7 -0
- package/dist/diffusion/wiring.js.map +1 -1
- package/dist/downloads/protocol.d.ts +3 -8
- package/dist/downloads/protocol.js.map +1 -1
- package/dist/embedding/args.d.ts +39 -0
- package/dist/embedding/args.js +46 -0
- package/dist/embedding/args.js.map +1 -0
- package/dist/embedding/engine.d.ts +50 -0
- package/dist/embedding/engine.js +100 -0
- package/dist/embedding/engine.js.map +1 -0
- package/dist/embedding/ffmpeg.d.ts +18 -0
- package/dist/embedding/ffmpeg.js +63 -0
- package/dist/embedding/ffmpeg.js.map +1 -0
- package/dist/embedding/index.d.ts +16 -0
- package/dist/embedding/index.js +17 -0
- package/dist/embedding/index.js.map +1 -0
- package/dist/embedding/model-facts.d.ts +51 -0
- package/dist/embedding/model-facts.js +84 -0
- package/dist/embedding/model-facts.js.map +1 -0
- package/dist/embedding/process.d.ts +66 -0
- package/dist/embedding/process.js +131 -0
- package/dist/embedding/process.js.map +1 -0
- package/dist/embedding/readiness.d.ts +56 -0
- package/dist/embedding/readiness.js +114 -0
- package/dist/embedding/readiness.js.map +1 -0
- package/dist/embedding/request.d.ts +43 -0
- package/dist/embedding/request.js +285 -0
- package/dist/embedding/request.js.map +1 -0
- package/dist/embedding/service.d.ts +152 -0
- package/dist/embedding/service.js +602 -0
- package/dist/embedding/service.js.map +1 -0
- package/dist/embedding/wiring.d.ts +51 -0
- package/dist/embedding/wiring.js +79 -0
- package/dist/embedding/wiring.js.map +1 -0
- package/dist/engine-builds/builds.d.ts +54 -0
- package/dist/engine-builds/builds.js +151 -0
- package/dist/engine-builds/builds.js.map +1 -0
- package/dist/engine-builds/index.d.ts +10 -0
- package/dist/engine-builds/index.js +11 -0
- package/dist/engine-builds/index.js.map +1 -0
- package/dist/engine-builds/install.d.ts +42 -0
- package/dist/engine-builds/install.js +100 -0
- package/dist/engine-builds/install.js.map +1 -0
- package/dist/engine-builds/manifest.d.ts +121 -0
- package/dist/engine-builds/manifest.js +254 -0
- package/dist/engine-builds/manifest.js.map +1 -0
- package/dist/engine-builds/order.d.ts +24 -0
- package/dist/engine-builds/order.js +44 -0
- package/dist/engine-builds/order.js.map +1 -0
- package/dist/engine-builds/select.d.ts +123 -0
- package/dist/engine-builds/select.js +223 -0
- package/dist/engine-builds/select.js.map +1 -0
- package/dist/engine-builds/service.d.ts +123 -0
- package/dist/engine-builds/service.js +392 -0
- package/dist/engine-builds/service.js.map +1 -0
- package/dist/engines/descriptor-order.d.ts +28 -0
- package/dist/engines/descriptor-order.js +60 -0
- package/dist/engines/descriptor-order.js.map +1 -0
- package/dist/engines/engine-build.d.ts +23 -0
- package/dist/engines/engine-build.js +58 -0
- package/dist/engines/engine-build.js.map +1 -0
- package/dist/engines/index.d.ts +10 -0
- package/dist/engines/index.js +11 -0
- package/dist/engines/index.js.map +1 -0
- package/dist/engines/llamacpp.d.ts +71 -0
- package/dist/engines/llamacpp.js +176 -0
- package/dist/engines/llamacpp.js.map +1 -0
- package/dist/engines/managed.d.ts +49 -0
- package/dist/engines/managed.js +88 -0
- package/dist/engines/managed.js.map +1 -0
- package/dist/engines/service.d.ts +46 -0
- package/dist/engines/service.js +61 -0
- package/dist/engines/service.js.map +1 -0
- package/dist/engines/versions.d.ts +65 -0
- package/dist/engines/versions.js +259 -0
- package/dist/engines/versions.js.map +1 -0
- package/dist/hardware/cpu-flags.d.ts +44 -0
- package/dist/hardware/cpu-flags.js +206 -0
- package/dist/hardware/cpu-flags.js.map +1 -0
- package/dist/hardware/drm-sysfs.d.ts +51 -0
- package/dist/hardware/drm-sysfs.js +67 -0
- package/dist/hardware/drm-sysfs.js.map +1 -0
- package/dist/hardware/facts.d.ts +42 -0
- package/dist/hardware/facts.js +92 -0
- package/dist/hardware/facts.js.map +1 -0
- package/dist/hardware/index.d.ts +19 -3
- package/dist/hardware/index.js +19 -3
- package/dist/hardware/index.js.map +1 -1
- package/dist/hardware/merge.d.ts +55 -0
- package/dist/hardware/merge.js +141 -0
- package/dist/hardware/merge.js.map +1 -0
- package/dist/hardware/nvidia-smi.d.ts +43 -0
- package/dist/hardware/nvidia-smi.js +118 -0
- package/dist/hardware/nvidia-smi.js.map +1 -0
- package/dist/hardware/probe-common.d.ts +72 -0
- package/dist/hardware/probe-common.js +106 -0
- package/dist/hardware/probe-common.js.map +1 -0
- package/dist/hardware/probe-darwin.d.ts +20 -0
- package/dist/hardware/probe-darwin.js +76 -0
- package/dist/hardware/probe-darwin.js.map +1 -0
- package/dist/hardware/probe-linux.d.ts +9 -0
- package/dist/hardware/probe-linux.js +133 -0
- package/dist/hardware/probe-linux.js.map +1 -0
- package/dist/hardware/probe-windows.d.ts +7 -0
- package/dist/hardware/probe-windows.js +50 -0
- package/dist/hardware/probe-windows.js.map +1 -0
- package/dist/hardware/probe.d.ts +16 -0
- package/dist/hardware/probe.js +65 -0
- package/dist/hardware/probe.js.map +1 -0
- package/dist/hardware/service.d.ts +60 -0
- package/dist/hardware/service.js +114 -0
- package/dist/hardware/service.js.map +1 -0
- package/dist/hardware/vulkan.d.ts +47 -0
- package/dist/hardware/vulkan.js +148 -0
- package/dist/hardware/vulkan.js.map +1 -0
- package/dist/hardware/windows-video.d.ts +97 -0
- package/dist/hardware/windows-video.js +214 -0
- package/dist/hardware/windows-video.js.map +1 -0
- package/dist/host/app-daemon.d.ts +47 -0
- package/dist/host/app-daemon.js +146 -0
- package/dist/host/app-daemon.js.map +1 -0
- package/dist/host/index.d.ts +5 -3
- package/dist/host/index.js +5 -3
- package/dist/host/index.js.map +1 -1
- package/dist/host/log-file.d.ts +74 -0
- package/dist/host/log-file.js +214 -0
- package/dist/host/log-file.js.map +1 -0
- package/dist/host/recipes/enable-wsl.d.ts +63 -0
- package/dist/host/recipes/enable-wsl.js +73 -0
- package/dist/host/recipes/enable-wsl.js.map +1 -0
- package/dist/host/recipes/executor-io-windows.d.ts +69 -0
- package/dist/host/recipes/executor-io-windows.js +235 -0
- package/dist/host/recipes/executor-io-windows.js.map +1 -0
- package/dist/host/recipes/executor-io.d.ts +80 -0
- package/dist/host/recipes/executor-io.js +211 -0
- package/dist/host/recipes/executor-io.js.map +1 -0
- package/dist/host/recipes/executor.d.ts +81 -0
- package/dist/host/recipes/executor.js +678 -0
- package/dist/host/recipes/executor.js.map +1 -0
- package/dist/host/recipes/guest-executor.d.ts +29 -0
- package/dist/host/recipes/guest-executor.js +76 -0
- package/dist/host/recipes/guest-executor.js.map +1 -0
- package/dist/host/recipes/index.d.ts +16 -0
- package/dist/host/recipes/index.js +17 -0
- package/dist/host/recipes/index.js.map +1 -0
- package/dist/host/recipes/install-container-runtime.d.ts +389 -0
- package/dist/host/recipes/install-container-runtime.js +796 -0
- package/dist/host/recipes/install-container-runtime.js.map +1 -0
- package/dist/host/recipes/openpgp.d.ts +23 -0
- package/dist/host/recipes/openpgp.js +153 -0
- package/dist/host/recipes/openpgp.js.map +1 -0
- package/dist/host/recipes/request-file.d.ts +96 -0
- package/dist/host/recipes/request-file.js +103 -0
- package/dist/host/recipes/request-file.js.map +1 -0
- package/dist/lock/process-journal.d.ts +5 -2
- package/dist/lock/process-journal.js.map +1 -1
- package/dist/models/capabilities.d.ts +7 -0
- package/dist/models/capabilities.js +17 -1
- package/dist/models/capabilities.js.map +1 -1
- package/dist/models/compatibility/index.d.ts +10 -0
- package/dist/models/compatibility/index.js +11 -0
- package/dist/models/compatibility/index.js.map +1 -0
- package/dist/models/compatibility/inspect.d.ts +19 -0
- package/dist/models/compatibility/inspect.js +59 -0
- package/dist/models/compatibility/inspect.js.map +1 -0
- package/dist/models/compatibility/resolve.d.ts +59 -0
- package/dist/models/compatibility/resolve.js +219 -0
- package/dist/models/compatibility/resolve.js.map +1 -0
- package/dist/models/compatibility/rules-baseline.d.ts +2 -0
- package/dist/models/compatibility/rules-baseline.js +10 -0
- package/dist/models/compatibility/rules-baseline.js.map +1 -0
- package/dist/models/compatibility/rules-baseline.json +292 -0
- package/dist/models/compatibility/rules-service.d.ts +36 -0
- package/dist/models/compatibility/rules-service.js +109 -0
- package/dist/models/compatibility/rules-service.js.map +1 -0
- package/dist/models/compatibility/rules.d.ts +81 -0
- package/dist/models/compatibility/rules.js +164 -0
- package/dist/models/compatibility/rules.js.map +1 -0
- package/dist/models/compatibility/service.d.ts +59 -0
- package/dist/models/compatibility/service.js +137 -0
- package/dist/models/compatibility/service.js.map +1 -0
- package/dist/models/decision-checkpoint.d.ts +22 -0
- package/dist/models/decision-checkpoint.js +33 -0
- package/dist/models/decision-checkpoint.js.map +1 -0
- package/dist/models/gguf/classify.d.ts +27 -1
- package/dist/models/gguf/classify.js +78 -2
- package/dist/models/gguf/classify.js.map +1 -1
- package/dist/models/gguf/index.d.ts +1 -0
- package/dist/models/gguf/index.js +1 -0
- package/dist/models/gguf/index.js.map +1 -1
- package/dist/models/gguf/tensors.d.ts +56 -0
- package/dist/models/gguf/tensors.js +236 -0
- package/dist/models/gguf/tensors.js.map +1 -0
- package/dist/models/index.d.ts +2 -0
- package/dist/models/index.js +2 -0
- package/dist/models/index.js.map +1 -1
- package/dist/router/resolve.d.ts +7 -1
- package/dist/router/resolve.js +14 -1
- package/dist/router/resolve.js.map +1 -1
- package/dist/runtime/container/argv.d.ts +88 -0
- package/dist/runtime/container/argv.js +406 -0
- package/dist/runtime/container/argv.js.map +1 -0
- package/dist/runtime/container/docker-binary.d.ts +4 -0
- package/dist/runtime/container/docker-binary.js +34 -0
- package/dist/runtime/container/docker-binary.js.map +1 -0
- package/dist/runtime/container/env.d.ts +17 -0
- package/dist/runtime/container/env.js +52 -0
- package/dist/runtime/container/env.js.map +1 -0
- package/dist/runtime/container/exec.d.ts +27 -0
- package/dist/runtime/container/exec.js +79 -0
- package/dist/runtime/container/exec.js.map +1 -0
- package/dist/runtime/container/execution-journal.d.ts +55 -0
- package/dist/runtime/container/execution-journal.js +167 -0
- package/dist/runtime/container/execution-journal.js.map +1 -0
- package/dist/runtime/container/heartbeat.d.ts +47 -0
- package/dist/runtime/container/heartbeat.js +78 -0
- package/dist/runtime/container/heartbeat.js.map +1 -0
- package/dist/runtime/container/index.d.ts +30 -0
- package/dist/runtime/container/index.js +31 -0
- package/dist/runtime/container/index.js.map +1 -0
- package/dist/runtime/container/operations.d.ts +40 -0
- package/dist/runtime/container/operations.js +233 -0
- package/dist/runtime/container/operations.js.map +1 -0
- package/dist/runtime/container/pull.d.ts +48 -0
- package/dist/runtime/container/pull.js +280 -0
- package/dist/runtime/container/pull.js.map +1 -0
- package/dist/runtime/container/reconcile.d.ts +34 -0
- package/dist/runtime/container/reconcile.js +79 -0
- package/dist/runtime/container/reconcile.js.map +1 -0
- package/dist/runtime/container/types.d.ts +124 -0
- package/dist/runtime/container/types.js +2 -0
- package/dist/runtime/container/types.js.map +1 -0
- package/dist/runtime/container/watchdog.d.ts +114 -0
- package/dist/runtime/container/watchdog.js +418 -0
- package/dist/runtime/container/watchdog.js.map +1 -0
- package/dist/runtime/container/wiring.d.ts +78 -0
- package/dist/runtime/container/wiring.js +92 -0
- package/dist/runtime/container/wiring.js.map +1 -0
- package/dist/runtime/container/wsl-exec.d.ts +13 -0
- package/dist/runtime/container/wsl-exec.js +18 -0
- package/dist/runtime/container/wsl-exec.js.map +1 -0
- package/dist/runtime/environment/cached-document.d.ts +128 -0
- package/dist/runtime/environment/cached-document.js +218 -0
- package/dist/runtime/environment/cached-document.js.map +1 -0
- package/dist/runtime/environment/canonical-json.d.ts +78 -0
- package/dist/runtime/environment/canonical-json.js +86 -0
- package/dist/runtime/environment/canonical-json.js.map +1 -0
- package/dist/runtime/environment/descriptor-provider.d.ts +121 -0
- package/dist/runtime/environment/descriptor-provider.js +159 -0
- package/dist/runtime/environment/descriptor-provider.js.map +1 -0
- package/dist/runtime/environment/descriptor.d.ts +35 -0
- package/dist/runtime/environment/descriptor.js +239 -0
- package/dist/runtime/environment/descriptor.js.map +1 -0
- package/dist/runtime/environment/diagnostics.d.ts +50 -0
- package/dist/runtime/environment/diagnostics.js +114 -0
- package/dist/runtime/environment/diagnostics.js.map +1 -0
- package/dist/runtime/environment/document-fields.d.ts +39 -0
- package/dist/runtime/environment/document-fields.js +96 -0
- package/dist/runtime/environment/document-fields.js.map +1 -0
- package/dist/runtime/environment/environment-manifest-provider.d.ts +65 -0
- package/dist/runtime/environment/environment-manifest-provider.js +89 -0
- package/dist/runtime/environment/environment-manifest-provider.js.map +1 -0
- package/dist/runtime/environment/environment-manifest.d.ts +35 -0
- package/dist/runtime/environment/environment-manifest.js +131 -0
- package/dist/runtime/environment/environment-manifest.js.map +1 -0
- package/dist/runtime/environment/guest-host.d.ts +43 -0
- package/dist/runtime/environment/guest-host.js +88 -0
- package/dist/runtime/environment/guest-host.js.map +1 -0
- package/dist/runtime/environment/host-exec.d.ts +38 -0
- package/dist/runtime/environment/host-exec.js +145 -0
- package/dist/runtime/environment/host-exec.js.map +1 -0
- package/dist/runtime/environment/host-step-failure.d.ts +33 -0
- package/dist/runtime/environment/host-step-failure.js +34 -0
- package/dist/runtime/environment/host-step-failure.js.map +1 -0
- package/dist/runtime/environment/index.d.ts +56 -0
- package/dist/runtime/environment/index.js +57 -0
- package/dist/runtime/environment/index.js.map +1 -0
- package/dist/runtime/environment/installations.d.ts +25 -0
- package/dist/runtime/environment/installations.js +70 -0
- package/dist/runtime/environment/installations.js.map +1 -0
- package/dist/runtime/environment/inventory.d.ts +42 -0
- package/dist/runtime/environment/inventory.js +57 -0
- package/dist/runtime/environment/inventory.js.map +1 -0
- package/dist/runtime/environment/linux-blockers.d.ts +130 -0
- package/dist/runtime/environment/linux-blockers.js +251 -0
- package/dist/runtime/environment/linux-blockers.js.map +1 -0
- package/dist/runtime/environment/linux-docker-facts.d.ts +200 -0
- package/dist/runtime/environment/linux-docker-facts.js +342 -0
- package/dist/runtime/environment/linux-docker-facts.js.map +1 -0
- package/dist/runtime/environment/linux-docker-network.d.ts +80 -0
- package/dist/runtime/environment/linux-docker-network.js +195 -0
- package/dist/runtime/environment/linux-docker-network.js.map +1 -0
- package/dist/runtime/environment/linux-host.d.ts +22 -0
- package/dist/runtime/environment/linux-host.js +98 -0
- package/dist/runtime/environment/linux-host.js.map +1 -0
- package/dist/runtime/environment/linux-plan.d.ts +126 -0
- package/dist/runtime/environment/linux-plan.js +392 -0
- package/dist/runtime/environment/linux-plan.js.map +1 -0
- package/dist/runtime/environment/linux-probe.d.ts +245 -0
- package/dist/runtime/environment/linux-probe.js +315 -0
- package/dist/runtime/environment/linux-probe.js.map +1 -0
- package/dist/runtime/environment/linux-provisioner.d.ts +102 -0
- package/dist/runtime/environment/linux-provisioner.js +734 -0
- package/dist/runtime/environment/linux-provisioner.js.map +1 -0
- package/dist/runtime/environment/provisioner-descriptors.d.ts +17 -0
- package/dist/runtime/environment/provisioner-descriptors.js +62 -0
- package/dist/runtime/environment/provisioner-descriptors.js.map +1 -0
- package/dist/runtime/environment/recovery.d.ts +74 -0
- package/dist/runtime/environment/recovery.js +121 -0
- package/dist/runtime/environment/recovery.js.map +1 -0
- package/dist/runtime/environment/rootfs-download.d.ts +2 -0
- package/dist/runtime/environment/rootfs-download.js +47 -0
- package/dist/runtime/environment/rootfs-download.js.map +1 -0
- package/dist/runtime/environment/service.d.ts +280 -0
- package/dist/runtime/environment/service.js +776 -0
- package/dist/runtime/environment/service.js.map +1 -0
- package/dist/runtime/environment/state.d.ts +163 -0
- package/dist/runtime/environment/state.js +479 -0
- package/dist/runtime/environment/state.js.map +1 -0
- package/dist/runtime/environment/store-models.d.ts +19 -0
- package/dist/runtime/environment/store-models.js +30 -0
- package/dist/runtime/environment/store-models.js.map +1 -0
- package/dist/runtime/environment/store.d.ts +210 -0
- package/dist/runtime/environment/store.js +438 -0
- package/dist/runtime/environment/store.js.map +1 -0
- package/dist/runtime/environment/windows-environment-record.d.ts +48 -0
- package/dist/runtime/environment/windows-environment-record.js +89 -0
- package/dist/runtime/environment/windows-environment-record.js.map +1 -0
- package/dist/runtime/environment/windows-forwarding.d.ts +27 -0
- package/dist/runtime/environment/windows-forwarding.js +84 -0
- package/dist/runtime/environment/windows-forwarding.js.map +1 -0
- package/dist/runtime/environment/windows-guest-setup.d.ts +48 -0
- package/dist/runtime/environment/windows-guest-setup.js +157 -0
- package/dist/runtime/environment/windows-guest-setup.js.map +1 -0
- package/dist/runtime/environment/windows-host.d.ts +46 -0
- package/dist/runtime/environment/windows-host.js +163 -0
- package/dist/runtime/environment/windows-host.js.map +1 -0
- package/dist/runtime/environment/windows-plan.d.ts +78 -0
- package/dist/runtime/environment/windows-plan.js +216 -0
- package/dist/runtime/environment/windows-plan.js.map +1 -0
- package/dist/runtime/environment/windows-probe.d.ts +135 -0
- package/dist/runtime/environment/windows-probe.js +261 -0
- package/dist/runtime/environment/windows-probe.js.map +1 -0
- package/dist/runtime/environment/windows-provisioner.d.ts +113 -0
- package/dist/runtime/environment/windows-provisioner.js +782 -0
- package/dist/runtime/environment/windows-provisioner.js.map +1 -0
- package/dist/runtime/environment/wiring.d.ts +117 -0
- package/dist/runtime/environment/wiring.js +354 -0
- package/dist/runtime/environment/wiring.js.map +1 -0
- package/dist/runtime/foundation-models/runtime.d.ts +8 -0
- package/dist/runtime/foundation-models/runtime.js +5 -2
- package/dist/runtime/foundation-models/runtime.js.map +1 -1
- package/dist/runtime/llamacpp/args.d.ts +10 -1
- package/dist/runtime/llamacpp/args.js +43 -7
- package/dist/runtime/llamacpp/args.js.map +1 -1
- package/dist/runtime/llamacpp/fit-margin.d.ts +46 -0
- package/dist/runtime/llamacpp/fit-margin.js +47 -0
- package/dist/runtime/llamacpp/fit-margin.js.map +1 -0
- package/dist/runtime/llamacpp/index.d.ts +1 -0
- package/dist/runtime/llamacpp/index.js +1 -0
- package/dist/runtime/llamacpp/index.js.map +1 -1
- package/dist/runtime/llamacpp/load-plan.d.ts +23 -1
- package/dist/runtime/llamacpp/load-plan.js +82 -1
- package/dist/runtime/llamacpp/load-plan.js.map +1 -1
- package/dist/runtime/llamacpp/policy.d.ts +16 -0
- package/dist/runtime/llamacpp/policy.js +20 -0
- package/dist/runtime/llamacpp/policy.js.map +1 -1
- package/dist/runtime/llamacpp/probe.d.ts +21 -1
- package/dist/runtime/llamacpp/probe.js +32 -6
- package/dist/runtime/llamacpp/probe.js.map +1 -1
- package/dist/runtime/llamacpp/runtime.d.ts +56 -1
- package/dist/runtime/llamacpp/runtime.js +142 -15
- package/dist/runtime/llamacpp/runtime.js.map +1 -1
- package/dist/runtime/managed-engines/index.d.ts +8 -0
- package/dist/runtime/managed-engines/index.js +9 -0
- package/dist/runtime/managed-engines/index.js.map +1 -0
- package/dist/runtime/managed-engines/runtime.d.ts +140 -0
- package/dist/runtime/managed-engines/runtime.js +402 -0
- package/dist/runtime/managed-engines/runtime.js.map +1 -0
- package/dist/runtime/managed-engines/spec.d.ts +70 -0
- package/dist/runtime/managed-engines/spec.js +39 -0
- package/dist/runtime/managed-engines/spec.js.map +1 -0
- package/dist/runtime/managed-models/check.d.ts +50 -0
- package/dist/runtime/managed-models/check.js +157 -0
- package/dist/runtime/managed-models/check.js.map +1 -0
- package/dist/runtime/managed-models/compatibility.d.ts +256 -0
- package/dist/runtime/managed-models/compatibility.js +594 -0
- package/dist/runtime/managed-models/compatibility.js.map +1 -0
- package/dist/runtime/managed-models/delete.d.ts +15 -0
- package/dist/runtime/managed-models/delete.js +60 -0
- package/dist/runtime/managed-models/delete.js.map +1 -0
- package/dist/runtime/managed-models/guest-files.d.ts +8 -0
- package/dist/runtime/managed-models/guest-files.js +49 -0
- package/dist/runtime/managed-models/guest-files.js.map +1 -0
- package/dist/runtime/managed-models/index.d.ts +17 -0
- package/dist/runtime/managed-models/index.js +18 -0
- package/dist/runtime/managed-models/index.js.map +1 -0
- package/dist/runtime/managed-models/location.d.ts +22 -0
- package/dist/runtime/managed-models/location.js +53 -0
- package/dist/runtime/managed-models/location.js.map +1 -0
- package/dist/runtime/managed-models/migrate.d.ts +30 -0
- package/dist/runtime/managed-models/migrate.js +119 -0
- package/dist/runtime/managed-models/migrate.js.map +1 -0
- package/dist/runtime/managed-models/model-dir.d.ts +36 -0
- package/dist/runtime/managed-models/model-dir.js +136 -0
- package/dist/runtime/managed-models/model-dir.js.map +1 -0
- package/dist/runtime/managed-models/quant-format.d.ts +71 -0
- package/dist/runtime/managed-models/quant-format.js +299 -0
- package/dist/runtime/managed-models/quant-format.js.map +1 -0
- package/dist/runtime/managed-models/registry.d.ts +26 -0
- package/dist/runtime/managed-models/registry.js +66 -0
- package/dist/runtime/managed-models/registry.js.map +1 -0
- package/dist/runtime/managed-text/adapter.d.ts +266 -0
- package/dist/runtime/managed-text/adapter.js +96 -0
- package/dist/runtime/managed-text/adapter.js.map +1 -0
- package/dist/runtime/managed-text/backend-target.d.ts +3 -0
- package/dist/runtime/managed-text/backend-target.js +52 -0
- package/dist/runtime/managed-text/backend-target.js.map +1 -0
- package/dist/runtime/managed-text/deployment.d.ts +14 -0
- package/dist/runtime/managed-text/deployment.js +32 -0
- package/dist/runtime/managed-text/deployment.js.map +1 -0
- package/dist/runtime/managed-text/engine-cache.d.ts +15 -0
- package/dist/runtime/managed-text/engine-cache.js +64 -0
- package/dist/runtime/managed-text/engine-cache.js.map +1 -0
- package/dist/runtime/managed-text/gateway.d.ts +158 -0
- package/dist/runtime/managed-text/gateway.js +535 -0
- package/dist/runtime/managed-text/gateway.js.map +1 -0
- package/dist/runtime/managed-text/generation-defaults.d.ts +23 -0
- package/dist/runtime/managed-text/generation-defaults.js +51 -0
- package/dist/runtime/managed-text/generation-defaults.js.map +1 -0
- package/dist/runtime/managed-text/index.d.ts +26 -0
- package/dist/runtime/managed-text/index.js +27 -0
- package/dist/runtime/managed-text/index.js.map +1 -0
- package/dist/runtime/managed-text/lifecycle.d.ts +276 -0
- package/dist/runtime/managed-text/lifecycle.js +859 -0
- package/dist/runtime/managed-text/lifecycle.js.map +1 -0
- package/dist/runtime/managed-text/load-policy.d.ts +47 -0
- package/dist/runtime/managed-text/load-policy.js +111 -0
- package/dist/runtime/managed-text/load-policy.js.map +1 -0
- package/dist/runtime/managed-text/mount-source.d.ts +14 -0
- package/dist/runtime/managed-text/mount-source.js +18 -0
- package/dist/runtime/managed-text/mount-source.js.map +1 -0
- package/dist/runtime/managed-text/readiness.d.ts +13 -0
- package/dist/runtime/managed-text/readiness.js +24 -0
- package/dist/runtime/managed-text/readiness.js.map +1 -0
- package/dist/runtime/managed-text/request-rules.d.ts +18 -0
- package/dist/runtime/managed-text/request-rules.js +62 -0
- package/dist/runtime/managed-text/request-rules.js.map +1 -0
- package/dist/runtime/managed-text/types.d.ts +88 -0
- package/dist/runtime/managed-text/types.js +12 -0
- package/dist/runtime/managed-text/types.js.map +1 -0
- package/dist/runtime/managed-text/wsl-deployment.d.ts +24 -0
- package/dist/runtime/managed-text/wsl-deployment.js +70 -0
- package/dist/runtime/managed-text/wsl-deployment.js.map +1 -0
- package/dist/runtime/mlx/errors.d.ts +6 -1
- package/dist/runtime/mlx/errors.js +7 -2
- package/dist/runtime/mlx/errors.js.map +1 -1
- package/dist/runtime/mlx/runtime.d.ts +36 -1
- package/dist/runtime/mlx/runtime.js +85 -4
- package/dist/runtime/mlx/runtime.js.map +1 -1
- package/dist/runtime/shared/backend-output.d.ts +23 -0
- package/dist/runtime/shared/backend-output.js +32 -0
- package/dist/runtime/shared/backend-output.js.map +1 -0
- package/dist/runtime/shared/bounded-output.d.ts +24 -0
- package/dist/runtime/shared/bounded-output.js +63 -0
- package/dist/runtime/shared/bounded-output.js.map +1 -0
- package/dist/runtime/shared/external-sessions.js +9 -1
- package/dist/runtime/shared/external-sessions.js.map +1 -1
- package/dist/runtime/shared/gpu-occupancy.d.ts +60 -0
- package/dist/runtime/shared/gpu-occupancy.js +10 -0
- package/dist/runtime/shared/gpu-occupancy.js.map +1 -0
- package/dist/runtime/shared/index.d.ts +4 -0
- package/dist/runtime/shared/index.js +4 -0
- package/dist/runtime/shared/index.js.map +1 -1
- package/dist/runtime/shared/local-runtime.d.ts +35 -0
- package/dist/runtime/shared/ports.d.ts +6 -0
- package/dist/runtime/shared/ports.js +12 -1
- package/dist/runtime/shared/ports.js.map +1 -1
- package/dist/runtime/shared/process.d.ts +11 -0
- package/dist/runtime/shared/process.js +20 -0
- package/dist/runtime/shared/process.js.map +1 -1
- package/dist/runtime/shared/redact-args.d.ts +7 -0
- package/dist/runtime/shared/redact-args.js +26 -0
- package/dist/runtime/shared/redact-args.js.map +1 -0
- package/dist/runtime/shared/sidecar.d.ts +15 -0
- package/dist/runtime/shared/sidecar.js +43 -8
- package/dist/runtime/shared/sidecar.js.map +1 -1
- package/dist/runtime/tensorrt-llm/adapter.d.ts +250 -0
- package/dist/runtime/tensorrt-llm/adapter.js +1011 -0
- package/dist/runtime/tensorrt-llm/adapter.js.map +1 -0
- package/dist/runtime/tensorrt-llm/check.d.ts +12 -0
- package/dist/runtime/tensorrt-llm/check.js +21 -0
- package/dist/runtime/tensorrt-llm/check.js.map +1 -0
- package/dist/runtime/tensorrt-llm/compatibility.d.ts +100 -0
- package/dist/runtime/tensorrt-llm/compatibility.js +181 -0
- package/dist/runtime/tensorrt-llm/compatibility.js.map +1 -0
- package/dist/runtime/tensorrt-llm/engine.d.ts +3 -0
- package/dist/runtime/tensorrt-llm/engine.js +24 -0
- package/dist/runtime/tensorrt-llm/engine.js.map +1 -0
- package/dist/runtime/tensorrt-llm/host-facts.d.ts +55 -0
- package/dist/runtime/tensorrt-llm/host-facts.js +87 -0
- package/dist/runtime/tensorrt-llm/host-facts.js.map +1 -0
- package/dist/runtime/tensorrt-llm/index.d.ts +30 -0
- package/dist/runtime/tensorrt-llm/index.js +31 -0
- package/dist/runtime/tensorrt-llm/index.js.map +1 -0
- package/dist/runtime/tensorrt-llm/installation.d.ts +23 -0
- package/dist/runtime/tensorrt-llm/installation.js +53 -0
- package/dist/runtime/tensorrt-llm/installation.js.map +1 -0
- package/dist/runtime/tensorrt-llm/kv-cache.d.ts +25 -0
- package/dist/runtime/tensorrt-llm/kv-cache.js +28 -0
- package/dist/runtime/tensorrt-llm/kv-cache.js.map +1 -0
- package/dist/runtime/tensorrt-llm/prelaunch.d.ts +20 -0
- package/dist/runtime/tensorrt-llm/prelaunch.js +168 -0
- package/dist/runtime/tensorrt-llm/prelaunch.js.map +1 -0
- package/dist/runtime/tensorrt-llm/route-policy.d.ts +19 -0
- package/dist/runtime/tensorrt-llm/route-policy.js +17 -0
- package/dist/runtime/tensorrt-llm/route-policy.js.map +1 -0
- package/dist/runtime/tensorrt-llm/settings.d.ts +7 -0
- package/dist/runtime/tensorrt-llm/settings.js +48 -0
- package/dist/runtime/tensorrt-llm/settings.js.map +1 -0
- package/dist/runtime/vllm/adapter.d.ts +46 -0
- package/dist/runtime/vllm/adapter.js +425 -0
- package/dist/runtime/vllm/adapter.js.map +1 -0
- package/dist/runtime/vllm/engine.d.ts +16 -0
- package/dist/runtime/vllm/engine.js +37 -0
- package/dist/runtime/vllm/engine.js.map +1 -0
- package/dist/runtime/vllm/index.d.ts +11 -0
- package/dist/runtime/vllm/index.js +12 -0
- package/dist/runtime/vllm/index.js.map +1 -0
- package/dist/runtime/vllm/memory.d.ts +69 -0
- package/dist/runtime/vllm/memory.js +123 -0
- package/dist/runtime/vllm/memory.js.map +1 -0
- package/dist/runtime/vllm/settings.d.ts +52 -0
- package/dist/runtime/vllm/settings.js +151 -0
- package/dist/runtime/vllm/settings.js.map +1 -0
- package/dist/runtime/wsl/guest-paths.d.ts +33 -0
- package/dist/runtime/wsl/guest-paths.js +83 -0
- package/dist/runtime/wsl/guest-paths.js.map +1 -0
- package/dist/runtime/wsl/guest-scope.d.ts +14 -0
- package/dist/runtime/wsl/guest-scope.js +98 -0
- package/dist/runtime/wsl/guest-scope.js.map +1 -0
- package/dist/runtime/wsl/index.d.ts +12 -0
- package/dist/runtime/wsl/index.js +13 -0
- package/dist/runtime/wsl/index.js.map +1 -0
- package/dist/runtime/wsl/keeper.d.ts +29 -0
- package/dist/runtime/wsl/keeper.js +48 -0
- package/dist/runtime/wsl/keeper.js.map +1 -0
- package/dist/runtime/wsl/transport.d.ts +106 -0
- package/dist/runtime/wsl/transport.js +181 -0
- package/dist/runtime/wsl/transport.js.map +1 -0
- package/dist/server/control/index.d.ts +1 -1
- package/dist/server/control/router.js +15 -0
- package/dist/server/control/router.js.map +1 -1
- package/dist/server/control/routes/backends.js +26 -0
- package/dist/server/control/routes/backends.js.map +1 -1
- package/dist/server/control/routes/decision.d.ts +10 -0
- package/dist/server/control/routes/decision.js +43 -0
- package/dist/server/control/routes/decision.js.map +1 -0
- package/dist/server/control/routes/diffusion-video.js +4 -0
- package/dist/server/control/routes/diffusion-video.js.map +1 -1
- package/dist/server/control/routes/diffusion.d.ts +1 -1
- package/dist/server/control/routes/diffusion.js +4 -9
- package/dist/server/control/routes/diffusion.js.map +1 -1
- package/dist/server/control/routes/embedding.d.ts +9 -0
- package/dist/server/control/routes/embedding.js +43 -0
- package/dist/server/control/routes/embedding.js.map +1 -0
- package/dist/server/control/routes/engine-builds.d.ts +14 -0
- package/dist/server/control/routes/engine-builds.js +82 -0
- package/dist/server/control/routes/engine-builds.js.map +1 -0
- package/dist/server/control/routes/engines.d.ts +17 -0
- package/dist/server/control/routes/engines.js +152 -0
- package/dist/server/control/routes/engines.js.map +1 -0
- package/dist/server/control/routes/environments.d.ts +16 -0
- package/dist/server/control/routes/environments.js +207 -0
- package/dist/server/control/routes/environments.js.map +1 -0
- package/dist/server/control/routes/hardware.d.ts +1 -1
- package/dist/server/control/routes/hardware.js +11 -6
- package/dist/server/control/routes/hardware.js.map +1 -1
- package/dist/server/control/routes/model-setups.d.ts +11 -0
- package/dist/server/control/routes/model-setups.js +55 -0
- package/dist/server/control/routes/model-setups.js.map +1 -0
- package/dist/server/control/routes/models.d.ts +3 -2
- package/dist/server/control/routes/models.js +45 -2
- package/dist/server/control/routes/models.js.map +1 -1
- package/dist/server/control/types.d.ts +167 -9
- package/dist/server/control/types.js.map +1 -1
- package/dist/server/http.d.ts +9 -1
- package/dist/server/http.js +51 -1
- package/dist/server/http.js.map +1 -1
- package/dist/server/public/decision-preview.d.ts +17 -0
- package/dist/server/public/decision-preview.js +119 -0
- package/dist/server/public/decision-preview.js.map +1 -0
- package/dist/server/public/decision.d.ts +32 -0
- package/dist/server/public/decision.js +135 -0
- package/dist/server/public/decision.js.map +1 -0
- package/dist/server/public/embedding.d.ts +31 -0
- package/dist/server/public/embedding.js +126 -0
- package/dist/server/public/embedding.js.map +1 -0
- package/dist/server/public/errors.d.ts +2 -1
- package/dist/server/public/errors.js +5 -2
- package/dist/server/public/errors.js.map +1 -1
- package/dist/server/public/forward.js +75 -3
- package/dist/server/public/forward.js.map +1 -1
- package/dist/server/public/gates.d.ts +13 -0
- package/dist/server/public/gates.js +37 -14
- package/dist/server/public/gates.js.map +1 -1
- package/dist/server/public/index.d.ts +5 -2
- package/dist/server/public/index.js +14 -1
- package/dist/server/public/index.js.map +1 -1
- package/dist/server/public/listing.d.ts +13 -2
- package/dist/server/public/listing.js +33 -9
- package/dist/server/public/listing.js.map +1 -1
- package/dist/server/public/policy.d.ts +9 -0
- package/dist/server/public/policy.js +68 -0
- package/dist/server/public/policy.js.map +1 -0
- package/dist/server/public/responses.js +10 -0
- package/dist/server/public/responses.js.map +1 -1
- package/dist/server/public/trace.d.ts +2 -2
- package/dist/server/public/trace.js +6 -2
- package/dist/server/public/trace.js.map +1 -1
- package/dist/server/public/types.d.ts +84 -1
- package/dist/settings/decision.d.ts +15 -0
- package/dist/settings/decision.js +88 -0
- package/dist/settings/decision.js.map +1 -0
- package/dist/settings/embedding.d.ts +12 -0
- package/dist/settings/embedding.js +82 -0
- package/dist/settings/embedding.js.map +1 -0
- package/dist/settings/index.d.ts +2 -0
- package/dist/settings/index.js +2 -0
- package/dist/settings/index.js.map +1 -1
- package/dist/settings/schema/atomic-prism.json +433 -0
- package/dist/settings/schema/tensorrt-llm.json +253 -0
- package/dist/settings/schema/vllm.json +273 -0
- package/dist/settings/schema.js +58 -0
- package/dist/settings/schema.js.map +1 -1
- package/dist/settings/store.d.ts +13 -2
- package/dist/settings/store.js +44 -0
- package/dist/settings/store.js.map +1 -1
- package/dist/util/index.d.ts +1 -0
- package/dist/util/index.js +1 -0
- package/dist/util/index.js.map +1 -1
- package/dist/util/result.d.ts +19 -0
- package/dist/util/result.js +15 -0
- package/dist/util/result.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
- package/src/settings/schema/atomic-prism.json +433 -0
- package/src/settings/schema/tensorrt-llm.json +253 -0
- package/src/settings/schema/vllm.json +273 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The real I/O behind `executeHostStep` on Windows (change `add-tensorrt-llm-windows`, task 2.4,
|
|
3
|
+
* design D15), for a process UAC elevated. The Linux checks (`executor-io.ts`) trust a folder by its
|
|
4
|
+
* uid and mode bits; Windows has neither, so the same promise is kept with its owner and its ACL.
|
|
5
|
+
*
|
|
6
|
+
* The app writes `<step_id>.request.json` into a folder under the user's `%LOCALAPPDATA%` whose ACL
|
|
7
|
+
* grants access only to the user, `SYSTEM` and `Administrators`, then runs this executor elevated.
|
|
8
|
+
* Before the request is read and again before the result is written, the folder — and the request
|
|
9
|
+
* itself — must be:
|
|
10
|
+
*
|
|
11
|
+
* - a real directory (file), not a reparse point: a junction or a symlink could send the elevated
|
|
12
|
+
* write of `<step_id>.result.json` into a system folder;
|
|
13
|
+
* - owned by an account, not by a broad group (`Everyone`, `Users`, `Authenticated Users`, …);
|
|
14
|
+
* - writable by nobody but that owner, `SYSTEM`, `Administrators` and `CREATOR OWNER`: an `Allow`
|
|
15
|
+
* entry granting any write, delete or permission-changing right to anyone else refuses it.
|
|
16
|
+
*
|
|
17
|
+
* Owner and ACL are read by SID, never by name (names are localized): one PowerShell query per
|
|
18
|
+
* path, the path passed in an environment variable rather than spliced into the script. Every file
|
|
19
|
+
* the executor writes goes to a fresh temporary name created exclusively and is renamed into place.
|
|
20
|
+
*
|
|
21
|
+
* Commands: only `wsl.exe`, resolved to `%SystemRoot%\System32\wsl.exe`; anything else is refused —
|
|
22
|
+
* the only recipe that runs on Windows is `windows.enable-wsl`.
|
|
23
|
+
*/
|
|
24
|
+
import { spawn } from 'node:child_process';
|
|
25
|
+
import { randomBytes } from 'node:crypto';
|
|
26
|
+
import { lstat, open, readFile, rename, rm } from 'node:fs/promises';
|
|
27
|
+
import { win32 } from 'node:path';
|
|
28
|
+
import { AtomicCoreError } from '../../contracts/index.js';
|
|
29
|
+
import { hostExec, parseRebootPending, REBOOT_PENDING_KEY } from '../../runtime/environment/index.js';
|
|
30
|
+
const SYSTEM = 'S-1-5-18';
|
|
31
|
+
const ADMINISTRATORS = 'S-1-5-32-544';
|
|
32
|
+
const CREATOR_OWNER = 'S-1-3-0';
|
|
33
|
+
/** Never an acceptable owner: a group anyone on the machine belongs to. */
|
|
34
|
+
const BROAD = new Set([
|
|
35
|
+
'S-1-1-0', // Everyone
|
|
36
|
+
'S-1-5-11', // Authenticated Users
|
|
37
|
+
'S-1-5-32-545', // Users
|
|
38
|
+
'S-1-5-32-546', // Guests
|
|
39
|
+
'S-1-5-4', // Interactive
|
|
40
|
+
'S-1-5-7', // Anonymous
|
|
41
|
+
]);
|
|
42
|
+
/**
|
|
43
|
+
* Any right that lets its holder change what is in the folder or who may: write or append data,
|
|
44
|
+
* write attributes, delete a child or the object, change its permissions or owner, and the generic
|
|
45
|
+
* write and all bits.
|
|
46
|
+
*/
|
|
47
|
+
const WRITE_RIGHTS = 0x2 | 0x4 | 0x10 | 0x40 | 0x100 | 0x10000 | 0x40000 | 0x80000 | 0x10000000 | 0x40000000;
|
|
48
|
+
/** Why `acl` cannot be trusted for `what`, or null when it can. Pure. */
|
|
49
|
+
export function judgeWindowsAcl(acl, what, expect) {
|
|
50
|
+
if (acl.reparse)
|
|
51
|
+
return `${what} is a reparse point (a junction or a link is refused)`;
|
|
52
|
+
if (acl.directory !== (expect === 'directory'))
|
|
53
|
+
return `${what} is not a ${expect}`;
|
|
54
|
+
if (BROAD.has(acl.owner))
|
|
55
|
+
return `${what} is owned by ${acl.owner}, a group anyone belongs to`;
|
|
56
|
+
const trusted = new Set([acl.owner, SYSTEM, ADMINISTRATORS, CREATOR_OWNER]);
|
|
57
|
+
const writers = acl.rules
|
|
58
|
+
.filter((rule) => rule.allow && (rule.rights & WRITE_RIGHTS) !== 0 && !trusted.has(rule.sid))
|
|
59
|
+
.map((rule) => rule.sid);
|
|
60
|
+
return writers.length === 0 ? null : `${what} is writable by ${[...new Set(writers)].join(', ')}`;
|
|
61
|
+
}
|
|
62
|
+
const ACL_QUERY = [
|
|
63
|
+
'$p = $env:ATOMIC_HOST_STEP_PATH',
|
|
64
|
+
'$i = Get-Item -LiteralPath $p -Force',
|
|
65
|
+
'$a = Get-Acl -LiteralPath $p',
|
|
66
|
+
'$t = [System.Security.Principal.SecurityIdentifier]',
|
|
67
|
+
'[pscustomobject]@{',
|
|
68
|
+
' reparse = [bool]($i.Attributes -band [System.IO.FileAttributes]::ReparsePoint)',
|
|
69
|
+
' directory = [bool]$i.PSIsContainer',
|
|
70
|
+
' owner = $a.GetOwner($t).Value',
|
|
71
|
+
' rules = @($a.GetAccessRules($true, $true, $t) | ForEach-Object {',
|
|
72
|
+
" [pscustomobject]@{ sid = $_.IdentityReference.Value; allow = ($_.AccessControlType -eq 'Allow'); rights = [int64]$_.FileSystemRights } })",
|
|
73
|
+
'} | ConvertTo-Json -Compress -Depth 4',
|
|
74
|
+
].join('\n');
|
|
75
|
+
/** `Get-Acl`'s answer, parsed; throws when PowerShell did not give one. */
|
|
76
|
+
export function parseWindowsAcl(output) {
|
|
77
|
+
if (output.code !== 0)
|
|
78
|
+
throw new Error(`Get-Acl failed (${String(output.code)}): ${output.stderr.trim()}`);
|
|
79
|
+
const raw = JSON.parse(output.stdout);
|
|
80
|
+
const rules = (Array.isArray(raw.rules) ? raw.rules : raw.rules === undefined ? [] : [raw.rules]);
|
|
81
|
+
if (typeof raw.owner !== 'string' ||
|
|
82
|
+
typeof raw.reparse !== 'boolean' ||
|
|
83
|
+
typeof raw.directory !== 'boolean') {
|
|
84
|
+
throw new Error('Get-Acl answered without an owner');
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
reparse: raw.reparse,
|
|
88
|
+
directory: raw.directory,
|
|
89
|
+
owner: raw.owner,
|
|
90
|
+
rules: rules.map((rule) => ({
|
|
91
|
+
sid: String(rule.sid),
|
|
92
|
+
allow: rule.allow === true,
|
|
93
|
+
rights: Number(rule.rights),
|
|
94
|
+
})),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Runs `command` with this process's own console (stdio inherited, window hidden), no shell, and
|
|
99
|
+
* resolves with the exit code only. The elevated executor is started by the app with `SW_HIDE`, so the
|
|
100
|
+
* console it shares is invisible. Used for the inbox `wsl.exe --install`, which refuses to install
|
|
101
|
+
* when its output is a pipe.
|
|
102
|
+
*
|
|
103
|
+
* The deadline and `until` end the whole process tree with `taskkill /T /F`: `wsl --install` runs a
|
|
104
|
+
* second `wsl.exe` that holds the distribution's console, and killing only the first leaves it behind.
|
|
105
|
+
*/
|
|
106
|
+
const consoleExec = (command, args, timeoutMs, taskkill, until) => new Promise((resolve) => {
|
|
107
|
+
const child = spawn(command, args, { stdio: 'inherit', windowsHide: true, shell: false });
|
|
108
|
+
let settled = false;
|
|
109
|
+
let cut = false;
|
|
110
|
+
let poll;
|
|
111
|
+
const endTree = () => {
|
|
112
|
+
if (child.pid === undefined)
|
|
113
|
+
return void child.kill();
|
|
114
|
+
spawn(taskkill, ['/T', '/F', '/PID', String(child.pid)], { stdio: 'ignore', windowsHide: true }).once('error', () => child.kill());
|
|
115
|
+
};
|
|
116
|
+
const timer = setTimeout(endTree, timeoutMs);
|
|
117
|
+
const check = async () => {
|
|
118
|
+
const done = await until().catch(() => false);
|
|
119
|
+
if (settled)
|
|
120
|
+
return;
|
|
121
|
+
if (done) {
|
|
122
|
+
cut = true;
|
|
123
|
+
endTree();
|
|
124
|
+
}
|
|
125
|
+
else
|
|
126
|
+
poll = setTimeout(() => void check(), UNTIL_POLL_MS);
|
|
127
|
+
};
|
|
128
|
+
if (until !== undefined)
|
|
129
|
+
poll = setTimeout(() => void check(), UNTIL_POLL_MS);
|
|
130
|
+
const settle = (output) => {
|
|
131
|
+
settled = true;
|
|
132
|
+
clearTimeout(timer);
|
|
133
|
+
clearTimeout(poll);
|
|
134
|
+
resolve(output);
|
|
135
|
+
};
|
|
136
|
+
child.once('error', (error) => settle({ code: null, stdout: '', stderr: error.message }));
|
|
137
|
+
child.once('exit', (code) => settle(cut ? { code: 0, stdout: '', stderr: '', cutShort: true } : { code, stdout: '', stderr: '' }));
|
|
138
|
+
});
|
|
139
|
+
/** How often `until` is asked while a console command runs. */
|
|
140
|
+
const UNTIL_POLL_MS = 5_000;
|
|
141
|
+
const nodeIo = () => {
|
|
142
|
+
const systemRoot = (process.env['SystemRoot'] ?? process.env['SYSTEMROOT'] ?? 'C:\\Windows').replace(/[\\/]+$/, '');
|
|
143
|
+
const taskkill = `${systemRoot}\\System32\\taskkill.exe`;
|
|
144
|
+
return {
|
|
145
|
+
exec: (command, args, options) => options?.console === true
|
|
146
|
+
? consoleExec(command, args, options.timeoutMs ?? 60_000, taskkill, options.until)
|
|
147
|
+
: hostExec({ timeoutMs: options?.timeoutMs ?? 60_000 })(command, args, options?.env),
|
|
148
|
+
lstat: (path) => lstat(path),
|
|
149
|
+
readFile: (path) => readFile(path, 'utf8'),
|
|
150
|
+
createExclusive: async (path, text) => {
|
|
151
|
+
const handle = await open(path, 'wx', 0o644);
|
|
152
|
+
try {
|
|
153
|
+
await handle.writeFile(text);
|
|
154
|
+
await handle.sync();
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
await handle.close();
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
rename: (from, to) => rename(from, to),
|
|
161
|
+
remove: (path) => rm(path, { force: true }),
|
|
162
|
+
};
|
|
163
|
+
};
|
|
164
|
+
const REQUEST_SIZE_LIMIT = 64 * 1024;
|
|
165
|
+
/** `wsl --install` downloads the WSL package from the Store: minutes, not hours. */
|
|
166
|
+
const INSTALL_TIMEOUT_MS = 30 * 60_000;
|
|
167
|
+
const COMMAND_TIMEOUT_MS = 5 * 60_000;
|
|
168
|
+
const refuse = (message) => {
|
|
169
|
+
throw new AtomicCoreError('MANAGED_HOST_STEP_INVALID', message);
|
|
170
|
+
};
|
|
171
|
+
/**
|
|
172
|
+
* The executor's dependencies on a Windows machine. `env` gives `%SystemRoot%`, where the only
|
|
173
|
+
* command it runs — `wsl.exe` — and PowerShell live.
|
|
174
|
+
*/
|
|
175
|
+
export function windowsHostStepDeps(env, io = nodeIo()) {
|
|
176
|
+
const system32 = `${(env['SystemRoot'] ?? env['SYSTEMROOT'] ?? 'C:\\Windows').replace(/[\\/]+$/, '')}\\System32`;
|
|
177
|
+
const powershell = `${system32}\\WindowsPowerShell\\v1.0\\powershell.exe`;
|
|
178
|
+
const trust = async (path, what, expect) => {
|
|
179
|
+
let acl;
|
|
180
|
+
try {
|
|
181
|
+
acl = parseWindowsAcl(await io.exec(powershell, ['-NoProfile', '-NonInteractive', '-Command', ACL_QUERY], {
|
|
182
|
+
env: { ATOMIC_HOST_STEP_PATH: path },
|
|
183
|
+
}));
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
return refuse(`could not read the owner and permissions of ${what}: ${error.message}`);
|
|
187
|
+
}
|
|
188
|
+
const problem = judgeWindowsAcl(acl, what, expect);
|
|
189
|
+
if (problem !== null)
|
|
190
|
+
refuse(problem);
|
|
191
|
+
};
|
|
192
|
+
return {
|
|
193
|
+
readRequest: async (path) => {
|
|
194
|
+
const folder = win32.dirname(path);
|
|
195
|
+
await trust(folder, folder, 'directory');
|
|
196
|
+
const info = await io.lstat(path);
|
|
197
|
+
if (info.isSymbolicLink() || !info.isFile())
|
|
198
|
+
refuse(`${path} is not a regular file`);
|
|
199
|
+
if (info.size > REQUEST_SIZE_LIMIT)
|
|
200
|
+
refuse(`${path} is too large to be a request`);
|
|
201
|
+
await trust(path, path, 'file');
|
|
202
|
+
return io.readFile(path);
|
|
203
|
+
},
|
|
204
|
+
writeResult: async (path, text) => {
|
|
205
|
+
const folder = win32.dirname(path);
|
|
206
|
+
await trust(folder, folder, 'directory');
|
|
207
|
+
const temp = win32.join(folder, `.${win32.basename(path)}.${randomBytes(6).toString('hex')}.tmp`);
|
|
208
|
+
try {
|
|
209
|
+
await io.createExclusive(temp, text);
|
|
210
|
+
await io.rename(temp, path);
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
// Only our own temporary file: it was created exclusively.
|
|
214
|
+
await io.remove(temp);
|
|
215
|
+
throw error;
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
readFile: async () => refuse('the Windows executor reads no system file'),
|
|
219
|
+
writeFile: async () => refuse('the Windows executor writes no system file'),
|
|
220
|
+
exec: async ([command, ...args], options) => {
|
|
221
|
+
if (command !== 'wsl.exe')
|
|
222
|
+
return refuse(`${String(command)} is not a command the Windows executor runs`);
|
|
223
|
+
return io.exec(`${system32}\\wsl.exe`, args, {
|
|
224
|
+
timeoutMs: options?.longRunning === true ? INSTALL_TIMEOUT_MS : COMMAND_TIMEOUT_MS,
|
|
225
|
+
...(options?.console === true ? { console: true } : {}),
|
|
226
|
+
...(options?.console === true && options.until !== undefined ? { until: options.until } : {}),
|
|
227
|
+
});
|
|
228
|
+
},
|
|
229
|
+
fetch: async () => refuse('the Windows executor downloads nothing'),
|
|
230
|
+
rebootPending: async () => parseRebootPending(await io.exec(`${system32}\\reg.exe`, ['query', REBOOT_PENDING_KEY])),
|
|
231
|
+
now: () => Date.now(),
|
|
232
|
+
invokingUid: null,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=executor-io-windows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor-io-windows.js","sourceRoot":"","sources":["../../../src/host/recipes/executor-io-windows.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The real I/O behind `executeHostStep`, for a process that is already root.
|
|
3
|
+
*
|
|
4
|
+
* The request and result live in a folder the unprivileged user owns, so everything touching them
|
|
5
|
+
* assumes someone may have planted a link there, or be racing us:
|
|
6
|
+
*
|
|
7
|
+
* - The folder itself must be a real directory (not a symlink), writable by nobody but its owner,
|
|
8
|
+
* and owned by the user who asked for elevation (`PKEXEC_UID`/`SUDO_UID`) — not by root, so
|
|
9
|
+
* `host-step exec /etc/<dir>/<x>.request.json` can never make root write a result into a system
|
|
10
|
+
* folder. Only when nobody is named (root ran it directly) is a root-owned folder the trusted one.
|
|
11
|
+
* Clients create it `0700` and the request `0600` (see `request-file.ts`).
|
|
12
|
+
* - System files (keys, repository files) are written only into root-owned folders that nobody else
|
|
13
|
+
* can write.
|
|
14
|
+
* - The request is opened with `O_NOFOLLOW | O_NONBLOCK` — a link is refused, a FIFO cannot hang
|
|
15
|
+
* root — and, on the open handle, must be a small regular file owned by root or the invoking user
|
|
16
|
+
* and not group- or world-writable.
|
|
17
|
+
* - Every file root writes (the result, keys, repository files) goes to a fresh temporary name
|
|
18
|
+
* opened `O_CREAT | O_EXCL | O_NOFOLLOW`, gets its mode through the handle (`fchmod`, never a
|
|
19
|
+
* path-based `chmod` that a swapped link would redirect), and is renamed into place, which
|
|
20
|
+
* replaces a planted link instead of writing through it.
|
|
21
|
+
*
|
|
22
|
+
* The folder is opened once (`O_DIRECTORY | O_NOFOLLOW`) and checked through that handle, and every
|
|
23
|
+
* file in it is then addressed as `/proc/self/fd/<fd>/<name>`, which the kernel resolves to the
|
|
24
|
+
* directory that was checked — node has no `openat`, and this is the same guarantee. A swap of the
|
|
25
|
+
* folder's path after the check changes nothing. Only where `/proc` is not mounted (never on the
|
|
26
|
+
* distributions the recipe supports) does the executor fall back to the checked path; there a
|
|
27
|
+
* swap between check and write could make root create or replace a `<step_id>.result.json` (0644,
|
|
28
|
+
* our JSON) in whatever folder the swapped-in link points at. The trusted folder owner — the
|
|
29
|
+
* invoking user, or root — is the only one who could make that swap. Seteuid-ing to the user was
|
|
30
|
+
* ruled out (controller ruling, fix round 1).
|
|
31
|
+
*
|
|
32
|
+
* Commands run through `hostExec` — `spawn` without a shell — with the recipe's fixed environment.
|
|
33
|
+
*/
|
|
34
|
+
import type { HostStepExecutorDeps } from './executor.js';
|
|
35
|
+
/** The slice of an open file the executor uses; node's `FileHandle` is one. */
|
|
36
|
+
export interface HostFileHandle {
|
|
37
|
+
stat(): Promise<{
|
|
38
|
+
isFile(): boolean;
|
|
39
|
+
uid: number;
|
|
40
|
+
mode: number;
|
|
41
|
+
size: number;
|
|
42
|
+
}>;
|
|
43
|
+
readFile(encoding: 'utf8'): Promise<string>;
|
|
44
|
+
writeFile(data: Uint8Array | string): Promise<void>;
|
|
45
|
+
/** `fchmod`: applies to this open file, whatever its path now points at. */
|
|
46
|
+
chmod(mode: number): Promise<void>;
|
|
47
|
+
sync(): Promise<void>;
|
|
48
|
+
close(): Promise<void>;
|
|
49
|
+
}
|
|
50
|
+
/** An open directory: checked through its handle, and addressed through its descriptor. */
|
|
51
|
+
export interface HostDirHandle {
|
|
52
|
+
fd: number;
|
|
53
|
+
stat(): Promise<{
|
|
54
|
+
isDirectory(): boolean;
|
|
55
|
+
uid: number;
|
|
56
|
+
mode: number;
|
|
57
|
+
}>;
|
|
58
|
+
close(): Promise<void>;
|
|
59
|
+
}
|
|
60
|
+
/** The file-system calls the executor makes, injectable so tests can fake owners they cannot create. */
|
|
61
|
+
export interface HostFs {
|
|
62
|
+
open(path: string, flags: number, mode?: number): Promise<HostFileHandle>;
|
|
63
|
+
/** `open(path, O_RDONLY | O_DIRECTORY | O_NOFOLLOW)`: a link or a non-directory is refused. */
|
|
64
|
+
openDirectory(path: string): Promise<HostDirHandle>;
|
|
65
|
+
/** Whether something is at `path` (used for `/proc/self/fd/<fd>`). */
|
|
66
|
+
exists(path: string): Promise<boolean>;
|
|
67
|
+
rename(from: string, to: string): Promise<void>;
|
|
68
|
+
/** Removes one file if it is there; used only on our own temporary files. */
|
|
69
|
+
remove(path: string): Promise<void>;
|
|
70
|
+
mkdir(path: string, mode: number): Promise<void>;
|
|
71
|
+
readFile(path: string): Promise<Uint8Array>;
|
|
72
|
+
}
|
|
73
|
+
export declare const nodeHostFs: HostFs;
|
|
74
|
+
/** `PKEXEC_UID` (set by pkexec itself) or `SUDO_UID`, when it is a number; otherwise null. */
|
|
75
|
+
export declare function invokingUidFrom(env: NodeJS.ProcessEnv): string | null;
|
|
76
|
+
/**
|
|
77
|
+
* The executor's dependencies on this machine. `env` is only read for who asked for elevation,
|
|
78
|
+
* which also decides whose folder and request file are trusted (root's alone when nobody is named).
|
|
79
|
+
*/
|
|
80
|
+
export declare function nodeHostStepDeps(env: NodeJS.ProcessEnv, fs?: HostFs): HostStepExecutorDeps;
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The real I/O behind `executeHostStep`, for a process that is already root.
|
|
3
|
+
*
|
|
4
|
+
* The request and result live in a folder the unprivileged user owns, so everything touching them
|
|
5
|
+
* assumes someone may have planted a link there, or be racing us:
|
|
6
|
+
*
|
|
7
|
+
* - The folder itself must be a real directory (not a symlink), writable by nobody but its owner,
|
|
8
|
+
* and owned by the user who asked for elevation (`PKEXEC_UID`/`SUDO_UID`) — not by root, so
|
|
9
|
+
* `host-step exec /etc/<dir>/<x>.request.json` can never make root write a result into a system
|
|
10
|
+
* folder. Only when nobody is named (root ran it directly) is a root-owned folder the trusted one.
|
|
11
|
+
* Clients create it `0700` and the request `0600` (see `request-file.ts`).
|
|
12
|
+
* - System files (keys, repository files) are written only into root-owned folders that nobody else
|
|
13
|
+
* can write.
|
|
14
|
+
* - The request is opened with `O_NOFOLLOW | O_NONBLOCK` — a link is refused, a FIFO cannot hang
|
|
15
|
+
* root — and, on the open handle, must be a small regular file owned by root or the invoking user
|
|
16
|
+
* and not group- or world-writable.
|
|
17
|
+
* - Every file root writes (the result, keys, repository files) goes to a fresh temporary name
|
|
18
|
+
* opened `O_CREAT | O_EXCL | O_NOFOLLOW`, gets its mode through the handle (`fchmod`, never a
|
|
19
|
+
* path-based `chmod` that a swapped link would redirect), and is renamed into place, which
|
|
20
|
+
* replaces a planted link instead of writing through it.
|
|
21
|
+
*
|
|
22
|
+
* The folder is opened once (`O_DIRECTORY | O_NOFOLLOW`) and checked through that handle, and every
|
|
23
|
+
* file in it is then addressed as `/proc/self/fd/<fd>/<name>`, which the kernel resolves to the
|
|
24
|
+
* directory that was checked — node has no `openat`, and this is the same guarantee. A swap of the
|
|
25
|
+
* folder's path after the check changes nothing. Only where `/proc` is not mounted (never on the
|
|
26
|
+
* distributions the recipe supports) does the executor fall back to the checked path; there a
|
|
27
|
+
* swap between check and write could make root create or replace a `<step_id>.result.json` (0644,
|
|
28
|
+
* our JSON) in whatever folder the swapped-in link points at. The trusted folder owner — the
|
|
29
|
+
* invoking user, or root — is the only one who could make that swap. Seteuid-ing to the user was
|
|
30
|
+
* ruled out (controller ruling, fix round 1).
|
|
31
|
+
*
|
|
32
|
+
* Commands run through `hostExec` — `spawn` without a shell — with the recipe's fixed environment.
|
|
33
|
+
*/
|
|
34
|
+
import { constants } from 'node:fs';
|
|
35
|
+
import { randomBytes } from 'node:crypto';
|
|
36
|
+
import { lstat, mkdir, open, readFile, rename, rm } from 'node:fs/promises';
|
|
37
|
+
import { basename, dirname, join } from 'node:path';
|
|
38
|
+
import { AtomicCoreError } from '../../contracts/index.js';
|
|
39
|
+
import { hostExec } from '../../runtime/environment/index.js';
|
|
40
|
+
import { INSTALL_CONTAINER_RUNTIME_RECIPE } from './install-container-runtime.js';
|
|
41
|
+
export const nodeHostFs = {
|
|
42
|
+
open: (path, flags, mode) => open(path, flags, mode),
|
|
43
|
+
openDirectory: (path) => open(path, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW),
|
|
44
|
+
exists: (path) => lstat(path).then(() => true, () => false),
|
|
45
|
+
rename: (from, to) => rename(from, to),
|
|
46
|
+
remove: (path) => rm(path, { force: true }),
|
|
47
|
+
mkdir: async (path, mode) => {
|
|
48
|
+
await mkdir(path, { recursive: true, mode });
|
|
49
|
+
},
|
|
50
|
+
readFile: async (path) => new Uint8Array(await readFile(path)),
|
|
51
|
+
};
|
|
52
|
+
// `O_NOFOLLOW`/`O_NONBLOCK` exist on every POSIX platform node supports; this module only ever runs
|
|
53
|
+
// on Linux (the recipe is Linux-only), so there is no fallback that would silently drop them.
|
|
54
|
+
const REQUEST_SIZE_LIMIT = 64 * 1024;
|
|
55
|
+
/** Checks, `nvidia-ctk`, `systemctl`, `usermod`: minutes at most. */
|
|
56
|
+
const COMMAND_TIMEOUT_MS = 10 * 60_000;
|
|
57
|
+
/**
|
|
58
|
+
* A package install over a slow mirror can take long, and killing dpkg mid-run can leave packages
|
|
59
|
+
* half-configured: two hours, then SIGTERM and five more minutes to stop before SIGKILL.
|
|
60
|
+
*/
|
|
61
|
+
const INSTALL_TIMEOUT_MS = 2 * 60 * 60_000;
|
|
62
|
+
const INSTALL_TERMINATE_GRACE_MS = 5 * 60_000;
|
|
63
|
+
/** A read that only explains a failure (the Docker journal): quick, and small. */
|
|
64
|
+
const DIAGNOSTIC_TIMEOUT_MS = 30_000;
|
|
65
|
+
const DIAGNOSTIC_MAX_OUTPUT_BYTES = 64 * 1024;
|
|
66
|
+
const refuse = (message) => {
|
|
67
|
+
throw new AtomicCoreError('MANAGED_HOST_STEP_INVALID', message);
|
|
68
|
+
};
|
|
69
|
+
const GROUP_OR_WORLD_WRITABLE = 0o022;
|
|
70
|
+
/** Who may own the request/result folder: the invoking user when known, otherwise root only. */
|
|
71
|
+
function folderOwners(invokingUid) {
|
|
72
|
+
return new Set([invokingUid === null ? 0 : Number(invokingUid)]);
|
|
73
|
+
}
|
|
74
|
+
/** Who may own the request file inside that folder: root or the invoking user. */
|
|
75
|
+
function requestOwners(invokingUid) {
|
|
76
|
+
return new Set(invokingUid === null ? [0] : [0, Number(invokingUid)]);
|
|
77
|
+
}
|
|
78
|
+
/** System folders (`/etc/apt/keyrings`, `/etc/yum.repos.d`, ...): root's alone. */
|
|
79
|
+
const SYSTEM_OWNERS = new Set([0]);
|
|
80
|
+
function checkOwnership(what, info, owners) {
|
|
81
|
+
if (!owners.has(info.uid))
|
|
82
|
+
refuse(`${what} is owned by uid ${info.uid}; only uid ${[...owners].join(' or ')} is trusted here`);
|
|
83
|
+
if ((info.mode & GROUP_OR_WORLD_WRITABLE) !== 0)
|
|
84
|
+
refuse(`${what} is group- or world-writable (mode ${(info.mode & 0o777).toString(8)})`);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Opens the folder `path` lives in (`O_DIRECTORY | O_NOFOLLOW`), checks it through the handle —
|
|
88
|
+
* a real directory, trusted owner, writable by nobody else — and hands `act` a base to address
|
|
89
|
+
* files in it by. On Linux that base is `/proc/self/fd/<fd>`, which the kernel resolves to the very
|
|
90
|
+
* directory that was checked, whatever happens to its path afterwards. Only where `/proc` is not
|
|
91
|
+
* mounted does it fall back to the checked path, and the race described in the header returns.
|
|
92
|
+
*/
|
|
93
|
+
async function withFolder(fs, path, owners, act) {
|
|
94
|
+
const folder = dirname(path);
|
|
95
|
+
let handle;
|
|
96
|
+
try {
|
|
97
|
+
handle = await fs.openDirectory(folder);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
const code = error.code;
|
|
101
|
+
if (code === 'ELOOP' || code === 'ENOTDIR' || code === 'EMLINK')
|
|
102
|
+
refuse(`${folder} is not a directory (a symlink is refused)`);
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const info = await handle.stat();
|
|
107
|
+
if (!info.isDirectory())
|
|
108
|
+
refuse(`${folder} is not a directory (a symlink is refused)`);
|
|
109
|
+
checkOwnership(folder, info, owners);
|
|
110
|
+
const pinned = `/proc/self/fd/${handle.fd}`;
|
|
111
|
+
return await act((await fs.exists(pinned)) ? pinned : folder);
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
await handle.close();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async function readRequest(fs, folder, owners, path) {
|
|
118
|
+
return withFolder(fs, path, folder, async (base) => {
|
|
119
|
+
const flags = constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK;
|
|
120
|
+
const handle = await fs.open(join(base, basename(path)), flags);
|
|
121
|
+
try {
|
|
122
|
+
const info = await handle.stat();
|
|
123
|
+
if (!info.isFile())
|
|
124
|
+
refuse(`${path} is not a regular file`);
|
|
125
|
+
checkOwnership(path, info, owners);
|
|
126
|
+
if (info.size > REQUEST_SIZE_LIMIT)
|
|
127
|
+
refuse(`${path} is too large to be a request`);
|
|
128
|
+
return await handle.readFile('utf8');
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
await handle.close();
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
async function writeAtomically(fs, owners, path, data, mode) {
|
|
136
|
+
await withFolder(fs, path, owners, async (base) => {
|
|
137
|
+
const name = basename(path);
|
|
138
|
+
const tmp = join(base, `.${name}.${randomBytes(6).toString('hex')}.tmp`);
|
|
139
|
+
const flags = constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW;
|
|
140
|
+
const handle = await fs.open(tmp, flags, mode);
|
|
141
|
+
try {
|
|
142
|
+
try {
|
|
143
|
+
await handle.writeFile(data);
|
|
144
|
+
await handle.chmod(mode);
|
|
145
|
+
await handle.sync();
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
await handle.close();
|
|
149
|
+
}
|
|
150
|
+
await fs.rename(tmp, join(base, name));
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
// Only our own temporary file: it was created exclusively, so nobody else's can be at that name.
|
|
154
|
+
await fs.remove(tmp);
|
|
155
|
+
throw error;
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
async function readFileOrNull(fs, path) {
|
|
160
|
+
try {
|
|
161
|
+
return await fs.readFile(path);
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
if (error.code === 'ENOENT')
|
|
165
|
+
return null;
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/** `PKEXEC_UID` (set by pkexec itself) or `SUDO_UID`, when it is a number; otherwise null. */
|
|
170
|
+
export function invokingUidFrom(env) {
|
|
171
|
+
for (const name of ['PKEXEC_UID', 'SUDO_UID']) {
|
|
172
|
+
const value = env[name];
|
|
173
|
+
if (value !== undefined)
|
|
174
|
+
return /^\d+$/.test(value) ? value : null;
|
|
175
|
+
}
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* The executor's dependencies on this machine. `env` is only read for who asked for elevation,
|
|
180
|
+
* which also decides whose folder and request file are trusted (root's alone when nobody is named).
|
|
181
|
+
*/
|
|
182
|
+
export function nodeHostStepDeps(env, fs = nodeHostFs) {
|
|
183
|
+
const environment = { ...INSTALL_CONTAINER_RUNTIME_RECIPE.environment };
|
|
184
|
+
const quick = hostExec({ timeoutMs: COMMAND_TIMEOUT_MS, env: environment });
|
|
185
|
+
const long = hostExec({
|
|
186
|
+
timeoutMs: INSTALL_TIMEOUT_MS,
|
|
187
|
+
terminateGraceMs: INSTALL_TERMINATE_GRACE_MS,
|
|
188
|
+
env: environment,
|
|
189
|
+
});
|
|
190
|
+
const diagnostic = hostExec({
|
|
191
|
+
timeoutMs: DIAGNOSTIC_TIMEOUT_MS,
|
|
192
|
+
maxOutputBytes: DIAGNOSTIC_MAX_OUTPUT_BYTES,
|
|
193
|
+
env: environment,
|
|
194
|
+
});
|
|
195
|
+
const invokingUid = invokingUidFrom(env);
|
|
196
|
+
const folder = folderOwners(invokingUid);
|
|
197
|
+
return {
|
|
198
|
+
readRequest: (path) => readRequest(fs, folder, requestOwners(invokingUid), path),
|
|
199
|
+
writeResult: (path, text) => writeAtomically(fs, folder, path, text, 0o644),
|
|
200
|
+
readFile: (path) => readFileOrNull(fs, path),
|
|
201
|
+
writeFile: async (path, data, mode) => {
|
|
202
|
+
await fs.mkdir(dirname(path), 0o755);
|
|
203
|
+
await writeAtomically(fs, SYSTEM_OWNERS, path, data, mode);
|
|
204
|
+
},
|
|
205
|
+
exec: ([command, ...args], options) => (options?.longRunning ? long : options?.diagnostic ? diagnostic : quick)(command, args),
|
|
206
|
+
fetch: (input, init) => fetch(input, init),
|
|
207
|
+
now: () => Date.now(),
|
|
208
|
+
invokingUid,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=executor-io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor-io.js","sourceRoot":"","sources":["../../../src/host/recipes/executor-io.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The privileged half of a host step (design D3): read one request file, refuse it unless it names
|
|
3
|
+
* this build's recipe with matching digests and valid parameters, bring the machine to what the
|
|
4
|
+
* recipe describes, and write the result file beside the request. `atomic-chat-core host-step exec`
|
|
5
|
+
* and `atc host-step exec` both call `executeHostStep`, so the app and the CLI run the same code
|
|
6
|
+
* as root.
|
|
7
|
+
*
|
|
8
|
+
* Every step checks the machine before it acts and does nothing when its part is already in place.
|
|
9
|
+
* That makes the whole request idempotent: a replay — a retried receipt, a person re-running the
|
|
10
|
+
* manual command — reports `completed` without changing anything. The first failing step stops the
|
|
11
|
+
* run; the ones after it are reported `not-run`, never attempted.
|
|
12
|
+
*
|
|
13
|
+
* All I/O is injected (`HostStepExecutorDeps`); `executor-io.ts` has the real implementations.
|
|
14
|
+
* This file never touches the file system, the network or a process itself.
|
|
15
|
+
*/
|
|
16
|
+
import type { HostStepResult } from './request-file.js';
|
|
17
|
+
export interface HostCommandOutput {
|
|
18
|
+
/** Null when the command could not run or answer at all. */
|
|
19
|
+
code: number | null;
|
|
20
|
+
stdout: string;
|
|
21
|
+
stderr: string;
|
|
22
|
+
/** The command was ended, its process tree with it, because `until` said its work was done. */
|
|
23
|
+
cutShort?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface HostStepExecutorDeps {
|
|
26
|
+
/** The request's text. Throws when it is not a readable regular file of sane size. */
|
|
27
|
+
readRequest: (path: string) => Promise<string>;
|
|
28
|
+
/** Writes the result without following a link planted at its path. */
|
|
29
|
+
writeResult: (path: string, text: string) => Promise<void>;
|
|
30
|
+
/** A file's bytes, or null when there is no file there. */
|
|
31
|
+
readFile: (path: string) => Promise<Uint8Array | null>;
|
|
32
|
+
/** Atomically creates or replaces a file with exactly this mode, creating parent directories. */
|
|
33
|
+
writeFile: (path: string, data: Uint8Array, mode: number) => Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Runs one argv, no shell, with the recipe's fixed environment. `longRunning` marks a package
|
|
36
|
+
* install: a much longer deadline, and SIGTERM before SIGKILL, so dpkg is not killed mid-run.
|
|
37
|
+
* `diagnostic` marks a read made only to explain a failure: a short deadline and a small output
|
|
38
|
+
* cap, so explaining never holds the result back.
|
|
39
|
+
*/
|
|
40
|
+
exec: (argv: string[], options?: {
|
|
41
|
+
longRunning?: boolean;
|
|
42
|
+
diagnostic?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Windows only: run with this process's own (hidden) console instead of pipes; nothing is
|
|
45
|
+
* captured, only the exit code. The inbox `wsl.exe` stub starts installing only with a console —
|
|
46
|
+
* with piped output it answers "not installed" at once (live acceptance, build 26200).
|
|
47
|
+
*/
|
|
48
|
+
console?: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* With `console` only: asked every few seconds while the command runs; once it answers true the
|
|
51
|
+
* command's process tree is ended and the output says `cutShort` with code 0.
|
|
52
|
+
*/
|
|
53
|
+
until?: () => Promise<boolean>;
|
|
54
|
+
}) => Promise<HostCommandOutput>;
|
|
55
|
+
fetch: typeof fetch;
|
|
56
|
+
/**
|
|
57
|
+
* Windows only: whether Windows waits for a restart to apply a component change (CBS
|
|
58
|
+
* `RebootPending`), or null when unread. Absent elsewhere.
|
|
59
|
+
*/
|
|
60
|
+
rebootPending?: () => Promise<boolean | null>;
|
|
61
|
+
now: () => number;
|
|
62
|
+
/**
|
|
63
|
+
* The uid of the person who asked for elevation (`PKEXEC_UID`, `SUDO_UID`), or null when this
|
|
64
|
+
* process was started as root directly. When known, only that account is added to `docker`.
|
|
65
|
+
*/
|
|
66
|
+
invokingUid: string | null;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Runs one host-step request and writes `<step>.result.json` beside it. This is the entry point
|
|
70
|
+
* `atomic-chat-core host-step exec` and `atc host-step exec` call as root.
|
|
71
|
+
*
|
|
72
|
+
* Client requirement: the folder holding the request must be owned by the invoking user (named by
|
|
73
|
+
* `PKEXEC_UID`/`SUDO_UID`) with mode `0700`, and the request file must be `0600` — see
|
|
74
|
+
* `request-file.ts`. With `nodeHostStepDeps`, anything else is refused.
|
|
75
|
+
*
|
|
76
|
+
* Throws only when no result file can be written: `MANAGED_HOST_STEP_INVALID` when the path is not
|
|
77
|
+
* a `*.request.json` or the folder is not trusted, or the file system's own error when the write
|
|
78
|
+
* itself fails (ENOSPC, EROFS, ...). Every other problem — an unreadable request, a refused
|
|
79
|
+
* request, a failed step, an unexpected error — is a `failed` result file.
|
|
80
|
+
*/
|
|
81
|
+
export declare function executeHostStep(requestPath: string, deps: HostStepExecutorDeps): Promise<HostStepResult>;
|