@wenathlan/saddle 2.1.6 → 2.1.8

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 (300) hide show
  1. package/Dockerfile +170 -66
  2. package/LICENSE +0 -0
  3. package/README.md +73 -58
  4. package/alternatives.ts +0 -0
  5. package/biome.jsonc +134 -0
  6. package/boards.json +2 -2
  7. package/browser.ts +482 -0
  8. package/cli.ts +274 -0
  9. package/compute.ts +4 -4
  10. package/cores.json +2 -2
  11. package/distribution.ts +731 -0
  12. package/docker.config +37 -9
  13. package/docs/.gitkeep +0 -0
  14. package/docs/actionrecorder.md +0 -0
  15. package/docs/actionsincident.md +0 -0
  16. package/docs/alternatives.md +0 -0
  17. package/docs/architecture.md +0 -0
  18. package/docs/{architecture-1.8.19.md → architecture1819.md} +0 -0
  19. package/docs/{architecture-1.8.19.mmd → architecture1819.mmd} +0 -0
  20. package/docs/artifactavailability.md +2 -2
  21. package/docs/{artifactresearch-1.8.9.md → artifactresearch189.md} +0 -0
  22. package/docs/{batches-1816-1820.md → batches1816to1820.md} +0 -0
  23. package/docs/{brancharchive-2026-08-18.md → brancharchive20260818.md} +0 -0
  24. package/docs/branchaudit.md +0 -0
  25. package/docs/browser.md +18 -1
  26. package/docs/capabilityreport.md +0 -0
  27. package/docs/comparativeaudit.md +0 -0
  28. package/docs/consolidation.md +0 -0
  29. package/docs/{containerplatforms-1.8.17.md → containerplatforms1817.md} +0 -0
  30. package/docs/{containerplatforms-2.1.0.md → containerplatforms210.md} +1 -1
  31. package/docs/{documentmap-1.8.12.md → documentmap1812.md} +1 -1
  32. package/docs/{e2ugh-engine.md → e2ughengine.md} +0 -0
  33. package/docs/ecosystemplan.md +0 -0
  34. package/docs/enginearchitecture.md +0 -0
  35. package/docs/extension.md +13 -2
  36. package/docs/featureaudit.md +0 -0
  37. package/docs/{flatbuildresearch-1.8.11.md → flatbuildresearch1811.md} +0 -0
  38. package/docs/gapmatrix.md +0 -0
  39. package/docs/hardware.md +0 -0
  40. package/docs/libraryapi.md +1 -1
  41. package/docs/{licenseaudit-1.8.12.md → licenseaudit1812.md} +0 -0
  42. package/docs/logs/examplesession.json +54 -0
  43. package/docs/memoryengine.md +0 -0
  44. package/docs/{mobileconversionresearch-1.8.10.md → mobileconversionresearch1810.md} +0 -0
  45. package/docs/modes.md +0 -0
  46. package/docs/{nativeidentityresearch-1.8.11.md → nativeidentityresearch1811.md} +0 -0
  47. package/docs/{native-wrappers.md → nativewrappers.md} +0 -0
  48. package/docs/ninetymodalities.md +191 -0
  49. package/docs/optimization.md +0 -0
  50. package/docs/packageaudit185.md +0 -0
  51. package/docs/performance.md +0 -0
  52. package/docs/{planning.1.8.18.md → planning1818.md} +0 -0
  53. package/docs/{planning.1.8.19.md → planning1819.md} +0 -0
  54. package/docs/planningengine.md +186 -0
  55. package/docs/planningninety.md +391 -0
  56. package/docs/platformpipelineaudit.md +0 -0
  57. package/docs/platformpipelines.md +0 -0
  58. package/docs/productindex.md +0 -0
  59. package/docs/registryresearch.md +0 -0
  60. package/docs/release.md +0 -0
  61. package/docs/release17notes.md +0 -0
  62. package/docs/release181notes.md +0 -0
  63. package/docs/release182notes.md +0 -0
  64. package/docs/release184notes.md +0 -0
  65. package/docs/release185notes.md +0 -0
  66. package/docs/release18notes.md +0 -0
  67. package/docs/releaseassets.md +0 -0
  68. package/docs/{releasenotes-1.8.12.md → releasenotes1812.md} +0 -0
  69. package/docs/{releasenotes-1.8.13.md → releasenotes1813.md} +2 -2
  70. package/docs/{releasenotes-1.8.14.md → releasenotes1814.md} +1 -1
  71. package/docs/{releasenotes-1.8.15.md → releasenotes1815.md} +0 -0
  72. package/docs/{releasenotes-1.8.16.md → releasenotes1816.md} +0 -0
  73. package/docs/{releasenotes-1.8.17.md → releasenotes1817.md} +0 -0
  74. package/docs/{releasenotes-1.8.18.md → releasenotes1818.md} +0 -0
  75. package/docs/{releasenotes-1.8.19.md → releasenotes1819.md} +0 -0
  76. package/docs/{reorganization-1.8.8.md → reorganization188.md} +0 -0
  77. package/docs/{reorganization-1.8.9.md → reorganization189.md} +0 -0
  78. package/docs/{repo-analysis-1.8.21.json → repoanalysis1821.json} +0 -0
  79. package/docs/{repo-candidates-1.8.21.jsonl → repocandidates1821.jsonl} +0 -0
  80. package/docs/{repo-research-1.8.16.md → reporesearch1816.md} +0 -0
  81. package/docs/{repo-research-1.8.21.md → reporesearch1821.md} +0 -0
  82. package/docs/{repo-selected-1.8.21.json → reposelected1821.json} +0 -0
  83. package/docs/{repo-synthesis-1.8.16.md → reposynthesis1816.md} +1 -1
  84. package/docs/{repo-synthesis-1.8.21.md → reposynthesis1821.md} +0 -0
  85. package/docs/{research-1.8.18-isolation.md → research1818isolation.md} +0 -0
  86. package/docs/{research-1.8.19-virtual-browser.md → research1819virtualbrowser.md} +0 -0
  87. package/docs/roadmapp2p3.md +0 -0
  88. package/docs/s3compatible.md +0 -0
  89. package/docs/{scanningresearch-1.8.11.md → scanningresearch1811.md} +0 -0
  90. package/docs/security.md +0 -0
  91. package/docs/{securityaudit-1.8.7.md → securityaudit187.md} +0 -0
  92. package/docs/{securityreferences-1.8.11.md → securityreferences1811.md} +0 -0
  93. package/docs/{securityresearch-1.8.11.md → securityresearch1811.md} +0 -0
  94. package/docs/{signingresearch-1.8.12.md → signingresearch1812.md} +0 -0
  95. package/docs/signingwithoutcertificates.md +0 -0
  96. package/docs/signpathapplication.md +0 -0
  97. package/docs/sitemap.md +0 -0
  98. package/docs/{tauri-glib-risk-1.8.11.md → tauriglibrisk1811.md} +0 -0
  99. package/docs/todo.md +2 -2
  100. package/docs/{todo-1.8.15.md → todo1815.md} +1 -1
  101. package/docs/{todo-1.8.16.md → todo1816.md} +5 -5
  102. package/docs/{todo-1.8.18.md → todo1818.md} +0 -0
  103. package/docs/{todo-1.8.19.md → todo1819.md} +0 -0
  104. package/docs/{toolchainresearch-1.8.9.md → toolchainresearch189.md} +0 -0
  105. package/docs/toolchains.md +0 -0
  106. package/docs/usage.md +0 -0
  107. package/docs/viability.md +0 -0
  108. package/docs/virtualization.md +0 -0
  109. package/docs/{web-duplicatecleanup.md → webduplicatecleanup.md} +0 -0
  110. package/docs/{web-ideas.md → webideas.md} +0 -0
  111. package/docs/{workflowimprovements-2026-08-19.md → workflowimprovements20260819.md} +0 -0
  112. package/docs/workflowinputs.md +0 -0
  113. package/docs/workflowoperations.md +0 -0
  114. package/docs/workloadlaw.md +104 -0
  115. package/execution.ts +677 -0
  116. package/foundation.ts +314 -0
  117. package/gpumonitor.cpp +0 -0
  118. package/gpus.json +1 -1
  119. package/index.ts +38 -29
  120. package/isolation.ts +84 -0
  121. package/modalityregistry.ts +1493 -0
  122. package/{dist/modes.js → modes.ts} +79 -62
  123. package/mttg.config +1 -1
  124. package/orchestrator.ts +54 -17
  125. package/package.json +245 -146
  126. package/passage.config +0 -0
  127. package/performance.ts +0 -0
  128. package/processors.json +1 -1
  129. package/qemu.config +2 -2
  130. package/qemubridge.py +0 -0
  131. package/quantum.ts +0 -0
  132. package/render.ts +0 -0
  133. package/sandbox.ts +2035 -0
  134. package/scheduler.ts +1 -1
  135. package/security.ts +0 -0
  136. package/server.ts +52 -0
  137. package/tiers.ts +9 -3
  138. package/tsconfig.json +22 -13
  139. package/virtual.ts +1105 -0
  140. package/virtualcpu.ts +1 -0
  141. package/virtualgpu.ts +2 -1
  142. package/virtualhardware.c +0 -0
  143. package/virtualhardware.json +2 -2
  144. package/virtualization.ts +1 -1
  145. package/virtualizationcore.cpp +0 -0
  146. package/virtualmemory.ts +0 -0
  147. package/vm.config.json +2 -2
  148. package/workloadlaw.ts +293 -0
  149. package/biome.json +0 -151
  150. package/dist/acquisition.d.ts +0 -359
  151. package/dist/acquisition.d.ts.map +0 -1
  152. package/dist/acquisition.js +0 -629
  153. package/dist/acquisition.js.map +0 -1
  154. package/dist/alternatives.d.ts +0 -509
  155. package/dist/alternatives.d.ts.map +0 -1
  156. package/dist/alternatives.js +0 -951
  157. package/dist/alternatives.js.map +0 -1
  158. package/dist/automation.d.ts +0 -426
  159. package/dist/automation.d.ts.map +0 -1
  160. package/dist/automation.js +0 -561
  161. package/dist/automation.js.map +0 -1
  162. package/dist/browser.d.ts +0 -562
  163. package/dist/browser.d.ts.map +0 -1
  164. package/dist/browser.js +0 -1057
  165. package/dist/browser.js.map +0 -1
  166. package/dist/cli.d.ts +0 -17
  167. package/dist/cli.d.ts.map +0 -1
  168. package/dist/cli.js +0 -169
  169. package/dist/cli.js.map +0 -1
  170. package/dist/communication.d.ts +0 -192
  171. package/dist/communication.d.ts.map +0 -1
  172. package/dist/communication.js +0 -418
  173. package/dist/communication.js.map +0 -1
  174. package/dist/compute.d.ts +0 -1161
  175. package/dist/compute.d.ts.map +0 -1
  176. package/dist/compute.js +0 -2273
  177. package/dist/compute.js.map +0 -1
  178. package/dist/distribution.d.ts +0 -529
  179. package/dist/distribution.d.ts.map +0 -1
  180. package/dist/distribution.js +0 -811
  181. package/dist/distribution.js.map +0 -1
  182. package/dist/docs/example-localjob.d.ts +0 -2
  183. package/dist/docs/example-localjob.d.ts.map +0 -1
  184. package/dist/docs/example-localjob.js +0 -15
  185. package/dist/docs/example-localjob.js.map +0 -1
  186. package/dist/docs/example-publicapi.d.ts +0 -2
  187. package/dist/docs/example-publicapi.d.ts.map +0 -1
  188. package/dist/docs/example-publicapi.js +0 -7
  189. package/dist/docs/example-publicapi.js.map +0 -1
  190. package/dist/execution.d.ts +0 -530
  191. package/dist/execution.d.ts.map +0 -1
  192. package/dist/execution.js +0 -761
  193. package/dist/execution.js.map +0 -1
  194. package/dist/format.d.ts +0 -19
  195. package/dist/format.d.ts.map +0 -1
  196. package/dist/format.js +0 -60
  197. package/dist/format.js.map +0 -1
  198. package/dist/foundation.d.ts +0 -176
  199. package/dist/foundation.d.ts.map +0 -1
  200. package/dist/foundation.js +0 -309
  201. package/dist/foundation.js.map +0 -1
  202. package/dist/index.d.ts +0 -735
  203. package/dist/index.d.ts.map +0 -1
  204. package/dist/index.js +0 -1020
  205. package/dist/index.js.map +0 -1
  206. package/dist/integration.d.ts +0 -236
  207. package/dist/integration.d.ts.map +0 -1
  208. package/dist/integration.js +0 -236
  209. package/dist/integration.js.map +0 -1
  210. package/dist/intelligence.d.ts +0 -94
  211. package/dist/intelligence.d.ts.map +0 -1
  212. package/dist/intelligence.js +0 -145
  213. package/dist/intelligence.js.map +0 -1
  214. package/dist/isolation.d.ts +0 -129
  215. package/dist/isolation.d.ts.map +0 -1
  216. package/dist/isolation.js +0 -96
  217. package/dist/isolation.js.map +0 -1
  218. package/dist/media.d.ts +0 -344
  219. package/dist/media.d.ts.map +0 -1
  220. package/dist/media.js +0 -986
  221. package/dist/media.js.map +0 -1
  222. package/dist/modes.d.ts +0 -359
  223. package/dist/modes.d.ts.map +0 -1
  224. package/dist/modes.js.map +0 -1
  225. package/dist/operations.d.ts +0 -67
  226. package/dist/operations.d.ts.map +0 -1
  227. package/dist/operations.js +0 -94
  228. package/dist/operations.js.map +0 -1
  229. package/dist/orchestrator.d.ts +0 -1339
  230. package/dist/orchestrator.d.ts.map +0 -1
  231. package/dist/orchestrator.js +0 -4308
  232. package/dist/orchestrator.js.map +0 -1
  233. package/dist/packager/targetcli.js +0 -4
  234. package/dist/performance.d.ts +0 -416
  235. package/dist/performance.d.ts.map +0 -1
  236. package/dist/performance.js +0 -827
  237. package/dist/performance.js.map +0 -1
  238. package/dist/quantum.d.ts +0 -810
  239. package/dist/quantum.d.ts.map +0 -1
  240. package/dist/quantum.js +0 -2073
  241. package/dist/quantum.js.map +0 -1
  242. package/dist/render.d.ts +0 -381
  243. package/dist/render.d.ts.map +0 -1
  244. package/dist/render.js +0 -1073
  245. package/dist/render.js.map +0 -1
  246. package/dist/scheduler.d.ts +0 -596
  247. package/dist/scheduler.d.ts.map +0 -1
  248. package/dist/scheduler.js +0 -1259
  249. package/dist/scheduler.js.map +0 -1
  250. package/dist/security.d.ts +0 -501
  251. package/dist/security.d.ts.map +0 -1
  252. package/dist/security.js +0 -1170
  253. package/dist/security.js.map +0 -1
  254. package/dist/server.d.ts +0 -21
  255. package/dist/server.d.ts.map +0 -1
  256. package/dist/server.js +0 -52
  257. package/dist/server.js.map +0 -1
  258. package/dist/tiers.d.ts +0 -1002
  259. package/dist/tiers.d.ts.map +0 -1
  260. package/dist/tiers.js +0 -2165
  261. package/dist/tiers.js.map +0 -1
  262. package/dist/virtual.d.ts +0 -641
  263. package/dist/virtual.d.ts.map +0 -1
  264. package/dist/virtual.js +0 -1285
  265. package/dist/virtual.js.map +0 -1
  266. package/dist/virtualcpu.d.ts +0 -316
  267. package/dist/virtualcpu.d.ts.map +0 -1
  268. package/dist/virtualcpu.js +0 -1180
  269. package/dist/virtualcpu.js.map +0 -1
  270. package/dist/virtualgpu.d.ts +0 -345
  271. package/dist/virtualgpu.d.ts.map +0 -1
  272. package/dist/virtualgpu.js +0 -1000
  273. package/dist/virtualgpu.js.map +0 -1
  274. package/dist/virtualization.d.ts +0 -607
  275. package/dist/virtualization.d.ts.map +0 -1
  276. package/dist/virtualization.js +0 -1187
  277. package/dist/virtualization.js.map +0 -1
  278. package/dist/virtualmemory.d.ts +0 -818
  279. package/dist/virtualmemory.d.ts.map +0 -1
  280. package/dist/virtualmemory.js +0 -1796
  281. package/dist/virtualmemory.js.map +0 -1
  282. package/dist/vitest.config.d.ts +0 -3
  283. package/dist/vitest.config.d.ts.map +0 -1
  284. package/dist/vitest.config.js +0 -26
  285. package/dist/vitest.config.js.map +0 -1
  286. package/dist/webscrape.d.ts +0 -720
  287. package/dist/webscrape.d.ts.map +0 -1
  288. package/dist/webscrape.js +0 -2697
  289. package/dist/webscrape.js.map +0 -1
  290. package/docs/CONVERSA.txt +0 -1523
  291. package/docs/architecture-1.8.19.png +0 -0
  292. package/docs/assets/architecture.svg +0 -45
  293. package/docs/assets/saddlemark.svg +0 -13
  294. package/docs/example-localjob.ts +0 -15
  295. package/docs/example-publicapi.ts +0 -7
  296. package/docs/saddle.archive.1.8.17.tar.gz.gpg +0 -0
  297. package/media.ts +0 -1337
  298. package/web/manifest.json +0 -30
  299. package/web/readme.md +0 -383
  300. package/web/tsconfig.json +0 -25
package/README.md CHANGED
@@ -3,8 +3,8 @@
3
3
  </p>
4
4
 
5
5
  <p align="center">
6
- <strong>Storage-backed jobs, scraping contracts and portable runners for Node.js.</strong><br/>
7
- <strong>Binary computing engine, agent browser, scraper and packager.</strong><br/>
6
+ <strong>Storage-backed jobs, ninety sandbox modalities and portable runners for Node.js.</strong><br/>
7
+ <strong>Binary computing engine, agent browser, sandbox plane and packager.</strong><br/>
8
8
  <a href="https://github.com/wenathlan/saddle/actions/workflows/ci.yml"><img src="https://github.com/wenathlan/saddle/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
9
9
  <a href="https://github.com/wenathlan/saddle/releases/tag/v2.0.0"><img src="https://img.shields.io/badge/release-v2.0.0-d35d3d" alt="Release 2.0.0" /></a>
10
10
  <a href="https://github.com/wenathlan/saddle/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-GPL--3.0--only-202a2f" alt="GPL 3.0 only license" /></a>
@@ -30,11 +30,13 @@ domain modules land beside the saddle domains:
30
30
  | `scheduler.ts`, `compute.ts`, `performance.ts` | job queues, batch compute and benchmark planning |
31
31
  | `media.ts`, `render.ts`, `quantum.ts`, `tiers.ts` | media pipeline, GPU registry, quantum simulation, tier policy |
32
32
  | `security.ts`, `alternatives.ts` | hardening gates and the alternative-stack catalog |
33
- | `web/` | the static console and the zero-dependency self-hosted API (`node web/server.ts`) |
33
+ | `index.html`, `App.tsx`, `Sol/` | the single SPA shell and the Sol theme (one tsx app with one stylesheet per theme) |
34
+ | `server.ts`, `sandbox.ts` | the zero-dependency self-hosted API of the 2.1.8 grand-merge envelope (`node server.ts`; the api answers its version at `/api/v1/health`) and the browser-pure engine port |
35
+ | `vercel.json`, `netlify.toml` | the platform deploy adapters beside the surface they publish (the caddy ghost stays out of the tree) |
34
36
  | `specs/*` package exports | processors, gpus, cores, boards and the qemu/mttg/passage/docker envelopes |
35
37
 
36
38
  The full pre-merge documentation of the engine lives in
37
- [docs/e2ugh-engine.md](docs/e2ugh-engine.md) and its release history in
39
+ [docs/e2ughengine.md](docs/e2ughengine.md) and its release history in
38
40
  [CHANGELOG.md (the e2ugh lineage sections)](CHANGELOG.md (the e2ugh lineage sections)).
39
41
 
40
42
  ## Start here
@@ -46,18 +48,18 @@ npm install @wenathlan/saddle
46
48
  ```
47
49
 
48
50
  ```js
49
- import { scrapeurl, formatforagent } from "@wenathlan/saddle";
51
+ import { createVirtualEngine, planreport, resolvejoin } from "@wenathlan/saddle";
50
52
 
51
- const result = await scrapeurl("https://example.com", { format: "markdown" });
52
- const context = formatforagent(result, { maxchunksize: 2000, keypoints: 4 });
53
+ const engine = createVirtualEngine({ model: "saddle-90", vcpus: 4, ramgb: 8 });
54
+ const report = planreport(); // { plancount: 90, live: 81, host: 9, planned: 0, plananswered: true }
55
+ const modalities = resolvejoin({ base: "balanced", gpu: false, network: false });
53
56
 
54
- console.log(context.summary);
57
+ console.log(engine.id, report.plananswered, modalities[0].id);
55
58
  ```
56
59
 
57
- The deterministic examples and tests do not require network access or real credentials:
60
+ The deterministic engine tests do not require network access or real credentials:
58
61
 
59
62
  ```bash
60
- node --import tsx docs/example-publicapi.ts
61
63
  npm test
62
64
  ```
63
65
 
@@ -88,9 +90,8 @@ The historical design treats the repository and its runner as a **virtual proces
88
90
 
89
91
  | Mode | Boundary | Typical use |
90
92
  | --- | --- | --- |
91
- | Fetch | no browser | Static HTML, APIs and deterministic extraction. |
93
+ | Library | in-process function call | The npm package consumed directly by another program. |
92
94
  | Browser | caller-owned transport | Interactive pages, snapshots, tabs and actions. |
93
- | Auto | adaptive selection | Fetch first, then browser when the caller permits it. |
94
95
  | Headless | no visible UI | CI runners, servers and scheduled jobs. |
95
96
  | CLI or binary | packaged entry point | Operator tools or third-party compute jobs. |
96
97
  | Computer | storage-to-compute bridge | Bounded binary and memory processing. |
@@ -108,8 +109,9 @@ The engine coordinates serializable contracts rather than hiding providers. The
108
109
  | Jobs | `engine`, `scheduler`, `inprocess` | `prepare -> process -> sync -> cleanup` |
109
110
  | Storage | local, chunked, content-addressed, S3-compatible, GitHub Contents and file-hosting adapters | durable objects, ranges, dedupe and sync |
110
111
  | Working set | memory bridge, modes, objects and transforms | storage-to-compute and compute-to-storage flows |
111
- | Scraping | robots, cache, extraction, semantic facts, schema and normalization | bounded text, metadata, links, controls and structured output |
112
- | Crawl | normalization, priority frontier, BFS crawler and persistent frontier contracts | domain-aware bounded crawling |
112
+ | Sandbox modalities | the ninety-record modality registry with the join resolver and the honest live/host/planned census | the workload never names a modality — the platform resolves the join |
113
+ | Edge lanes | the edgelandes lane tables (sandbox jails, language toolchains, runner seats, ram recipes, delivery protocols, storage wire speakers, virtual compositions) | ninety lanes probing the host, every run in a private temp dir under a hard deadline |
114
+ | Script lanes | sh interpretation, the house yaml subset and detached background runs | deterministic local execution through the universal runner |
113
115
  | Browser | snapshots, tabs, frames, actions, fingerprint, session and replay contracts | caller-owned browser automation without a mandatory provider |
114
116
  | Operations | queues, idempotency, saga, retry, circuit breaker, health and heartbeat | controlled execution and recovery |
115
117
  | Protocols | JSON, NDJSON, SSE, blocks, API envelopes and MCP | transport-neutral messages |
@@ -134,9 +136,9 @@ The root entry point is transport-neutral. Node filesystem, HTTP server, persist
134
136
 
135
137
  The same contracts can be surfaced as an npm library, application archive, computer runtime, desktop installer, Android APK/AAB, iOS IPA, CLI, binary, browser package, Manifest V3 extension, web/PWA artifact, LibreOffice OXT, VSIX, webhook server, MCP transport, workflow action, container image, Maven package, NuGet package or RubyGem. These surfaces are declarative target plans and caller-owned adapters around the engine; they are not separate sources of truth.
136
138
 
137
- ### Agent context and structured output
139
+ ### The ninety sandbox modalities
138
140
 
139
- The extraction path is **structured-first**: metadata and schema facts are selected before free-form text, then serialized to bounded Markdown, JSON or XML. Heading-aware chunks preserve source URL, content hash, heading path and token estimates for downstream retrieval. `generateLlmsTxt` and `generateLlmsFullTxt` expose concise agent indexes with absolute links, while `estimateTokens`, `fitsInContext` and the browser context budget prevent a caller from silently exceeding its chosen model or transport limit. No model provider is mandatory; parsing and context policies remain injectable.
141
+ The sandbox plane answers the ninety modality plan. `modalityregistry.ts` holds one honest record per modality — isolation family, drivers, hardening gates, boot budget, gpu and network paths, and a live/host/planned state that never pretends — and `resolvejoin` reads a workload request (base profile, gpu, network, isolation depth, boot budget) and answers the modality set that satisfies it, so the person chooses none and the platform resolves the join of all. The edgelandes lane tables wire the plan: ninety lanes probing their host runtime (the sandbox jails, the language toolchains, the runner seats, the ram recipes, the delivery protocols, the virtual hardware compositions), every run in a private temp dir under a hard deadline, an absent runtime answering a coded absence that names it. `scriptlanes.ts` rides the same law for scripts — sh plans, the house yaml subset and detached background runs through the universal runner — and `workloadlaw.ts` catalogs the heavy workload lane of every family app as a demand the same join resolver answers. The self-hosted surface publishes the census at `/api/v1/modalities` and the lane table at `/api/v1/edge/lanes`.
140
142
 
141
143
  ### Third-party compute identity
142
144
 
@@ -146,23 +148,18 @@ Saddle can be connected to GitHub, GitLab, Forgejo, Gitea, Codeberg, Docker or a
146
148
 
147
149
  | Export | Purpose |
148
150
  | --- | --- |
149
- | `saddleurl` | choose a fetch or caller-injected browser path |
150
- | `scrapeurl` | fetch one URL and extract bounded content |
151
- | `scrapehtml` | extract from HTML without network access |
152
- | `extractcontent` | structured extraction |
153
- | `serializeresult` | serialize JSON, Markdown or XML results |
154
- | `formatforagent` | summary, chunks and token count |
155
- | `chunkMarkdown` / `formatChunksForRAG` | heading-aware bounded chunks for downstream context |
156
- | `generateLlmsTxt` / `generateLlmsFullTxt` | agent-readable documentation indexes |
157
- | `estimateTokens` / `fitsInContext` | model-neutral context and cost estimates |
158
- | `withRetry` | bounded retry and abort handling |
159
- | `createServer` | caller-owned HTTP surface |
160
- | `batchscrape` | bounded URL groups |
161
- | `crawlurl` | crawl contract with domain and budget controls |
151
+ | `createVirtualEngine` / `VirtualEngine` / `probeengine` | virtual machine lifecycle, health probes and metrics |
152
+ | `validateSpec` / `specschema` | engine specification validation and normalization |
153
+ | `randomPort` / `resolveHost` / `buildEndpoint` | endpoint allocation without fixed addresses |
154
+ | `InternalMemory` / `MetricsStore` / `enginebus` | the memory bank, the metrics store and the engine event bus |
155
+ | `MODALITIES` / `planreport` | the ninety-record modality registry and its honest census |
156
+ | `resolvejoin` / `getmodality` | the join resolver — the workload never names a modality |
157
+ | `edgelanes` / `edgelandesreport` | the edge lane table and its probe report |
158
+ | `interpretsh` / `interpretyml` / `runscriptbackground` | script lanes: sh plans, yaml plans and detached runs |
159
+ | `engine` / `scheduler` / `inprocess` / `eventbus` | job lifecycle, runner dispatch and events |
162
160
  | `browseragent` | caller-owned navigation, click, type and screenshot actions |
163
161
  | `mcpserver` / `mcptransport` | MCP tools over JSONL or HTTP |
164
162
  | `nodeserver` | Web Request/Response handler |
165
- | `engine` / `scheduler` | job lifecycle and runner dispatch |
166
163
  | `release-assets` | SHA256SUMS, SBOM and provenance metadata for caller-selected artifacts |
167
164
  | `releaseevidence` / `evaluateevidence` | serializable release-evidence creation and evaluation |
168
165
  | `releasereadiness` / `evidencefromverification` | readiness assessment from caller-supplied verification evidence |
@@ -173,14 +170,14 @@ The package export map is defined by the root manifest. Runnable public examples
173
170
 
174
171
  ## Browser extension
175
172
 
176
- The extension is a TypeScript-first Manifest V3 reference surface in [`extension/`](extension/). Its source is compiled into a stable JavaScript unpacked artifact and contains a popup, service worker, isolated content bridge, read-only page-world `pagefacts` boundary, snapshot diffs and persisted window/tab/frame context for explicit resume.
173
+ The extension surface migrated to the devthink app with the wave 2 regrouping: it is a TypeScript-first Manifest V3 reference surface (popup, service worker, isolated content bridge, read-only page-world `pagefacts` boundary, snapshot diffs and persisted window/tab/frame context for explicit resume) that runs in the user's browser, so it is not a VM modality of the engine — its module, tracked assets and tests now live at `devthink/browserextension.ts`, the devthink root `extension*` asset family and `devthink/tests/browserextension.test.ts` (see `docs/browser.md` for the migration map).
177
174
 
178
175
  ```bash
179
- # build an isolated JavaScript artifact using the version supplied by the caller or release tag
180
- npm run extension:build -- --output build/extension
176
+ # build an isolated JavaScript artifact from the devthink app root using the version supplied by the caller or release tag
177
+ cd ../devthink && node --import tsx ./browserextension.ts --output build/browserextension
181
178
 
182
- # load build/extension from chrome://extensions
183
- ls build/extension/manifest.json build/extension/worker.js build/extension/content.js build/extension/popup.html
179
+ # load build/browserextension from chrome://extensions
180
+ ls build/browserextension/manifest.json build/browserextension/worker.js build/browserextension/content.js build/browserextension/popup.html
184
181
  ```
185
182
 
186
183
  The base permission set is `activeTab`, `scripting` and `storage`. It does not request broad host permissions, cookies, `webRequest`, debugger access or arbitrary page code execution. Optional host escalation remains caller-owned. Releases attach `saddle.extension.<version>.zip`; cross-browser profiles remain adapter work.
@@ -191,14 +188,14 @@ The base permission set is `activeTab`, `scripting` and `storage`. It does not r
191
188
  | --- | --- |
192
189
  | Credentials | injected by the caller or repository secret; never committed or printed |
193
190
  | Network | HTTP/HTTPS targets are validated; private-target access remains caller policy |
194
- | Crawling | robots rules, crawl delay, limits and budgets are explicit |
191
+ | Edge lanes | every lane runs in a private temp dir under a hard deadline; the visitor law guard holds on every run |
195
192
  | Storage | adapters are replaceable; the core does not own a provider account |
196
193
  | Runtime | Node-only filesystem, HTTP, Playwright and release metadata stay outside the transport-neutral root |
197
194
  | Extension | page-world reads are bounded, token-correlated and read-only |
198
195
  | Failure | retry, circuit breaker, idempotency and resume are configurable |
199
196
  | Releases | version comes from the `vX.Y.Z` tag and must match `package.json` |
200
197
 
201
- Version 2.0.0 (the grand merge) absorbs the e2ugh virtual-hardware engine into the saddle engine: fifteen engine modules land at the repository root (virtualcpu, virtualmemory, virtualgpu, virtualization, orchestrator, scheduler, compute, media, render, security, performance, alternatives, tiers, quantum and the engine index core), the e2ugh static console and self-hosted API live at web, the hardware catalogs (processors, gpus, cores, boards) and the four virtual-hardware config envelopes (qemu, mttg, passage, docker) ship as package exports under specs/*, and the legacy WebScrape toolkit generation consolidates into webscrape.ts. The engine surface stays dependency-free at the root (node built-ins only). Version 1.8.19 previously while reorganizing implementation ownership into twenty correlated domains behind a transport-neutral root router. The migration groups foundation nouns, execution state, API protocols, MCP adapters, automation contracts, package delivery and mode profiles without adding a privileged effect. Existing package subpaths remain available through their updated compiled targets. The denied-by-default execution, policy, handoff and internal-API contracts remain plans or receipts until a separately approved caller adapter is supplied. The current container targets `linux/amd64`, `linux/arm64` and `linux/ppc64le`; release evidence, readiness and verification remain serializable and caller-owned.
198
+ Version 2.0.0 (the grand merge) absorbs the e2ugh virtual-hardware engine into the saddle engine: fifteen engine modules land at the repository root (virtualcpu, virtualmemory, virtualgpu, virtualization, orchestrator, scheduler, compute, media, render, security, performance, alternatives, tiers, quantum and the engine index core), the e2ugh static console and self-hosted API live at web, the hardware catalogs (processors, gpus, cores, boards) and the four virtual-hardware config envelopes (qemu, mttg, passage, docker) ship as package exports under specs/*. The engine surface stays dependency-free at the root (node built-ins only). Version 1.8.19 previously while reorganizing implementation ownership into twenty correlated domains behind a transport-neutral root router. The migration groups foundation nouns, execution state, API protocols, MCP adapters, automation contracts, package delivery and mode profiles without adding a privileged effect. Existing package subpaths remain available through their updated compiled targets. The denied-by-default execution, policy, handoff and internal-API contracts remain plans or receipts until a separately approved caller adapter is supplied. The current container targets the eleven-architecture family surface (`linux/amd64`, `linux/amd64/v2`, `linux/arm64`, `linux/arm/v7`, `linux/arm/v6`, `linux/ppc64le`, `linux/s390x`, `linux/riscv64`, `linux/386`, `linux/mips64le`, `linux/loong64`); release evidence, readiness and verification remain serializable and caller-owned.
202
199
 
203
200
  ## Package surfaces and release automation
204
201
 
@@ -221,7 +218,7 @@ Saddle is applying to the SignPath Foundation for open-source code signing. Unti
221
218
 
222
219
  The requested policy is: **Free code signing provided by SignPath.io, certificate by SignPath Foundation**. Committers and reviewers are maintainers with write access to the public repository. Approvers are repository owners or release approvers recorded in `governance.md`. Every signed release must be built from repository source, pass the security and packaging gates, and receive manual signing approval.
223
220
 
224
- The core program will not transfer information to other networked systems unless specifically requested by the user or the person installing or operating it. Browser sessions, storage adapters, runners and external services remain caller-configured and subject to their own policies. See [`privacy-policy.md`](privacy-policy.md) and [`SECURITY.md`](SECURITY.md).
221
+ The core program will not transfer information to other networked systems unless specifically requested by the user or the person installing or operating it. Browser sessions, storage adapters, runners and external services remain caller-configured and subject to their own policies. See [`privacypolicy.md`](privacypolicy.md) and [`SECURITY.md`](SECURITY.md).
225
222
 
226
223
  ## GitHub Pages web surface
227
224
 
@@ -232,7 +229,7 @@ npm run web:check
232
229
  VITE_BASE_PATH=/saddle npm run web:build:pages
233
230
  ```
234
231
 
235
- Small public configuration and visual assets live under `web/public/`. The development collector is TypeScript source at `web/debugcollector.ts`, injected only in development, and uses `/debuglogs`; it is not part of the production build. The obsolete `web/public/__manus__` directory is intentionally absent.
232
+ Small public configuration and visual assets live under `web/public/`. The obsolete `web/public/__manus__` directory is intentionally absent; the development debug collector (the visitor-browser telemetry hook at the former `web/debugcollector.ts`) left the saddle — the engine keeps no surface that watches the user's browser.
236
233
 
237
234
  ## Development
238
235
 
@@ -265,24 +262,28 @@ Remote execution, provider credentials, browser transport, persistence, proxy se
265
262
  ## Repository map
266
263
 
267
264
  ```text
268
- core/ errors, events, identifiers, hashing, jobs, artifacts, sessions and providers
269
- memory/ working-set bridge, modes, objects and transforms
270
- storage/ local, chunked, remote and file-hosting adapters
271
- scrape/ robots, cache, extraction, schema, normalization and grouped crawl contracts
272
- runtime/ engine orchestration, queues, idempotency, saga, resumable and session contexts
273
- browser/ fingerprint, session, agent and Playwright adapter contracts
274
- extension/ Manifest V3 reference surface and packager
275
- desktop/ Tauri browser application for Windows, Linux and macOS
276
- android/ Capacitor Android conversion target and optimized Gradle release
277
- ios/ Capacitor iOS conversion target and caller-owned Xcode signing
278
- capacitor.config.ts shared web-to-native configuration for Android and iOS
279
- api/ envelopes, authentication, controls, JSON/NDJSON/SSE and webhooks
280
- adapters/ forge, app, socket and MCP integration adapters
281
- automation/ workflow, bot, permission and surface automation contracts
282
- release/ checksums, SBOM and provenance metadata
283
- packager/ distribution, delivery, binary, container and multi-target artifact plans
284
- modes/ target mode selection, deployment plans and surface profiles
285
- web/ root-based static marketing site with TypeScript React source
265
+ index.ts the transport-neutral root barrel re-exporting every domain
266
+ foundation.ts errors, events, identifiers, hashing, jobs, artifacts and sessions
267
+ execution.ts the engine, the scheduler, the inprocess runner and the working-set contracts
268
+ virtual.ts memory bridge, modes, objects, transforms and the local adapters
269
+ isolation.ts execution request, decision, handoff and the internal api envelopes
270
+ modalityregistry.ts the ninety-record sandbox modality catalog, the join resolver and the census
271
+ edgelandes*.ts the edge lane tables: host jails and toolchains, inproc recipes, virtual compositions, the ninety merge seat
272
+ edgeplane.ts the merged lane dispatch plane and the visitor law guard
273
+ scriptlanes.ts sh plans, the house yaml subset and detached background runs
274
+ workloadlaw.ts the family workload seat: every app declares the lanes its workloads ride
275
+ sandbox*.ts the sandbox state, the declared sandbox profile and its environment adapter
276
+ virtualcpu.ts, virtualmemory.ts, virtualgpu.ts, virtualization.ts, orchestrator.ts,
277
+ scheduler.ts, compute.ts, media.ts, render.ts, quantum.ts, tiers.ts, security.ts,
278
+ performance.ts, alternatives.ts
279
+ the e2ugh virtual-hardware engine domains landed at the root by the grand merge
280
+ automation.ts, browser.ts, communication.ts, distribution.ts, integration.ts,
281
+ intelligence.ts, modes.ts
282
+ the saddle domain routing barrel files (bot, browser, delivery, integrations, profiles)
283
+ server.ts, webserver.ts, api.ts, cli.ts
284
+ the self-hosted api surfaces, the web console and the stable cli
285
+ Sol/ the Sol theme — the platform's web surface (one tsx app, one stylesheet per theme)
286
+ specs processors.json, gpus.json, cores.json, boards.json and the qemu/mttg/passage/docker/vm envelopes
286
287
  tests/ deterministic engine and extension coverage
287
288
  docs/ architecture, API, security, release and registry notes
288
289
  ```
@@ -291,7 +292,7 @@ The engine is TypeScript-first ESM with English JSDoc comments and a generated J
291
292
 
292
293
  ## Historical documentation
293
294
 
294
- The repository history contains 41 root README revisions and several surface-specific records. Their durable ideas are consolidated here: storage-backed execution, bounded working sets, replaceable runners, content extraction, browser actions, workflow delivery, multi-registry packaging, explicit recovery contracts and caller-owned integrations. Historical references that describe superseded identities, obsolete Node baselines, speculative provider quotas, unavailable hosted services or removed layouts remain historical evidence rather than current promises.
295
+ The repository history contains 41 root README revisions and several surface-specific records. Their durable ideas are consolidated here: storage-backed execution, bounded working sets, replaceable runners, browser actions, workflow delivery, multi-registry packaging, explicit recovery contracts and caller-owned integrations. Historical references that describe superseded identities, obsolete Node baselines, speculative provider quotas, unavailable hosted services or removed layouts remain historical evidence rather than current promises.
295
296
 
296
297
  ## Current scope
297
298
 
@@ -300,3 +301,17 @@ Version 1.8.19 organizes the existing engine into twenty documented, dependency-
300
301
  ## License
301
302
 
302
303
  Saddle is distributed under the [GNU General Public License v3.0 only](LICENSE).
304
+
305
+ ---
306
+
307
+ # The Sol theme
308
+
309
+ # Saddle Sol
310
+
311
+ Saddle is the 90-modality sandbox platform of the DevThink family: one engine spanning compute, virtualization, media, mesh, automation and the other modalities, exposed as a self-hosted site. This Sol theme is the platform's web surface — a Vite + React SPA (console, dashboard, playground, integrations) served from the same sqlite database that `schema.prisma`, `init.sql` and `drizzle.config.ts` describe.
312
+
313
+ ```bash
314
+ pnpm install
315
+ pnpm dev
316
+ ```
317
+
package/alternatives.ts CHANGED
File without changes
package/biome.jsonc ADDED
@@ -0,0 +1,134 @@
1
+ // the family biome baseline: identical across the apps, the identity only names the app.
2
+ {
3
+ "$schema": "https://biomejs.dev/schemas/2.6.4/schema.json",
4
+ "vcs": {
5
+ "enabled": true,
6
+ "clientKind": "git",
7
+ "useIgnoreFile": false
8
+ },
9
+ "files": {
10
+ "includes": [
11
+ "**/*.ts",
12
+ "**/*.tsx",
13
+ "**/*.js",
14
+ "**/*.mjs",
15
+ "**/*.cjs",
16
+ "**/*.json",
17
+ "!**/dist",
18
+ "!**/distpackage",
19
+ "!**/target",
20
+ "!**/node_modules",
21
+ "!**/bun.lock",
22
+ "!**/*.min.js",
23
+ "!**/docs",
24
+ "!**/tests/tmp",
25
+ "!**/tests/code",
26
+ "!**/Sol/dist",
27
+ "!**/Sol/.vite",
28
+ "!**/Sol/node_modules",
29
+ "!**/coverage",
30
+ "!**/android",
31
+ "!**/releasecheck",
32
+ "!**/build",
33
+ "!**/release",
34
+ "!index-*.js"
35
+ ]
36
+ },
37
+ "formatter": {
38
+ "enabled": true,
39
+ "indentStyle": "space",
40
+ "indentWidth": 2,
41
+ "lineWidth": 120,
42
+ "lineEnding": "lf"
43
+ },
44
+ "linter": {
45
+ "enabled": true,
46
+ "rules": {
47
+ "preset": "recommended",
48
+ "correctness": {
49
+ "noUnusedVariables": "warn",
50
+ "noUnsafeOptionalChaining": "warn",
51
+ "useExhaustiveDependencies": "warn",
52
+ "noUnusedImports": "warn",
53
+ "noUnusedPrivateClassMembers": "warn",
54
+ "noUnusedFunctionParameters": "warn",
55
+ "noConstantCondition": "warn",
56
+ "noVoidTypeReturn": "warn"
57
+ },
58
+ "a11y": {
59
+ "useButtonType": "warn",
60
+ "noStaticElementInteractions": "warn",
61
+ "useSemanticElements": "warn",
62
+ "useAriaPropsSupportedByRole": "warn"
63
+ },
64
+ "suspicious": {
65
+ "noExplicitAny": "warn",
66
+ "noArrayIndexKey": "warn",
67
+ "noControlCharactersInRegex": "warn",
68
+ "noRedeclare": "warn",
69
+ "noAssignInExpressions": "warn",
70
+ "noShadowRestrictedNames": "warn",
71
+ "noDuplicateElseIf": "warn",
72
+ "noImplicitAnyLet": "warn",
73
+ "noTsIgnore": "warn",
74
+ "noGlobalIsNan": "warn"
75
+ },
76
+ "style": {
77
+ "noNonNullAssertion": "warn",
78
+ "useTemplate": "warn",
79
+ "useExponentiationOperator": "warn",
80
+ "useConst": "warn"
81
+ },
82
+ "complexity": {
83
+ "useLiteralKeys": "warn",
84
+ "useOptionalChain": "warn",
85
+ "noUselessContinue": "warn",
86
+ "noUselessUndefinedInitialization": "warn",
87
+ "noUselessEscapeInRegex": "warn"
88
+ }
89
+ }
90
+ },
91
+ "javascript": {
92
+ "formatter": {
93
+ "quoteStyle": "double",
94
+ "semicolons": "always",
95
+ "trailingCommas": "all",
96
+ "arrowParentheses": "always"
97
+ }
98
+ },
99
+ "css": {
100
+ "parser": {
101
+ "tailwindDirectives": true
102
+ }
103
+ },
104
+ "overrides": [
105
+ {
106
+ "includes": ["**/*"],
107
+ "linter": {
108
+ "rules": {
109
+ "suspicious": {
110
+ "noDebugger": "off"
111
+ }
112
+ }
113
+ }
114
+ },
115
+ {
116
+ "includes": ["tests/workflowcheck.ts", "tests/publishlanes.test.ts"],
117
+ "linter": {
118
+ "rules": {
119
+ "suspicious": {
120
+ "noTemplateCurlyInString": "off"
121
+ }
122
+ }
123
+ }
124
+ }
125
+ ],
126
+ "assist": {
127
+ "enabled": true,
128
+ "actions": {
129
+ "source": {
130
+ "useSortedKeys": "off"
131
+ }
132
+ }
133
+ }
134
+ }
package/boards.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "date": "2026-08-22",
8
8
  "dateFirstDoctrine": "The observer validates all specifications against the latest stable releases available on 2026-08-22.",
9
9
  "toolchain": {
10
- "node": "26.7.0 Current",
10
+ "node": "26.12.0 Current",
11
11
  "nodeAlt": "24.19.0 LTS",
12
12
  "typescript": "7.0.2",
13
13
  "python": "3.14.7",
@@ -88,7 +88,7 @@
88
88
  }
89
89
  },
90
90
  "name": "boards.json",
91
- "version": "2.1.6",
91
+ "version": "2.0.127",
92
92
  "title": "saddle - Virtual Motherboard Database (retail boards + platform reference sockets)",
93
93
  "sources": [
94
94
  "pool:boards.json [S6, 20 retail boards]",