@wenathlan/saddle 2.0.6 → 2.0.151

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.
Files changed (284) hide show
  1. package/Dockerfile +70 -24
  2. package/LICENSE +0 -0
  3. package/README.md +19 -3
  4. package/alternatives.ts +0 -0
  5. package/biome.jsonc +127 -0
  6. package/boards.json +2 -2
  7. package/compute.ts +4 -4
  8. package/cores.json +2 -2
  9. package/docker.config +16 -9
  10. package/docs/.gitkeep +0 -0
  11. package/docs/CONVERSA.txt +0 -0
  12. package/docs/actionrecorder.md +0 -0
  13. package/docs/actionsincident.md +0 -0
  14. package/docs/alternatives.md +0 -0
  15. package/docs/architecture-1.8.19.md +0 -0
  16. package/docs/architecture-1.8.19.mmd +0 -0
  17. package/docs/architecture-1.8.19.png +0 -0
  18. package/docs/architecture.md +3 -3
  19. package/docs/artifactavailability.md +0 -0
  20. package/docs/artifactresearch-1.8.9.md +0 -0
  21. package/docs/assets/architecture.svg +0 -0
  22. package/docs/assets/saddle-browser-trace.webp +0 -0
  23. package/docs/assets/saddle-hero-bridge.webp +0 -0
  24. package/docs/assets/saddle-mark.webp +0 -0
  25. package/docs/assets/saddle-runtime-map.webp +0 -0
  26. package/docs/assets/saddlemark.svg +0 -0
  27. package/docs/batches-1816-1820.md +0 -0
  28. package/docs/brancharchive-2026-08-18.md +0 -0
  29. package/docs/branchaudit.md +0 -0
  30. package/docs/browser.md +0 -0
  31. package/docs/capabilityreport.md +0 -0
  32. package/docs/comparativeaudit.md +0 -0
  33. package/docs/consolidation.md +0 -0
  34. package/docs/containerplatforms-1.8.17.md +0 -0
  35. package/docs/containerplatforms-2.1.0.md +73 -0
  36. package/docs/documentmap-1.8.12.md +0 -0
  37. package/docs/e2ugh-engine.md +0 -0
  38. package/docs/ecosystemplan.md +0 -0
  39. package/docs/enginearchitecture.md +0 -0
  40. package/docs/example-localjob.ts +0 -0
  41. package/docs/extension.md +0 -0
  42. package/docs/featureaudit.md +0 -0
  43. package/docs/flatbuildresearch-1.8.11.md +0 -0
  44. package/docs/gapmatrix.md +0 -0
  45. package/docs/hardware.md +0 -0
  46. package/docs/libraryapi.md +0 -0
  47. package/docs/licenseaudit-1.8.12.md +0 -0
  48. package/docs/logs/examplesession.json +54 -0
  49. package/docs/memoryengine.md +0 -0
  50. package/docs/mobileconversionresearch-1.8.10.md +0 -0
  51. package/docs/modes.md +0 -0
  52. package/docs/native-wrappers.md +38 -0
  53. package/docs/nativeidentityresearch-1.8.11.md +0 -0
  54. package/docs/optimization.md +0 -0
  55. package/docs/packageaudit185.md +0 -0
  56. package/docs/performance.md +0 -0
  57. package/docs/planning.1.8.18.md +0 -0
  58. package/docs/planning.1.8.19.md +0 -0
  59. package/docs/planning.engine.md +186 -0
  60. package/docs/platformpipelineaudit.md +0 -0
  61. package/docs/platformpipelines.md +0 -0
  62. package/docs/productindex.md +0 -0
  63. package/docs/registryresearch.md +0 -0
  64. package/docs/release.md +0 -0
  65. package/docs/release17notes.md +0 -0
  66. package/docs/release181notes.md +0 -0
  67. package/docs/release182notes.md +0 -0
  68. package/docs/release184notes.md +0 -0
  69. package/docs/release185notes.md +0 -0
  70. package/docs/release18notes.md +0 -0
  71. package/docs/releaseassets.md +0 -0
  72. package/docs/releasenotes-1.8.12.md +0 -0
  73. package/docs/releasenotes-1.8.13.md +0 -0
  74. package/docs/releasenotes-1.8.14.md +0 -0
  75. package/docs/releasenotes-1.8.15.md +0 -0
  76. package/docs/releasenotes-1.8.16.md +0 -0
  77. package/docs/releasenotes-1.8.17.md +0 -0
  78. package/docs/releasenotes-1.8.18.md +0 -0
  79. package/docs/releasenotes-1.8.19.md +0 -0
  80. package/docs/reorganization-1.8.8.md +0 -0
  81. package/docs/reorganization-1.8.9.md +0 -0
  82. package/docs/repo-analysis-1.8.21.json +0 -0
  83. package/docs/repo-candidates-1.8.21.jsonl +0 -0
  84. package/docs/repo-research-1.8.16.md +0 -0
  85. package/docs/repo-research-1.8.21.md +0 -0
  86. package/docs/repo-selected-1.8.21.json +0 -0
  87. package/docs/repo-synthesis-1.8.16.md +0 -0
  88. package/docs/repo-synthesis-1.8.21.md +0 -0
  89. package/docs/research-1.8.18-isolation.md +0 -0
  90. package/docs/research-1.8.19-virtual-browser.md +0 -0
  91. package/docs/roadmapp2p3.md +0 -0
  92. package/docs/s3compatible.md +0 -0
  93. package/docs/saddle.archive.1.8.17.tar.gz.gpg +0 -0
  94. package/docs/scanningresearch-1.8.11.md +0 -0
  95. package/docs/security.md +0 -0
  96. package/docs/securityaudit-1.8.7.md +0 -0
  97. package/docs/securityreferences-1.8.11.md +0 -0
  98. package/docs/securityresearch-1.8.11.md +0 -0
  99. package/docs/signingresearch-1.8.12.md +0 -0
  100. package/docs/signingwithoutcertificates.md +0 -0
  101. package/docs/signpathapplication.md +0 -0
  102. package/docs/sitemap.md +0 -0
  103. package/docs/tauri-glib-risk-1.8.11.md +0 -0
  104. package/docs/todo-1.8.15.md +0 -0
  105. package/docs/todo-1.8.16.md +0 -0
  106. package/docs/todo-1.8.18.md +0 -0
  107. package/docs/todo-1.8.19.md +0 -0
  108. package/docs/todo.md +0 -0
  109. package/docs/toolchainresearch-1.8.9.md +0 -0
  110. package/docs/toolchains.md +0 -0
  111. package/docs/usage.md +0 -0
  112. package/docs/viability.md +0 -0
  113. package/docs/virtualization.md +0 -0
  114. package/docs/web-duplicatecleanup.md +0 -0
  115. package/docs/web-ideas.md +0 -0
  116. package/docs/workflowimprovements-2026-08-19.md +0 -0
  117. package/docs/workflowinputs.md +0 -0
  118. package/docs/workflowoperations.md +0 -0
  119. package/gpumonitor.cpp +0 -0
  120. package/gpus.json +1 -1
  121. package/index.ts +15 -15
  122. package/manifest.json +20 -0
  123. package/media.ts +0 -0
  124. package/modalityregistry.ts +156 -0
  125. package/mttg.config +1 -1
  126. package/orchestrator.ts +5 -2
  127. package/package.json +147 -97
  128. package/passage.config +2 -2
  129. package/performance.ts +0 -0
  130. package/processors.json +1 -1
  131. package/qemu.config +2 -2
  132. package/qemubridge.py +0 -0
  133. package/quantum.ts +0 -0
  134. package/render.ts +0 -0
  135. package/scheduler.ts +0 -0
  136. package/security.ts +0 -0
  137. package/tiers.ts +9 -3
  138. package/tsconfig.json +22 -17
  139. package/virtualcpu.ts +1 -0
  140. package/virtualgpu.ts +1 -0
  141. package/virtualhardware.c +0 -0
  142. package/virtualhardware.json +2 -2
  143. package/virtualization.ts +0 -0
  144. package/virtualizationcore.cpp +0 -0
  145. package/virtualmemory.ts +0 -0
  146. package/vm.config.json +3 -3
  147. package/biome.json +0 -153
  148. package/dist/acquisition.d.ts +0 -359
  149. package/dist/acquisition.d.ts.map +0 -1
  150. package/dist/acquisition.js +0 -629
  151. package/dist/acquisition.js.map +0 -1
  152. package/dist/alternatives.d.ts +0 -509
  153. package/dist/alternatives.d.ts.map +0 -1
  154. package/dist/alternatives.js +0 -951
  155. package/dist/alternatives.js.map +0 -1
  156. package/dist/automation.d.ts +0 -426
  157. package/dist/automation.d.ts.map +0 -1
  158. package/dist/automation.js +0 -561
  159. package/dist/automation.js.map +0 -1
  160. package/dist/browser.d.ts +0 -562
  161. package/dist/browser.d.ts.map +0 -1
  162. package/dist/browser.js +0 -1057
  163. package/dist/browser.js.map +0 -1
  164. package/dist/capacitor.config.d.ts +0 -13
  165. package/dist/capacitor.config.d.ts.map +0 -1
  166. package/dist/capacitor.config.js +0 -26
  167. package/dist/capacitor.config.js.map +0 -1
  168. package/dist/cli.d.ts +0 -17
  169. package/dist/cli.d.ts.map +0 -1
  170. package/dist/cli.js +0 -111
  171. package/dist/cli.js.map +0 -1
  172. package/dist/communication.d.ts +0 -192
  173. package/dist/communication.d.ts.map +0 -1
  174. package/dist/communication.js +0 -418
  175. package/dist/communication.js.map +0 -1
  176. package/dist/compute.d.ts +0 -1161
  177. package/dist/compute.d.ts.map +0 -1
  178. package/dist/compute.js +0 -2273
  179. package/dist/compute.js.map +0 -1
  180. package/dist/distribution.d.ts +0 -529
  181. package/dist/distribution.d.ts.map +0 -1
  182. package/dist/distribution.js +0 -811
  183. package/dist/distribution.js.map +0 -1
  184. package/dist/execution.d.ts +0 -530
  185. package/dist/execution.d.ts.map +0 -1
  186. package/dist/execution.js +0 -761
  187. package/dist/execution.js.map +0 -1
  188. package/dist/format.d.ts +0 -19
  189. package/dist/format.d.ts.map +0 -1
  190. package/dist/format.js +0 -60
  191. package/dist/format.js.map +0 -1
  192. package/dist/foundation.d.ts +0 -176
  193. package/dist/foundation.d.ts.map +0 -1
  194. package/dist/foundation.js +0 -309
  195. package/dist/foundation.js.map +0 -1
  196. package/dist/index.d.ts +0 -735
  197. package/dist/index.d.ts.map +0 -1
  198. package/dist/index.js +0 -1020
  199. package/dist/index.js.map +0 -1
  200. package/dist/integration.d.ts +0 -236
  201. package/dist/integration.d.ts.map +0 -1
  202. package/dist/integration.js +0 -236
  203. package/dist/integration.js.map +0 -1
  204. package/dist/intelligence.d.ts +0 -94
  205. package/dist/intelligence.d.ts.map +0 -1
  206. package/dist/intelligence.js +0 -145
  207. package/dist/intelligence.js.map +0 -1
  208. package/dist/isolation.d.ts +0 -129
  209. package/dist/isolation.d.ts.map +0 -1
  210. package/dist/isolation.js +0 -96
  211. package/dist/isolation.js.map +0 -1
  212. package/dist/media.d.ts +0 -344
  213. package/dist/media.d.ts.map +0 -1
  214. package/dist/media.js +0 -986
  215. package/dist/media.js.map +0 -1
  216. package/dist/modes.d.ts +0 -359
  217. package/dist/modes.d.ts.map +0 -1
  218. package/dist/modes.js +0 -134
  219. package/dist/modes.js.map +0 -1
  220. package/dist/operations.d.ts +0 -67
  221. package/dist/operations.d.ts.map +0 -1
  222. package/dist/operations.js +0 -94
  223. package/dist/operations.js.map +0 -1
  224. package/dist/orchestrator.d.ts +0 -1339
  225. package/dist/orchestrator.d.ts.map +0 -1
  226. package/dist/orchestrator.js +0 -4308
  227. package/dist/orchestrator.js.map +0 -1
  228. package/dist/packager/targetcli.js +0 -4
  229. package/dist/performance.d.ts +0 -416
  230. package/dist/performance.d.ts.map +0 -1
  231. package/dist/performance.js +0 -827
  232. package/dist/performance.js.map +0 -1
  233. package/dist/quantum.d.ts +0 -810
  234. package/dist/quantum.d.ts.map +0 -1
  235. package/dist/quantum.js +0 -2073
  236. package/dist/quantum.js.map +0 -1
  237. package/dist/render.d.ts +0 -381
  238. package/dist/render.d.ts.map +0 -1
  239. package/dist/render.js +0 -1073
  240. package/dist/render.js.map +0 -1
  241. package/dist/scheduler.d.ts +0 -596
  242. package/dist/scheduler.d.ts.map +0 -1
  243. package/dist/scheduler.js +0 -1259
  244. package/dist/scheduler.js.map +0 -1
  245. package/dist/security.d.ts +0 -501
  246. package/dist/security.d.ts.map +0 -1
  247. package/dist/security.js +0 -1170
  248. package/dist/security.js.map +0 -1
  249. package/dist/server.d.ts +0 -21
  250. package/dist/server.d.ts.map +0 -1
  251. package/dist/server.js +0 -52
  252. package/dist/server.js.map +0 -1
  253. package/dist/tiers.d.ts +0 -1002
  254. package/dist/tiers.d.ts.map +0 -1
  255. package/dist/tiers.js +0 -2165
  256. package/dist/tiers.js.map +0 -1
  257. package/dist/virtual.d.ts +0 -641
  258. package/dist/virtual.d.ts.map +0 -1
  259. package/dist/virtual.js +0 -1285
  260. package/dist/virtual.js.map +0 -1
  261. package/dist/virtualcpu.d.ts +0 -316
  262. package/dist/virtualcpu.d.ts.map +0 -1
  263. package/dist/virtualcpu.js +0 -1180
  264. package/dist/virtualcpu.js.map +0 -1
  265. package/dist/virtualgpu.d.ts +0 -345
  266. package/dist/virtualgpu.d.ts.map +0 -1
  267. package/dist/virtualgpu.js +0 -1000
  268. package/dist/virtualgpu.js.map +0 -1
  269. package/dist/virtualization.d.ts +0 -607
  270. package/dist/virtualization.d.ts.map +0 -1
  271. package/dist/virtualization.js +0 -1187
  272. package/dist/virtualization.js.map +0 -1
  273. package/dist/virtualmemory.d.ts +0 -818
  274. package/dist/virtualmemory.d.ts.map +0 -1
  275. package/dist/virtualmemory.js +0 -1796
  276. package/dist/virtualmemory.js.map +0 -1
  277. package/dist/webscrape.d.ts +0 -720
  278. package/dist/webscrape.d.ts.map +0 -1
  279. package/dist/webscrape.js +0 -2697
  280. package/dist/webscrape.js.map +0 -1
  281. package/docs/example-publicapi.ts +0 -7
  282. package/web/extension/manifest.json +0 -23
  283. package/web/readme.md +0 -382
  284. package/web/tsconfig.json +0 -25
@@ -0,0 +1,156 @@
1
+ // # modalityregistry — the catalog of the sandbox modalities the saddle
2
+ // engine opens (root layer, wave SV1). One record per modality: the
3
+ // isolation family, the driver requirements it mounts, the boot cost class,
4
+ // the hardening gates it carries and the mime contract it answers. The
5
+ // registry is the spine of the "fifty modalities" promise: the workload
6
+ // never chooses by name — the join resolver reads the request (isolation,
7
+ // gpu, network, boot budget) and answers the modality set that satisfies
8
+ // it, so the person chooses none and the platform resolves the join of all
9
+ // (the nuclear modality law). Pure data and pure functions: zero storage,
10
+ // zero node-only imports, the browser-pure bundle keeps carrying it.
11
+
12
+ /** The boot cost classes the ladder measures. */
13
+ export type BootClass = "hot" | "warm" | "cold";
14
+
15
+ /** The isolation families the modalities group under. */
16
+ export type ModalityFamily =
17
+ | "virtual"
18
+ | "runner"
19
+ | "packages"
20
+ | "container"
21
+ | "microvm"
22
+ | "browser"
23
+ | "mobile"
24
+ | "confidential"
25
+ | "emulator"
26
+ | "pod"
27
+ | "local"
28
+ | "screen"
29
+ | "wasm"
30
+ | "fs"
31
+ | "delivery";
32
+
33
+ /** One sandbox modality of the registry. */
34
+ export interface ModalityRecord {
35
+ /** The stable id the api and the config rows reference. */
36
+ id: string;
37
+ /** The display label (short, lowercase). */
38
+ label: string;
39
+ /** The isolation family the modality belongs to. */
40
+ family: ModalityFamily;
41
+ /** The isolation depth the family reaches (the capability contract). */
42
+ isolation: "process" | "namespace" | "vm" | "hardware";
43
+ /** The driver modules the modality mounts when it boots. */
44
+ drivers: readonly string[];
45
+ /** The hardening gates the modality enforces by default. */
46
+ hardening: readonly string[];
47
+ /** The boot cost class (the measured budget lives in the boot ladder). */
48
+ boot: BootClass;
49
+ /** The measured boot budget in milliseconds (the ladder answers). */
50
+ bootms: number;
51
+ /** Whether the modality presents a gpu through the virtual drivers. */
52
+ gpu: boolean;
53
+ /** Whether the modality opens a network path (the hardened default is off). */
54
+ network: boolean;
55
+ /** The mime type the modality's api surface answers. */
56
+ mime: string;
57
+ }
58
+
59
+ /** The boot budgets of the ladder, per class: the ceilings the records walk
60
+ * under (firecracker 125 ms and gvisor about 200 ms ride warm, the full
61
+ * machine images ride cold). */
62
+ export const BOOTLADDER: Readonly<Record<BootClass, number>> = Object.freeze({
63
+ hot: 25,
64
+ warm: 800,
65
+ cold: 1500,
66
+ });
67
+
68
+ /** The modality records: the catalog the join resolver reads. */
69
+ export const MODALITIES: readonly ModalityRecord[] = Object.freeze([
70
+ // the virtual family: the full machine with the virtual drivers
71
+ { id: "virtual-full", label: "complete virtual", family: "virtual", isolation: "hardware", drivers: ["virtualcpu", "virtualgpu", "virtualmemory"], hardening: ["profile-lock"], boot: "cold", bootms: BOOTLADDER.cold, gpu: true, network: true, mime: "application/vnd.devthink.sandbox+json" },
72
+ { id: "virtual-vgpu", label: "vgpu slice", family: "virtual", isolation: "hardware", drivers: ["virtualgpu", "nvml-shim", "vfio"], hardening: ["mig-profile"], boot: "warm", bootms: 600, gpu: true, network: true, mime: "application/vnd.devthink.sandbox+json" },
73
+ { id: "virtual-screen", label: "vm plus vnc", family: "screen", isolation: "vm", drivers: ["virtualcpu", "virtualgpu", "xvfb", "looking-glass"], hardening: ["session-otp"], boot: "warm", bootms: 700, gpu: true, network: true, mime: "application/vnd.devthink.screen+json" },
74
+ // the runner family: the universal binary runner
75
+ { id: "runner-universal", label: "universal runner", family: "runner", isolation: "namespace", drivers: ["binfmt"], hardening: ["read-only-root", "dropped-caps"], boot: "warm", bootms: BOOTLADDER.warm, gpu: false, network: true, mime: "application/vnd.devthink.run+json" },
76
+ { id: "runner-node", label: "node packages", family: "packages", isolation: "process", drivers: ["node", "babel", "swc"], hardening: ["package-allowlist"], boot: "hot", bootms: BOOTLADDER.hot, gpu: false, network: true, mime: "application/vnd.devthink.run+json" },
77
+ { id: "runner-wasm", label: "wasm and wasi", family: "wasm", isolation: "process", drivers: ["wasmer", "wasmedge"], hardening: ["capability-imports"], boot: "hot", bootms: 15, gpu: false, network: false, mime: "application/wasm" },
78
+ { id: "runner-serverless", label: "v8 isolates", family: "runner", isolation: "process", drivers: ["v8"], hardening: ["no-fs", "cpu-quota"], boot: "hot", bootms: 8, gpu: false, network: true, mime: "application/vnd.devthink.run+json" },
79
+ // the container family: docker hardened and ghcr immutable
80
+ { id: "container-docker", label: "docker hardened", family: "container", isolation: "namespace", drivers: ["docker"], hardening: ["no-network", "dropped-caps", "read-only-root", "pid-limit"], boot: "warm", bootms: 400, gpu: false, network: false, mime: "application/vnd.devthink.container+json" },
81
+ { id: "container-ghcr", label: "ghcr immutable", family: "container", isolation: "namespace", drivers: ["docker", "ghcr"], hardening: ["immutable-root", "uuid-instance"], boot: "warm", bootms: 450, gpu: false, network: true, mime: "application/vnd.devthink.container+json" },
82
+ { id: "container-runsc", label: "gvisor sandboxed", family: "container", isolation: "namespace", drivers: ["runsc"], hardening: ["user-kernel"], boot: "warm", bootms: BOOTLADDER.warm, gpu: false, network: true, mime: "application/vnd.devthink.container+json" },
83
+ // the microvm family: per workflow, the e2b form
84
+ { id: "microvm-firecracker", label: "firecracker microvm", family: "microvm", isolation: "vm", drivers: ["firecracker", "virtualcpu"], hardening: ["clean-rootfs", "injected-vcpu"], boot: "warm", bootms: 125, gpu: false, network: true, mime: "application/vnd.devthink.microvm+json" },
85
+ { id: "microvm-gpuless", label: "gpuless render", family: "microvm", isolation: "vm", drivers: ["mesa-llvmpipe", "lavapipe", "rusticl", "xvfb"], hardening: ["clean-rootfs"], boot: "warm", bootms: 500, gpu: true, network: true, mime: "application/vnd.devthink.microvm+json" },
86
+ // the pod family: one pod per session (the competitor recipe)
87
+ { id: "pod-session", label: "pod per session", family: "pod", isolation: "namespace", drivers: ["k8s"], hardening: ["quota-check"], boot: "warm", bootms: 800, gpu: false, network: true, mime: "application/vnd.devthink.pod+json" },
88
+ // the confidential family: attested compute
89
+ { id: "confidential-sevsnp", label: "sev snp", family: "confidential", isolation: "hardware", drivers: ["sev-snp", "tpm"], hardening: ["attestation"], boot: "cold", bootms: 1200, gpu: false, network: true, mime: "application/vnd.devthink.confidential+json" },
90
+ { id: "confidential-tdx", label: "tdx", family: "confidential", isolation: "hardware", drivers: ["tdx", "tpm"], hardening: ["attestation"], boot: "cold", bootms: 1200, gpu: false, network: true, mime: "application/vnd.devthink.confidential+json" },
91
+ // the emulator family: qemu full emulation
92
+ { id: "emulator-qemu", label: "qemu", family: "emulator", isolation: "vm", drivers: ["qemu"], hardening: ["tcg"], boot: "cold", bootms: 900, gpu: false, network: true, mime: "application/vnd.devthink.emulator+json" },
93
+ // the browser family: the sandbox-side browser (never the person's)
94
+ { id: "browser-server", label: "virtual browser", family: "browser", isolation: "namespace", drivers: ["chromium-headless", "playwright"], hardening: ["sandboxed-tabs"], boot: "warm", bootms: 300, gpu: false, network: true, mime: "application/vnd.devthink.browser+json" },
95
+ { id: "browser-webcontainer", label: "webcontainer server side", family: "browser", isolation: "namespace", drivers: ["node", "wasm"], hardening: ["opt-in"], boot: "warm", bootms: 350, gpu: false, network: true, mime: "application/vnd.devthink.browser+json" },
96
+ // the mobile family: the os images of the mobile lane
97
+ { id: "mobile-capacitor", label: "capacitor", family: "mobile", isolation: "namespace", drivers: ["capacitor"], hardening: ["emulated-device"], boot: "warm", bootms: 600, gpu: false, network: true, mime: "application/vnd.devthink.mobile+json" },
98
+ { id: "mobile-termux", label: "termux", family: "mobile", isolation: "namespace", drivers: ["termux"], hardening: ["emulated-device"], boot: "warm", bootms: 550, gpu: false, network: true, mime: "application/vnd.devthink.mobile+json" },
99
+ { id: "mobile-postmarketos", label: "postmarketos", family: "mobile", isolation: "vm", drivers: ["qemu"], hardening: ["emulated-device"], boot: "cold", bootms: 1000, gpu: false, network: true, mime: "application/vnd.devthink.mobile+json" },
100
+ // the fs and delivery families: the vfs and the cdn lane
101
+ { id: "fs-vfs", label: "vfs", family: "fs", isolation: "process", drivers: ["vfs"], hardening: ["chunk-catalog"], boot: "hot", bootms: 5, gpu: false, network: false, mime: "application/vnd.devthink.vfs+json" },
102
+ { id: "delivery-cdn", label: "cdn mirror", family: "delivery", isolation: "process", drivers: ["vfs", "cdn"], hardening: ["inside-sandbox-fetch"], boot: "hot", bootms: 5, gpu: false, network: true, mime: "application/vnd.devthink.cdn+json" },
103
+ { id: "local-optin", label: "local opt in", family: "local", isolation: "process", drivers: [], hardening: ["explicit-consent"], boot: "hot", bootms: 10, gpu: false, network: false, mime: "application/vnd.devthink.local+json" },
104
+ ]);
105
+
106
+ /** The base profiles the owner names (the config wave makes them editable). */
107
+ export type BaseProfile = "max" | "balanced" | "lite";
108
+
109
+ /** The join request: what the workload asks, never a modality name. */
110
+ export interface JoinRequest {
111
+ /** The base profile the sandbox boots under. */
112
+ base: BaseProfile;
113
+ /** Whether the workload needs a gpu path through the virtual drivers. */
114
+ gpu: boolean;
115
+ /** Whether the workload needs a network path. */
116
+ network: boolean;
117
+ /** The isolation depth the workload demands at minimum. */
118
+ isolation?: ModalityRecord["isolation"];
119
+ /** The boot budget the workload tolerates, in milliseconds. */
120
+ bootbudget?: number;
121
+ /** The family the workload prefers (the first filter when given). */
122
+ family?: ModalityFamily;
123
+ }
124
+
125
+ /**
126
+ * Resolves the modality join for a request: the records that satisfy every
127
+ * demand, ordered by boot cost then isolation depth — the platform answers
128
+ * the join, the person never names a modality (the nuclear law).
129
+ *
130
+ * @param request the workload demands.
131
+ * @returns the modality records that satisfy the join, best candidate first.
132
+ */
133
+ export function resolvejoin(request: JoinRequest): readonly ModalityRecord[] {
134
+ const budget = request.bootbudget ?? BOOTLADDER.cold;
135
+ const order: Record<ModalityRecord["isolation"], number> = { process: 0, namespace: 1, vm: 2, hardware: 3 };
136
+ return MODALITIES.filter((modality) => {
137
+ if (request.family && modality.family !== request.family) return false;
138
+ if (request.gpu && !modality.gpu) return false;
139
+ if (request.network && !modality.network) return false;
140
+ if (request.isolation && order[modality.isolation] < order[request.isolation]) return false;
141
+ if (modality.bootms > budget) return false;
142
+ // the lite base keeps the heavy machine images out of the answer
143
+ if (request.base === "lite" && modality.isolation === "hardware") return false;
144
+ return true;
145
+ }).sort((a, b) => a.bootms - b.bootms || order[a.isolation] - order[b.isolation]);
146
+ }
147
+
148
+ /**
149
+ * Answers one modality by id (the config rows and the api carry ids).
150
+ *
151
+ * @param id the modality id.
152
+ * @returns the record, or undefined when the id is unknown.
153
+ */
154
+ export function getmodality(id: string): ModalityRecord | undefined {
155
+ return MODALITIES.find((modality) => modality.id === id);
156
+ }
package/mttg.config CHANGED
@@ -2,7 +2,7 @@
2
2
  "meta": {
3
3
  "name": "mttg.config",
4
4
  "title": "saddle - MTTG Multi-Tenant Task Groups (cgroups v2 + tenants + transcode) with MTTCG (QEMU TCG) section",
5
- "version": "2.0.0",
5
+ "version": "2.0.127",
6
6
  "date": "2026-08-22",
7
7
  "language": "en",
8
8
  "conceptSeparation": "MTTG = Multi-Tenant Task Groups (cgroup v2 cpu.weight/cpuset/memory/io/pids/hugetlb/rdma + tenants + transcode pipelines). MTTCG = QEMU Multi-Threaded TCG (one host thread per vCPU under TCG). Both live here as DISTINCT sections; MTTCG accel flags also in qemu.config#mttcg.",
package/orchestrator.ts CHANGED
@@ -91,7 +91,10 @@ const runtimecatalog = {
91
91
 
92
92
  /** toolchain stack reported by dumpstate and the version probe. */
93
93
  const stackcatalog = {
94
- nodecurrent: '26.7.0',
94
+ /* walks with the .nvmrc pin the maintenance rung stamps — the 2.0.133
95
+ publish regression answered the engine advertising a node the repository
96
+ retired, so the anchor rides the pin lane now (never ahead of it) */
97
+ nodecurrent: '26.12.1',
95
98
  nodelts: '24.19.0',
96
99
  typescript: '7.0.2',
97
100
  qemu: runtimecatalog.qemu,
@@ -4389,7 +4392,7 @@ class orchestrator {
4389
4392
  /**
4390
4393
  * default contents of the flat config files written by start(); the
4391
4394
  * version strings carry the v2 anchors (qemu 11.1.0, docker 29.7.2,
4392
- * node 26.7.0), replacing the stale Meta banners.
4395
+ * node 26.12.0), replacing the stale Meta banners.
4393
4396
  */
4394
4397
  #defaultconfigcontents(): Record<configfilename, string> {
4395
4398
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wenathlan/saddle",
3
- "version": "2.0.6",
3
+ "version": "2.0.151",
4
4
  "description": "binary computing engine that turns distributed storage into a publishable working set carrying the merged virtual-hardware engine (the saddle + e2ugh grand merge)",
5
5
  "type": "module",
6
6
  "private": false,
@@ -19,11 +19,23 @@
19
19
  "xcode": {
20
20
  "uuid": "11.1.1"
21
21
  },
22
- "uuid": "^11.1.1"
22
+ "uuid": "^11.1.1",
23
+ "@grpc/grpc-js": "1.14.5",
24
+ "deepmerge-ts": "^8.0.0",
25
+ "esbuild": "^0.28.2",
26
+ "follow-redirects": "^1.16.1",
27
+ "mysql2": "^3.24.6",
28
+ "postcss-selector-parser": "^7.1.6",
29
+ "source-map-js": "1.2.2",
30
+ "proxy-addr": "2.0.8",
31
+ "body-parser": "^2.4.0",
32
+ "fast-uri": "^3.1.9",
33
+ "zod": "^4.6.7",
34
+ "undici": "^7.30.1"
23
35
  },
24
36
  "repository": {
25
37
  "type": "git",
26
- "url": "https://github.com/wenathlan/saddle.git"
38
+ "url": "https://github.com/wenathlan/devthink"
27
39
  },
28
40
  "bugs": {
29
41
  "url": "https://github.com/wenathlan/saddle/issues"
@@ -32,16 +44,40 @@
32
44
  "keywords": [
33
45
  "distributed computing",
34
46
  "virtual memory",
47
+ "virtual machine",
48
+ "virtual cpu",
49
+ "virtual gpu",
35
50
  "runner",
36
51
  "storage",
37
- "automation"
52
+ "automation",
53
+ "llvmpipe",
54
+ "lavapipe",
55
+ "rusticl",
56
+ "qemu",
57
+ "firecracker",
58
+ "mesa",
59
+ "ghcr"
38
60
  ],
39
61
  "engines": {
40
- "node": ">=26.7.0",
41
- "npm": ">=10.9.2"
62
+ "bare": "^1.18.0",
63
+ "bun": "^1.4.2",
64
+ "chrome": "^16.0.912",
65
+ "cnpm": "^9.4.0",
66
+ "corepack": "^0.35.0",
67
+ "deno": "^2.9.5",
68
+ "ecmascript": "^5.0.0",
69
+ "firefox": ">=0.8.0",
70
+ "iojs": "^1.0.0",
71
+ "node": ">=26.12.1 <27",
72
+ "npm": "^12.1.0",
73
+ "pnpm": "^12.6.0",
74
+ "teleport": ">=0.2.0",
75
+ "typescript": "^5.8.0",
76
+ "vscode": "^1.118.0",
77
+ "yarn": "^4.17.1"
42
78
  },
43
79
  "peerDependencies": {
44
- "playwright": "^1.62.1"
80
+ "playwright": "^1.63.0"
45
81
  },
46
82
  "peerDependenciesMeta": {
47
83
  "playwright": {
@@ -65,17 +101,17 @@
65
101
  "./sessions": "./dist/foundation.js",
66
102
  "./modes": "./dist/modes.js",
67
103
  "./mode": "./dist/modes.js",
104
+ "./sandbox": "./dist/sandbox.js",
105
+ "./modalities": "./dist/modalityregistry.js",
68
106
  "./browser": "./dist/browser.js",
69
107
  "./browser-playwright": "./dist/browser.js",
70
108
  "./bot": "./dist/automation.js",
71
- "./captcha": "./dist/acquisition.js",
72
109
  "./deploy": "./dist/modes.js",
73
110
  "./extension": "./dist/browser.js",
74
111
  "./server-node": "./dist/server.js",
75
112
  "./sessions-file": "./dist/execution.js",
76
113
  "./sessions-store": "./dist/execution.js",
77
114
  "./queue-persistent": "./dist/execution.js",
78
- "./captcha-evidence": "./dist/acquisition.js",
79
115
  "./hash": "./dist/foundation.js",
80
116
  "./release-assets": "./dist/distribution.js",
81
117
  "./release-verify": "./dist/distribution.js",
@@ -114,7 +150,7 @@
114
150
  },
115
151
  "files": [
116
152
  "dist",
117
- "web/extension/manifest.json",
153
+ "manifest.json",
118
154
  "docs",
119
155
  "README.md",
120
156
  "LICENSE",
@@ -147,16 +183,16 @@
147
183
  "docker.config",
148
184
  "Dockerfile",
149
185
  "tsconfig.json",
150
- "biome.json",
186
+ "biome.jsonc",
187
+ "modalityregistry.ts",
151
188
  "tiers.ts",
152
189
  "quantum.ts"
153
190
  ],
154
191
  "scripts": {
155
- "build:engine": "node tests/scripts/buildengine.mjs",
192
+ "build:engine": "node tests/scripts/buildengine.ts",
156
193
  "check": "npm run build:engine && node --check dist/index.js && node --check dist/execution.js && node --check dist/cli.js && node --check dist/browser.js && node --check dist/distribution.js",
157
194
  "formatcheck": "node --import tsx format.ts",
158
- "test": "npm run build:engine && node --import tsx --test tests/engine.test.ts tests/extension.test.ts tests/package.test.ts tests/release.test.ts tests/virtualengine.test.ts tests/features.test.ts tests/media.test.ts tests/render.test.ts tests/simulation.test.ts tests/specs.test.ts tests/virtualcpu.test.ts tests/virtualgpu.test.ts tests/virtualmemory.test.ts tests/web.test.ts tests/workflow.test.ts",
159
- "test:legacy": "vitest run tests/agent-utils.test.ts tests/cache.test.ts tests/chunking.test.ts tests/core.test.ts tests/errors.test.ts tests/llms-txt.test.ts tests/middleware.test.ts tests/proxy.test.ts tests/tokens.test.ts",
195
+ "test": "vitest run",
160
196
  "run": "npm run build:engine && node dist/cli.js",
161
197
  "extension:build": "npm run build:engine && node dist/browser.js",
162
198
  "release:assets": "npm run build:engine && node dist/distribution.js",
@@ -166,18 +202,18 @@
166
202
  "prepublishOnly": "npm run pack:check",
167
203
  "tauri": "npx --yes @tauri-apps/cli@2.11.4",
168
204
  "capacitor:sync:android": "npm run web:build:pages && cap sync android",
169
- "capacitor:flatten:android": "node tests/scripts/flattenandroid.mjs",
170
205
  "capacitor:sync:ios": "npm run web:build:pages && cap sync ios",
171
- "native:check:flat": "node tests/scripts/validateflatnative.mjs",
172
- "web:dev": "vite --config web/vite.config.ts --host",
173
- "web:check": "npm run build:engine && tsc --project web/tsconfig.json --noEmit",
174
- "web:build": "vite build --config web/vite.config.ts",
175
- "web:build:pages": "vite build --config web/vite.config.ts",
206
+ "native:check:flat": "node tests/scripts/validateflatnative.ts",
207
+ "web:dev": "vite --host",
208
+ "web:check": "npm run build:engine && tsc --project tsconfig.json --noEmit",
209
+ "web:build": "vite build",
210
+ "web:build:pages": "vite build",
211
+ "web:preview": "vite preview --host",
176
212
  "build": "npm run build:engine",
177
213
  "build:tsc": "tsc -p tsconfig.json --noEmitOnError false",
178
214
  "start": "node --import tsx ./cli.ts plan",
179
215
  "dev": "node --import tsx --watch ./cli.ts",
180
- "web": "node web/server.js",
216
+ "web": "node webserver.ts",
181
217
  "qemu:bridge": "node ./orchestrator.ts --qemu-bridge",
182
218
  "toolchain:verify": "node --version && npx tsc --version && python3 --version && qemu-system-x86_64 --version || true && docker --version",
183
219
  "dev:tsx": "node --import tsx --watch ./cli.ts",
@@ -194,100 +230,114 @@
194
230
  "test:unit": "node --test tests/*.test.ts",
195
231
  "test:e2e": "node --test tests/*.test.ts",
196
232
  "qemu:version": "qemu-system-x86_64 --version || echo 'qemu 11.1.0 expected 2026-08-22'",
197
- "vm:create": "node ./index.ts --create-vm",
198
- "vm:validate": "node ./index.ts --validate-vm",
199
- "gpu:list": "node ./index.ts --list-gpus",
200
- "docker:build": "docker build -f Dockerfile -t saddle:2.0.6 .",
201
- "docker:run": "docker run --rm --memory-swap=-1 --shm-size=2g saddle:2.0.6",
202
- "docker:health": "docker run --rm saddle:2.0.6 qemu-system-x86_64 --version && curl -fsS http://localhost:8080/health || true",
233
+ "vm:create": "node --import tsx ./cli.ts vm",
234
+ "vm:validate": "node --import tsx ./cli.ts vmlint",
235
+ "gpu:list": "node --import tsx ./cli.ts gpus",
236
+ "docker:build": "docker build -f Dockerfile -t saddle:2.0.151 .",
237
+ "docker:run": "docker run --rm --memory-swap=-1 --shm-size=2g saddle:2.0.151",
238
+ "docker:health": "docker run --rm saddle:2.0.151 qemu-system-x86_64 --version && curl -fsS http://localhost:8080/health || true",
203
239
  "firecracker:boot": "firecracker --api-sock /tmp/fc-saddle.sock --config-file vmconfig.json 2>/dev/null || echo 'firecracker 1.16.1 warm-pool boot 125ms target'",
204
240
  "py:bridge": "python3 qemubridge.py",
205
241
  "py:test": "python3 -m pytest -q || python3 qemubridge.py",
206
242
  "clean": "rm -rf dist coverage .biome __pycache__",
207
- "prepare": "echo 'saddle grand-merge toolchain 2026-08-23: Node 26.7.0 Current / 24.19.0 LTS, npm 12.0.2, TS 7.0.2, Python 3.14.7, Docker 29.7.2, QEMU 11.1.0, Mesa 26.2.1, LLVM 22.1.8, Firecracker 1.16.1'",
243
+ "prepare": "echo 'saddle grand-merge toolchain 2026-08-23: Node 26.12.0 Current / 24.19.0 LTS, npm 12.0.2, TS 7.0.2, Python 3.14.7, Docker 29.7.2, QEMU 11.1.0, Mesa 26.2.1, LLVM 22.1.8, Firecracker 1.16.1'",
208
244
  "start:engine": "node --import tsx ./cli.ts plan"
209
245
  },
210
246
  "devDependencies": {
211
- "@biomejs/biome": "^2.5.11",
212
- "@capacitor/android": "^8.5.0",
213
- "@capacitor/cli": "^8.5.1",
214
- "@capacitor/core": "^8.5.0",
215
- "@capacitor/ios": "^8.5.0",
216
- "@hookform/resolvers": "^5.2.2",
217
- "@radix-ui/react-accordion": "^1.2.12",
218
- "@radix-ui/react-alert-dialog": "^1.1.15",
219
- "@radix-ui/react-aspect-ratio": "^1.1.7",
220
- "@radix-ui/react-avatar": "^1.1.10",
221
- "@radix-ui/react-checkbox": "^1.3.3",
222
- "@radix-ui/react-collapsible": "^1.1.12",
223
- "@radix-ui/react-context-menu": "^2.2.16",
224
- "@radix-ui/react-dialog": "^1.1.15",
225
- "@radix-ui/react-dropdown-menu": "^2.1.16",
226
- "@radix-ui/react-hover-card": "^1.1.15",
227
- "@radix-ui/react-label": "^2.1.7",
228
- "@radix-ui/react-menubar": "^1.1.16",
229
- "@radix-ui/react-navigation-menu": "^1.2.14",
230
- "@radix-ui/react-popover": "^1.1.15",
231
- "@radix-ui/react-progress": "^1.1.7",
232
- "@radix-ui/react-radio-group": "^1.3.8",
233
- "@radix-ui/react-scroll-area": "^1.2.10",
234
- "@radix-ui/react-select": "^2.2.6",
235
- "@radix-ui/react-separator": "^1.1.7",
236
- "@radix-ui/react-slider": "^1.3.6",
237
- "@radix-ui/react-slot": "^1.2.3",
238
- "@radix-ui/react-switch": "^1.2.6",
239
- "@radix-ui/react-tabs": "^1.1.13",
240
- "@radix-ui/react-toggle": "^1.1.10",
241
- "@radix-ui/react-toggle-group": "^1.1.11",
242
- "@radix-ui/react-tooltip": "^1.2.8",
243
- "@tailwindcss/typography": "^0.5.15",
244
- "@tailwindcss/vite": "^4.1.3",
245
- "@types/google.maps": "^3.58.1",
246
- "@types/node": "^26.4.0",
247
- "@types/react": "^19.2.1",
248
- "@types/react-dom": "^19.2.1",
249
- "@vitejs/plugin-react": "^6.1.1",
250
- "add": "^2.0.6",
251
- "autoprefixer": "^10.4.20",
252
- "axios": "^1.12.0",
247
+ "@biomejs/biome": "^2.6.2",
248
+ "@capacitor/android": "^8.5.3",
249
+ "@capacitor/cli": "^8.5.3",
250
+ "@capacitor/core": "^8.5.3",
251
+ "@capacitor/ios": "^8.5.3",
252
+ "@fluentui/react-icons": "^2.0.344",
253
+ "@hookform/resolvers": "^5.9.2",
254
+ "@libsql/client": "^0.18.0",
255
+ "@prisma/client": "^7.10.1",
256
+ "@radix-ui/react-accordion": "^1.3.1",
257
+ "@radix-ui/react-alert-dialog": "^1.2.1",
258
+ "@radix-ui/react-aspect-ratio": "^1.2.0",
259
+ "@radix-ui/react-avatar": "^1.3.1",
260
+ "@radix-ui/react-checkbox": "^1.4.1",
261
+ "@radix-ui/react-collapsible": "^1.2.1",
262
+ "@radix-ui/react-context-menu": "^2.4.1",
263
+ "@radix-ui/react-dialog": "^1.3.1",
264
+ "@radix-ui/react-dropdown-menu": "^2.2.1",
265
+ "@radix-ui/react-hover-card": "^1.2.1",
266
+ "@radix-ui/react-label": "^2.1.17",
267
+ "@radix-ui/react-menubar": "^1.2.1",
268
+ "@radix-ui/react-navigation-menu": "^1.4.1",
269
+ "@radix-ui/react-popover": "^1.3.1",
270
+ "@radix-ui/react-progress": "^1.2.1",
271
+ "@radix-ui/react-radio-group": "^1.5.1",
272
+ "@radix-ui/react-scroll-area": "^1.4.0",
273
+ "@radix-ui/react-select": "^2.4.1",
274
+ "@radix-ui/react-separator": "^1.2.0",
275
+ "@radix-ui/react-slider": "^1.6.1",
276
+ "@radix-ui/react-slot": "^1.5.0",
277
+ "@radix-ui/react-switch": "^1.4.1",
278
+ "@radix-ui/react-tabs": "^1.2.1",
279
+ "@radix-ui/react-toggle": "^1.2.1",
280
+ "@radix-ui/react-toggle-group": "^1.2.1",
281
+ "@radix-ui/react-tooltip": "^1.4.1",
282
+ "@tailwindcss/typography": "^0.5.20",
283
+ "@tailwindcss/vite": "^4.3.3",
284
+ "@types/google.maps": "^3.66.7",
285
+ "@types/node": "^26.6.5",
286
+ "@types/react": "^19.3.0",
287
+ "@types/react-dom": "^19.3.0",
288
+ "@vitejs/plugin-react": "^6.1.2",
289
+ "add": "^2.0.9",
290
+ "autoprefixer": "^10.6.1",
291
+ "axios": "^1.20.0",
292
+ "better-sqlite3": "^13.0.3",
293
+ "cheerio": "^1.2.0",
253
294
  "class-variance-authority": "^0.7.1",
254
295
  "clsx": "^2.1.1",
255
296
  "cmdk": "^1.1.1",
297
+ "drizzle-kit": "^0.31.11",
298
+ "drizzle-orm": "^0.45.4",
256
299
  "embla-carousel-react": "^8.6.0",
257
- "esbuild": "^0.25.0",
258
- "framer-motion": "^13.1.1",
259
- "input-otp": "^1.4.2",
300
+ "emittery": "^2.2.0",
301
+ "esbuild": "^0.28.2",
302
+ "framer-motion": "^13.5.1",
303
+ "hono": "^4.13.13",
304
+ "input-otp": "^1.5.0",
260
305
  "jsdom": "26.1.0",
261
- "lucide-react": "^0.453.0",
262
- "nanoid": "^5.1.5",
306
+ "lucide-react": "^1.61.0",
307
+ "mysql2": "^3.24.6",
308
+ "nanoid": "^6.0.2",
263
309
  "next-themes": "^0.4.6",
264
- "postcss": "^8.4.47",
265
- "prettier": "^3.6.2",
266
- "react": "^19.2.1",
267
- "react-day-picker": "^9.11.1",
268
- "react-dom": "^19.2.1",
269
- "react-hook-form": "^7.64.0",
270
- "react-resizable-panels": "^3.0.6",
271
- "recharts": "^2.15.2",
272
- "sonner": "^2.0.7",
273
- "streamdown": "^2.6.0",
274
- "tailwind-merge": "^3.3.1",
275
- "tailwindcss": "^4.1.14",
310
+ "p-limit": "^7.3.3",
311
+ "playwright": "^1.64.1",
312
+ "p-retry": "^8.0.1",
313
+ "postcss": "^8.5.31",
314
+ "prettier": "^3.9.10",
315
+ "prisma": "^7.10.1",
316
+ "react": "^19.3.1",
317
+ "react-day-picker": "^10.0.2",
318
+ "react-dom": "^19.3.1",
319
+ "react-hook-form": "^7.91.0",
320
+ "react-resizable-panels": "^4.14.8",
321
+ "recharts": "^3.10.1",
322
+ "sonner": "^2.0.8",
323
+ "streamdown": "^2.7.1",
324
+ "tailwind-merge": "^3.7.0",
325
+ "tailwindcss": "^4.3.3",
276
326
  "tailwindcss-animate": "^1.0.7",
277
- "tsx": "^4.19.1",
327
+ "tsx": "^4.23.15",
278
328
  "tw-animate-css": "^1.4.0",
279
329
  "typescript": "7.0.2",
280
330
  "vaul": "^1.1.2",
281
- "vite": "^8.2.2",
282
- "vite-plugin-manus-runtime": "^0.0.58",
283
- "vitest": "^4.1.10",
284
- "wouter": "^3.3.5",
285
- "zod": "^4.1.12"
331
+ "vite": "^8.3.5",
332
+ "vite-plugin-manus-runtime": "^0.0.59",
333
+ "vitest": "^5.0.5",
334
+ "wouter": "^3.13.0",
335
+ "zod": "^4.6.7"
286
336
  },
287
337
  "optionalDependencies": {
288
- "commander": "^13.1.0",
338
+ "commander": "^15.0.0",
289
339
  "dockerode": "^5.0.1",
290
- "express": "^5.1.0"
340
+ "express": "^5.3.0"
291
341
  },
292
342
  "systemLibraries": {
293
343
  "note": "system libraries, not npm packages (declared by nested_package.json v3 as dependencies; kept here as build-time system requirements only)",
@@ -301,9 +351,9 @@
301
351
  "saddle": {
302
352
  "date": "2026-08-23",
303
353
  "toolchain": {
304
- "node": "26.7.0",
354
+ "node": "26.12.0",
305
355
  "nodeLts": "24.19.0",
306
- "nodeCurrent": "26.7.0",
356
+ "nodeCurrent": "26.12.0",
307
357
  "npm": "12.0.2",
308
358
  "typescript": "7.0.2",
309
359
  "python": "3.14.7",
package/passage.config CHANGED
@@ -2,7 +2,7 @@
2
2
  "meta": {
3
3
  "name": "passage.config",
4
4
  "title": "saddle - Passage Configuration (3 homonym domains kept separate + host playbook)",
5
- "version": "2.0.0",
5
+ "version": "2.1.6",
6
6
  "date": "2026-08-22",
7
7
  "language": "en",
8
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.",
@@ -56,7 +56,7 @@
56
56
  "gateway": {
57
57
  "meta": {
58
58
  "project": "saddle (grand merge)",
59
- "version": "2.0.0",
59
+ "version": "2.1.6",
60
60
  "schema": "passage.config",
61
61
  "schemaversion": "2026.08.22",
62
62
  "engine": "passage gateway v6",
package/performance.ts CHANGED
File without changes
package/processors.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "meta": {
4
4
  "name": "processors.json",
5
5
  "title": "saddle - Unified Virtual Processor Database",
6
- "version": "2.0.0",
6
+ "version": "2.0.127",
7
7
  "date": "2026-08-22",
8
8
  "language": "en",
9
9
  "description": "Union of the v5 canonical CPU database (6 x86_64 identities), the e2ugh processor catalog (55 SKUs incl. ARM/Apple/Xeon; lineage kept), Zen5/X3D microarchitecture specs and pool minis. Field conflicts resolved V5-first (model_name/max_boost_ghz/tdp_watts canonical); OMNI complementary fields (arch, core_type, topology, memory_support, release_date) merged in place. Versions re-pinned date-first 2026-08-22.",
package/qemu.config CHANGED
@@ -2,7 +2,7 @@
2
2
  "meta": {
3
3
  "name": "qemu.config",
4
4
  "title": "saddle - QEMU Configuration (canonical JSON; sources: S6 TOML + v5 spec 11.1.0 + libvirt overlay)",
5
- "version": "2.0.0",
5
+ "version": "2.0.127",
6
6
  "date": "2026-08-22",
7
7
  "language": "en",
8
8
  "format": "JSON (canonical v2 schema; sources were S6 TOML + V5 JSON schema + libvirt conf overlay)",
@@ -90,7 +90,7 @@
90
90
  "githubSetupPython": "actions/setup-python@v5.4.0",
91
91
  "platformKernel": "6.11.0+"
92
92
  },
93
- "version": "2.0.0",
93
+ "version": "2.0.127",
94
94
  "title": "saddle - QEMU Configuration (canonical JSON; sources: S6 TOML + v5 spec 11.1.0 + libvirt overlay)",
95
95
  "project": "e2ugh v6",
96
96
  "toolchainV5": {
package/qemubridge.py CHANGED
File without changes
package/quantum.ts CHANGED
File without changes
package/render.ts CHANGED
File without changes
package/scheduler.ts CHANGED
File without changes
package/security.ts CHANGED
File without changes