@wenathlan/saddle 2.0.150 → 2.0.152

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 (296) hide show
  1. package/Dockerfile +43 -23
  2. package/README.md +4 -4
  3. package/biome.jsonc +134 -0
  4. package/dist/App.d.ts +3 -0
  5. package/dist/App.js +50 -0
  6. package/dist/Sol/Sol.d.ts +3 -0
  7. package/dist/Sol/Sol.js +46 -0
  8. package/dist/Sol/agentbrowser/agentbrowser.d.ts +9 -0
  9. package/dist/Sol/agentbrowser/agentbrowser.js +121 -0
  10. package/dist/Sol/architecture/architecture.d.ts +9 -0
  11. package/dist/Sol/architecture/architecture.js +93 -0
  12. package/dist/Sol/compute/compute.d.ts +9 -0
  13. package/dist/Sol/compute/compute.js +22 -0
  14. package/dist/Sol/console/console.d.ts +15 -0
  15. package/dist/Sol/console/console.js +292 -0
  16. package/dist/Sol/dashboard/dashboard.d.ts +10 -0
  17. package/dist/Sol/dashboard/dashboard.js +181 -0
  18. package/dist/Sol/docs/docs.d.ts +9 -0
  19. package/dist/Sol/docs/docs.js +28 -0
  20. package/dist/Sol/home/home.d.ts +35 -0
  21. package/dist/Sol/home/home.js +239 -0
  22. package/dist/Sol/integrations/integrations.d.ts +9 -0
  23. package/dist/Sol/integrations/integrations.js +83 -0
  24. package/dist/Sol/intro/intro.d.ts +7 -0
  25. package/dist/Sol/intro/intro.js +102 -0
  26. package/dist/Sol/login/login.d.ts +16 -0
  27. package/dist/Sol/login/login.js +49 -0
  28. package/dist/Sol/notfound/notfound.d.ts +9 -0
  29. package/dist/Sol/notfound/notfound.js +15 -0
  30. package/dist/Sol/onboarding/onboarding.d.ts +25 -0
  31. package/dist/Sol/onboarding/onboarding.js +60 -0
  32. package/dist/Sol/playground/playground.d.ts +9 -0
  33. package/dist/Sol/playground/playground.js +127 -0
  34. package/dist/Sol/register/register.d.ts +16 -0
  35. package/dist/Sol/register/register.js +193 -0
  36. package/dist/Sol/shell/Shell.d.ts +124 -0
  37. package/dist/Sol/shell/Shell.js +335 -0
  38. package/dist/Sol/wingets/ComputeBootladder.d.ts +6 -0
  39. package/dist/Sol/wingets/ComputeBootladder.js +71 -0
  40. package/dist/Sol/wingets/ComputeModalitycatalog.d.ts +7 -0
  41. package/dist/Sol/wingets/ComputeModalitycatalog.js +71 -0
  42. package/dist/Sol/wingets/ConsoleApibadge.d.ts +7 -0
  43. package/dist/Sol/wingets/ConsoleApibadge.js +5 -0
  44. package/dist/Sol/wingets/ConsoleEdgelaw.d.ts +6 -0
  45. package/dist/Sol/wingets/ConsoleEdgelaw.js +36 -0
  46. package/dist/Sol/wingets/ConsoleEventstimeline.d.ts +19 -0
  47. package/dist/Sol/wingets/ConsoleEventstimeline.js +12 -0
  48. package/dist/Sol/wingets/ConsoleSnapshotcontrols.d.ts +8 -0
  49. package/dist/Sol/wingets/ConsoleSnapshotcontrols.js +8 -0
  50. package/dist/Sol/wingets/ConsoleSpecpanel.d.ts +21 -0
  51. package/dist/Sol/wingets/ConsoleSpecpanel.js +75 -0
  52. package/dist/Sol/wingets/ConsoleTerminal.d.ts +22 -0
  53. package/dist/Sol/wingets/ConsoleTerminal.js +77 -0
  54. package/dist/Sol/wingets/DashboardAccountpanel.d.ts +18 -0
  55. package/dist/Sol/wingets/DashboardAccountpanel.js +65 -0
  56. package/dist/Sol/wingets/DashboardAdminpanel.d.ts +6 -0
  57. package/dist/Sol/wingets/DashboardAdminpanel.js +90 -0
  58. package/dist/Sol/wingets/DashboardAuditlog.d.ts +8 -0
  59. package/dist/Sol/wingets/DashboardAuditlog.js +50 -0
  60. package/dist/Sol/wingets/DashboardCreatesandboxform.d.ts +10 -0
  61. package/dist/Sol/wingets/DashboardCreatesandboxform.js +71 -0
  62. package/dist/Sol/wingets/DashboardEventstimeline.d.ts +8 -0
  63. package/dist/Sol/wingets/DashboardEventstimeline.js +83 -0
  64. package/dist/Sol/wingets/DashboardGlobalsandboxestable.d.ts +8 -0
  65. package/dist/Sol/wingets/DashboardGlobalsandboxestable.js +57 -0
  66. package/dist/Sol/wingets/DashboardMeshnodestable.d.ts +8 -0
  67. package/dist/Sol/wingets/DashboardMeshnodestable.js +103 -0
  68. package/dist/Sol/wingets/DashboardSandboxlist.d.ts +10 -0
  69. package/dist/Sol/wingets/DashboardSandboxlist.js +163 -0
  70. package/dist/Sol/wingets/DashboardUserstable.d.ts +8 -0
  71. package/dist/Sol/wingets/DashboardUserstable.js +78 -0
  72. package/dist/Sol/wingets/HomeEntrygate.d.ts +23 -0
  73. package/dist/Sol/wingets/HomeEntrygate.js +73 -0
  74. package/dist/Sol/wingets/HomeMetricstrip.d.ts +9 -0
  75. package/dist/Sol/wingets/HomeMetricstrip.js +4 -0
  76. package/dist/Sol/wingets/HomeRuntimediagram.d.ts +1 -0
  77. package/dist/Sol/wingets/HomeRuntimediagram.js +22 -0
  78. package/dist/Sol/wingets/LoginForm.d.ts +19 -0
  79. package/dist/Sol/wingets/LoginForm.js +141 -0
  80. package/dist/Sol/wingets/RegisterPasswordconfirm.d.ts +13 -0
  81. package/dist/Sol/wingets/RegisterPasswordconfirm.js +16 -0
  82. package/dist/Sol/wingets/RegisterPasswordmeter.d.ts +19 -0
  83. package/dist/Sol/wingets/RegisterPasswordmeter.js +65 -0
  84. package/dist/Sol/wingets/RegisterUsernamerules.d.ts +11 -0
  85. package/dist/Sol/wingets/RegisterUsernamerules.js +16 -0
  86. package/dist/Sol/wingets/index.d.ts +39 -0
  87. package/dist/Sol/wingets/index.js +39 -0
  88. package/dist/alternatives.d.ts +508 -0
  89. package/dist/alternatives.js +950 -0
  90. package/dist/api.d.ts +154 -0
  91. package/dist/api.js +174 -0
  92. package/dist/auth.d.ts +268 -0
  93. package/dist/auth.js +476 -0
  94. package/dist/automation.d.ts +425 -0
  95. package/dist/automation.js +566 -0
  96. package/dist/browser.d.ts +561 -0
  97. package/dist/browser.js +1058 -0
  98. package/dist/capacitor.config.d.ts +45 -0
  99. package/dist/capacitor.config.js +48 -0
  100. package/dist/catalog.d.ts +43 -0
  101. package/dist/catalog.js +44 -0
  102. package/dist/cli.d.ts +16 -0
  103. package/dist/cli.js +168 -0
  104. package/dist/communication.d.ts +181 -0
  105. package/dist/communication.js +376 -0
  106. package/dist/compute.d.ts +1160 -0
  107. package/dist/compute.js +2272 -0
  108. package/dist/dashboardlib.d.ts +58 -0
  109. package/dist/dashboardlib.js +161 -0
  110. package/dist/db.d.ts +569 -0
  111. package/dist/db.js +1080 -0
  112. package/dist/distribution.d.ts +528 -0
  113. package/dist/distribution.js +810 -0
  114. package/dist/drizzle.config.d.ts +20 -0
  115. package/dist/drizzle.config.js +18 -0
  116. package/dist/edgelandes.d.ts +70 -0
  117. package/dist/edgelandes.host.d.ts +26 -0
  118. package/dist/edgelandes.host.js +1089 -0
  119. package/dist/edgelandes.inproc.d.ts +27 -0
  120. package/dist/edgelandes.inproc.js +952 -0
  121. package/dist/edgelandes.js +1133 -0
  122. package/dist/edgelandes.ninety.d.ts +31 -0
  123. package/dist/edgelandes.ninety.js +174 -0
  124. package/dist/edgelandes.virtual.d.ts +25 -0
  125. package/dist/edgelandes.virtual.js +629 -0
  126. package/dist/edgeplane.d.ts +114 -0
  127. package/dist/edgeplane.js +305 -0
  128. package/dist/examplelocaljob.d.ts +1 -0
  129. package/{docs/example-localjob.ts → dist/examplelocaljob.js} +0 -1
  130. package/dist/execution.d.ts +529 -0
  131. package/dist/execution.js +760 -0
  132. package/dist/family.d.ts +16 -0
  133. package/dist/family.js +42 -0
  134. package/dist/familyurl.d.ts +21 -0
  135. package/dist/familyurl.js +24 -0
  136. package/dist/format.d.ts +18 -0
  137. package/dist/format.js +59 -0
  138. package/dist/foundation.d.ts +172 -0
  139. package/dist/foundation.js +312 -0
  140. package/dist/index.d.ts +735 -0
  141. package/dist/index.js +1020 -0
  142. package/dist/integration.d.ts +235 -0
  143. package/dist/integration.js +228 -0
  144. package/dist/intelligence.d.ts +93 -0
  145. package/dist/intelligence.js +144 -0
  146. package/dist/isolation.d.ts +128 -0
  147. package/dist/isolation.js +95 -0
  148. package/dist/labels.d.ts +665 -0
  149. package/dist/labels.js +751 -0
  150. package/dist/localauth.d.ts +127 -0
  151. package/dist/localauth.js +413 -0
  152. package/dist/media.d.ts +343 -0
  153. package/dist/media.js +985 -0
  154. package/dist/mesh.d.ts +177 -0
  155. package/dist/mesh.js +468 -0
  156. package/dist/modalityregistry.d.ts +109 -0
  157. package/dist/modalityregistry.js +1386 -0
  158. package/dist/modes.d.ts +358 -0
  159. package/dist/modes.js +133 -0
  160. package/dist/onboardingstate.d.ts +79 -0
  161. package/dist/onboardingstate.js +282 -0
  162. package/dist/orchestrator.d.ts +1338 -0
  163. package/dist/orchestrator.js +4310 -0
  164. package/dist/packager/targetcli.js +4 -0
  165. package/dist/paths.d.ts +2 -0
  166. package/dist/paths.js +14 -0
  167. package/dist/performance.d.ts +415 -0
  168. package/dist/performance.js +826 -0
  169. package/dist/quantum.d.ts +809 -0
  170. package/dist/quantum.js +2072 -0
  171. package/dist/render.d.ts +380 -0
  172. package/dist/render.js +1072 -0
  173. package/dist/runall.d.ts +2 -0
  174. package/dist/runall.js +39 -0
  175. package/dist/runtimeprobe.d.ts +4 -0
  176. package/dist/runtimeprobe.js +8 -0
  177. package/dist/sandbox.d.ts +355 -0
  178. package/dist/sandbox.js +1721 -0
  179. package/dist/sandboxenvprofile.d.ts +29 -0
  180. package/dist/sandboxenvprofile.js +89 -0
  181. package/dist/sandboxprofile.d.ts +137 -0
  182. package/dist/sandboxprofile.js +241 -0
  183. package/dist/sandboxqueue.d.ts +108 -0
  184. package/dist/sandboxqueue.js +201 -0
  185. package/dist/sandboxquota.d.ts +121 -0
  186. package/dist/sandboxquota.js +236 -0
  187. package/dist/scheduler.d.ts +595 -0
  188. package/dist/scheduler.js +1258 -0
  189. package/dist/scriptlanes.d.ts +182 -0
  190. package/dist/scriptlanes.js +660 -0
  191. package/dist/scripts.buildengine.d.ts +1 -0
  192. package/dist/scripts.buildengine.js +39 -0
  193. package/dist/scripts.securitygate.d.ts +1 -0
  194. package/dist/scripts.securitygate.js +68 -0
  195. package/dist/scripts.validateflatnative.d.ts +1 -0
  196. package/dist/scripts.validateflatnative.js +72 -0
  197. package/dist/security.d.ts +500 -0
  198. package/dist/security.js +1169 -0
  199. package/dist/seedcatalog.d.ts +13 -0
  200. package/dist/seedcatalog.js +46 -0
  201. package/dist/server.d.ts +20 -0
  202. package/dist/server.js +53 -0
  203. package/dist/speccatalog.d.ts +31 -0
  204. package/dist/speccatalog.js +163 -0
  205. package/dist/tiers.d.ts +1001 -0
  206. package/dist/tiers.js +2169 -0
  207. package/dist/utils.d.ts +2 -0
  208. package/dist/utils.js +5 -0
  209. package/dist/vaulthandoff.d.ts +141 -0
  210. package/dist/vaulthandoff.js +444 -0
  211. package/dist/virtual.d.ts +640 -0
  212. package/dist/virtual.js +1284 -0
  213. package/dist/virtualcpu.d.ts +315 -0
  214. package/dist/virtualcpu.js +1180 -0
  215. package/dist/virtualgpu.d.ts +344 -0
  216. package/dist/virtualgpu.js +1000 -0
  217. package/dist/virtualization.d.ts +606 -0
  218. package/dist/virtualization.js +1186 -0
  219. package/dist/virtualmemory.d.ts +817 -0
  220. package/dist/virtualmemory.js +1795 -0
  221. package/dist/vite.config.d.ts +3 -0
  222. package/dist/vite.config.js +43 -0
  223. package/dist/vitest.config.d.ts +2 -0
  224. package/dist/vitest.config.js +25 -0
  225. package/dist/webserver.d.ts +166 -0
  226. package/dist/webserver.js +2226 -0
  227. package/dist/workloadlaw.d.ts +133 -0
  228. package/dist/workloadlaw.js +193 -0
  229. package/docker.config +13 -6
  230. package/docs/artifactavailability.md +2 -2
  231. package/docs/{containerplatforms-2.1.0.md → containerplatforms.2.1.0.md} +1 -1
  232. package/docs/{documentmap-1.8.12.md → documentmap.1.8.12.md} +1 -1
  233. package/docs/ninety.modalities.md +108 -0
  234. package/docs/planning.ninety.md +391 -0
  235. package/docs/{releasenotes-1.8.13.md → releasenotes.1.8.13.md} +2 -2
  236. package/docs/{releasenotes-1.8.14.md → releasenotes.1.8.14.md} +1 -1
  237. package/docs/{repo-synthesis-1.8.16.md → repo.synthesis.1.8.16.md} +1 -1
  238. package/docs/{todo-1.8.15.md → todo.1.8.15.md} +1 -1
  239. package/docs/{todo-1.8.16.md → todo.1.8.16.md} +5 -5
  240. package/docs/todo.md +2 -2
  241. package/docs/workloadlaw.md +104 -0
  242. package/index.ts +4 -3
  243. package/manifest.json +1 -1
  244. package/modalityregistry.ts +1493 -0
  245. package/orchestrator.ts +1 -1
  246. package/package.json +76 -37
  247. package/docs/CONVERSA.txt +0 -1523
  248. package/docs/architecture-1.8.19.png +0 -0
  249. package/docs/assets/architecture.svg +0 -45
  250. package/docs/assets/saddle-browser-trace.webp +0 -0
  251. package/docs/assets/saddle-hero-bridge.webp +0 -0
  252. package/docs/assets/saddle-mark.webp +0 -0
  253. package/docs/assets/saddle-runtime-map.webp +0 -0
  254. package/docs/assets/saddlemark.svg +0 -13
  255. package/docs/example-publicapi.ts +0 -7
  256. package/docs/saddle.archive.1.8.17.tar.gz.gpg +0 -0
  257. /package/docs/{architecture-1.8.19.md → architecture.1.8.19.md} +0 -0
  258. /package/docs/{architecture-1.8.19.mmd → architecture.1.8.19.mmd} +0 -0
  259. /package/docs/{artifactresearch-1.8.9.md → artifactresearch.1.8.9.md} +0 -0
  260. /package/docs/{batches-1816-1820.md → batches.1816.to.1820.md} +0 -0
  261. /package/docs/{brancharchive-2026-08-18.md → brancharchive.2026.08.18.md} +0 -0
  262. /package/docs/{containerplatforms-1.8.17.md → containerplatforms.1.8.17.md} +0 -0
  263. /package/docs/{e2ugh-engine.md → e2ugh.engine.md} +0 -0
  264. /package/docs/{flatbuildresearch-1.8.11.md → flatbuildresearch.1.8.11.md} +0 -0
  265. /package/docs/{licenseaudit-1.8.12.md → licenseaudit.1.8.12.md} +0 -0
  266. /package/docs/{mobileconversionresearch-1.8.10.md → mobileconversionresearch.1.8.10.md} +0 -0
  267. /package/docs/{native-wrappers.md → native.wrappers.md} +0 -0
  268. /package/docs/{nativeidentityresearch-1.8.11.md → nativeidentityresearch.1.8.11.md} +0 -0
  269. /package/docs/{releasenotes-1.8.12.md → releasenotes.1.8.12.md} +0 -0
  270. /package/docs/{releasenotes-1.8.15.md → releasenotes.1.8.15.md} +0 -0
  271. /package/docs/{releasenotes-1.8.16.md → releasenotes.1.8.16.md} +0 -0
  272. /package/docs/{releasenotes-1.8.17.md → releasenotes.1.8.17.md} +0 -0
  273. /package/docs/{releasenotes-1.8.18.md → releasenotes.1.8.18.md} +0 -0
  274. /package/docs/{releasenotes-1.8.19.md → releasenotes.1.8.19.md} +0 -0
  275. /package/docs/{reorganization-1.8.8.md → reorganization.1.8.8.md} +0 -0
  276. /package/docs/{reorganization-1.8.9.md → reorganization.1.8.9.md} +0 -0
  277. /package/docs/{repo-analysis-1.8.21.json → repo.analysis.1.8.21.json} +0 -0
  278. /package/docs/{repo-candidates-1.8.21.jsonl → repo.candidates.1.8.21.jsonl} +0 -0
  279. /package/docs/{repo-research-1.8.16.md → repo.research.1.8.16.md} +0 -0
  280. /package/docs/{repo-research-1.8.21.md → repo.research.1.8.21.md} +0 -0
  281. /package/docs/{repo-selected-1.8.21.json → repo.selected.1.8.21.json} +0 -0
  282. /package/docs/{repo-synthesis-1.8.21.md → repo.synthesis.1.8.21.md} +0 -0
  283. /package/docs/{research-1.8.18-isolation.md → research.1.8.18.isolation.md} +0 -0
  284. /package/docs/{research-1.8.19-virtual-browser.md → research.1.8.19.virtual.browser.md} +0 -0
  285. /package/docs/{scanningresearch-1.8.11.md → scanningresearch.1.8.11.md} +0 -0
  286. /package/docs/{securityaudit-1.8.7.md → securityaudit.1.8.7.md} +0 -0
  287. /package/docs/{securityreferences-1.8.11.md → securityreferences.1.8.11.md} +0 -0
  288. /package/docs/{securityresearch-1.8.11.md → securityresearch.1.8.11.md} +0 -0
  289. /package/docs/{signingresearch-1.8.12.md → signingresearch.1.8.12.md} +0 -0
  290. /package/docs/{tauri-glib-risk-1.8.11.md → tauri.glib.risk.1.8.11.md} +0 -0
  291. /package/docs/{todo-1.8.18.md → todo.1.8.18.md} +0 -0
  292. /package/docs/{todo-1.8.19.md → todo.1.8.19.md} +0 -0
  293. /package/docs/{toolchainresearch-1.8.9.md → toolchainresearch.1.8.9.md} +0 -0
  294. /package/docs/{web-duplicatecleanup.md → web.duplicatecleanup.md} +0 -0
  295. /package/docs/{web-ideas.md → web.ideas.md} +0 -0
  296. /package/docs/{workflowimprovements-2026-08-19.md → workflowimprovements.2026.08.19.md} +0 -0
@@ -0,0 +1,239 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * home page anchor — layer 3 of the anchor architecture.
4
+ * The file carrying the folder's own name is the path manager of the page:
5
+ * it imports the loose components beside it, mounts the page and re-exports
6
+ * the public component surface. Only the theme anchor (Sol/Sol.tsx) consumes
7
+ * this file. This anchor carries the former main component of the folder,
8
+ * which now lives here as the page mount itself.
9
+ *
10
+ * R3-saddle: home is the LANDING of the platform — one sand light over the
11
+ * window stage, the prompt-giga field where the operator declares a sandbox
12
+ * (a giant mono input with the embedded boot key and the real declared
13
+ * vocabulary of sandboxprofile.ts as chips), the sandbox matrix as a
14
+ * hairline ledger of the three runtime bases (base / guests / arch / vgpu /
15
+ * ceiling — the documented development bootstrap limits of
16
+ * sandboxenvprofile.ts), the thesis, the runtime chain, the surfaces
17
+ * ledger, the 01–03 steps and the footer meta-quad. The boot key parses the
18
+ * draft against the declared vocabulary and hands the parsed declaration to
19
+ * the console over the `saddle.declared` session key — the console reads
20
+ * and spends it once on mount (a real handoff: the hardware identities stay
21
+ * caller choices there).
22
+ *
23
+ * The flow law rides this anchor: the default export is the ENTRY GATE
24
+ * (entrygate.tsx, beside this anchor) — the seen flags are consulted before
25
+ * the landing shows, an unfinished flow is replaced at /intro or
26
+ * /onboarding, and only a visitor that finished both stages ever sees the
27
+ * surface below.
28
+ */
29
+ import { ArrowDownRightRegular as ArrowDownRight, ArrowUpRightRegular as ArrowUpRight, PlugConnectedRegular as Cable, KeyboardRegular as Command, LayerRegular as Layers3, ArrowRightRegular as MoveRight, BoxRegular as Package, } from '@fluentui/react-icons';
30
+ // Signal & Ledger: home as the landing — declare the sandbox, read the matrix, boot the console.
31
+ import { useEffect, useMemo, useState } from 'react';
32
+ import { Link, useLocation } from 'wouter';
33
+ import { SectionRail } from '../shell/Shell.tsx';
34
+ import { mediaSlots } from '../../catalog';
35
+ import { label, labelfill } from '../../labels.ts';
36
+ import { specenvlimits } from '../../sandboxenvprofile.ts';
37
+ import { SANDBOXARCHES, SANDBOXBASES, SANDBOXFORMS, SANDBOXOSES, } from '../../sandboxprofile.ts';
38
+ import { HomeEntrygate as EntryGate } from '../wingets';
39
+ import { MetricStrip as MetricStrip } from '../wingets';
40
+ import { RuntimeDiagram as RuntimeDiagram } from '../wingets';
41
+ export * from '../wingets';
42
+ /** the session key the boot key writes and the console reads (once, then spent). */
43
+ const DECLARED_KEY = 'saddle.declared';
44
+ /** parses one draft line against the declared vocabularies of sandboxprofile. */
45
+ function parsedraft(raw) {
46
+ const words = raw
47
+ .toLowerCase()
48
+ .split(/[^a-z0-9]+/)
49
+ .filter(Boolean);
50
+ return {
51
+ base: SANDBOXBASES.find((entry) => words.includes(entry)) ?? null,
52
+ os: SANDBOXOSES.find((entry) => words.includes(entry)) ?? null,
53
+ arch: SANDBOXARCHES.find((entry) => words.includes(entry)) ?? null,
54
+ };
55
+ }
56
+ /** the chip groups of the hero: the three fixed vocabularies — the tokens
57
+ * are the declared data, the group labels ride the store. */
58
+ function chipgroups() {
59
+ return [
60
+ { key: 'base', label: label('home.chips.base'), items: SANDBOXBASES },
61
+ { key: 'os', label: label('home.chips.guest'), items: SANDBOXOSES },
62
+ { key: 'arch', label: label('home.chips.arch'), items: SANDBOXARCHES },
63
+ ];
64
+ }
65
+ /** the surfaces ledger: one engine, three shells (the labels ride the store). */
66
+ function surfaces() {
67
+ return [
68
+ {
69
+ index: '01',
70
+ icon: Cable,
71
+ title: label('home.surface.browser.title'),
72
+ body: label('home.surface.browser.body'),
73
+ href: '/agent-browser',
74
+ },
75
+ {
76
+ index: '02',
77
+ icon: Layers3,
78
+ title: label('home.surface.compute.title'),
79
+ body: label('home.surface.compute.body'),
80
+ href: '/compute',
81
+ },
82
+ {
83
+ index: '03',
84
+ icon: Package,
85
+ title: label('home.surface.packages.title'),
86
+ body: label('home.surface.packages.body'),
87
+ href: '/integrations',
88
+ },
89
+ ];
90
+ }
91
+ /** the 01–03 steps of the landing: declare → boot → keep. */
92
+ function steps() {
93
+ return [
94
+ {
95
+ index: '01',
96
+ title: label('home.steps.declare.title'),
97
+ body: label('home.steps.declare.body'),
98
+ },
99
+ {
100
+ index: '02',
101
+ title: label('home.steps.boot.title'),
102
+ body: label('home.steps.boot.body'),
103
+ href: '/console',
104
+ },
105
+ {
106
+ index: '03',
107
+ title: label('home.steps.keep.title'),
108
+ body: label('home.steps.keep.body'),
109
+ href: '/dashboard',
110
+ },
111
+ ];
112
+ }
113
+ /** the footer meta-quad: the four moves of the platform. */
114
+ function quad() {
115
+ return [
116
+ {
117
+ index: '01',
118
+ title: label('home.quad.boot.title'),
119
+ body: label('home.quad.boot.body'),
120
+ href: '/console',
121
+ },
122
+ {
123
+ index: '02',
124
+ title: label('home.quad.operate.title'),
125
+ body: label('home.quad.operate.body'),
126
+ href: '/dashboard',
127
+ },
128
+ {
129
+ index: '03',
130
+ title: label('home.quad.chain.title'),
131
+ body: label('home.quad.chain.body'),
132
+ href: '/compute',
133
+ },
134
+ {
135
+ index: '04',
136
+ title: label('home.quad.thesis.title'),
137
+ body: label('home.quad.thesis.body'),
138
+ href: '/architecture',
139
+ },
140
+ ];
141
+ }
142
+ /** the landing surface: the hero stage, the ledgers and the footer quad
143
+ * (mounted only when the entry gate lets the flow through). */
144
+ function HomeSurface() {
145
+ const [, navigate] = useLocation();
146
+ const [media, setMedia] = useState([]);
147
+ const [draft, setDraft] = useState('');
148
+ useEffect(() => {
149
+ void mediaSlots().then(setMedia);
150
+ }, []);
151
+ const runtimeSlot = media.find((slot) => slot.id === 'media.runtime.map');
152
+ /** the live parse: chips and the typed draft share one source of truth. */
153
+ const parsed = useMemo(() => parsedraft(draft), [draft]);
154
+ const declaredbits = [
155
+ parsed.base !== null ? labelfill('home.declared.base', { value: parsed.base }) : null,
156
+ parsed.os !== null ? labelfill('home.declared.guest', { value: parsed.os }) : null,
157
+ parsed.arch !== null ? labelfill('home.declared.arch', { value: parsed.arch }) : null,
158
+ ].filter(Boolean);
159
+ const declaredline = declaredbits.length > 0
160
+ ? labelfill('home.declared.line', { parts: declaredbits.join(' · ') })
161
+ : label('home.declared.none');
162
+ /** toggles one vocabulary token inside the draft line. */
163
+ const toggletoken = (token) => {
164
+ setDraft((prev) => {
165
+ const words = prev
166
+ .toLowerCase()
167
+ .split(/[^a-z0-9]+/)
168
+ .filter(Boolean);
169
+ const next = words.includes(token)
170
+ ? words.filter((word) => word !== token)
171
+ : [...words, token];
172
+ return next.join(' · ');
173
+ });
174
+ };
175
+ /** the boot key: parse, hand the declaration over, open the console. */
176
+ const spin = () => {
177
+ try {
178
+ sessionStorage.setItem(DECLARED_KEY, JSON.stringify(parsedraft(draft)));
179
+ }
180
+ catch {
181
+ /* storage unavailable: the boot key still navigates */
182
+ }
183
+ navigate('/console');
184
+ };
185
+ /** the sandbox matrix: the three bases over the documented bootstrap limits. */
186
+ const limits = specenvlimits({}).bases;
187
+ const matrixrows = ['lite', 'balanced', 'max'].map((id) => {
188
+ const row = limits[id];
189
+ return {
190
+ id,
191
+ featured: id === 'max',
192
+ guests: labelfill('home.matrix.guests', { n: String(SANDBOXOSES.length) }),
193
+ arch: label('home.matrix.archValue'),
194
+ vgpu: row.maxvgpus === 0
195
+ ? label('home.matrix.vgpuNone')
196
+ : labelfill(row.maxvgpus === 1 ? 'home.matrix.vgpuOne' : 'home.matrix.vgpuMany', { n: String(row.maxvgpus) }),
197
+ ceiling: labelfill('home.matrix.ceiling', {
198
+ vcpus: String(row.maxvcpus),
199
+ ram: String(row.maxramgb),
200
+ disk: String(row.maxdiskgb),
201
+ minutes: String(Math.round(row.maxtimeoutseconds / 60)),
202
+ }),
203
+ };
204
+ });
205
+ return (_jsxs("div", { className: "site-frame home-page", children: [_jsxs("main", { children: [_jsx("section", { className: "r3-hero halftone", "aria-labelledby": "r3herotitle", children: _jsxs("div", { className: "r3-hero-inner", children: [_jsxs("div", { className: "r3-hero-copy", children: [_jsxs("p", { className: "eyebrow r3-hero-eyebrow", children: [_jsx("span", { className: "status-dot" }), " ", label('home.hero.eyebrow')] }), _jsxs("h1", { className: "r3-display", id: "r3herotitle", children: [label('home.hero.titleLine1'), _jsx("br", {}), _jsx("em", { children: label('home.hero.titleLine2') })] }), _jsx("p", { className: "r3-hero-lede", children: label('home.hero.lede') }), _jsxs("form", { className: "r3-prompt", "aria-label": label('home.hero.formAria'), onSubmit: (event) => {
206
+ event.preventDefault();
207
+ spin();
208
+ }, children: [_jsx("label", { className: "r3-prompt-label", htmlFor: "r3declare", children: label('home.hero.declareLabel') }), _jsx("input", { id: "r3declare", className: "r3-prompt-input", type: "text", value: draft, placeholder: label('home.hero.placeholder'), spellCheck: false, autoComplete: "off", onChange: (event) => setDraft(event.target.value) }), _jsxs("button", { className: "r3-prompt-key", type: "submit", children: [label('home.hero.boot'), _jsx(ArrowDownRight, { fontSize: 15, "aria-hidden": "true" })] })] }), _jsxs("fieldset", { className: "r3-chips", children: [_jsx("legend", { className: "r3-chips-legend", children: label('home.hero.chipsLegend') }), chipgroups().map((group) => (_jsxs("div", { className: "r3-chipgroup", children: [_jsx("span", { className: "r3-chipgroup-label", children: group.label }), group.items.map((token) => (_jsx("button", { type: "button", className: parsed[group.key] === token ? 'r3-chip is-on' : 'r3-chip', "aria-pressed": parsed[group.key] === token, onClick: () => toggletoken(token), children: token }, token)))] }, group.key)))] }), _jsx("p", { className: "r3-declared", role: "status", "aria-live": "polite", children: declaredline })] }), _jsxs("aside", { className: "r3-matrix", "aria-label": label('home.matrix.aria'), children: [_jsxs("div", { className: "r3-matrix-head", children: [_jsx("span", { children: label('home.matrix.title') }), _jsx("span", { className: "mono-label", children: label('home.matrix.subtitle') })] }), _jsxs("table", { className: "r3-matrix-table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { scope: "col", children: label('home.matrix.colBase') }), _jsx("th", { scope: "col", children: label('home.matrix.colGuests') }), _jsx("th", { scope: "col", children: label('home.matrix.colArch') }), _jsx("th", { scope: "col", children: label('home.matrix.colVgpu') }), _jsx("th", { scope: "col", children: label('home.matrix.colCeiling') })] }) }), _jsx("tbody", { children: matrixrows.map((row) => (_jsxs("tr", { className: row.featured ? 'is-featured' : undefined, children: [_jsx("th", { scope: "row", children: row.id }), _jsx("td", { children: row.guests }), _jsx("td", { children: row.arch }), _jsx("td", { children: row.vgpu }), _jsx("td", { children: row.ceiling })] }, row.id))) })] }), _jsx("p", { className: "r3-matrix-note", children: labelfill('home.matrix.note', { oses: SANDBOXOSES.join(' · ') }) })] })] }) }), _jsx("section", { className: "metric-section container", children: _jsx(MetricStrip, { metrics: [
209
+ {
210
+ value: String(SANDBOXBASES.length).padStart(2, '0'),
211
+ label: label('home.metric.bases.label'),
212
+ detail: label('home.metric.bases.detail'),
213
+ },
214
+ {
215
+ value: label('home.metric.storage.value'),
216
+ label: label('home.metric.storage.label'),
217
+ detail: label('home.metric.storage.detail'),
218
+ },
219
+ {
220
+ value: String(SANDBOXFORMS.length).padStart(2, '0'),
221
+ label: label('home.metric.forms.label'),
222
+ detail: label('home.metric.forms.detail'),
223
+ },
224
+ ] }) }), _jsxs("section", { id: "thesis", className: "thesis-section container section-with-rail", children: [_jsx(SectionRail, { number: "01", label: label('home.thesis.railLabel') }), _jsxs("div", { className: "thesis-content", children: [_jsx("p", { className: "eyebrow", children: label('home.thesis.eyebrow') }), _jsxs("h2", { className: "section-title", children: [label('home.thesis.title'), _jsx("span", { children: label('home.thesis.titleAccent') })] }), _jsxs("div", { className: "thesis-grid", children: [_jsxs("p", { children: [label('home.thesis.bodyLead'), _jsx("b", { children: label('home.thesis.keep') }), label('home.thesis.join'), _jsx("b", { children: label('home.thesis.process') }), label('home.thesis.bodyTail')] }), _jsxs("div", { className: "evidence-card", children: [_jsxs("div", { className: "evidence-card-head", children: [_jsx(Command, { fontSize: 16 }), _jsx("span", { children: label('home.evidence.head') }), _jsx("span", { className: "card-index", children: label('home.evidence.index') })] }), _jsxs("div", { className: "evidence-equation", children: [_jsx("span", { children: label('home.evidence.storage') }), _jsx("b", { children: label('home.evidence.equals') }), _jsx("span", { children: label('home.evidence.memory') })] }), _jsxs("div", { className: "evidence-card-foot", children: [_jsx("span", { children: label('home.evidence.difference') }), _jsx("b", { children: label('home.evidence.usageFlag') })] })] })] })] })] }), _jsx("section", { className: "runtime-section", children: _jsxs("div", { className: "container section-with-rail", children: [_jsx(SectionRail, { number: "02", label: label('home.chain.railLabel') }), _jsxs("div", { className: "runtime-content", children: [_jsxs("div", { className: "section-heading-row", children: [_jsxs("div", { children: [_jsx("p", { className: "eyebrow", children: label('home.chain.eyebrow') }), _jsx("h2", { className: "section-title", children: label('home.chain.title') })] }), _jsxs(Link, { href: "/architecture", className: "small-arrow-link", children: [label('home.chain.archLink'), _jsx(MoveRight, { fontSize: 15 })] })] }), _jsxs("div", { className: "runtime-layout", children: [_jsx(RuntimeDiagram, {}), _jsxs("div", { className: "runtime-art-frame", children: [runtimeSlot && (_jsx("figure", { className: "media-area", style: { aspectRatio: runtimeSlot.ratio }, "aria-label": label('home.media.area'), children: _jsxs("figcaption", { children: [_jsx("span", { children: runtimeSlot.label }), _jsx("span", { children: runtimeSlot.caption })] }) })), _jsx("span", { children: label('home.chain.fig') })] })] })] })] }) }), _jsxs("section", { className: "surfaces-section container section-with-rail", children: [_jsx(SectionRail, { number: "03", label: label('home.surfaces.railLabel') }), _jsxs("div", { className: "surfaces-content", children: [_jsxs("div", { className: "section-heading-row", children: [_jsxs("div", { children: [_jsx("p", { className: "eyebrow", children: label('home.surfaces.eyebrow') }), _jsxs("h2", { className: "section-title", children: [label('home.surfaces.titleLine1'), _jsx("br", {}), label('home.surfaces.titleLine2')] })] }), _jsx("span", { className: "mono-label", children: labelfill('home.surfaces.available', {
225
+ n: String(surfaces().length).padStart(2, '0'),
226
+ }) })] }), _jsx("div", { className: "surface-list", children: surfaces().map((surface) => {
227
+ const Icon = surface.icon;
228
+ return (_jsxs(Link, { className: "surface-row", href: surface.href, children: [_jsx("span", { className: "surface-number", children: surface.index }), _jsx(Icon, { fontSize: 21, strokeWidth: 1.5, "aria-hidden": "true" }), _jsxs("div", { className: "surface-copy", children: [_jsx("h3", { children: surface.title }), _jsx("p", { children: surface.body })] }), _jsx(ArrowUpRight, { className: "surface-arrow", fontSize: 18, "aria-hidden": "true" })] }, surface.title));
229
+ }) })] })] }), _jsx("section", { className: "r3-steps container", "aria-label": label('home.steps.aria'), children: steps().map((step) => (_jsxs("div", { className: "r3-step", children: [_jsx("span", { className: "r3-step-index", children: step.index }), _jsx("h3", { className: "r3-step-title", children: step.title }), _jsx("p", { className: "r3-step-body", children: step.body }), step.href && (_jsxs(Link, { className: "r3-step-link", href: step.href, children: [labelfill('home.steps.link', { title: step.title }), _jsx(ArrowUpRight, { fontSize: 14, "aria-hidden": "true" })] }))] }, step.index))) })] }), _jsxs("footer", { className: "r3-quad", children: [_jsx("div", { className: "r3-quad-grid container", children: quad().map((cell) => (_jsxs(Link, { className: "r3-quad-cell", href: cell.href, children: [_jsx("span", { className: "r3-quad-index", children: cell.index }), _jsx("span", { className: "r3-quad-title", children: cell.title }), _jsx("span", { className: "r3-quad-body", children: cell.body })] }, cell.index))) }), _jsxs("div", { className: "site-footer container", children: [_jsx("span", { children: label('home.footer.copyright') }), _jsx("span", { className: "mono-label", children: label('home.footer.mono') })] })] })] }));
230
+ }
231
+ /**
232
+ * The home page anchor: the entry gate rides the surface — the flow law
233
+ * (intro → onboarding → the platform) is consulted before the home shows.
234
+ *
235
+ * @returns the gated home element.
236
+ */
237
+ export default function Home() {
238
+ return (_jsx(EntryGate, { children: _jsx(HomeSurface, {}) }));
239
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * integrations page anchor — layer 3 of the anchor architecture.
3
+ * The file carrying the folder's own name is the path manager of the page:
4
+ * it imports the loose components beside it, mounts the page and re-exports
5
+ * the public component surface. Only the theme anchor (Sol/Sol.tsx) consumes
6
+ * this file. This anchor carries the former main component of the folder,
7
+ * which now lives here as the page mount itself.
8
+ */
9
+ export default function Integrations(): import("react").JSX.Element;
@@ -0,0 +1,83 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * integrations page anchor — layer 3 of the anchor architecture.
4
+ * The file carrying the folder's own name is the path manager of the page:
5
+ * it imports the loose components beside it, mounts the page and re-exports
6
+ * the public component surface. Only the theme anchor (Sol/Sol.tsx) consumes
7
+ * this file. This anchor carries the former main component of the folder,
8
+ * which now lives here as the page mount itself.
9
+ */
10
+ // Signal & Ledger: integrations as surfaces of the same engine, not
11
+ // disconnected products. The glyphs are presentation code; every word rides
12
+ // the label store (labels.ts — the copy law).
13
+ import { FoodAppleRegular as Apple, BotRegular as Bot, BoxRegular as Box, BoxRegular as Container, BranchForkRegular as GitBranch, GlobeRegular as Globe, PhoneRegular as Smartphone, WindowConsoleRegular as Terminal, } from '@fluentui/react-icons';
14
+ import { PageShell } from '../shell/Shell.tsx';
15
+ import { label, labelfill } from '../../labels.ts';
16
+ /** the surface groups: the glyph is presentation code, the group and item
17
+ * words ride the store (integrations.group.* / integrations.item.*). */
18
+ const integrationGroups = [
19
+ {
20
+ labelkey: 'integrations.group.package.label',
21
+ items: [
22
+ {
23
+ icon: Box,
24
+ namekey: 'integrations.item.npm.name',
25
+ bodykey: 'integrations.item.npm.body',
26
+ },
27
+ {
28
+ icon: Terminal,
29
+ namekey: 'integrations.item.cli.name',
30
+ bodykey: 'integrations.item.cli.body',
31
+ },
32
+ {
33
+ icon: Container,
34
+ namekey: 'integrations.item.container.name',
35
+ bodykey: 'integrations.item.container.body',
36
+ },
37
+ ],
38
+ },
39
+ {
40
+ labelkey: 'integrations.group.client.label',
41
+ items: [
42
+ {
43
+ icon: Globe,
44
+ namekey: 'integrations.item.crx.name',
45
+ bodykey: 'integrations.item.crx.body',
46
+ },
47
+ {
48
+ icon: Smartphone,
49
+ namekey: 'integrations.item.mobile.name',
50
+ bodykey: 'integrations.item.mobile.body',
51
+ },
52
+ {
53
+ icon: Apple,
54
+ namekey: 'integrations.item.desktop.name',
55
+ bodykey: 'integrations.item.desktop.body',
56
+ },
57
+ ],
58
+ },
59
+ {
60
+ labelkey: 'integrations.group.bot.label',
61
+ items: [
62
+ {
63
+ icon: GitBranch,
64
+ namekey: 'integrations.item.forge.name',
65
+ bodykey: 'integrations.item.forge.body',
66
+ },
67
+ { icon: Bot, namekey: 'integrations.item.n8n.name', bodykey: 'integrations.item.n8n.body' },
68
+ {
69
+ icon: Terminal,
70
+ namekey: 'integrations.item.webhook.name',
71
+ bodykey: 'integrations.item.webhook.body',
72
+ },
73
+ ],
74
+ },
75
+ ];
76
+ export default function Integrations() {
77
+ return (_jsxs(PageShell, { section: label('integrations.shell.section'), label: label('integrations.shell.label'), title: label('integrations.shell.title'), intro: label('integrations.shell.intro'), children: [_jsxs("section", { className: "content-section split-content", children: [_jsxs("div", { children: [_jsx("p", { className: "eyebrow", children: label('integrations.split.eyebrow') }), _jsx("h2", { className: "section-title", children: label('integrations.split.title') })] }), _jsxs("div", { className: "prose-copy", children: [_jsx("p", { children: label('integrations.split.body1') }), _jsx("p", { children: label('integrations.split.body2') })] })] }), _jsx("section", { className: "content-section integration-groups", children: integrationGroups.map((group) => (_jsxs("div", { className: "integration-group", children: [_jsxs("div", { className: "content-section-heading", children: [_jsx("p", { className: "eyebrow", children: label(group.labelkey) }), _jsx("span", { className: "mono-label", children: labelfill('integrations.group.mono', {
78
+ n: String(group.items.length),
79
+ }) })] }), _jsx("div", { className: "integration-grid", children: group.items.map((item) => {
80
+ const Icon = item.icon;
81
+ return (_jsxs("div", { className: "integration-card", children: [_jsx(Icon, { fontSize: 20, strokeWidth: 1.5 }), _jsx("strong", { children: label(item.namekey) }), _jsx("span", { children: label(item.bodykey) })] }, item.namekey));
82
+ }) })] }, group.labelkey))) }), _jsxs("section", { className: "content-section integration-quote", children: [_jsx("p", { children: label('integrations.quote.body') }), _jsx("span", { className: "mono-label", children: label('integrations.quote.mono') })] })] }));
83
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The intro page: the brand lands, holds ~1.6s, slides up and hands the
3
+ * surface to the onboarding. Click, any key or reduced motion skips.
4
+ *
5
+ * @returns the intro element (null while the seen state resolves).
6
+ */
7
+ export default function Intro(): import("react").JSX.Element;
@@ -0,0 +1,102 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // the saddle intro of the theme.
3
+ /**
4
+ * intro.tsx — the opening splash of the APPLICATION: the akash floor. The
5
+ * drawn mark lands with the Akash spring (the overshoot curve
6
+ * cubic-bezier(.34,1.56,.64,1)), the name rises with the backOut lift and
7
+ * the honest role line fades in under the 1.6s hold. The exit slides the
8
+ * whole stage up over 0.8s (cubic-bezier(0.76,0,0.24,1)) and hands the
9
+ * surface DIRECTLY to the onboarding at /onboarding — the intro itself
10
+ * advances the flow. No loading dots, no spinner: the mark speaks. A click,
11
+ * any key or prefers-reduced-motion skips. The seen flags ride the one
12
+ * accessor (onboardingstate.ts — the database, the offline cache, the
13
+ * memory): while the state resolves the page renders null, a finished flow
14
+ * replaces straight back to the home (the close-caption relaunch lands
15
+ * there, the intro never replays) and a mid-flow visitor resumes at
16
+ * /onboarding.
17
+ */
18
+ import { useCallback, useEffect, useRef, useState } from 'react';
19
+ import { useLocation } from 'wouter';
20
+ import { loadOnboardingState, markIntroSeen, readOnboardingState, } from '../../onboardingstate.ts';
21
+ import { label } from '../../labels.ts';
22
+ import { SaddleMark } from '../shell/Shell.tsx';
23
+ /** how long the brand holds before the exit (ms) — the doctrine asks ~1.6s */
24
+ const HOLD_MS = 1600;
25
+ /** how long the slide-up exit runs before the hand-over (ms) */
26
+ const LEAVE_MS = 800;
27
+ /**
28
+ * The intro page: the brand lands, holds ~1.6s, slides up and hands the
29
+ * surface to the onboarding. Click, any key or reduced motion skips.
30
+ *
31
+ * @returns the intro element (null while the seen state resolves).
32
+ */
33
+ export default function Intro() {
34
+ const [, navigate] = useLocation();
35
+ const [phase, setPhase] = useState('pending');
36
+ const seenRef = useRef({ introseen: false, onboardingseen: false });
37
+ const leftRef = useRef(false);
38
+ /** the hand-over route: the onboarding, unless the flow already finished. */
39
+ const handover = useCallback(() => (seenRef.current.onboardingseen ? '/' : '/onboarding'), []);
40
+ /** the leave: the intro counts as seen (leaving counts — the visitor
41
+ * answered the stage), the stage slides, the hand-over follows. One
42
+ * guarded run — the skip listeners and the hold timer share it. */
43
+ const leave = useCallback(() => {
44
+ if (leftRef.current)
45
+ return;
46
+ leftRef.current = true;
47
+ markIntroSeen();
48
+ setPhase('leaving');
49
+ window.setTimeout(() => navigate(handover()), LEAVE_MS);
50
+ }, [handover, navigate]);
51
+ useEffect(() => {
52
+ let live = true;
53
+ const known = readOnboardingState();
54
+ if (known)
55
+ seenRef.current = known;
56
+ loadOnboardingState().then((state) => {
57
+ if (!live)
58
+ return;
59
+ seenRef.current = state;
60
+ // the flow law: a finished visitor never replays the opening (the
61
+ // close-caption relaunch lands home); a mid-flow one resumes ahead
62
+ if (state.onboardingseen)
63
+ navigate('/', { replace: true });
64
+ else if (state.introseen)
65
+ navigate('/onboarding', { replace: true });
66
+ else
67
+ setPhase('playing');
68
+ });
69
+ return () => {
70
+ live = false;
71
+ };
72
+ }, [navigate]);
73
+ useEffect(() => {
74
+ if (phase !== 'playing')
75
+ return;
76
+ // reduced motion skips the choreography and hands over at once
77
+ if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
78
+ if (!leftRef.current) {
79
+ leftRef.current = true;
80
+ markIntroSeen();
81
+ navigate(handover());
82
+ }
83
+ return;
84
+ }
85
+ const hold = window.setTimeout(leave, HOLD_MS);
86
+ const skip = (event) => {
87
+ if (event.type === 'keydown' || event.button === 0)
88
+ leave();
89
+ };
90
+ window.addEventListener('keydown', skip);
91
+ window.addEventListener('pointerdown', skip);
92
+ return () => {
93
+ window.clearTimeout(hold);
94
+ window.removeEventListener('keydown', skip);
95
+ window.removeEventListener('pointerdown', skip);
96
+ };
97
+ }, [handover, leave, navigate, phase]);
98
+ // the state read holds the page: nothing renders, the canvas alone shows — no flash
99
+ if (phase === 'pending')
100
+ return null;
101
+ return (_jsxs("div", { className: "winintro", "data-leaving": phase === 'leaving' ? 'true' : undefined, role: "status", "aria-label": label('intro.status'), children: [_jsxs("div", { className: "winintro__stage", children: [_jsx("span", { className: "winintro__mark", "aria-hidden": "true", children: _jsx(SaddleMark, { size: 96 }) }), _jsx("h1", { className: "winintro__name", children: label('intro.name') }), _jsx("p", { className: "winintro__role", children: label('intro.role') })] }), _jsx("p", { className: "winintro__skip", "aria-hidden": "true", children: label('intro.skip') })] }));
102
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * login page anchor — layer 3 of the anchor architecture.
3
+ * The file carrying the folder's own name is the path manager of the page:
4
+ * it imports the loose components beside it, mounts the page and re-exports
5
+ * the public component surface. Only the theme anchor (Sol/Sol.tsx) consumes
6
+ * this file. This anchor carries the former main component of the folder,
7
+ * which now lives here as the page mount itself.
8
+ */
9
+ export * from '../wingets';
10
+ /** meta description carried by the absorbed static page. */
11
+ export declare const loginpagedescription = "saddle sign in: username and password only, session in a secure cookie";
12
+ /**
13
+ * the sign-in page frame: brand lockup, the instrument card (form beside
14
+ * the trust rail) and the static-edge footer notes.
15
+ */
16
+ export default function Login(): import("react").JSX.Element;
@@ -0,0 +1,49 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * login page anchor — layer 3 of the anchor architecture.
4
+ * The file carrying the folder's own name is the path manager of the page:
5
+ * it imports the loose components beside it, mounts the page and re-exports
6
+ * the public component surface. Only the theme anchor (Sol/Sol.tsx) consumes
7
+ * this file. This anchor carries the former main component of the folder,
8
+ * which now lives here as the page mount itself.
9
+ */
10
+ // Sign-in page: faithful absorption of login.html — the account panel with
11
+ // the login form, the api status line and the project footer. the session
12
+ // is carried exclusively by the saddlesession cookie (nothing sensitive is
13
+ // ever stored in localstorage). R3-saddle: one instrument card with an
14
+ // asymmetric interior — the form (1.2fr) beside the trust rail (1fr) that
15
+ // carries the real session facts; 44px inputs, the sand focus ring.
16
+ import { Link } from 'wouter';
17
+ import { label } from '../../labels.ts';
18
+ import { LoginForm as LoginForm } from '../wingets';
19
+ export * from '../wingets';
20
+ /** meta description carried by the absorbed static page. */
21
+ export const loginpagedescription = 'saddle sign in: username and password only, session in a secure cookie';
22
+ /** the real session facts of the trust rail: the labels ride the store. */
23
+ function trustfacts() {
24
+ return [
25
+ {
26
+ label: label('login.trust.sessionLabel'),
27
+ body: label('login.trust.sessionBody'),
28
+ },
29
+ {
30
+ label: label('login.trust.transportLabel'),
31
+ body: label('login.trust.transportBody'),
32
+ },
33
+ {
34
+ label: label('login.trust.errorsLabel'),
35
+ body: label('login.trust.errorsBody'),
36
+ },
37
+ {
38
+ label: label('login.trust.fallbackLabel'),
39
+ body: label('login.trust.fallbackBody'),
40
+ },
41
+ ];
42
+ }
43
+ /**
44
+ * the sign-in page frame: brand lockup, the instrument card (form beside
45
+ * the trust rail) and the static-edge footer notes.
46
+ */
47
+ export default function Login() {
48
+ return (_jsx("div", { className: "auth-frame", children: _jsxs("div", { className: "r3-authcard", children: [_jsxs("header", { className: "auth-head", children: [_jsx(Link, { href: "/", className: "brand-lockup", children: _jsx("span", { className: "brand-wordmark", children: label('login.brand') }) }), _jsx("span", { className: "auth-tagline", children: label('login.tagline') })] }), _jsxs("main", { className: "r3-authgrid", children: [_jsxs("section", { className: "auth-panel", "aria-labelledby": "formtitle", children: [_jsx("h2", { className: "auth-panel-title", id: "formtitle", children: label('login.panel.title') }), _jsx(LoginForm, {})] }), _jsxs("aside", { className: "r3-authtrust", "aria-label": label('login.trust.aria'), children: [_jsx("p", { className: "eyebrow", children: label('login.trust.eyebrow') }), _jsx("ul", { className: "r3-trustlist", children: trustfacts().map((fact) => (_jsxs("li", { className: "r3-trustfact", children: [_jsx("span", { className: "r3-trustlabel", children: fact.label }), _jsx("span", { className: "r3-trustbody", children: fact.body })] }, fact.label))) })] })] }), _jsxs("footer", { className: "auth-foot", children: [_jsx("span", { children: label('login.footer.cookie') }), _jsx("span", { className: "auth-foot-right", children: label('login.footer.api') })] })] }) }));
49
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * notfound page anchor — layer 3 of the anchor architecture.
3
+ * The file carrying the folder's own name is the path manager of the page:
4
+ * it imports the loose components beside it, mounts the page and re-exports
5
+ * the public component surface. Only the theme anchor (Sol/Sol.tsx) consumes
6
+ * this file. This anchor carries the former main component of the folder,
7
+ * which now lives here as the page mount itself.
8
+ */
9
+ export default function NotFound(): import("react").JSX.Element;
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * notfound page anchor — layer 3 of the anchor architecture.
4
+ * The file carrying the folder's own name is the path manager of the page:
5
+ * it imports the loose components beside it, mounts the page and re-exports
6
+ * the public component surface. Only the theme anchor (Sol/Sol.tsx) consumes
7
+ * this file. This anchor carries the former main component of the folder,
8
+ * which now lives here as the page mount itself.
9
+ */
10
+ // # NotFound — the 404 of the saddle theme: a route the static edge never mapped.
11
+ import { Link } from 'wouter';
12
+ import { label } from '../../labels.ts';
13
+ export default function NotFound() {
14
+ return (_jsx("div", { className: "site-frame notfound-page", children: _jsx("main", { children: _jsxs("section", { className: "container notfound-frame", children: [_jsx("p", { className: "eyebrow", children: label('notfound.eyebrow') }), _jsx("h1", { children: label('notfound.title') }), _jsx("p", { children: label('notfound.body') }), _jsxs("div", { className: "notfound-actions", children: [_jsx(Link, { href: "/", className: "button button-primary", children: label('notfound.backHome') }), _jsx(Link, { href: "/agent-browser", className: "button", children: label('notfound.agentBrowser') })] })] }) }) }));
15
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * onboarding.tsx — the first-run steps of the APPLICATION (the family
3
+ * window recipe): three short frames presented like a Windows 11 first-run
4
+ * dialog over the canvas backdrop — what the app IS (the honest role: the
5
+ * sandbox engine of the family, not an operating system), what it DOES
6
+ * (the surfaces the window hosts — console, playground, compute and the
7
+ * agent browser over the storage == compute engine — read straight from
8
+ * the rail map) and the ENTER frame with the hand-over button. The finish
9
+ * AND the skip mark onboarding seen through the one accessor
10
+ * (onboardingstate.ts — seen = may skip; the flow is never forced again)
11
+ * and navigate to "/" so the window takes over. Frames remount on step
12
+ * change so the 250ms entry plays each time; reduced motion rides the
13
+ * stylesheet hard stop. No opt-in switches here: the app holds no account
14
+ * write and no visitor storage beyond the shared onboarding state. Every
15
+ * word of the dialog rides the label store (labels.ts — the copy law):
16
+ * the three frame names arrive as the onboarding.steps row the page
17
+ * splits, so no fixed step array lives in the component.
18
+ */
19
+ /**
20
+ * The onboarding page: a three-step first-run dialog that hands the
21
+ * surface to the home of the window.
22
+ *
23
+ * @returns the onboarding element.
24
+ */
25
+ export default function Onboarding(): import("react").JSX.Element;