@wenathlan/saddle 2.0.151 → 2.0.153

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 (293) hide show
  1. package/README.md +3 -3
  2. package/biome.jsonc +12 -5
  3. package/dist/App.d.ts +5 -0
  4. package/dist/App.js +52 -0
  5. package/dist/Sol/Sol.d.ts +3 -0
  6. package/dist/Sol/Sol.js +46 -0
  7. package/dist/Sol/agentbrowser/agentbrowser.d.ts +9 -0
  8. package/dist/Sol/agentbrowser/agentbrowser.js +121 -0
  9. package/dist/Sol/architecture/architecture.d.ts +9 -0
  10. package/dist/Sol/architecture/architecture.js +93 -0
  11. package/dist/Sol/compute/compute.d.ts +9 -0
  12. package/dist/Sol/compute/compute.js +22 -0
  13. package/dist/Sol/console/console.d.ts +15 -0
  14. package/dist/Sol/console/console.js +292 -0
  15. package/dist/Sol/dashboard/dashboard.d.ts +10 -0
  16. package/dist/Sol/dashboard/dashboard.js +181 -0
  17. package/dist/Sol/docs/docs.d.ts +9 -0
  18. package/dist/Sol/docs/docs.js +28 -0
  19. package/dist/Sol/home/home.d.ts +35 -0
  20. package/dist/Sol/home/home.js +239 -0
  21. package/dist/Sol/integrations/integrations.d.ts +9 -0
  22. package/dist/Sol/integrations/integrations.js +83 -0
  23. package/dist/Sol/intro/intro.d.ts +7 -0
  24. package/dist/Sol/intro/intro.js +102 -0
  25. package/dist/Sol/login/login.d.ts +16 -0
  26. package/dist/Sol/login/login.js +49 -0
  27. package/dist/Sol/notfound/notfound.d.ts +9 -0
  28. package/dist/Sol/notfound/notfound.js +15 -0
  29. package/dist/Sol/onboarding/onboarding.d.ts +25 -0
  30. package/dist/Sol/onboarding/onboarding.js +60 -0
  31. package/dist/Sol/playground/playground.d.ts +9 -0
  32. package/dist/Sol/playground/playground.js +127 -0
  33. package/dist/Sol/register/register.d.ts +16 -0
  34. package/dist/Sol/register/register.js +193 -0
  35. package/dist/Sol/shell/Shell.d.ts +124 -0
  36. package/dist/Sol/shell/Shell.js +335 -0
  37. package/dist/Sol/wingets/ComputeBootladder.d.ts +6 -0
  38. package/dist/Sol/wingets/ComputeBootladder.js +71 -0
  39. package/dist/Sol/wingets/ComputeModalitycatalog.d.ts +7 -0
  40. package/dist/Sol/wingets/ComputeModalitycatalog.js +71 -0
  41. package/dist/Sol/wingets/ConsoleApibadge.d.ts +7 -0
  42. package/dist/Sol/wingets/ConsoleApibadge.js +5 -0
  43. package/dist/Sol/wingets/ConsoleEdgelaw.d.ts +6 -0
  44. package/dist/Sol/wingets/ConsoleEdgelaw.js +36 -0
  45. package/dist/Sol/wingets/ConsoleEventstimeline.d.ts +19 -0
  46. package/dist/Sol/wingets/ConsoleEventstimeline.js +12 -0
  47. package/dist/Sol/wingets/ConsoleSnapshotcontrols.d.ts +8 -0
  48. package/dist/Sol/wingets/ConsoleSnapshotcontrols.js +8 -0
  49. package/dist/Sol/wingets/ConsoleSpecpanel.d.ts +21 -0
  50. package/dist/Sol/wingets/ConsoleSpecpanel.js +75 -0
  51. package/dist/Sol/wingets/ConsoleTerminal.d.ts +22 -0
  52. package/dist/Sol/wingets/ConsoleTerminal.js +77 -0
  53. package/dist/Sol/wingets/DashboardAccountpanel.d.ts +18 -0
  54. package/dist/Sol/wingets/DashboardAccountpanel.js +65 -0
  55. package/dist/Sol/wingets/DashboardAdminpanel.d.ts +6 -0
  56. package/dist/Sol/wingets/DashboardAdminpanel.js +90 -0
  57. package/dist/Sol/wingets/DashboardAuditlog.d.ts +8 -0
  58. package/dist/Sol/wingets/DashboardAuditlog.js +50 -0
  59. package/dist/Sol/wingets/DashboardCreatesandboxform.d.ts +10 -0
  60. package/dist/Sol/wingets/DashboardCreatesandboxform.js +71 -0
  61. package/dist/Sol/wingets/DashboardEventstimeline.d.ts +8 -0
  62. package/dist/Sol/wingets/DashboardEventstimeline.js +83 -0
  63. package/dist/Sol/wingets/DashboardGlobalsandboxestable.d.ts +8 -0
  64. package/dist/Sol/wingets/DashboardGlobalsandboxestable.js +57 -0
  65. package/dist/Sol/wingets/DashboardMeshnodestable.d.ts +8 -0
  66. package/dist/Sol/wingets/DashboardMeshnodestable.js +103 -0
  67. package/dist/Sol/wingets/DashboardSandboxlist.d.ts +10 -0
  68. package/dist/Sol/wingets/DashboardSandboxlist.js +163 -0
  69. package/dist/Sol/wingets/DashboardUserstable.d.ts +8 -0
  70. package/dist/Sol/wingets/DashboardUserstable.js +78 -0
  71. package/dist/Sol/wingets/HomeEntrygate.d.ts +23 -0
  72. package/dist/Sol/wingets/HomeEntrygate.js +73 -0
  73. package/dist/Sol/wingets/HomeMetricstrip.d.ts +9 -0
  74. package/dist/Sol/wingets/HomeMetricstrip.js +4 -0
  75. package/dist/Sol/wingets/HomeRuntimediagram.d.ts +1 -0
  76. package/dist/Sol/wingets/HomeRuntimediagram.js +22 -0
  77. package/dist/Sol/wingets/LoginForm.d.ts +19 -0
  78. package/dist/Sol/wingets/LoginForm.js +141 -0
  79. package/dist/Sol/wingets/RegisterPasswordconfirm.d.ts +13 -0
  80. package/dist/Sol/wingets/RegisterPasswordconfirm.js +16 -0
  81. package/dist/Sol/wingets/RegisterPasswordmeter.d.ts +19 -0
  82. package/dist/Sol/wingets/RegisterPasswordmeter.js +65 -0
  83. package/dist/Sol/wingets/RegisterUsernamerules.d.ts +11 -0
  84. package/dist/Sol/wingets/RegisterUsernamerules.js +16 -0
  85. package/dist/Sol/wingets/index.d.ts +39 -0
  86. package/dist/Sol/wingets/index.js +39 -0
  87. package/dist/alternatives.d.ts +508 -0
  88. package/dist/alternatives.js +950 -0
  89. package/dist/api.d.ts +154 -0
  90. package/dist/api.js +174 -0
  91. package/dist/auth.d.ts +268 -0
  92. package/dist/auth.js +476 -0
  93. package/dist/automation.d.ts +425 -0
  94. package/dist/automation.js +566 -0
  95. package/dist/browser.d.ts +561 -0
  96. package/dist/browser.js +1058 -0
  97. package/dist/capacitor.config.d.ts +45 -0
  98. package/dist/capacitor.config.js +48 -0
  99. package/dist/catalog.d.ts +43 -0
  100. package/dist/catalog.js +44 -0
  101. package/dist/cli.d.ts +16 -0
  102. package/dist/cli.js +168 -0
  103. package/dist/communication.d.ts +181 -0
  104. package/dist/communication.js +376 -0
  105. package/dist/compute.d.ts +1160 -0
  106. package/dist/compute.js +2272 -0
  107. package/dist/dashboardlib.d.ts +58 -0
  108. package/dist/dashboardlib.js +161 -0
  109. package/dist/db.d.ts +569 -0
  110. package/dist/db.js +1080 -0
  111. package/dist/distribution.d.ts +528 -0
  112. package/dist/distribution.js +810 -0
  113. package/dist/drizzle.config.d.ts +20 -0
  114. package/dist/drizzle.config.js +18 -0
  115. package/dist/edgelandes.d.ts +70 -0
  116. package/dist/edgelandes.host.d.ts +26 -0
  117. package/dist/edgelandes.host.js +1089 -0
  118. package/dist/edgelandes.inproc.d.ts +27 -0
  119. package/dist/edgelandes.inproc.js +952 -0
  120. package/dist/edgelandes.js +1133 -0
  121. package/dist/edgelandes.ninety.d.ts +31 -0
  122. package/dist/edgelandes.ninety.js +174 -0
  123. package/dist/edgelandes.virtual.d.ts +25 -0
  124. package/dist/edgelandes.virtual.js +629 -0
  125. package/dist/edgeplane.d.ts +114 -0
  126. package/dist/edgeplane.js +305 -0
  127. package/dist/examplelocaljob.d.ts +1 -0
  128. package/{docs/example-localjob.ts → dist/examplelocaljob.js} +0 -1
  129. package/dist/execution.d.ts +529 -0
  130. package/dist/execution.js +760 -0
  131. package/dist/family.d.ts +16 -0
  132. package/dist/family.js +42 -0
  133. package/dist/familyurl.d.ts +21 -0
  134. package/dist/familyurl.js +24 -0
  135. package/dist/format.d.ts +18 -0
  136. package/dist/format.js +59 -0
  137. package/dist/foundation.d.ts +172 -0
  138. package/dist/foundation.js +312 -0
  139. package/dist/index.d.ts +735 -0
  140. package/dist/index.js +1020 -0
  141. package/dist/integration.d.ts +235 -0
  142. package/dist/integration.js +228 -0
  143. package/dist/intelligence.d.ts +93 -0
  144. package/dist/intelligence.js +144 -0
  145. package/dist/isolation.d.ts +128 -0
  146. package/dist/isolation.js +95 -0
  147. package/dist/labels.d.ts +665 -0
  148. package/dist/labels.js +751 -0
  149. package/dist/localauth.d.ts +127 -0
  150. package/dist/localauth.js +413 -0
  151. package/dist/media.d.ts +343 -0
  152. package/dist/media.js +985 -0
  153. package/dist/mesh.d.ts +177 -0
  154. package/dist/mesh.js +468 -0
  155. package/dist/modalityregistry.d.ts +109 -0
  156. package/dist/modalityregistry.js +1386 -0
  157. package/dist/modes.d.ts +358 -0
  158. package/dist/modes.js +133 -0
  159. package/dist/onboardingstate.d.ts +79 -0
  160. package/dist/onboardingstate.js +282 -0
  161. package/dist/orchestrator.d.ts +1338 -0
  162. package/dist/orchestrator.js +4310 -0
  163. package/dist/packager/targetcli.js +4 -0
  164. package/dist/paths.d.ts +2 -0
  165. package/dist/paths.js +14 -0
  166. package/dist/performance.d.ts +415 -0
  167. package/dist/performance.js +826 -0
  168. package/dist/quantum.d.ts +809 -0
  169. package/dist/quantum.js +2072 -0
  170. package/dist/render.d.ts +380 -0
  171. package/dist/render.js +1072 -0
  172. package/dist/runall.d.ts +2 -0
  173. package/dist/runall.js +39 -0
  174. package/dist/runtimeprobe.d.ts +4 -0
  175. package/dist/runtimeprobe.js +8 -0
  176. package/dist/sandbox.d.ts +355 -0
  177. package/dist/sandbox.js +1721 -0
  178. package/dist/sandboxenvprofile.d.ts +29 -0
  179. package/dist/sandboxenvprofile.js +89 -0
  180. package/dist/sandboxprofile.d.ts +137 -0
  181. package/dist/sandboxprofile.js +241 -0
  182. package/dist/sandboxqueue.d.ts +108 -0
  183. package/dist/sandboxqueue.js +201 -0
  184. package/dist/sandboxquota.d.ts +121 -0
  185. package/dist/sandboxquota.js +236 -0
  186. package/dist/scheduler.d.ts +595 -0
  187. package/dist/scheduler.js +1258 -0
  188. package/dist/scriptlanes.d.ts +182 -0
  189. package/dist/scriptlanes.js +660 -0
  190. package/dist/scripts.buildengine.d.ts +1 -0
  191. package/dist/scripts.buildengine.js +39 -0
  192. package/dist/scripts.securitygate.d.ts +1 -0
  193. package/dist/scripts.securitygate.js +68 -0
  194. package/dist/scripts.validateflatnative.d.ts +1 -0
  195. package/dist/scripts.validateflatnative.js +72 -0
  196. package/dist/security.d.ts +500 -0
  197. package/dist/security.js +1169 -0
  198. package/dist/seedcatalog.d.ts +13 -0
  199. package/dist/seedcatalog.js +46 -0
  200. package/dist/server.d.ts +20 -0
  201. package/dist/server.js +53 -0
  202. package/dist/speccatalog.d.ts +31 -0
  203. package/dist/speccatalog.js +163 -0
  204. package/dist/tiers.d.ts +1001 -0
  205. package/dist/tiers.js +2169 -0
  206. package/dist/utils.d.ts +2 -0
  207. package/dist/utils.js +5 -0
  208. package/dist/vaulthandoff.d.ts +141 -0
  209. package/dist/vaulthandoff.js +444 -0
  210. package/dist/virtual.d.ts +640 -0
  211. package/dist/virtual.js +1284 -0
  212. package/dist/virtualcpu.d.ts +315 -0
  213. package/dist/virtualcpu.js +1180 -0
  214. package/dist/virtualgpu.d.ts +344 -0
  215. package/dist/virtualgpu.js +1000 -0
  216. package/dist/virtualization.d.ts +606 -0
  217. package/dist/virtualization.js +1186 -0
  218. package/dist/virtualmemory.d.ts +817 -0
  219. package/dist/virtualmemory.js +1795 -0
  220. package/dist/vite.config.d.ts +3 -0
  221. package/dist/vite.config.js +43 -0
  222. package/dist/vitest.config.d.ts +2 -0
  223. package/dist/vitest.config.js +25 -0
  224. package/dist/webserver.d.ts +166 -0
  225. package/dist/webserver.js +2226 -0
  226. package/dist/workloadlaw.d.ts +133 -0
  227. package/dist/workloadlaw.js +193 -0
  228. package/docs/artifactavailability.md +2 -2
  229. package/docs/{containerplatforms-2.1.0.md → containerplatforms.2.1.0.md} +1 -1
  230. package/docs/{documentmap-1.8.12.md → documentmap.1.8.12.md} +1 -1
  231. package/docs/ninety.modalities.md +108 -0
  232. package/docs/planning.ninety.md +391 -0
  233. package/docs/{releasenotes-1.8.13.md → releasenotes.1.8.13.md} +2 -2
  234. package/docs/{releasenotes-1.8.14.md → releasenotes.1.8.14.md} +1 -1
  235. package/docs/{repo-synthesis-1.8.16.md → repo.synthesis.1.8.16.md} +1 -1
  236. package/docs/{todo-1.8.15.md → todo.1.8.15.md} +1 -1
  237. package/docs/{todo-1.8.16.md → todo.1.8.16.md} +5 -5
  238. package/docs/todo.md +2 -2
  239. package/docs/workloadlaw.md +104 -0
  240. package/index.ts +1 -1
  241. package/manifest.json +1 -1
  242. package/modalityregistry.ts +1371 -34
  243. package/orchestrator.ts +1 -1
  244. package/package.json +78 -33
  245. package/docs/CONVERSA.txt +0 -1523
  246. package/docs/architecture-1.8.19.png +0 -0
  247. package/docs/assets/architecture.svg +0 -45
  248. package/docs/assets/saddle-browser-trace.webp +0 -0
  249. package/docs/assets/saddle-hero-bridge.webp +0 -0
  250. package/docs/assets/saddle-mark.webp +0 -0
  251. package/docs/assets/saddle-runtime-map.webp +0 -0
  252. package/docs/assets/saddlemark.svg +0 -13
  253. package/docs/saddle.archive.1.8.17.tar.gz.gpg +0 -0
  254. /package/docs/{architecture-1.8.19.md → architecture.1.8.19.md} +0 -0
  255. /package/docs/{architecture-1.8.19.mmd → architecture.1.8.19.mmd} +0 -0
  256. /package/docs/{artifactresearch-1.8.9.md → artifactresearch.1.8.9.md} +0 -0
  257. /package/docs/{batches-1816-1820.md → batches.1816.to.1820.md} +0 -0
  258. /package/docs/{brancharchive-2026-08-18.md → brancharchive.2026.08.18.md} +0 -0
  259. /package/docs/{containerplatforms-1.8.17.md → containerplatforms.1.8.17.md} +0 -0
  260. /package/docs/{e2ugh-engine.md → e2ugh.engine.md} +0 -0
  261. /package/docs/{flatbuildresearch-1.8.11.md → flatbuildresearch.1.8.11.md} +0 -0
  262. /package/docs/{licenseaudit-1.8.12.md → licenseaudit.1.8.12.md} +0 -0
  263. /package/docs/{mobileconversionresearch-1.8.10.md → mobileconversionresearch.1.8.10.md} +0 -0
  264. /package/docs/{native-wrappers.md → native.wrappers.md} +0 -0
  265. /package/docs/{nativeidentityresearch-1.8.11.md → nativeidentityresearch.1.8.11.md} +0 -0
  266. /package/docs/{releasenotes-1.8.12.md → releasenotes.1.8.12.md} +0 -0
  267. /package/docs/{releasenotes-1.8.15.md → releasenotes.1.8.15.md} +0 -0
  268. /package/docs/{releasenotes-1.8.16.md → releasenotes.1.8.16.md} +0 -0
  269. /package/docs/{releasenotes-1.8.17.md → releasenotes.1.8.17.md} +0 -0
  270. /package/docs/{releasenotes-1.8.18.md → releasenotes.1.8.18.md} +0 -0
  271. /package/docs/{releasenotes-1.8.19.md → releasenotes.1.8.19.md} +0 -0
  272. /package/docs/{reorganization-1.8.8.md → reorganization.1.8.8.md} +0 -0
  273. /package/docs/{reorganization-1.8.9.md → reorganization.1.8.9.md} +0 -0
  274. /package/docs/{repo-analysis-1.8.21.json → repo.analysis.1.8.21.json} +0 -0
  275. /package/docs/{repo-candidates-1.8.21.jsonl → repo.candidates.1.8.21.jsonl} +0 -0
  276. /package/docs/{repo-research-1.8.16.md → repo.research.1.8.16.md} +0 -0
  277. /package/docs/{repo-research-1.8.21.md → repo.research.1.8.21.md} +0 -0
  278. /package/docs/{repo-selected-1.8.21.json → repo.selected.1.8.21.json} +0 -0
  279. /package/docs/{repo-synthesis-1.8.21.md → repo.synthesis.1.8.21.md} +0 -0
  280. /package/docs/{research-1.8.18-isolation.md → research.1.8.18.isolation.md} +0 -0
  281. /package/docs/{research-1.8.19-virtual-browser.md → research.1.8.19.virtual.browser.md} +0 -0
  282. /package/docs/{scanningresearch-1.8.11.md → scanningresearch.1.8.11.md} +0 -0
  283. /package/docs/{securityaudit-1.8.7.md → securityaudit.1.8.7.md} +0 -0
  284. /package/docs/{securityreferences-1.8.11.md → securityreferences.1.8.11.md} +0 -0
  285. /package/docs/{securityresearch-1.8.11.md → securityresearch.1.8.11.md} +0 -0
  286. /package/docs/{signingresearch-1.8.12.md → signingresearch.1.8.12.md} +0 -0
  287. /package/docs/{tauri-glib-risk-1.8.11.md → tauri.glib.risk.1.8.11.md} +0 -0
  288. /package/docs/{todo-1.8.18.md → todo.1.8.18.md} +0 -0
  289. /package/docs/{todo-1.8.19.md → todo.1.8.19.md} +0 -0
  290. /package/docs/{toolchainresearch-1.8.9.md → toolchainresearch.1.8.9.md} +0 -0
  291. /package/docs/{web-duplicatecleanup.md → web.duplicatecleanup.md} +0 -0
  292. /package/docs/{web-ideas.md → web.ideas.md} +0 -0
  293. /package/docs/{workflowimprovements-2026-08-19.md → workflowimprovements.2026.08.19.md} +0 -0
@@ -0,0 +1,45 @@
1
+ /**
2
+ * the one conversion config of the grand merge, living at the app root so
3
+ * the capacitor cli resolves it from its working directory (verified against
4
+ * @capacitor/cli 8.5.1: the mobile lane runs `npx cap add`/`npx cap sync`
5
+ * from the app root and every path below — webDir above all — resolves
6
+ * relative to that cwd).
7
+ *
8
+ * the shared web build (the hashed bundles that vite emits straight at the
9
+ * app root) is the single application source of every platform: the browser,
10
+ * github pages, vercel, netlify, the tv and the android wrapper all render
11
+ * the same web bundle. the native shells are generated on the runners
12
+ * (`npx cap add android` / `npx cap add ios`) into android/ and ios/ beside
13
+ * this config — a gitignored toolchain output that is never committed (see
14
+ * docs/native.wrappers.md for the doctrine).
15
+ *
16
+ * the shape follows the family capacitor contract (the same shape every
17
+ * family app declares, devthink first); the type import stays out so the web
18
+ * typecheck never requires the optional capacitor toolchain — the identity
19
+ * fields stay plain and typed structurally here, with the saddle extras
20
+ * (logging behavior, web-content debugging, the ios content mode) riding
21
+ * beside them.
22
+ */
23
+ /** the structural contract of the capacitor config the cli reads (the subset this repository declares). */
24
+ type CapacitorConfigShape = {
25
+ appId: string;
26
+ appName: string;
27
+ webDir: string;
28
+ bundledWebRuntime?: boolean;
29
+ loggingBehavior?: string;
30
+ server?: {
31
+ androidScheme?: string;
32
+ };
33
+ android?: {
34
+ allowMixedContent?: boolean;
35
+ path?: string;
36
+ webContentsDebuggingEnabled?: boolean;
37
+ };
38
+ ios?: {
39
+ path?: string;
40
+ preferredContentMode?: string;
41
+ webContentsDebuggingEnabled?: boolean;
42
+ };
43
+ };
44
+ declare const config: CapacitorConfigShape;
45
+ export default config;
@@ -0,0 +1,48 @@
1
+ /**
2
+ * the one conversion config of the grand merge, living at the app root so
3
+ * the capacitor cli resolves it from its working directory (verified against
4
+ * @capacitor/cli 8.5.1: the mobile lane runs `npx cap add`/`npx cap sync`
5
+ * from the app root and every path below — webDir above all — resolves
6
+ * relative to that cwd).
7
+ *
8
+ * the shared web build (the hashed bundles that vite emits straight at the
9
+ * app root) is the single application source of every platform: the browser,
10
+ * github pages, vercel, netlify, the tv and the android wrapper all render
11
+ * the same web bundle. the native shells are generated on the runners
12
+ * (`npx cap add android` / `npx cap add ios`) into android/ and ios/ beside
13
+ * this config — a gitignored toolchain output that is never committed (see
14
+ * docs/native.wrappers.md for the doctrine).
15
+ *
16
+ * the shape follows the family capacitor contract (the same shape every
17
+ * family app declares, devthink first); the type import stays out so the web
18
+ * typecheck never requires the optional capacitor toolchain — the identity
19
+ * fields stay plain and typed structurally here, with the saddle extras
20
+ * (logging behavior, web-content debugging, the ios content mode) riding
21
+ * beside them.
22
+ */
23
+ const config = {
24
+ /** the saddle mobile identity — the id the mobile lane stamps onto the generated shells. */
25
+ appId: "im.saddle.app",
26
+ appName: "Saddle",
27
+ /** the vite build of the theme: `npm run web:build:pages` emits the hashed bundles at the app root. */
28
+ webDir: ".",
29
+ bundledWebRuntime: false,
30
+ loggingBehavior: "none",
31
+ server: {
32
+ androidScheme: "https",
33
+ },
34
+ /** the build paths the mobile lane answers: the android wrapper and the ios
35
+ * shell materialize beside this config (family-mobile.yml) and the cli
36
+ * reads them from these declared folders. */
37
+ android: {
38
+ allowMixedContent: false,
39
+ path: "android",
40
+ webContentsDebuggingEnabled: false,
41
+ },
42
+ ios: {
43
+ path: "ios",
44
+ preferredContentMode: "mobile",
45
+ webContentsDebuggingEnabled: false,
46
+ },
47
+ };
48
+ export default config;
@@ -0,0 +1,43 @@
1
+ export type MediaSlot = {
2
+ id: string;
3
+ label: string;
4
+ ratio: string;
5
+ caption: string;
6
+ };
7
+ /** one captured event of an agent browser session (docs/logs contract). */
8
+ export type AgentSessionEvent = {
9
+ /** the relative time of the event in milliseconds */
10
+ t: number;
11
+ /** the event kind: move, click, type or scroll */
12
+ type: string;
13
+ /** the css px coordinates of a move or click */
14
+ x?: number;
15
+ y?: number;
16
+ /** the scroll delta of a scroll event */
17
+ dy?: number;
18
+ /** the pressed key of a type event */
19
+ key?: string;
20
+ };
21
+ /** one agent browser session row: the session identity, its events and the
22
+ * captcha verdict of the run. */
23
+ export type AgentSession = {
24
+ /** the log format version */
25
+ version: number;
26
+ /** the session identity: id, browser and seed */
27
+ session: {
28
+ id: string;
29
+ browser: string;
30
+ seed: string;
31
+ };
32
+ /** the captured events in relative-time order */
33
+ events: AgentSessionEvent[];
34
+ /** the captcha verdict of the run */
35
+ captcha: {
36
+ kind: string;
37
+ passed: boolean;
38
+ };
39
+ };
40
+ export declare function mediaSlots(): Promise<MediaSlot[]>;
41
+ /** the agent browser sessions the pages render: the documented example log
42
+ * offline, the paired database rows over HTTPS once the endpoint answers. */
43
+ export declare function agentsessions(): Promise<AgentSession[]>;
@@ -0,0 +1,44 @@
1
+ /** Style: Saddle interface catalog — the read-only data layer of the pages.
2
+ * The owner doctrine: the interface never hardcodes data in components and
3
+ * never touches the visitor machine — no IndexedDB, no localForage, no
4
+ * browser storage writes. The rows live in the site's own self-hosted
5
+ * database (the virtual repo that mirrors the repository content per theme)
6
+ * and reach the interface over HTTPS; the reviewed seeds below are the
7
+ * offline answer of the static build until the database endpoint is paired.
8
+ * Media is never a file in the repository: the pages prepare media areas and
9
+ * the catalog answers their labels, ratios and captions. */
10
+ import { seedAgentSessions, seedMediaSlots } from "./seedcatalog";
11
+ const cache = new Map();
12
+ /** Reads one catalog kind: the paired database answers first over HTTPS
13
+ * (same origin gateway path), the reviewed seeds answer offline. Nothing is
14
+ * written to the visitor device. */
15
+ async function catalogRows(kind, seeds) {
16
+ const cached = cache.get(kind);
17
+ if (cached)
18
+ return cached;
19
+ let rows = seeds;
20
+ try {
21
+ const base = import.meta.env?.VITE_CATALOG_URL?.replace(/\/$/, "") ?? "";
22
+ if (base) {
23
+ const answer = await fetch(`${base}/catalog/${kind}`, { headers: { accept: "application/json" } });
24
+ if (answer.ok) {
25
+ const payload = (await answer.json());
26
+ if (Array.isArray(payload.rows) && payload.rows.length)
27
+ rows = payload.rows;
28
+ }
29
+ }
30
+ }
31
+ catch {
32
+ /* the database endpoint is optional; the seeds answer the static build */
33
+ }
34
+ cache.set(kind, rows);
35
+ return rows;
36
+ }
37
+ export function mediaSlots() {
38
+ return catalogRows("saddle.media", seedMediaSlots);
39
+ }
40
+ /** the agent browser sessions the pages render: the documented example log
41
+ * offline, the paired database rows over HTTPS once the endpoint answers. */
42
+ export function agentsessions() {
43
+ return catalogRows("saddle.sessions", seedAgentSessions);
44
+ }
package/dist/cli.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * cli.ts — the saddle command-line entry point.
3
+ *
4
+ * This file is the v2.0.0 grand-merge consolidation of the former nested
5
+ * folders of the repository (cli) into the single
6
+ * root-level domain file of the e2ugh 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
+ * the cli keeps local execution explicit and leaves remote dispatch to adapters.
14
+ */
15
+ /** Runs one CLI command and keeps external services behind adapters. */
16
+ export declare function main(args?: string[]): Promise<void>;
package/dist/cli.js ADDED
@@ -0,0 +1,168 @@
1
+ /**
2
+ * cli.ts — the saddle command-line entry point.
3
+ *
4
+ * This file is the v2.0.0 grand-merge consolidation of the former nested
5
+ * folders of the repository (cli) into the single
6
+ * root-level domain file of the e2ugh 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 { mkdtemp, readFile } from "node:fs/promises";
13
+ import { tmpdir } from "node:os";
14
+ import { join } from "node:path";
15
+ import { argv } from "node:process";
16
+ import { eventbus } from "./foundation.js";
17
+ import { localmemory, localstorage } from "./virtual.js";
18
+ import { engine, inprocess, scheduler } from "./execution.js";
19
+ import { mcpserver } from "./integration.js";
20
+ import { modecatalog } from "./modes.js";
21
+ import { creategrid, defaultplan, dockerrun, multiplex, planlint, plantoml, qemucommand } from "./index.js";
22
+ /* ════════════════════════════════════════════════════════════════════ */
23
+ /* Section 1: cli/main.ts — the saddle command-line entry point (the bin "saddle" resolves to dist/cli.js after the grand merge; the file is executable through the bin entry, not a shebang). */
24
+ /* ════════════════════════════════════════════════════════════════════ */
25
+ /**
26
+ * the cli keeps local execution explicit and leaves remote dispatch to adapters.
27
+ */
28
+ /** Runs one CLI command and keeps external services behind adapters. */
29
+ export async function main(args = argv.slice(2)) {
30
+ const command = args[0] ?? "help";
31
+ /* Help stays short and lists only stable local commands. */
32
+ if (["help", "--help", "-h"].includes(command)) {
33
+ console.log("saddle <command>\n\ncommands\n help\n modes\n plan [qemu|docker|toml]\n vm [qemu|docker|toml]\n vmlint\n gpus\n runexample\n mcp");
34
+ return;
35
+ }
36
+ if (command === "modes") {
37
+ console.log(JSON.stringify(modecatalog(), null, 2));
38
+ return;
39
+ }
40
+ if (command === "plan") {
41
+ await renderplan(args[1]);
42
+ return;
43
+ }
44
+ /* The vm/vmlint/gpus triad makes the nominal npm aliases (vm:create, */
45
+ /* vm:validate, gpu:list) real: they map to the live engine surface — */
46
+ /* the plan renderer, the planlint validator, and the gpus.json catalog. */
47
+ if (command === "vm") {
48
+ await renderplan(args[1] ?? "qemu");
49
+ return;
50
+ }
51
+ if (command === "vmlint") {
52
+ await rendervmlint();
53
+ return;
54
+ }
55
+ if (command === "gpus") {
56
+ await rendergpus();
57
+ return;
58
+ }
59
+ if (command === "runexample") {
60
+ const root = await mkdtemp(join(tmpdir(), "saddlecli"));
61
+ const events = eventbus();
62
+ const run = engine({ storage: localstorage(root), memory: localmemory(), scheduler: scheduler([inprocess()]), events });
63
+ const result = await run.run({ name: "cliexample", input: { hello: "saddle" } }, ({ job }) => ({ jobid: job.id, ok: true, message: "storage to working set to result" }));
64
+ console.log(JSON.stringify({ jobid: result.job.id, artifact: result.artifact, events: events.all().length }, null, 2));
65
+ return;
66
+ }
67
+ if (command === "mcp") {
68
+ const server = mcpserver();
69
+ console.log(JSON.stringify({ tools: server.listtools() }, null, 2));
70
+ return;
71
+ }
72
+ throw new Error(`unknown command: ${command}`);
73
+ }
74
+ /* ════════════════════════════════════════════════════════════════════ */
75
+ /* Section 2: the plan renderer — the architect CLI absorbed from the e2ugh */
76
+ /* engine entry (index.ts); the former `e2ugh` bin folds into the single */
77
+ /* `saddle` bin at the 2.0.0 grand merge. */
78
+ /* ════════════════════════════════════════════════════════════════════ */
79
+ /**
80
+ * Renders one machine plan (defaulting to defaultplan, overridden by the
81
+ * optional vm.config.toml regex fields) preceded by the MTTG multiplex
82
+ * header — the absorbed e2ugh engine CLI entry, byte-compatible with the
83
+ * former `node ./index.ts` invocation through the single saddle bin.
84
+ *
85
+ * @param format the render format: qemu (default), docker or toml.
86
+ */
87
+ async function renderplan(format = "qemu") {
88
+ try {
89
+ let candidate = { ...defaultplan };
90
+ try {
91
+ const raw = await readFile("vm.config.toml", "utf8");
92
+ const vcpus = /vcpus = (\d+)/.exec(raw)?.[1];
93
+ const mem = /gib = (\d+)/.exec(raw)?.[1];
94
+ const mttg = /virtual_threads = (\d+)/.exec(raw)?.[1];
95
+ if (vcpus !== undefined) {
96
+ candidate = { ...candidate, vcpus: Number(vcpus) };
97
+ }
98
+ if (mem !== undefined) {
99
+ candidate = { ...candidate, memorygib: Number(mem) };
100
+ }
101
+ if (mttg !== undefined) {
102
+ candidate = { ...candidate, mttgthreads: Number(mttg), mttg: true };
103
+ }
104
+ }
105
+ catch {
106
+ /* catcher: vm.config.toml is optional; defaults stay */
107
+ }
108
+ const grid = creategrid(undefined, candidate.mttgthreads);
109
+ const header = `# multiplex ${multiplex(grid).toFixed(1)}x on ${grid.host} host threads\n`;
110
+ const body = format === "docker"
111
+ ? dockerrun(candidate)
112
+ : format === "toml"
113
+ ? plantoml(candidate)
114
+ : qemucommand(candidate);
115
+ process.stdout.write(`${header}${body}\n`);
116
+ for (const note of planlint(candidate)) {
117
+ process.stderr.write(`# ${note}\n`);
118
+ }
119
+ }
120
+ catch (error) {
121
+ process.stderr.write(`planner failed: ${error instanceof Error ? error.message : String(error)}\n`);
122
+ }
123
+ }
124
+ /**
125
+ * Validates the effective machine plan (defaults overridden by the optional
126
+ * vm.config.toml fields) through planlint and prints only the advisory
127
+ * notes — the engine behind the nominal `vm:validate` npm alias: exit code
128
+ * stays zero because the notes are advisory, never fatal.
129
+ */
130
+ async function rendervmlint() {
131
+ let candidate = { ...defaultplan };
132
+ try {
133
+ const raw = await readFile("vm.config.toml", "utf8");
134
+ const vcpus = /vcpus = (\d+)/.exec(raw)?.[1];
135
+ const mem = /gib = (\d+)/.exec(raw)?.[1];
136
+ const mttg = /virtual_threads = (\d+)/.exec(raw)?.[1];
137
+ if (vcpus !== undefined)
138
+ candidate = { ...candidate, vcpus: Number(vcpus) };
139
+ if (mem !== undefined)
140
+ candidate = { ...candidate, memorygib: Number(mem) };
141
+ if (mttg !== undefined)
142
+ candidate = { ...candidate, mttgthreads: Number(mttg), mttg: true };
143
+ }
144
+ catch {
145
+ /* catcher: vm.config.toml is optional; defaults stay */
146
+ }
147
+ const notes = planlint(candidate);
148
+ console.log(`vcpus ${candidate.vcpus} memorygib ${candidate.memorygib} — ${notes.length} note(s)`);
149
+ for (const note of notes) {
150
+ console.log(`# ${note}`);
151
+ }
152
+ }
153
+ /**
154
+ * Lists the GPU catalog of the engine (gpus.json — the catalog the
155
+ * orchestrator resolves GPU requests against) — the engine behind the
156
+ * nominal `gpu:list` npm alias.
157
+ */
158
+ async function rendergpus() {
159
+ const catalog = JSON.parse(await readFile("gpus.json", "utf8"));
160
+ console.log(`${catalog.gpus.length} gpus`);
161
+ for (const gpu of catalog.gpus) {
162
+ const name = String(gpu.name ?? gpu.model ?? "unknown");
163
+ const profiles = Array.isArray(gpu.profiles) ? gpu.profiles.length : 0;
164
+ console.log(profiles > 0 ? `${name} (${profiles} mig profiles)` : name);
165
+ }
166
+ }
167
+ if (import.meta.url === `file://${argv[1]}`)
168
+ main().catch((error) => { console.error(error); process.exitCode = 1; });
@@ -0,0 +1,181 @@
1
+ /**
2
+ * communication.ts — API, protocol and webhook communication contracts.
3
+ *
4
+ * This file is the v2.0.0 grand-merge consolidation of the former nested
5
+ * folders of the repository (api) 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
+ * api authorization delegates token verification to the caller and never stores credentials.
14
+ */
15
+ /** Authorizes a request through an injected verifier or returns an anonymous principal. */
16
+ export declare function authorize(request: any, options?: {}): Promise<{
17
+ authenticated: boolean;
18
+ subject: string;
19
+ tokenpresent: boolean;
20
+ claims?: undefined;
21
+ } | {
22
+ tokenpresent?: undefined;
23
+ authenticated: boolean;
24
+ subject: string;
25
+ claims: any;
26
+ }>;
27
+ /**
28
+ * api contracts keep request identity and success envelopes stable across HTTP and MCP adapters.
29
+ */
30
+ export declare const apiversion = 1;
31
+ /** Extracts a caller supplied request id or creates a local id without exposing secrets. */
32
+ export declare function requestcontext(request: any, options?: {}): {
33
+ version: number;
34
+ requestid: string;
35
+ method: any;
36
+ path: any;
37
+ };
38
+ /** Creates a versioned success envelope for APIs that opt into envelopes. */
39
+ export declare function successpayload(data: any, context?: {}): {
40
+ version: number;
41
+ requestid: string;
42
+ data: any;
43
+ };
44
+ /** Creates a versioned error payload with a stable retry hint. */
45
+ export declare function errorpayload(code: any, message: any, context?: {}): {
46
+ version: number;
47
+ requestid: string;
48
+ error: {
49
+ code: string;
50
+ message: string;
51
+ retryafter: number;
52
+ };
53
+ };
54
+ /**
55
+ * URL security rejects private network targets before a fetch is attempted.
56
+ * DNS resolution remains a host adapter concern and is never performed silently.
57
+ */
58
+ export declare function assertpublicurl(value: any, options?: {}): URL;
59
+ /** Checks a resolved address list through a caller supplied DNS resolver to reduce rebinding risk. */
60
+ export declare function assertresolvedpublicurl(value: any, options?: {}): Promise<URL>;
61
+ /** Validates a redirect chain as public and bounded before a caller follows it. */
62
+ export declare function assertredirectchain(values?: any[], options?: {}): string[];
63
+ /** Returns a non throwing boolean for validators and middleware. */
64
+ export declare function ispublicurl(value: any, options?: {}): boolean;
65
+ /**
66
+ * token bucket rate limiting supports global user and domain keys.
67
+ */
68
+ export declare function ratebucket(options?: {}): {
69
+ consume: (key: any, cost?: number) => {
70
+ allowed: boolean;
71
+ retryafter: number;
72
+ };
73
+ clear(): void;
74
+ };
75
+ export declare function ratelimiter(options?: {}): {
76
+ check(input?: {}): {
77
+ allowed: boolean;
78
+ retryafter: any;
79
+ scope: string | {
80
+ consume: (key: any, cost?: number) => {
81
+ allowed: boolean;
82
+ retryafter: number;
83
+ };
84
+ clear(): void;
85
+ };
86
+ } | {
87
+ scope?: undefined;
88
+ allowed: boolean;
89
+ retryafter: number;
90
+ };
91
+ };
92
+ export declare function jsonresponse(data: any, options?: {}): Response;
93
+ export declare function errorresponse(code: any, message: any, options?: {}): Response;
94
+ export declare function sseresponse(events: any): Response;
95
+ /**
96
+ * json helpers keep serialization rules explicit at the protocol boundary.
97
+ */
98
+ export declare function jsonencode(value: any): string;
99
+ export declare function jsondecode(value: any): any;
100
+ /**
101
+ * ndjson supports append only records and incremental parsing.
102
+ */
103
+ export declare function ndjsonencode(values: any): AsyncGenerator<string, void, unknown>;
104
+ export declare function ndjsondecode(input: any): AsyncGenerator<any, void, unknown>;
105
+ /**
106
+ * sse helpers encode typed events without requiring a web framework.
107
+ */
108
+ export declare function sseencode(event: any): string;
109
+ export declare function ssedecode(chunk: any): {
110
+ id: any;
111
+ event: any;
112
+ data: any;
113
+ };
114
+ /**
115
+ * block streaming yields bounded chunks and lets the consumer control backpressure.
116
+ */
117
+ export declare function blockstream(input: any, options?: {}): AsyncGenerator<{
118
+ index: number;
119
+ offset: number;
120
+ data: Uint8Array<ArrayBuffer>;
121
+ final: boolean;
122
+ }, void, unknown>;
123
+ /**
124
+ * control service exposes operator controls through Web Request and Response without selecting a web framework.
125
+ */
126
+ /** Creates a framework-neutral HTTP handler for an injected operator control surface. */
127
+ export declare function controlservice(options?: {}): {
128
+ path: string;
129
+ controls: any;
130
+ handle: (request: any) => Promise<Response>;
131
+ };
132
+ /**
133
+ * webhook signatures use hmac sha256 and keep secrets outside serialized events.
134
+ */
135
+ export declare function webhooksig(payload: any, secret: any): string;
136
+ export declare function webhookverify(payload: any, signature: any, secret: any): boolean;
137
+ /**
138
+ * webhook delivery tracks attempts and dead letters without choosing a queue vendor.
139
+ */
140
+ /** Creates a sequential delivery queue with retryable failure handling. */
141
+ export declare function deliveryqueue(options?: {}): {
142
+ deliver: (input: {}, handler: any) => Promise<{
143
+ id: string;
144
+ status: string;
145
+ attempts: number;
146
+ createdat: number;
147
+ event: any;
148
+ metadata: any;
149
+ }>;
150
+ get(id: any): any;
151
+ list(): any[];
152
+ deadletters(): any[];
153
+ };
154
+ /**
155
+ * webhook receiver validates signatures before dispatch and drops duplicate delivery ids.
156
+ */
157
+ export declare function webhookreceiver(options?: {}): {
158
+ receive(input?: {}): Promise<{
159
+ accepted: boolean;
160
+ status: number;
161
+ reason: string;
162
+ duplicate?: undefined;
163
+ deliveryid?: undefined;
164
+ result?: undefined;
165
+ } | {
166
+ reason?: undefined;
167
+ accepted: boolean;
168
+ status: number;
169
+ duplicate: boolean;
170
+ deliveryid?: undefined;
171
+ result?: undefined;
172
+ } | {
173
+ reason?: undefined;
174
+ duplicate?: undefined;
175
+ accepted: boolean;
176
+ status: number;
177
+ deliveryid: any;
178
+ result: any;
179
+ }>;
180
+ deliveries(): unknown[];
181
+ };