@wenathlan/saddle 1.8.18 → 2.0.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/Dockerfile +1339 -0
- package/README.md +33 -12
- package/alternatives.ts +1218 -0
- package/biome.json +153 -0
- package/boards.json +1517 -0
- package/compute.ts +3144 -0
- package/cores.json +1801 -0
- package/dist/acquisition.d.ts +359 -0
- package/dist/acquisition.d.ts.map +1 -0
- package/dist/acquisition.js +629 -0
- package/dist/acquisition.js.map +1 -0
- package/dist/alternatives.d.ts +509 -0
- package/dist/alternatives.d.ts.map +1 -0
- package/dist/alternatives.js +951 -0
- package/dist/alternatives.js.map +1 -0
- package/dist/automation.d.ts +426 -0
- package/dist/automation.d.ts.map +1 -0
- package/dist/automation.js +561 -0
- package/dist/automation.js.map +1 -0
- package/dist/browser.d.ts +562 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +1057 -0
- package/dist/browser.js.map +1 -0
- package/dist/capacitor.config.d.ts +13 -0
- package/dist/capacitor.config.d.ts.map +1 -0
- package/dist/capacitor.config.js +26 -0
- package/dist/capacitor.config.js.map +1 -0
- package/dist/cli.d.ts +17 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +111 -0
- package/dist/cli.js.map +1 -0
- package/dist/communication.d.ts +192 -0
- package/dist/communication.d.ts.map +1 -0
- package/dist/communication.js +418 -0
- package/dist/communication.js.map +1 -0
- package/dist/compute.d.ts +1161 -0
- package/dist/compute.d.ts.map +1 -0
- package/dist/compute.js +2273 -0
- package/dist/compute.js.map +1 -0
- package/dist/distribution.d.ts +529 -0
- package/dist/distribution.d.ts.map +1 -0
- package/dist/distribution.js +811 -0
- package/dist/distribution.js.map +1 -0
- package/dist/execution.d.ts +530 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +761 -0
- package/dist/execution.js.map +1 -0
- package/dist/format.d.ts +19 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +60 -0
- package/dist/format.js.map +1 -0
- package/dist/foundation.d.ts +176 -0
- package/dist/foundation.d.ts.map +1 -0
- package/dist/foundation.js +309 -0
- package/dist/foundation.js.map +1 -0
- package/dist/index.d.ts +733 -123
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1018 -123
- package/dist/index.js.map +1 -1
- package/dist/integration.d.ts +236 -0
- package/dist/integration.d.ts.map +1 -0
- package/dist/integration.js +236 -0
- package/dist/integration.js.map +1 -0
- package/dist/intelligence.d.ts +94 -0
- package/dist/intelligence.d.ts.map +1 -0
- package/dist/intelligence.js +145 -0
- package/dist/intelligence.js.map +1 -0
- package/dist/{isolation/contracts.d.ts → isolation.d.ts} +12 -1
- package/dist/isolation.d.ts.map +1 -0
- package/dist/{isolation/contracts.js → isolation.js} +13 -1
- package/dist/isolation.js.map +1 -0
- package/dist/media.d.ts +344 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +986 -0
- package/dist/media.js.map +1 -0
- package/dist/modes.d.ts +359 -0
- package/dist/modes.d.ts.map +1 -0
- package/dist/modes.js +134 -0
- package/dist/modes.js.map +1 -0
- package/dist/{library/public.d.ts → operations.d.ts} +15 -1
- package/dist/operations.d.ts.map +1 -0
- package/dist/{library/public.js → operations.js} +18 -7
- package/dist/operations.js.map +1 -0
- package/dist/orchestrator.d.ts +1339 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +4308 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/performance.d.ts +416 -0
- package/dist/performance.d.ts.map +1 -0
- package/dist/performance.js +827 -0
- package/dist/performance.js.map +1 -0
- package/dist/quantum.d.ts +810 -0
- package/dist/quantum.d.ts.map +1 -0
- package/dist/quantum.js +2073 -0
- package/dist/quantum.js.map +1 -0
- package/dist/render.d.ts +381 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +1073 -0
- package/dist/render.js.map +1 -0
- package/dist/scheduler.d.ts +596 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +1259 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/security.d.ts +501 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +1170 -0
- package/dist/security.js.map +1 -0
- package/dist/server.d.ts +21 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/{server/node.js → server.js} +16 -2
- package/dist/server.js.map +1 -0
- package/dist/tiers.d.ts +1002 -0
- package/dist/tiers.d.ts.map +1 -0
- package/dist/tiers.js +2165 -0
- package/dist/tiers.js.map +1 -0
- package/dist/virtual.d.ts +641 -0
- package/dist/virtual.d.ts.map +1 -0
- package/dist/virtual.js +1285 -0
- package/dist/virtual.js.map +1 -0
- package/dist/virtualcpu.d.ts +316 -0
- package/dist/virtualcpu.d.ts.map +1 -0
- package/dist/virtualcpu.js +1180 -0
- package/dist/virtualcpu.js.map +1 -0
- package/dist/virtualgpu.d.ts +345 -0
- package/dist/virtualgpu.d.ts.map +1 -0
- package/dist/virtualgpu.js +1000 -0
- package/dist/virtualgpu.js.map +1 -0
- package/dist/virtualization.d.ts +607 -0
- package/dist/virtualization.d.ts.map +1 -0
- package/dist/virtualization.js +1187 -0
- package/dist/virtualization.js.map +1 -0
- package/dist/virtualmemory.d.ts +818 -0
- package/dist/virtualmemory.d.ts.map +1 -0
- package/dist/virtualmemory.js +1796 -0
- package/dist/virtualmemory.js.map +1 -0
- package/dist/webscrape.d.ts +720 -0
- package/dist/webscrape.d.ts.map +1 -0
- package/dist/webscrape.js +2697 -0
- package/dist/webscrape.js.map +1 -0
- package/docker.config +769 -0
- package/docs/CONVERSA.txt +1523 -0
- package/docs/alternatives.md +499 -0
- package/docs/architecture-1.8.19.md +76 -0
- package/docs/architecture-1.8.19.mmd +33 -0
- package/docs/architecture-1.8.19.png +0 -0
- package/docs/architecture.md +355 -0
- package/docs/brancharchive-2026-08-18.md +18 -0
- package/docs/browser.md +7 -0
- package/docs/consolidation.md +70 -0
- package/docs/e2ugh-engine.md +528 -0
- package/{dist/examples/localjob.js → docs/example-localjob.ts} +3 -3
- package/{dist/examples/publicapi.js → docs/example-publicapi.ts} +2 -2
- package/docs/hardware.md +342 -0
- package/docs/optimization.md +126 -0
- package/docs/performance.md +499 -0
- package/docs/planning.1.8.18.md +94 -0
- package/docs/planning.1.8.19.md +49 -0
- package/docs/releasenotes-1.8.19.md +35 -0
- package/docs/research-1.8.19-virtual-browser.md +27 -0
- package/docs/security.md +454 -0
- package/docs/todo-1.8.18.md +12 -0
- package/docs/todo-1.8.19.md +241 -0
- package/docs/viability.md +777 -0
- package/docs/virtualization.md +335 -0
- package/docs/web-duplicatecleanup.md +9 -0
- package/docs/web-ideas.md +106 -0
- package/docs/workflowimprovements-2026-08-19.md +70 -0
- package/gpumonitor.cpp +1543 -0
- package/gpus.json +2408 -0
- package/index.ts +1478 -0
- package/media.ts +1337 -0
- package/mttg.config +1549 -0
- package/orchestrator.ts +5462 -0
- package/package.json +304 -56
- package/passage.config +1331 -0
- package/performance.ts +1049 -0
- package/processors.json +2217 -0
- package/qemu.config +1062 -0
- package/qemubridge.py +1340 -0
- package/quantum.ts +2393 -0
- package/render.ts +1325 -0
- package/scheduler.ts +1600 -0
- package/security.ts +1449 -0
- package/tiers.ts +2871 -0
- package/tsconfig.json +29 -0
- package/virtualcpu.ts +1273 -0
- package/virtualgpu.ts +1181 -0
- package/virtualhardware.c +1011 -0
- package/virtualhardware.json +739 -0
- package/virtualization.ts +1628 -0
- package/virtualizationcore.cpp +4635 -0
- package/virtualmemory.ts +2303 -0
- package/vm.config.json +1910 -0
- package/{extension → web/extension}/manifest.json +1 -1
- package/web/readme.md +382 -0
- package/web/tsconfig.json +25 -0
- package/dist/adapters/forge.d.ts +0 -17
- package/dist/adapters/forge.d.ts.map +0 -1
- package/dist/adapters/forge.js +0 -19
- package/dist/adapters/forge.js.map +0 -1
- package/dist/adapters/forgejo.d.ts +0 -49
- package/dist/adapters/forgejo.d.ts.map +0 -1
- package/dist/adapters/forgejo.js +0 -8
- package/dist/adapters/forgejo.js.map +0 -1
- package/dist/adapters/github.d.ts +0 -12
- package/dist/adapters/github.d.ts.map +0 -1
- package/dist/adapters/github.js +0 -20
- package/dist/adapters/github.js.map +0 -1
- package/dist/adapters/gitlab.d.ts +0 -17
- package/dist/adapters/gitlab.d.ts.map +0 -1
- package/dist/adapters/gitlab.js +0 -10
- package/dist/adapters/gitlab.js.map +0 -1
- package/dist/adapters/huggingface.d.ts +0 -17
- package/dist/adapters/huggingface.d.ts.map +0 -1
- package/dist/adapters/huggingface.js +0 -6
- package/dist/adapters/huggingface.js.map +0 -1
- package/dist/adapters/socket.d.ts +0 -11
- package/dist/adapters/socket.d.ts.map +0 -1
- package/dist/adapters/socket.js +0 -17
- package/dist/adapters/socket.js.map +0 -1
- package/dist/adapters/transport.d.ts +0 -7
- package/dist/adapters/transport.d.ts.map +0 -1
- package/dist/adapters/transport.js +0 -36
- package/dist/adapters/transport.js.map +0 -1
- package/dist/ai/chunk.d.ts +0 -2
- package/dist/ai/chunk.d.ts.map +0 -1
- package/dist/ai/chunk.js +0 -36
- package/dist/ai/chunk.js.map +0 -1
- package/dist/ai/llmstxt.d.ts +0 -6
- package/dist/ai/llmstxt.d.ts.map +0 -1
- package/dist/ai/llmstxt.js +0 -12
- package/dist/ai/llmstxt.js.map +0 -1
- package/dist/ai/provenance.d.ts +0 -22
- package/dist/ai/provenance.d.ts.map +0 -1
- package/dist/ai/provenance.js +0 -25
- package/dist/ai/provenance.js.map +0 -1
- package/dist/ai/rag.d.ts +0 -26
- package/dist/ai/rag.d.ts.map +0 -1
- package/dist/ai/rag.js +0 -22
- package/dist/ai/rag.js.map +0 -1
- package/dist/ai/tokens.d.ts +0 -15
- package/dist/ai/tokens.d.ts.map +0 -1
- package/dist/ai/tokens.js +0 -9
- package/dist/ai/tokens.js.map +0 -1
- package/dist/api/auth.d.ts +0 -16
- package/dist/api/auth.d.ts.map +0 -1
- package/dist/api/auth.js +0 -19
- package/dist/api/auth.js.map +0 -1
- package/dist/api/contracts.d.ts +0 -28
- package/dist/api/contracts.d.ts.map +0 -1
- package/dist/api/contracts.js +0 -14
- package/dist/api/contracts.js.map +0 -1
- package/dist/api/control.d.ts +0 -10
- package/dist/api/control.d.ts.map +0 -1
- package/dist/api/control.js +0 -35
- package/dist/api/control.js.map +0 -1
- package/dist/api/http.d.ts +0 -7
- package/dist/api/http.d.ts.map +0 -1
- package/dist/api/http.js +0 -12
- package/dist/api/http.js.map +0 -1
- package/dist/api/rate.d.ts +0 -28
- package/dist/api/rate.d.ts.map +0 -1
- package/dist/api/rate.js +0 -36
- package/dist/api/rate.js.map +0 -1
- package/dist/api/security.d.ts +0 -12
- package/dist/api/security.d.ts.map +0 -1
- package/dist/api/security.js +0 -56
- package/dist/api/security.js.map +0 -1
- package/dist/api/service.d.ts +0 -5
- package/dist/api/service.d.ts.map +0 -1
- package/dist/api/service.js +0 -70
- package/dist/api/service.js.map +0 -1
- package/dist/apps/registry.d.ts +0 -33
- package/dist/apps/registry.d.ts.map +0 -1
- package/dist/apps/registry.js +0 -24
- package/dist/apps/registry.js.map +0 -1
- package/dist/binary/archive.d.ts +0 -27
- package/dist/binary/archive.d.ts.map +0 -1
- package/dist/binary/archive.js +0 -46
- package/dist/binary/archive.js.map +0 -1
- package/dist/binary/build.d.ts +0 -29
- package/dist/binary/build.d.ts.map +0 -1
- package/dist/binary/build.js +0 -17
- package/dist/binary/build.js.map +0 -1
- package/dist/binary/transform.d.ts +0 -70
- package/dist/binary/transform.d.ts.map +0 -1
- package/dist/binary/transform.js +0 -105
- package/dist/binary/transform.js.map +0 -1
- package/dist/bot/adapter.d.ts +0 -5
- package/dist/bot/adapter.d.ts.map +0 -1
- package/dist/bot/adapter.js +0 -11
- package/dist/bot/adapter.js.map +0 -1
- package/dist/bot/bot.d.ts +0 -28
- package/dist/bot/bot.d.ts.map +0 -1
- package/dist/bot/bot.js +0 -52
- package/dist/bot/bot.js.map +0 -1
- package/dist/bot/commands.d.ts +0 -8
- package/dist/bot/commands.d.ts.map +0 -1
- package/dist/bot/commands.js +0 -19
- package/dist/bot/commands.js.map +0 -1
- package/dist/bot/permissions.d.ts +0 -13
- package/dist/bot/permissions.d.ts.map +0 -1
- package/dist/bot/permissions.js +0 -16
- package/dist/bot/permissions.js.map +0 -1
- package/dist/browser/actions.d.ts +0 -33
- package/dist/browser/actions.d.ts.map +0 -1
- package/dist/browser/actions.js +0 -44
- package/dist/browser/actions.js.map +0 -1
- package/dist/browser/agent.d.ts +0 -21
- package/dist/browser/agent.d.ts.map +0 -1
- package/dist/browser/agent.js +0 -13
- package/dist/browser/agent.js.map +0 -1
- package/dist/browser/context.d.ts +0 -43
- package/dist/browser/context.d.ts.map +0 -1
- package/dist/browser/context.js +0 -54
- package/dist/browser/context.js.map +0 -1
- package/dist/browser/fingerprint.d.ts +0 -4
- package/dist/browser/fingerprint.d.ts.map +0 -1
- package/dist/browser/fingerprint.js +0 -12
- package/dist/browser/fingerprint.js.map +0 -1
- package/dist/browser/index.d.ts +0 -11
- package/dist/browser/index.d.ts.map +0 -1
- package/dist/browser/index.js +0 -11
- package/dist/browser/index.js.map +0 -1
- package/dist/browser/playwright.d.ts +0 -11
- package/dist/browser/playwright.d.ts.map +0 -1
- package/dist/browser/playwright.js +0 -24
- package/dist/browser/playwright.js.map +0 -1
- package/dist/browser/recorder.d.ts +0 -21
- package/dist/browser/recorder.d.ts.map +0 -1
- package/dist/browser/recorder.js +0 -58
- package/dist/browser/recorder.js.map +0 -1
- package/dist/browser/session.d.ts +0 -14
- package/dist/browser/session.d.ts.map +0 -1
- package/dist/browser/session.js +0 -21
- package/dist/browser/session.js.map +0 -1
- package/dist/browser/snapshot.d.ts +0 -69
- package/dist/browser/snapshot.d.ts.map +0 -1
- package/dist/browser/snapshot.js +0 -133
- package/dist/browser/snapshot.js.map +0 -1
- package/dist/captcha/contract.d.ts +0 -35
- package/dist/captcha/contract.d.ts.map +0 -1
- package/dist/captcha/contract.js +0 -17
- package/dist/captcha/contract.js.map +0 -1
- package/dist/captcha/evidence.d.ts +0 -10
- package/dist/captcha/evidence.d.ts.map +0 -1
- package/dist/captcha/evidence.js +0 -9
- package/dist/captcha/evidence.js.map +0 -1
- package/dist/captcha/guard.d.ts +0 -23
- package/dist/captcha/guard.d.ts.map +0 -1
- package/dist/captcha/guard.js +0 -12
- package/dist/captcha/guard.js.map +0 -1
- package/dist/cli/main.d.ts +0 -4
- package/dist/cli/main.d.ts.map +0 -1
- package/dist/cli/main.js +0 -46
- package/dist/cli/main.js.map +0 -1
- package/dist/core/errors.d.ts +0 -84
- package/dist/core/errors.d.ts.map +0 -1
- package/dist/core/errors.js +0 -54
- package/dist/core/errors.js.map +0 -1
- package/dist/core/events.d.ts +0 -9
- package/dist/core/events.d.ts.map +0 -1
- package/dist/core/events.js +0 -21
- package/dist/core/events.js.map +0 -1
- package/dist/core/hash.d.ts +0 -10
- package/dist/core/hash.d.ts.map +0 -1
- package/dist/core/hash.js +0 -82
- package/dist/core/hash.js.map +0 -1
- package/dist/core/ids.d.ts +0 -10
- package/dist/core/ids.d.ts.map +0 -1
- package/dist/core/ids.js +0 -15
- package/dist/core/ids.js.map +0 -1
- package/dist/delivery/manifest.d.ts +0 -35
- package/dist/delivery/manifest.d.ts.map +0 -1
- package/dist/delivery/manifest.js +0 -68
- package/dist/delivery/manifest.js.map +0 -1
- package/dist/deploy/index.d.ts +0 -6
- package/dist/deploy/index.d.ts.map +0 -1
- package/dist/deploy/index.js +0 -6
- package/dist/deploy/index.js.map +0 -1
- package/dist/dispatch/resumable.d.ts +0 -102
- package/dist/dispatch/resumable.d.ts.map +0 -1
- package/dist/dispatch/resumable.js +0 -64
- package/dist/dispatch/resumable.js.map +0 -1
- package/dist/dispatch/workflow.d.ts +0 -6
- package/dist/dispatch/workflow.d.ts.map +0 -1
- package/dist/dispatch/workflow.js +0 -37
- package/dist/dispatch/workflow.js.map +0 -1
- package/dist/domain/artifacts.d.ts +0 -12
- package/dist/domain/artifacts.d.ts.map +0 -1
- package/dist/domain/artifacts.js +0 -14
- package/dist/domain/artifacts.js.map +0 -1
- package/dist/domain/jobs.d.ts +0 -12
- package/dist/domain/jobs.d.ts.map +0 -1
- package/dist/domain/jobs.js +0 -20
- package/dist/domain/jobs.js.map +0 -1
- package/dist/domain/providers.d.ts +0 -10
- package/dist/domain/providers.d.ts.map +0 -1
- package/dist/domain/providers.js +0 -8
- package/dist/domain/providers.js.map +0 -1
- package/dist/domain/runtime.d.ts +0 -14
- package/dist/domain/runtime.d.ts.map +0 -1
- package/dist/domain/runtime.js +0 -10
- package/dist/domain/runtime.js.map +0 -1
- package/dist/domain/sessions.d.ts +0 -12
- package/dist/domain/sessions.d.ts.map +0 -1
- package/dist/domain/sessions.js +0 -57
- package/dist/domain/sessions.js.map +0 -1
- package/dist/examples/localjob.d.ts +0 -2
- package/dist/examples/localjob.d.ts.map +0 -1
- package/dist/examples/localjob.js.map +0 -1
- package/dist/examples/publicapi.d.ts +0 -2
- package/dist/examples/publicapi.d.ts.map +0 -1
- package/dist/examples/publicapi.js.map +0 -1
- package/dist/extension/build.d.ts +0 -9
- package/dist/extension/build.d.ts.map +0 -1
- package/dist/extension/build.js +0 -85
- package/dist/extension/build.js.map +0 -1
- package/dist/extension/content.d.ts +0 -6
- package/dist/extension/content.d.ts.map +0 -1
- package/dist/extension/content.js +0 -135
- package/dist/extension/content.js.map +0 -1
- package/dist/extension/index.d.ts +0 -7
- package/dist/extension/index.d.ts.map +0 -1
- package/dist/extension/index.js +0 -7
- package/dist/extension/index.js.map +0 -1
- package/dist/extension/pagebridge.d.ts +0 -6
- package/dist/extension/pagebridge.d.ts.map +0 -1
- package/dist/extension/pagebridge.js +0 -42
- package/dist/extension/pagebridge.js.map +0 -1
- package/dist/extension/permissions.d.ts +0 -26
- package/dist/extension/permissions.d.ts.map +0 -1
- package/dist/extension/permissions.js +0 -28
- package/dist/extension/permissions.js.map +0 -1
- package/dist/extension/popup.d.ts +0 -5
- package/dist/extension/popup.d.ts.map +0 -1
- package/dist/extension/popup.js +0 -26
- package/dist/extension/popup.js.map +0 -1
- package/dist/extension/protocol.d.ts +0 -58
- package/dist/extension/protocol.d.ts.map +0 -1
- package/dist/extension/protocol.js +0 -101
- package/dist/extension/protocol.js.map +0 -1
- package/dist/extension/serviceworker.d.ts +0 -25
- package/dist/extension/serviceworker.d.ts.map +0 -1
- package/dist/extension/serviceworker.js +0 -102
- package/dist/extension/serviceworker.js.map +0 -1
- package/dist/extension/worker.d.ts +0 -28
- package/dist/extension/worker.d.ts.map +0 -1
- package/dist/extension/worker.js +0 -22
- package/dist/extension/worker.js.map +0 -1
- package/dist/format/check.d.ts +0 -8
- package/dist/format/check.d.ts.map +0 -1
- package/dist/format/check.js +0 -38
- package/dist/format/check.js.map +0 -1
- package/dist/isolation/contracts.d.ts.map +0 -1
- package/dist/isolation/contracts.js.map +0 -1
- package/dist/library/public.d.ts.map +0 -1
- package/dist/library/public.js.map +0 -1
- package/dist/mcp/browser.d.ts +0 -9
- package/dist/mcp/browser.d.ts.map +0 -1
- package/dist/mcp/browser.js +0 -13
- package/dist/mcp/browser.js.map +0 -1
- package/dist/mcp/server.d.ts +0 -35
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js +0 -40
- package/dist/mcp/server.js.map +0 -1
- package/dist/mcp/transport.d.ts +0 -7
- package/dist/mcp/transport.d.ts.map +0 -1
- package/dist/mcp/transport.js +0 -17
- package/dist/mcp/transport.js.map +0 -1
- package/dist/memory/bridge.d.ts +0 -14
- package/dist/memory/bridge.d.ts.map +0 -1
- package/dist/memory/bridge.js +0 -16
- package/dist/memory/bridge.js.map +0 -1
- package/dist/memory/engine.d.ts +0 -38
- package/dist/memory/engine.d.ts.map +0 -1
- package/dist/memory/engine.js +0 -109
- package/dist/memory/engine.js.map +0 -1
- package/dist/memory/modes.d.ts +0 -43
- package/dist/memory/modes.d.ts.map +0 -1
- package/dist/memory/modes.js +0 -66
- package/dist/memory/modes.js.map +0 -1
- package/dist/memory/objects.d.ts +0 -21
- package/dist/memory/objects.d.ts.map +0 -1
- package/dist/memory/objects.js +0 -20
- package/dist/memory/objects.js.map +0 -1
- package/dist/memory/planner.d.ts +0 -66
- package/dist/memory/planner.d.ts.map +0 -1
- package/dist/memory/planner.js +0 -108
- package/dist/memory/planner.js.map +0 -1
- package/dist/memory/targets.d.ts +0 -78
- package/dist/memory/targets.d.ts.map +0 -1
- package/dist/memory/targets.js +0 -29
- package/dist/memory/targets.js.map +0 -1
- package/dist/memory/transforms.d.ts +0 -19
- package/dist/memory/transforms.d.ts.map +0 -1
- package/dist/memory/transforms.js +0 -14
- package/dist/memory/transforms.js.map +0 -1
- package/dist/modes/matrix.d.ts +0 -23
- package/dist/modes/matrix.d.ts.map +0 -1
- package/dist/modes/matrix.js +0 -18
- package/dist/modes/matrix.js.map +0 -1
- package/dist/modes/modes.d.ts +0 -33
- package/dist/modes/modes.d.ts.map +0 -1
- package/dist/modes/modes.js +0 -15
- package/dist/modes/modes.js.map +0 -1
- package/dist/modes/resolve.d.ts +0 -96
- package/dist/modes/resolve.d.ts.map +0 -1
- package/dist/modes/resolve.js +0 -48
- package/dist/modes/resolve.js.map +0 -1
- package/dist/observability/metrics.d.ts +0 -14
- package/dist/observability/metrics.d.ts.map +0 -1
- package/dist/observability/metrics.js +0 -18
- package/dist/observability/metrics.js.map +0 -1
- package/dist/packager/manifest.d.ts +0 -66
- package/dist/packager/manifest.d.ts.map +0 -1
- package/dist/packager/manifest.js +0 -94
- package/dist/packager/manifest.js.map +0 -1
- package/dist/packager/publish.d.ts +0 -51
- package/dist/packager/publish.d.ts.map +0 -1
- package/dist/packager/publish.js +0 -18
- package/dist/packager/publish.js.map +0 -1
- package/dist/packager/targetcli.d.ts +0 -7
- package/dist/packager/targetcli.d.ts.map +0 -1
- package/dist/packager/targetcli.js +0 -22
- package/dist/packager/targetcli.js.map +0 -1
- package/dist/persistence/adapter.d.ts +0 -5
- package/dist/persistence/adapter.d.ts.map +0 -1
- package/dist/persistence/adapter.js +0 -11
- package/dist/persistence/adapter.js.map +0 -1
- package/dist/persistence/drizzle.d.ts +0 -2
- package/dist/persistence/drizzle.d.ts.map +0 -1
- package/dist/persistence/drizzle.js +0 -12
- package/dist/persistence/drizzle.js.map +0 -1
- package/dist/persistence/memory.d.ts +0 -2
- package/dist/persistence/memory.d.ts.map +0 -1
- package/dist/persistence/memory.js +0 -27
- package/dist/persistence/memory.js.map +0 -1
- package/dist/persistence/migrations.d.ts +0 -19
- package/dist/persistence/migrations.d.ts.map +0 -1
- package/dist/persistence/migrations.js +0 -13
- package/dist/persistence/migrations.js.map +0 -1
- package/dist/persistence/prisma.d.ts +0 -2
- package/dist/persistence/prisma.d.ts.map +0 -1
- package/dist/persistence/prisma.js +0 -25
- package/dist/persistence/prisma.js.map +0 -1
- package/dist/persistence/schema.d.ts +0 -63
- package/dist/persistence/schema.d.ts.map +0 -1
- package/dist/persistence/schema.js +0 -28
- package/dist/persistence/schema.js.map +0 -1
- package/dist/persistence/sql.d.ts +0 -3
- package/dist/persistence/sql.d.ts.map +0 -1
- package/dist/persistence/sql.js +0 -37
- package/dist/persistence/sql.js.map +0 -1
- package/dist/protocol/blocks.d.ts +0 -10
- package/dist/protocol/blocks.d.ts.map +0 -1
- package/dist/protocol/blocks.js +0 -26
- package/dist/protocol/blocks.js.map +0 -1
- package/dist/protocol/json.d.ts +0 -6
- package/dist/protocol/json.d.ts.map +0 -1
- package/dist/protocol/json.js +0 -6
- package/dist/protocol/json.js.map +0 -1
- package/dist/protocol/ndjson.d.ts +0 -3
- package/dist/protocol/ndjson.d.ts.map +0 -1
- package/dist/protocol/ndjson.js +0 -20
- package/dist/protocol/ndjson.js.map +0 -1
- package/dist/protocol/sse.d.ts +0 -7
- package/dist/protocol/sse.d.ts.map +0 -1
- package/dist/protocol/sse.js +0 -25
- package/dist/protocol/sse.js.map +0 -1
- package/dist/proxy/pool.d.ts +0 -9
- package/dist/proxy/pool.d.ts.map +0 -1
- package/dist/proxy/pool.js +0 -27
- package/dist/proxy/pool.js.map +0 -1
- package/dist/queue/idempotency.d.ts +0 -10
- package/dist/queue/idempotency.d.ts.map +0 -1
- package/dist/queue/idempotency.js +0 -13
- package/dist/queue/idempotency.js.map +0 -1
- package/dist/queue/persistent.d.ts +0 -14
- package/dist/queue/persistent.d.ts.map +0 -1
- package/dist/queue/persistent.js +0 -66
- package/dist/queue/persistent.js.map +0 -1
- package/dist/queue/queue.d.ts +0 -7
- package/dist/queue/queue.d.ts.map +0 -1
- package/dist/queue/queue.js +0 -55
- package/dist/queue/queue.js.map +0 -1
- package/dist/queue/saga.d.ts +0 -5
- package/dist/queue/saga.d.ts.map +0 -1
- package/dist/queue/saga.js +0 -20
- package/dist/queue/saga.js.map +0 -1
- package/dist/release/assets.d.ts +0 -144
- package/dist/release/assets.d.ts.map +0 -1
- package/dist/release/assets.js +0 -157
- package/dist/release/assets.js.map +0 -1
- package/dist/release/evidence.d.ts +0 -92
- package/dist/release/evidence.d.ts.map +0 -1
- package/dist/release/evidence.js +0 -148
- package/dist/release/evidence.js.map +0 -1
- package/dist/release/verify.d.ts +0 -12
- package/dist/release/verify.d.ts.map +0 -1
- package/dist/release/verify.js +0 -112
- package/dist/release/verify.js.map +0 -1
- package/dist/runners/chain.d.ts +0 -125
- package/dist/runners/chain.d.ts.map +0 -1
- package/dist/runners/chain.js +0 -95
- package/dist/runners/chain.js.map +0 -1
- package/dist/runners/health.d.ts +0 -36
- package/dist/runners/health.d.ts.map +0 -1
- package/dist/runners/health.js +0 -26
- package/dist/runners/health.js.map +0 -1
- package/dist/runners/heartbeat.d.ts +0 -23
- package/dist/runners/heartbeat.d.ts.map +0 -1
- package/dist/runners/heartbeat.js +0 -29
- package/dist/runners/heartbeat.js.map +0 -1
- package/dist/runners/inprocess.d.ts +0 -17
- package/dist/runners/inprocess.d.ts.map +0 -1
- package/dist/runners/inprocess.js +0 -20
- package/dist/runners/inprocess.js.map +0 -1
- package/dist/runners/scheduler.d.ts +0 -5
- package/dist/runners/scheduler.d.ts.map +0 -1
- package/dist/runners/scheduler.js +0 -19
- package/dist/runners/scheduler.js.map +0 -1
- package/dist/runtime/abort.d.ts +0 -8
- package/dist/runtime/abort.d.ts.map +0 -1
- package/dist/runtime/abort.js +0 -13
- package/dist/runtime/abort.js.map +0 -1
- package/dist/runtime/compatibility.d.ts +0 -37
- package/dist/runtime/compatibility.d.ts.map +0 -1
- package/dist/runtime/compatibility.js +0 -10
- package/dist/runtime/compatibility.js.map +0 -1
- package/dist/runtime/detect.d.ts +0 -13
- package/dist/runtime/detect.d.ts.map +0 -1
- package/dist/runtime/detect.js +0 -18
- package/dist/runtime/detect.js.map +0 -1
- package/dist/runtime/engine.d.ts +0 -20
- package/dist/runtime/engine.d.ts.map +0 -1
- package/dist/runtime/engine.js +0 -61
- package/dist/runtime/engine.js.map +0 -1
- package/dist/runtime/retry.d.ts +0 -19
- package/dist/runtime/retry.d.ts.map +0 -1
- package/dist/runtime/retry.js +0 -54
- package/dist/runtime/retry.js.map +0 -1
- package/dist/runtime/worker.d.ts +0 -10
- package/dist/runtime/worker.d.ts.map +0 -1
- package/dist/runtime/worker.js +0 -25
- package/dist/runtime/worker.js.map +0 -1
- package/dist/scrape/cache.d.ts +0 -45
- package/dist/scrape/cache.d.ts.map +0 -1
- package/dist/scrape/cache.js +0 -45
- package/dist/scrape/cache.js.map +0 -1
- package/dist/scrape/crawl.d.ts +0 -47
- package/dist/scrape/crawl.d.ts.map +0 -1
- package/dist/scrape/crawl.js +0 -114
- package/dist/scrape/crawl.js.map +0 -1
- package/dist/scrape/extract.d.ts +0 -63
- package/dist/scrape/extract.d.ts.map +0 -1
- package/dist/scrape/extract.js +0 -47
- package/dist/scrape/extract.js.map +0 -1
- package/dist/scrape/normalize.d.ts +0 -52
- package/dist/scrape/normalize.d.ts.map +0 -1
- package/dist/scrape/normalize.js +0 -102
- package/dist/scrape/normalize.js.map +0 -1
- package/dist/scrape/robots.d.ts +0 -37
- package/dist/scrape/robots.d.ts.map +0 -1
- package/dist/scrape/robots.js +0 -71
- package/dist/scrape/robots.js.map +0 -1
- package/dist/scrape/schema.d.ts +0 -23
- package/dist/scrape/schema.d.ts.map +0 -1
- package/dist/scrape/schema.js +0 -92
- package/dist/scrape/schema.js.map +0 -1
- package/dist/scrape/scraper.d.ts +0 -6
- package/dist/scrape/scraper.d.ts.map +0 -1
- package/dist/scrape/scraper.js +0 -46
- package/dist/scrape/scraper.js.map +0 -1
- package/dist/scrape/semantic.d.ts +0 -25
- package/dist/scrape/semantic.d.ts.map +0 -1
- package/dist/scrape/semantic.js +0 -27
- package/dist/scrape/semantic.js.map +0 -1
- package/dist/server/node.d.ts +0 -7
- package/dist/server/node.d.ts.map +0 -1
- package/dist/server/node.js.map +0 -1
- package/dist/sessions/file.d.ts +0 -25
- package/dist/sessions/file.d.ts.map +0 -1
- package/dist/sessions/file.js +0 -13
- package/dist/sessions/file.js.map +0 -1
- package/dist/sessions/replay.d.ts +0 -9
- package/dist/sessions/replay.d.ts.map +0 -1
- package/dist/sessions/replay.js +0 -70
- package/dist/sessions/replay.js.map +0 -1
- package/dist/sessions/store.d.ts +0 -25
- package/dist/sessions/store.d.ts.map +0 -1
- package/dist/sessions/store.js +0 -13
- package/dist/sessions/store.js.map +0 -1
- package/dist/storage/adapter.d.ts +0 -5
- package/dist/storage/adapter.d.ts.map +0 -1
- package/dist/storage/adapter.js +0 -11
- package/dist/storage/adapter.js.map +0 -1
- package/dist/storage/cache.d.ts +0 -23
- package/dist/storage/cache.d.ts.map +0 -1
- package/dist/storage/cache.js +0 -79
- package/dist/storage/cache.js.map +0 -1
- package/dist/storage/checksum.d.ts +0 -3
- package/dist/storage/checksum.d.ts.map +0 -1
- package/dist/storage/checksum.js +0 -19
- package/dist/storage/checksum.js.map +0 -1
- package/dist/storage/chunked.d.ts +0 -21
- package/dist/storage/chunked.d.ts.map +0 -1
- package/dist/storage/chunked.js +0 -67
- package/dist/storage/chunked.js.map +0 -1
- package/dist/storage/content.d.ts +0 -24
- package/dist/storage/content.d.ts.map +0 -1
- package/dist/storage/content.js +0 -44
- package/dist/storage/content.js.map +0 -1
- package/dist/storage/filehosting.d.ts +0 -2
- package/dist/storage/filehosting.d.ts.map +0 -1
- package/dist/storage/filehosting.js +0 -24
- package/dist/storage/filehosting.js.map +0 -1
- package/dist/storage/githubcontents.d.ts +0 -2
- package/dist/storage/githubcontents.d.ts.map +0 -1
- package/dist/storage/githubcontents.js +0 -29
- package/dist/storage/githubcontents.js.map +0 -1
- package/dist/storage/index.d.ts +0 -12
- package/dist/storage/index.d.ts.map +0 -1
- package/dist/storage/index.js +0 -12
- package/dist/storage/index.js.map +0 -1
- package/dist/storage/local.d.ts +0 -2
- package/dist/storage/local.d.ts.map +0 -1
- package/dist/storage/local.js +0 -72
- package/dist/storage/local.js.map +0 -1
- package/dist/storage/memory.d.ts +0 -6
- package/dist/storage/memory.d.ts.map +0 -1
- package/dist/storage/memory.js +0 -36
- package/dist/storage/memory.js.map +0 -1
- package/dist/storage/pool.d.ts +0 -95
- package/dist/storage/pool.d.ts.map +0 -1
- package/dist/storage/pool.js +0 -202
- package/dist/storage/pool.js.map +0 -1
- package/dist/storage/s3compatible.d.ts +0 -3
- package/dist/storage/s3compatible.d.ts.map +0 -1
- package/dist/storage/s3compatible.js +0 -70
- package/dist/storage/s3compatible.js.map +0 -1
- package/dist/storage/sync.d.ts +0 -47
- package/dist/storage/sync.d.ts.map +0 -1
- package/dist/storage/sync.js +0 -75
- package/dist/storage/sync.js.map +0 -1
- package/dist/surfaces/adapters.d.ts +0 -97
- package/dist/surfaces/adapters.d.ts.map +0 -1
- package/dist/surfaces/adapters.js +0 -50
- package/dist/surfaces/adapters.js.map +0 -1
- package/dist/surfaces/controls.d.ts +0 -18
- package/dist/surfaces/controls.d.ts.map +0 -1
- package/dist/surfaces/controls.js +0 -45
- package/dist/surfaces/controls.js.map +0 -1
- package/dist/surfaces/manifest.d.ts +0 -68
- package/dist/surfaces/manifest.d.ts.map +0 -1
- package/dist/surfaces/manifest.js +0 -42
- package/dist/surfaces/manifest.js.map +0 -1
- package/dist/surfaces/n8n.d.ts +0 -25
- package/dist/surfaces/n8n.d.ts.map +0 -1
- package/dist/surfaces/n8n.js +0 -31
- package/dist/surfaces/n8n.js.map +0 -1
- package/dist/surfaces/operations.d.ts +0 -32
- package/dist/surfaces/operations.d.ts.map +0 -1
- package/dist/surfaces/operations.js +0 -53
- package/dist/surfaces/operations.js.map +0 -1
- package/dist/surfaces/requirements.d.ts +0 -29
- package/dist/surfaces/requirements.d.ts.map +0 -1
- package/dist/surfaces/requirements.js +0 -50
- package/dist/surfaces/requirements.js.map +0 -1
- package/dist/surfaces/targets.d.ts +0 -196
- package/dist/surfaces/targets.d.ts.map +0 -1
- package/dist/surfaces/targets.js +0 -27
- package/dist/surfaces/targets.js.map +0 -1
- package/dist/webhook/delivery.d.ts +0 -18
- package/dist/webhook/delivery.d.ts.map +0 -1
- package/dist/webhook/delivery.js +0 -36
- package/dist/webhook/delivery.js.map +0 -1
- package/dist/webhook/receiver.d.ts +0 -26
- package/dist/webhook/receiver.d.ts.map +0 -1
- package/dist/webhook/receiver.js +0 -24
- package/dist/webhook/receiver.js.map +0 -1
- package/dist/webhook/signature.d.ts +0 -3
- package/dist/webhook/signature.d.ts.map +0 -1
- package/dist/webhook/signature.js +0 -7
- package/dist/webhook/signature.js.map +0 -1
- package/dist/workflow/manifest.d.ts +0 -22
- package/dist/workflow/manifest.d.ts.map +0 -1
- package/dist/workflow/manifest.js +0 -21
- package/dist/workflow/manifest.js.map +0 -1
- package/dist/workflow/registry.d.ts +0 -7
- package/dist/workflow/registry.d.ts.map +0 -1
- package/dist/workflow/registry.js +0 -18
- package/dist/workflow/registry.js.map +0 -1
- package/dist/workflow/templates.d.ts +0 -6
- package/dist/workflow/templates.d.ts.map +0 -1
- package/dist/workflow/templates.js +0 -18
- package/dist/workflow/templates.js.map +0 -1
- package/dist/workflow/triggers.d.ts +0 -64
- package/dist/workflow/triggers.d.ts.map +0 -1
- package/dist/workflow/triggers.js +0 -99
- package/dist/workflow/triggers.js.map +0 -1
- /package/{extension/README.md → docs/extension.md} +0 -0
package/passage.config
ADDED
|
@@ -0,0 +1,1331 @@
|
|
|
1
|
+
{
|
|
2
|
+
"meta": {
|
|
3
|
+
"name": "passage.config",
|
|
4
|
+
"title": "saddle - Passage Configuration (3 homonym domains kept separate + host playbook)",
|
|
5
|
+
"version": "2.0.0",
|
|
6
|
+
"date": "2026-08-22",
|
|
7
|
+
"language": "en",
|
|
8
|
+
"conceptSeparation": "'passage' has 3 distinct domains in the pool: (1) gateway - L7 Pingora reverse proxy (routes/upstreams/TLS 1.3); (2) passthrough - PCI device passthrough modes (VFIO/MDEV/MIG/vGPU/SR-IOV/vfio-user/hotplug/KVM/none); (3) network_binding - VM network bridge modes + host port binding (never localhost). A 4th section carries the AetherForge host-side VFIO playbook. Sections are NEVER merged.",
|
|
9
|
+
"sources": [
|
|
10
|
+
"pool:passage.config [S6 YAML - L7 gateway pingora, UNIQUE]",
|
|
11
|
+
"pool:passage.json [V5 - passthrough matrix, UNIQUE]",
|
|
12
|
+
"pool:nested_passage.json [network_binding never-localhost, UNIQUE]",
|
|
13
|
+
"pool:passage.yaml [AetherForge host playbook VFIO, UNIQUE]",
|
|
14
|
+
"cross-ref: gpus.json#gpu_profiles_vfio (11 GPUs vfioIds)"
|
|
15
|
+
],
|
|
16
|
+
"mergeReport": {
|
|
17
|
+
"gatewayRoutes": 7,
|
|
18
|
+
"gatewayUpstreams": [
|
|
19
|
+
"vmprimary",
|
|
20
|
+
"mttgworkers",
|
|
21
|
+
"gpumetrics",
|
|
22
|
+
"hyperscalepool"
|
|
23
|
+
],
|
|
24
|
+
"passthroughModesOverview": 8,
|
|
25
|
+
"passthroughSections": [
|
|
26
|
+
"vfio",
|
|
27
|
+
"mdev",
|
|
28
|
+
"mig",
|
|
29
|
+
"vgpu",
|
|
30
|
+
"sriov",
|
|
31
|
+
"vfio_user",
|
|
32
|
+
"hotplug",
|
|
33
|
+
"kvm",
|
|
34
|
+
"none_mode",
|
|
35
|
+
"decision_matrix"
|
|
36
|
+
],
|
|
37
|
+
"networkModesRef": "6 modes (direct/bridge/nat/overlay_vxlan/zero_trust/latency_optimization) canonical in vm.config.json#production_example.vm.network.passage.modes",
|
|
38
|
+
"vfioIdsGpus": 10,
|
|
39
|
+
"rePins": "node 22.12.3->24.19.0 LTS/26.7.0, ts 5.6.3->7.0.2, docker 27.3.1->29.7.2, qemu 9.1.2->11.1.0",
|
|
40
|
+
"pinPatch": "embedded active config values re-pinned date-first 2026-08-22 (9.1.2->11.1.0, 27.3.1->29.7.2, 22.12.3->24.19.0, 5.6.3->7.0.2, 25.2.7->26.2.1, 19.1.7->22.1.8, 1.9.0->1.16.1, libvirt 10.10.0->12.5.0, checkout v4.2.2->v5); originals preserved under *_legacy*/source_value keys"
|
|
41
|
+
},
|
|
42
|
+
"inheritedSourcesPassthroughJson": [
|
|
43
|
+
"https://docs.kernel.org/driver-api/vfio.html",
|
|
44
|
+
"https://docs.kernel.org/driver-api/vfio-mediated-device.html",
|
|
45
|
+
"https://docs.nvidia.com/data-center/tesla/mig-user-guide/",
|
|
46
|
+
"https://www.cloudhypervisor.org",
|
|
47
|
+
"https://raw.githubusercontent.com/cloud-hypervisor/cloud-hypervisor/main/docs/vfio-user.md",
|
|
48
|
+
"https://github.com/cloud-hypervisor/cloud-hypervisor/releases",
|
|
49
|
+
"https://www.qemu.org/docs/master/system/device-emulation.html",
|
|
50
|
+
"https://github.com/actions/runner-images/issues/12933",
|
|
51
|
+
"https://github.com/actions/runner-images/issues/14062",
|
|
52
|
+
"https://actuated.com/blog/kvm-in-github-actions",
|
|
53
|
+
"https://github.com/e2b-dev/infra/blob/main/self-host.md"
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
"gateway": {
|
|
57
|
+
"meta": {
|
|
58
|
+
"project": "saddle (grand merge)",
|
|
59
|
+
"version": "2.0.0",
|
|
60
|
+
"schema": "passage.config",
|
|
61
|
+
"schemaversion": "2026.08.22",
|
|
62
|
+
"engine": "passage gateway v6",
|
|
63
|
+
"runtime": {
|
|
64
|
+
"node": "24.19.0 LTS (current 26.7.0)",
|
|
65
|
+
"typescript": "7.0.2",
|
|
66
|
+
"python": "3.14.7",
|
|
67
|
+
"rust": "1.82.0",
|
|
68
|
+
"pingora": "0.4.2",
|
|
69
|
+
"docker": "29.7.2",
|
|
70
|
+
"qemu": "11.1.0",
|
|
71
|
+
"rePinNote": "legacy saddle-v6 pins (node 22.12.3, ts 5.6.3, docker 27.3.1, qemu 9.1.2) superseded date-first 2026-08-22; pingora/rust gateway pins kept"
|
|
72
|
+
},
|
|
73
|
+
"cicd": {
|
|
74
|
+
"checkout": "v5",
|
|
75
|
+
"setupnode": "v4.1.0",
|
|
76
|
+
"setuppython": "v5.4.0",
|
|
77
|
+
"setuprust": "v1.0.0",
|
|
78
|
+
"dockerbuildx": "v3.7.1"
|
|
79
|
+
},
|
|
80
|
+
"generated": "2026-08-22T00:00:00+00:00",
|
|
81
|
+
"compatibility": [
|
|
82
|
+
"vm.config",
|
|
83
|
+
"gpu.config",
|
|
84
|
+
"qemu.config",
|
|
85
|
+
"mttg.config",
|
|
86
|
+
"docker.config",
|
|
87
|
+
"boards.json",
|
|
88
|
+
"cores.json",
|
|
89
|
+
"processors.json",
|
|
90
|
+
"gpus.json",
|
|
91
|
+
"vcpus.json",
|
|
92
|
+
"vram.json",
|
|
93
|
+
"amdryzenxseries.json",
|
|
94
|
+
"nvidiablackwell.json"
|
|
95
|
+
],
|
|
96
|
+
"mode": "root-direct",
|
|
97
|
+
"layers": 3,
|
|
98
|
+
"maxfilesize": 45,
|
|
99
|
+
"docsquality": "high",
|
|
100
|
+
"legacyRuntimeSaddleV6": {
|
|
101
|
+
"node": "22.12.3",
|
|
102
|
+
"typescript": "5.6.3",
|
|
103
|
+
"python": "3.14.7",
|
|
104
|
+
"rust": "1.82.0",
|
|
105
|
+
"pingora": "0.4.2",
|
|
106
|
+
"docker": "27.3.1",
|
|
107
|
+
"qemu": "9.1.2"
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
"passage": {
|
|
111
|
+
"bind": {
|
|
112
|
+
"address": "0.0.0.0",
|
|
113
|
+
"httpport": 8080,
|
|
114
|
+
"httpsport": 8443,
|
|
115
|
+
"adminport": 9091,
|
|
116
|
+
"metricsport": 9090
|
|
117
|
+
},
|
|
118
|
+
"protocol": {
|
|
119
|
+
"http2": true,
|
|
120
|
+
"http3": true,
|
|
121
|
+
"quic": true,
|
|
122
|
+
"tls": {
|
|
123
|
+
"minversion": "TLS1.3",
|
|
124
|
+
"maxversion": "TLS1.3",
|
|
125
|
+
"only": true,
|
|
126
|
+
"ciphersuites": [
|
|
127
|
+
"TLS_AES_128_GCM_SHA256",
|
|
128
|
+
"TLS_AES_256_GCM_SHA384",
|
|
129
|
+
"TLS_CHACHA20_POLY1305_SHA256"
|
|
130
|
+
],
|
|
131
|
+
"curves": [
|
|
132
|
+
"X25519",
|
|
133
|
+
"P-256",
|
|
134
|
+
"P-384"
|
|
135
|
+
],
|
|
136
|
+
"alpn": [
|
|
137
|
+
"h2",
|
|
138
|
+
"h3",
|
|
139
|
+
"http/1.1"
|
|
140
|
+
]
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
"runtime": {
|
|
144
|
+
"workermodel": "pingora",
|
|
145
|
+
"workertthreads": "auto",
|
|
146
|
+
"nodemain": "pipelinememorypassage.ts",
|
|
147
|
+
"implementation": "coreorchestrator.ts",
|
|
148
|
+
"nativepriority": [
|
|
149
|
+
"node:fs",
|
|
150
|
+
"node:http",
|
|
151
|
+
"node:https",
|
|
152
|
+
"node:crypto",
|
|
153
|
+
"node:path",
|
|
154
|
+
"node:os",
|
|
155
|
+
"node:net"
|
|
156
|
+
]
|
|
157
|
+
},
|
|
158
|
+
"limits": {
|
|
159
|
+
"maxconnections": 131072,
|
|
160
|
+
"maxrequestsize": "50GiB",
|
|
161
|
+
"keepalive": "75s",
|
|
162
|
+
"readtimeout": "30s",
|
|
163
|
+
"writetimeout": "30s"
|
|
164
|
+
},
|
|
165
|
+
"logging": {
|
|
166
|
+
"level": "info",
|
|
167
|
+
"acceslog": "/var/log/saddle/passage/access.log",
|
|
168
|
+
"errorlog": "/var/log/saddle/passage/error.log",
|
|
169
|
+
"requestidheader": "x-saddle-request-id",
|
|
170
|
+
"format": "json"
|
|
171
|
+
},
|
|
172
|
+
"errorcatcher": {
|
|
173
|
+
"enabled": true,
|
|
174
|
+
"endpoint": "/_passage/error",
|
|
175
|
+
"uisize": "44px",
|
|
176
|
+
"fallbackpage": "/usr/share/saddle/static/error44.html",
|
|
177
|
+
"jsonerror": true,
|
|
178
|
+
"catchall": [
|
|
179
|
+
502,
|
|
180
|
+
503,
|
|
181
|
+
504,
|
|
182
|
+
413,
|
|
183
|
+
429
|
|
184
|
+
]
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
"upstreams": {
|
|
188
|
+
"vmprimary": {
|
|
189
|
+
"id": "vmprimary",
|
|
190
|
+
"description": "Primary QEMU 11.1.0 VM pool, AMD Ryzen X Series, 1..1024 vCPU modular",
|
|
191
|
+
"type": "qemuvm",
|
|
192
|
+
"discovery": "static",
|
|
193
|
+
"engine": "qemu 11.1.0 + kvm",
|
|
194
|
+
"nodes": "/mnt/data/saddle-v6/boards.json",
|
|
195
|
+
"endpoints": [
|
|
196
|
+
{
|
|
197
|
+
"address": "127.0.0.1",
|
|
198
|
+
"port": 22,
|
|
199
|
+
"weight": 100,
|
|
200
|
+
"meta": {
|
|
201
|
+
"vcpu": 32,
|
|
202
|
+
"rammb": 65536,
|
|
203
|
+
"role": "primary",
|
|
204
|
+
"arch": "amdryzenxseries",
|
|
205
|
+
"qemu": "11.1.0"
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
"address": "10.88.0.2",
|
|
210
|
+
"port": 2222,
|
|
211
|
+
"weight": 100,
|
|
212
|
+
"meta": {
|
|
213
|
+
"vcpu": 137,
|
|
214
|
+
"rammb": 7919,
|
|
215
|
+
"role": "oddcustom",
|
|
216
|
+
"board": "x3d",
|
|
217
|
+
"notes": "modular unlimited"
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"address": "10.88.0.3",
|
|
222
|
+
"port": 2222,
|
|
223
|
+
"weight": 120,
|
|
224
|
+
"meta": {
|
|
225
|
+
"vcpu": 64,
|
|
226
|
+
"rammb": 131072,
|
|
227
|
+
"role": "secondary",
|
|
228
|
+
"arch": "xseries"
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
],
|
|
232
|
+
"healthcheck": {
|
|
233
|
+
"path": "/healthz",
|
|
234
|
+
"interval": "5s",
|
|
235
|
+
"timeout": "2s",
|
|
236
|
+
"healthythreshold": 2,
|
|
237
|
+
"unhealthythreshold": 3,
|
|
238
|
+
"expected": 200,
|
|
239
|
+
"protocol": "https",
|
|
240
|
+
"tls": "TLS1.3"
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
"mttgworkers": {
|
|
244
|
+
"id": "mttgworkers",
|
|
245
|
+
"description": "MTTG transcode workers, ffmpeg 7.1, nvenc Blackwell GB200 B200",
|
|
246
|
+
"type": "transcode",
|
|
247
|
+
"discovery": "dns",
|
|
248
|
+
"dnsname": "mttgworkers.saddle.internal",
|
|
249
|
+
"engine": "ffmpeg 7.1 + cuda 12.8 + python 3.14.7",
|
|
250
|
+
"configref": "mttg.config",
|
|
251
|
+
"endpoints": [
|
|
252
|
+
{
|
|
253
|
+
"address": "10.88.0.10",
|
|
254
|
+
"port": 9000,
|
|
255
|
+
"weight": 200,
|
|
256
|
+
"meta": {
|
|
257
|
+
"vcpu": 64,
|
|
258
|
+
"rammb": 131072,
|
|
259
|
+
"gpu": "b200sxm",
|
|
260
|
+
"vrammb": 196608,
|
|
261
|
+
"sku": "nvidia-blackwell-b200",
|
|
262
|
+
"pipeline": "mttg"
|
|
263
|
+
}
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
"address": "10.88.0.11",
|
|
267
|
+
"port": 9000,
|
|
268
|
+
"weight": 250,
|
|
269
|
+
"meta": {
|
|
270
|
+
"vcpu": 192,
|
|
271
|
+
"rammb": 262144,
|
|
272
|
+
"gpu": "gb200",
|
|
273
|
+
"vrammb": 393216,
|
|
274
|
+
"sku": "nvidia-blackwell-gb200",
|
|
275
|
+
"pipeline": "mttg",
|
|
276
|
+
"nvlink": true
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
"address": "10.88.0.12",
|
|
281
|
+
"port": 9000,
|
|
282
|
+
"weight": 80,
|
|
283
|
+
"meta": {
|
|
284
|
+
"vcpu": 16,
|
|
285
|
+
"rammb": 32768,
|
|
286
|
+
"gpu": "b100",
|
|
287
|
+
"vrammb": 98304,
|
|
288
|
+
"sku": "nvidia-blackwell-b100"
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
],
|
|
292
|
+
"healthcheck": {
|
|
293
|
+
"path": "/mttg/health",
|
|
294
|
+
"interval": "10s",
|
|
295
|
+
"timeout": "3s",
|
|
296
|
+
"grpc": true,
|
|
297
|
+
"expected": 200
|
|
298
|
+
},
|
|
299
|
+
"autoscale": {
|
|
300
|
+
"min": 2,
|
|
301
|
+
"max": 64,
|
|
302
|
+
"metric": "queuelen",
|
|
303
|
+
"threshold": 20
|
|
304
|
+
}
|
|
305
|
+
},
|
|
306
|
+
"gpumetrics": {
|
|
307
|
+
"id": "gpumetrics",
|
|
308
|
+
"description": "GPU telemetry, DCGM, Blackwell power memory, 44px dashboard",
|
|
309
|
+
"type": "metrics",
|
|
310
|
+
"discovery": "static",
|
|
311
|
+
"configref": "gpu.config",
|
|
312
|
+
"databaseref": "gpus.json",
|
|
313
|
+
"vramref": "vram.json",
|
|
314
|
+
"engine": "dcgm 3.3 + prometheus",
|
|
315
|
+
"endpoints": [
|
|
316
|
+
{
|
|
317
|
+
"address": "127.0.0.1",
|
|
318
|
+
"port": 9400,
|
|
319
|
+
"weight": 100,
|
|
320
|
+
"meta": {
|
|
321
|
+
"role": "dcgm",
|
|
322
|
+
"gpus": "nvidiablackwell",
|
|
323
|
+
"arch": "blackwell",
|
|
324
|
+
"vram": "2-4tbhost"
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
],
|
|
328
|
+
"healthcheck": {
|
|
329
|
+
"path": "/metrics",
|
|
330
|
+
"interval": "15s",
|
|
331
|
+
"timeout": "5s",
|
|
332
|
+
"expected": 200
|
|
333
|
+
}
|
|
334
|
+
},
|
|
335
|
+
"hyperscalepool": {
|
|
336
|
+
"id": "hyperscalepool",
|
|
337
|
+
"description": "Hyperscale extreme 1024 vCPU 2-4TB RAM nodes for memory bound jobs",
|
|
338
|
+
"type": "compute",
|
|
339
|
+
"discovery": "static",
|
|
340
|
+
"engine": "qemu 11.1.0 + numa + hugepages",
|
|
341
|
+
"numa": true,
|
|
342
|
+
"hugepages": "1GiB",
|
|
343
|
+
"endpoints": [
|
|
344
|
+
{
|
|
345
|
+
"address": "10.88.1.2",
|
|
346
|
+
"port": 8080,
|
|
347
|
+
"weight": 100,
|
|
348
|
+
"meta": {
|
|
349
|
+
"vcpu": 1024,
|
|
350
|
+
"rammb": 2097152,
|
|
351
|
+
"ram": "2TB",
|
|
352
|
+
"tier": "hyperscale",
|
|
353
|
+
"note": "1024 vCPU / 2048GB RAM, observer sees massive host, 2TB minimal",
|
|
354
|
+
"coresref": "cores.json",
|
|
355
|
+
"vcpusref": "vcpus.json",
|
|
356
|
+
"processorsref": "processors.json"
|
|
357
|
+
}
|
|
358
|
+
},
|
|
359
|
+
{
|
|
360
|
+
"address": "10.88.1.3",
|
|
361
|
+
"port": 8080,
|
|
362
|
+
"weight": 100,
|
|
363
|
+
"meta": {
|
|
364
|
+
"vcpu": 1024,
|
|
365
|
+
"rammb": 4194304,
|
|
366
|
+
"ram": "4TB",
|
|
367
|
+
"tier": "hyperscale",
|
|
368
|
+
"note": "1024 vCPU / 4096GB RAM SADDLE max 4TB, edge for transcode cache"
|
|
369
|
+
}
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
"address": "10.88.1.4",
|
|
373
|
+
"port": 8080,
|
|
374
|
+
"weight": 90,
|
|
375
|
+
"meta": {
|
|
376
|
+
"vcpu": 1024,
|
|
377
|
+
"rammb": 3145728,
|
|
378
|
+
"ram": "3TB",
|
|
379
|
+
"tier": "hyperscale",
|
|
380
|
+
"note": "1024 vCPU / 3072GB RAM mid tier, blackwell weighted"
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
],
|
|
384
|
+
"healthcheck": {
|
|
385
|
+
"path": "/hyperscale/healthz",
|
|
386
|
+
"interval": "10s",
|
|
387
|
+
"timeout": "5s",
|
|
388
|
+
"healthythreshold": 2,
|
|
389
|
+
"unhealthythreshold": 2,
|
|
390
|
+
"expected": 200
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
},
|
|
394
|
+
"routes": [
|
|
395
|
+
{
|
|
396
|
+
"id": "apiv5transcode",
|
|
397
|
+
"match": {
|
|
398
|
+
"pathprefix": "/api/v5/transcode",
|
|
399
|
+
"methods": [
|
|
400
|
+
"GET",
|
|
401
|
+
"POST",
|
|
402
|
+
"PUT",
|
|
403
|
+
"PATCH"
|
|
404
|
+
],
|
|
405
|
+
"headers": {
|
|
406
|
+
"xmttgpipeline": "present"
|
|
407
|
+
}
|
|
408
|
+
},
|
|
409
|
+
"upstream": "mttgworkers",
|
|
410
|
+
"loadbalancing": "leastconn",
|
|
411
|
+
"description": "MTTG transcode submit, long lived, least connections best",
|
|
412
|
+
"timeout": "3600s",
|
|
413
|
+
"bodylimit": "50GiB",
|
|
414
|
+
"retries": 2,
|
|
415
|
+
"priority": 10,
|
|
416
|
+
"circuitbreaker": {
|
|
417
|
+
"maxconnections": 256,
|
|
418
|
+
"maxpending": 2048,
|
|
419
|
+
"maxretries": 3,
|
|
420
|
+
"ejection": {
|
|
421
|
+
"consecutive5xx": 5,
|
|
422
|
+
"interval": "30s",
|
|
423
|
+
"base": "30s",
|
|
424
|
+
"maxejection": 50
|
|
425
|
+
}
|
|
426
|
+
},
|
|
427
|
+
"headers": {
|
|
428
|
+
"add": {
|
|
429
|
+
"xsaddlegateway": "passage-v6",
|
|
430
|
+
"xsaddlevcpumode": "modular-unlimited-1024",
|
|
431
|
+
"xblackwell": "enabled",
|
|
432
|
+
"xpingora": "0.4.2",
|
|
433
|
+
"xnode": "24.19.0"
|
|
434
|
+
}
|
|
435
|
+
},
|
|
436
|
+
"ratelimit": {
|
|
437
|
+
"rps": 2000,
|
|
438
|
+
"burst": 4000,
|
|
439
|
+
"key": "ip"
|
|
440
|
+
}
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
"id": "hlsedge",
|
|
444
|
+
"match": {
|
|
445
|
+
"pathprefix": "/hls/",
|
|
446
|
+
"methods": [
|
|
447
|
+
"GET",
|
|
448
|
+
"HEAD",
|
|
449
|
+
"OPTIONS"
|
|
450
|
+
],
|
|
451
|
+
"query": {
|
|
452
|
+
"segment": "present"
|
|
453
|
+
}
|
|
454
|
+
},
|
|
455
|
+
"upstream": "mttgworkers",
|
|
456
|
+
"loadbalancing": "poweroftwochoices",
|
|
457
|
+
"description": "HLS segments edge cache, p2c picks two random least loaded",
|
|
458
|
+
"timeout": "5s",
|
|
459
|
+
"bodylimit": "10MiB",
|
|
460
|
+
"priority": 20,
|
|
461
|
+
"caching": {
|
|
462
|
+
"enabled": true,
|
|
463
|
+
"type": "edge",
|
|
464
|
+
"ttl": "60s",
|
|
465
|
+
"swr": "30s",
|
|
466
|
+
"maxfilesize": "10MiB",
|
|
467
|
+
"cachecontrol": "public, max-age=2, stale-while-revalidate=30",
|
|
468
|
+
"key": [
|
|
469
|
+
"uri",
|
|
470
|
+
"query",
|
|
471
|
+
"header-accept"
|
|
472
|
+
],
|
|
473
|
+
"storage": "/var/cache/saddle/hls",
|
|
474
|
+
"sizelimit": "500GiB",
|
|
475
|
+
"tiers": 2
|
|
476
|
+
},
|
|
477
|
+
"headers": {
|
|
478
|
+
"add": {
|
|
479
|
+
"xsaddlecache": "edge-p2c",
|
|
480
|
+
"cachecontrol": "public"
|
|
481
|
+
}
|
|
482
|
+
},
|
|
483
|
+
"compression": {
|
|
484
|
+
"enabled": true,
|
|
485
|
+
"types": [
|
|
486
|
+
"application/vnd.apple.mpegurl",
|
|
487
|
+
"video/mp2t"
|
|
488
|
+
]
|
|
489
|
+
}
|
|
490
|
+
},
|
|
491
|
+
{
|
|
492
|
+
"id": "apiv5root",
|
|
493
|
+
"match": {
|
|
494
|
+
"pathprefix": "/api/v5/",
|
|
495
|
+
"methods": [
|
|
496
|
+
"GET",
|
|
497
|
+
"POST",
|
|
498
|
+
"PUT",
|
|
499
|
+
"DELETE",
|
|
500
|
+
"PATCH"
|
|
501
|
+
]
|
|
502
|
+
},
|
|
503
|
+
"upstream": "vmprimary",
|
|
504
|
+
"loadbalancing": "roundrobin",
|
|
505
|
+
"description": "Root API round robin fair distribution stateless",
|
|
506
|
+
"timeout": "30s",
|
|
507
|
+
"retries": 2,
|
|
508
|
+
"headers": {
|
|
509
|
+
"add": {
|
|
510
|
+
"xsaddlegateway": "passage-v6",
|
|
511
|
+
"xsaddlemodes": 30
|
|
512
|
+
}
|
|
513
|
+
},
|
|
514
|
+
"ratelimit": {
|
|
515
|
+
"rps": 5000,
|
|
516
|
+
"burst": 10000
|
|
517
|
+
}
|
|
518
|
+
},
|
|
519
|
+
{
|
|
520
|
+
"id": "hyperscalecompute",
|
|
521
|
+
"match": {
|
|
522
|
+
"pathprefix": "/api/v6/hyperscale/",
|
|
523
|
+
"headers": {
|
|
524
|
+
"xsaddletier": "hyperscale"
|
|
525
|
+
},
|
|
526
|
+
"methods": [
|
|
527
|
+
"GET",
|
|
528
|
+
"POST"
|
|
529
|
+
]
|
|
530
|
+
},
|
|
531
|
+
"upstream": "hyperscalepool",
|
|
532
|
+
"loadbalancing": "weighted",
|
|
533
|
+
"description": "Hyperscale tier weighted by RAM and Blackwell VRAM",
|
|
534
|
+
"timeout": "600s",
|
|
535
|
+
"retries": 1,
|
|
536
|
+
"headers": {
|
|
537
|
+
"add": {
|
|
538
|
+
"xsaddlehyperscale": "1024vcpu-2-4tb",
|
|
539
|
+
"xblackwell": "weighted"
|
|
540
|
+
}
|
|
541
|
+
},
|
|
542
|
+
"bodylimit": "10GiB"
|
|
543
|
+
},
|
|
544
|
+
{
|
|
545
|
+
"id": "gpudashboard",
|
|
546
|
+
"match": {
|
|
547
|
+
"pathprefix": "/gpu/",
|
|
548
|
+
"methods": [
|
|
549
|
+
"GET"
|
|
550
|
+
]
|
|
551
|
+
},
|
|
552
|
+
"upstream": "gpumetrics",
|
|
553
|
+
"loadbalancing": "ringhash",
|
|
554
|
+
"description": "GPU metrics dashboard, ringhash ip hash for affinity",
|
|
555
|
+
"timeout": "15s",
|
|
556
|
+
"auth": "apikey",
|
|
557
|
+
"headers": {
|
|
558
|
+
"add": {
|
|
559
|
+
"xsaddlegpuarch": "blackwell",
|
|
560
|
+
"xryzenx": "enabled",
|
|
561
|
+
"xpingora": "0.4.2"
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
},
|
|
565
|
+
{
|
|
566
|
+
"id": "vmsstunnel",
|
|
567
|
+
"match": {
|
|
568
|
+
"pathprefix": "/ssh/",
|
|
569
|
+
"upgrade": "websocket"
|
|
570
|
+
},
|
|
571
|
+
"upstream": "vmprimary",
|
|
572
|
+
"loadbalancing": "ringhash",
|
|
573
|
+
"description": "VM SSH over websocket, ip hash affinity",
|
|
574
|
+
"timeout": "300s",
|
|
575
|
+
"headers": {
|
|
576
|
+
"add": {
|
|
577
|
+
"xsaddlepassage": "vsock-virtio"
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
},
|
|
581
|
+
{
|
|
582
|
+
"id": "errorcatcher",
|
|
583
|
+
"match": {
|
|
584
|
+
"pathprefix": "/_passage/error",
|
|
585
|
+
"methods": [
|
|
586
|
+
"GET"
|
|
587
|
+
]
|
|
588
|
+
},
|
|
589
|
+
"upstream": "vmprimary",
|
|
590
|
+
"loadbalancing": "roundrobin",
|
|
591
|
+
"description": "Error catcher overlay 44px touch target",
|
|
592
|
+
"timeout": "5s",
|
|
593
|
+
"auth": false
|
|
594
|
+
}
|
|
595
|
+
],
|
|
596
|
+
"loadbalancing": {
|
|
597
|
+
"defaultpolicy": "roundrobin",
|
|
598
|
+
"policies": {
|
|
599
|
+
"roundrobin": {
|
|
600
|
+
"type": "roundrobin",
|
|
601
|
+
"description": "Fair distribution, stateless API, observer cycles endpoints",
|
|
602
|
+
"algorithm": "weighted round robin simple",
|
|
603
|
+
"resetslowstart": true,
|
|
604
|
+
"slowstart": "10s"
|
|
605
|
+
},
|
|
606
|
+
"leastconn": {
|
|
607
|
+
"type": "leastconn",
|
|
608
|
+
"description": "Best for /api/v5/transcode long jobs, least active connections",
|
|
609
|
+
"choice": "activeconns",
|
|
610
|
+
"slowstart": "30s",
|
|
611
|
+
"emaalpha": 0.2,
|
|
612
|
+
"observer": "tracks active request count per mttgworkers node"
|
|
613
|
+
},
|
|
614
|
+
"ringhash": {
|
|
615
|
+
"type": "ringhash",
|
|
616
|
+
"description": "Consistent hash ring, ip affinity for gpu and ssh tunnel",
|
|
617
|
+
"hash": "ip",
|
|
618
|
+
"replication": 256,
|
|
619
|
+
"vnodes": 256,
|
|
620
|
+
"observer": "maps client ip to ring position"
|
|
621
|
+
},
|
|
622
|
+
"weighted": {
|
|
623
|
+
"type": "weighted",
|
|
624
|
+
"description": "Weighted round robin Blackwell aware, B200 192GB weight high",
|
|
625
|
+
"algorithm": "wrr blackwell",
|
|
626
|
+
"weightsource": "meta.vrammb",
|
|
627
|
+
"blackwellpriority": {
|
|
628
|
+
"enabled": true,
|
|
629
|
+
"skus": [
|
|
630
|
+
"gb200",
|
|
631
|
+
"b200sxm",
|
|
632
|
+
"b100"
|
|
633
|
+
],
|
|
634
|
+
"vramweightmultiplier": 2.0,
|
|
635
|
+
"powerlimit": "1000W"
|
|
636
|
+
},
|
|
637
|
+
"observer": "favors GB200 192GB, B200 192GB over tiny 1GB",
|
|
638
|
+
"examples": {
|
|
639
|
+
"b200sxm192gb": 250,
|
|
640
|
+
"gb200393gb": 300,
|
|
641
|
+
"tiny1gb": 10
|
|
642
|
+
}
|
|
643
|
+
},
|
|
644
|
+
"poweroftwochoices": {
|
|
645
|
+
"type": "pof2",
|
|
646
|
+
"alias": "poweroftwochoices",
|
|
647
|
+
"description": "Best for /hls/ edge cache, two random picks least loaded",
|
|
648
|
+
"choices": 2,
|
|
649
|
+
"loadmetric": "inflight + latency",
|
|
650
|
+
"cacheaware": true,
|
|
651
|
+
"observer": "samples two endpoints from mttgworkers, picks less loaded, edge cache friendly"
|
|
652
|
+
},
|
|
653
|
+
"leastresponsetime": {
|
|
654
|
+
"type": "leastresponsetime",
|
|
655
|
+
"description": "Best for hyperscale memory bound, picks fastest to respond",
|
|
656
|
+
"emaalpha": 0.2,
|
|
657
|
+
"slowstart": "60s"
|
|
658
|
+
}
|
|
659
|
+
},
|
|
660
|
+
"health": {
|
|
661
|
+
"passive": true,
|
|
662
|
+
"active": true,
|
|
663
|
+
"ejectionpercent": 50,
|
|
664
|
+
"failurethreshold": 5,
|
|
665
|
+
"successrate": 0.95
|
|
666
|
+
}
|
|
667
|
+
},
|
|
668
|
+
"middleware": {
|
|
669
|
+
"cors": {
|
|
670
|
+
"enabled": true,
|
|
671
|
+
"allowedorigins": [
|
|
672
|
+
"https://saddle.local",
|
|
673
|
+
"https://*.saddle.dev",
|
|
674
|
+
"https://saddle-v6.internal"
|
|
675
|
+
],
|
|
676
|
+
"allowedmethods": [
|
|
677
|
+
"GET",
|
|
678
|
+
"POST",
|
|
679
|
+
"PUT",
|
|
680
|
+
"DELETE",
|
|
681
|
+
"OPTIONS",
|
|
682
|
+
"PATCH",
|
|
683
|
+
"HEAD"
|
|
684
|
+
],
|
|
685
|
+
"allowedheaders": [
|
|
686
|
+
"*"
|
|
687
|
+
],
|
|
688
|
+
"maxage": "86400s"
|
|
689
|
+
},
|
|
690
|
+
"rateglobal": {
|
|
691
|
+
"enabled": true,
|
|
692
|
+
"rps": 20000,
|
|
693
|
+
"burst": 30000,
|
|
694
|
+
"key": "ip",
|
|
695
|
+
"redisurl": "redis://127.0.0.1:6379/0",
|
|
696
|
+
"engine": "redis 7.4"
|
|
697
|
+
},
|
|
698
|
+
"auth": {
|
|
699
|
+
"type": "jwt",
|
|
700
|
+
"issuer": "https://auth.saddle.local",
|
|
701
|
+
"jwksurl": "https://auth.saddle.local/.well-known/jwks.json",
|
|
702
|
+
"requiredfor": [
|
|
703
|
+
"/api/v5/transcode",
|
|
704
|
+
"/gpu/",
|
|
705
|
+
"/api/v6/hyperscale/"
|
|
706
|
+
],
|
|
707
|
+
"leeway": "60s"
|
|
708
|
+
},
|
|
709
|
+
"compression": {
|
|
710
|
+
"enabled": true,
|
|
711
|
+
"types": [
|
|
712
|
+
"text/*",
|
|
713
|
+
"application/json",
|
|
714
|
+
"application/javascript",
|
|
715
|
+
"application/vnd.apple.mpegurl"
|
|
716
|
+
],
|
|
717
|
+
"minsize": "1KiB",
|
|
718
|
+
"level": 4
|
|
719
|
+
},
|
|
720
|
+
"requestlog": {
|
|
721
|
+
"fields": [
|
|
722
|
+
"vcpu",
|
|
723
|
+
"rammb",
|
|
724
|
+
"vrammb",
|
|
725
|
+
"gpusku",
|
|
726
|
+
"routeid",
|
|
727
|
+
"upstreamid",
|
|
728
|
+
"statuscode",
|
|
729
|
+
"latency"
|
|
730
|
+
],
|
|
731
|
+
"format": "json",
|
|
732
|
+
"sample": 1.0
|
|
733
|
+
}
|
|
734
|
+
},
|
|
735
|
+
"tls": {
|
|
736
|
+
"cert": "/etc/saddle/certs/v6/tls.crt",
|
|
737
|
+
"key": "/etc/saddle/certs/v6/tls.key",
|
|
738
|
+
"ca": "/etc/saddle/certs/v6/ca.crt",
|
|
739
|
+
"autoreload": true,
|
|
740
|
+
"ocspstapling": true,
|
|
741
|
+
"minversion": "TLS1.3",
|
|
742
|
+
"maxversion": "TLS1.3",
|
|
743
|
+
"only": true,
|
|
744
|
+
"protocols": [
|
|
745
|
+
"TLS1.3"
|
|
746
|
+
],
|
|
747
|
+
"h2": true,
|
|
748
|
+
"h3": true,
|
|
749
|
+
"quic": {
|
|
750
|
+
"enabled": true,
|
|
751
|
+
"port": 8443,
|
|
752
|
+
"idle": "30s"
|
|
753
|
+
},
|
|
754
|
+
"ciphers": {
|
|
755
|
+
"enforced": "TLS1.3_only"
|
|
756
|
+
}
|
|
757
|
+
},
|
|
758
|
+
"observability": {
|
|
759
|
+
"prometheus": true,
|
|
760
|
+
"prometheusport": 9090,
|
|
761
|
+
"otelendpoint": "http://127.0.0.1:4317",
|
|
762
|
+
"tracingsamplerate": 0.1,
|
|
763
|
+
"metricslabels": [
|
|
764
|
+
"routeid",
|
|
765
|
+
"upstreamid",
|
|
766
|
+
"vcpu",
|
|
767
|
+
"rammb",
|
|
768
|
+
"gpusku",
|
|
769
|
+
"statuscode",
|
|
770
|
+
"lbpolicy"
|
|
771
|
+
],
|
|
772
|
+
"dashboard": {
|
|
773
|
+
"touchtarget": "44px",
|
|
774
|
+
"enabled": true,
|
|
775
|
+
"endpoint": "/_passage/dashboard"
|
|
776
|
+
},
|
|
777
|
+
"logging": {
|
|
778
|
+
"level": "info",
|
|
779
|
+
"json": true
|
|
780
|
+
}
|
|
781
|
+
},
|
|
782
|
+
"pipeline": {
|
|
783
|
+
"memorypassage": "pipelinememorypassage.ts",
|
|
784
|
+
"coreorchestrator": "coreorchestrator.ts",
|
|
785
|
+
"qemubridge": "qemubridge.py",
|
|
786
|
+
"virtualizationcore": "virtualizationcore.hpp",
|
|
787
|
+
"internalmemory": true,
|
|
788
|
+
"modes": 30,
|
|
789
|
+
"contextsperfile": "20-25",
|
|
790
|
+
"maxperfile": 20,
|
|
791
|
+
"threeLayer": "direct",
|
|
792
|
+
"libraryFirst": "typescript"
|
|
793
|
+
},
|
|
794
|
+
"sidecar": {
|
|
795
|
+
"docker": "29.7.2",
|
|
796
|
+
"qemu": "11.1.0",
|
|
797
|
+
"dockerconfig": "docker.config",
|
|
798
|
+
"qemuconfig": "qemu.config",
|
|
799
|
+
"compose": "dockercompose.yml",
|
|
800
|
+
"dockerfile": "dockerfile",
|
|
801
|
+
"python": "3.14.7",
|
|
802
|
+
"node": "24.19.0"
|
|
803
|
+
},
|
|
804
|
+
"xexamples": {
|
|
805
|
+
"extremevcpu": {
|
|
806
|
+
"description": "Unlimited modular vCPU 1..4096 any integer prime allowed",
|
|
807
|
+
"values": [
|
|
808
|
+
1,
|
|
809
|
+
4,
|
|
810
|
+
13,
|
|
811
|
+
32,
|
|
812
|
+
37,
|
|
813
|
+
64,
|
|
814
|
+
137,
|
|
815
|
+
192,
|
|
816
|
+
256,
|
|
817
|
+
512,
|
|
818
|
+
1024
|
|
819
|
+
],
|
|
820
|
+
"prime": 7919,
|
|
821
|
+
"hyperscale": 1024
|
|
822
|
+
},
|
|
823
|
+
"extremeram": {
|
|
824
|
+
"description": "Extensible RAM MiB 1MiB granularity 2TB 3TB 4TB",
|
|
825
|
+
"valuesmb": [
|
|
826
|
+
512,
|
|
827
|
+
1337,
|
|
828
|
+
4096,
|
|
829
|
+
7919,
|
|
830
|
+
16834,
|
|
831
|
+
65536,
|
|
832
|
+
131072,
|
|
833
|
+
262144,
|
|
834
|
+
524288,
|
|
835
|
+
1048576,
|
|
836
|
+
2097152,
|
|
837
|
+
3145728,
|
|
838
|
+
4194304
|
|
839
|
+
],
|
|
840
|
+
"maxtb": 4,
|
|
841
|
+
"mintb": 2,
|
|
842
|
+
"hyperscale": [
|
|
843
|
+
2097152,
|
|
844
|
+
3145728,
|
|
845
|
+
4194304
|
|
846
|
+
]
|
|
847
|
+
},
|
|
848
|
+
"extremevram": {
|
|
849
|
+
"description": "Extensible VRAM slices Blackwell vGPU MIG",
|
|
850
|
+
"valuesmb": [
|
|
851
|
+
1024,
|
|
852
|
+
4096,
|
|
853
|
+
7183,
|
|
854
|
+
16384,
|
|
855
|
+
23552,
|
|
856
|
+
32768,
|
|
857
|
+
49152,
|
|
858
|
+
98304,
|
|
859
|
+
196608,
|
|
860
|
+
393216,
|
|
861
|
+
786432
|
|
862
|
+
],
|
|
863
|
+
"blackwell": {
|
|
864
|
+
"b100": 98304,
|
|
865
|
+
"b200": 196608,
|
|
866
|
+
"gb200": 393216
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
},
|
|
871
|
+
"passthroughModes": {
|
|
872
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
873
|
+
"modeOverview": [
|
|
874
|
+
{
|
|
875
|
+
"id": "vfio",
|
|
876
|
+
"type": "full passthrough",
|
|
877
|
+
"granularity": "whole PCI function",
|
|
878
|
+
"requiresKvm": true,
|
|
879
|
+
"lossOfSnapshot": true
|
|
880
|
+
},
|
|
881
|
+
{
|
|
882
|
+
"id": "mdev",
|
|
883
|
+
"type": "mediated passthrough",
|
|
884
|
+
"granularity": "vendor-defined slice",
|
|
885
|
+
"requiresKvm": true,
|
|
886
|
+
"lossOfSnapshot": true
|
|
887
|
+
},
|
|
888
|
+
{
|
|
889
|
+
"id": "mig",
|
|
890
|
+
"type": "GPU hardware slicing",
|
|
891
|
+
"granularity": "memory+SM partition (1g.24gb/2g.48gb/4g.96gb)",
|
|
892
|
+
"requiresKvm": true,
|
|
893
|
+
"lossOfSnapshot": false
|
|
894
|
+
},
|
|
895
|
+
{
|
|
896
|
+
"id": "vgpu",
|
|
897
|
+
"type": "licensed mediated GPU",
|
|
898
|
+
"granularity": "vGPU profile (1B/2B/4Q...)",
|
|
899
|
+
"requiresKvm": true,
|
|
900
|
+
"lossOfSnapshot": true
|
|
901
|
+
},
|
|
902
|
+
{
|
|
903
|
+
"id": "sriov",
|
|
904
|
+
"type": "PCIe virtual functions",
|
|
905
|
+
"granularity": "VF of NIC/GPU",
|
|
906
|
+
"requiresKvm": true,
|
|
907
|
+
"lossOfSnapshot": true
|
|
908
|
+
},
|
|
909
|
+
{
|
|
910
|
+
"id": "vfio-user",
|
|
911
|
+
"type": "userspace device emulation",
|
|
912
|
+
"granularity": "any device emulated by a userspace server",
|
|
913
|
+
"requiresKvm": false,
|
|
914
|
+
"lossOfSnapshot": false
|
|
915
|
+
},
|
|
916
|
+
{
|
|
917
|
+
"id": "hotplug",
|
|
918
|
+
"type": "runtime attach/detach",
|
|
919
|
+
"granularity": "cpu (vCPU), memory (pc-dimm), pci (root-port)",
|
|
920
|
+
"requiresKvm": false,
|
|
921
|
+
"lossOfSnapshot": false
|
|
922
|
+
},
|
|
923
|
+
{
|
|
924
|
+
"id": "none",
|
|
925
|
+
"type": "fully virtual devices",
|
|
926
|
+
"granularity": "virtio only",
|
|
927
|
+
"requiresKvm": false,
|
|
928
|
+
"lossOfSnapshot": false
|
|
929
|
+
}
|
|
930
|
+
],
|
|
931
|
+
"vfio": {
|
|
932
|
+
"driver": "vfio-pci",
|
|
933
|
+
"kernelModules": [
|
|
934
|
+
"vfio",
|
|
935
|
+
"vfio_iommu_type1",
|
|
936
|
+
"vfio_pci",
|
|
937
|
+
"vfio_virqfd"
|
|
938
|
+
],
|
|
939
|
+
"iommuKernelCmdline": {
|
|
940
|
+
"intel": "intel_iommu=on iommu=pt",
|
|
941
|
+
"amd": "amd_iommu=on iommu=pt"
|
|
942
|
+
},
|
|
943
|
+
"modprobeConf": "options vfio-pci ids=10de:2b85,10de:26b5,1002:748e",
|
|
944
|
+
"bindProcedure": [
|
|
945
|
+
"1. lspci -nnk to locate the BDF and current driver",
|
|
946
|
+
"2. echo 10de 2b85 > /sys/bus/pci/drivers/vfio-pci/new_id (or unbind from native driver + bind to vfio-pci)",
|
|
947
|
+
"3. verify /dev/vfio/<group> exists for the device group",
|
|
948
|
+
"4. ls /sys/kernel/iommu_groups/ and cat /sys/bus/pci/devices/<bdf>/iommu_group/devices to check isolation"
|
|
949
|
+
],
|
|
950
|
+
"iommuGroups": {
|
|
951
|
+
"list": "ls /sys/kernel/iommu_groups/",
|
|
952
|
+
"membership": "ls /sys/kernel/iommu_groups/<n>/devices/",
|
|
953
|
+
"requirement": "the passed device must sit in a group with no other active host devices (ACS) or the whole group must be passed"
|
|
954
|
+
},
|
|
955
|
+
"iommufd": {
|
|
956
|
+
"device": "/dev/iommu",
|
|
957
|
+
"note": "modern replacement for /dev/vfio/vfio container API; QEMU -object iommu-backend=type=iommufd; Kata 4.1 uses IOMMUFD for NVSwitch passthrough"
|
|
958
|
+
},
|
|
959
|
+
"qemuUsage": "-device vfio-pci,host=0000:01:00.0 (q35: place behind a pcie-root-port for reset support)",
|
|
960
|
+
"limits": [
|
|
961
|
+
"VM loses live snapshot/migration compatibility while a VFIO device is attached",
|
|
962
|
+
"GPU reset requires the device to support FLR or a reboot of the host",
|
|
963
|
+
"NVIDIA consumer drivers historically refused passthrough (Code 43) - modern R570+ drivers allow it"
|
|
964
|
+
]
|
|
965
|
+
},
|
|
966
|
+
"mdev": {
|
|
967
|
+
"description": "Mediated devices: a physical device driver creates virtual devices exposed as vfio-mdev sysfs entries that can be assigned to VMs.",
|
|
968
|
+
"create": "echo <uuid> | sudo tee /sys/bus/pci/devices/<bdf>/mdev_supported_types/<type>/create",
|
|
969
|
+
"listTypes": "ls /sys/bus/pci/devices/<bdf>/mdev_supported_types/",
|
|
970
|
+
"qemuUsage": "-device vfio-pci,sysfsdev=/sys/bus/mdev/devices/<uuid>",
|
|
971
|
+
"exampleTypes": [
|
|
972
|
+
"nvidia-155 (vGPU profile id format)",
|
|
973
|
+
"vfio_ap-passthrough (s390)",
|
|
974
|
+
"vfio_ccw-passthrough (s390)"
|
|
975
|
+
],
|
|
976
|
+
"statusNote": "Intel GVT-g (i915 mdev) was removed from upstream kernels; on x86 the practical mdev users in 2026 are NVIDIA vGPU (licensed) and academic/vfio_ap stacks.",
|
|
977
|
+
"requiresKvm": true
|
|
978
|
+
},
|
|
979
|
+
"mig": {
|
|
980
|
+
"description": "NVIDIA Multi-Instance GPU: hardware partitioning of Blackwell/Hopper/Ampere datacenter GPUs into isolated GPU instances. Full command set in gpu.json mig section.",
|
|
981
|
+
"profilesRtxPro6000Server": [
|
|
982
|
+
{
|
|
983
|
+
"profile": "1g.24gb",
|
|
984
|
+
"instances": 4,
|
|
985
|
+
"vramGb": 24
|
|
986
|
+
},
|
|
987
|
+
{
|
|
988
|
+
"profile": "2g.48gb",
|
|
989
|
+
"instances": 2,
|
|
990
|
+
"vramGb": 48
|
|
991
|
+
},
|
|
992
|
+
{
|
|
993
|
+
"profile": "4g.96gb",
|
|
994
|
+
"instances": 1,
|
|
995
|
+
"vramGb": 96
|
|
996
|
+
}
|
|
997
|
+
],
|
|
998
|
+
"guestAssignment": {
|
|
999
|
+
"cudaVisibleDevices": "MIG-<uuid>",
|
|
1000
|
+
"container": "NVIDIA_VISIBLE_DEVICES=MIG-<uuid>",
|
|
1001
|
+
"note": "MIG instances are addressed through the parent GPU driver; they are not PCI devices and cannot be passed with vfio-pci individually"
|
|
1002
|
+
},
|
|
1003
|
+
"engineUse": "inference-mig VM profile: multi-tenant 24/48/96 GB vRAM slices without passthrough",
|
|
1004
|
+
"requiresKvm": "parent GPU must be owned by a real host driver (bare-metal or nested); MIG cannot be created on a virtualized GPU"
|
|
1005
|
+
},
|
|
1006
|
+
"vgpu": {
|
|
1007
|
+
"description": "NVIDIA vGPU (GRID): licensed mediated GPU passthrough; host installs the GRID driver and creates mdev instances typed nvidia-<profile>.",
|
|
1008
|
+
"profileNaming": "<frame-buffer-size>-<license>: e.g. A100-2-20B (A100 20GB vGPU, vCS/PC/B license) or L40-4Q (RTX 6000 Ada 4GB Q profile for Quadro features)",
|
|
1009
|
+
"licensing": "NVIDIA vGPU License Server (CLS/DLS); guest checks out a license at boot",
|
|
1010
|
+
"guestDriver": "GRID guest driver matching host branch (R580 line in 2026)",
|
|
1011
|
+
"unlicensedGrace": "vGPU evaluation mode runs with reduced features for a trial period",
|
|
1012
|
+
"alternatives": [
|
|
1013
|
+
"Intel GPU SR-IOV (Flex 170, Arc Pro, Xe): native VF partitioning via SR-IOV",
|
|
1014
|
+
"AMD SR-IOV on Instinct MI300 (experimental)"
|
|
1015
|
+
]
|
|
1016
|
+
},
|
|
1017
|
+
"sriov": {
|
|
1018
|
+
"description": "SR-IOV: a PCIe device exposes Virtual Functions bound to vfio-pci and assigned to VMs with near-native performance.",
|
|
1019
|
+
"createVfs": "echo 8 | sudo tee /sys/class/net/enp1s0f0/device/sriov_numvfs",
|
|
1020
|
+
"bindVf": "driverctl unset-override / native driver, or echo <bdf> > /sys/bus/pci/drivers/vfio-pci/bind",
|
|
1021
|
+
"typicalNics": [
|
|
1022
|
+
"Intel E810 (100GbE)",
|
|
1023
|
+
"Intel X710 (40GbE)",
|
|
1024
|
+
"NVIDIA ConnectX-6 Dx / ConnectX-7",
|
|
1025
|
+
"Broadcom NetXtreme-E"
|
|
1026
|
+
],
|
|
1027
|
+
"qemuUsage": "-device vfio-pci,host=0000:01:00.3 -device vfio-pci,host=0000:01:00.4 ...",
|
|
1028
|
+
"fallback": "virtio-net with iothread + multiqueue gives portable performance without host dependencies (default in vm.config.json)",
|
|
1029
|
+
"sriovGpus": [
|
|
1030
|
+
"Intel Data Center GPU Flex 170 (2 VFs)",
|
|
1031
|
+
"Intel Arc Pro A60? (2 VFs)",
|
|
1032
|
+
"AMD Instinct MI300X SR-IOV (roadmap)"
|
|
1033
|
+
]
|
|
1034
|
+
},
|
|
1035
|
+
"vfioUser": {
|
|
1036
|
+
"protocol": "vfio-user: VFIO-over-UNIX-socket user-space device emulation (QEMU docs/vfio-user.rst; NVMe world's userspace device servers)",
|
|
1037
|
+
"cloudHypervisor": {
|
|
1038
|
+
"version": "v53.0 (2026-07-12)",
|
|
1039
|
+
"status": "experimental",
|
|
1040
|
+
"cli": "--user-device socket=<path>",
|
|
1041
|
+
"hotplug": "ch-remote add-user-device socket=<path>",
|
|
1042
|
+
"note": "offloaded snapshot/restore daemon with userfaultfd + vhost-user landed in the same v53 release"
|
|
1043
|
+
},
|
|
1044
|
+
"qemuSupport": "-device vfio-user-pci,socket=<path> (QEMU 7.1+; parity with Cloud Hypervisor for shared servers)",
|
|
1045
|
+
"advantages": [
|
|
1046
|
+
"device emulation runs in a separate userspace process (crash isolation, live upgrade)",
|
|
1047
|
+
"no kernel driver and no IOMMU requirement on the host - works without /dev/kvm",
|
|
1048
|
+
"compatible with snapshottable, migratable VMs (unlike real VFIO)"
|
|
1049
|
+
],
|
|
1050
|
+
"engineUse": "emulated NVMe/GPU backends for the engine without host hardware"
|
|
1051
|
+
},
|
|
1052
|
+
"hotplug": {
|
|
1053
|
+
"cpu": {
|
|
1054
|
+
"qmp": [
|
|
1055
|
+
"query-hotpluggable-cpus",
|
|
1056
|
+
"device_add driver=epyc-v5-x86_64-cpu,id=cpu-N,socket-id=0,core-id=48,thread-id=0"
|
|
1057
|
+
],
|
|
1058
|
+
"precondition": "-smp <N>,maxcpus=<M> at boot (cores.json qemu_topology_generation)",
|
|
1059
|
+
"guest": "Linux udev + acpi hotplug handler (virtio and ACPI CPU hotplug for x86)"
|
|
1060
|
+
},
|
|
1061
|
+
"memory": {
|
|
1062
|
+
"precondition": "-m 8G,slots=4,maxmem=64G",
|
|
1063
|
+
"qmp": [
|
|
1064
|
+
"object-add qom-type=memory-backend-ram,id=mem1,props={'size':17179869184}",
|
|
1065
|
+
"device_add driver=pc-dimm,id=dimm1,memdev=mem1"
|
|
1066
|
+
],
|
|
1067
|
+
"guest": "online_memory_block via sysfs; NUMA node attach with -numa node,memdev=..."
|
|
1068
|
+
},
|
|
1069
|
+
"pci": {
|
|
1070
|
+
"q35": "device_add pcie-root-port,id=rp1,bus=pcie.0 then device_add <dev>,bus=rp1",
|
|
1071
|
+
"microvm": "no PCI hotplug (virtio-mmio fixed); use ch-remote with Cloud Hypervisor instead",
|
|
1072
|
+
"devices": [
|
|
1073
|
+
"virtio-blk (data volumes)",
|
|
1074
|
+
"virtio-net",
|
|
1075
|
+
"vfio-pci passthrough",
|
|
1076
|
+
"usb-host"
|
|
1077
|
+
]
|
|
1078
|
+
},
|
|
1079
|
+
"firecracker": "PCI virtio hotplug in developer preview since v1.16.0 (network/block attach/detach)",
|
|
1080
|
+
"limits": "CPU and memory unplug remain less reliable than plug; orchestrate scale-out instead"
|
|
1081
|
+
},
|
|
1082
|
+
"kvm": {
|
|
1083
|
+
"requirement": "CPU with VT-x/AMD-SVM + kvm(|-intel|-amd) kernel module + accessible /dev/kvm",
|
|
1084
|
+
"checkCommands": [
|
|
1085
|
+
"test -e /dev/kvm && echo kvm-present",
|
|
1086
|
+
"kvm-ok (Ubuntu cpu-checker)",
|
|
1087
|
+
"lscpu | grep Virtualization"
|
|
1088
|
+
],
|
|
1089
|
+
"githubHostedRunners": {
|
|
1090
|
+
"available": false,
|
|
1091
|
+
"reason": "hosted runners are Azure VMs without nested virtualization exposed; /dev/kvm absent",
|
|
1092
|
+
"evidence": [
|
|
1093
|
+
"actions/runner-images#12933",
|
|
1094
|
+
"actions/runner-images#14062",
|
|
1095
|
+
"actuated.com/blog/kvm-in-github-actions",
|
|
1096
|
+
"e2b-dev/infra self-host.md: Firecracker requires bare metal or nested virtualization support"
|
|
1097
|
+
]
|
|
1098
|
+
},
|
|
1099
|
+
"fallback": {
|
|
1100
|
+
"accel": "tcg,thread=multi (MTTCG, see mttcg.json)",
|
|
1101
|
+
"penalty": "10-30x slower than KVM for compute workloads; deterministic and dependency-free",
|
|
1102
|
+
"firecracker": "cannot run (hard KVM requirement)",
|
|
1103
|
+
"kataContainers": "cannot run its microVM hypervisors (QEMU/KVM, Cloud Hypervisor, Firecracker) on hosted runners; use Docker + gVisor runsc (works without KVM) instead",
|
|
1104
|
+
"knownPitfall": "QEMU auto-fallback KVM->TCG broke historically (community discussion #151747); always pass -accel tcg,thread=multi explicitly in CI"
|
|
1105
|
+
},
|
|
1106
|
+
"selfHosted": {
|
|
1107
|
+
"bareMetal": "full matrix available: KVM + VFIO + MIG + Firecracker snapshots (restore as low as 4 ms)",
|
|
1108
|
+
"nested": "KVM and Firecracker work; VFIO/MIG of real hardware still needs bare metal",
|
|
1109
|
+
"providers": [
|
|
1110
|
+
"WarpBuild bare-metal runners",
|
|
1111
|
+
"actuated (KernelCI-class bare metal)",
|
|
1112
|
+
"self-hosted GitHub runners"
|
|
1113
|
+
]
|
|
1114
|
+
}
|
|
1115
|
+
},
|
|
1116
|
+
"noneMode": {
|
|
1117
|
+
"id": "none",
|
|
1118
|
+
"aliases": [
|
|
1119
|
+
"nodriver",
|
|
1120
|
+
"virtio-only"
|
|
1121
|
+
],
|
|
1122
|
+
"description": "Fully virtual devices only - the default for ephemeral CI sandboxes: no host hardware dependency, no passthrough drivers, snapshot-safe, migratable.",
|
|
1123
|
+
"qemuFlags": "-nodefaults -vga none (no display driver), every device explicitly virtio",
|
|
1124
|
+
"devices": [
|
|
1125
|
+
"virtio-blk",
|
|
1126
|
+
"virtio-scsi",
|
|
1127
|
+
"virtio-net",
|
|
1128
|
+
"virtio-rng",
|
|
1129
|
+
"virtio-input/usb-tablet",
|
|
1130
|
+
"virtio-gpu",
|
|
1131
|
+
"virtio-fs (host share via vhost-user-fs)"
|
|
1132
|
+
],
|
|
1133
|
+
"rationale": [
|
|
1134
|
+
"snapshot/migration compatibility (passage.json mode_overview loss_of_snapshot=false)",
|
|
1135
|
+
"no IOMMU requirement; runs on any host including GitHub-hosted runners",
|
|
1136
|
+
"GPU identity delivered by software stack: Mesa llvmpipe/lavapipe + smi-adapter/NVML shim (gpu.json, mesa.json)"
|
|
1137
|
+
]
|
|
1138
|
+
},
|
|
1139
|
+
"decisionMatrix": [
|
|
1140
|
+
{
|
|
1141
|
+
"situation": "Ephemeral CI sandbox on GitHub-hosted runner",
|
|
1142
|
+
"mode": "none",
|
|
1143
|
+
"accel": "tcg,thread=multi",
|
|
1144
|
+
"gpu": "llvmpipe/lavapipe + smi-adapter"
|
|
1145
|
+
},
|
|
1146
|
+
{
|
|
1147
|
+
"situation": "Self-hosted runner, needs real GPU for training",
|
|
1148
|
+
"mode": "vfio",
|
|
1149
|
+
"accel": "kvm",
|
|
1150
|
+
"gpu": "vfio-pci host=GPU BDF"
|
|
1151
|
+
},
|
|
1152
|
+
{
|
|
1153
|
+
"situation": "One physical GPU, many tenants",
|
|
1154
|
+
"mode": "mig",
|
|
1155
|
+
"accel": "kvm (parent in host)",
|
|
1156
|
+
"gpu": "MIG 1g.24gb x4 on RTX PRO 6000 Server"
|
|
1157
|
+
},
|
|
1158
|
+
{
|
|
1159
|
+
"situation": "Licensed VDI graphics",
|
|
1160
|
+
"mode": "vgpu",
|
|
1161
|
+
"accel": "kvm",
|
|
1162
|
+
"gpu": "GRID vGPU profile"
|
|
1163
|
+
},
|
|
1164
|
+
{
|
|
1165
|
+
"situation": "Near-native networking",
|
|
1166
|
+
"mode": "sriov",
|
|
1167
|
+
"accel": "kvm",
|
|
1168
|
+
"nic": "ConnectX-6 Dx VF"
|
|
1169
|
+
},
|
|
1170
|
+
{
|
|
1171
|
+
"situation": "Userspace device server, no kernel deps",
|
|
1172
|
+
"mode": "vfio-user",
|
|
1173
|
+
"accel": "any",
|
|
1174
|
+
"device": "--user-device socket (Cloud Hypervisor v53, experimental)"
|
|
1175
|
+
},
|
|
1176
|
+
{
|
|
1177
|
+
"situation": "Scale a running VM without restart",
|
|
1178
|
+
"mode": "hotplug",
|
|
1179
|
+
"accel": "any",
|
|
1180
|
+
"targets": [
|
|
1181
|
+
"vCPU",
|
|
1182
|
+
"pc-dimm memory",
|
|
1183
|
+
"virtio disks"
|
|
1184
|
+
]
|
|
1185
|
+
}
|
|
1186
|
+
]
|
|
1187
|
+
},
|
|
1188
|
+
"networkBinding": {
|
|
1189
|
+
"description": "randomized host port never localhost, 0.0.0.0 bind, crypto.randomInt 20000-60000, TOCTOU immunity",
|
|
1190
|
+
"bindAddress": "0.0.0.0",
|
|
1191
|
+
"hostResolution": "127.0.0.1 or container gateway, never literal 'localhost' string",
|
|
1192
|
+
"port": {
|
|
1193
|
+
"strategy": "crypto.randomInt(20000,60000)",
|
|
1194
|
+
"module": "node:crypto",
|
|
1195
|
+
"function": "randomInt",
|
|
1196
|
+
"range": [
|
|
1197
|
+
20000,
|
|
1198
|
+
60000
|
|
1199
|
+
],
|
|
1200
|
+
"retries": 10,
|
|
1201
|
+
"collisionCheck": "atomic bind with SO_REUSEPORT disabled then immediate validation"
|
|
1202
|
+
},
|
|
1203
|
+
"toctou": {
|
|
1204
|
+
"immunity": true,
|
|
1205
|
+
"technique": "bind-first-then-announce, no check-then-bind",
|
|
1206
|
+
"raceWindowMs": 0,
|
|
1207
|
+
"validation": "EADDRINUSE retry loop with exponential backoff"
|
|
1208
|
+
},
|
|
1209
|
+
"security": {
|
|
1210
|
+
"landlock": true,
|
|
1211
|
+
"seccomp": true,
|
|
1212
|
+
"allowLoopbackOnly": false
|
|
1213
|
+
},
|
|
1214
|
+
"vmNetworkModesRef": "vm.config.json#productionExample.vm.network.passage (direct/bridge/nat/overlayVxlan/zeroTrust/latencyOptimization + dpdk 26.07.0, ovs 3.7.1, wireguard, ebpf libbpf 1.6.0, xdp, io_uring_zcrx)"
|
|
1215
|
+
},
|
|
1216
|
+
"vfioIds": {
|
|
1217
|
+
"description": "vendor:device ids for the 11 profile GPUs (source: gpu.profiles.json via gpus.json#gpu_profiles_vfio; used by vfio-pci.ids kernel arg)",
|
|
1218
|
+
"gpus": {
|
|
1219
|
+
"mi355x": [
|
|
1220
|
+
"1002:75a0"
|
|
1221
|
+
],
|
|
1222
|
+
"mi350x": [
|
|
1223
|
+
"1002:75a3"
|
|
1224
|
+
],
|
|
1225
|
+
"b200": [
|
|
1226
|
+
"10de:2941"
|
|
1227
|
+
],
|
|
1228
|
+
"h200": [
|
|
1229
|
+
"10de:2335"
|
|
1230
|
+
],
|
|
1231
|
+
"rtx5090": [
|
|
1232
|
+
"10de:2b85",
|
|
1233
|
+
"10de:22e8"
|
|
1234
|
+
],
|
|
1235
|
+
"rtx5080": [
|
|
1236
|
+
"10de:2b80"
|
|
1237
|
+
],
|
|
1238
|
+
"rtxPro6000": [
|
|
1239
|
+
"10de:26b5"
|
|
1240
|
+
],
|
|
1241
|
+
"rx9070xt": [
|
|
1242
|
+
"1002:7550",
|
|
1243
|
+
"1002:ab40"
|
|
1244
|
+
],
|
|
1245
|
+
"rx7900xtx": [
|
|
1246
|
+
"1002:744c",
|
|
1247
|
+
"1002:ab30"
|
|
1248
|
+
],
|
|
1249
|
+
"arcB580": [
|
|
1250
|
+
"8086:e20b"
|
|
1251
|
+
]
|
|
1252
|
+
}
|
|
1253
|
+
},
|
|
1254
|
+
"hostPlaybook": {
|
|
1255
|
+
"source": "pool:passage.yaml [AetherForge ansible-as-checklist]",
|
|
1256
|
+
"apiVersion": "aetherforge.dev/v5",
|
|
1257
|
+
"kind": "Passage",
|
|
1258
|
+
"metadata": {
|
|
1259
|
+
"name": "default-vfio"
|
|
1260
|
+
},
|
|
1261
|
+
"spec": {
|
|
1262
|
+
"host": {
|
|
1263
|
+
"iommu": "auto",
|
|
1264
|
+
"kernelArgs": [
|
|
1265
|
+
"intel_iommu=on",
|
|
1266
|
+
"iommu=pt",
|
|
1267
|
+
"amd_iommu=on",
|
|
1268
|
+
"pcie_acs_override=downstream,multifunction",
|
|
1269
|
+
"vfio-pci.ids=${GPU_VENDOR}:${GPU_DEVICE},${AUDIO_VENDOR}:${AUDIO_DEVICE}"
|
|
1270
|
+
],
|
|
1271
|
+
"modules": {
|
|
1272
|
+
"load": [
|
|
1273
|
+
"vfio",
|
|
1274
|
+
"vfio_iommu_type1",
|
|
1275
|
+
"vfio_pci",
|
|
1276
|
+
"vendor-reset"
|
|
1277
|
+
],
|
|
1278
|
+
"blacklist": [
|
|
1279
|
+
"nouveau",
|
|
1280
|
+
"nvidia",
|
|
1281
|
+
"nvidiafb",
|
|
1282
|
+
"rivafb",
|
|
1283
|
+
"nvidia-drm",
|
|
1284
|
+
"nvidia-modeset",
|
|
1285
|
+
"amdgpu",
|
|
1286
|
+
"i915"
|
|
1287
|
+
]
|
|
1288
|
+
}
|
|
1289
|
+
},
|
|
1290
|
+
"bind": {
|
|
1291
|
+
"method": "vfio-pci",
|
|
1292
|
+
"devices": [
|
|
1293
|
+
{
|
|
1294
|
+
"name": "gpu",
|
|
1295
|
+
"example": "01:00.0"
|
|
1296
|
+
},
|
|
1297
|
+
{
|
|
1298
|
+
"name": "hdmi-audio",
|
|
1299
|
+
"example": "01:00.1"
|
|
1300
|
+
}
|
|
1301
|
+
],
|
|
1302
|
+
"notes": [
|
|
1303
|
+
"Use vendor:device from gpu.profiles.json vfioIds.",
|
|
1304
|
+
"Confirm IOMMU group isolation with `find /sys/kernel/iommu_groups -type l`.",
|
|
1305
|
+
"ACS override is a last resort; prefer a board with ACS."
|
|
1306
|
+
]
|
|
1307
|
+
},
|
|
1308
|
+
"reset": {
|
|
1309
|
+
"nvidia": "vendor-reset or native on 6.8+",
|
|
1310
|
+
"amd": "vendor-reset for Navi 21; native for RDNA 3/4 on 6.12+",
|
|
1311
|
+
"intel": "native on Battlemage"
|
|
1312
|
+
},
|
|
1313
|
+
"lookingGlass": {
|
|
1314
|
+
"ivshmem": "/dev/shm/looking-glass",
|
|
1315
|
+
"size": "128M",
|
|
1316
|
+
"user": "qemu",
|
|
1317
|
+
"client": "looking-glass-client -s"
|
|
1318
|
+
},
|
|
1319
|
+
"singleGpu": {
|
|
1320
|
+
"description": "Unbind the host console GPU, start the guest, rebind on shutdown via /etc/libvirt/hooks/qemu. Requires a second way in (SSH, IPMI).\n",
|
|
1321
|
+
"hook": "/etc/libvirt/hooks/qemu.d/aetherforge"
|
|
1322
|
+
},
|
|
1323
|
+
"verification": [
|
|
1324
|
+
"dmesg | grep -e DMAR -e AMD-Vi",
|
|
1325
|
+
"ls -l /dev/vfio",
|
|
1326
|
+
"qemu-system-x86_64 -device vfio-pci,help"
|
|
1327
|
+
]
|
|
1328
|
+
}
|
|
1329
|
+
},
|
|
1330
|
+
"exampleNodeCrypto": "const port = crypto.randomInt(20000,60000); server.listen(port,'0.0.0.0')"
|
|
1331
|
+
}
|