@wenathlan/saddle 2.0.154 → 2.0.159

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 (314) hide show
  1. package/Dockerfile +167 -1334
  2. package/README.md +59 -60
  3. package/biome.jsonc +3 -3
  4. package/browser.ts +482 -0
  5. package/cli.ts +274 -0
  6. package/distribution.ts +731 -0
  7. package/docker.config +29 -8
  8. package/docs/{architecture.1.8.19.mmd → architecture1819.md} +6 -0
  9. package/docs/artifactavailability.md +2 -2
  10. package/docs/browser.md +18 -1
  11. package/docs/{containerplatforms.2.1.0.md → containerplatforms210.md} +1 -1
  12. package/docs/{documentmap.1.8.12.md → documentmap1812.md} +1 -1
  13. package/docs/extension.md +13 -2
  14. package/docs/features.md +5 -0
  15. package/docs/libraryapi.md +1 -1
  16. package/docs/{ninety.modalities.md → ninetymodalities.md} +87 -4
  17. package/docs/{planning.ninety.md → planningninety.md} +6 -6
  18. package/docs/{releasenotes.1.8.13.md → releasenotes1813.md} +2 -2
  19. package/docs/{releasenotes.1.8.14.md → releasenotes1814.md} +1 -1
  20. package/docs/{repo.synthesis.1.8.16.md → reposynthesis1816.md} +1 -1
  21. package/docs/todo.md +2 -2
  22. package/docs/{todo.1.8.15.md → todo1815.md} +1 -1
  23. package/docs/{todo.1.8.16.md → todo1816.md} +5 -5
  24. package/execution.ts +677 -0
  25. package/foundation.ts +314 -0
  26. package/index.ts +36 -34
  27. package/isolation.ts +84 -0
  28. package/modalityregistry.ts +189 -145
  29. package/modes.ts +170 -0
  30. package/mttg.config +1 -1
  31. package/orchestrator.ts +49 -15
  32. package/package.json +105 -89
  33. package/qemu.config +2 -2
  34. package/sandbox.ts +3279 -0
  35. package/scheduler.ts +1 -1
  36. package/server.ts +52 -0
  37. package/tsconfig.json +12 -13
  38. package/virtual.ts +7528 -0
  39. package/workloadlaw.ts +293 -0
  40. package/dist/App.d.ts +0 -5
  41. package/dist/App.js +0 -52
  42. package/dist/Sol/Sol.d.ts +0 -3
  43. package/dist/Sol/Sol.js +0 -46
  44. package/dist/Sol/agentbrowser/agentbrowser.d.ts +0 -9
  45. package/dist/Sol/agentbrowser/agentbrowser.js +0 -121
  46. package/dist/Sol/architecture/architecture.d.ts +0 -9
  47. package/dist/Sol/architecture/architecture.js +0 -93
  48. package/dist/Sol/compute/compute.d.ts +0 -9
  49. package/dist/Sol/compute/compute.js +0 -22
  50. package/dist/Sol/console/console.d.ts +0 -15
  51. package/dist/Sol/console/console.js +0 -292
  52. package/dist/Sol/dashboard/dashboard.d.ts +0 -10
  53. package/dist/Sol/dashboard/dashboard.js +0 -181
  54. package/dist/Sol/docs/docs.d.ts +0 -9
  55. package/dist/Sol/docs/docs.js +0 -28
  56. package/dist/Sol/home/home.d.ts +0 -35
  57. package/dist/Sol/home/home.js +0 -239
  58. package/dist/Sol/integrations/integrations.d.ts +0 -9
  59. package/dist/Sol/integrations/integrations.js +0 -83
  60. package/dist/Sol/intro/intro.d.ts +0 -7
  61. package/dist/Sol/intro/intro.js +0 -102
  62. package/dist/Sol/login/login.d.ts +0 -16
  63. package/dist/Sol/login/login.js +0 -49
  64. package/dist/Sol/notfound/notfound.d.ts +0 -9
  65. package/dist/Sol/notfound/notfound.js +0 -15
  66. package/dist/Sol/onboarding/onboarding.d.ts +0 -25
  67. package/dist/Sol/onboarding/onboarding.js +0 -60
  68. package/dist/Sol/playground/playground.d.ts +0 -9
  69. package/dist/Sol/playground/playground.js +0 -127
  70. package/dist/Sol/register/register.d.ts +0 -16
  71. package/dist/Sol/register/register.js +0 -193
  72. package/dist/Sol/shell/Shell.d.ts +0 -124
  73. package/dist/Sol/shell/Shell.js +0 -335
  74. package/dist/Sol/wingets/ComputeBootladder.d.ts +0 -6
  75. package/dist/Sol/wingets/ComputeBootladder.js +0 -71
  76. package/dist/Sol/wingets/ComputeModalitycatalog.d.ts +0 -7
  77. package/dist/Sol/wingets/ComputeModalitycatalog.js +0 -71
  78. package/dist/Sol/wingets/ConsoleApibadge.d.ts +0 -7
  79. package/dist/Sol/wingets/ConsoleApibadge.js +0 -5
  80. package/dist/Sol/wingets/ConsoleEdgelaw.d.ts +0 -6
  81. package/dist/Sol/wingets/ConsoleEdgelaw.js +0 -36
  82. package/dist/Sol/wingets/ConsoleEventstimeline.d.ts +0 -19
  83. package/dist/Sol/wingets/ConsoleEventstimeline.js +0 -12
  84. package/dist/Sol/wingets/ConsoleSnapshotcontrols.d.ts +0 -8
  85. package/dist/Sol/wingets/ConsoleSnapshotcontrols.js +0 -8
  86. package/dist/Sol/wingets/ConsoleSpecpanel.d.ts +0 -21
  87. package/dist/Sol/wingets/ConsoleSpecpanel.js +0 -75
  88. package/dist/Sol/wingets/ConsoleTerminal.d.ts +0 -22
  89. package/dist/Sol/wingets/ConsoleTerminal.js +0 -77
  90. package/dist/Sol/wingets/DashboardAccountpanel.d.ts +0 -18
  91. package/dist/Sol/wingets/DashboardAccountpanel.js +0 -65
  92. package/dist/Sol/wingets/DashboardAdminpanel.d.ts +0 -6
  93. package/dist/Sol/wingets/DashboardAdminpanel.js +0 -90
  94. package/dist/Sol/wingets/DashboardAuditlog.d.ts +0 -8
  95. package/dist/Sol/wingets/DashboardAuditlog.js +0 -50
  96. package/dist/Sol/wingets/DashboardCreatesandboxform.d.ts +0 -10
  97. package/dist/Sol/wingets/DashboardCreatesandboxform.js +0 -71
  98. package/dist/Sol/wingets/DashboardEventstimeline.d.ts +0 -8
  99. package/dist/Sol/wingets/DashboardEventstimeline.js +0 -83
  100. package/dist/Sol/wingets/DashboardGlobalsandboxestable.d.ts +0 -8
  101. package/dist/Sol/wingets/DashboardGlobalsandboxestable.js +0 -57
  102. package/dist/Sol/wingets/DashboardMeshnodestable.d.ts +0 -8
  103. package/dist/Sol/wingets/DashboardMeshnodestable.js +0 -103
  104. package/dist/Sol/wingets/DashboardSandboxlist.d.ts +0 -10
  105. package/dist/Sol/wingets/DashboardSandboxlist.js +0 -163
  106. package/dist/Sol/wingets/DashboardUserstable.d.ts +0 -8
  107. package/dist/Sol/wingets/DashboardUserstable.js +0 -78
  108. package/dist/Sol/wingets/HomeEntrygate.d.ts +0 -23
  109. package/dist/Sol/wingets/HomeEntrygate.js +0 -73
  110. package/dist/Sol/wingets/HomeMetricstrip.d.ts +0 -9
  111. package/dist/Sol/wingets/HomeMetricstrip.js +0 -4
  112. package/dist/Sol/wingets/HomeRuntimediagram.d.ts +0 -1
  113. package/dist/Sol/wingets/HomeRuntimediagram.js +0 -22
  114. package/dist/Sol/wingets/LoginForm.d.ts +0 -19
  115. package/dist/Sol/wingets/LoginForm.js +0 -141
  116. package/dist/Sol/wingets/RegisterPasswordconfirm.d.ts +0 -13
  117. package/dist/Sol/wingets/RegisterPasswordconfirm.js +0 -16
  118. package/dist/Sol/wingets/RegisterPasswordmeter.d.ts +0 -19
  119. package/dist/Sol/wingets/RegisterPasswordmeter.js +0 -65
  120. package/dist/Sol/wingets/RegisterUsernamerules.d.ts +0 -11
  121. package/dist/Sol/wingets/RegisterUsernamerules.js +0 -16
  122. package/dist/Sol/wingets/index.d.ts +0 -39
  123. package/dist/Sol/wingets/index.js +0 -39
  124. package/dist/alternatives.d.ts +0 -508
  125. package/dist/alternatives.js +0 -950
  126. package/dist/api.d.ts +0 -154
  127. package/dist/api.js +0 -174
  128. package/dist/auth.d.ts +0 -268
  129. package/dist/auth.js +0 -476
  130. package/dist/automation.d.ts +0 -425
  131. package/dist/automation.js +0 -566
  132. package/dist/browser.d.ts +0 -561
  133. package/dist/browser.js +0 -1058
  134. package/dist/capacitor.config.d.ts +0 -45
  135. package/dist/capacitor.config.js +0 -48
  136. package/dist/catalog.d.ts +0 -43
  137. package/dist/catalog.js +0 -44
  138. package/dist/cli.d.ts +0 -16
  139. package/dist/cli.js +0 -168
  140. package/dist/communication.d.ts +0 -181
  141. package/dist/communication.js +0 -376
  142. package/dist/compute.d.ts +0 -1160
  143. package/dist/compute.js +0 -2272
  144. package/dist/dashboardlib.d.ts +0 -58
  145. package/dist/dashboardlib.js +0 -161
  146. package/dist/db.d.ts +0 -569
  147. package/dist/db.js +0 -1080
  148. package/dist/distribution.d.ts +0 -528
  149. package/dist/distribution.js +0 -810
  150. package/dist/drizzle.config.d.ts +0 -20
  151. package/dist/drizzle.config.js +0 -18
  152. package/dist/edgelandes.d.ts +0 -70
  153. package/dist/edgelandes.host.d.ts +0 -26
  154. package/dist/edgelandes.host.js +0 -1089
  155. package/dist/edgelandes.inproc.d.ts +0 -27
  156. package/dist/edgelandes.inproc.js +0 -952
  157. package/dist/edgelandes.js +0 -1133
  158. package/dist/edgelandes.ninety.d.ts +0 -31
  159. package/dist/edgelandes.ninety.js +0 -174
  160. package/dist/edgelandes.virtual.d.ts +0 -25
  161. package/dist/edgelandes.virtual.js +0 -629
  162. package/dist/edgeplane.d.ts +0 -121
  163. package/dist/edgeplane.js +0 -341
  164. package/dist/examplelocaljob.d.ts +0 -1
  165. package/dist/examplelocaljob.js +0 -14
  166. package/dist/execution.d.ts +0 -529
  167. package/dist/execution.js +0 -760
  168. package/dist/family.d.ts +0 -16
  169. package/dist/family.js +0 -42
  170. package/dist/familyurl.d.ts +0 -21
  171. package/dist/familyurl.js +0 -24
  172. package/dist/format.d.ts +0 -18
  173. package/dist/format.js +0 -59
  174. package/dist/foundation.d.ts +0 -172
  175. package/dist/foundation.js +0 -312
  176. package/dist/index.d.ts +0 -735
  177. package/dist/index.js +0 -1020
  178. package/dist/integration.d.ts +0 -235
  179. package/dist/integration.js +0 -228
  180. package/dist/intelligence.d.ts +0 -93
  181. package/dist/intelligence.js +0 -144
  182. package/dist/isolation.d.ts +0 -128
  183. package/dist/isolation.js +0 -95
  184. package/dist/labels.d.ts +0 -665
  185. package/dist/labels.js +0 -707
  186. package/dist/localauth.d.ts +0 -127
  187. package/dist/localauth.js +0 -413
  188. package/dist/media.d.ts +0 -343
  189. package/dist/media.js +0 -985
  190. package/dist/mesh.d.ts +0 -177
  191. package/dist/mesh.js +0 -468
  192. package/dist/modalityregistry.d.ts +0 -109
  193. package/dist/modalityregistry.js +0 -1386
  194. package/dist/modes.d.ts +0 -358
  195. package/dist/modes.js +0 -133
  196. package/dist/onboardingstate.d.ts +0 -79
  197. package/dist/onboardingstate.js +0 -282
  198. package/dist/orchestrator.d.ts +0 -1338
  199. package/dist/orchestrator.js +0 -4310
  200. package/dist/packager/targetcli.js +0 -4
  201. package/dist/paths.d.ts +0 -2
  202. package/dist/paths.js +0 -14
  203. package/dist/performance.d.ts +0 -415
  204. package/dist/performance.js +0 -826
  205. package/dist/quantum.d.ts +0 -809
  206. package/dist/quantum.js +0 -2072
  207. package/dist/render.d.ts +0 -380
  208. package/dist/render.js +0 -1072
  209. package/dist/runall.d.ts +0 -2
  210. package/dist/runall.js +0 -39
  211. package/dist/runtimeprobe.d.ts +0 -4
  212. package/dist/runtimeprobe.js +0 -8
  213. package/dist/sandbox.d.ts +0 -355
  214. package/dist/sandbox.js +0 -1721
  215. package/dist/sandboxenvprofile.d.ts +0 -29
  216. package/dist/sandboxenvprofile.js +0 -89
  217. package/dist/sandboxprofile.d.ts +0 -137
  218. package/dist/sandboxprofile.js +0 -241
  219. package/dist/sandboxqueue.d.ts +0 -108
  220. package/dist/sandboxqueue.js +0 -201
  221. package/dist/sandboxquota.d.ts +0 -121
  222. package/dist/sandboxquota.js +0 -236
  223. package/dist/scheduler.d.ts +0 -595
  224. package/dist/scheduler.js +0 -1258
  225. package/dist/scriptlanes.d.ts +0 -182
  226. package/dist/scriptlanes.js +0 -660
  227. package/dist/scripts.buildengine.d.ts +0 -1
  228. package/dist/scripts.buildengine.js +0 -39
  229. package/dist/scripts.securitygate.d.ts +0 -1
  230. package/dist/scripts.securitygate.js +0 -68
  231. package/dist/scripts.validateflatnative.d.ts +0 -1
  232. package/dist/scripts.validateflatnative.js +0 -72
  233. package/dist/security.d.ts +0 -500
  234. package/dist/security.js +0 -1169
  235. package/dist/seedcatalog.d.ts +0 -13
  236. package/dist/seedcatalog.js +0 -46
  237. package/dist/server.d.ts +0 -20
  238. package/dist/server.js +0 -53
  239. package/dist/speccatalog.d.ts +0 -31
  240. package/dist/speccatalog.js +0 -163
  241. package/dist/tiers.d.ts +0 -1001
  242. package/dist/tiers.js +0 -2169
  243. package/dist/utils.d.ts +0 -2
  244. package/dist/utils.js +0 -5
  245. package/dist/vaulthandoff.d.ts +0 -141
  246. package/dist/vaulthandoff.js +0 -444
  247. package/dist/virtual.d.ts +0 -640
  248. package/dist/virtual.js +0 -1284
  249. package/dist/virtualcpu.d.ts +0 -315
  250. package/dist/virtualcpu.js +0 -1180
  251. package/dist/virtualgpu.d.ts +0 -344
  252. package/dist/virtualgpu.js +0 -1000
  253. package/dist/virtualization.d.ts +0 -606
  254. package/dist/virtualization.js +0 -1186
  255. package/dist/virtualmemory.d.ts +0 -817
  256. package/dist/virtualmemory.js +0 -1795
  257. package/dist/vite.config.d.ts +0 -3
  258. package/dist/vite.config.js +0 -48
  259. package/dist/vitest.config.d.ts +0 -2
  260. package/dist/vitest.config.js +0 -25
  261. package/dist/webserver.d.ts +0 -166
  262. package/dist/webserver.js +0 -2226
  263. package/dist/workloadlaw.d.ts +0 -133
  264. package/dist/workloadlaw.js +0 -193
  265. package/docs/.gitkeep +0 -0
  266. package/docs/architecture.1.8.19.md +0 -76
  267. package/docs/logs/examplesession.json +0 -54
  268. package/docs/repo.analysis.1.8.21.json +0 -2617
  269. package/docs/repo.candidates.1.8.21.jsonl +0 -666
  270. package/docs/repo.selected.1.8.21.json +0 -786
  271. package/manifest.json +0 -20
  272. package/media.ts +0 -1337
  273. package/virtualcpu.ts +0 -1274
  274. package/virtualgpu.ts +0 -1182
  275. package/virtualization.ts +0 -1628
  276. package/virtualmemory.ts +0 -2303
  277. /package/docs/{artifactresearch.1.8.9.md → artifactresearch189.md} +0 -0
  278. /package/docs/{batches.1816.to.1820.md → batches1816to1820.md} +0 -0
  279. /package/docs/{brancharchive.2026.08.18.md → brancharchive20260818.md} +0 -0
  280. /package/docs/{containerplatforms.1.8.17.md → containerplatforms1817.md} +0 -0
  281. /package/docs/{e2ugh.engine.md → e2ughengine.md} +0 -0
  282. /package/docs/{flatbuildresearch.1.8.11.md → flatbuildresearch1811.md} +0 -0
  283. /package/docs/{licenseaudit.1.8.12.md → licenseaudit1812.md} +0 -0
  284. /package/docs/{mobileconversionresearch.1.8.10.md → mobileconversionresearch1810.md} +0 -0
  285. /package/docs/{nativeidentityresearch.1.8.11.md → nativeidentityresearch1811.md} +0 -0
  286. /package/docs/{native.wrappers.md → nativewrappers.md} +0 -0
  287. /package/docs/{planning.1.8.18.md → planning1818.md} +0 -0
  288. /package/docs/{planning.1.8.19.md → planning1819.md} +0 -0
  289. /package/docs/{planning.engine.md → planningengine.md} +0 -0
  290. /package/docs/{releasenotes.1.8.12.md → releasenotes1812.md} +0 -0
  291. /package/docs/{releasenotes.1.8.15.md → releasenotes1815.md} +0 -0
  292. /package/docs/{releasenotes.1.8.16.md → releasenotes1816.md} +0 -0
  293. /package/docs/{releasenotes.1.8.17.md → releasenotes1817.md} +0 -0
  294. /package/docs/{releasenotes.1.8.18.md → releasenotes1818.md} +0 -0
  295. /package/docs/{releasenotes.1.8.19.md → releasenotes1819.md} +0 -0
  296. /package/docs/{reorganization.1.8.8.md → reorganization188.md} +0 -0
  297. /package/docs/{reorganization.1.8.9.md → reorganization189.md} +0 -0
  298. /package/docs/{repo.research.1.8.16.md → reporesearch1816.md} +0 -0
  299. /package/docs/{repo.research.1.8.21.md → reporesearch1821.md} +0 -0
  300. /package/docs/{repo.synthesis.1.8.21.md → reposynthesis1821.md} +0 -0
  301. /package/docs/{research.1.8.18.isolation.md → research1818isolation.md} +0 -0
  302. /package/docs/{research.1.8.19.virtual.browser.md → research1819virtualbrowser.md} +0 -0
  303. /package/docs/{scanningresearch.1.8.11.md → scanningresearch1811.md} +0 -0
  304. /package/docs/{securityaudit.1.8.7.md → securityaudit187.md} +0 -0
  305. /package/docs/{securityreferences.1.8.11.md → securityreferences1811.md} +0 -0
  306. /package/docs/{securityresearch.1.8.11.md → securityresearch1811.md} +0 -0
  307. /package/docs/{signingresearch.1.8.12.md → signingresearch1812.md} +0 -0
  308. /package/docs/{tauri.glib.risk.1.8.11.md → tauriglibrisk1811.md} +0 -0
  309. /package/docs/{todo.1.8.18.md → todo1818.md} +0 -0
  310. /package/docs/{todo.1.8.19.md → todo1819.md} +0 -0
  311. /package/docs/{toolchainresearch.1.8.9.md → toolchainresearch189.md} +0 -0
  312. /package/docs/{web.duplicatecleanup.md → webduplicatecleanup.md} +0 -0
  313. /package/docs/{web.ideas.md → webideas.md} +0 -0
  314. /package/docs/{workflowimprovements.2026.08.19.md → workflowimprovements20260819.md} +0 -0
@@ -1,13 +0,0 @@
1
- /** Style: Saddle catalog seeds — the reviewed offline answer of the catalog
2
- * until the database endpoint is paired. The rows describe the prepared media
3
- * areas the pages render: no image file ships in the repository, the picture
4
- * content arrives from the database over HTTPS. The agent session seed
5
- * mirrors the documented example log of docs/logs/examplesession.json
6
- * verbatim, so the agent browser page renders the repository's own example
7
- * instead of inventing one. */
8
- import type { AgentSession, MediaSlot } from "./catalog";
9
- export declare const seedMediaSlots: MediaSlot[];
10
- /** the reviewed agent session seed: the documented example session of
11
- * docs/logs/examplesession.json (id, browser, seed, events and the captcha
12
- * verdict), mirrored verbatim — the offline answer of the sessions catalog. */
13
- export declare const seedAgentSessions: AgentSession[];
@@ -1,46 +0,0 @@
1
- export const seedMediaSlots = [
2
- {
3
- id: "media.home.hero",
4
- label: "memory bridge",
5
- ratio: "16 / 10",
6
- caption: "Abstract bridge of storage tiles and remote compute nodes.",
7
- },
8
- {
9
- id: "media.runtime.map",
10
- label: "remote runtime map",
11
- ratio: "4 / 3",
12
- caption: "Illustrated map of repositories connected to remote runners.",
13
- },
14
- {
15
- id: "media.agentbrowser.trace",
16
- label: "browser trace",
17
- ratio: "3 / 2",
18
- caption: "Cursor trace and evidence from a browser session.",
19
- },
20
- ];
21
- /** the reviewed agent session seed: the documented example session of
22
- * docs/logs/examplesession.json (id, browser, seed, events and the captcha
23
- * verdict), mirrored verbatim — the offline answer of the sessions catalog. */
24
- export const seedAgentSessions = [
25
- {
26
- version: 1,
27
- session: {
28
- id: "examplesession-0001",
29
- browser: "brave",
30
- seed: "examplesession-seed-0001",
31
- },
32
- events: [
33
- { t: 140, type: "move", x: 120, y: 90 },
34
- { t: 300, type: "move", x: 180, y: 140 },
35
- { t: 480, type: "click", x: 180, y: 140 },
36
- { t: 680, type: "type", key: "k" },
37
- { t: 900, type: "move", x: 240, y: 200 },
38
- { t: 1140, type: "click", x: 240, y: 200 },
39
- { t: 1400, type: "scroll", dy: 320 },
40
- ],
41
- captcha: {
42
- kind: "hcaptcha",
43
- passed: true,
44
- },
45
- },
46
- ];
package/dist/server.d.ts DELETED
@@ -1,20 +0,0 @@
1
- /**
2
- * server.ts — the Node HTTP server surface.
3
- *
4
- * This file is the v2.0.0 grand-merge consolidation of the former nested
5
- * folders of the repository (server) into the single
6
- * root-level domain file of the saddle family standard: one optimized
7
- * TypeScript file per correlated domain, ordinal sections, JSDoc on every
8
- * block, intra-domain imports dissolved, cross-domain imports rewritten to
9
- * ./<domain>.js. Every capability of every source file is preserved here;
10
- * the pure re-export barrels (none in this domain) folded their surface into this file directly.
11
- */
12
- /**
13
- * node server is an optional adapter around the universal service contract.
14
- */
15
- /** Creates a Node HTTP adapter with explicit host, port, and request handler. */
16
- export declare function nodeserver(options?: {}): {
17
- server: import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>;
18
- listen(): Promise<unknown>;
19
- close(): Promise<unknown>;
20
- };
package/dist/server.js DELETED
@@ -1,53 +0,0 @@
1
- /**
2
- * server.ts — the Node HTTP server surface.
3
- *
4
- * This file is the v2.0.0 grand-merge consolidation of the former nested
5
- * folders of the repository (server) into the single
6
- * root-level domain file of the saddle family standard: one optimized
7
- * TypeScript file per correlated domain, ordinal sections, JSDoc on every
8
- * block, intra-domain imports dissolved, cross-domain imports rewritten to
9
- * ./<domain>.js. Every capability of every source file is preserved here;
10
- * the pure re-export barrels (none in this domain) folded their surface into this file directly.
11
- */
12
- import { createServer } from "node:http";
13
- /* ════════════════════════════════════════════════════════════════════ */
14
- /* Section 1: server/node.ts — node server is an optional adapter around the universal service contract. */
15
- /* ════════════════════════════════════════════════════════════════════ */
16
- /**
17
- * node server is an optional adapter around the universal service contract.
18
- */
19
- /** Creates a Node HTTP adapter with explicit host, port, and request handler. */
20
- export function nodeserver(options = {}) {
21
- if (!options.host || !Number.isInteger(options.port) || options.port < 1)
22
- throw new TypeError("node server requires host and port");
23
- if (typeof options.handle !== "function")
24
- throw new TypeError("node server requires handle");
25
- /* Request translation stays inside the Node adapter. */
26
- const server = createServer(async (request, response) => {
27
- try {
28
- const chunks = [];
29
- for await (const chunk of request)
30
- chunks.push(chunk);
31
- const body = Buffer.concat(chunks).toString("utf8");
32
- const headers = new Headers(request.headers);
33
- const webrequest = new Request(new URL(request.url ?? "/", `http://${options.host}:${options.port}`), { method: request.method, headers, body: body || undefined });
34
- const result = await options.handle(webrequest);
35
- response.statusCode = result.status;
36
- result.headers.forEach((value, key) => {
37
- response.setHeader(key, value);
38
- });
39
- response.end(Buffer.from(await result.arrayBuffer()));
40
- }
41
- catch (error) {
42
- response.statusCode = 500;
43
- response.setHeader("content-type", "application/json");
44
- response.end(JSON.stringify({ error: error.message }));
45
- }
46
- });
47
- /* Lifecycle methods keep the server optional for library consumers. */
48
- return {
49
- server,
50
- listen() { return new Promise((resolve, reject) => { server.once("error", reject); server.listen(options.port, options.host, () => resolve({ host: options.host, port: options.port })); }); },
51
- close() { return new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve())); }
52
- };
53
- }
@@ -1,31 +0,0 @@
1
- /** one normalized catalog row: the payload cell keeps the full source
2
- * row as json text so no field of the datasets is lost. */
3
- export type SpecRow = {
4
- id: string;
5
- name: string;
6
- payload: string;
7
- };
8
- /**
9
- * lists the boards dataset.
10
- *
11
- * @returns the board rows.
12
- */
13
- export declare function listboards(): SpecRow[];
14
- /**
15
- * lists the cores dataset.
16
- *
17
- * @returns the core rows.
18
- */
19
- export declare function listcores(): SpecRow[];
20
- /**
21
- * lists the gpus dataset.
22
- *
23
- * @returns the gpu rows.
24
- */
25
- export declare function listgpus(): SpecRow[];
26
- /**
27
- * lists the processors dataset.
28
- *
29
- * @returns the processor rows.
30
- */
31
- export declare function listprocessors(): SpecRow[];
@@ -1,163 +0,0 @@
1
- /**
2
- * speccatalog.ts — the spec catalog layer of the saddle database (root
3
- * layer, library-grade: no consumer data hardcoded here).
4
- *
5
- * mirrors the repository datasets (boards.json, cores.json, gpus.json,
6
- * processors.json) into the site DB on first run and serves typed list
7
- * accessors over prepared statements. every statement is parameterized —
8
- * sql is never assembled by string concatenation. the database file is
9
- * the same one db.ts boots (SADDLE_DB environment, never a hardcoded
10
- * location), so the engine, the self-hosted api and the theme answer
11
- * from one source of truth. the json files stay the seed source of
12
- * record; nothing inside the engine modules duplicates them.
13
- */
14
- import { createHash } from 'node:crypto';
15
- import { readFileSync } from 'node:fs';
16
- import { join, dirname } from 'node:path';
17
- import { fileURLToPath } from 'node:url';
18
- import { DatabaseSync } from 'node:sqlite';
19
- import { dbpath } from './db.ts';
20
- /** the directory holding this module: the repository root with the
21
- * datasets beside the engine sources. */
22
- const moduledir = dirname(fileURLToPath(import.meta.url));
23
- /** the datasets the catalog mirrors, with the array key of each file. */
24
- const datasets = [
25
- { dataset: 'boards', file: 'boards.json', key: 'boards' },
26
- { dataset: 'cores', file: 'cores.json', key: 'models' },
27
- { dataset: 'gpus', file: 'gpus.json', key: 'gpus' },
28
- { dataset: 'processors', file: 'processors.json', key: 'processors' },
29
- ];
30
- /** the catalog schema: static strings only, safe on every boot. */
31
- const ddl = `
32
- create table if not exists specboards (
33
- id text primary key,
34
- name text not null,
35
- payload text not null
36
- );
37
- create table if not exists speccores (
38
- id text primary key,
39
- name text not null,
40
- payload text not null
41
- );
42
- create table if not exists specgpus (
43
- id text primary key,
44
- name text not null,
45
- payload text not null
46
- );
47
- create table if not exists specprocessors (
48
- id text primary key,
49
- name text not null,
50
- payload text not null
51
- );
52
- `;
53
- /** the statements, all prepared once (bound parameters only). */
54
- const statements = {};
55
- /** the catalog connection: the same file the engine db.ts boots. */
56
- let database = null;
57
- /** true once the mirror pass has run for this process. */
58
- let mirrored = false;
59
- /**
60
- * derives the stable row id: sha-256 of the exact source row, so the
61
- * mirror stays idempotent across runs (insert or replace).
62
- *
63
- * @param dataset the dataset namespace.
64
- * @param row the raw source row.
65
- * @returns the hex digest id.
66
- */
67
- function rowid(dataset, row) {
68
- return createHash('sha256').update(`${dataset}:${JSON.stringify(row)}`).digest('hex').slice(0, 40);
69
- }
70
- /**
71
- * extracts the display name of a row from the usual field candidates.
72
- *
73
- * @param row the raw source row.
74
- * @returns the best name field found.
75
- */
76
- function rowname(row) {
77
- const candidates = ['name', 'model', 'model_name', 'board', 'title', 'id'];
78
- for (const key of candidates) {
79
- const value = row[key];
80
- if (typeof value === 'string' && value.trim() !== '')
81
- return value;
82
- }
83
- return '(unnamed)';
84
- }
85
- /**
86
- * opens the catalog connection, creates the schema and mirrors the
87
- * datasets on first run. errors stay contained: a catalog failure never
88
- * breaks the engine boot.
89
- */
90
- function ensurecatalog() {
91
- if (mirrored)
92
- return;
93
- database = new DatabaseSync(dbpath);
94
- database.exec(ddl);
95
- for (const spec of datasets) {
96
- statements[spec.dataset] = {
97
- insert: database.prepare(`insert or replace into spec${spec.dataset} (id, name, payload) values (?, ?, ?)`),
98
- select: database.prepare(`select id, name, payload from spec${spec.dataset} order by name`),
99
- };
100
- try {
101
- const document = JSON.parse(readFileSync(join(moduledir, spec.file), 'utf8'));
102
- const rows = document[spec.key];
103
- if (!Array.isArray(rows))
104
- continue;
105
- for (const row of rows) {
106
- if (row === null || typeof row !== 'object')
107
- continue;
108
- const record = row;
109
- statements[spec.dataset].insert.run(rowid(spec.dataset, row), rowname(record), JSON.stringify(record));
110
- }
111
- }
112
- catch {
113
- /* an unreadable dataset leaves the catalog table as-is; the json
114
- * file stays the source of record for the next boot */
115
- }
116
- }
117
- mirrored = true;
118
- }
119
- /**
120
- * lists the rows of one dataset through the prepared statement.
121
- *
122
- * @param dataset the dataset to read.
123
- * @returns the catalog rows.
124
- */
125
- function listdataset(dataset) {
126
- ensurecatalog();
127
- const statement = statements[dataset]?.select;
128
- if (!statement)
129
- return [];
130
- return statement.all();
131
- }
132
- /**
133
- * lists the boards dataset.
134
- *
135
- * @returns the board rows.
136
- */
137
- export function listboards() {
138
- return listdataset('boards');
139
- }
140
- /**
141
- * lists the cores dataset.
142
- *
143
- * @returns the core rows.
144
- */
145
- export function listcores() {
146
- return listdataset('cores');
147
- }
148
- /**
149
- * lists the gpus dataset.
150
- *
151
- * @returns the gpu rows.
152
- */
153
- export function listgpus() {
154
- return listdataset('gpus');
155
- }
156
- /**
157
- * lists the processors dataset.
158
- *
159
- * @returns the processor rows.
160
- */
161
- export function listprocessors() {
162
- return listdataset('processors');
163
- }