@wenathlan/saddle 2.0.154 → 2.0.155

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. package/Dockerfile +112 -41
  2. package/README.md +58 -59
  3. package/browser.ts +482 -0
  4. package/cli.ts +274 -0
  5. package/distribution.ts +731 -0
  6. package/docker.config +29 -8
  7. package/docs/artifactavailability.md +2 -2
  8. package/docs/browser.md +18 -1
  9. package/docs/{containerplatforms.2.1.0.md → containerplatforms210.md} +1 -1
  10. package/docs/{documentmap.1.8.12.md → documentmap1812.md} +1 -1
  11. package/docs/extension.md +13 -2
  12. package/docs/libraryapi.md +1 -1
  13. package/docs/{ninety.modalities.md → ninetymodalities.md} +87 -4
  14. package/docs/{planning.ninety.md → planningninety.md} +6 -6
  15. package/docs/{releasenotes.1.8.13.md → releasenotes1813.md} +2 -2
  16. package/docs/{releasenotes.1.8.14.md → releasenotes1814.md} +1 -1
  17. package/docs/{repo.synthesis.1.8.16.md → reposynthesis1816.md} +1 -1
  18. package/docs/todo.md +2 -2
  19. package/docs/{todo.1.8.15.md → todo1815.md} +1 -1
  20. package/docs/{todo.1.8.16.md → todo1816.md} +5 -5
  21. package/execution.ts +677 -0
  22. package/foundation.ts +314 -0
  23. package/index.ts +35 -27
  24. package/isolation.ts +84 -0
  25. package/modes.ts +170 -0
  26. package/mttg.config +1 -1
  27. package/orchestrator.ts +49 -15
  28. package/package.json +90 -75
  29. package/qemu.config +2 -2
  30. package/sandbox.ts +2094 -0
  31. package/scheduler.ts +1 -1
  32. package/server.ts +52 -0
  33. package/tsconfig.json +11 -12
  34. package/virtual.ts +1105 -0
  35. package/virtualgpu.ts +1 -1
  36. package/virtualization.ts +1 -1
  37. package/workloadlaw.ts +293 -0
  38. package/dist/App.d.ts +0 -5
  39. package/dist/App.js +0 -52
  40. package/dist/Sol/Sol.d.ts +0 -3
  41. package/dist/Sol/Sol.js +0 -46
  42. package/dist/Sol/agentbrowser/agentbrowser.d.ts +0 -9
  43. package/dist/Sol/agentbrowser/agentbrowser.js +0 -121
  44. package/dist/Sol/architecture/architecture.d.ts +0 -9
  45. package/dist/Sol/architecture/architecture.js +0 -93
  46. package/dist/Sol/compute/compute.d.ts +0 -9
  47. package/dist/Sol/compute/compute.js +0 -22
  48. package/dist/Sol/console/console.d.ts +0 -15
  49. package/dist/Sol/console/console.js +0 -292
  50. package/dist/Sol/dashboard/dashboard.d.ts +0 -10
  51. package/dist/Sol/dashboard/dashboard.js +0 -181
  52. package/dist/Sol/docs/docs.d.ts +0 -9
  53. package/dist/Sol/docs/docs.js +0 -28
  54. package/dist/Sol/home/home.d.ts +0 -35
  55. package/dist/Sol/home/home.js +0 -239
  56. package/dist/Sol/integrations/integrations.d.ts +0 -9
  57. package/dist/Sol/integrations/integrations.js +0 -83
  58. package/dist/Sol/intro/intro.d.ts +0 -7
  59. package/dist/Sol/intro/intro.js +0 -102
  60. package/dist/Sol/login/login.d.ts +0 -16
  61. package/dist/Sol/login/login.js +0 -49
  62. package/dist/Sol/notfound/notfound.d.ts +0 -9
  63. package/dist/Sol/notfound/notfound.js +0 -15
  64. package/dist/Sol/onboarding/onboarding.d.ts +0 -25
  65. package/dist/Sol/onboarding/onboarding.js +0 -60
  66. package/dist/Sol/playground/playground.d.ts +0 -9
  67. package/dist/Sol/playground/playground.js +0 -127
  68. package/dist/Sol/register/register.d.ts +0 -16
  69. package/dist/Sol/register/register.js +0 -193
  70. package/dist/Sol/shell/Shell.d.ts +0 -124
  71. package/dist/Sol/shell/Shell.js +0 -335
  72. package/dist/Sol/wingets/ComputeBootladder.d.ts +0 -6
  73. package/dist/Sol/wingets/ComputeBootladder.js +0 -71
  74. package/dist/Sol/wingets/ComputeModalitycatalog.d.ts +0 -7
  75. package/dist/Sol/wingets/ComputeModalitycatalog.js +0 -71
  76. package/dist/Sol/wingets/ConsoleApibadge.d.ts +0 -7
  77. package/dist/Sol/wingets/ConsoleApibadge.js +0 -5
  78. package/dist/Sol/wingets/ConsoleEdgelaw.d.ts +0 -6
  79. package/dist/Sol/wingets/ConsoleEdgelaw.js +0 -36
  80. package/dist/Sol/wingets/ConsoleEventstimeline.d.ts +0 -19
  81. package/dist/Sol/wingets/ConsoleEventstimeline.js +0 -12
  82. package/dist/Sol/wingets/ConsoleSnapshotcontrols.d.ts +0 -8
  83. package/dist/Sol/wingets/ConsoleSnapshotcontrols.js +0 -8
  84. package/dist/Sol/wingets/ConsoleSpecpanel.d.ts +0 -21
  85. package/dist/Sol/wingets/ConsoleSpecpanel.js +0 -75
  86. package/dist/Sol/wingets/ConsoleTerminal.d.ts +0 -22
  87. package/dist/Sol/wingets/ConsoleTerminal.js +0 -77
  88. package/dist/Sol/wingets/DashboardAccountpanel.d.ts +0 -18
  89. package/dist/Sol/wingets/DashboardAccountpanel.js +0 -65
  90. package/dist/Sol/wingets/DashboardAdminpanel.d.ts +0 -6
  91. package/dist/Sol/wingets/DashboardAdminpanel.js +0 -90
  92. package/dist/Sol/wingets/DashboardAuditlog.d.ts +0 -8
  93. package/dist/Sol/wingets/DashboardAuditlog.js +0 -50
  94. package/dist/Sol/wingets/DashboardCreatesandboxform.d.ts +0 -10
  95. package/dist/Sol/wingets/DashboardCreatesandboxform.js +0 -71
  96. package/dist/Sol/wingets/DashboardEventstimeline.d.ts +0 -8
  97. package/dist/Sol/wingets/DashboardEventstimeline.js +0 -83
  98. package/dist/Sol/wingets/DashboardGlobalsandboxestable.d.ts +0 -8
  99. package/dist/Sol/wingets/DashboardGlobalsandboxestable.js +0 -57
  100. package/dist/Sol/wingets/DashboardMeshnodestable.d.ts +0 -8
  101. package/dist/Sol/wingets/DashboardMeshnodestable.js +0 -103
  102. package/dist/Sol/wingets/DashboardSandboxlist.d.ts +0 -10
  103. package/dist/Sol/wingets/DashboardSandboxlist.js +0 -163
  104. package/dist/Sol/wingets/DashboardUserstable.d.ts +0 -8
  105. package/dist/Sol/wingets/DashboardUserstable.js +0 -78
  106. package/dist/Sol/wingets/HomeEntrygate.d.ts +0 -23
  107. package/dist/Sol/wingets/HomeEntrygate.js +0 -73
  108. package/dist/Sol/wingets/HomeMetricstrip.d.ts +0 -9
  109. package/dist/Sol/wingets/HomeMetricstrip.js +0 -4
  110. package/dist/Sol/wingets/HomeRuntimediagram.d.ts +0 -1
  111. package/dist/Sol/wingets/HomeRuntimediagram.js +0 -22
  112. package/dist/Sol/wingets/LoginForm.d.ts +0 -19
  113. package/dist/Sol/wingets/LoginForm.js +0 -141
  114. package/dist/Sol/wingets/RegisterPasswordconfirm.d.ts +0 -13
  115. package/dist/Sol/wingets/RegisterPasswordconfirm.js +0 -16
  116. package/dist/Sol/wingets/RegisterPasswordmeter.d.ts +0 -19
  117. package/dist/Sol/wingets/RegisterPasswordmeter.js +0 -65
  118. package/dist/Sol/wingets/RegisterUsernamerules.d.ts +0 -11
  119. package/dist/Sol/wingets/RegisterUsernamerules.js +0 -16
  120. package/dist/Sol/wingets/index.d.ts +0 -39
  121. package/dist/Sol/wingets/index.js +0 -39
  122. package/dist/alternatives.d.ts +0 -508
  123. package/dist/alternatives.js +0 -950
  124. package/dist/api.d.ts +0 -154
  125. package/dist/api.js +0 -174
  126. package/dist/auth.d.ts +0 -268
  127. package/dist/auth.js +0 -476
  128. package/dist/automation.d.ts +0 -425
  129. package/dist/automation.js +0 -566
  130. package/dist/browser.d.ts +0 -561
  131. package/dist/browser.js +0 -1058
  132. package/dist/capacitor.config.d.ts +0 -45
  133. package/dist/capacitor.config.js +0 -48
  134. package/dist/catalog.d.ts +0 -43
  135. package/dist/catalog.js +0 -44
  136. package/dist/cli.d.ts +0 -16
  137. package/dist/cli.js +0 -168
  138. package/dist/communication.d.ts +0 -181
  139. package/dist/communication.js +0 -376
  140. package/dist/compute.d.ts +0 -1160
  141. package/dist/compute.js +0 -2272
  142. package/dist/dashboardlib.d.ts +0 -58
  143. package/dist/dashboardlib.js +0 -161
  144. package/dist/db.d.ts +0 -569
  145. package/dist/db.js +0 -1080
  146. package/dist/distribution.d.ts +0 -528
  147. package/dist/distribution.js +0 -810
  148. package/dist/drizzle.config.d.ts +0 -20
  149. package/dist/drizzle.config.js +0 -18
  150. package/dist/edgelandes.d.ts +0 -70
  151. package/dist/edgelandes.host.d.ts +0 -26
  152. package/dist/edgelandes.host.js +0 -1089
  153. package/dist/edgelandes.inproc.d.ts +0 -27
  154. package/dist/edgelandes.inproc.js +0 -952
  155. package/dist/edgelandes.js +0 -1133
  156. package/dist/edgelandes.ninety.d.ts +0 -31
  157. package/dist/edgelandes.ninety.js +0 -174
  158. package/dist/edgelandes.virtual.d.ts +0 -25
  159. package/dist/edgelandes.virtual.js +0 -629
  160. package/dist/edgeplane.d.ts +0 -121
  161. package/dist/edgeplane.js +0 -341
  162. package/dist/examplelocaljob.d.ts +0 -1
  163. package/dist/examplelocaljob.js +0 -14
  164. package/dist/execution.d.ts +0 -529
  165. package/dist/execution.js +0 -760
  166. package/dist/family.d.ts +0 -16
  167. package/dist/family.js +0 -42
  168. package/dist/familyurl.d.ts +0 -21
  169. package/dist/familyurl.js +0 -24
  170. package/dist/format.d.ts +0 -18
  171. package/dist/format.js +0 -59
  172. package/dist/foundation.d.ts +0 -172
  173. package/dist/foundation.js +0 -312
  174. package/dist/index.d.ts +0 -735
  175. package/dist/index.js +0 -1020
  176. package/dist/integration.d.ts +0 -235
  177. package/dist/integration.js +0 -228
  178. package/dist/intelligence.d.ts +0 -93
  179. package/dist/intelligence.js +0 -144
  180. package/dist/isolation.d.ts +0 -128
  181. package/dist/isolation.js +0 -95
  182. package/dist/labels.d.ts +0 -665
  183. package/dist/labels.js +0 -707
  184. package/dist/localauth.d.ts +0 -127
  185. package/dist/localauth.js +0 -413
  186. package/dist/media.d.ts +0 -343
  187. package/dist/media.js +0 -985
  188. package/dist/mesh.d.ts +0 -177
  189. package/dist/mesh.js +0 -468
  190. package/dist/modalityregistry.d.ts +0 -109
  191. package/dist/modalityregistry.js +0 -1386
  192. package/dist/modes.d.ts +0 -358
  193. package/dist/modes.js +0 -133
  194. package/dist/onboardingstate.d.ts +0 -79
  195. package/dist/onboardingstate.js +0 -282
  196. package/dist/orchestrator.d.ts +0 -1338
  197. package/dist/orchestrator.js +0 -4310
  198. package/dist/packager/targetcli.js +0 -4
  199. package/dist/paths.d.ts +0 -2
  200. package/dist/paths.js +0 -14
  201. package/dist/performance.d.ts +0 -415
  202. package/dist/performance.js +0 -826
  203. package/dist/quantum.d.ts +0 -809
  204. package/dist/quantum.js +0 -2072
  205. package/dist/render.d.ts +0 -380
  206. package/dist/render.js +0 -1072
  207. package/dist/runall.d.ts +0 -2
  208. package/dist/runall.js +0 -39
  209. package/dist/runtimeprobe.d.ts +0 -4
  210. package/dist/runtimeprobe.js +0 -8
  211. package/dist/sandbox.d.ts +0 -355
  212. package/dist/sandbox.js +0 -1721
  213. package/dist/sandboxenvprofile.d.ts +0 -29
  214. package/dist/sandboxenvprofile.js +0 -89
  215. package/dist/sandboxprofile.d.ts +0 -137
  216. package/dist/sandboxprofile.js +0 -241
  217. package/dist/sandboxqueue.d.ts +0 -108
  218. package/dist/sandboxqueue.js +0 -201
  219. package/dist/sandboxquota.d.ts +0 -121
  220. package/dist/sandboxquota.js +0 -236
  221. package/dist/scheduler.d.ts +0 -595
  222. package/dist/scheduler.js +0 -1258
  223. package/dist/scriptlanes.d.ts +0 -182
  224. package/dist/scriptlanes.js +0 -660
  225. package/dist/scripts.buildengine.d.ts +0 -1
  226. package/dist/scripts.buildengine.js +0 -39
  227. package/dist/scripts.securitygate.d.ts +0 -1
  228. package/dist/scripts.securitygate.js +0 -68
  229. package/dist/scripts.validateflatnative.d.ts +0 -1
  230. package/dist/scripts.validateflatnative.js +0 -72
  231. package/dist/security.d.ts +0 -500
  232. package/dist/security.js +0 -1169
  233. package/dist/seedcatalog.d.ts +0 -13
  234. package/dist/seedcatalog.js +0 -46
  235. package/dist/server.d.ts +0 -20
  236. package/dist/server.js +0 -53
  237. package/dist/speccatalog.d.ts +0 -31
  238. package/dist/speccatalog.js +0 -163
  239. package/dist/tiers.d.ts +0 -1001
  240. package/dist/tiers.js +0 -2169
  241. package/dist/utils.d.ts +0 -2
  242. package/dist/utils.js +0 -5
  243. package/dist/vaulthandoff.d.ts +0 -141
  244. package/dist/vaulthandoff.js +0 -444
  245. package/dist/virtual.d.ts +0 -640
  246. package/dist/virtual.js +0 -1284
  247. package/dist/virtualcpu.d.ts +0 -315
  248. package/dist/virtualcpu.js +0 -1180
  249. package/dist/virtualgpu.d.ts +0 -344
  250. package/dist/virtualgpu.js +0 -1000
  251. package/dist/virtualization.d.ts +0 -606
  252. package/dist/virtualization.js +0 -1186
  253. package/dist/virtualmemory.d.ts +0 -817
  254. package/dist/virtualmemory.js +0 -1795
  255. package/dist/vite.config.d.ts +0 -3
  256. package/dist/vite.config.js +0 -48
  257. package/dist/vitest.config.d.ts +0 -2
  258. package/dist/vitest.config.js +0 -25
  259. package/dist/webserver.d.ts +0 -166
  260. package/dist/webserver.js +0 -2226
  261. package/dist/workloadlaw.d.ts +0 -133
  262. package/dist/workloadlaw.js +0 -193
  263. package/manifest.json +0 -20
  264. package/media.ts +0 -1337
  265. /package/docs/{architecture.1.8.19.md → architecture1819.md} +0 -0
  266. /package/docs/{architecture.1.8.19.mmd → architecture1819.mmd} +0 -0
  267. /package/docs/{artifactresearch.1.8.9.md → artifactresearch189.md} +0 -0
  268. /package/docs/{batches.1816.to.1820.md → batches1816to1820.md} +0 -0
  269. /package/docs/{brancharchive.2026.08.18.md → brancharchive20260818.md} +0 -0
  270. /package/docs/{containerplatforms.1.8.17.md → containerplatforms1817.md} +0 -0
  271. /package/docs/{e2ugh.engine.md → e2ughengine.md} +0 -0
  272. /package/docs/{flatbuildresearch.1.8.11.md → flatbuildresearch1811.md} +0 -0
  273. /package/docs/{licenseaudit.1.8.12.md → licenseaudit1812.md} +0 -0
  274. /package/docs/{mobileconversionresearch.1.8.10.md → mobileconversionresearch1810.md} +0 -0
  275. /package/docs/{nativeidentityresearch.1.8.11.md → nativeidentityresearch1811.md} +0 -0
  276. /package/docs/{native.wrappers.md → nativewrappers.md} +0 -0
  277. /package/docs/{planning.1.8.18.md → planning1818.md} +0 -0
  278. /package/docs/{planning.1.8.19.md → planning1819.md} +0 -0
  279. /package/docs/{planning.engine.md → planningengine.md} +0 -0
  280. /package/docs/{releasenotes.1.8.12.md → releasenotes1812.md} +0 -0
  281. /package/docs/{releasenotes.1.8.15.md → releasenotes1815.md} +0 -0
  282. /package/docs/{releasenotes.1.8.16.md → releasenotes1816.md} +0 -0
  283. /package/docs/{releasenotes.1.8.17.md → releasenotes1817.md} +0 -0
  284. /package/docs/{releasenotes.1.8.18.md → releasenotes1818.md} +0 -0
  285. /package/docs/{releasenotes.1.8.19.md → releasenotes1819.md} +0 -0
  286. /package/docs/{reorganization.1.8.8.md → reorganization188.md} +0 -0
  287. /package/docs/{reorganization.1.8.9.md → reorganization189.md} +0 -0
  288. /package/docs/{repo.analysis.1.8.21.json → repoanalysis1821.json} +0 -0
  289. /package/docs/{repo.candidates.1.8.21.jsonl → repocandidates1821.jsonl} +0 -0
  290. /package/docs/{repo.research.1.8.16.md → reporesearch1816.md} +0 -0
  291. /package/docs/{repo.research.1.8.21.md → reporesearch1821.md} +0 -0
  292. /package/docs/{repo.selected.1.8.21.json → reposelected1821.json} +0 -0
  293. /package/docs/{repo.synthesis.1.8.21.md → reposynthesis1821.md} +0 -0
  294. /package/docs/{research.1.8.18.isolation.md → research1818isolation.md} +0 -0
  295. /package/docs/{research.1.8.19.virtual.browser.md → research1819virtualbrowser.md} +0 -0
  296. /package/docs/{scanningresearch.1.8.11.md → scanningresearch1811.md} +0 -0
  297. /package/docs/{securityaudit.1.8.7.md → securityaudit187.md} +0 -0
  298. /package/docs/{securityreferences.1.8.11.md → securityreferences1811.md} +0 -0
  299. /package/docs/{securityresearch.1.8.11.md → securityresearch1811.md} +0 -0
  300. /package/docs/{signingresearch.1.8.12.md → signingresearch1812.md} +0 -0
  301. /package/docs/{tauri.glib.risk.1.8.11.md → tauriglibrisk1811.md} +0 -0
  302. /package/docs/{todo.1.8.18.md → todo1818.md} +0 -0
  303. /package/docs/{todo.1.8.19.md → todo1819.md} +0 -0
  304. /package/docs/{toolchainresearch.1.8.9.md → toolchainresearch189.md} +0 -0
  305. /package/docs/{web.duplicatecleanup.md → webduplicatecleanup.md} +0 -0
  306. /package/docs/{web.ideas.md → webideas.md} +0 -0
  307. /package/docs/{workflowimprovements.2026.08.19.md → workflowimprovements20260819.md} +0 -0
@@ -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
- }