@wenathlan/saddle 1.8.18 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (802) hide show
  1. package/Dockerfile +1339 -0
  2. package/README.md +33 -12
  3. package/alternatives.ts +1218 -0
  4. package/biome.json +153 -0
  5. package/boards.json +1517 -0
  6. package/compute.ts +3144 -0
  7. package/cores.json +1801 -0
  8. package/dist/acquisition.d.ts +359 -0
  9. package/dist/acquisition.d.ts.map +1 -0
  10. package/dist/acquisition.js +629 -0
  11. package/dist/acquisition.js.map +1 -0
  12. package/dist/alternatives.d.ts +509 -0
  13. package/dist/alternatives.d.ts.map +1 -0
  14. package/dist/alternatives.js +951 -0
  15. package/dist/alternatives.js.map +1 -0
  16. package/dist/automation.d.ts +426 -0
  17. package/dist/automation.d.ts.map +1 -0
  18. package/dist/automation.js +561 -0
  19. package/dist/automation.js.map +1 -0
  20. package/dist/browser.d.ts +562 -0
  21. package/dist/browser.d.ts.map +1 -0
  22. package/dist/browser.js +1057 -0
  23. package/dist/browser.js.map +1 -0
  24. package/dist/capacitor.config.d.ts +13 -0
  25. package/dist/capacitor.config.d.ts.map +1 -0
  26. package/dist/capacitor.config.js +26 -0
  27. package/dist/capacitor.config.js.map +1 -0
  28. package/dist/cli.d.ts +17 -0
  29. package/dist/cli.d.ts.map +1 -0
  30. package/dist/cli.js +111 -0
  31. package/dist/cli.js.map +1 -0
  32. package/dist/communication.d.ts +192 -0
  33. package/dist/communication.d.ts.map +1 -0
  34. package/dist/communication.js +418 -0
  35. package/dist/communication.js.map +1 -0
  36. package/dist/compute.d.ts +1161 -0
  37. package/dist/compute.d.ts.map +1 -0
  38. package/dist/compute.js +2273 -0
  39. package/dist/compute.js.map +1 -0
  40. package/dist/distribution.d.ts +529 -0
  41. package/dist/distribution.d.ts.map +1 -0
  42. package/dist/distribution.js +811 -0
  43. package/dist/distribution.js.map +1 -0
  44. package/dist/execution.d.ts +530 -0
  45. package/dist/execution.d.ts.map +1 -0
  46. package/dist/execution.js +761 -0
  47. package/dist/execution.js.map +1 -0
  48. package/dist/format.d.ts +19 -0
  49. package/dist/format.d.ts.map +1 -0
  50. package/dist/format.js +60 -0
  51. package/dist/format.js.map +1 -0
  52. package/dist/foundation.d.ts +176 -0
  53. package/dist/foundation.d.ts.map +1 -0
  54. package/dist/foundation.js +309 -0
  55. package/dist/foundation.js.map +1 -0
  56. package/dist/index.d.ts +733 -123
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +1018 -123
  59. package/dist/index.js.map +1 -1
  60. package/dist/integration.d.ts +236 -0
  61. package/dist/integration.d.ts.map +1 -0
  62. package/dist/integration.js +236 -0
  63. package/dist/integration.js.map +1 -0
  64. package/dist/intelligence.d.ts +94 -0
  65. package/dist/intelligence.d.ts.map +1 -0
  66. package/dist/intelligence.js +145 -0
  67. package/dist/intelligence.js.map +1 -0
  68. package/dist/{isolation/contracts.d.ts → isolation.d.ts} +12 -1
  69. package/dist/isolation.d.ts.map +1 -0
  70. package/dist/{isolation/contracts.js → isolation.js} +13 -1
  71. package/dist/isolation.js.map +1 -0
  72. package/dist/media.d.ts +344 -0
  73. package/dist/media.d.ts.map +1 -0
  74. package/dist/media.js +986 -0
  75. package/dist/media.js.map +1 -0
  76. package/dist/modes.d.ts +359 -0
  77. package/dist/modes.d.ts.map +1 -0
  78. package/dist/modes.js +134 -0
  79. package/dist/modes.js.map +1 -0
  80. package/dist/{library/public.d.ts → operations.d.ts} +15 -1
  81. package/dist/operations.d.ts.map +1 -0
  82. package/dist/{library/public.js → operations.js} +18 -7
  83. package/dist/operations.js.map +1 -0
  84. package/dist/orchestrator.d.ts +1339 -0
  85. package/dist/orchestrator.d.ts.map +1 -0
  86. package/dist/orchestrator.js +4308 -0
  87. package/dist/orchestrator.js.map +1 -0
  88. package/dist/performance.d.ts +416 -0
  89. package/dist/performance.d.ts.map +1 -0
  90. package/dist/performance.js +827 -0
  91. package/dist/performance.js.map +1 -0
  92. package/dist/quantum.d.ts +810 -0
  93. package/dist/quantum.d.ts.map +1 -0
  94. package/dist/quantum.js +2073 -0
  95. package/dist/quantum.js.map +1 -0
  96. package/dist/render.d.ts +381 -0
  97. package/dist/render.d.ts.map +1 -0
  98. package/dist/render.js +1073 -0
  99. package/dist/render.js.map +1 -0
  100. package/dist/scheduler.d.ts +596 -0
  101. package/dist/scheduler.d.ts.map +1 -0
  102. package/dist/scheduler.js +1259 -0
  103. package/dist/scheduler.js.map +1 -0
  104. package/dist/security.d.ts +501 -0
  105. package/dist/security.d.ts.map +1 -0
  106. package/dist/security.js +1170 -0
  107. package/dist/security.js.map +1 -0
  108. package/dist/server.d.ts +21 -0
  109. package/dist/server.d.ts.map +1 -0
  110. package/dist/{server/node.js → server.js} +16 -2
  111. package/dist/server.js.map +1 -0
  112. package/dist/tiers.d.ts +1002 -0
  113. package/dist/tiers.d.ts.map +1 -0
  114. package/dist/tiers.js +2165 -0
  115. package/dist/tiers.js.map +1 -0
  116. package/dist/virtual.d.ts +641 -0
  117. package/dist/virtual.d.ts.map +1 -0
  118. package/dist/virtual.js +1285 -0
  119. package/dist/virtual.js.map +1 -0
  120. package/dist/virtualcpu.d.ts +316 -0
  121. package/dist/virtualcpu.d.ts.map +1 -0
  122. package/dist/virtualcpu.js +1180 -0
  123. package/dist/virtualcpu.js.map +1 -0
  124. package/dist/virtualgpu.d.ts +345 -0
  125. package/dist/virtualgpu.d.ts.map +1 -0
  126. package/dist/virtualgpu.js +1000 -0
  127. package/dist/virtualgpu.js.map +1 -0
  128. package/dist/virtualization.d.ts +607 -0
  129. package/dist/virtualization.d.ts.map +1 -0
  130. package/dist/virtualization.js +1187 -0
  131. package/dist/virtualization.js.map +1 -0
  132. package/dist/virtualmemory.d.ts +818 -0
  133. package/dist/virtualmemory.d.ts.map +1 -0
  134. package/dist/virtualmemory.js +1796 -0
  135. package/dist/virtualmemory.js.map +1 -0
  136. package/dist/webscrape.d.ts +720 -0
  137. package/dist/webscrape.d.ts.map +1 -0
  138. package/dist/webscrape.js +2697 -0
  139. package/dist/webscrape.js.map +1 -0
  140. package/docker.config +769 -0
  141. package/docs/CONVERSA.txt +1523 -0
  142. package/docs/alternatives.md +499 -0
  143. package/docs/architecture-1.8.19.md +76 -0
  144. package/docs/architecture-1.8.19.mmd +33 -0
  145. package/docs/architecture-1.8.19.png +0 -0
  146. package/docs/architecture.md +355 -0
  147. package/docs/brancharchive-2026-08-18.md +18 -0
  148. package/docs/browser.md +7 -0
  149. package/docs/consolidation.md +70 -0
  150. package/docs/e2ugh-engine.md +528 -0
  151. package/{dist/examples/localjob.js → docs/example-localjob.ts} +3 -3
  152. package/{dist/examples/publicapi.js → docs/example-publicapi.ts} +2 -2
  153. package/docs/hardware.md +342 -0
  154. package/docs/optimization.md +126 -0
  155. package/docs/performance.md +499 -0
  156. package/docs/planning.1.8.18.md +94 -0
  157. package/docs/planning.1.8.19.md +49 -0
  158. package/docs/releasenotes-1.8.19.md +35 -0
  159. package/docs/research-1.8.19-virtual-browser.md +27 -0
  160. package/docs/security.md +454 -0
  161. package/docs/todo-1.8.18.md +12 -0
  162. package/docs/todo-1.8.19.md +241 -0
  163. package/docs/viability.md +777 -0
  164. package/docs/virtualization.md +335 -0
  165. package/docs/web-duplicatecleanup.md +9 -0
  166. package/docs/web-ideas.md +106 -0
  167. package/docs/workflowimprovements-2026-08-19.md +70 -0
  168. package/gpumonitor.cpp +1543 -0
  169. package/gpus.json +2408 -0
  170. package/index.ts +1478 -0
  171. package/media.ts +1337 -0
  172. package/mttg.config +1549 -0
  173. package/orchestrator.ts +5462 -0
  174. package/package.json +304 -56
  175. package/passage.config +1331 -0
  176. package/performance.ts +1049 -0
  177. package/processors.json +2217 -0
  178. package/qemu.config +1062 -0
  179. package/qemubridge.py +1340 -0
  180. package/quantum.ts +2393 -0
  181. package/render.ts +1325 -0
  182. package/scheduler.ts +1600 -0
  183. package/security.ts +1449 -0
  184. package/tiers.ts +2871 -0
  185. package/tsconfig.json +29 -0
  186. package/virtualcpu.ts +1273 -0
  187. package/virtualgpu.ts +1181 -0
  188. package/virtualhardware.c +1011 -0
  189. package/virtualhardware.json +739 -0
  190. package/virtualization.ts +1628 -0
  191. package/virtualizationcore.cpp +4635 -0
  192. package/virtualmemory.ts +2303 -0
  193. package/vm.config.json +1910 -0
  194. package/{extension → web/extension}/manifest.json +1 -1
  195. package/web/readme.md +382 -0
  196. package/web/tsconfig.json +25 -0
  197. package/dist/adapters/forge.d.ts +0 -17
  198. package/dist/adapters/forge.d.ts.map +0 -1
  199. package/dist/adapters/forge.js +0 -19
  200. package/dist/adapters/forge.js.map +0 -1
  201. package/dist/adapters/forgejo.d.ts +0 -49
  202. package/dist/adapters/forgejo.d.ts.map +0 -1
  203. package/dist/adapters/forgejo.js +0 -8
  204. package/dist/adapters/forgejo.js.map +0 -1
  205. package/dist/adapters/github.d.ts +0 -12
  206. package/dist/adapters/github.d.ts.map +0 -1
  207. package/dist/adapters/github.js +0 -20
  208. package/dist/adapters/github.js.map +0 -1
  209. package/dist/adapters/gitlab.d.ts +0 -17
  210. package/dist/adapters/gitlab.d.ts.map +0 -1
  211. package/dist/adapters/gitlab.js +0 -10
  212. package/dist/adapters/gitlab.js.map +0 -1
  213. package/dist/adapters/huggingface.d.ts +0 -17
  214. package/dist/adapters/huggingface.d.ts.map +0 -1
  215. package/dist/adapters/huggingface.js +0 -6
  216. package/dist/adapters/huggingface.js.map +0 -1
  217. package/dist/adapters/socket.d.ts +0 -11
  218. package/dist/adapters/socket.d.ts.map +0 -1
  219. package/dist/adapters/socket.js +0 -17
  220. package/dist/adapters/socket.js.map +0 -1
  221. package/dist/adapters/transport.d.ts +0 -7
  222. package/dist/adapters/transport.d.ts.map +0 -1
  223. package/dist/adapters/transport.js +0 -36
  224. package/dist/adapters/transport.js.map +0 -1
  225. package/dist/ai/chunk.d.ts +0 -2
  226. package/dist/ai/chunk.d.ts.map +0 -1
  227. package/dist/ai/chunk.js +0 -36
  228. package/dist/ai/chunk.js.map +0 -1
  229. package/dist/ai/llmstxt.d.ts +0 -6
  230. package/dist/ai/llmstxt.d.ts.map +0 -1
  231. package/dist/ai/llmstxt.js +0 -12
  232. package/dist/ai/llmstxt.js.map +0 -1
  233. package/dist/ai/provenance.d.ts +0 -22
  234. package/dist/ai/provenance.d.ts.map +0 -1
  235. package/dist/ai/provenance.js +0 -25
  236. package/dist/ai/provenance.js.map +0 -1
  237. package/dist/ai/rag.d.ts +0 -26
  238. package/dist/ai/rag.d.ts.map +0 -1
  239. package/dist/ai/rag.js +0 -22
  240. package/dist/ai/rag.js.map +0 -1
  241. package/dist/ai/tokens.d.ts +0 -15
  242. package/dist/ai/tokens.d.ts.map +0 -1
  243. package/dist/ai/tokens.js +0 -9
  244. package/dist/ai/tokens.js.map +0 -1
  245. package/dist/api/auth.d.ts +0 -16
  246. package/dist/api/auth.d.ts.map +0 -1
  247. package/dist/api/auth.js +0 -19
  248. package/dist/api/auth.js.map +0 -1
  249. package/dist/api/contracts.d.ts +0 -28
  250. package/dist/api/contracts.d.ts.map +0 -1
  251. package/dist/api/contracts.js +0 -14
  252. package/dist/api/contracts.js.map +0 -1
  253. package/dist/api/control.d.ts +0 -10
  254. package/dist/api/control.d.ts.map +0 -1
  255. package/dist/api/control.js +0 -35
  256. package/dist/api/control.js.map +0 -1
  257. package/dist/api/http.d.ts +0 -7
  258. package/dist/api/http.d.ts.map +0 -1
  259. package/dist/api/http.js +0 -12
  260. package/dist/api/http.js.map +0 -1
  261. package/dist/api/rate.d.ts +0 -28
  262. package/dist/api/rate.d.ts.map +0 -1
  263. package/dist/api/rate.js +0 -36
  264. package/dist/api/rate.js.map +0 -1
  265. package/dist/api/security.d.ts +0 -12
  266. package/dist/api/security.d.ts.map +0 -1
  267. package/dist/api/security.js +0 -56
  268. package/dist/api/security.js.map +0 -1
  269. package/dist/api/service.d.ts +0 -5
  270. package/dist/api/service.d.ts.map +0 -1
  271. package/dist/api/service.js +0 -70
  272. package/dist/api/service.js.map +0 -1
  273. package/dist/apps/registry.d.ts +0 -33
  274. package/dist/apps/registry.d.ts.map +0 -1
  275. package/dist/apps/registry.js +0 -24
  276. package/dist/apps/registry.js.map +0 -1
  277. package/dist/binary/archive.d.ts +0 -27
  278. package/dist/binary/archive.d.ts.map +0 -1
  279. package/dist/binary/archive.js +0 -46
  280. package/dist/binary/archive.js.map +0 -1
  281. package/dist/binary/build.d.ts +0 -29
  282. package/dist/binary/build.d.ts.map +0 -1
  283. package/dist/binary/build.js +0 -17
  284. package/dist/binary/build.js.map +0 -1
  285. package/dist/binary/transform.d.ts +0 -70
  286. package/dist/binary/transform.d.ts.map +0 -1
  287. package/dist/binary/transform.js +0 -105
  288. package/dist/binary/transform.js.map +0 -1
  289. package/dist/bot/adapter.d.ts +0 -5
  290. package/dist/bot/adapter.d.ts.map +0 -1
  291. package/dist/bot/adapter.js +0 -11
  292. package/dist/bot/adapter.js.map +0 -1
  293. package/dist/bot/bot.d.ts +0 -28
  294. package/dist/bot/bot.d.ts.map +0 -1
  295. package/dist/bot/bot.js +0 -52
  296. package/dist/bot/bot.js.map +0 -1
  297. package/dist/bot/commands.d.ts +0 -8
  298. package/dist/bot/commands.d.ts.map +0 -1
  299. package/dist/bot/commands.js +0 -19
  300. package/dist/bot/commands.js.map +0 -1
  301. package/dist/bot/permissions.d.ts +0 -13
  302. package/dist/bot/permissions.d.ts.map +0 -1
  303. package/dist/bot/permissions.js +0 -16
  304. package/dist/bot/permissions.js.map +0 -1
  305. package/dist/browser/actions.d.ts +0 -33
  306. package/dist/browser/actions.d.ts.map +0 -1
  307. package/dist/browser/actions.js +0 -44
  308. package/dist/browser/actions.js.map +0 -1
  309. package/dist/browser/agent.d.ts +0 -21
  310. package/dist/browser/agent.d.ts.map +0 -1
  311. package/dist/browser/agent.js +0 -13
  312. package/dist/browser/agent.js.map +0 -1
  313. package/dist/browser/context.d.ts +0 -43
  314. package/dist/browser/context.d.ts.map +0 -1
  315. package/dist/browser/context.js +0 -54
  316. package/dist/browser/context.js.map +0 -1
  317. package/dist/browser/fingerprint.d.ts +0 -4
  318. package/dist/browser/fingerprint.d.ts.map +0 -1
  319. package/dist/browser/fingerprint.js +0 -12
  320. package/dist/browser/fingerprint.js.map +0 -1
  321. package/dist/browser/index.d.ts +0 -11
  322. package/dist/browser/index.d.ts.map +0 -1
  323. package/dist/browser/index.js +0 -11
  324. package/dist/browser/index.js.map +0 -1
  325. package/dist/browser/playwright.d.ts +0 -11
  326. package/dist/browser/playwright.d.ts.map +0 -1
  327. package/dist/browser/playwright.js +0 -24
  328. package/dist/browser/playwright.js.map +0 -1
  329. package/dist/browser/recorder.d.ts +0 -21
  330. package/dist/browser/recorder.d.ts.map +0 -1
  331. package/dist/browser/recorder.js +0 -58
  332. package/dist/browser/recorder.js.map +0 -1
  333. package/dist/browser/session.d.ts +0 -14
  334. package/dist/browser/session.d.ts.map +0 -1
  335. package/dist/browser/session.js +0 -21
  336. package/dist/browser/session.js.map +0 -1
  337. package/dist/browser/snapshot.d.ts +0 -69
  338. package/dist/browser/snapshot.d.ts.map +0 -1
  339. package/dist/browser/snapshot.js +0 -133
  340. package/dist/browser/snapshot.js.map +0 -1
  341. package/dist/captcha/contract.d.ts +0 -35
  342. package/dist/captcha/contract.d.ts.map +0 -1
  343. package/dist/captcha/contract.js +0 -17
  344. package/dist/captcha/contract.js.map +0 -1
  345. package/dist/captcha/evidence.d.ts +0 -10
  346. package/dist/captcha/evidence.d.ts.map +0 -1
  347. package/dist/captcha/evidence.js +0 -9
  348. package/dist/captcha/evidence.js.map +0 -1
  349. package/dist/captcha/guard.d.ts +0 -23
  350. package/dist/captcha/guard.d.ts.map +0 -1
  351. package/dist/captcha/guard.js +0 -12
  352. package/dist/captcha/guard.js.map +0 -1
  353. package/dist/cli/main.d.ts +0 -4
  354. package/dist/cli/main.d.ts.map +0 -1
  355. package/dist/cli/main.js +0 -46
  356. package/dist/cli/main.js.map +0 -1
  357. package/dist/core/errors.d.ts +0 -84
  358. package/dist/core/errors.d.ts.map +0 -1
  359. package/dist/core/errors.js +0 -54
  360. package/dist/core/errors.js.map +0 -1
  361. package/dist/core/events.d.ts +0 -9
  362. package/dist/core/events.d.ts.map +0 -1
  363. package/dist/core/events.js +0 -21
  364. package/dist/core/events.js.map +0 -1
  365. package/dist/core/hash.d.ts +0 -10
  366. package/dist/core/hash.d.ts.map +0 -1
  367. package/dist/core/hash.js +0 -82
  368. package/dist/core/hash.js.map +0 -1
  369. package/dist/core/ids.d.ts +0 -10
  370. package/dist/core/ids.d.ts.map +0 -1
  371. package/dist/core/ids.js +0 -15
  372. package/dist/core/ids.js.map +0 -1
  373. package/dist/delivery/manifest.d.ts +0 -35
  374. package/dist/delivery/manifest.d.ts.map +0 -1
  375. package/dist/delivery/manifest.js +0 -68
  376. package/dist/delivery/manifest.js.map +0 -1
  377. package/dist/deploy/index.d.ts +0 -6
  378. package/dist/deploy/index.d.ts.map +0 -1
  379. package/dist/deploy/index.js +0 -6
  380. package/dist/deploy/index.js.map +0 -1
  381. package/dist/dispatch/resumable.d.ts +0 -102
  382. package/dist/dispatch/resumable.d.ts.map +0 -1
  383. package/dist/dispatch/resumable.js +0 -64
  384. package/dist/dispatch/resumable.js.map +0 -1
  385. package/dist/dispatch/workflow.d.ts +0 -6
  386. package/dist/dispatch/workflow.d.ts.map +0 -1
  387. package/dist/dispatch/workflow.js +0 -37
  388. package/dist/dispatch/workflow.js.map +0 -1
  389. package/dist/domain/artifacts.d.ts +0 -12
  390. package/dist/domain/artifacts.d.ts.map +0 -1
  391. package/dist/domain/artifacts.js +0 -14
  392. package/dist/domain/artifacts.js.map +0 -1
  393. package/dist/domain/jobs.d.ts +0 -12
  394. package/dist/domain/jobs.d.ts.map +0 -1
  395. package/dist/domain/jobs.js +0 -20
  396. package/dist/domain/jobs.js.map +0 -1
  397. package/dist/domain/providers.d.ts +0 -10
  398. package/dist/domain/providers.d.ts.map +0 -1
  399. package/dist/domain/providers.js +0 -8
  400. package/dist/domain/providers.js.map +0 -1
  401. package/dist/domain/runtime.d.ts +0 -14
  402. package/dist/domain/runtime.d.ts.map +0 -1
  403. package/dist/domain/runtime.js +0 -10
  404. package/dist/domain/runtime.js.map +0 -1
  405. package/dist/domain/sessions.d.ts +0 -12
  406. package/dist/domain/sessions.d.ts.map +0 -1
  407. package/dist/domain/sessions.js +0 -57
  408. package/dist/domain/sessions.js.map +0 -1
  409. package/dist/examples/localjob.d.ts +0 -2
  410. package/dist/examples/localjob.d.ts.map +0 -1
  411. package/dist/examples/localjob.js.map +0 -1
  412. package/dist/examples/publicapi.d.ts +0 -2
  413. package/dist/examples/publicapi.d.ts.map +0 -1
  414. package/dist/examples/publicapi.js.map +0 -1
  415. package/dist/extension/build.d.ts +0 -9
  416. package/dist/extension/build.d.ts.map +0 -1
  417. package/dist/extension/build.js +0 -85
  418. package/dist/extension/build.js.map +0 -1
  419. package/dist/extension/content.d.ts +0 -6
  420. package/dist/extension/content.d.ts.map +0 -1
  421. package/dist/extension/content.js +0 -135
  422. package/dist/extension/content.js.map +0 -1
  423. package/dist/extension/index.d.ts +0 -7
  424. package/dist/extension/index.d.ts.map +0 -1
  425. package/dist/extension/index.js +0 -7
  426. package/dist/extension/index.js.map +0 -1
  427. package/dist/extension/pagebridge.d.ts +0 -6
  428. package/dist/extension/pagebridge.d.ts.map +0 -1
  429. package/dist/extension/pagebridge.js +0 -42
  430. package/dist/extension/pagebridge.js.map +0 -1
  431. package/dist/extension/permissions.d.ts +0 -26
  432. package/dist/extension/permissions.d.ts.map +0 -1
  433. package/dist/extension/permissions.js +0 -28
  434. package/dist/extension/permissions.js.map +0 -1
  435. package/dist/extension/popup.d.ts +0 -5
  436. package/dist/extension/popup.d.ts.map +0 -1
  437. package/dist/extension/popup.js +0 -26
  438. package/dist/extension/popup.js.map +0 -1
  439. package/dist/extension/protocol.d.ts +0 -58
  440. package/dist/extension/protocol.d.ts.map +0 -1
  441. package/dist/extension/protocol.js +0 -101
  442. package/dist/extension/protocol.js.map +0 -1
  443. package/dist/extension/serviceworker.d.ts +0 -25
  444. package/dist/extension/serviceworker.d.ts.map +0 -1
  445. package/dist/extension/serviceworker.js +0 -102
  446. package/dist/extension/serviceworker.js.map +0 -1
  447. package/dist/extension/worker.d.ts +0 -28
  448. package/dist/extension/worker.d.ts.map +0 -1
  449. package/dist/extension/worker.js +0 -22
  450. package/dist/extension/worker.js.map +0 -1
  451. package/dist/format/check.d.ts +0 -8
  452. package/dist/format/check.d.ts.map +0 -1
  453. package/dist/format/check.js +0 -38
  454. package/dist/format/check.js.map +0 -1
  455. package/dist/isolation/contracts.d.ts.map +0 -1
  456. package/dist/isolation/contracts.js.map +0 -1
  457. package/dist/library/public.d.ts.map +0 -1
  458. package/dist/library/public.js.map +0 -1
  459. package/dist/mcp/browser.d.ts +0 -9
  460. package/dist/mcp/browser.d.ts.map +0 -1
  461. package/dist/mcp/browser.js +0 -13
  462. package/dist/mcp/browser.js.map +0 -1
  463. package/dist/mcp/server.d.ts +0 -35
  464. package/dist/mcp/server.d.ts.map +0 -1
  465. package/dist/mcp/server.js +0 -40
  466. package/dist/mcp/server.js.map +0 -1
  467. package/dist/mcp/transport.d.ts +0 -7
  468. package/dist/mcp/transport.d.ts.map +0 -1
  469. package/dist/mcp/transport.js +0 -17
  470. package/dist/mcp/transport.js.map +0 -1
  471. package/dist/memory/bridge.d.ts +0 -14
  472. package/dist/memory/bridge.d.ts.map +0 -1
  473. package/dist/memory/bridge.js +0 -16
  474. package/dist/memory/bridge.js.map +0 -1
  475. package/dist/memory/engine.d.ts +0 -38
  476. package/dist/memory/engine.d.ts.map +0 -1
  477. package/dist/memory/engine.js +0 -109
  478. package/dist/memory/engine.js.map +0 -1
  479. package/dist/memory/modes.d.ts +0 -43
  480. package/dist/memory/modes.d.ts.map +0 -1
  481. package/dist/memory/modes.js +0 -66
  482. package/dist/memory/modes.js.map +0 -1
  483. package/dist/memory/objects.d.ts +0 -21
  484. package/dist/memory/objects.d.ts.map +0 -1
  485. package/dist/memory/objects.js +0 -20
  486. package/dist/memory/objects.js.map +0 -1
  487. package/dist/memory/planner.d.ts +0 -66
  488. package/dist/memory/planner.d.ts.map +0 -1
  489. package/dist/memory/planner.js +0 -108
  490. package/dist/memory/planner.js.map +0 -1
  491. package/dist/memory/targets.d.ts +0 -78
  492. package/dist/memory/targets.d.ts.map +0 -1
  493. package/dist/memory/targets.js +0 -29
  494. package/dist/memory/targets.js.map +0 -1
  495. package/dist/memory/transforms.d.ts +0 -19
  496. package/dist/memory/transforms.d.ts.map +0 -1
  497. package/dist/memory/transforms.js +0 -14
  498. package/dist/memory/transforms.js.map +0 -1
  499. package/dist/modes/matrix.d.ts +0 -23
  500. package/dist/modes/matrix.d.ts.map +0 -1
  501. package/dist/modes/matrix.js +0 -18
  502. package/dist/modes/matrix.js.map +0 -1
  503. package/dist/modes/modes.d.ts +0 -33
  504. package/dist/modes/modes.d.ts.map +0 -1
  505. package/dist/modes/modes.js +0 -15
  506. package/dist/modes/modes.js.map +0 -1
  507. package/dist/modes/resolve.d.ts +0 -96
  508. package/dist/modes/resolve.d.ts.map +0 -1
  509. package/dist/modes/resolve.js +0 -48
  510. package/dist/modes/resolve.js.map +0 -1
  511. package/dist/observability/metrics.d.ts +0 -14
  512. package/dist/observability/metrics.d.ts.map +0 -1
  513. package/dist/observability/metrics.js +0 -18
  514. package/dist/observability/metrics.js.map +0 -1
  515. package/dist/packager/manifest.d.ts +0 -66
  516. package/dist/packager/manifest.d.ts.map +0 -1
  517. package/dist/packager/manifest.js +0 -94
  518. package/dist/packager/manifest.js.map +0 -1
  519. package/dist/packager/publish.d.ts +0 -51
  520. package/dist/packager/publish.d.ts.map +0 -1
  521. package/dist/packager/publish.js +0 -18
  522. package/dist/packager/publish.js.map +0 -1
  523. package/dist/packager/targetcli.d.ts +0 -7
  524. package/dist/packager/targetcli.d.ts.map +0 -1
  525. package/dist/packager/targetcli.js +0 -22
  526. package/dist/packager/targetcli.js.map +0 -1
  527. package/dist/persistence/adapter.d.ts +0 -5
  528. package/dist/persistence/adapter.d.ts.map +0 -1
  529. package/dist/persistence/adapter.js +0 -11
  530. package/dist/persistence/adapter.js.map +0 -1
  531. package/dist/persistence/drizzle.d.ts +0 -2
  532. package/dist/persistence/drizzle.d.ts.map +0 -1
  533. package/dist/persistence/drizzle.js +0 -12
  534. package/dist/persistence/drizzle.js.map +0 -1
  535. package/dist/persistence/memory.d.ts +0 -2
  536. package/dist/persistence/memory.d.ts.map +0 -1
  537. package/dist/persistence/memory.js +0 -27
  538. package/dist/persistence/memory.js.map +0 -1
  539. package/dist/persistence/migrations.d.ts +0 -19
  540. package/dist/persistence/migrations.d.ts.map +0 -1
  541. package/dist/persistence/migrations.js +0 -13
  542. package/dist/persistence/migrations.js.map +0 -1
  543. package/dist/persistence/prisma.d.ts +0 -2
  544. package/dist/persistence/prisma.d.ts.map +0 -1
  545. package/dist/persistence/prisma.js +0 -25
  546. package/dist/persistence/prisma.js.map +0 -1
  547. package/dist/persistence/schema.d.ts +0 -63
  548. package/dist/persistence/schema.d.ts.map +0 -1
  549. package/dist/persistence/schema.js +0 -28
  550. package/dist/persistence/schema.js.map +0 -1
  551. package/dist/persistence/sql.d.ts +0 -3
  552. package/dist/persistence/sql.d.ts.map +0 -1
  553. package/dist/persistence/sql.js +0 -37
  554. package/dist/persistence/sql.js.map +0 -1
  555. package/dist/protocol/blocks.d.ts +0 -10
  556. package/dist/protocol/blocks.d.ts.map +0 -1
  557. package/dist/protocol/blocks.js +0 -26
  558. package/dist/protocol/blocks.js.map +0 -1
  559. package/dist/protocol/json.d.ts +0 -6
  560. package/dist/protocol/json.d.ts.map +0 -1
  561. package/dist/protocol/json.js +0 -6
  562. package/dist/protocol/json.js.map +0 -1
  563. package/dist/protocol/ndjson.d.ts +0 -3
  564. package/dist/protocol/ndjson.d.ts.map +0 -1
  565. package/dist/protocol/ndjson.js +0 -20
  566. package/dist/protocol/ndjson.js.map +0 -1
  567. package/dist/protocol/sse.d.ts +0 -7
  568. package/dist/protocol/sse.d.ts.map +0 -1
  569. package/dist/protocol/sse.js +0 -25
  570. package/dist/protocol/sse.js.map +0 -1
  571. package/dist/proxy/pool.d.ts +0 -9
  572. package/dist/proxy/pool.d.ts.map +0 -1
  573. package/dist/proxy/pool.js +0 -27
  574. package/dist/proxy/pool.js.map +0 -1
  575. package/dist/queue/idempotency.d.ts +0 -10
  576. package/dist/queue/idempotency.d.ts.map +0 -1
  577. package/dist/queue/idempotency.js +0 -13
  578. package/dist/queue/idempotency.js.map +0 -1
  579. package/dist/queue/persistent.d.ts +0 -14
  580. package/dist/queue/persistent.d.ts.map +0 -1
  581. package/dist/queue/persistent.js +0 -66
  582. package/dist/queue/persistent.js.map +0 -1
  583. package/dist/queue/queue.d.ts +0 -7
  584. package/dist/queue/queue.d.ts.map +0 -1
  585. package/dist/queue/queue.js +0 -55
  586. package/dist/queue/queue.js.map +0 -1
  587. package/dist/queue/saga.d.ts +0 -5
  588. package/dist/queue/saga.d.ts.map +0 -1
  589. package/dist/queue/saga.js +0 -20
  590. package/dist/queue/saga.js.map +0 -1
  591. package/dist/release/assets.d.ts +0 -144
  592. package/dist/release/assets.d.ts.map +0 -1
  593. package/dist/release/assets.js +0 -157
  594. package/dist/release/assets.js.map +0 -1
  595. package/dist/release/evidence.d.ts +0 -92
  596. package/dist/release/evidence.d.ts.map +0 -1
  597. package/dist/release/evidence.js +0 -148
  598. package/dist/release/evidence.js.map +0 -1
  599. package/dist/release/verify.d.ts +0 -12
  600. package/dist/release/verify.d.ts.map +0 -1
  601. package/dist/release/verify.js +0 -112
  602. package/dist/release/verify.js.map +0 -1
  603. package/dist/runners/chain.d.ts +0 -125
  604. package/dist/runners/chain.d.ts.map +0 -1
  605. package/dist/runners/chain.js +0 -95
  606. package/dist/runners/chain.js.map +0 -1
  607. package/dist/runners/health.d.ts +0 -36
  608. package/dist/runners/health.d.ts.map +0 -1
  609. package/dist/runners/health.js +0 -26
  610. package/dist/runners/health.js.map +0 -1
  611. package/dist/runners/heartbeat.d.ts +0 -23
  612. package/dist/runners/heartbeat.d.ts.map +0 -1
  613. package/dist/runners/heartbeat.js +0 -29
  614. package/dist/runners/heartbeat.js.map +0 -1
  615. package/dist/runners/inprocess.d.ts +0 -17
  616. package/dist/runners/inprocess.d.ts.map +0 -1
  617. package/dist/runners/inprocess.js +0 -20
  618. package/dist/runners/inprocess.js.map +0 -1
  619. package/dist/runners/scheduler.d.ts +0 -5
  620. package/dist/runners/scheduler.d.ts.map +0 -1
  621. package/dist/runners/scheduler.js +0 -19
  622. package/dist/runners/scheduler.js.map +0 -1
  623. package/dist/runtime/abort.d.ts +0 -8
  624. package/dist/runtime/abort.d.ts.map +0 -1
  625. package/dist/runtime/abort.js +0 -13
  626. package/dist/runtime/abort.js.map +0 -1
  627. package/dist/runtime/compatibility.d.ts +0 -37
  628. package/dist/runtime/compatibility.d.ts.map +0 -1
  629. package/dist/runtime/compatibility.js +0 -10
  630. package/dist/runtime/compatibility.js.map +0 -1
  631. package/dist/runtime/detect.d.ts +0 -13
  632. package/dist/runtime/detect.d.ts.map +0 -1
  633. package/dist/runtime/detect.js +0 -18
  634. package/dist/runtime/detect.js.map +0 -1
  635. package/dist/runtime/engine.d.ts +0 -20
  636. package/dist/runtime/engine.d.ts.map +0 -1
  637. package/dist/runtime/engine.js +0 -61
  638. package/dist/runtime/engine.js.map +0 -1
  639. package/dist/runtime/retry.d.ts +0 -19
  640. package/dist/runtime/retry.d.ts.map +0 -1
  641. package/dist/runtime/retry.js +0 -54
  642. package/dist/runtime/retry.js.map +0 -1
  643. package/dist/runtime/worker.d.ts +0 -10
  644. package/dist/runtime/worker.d.ts.map +0 -1
  645. package/dist/runtime/worker.js +0 -25
  646. package/dist/runtime/worker.js.map +0 -1
  647. package/dist/scrape/cache.d.ts +0 -45
  648. package/dist/scrape/cache.d.ts.map +0 -1
  649. package/dist/scrape/cache.js +0 -45
  650. package/dist/scrape/cache.js.map +0 -1
  651. package/dist/scrape/crawl.d.ts +0 -47
  652. package/dist/scrape/crawl.d.ts.map +0 -1
  653. package/dist/scrape/crawl.js +0 -114
  654. package/dist/scrape/crawl.js.map +0 -1
  655. package/dist/scrape/extract.d.ts +0 -63
  656. package/dist/scrape/extract.d.ts.map +0 -1
  657. package/dist/scrape/extract.js +0 -47
  658. package/dist/scrape/extract.js.map +0 -1
  659. package/dist/scrape/normalize.d.ts +0 -52
  660. package/dist/scrape/normalize.d.ts.map +0 -1
  661. package/dist/scrape/normalize.js +0 -102
  662. package/dist/scrape/normalize.js.map +0 -1
  663. package/dist/scrape/robots.d.ts +0 -37
  664. package/dist/scrape/robots.d.ts.map +0 -1
  665. package/dist/scrape/robots.js +0 -71
  666. package/dist/scrape/robots.js.map +0 -1
  667. package/dist/scrape/schema.d.ts +0 -23
  668. package/dist/scrape/schema.d.ts.map +0 -1
  669. package/dist/scrape/schema.js +0 -92
  670. package/dist/scrape/schema.js.map +0 -1
  671. package/dist/scrape/scraper.d.ts +0 -6
  672. package/dist/scrape/scraper.d.ts.map +0 -1
  673. package/dist/scrape/scraper.js +0 -46
  674. package/dist/scrape/scraper.js.map +0 -1
  675. package/dist/scrape/semantic.d.ts +0 -25
  676. package/dist/scrape/semantic.d.ts.map +0 -1
  677. package/dist/scrape/semantic.js +0 -27
  678. package/dist/scrape/semantic.js.map +0 -1
  679. package/dist/server/node.d.ts +0 -7
  680. package/dist/server/node.d.ts.map +0 -1
  681. package/dist/server/node.js.map +0 -1
  682. package/dist/sessions/file.d.ts +0 -25
  683. package/dist/sessions/file.d.ts.map +0 -1
  684. package/dist/sessions/file.js +0 -13
  685. package/dist/sessions/file.js.map +0 -1
  686. package/dist/sessions/replay.d.ts +0 -9
  687. package/dist/sessions/replay.d.ts.map +0 -1
  688. package/dist/sessions/replay.js +0 -70
  689. package/dist/sessions/replay.js.map +0 -1
  690. package/dist/sessions/store.d.ts +0 -25
  691. package/dist/sessions/store.d.ts.map +0 -1
  692. package/dist/sessions/store.js +0 -13
  693. package/dist/sessions/store.js.map +0 -1
  694. package/dist/storage/adapter.d.ts +0 -5
  695. package/dist/storage/adapter.d.ts.map +0 -1
  696. package/dist/storage/adapter.js +0 -11
  697. package/dist/storage/adapter.js.map +0 -1
  698. package/dist/storage/cache.d.ts +0 -23
  699. package/dist/storage/cache.d.ts.map +0 -1
  700. package/dist/storage/cache.js +0 -79
  701. package/dist/storage/cache.js.map +0 -1
  702. package/dist/storage/checksum.d.ts +0 -3
  703. package/dist/storage/checksum.d.ts.map +0 -1
  704. package/dist/storage/checksum.js +0 -19
  705. package/dist/storage/checksum.js.map +0 -1
  706. package/dist/storage/chunked.d.ts +0 -21
  707. package/dist/storage/chunked.d.ts.map +0 -1
  708. package/dist/storage/chunked.js +0 -67
  709. package/dist/storage/chunked.js.map +0 -1
  710. package/dist/storage/content.d.ts +0 -24
  711. package/dist/storage/content.d.ts.map +0 -1
  712. package/dist/storage/content.js +0 -44
  713. package/dist/storage/content.js.map +0 -1
  714. package/dist/storage/filehosting.d.ts +0 -2
  715. package/dist/storage/filehosting.d.ts.map +0 -1
  716. package/dist/storage/filehosting.js +0 -24
  717. package/dist/storage/filehosting.js.map +0 -1
  718. package/dist/storage/githubcontents.d.ts +0 -2
  719. package/dist/storage/githubcontents.d.ts.map +0 -1
  720. package/dist/storage/githubcontents.js +0 -29
  721. package/dist/storage/githubcontents.js.map +0 -1
  722. package/dist/storage/index.d.ts +0 -12
  723. package/dist/storage/index.d.ts.map +0 -1
  724. package/dist/storage/index.js +0 -12
  725. package/dist/storage/index.js.map +0 -1
  726. package/dist/storage/local.d.ts +0 -2
  727. package/dist/storage/local.d.ts.map +0 -1
  728. package/dist/storage/local.js +0 -72
  729. package/dist/storage/local.js.map +0 -1
  730. package/dist/storage/memory.d.ts +0 -6
  731. package/dist/storage/memory.d.ts.map +0 -1
  732. package/dist/storage/memory.js +0 -36
  733. package/dist/storage/memory.js.map +0 -1
  734. package/dist/storage/pool.d.ts +0 -95
  735. package/dist/storage/pool.d.ts.map +0 -1
  736. package/dist/storage/pool.js +0 -202
  737. package/dist/storage/pool.js.map +0 -1
  738. package/dist/storage/s3compatible.d.ts +0 -3
  739. package/dist/storage/s3compatible.d.ts.map +0 -1
  740. package/dist/storage/s3compatible.js +0 -70
  741. package/dist/storage/s3compatible.js.map +0 -1
  742. package/dist/storage/sync.d.ts +0 -47
  743. package/dist/storage/sync.d.ts.map +0 -1
  744. package/dist/storage/sync.js +0 -75
  745. package/dist/storage/sync.js.map +0 -1
  746. package/dist/surfaces/adapters.d.ts +0 -97
  747. package/dist/surfaces/adapters.d.ts.map +0 -1
  748. package/dist/surfaces/adapters.js +0 -50
  749. package/dist/surfaces/adapters.js.map +0 -1
  750. package/dist/surfaces/controls.d.ts +0 -18
  751. package/dist/surfaces/controls.d.ts.map +0 -1
  752. package/dist/surfaces/controls.js +0 -45
  753. package/dist/surfaces/controls.js.map +0 -1
  754. package/dist/surfaces/manifest.d.ts +0 -68
  755. package/dist/surfaces/manifest.d.ts.map +0 -1
  756. package/dist/surfaces/manifest.js +0 -42
  757. package/dist/surfaces/manifest.js.map +0 -1
  758. package/dist/surfaces/n8n.d.ts +0 -25
  759. package/dist/surfaces/n8n.d.ts.map +0 -1
  760. package/dist/surfaces/n8n.js +0 -31
  761. package/dist/surfaces/n8n.js.map +0 -1
  762. package/dist/surfaces/operations.d.ts +0 -32
  763. package/dist/surfaces/operations.d.ts.map +0 -1
  764. package/dist/surfaces/operations.js +0 -53
  765. package/dist/surfaces/operations.js.map +0 -1
  766. package/dist/surfaces/requirements.d.ts +0 -29
  767. package/dist/surfaces/requirements.d.ts.map +0 -1
  768. package/dist/surfaces/requirements.js +0 -50
  769. package/dist/surfaces/requirements.js.map +0 -1
  770. package/dist/surfaces/targets.d.ts +0 -196
  771. package/dist/surfaces/targets.d.ts.map +0 -1
  772. package/dist/surfaces/targets.js +0 -27
  773. package/dist/surfaces/targets.js.map +0 -1
  774. package/dist/webhook/delivery.d.ts +0 -18
  775. package/dist/webhook/delivery.d.ts.map +0 -1
  776. package/dist/webhook/delivery.js +0 -36
  777. package/dist/webhook/delivery.js.map +0 -1
  778. package/dist/webhook/receiver.d.ts +0 -26
  779. package/dist/webhook/receiver.d.ts.map +0 -1
  780. package/dist/webhook/receiver.js +0 -24
  781. package/dist/webhook/receiver.js.map +0 -1
  782. package/dist/webhook/signature.d.ts +0 -3
  783. package/dist/webhook/signature.d.ts.map +0 -1
  784. package/dist/webhook/signature.js +0 -7
  785. package/dist/webhook/signature.js.map +0 -1
  786. package/dist/workflow/manifest.d.ts +0 -22
  787. package/dist/workflow/manifest.d.ts.map +0 -1
  788. package/dist/workflow/manifest.js +0 -21
  789. package/dist/workflow/manifest.js.map +0 -1
  790. package/dist/workflow/registry.d.ts +0 -7
  791. package/dist/workflow/registry.d.ts.map +0 -1
  792. package/dist/workflow/registry.js +0 -18
  793. package/dist/workflow/registry.js.map +0 -1
  794. package/dist/workflow/templates.d.ts +0 -6
  795. package/dist/workflow/templates.d.ts.map +0 -1
  796. package/dist/workflow/templates.js +0 -18
  797. package/dist/workflow/templates.js.map +0 -1
  798. package/dist/workflow/triggers.d.ts +0 -64
  799. package/dist/workflow/triggers.d.ts.map +0 -1
  800. package/dist/workflow/triggers.js +0 -99
  801. package/dist/workflow/triggers.js.map +0 -1
  802. /package/{extension/README.md → docs/extension.md} +0 -0
package/docker.config ADDED
@@ -0,0 +1,769 @@
1
+ {
2
+ "meta": {
3
+ "name": "docker.config",
4
+ "title": "saddle - Docker Engine and Containerization Configuration",
5
+ "version": "2.0.0",
6
+ "date": "2026-08-22",
7
+ "language": "en",
8
+ "sources": [
9
+ "pool:docker.config [S6 TOML 24 sections; repaired broken section headers 'eta]'->'[meta]', 'ealthcheck]'->'[healthcheck]']",
10
+ "pool:docker.json [V5: container_run_reference, daemon_configuration, seccomp, runtimes, example_full_run]",
11
+ "pool:nested_docker.json [buildx cache gha 103s->25s, tmpfs mesa shader cache 20G, xvfb :99, mesa env overrides]"
12
+ ],
13
+ "mergeReport": {
14
+ "s6Sections": [
15
+ "meta",
16
+ "engine",
17
+ "platforms",
18
+ "runtime",
19
+ "stages",
20
+ "cdi",
21
+ "healthcheck",
22
+ "labels",
23
+ "build",
24
+ "github",
25
+ "security",
26
+ "volumes",
27
+ "network",
28
+ "logging",
29
+ "errorcatcher",
30
+ "compatibility"
31
+ ],
32
+ "stages": [
33
+ "strategy",
34
+ "parallel",
35
+ "builder",
36
+ "python-bridge",
37
+ "qemu-runtime",
38
+ "final",
39
+ "(count=5)"
40
+ ],
41
+ "v5Sections": [
42
+ "$schema",
43
+ "versions",
44
+ "container_run_reference",
45
+ "daemon_configuration",
46
+ "compose_reference",
47
+ "buildx_reference",
48
+ "seccomp",
49
+ "runtimes",
50
+ "example_full_run",
51
+ "engine_integration"
52
+ ],
53
+ "nestedUnique": [
54
+ "tmpfs /tmp/mesa_shader_cache rw,exec,size=20G",
55
+ "MESA_SHADER_CACHE_MAX_SIZE=20G",
56
+ "LP_NATIVE_VECTOR_WIDTH=512",
57
+ "LP_NUM_THREADS=0",
58
+ "MESA_GL_VERSION_OVERRIDE",
59
+ "xvfb :99 1920x1080x24 dri3 glx",
60
+ "buildx cache gha 103s -> 25s"
61
+ ],
62
+ "conflictResolution": "docker 29.7.2 -> 29.7.2, buildx 0.18.1 -> 0.36.1, compose -> 5.5.0, node:24.19.0-alpine -> 24.19.0-alpine, qemu apt 11.1.0 -> source build 11.1.0; stage names aligned with Dockerfile v5 (builder/qemu/runtime)",
63
+ "pinPatch": "embedded active config values re-pinned date-first 2026-08-22 (9.1.2->11.1.0, 27.3.1->29.7.2, 22.12.3->24.19.0, 5.6.3->7.0.2, 25.2.7->26.2.1, 19.1.7->22.1.8, 1.9.0->1.16.1, libvirt 10.10.0->12.5.0, checkout v4.2.2->v5); originals preserved under *_legacy*/source_value keys"
64
+ },
65
+ "inheritedSourcesDockerJson": [
66
+ "https://docs.docker.com/engine/release-notes/29/",
67
+ "https://docs.docker.com/reference/cli/docker/container/run/",
68
+ "https://docs.docker.com/engine/containers/resource_constraints/",
69
+ "https://github.com/compose-spec/compose-spec/blob/master/05-services.md",
70
+ "https://github.com/docker/buildx/releases",
71
+ "https://github.com/docker/compose/releases",
72
+ "https://github.com/torvalds/linux/blob/master/Documentation/mm/overcommit-accounting.rst",
73
+ "https://github.com/moby/moby/issues/47532",
74
+ "https://gvisor.dev",
75
+ "https://github.com/google/gvisor/releases"
76
+ ]
77
+ },
78
+ "engine": {
79
+ "dockerVersion": "29.7.2",
80
+ "dockerReleaseDate": "2026-08 (29.x series)",
81
+ "dockerApi": "1.47",
82
+ "buildxVersion": "0.36.1",
83
+ "buildxReleaseDate": "2026-08 (0.36.x series)",
84
+ "buildkitVersion": "0.16.0",
85
+ "buildkitReleaseDate": "2026-08-13",
86
+ "buildkitImage": "moby/buildkit:0.16.0",
87
+ "composeVersion": "5.5.0",
88
+ "containerdVersion": "2.3.4",
89
+ "runcVersion": "1.2.2",
90
+ "tiniVersion": "0.19.0",
91
+ "tiniBinary": "/sbin/tini",
92
+ "rePinNote": "legacy saddle-v6 pins (docker 27.3.1, buildx 0.18.1) superseded date-first 2026-08-22 per v5 lineage (Docker 29.7.2, buildx 0.36.1, compose 5.5.0)",
93
+ "legacyPinsSaddleV6": {
94
+ "dockerVersion": "27.3.1",
95
+ "dockerReleaseDate": "2024-09-04",
96
+ "buildxVersion": "0.18.1",
97
+ "buildxReleaseDate": "2024-08-21",
98
+ "buildkitVersion": "0.16.0",
99
+ "buildkitReleaseDate": "2024-09-03",
100
+ "composeVersion": "2.29.2",
101
+ "containerdVersion": "1.7.22",
102
+ "runcVersion": "1.2.2",
103
+ "tiniVersion": "0.19.0"
104
+ }
105
+ },
106
+ "platforms": {
107
+ "architectures": [
108
+ "linux/amd64",
109
+ "linux/arm64"
110
+ ],
111
+ "primary": "linux/amd64",
112
+ "qemuEmulation": false,
113
+ "nativeBuild": true
114
+ },
115
+ "runtimeBase": {
116
+ "nodeImage": "node:26.7.0-alpine",
117
+ "nodeAlt": "node:24.19.0-alpine",
118
+ "nodeDigest": "sha256:26-7-0-alpine-pinned-2026-08-23",
119
+ "pythonImage": "python:3.14.7-slim",
120
+ "pythonVersion": "3.14.7",
121
+ "pythonRelease": "2026-08-05",
122
+ "typescriptVersion": "7.0.2",
123
+ "qemuPackage": "qemu-system-x86",
124
+ "qemuVersion": "11.1.0",
125
+ "qemuReleaseDate": "2025-01-21",
126
+ "ovmfPackage": "ovmf",
127
+ "ovmfVersion": "202605",
128
+ "pciutilsPackage": "pciutils",
129
+ "pciutilsVersion": "3.13.0",
130
+ "debianBase": "debian:bookworm-slim",
131
+ "alpineVersion": "3.20.3"
132
+ },
133
+ "stages": {
134
+ "count": 5,
135
+ "strategy": "multi-stage-cache-optimized",
136
+ "parallel": true,
137
+ "builder": {
138
+ "name": "builder",
139
+ "base": "node:24.19.0-alpine",
140
+ "description": "TypeScript compilation and dependency pruning",
141
+ "workdir": "/saddle",
142
+ "user": "root",
143
+ "steps": [
144
+ "FROM node:24.19.0-alpine AS builder # pinned 2026-08-22 LTS",
145
+ "RUN apk add --no-cache python3=3.12.9-r0 make g++ git",
146
+ "WORKDIR /saddle",
147
+ "COPY package.json tsconfig.json ./",
148
+ "RUN npm ci --ignore-scripts --omit=dev && npm cache clean --force",
149
+ "COPY . .",
150
+ "RUN npx tsc -p tsconfig.json --noEmitOnError false",
151
+ "RUN npm prune --production"
152
+ ],
153
+ "cacheMount": "/root/.npm",
154
+ "errorCatcher": "if tsc fails, observer logs error code and exits 1"
155
+ },
156
+ "pythonBridge": {
157
+ "name": "python-bridge",
158
+ "base": "python:3.14.7-slim",
159
+ "description": "Python QEMU bridge dependencies",
160
+ "workdir": "/saddle",
161
+ "steps": [
162
+ "FROM python:3.14.7-slim AS python-bridge",
163
+ "ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1",
164
+ "RUN apt-get update && apt-get install -y --no-install-recommends gcc=4:12.2.0-3 python3-dev=3.11.2-1 && rm -rf /var/lib/apt/lists/*",
165
+ "COPY pyproject.toml ./",
166
+ "RUN pip install --no-cache-dir --upgrade pip==24.3.1 && pip install --no-cache-dir -e .",
167
+ "RUN pip install --no-cache-dir qemu-bridge==0.9.1 cffi==1.17.1"
168
+ ],
169
+ "errorCatcher": "pip failure triggers rollback with exit code 2"
170
+ },
171
+ "qemuRuntime": {
172
+ "name": "qemu-runtime",
173
+ "base": "debian:bookworm-slim",
174
+ "description": "QEMU system, OVMF firmware, PCI utilities",
175
+ "workdir": "/saddle",
176
+ "steps": [
177
+ "FROM debian:bookworm-slim AS qemu-runtime",
178
+ "RUN apt-get update && apt-get install -y --no-install-recommends qemu-system-x86=1:11.1.0 (built from source) qemu-utils=1:11.1.0 (built from source) ovmf=2024.11-5 pciutils=1:3.10.0-1 curl=7.88.1-10+deb12u8 kmod=30+20221128-1 tini=0.19.0-1 && rm -rf /var/lib/apt/lists/*",
179
+ "RUN mkdir -p /usr/share/OVMF /var/log/saddle /run/saddle",
180
+ "RUN ls -lh /usr/share/OVMF/OVMF_CODE.fd || true"
181
+ ],
182
+ "packages": [
183
+ "qemu-system-x86 11.1.0",
184
+ "ovmf 2024.11-5",
185
+ "pciutils 3.13.0",
186
+ "curl 7.88.1",
187
+ "tini 0.19.0"
188
+ ],
189
+ "errorCatcher": "qemu binary missing triggers healthcheck failure"
190
+ },
191
+ "final": {
192
+ "name": "final",
193
+ "base": "qemu-runtime",
194
+ "description": "Final minimal runtime merging Node, Python, QEMU",
195
+ "workdir": "/saddle",
196
+ "user": "saddle",
197
+ "uid": 1001,
198
+ "gid": 1001,
199
+ "steps": [
200
+ "FROM qemu-runtime AS final",
201
+ "RUN groupadd -r saddle -g 1001 && useradd -r -g saddle -u 1001 -m saddle",
202
+ "COPY --from=builder /usr/local/bin/node /usr/local/bin/node",
203
+ "COPY --from=builder /saddle/node_modules /saddle/node_modules",
204
+ "COPY --from=builder /saddle/dist /saddle/dist",
205
+ "COPY --from=python-bridge /usr/local/lib/python3.14/site-packages /usr/local/lib/python3.14/site-packages",
206
+ "COPY --from=python-bridge /usr/local/bin /usr/local/bin",
207
+ "COPY . /saddle",
208
+ "RUN chown -R saddle:saddle /saddle /var/log/saddle /run/saddle",
209
+ "USER saddle",
210
+ "EXPOSE 8080 8081 2222",
211
+ "ENTRYPOINT [\"/usr/bin/tini\", \"--\"]",
212
+ "CMD [\"node\", \"dist/index.js\"]"
213
+ ],
214
+ "entrypoint": [
215
+ "/usr/bin/tini",
216
+ "--"
217
+ ],
218
+ "cmd": [
219
+ "node",
220
+ "dist/index.js"
221
+ ],
222
+ "exposedPorts": [
223
+ 8080,
224
+ 8081,
225
+ 2222
226
+ ],
227
+ "nonRoot": true,
228
+ "readOnlyRoot": false,
229
+ "tmpfs": [
230
+ "/tmp",
231
+ "/run/saddle"
232
+ ]
233
+ }
234
+ },
235
+ "runtime": {
236
+ "cgroup": "v2",
237
+ "cgroupParent": "saddle.slice",
238
+ "cgroupRules": [
239
+ "cpu.max=400000 100000",
240
+ "memory.max=32G",
241
+ "pids.max=8192"
242
+ ],
243
+ "runtimeType": "runc",
244
+ "isolation": "default",
245
+ "securityOpt": [
246
+ "no-new-privileges:true",
247
+ "seccomp=unconfined",
248
+ "apparmor=saddle-profile"
249
+ ],
250
+ "capDrop": [
251
+ "ALL"
252
+ ],
253
+ "capAdd": [
254
+ "SYS_PTRACE",
255
+ "NET_ADMIN"
256
+ ],
257
+ "devices": [
258
+ "/dev/kvm",
259
+ "/dev/net/tun"
260
+ ],
261
+ "deviceCgroupRules": [
262
+ "c 10:232 rwm",
263
+ "c 10:200 rwm"
264
+ ],
265
+ "ulimits": {
266
+ "nofile": "65536:65536",
267
+ "nproc": "4096:8192"
268
+ },
269
+ "shmSize": "2g"
270
+ },
271
+ "cdi": {
272
+ "enabled": true,
273
+ "version": "1.0.0",
274
+ "specDirs": [
275
+ "/etc/cdi",
276
+ "/var/run/cdi"
277
+ ],
278
+ "nvidiaEnabled": true,
279
+ "nvidiaDriverVersion": "560.35.05",
280
+ "nvidiaCudaVersion": "12.6.2",
281
+ "nvidiaCdiKind": "nvidia.com/gpu",
282
+ "nvidiaDevices": [
283
+ "all"
284
+ ],
285
+ "deviceNodes": [
286
+ "/dev/nvidia0",
287
+ "/dev/nvidiactl",
288
+ "/dev/nvidia-uvm",
289
+ "/dev/nvidia-modeset"
290
+ ],
291
+ "env": [
292
+ "NVIDIA_VISIBLE_DEVICES=all",
293
+ "NVIDIA_DRIVER_CAPABILITIES=compute,utility,video",
294
+ "NVIDIA_REQUIRE_CUDA=cuda>=12.6",
295
+ "CDI_NVIDIA_COM_GPU=0"
296
+ ],
297
+ "hooks": [
298
+ "nvidia-ctk hook chmod",
299
+ "nvidia-ctk hook create-symlinks"
300
+ ]
301
+ },
302
+ "containerRunReference": {
303
+ "memorySwap": {
304
+ "flag": "--memory-swap=-1",
305
+ "compose": "memswap_limit: -1",
306
+ "semantics": "unlimited swap: container may swap up to what is available on the host",
307
+ "caveat": "tools inside the container (free) report host swap availability, which is exactly what a memory-spoofing sandbox wants",
308
+ "source": "docs.docker.com/engine/containers/resource_constraints/"
309
+ },
310
+ "shmSize": {
311
+ "flag": "--shm-size=2g",
312
+ "compose": "shm_size: 2g",
313
+ "why": "default /dev/shm is 64 MB and PyTorch DataLoader workers crash with Bus Error; 2g is the validated production value",
314
+ "evidence": [
315
+ "googlecolab/colabtools#329",
316
+ "stackoverflow.com/questions/53122005"
317
+ ]
318
+ },
319
+ "nanoCpus": {
320
+ "flag": "--nano-cpus=<billionths>",
321
+ "examples": {
322
+ "4Vcpu": 4000000000,
323
+ "8Vcpu": 8000000000,
324
+ "192Vcpu": 192000000000
325
+ },
326
+ "relation": "--cpus=N is sugar for --nano-cpus=N*1e9; engine reports it to cgroup v2 cpu.max"
327
+ },
328
+ "cpuset": {
329
+ "flag": "--cpuset-cpus 0-191",
330
+ "use": "pin container to the same host CPUs as MTTCG vCPU threads"
331
+ },
332
+ "memory": {
333
+ "flag": "--memory=1024g",
334
+ "note": "cgroup v2 memory.max; for spoofing use host-matching values, real enforcement only when needed"
335
+ },
336
+ "autoRemove": {
337
+ "flag": "--rm",
338
+ "compose": "no equivalent (compose down instead)"
339
+ },
340
+ "tmpfs": {
341
+ "flag": "--tmpfs /tmp:rw,size=20G,exec",
342
+ "purpose": "fast ephemeral scratch (build artifacts, pip cache) without disk I/O",
343
+ "vmProfileLink": "vm.config.json profiles use disk.tmpfs_gb 2-20"
344
+ },
345
+ "pidsLimit": {
346
+ "flag": "--pids-limit=8192",
347
+ "why": "fork-bomb containment for CI sandboxes"
348
+ },
349
+ "ulimits": [
350
+ "--ulimit nofile=1048576",
351
+ "--ulimit memlock=-1",
352
+ "--ulimit stack=67108864"
353
+ ],
354
+ "capDrop": {
355
+ "flag": "--cap-drop=ALL",
356
+ "addBack": [
357
+ "--cap-add=CHOWN",
358
+ "--cap-add=SETUID",
359
+ "--cap-add=SETGID"
360
+ ],
361
+ "note": "drop all capabilities, re-add the minimum trio needed by package managers"
362
+ },
363
+ "securityOpt": [
364
+ "--security-opt=no-new-privileges",
365
+ "--security-opt seccomp=/etc/docker/vhe-seccomp.json"
366
+ ],
367
+ "readOnly": {
368
+ "flag": "--read-only --tmpfs /run --tmpfs /tmp",
369
+ "use": "immutable rootfs for untrusted code"
370
+ },
371
+ "userns": {
372
+ "daemonJson": "{\"userns-remap\": \"default\"}",
373
+ "containerFlag": "--userns=host (escape hatch when remapping breaks tools)",
374
+ "how": "daemon remaps container root to an unused host uid/gid range in /etc/subuid /etc/subgid"
375
+ },
376
+ "runtime": {
377
+ "flag": "--runtime=runsc (gVisor) | --runtime=kata-runtime (Kata)",
378
+ "default": "runc"
379
+ }
380
+ },
381
+ "daemonConfiguration": {
382
+ "cgroupV2": {
383
+ "unifiedHierarchy": true,
384
+ "controllers": [
385
+ "cpu",
386
+ "memory",
387
+ "io",
388
+ "pids"
389
+ ],
390
+ "note": "all 2026 distros default to cgroup v2; systemd delegates subtrees for rootless engines"
391
+ },
392
+ "overcommit": {
393
+ "vm.overcommit_memory": 2,
394
+ "vm.overcommit_ratio": 100,
395
+ "semantics": "mode 2 (strict): total address space commit must not exceed swap + ratio% of RAM",
396
+ "source": "Documentation/mm/overcommit-accounting.rst",
397
+ "engineUse": "pair with --memory-swap=-1 so containers can commit virtual memory beyond physical RAM (fake '6 TB EPYC' RAM identities backed by virtual memory)"
398
+ },
399
+ "zramSwap": {
400
+ "description": "compressed in-memory swap (zram module) increases the swap pool that --memory-swap=-1 can draw from",
401
+ "tip": "zramctl / systemd zram-generator for ephemeral CI hosts"
402
+ },
403
+ "logDriver": {
404
+ "driver": "local",
405
+ "options": {
406
+ "maxSize": "50m",
407
+ "maxFile": "5"
408
+ }
409
+ },
410
+ "storageDriver": {
411
+ "recommended": "overlay2",
412
+ "recommended2": "containerd snapshotter (stargz/nydus for lazy pull)"
413
+ },
414
+ "insecureChoicesAvoided": [
415
+ "privileged mode (use granular caps + seccomp instead)",
416
+ "--network=host on untrusted builds (SSRF into runner metadata)",
417
+ "docker.sock mounting"
418
+ ]
419
+ },
420
+ "mesaCache": {
421
+ "docker": {
422
+ "version": "29.7.2",
423
+ "buildx": {
424
+ "cache": "gha",
425
+ "optimization": "103s -> 25s",
426
+ "provenance": false
427
+ },
428
+ "hostConfig": {
429
+ "memorySwap": -1,
430
+ "memorySwapNote": "-1 unlimited sentinel disables swap limit, allows unlimited swap if Memory set",
431
+ "shmSize": 2147483648,
432
+ "shmSizeHuman": "2g",
433
+ "tmpfs": {
434
+ "/tmp/mesa_shader_cache": "rw,exec,size=20G",
435
+ "/dev/shm": "rw,size=2G"
436
+ },
437
+ "env": {
438
+ "mesaShaderCacheDir": "/tmp/mesa_shader_cache",
439
+ "mesaShaderCacheMaxSize": "20G",
440
+ "galliumOverrideCpuCaps": "avx512f+avx512bw+avx512cd+avx512dq+avx512vl",
441
+ "lpNativeVectorWidth": "512",
442
+ "lpNumThreads": "0",
443
+ "mesaGlVersionOverride": "4.6",
444
+ "mesaGlslVersionOverride": "460"
445
+ }
446
+ },
447
+ "xvfb": {
448
+ "display": ":99",
449
+ "screen": "0 1920x1080x24",
450
+ "args": "+extension GLX +render -noreset",
451
+ "dri3": true,
452
+ "glx": true
453
+ },
454
+ "image": {
455
+ "base": "ubuntu:24.04",
456
+ "mesa": "26.2.1",
457
+ "llvm": "22.1.8"
458
+ }
459
+ }
460
+ },
461
+ "buildxReference": {
462
+ "version": "0.36.1",
463
+ "cacheStrategy": {
464
+ "cacheFrom": "type=gha,scope=vhe",
465
+ "cacheTo": "type=gha,scope=vhe,mode=max",
466
+ "note": "GitHub Actions cache backend; mode=max exports intermediate layers"
467
+ },
468
+ "multiArch": {
469
+ "platforms": [
470
+ "linux/amd64",
471
+ "linux/arm64"
472
+ ],
473
+ "command": "docker buildx build --platform linux/amd64,linux/arm64 --cache-from type=gha --cache-to type=gha,mode=max --push -t ghcr.io/vhe/sandbox:29.7.2 ."
474
+ },
475
+ "actionsWorkflowUses": [
476
+ "docker/setup-buildx-action@v4.3.0",
477
+ "docker/build-push-action@v7.3.0",
478
+ "docker/login-action@v4.6.0",
479
+ "docker/metadata-action@v6.2.0"
480
+ ],
481
+ "cacheGhaNested": null
482
+ },
483
+ "composeReference": {
484
+ "version": "5.5.0",
485
+ "highlights": {
486
+ "5.4.0": "declarative reconciliation engine for volumes/networks (2026-08-03)",
487
+ "5.5.0": "reformulated image digest reconciliation (2026-08-17)"
488
+ },
489
+ "serviceExample": {
490
+ "service": "vhe-sandbox",
491
+ "image": "ghcr.io/vhe/sandbox:29.7.2",
492
+ "memswapLimit": -1,
493
+ "shmSize": "2g",
494
+ "cpus": 16,
495
+ "cpuset": "0-15",
496
+ "pidsLimit": 8192,
497
+ "tmpfs": [
498
+ "/tmp:size=20G"
499
+ ],
500
+ "capDrop": [
501
+ "ALL"
502
+ ],
503
+ "capAdd": [
504
+ "CHOWN",
505
+ "SETUID",
506
+ "SETGID"
507
+ ],
508
+ "securityOpt": [
509
+ "no-new-privileges:true",
510
+ "seccomp:./vhe-seccomp.json"
511
+ ],
512
+ "ulimits": {
513
+ "nofile": {
514
+ "soft": 1048576,
515
+ "hard": 1048576
516
+ }
517
+ },
518
+ "environment": [
519
+ "LIBGL_ALWAYS_SOFTWARE=true",
520
+ "LP_NUM_THREADS=0",
521
+ "RUSTICL_ENABLE=llvmpipe",
522
+ "VK_DRIVER_FILES=/usr/share/vulkan/icd.d/lvp_icd.x86_64.json"
523
+ ],
524
+ "deploy": {
525
+ "resources": {
526
+ "limits": {
527
+ "memory": "64g",
528
+ "cpus": "16"
529
+ }
530
+ }
531
+ },
532
+ "healthcheck": {
533
+ "test": [
534
+ "CMD",
535
+ "glxinfo",
536
+ "-B"
537
+ ],
538
+ "interval": "30s",
539
+ "retries": 3
540
+ }
541
+ }
542
+ },
543
+ "seccomp": {
544
+ "defaultProfile": "Docker default profile blocks io_uring syscalls (io_uring_setup/io_uring_register/io_uring_enter) since moby#47532",
545
+ "rationale2026": [
546
+ "io_uring is the top syscall-based attack surface (CVE-2026-46315 info disclosure; K8s CIS benchmarks recommend blocking)",
547
+ "gVisor disables io_uring by default for the same reason"
548
+ ],
549
+ "vheProfileAdditions": {
550
+ "blocked": [
551
+ "io_uring_setup",
552
+ "io_uring_register",
553
+ "io_uring_enter",
554
+ "perf_event_open",
555
+ "kexec_load",
556
+ "bpf (unprivileged)"
557
+ ],
558
+ "allowedForEngine": [
559
+ "process_vm_readv (nvml-unified-shim reads guest CUDA), userfaultfd (CRIU/CH snapshot offload)"
560
+ ]
561
+ },
562
+ "lwnNote": "task-level io_uring restrictions patchset (LWN 1054225) may re-enable per-task seccomp-compatible io_uring in future kernels"
563
+ },
564
+ "runtimes": {
565
+ "runc": {
566
+ "role": "default OCI runtime"
567
+ },
568
+ "runsc": {
569
+ "provider": "gVisor",
570
+ "release": "20260817.0 (2026-08-19, weekly cadence)",
571
+ "platform": "systrap (default; ptrace and KVM platforms available)",
572
+ "overhead": "10-30% typical I/O-bound; up to 2x on syscall-heavy workloads; DirectFS reduces filesystem overhead",
573
+ "use": "--runtime=runsc for untrusted workloads on hosts without KVM (works where Kata/Firecracker cannot run)",
574
+ "source": "gvisor.dev/docs/architecture_guide/platforms"
575
+ },
576
+ "kataRuntime": {
577
+ "version": "4.1.0 (2026-08-21)",
578
+ "runtimeRs": "Rust runtime is default since 4.0; Go runtime deprecated (removal no earlier than 5.0.0)",
579
+ "hypervisors": [
580
+ "cloud-hypervisor",
581
+ "qemu",
582
+ "firecracker",
583
+ "dragonball",
584
+ "openvmm (4.1)"
585
+ ],
586
+ "requirement": "KVM strongly recommended (microVM) - not available on GitHub-hosted runners",
587
+ "features41": [
588
+ "OpenVMM support",
589
+ "Cloud Hypervisor VM templates",
590
+ "CLH nested virt toggle",
591
+ "NVSwitch passthrough via IOMMUFD",
592
+ "rootless + seccomp baseline for QEMU"
593
+ ]
594
+ }
595
+ },
596
+ "exampleFullRun": "docker run --rm --runtime=runc --memory=64g --memory-swap=-1 --shm-size=2g --cpus=16 --cpuset-cpus=0-15 --nano-cpus=16000000000 --pids-limit=8192 --tmpfs /tmp:rw,size=20G,exec --cap-drop=ALL --cap-add=CHOWN --cap-add=SETUID --cap-add=SETGID --security-opt=no-new-privileges --security-opt seccomp=/etc/docker/vhe-seccomp.json --ulimit nofile=1048576 -e LIBGL_ALWAYS_SOFTWARE=true -e LP_NUM_THREADS=0 -e RUSTICL_ENABLE=llvmpipe -e VK_DRIVER_FILES=/usr/share/vulkan/icd.d/lvp_icd.x86_64.json ghcr.io/vhe/sandbox:29.7.2 glxinfo -B",
597
+ "engineIntegration": {
598
+ "vmProfileLink": "vm.config.json profiles map 1:1 to docker run flags (vcpus->cpus/nano-cpus, ram->memory, disk.tmpfs_gb->tmpfs)",
599
+ "memorySpoofChain": "--memory-swap=-1 + vm.overcommit_memory=2 + zram + LD_PRELOAD memoverlay (proc/meminfo rewrite) + dolos-style sysinfo(totalram) hook",
600
+ "shmAndPytorch": "every AI profile (ai, ai-training, ai-cluster, llm-inference, inference-mig) MUST set shm_size 2g minimum",
601
+ "githubRunnerNote": "Docker runs natively on GitHub-hosted runners even though /dev/kvm does not exist (passage.json) - the Docker+gVisor path is the only hardened sandbox path on hosted CI"
602
+ },
603
+ "healthcheck": {
604
+ "test": [
605
+ "CMD-SHELL",
606
+ "qemu-system-x86_64 --version | grep -q '11.1.0' && curl -fsS http://localhost:8080/health | grep -q 'ok' || exit 1"
607
+ ],
608
+ "interval": "30s",
609
+ "timeout": "10s",
610
+ "startPeriod": "45s",
611
+ "startInterval": "5s",
612
+ "retries": 3,
613
+ "curlVersion": "7.88.1",
614
+ "qemuCheck": "qemu-system-x86_64 --version",
615
+ "fallback": "qemu-system-x86_64 --help && ls -l /dev/kvm || true",
616
+ "errorCatcherType": "healthcheck-failure logs to /var/log/saddle/health.log with 44px touch target for dashboard"
617
+ },
618
+ "labels": {
619
+ "org.opencontainers.image.title": "saddle-v6",
620
+ "org.opencontainers.image.description": "Saddle v6 virtualization orchestrator with QEMU 11.1.0, Node 22 LTS, Python 3.13.5, MTTG, Passage, OVMF",
621
+ "org.opencontainers.image.version": "2.0.0",
622
+ "org.opencontainers.image.created": "2026-08-22T00:00:00Z",
623
+ "org.opencontainers.image.authors": "Saddle Core <core@saddle.dev>",
624
+ "org.opencontainers.image.url": "https://saddle.dev",
625
+ "org.opencontainers.image.documentation": "https://saddle.dev/docs/v6",
626
+ "org.opencontainers.image.source": "https://github.com/saddle-dev/saddle-v6",
627
+ "org.opencontainers.image.revision": "main@2026-08-22",
628
+ "org.opencontainers.image.licenses": "MIT",
629
+ "org.opencontainers.image.vendor": "Saddle",
630
+ "org.opencontainers.image.base.name": "debian:bookworm-slim",
631
+ "org.opencontainers.image.base.digest": "sha256:bookworm-slim-pinned-2026-08-22",
632
+ "saddle": {
633
+ "com.saddle.version": "2.0.0",
634
+ "com.saddle.engine": "qemu-11.1.0",
635
+ "com.saddle.modes": "32",
636
+ "com.saddle.forge.mirrors": "github,gitea,forgejo",
637
+ "com.saddle.memory": "internal-priority",
638
+ "com.saddle.virtualization": "kvm+qemu",
639
+ "com.saddle.passage": "pipelined-memory-passage",
640
+ "com.saddle.boards": "am4,am5,threadripper,epyc",
641
+ "com.saddle.gpu": "nvidia-blackwell,broadcom,amd-rdna4",
642
+ "com.saddle.cgroups": "v2",
643
+ "com.saddle.cdi": "nvidia-560.35.05",
644
+ "com.saddle.build.date": "2026-08-22",
645
+ "com.saddle.build.node": "24.19.0",
646
+ "com.saddle.build.python": "3.13.5",
647
+ "com.saddle.build.docker": "29.7.2",
648
+ "com.saddle.build.buildx": "0.18.1",
649
+ "com.saddle.build.buildkit": "0.16.0"
650
+ }
651
+ },
652
+ "build": {
653
+ "context": ".",
654
+ "dockerfileInline": "# syntax=docker/dockerfile:1.6\n# @observer Multi-stage Dockerfile - pinned versions 2026-08-22\nARG NODE_VERSION=24.19.0\nARG PYTHON_VERSION=3.13.5\nARG QEMU_VERSION=11.1.0\n\nFROM node:${NODE_VERSION}-alpine AS builder\nWORKDIR /saddle\nRUN apk add --no-cache python3 make g++ git curl tini\nCOPY package.json tsconfig.json ./\nRUN npm ci --ignore-scripts\nCOPY . .\nRUN npx tsc -p tsconfig.json\n\nFROM python:${PYTHON_VERSION}-slim AS pybridge\nWORKDIR /saddle\nCOPY pyproject.toml ./\nRUN pip install --no-cache-dir --upgrade pip==24.3.1 && pip install -e .\n\nFROM debian:bookworm-slim AS runtime-base\nRUN apt-get update && apt-get install -y --no-install-recommends qemu-system-x86=1:11.1.0 (built from source) ovmf pciutils curl tini kmod && rm -rf /var/lib/apt/lists/*\nCOPY --from=builder /saddle/dist /saddle/dist\nCOPY --from=builder /saddle/node_modules /saddle/node_modules\nCOPY --from=pybridge /usr/local/lib/python3.13/site-packages /usr/local/lib/python3.13/site-packages\nRUN groupadd -r saddle -g 1001 && useradd -r -g saddle -u 1001 -m saddle\nWORKDIR /saddle\nUSER saddle\nENTRYPOINT [\"/usr/bin/tini\", \"--\"]\nHEALTHCHECK --interval=30s --timeout=10s --start-period=45s --retries=3 CMD qemu-system-x86_64 --version && curl -fsS http://localhost:8080/health || exit 1\nCMD [\"node\", \"dist/index.js\"]\n\nLABEL org.opencontainers.image.title=\"saddle-v6\" \\\n org.opencontainers.image.version=\"6.0.0\" \\\n org.opencontainers.image.created=\"2026-08-22T00:00:00Z\" \\\n com.saddle.cdi=\"nvidia\" \\\n com.saddle.cgroups=\"v2\"\n",
655
+ "target": "runtime-base",
656
+ "platforms": [
657
+ "linux/amd64",
658
+ "linux/arm64"
659
+ ],
660
+ "cacheFrom": [
661
+ "type=gha",
662
+ "type=registry,ref=ghcr.io/saddle-dev/saddle-v6:buildcache"
663
+ ],
664
+ "cacheTo": [
665
+ "type=gha,mode=max",
666
+ "type=registry,ref=ghcr.io/saddle-dev/saddle-v6:buildcache,mode=max"
667
+ ],
668
+ "args": {
669
+ "nodeVersion": "26.7.0",
670
+ "pythonVersion": "3.14.7",
671
+ "qemuVersion": "11.1.0"
672
+ },
673
+ "noCache": false,
674
+ "pull": true,
675
+ "sbom": true,
676
+ "provenance": "mode=max"
677
+ },
678
+ "githubActions": {
679
+ "checkout": "actions/checkout@v7.0.1",
680
+ "setupNode": "actions/setup-node@v7.0.0",
681
+ "setupPython": "actions/setup-python@v7.0.0",
682
+ "setupQemu": "docker/setup-qemu-action@v4.2.0",
683
+ "setupBuildx": "docker/setup-buildx-action@v4.3.0",
684
+ "cacheAction": "actions/cache@v6.1.0",
685
+ "dockerLogin": "docker/login-action@v4.6.0",
686
+ "dockerMetadata": "docker/metadata-action@v6.2.0",
687
+ "dockerBuildPush": "docker/build-push-action@v7.3.0",
688
+ "sbomAction": "anchore/sbom-action@v0.24.0",
689
+ "nodeVersionCi": "26.7.0",
690
+ "pythonVersionCi": "3.14.7",
691
+ "typescriptVersionCi": "7.0.2"
692
+ },
693
+ "security": {
694
+ "user": "saddle:1001",
695
+ "nonRoot": true,
696
+ "readOnly": false,
697
+ "noNewPrivileges": true,
698
+ "seccomp": "runtime/default",
699
+ "apparmor": "docker-default",
700
+ "capabilitiesDropAll": true,
701
+ "tiniInit": true,
702
+ "tiniPath": "/usr/bin/tini",
703
+ "errorCatcher": "on privilege escalation attempt, observer logs event and terminates container with code 126"
704
+ },
705
+ "volumes": {
706
+ "mounts": [
707
+ {
708
+ "source": "saddle-data",
709
+ "target": "/saddle/data",
710
+ "type": "volume"
711
+ },
712
+ {
713
+ "source": "/dev/kvm",
714
+ "target": "/dev/kvm",
715
+ "type": "bind",
716
+ "readOnly": false
717
+ },
718
+ {
719
+ "source": "ovmf-vars",
720
+ "target": "/var/lib/saddle/ovmf",
721
+ "type": "volume"
722
+ }
723
+ ]
724
+ },
725
+ "network": {
726
+ "driver": "bridge",
727
+ "ports": [
728
+ "8080:8080",
729
+ "8081:8081"
730
+ ],
731
+ "dns": [
732
+ "1.1.1.1",
733
+ "8.8.8.8"
734
+ ],
735
+ "hostGateway": true
736
+ },
737
+ "logging": {
738
+ "driver": "json-file",
739
+ "maxSize": "50m",
740
+ "maxFiles": 5,
741
+ "labels": [
742
+ "com.saddle.version",
743
+ "org.opencontainers.image.version"
744
+ ],
745
+ "errorLog": "/var/log/saddle/docker.error.log"
746
+ },
747
+ "errorcatcher": {
748
+ "layer1": "build-time: docker build --progress=plain fails fast with exit codes 1-3",
749
+ "layer2": "runtime-time: healthcheck curl qemu version retries 3 times before marking unhealthy",
750
+ "layer3": "host-time: cgroups v2 OOM killer logs to /var/log/saddle/oom.log, tini reaps zombies",
751
+ "codes": {
752
+ "buildFail": 1,
753
+ "pipFail": 2,
754
+ "qemuMissing": 3,
755
+ "healthFail": 4,
756
+ "cgroupsFail": 5,
757
+ "cdiMissing": 6
758
+ },
759
+ "contact": "44px touch target for error UI in dashboard, third-person logs"
760
+ },
761
+ "compatibility": {
762
+ "requiresKvm": true,
763
+ "requiresCgroupsV2": true,
764
+ "requiresCdi": "optional for gpu",
765
+ "kernelMin": "5.15.0",
766
+ "dockerMin": "29.7.2",
767
+ "notes": "The observer confirms compatibility on Ubuntu 24.04 LTS, Debian 12, Fedora 40 as of 2026-08-22"
768
+ }
769
+ }