@wenathlan/saddle 1.8.17 → 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 (1005) hide show
  1. package/Dockerfile +1339 -0
  2. package/README.md +68 -22
  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 -122
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +1018 -122
  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.d.ts +129 -0
  69. package/dist/isolation.d.ts.map +1 -0
  70. package/dist/isolation.js +96 -0
  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/artifactavailability.md +6 -0
  148. package/docs/brancharchive-2026-08-18.md +18 -0
  149. package/docs/browser.md +7 -0
  150. package/docs/consolidation.md +70 -0
  151. package/docs/e2ugh-engine.md +528 -0
  152. package/{dist/examples/localjob.js → docs/example-localjob.ts} +3 -3
  153. package/{dist/examples/publicapi.js → docs/example-publicapi.ts} +2 -2
  154. package/docs/hardware.md +342 -0
  155. package/docs/optimization.md +126 -0
  156. package/docs/performance.md +499 -0
  157. package/docs/planning.1.8.18.md +94 -0
  158. package/docs/planning.1.8.19.md +49 -0
  159. package/docs/releasenotes-1.8.17.md +6 -0
  160. package/docs/releasenotes-1.8.18.md +32 -0
  161. package/docs/releasenotes-1.8.19.md +35 -0
  162. package/docs/research-1.8.18-isolation.md +43 -0
  163. package/docs/research-1.8.19-virtual-browser.md +27 -0
  164. package/docs/saddle.archive.1.8.17.tar.gz.gpg +0 -0
  165. package/docs/security.md +454 -0
  166. package/docs/todo-1.8.16.md +56 -1
  167. package/docs/todo-1.8.18.md +164 -0
  168. package/docs/todo-1.8.19.md +241 -0
  169. package/docs/viability.md +777 -0
  170. package/docs/virtualization.md +335 -0
  171. package/docs/web-duplicatecleanup.md +9 -0
  172. package/docs/web-ideas.md +106 -0
  173. package/docs/workflowimprovements-2026-08-19.md +70 -0
  174. package/gpumonitor.cpp +1543 -0
  175. package/gpus.json +2408 -0
  176. package/index.ts +1478 -0
  177. package/media.ts +1337 -0
  178. package/mttg.config +1549 -0
  179. package/orchestrator.ts +5462 -0
  180. package/package.json +304 -55
  181. package/passage.config +1331 -0
  182. package/performance.ts +1049 -0
  183. package/processors.json +2217 -0
  184. package/qemu.config +1062 -0
  185. package/qemubridge.py +1340 -0
  186. package/quantum.ts +2393 -0
  187. package/render.ts +1325 -0
  188. package/scheduler.ts +1600 -0
  189. package/security.ts +1449 -0
  190. package/tiers.ts +2871 -0
  191. package/tsconfig.json +29 -0
  192. package/virtualcpu.ts +1273 -0
  193. package/virtualgpu.ts +1181 -0
  194. package/virtualhardware.c +1011 -0
  195. package/virtualhardware.json +739 -0
  196. package/virtualization.ts +1628 -0
  197. package/virtualizationcore.cpp +4635 -0
  198. package/virtualmemory.ts +2303 -0
  199. package/vm.config.json +1910 -0
  200. package/{extension → web/extension}/manifest.json +1 -1
  201. package/web/readme.md +382 -0
  202. package/web/tsconfig.json +25 -0
  203. package/dist/adapters/forge.d.ts +0 -17
  204. package/dist/adapters/forge.d.ts.map +0 -1
  205. package/dist/adapters/forge.js +0 -19
  206. package/dist/adapters/forge.js.map +0 -1
  207. package/dist/adapters/forgejo.d.ts +0 -49
  208. package/dist/adapters/forgejo.d.ts.map +0 -1
  209. package/dist/adapters/forgejo.js +0 -8
  210. package/dist/adapters/forgejo.js.map +0 -1
  211. package/dist/adapters/github.d.ts +0 -12
  212. package/dist/adapters/github.d.ts.map +0 -1
  213. package/dist/adapters/github.js +0 -20
  214. package/dist/adapters/github.js.map +0 -1
  215. package/dist/adapters/gitlab.d.ts +0 -17
  216. package/dist/adapters/gitlab.d.ts.map +0 -1
  217. package/dist/adapters/gitlab.js +0 -10
  218. package/dist/adapters/gitlab.js.map +0 -1
  219. package/dist/adapters/huggingface.d.ts +0 -17
  220. package/dist/adapters/huggingface.d.ts.map +0 -1
  221. package/dist/adapters/huggingface.js +0 -6
  222. package/dist/adapters/huggingface.js.map +0 -1
  223. package/dist/adapters/socket.d.ts +0 -11
  224. package/dist/adapters/socket.d.ts.map +0 -1
  225. package/dist/adapters/socket.js +0 -17
  226. package/dist/adapters/socket.js.map +0 -1
  227. package/dist/adapters/transport.d.ts +0 -7
  228. package/dist/adapters/transport.d.ts.map +0 -1
  229. package/dist/adapters/transport.js +0 -36
  230. package/dist/adapters/transport.js.map +0 -1
  231. package/dist/ai/chunk.d.ts +0 -2
  232. package/dist/ai/chunk.d.ts.map +0 -1
  233. package/dist/ai/chunk.js +0 -36
  234. package/dist/ai/chunk.js.map +0 -1
  235. package/dist/ai/llmstxt.d.ts +0 -6
  236. package/dist/ai/llmstxt.d.ts.map +0 -1
  237. package/dist/ai/llmstxt.js +0 -12
  238. package/dist/ai/llmstxt.js.map +0 -1
  239. package/dist/ai/provenance.d.ts +0 -22
  240. package/dist/ai/provenance.d.ts.map +0 -1
  241. package/dist/ai/provenance.js +0 -25
  242. package/dist/ai/provenance.js.map +0 -1
  243. package/dist/ai/rag.d.ts +0 -26
  244. package/dist/ai/rag.d.ts.map +0 -1
  245. package/dist/ai/rag.js +0 -22
  246. package/dist/ai/rag.js.map +0 -1
  247. package/dist/ai/tokens.d.ts +0 -15
  248. package/dist/ai/tokens.d.ts.map +0 -1
  249. package/dist/ai/tokens.js +0 -9
  250. package/dist/ai/tokens.js.map +0 -1
  251. package/dist/api/auth.d.ts +0 -16
  252. package/dist/api/auth.d.ts.map +0 -1
  253. package/dist/api/auth.js +0 -19
  254. package/dist/api/auth.js.map +0 -1
  255. package/dist/api/contracts.d.ts +0 -28
  256. package/dist/api/contracts.d.ts.map +0 -1
  257. package/dist/api/contracts.js +0 -14
  258. package/dist/api/contracts.js.map +0 -1
  259. package/dist/api/control.d.ts +0 -10
  260. package/dist/api/control.d.ts.map +0 -1
  261. package/dist/api/control.js +0 -35
  262. package/dist/api/control.js.map +0 -1
  263. package/dist/api/http.d.ts +0 -7
  264. package/dist/api/http.d.ts.map +0 -1
  265. package/dist/api/http.js +0 -12
  266. package/dist/api/http.js.map +0 -1
  267. package/dist/api/rate.d.ts +0 -28
  268. package/dist/api/rate.d.ts.map +0 -1
  269. package/dist/api/rate.js +0 -36
  270. package/dist/api/rate.js.map +0 -1
  271. package/dist/api/security.d.ts +0 -12
  272. package/dist/api/security.d.ts.map +0 -1
  273. package/dist/api/security.js +0 -56
  274. package/dist/api/security.js.map +0 -1
  275. package/dist/api/service.d.ts +0 -5
  276. package/dist/api/service.d.ts.map +0 -1
  277. package/dist/api/service.js +0 -70
  278. package/dist/api/service.js.map +0 -1
  279. package/dist/apps/registry.d.ts +0 -33
  280. package/dist/apps/registry.d.ts.map +0 -1
  281. package/dist/apps/registry.js +0 -24
  282. package/dist/apps/registry.js.map +0 -1
  283. package/dist/binary/archive.d.ts +0 -27
  284. package/dist/binary/archive.d.ts.map +0 -1
  285. package/dist/binary/archive.js +0 -46
  286. package/dist/binary/archive.js.map +0 -1
  287. package/dist/binary/build.d.ts +0 -29
  288. package/dist/binary/build.d.ts.map +0 -1
  289. package/dist/binary/build.js +0 -17
  290. package/dist/binary/build.js.map +0 -1
  291. package/dist/binary/transform.d.ts +0 -70
  292. package/dist/binary/transform.d.ts.map +0 -1
  293. package/dist/binary/transform.js +0 -105
  294. package/dist/binary/transform.js.map +0 -1
  295. package/dist/bot/adapter.d.ts +0 -5
  296. package/dist/bot/adapter.d.ts.map +0 -1
  297. package/dist/bot/adapter.js +0 -11
  298. package/dist/bot/adapter.js.map +0 -1
  299. package/dist/bot/bot.d.ts +0 -28
  300. package/dist/bot/bot.d.ts.map +0 -1
  301. package/dist/bot/bot.js +0 -52
  302. package/dist/bot/bot.js.map +0 -1
  303. package/dist/bot/commands.d.ts +0 -8
  304. package/dist/bot/commands.d.ts.map +0 -1
  305. package/dist/bot/commands.js +0 -19
  306. package/dist/bot/commands.js.map +0 -1
  307. package/dist/bot/permissions.d.ts +0 -13
  308. package/dist/bot/permissions.d.ts.map +0 -1
  309. package/dist/bot/permissions.js +0 -16
  310. package/dist/bot/permissions.js.map +0 -1
  311. package/dist/browser/actions.d.ts +0 -33
  312. package/dist/browser/actions.d.ts.map +0 -1
  313. package/dist/browser/actions.js +0 -44
  314. package/dist/browser/actions.js.map +0 -1
  315. package/dist/browser/agent.d.ts +0 -21
  316. package/dist/browser/agent.d.ts.map +0 -1
  317. package/dist/browser/agent.js +0 -13
  318. package/dist/browser/agent.js.map +0 -1
  319. package/dist/browser/context.d.ts +0 -43
  320. package/dist/browser/context.d.ts.map +0 -1
  321. package/dist/browser/context.js +0 -54
  322. package/dist/browser/context.js.map +0 -1
  323. package/dist/browser/fingerprint.d.ts +0 -4
  324. package/dist/browser/fingerprint.d.ts.map +0 -1
  325. package/dist/browser/fingerprint.js +0 -12
  326. package/dist/browser/fingerprint.js.map +0 -1
  327. package/dist/browser/index.d.ts +0 -11
  328. package/dist/browser/index.d.ts.map +0 -1
  329. package/dist/browser/index.js +0 -11
  330. package/dist/browser/index.js.map +0 -1
  331. package/dist/browser/playwright.d.ts +0 -11
  332. package/dist/browser/playwright.d.ts.map +0 -1
  333. package/dist/browser/playwright.js +0 -24
  334. package/dist/browser/playwright.js.map +0 -1
  335. package/dist/browser/recorder.d.ts +0 -21
  336. package/dist/browser/recorder.d.ts.map +0 -1
  337. package/dist/browser/recorder.js +0 -58
  338. package/dist/browser/recorder.js.map +0 -1
  339. package/dist/browser/session.d.ts +0 -14
  340. package/dist/browser/session.d.ts.map +0 -1
  341. package/dist/browser/session.js +0 -21
  342. package/dist/browser/session.js.map +0 -1
  343. package/dist/browser/snapshot.d.ts +0 -69
  344. package/dist/browser/snapshot.d.ts.map +0 -1
  345. package/dist/browser/snapshot.js +0 -133
  346. package/dist/browser/snapshot.js.map +0 -1
  347. package/dist/captcha/contract.d.ts +0 -35
  348. package/dist/captcha/contract.d.ts.map +0 -1
  349. package/dist/captcha/contract.js +0 -17
  350. package/dist/captcha/contract.js.map +0 -1
  351. package/dist/captcha/evidence.d.ts +0 -10
  352. package/dist/captcha/evidence.d.ts.map +0 -1
  353. package/dist/captcha/evidence.js +0 -9
  354. package/dist/captcha/evidence.js.map +0 -1
  355. package/dist/captcha/guard.d.ts +0 -23
  356. package/dist/captcha/guard.d.ts.map +0 -1
  357. package/dist/captcha/guard.js +0 -12
  358. package/dist/captcha/guard.js.map +0 -1
  359. package/dist/cli/main.d.ts +0 -4
  360. package/dist/cli/main.d.ts.map +0 -1
  361. package/dist/cli/main.js +0 -46
  362. package/dist/cli/main.js.map +0 -1
  363. package/dist/core/errors.d.ts +0 -84
  364. package/dist/core/errors.d.ts.map +0 -1
  365. package/dist/core/errors.js +0 -54
  366. package/dist/core/errors.js.map +0 -1
  367. package/dist/core/events.d.ts +0 -9
  368. package/dist/core/events.d.ts.map +0 -1
  369. package/dist/core/events.js +0 -21
  370. package/dist/core/events.js.map +0 -1
  371. package/dist/core/hash.d.ts +0 -10
  372. package/dist/core/hash.d.ts.map +0 -1
  373. package/dist/core/hash.js +0 -82
  374. package/dist/core/hash.js.map +0 -1
  375. package/dist/core/ids.d.ts +0 -10
  376. package/dist/core/ids.d.ts.map +0 -1
  377. package/dist/core/ids.js +0 -15
  378. package/dist/core/ids.js.map +0 -1
  379. package/dist/delivery/manifest.d.ts +0 -35
  380. package/dist/delivery/manifest.d.ts.map +0 -1
  381. package/dist/delivery/manifest.js +0 -68
  382. package/dist/delivery/manifest.js.map +0 -1
  383. package/dist/deploy/index.d.ts +0 -6
  384. package/dist/deploy/index.d.ts.map +0 -1
  385. package/dist/deploy/index.js +0 -6
  386. package/dist/deploy/index.js.map +0 -1
  387. package/dist/dispatch/resumable.d.ts +0 -102
  388. package/dist/dispatch/resumable.d.ts.map +0 -1
  389. package/dist/dispatch/resumable.js +0 -64
  390. package/dist/dispatch/resumable.js.map +0 -1
  391. package/dist/dispatch/workflow.d.ts +0 -6
  392. package/dist/dispatch/workflow.d.ts.map +0 -1
  393. package/dist/dispatch/workflow.js +0 -37
  394. package/dist/dispatch/workflow.js.map +0 -1
  395. package/dist/domain/artifacts.d.ts +0 -12
  396. package/dist/domain/artifacts.d.ts.map +0 -1
  397. package/dist/domain/artifacts.js +0 -14
  398. package/dist/domain/artifacts.js.map +0 -1
  399. package/dist/domain/jobs.d.ts +0 -12
  400. package/dist/domain/jobs.d.ts.map +0 -1
  401. package/dist/domain/jobs.js +0 -20
  402. package/dist/domain/jobs.js.map +0 -1
  403. package/dist/domain/providers.d.ts +0 -10
  404. package/dist/domain/providers.d.ts.map +0 -1
  405. package/dist/domain/providers.js +0 -8
  406. package/dist/domain/providers.js.map +0 -1
  407. package/dist/domain/runtime.d.ts +0 -14
  408. package/dist/domain/runtime.d.ts.map +0 -1
  409. package/dist/domain/runtime.js +0 -10
  410. package/dist/domain/runtime.js.map +0 -1
  411. package/dist/domain/sessions.d.ts +0 -12
  412. package/dist/domain/sessions.d.ts.map +0 -1
  413. package/dist/domain/sessions.js +0 -57
  414. package/dist/domain/sessions.js.map +0 -1
  415. package/dist/examples/localjob.d.ts +0 -2
  416. package/dist/examples/localjob.d.ts.map +0 -1
  417. package/dist/examples/localjob.js.map +0 -1
  418. package/dist/examples/publicapi.d.ts +0 -2
  419. package/dist/examples/publicapi.d.ts.map +0 -1
  420. package/dist/examples/publicapi.js.map +0 -1
  421. package/dist/extension/build.d.ts +0 -9
  422. package/dist/extension/build.d.ts.map +0 -1
  423. package/dist/extension/build.js +0 -85
  424. package/dist/extension/build.js.map +0 -1
  425. package/dist/extension/content.d.ts +0 -6
  426. package/dist/extension/content.d.ts.map +0 -1
  427. package/dist/extension/content.js +0 -135
  428. package/dist/extension/content.js.map +0 -1
  429. package/dist/extension/index.d.ts +0 -7
  430. package/dist/extension/index.d.ts.map +0 -1
  431. package/dist/extension/index.js +0 -7
  432. package/dist/extension/index.js.map +0 -1
  433. package/dist/extension/pagebridge.d.ts +0 -6
  434. package/dist/extension/pagebridge.d.ts.map +0 -1
  435. package/dist/extension/pagebridge.js +0 -42
  436. package/dist/extension/pagebridge.js.map +0 -1
  437. package/dist/extension/permissions.d.ts +0 -26
  438. package/dist/extension/permissions.d.ts.map +0 -1
  439. package/dist/extension/permissions.js +0 -28
  440. package/dist/extension/permissions.js.map +0 -1
  441. package/dist/extension/popup.d.ts +0 -5
  442. package/dist/extension/popup.d.ts.map +0 -1
  443. package/dist/extension/popup.js +0 -26
  444. package/dist/extension/popup.js.map +0 -1
  445. package/dist/extension/protocol.d.ts +0 -58
  446. package/dist/extension/protocol.d.ts.map +0 -1
  447. package/dist/extension/protocol.js +0 -101
  448. package/dist/extension/protocol.js.map +0 -1
  449. package/dist/extension/serviceworker.d.ts +0 -25
  450. package/dist/extension/serviceworker.d.ts.map +0 -1
  451. package/dist/extension/serviceworker.js +0 -102
  452. package/dist/extension/serviceworker.js.map +0 -1
  453. package/dist/extension/worker.d.ts +0 -28
  454. package/dist/extension/worker.d.ts.map +0 -1
  455. package/dist/extension/worker.js +0 -22
  456. package/dist/extension/worker.js.map +0 -1
  457. package/dist/format/check.d.ts +0 -8
  458. package/dist/format/check.d.ts.map +0 -1
  459. package/dist/format/check.js +0 -38
  460. package/dist/format/check.js.map +0 -1
  461. package/dist/library/public.d.ts.map +0 -1
  462. package/dist/library/public.js.map +0 -1
  463. package/dist/mcp/browser.d.ts +0 -9
  464. package/dist/mcp/browser.d.ts.map +0 -1
  465. package/dist/mcp/browser.js +0 -13
  466. package/dist/mcp/browser.js.map +0 -1
  467. package/dist/mcp/server.d.ts +0 -35
  468. package/dist/mcp/server.d.ts.map +0 -1
  469. package/dist/mcp/server.js +0 -40
  470. package/dist/mcp/server.js.map +0 -1
  471. package/dist/mcp/transport.d.ts +0 -7
  472. package/dist/mcp/transport.d.ts.map +0 -1
  473. package/dist/mcp/transport.js +0 -17
  474. package/dist/mcp/transport.js.map +0 -1
  475. package/dist/memory/bridge.d.ts +0 -14
  476. package/dist/memory/bridge.d.ts.map +0 -1
  477. package/dist/memory/bridge.js +0 -16
  478. package/dist/memory/bridge.js.map +0 -1
  479. package/dist/memory/engine.d.ts +0 -38
  480. package/dist/memory/engine.d.ts.map +0 -1
  481. package/dist/memory/engine.js +0 -109
  482. package/dist/memory/engine.js.map +0 -1
  483. package/dist/memory/modes.d.ts +0 -43
  484. package/dist/memory/modes.d.ts.map +0 -1
  485. package/dist/memory/modes.js +0 -66
  486. package/dist/memory/modes.js.map +0 -1
  487. package/dist/memory/objects.d.ts +0 -21
  488. package/dist/memory/objects.d.ts.map +0 -1
  489. package/dist/memory/objects.js +0 -20
  490. package/dist/memory/objects.js.map +0 -1
  491. package/dist/memory/planner.d.ts +0 -66
  492. package/dist/memory/planner.d.ts.map +0 -1
  493. package/dist/memory/planner.js +0 -108
  494. package/dist/memory/planner.js.map +0 -1
  495. package/dist/memory/targets.d.ts +0 -78
  496. package/dist/memory/targets.d.ts.map +0 -1
  497. package/dist/memory/targets.js +0 -29
  498. package/dist/memory/targets.js.map +0 -1
  499. package/dist/memory/transforms.d.ts +0 -19
  500. package/dist/memory/transforms.d.ts.map +0 -1
  501. package/dist/memory/transforms.js +0 -14
  502. package/dist/memory/transforms.js.map +0 -1
  503. package/dist/modes/matrix.d.ts +0 -23
  504. package/dist/modes/matrix.d.ts.map +0 -1
  505. package/dist/modes/matrix.js +0 -18
  506. package/dist/modes/matrix.js.map +0 -1
  507. package/dist/modes/modes.d.ts +0 -33
  508. package/dist/modes/modes.d.ts.map +0 -1
  509. package/dist/modes/modes.js +0 -15
  510. package/dist/modes/modes.js.map +0 -1
  511. package/dist/modes/resolve.d.ts +0 -96
  512. package/dist/modes/resolve.d.ts.map +0 -1
  513. package/dist/modes/resolve.js +0 -48
  514. package/dist/modes/resolve.js.map +0 -1
  515. package/dist/observability/metrics.d.ts +0 -14
  516. package/dist/observability/metrics.d.ts.map +0 -1
  517. package/dist/observability/metrics.js +0 -18
  518. package/dist/observability/metrics.js.map +0 -1
  519. package/dist/packager/manifest.d.ts +0 -66
  520. package/dist/packager/manifest.d.ts.map +0 -1
  521. package/dist/packager/manifest.js +0 -94
  522. package/dist/packager/manifest.js.map +0 -1
  523. package/dist/packager/publish.d.ts +0 -51
  524. package/dist/packager/publish.d.ts.map +0 -1
  525. package/dist/packager/publish.js +0 -18
  526. package/dist/packager/publish.js.map +0 -1
  527. package/dist/packager/targetcli.d.ts +0 -7
  528. package/dist/packager/targetcli.d.ts.map +0 -1
  529. package/dist/packager/targetcli.js +0 -22
  530. package/dist/packager/targetcli.js.map +0 -1
  531. package/dist/persistence/adapter.d.ts +0 -5
  532. package/dist/persistence/adapter.d.ts.map +0 -1
  533. package/dist/persistence/adapter.js +0 -11
  534. package/dist/persistence/adapter.js.map +0 -1
  535. package/dist/persistence/drizzle.d.ts +0 -2
  536. package/dist/persistence/drizzle.d.ts.map +0 -1
  537. package/dist/persistence/drizzle.js +0 -12
  538. package/dist/persistence/drizzle.js.map +0 -1
  539. package/dist/persistence/memory.d.ts +0 -2
  540. package/dist/persistence/memory.d.ts.map +0 -1
  541. package/dist/persistence/memory.js +0 -27
  542. package/dist/persistence/memory.js.map +0 -1
  543. package/dist/persistence/migrations.d.ts +0 -19
  544. package/dist/persistence/migrations.d.ts.map +0 -1
  545. package/dist/persistence/migrations.js +0 -13
  546. package/dist/persistence/migrations.js.map +0 -1
  547. package/dist/persistence/prisma.d.ts +0 -2
  548. package/dist/persistence/prisma.d.ts.map +0 -1
  549. package/dist/persistence/prisma.js +0 -25
  550. package/dist/persistence/prisma.js.map +0 -1
  551. package/dist/persistence/schema.d.ts +0 -63
  552. package/dist/persistence/schema.d.ts.map +0 -1
  553. package/dist/persistence/schema.js +0 -28
  554. package/dist/persistence/schema.js.map +0 -1
  555. package/dist/persistence/sql.d.ts +0 -3
  556. package/dist/persistence/sql.d.ts.map +0 -1
  557. package/dist/persistence/sql.js +0 -37
  558. package/dist/persistence/sql.js.map +0 -1
  559. package/dist/protocol/blocks.d.ts +0 -10
  560. package/dist/protocol/blocks.d.ts.map +0 -1
  561. package/dist/protocol/blocks.js +0 -26
  562. package/dist/protocol/blocks.js.map +0 -1
  563. package/dist/protocol/json.d.ts +0 -6
  564. package/dist/protocol/json.d.ts.map +0 -1
  565. package/dist/protocol/json.js +0 -6
  566. package/dist/protocol/json.js.map +0 -1
  567. package/dist/protocol/ndjson.d.ts +0 -3
  568. package/dist/protocol/ndjson.d.ts.map +0 -1
  569. package/dist/protocol/ndjson.js +0 -20
  570. package/dist/protocol/ndjson.js.map +0 -1
  571. package/dist/protocol/sse.d.ts +0 -7
  572. package/dist/protocol/sse.d.ts.map +0 -1
  573. package/dist/protocol/sse.js +0 -25
  574. package/dist/protocol/sse.js.map +0 -1
  575. package/dist/proxy/pool.d.ts +0 -9
  576. package/dist/proxy/pool.d.ts.map +0 -1
  577. package/dist/proxy/pool.js +0 -27
  578. package/dist/proxy/pool.js.map +0 -1
  579. package/dist/queue/idempotency.d.ts +0 -10
  580. package/dist/queue/idempotency.d.ts.map +0 -1
  581. package/dist/queue/idempotency.js +0 -13
  582. package/dist/queue/idempotency.js.map +0 -1
  583. package/dist/queue/persistent.d.ts +0 -14
  584. package/dist/queue/persistent.d.ts.map +0 -1
  585. package/dist/queue/persistent.js +0 -66
  586. package/dist/queue/persistent.js.map +0 -1
  587. package/dist/queue/queue.d.ts +0 -7
  588. package/dist/queue/queue.d.ts.map +0 -1
  589. package/dist/queue/queue.js +0 -55
  590. package/dist/queue/queue.js.map +0 -1
  591. package/dist/queue/saga.d.ts +0 -5
  592. package/dist/queue/saga.d.ts.map +0 -1
  593. package/dist/queue/saga.js +0 -20
  594. package/dist/queue/saga.js.map +0 -1
  595. package/dist/release/assets.d.ts +0 -144
  596. package/dist/release/assets.d.ts.map +0 -1
  597. package/dist/release/assets.js +0 -157
  598. package/dist/release/assets.js.map +0 -1
  599. package/dist/release/evidence.d.ts +0 -92
  600. package/dist/release/evidence.d.ts.map +0 -1
  601. package/dist/release/evidence.js +0 -148
  602. package/dist/release/evidence.js.map +0 -1
  603. package/dist/release/verify.d.ts +0 -12
  604. package/dist/release/verify.d.ts.map +0 -1
  605. package/dist/release/verify.js +0 -112
  606. package/dist/release/verify.js.map +0 -1
  607. package/dist/runners/chain.d.ts +0 -125
  608. package/dist/runners/chain.d.ts.map +0 -1
  609. package/dist/runners/chain.js +0 -95
  610. package/dist/runners/chain.js.map +0 -1
  611. package/dist/runners/health.d.ts +0 -36
  612. package/dist/runners/health.d.ts.map +0 -1
  613. package/dist/runners/health.js +0 -26
  614. package/dist/runners/health.js.map +0 -1
  615. package/dist/runners/heartbeat.d.ts +0 -23
  616. package/dist/runners/heartbeat.d.ts.map +0 -1
  617. package/dist/runners/heartbeat.js +0 -29
  618. package/dist/runners/heartbeat.js.map +0 -1
  619. package/dist/runners/inprocess.d.ts +0 -17
  620. package/dist/runners/inprocess.d.ts.map +0 -1
  621. package/dist/runners/inprocess.js +0 -20
  622. package/dist/runners/inprocess.js.map +0 -1
  623. package/dist/runners/scheduler.d.ts +0 -5
  624. package/dist/runners/scheduler.d.ts.map +0 -1
  625. package/dist/runners/scheduler.js +0 -19
  626. package/dist/runners/scheduler.js.map +0 -1
  627. package/dist/runtime/abort.d.ts +0 -8
  628. package/dist/runtime/abort.d.ts.map +0 -1
  629. package/dist/runtime/abort.js +0 -13
  630. package/dist/runtime/abort.js.map +0 -1
  631. package/dist/runtime/compatibility.d.ts +0 -37
  632. package/dist/runtime/compatibility.d.ts.map +0 -1
  633. package/dist/runtime/compatibility.js +0 -10
  634. package/dist/runtime/compatibility.js.map +0 -1
  635. package/dist/runtime/detect.d.ts +0 -13
  636. package/dist/runtime/detect.d.ts.map +0 -1
  637. package/dist/runtime/detect.js +0 -18
  638. package/dist/runtime/detect.js.map +0 -1
  639. package/dist/runtime/engine.d.ts +0 -20
  640. package/dist/runtime/engine.d.ts.map +0 -1
  641. package/dist/runtime/engine.js +0 -61
  642. package/dist/runtime/engine.js.map +0 -1
  643. package/dist/runtime/retry.d.ts +0 -19
  644. package/dist/runtime/retry.d.ts.map +0 -1
  645. package/dist/runtime/retry.js +0 -54
  646. package/dist/runtime/retry.js.map +0 -1
  647. package/dist/runtime/worker.d.ts +0 -10
  648. package/dist/runtime/worker.d.ts.map +0 -1
  649. package/dist/runtime/worker.js +0 -25
  650. package/dist/runtime/worker.js.map +0 -1
  651. package/dist/scrape/cache.d.ts +0 -45
  652. package/dist/scrape/cache.d.ts.map +0 -1
  653. package/dist/scrape/cache.js +0 -45
  654. package/dist/scrape/cache.js.map +0 -1
  655. package/dist/scrape/crawl.d.ts +0 -47
  656. package/dist/scrape/crawl.d.ts.map +0 -1
  657. package/dist/scrape/crawl.js +0 -114
  658. package/dist/scrape/crawl.js.map +0 -1
  659. package/dist/scrape/extract.d.ts +0 -63
  660. package/dist/scrape/extract.d.ts.map +0 -1
  661. package/dist/scrape/extract.js +0 -47
  662. package/dist/scrape/extract.js.map +0 -1
  663. package/dist/scrape/normalize.d.ts +0 -52
  664. package/dist/scrape/normalize.d.ts.map +0 -1
  665. package/dist/scrape/normalize.js +0 -102
  666. package/dist/scrape/normalize.js.map +0 -1
  667. package/dist/scrape/robots.d.ts +0 -37
  668. package/dist/scrape/robots.d.ts.map +0 -1
  669. package/dist/scrape/robots.js +0 -71
  670. package/dist/scrape/robots.js.map +0 -1
  671. package/dist/scrape/schema.d.ts +0 -23
  672. package/dist/scrape/schema.d.ts.map +0 -1
  673. package/dist/scrape/schema.js +0 -92
  674. package/dist/scrape/schema.js.map +0 -1
  675. package/dist/scrape/scraper.d.ts +0 -6
  676. package/dist/scrape/scraper.d.ts.map +0 -1
  677. package/dist/scrape/scraper.js +0 -46
  678. package/dist/scrape/scraper.js.map +0 -1
  679. package/dist/scrape/semantic.d.ts +0 -25
  680. package/dist/scrape/semantic.d.ts.map +0 -1
  681. package/dist/scrape/semantic.js +0 -27
  682. package/dist/scrape/semantic.js.map +0 -1
  683. package/dist/server/node.d.ts +0 -7
  684. package/dist/server/node.d.ts.map +0 -1
  685. package/dist/server/node.js.map +0 -1
  686. package/dist/sessions/file.d.ts +0 -25
  687. package/dist/sessions/file.d.ts.map +0 -1
  688. package/dist/sessions/file.js +0 -13
  689. package/dist/sessions/file.js.map +0 -1
  690. package/dist/sessions/replay.d.ts +0 -9
  691. package/dist/sessions/replay.d.ts.map +0 -1
  692. package/dist/sessions/replay.js +0 -70
  693. package/dist/sessions/replay.js.map +0 -1
  694. package/dist/sessions/store.d.ts +0 -25
  695. package/dist/sessions/store.d.ts.map +0 -1
  696. package/dist/sessions/store.js +0 -13
  697. package/dist/sessions/store.js.map +0 -1
  698. package/dist/storage/adapter.d.ts +0 -5
  699. package/dist/storage/adapter.d.ts.map +0 -1
  700. package/dist/storage/adapter.js +0 -11
  701. package/dist/storage/adapter.js.map +0 -1
  702. package/dist/storage/cache.d.ts +0 -23
  703. package/dist/storage/cache.d.ts.map +0 -1
  704. package/dist/storage/cache.js +0 -79
  705. package/dist/storage/cache.js.map +0 -1
  706. package/dist/storage/checksum.d.ts +0 -3
  707. package/dist/storage/checksum.d.ts.map +0 -1
  708. package/dist/storage/checksum.js +0 -19
  709. package/dist/storage/checksum.js.map +0 -1
  710. package/dist/storage/chunked.d.ts +0 -21
  711. package/dist/storage/chunked.d.ts.map +0 -1
  712. package/dist/storage/chunked.js +0 -67
  713. package/dist/storage/chunked.js.map +0 -1
  714. package/dist/storage/content.d.ts +0 -24
  715. package/dist/storage/content.d.ts.map +0 -1
  716. package/dist/storage/content.js +0 -44
  717. package/dist/storage/content.js.map +0 -1
  718. package/dist/storage/filehosting.d.ts +0 -2
  719. package/dist/storage/filehosting.d.ts.map +0 -1
  720. package/dist/storage/filehosting.js +0 -24
  721. package/dist/storage/filehosting.js.map +0 -1
  722. package/dist/storage/githubcontents.d.ts +0 -2
  723. package/dist/storage/githubcontents.d.ts.map +0 -1
  724. package/dist/storage/githubcontents.js +0 -29
  725. package/dist/storage/githubcontents.js.map +0 -1
  726. package/dist/storage/index.d.ts +0 -12
  727. package/dist/storage/index.d.ts.map +0 -1
  728. package/dist/storage/index.js +0 -12
  729. package/dist/storage/index.js.map +0 -1
  730. package/dist/storage/local.d.ts +0 -2
  731. package/dist/storage/local.d.ts.map +0 -1
  732. package/dist/storage/local.js +0 -72
  733. package/dist/storage/local.js.map +0 -1
  734. package/dist/storage/memory.d.ts +0 -6
  735. package/dist/storage/memory.d.ts.map +0 -1
  736. package/dist/storage/memory.js +0 -36
  737. package/dist/storage/memory.js.map +0 -1
  738. package/dist/storage/pool.d.ts +0 -95
  739. package/dist/storage/pool.d.ts.map +0 -1
  740. package/dist/storage/pool.js +0 -202
  741. package/dist/storage/pool.js.map +0 -1
  742. package/dist/storage/s3compatible.d.ts +0 -3
  743. package/dist/storage/s3compatible.d.ts.map +0 -1
  744. package/dist/storage/s3compatible.js +0 -70
  745. package/dist/storage/s3compatible.js.map +0 -1
  746. package/dist/storage/sync.d.ts +0 -47
  747. package/dist/storage/sync.d.ts.map +0 -1
  748. package/dist/storage/sync.js +0 -75
  749. package/dist/storage/sync.js.map +0 -1
  750. package/dist/surfaces/adapters.d.ts +0 -97
  751. package/dist/surfaces/adapters.d.ts.map +0 -1
  752. package/dist/surfaces/adapters.js +0 -50
  753. package/dist/surfaces/adapters.js.map +0 -1
  754. package/dist/surfaces/controls.d.ts +0 -18
  755. package/dist/surfaces/controls.d.ts.map +0 -1
  756. package/dist/surfaces/controls.js +0 -45
  757. package/dist/surfaces/controls.js.map +0 -1
  758. package/dist/surfaces/manifest.d.ts +0 -68
  759. package/dist/surfaces/manifest.d.ts.map +0 -1
  760. package/dist/surfaces/manifest.js +0 -42
  761. package/dist/surfaces/manifest.js.map +0 -1
  762. package/dist/surfaces/n8n.d.ts +0 -25
  763. package/dist/surfaces/n8n.d.ts.map +0 -1
  764. package/dist/surfaces/n8n.js +0 -31
  765. package/dist/surfaces/n8n.js.map +0 -1
  766. package/dist/surfaces/operations.d.ts +0 -32
  767. package/dist/surfaces/operations.d.ts.map +0 -1
  768. package/dist/surfaces/operations.js +0 -53
  769. package/dist/surfaces/operations.js.map +0 -1
  770. package/dist/surfaces/requirements.d.ts +0 -29
  771. package/dist/surfaces/requirements.d.ts.map +0 -1
  772. package/dist/surfaces/requirements.js +0 -50
  773. package/dist/surfaces/requirements.js.map +0 -1
  774. package/dist/surfaces/targets.d.ts +0 -196
  775. package/dist/surfaces/targets.d.ts.map +0 -1
  776. package/dist/surfaces/targets.js +0 -27
  777. package/dist/surfaces/targets.js.map +0 -1
  778. package/dist/webhook/delivery.d.ts +0 -18
  779. package/dist/webhook/delivery.d.ts.map +0 -1
  780. package/dist/webhook/delivery.js +0 -36
  781. package/dist/webhook/delivery.js.map +0 -1
  782. package/dist/webhook/receiver.d.ts +0 -26
  783. package/dist/webhook/receiver.d.ts.map +0 -1
  784. package/dist/webhook/receiver.js +0 -24
  785. package/dist/webhook/receiver.js.map +0 -1
  786. package/dist/webhook/signature.d.ts +0 -3
  787. package/dist/webhook/signature.d.ts.map +0 -1
  788. package/dist/webhook/signature.js +0 -7
  789. package/dist/webhook/signature.js.map +0 -1
  790. package/dist/workflow/manifest.d.ts +0 -22
  791. package/dist/workflow/manifest.d.ts.map +0 -1
  792. package/dist/workflow/manifest.js +0 -21
  793. package/dist/workflow/manifest.js.map +0 -1
  794. package/dist/workflow/registry.d.ts +0 -7
  795. package/dist/workflow/registry.d.ts.map +0 -1
  796. package/dist/workflow/registry.js +0 -18
  797. package/dist/workflow/registry.js.map +0 -1
  798. package/dist/workflow/templates.d.ts +0 -6
  799. package/dist/workflow/templates.d.ts.map +0 -1
  800. package/dist/workflow/templates.js +0 -18
  801. package/dist/workflow/templates.js.map +0 -1
  802. package/dist/workflow/triggers.d.ts +0 -64
  803. package/dist/workflow/triggers.d.ts.map +0 -1
  804. package/dist/workflow/triggers.js +0 -99
  805. package/dist/workflow/triggers.js.map +0 -1
  806. package/docs/logs/.gitkeep +0 -0
  807. package/docs/plans/00.index.md +0 -50
  808. package/docs/plans/01.architecture.md +0 -86
  809. package/docs/plans/02.research.computer.use.md +0 -58
  810. package/docs/plans/03.research.captcha.bypass.md +0 -68
  811. package/docs/plans/04.research.sandbox.ai.md +0 -52
  812. package/docs/plans/05.capture.platform.md +0 -57
  813. package/docs/plans/06.dependencies.md +0 -97
  814. package/docs/plans/07.captcha.test.page.md +0 -41
  815. package/docs/plans/08.production.infra.md +0 -70
  816. package/docs/plans/09.database.schema.md +0 -121
  817. package/docs/plans/10.cloudinary.storage.md +0 -57
  818. package/docs/plans/11.movement.logs.json.md +0 -72
  819. package/docs/plans/12.research.atlas.agent.browser.md +0 -79
  820. package/docs/plans/13.research.anti.detection.md +0 -898
  821. package/docs/plans/14.research.proxy.md +0 -1495
  822. package/docs/plans/15.research.retry.rate.limit.md +0 -1958
  823. package/docs/plans/16.research.crawling.md +0 -1417
  824. package/docs/plans/17.research.caching.md +0 -1610
  825. package/docs/plans/18.research.content.extraction.md +0 -1952
  826. package/docs/plans/19.research.errors.events.md +0 -1523
  827. package/docs/plans/20.research.zod.validation.md +0 -1350
  828. package/docs/plans/21.research.batch.concurrency.md +0 -1888
  829. package/docs/plans/22.research.universal.runtime.md +0 -944
  830. package/docs/plans/23.research.ai.integration.md +0 -1465
  831. package/docs/plans/24.research.memory.persistence.md +0 -1979
  832. package/docs/plans/25.research.server.api.md +0 -342
  833. package/docs/plans/26.research.compilation.md +0 -249
  834. package/docs/plans/27.research.html.parsing.md +0 -251
  835. package/docs/plans/28.action.plan.md +0 -50
  836. package/docs/plans/29.api.reference.md +0 -174
  837. package/docs/plans/30.architecture.plan.md +0 -94
  838. package/docs/plans/31.auditoria.dados.md +0 -163
  839. package/docs/plans/32.bots.automacao.computacional.md +0 -214
  840. package/docs/plans/33.bots.codigo.revisao.md +0 -220
  841. package/docs/plans/34.bots.seguranca.cicd.md +0 -366
  842. package/docs/plans/35.comparativo.concorrencia.md +0 -464
  843. package/docs/plans/36.computational.memory.md +0 -340
  844. package/docs/plans/37.deploystrategy.md +0 -394
  845. package/docs/plans/38.flow.md +0 -155
  846. package/docs/plans/39.multi.platform.bot.md +0 -252
  847. package/docs/plans/40.npm.publish.md +0 -250
  848. package/docs/plans/41.o.que.falta.md +0 -407
  849. package/docs/plans/42.pesquisa.concorrencia.md +0 -721
  850. package/docs/plans/43.plan.universal.architecture.md +0 -496
  851. package/docs/plans/44.reference.md +0 -100
  852. package/docs/plans/45.robotarchitecture.md +0 -237
  853. package/docs/plans/46.scdnintegration.md +0 -284
  854. package/docs/plans/47.multiforge.readme.md +0 -129
  855. package/docs/plans/48.theory.v4.repo.os.md +0 -152
  856. package/docs/plans/49.third.party.infra.md +0 -12
  857. package/docs/plans/50.file.as.compute.md +0 -39
  858. package/docs/plans/51.architecture.virtual.processor.md +0 -80
  859. package/docs/plans/52.manifesto.v8.md +0 -11
  860. package/docs/plans/58.cdn.list.md +0 -23
  861. package/docs/plans/59.sql.frameworks.md +0 -33
  862. package/docs/plans/60.sql.thirdparty.md +0 -26
  863. package/docs/plans/61.objective.multiforge.md +0 -63
  864. package/docs/plans/62.huggingface.upload.md +0 -26
  865. package/docs/plans/63.kaggle.upload.md +0 -24
  866. package/docs/plans/64.npm.storage.md +0 -30
  867. package/docs/plans/65.rclone.terabox.md +0 -32
  868. package/docs/plans/66.buckets.and.models.todo.md +0 -14
  869. package/docs/plans/67.database.todo.md +0 -13
  870. package/docs/plans/68.deploy.packages.todo.md +0 -12
  871. package/docs/plans/69.report.human.operator.md +0 -133
  872. package/docs/plans/70.report.brain2qwerty.ems.md +0 -135
  873. package/docs/plans/71.report.hd.infinito.vram.md +0 -155
  874. package/docs/plans/72.plan.hd.infinito.node.md +0 -146
  875. package/docs/plans/73.plan.scifi.repos.md +0 -125
  876. package/docs/plans/74.000.manifesto.v8.flat.2..md +0 -11
  877. package/docs/plans/README.md +0 -489
  878. package/docs/plans/aggregate_platforms.mjs +0 -146
  879. package/docs/plans/examplesession.json +0 -36
  880. package/docs/plans/missing-facts.md +0 -192
  881. package/docs/plans/models.md +0 -64
  882. package/docs/plans/organize.cjs +0 -270
  883. package/docs/plans/platforms.md +0 -2887
  884. package/docs/plans/sites.md +0 -31322
  885. package/docs/sources/farm.py +0 -117
  886. package/docs/sources/html/saddle1.html +0 -132
  887. package/docs/sources/html/saddle2.html +0 -157
  888. package/docs/sources/html/saddle3.html +0 -119
  889. package/docs/sources/html/saddle4.html +0 -144
  890. package/docs/sources/html/saddle5.html +0 -72
  891. package/docs/sources/html/saddle6.html +0 -171
  892. package/docs/sources/html/saddle7.html +0 -236
  893. package/docs/sources/saddle.ts +0 -74
  894. package/docs/sources/schema.prisma +0 -88
  895. package/docs/sources/script.sh +0 -64
  896. package/docs/sources/workflows.yml +0 -458
  897. package/docs/talks1/_body.txt +0 -14
  898. package/docs/talks1/_index.md +0 -15
  899. package/docs/talks1/_screenshot.png +0 -0
  900. package/docs/talks1/assistant-01.md +0 -5
  901. package/docs/talks1/assistant-02.md +0 -5
  902. package/docs/talks1/assistant-03.md +0 -531
  903. package/docs/talks1/assistant-04.md +0 -26
  904. package/docs/talks1/assistant-05.md +0 -774
  905. package/docs/talks1/assistant-06.md +0 -1718
  906. package/docs/talks1/scrape-share.cjs +0 -185
  907. package/docs/talks1/scrape-share.ts +0 -183
  908. package/docs/talks1/user-01.md +0 -3
  909. package/docs/talks1/user-02.md +0 -3
  910. package/docs/talks1/user-03.md +0 -88
  911. package/docs/talks1/user-04.md +0 -3
  912. package/docs/talks1/user-05.md +0 -3
  913. package/docs/talks1/user-06.md +0 -88
  914. package/docs/talks1/user-07.md +0 -88
  915. package/docs/talks2/_body.txt +0 -14
  916. package/docs/talks2/_index.md +0 -16
  917. package/docs/talks2/_screenshot.png +0 -0
  918. package/docs/talks2/assistant-01.md +0 -5
  919. package/docs/talks2/assistant-02.md +0 -5
  920. package/docs/talks2/assistant-03.md +0 -424
  921. package/docs/talks2/assistant-04.md +0 -598
  922. package/docs/talks2/assistant-05.md +0 -1280
  923. package/docs/talks2/assistant-06.md +0 -1227
  924. package/docs/talks2/assistant-07.md +0 -1252
  925. package/docs/talks2/user-01.md +0 -3
  926. package/docs/talks2/user-02.md +0 -3
  927. package/docs/talks2/user-03.md +0 -88
  928. package/docs/talks2/user-04.md +0 -88
  929. package/docs/talks2/user-05.md +0 -88
  930. package/docs/talks2/user-06.md +0 -88
  931. package/docs/talks2/user-07.md +0 -3
  932. package/docs/talks3/_body.txt +0 -467
  933. package/docs/talks3/_index.md +0 -10
  934. package/docs/talks3/_screenshot.png +0 -0
  935. package/docs/talks3/assistant-01.md +0 -417
  936. package/docs/talks3/assistant-02.md +0 -417
  937. package/docs/talks3/assistant-03.md +0 -29
  938. package/docs/talks3/assistant-04.md +0 -727
  939. package/docs/talks3/user-01.md +0 -88
  940. package/docs/talks3/user-02.md +0 -88
  941. package/docs/talks3/user-03.md +0 -3
  942. package/docs/talks3/user-04.md +0 -3
  943. package/docs/talks4/_body.txt +0 -14
  944. package/docs/talks4/_index.md +0 -12
  945. package/docs/talks4/_screenshot.png +0 -0
  946. package/docs/talks4/assistant-01.md +0 -5
  947. package/docs/talks4/assistant-02.md +0 -5
  948. package/docs/talks4/assistant-03.md +0 -35
  949. package/docs/talks4/assistant-04.md +0 -512
  950. package/docs/talks4/assistant-05.md +0 -599
  951. package/docs/talks4/user-01.md +0 -3
  952. package/docs/talks4/user-02.md +0 -3
  953. package/docs/talks4/user-03.md +0 -88
  954. package/docs/talks4/user-04.md +0 -88
  955. package/docs/talks4/user-05.md +0 -7
  956. package/docs/talks5/_body.txt +0 -14
  957. package/docs/talks5/_index.md +0 -13
  958. package/docs/talks5/_screenshot.png +0 -0
  959. package/docs/talks5/assistant-01.md +0 -5
  960. package/docs/talks5/assistant-02.md +0 -5
  961. package/docs/talks5/assistant-03.md +0 -690
  962. package/docs/talks5/assistant-04.md +0 -758
  963. package/docs/talks5/assistant-05.md +0 -974
  964. package/docs/talks5/user-01.md +0 -3
  965. package/docs/talks5/user-02.md +0 -3
  966. package/docs/talks5/user-03.md +0 -105
  967. package/docs/talks5/user-04.md +0 -105
  968. package/docs/talks5/user-05.md +0 -63
  969. package/docs/talks5/user-06.md +0 -105
  970. package/docs/talks6/_body.txt +0 -14
  971. package/docs/talks6/_index.md +0 -9
  972. package/docs/talks6/_screenshot.png +0 -0
  973. package/docs/talks6/assistant-01.md +0 -5
  974. package/docs/talks6/assistant-02.md +0 -5
  975. package/docs/talks6/assistant-03.md +0 -1499
  976. package/docs/talks6/user-01.md +0 -3
  977. package/docs/talks6/user-02.md +0 -3
  978. package/docs/talks6/user-03.md +0 -88
  979. package/docs/talks6/user-04.md +0 -88
  980. package/docs/talks7/_body.txt +0 -14
  981. package/docs/talks7/_index.md +0 -10
  982. package/docs/talks7/_screenshot.png +0 -0
  983. package/docs/talks7/assistant-01.md +0 -5
  984. package/docs/talks7/assistant-02.md +0 -5
  985. package/docs/talks7/assistant-03.md +0 -523
  986. package/docs/talks7/assistant-04.md +0 -617
  987. package/docs/talks7/user-01.md +0 -3
  988. package/docs/talks7/user-02.md +0 -3
  989. package/docs/talks7/user-03.md +0 -105
  990. package/docs/talks7/user-04.md +0 -67
  991. package/docs/talks8/conversa1.txt +0 -1322
  992. package/docs/talks8/conversa2.txt +0 -237
  993. package/docs/talks9/Beyond the Obvious_ 50 Plataformas Auto-Hospedadas de Forja de C/303/263digo para Al/303/251m de Gitea e GitLab.md" +0 -174
  994. package/docs/talks9/De NPM a Multi-Linguagem_ Uma Arquitetura T/303/251cnica para a Execu/303/247/303/243o Integrada de C/303/263digo no Ecossistema Node.js.md" +0 -59
  995. package/docs/talks9/De NPM a VMs Virtuais_ Uma An/303/241lise Arquitet/303/264nica para a Realiza/303/247/303/243o do Ciclo de Vida do Projeto SADDLE.md" +0 -91
  996. package/docs/talks9/Mapeamento da Engrenagem Computacional_ Uma Arquitetura para Execu/303/247/303/243o Isolada e Persist/303/252ncia em Ambientes Distribu/303/255dos.md" +0 -116
  997. package/docs/talks9/O Cen/303/241rio Pr/303/241tico do SADDLE_ Uma An/303/241lise de Viabilidade e Modelo de Ciclo de Vida Integrado.md" +0 -128
  998. package/docs/talks9/README (2).md +0 -489
  999. package/docs/talks9/README.md +0 -198
  1000. package/docs/talks9/Viabilidade do Saddle_ Uma An/303/241lise T/303/251cnica da Transforma/303/247/303/243o de Armazenamento Remoto em Mem/303/263ria Computacional.md" +0 -80
  1001. package/docs/talks9/conversa.txt +0 -544
  1002. package/docs/talks9/other (2).md +0 -39
  1003. package/docs/talks9/other.md +0 -57
  1004. package/docs/talks9/outro.txt +0 -24
  1005. /package/{extension/README.md → docs/extension.md} +0 -0
@@ -0,0 +1,1170 @@
1
+ /**
2
+ * security.ts — layered sandbox security for the virtual hardware engine.
3
+ *
4
+ * the module models the 2026 defense stack verified on 2026-08-22:
5
+ * - landlock abi v10 on the kernel mainline (docs.kernel.org): v1 5.13
6
+ * filesystem rights, v2 5.19 refer, v3 6.2 truncate, v4 6.7 tcp
7
+ * bind/connect, v5 6.10 ioctl_dev, v6 6.12 scopes (abstract unix
8
+ * socket + signal), v7 6.15 audit, v8 restrict_self tsync, v9
9
+ * resolve_unix, v10 udp bind/connect + send (merged around 6.20/6.21);
10
+ * unprivileged, no root needed, layers on top of seccomp
11
+ * - seccomp: deny-by-default bpf filters; SECCOMP_RET_TRAP (SIGSYS) is
12
+ * the base of the gvisor systrap platform; io_uring stays blocked in
13
+ * every sandbox profile (docker default profile blocks it since
14
+ * moby#47532 and gvisor disables it; CVE-2026-46315 disclosed an
15
+ * information leak through io_uring in june 2026)
16
+ * - ebpf lsm: hooks since kernel 5.7 execute at the kernel decision
17
+ * point, which grants toctou immunity compared with tracepoints and
18
+ * syscall tracing; hornet lsm v6 (april 2026) verifies eBPF program
19
+ * signatures in-kernel
20
+ * - cgroups v2: unified hierarchy on every modern distro; cpu, memory,
21
+ * io and pids controllers; subtree delegation enables rootless
22
+ * operation (podman, docker rootless) and sustains the orchestrator
23
+ * memory/shm limits
24
+ * - post-quantum: ML-KEM (FIPS 203) and ML-DSA (FIPS 204) native in
25
+ * OpenSSL 3.5; X25519MLKEM768 hybrid is the default TLS 1.3 group and
26
+ * node 24+ bundles OpenSSL 3.5.5, so the engine inherits PQ/TLS
27
+ * without extra code; RFC 10024 (2026-08-10) standardizes the PQ/T
28
+ * hybrid mechanisms; ChaCha20-Poly1305 (RFC 8439) remains the AEAD
29
+ * fallback for hosts without AES-NI
30
+ * - criu v4.2.1: checkpoint/restore with selinux relabel support so
31
+ * restored processes keep their labels
32
+ *
33
+ * contexts (23): landlockabitable, landlockaccess, landlockscopes,
34
+ * landlockrulebuilder, landlockapplier, hostprobe, seccompactions,
35
+ * syscallnumbers, defaultallowed, seccompbuilder, defaultseccomp,
36
+ * ebpflsmfacts, ebpfattachplan, cgroupv2layout, cgroupbuilder, pqstack
37
+ * (pqcatalog, pqkeyfactory, pqsecurecontext, rfc10024, pqcaudit — the
38
+ * v3-B1 append), chachapoly, sandboxprofile, profilebuilder,
39
+ * policyregistry, policyevents, policyproxy, criurelabel
40
+ *
41
+ * patterns: builder (landlockrulebuilder, seccompbuilder, cgroupbuilder,
42
+ * profilebuilder), registry (policyregistry), proxy (policyproxy),
43
+ * observer (policyevents). rules: lowercase identifiers, english jsdoc,
44
+ * third person, no emoji, try/catch catcher on every fallible path,
45
+ * node:* built-ins only, no hardcoded localhost address anywhere.
46
+ */
47
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
48
+ if (value !== null && value !== void 0) {
49
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
50
+ var dispose, inner;
51
+ if (async) {
52
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
53
+ dispose = value[Symbol.asyncDispose];
54
+ }
55
+ if (dispose === void 0) {
56
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
57
+ dispose = value[Symbol.dispose];
58
+ if (async) inner = dispose;
59
+ }
60
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
61
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
62
+ env.stack.push({ value: value, dispose: dispose, async: async });
63
+ }
64
+ else if (async) {
65
+ env.stack.push({ async: true });
66
+ }
67
+ return value;
68
+ };
69
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
70
+ return function (env) {
71
+ function fail(e) {
72
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
73
+ env.hasError = true;
74
+ }
75
+ var r, s = 0;
76
+ function next() {
77
+ while (r = env.stack.pop()) {
78
+ try {
79
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
80
+ if (r.dispose) {
81
+ var result = r.dispose.call(r.value);
82
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
83
+ }
84
+ else s |= 1;
85
+ }
86
+ catch (e) {
87
+ fail(e);
88
+ }
89
+ }
90
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
91
+ if (env.hasError) throw env.error;
92
+ }
93
+ return next();
94
+ };
95
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
96
+ var e = new Error(message);
97
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
98
+ });
99
+ import { spawn } from 'node:child_process';
100
+ import { createCipheriv, createDecipheriv, createHash, generateKeyPairSync, randomBytes, timingSafeEqual, } from 'node:crypto';
101
+ import { EventEmitter } from 'node:events';
102
+ import { readFileSync } from 'node:fs';
103
+ import { mkdir, writeFile } from 'node:fs/promises';
104
+ import { release } from 'node:os';
105
+ import path from 'node:path';
106
+ import { createSecureContext } from 'node:tls';
107
+ /** landlock abi timeline; v8-v10 landed across 6.16-6.21 per the
108
+ * landlock.io timeline (v10 patches v3 in december 2025). */
109
+ const landlockabitable = [
110
+ { abi: 1, kernel: '5.13', feature: 'filesystem access rights' },
111
+ { abi: 2, kernel: '5.19', feature: 'path refer and directory changes' },
112
+ { abi: 3, kernel: '6.2', feature: 'file truncate' },
113
+ { abi: 4, kernel: '6.7', feature: 'network tcp bind/connect' },
114
+ { abi: 5, kernel: '6.10', feature: 'fs ioctl_dev access right' },
115
+ { abi: 6, kernel: '6.12', feature: 'scopes: abstract unix socket + signal' },
116
+ { abi: 7, kernel: '6.15', feature: 'audit logging' },
117
+ { abi: 8, kernel: '6.16', feature: 'restrict_self tsync for multi-threaded processes' },
118
+ { abi: 9, kernel: '6.17', feature: 'resolve_unix scope' },
119
+ { abi: 10, kernel: '6.20', feature: 'network udp bind/connect + send' },
120
+ ];
121
+ /** filesystem access rights across the abi levels. */
122
+ const landlockfsaccess = [
123
+ 'execute',
124
+ 'write_file',
125
+ 'read_file',
126
+ 'read_dir',
127
+ 'remove_dir',
128
+ 'remove_file',
129
+ 'make_char',
130
+ 'make_dir',
131
+ 'make_reg',
132
+ 'make_sock',
133
+ 'make_fifo',
134
+ 'make_block',
135
+ 'make_sym',
136
+ 'refer',
137
+ 'truncate',
138
+ 'ioctl_dev',
139
+ ];
140
+ /** network access rights (tcp since abi v4, udp since abi v10). */
141
+ const landlocknetaccess = ['bind_tcp', 'connect_tcp', 'bind_udp', 'connect_udp'];
142
+ /** landlock scopes introduced with abi v6 (kernel 6.12). */
143
+ const landlockscopes = ['abstract_unix_socket', 'signal'];
144
+ /** fluent builder for a landlock ruleset; the default grants read and
145
+ * execute on the whole filesystem tree and nothing else (deny by
146
+ * default at the handled-rights level). */
147
+ class landlockrulebuilder {
148
+ #rules = [];
149
+ #handledfs = new Set(['read_file', 'read_dir', 'execute']);
150
+ #handlednet = new Set();
151
+ #scopes = new Set();
152
+ /** grants read + execute on a tree (system roots, runtimes). */
153
+ readonlytree(target) {
154
+ return this.rule(target, ['read_file', 'read_dir', 'execute']);
155
+ }
156
+ /** grants full filesystem access on a tree (workspace roots). */
157
+ writetree(target) {
158
+ return this.rule(target, [
159
+ 'read_file',
160
+ 'read_dir',
161
+ 'execute',
162
+ 'write_file',
163
+ 'remove_dir',
164
+ 'remove_file',
165
+ 'make_dir',
166
+ 'make_reg',
167
+ 'make_sym',
168
+ 'make_sock',
169
+ 'make_fifo',
170
+ 'refer',
171
+ 'truncate',
172
+ ]);
173
+ }
174
+ /** grants ioctls on device nodes (abi v5, kernel 6.10+). */
175
+ devioctl(target) {
176
+ return this.handle('ioctl_dev').rule(target, ['read_file', 'write_file', 'ioctl_dev']);
177
+ }
178
+ /** adds one explicit rule. */
179
+ rule(target, rights) {
180
+ this.#rules.push({ path: target, rights: [...rights] });
181
+ for (const right of rights) {
182
+ this.#handledfs.add(right);
183
+ }
184
+ return this;
185
+ }
186
+ /** widens the handled fs rights set. */
187
+ handle(right) {
188
+ if (!landlockfsaccess.includes(right)) {
189
+ throw new Error(`unknown landlock fs right "${right}"`);
190
+ }
191
+ this.#handledfs.add(right);
192
+ return this;
193
+ }
194
+ /** allows tcp networking (abi v4+): bind, connect or both. */
195
+ nettcp(bind, connect) {
196
+ if (bind) {
197
+ this.#handlednet.add('bind_tcp');
198
+ }
199
+ if (connect) {
200
+ this.#handlednet.add('connect_tcp');
201
+ }
202
+ return this;
203
+ }
204
+ /** allows udp networking (abi v10, kernel ~6.20). */
205
+ netudp(bind, connect) {
206
+ if (bind) {
207
+ this.#handlednet.add('bind_udp');
208
+ }
209
+ if (connect) {
210
+ this.#handlednet.add('connect_udp');
211
+ }
212
+ return this;
213
+ }
214
+ /** restricts abstract unix sockets or signals (abi v6, kernel 6.12). */
215
+ scope(name) {
216
+ this.#scopes.add(name);
217
+ return this;
218
+ }
219
+ /** freezes the ruleset. */
220
+ build() {
221
+ return {
222
+ handledfs: [...this.#handledfs],
223
+ handlednet: [...this.#handlednet],
224
+ scopes: [...this.#scopes],
225
+ rules: [...this.#rules],
226
+ };
227
+ }
228
+ }
229
+ /* ------------------------------------------------------------------ */
230
+ /* context: landlock applier + host probe */
231
+ /* ------------------------------------------------------------------ */
232
+ /** normalizes an unknown thrown value into a message string. */
233
+ function errormessage(error) {
234
+ return error instanceof Error ? error.message : String(error);
235
+ }
236
+ /** parses a kernel release such as "6.12.0-arch1-1". */
237
+ function kernelversion(kernel = release()) {
238
+ const match = /^(\d+)\.(\d+)/.exec(kernel);
239
+ return match === null
240
+ ? { major: 0, minor: 0 }
241
+ : { major: Number(match[1]), minor: Number(match[2]) };
242
+ }
243
+ /** number-encodes a kernel for ordering (6.10 beats 6.7). */
244
+ function kernelnumber(kernel) {
245
+ const { major, minor } = kernelversion(kernel);
246
+ return major * 100 + minor;
247
+ }
248
+ /** derives the expected landlock abi from the running kernel release;
249
+ * the native helper confirms it at runtime through
250
+ * landlock_create_ruleset(NULL, 0, LANDLOCK_CREATE_RULESET_VERSION). */
251
+ function detectlandlockabi(kernel = release()) {
252
+ const current = kernelnumber(kernel);
253
+ let abi = 0;
254
+ for (const entry of landlockabitable) {
255
+ if (current >= kernelnumber(entry.kernel)) {
256
+ abi = entry.abi;
257
+ }
258
+ }
259
+ return abi;
260
+ }
261
+ /** reads the lsm list from sysfs; empty when unavailable. */
262
+ function lsmlist() {
263
+ try {
264
+ return readFileSync('/sys/kernel/security/lsm', 'utf8').trim().split(',');
265
+ }
266
+ catch {
267
+ return [];
268
+ }
269
+ }
270
+ /** renders the restriction plan handed to the native helper binary
271
+ * (the c preload library performs the actual syscalls; node has no
272
+ * direct syscall binding). */
273
+ function landlockplan(ruleset) {
274
+ const encoded = JSON.stringify(ruleset);
275
+ return {
276
+ env: { VHE_LANDLOCK_RULESET: encoded },
277
+ argv: ['vhe-landlock', '--ruleset-stdin'],
278
+ };
279
+ }
280
+ /* ------------------------------------------------------------------ */
281
+ /* context: seccomp actions + syscall numbers */
282
+ /* ------------------------------------------------------------------ */
283
+ /** seccomp filter actions; RET_TRAP (SIGSYS) is the gvisor systrap base
284
+ * and ERRNO is the deny action used by the engine profiles. */
285
+ const seccompactions = {
286
+ killprocess: 'SCMP_ACT_KILL_PROCESS',
287
+ killthread: 'SCMP_ACT_KILL_THREAD',
288
+ trap: 'SCMP_ACT_TRAP',
289
+ errno: 'SCMP_ACT_ERRNO',
290
+ trace: 'SCMP_ACT_TRACE',
291
+ log: 'SCMP_ACT_LOG',
292
+ notify: 'SCMP_ACT_NOTIFY',
293
+ };
294
+ /** x86_64 syscall numbers of the deny list; io_uring is blocked in
295
+ * every sandbox (docker default profile moby#47532, gvisor default,
296
+ * CVE-2026-46315 information disclosure, june 2026). the host side of
297
+ * the same story is liburing 2.8 (pool viabilityreport context 09):
298
+ * SQPOLL plus the IORING_SETUP_COOP_TASKRUN and
299
+ * IORING_SETUP_SINGLE_ISSUER setup flags — cooperative task running
300
+ * without IPI storms and a single-issuer fast path; those flags are
301
+ * host-only optimizations and NEVER relax the guest deny list: the
302
+ * three io_uring syscalls stay blocked inside sandboxes. */
303
+ const syscallnumbers = {
304
+ io_uring_setup: 425,
305
+ io_uring_enter: 426,
306
+ io_uring_register: 427,
307
+ bpf: 321,
308
+ perf_event_open: 298,
309
+ kexec_load: 246,
310
+ kexec_file_load: 320,
311
+ userfaultfd: 323,
312
+ ptrace: 101,
313
+ open_by_handle_at: 304,
314
+ mount: 165,
315
+ umount2: 166,
316
+ pivot_root: 217,
317
+ init_module: 175,
318
+ finit_module: 313,
319
+ delete_module: 176,
320
+ acct: 163,
321
+ swapon: 167,
322
+ swapoff: 168,
323
+ reboot: 169,
324
+ setns: 308,
325
+ unshare: 310,
326
+ clone3: 435,
327
+ };
328
+ /** rationale for the always-blocked syscalls (documentation surface). */
329
+ const _blockedrationale = {
330
+ io_uring_setup: 'async io blocked in sandboxes: docker default profile, gvisor default and CVE-2026-46315',
331
+ io_uring_enter: 'see io_uring_setup; the whole io_uring family stays out of sandboxes',
332
+ io_uring_register: 'see io_uring_setup; lwn documents task-level restrictions as the future escape hatch',
333
+ bpf: 'loading bpf programs is a host-only privilege',
334
+ perf_event_open: 'hardware counters leak host state',
335
+ ptrace: 'cross-process introspection breaks sandbox isolation',
336
+ clone3: 'blocked to force plain clone through the audited path',
337
+ };
338
+ /** default allow list: the syscalls a plain workload needs. */
339
+ const defaultallowed = [
340
+ 'accept4',
341
+ 'arch_prctl',
342
+ 'bind',
343
+ 'brk',
344
+ 'capget',
345
+ 'capset',
346
+ 'chdir',
347
+ 'chmod',
348
+ 'chown',
349
+ 'clock_getres',
350
+ 'clock_gettime',
351
+ 'clock_nanosleep',
352
+ 'clone',
353
+ 'close',
354
+ 'close_range',
355
+ 'connect',
356
+ 'dup',
357
+ 'dup2',
358
+ 'dup3',
359
+ 'epoll_create1',
360
+ 'epoll_ctl',
361
+ 'epoll_pwait',
362
+ 'epoll_wait',
363
+ 'eventfd2',
364
+ 'execve',
365
+ 'execveat',
366
+ 'exit',
367
+ 'exit_group',
368
+ 'faccessat',
369
+ 'faccessat2',
370
+ 'fadvise64',
371
+ 'fallocate',
372
+ 'fcntl',
373
+ 'fstat',
374
+ 'fstatfs',
375
+ 'fsync',
376
+ 'ftruncate',
377
+ 'futex',
378
+ 'getcwd',
379
+ 'getdents64',
380
+ 'getegid',
381
+ 'geteuid',
382
+ 'getgid',
383
+ 'getgroups',
384
+ 'getpeername',
385
+ 'getpid',
386
+ 'getppid',
387
+ 'getrandom',
388
+ 'getresgid',
389
+ 'getresuid',
390
+ 'getrlimit',
391
+ 'getrusage',
392
+ 'getsockname',
393
+ 'getsockopt',
394
+ 'gettid',
395
+ 'gettimeofday',
396
+ 'getuid',
397
+ 'ioctl',
398
+ 'kill',
399
+ 'listen',
400
+ 'lseek',
401
+ 'madvise',
402
+ 'membarrier',
403
+ 'mkdir',
404
+ 'mkdirat',
405
+ 'mmap',
406
+ 'mprotect',
407
+ 'mremap',
408
+ 'munmap',
409
+ 'nanosleep',
410
+ 'newfstatat',
411
+ 'open',
412
+ 'openat',
413
+ 'pipe',
414
+ 'pipe2',
415
+ 'poll',
416
+ 'ppoll',
417
+ 'prctl',
418
+ 'pread64',
419
+ 'preadv',
420
+ 'prlimit64',
421
+ 'pselect6',
422
+ 'pwrite64',
423
+ 'pwritev',
424
+ 'read',
425
+ 'readlink',
426
+ 'readlinkat',
427
+ 'readv',
428
+ 'recvfrom',
429
+ 'recvmmsg',
430
+ 'recvmsg',
431
+ 'rename',
432
+ 'renameat',
433
+ 'renameat2',
434
+ 'rseq',
435
+ 'rt_sigaction',
436
+ 'rt_sigprocmask',
437
+ 'rt_sigreturn',
438
+ 'sched_getaffinity',
439
+ 'sched_yield',
440
+ 'sendmmsg',
441
+ 'sendmsg',
442
+ 'sendto',
443
+ 'set_robust_list',
444
+ 'set_tid_address',
445
+ 'setitimer',
446
+ 'setrlimit',
447
+ 'shutdown',
448
+ 'sigaltstack',
449
+ 'socket',
450
+ 'socketpair',
451
+ 'stat',
452
+ 'statfs',
453
+ 'sysinfo',
454
+ 'tgkill',
455
+ 'timerfd_create',
456
+ 'timerfd_settime',
457
+ 'uname',
458
+ 'unlink',
459
+ 'unlinkat',
460
+ 'wait4',
461
+ 'waitid',
462
+ 'write',
463
+ 'writev',
464
+ ];
465
+ /** builder for a deny-by-default seccomp profile; the blocked entries
466
+ * return ENOSYS (38) so denied syscalls look absent, matching the docker
467
+ * default profile semantics. */
468
+ class seccompbuilder {
469
+ #allowed = new Set(defaultallowed);
470
+ #blocked = new Map();
471
+ constructor() {
472
+ for (const name of Object.keys(syscallnumbers)) {
473
+ this.#blocked.set(name, 38);
474
+ }
475
+ }
476
+ /** allows additional syscalls. */
477
+ allow(...names) {
478
+ for (const name of names) {
479
+ this.#blocked.delete(name);
480
+ this.#allowed.add(name);
481
+ }
482
+ return this;
483
+ }
484
+ /** blocks a syscall with an errno (38 = ENOSYS, 1 = EPERM). */
485
+ deny(name, errno = 38) {
486
+ this.#allowed.delete(name);
487
+ this.#blocked.set(name, errno);
488
+ return this;
489
+ }
490
+ /** true when a syscall is currently denied. */
491
+ denied(name) {
492
+ return this.#blocked.has(name) && !this.#allowed.has(name);
493
+ }
494
+ /** freezes the profile; denied syscalls are grouped per errno. */
495
+ build() {
496
+ const groups = [{ names: [...this.#allowed].sort(), action: 'SCMP_ACT_ALLOW' }];
497
+ const byerrno = new Map();
498
+ for (const [name, errno] of this.#blocked) {
499
+ const list = byerrno.get(errno) ?? [];
500
+ list.push(name);
501
+ byerrno.set(errno, list);
502
+ }
503
+ for (const [errno, names] of byerrno) {
504
+ groups.push({ names: [...names].sort(), action: seccompactions.errno, errnoRet: errno });
505
+ }
506
+ return {
507
+ defaultAction: seccompactions.errno,
508
+ defaultErrnoRet: 38,
509
+ architectures: ['SCMP_ARCH_X86_64', 'SCMP_ARCH_X86', 'SCMP_ARCH_X32'],
510
+ syscalls: groups,
511
+ };
512
+ }
513
+ }
514
+ /** the engine default profile: allow the plain workload surface and
515
+ * deny the privileged set including the io_uring family. */
516
+ function defaultseccompprofile() {
517
+ return new seccompbuilder().build();
518
+ }
519
+ /* ------------------------------------------------------------------ */
520
+ /* context: ebpf lsm facts + attach plan */
521
+ /* ------------------------------------------------------------------ */
522
+ /** verified ebpf lsm facts (kernel docs, cloudflare and lwn sources). */
523
+ const ebpflsmfacts = {
524
+ sincemajor: '5.7',
525
+ toctou: 'hooks execute at the kernel decision point, immune to time-of-check/time-of-use races',
526
+ tracepoints: 'tracepoints and syscall tracing observe after the fact and remain racy',
527
+ verification: 'programs are verified at load time',
528
+ hornet: 'hornet lsm v6 (april 2026) verifies eBPF program signatures in-kernel',
529
+ };
530
+ /** attach plan: lsm hooks for enforcement, one tracepoint for counters. */
531
+ const ebpfattachplan = [
532
+ {
533
+ hook: 'lsm/file_open',
534
+ program: 'vhe_file_open',
535
+ purpose: 'audit opens outside the sandbox roots',
536
+ },
537
+ {
538
+ hook: 'lsm/bprm_check_security',
539
+ program: 'vhe_bprm',
540
+ purpose: 'deny undeclared binaries at exec',
541
+ },
542
+ {
543
+ hook: 'lsm/socket_connect',
544
+ program: 'vhe_socket_connect',
545
+ purpose: 'pin egress to the engine proxy',
546
+ },
547
+ {
548
+ hook: 'tracepoint/syscalls/sys_enter_io_uring_setup',
549
+ program: 'vhe_io_uring_counter',
550
+ purpose: 'count denied async io attempts',
551
+ },
552
+ ];
553
+ /* ------------------------------------------------------------------ */
554
+ /* context: cgroups v2 layout + builder */
555
+ /* ------------------------------------------------------------------ */
556
+ /** cgroups v2 facts: unified hierarchy everywhere, delegation for
557
+ * rootless operation (podman, docker rootless, systemd Delegate=yes). */
558
+ const cgroupv2layout = {
559
+ mountpoint: '/sys/fs/cgroup',
560
+ hierarchy: 'unified (v2 only) on every modern distro',
561
+ controllers: ['cpu', 'cpuset', 'memory', 'io', 'pids', 'rdma', 'misc'],
562
+ delegation: 'subtree_control plus systemd Delegate=yes enable rootless delegation',
563
+ note: 'sustains the orchestrator MemorySwap/ShmSize limits',
564
+ };
565
+ /** builder for one sandbox cgroup; values are written verbatim into the
566
+ * unified hierarchy files. */
567
+ class cgroupbuilder {
568
+ #name;
569
+ #files = {};
570
+ constructor(name = 'vhe-sandbox') {
571
+ this.#name = name;
572
+ }
573
+ /** cpu.max as "quota period" (100000 100000 = 1 cpu). */
574
+ cpu(quota = 100000, period = 100000) {
575
+ this.#files['cpu.max'] = `${quota} ${period}`;
576
+ return this;
577
+ }
578
+ /** cpu.weight (1-10000, default 100). */
579
+ cpuweight(weight) {
580
+ this.#files['cpu.weight'] = String(weight);
581
+ return this;
582
+ }
583
+ /** memory.max hard limit in bytes. */
584
+ memorymax(bytes) {
585
+ this.#files['memory.max'] = String(bytes);
586
+ return this;
587
+ }
588
+ /** memory.high throttle point in bytes. */
589
+ memoryhigh(bytes) {
590
+ this.#files['memory.high'] = String(bytes);
591
+ return this;
592
+ }
593
+ /** memory.swap.max; "max" means unlimited, mirrors MemorySwap -1. */
594
+ memoryswapmax(limit) {
595
+ this.#files['memory.swap.max'] = String(limit);
596
+ return this;
597
+ }
598
+ /** pids.max process ceiling. */
599
+ pidsmax(count) {
600
+ this.#files['pids.max'] = String(count);
601
+ return this;
602
+ }
603
+ /** io.max line for one device ("8:0" style major:minor). */
604
+ iomax(device, rbps = 'max', wbps = 'max', riops = 'max', wiops = 'max') {
605
+ this.#files['io.max'] = `${device} rbps=${rbps} wbps=${wbps} riops=${riops} wiops=${wiops}`;
606
+ return this;
607
+ }
608
+ /** freezes the plan. */
609
+ build() {
610
+ return { name: this.#name, files: { ...this.#files } };
611
+ }
612
+ }
613
+ /* ------------------------------------------------------------------ */
614
+ /* context: post-quantum catalog */
615
+ /* ------------------------------------------------------------------ */
616
+ /** verified post-quantum facts (openssl.org, ietf, node release notes). */
617
+ const pqcatalog = {
618
+ mlkem: 'ML-KEM, FIPS 203 (module-lattice key encapsulation)',
619
+ mldsa: 'ML-DSA, FIPS 204 (module-lattice digital signature)',
620
+ slhdsa: 'SLH-DSA, FIPS 205 (stateful hash signatures)',
621
+ tlsdefault: 'X25519MLKEM768 hybrid group, default for TLS 1.3 since OpenSSL 3.5',
622
+ openssl: '3.5.5 bundled with node 24+',
623
+ rfc: 'RFC 10024 (2026-08-10) standardizes the PQ/T hybrid mechanisms for TLS 1.3',
624
+ chacha: 'ChaCha20-Poly1305 (RFC 8439) AEAD fallback for hosts without AES-NI',
625
+ aesnote: 'AES-256-GCM is up to 3x faster with AES-NI; ChaCha20 wins without it',
626
+ };
627
+ /** post-quantum key generation through node:crypto; every algorithm
628
+ * falls back to a clear error when the runtime predates OpenSSL 3.5. */
629
+ class pqkeyfactory {
630
+ /** ML-KEM-768 (FIPS 203) encapsulation keypair. */
631
+ static mlkem768() {
632
+ try {
633
+ const pair = generateKeyPairSync('ml-kem-768');
634
+ return { publickey: pair.publicKey, privatekey: pair.privateKey };
635
+ }
636
+ catch (error) {
637
+ throw new Error(`ml-kem-768 unavailable (requires node 24+ with OpenSSL 3.5.5+): ${errormessage(error)}`);
638
+ }
639
+ }
640
+ /** ML-DSA-65 (FIPS 204) signing keypair. */
641
+ static mldsa65() {
642
+ try {
643
+ const pair = generateKeyPairSync('ml-dsa-65');
644
+ return { publickey: pair.publicKey, privatekey: pair.privateKey };
645
+ }
646
+ catch (error) {
647
+ throw new Error(`ml-dsa-65 unavailable (requires node 24+ with OpenSSL 3.5.5+): ${errormessage(error)}`);
648
+ }
649
+ }
650
+ /** classic X25519 keypair for the hybrid group. */
651
+ static x25519() {
652
+ try {
653
+ const pair = generateKeyPairSync('x25519');
654
+ return { publickey: pair.publicKey, privatekey: pair.privateKey };
655
+ }
656
+ catch (error) {
657
+ throw new Error(`x25519 unavailable: ${errormessage(error)}`);
658
+ }
659
+ }
660
+ }
661
+ /* ------------------------------------------------------------------ */
662
+ /* context: hybrid TLS 1.3 secure context */
663
+ /* ------------------------------------------------------------------ */
664
+ /** builds a TLS 1.3 secure context with the PQ hybrid group first;
665
+ * node maps ecdhCurve to the OpenSSL groups list, so
666
+ * "X25519MLKEM768:X25519" negotiates the RFC 10024 hybrid before the
667
+ * classic group; ChaCha20-Poly1305 stays in the cipher list for hosts
668
+ * without AES-NI. */
669
+ function pqsecurecontext() {
670
+ try {
671
+ return createSecureContext({
672
+ minVersion: 'TLSv1.3',
673
+ ecdhCurve: 'X25519MLKEM768:X25519',
674
+ ciphers: 'TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256',
675
+ });
676
+ }
677
+ catch (error) {
678
+ throw new Error(`post-quantum secure context failed: ${errormessage(error)}`);
679
+ }
680
+ }
681
+ /* ------------------------------------------------------------------ */
682
+ /* context: chachapoly AEAD (RFC 8439) */
683
+ /* ------------------------------------------------------------------ */
684
+ /** seals plaintext with ChaCha20-Poly1305; the 16-byte tag is appended. */
685
+ function chachaseal(key, nonce, plaintext, aad = null) {
686
+ try {
687
+ const cipher = createCipheriv('chacha20-poly1305', key, nonce, {
688
+ authTagLength: 16,
689
+ });
690
+ if (aad !== null) {
691
+ cipher.setAAD(aad);
692
+ }
693
+ return Buffer.concat([cipher.update(plaintext), cipher.final(), cipher.getAuthTag()]);
694
+ }
695
+ catch (error) {
696
+ throw new Error(`chacha20-poly1305 seal failed: ${errormessage(error)}`);
697
+ }
698
+ }
699
+ /** opens a ChaCha20-Poly1305 sealed buffer (tag appended). */
700
+ function chachaopen(key, nonce, sealed, aad = null) {
701
+ try {
702
+ if (sealed.length < 16) {
703
+ throw new Error('sealed buffer is shorter than the 16-byte poly1305 tag');
704
+ }
705
+ const tag = sealed.subarray(sealed.length - 16);
706
+ const body = sealed.subarray(0, sealed.length - 16);
707
+ const decipher = createDecipheriv('chacha20-poly1305', key, nonce, {
708
+ authTagLength: 16,
709
+ });
710
+ decipher.setAuthTag(tag);
711
+ if (aad !== null) {
712
+ decipher.setAAD(aad);
713
+ }
714
+ return Buffer.concat([decipher.update(body), decipher.final()]);
715
+ }
716
+ catch (error) {
717
+ throw new Error(`chacha20-poly1305 open failed: ${errormessage(error)}`);
718
+ }
719
+ }
720
+ /** builder that composes the four layers into one profile. */
721
+ class profilebuilder {
722
+ #name = 'default';
723
+ #landlock = null;
724
+ #seccomp = defaultseccompprofile();
725
+ #cgroup = null;
726
+ #tls = { groups: 'X25519MLKEM768:X25519', minversion: 'TLSv1.3' };
727
+ #relabel = true;
728
+ #label = 'system_u:object_r:container_file_t:s0';
729
+ named(name) {
730
+ this.#name = name;
731
+ return this;
732
+ }
733
+ withlandlock(ruleset) {
734
+ this.#landlock = ruleset;
735
+ return this;
736
+ }
737
+ withseccomp(profile) {
738
+ this.#seccomp = profile;
739
+ return this;
740
+ }
741
+ withcgroup(plan) {
742
+ this.#cgroup = plan;
743
+ return this;
744
+ }
745
+ /** disables selinux relabel on criu restore. */
746
+ withoutrelabel() {
747
+ this.#relabel = false;
748
+ return this;
749
+ }
750
+ withlabel(label) {
751
+ this.#label = label;
752
+ return this;
753
+ }
754
+ /** freezes the composite profile. */
755
+ build() {
756
+ return {
757
+ name: this.#name,
758
+ landlock: this.#landlock,
759
+ seccomp: this.#seccomp,
760
+ cgroup: this.#cgroup,
761
+ tls: this.#tls,
762
+ criu: { relabel: this.#relabel, label: this.#label },
763
+ };
764
+ }
765
+ }
766
+ /* ------------------------------------------------------------------ */
767
+ /* context: policy registry (registry pattern) */
768
+ /* ------------------------------------------------------------------ */
769
+ /** registry of named sandbox profiles. */
770
+ class policyregistry {
771
+ #profiles = new Map();
772
+ register(profile) {
773
+ this.#profiles.set(profile.name, profile);
774
+ return this;
775
+ }
776
+ get(name) {
777
+ const found = this.#profiles.get(name);
778
+ if (found === undefined) {
779
+ throw new Error(`unknown security profile "${name}"; known: ${[...this.#profiles.keys()].join(', ')}`);
780
+ }
781
+ return found;
782
+ }
783
+ names() {
784
+ return [...this.#profiles.keys()];
785
+ }
786
+ }
787
+ /** default registry: minimal (workstation-like), compute (gpu workload,
788
+ * no network) and network (egress through the engine proxy). */
789
+ const defaultpolicies = new policyregistry()
790
+ .register(new profilebuilder()
791
+ .named('minimal')
792
+ .withlandlock(new landlockrulebuilder()
793
+ .readonlytree('/usr')
794
+ .readonlytree('/lib')
795
+ .writetree('/workspace')
796
+ .build())
797
+ .withcgroup(new cgroupbuilder('vhe-minimal')
798
+ .cpu(200000, 100000)
799
+ .memorymax(2 * 1024 * 1024 * 1024)
800
+ .pidsmax(512)
801
+ .build())
802
+ .build())
803
+ .register(new profilebuilder()
804
+ .named('compute')
805
+ .withlandlock(new landlockrulebuilder()
806
+ .readonlytree('/usr')
807
+ .readonlytree('/opt')
808
+ .writetree('/workspace')
809
+ .writetree('/dev/shm')
810
+ .scope('signal')
811
+ .build())
812
+ .withcgroup(new cgroupbuilder('vhe-compute')
813
+ .cpu(400000, 100000)
814
+ .cpuweight(200)
815
+ .memorymax(8 * 1024 * 1024 * 1024)
816
+ .memoryswapmax('max')
817
+ .pidsmax(1024)
818
+ .build())
819
+ .build())
820
+ .register(new profilebuilder()
821
+ .named('network')
822
+ .withlandlock(new landlockrulebuilder()
823
+ .readonlytree('/usr')
824
+ .writetree('/workspace')
825
+ .nettcp(false, true)
826
+ .netudp(false, true)
827
+ .scope('abstract_unix_socket')
828
+ .scope('signal')
829
+ .build())
830
+ .build());
831
+ /** observer bus for policy activity; listener failures never propagate. */
832
+ class policyevents {
833
+ #emitter = new EventEmitter();
834
+ constructor() {
835
+ this.#emitter.setMaxListeners(64);
836
+ }
837
+ on(name, listener) {
838
+ this.#emitter.on(name, listener);
839
+ return this;
840
+ }
841
+ emit(name, payload) {
842
+ try {
843
+ this.#emitter.emit(name, payload);
844
+ }
845
+ catch (_error) {
846
+ /* catcher: observer failures are isolated by design */
847
+ }
848
+ }
849
+ }
850
+ /* ------------------------------------------------------------------ */
851
+ /* context: policy proxy (proxy pattern + audit trail) */
852
+ /* ------------------------------------------------------------------ */
853
+ /** proxy that audits every profile access and reports violations when a
854
+ * profile layer is weaker than the engine baseline. */
855
+ class policyproxy {
856
+ #inner;
857
+ #events;
858
+ #audit = [];
859
+ constructor(inner, events) {
860
+ this.#inner = inner;
861
+ this.#events = events;
862
+ }
863
+ get name() {
864
+ return this.#inner.name;
865
+ }
866
+ /** audit trail entries. */
867
+ get audit() {
868
+ return this.#audit;
869
+ }
870
+ /** seccomp layer with an audit record. */
871
+ get seccomp() {
872
+ this.#audit.push(`read seccomp for ${this.#inner.name}`);
873
+ return this.#inner.seccomp;
874
+ }
875
+ /** landlock layer with an audit record. */
876
+ get landlock() {
877
+ this.#audit.push(`read landlock for ${this.#inner.name}`);
878
+ return this.#inner.landlock;
879
+ }
880
+ /** cgroup layer with an audit record. */
881
+ get cgroup() {
882
+ this.#audit.push(`read cgroup for ${this.#inner.name}`);
883
+ return this.#inner.cgroup;
884
+ }
885
+ /** true when the io_uring family stays denied; a violation event is
886
+ * emitted and recorded otherwise. */
887
+ iouringblocked() {
888
+ const blocked = this.#inner.seccomp.syscalls.some((group) => group.action === seccompactions.errno && group.names.includes('io_uring_setup'));
889
+ if (!blocked) {
890
+ const message = `profile ${this.#inner.name} fails to deny io_uring_setup (CVE-2026-46315)`;
891
+ this.#audit.push(`violation: ${message}`);
892
+ this.#events.emit('violation', { profile: this.#inner.name, message });
893
+ return false;
894
+ }
895
+ this.#audit.push(`io_uring family denied in ${this.#inner.name}`);
896
+ return true;
897
+ }
898
+ /** writes the seccomp profile json next to a sandbox runtime dir so
899
+ * the orchestrator can pass --security-opt seccomp=<path>. */
900
+ async persistseccomp(dir) {
901
+ try {
902
+ await mkdir(dir, { recursive: true });
903
+ const file = path.join(dir, `${this.#inner.name}-seccomp.json`);
904
+ await writeFile(file, JSON.stringify(this.#inner.seccomp, null, 2), 'utf8');
905
+ this.#audit.push(`persisted seccomp profile to ${file}`);
906
+ return file;
907
+ }
908
+ catch (error) {
909
+ throw new Error(`seccomp persistence failed: ${errormessage(error)}`);
910
+ }
911
+ }
912
+ }
913
+ /* ------------------------------------------------------------------ */
914
+ /* context: criu + selinux relabel */
915
+ /* ------------------------------------------------------------------ */
916
+ /** runs a command to completion and captures its output. */
917
+ function run(command, args) {
918
+ return new Promise((resolve, reject) => {
919
+ try {
920
+ const child = spawn(command, args);
921
+ let stderr = '';
922
+ child.stderr?.on('data', (chunk) => {
923
+ stderr += chunk.toString('utf8');
924
+ });
925
+ child.once('error', (error) => {
926
+ reject(new Error(`${command} failed to spawn: ${error.message}`));
927
+ });
928
+ child.once('close', (code) => {
929
+ resolve({ code: code ?? -1, stderr });
930
+ });
931
+ }
932
+ catch (error) {
933
+ reject(new Error(`${command} failed: ${errormessage(error)}`));
934
+ }
935
+ });
936
+ }
937
+ /** criu v4.2.1 selinux relabel support: restored images keep their
938
+ * labels through "criu restore --lsm-profile selinux:<label>" and the
939
+ * chcon fallback relabels the image tree before restore. */
940
+ class criurelabel {
941
+ #label;
942
+ constructor(label = 'system_u:object_r:container_file_t:s0') {
943
+ this.#label = label;
944
+ }
945
+ /** the --lsm-profile flag value for criu restore. */
946
+ lsmflag() {
947
+ return `selinux:${this.#label}`;
948
+ }
949
+ /** relabels a checkpoint image tree with chcon. */
950
+ async relabel(imagesdir) {
951
+ try {
952
+ const result = await run('chcon', ['-R', this.#label, imagesdir]);
953
+ if (result.code !== 0) {
954
+ throw new Error(`chcon exited ${result.code}: ${result.stderr.trim()}`);
955
+ }
956
+ }
957
+ catch (error) {
958
+ throw new Error(`selinux relabel failed for ${imagesdir}: ${errormessage(error)}`);
959
+ }
960
+ }
961
+ }
962
+ /* ------------------------------------------------------------------ */
963
+ /* context: applied profile guard (`using` scope) + self check */
964
+ /* ------------------------------------------------------------------ */
965
+ /** scope guard that emits applied/released events around a block; the
966
+ * `using` declaration releases the scope even on throw. */
967
+ class appliedprofile {
968
+ #profile;
969
+ #events;
970
+ #released = false;
971
+ constructor(profile, events) {
972
+ this.#profile = profile;
973
+ this.#events = events;
974
+ this.#events.emit('applied', { profile: profile.name });
975
+ }
976
+ [Symbol.dispose]() {
977
+ try {
978
+ if (!this.#released) {
979
+ this.#released = true;
980
+ this.#events.emit('released', { profile: this.#profile.name });
981
+ }
982
+ }
983
+ catch (_error) {
984
+ /* catcher: disposal must not throw */
985
+ }
986
+ }
987
+ }
988
+ /** random url-safe token for sandbox authentication. */
989
+ function randomtoken(bytes = 32) {
990
+ return randomBytes(bytes).toString('base64url');
991
+ }
992
+ /** constant-time comparison of two tokens. */
993
+ function tokenequals(a, b) {
994
+ const left = Buffer.from(a, 'utf8');
995
+ const right = Buffer.from(b, 'utf8');
996
+ return left.length === right.length && timingSafeEqual(left, right);
997
+ }
998
+ /** verifies the host security surface under a profile scope: landlock
999
+ * abi versus kernel release, lsm list, cgroup v2 mount, io_uring denial,
1000
+ * post-quantum keygen and the chacha roundtrip; the `using` guard
1001
+ * emits the applied/released events around the whole run. */
1002
+ async function securityselfcheck(profile = defaultpolicies.get('compute')) {
1003
+ const env_1 = { stack: [], error: void 0, hasError: false };
1004
+ try {
1005
+ const events = new policyevents();
1006
+ const checks = [];
1007
+ const _scope = __addDisposableResource(env_1, new appliedprofile(profile, events), false);
1008
+ const abi = detectlandlockabi();
1009
+ checks.push({
1010
+ name: 'landlock-abi',
1011
+ ok: abi >= 4,
1012
+ detail: `kernel ${release()} implies landlock abi v${abi} (v4+ needed for tcp rules, v10 is current)`,
1013
+ });
1014
+ const lsms = lsmlist();
1015
+ checks.push({
1016
+ name: 'landlock-lsm',
1017
+ ok: lsms.includes('landlock'),
1018
+ detail: lsms.length === 0
1019
+ ? 'lsm list unreadable (unprivileged container or hardened host)'
1020
+ : `active lsms: ${lsms.join(',')}`,
1021
+ });
1022
+ const proxy = new policyproxy(profile, events);
1023
+ checks.push({
1024
+ name: 'iouring-denied',
1025
+ ok: proxy.iouringblocked(),
1026
+ detail: 'io_uring_setup/enter/register must stay denied (CVE-2026-46315, docker moby#47532, gvisor default)',
1027
+ });
1028
+ try {
1029
+ const cgroupfiles = readFileSync('/proc/self/cgroup', 'utf8');
1030
+ checks.push({
1031
+ name: 'cgroups-v2',
1032
+ ok: cgroupfiles.includes('0::'),
1033
+ detail: cgroupfiles.includes('0::')
1034
+ ? 'unified hierarchy active'
1035
+ : 'cgroups v1 layout detected',
1036
+ });
1037
+ }
1038
+ catch (error) {
1039
+ checks.push({
1040
+ name: 'cgroups-v2',
1041
+ ok: false,
1042
+ detail: `cgroup detection failed: ${errormessage(error)}`,
1043
+ });
1044
+ }
1045
+ try {
1046
+ const pair = pqkeyfactory.mlkem768();
1047
+ checks.push({
1048
+ name: 'pq-mlkem',
1049
+ ok: pair.publickey.asymmetricKeyType === 'ml-kem-768',
1050
+ detail: `ML-KEM-768 keypair ready (FIPS 203; ${pqcatalog.openssl})`,
1051
+ });
1052
+ }
1053
+ catch (error) {
1054
+ checks.push({ name: 'pq-mlkem', ok: false, detail: errormessage(error) });
1055
+ }
1056
+ try {
1057
+ const key = randomBytes(32);
1058
+ const nonce = randomBytes(12);
1059
+ const sealed = chachaseal(key, nonce, Buffer.from('vhe', 'utf8'));
1060
+ const opened = chachaopen(key, nonce, sealed).toString('utf8');
1061
+ checks.push({
1062
+ name: 'chacha-poly1305',
1063
+ ok: opened === 'vhe',
1064
+ detail: 'RFC 8439 AEAD roundtrip succeeded',
1065
+ });
1066
+ }
1067
+ catch (error) {
1068
+ checks.push({ name: 'chacha-poly1305', ok: false, detail: errormessage(error) });
1069
+ }
1070
+ return checks;
1071
+ }
1072
+ catch (e_1) {
1073
+ env_1.error = e_1;
1074
+ env_1.hasError = true;
1075
+ }
1076
+ finally {
1077
+ __disposeResources(env_1);
1078
+ }
1079
+ }
1080
+ export { cgroupbuilder, cgroupv2layout, chachaopen, chachaseal, criurelabel, defaultpolicies, defaultseccompprofile, detectlandlockabi, ebpfattachplan, ebpflsmfacts, kernelversion, landlockabitable, landlockfsaccess, landlocknetaccess, landlockplan, landlockrulebuilder, landlockscopes, lsmlist, policyevents, policyproxy, policyregistry, pqcatalog, pqkeyfactory, pqsecurecontext, profilebuilder, randomtoken, seccompactions, seccompbuilder, securityselfcheck, syscallnumbers, tokenequals, };
1081
+ /* ------------------------------------------------------------------ */
1082
+ /* context: rfc10024 + pqcaudit (post-quantum negotiation and audit */
1083
+ /* trail) — v3-B1 append absorbing future.ts features 026-027; the */
1084
+ /* ml-kem/ml-dsa keygen and the hybrid TLS context already lived here */
1085
+ /* (pqkeyfactory, pqsecurecontext), so only these two were missing */
1086
+ /* ------------------------------------------------------------------ */
1087
+ /** short sha256 digest for the audit hash chain. */
1088
+ function pqdigest(input) {
1089
+ try {
1090
+ return createHash('sha256').update(input).digest('hex').slice(0, 16);
1091
+ }
1092
+ catch {
1093
+ return input.length.toString(16);
1094
+ }
1095
+ }
1096
+ /** the three hybrid mechanisms the RFC registers for TLS 1.3. */
1097
+ export const rfc10024mechanisms = [
1098
+ { name: 'X25519MLKEM768', classical: 'X25519', pq: 'ML-KEM-768', securityBits: 192 },
1099
+ { name: 'SecP256r1MLKEM768', classical: 'secp256r1', pq: 'ML-KEM-768', securityBits: 192 },
1100
+ { name: 'SecP384r1MLKEM1024', classical: 'secp384r1', pq: 'ML-KEM-1024', securityBits: 256 },
1101
+ ];
1102
+ /**
1103
+ * negotiates the strongest mutually supported PQ/T hybrid mechanism:
1104
+ * server preference order wins, mirroring how OpenSSL 3.5 orders the
1105
+ * groups list behind pqsecurecontext above.
1106
+ */
1107
+ export class rfc10024negotiator {
1108
+ #serverPreference = rfc10024mechanisms;
1109
+ setpreference(names) {
1110
+ const byName = new Map(rfc10024mechanisms.map((m) => [m.name, m]));
1111
+ const ordered = names
1112
+ .map((n) => byName.get(n))
1113
+ .filter((m) => m !== undefined);
1114
+ if (ordered.length > 0)
1115
+ this.#serverPreference = ordered;
1116
+ }
1117
+ negotiate(clientOffered) {
1118
+ const offered = new Set(clientOffered);
1119
+ for (const mech of this.#serverPreference) {
1120
+ if (offered.has(mech.name))
1121
+ return mech;
1122
+ }
1123
+ return null;
1124
+ }
1125
+ }
1126
+ /**
1127
+ * hash-chained, tamper-evident log recording which sessions negotiated
1128
+ * post-quantum protection — the core evidence against
1129
+ * harvest-now-decrypt-later attacks. verify() replays the chain and
1130
+ * coverage() reports the PQ share of all recorded sessions.
1131
+ */
1132
+ export class pqcaudittrail {
1133
+ #entries = [];
1134
+ #head = 'genesis';
1135
+ record(event, algorithm, hybrid) {
1136
+ const ts = new Date().toISOString();
1137
+ const hash = pqdigest(`${this.#head}|${ts}|${event}|${algorithm}|${hybrid}`);
1138
+ const entry = { ts, event, algorithm, hybrid, prevHash: this.#head, hash };
1139
+ this.#head = hash;
1140
+ this.#entries.push(entry);
1141
+ return entry;
1142
+ }
1143
+ verify() {
1144
+ let prev = 'genesis';
1145
+ for (const entry of this.#entries) {
1146
+ if (entry.prevHash !== prev)
1147
+ return false;
1148
+ if (pqdigest(`${entry.prevHash}|${entry.ts}|${entry.event}|${entry.algorithm}|${entry.hybrid}`) !== entry.hash) {
1149
+ return false;
1150
+ }
1151
+ prev = entry.hash;
1152
+ }
1153
+ return true;
1154
+ }
1155
+ /** share of sessions protected by a PQ or PQ/T hybrid mechanism. */
1156
+ coverage() {
1157
+ const total = this.#entries.length;
1158
+ const pq = this.#entries.filter((e) => e.hybrid || e.algorithm.startsWith('ML-')).length;
1159
+ return { total, pqShare: total === 0 ? 0 : Number((pq / total).toFixed(3)) };
1160
+ }
1161
+ }
1162
+ /**
1163
+ * builds one policy default entry whose value never leaks inference
1164
+ * back into the caller's generic — the exact factory leak the pool
1165
+ * NoInfer demo (FactoryOptionsNoInfer) documented.
1166
+ */
1167
+ export function policypreset(value) {
1168
+ return { kind: 'policy-default', value };
1169
+ }
1170
+ //# sourceMappingURL=security.js.map