@wenathlan/saddle 2.0.154 → 2.0.155

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 (307) hide show
  1. package/Dockerfile +112 -41
  2. package/README.md +58 -59
  3. package/browser.ts +482 -0
  4. package/cli.ts +274 -0
  5. package/distribution.ts +731 -0
  6. package/docker.config +29 -8
  7. package/docs/artifactavailability.md +2 -2
  8. package/docs/browser.md +18 -1
  9. package/docs/{containerplatforms.2.1.0.md → containerplatforms210.md} +1 -1
  10. package/docs/{documentmap.1.8.12.md → documentmap1812.md} +1 -1
  11. package/docs/extension.md +13 -2
  12. package/docs/libraryapi.md +1 -1
  13. package/docs/{ninety.modalities.md → ninetymodalities.md} +87 -4
  14. package/docs/{planning.ninety.md → planningninety.md} +6 -6
  15. package/docs/{releasenotes.1.8.13.md → releasenotes1813.md} +2 -2
  16. package/docs/{releasenotes.1.8.14.md → releasenotes1814.md} +1 -1
  17. package/docs/{repo.synthesis.1.8.16.md → reposynthesis1816.md} +1 -1
  18. package/docs/todo.md +2 -2
  19. package/docs/{todo.1.8.15.md → todo1815.md} +1 -1
  20. package/docs/{todo.1.8.16.md → todo1816.md} +5 -5
  21. package/execution.ts +677 -0
  22. package/foundation.ts +314 -0
  23. package/index.ts +35 -27
  24. package/isolation.ts +84 -0
  25. package/modes.ts +170 -0
  26. package/mttg.config +1 -1
  27. package/orchestrator.ts +49 -15
  28. package/package.json +90 -75
  29. package/qemu.config +2 -2
  30. package/sandbox.ts +2094 -0
  31. package/scheduler.ts +1 -1
  32. package/server.ts +52 -0
  33. package/tsconfig.json +11 -12
  34. package/virtual.ts +1105 -0
  35. package/virtualgpu.ts +1 -1
  36. package/virtualization.ts +1 -1
  37. package/workloadlaw.ts +293 -0
  38. package/dist/App.d.ts +0 -5
  39. package/dist/App.js +0 -52
  40. package/dist/Sol/Sol.d.ts +0 -3
  41. package/dist/Sol/Sol.js +0 -46
  42. package/dist/Sol/agentbrowser/agentbrowser.d.ts +0 -9
  43. package/dist/Sol/agentbrowser/agentbrowser.js +0 -121
  44. package/dist/Sol/architecture/architecture.d.ts +0 -9
  45. package/dist/Sol/architecture/architecture.js +0 -93
  46. package/dist/Sol/compute/compute.d.ts +0 -9
  47. package/dist/Sol/compute/compute.js +0 -22
  48. package/dist/Sol/console/console.d.ts +0 -15
  49. package/dist/Sol/console/console.js +0 -292
  50. package/dist/Sol/dashboard/dashboard.d.ts +0 -10
  51. package/dist/Sol/dashboard/dashboard.js +0 -181
  52. package/dist/Sol/docs/docs.d.ts +0 -9
  53. package/dist/Sol/docs/docs.js +0 -28
  54. package/dist/Sol/home/home.d.ts +0 -35
  55. package/dist/Sol/home/home.js +0 -239
  56. package/dist/Sol/integrations/integrations.d.ts +0 -9
  57. package/dist/Sol/integrations/integrations.js +0 -83
  58. package/dist/Sol/intro/intro.d.ts +0 -7
  59. package/dist/Sol/intro/intro.js +0 -102
  60. package/dist/Sol/login/login.d.ts +0 -16
  61. package/dist/Sol/login/login.js +0 -49
  62. package/dist/Sol/notfound/notfound.d.ts +0 -9
  63. package/dist/Sol/notfound/notfound.js +0 -15
  64. package/dist/Sol/onboarding/onboarding.d.ts +0 -25
  65. package/dist/Sol/onboarding/onboarding.js +0 -60
  66. package/dist/Sol/playground/playground.d.ts +0 -9
  67. package/dist/Sol/playground/playground.js +0 -127
  68. package/dist/Sol/register/register.d.ts +0 -16
  69. package/dist/Sol/register/register.js +0 -193
  70. package/dist/Sol/shell/Shell.d.ts +0 -124
  71. package/dist/Sol/shell/Shell.js +0 -335
  72. package/dist/Sol/wingets/ComputeBootladder.d.ts +0 -6
  73. package/dist/Sol/wingets/ComputeBootladder.js +0 -71
  74. package/dist/Sol/wingets/ComputeModalitycatalog.d.ts +0 -7
  75. package/dist/Sol/wingets/ComputeModalitycatalog.js +0 -71
  76. package/dist/Sol/wingets/ConsoleApibadge.d.ts +0 -7
  77. package/dist/Sol/wingets/ConsoleApibadge.js +0 -5
  78. package/dist/Sol/wingets/ConsoleEdgelaw.d.ts +0 -6
  79. package/dist/Sol/wingets/ConsoleEdgelaw.js +0 -36
  80. package/dist/Sol/wingets/ConsoleEventstimeline.d.ts +0 -19
  81. package/dist/Sol/wingets/ConsoleEventstimeline.js +0 -12
  82. package/dist/Sol/wingets/ConsoleSnapshotcontrols.d.ts +0 -8
  83. package/dist/Sol/wingets/ConsoleSnapshotcontrols.js +0 -8
  84. package/dist/Sol/wingets/ConsoleSpecpanel.d.ts +0 -21
  85. package/dist/Sol/wingets/ConsoleSpecpanel.js +0 -75
  86. package/dist/Sol/wingets/ConsoleTerminal.d.ts +0 -22
  87. package/dist/Sol/wingets/ConsoleTerminal.js +0 -77
  88. package/dist/Sol/wingets/DashboardAccountpanel.d.ts +0 -18
  89. package/dist/Sol/wingets/DashboardAccountpanel.js +0 -65
  90. package/dist/Sol/wingets/DashboardAdminpanel.d.ts +0 -6
  91. package/dist/Sol/wingets/DashboardAdminpanel.js +0 -90
  92. package/dist/Sol/wingets/DashboardAuditlog.d.ts +0 -8
  93. package/dist/Sol/wingets/DashboardAuditlog.js +0 -50
  94. package/dist/Sol/wingets/DashboardCreatesandboxform.d.ts +0 -10
  95. package/dist/Sol/wingets/DashboardCreatesandboxform.js +0 -71
  96. package/dist/Sol/wingets/DashboardEventstimeline.d.ts +0 -8
  97. package/dist/Sol/wingets/DashboardEventstimeline.js +0 -83
  98. package/dist/Sol/wingets/DashboardGlobalsandboxestable.d.ts +0 -8
  99. package/dist/Sol/wingets/DashboardGlobalsandboxestable.js +0 -57
  100. package/dist/Sol/wingets/DashboardMeshnodestable.d.ts +0 -8
  101. package/dist/Sol/wingets/DashboardMeshnodestable.js +0 -103
  102. package/dist/Sol/wingets/DashboardSandboxlist.d.ts +0 -10
  103. package/dist/Sol/wingets/DashboardSandboxlist.js +0 -163
  104. package/dist/Sol/wingets/DashboardUserstable.d.ts +0 -8
  105. package/dist/Sol/wingets/DashboardUserstable.js +0 -78
  106. package/dist/Sol/wingets/HomeEntrygate.d.ts +0 -23
  107. package/dist/Sol/wingets/HomeEntrygate.js +0 -73
  108. package/dist/Sol/wingets/HomeMetricstrip.d.ts +0 -9
  109. package/dist/Sol/wingets/HomeMetricstrip.js +0 -4
  110. package/dist/Sol/wingets/HomeRuntimediagram.d.ts +0 -1
  111. package/dist/Sol/wingets/HomeRuntimediagram.js +0 -22
  112. package/dist/Sol/wingets/LoginForm.d.ts +0 -19
  113. package/dist/Sol/wingets/LoginForm.js +0 -141
  114. package/dist/Sol/wingets/RegisterPasswordconfirm.d.ts +0 -13
  115. package/dist/Sol/wingets/RegisterPasswordconfirm.js +0 -16
  116. package/dist/Sol/wingets/RegisterPasswordmeter.d.ts +0 -19
  117. package/dist/Sol/wingets/RegisterPasswordmeter.js +0 -65
  118. package/dist/Sol/wingets/RegisterUsernamerules.d.ts +0 -11
  119. package/dist/Sol/wingets/RegisterUsernamerules.js +0 -16
  120. package/dist/Sol/wingets/index.d.ts +0 -39
  121. package/dist/Sol/wingets/index.js +0 -39
  122. package/dist/alternatives.d.ts +0 -508
  123. package/dist/alternatives.js +0 -950
  124. package/dist/api.d.ts +0 -154
  125. package/dist/api.js +0 -174
  126. package/dist/auth.d.ts +0 -268
  127. package/dist/auth.js +0 -476
  128. package/dist/automation.d.ts +0 -425
  129. package/dist/automation.js +0 -566
  130. package/dist/browser.d.ts +0 -561
  131. package/dist/browser.js +0 -1058
  132. package/dist/capacitor.config.d.ts +0 -45
  133. package/dist/capacitor.config.js +0 -48
  134. package/dist/catalog.d.ts +0 -43
  135. package/dist/catalog.js +0 -44
  136. package/dist/cli.d.ts +0 -16
  137. package/dist/cli.js +0 -168
  138. package/dist/communication.d.ts +0 -181
  139. package/dist/communication.js +0 -376
  140. package/dist/compute.d.ts +0 -1160
  141. package/dist/compute.js +0 -2272
  142. package/dist/dashboardlib.d.ts +0 -58
  143. package/dist/dashboardlib.js +0 -161
  144. package/dist/db.d.ts +0 -569
  145. package/dist/db.js +0 -1080
  146. package/dist/distribution.d.ts +0 -528
  147. package/dist/distribution.js +0 -810
  148. package/dist/drizzle.config.d.ts +0 -20
  149. package/dist/drizzle.config.js +0 -18
  150. package/dist/edgelandes.d.ts +0 -70
  151. package/dist/edgelandes.host.d.ts +0 -26
  152. package/dist/edgelandes.host.js +0 -1089
  153. package/dist/edgelandes.inproc.d.ts +0 -27
  154. package/dist/edgelandes.inproc.js +0 -952
  155. package/dist/edgelandes.js +0 -1133
  156. package/dist/edgelandes.ninety.d.ts +0 -31
  157. package/dist/edgelandes.ninety.js +0 -174
  158. package/dist/edgelandes.virtual.d.ts +0 -25
  159. package/dist/edgelandes.virtual.js +0 -629
  160. package/dist/edgeplane.d.ts +0 -121
  161. package/dist/edgeplane.js +0 -341
  162. package/dist/examplelocaljob.d.ts +0 -1
  163. package/dist/examplelocaljob.js +0 -14
  164. package/dist/execution.d.ts +0 -529
  165. package/dist/execution.js +0 -760
  166. package/dist/family.d.ts +0 -16
  167. package/dist/family.js +0 -42
  168. package/dist/familyurl.d.ts +0 -21
  169. package/dist/familyurl.js +0 -24
  170. package/dist/format.d.ts +0 -18
  171. package/dist/format.js +0 -59
  172. package/dist/foundation.d.ts +0 -172
  173. package/dist/foundation.js +0 -312
  174. package/dist/index.d.ts +0 -735
  175. package/dist/index.js +0 -1020
  176. package/dist/integration.d.ts +0 -235
  177. package/dist/integration.js +0 -228
  178. package/dist/intelligence.d.ts +0 -93
  179. package/dist/intelligence.js +0 -144
  180. package/dist/isolation.d.ts +0 -128
  181. package/dist/isolation.js +0 -95
  182. package/dist/labels.d.ts +0 -665
  183. package/dist/labels.js +0 -707
  184. package/dist/localauth.d.ts +0 -127
  185. package/dist/localauth.js +0 -413
  186. package/dist/media.d.ts +0 -343
  187. package/dist/media.js +0 -985
  188. package/dist/mesh.d.ts +0 -177
  189. package/dist/mesh.js +0 -468
  190. package/dist/modalityregistry.d.ts +0 -109
  191. package/dist/modalityregistry.js +0 -1386
  192. package/dist/modes.d.ts +0 -358
  193. package/dist/modes.js +0 -133
  194. package/dist/onboardingstate.d.ts +0 -79
  195. package/dist/onboardingstate.js +0 -282
  196. package/dist/orchestrator.d.ts +0 -1338
  197. package/dist/orchestrator.js +0 -4310
  198. package/dist/packager/targetcli.js +0 -4
  199. package/dist/paths.d.ts +0 -2
  200. package/dist/paths.js +0 -14
  201. package/dist/performance.d.ts +0 -415
  202. package/dist/performance.js +0 -826
  203. package/dist/quantum.d.ts +0 -809
  204. package/dist/quantum.js +0 -2072
  205. package/dist/render.d.ts +0 -380
  206. package/dist/render.js +0 -1072
  207. package/dist/runall.d.ts +0 -2
  208. package/dist/runall.js +0 -39
  209. package/dist/runtimeprobe.d.ts +0 -4
  210. package/dist/runtimeprobe.js +0 -8
  211. package/dist/sandbox.d.ts +0 -355
  212. package/dist/sandbox.js +0 -1721
  213. package/dist/sandboxenvprofile.d.ts +0 -29
  214. package/dist/sandboxenvprofile.js +0 -89
  215. package/dist/sandboxprofile.d.ts +0 -137
  216. package/dist/sandboxprofile.js +0 -241
  217. package/dist/sandboxqueue.d.ts +0 -108
  218. package/dist/sandboxqueue.js +0 -201
  219. package/dist/sandboxquota.d.ts +0 -121
  220. package/dist/sandboxquota.js +0 -236
  221. package/dist/scheduler.d.ts +0 -595
  222. package/dist/scheduler.js +0 -1258
  223. package/dist/scriptlanes.d.ts +0 -182
  224. package/dist/scriptlanes.js +0 -660
  225. package/dist/scripts.buildengine.d.ts +0 -1
  226. package/dist/scripts.buildengine.js +0 -39
  227. package/dist/scripts.securitygate.d.ts +0 -1
  228. package/dist/scripts.securitygate.js +0 -68
  229. package/dist/scripts.validateflatnative.d.ts +0 -1
  230. package/dist/scripts.validateflatnative.js +0 -72
  231. package/dist/security.d.ts +0 -500
  232. package/dist/security.js +0 -1169
  233. package/dist/seedcatalog.d.ts +0 -13
  234. package/dist/seedcatalog.js +0 -46
  235. package/dist/server.d.ts +0 -20
  236. package/dist/server.js +0 -53
  237. package/dist/speccatalog.d.ts +0 -31
  238. package/dist/speccatalog.js +0 -163
  239. package/dist/tiers.d.ts +0 -1001
  240. package/dist/tiers.js +0 -2169
  241. package/dist/utils.d.ts +0 -2
  242. package/dist/utils.js +0 -5
  243. package/dist/vaulthandoff.d.ts +0 -141
  244. package/dist/vaulthandoff.js +0 -444
  245. package/dist/virtual.d.ts +0 -640
  246. package/dist/virtual.js +0 -1284
  247. package/dist/virtualcpu.d.ts +0 -315
  248. package/dist/virtualcpu.js +0 -1180
  249. package/dist/virtualgpu.d.ts +0 -344
  250. package/dist/virtualgpu.js +0 -1000
  251. package/dist/virtualization.d.ts +0 -606
  252. package/dist/virtualization.js +0 -1186
  253. package/dist/virtualmemory.d.ts +0 -817
  254. package/dist/virtualmemory.js +0 -1795
  255. package/dist/vite.config.d.ts +0 -3
  256. package/dist/vite.config.js +0 -48
  257. package/dist/vitest.config.d.ts +0 -2
  258. package/dist/vitest.config.js +0 -25
  259. package/dist/webserver.d.ts +0 -166
  260. package/dist/webserver.js +0 -2226
  261. package/dist/workloadlaw.d.ts +0 -133
  262. package/dist/workloadlaw.js +0 -193
  263. package/manifest.json +0 -20
  264. package/media.ts +0 -1337
  265. /package/docs/{architecture.1.8.19.md → architecture1819.md} +0 -0
  266. /package/docs/{architecture.1.8.19.mmd → architecture1819.mmd} +0 -0
  267. /package/docs/{artifactresearch.1.8.9.md → artifactresearch189.md} +0 -0
  268. /package/docs/{batches.1816.to.1820.md → batches1816to1820.md} +0 -0
  269. /package/docs/{brancharchive.2026.08.18.md → brancharchive20260818.md} +0 -0
  270. /package/docs/{containerplatforms.1.8.17.md → containerplatforms1817.md} +0 -0
  271. /package/docs/{e2ugh.engine.md → e2ughengine.md} +0 -0
  272. /package/docs/{flatbuildresearch.1.8.11.md → flatbuildresearch1811.md} +0 -0
  273. /package/docs/{licenseaudit.1.8.12.md → licenseaudit1812.md} +0 -0
  274. /package/docs/{mobileconversionresearch.1.8.10.md → mobileconversionresearch1810.md} +0 -0
  275. /package/docs/{nativeidentityresearch.1.8.11.md → nativeidentityresearch1811.md} +0 -0
  276. /package/docs/{native.wrappers.md → nativewrappers.md} +0 -0
  277. /package/docs/{planning.1.8.18.md → planning1818.md} +0 -0
  278. /package/docs/{planning.1.8.19.md → planning1819.md} +0 -0
  279. /package/docs/{planning.engine.md → planningengine.md} +0 -0
  280. /package/docs/{releasenotes.1.8.12.md → releasenotes1812.md} +0 -0
  281. /package/docs/{releasenotes.1.8.15.md → releasenotes1815.md} +0 -0
  282. /package/docs/{releasenotes.1.8.16.md → releasenotes1816.md} +0 -0
  283. /package/docs/{releasenotes.1.8.17.md → releasenotes1817.md} +0 -0
  284. /package/docs/{releasenotes.1.8.18.md → releasenotes1818.md} +0 -0
  285. /package/docs/{releasenotes.1.8.19.md → releasenotes1819.md} +0 -0
  286. /package/docs/{reorganization.1.8.8.md → reorganization188.md} +0 -0
  287. /package/docs/{reorganization.1.8.9.md → reorganization189.md} +0 -0
  288. /package/docs/{repo.analysis.1.8.21.json → repoanalysis1821.json} +0 -0
  289. /package/docs/{repo.candidates.1.8.21.jsonl → repocandidates1821.jsonl} +0 -0
  290. /package/docs/{repo.research.1.8.16.md → reporesearch1816.md} +0 -0
  291. /package/docs/{repo.research.1.8.21.md → reporesearch1821.md} +0 -0
  292. /package/docs/{repo.selected.1.8.21.json → reposelected1821.json} +0 -0
  293. /package/docs/{repo.synthesis.1.8.21.md → reposynthesis1821.md} +0 -0
  294. /package/docs/{research.1.8.18.isolation.md → research1818isolation.md} +0 -0
  295. /package/docs/{research.1.8.19.virtual.browser.md → research1819virtualbrowser.md} +0 -0
  296. /package/docs/{scanningresearch.1.8.11.md → scanningresearch1811.md} +0 -0
  297. /package/docs/{securityaudit.1.8.7.md → securityaudit187.md} +0 -0
  298. /package/docs/{securityreferences.1.8.11.md → securityreferences1811.md} +0 -0
  299. /package/docs/{securityresearch.1.8.11.md → securityresearch1811.md} +0 -0
  300. /package/docs/{signingresearch.1.8.12.md → signingresearch1812.md} +0 -0
  301. /package/docs/{tauri.glib.risk.1.8.11.md → tauriglibrisk1811.md} +0 -0
  302. /package/docs/{todo.1.8.18.md → todo1818.md} +0 -0
  303. /package/docs/{todo.1.8.19.md → todo1819.md} +0 -0
  304. /package/docs/{toolchainresearch.1.8.9.md → toolchainresearch189.md} +0 -0
  305. /package/docs/{web.duplicatecleanup.md → webduplicatecleanup.md} +0 -0
  306. /package/docs/{web.ideas.md → webideas.md} +0 -0
  307. /package/docs/{workflowimprovements.2026.08.19.md → workflowimprovements20260819.md} +0 -0
package/modes.ts ADDED
@@ -0,0 +1,170 @@
1
+ /**
2
+ * modes.ts — target mode resolution and host-neutral deployment contracts.
3
+ *
4
+ * This file is the v2.0.0 grand-merge consolidation of the former nested
5
+ * folders of the repository (modes) into the single
6
+ * root-level domain file of the saddle family standard: one optimized
7
+ * TypeScript file per correlated domain, ordinal sections, JSDoc on every
8
+ * block, intra-domain imports dissolved, cross-domain imports rewritten to
9
+ * ./<domain>.js. Every capability of every source file is preserved here;
10
+ * the pure re-export barrels (none in this domain) folded their surface into this file directly.
11
+ */
12
+
13
+
14
+
15
+ /* ════════════════════════════════════════════════════════════════════ */
16
+ /* Section 1: modes/modes.ts — mode profiles describe paired operation surfaces without changing engine contracts. */
17
+ /* ════════════════════════════════════════════════════════════════════ */
18
+ /**
19
+ * mode profiles describe paired operation surfaces without changing engine contracts.
20
+ */
21
+ const names = ["computer", "library", "application", "browser", "desktop", "mobile", "extension", "cli", "binary", "internet", "physicalfile", "vectorfile", "visible", "headless"];
22
+
23
+ export function modeprofile(options = {}) {
24
+ const enabled = new Set(options.enabled ?? ["library", "cli", "binary"]);
25
+ return Object.fromEntries(names.map((name) => [name, { name, enabled: enabled.has(name), paired: Boolean(options.paired?.includes(name)) }]));
26
+ }
27
+
28
+ export function librarymode(factory) { return { name: "library", start: factory, stop: async () => undefined }; }
29
+ export function climode(run) { return { name: "cli", run }; }
30
+ export function binarymode(run) { return { name: "binary", run }; }
31
+ export function browsermode(adapter) { return { name: "browser", adapter }; }
32
+ export function headlessmode(adapter) { return { name: "headless", adapter }; }
33
+ export function computemode(adapter) { return { name: "computer", adapter }; }
34
+
35
+ /* ════════════════════════════════════════════════════════════════════ */
36
+ /* Section 2: modes/matrix.ts — mode matrix keeps supported execution choices in one grouped contract. */
37
+ /* ════════════════════════════════════════════════════════════════════ */
38
+ /**
39
+ * mode matrix keeps supported execution choices in one grouped contract.
40
+ */
41
+ export const modeaxes = Object.freeze({
42
+ execution: ["library", "application", "browser", "desktopapp", "mobileapp", "extension", "cli", "binary", "computer", "internet"],
43
+ runtime: ["node", "browser", "deno", "bun", "worker", "unknown"],
44
+ memory: ["internal", "external", "physical", "vectorized", "library"],
45
+ file: ["internal", "external", "physical", "vector"],
46
+ dependency: ["internal", "external", "dev"],
47
+ visibility: ["visible", "headless"],
48
+ pair: ["without", "with"]
49
+ });
50
+
51
+ export const operationmodes = Object.freeze(modeaxes.execution.flatMap((execution) => modeaxes.pair.map((pair) => `${execution}${pair}`)));
52
+
53
+ /** Returns true when the matrix contains the requested axis value. */
54
+ export function validatemode(axis, value) { return Boolean(modeaxes[axis]?.includes(value)); }
55
+
56
+ /** Returns a serializable snapshot for documentation and diagnostics. */
57
+ export function modecatalog() { return { axes: Object.fromEntries(Object.entries(modeaxes).map(([key, values]) => [key, [...values]])), operationmodes: [...operationmodes] }; }
58
+
59
+ /* ════════════════════════════════════════════════════════════════════ */
60
+ /* Section 3: modes/resolve.ts — mode resolver selects open defaults while preserving every caller choice. */
61
+ /* ════════════════════════════════════════════════════════════════════ */
62
+ /**
63
+ * mode resolver selects open defaults while preserving every caller choice.
64
+ */
65
+
66
+ /** Resolves an execution profile without starting a process or opening a socket. */
67
+ export function resolvemode(options = {}) {
68
+ const profile = {
69
+ execution: options.execution ?? "library",
70
+ runtime: options.runtime ?? "unknown",
71
+ memory: options.memory ?? "internal",
72
+ file: options.file ?? "internal",
73
+ dependency: options.dependency ?? "internal",
74
+ visibility: options.visibility ?? "headless",
75
+ pair: options.pair ?? "without"
76
+ };
77
+ for (const [axis, value] of Object.entries(profile)) if (!validatemode(axis, value)) throw new TypeError(`unsupported mode ${axis}:${value}`);
78
+ return { ...profile, capabilities: modecapabilities(profile) };
79
+ }
80
+
81
+ /** Returns stable capabilities for adapters and diagnostics. */
82
+ export function modecapabilities(profile) {
83
+ return {
84
+ library: profile.execution === "library" || profile.execution === "application",
85
+ browser: profile.execution === "browser" || profile.execution === "extension" || profile.runtime === "browser" || profile.runtime === "worker",
86
+ cli: profile.execution === "cli" || profile.execution === "binary",
87
+ physicalmemory: profile.memory === "physical",
88
+ vectorizedmemory: profile.memory === "vectorized",
89
+ externalmemory: profile.memory === "external",
90
+ externalfile: profile.file === "external",
91
+ externaldependency: profile.dependency === "external",
92
+ visible: profile.visibility === "visible"
93
+ };
94
+ }
95
+
96
+ /** Returns a stable cross-runtime capability report without starting infrastructure. */
97
+ export function capabilityreport(options = {}) {
98
+ const overrides = { runtime: options.runtime ?? "unknown", memory: options.memory ?? "internal", file: options.file ?? "internal", dependency: options.dependency ?? "internal", visibility: options.visibility ?? "headless", pair: options.pair ?? "without" };
99
+ const profiles = modeaxes.execution.map((execution) => {
100
+ const profile = resolvemode({ ...overrides, execution });
101
+ return { mode: execution, capabilities: profile.capabilities, profile };
102
+ });
103
+ return { version: 1, axes: Object.fromEntries(Object.entries(modeaxes).map(([key, values]) => [key, [...values]])), overrides, profiles, infrastructure: { host: "caller-owned", port: "caller-owned", credentials: "caller-owned", provider: "caller-owned" } };
104
+ }
105
+
106
+ /** Applies one profile to a caller supplied operation. */
107
+ export async function withmode(options, operation) { if (typeof operation !== "function") throw new TypeError("mode operation is required"); return operation(resolvemode(options)); }
108
+
109
+
110
+ /* ════════════════════════════════════════════════════════════════════ */
111
+ /* Section 4: modes/deploy.ts — deploy surface exposes artifact planning without performing provider mutations. */
112
+ /* ════════════════════════════════════════════════════════════════════ */
113
+ /**
114
+ * deploy surface exposes artifact planning without performing provider mutations.
115
+ */
116
+ export { publishplan, registrymanifest } from "./distribution.ts";
117
+ /* the packaging surface pair (surfacemanifest, surfacebundle) moved to
118
+ * devthink with the automation domain (the saddle ownership law, wave a,
119
+ * actions 108-112 — the deploy surface keeps the artifact planning pair
120
+ * the engine owns). */
121
+
122
+ /* ════════════════════════════════════════════════════════════════════ */
123
+ /* Section 5: modes/targets.ts — target profiles keep platform packaging open and describe capability boundaries. */
124
+ /* ════════════════════════════════════════════════════════════════════ */
125
+ /**
126
+ * target profiles keep platform packaging open and describe capability boundaries.
127
+ */
128
+ export const targetprofiles = Object.freeze({
129
+ application: { runtime: "caller", entry: "distpackage/index.js", capabilities: ["memory", "storage", "network"], formats: ["zip", "tarball"] },
130
+ computer: { runtime: "node", entry: "distpackage/index.js", capabilities: ["memory", "storage", "runner"], formats: ["node", "bun", "deno", "singlefile"] },
131
+ desktopapp: { runtime: "tauri", entry: "desktop/src-tauri", capabilities: ["memory", "file", "visible"], formats: ["appimage", "deb", "rpm", "snap", "flatpak", "dmg", "pkg", "exe", "msi", "msix"] },
132
+ mobileapp: { runtime: "capacitor", entry: "index.html", capabilities: ["memory", "network", "visible"], formats: ["apk", "aab", "ipa"] },
133
+ android: { runtime: "capacitor", entry: "android", capabilities: ["memory", "network", "visible"], formats: ["apk", "aab"] },
134
+ ios: { runtime: "capacitor", entry: "ios", capabilities: ["memory", "network", "visible"], formats: ["ipa"] },
135
+ cli: { runtime: "node", entry: "distpackage/cli/main.js", capabilities: ["memory", "storage", "network"], formats: ["node", "bun", "deno", "singlefile", "exe", "deb", "rpm"] },
136
+ binary: { runtime: "caller", entry: "distpackage/cli/main.js", capabilities: ["memory", "storage", "runner"], formats: ["sea", "singlefile", "wasm"] },
137
+ browser: { runtime: "tauri", entry: "desktop/src-tauri", capabilities: ["memory", "network", "visible"], formats: ["html", "pwa", "wasm", "appimage", "deb", "rpm", "dmg", "exe", "msi"] },
138
+ extension: { runtime: "browser", entry: "distpackage/extension/index.js", capabilities: ["browser", "network", "visible"], formats: ["crx", "xpi", "safariextz"] },
139
+ internet: { runtime: "caller", entry: "distpackage/index.js", capabilities: ["network", "webhook", "api"], formats: ["http", "websocket", "grpc", "rest"] },
140
+ web: { runtime: "browser", entry: "index.html", capabilities: ["network", "visible"], formats: ["html", "pwa", "ssg", "ssr", "wasm"] },
141
+ libreoffice: { runtime: "caller", entry: "distpackage/index.js", capabilities: ["file", "network"], formats: ["oxt", "zip"] },
142
+ mcp: { runtime: "caller", entry: "distpackage/adapters/mcpserver.js", capabilities: ["network", "api"], formats: ["stdio", "jsonrpc"] },
143
+ vsix: { runtime: "caller", entry: "distpackage/index.js", capabilities: ["network", "visible"], formats: ["vsix"] },
144
+ container: { runtime: "node", entry: "distpackage/index.js", capabilities: ["memory", "storage", "network"], formats: ["oci", "docker"] }
145
+ });
146
+
147
+ /** Creates a surface target with caller supplied entry and capabilities. */
148
+ export function targetmanifest(target, options = {}) { const profile = targetprofiles[target]; if (!profile) throw new TypeError(`unsupported target: ${target}`); return { target, runtime: options.runtime ?? profile.runtime, entry: options.entry ?? profile.entry, formats: options.formats ?? [...profile.formats], capabilities: options.capabilities ?? [...profile.capabilities], permissions: options.permissions ?? [], metadata: options.metadata ?? {} }; }
149
+
150
+ /** Returns all supported target profiles for documentation and tooling. */
151
+ export function targetcatalog() { return Object.fromEntries(Object.entries(targetprofiles).map(([key, value]) => [key, { ...value, capabilities: [...value.capabilities] }])); }
152
+
153
+
154
+ /* ════════════════════════════════════════════════════════════════════ */
155
+ /* Section 6: the runner-mode ladder — the runtime targets a run asks */
156
+ /* the engine for (wave 3, the engine ownership law: forge and foundry */
157
+ /* consumed the five targets as duplicated twin lists; the ladder */
158
+ /* answers from the saddle owner from this day on, and the apps import */
159
+ /* it through the published library specifier). Zero logic change to */
160
+ /* the lanes above — the section is additive and imports nothing. */
161
+ /* ════════════════════════════════════════════════════════════════════ */
162
+ /**
163
+ * the runner modes of the engine: the runtime targets a run asks for on
164
+ * the saddle boundary — the full virtual machine, the runner host, the
165
+ * node packages lane, the docker lane and the ghcr immutable lane.
166
+ */
167
+ export const runnermodes = ["full-virtual", "runner", "node-packages", "docker", "ghcr"] as const;
168
+
169
+ /** one runner mode of the engine (the runtime target a run asks for). */
170
+ export type RunnerMode = (typeof runnermodes)[number];
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.127",
5
+ "version": "2.0.154",
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
@@ -68,8 +68,8 @@ import { cpus, freemem, networkInterfaces, tmpdir, totalmem } from 'node:os';
68
68
  import path from 'node:path';
69
69
  import process from 'node:process';
70
70
  import { setTimeout as sleep } from 'node:timers/promises';
71
- import type { enginetopicname, enginetopics } from './index.js';
72
- import { enginebus, MetricsStore } from './index.js';
71
+ import type { enginetopicname, enginetopics } from './index.ts';
72
+ import { enginebus, MetricsStore } from './index.ts';
73
73
 
74
74
  /* ------------------------------------------------------------------ */
75
75
  /* context: runtime catalog (verified 2026-08-22) */
@@ -1279,8 +1279,12 @@ class firecrackerruntime extends runtimestrategy {
1279
1279
  * the class also absorbs spawnqemu from the Meta source: the vm plane
1280
1280
  * launches qemu with monitor and qmp unix sockets, a numa pin line,
1281
1281
  * vfio devices for every gpu assignment, extra args from qemu.config
1282
- * and, when the binary is absent (CI), a "sleep 3600" stand-in process
1283
- * so scheduling and lifecycle still exercise end to end.
1282
+ * and — the honest-boot law of the engine-real rung — when the qemu
1283
+ * binary is absent the spawn refuses with ERR_QEMU_ABSENT (the error
1284
+ * names the binary the host must carry) so a vm record never claims
1285
+ * running over a stand-in process: scheduling and lifecycle still
1286
+ * exercise end to end in CI through the argv builders and the create /
1287
+ * destroy planes, never through a faked boot.
1284
1288
  */
1285
1289
  class qemuruntime extends runtimestrategy {
1286
1290
  override readonly name: sandboxruntime = 'qemu';
@@ -1346,13 +1350,24 @@ class qemuruntime extends runtimestrategy {
1346
1350
 
1347
1351
  /**
1348
1352
  * builds the vm plane argv: strategy flags plus the name/uuid, dual
1349
- * unix sockets, virtio balloon, the per-numa bridge netdev, the numa
1350
- * pin line and one vfio-pci device per assigned gpu.
1353
+ * unix sockets, virtio balloon, the numa pin line and one vfio-pci
1354
+ * device per assigned gpu. the netdev answers the honest network law:
1355
+ * the per-numa bridge (br-vhe-N) rides when the interface exists on
1356
+ * the host (the privileged deployments the bridge plane owns), and a
1357
+ * host without the interface rides user-mode networking (slirp) — a
1358
+ * real qemu network mode that needs no privilege — so the argv a host
1359
+ * without the bridge answers is a bootable argv, never a bridge the
1360
+ * kernel would refuse.
1351
1361
  */
1352
1362
  buildvmcommand(vm: vmrecord, assignments: readonly gpuassignment[]): readonly string[] {
1353
1363
  const kvm = kvmavailable();
1354
1364
  const accel = vm.accel === 'kvm' && kvm ? 'kvm' : 'tcg,thread=multi,tb-size=1024';
1355
1365
  const sockets = this.socketsfor(vm.id);
1366
+ const bridgename = `br-vhe-${vm.numanode}`;
1367
+ const bridgeonhost = existsSync(`/sys/class/net/${bridgename}`);
1368
+ const netdev = bridgeonhost
1369
+ ? `bridge,br=${bridgename},id=net0`
1370
+ : 'user,id=net0';
1356
1371
  const args: string[] = [
1357
1372
  vm.qemubinary,
1358
1373
  '-machine',
@@ -1372,7 +1387,7 @@ class qemuruntime extends runtimestrategy {
1372
1387
  '-device',
1373
1388
  'virtio-balloon-pci,id=balloon0',
1374
1389
  '-netdev',
1375
- `bridge,br=br-vhe-${vm.numanode},id=net0`,
1390
+ netdev,
1376
1391
  '-device',
1377
1392
  'virtio-net-pci,netdev=net0',
1378
1393
  '-display',
@@ -1394,8 +1409,12 @@ class qemuruntime extends runtimestrategy {
1394
1409
 
1395
1410
  /**
1396
1411
  * spawns qemu for a vm record; when the binary does not exist the
1397
- * method spawns "sleep 3600" instead so CI environments without qemu
1398
- * still run the scheduling and lifecycle paths (spawnqemu merge).
1412
+ * method refuses with ERR_QEMU_ABSENT — the honest-boot law of the
1413
+ * engine-real rung: a host without the qemu binary never answers a
1414
+ * stand-in process, the vm record never claims running over a sleep
1415
+ * (startvm catches the refusal, marks the vm failed and publishes the
1416
+ * error, so CI exercises the argv builders and the create / destroy
1417
+ * planes instead of a faked boot).
1399
1418
  */
1400
1419
  async spawn(
1401
1420
  vm: vmrecord,
@@ -1404,14 +1423,23 @@ class qemuruntime extends runtimestrategy {
1404
1423
  ): Promise<qemuprocess> {
1405
1424
  try {
1406
1425
  const sockets = this.socketsfor(vm.id);
1407
- const argv = [...this.buildvmcommand(vm, assignments), '-daemonize'];
1426
+ // the socket seats must exist before the guest opens its servers —
1427
+ // qemu creates the socket files itself, never the parent directory
1428
+ mkdirSync(path.dirname(sockets.qmp), { recursive: true });
1429
+ // the foreground law of the honest-boot rung: the tracked child is
1430
+ // the process that lives as long as the vm — the daemonize flag
1431
+ // would fork the daemon and exit the parent at once (the vm would
1432
+ // read stopped over a live machine), so the spawn rides the
1433
+ // foreground argv the exit callback can own
1434
+ const argv = this.buildvmcommand(vm, assignments);
1408
1435
  const [bin, ...rest] = argv;
1409
- let child: ChildProcess;
1410
- if (existsSync(bin)) {
1411
- child = spawn(bin, rest, { stdio: 'ignore', detached: false });
1412
- } else {
1413
- child = spawn('sleep', ['3600'], { stdio: 'ignore', detached: false });
1436
+ if (!existsSync(bin)) {
1437
+ throw new orchestratorerror(
1438
+ `qemu spawn refused for ${vm.id}: the binary ${bin} is absent from the engine host (the honest-boot law — a vm never runs over a stand-in process)`,
1439
+ 'ERR_QEMU_ABSENT',
1440
+ );
1414
1441
  }
1442
+ const child: ChildProcess = spawn(bin, rest, { stdio: 'ignore', detached: false });
1415
1443
  const pid = child.pid ?? randomInt(1000, 11000);
1416
1444
  const processinfo: qemuprocess = {
1417
1445
  vmid: vm.id,
@@ -1426,6 +1454,12 @@ class qemuruntime extends runtimestrategy {
1426
1454
  });
1427
1455
  return processinfo;
1428
1456
  } catch (error) {
1457
+ // the honest-boot refusal rides through untouched — the code the
1458
+ // law answers (ERR_QEMU_ABSENT) is the code startvm and the vm
1459
+ // record read, never the generic spawn wrap
1460
+ if (error instanceof orchestratorerror) {
1461
+ throw error;
1462
+ }
1429
1463
  throw new orchestratorerror(
1430
1464
  `qemu spawn failed for ${vm.id}: ${errormessage(error)}`,
1431
1465
  'ERR_QEMU_SPAWN',
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@wenathlan/saddle",
3
- "version": "2.0.154",
3
+ "version": "2.0.155",
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,
7
7
  "license": "GPL-3.0-only",
8
8
  "author": "Wenathlan",
9
9
  "sideEffects": false,
10
- "main": "./dist/index.js",
11
- "module": "./dist/index.js",
12
- "browser": "./dist/index.js",
13
- "types": "./dist/index.d.ts",
14
- "packageManager": "npm@12.0.2",
10
+ "main": "./index.ts",
11
+ "module": "./index.ts",
12
+ "browser": "./index.ts",
13
+ "types": "./index.ts",
14
+ "packageManager": "pnpm@12.3.4",
15
15
  "publishConfig": {
16
16
  "access": "public"
17
17
  },
@@ -53,7 +53,6 @@
53
53
  "virtual gpu",
54
54
  "runner",
55
55
  "storage",
56
- "automation",
57
56
  "llvmpipe",
58
57
  "lavapipe",
59
58
  "rusticl",
@@ -65,18 +64,25 @@
65
64
  "engines": {
66
65
  "bare": "^1.18.0",
67
66
  "bun": "^1.4.2",
67
+ "cargo": ">=1.85.0",
68
68
  "chrome": "^16.0.912",
69
69
  "cnpm": "^9.4.0",
70
70
  "corepack": "^0.35.0",
71
71
  "deno": "^2.9.5",
72
+ "dotnet": ">=8.0.0",
72
73
  "ecmascript": "^5.0.0",
73
74
  "firefox": ">=0.8.0",
75
+ "go": ">=1.24.0",
74
76
  "iojs": "^1.0.0",
77
+ "java": ">=17",
75
78
  "node": ">=26.13.0 <27",
76
79
  "npm": "^12.1.0",
77
80
  "pnpm": "^12.6.0",
81
+ "python": ">=3.11.0",
82
+ "rust": ">=1.85.0",
78
83
  "teleport": ">=0.2.0",
79
84
  "typescript": "^5.8.0",
85
+ "v": "^0.5.2",
80
86
  "vscode": "^1.118.0",
81
87
  "yarn": "^4.17.1"
82
88
  },
@@ -89,45 +95,42 @@
89
95
  }
90
96
  },
91
97
  "bin": {
92
- "saddle": "./dist/cli.js"
98
+ "saddle": "./cli.ts"
93
99
  },
94
100
  "exports": {
95
- ".": "./dist/index.js",
96
- "./memory": "./dist/virtual.js",
97
- "./memory-node": "./dist/virtual.js",
98
- "./memory-engine": "./dist/virtual.js",
99
- "./memory-plan": "./dist/virtual.js",
100
- "./storage": "./dist/virtual.js",
101
- "./storage-pool": "./dist/virtual.js",
102
- "./storage-node": "./dist/virtual.js",
103
- "./runners": "./dist/execution.js",
104
- "./provider-chain": "./dist/execution.js",
105
- "./sessions": "./dist/foundation.js",
106
- "./modes": "./dist/modes.js",
107
- "./mode": "./dist/modes.js",
108
- "./sandbox": "./dist/sandbox.js",
109
- "./modalities": "./dist/modalityregistry.js",
110
- "./workloadlaw": "./dist/workloadlaw.js",
111
- "./browser": "./dist/browser.js",
112
- "./browser-playwright": "./dist/browser.js",
113
- "./bot": "./dist/automation.js",
114
- "./deploy": "./dist/modes.js",
115
- "./extension": "./dist/browser.js",
116
- "./server-node": "./dist/server.js",
117
- "./sessions-file": "./dist/execution.js",
118
- "./sessions-store": "./dist/execution.js",
119
- "./queue-persistent": "./dist/execution.js",
120
- "./hash": "./dist/foundation.js",
121
- "./release-assets": "./dist/distribution.js",
122
- "./release-verify": "./dist/distribution.js",
123
- "./release-evidence": "./dist/distribution.js",
124
- "./delivery": "./dist/distribution.js",
125
- "./surface-requirements": "./dist/automation.js",
126
- "./worker": "./dist/execution.js",
127
- "./binary-archive": "./dist/distribution.js",
128
- "./binary-transform": "./dist/distribution.js",
129
- "./isolation": "./dist/isolation.js",
130
- "./virtual-browser": "./dist/browser.js",
101
+ ".": "./index.ts",
102
+ "./memory": "./virtual.ts",
103
+ "./memory-node": "./virtual.ts",
104
+ "./memory-engine": "./virtual.ts",
105
+ "./memory-plan": "./virtual.ts",
106
+ "./storage": "./virtual.ts",
107
+ "./storage-pool": "./virtual.ts",
108
+ "./storage-node": "./virtual.ts",
109
+ "./runners": "./execution.ts",
110
+ "./provider-chain": "./execution.ts",
111
+ "./sessions": "./foundation.ts",
112
+ "./modes": "./modes.ts",
113
+ "./mode": "./modes.ts",
114
+ "./sandbox": "./sandbox.ts",
115
+ "./modalities": "./modalityregistry.ts",
116
+ "./workloadlaw": "./workloadlaw.ts",
117
+ "./browser": "./browser.ts",
118
+ "./browser-playwright": "./browser.ts",
119
+ "./deploy": "./modes.ts",
120
+ "./server-node": "./server.ts",
121
+ "./sessions-file": "./execution.ts",
122
+ "./sessions-store": "./execution.ts",
123
+ "./queue-persistent": "./execution.ts",
124
+ "./hash": "./foundation.ts",
125
+ "./release-assets": "./distribution.ts",
126
+ "./release-verify": "./distribution.ts",
127
+ "./release-evidence": "./distribution.ts",
128
+ "./delivery": "./distribution.ts",
129
+ "./worker": "./execution.ts",
130
+ "./binary-archive": "./distribution.ts",
131
+ "./binary-transform": "./distribution.ts",
132
+ "./isolation": "./isolation.ts",
133
+ "./virtual-browser": "./browser.ts",
131
134
  "./virtualcpu": "./virtualcpu.ts",
132
135
  "./virtualmemory": "./virtualmemory.ts",
133
136
  "./virtualgpu": "./virtualgpu.ts",
@@ -136,7 +139,6 @@
136
139
  "./virtualization": "./virtualization.ts",
137
140
  "./scheduler": "./scheduler.ts",
138
141
  "./compute": "./compute.ts",
139
- "./media": "./media.ts",
140
142
  "./security": "./security.ts",
141
143
  "./performance": "./performance.ts",
142
144
  "./alternatives": "./alternatives.ts",
@@ -154,16 +156,25 @@
154
156
  "./quantum": "./quantum.ts"
155
157
  },
156
158
  "files": [
157
- "dist",
158
- "manifest.json",
159
+ "index.ts",
160
+ "virtual.ts",
161
+ "execution.ts",
162
+ "foundation.ts",
163
+ "modes.ts",
164
+ "sandbox.ts",
165
+ "modalityregistry.ts",
166
+ "workloadlaw.ts",
167
+ "browser.ts",
168
+ "server.ts",
169
+ "distribution.ts",
170
+ "isolation.ts",
171
+ "cli.ts",
159
172
  "docs",
160
173
  "README.md",
161
174
  "LICENSE",
162
- "index.ts",
163
175
  "orchestrator.ts",
164
176
  "scheduler.ts",
165
177
  "compute.ts",
166
- "media.ts",
167
178
  "virtualcpu.ts",
168
179
  "virtualmemory.ts",
169
180
  "virtualgpu.ts",
@@ -189,33 +200,31 @@
189
200
  "Dockerfile",
190
201
  "tsconfig.json",
191
202
  "biome.jsonc",
192
- "modalityregistry.ts",
193
203
  "tiers.ts",
194
204
  "quantum.ts"
195
205
  ],
196
206
  "scripts": {
197
- "build:engine": "node scripts.buildengine.ts",
198
- "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",
207
+ "build:engine": "node scriptsbuildengine.ts",
208
+ "check": "tsc -p tsconfig.json --noEmit",
199
209
  "formatcheck": "node --import tsx format.ts",
200
210
  "test": "vitest run",
201
- "run": "npm run build:engine && node dist/cli.js",
202
- "extension:build": "npm run build:engine && node dist/browser.js",
203
- "release:assets": "npm run build:engine && node dist/distribution.js",
204
- "release:verify": "npm run build:engine && node dist/distribution.js verify",
205
- "target:manifest": "npm run build:engine && node dist/distribution.js target",
211
+ "run": "npm run build:engine && node --import tsx ./cli.ts",
212
+ "release:assets": "npm run build:engine && node --import tsx ./distribution.ts",
213
+ "release:verify": "npm run build:engine && node --import tsx ./distribution.ts verify",
214
+ "target:manifest": "npm run build:engine && node --import tsx ./distribution.ts target",
206
215
  "pack:check": "npm run check && npm run formatcheck && npm test && npm pack --dry-run",
207
216
  "prepublishOnly": "npm run pack:check",
208
217
  "tauri": "npx --yes @tauri-apps/cli@2.11.4",
209
218
  "capacitor:sync:android": "npm run web:build:pages && cap sync android",
210
219
  "capacitor:sync:ios": "npm run web:build:pages && cap sync ios",
211
- "native:check:flat": "node scripts.validateflatnative.ts",
220
+ "native:check:flat": "node scriptsvalidateflatnative.ts",
212
221
  "web:dev": "vite --host",
213
222
  "web:check": "npm run build:engine && tsc --project tsconfig.json --noEmit",
214
223
  "web:build": "vite build",
215
224
  "web:build:pages": "vite build",
216
225
  "web:preview": "vite preview --host",
217
226
  "build": "npm run build:engine",
218
- "build:tsc": "tsc -p tsconfig.json --noEmitOnError false",
227
+ "build:tsc": "tsc -p tsconfig.json --noEmit",
219
228
  "start": "node --import tsx ./cli.ts plan",
220
229
  "dev": "node --import tsx --watch ./cli.ts",
221
230
  "web": "node webserver.ts",
@@ -238,13 +247,13 @@
238
247
  "vm:create": "node --import tsx ./cli.ts vm",
239
248
  "vm:validate": "node --import tsx ./cli.ts vmlint",
240
249
  "gpu:list": "node --import tsx ./cli.ts gpus",
241
- "docker:build": "docker build -f Dockerfile -t saddle:2.0.154 .",
242
- "docker:run": "docker run --rm --memory-swap=-1 --shm-size=2g saddle:2.0.154",
243
- "docker:health": "docker run --rm saddle:2.0.154 qemu-system-x86_64 --version && curl -fsS http://localhost:8080/health || true",
250
+ "docker:build": "docker build -f Dockerfile -t saddle:2.0.155 .",
251
+ "docker:run": "docker run --rm --memory-swap=-1 --shm-size=2g saddle:2.0.155",
252
+ "docker:health": "docker run --rm saddle:2.0.155 qemu-system-x86_64 --version && curl -fsS http://localhost:8080/health || true",
244
253
  "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'",
245
254
  "py:bridge": "python3 qemubridge.py",
246
255
  "py:test": "python3 -m pytest -q || python3 qemubridge.py",
247
- "clean": "rm -rf dist coverage .biome __pycache__",
256
+ "clean": "rm -rf distpackage coverage .biome __pycache__",
248
257
  "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'",
249
258
  "start:engine": "node --import tsx ./cli.ts plan"
250
259
  },
@@ -259,12 +268,18 @@
259
268
  "@libsql/client": "^0.18.0",
260
269
  "@prisma/adapter-libsql": "^7.10.1",
261
270
  "@prisma/client": "^7.10.1",
262
- "@wenathlan/saddle": "^2.1.6",
263
- "@wenathlan/vault": "^2.0.153",
271
+ "@wenathlan/cadria": "^2.0.154",
272
+ "@wenathlan/debonair": "^2.0.154",
273
+ "@wenathlan/devthink": "^2.0.154",
274
+ "@wenathlan/getry": "^2.0.154",
275
+ "@wenathlan/saddle": "^2.0.154",
276
+ "@wenathlan/vault": "^2.0.154",
277
+ "better-sqlite3": "^13.0.3",
278
+ "drizzle-orm": "^0.45.4",
264
279
  "gsap": "^3.15.0",
265
280
  "hono": "^4.13.16",
266
281
  "ink": "^7.1.1",
267
- "lucide-react": "^1.66.0",
282
+ "lucide-react": "^1.67.0",
268
283
  "motion": "^12.43.0",
269
284
  "react": "^19.3.1",
270
285
  "react-devtools-core": "^8.0.0",
@@ -310,9 +325,9 @@
310
325
  "@radix-ui/react-toggle": "^1.2.1",
311
326
  "@radix-ui/react-toggle-group": "^1.2.1",
312
327
  "@radix-ui/react-tooltip": "^1.4.1",
313
- "@tailwindcss/postcss": "^4.3.3",
328
+ "@tailwindcss/postcss": "^4.3.4",
314
329
  "@tailwindcss/typography": "^0.5.20",
315
- "@tailwindcss/vite": "^4.3.3",
330
+ "@tailwindcss/vite": "^4.3.4",
316
331
  "@tsconfig/node26": "^26.0.1",
317
332
  "@types/better-sqlite3": "^9.6.0",
318
333
  "@types/three": "^0.187.0",
@@ -322,7 +337,7 @@
322
337
  "@types/node": "^26.6.6",
323
338
  "@types/react": "^19.3.0",
324
339
  "@types/react-dom": "^19.3.0",
325
- "@vitejs/plugin-react": "^6.1.2",
340
+ "@vitejs/plugin-react": "^6.2.1",
326
341
  "add": "^2.0.9",
327
342
  "autoprefixer": "^10.6.2",
328
343
  "axios": "^1.21.0",
@@ -343,7 +358,7 @@
343
358
  "hono": "^4.13.16",
344
359
  "input-otp": "^1.5.0",
345
360
  "jsdom": "26.1.0",
346
- "lucide-react": "^1.66.0",
361
+ "lucide-react": "^1.67.0",
347
362
  "mysql2": "^3.24.6",
348
363
  "nanoid": "^6.0.2",
349
364
  "next-themes": "^0.4.6",
@@ -358,12 +373,12 @@
358
373
  "react-day-picker": "^10.0.2",
359
374
  "react-dom": "^19.3.1",
360
375
  "react-hook-form": "^7.91.0",
361
- "react-resizable-panels": "^4.16.1",
376
+ "react-resizable-panels": "^4.18.0",
362
377
  "recharts": "^3.10.1",
363
378
  "sonner": "^2.0.8",
364
379
  "streamdown": "^2.7.1",
365
380
  "tailwind-merge": "^3.7.0",
366
- "tailwindcss": "^4.3.3",
381
+ "tailwindcss": "^4.3.4",
367
382
  "tailwindcss-animate": "^1.0.7",
368
383
  "tsup": "^8.5.1",
369
384
  "tsx": "^4.23.15",
@@ -372,9 +387,9 @@
372
387
  "vaul": "^1.1.2",
373
388
  "vite": "^8.3.5",
374
389
  "vite-plugin-manus-runtime": "^0.0.59",
375
- "vitest": "^5.0.5",
376
- "webpack": "5.112.2",
377
- "webpack-cli": "6.0.1",
390
+ "vitest": "^5.1.0",
391
+ "webpack": "^5.112.2",
392
+ "webpack-cli": "^6.0.1",
378
393
  "wouter": "^3.13.0",
379
394
  "yaml": "^2.9.1",
380
395
  "zod": "^4.6.7"
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.127",
5
+ "version": "2.0.154",
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.127",
93
+ "version": "2.0.154",
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": {