@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,312 +0,0 @@
1
- /**
2
- * foundation.ts — foundation errors, events, identifiers, hashing and serializable domain nouns.
3
- *
4
- * This file is the v2.0.0 grand-merge consolidation of the former nested
5
- * folders of the repository (core) 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
- /* Section 1: core/errors.ts — typed engine errors keep recovery decisions explicit. */
14
- /* ════════════════════════════════════════════════════════════════════ */
15
- /**
16
- * typed engine errors keep recovery decisions explicit.
17
- */
18
- export const errorcodes = Object.freeze({
19
- invalidinput: "INVALID_INPUT",
20
- artifactnotfound: "ARTIFACT_NOT_FOUND",
21
- storagefailure: "STORAGE_FAILURE",
22
- runnerunavailable: "RUNNER_UNAVAILABLE",
23
- jobfailed: "JOB_FAILED",
24
- sessioninvalid: "SESSION_INVALID"
25
- });
26
- export function saddleerror(message, options = {}) {
27
- const error = new Error(message, { cause: options.cause });
28
- error.name = "saddleerror";
29
- error.code = options.code ?? errorcodes.jobfailed;
30
- error.retryable = options.retryable ?? false;
31
- error.details = options.details ?? {};
32
- return error;
33
- }
34
- export function validationerror(message, details = {}) {
35
- return saddleerror(message, { code: errorcodes.invalidinput, details });
36
- }
37
- export function artifactnotfound(key) {
38
- return saddleerror(`artifact not found: ${key}`, { code: errorcodes.artifactnotfound, details: { key } });
39
- }
40
- export function runnerunavailable(jobid) {
41
- return saddleerror(`no runner is available for job ${jobid}`, { code: errorcodes.runnerunavailable, retryable: true, details: { jobid } });
42
- }
43
- export function aserror(error, jobid) {
44
- if (error?.name === "saddleerror")
45
- return error;
46
- return saddleerror(`job ${jobid} failed`, { code: errorcodes.jobfailed, cause: error, details: { jobid } });
47
- }
48
- /** Operational error presets keep status, recovery and retry decisions
49
- * explicit for the engine's outbound lanes (registry pulls, runner
50
- * handshakes, package fetches); the presets answer the sandbox engine
51
- * only — the scrape lanes that once consumed them left the package. */
52
- export const errorcatalog = Object.freeze({
53
- timeout: { code: "E1001", statuscode: 504, retryable: true, recovery: "WAIT_AND_RETRY" },
54
- connectionrefused: { code: "E1002", statuscode: 503, retryable: true, recovery: "WAIT_AND_RETRY" },
55
- dns: { code: "E1003", statuscode: 503, retryable: true, recovery: "WAIT_AND_RETRY" },
56
- ratelimited: { code: "E2001", statuscode: 429, retryable: true, recovery: "WAIT_AND_RETRY" },
57
- forbidden: { code: "E2002", statuscode: 403, retryable: false, recovery: "REVIEW_CREDENTIALS" },
58
- notfound: { code: "E2003", statuscode: 404, retryable: false, recovery: "ABANDON" },
59
- parse: { code: "E4002", statuscode: 422, retryable: false, recovery: "ABANDON" },
60
- session: { code: "E5001", statuscode: 401, retryable: true, recovery: "REFRESH_SESSION" },
61
- config: { code: "E6001", statuscode: 400, retryable: false, recovery: "ABANDON" }
62
- });
63
- /** Creates a stable operational error with recovery metadata. */
64
- export function operationerror(kind, message, options = {}) { const preset = errorcatalog[kind] ?? errorcatalog.config; const error = new Error(message, { cause: options.cause }); error.name = "operationerror"; error.code = options.code ?? preset.code; error.statuscode = options.statuscode ?? preset.statuscode; error.retryable = options.retryable ?? preset.retryable; error.recovery = options.recovery ?? preset.recovery; error.severity = options.severity ?? (error.statuscode >= 500 ? "high" : "medium"); error.details = options.details ?? {}; return error; }
65
- /** Converts unknown failures into the stable operational taxonomy. */
66
- export function classifyerror(error) { if (error?.name === "operationerror")
67
- return error; const message = String(error?.message ?? error); if (/timeout|aborted/i.test(message))
68
- return operationerror("timeout", message, { cause: error }); if (/dns|enotfound/i.test(message))
69
- return operationerror("dns", message, { cause: error }); return operationerror("config", message, { cause: error }); }
70
- /* ════════════════════════════════════════════════════════════════════ */
71
- /* Section 2: core/events.ts — append only events are the small protocol shared by adapters. */
72
- /* ════════════════════════════════════════════════════════════════════ */
73
- /**
74
- * append only events are the small protocol shared by adapters.
75
- */
76
- export const eventtypes = Object.freeze([
77
- "jobqueued",
78
- "jobpreparing",
79
- "runnerselected",
80
- "jobrunning",
81
- "jobsyncing",
82
- "storagecommitted",
83
- "jobcompleted",
84
- "jobfailed"
85
- ]);
86
- export function eventbus() {
87
- const recorded = [];
88
- return {
89
- emit(event) { recorded.push(Object.freeze({ ...event })); },
90
- all() { return [...recorded]; }
91
- };
92
- }
93
- /* ════════════════════════════════════════════════════════════════════ */
94
- /* Section 3: core/ids.ts — injectable time and id factories make every engine path reproducible. */
95
- /* ════════════════════════════════════════════════════════════════════ */
96
- /**
97
- * injectable time and id factories make every engine path reproducible.
98
- */
99
- export function systemclock() {
100
- return { now: () => Date.now() };
101
- }
102
- export function idfactory(randomuuid = globalThis.crypto?.randomUUID?.bind(globalThis.crypto)) {
103
- return {
104
- next(prefix) {
105
- const suffix = randomuuid?.() ?? `${Date.now().toString(36)}${Math.random().toString(36).slice(2, 10)}`;
106
- return `${prefix}${suffix}`;
107
- }
108
- };
109
- }
110
- /* ════════════════════════════════════════════════════════════════════ */
111
- /* Section 4: core/hash.ts — hash helpers use standard JavaScript primitives so transport-neutral modules do not require node:crypto. */
112
- /* ════════════════════════════════════════════════════════════════════ */
113
- /**
114
- * hash helpers use standard JavaScript primitives so transport-neutral modules do not require node:crypto.
115
- */
116
- const constants = Object.freeze([
117
- 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
118
- 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
119
- 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
120
- 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
121
- 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
122
- 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
123
- 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
124
- 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
125
- ]);
126
- /** Returns a SHA-256 hexadecimal digest for bytes or text. */
127
- export function sha256(value) { return tohex(hashbytes(value)); }
128
- /** Returns an HMAC-SHA-256 hexadecimal digest for bytes or text. */
129
- export function hmacsha256(value, secret) {
130
- let key = tobytes(secret);
131
- if (key.length > 64)
132
- key = hashbytes(key);
133
- const padded = new Uint8Array(64);
134
- padded.set(key);
135
- const outer = new Uint8Array(64);
136
- const inner = new Uint8Array(64);
137
- for (let index = 0; index < 64; index += 1) {
138
- outer[index] = padded[index] ^ 0x5c;
139
- inner[index] = padded[index] ^ 0x36;
140
- }
141
- return sha256(concat(outer, hashbytes(concat(inner, tobytes(value)))));
142
- }
143
- /** Compares hexadecimal values without early exit based on content. */
144
- export function constanttimeequal(left, right) { const a = String(left ?? ""); const b = String(right ?? ""); let difference = a.length ^ b.length; const length = Math.max(a.length, b.length); for (let index = 0; index < length; index += 1)
145
- difference |= (a.charCodeAt(index) || 0) ^ (b.charCodeAt(index) || 0); return difference === 0; }
146
- function hashbytes(value) {
147
- const input = tobytes(value);
148
- const bitlength = BigInt(input.length) * 8n;
149
- const length = Math.ceil((input.length + 9) / 64) * 64;
150
- const padded = new Uint8Array(length);
151
- padded.set(input);
152
- padded[input.length] = 0x80;
153
- const inputview = new DataView(padded.buffer);
154
- inputview.setUint32(length - 8, Number((bitlength >> 32n) & 0xffffffffn));
155
- inputview.setUint32(length - 4, Number(bitlength & 0xffffffffn));
156
- const state = new Uint32Array([0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19]);
157
- const words = new Uint32Array(64);
158
- for (let offset = 0; offset < length; offset += 64) {
159
- for (let index = 0; index < 16; index += 1)
160
- words[index] = inputview.getUint32(offset + index * 4);
161
- for (let index = 16; index < 64; index += 1) {
162
- const sigma0 = smallright(words[index - 15], 7) ^ smallright(words[index - 15], 18) ^ (words[index - 15] >>> 3);
163
- const sigma1 = smallright(words[index - 2], 17) ^ smallright(words[index - 2], 19) ^ (words[index - 2] >>> 10);
164
- words[index] = (sigma1 + words[index - 7] + sigma0 + words[index - 16]) >>> 0;
165
- }
166
- let [a, b, c, d, e, f, g, h] = state;
167
- for (let index = 0; index < 64; index += 1) {
168
- const choose = (e & f) ^ (~e & g);
169
- const majority = (a & b) ^ (a & c) ^ (b & c);
170
- const first = (h + (smallright(e, 6) ^ smallright(e, 11) ^ smallright(e, 25)) + choose + constants[index] + words[index]) >>> 0;
171
- const second = ((smallright(a, 2) ^ smallright(a, 13) ^ smallright(a, 22)) + majority) >>> 0;
172
- [h, g, f, e, d, c, b, a] = [g, f, e, (d + first) >>> 0, c, b, a, (first + second) >>> 0];
173
- }
174
- state[0] = (state[0] + a) >>> 0;
175
- state[1] = (state[1] + b) >>> 0;
176
- state[2] = (state[2] + c) >>> 0;
177
- state[3] = (state[3] + d) >>> 0;
178
- state[4] = (state[4] + e) >>> 0;
179
- state[5] = (state[5] + f) >>> 0;
180
- state[6] = (state[6] + g) >>> 0;
181
- state[7] = (state[7] + h) >>> 0;
182
- }
183
- const output = new Uint8Array(32);
184
- const view = new DataView(output.buffer);
185
- state.forEach((word, index) => {
186
- view.setUint32(index * 4, word);
187
- });
188
- return output;
189
- }
190
- function tobytes(value) { if (value instanceof Uint8Array)
191
- return value; if (value instanceof ArrayBuffer)
192
- return new Uint8Array(value); return new TextEncoder().encode(String(value ?? "")); }
193
- function concat(left, right) { const result = new Uint8Array(left.length + right.length); result.set(left); result.set(right, left.length); return result; }
194
- function smallright(value, amount) { return (value >>> amount) | (value << (32 - amount)); }
195
- function tohex(value) { return [...value].map((byte) => byte.toString(16).padStart(2, "0")).join(""); }
196
- /* ════════════════════════════════════════════════════════════════════ */
197
- /* Section 5: core/artifacts.ts — artifacts are serializable manifests with content checksums. */
198
- /* ════════════════════════════════════════════════════════════════════ */
199
- /**
200
- * artifacts are serializable manifests with content checksums.
201
- */
202
- export function artifactmanifest(input) {
203
- return {
204
- key: input.key,
205
- sizebytes: input.sizebytes,
206
- sha256: input.sha256,
207
- contenttype: input.contenttype,
208
- createdat: input.createdat,
209
- metadata: { ...(input.metadata ?? {}) }
210
- };
211
- }
212
- /* ════════════════════════════════════════════════════════════════════ */
213
- /* Section 6: core/jobs.ts — job creation is kept small and side effect free. */
214
- /* ════════════════════════════════════════════════════════════════════ */
215
- /**
216
- * job creation is kept small and side effect free.
217
- */
218
- export const jobstatuses = Object.freeze(["queued", "preparing", "running", "syncing", "completed", "failed", "cancelled"]);
219
- export function createjob(spec, ids, clock) {
220
- if (!spec?.name || !spec.name.trim())
221
- throw validationerror("job name cannot be empty");
222
- return {
223
- id: ids.next("job"),
224
- name: spec.name,
225
- input: spec.input,
226
- priority: spec.priority ?? 0,
227
- outputkey: spec.outputkey,
228
- metadata: { ...(spec.metadata ?? {}) },
229
- status: "queued",
230
- createdat: clock.now()
231
- };
232
- }
233
- /* ════════════════════════════════════════════════════════════════════ */
234
- /* Section 7: core/providers.ts — providers declare capacity while scheduling remains a runtime decision. */
235
- /* ════════════════════════════════════════════════════════════════════ */
236
- /**
237
- * providers declare capacity while scheduling remains a runtime decision.
238
- */
239
- export const runnerstatuses = Object.freeze(["available", "busy", "offline"]);
240
- export function runnercontext(job, workingset, signal) {
241
- return { job, workingset, signal };
242
- }
243
- /* ════════════════════════════════════════════════════════════════════ */
244
- /* Section 8: core/runtime.ts — runtime records describe temporary process space without claiming physical vram. */
245
- /* ════════════════════════════════════════════════════════════════════ */
246
- /**
247
- * runtime records describe temporary process space without claiming physical vram.
248
- */
249
- export function workingset(jobid, location, resultpath, createdat = Date.now()) {
250
- return { jobid, location, resultpath, createdat };
251
- }
252
- export function syncresult(bytes, location) {
253
- return { bytes, location };
254
- }
255
- /* ════════════════════════════════════════════════════════════════════ */
256
- /* Section 9: core/sessions.ts — session logs are versioned and validated before any replay adapter sees them. */
257
- /* ════════════════════════════════════════════════════════════════════ */
258
- /**
259
- * session logs are versioned and validated before any replay adapter sees them.
260
- */
261
- const sessioneventtypes = new Set(["move", "click", "drag", "scroll", "key"]);
262
- export function validatesession(value) {
263
- if (!value || typeof value !== "object")
264
- throw validationerror("session must be an object");
265
- if (value.version !== 1 || typeof value.id !== "string" || typeof value.agentname !== "string" || typeof value.originurl !== "string" || typeof value.seed !== "string")
266
- throw validationerror("session header is invalid");
267
- if (!Array.isArray(value.events))
268
- throw validationerror("session events must be an array");
269
- if (!["created", "recording", "closed"].includes(value.status))
270
- throw validationerror("session status is invalid");
271
- if (!Number.isFinite(value.startedat) || value.startedat < 0)
272
- throw validationerror("session startedat is invalid");
273
- return {
274
- version: 1,
275
- id: value.id,
276
- agentname: value.agentname,
277
- originurl: value.originurl,
278
- seed: value.seed,
279
- status: value.status,
280
- startedat: value.startedat,
281
- finishedat: Number.isFinite(value.finishedat) ? value.finishedat : undefined,
282
- events: value.events.map((event, index) => validateevent(event, index))
283
- };
284
- }
285
- function validateevent(value, index) {
286
- if (!value || typeof value !== "object" || !Number.isFinite(value.t) || value.t < 0 || !sessioneventtypes.has(value.type))
287
- throw validationerror(`session event ${index} is invalid`);
288
- for (const name of ["x", "y", "tx", "ty", "dx", "dy"])
289
- if (value[name] !== undefined && !Number.isFinite(value[name]))
290
- throw validationerror(`session event ${index} ${name} is invalid`);
291
- if (value.key !== undefined && typeof value.key !== "string")
292
- throw validationerror(`session event ${index} key is invalid`);
293
- if (value.target !== undefined && typeof value.target !== "string")
294
- throw validationerror(`session event ${index} target is invalid`);
295
- if (value.button !== undefined && !["left", "right"].includes(value.button))
296
- throw validationerror(`session event ${index} button is invalid`);
297
- const context = validatecontext(value.context ?? value, index);
298
- return context ? { ...value, context } : { ...value };
299
- }
300
- function validatecontext(value, index) {
301
- if (value.context !== undefined && (value.context === null || typeof value.context !== "object" || Array.isArray(value.context)))
302
- throw validationerror(`session event ${index} context is invalid`);
303
- const source = value.context ?? value;
304
- const context = {};
305
- for (const name of ["windowid", "tabid", "frameid"])
306
- if (source[name] !== undefined) {
307
- if (typeof source[name] !== "string" || !source[name])
308
- throw validationerror(`session event ${index} ${name} is invalid`);
309
- context[name] = source[name];
310
- }
311
- return Object.keys(context).length ? context : undefined;
312
- }