@almadar/shell-web 0.0.0-stage → 1.0.0

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 (266) hide show
  1. package/bundling.d.mts +18 -0
  2. package/bundling.mjs +28 -0
  3. package/dist/ArbitraryClassCompiler-CO_iASBn.d.ts +195 -0
  4. package/dist/AvlGlyph-EPJKFEO3.js +6 -0
  5. package/dist/AvlStateMachine-RKZIKNGC.js +9 -0
  6. package/dist/AvlTransitionDetail-63SD6GZF.js +11 -0
  7. package/dist/AvlTransitionExplainer-ZBTLOM3T.js +12 -0
  8. package/dist/BehaviorView-YS5G4GNB.js +11 -0
  9. package/dist/Canvas3DHost-BkZQB5l2.d.ts +552 -0
  10. package/dist/EventBusProvider-BFFHfN4O.d.ts +296 -0
  11. package/dist/FileTree-BCFnBEuQ.d.ts +254 -0
  12. package/dist/FlowCanvas-3JRMNJLV.css +1756 -0
  13. package/dist/FlowCanvas-AUMTWMNG.js +26 -0
  14. package/dist/GameAudioProvider-ceM_n0ey.d.ts +90 -0
  15. package/dist/KaTeX_AMS-Regular-CYEKBG2K.woff +0 -0
  16. package/dist/KaTeX_AMS-Regular-JKX5W2C4.ttf +0 -0
  17. package/dist/KaTeX_AMS-Regular-U6PRYMIZ.woff2 +0 -0
  18. package/dist/KaTeX_Caligraphic-Bold-5QL5CMTE.woff2 +0 -0
  19. package/dist/KaTeX_Caligraphic-Bold-WZ3QSGD3.woff +0 -0
  20. package/dist/KaTeX_Caligraphic-Bold-ZTS3R3HK.ttf +0 -0
  21. package/dist/KaTeX_Caligraphic-Regular-3LKEU76G.woff +0 -0
  22. package/dist/KaTeX_Caligraphic-Regular-A7XRTZ5Q.ttf +0 -0
  23. package/dist/KaTeX_Caligraphic-Regular-KX5MEWCF.woff2 +0 -0
  24. package/dist/KaTeX_Fraktur-Bold-2QVFK6NQ.woff2 +0 -0
  25. package/dist/KaTeX_Fraktur-Bold-T4SWXBMT.woff +0 -0
  26. package/dist/KaTeX_Fraktur-Bold-WGHVTYOR.ttf +0 -0
  27. package/dist/KaTeX_Fraktur-Regular-2PEIFJSJ.woff2 +0 -0
  28. package/dist/KaTeX_Fraktur-Regular-5U4OPH2X.ttf +0 -0
  29. package/dist/KaTeX_Fraktur-Regular-PQMHCIK6.woff +0 -0
  30. package/dist/KaTeX_Main-Bold-2GA4IZIN.woff +0 -0
  31. package/dist/KaTeX_Main-Bold-W5FBVCZM.ttf +0 -0
  32. package/dist/KaTeX_Main-Bold-YP5VVQRP.woff2 +0 -0
  33. package/dist/KaTeX_Main-BoldItalic-4P4C7HJH.woff +0 -0
  34. package/dist/KaTeX_Main-BoldItalic-N4V3DX7S.woff2 +0 -0
  35. package/dist/KaTeX_Main-BoldItalic-ODMLBJJQ.ttf +0 -0
  36. package/dist/KaTeX_Main-Italic-I43T2HSR.ttf +0 -0
  37. package/dist/KaTeX_Main-Italic-RELBIK7M.woff2 +0 -0
  38. package/dist/KaTeX_Main-Italic-SASNQFN2.woff +0 -0
  39. package/dist/KaTeX_Main-Regular-ARRPAO67.woff2 +0 -0
  40. package/dist/KaTeX_Main-Regular-P5I74A2A.woff +0 -0
  41. package/dist/KaTeX_Main-Regular-W74P5G27.ttf +0 -0
  42. package/dist/KaTeX_Math-BoldItalic-6EBV3DK5.woff +0 -0
  43. package/dist/KaTeX_Math-BoldItalic-K4WTGH3J.woff2 +0 -0
  44. package/dist/KaTeX_Math-BoldItalic-VB447A4D.ttf +0 -0
  45. package/dist/KaTeX_Math-Italic-6KGCHLFN.woff2 +0 -0
  46. package/dist/KaTeX_Math-Italic-KKK3USB2.woff +0 -0
  47. package/dist/KaTeX_Math-Italic-SON4MRCA.ttf +0 -0
  48. package/dist/KaTeX_SansSerif-Bold-RRNVJFFW.woff2 +0 -0
  49. package/dist/KaTeX_SansSerif-Bold-STQ6RXC7.ttf +0 -0
  50. package/dist/KaTeX_SansSerif-Bold-X5M5EMOD.woff +0 -0
  51. package/dist/KaTeX_SansSerif-Italic-HMPFTM52.woff2 +0 -0
  52. package/dist/KaTeX_SansSerif-Italic-PSN4QKYX.woff +0 -0
  53. package/dist/KaTeX_SansSerif-Italic-WTBAZBGY.ttf +0 -0
  54. package/dist/KaTeX_SansSerif-Regular-2TL3USAE.ttf +0 -0
  55. package/dist/KaTeX_SansSerif-Regular-OQCII6EP.woff +0 -0
  56. package/dist/KaTeX_SansSerif-Regular-XIQ62X4E.woff2 +0 -0
  57. package/dist/KaTeX_Script-Regular-72OLXYNA.ttf +0 -0
  58. package/dist/KaTeX_Script-Regular-A5IFOEBS.woff +0 -0
  59. package/dist/KaTeX_Script-Regular-APUWIHLP.woff2 +0 -0
  60. package/dist/KaTeX_Size1-Regular-4HRHTS65.woff +0 -0
  61. package/dist/KaTeX_Size1-Regular-5LRUTBFT.woff2 +0 -0
  62. package/dist/KaTeX_Size1-Regular-7K6AASVL.ttf +0 -0
  63. package/dist/KaTeX_Size2-Regular-222HN3GT.ttf +0 -0
  64. package/dist/KaTeX_Size2-Regular-K5ZHAIS6.woff +0 -0
  65. package/dist/KaTeX_Size2-Regular-LELKET5D.woff2 +0 -0
  66. package/dist/KaTeX_Size3-Regular-TLFPAHDE.woff +0 -0
  67. package/dist/KaTeX_Size3-Regular-UFCO6WCA.ttf +0 -0
  68. package/dist/KaTeX_Size3-Regular-WQRQ47UD.woff2 +0 -0
  69. package/dist/KaTeX_Size4-Regular-7PGNVPQK.ttf +0 -0
  70. package/dist/KaTeX_Size4-Regular-CDMV7U5C.woff2 +0 -0
  71. package/dist/KaTeX_Size4-Regular-PKMWZHNC.woff +0 -0
  72. package/dist/KaTeX_Typewriter-Regular-3F5K6SQ6.ttf +0 -0
  73. package/dist/KaTeX_Typewriter-Regular-MJMFSK64.woff +0 -0
  74. package/dist/KaTeX_Typewriter-Regular-VBYJ4NRC.woff2 +0 -0
  75. package/dist/KernelEngineContext-CcxGYtlr.d.ts +33 -0
  76. package/dist/LayersPanel-M2LHWUFF.js +6 -0
  77. package/dist/ModuleCard-QHDGK5XK.js +7 -0
  78. package/dist/OrbInspector-MHLJ6OEE.css +1756 -0
  79. package/dist/OrbInspector-QCPEPUPH.js +26 -0
  80. package/dist/Select-B-iDdnvE.d.ts +185 -0
  81. package/dist/ServerBridge-Bqsj-lOU.d.ts +124 -0
  82. package/dist/ThemeContext-DJmO59xd.d.ts +147 -0
  83. package/dist/UISlotContext-Dl_ewwCI.d.ts +79 -0
  84. package/dist/UISlotRenderer-C7WWOK43.js +26 -0
  85. package/dist/UISlotRenderer-KVFO6J7R.css +1756 -0
  86. package/dist/auth/browser/index.d.ts +2 -0
  87. package/dist/auth/browser/index.js +2 -0
  88. package/dist/auth/react/index.d.ts +56 -0
  89. package/dist/auth/react/index.js +157 -0
  90. package/dist/avl/index.css +1756 -0
  91. package/dist/avl/index.d.ts +2248 -0
  92. package/dist/avl/index.js +2693 -0
  93. package/dist/avl-3d-context-BycmO6tG.d.ts +201 -0
  94. package/dist/avl-schema-parser-CtJxJ9KU.d.ts +132 -0
  95. package/dist/avl-zoom-state-CKMVuBFg.d.ts +17 -0
  96. package/dist/chunk-3BBUBJFF.js +339 -0
  97. package/dist/chunk-3S54FWRC.js +131 -0
  98. package/dist/chunk-3VZ36ZKO.js +775 -0
  99. package/dist/chunk-4T3P43NS.js +1133 -0
  100. package/dist/chunk-4YXBKHHM.js +11488 -0
  101. package/dist/chunk-57DC34LY.js +525 -0
  102. package/dist/chunk-5QTYQTPS.js +15 -0
  103. package/dist/chunk-A2LR6VQQ.js +349 -0
  104. package/dist/chunk-AB3X7QTE.js +505 -0
  105. package/dist/chunk-AE7VCQB6.js +561 -0
  106. package/dist/chunk-AGXD77SL.js +98 -0
  107. package/dist/chunk-AU7O65OX.js +66 -0
  108. package/dist/chunk-CPLN6NBQ.js +701 -0
  109. package/dist/chunk-DZBQA2OW.js +176 -0
  110. package/dist/chunk-E6KA4J6N.js +227 -0
  111. package/dist/chunk-EOWMARUB.js +16 -0
  112. package/dist/chunk-G7DCAZ22.js +19 -0
  113. package/dist/chunk-GFXCPUMX.js +1334 -0
  114. package/dist/chunk-HH5KSMH5.js +311 -0
  115. package/dist/chunk-ILQXJ2AR.js +280 -0
  116. package/dist/chunk-ILZ7ORX7.js +432 -0
  117. package/dist/chunk-K4MOPSEL.js +674 -0
  118. package/dist/chunk-LHP2TK7O.js +47587 -0
  119. package/dist/chunk-P4ZFUQFF.js +93 -0
  120. package/dist/chunk-PCR37T3U.js +296 -0
  121. package/dist/chunk-PRXQGGCO.js +580 -0
  122. package/dist/chunk-REXYVBUO.js +191 -0
  123. package/dist/chunk-ROICKAU7.js +24 -0
  124. package/dist/chunk-SP5CDJ6K.js +338 -0
  125. package/dist/chunk-TUPZWTRE.js +1051 -0
  126. package/dist/chunk-TXAUOLWZ.js +490 -0
  127. package/dist/chunk-TZZBINQY.js +82 -0
  128. package/dist/chunk-UTDC2NEA.js +14 -0
  129. package/dist/chunk-UU57VNS2.js +1053 -0
  130. package/dist/chunk-UXLE3IPR.js +421 -0
  131. package/dist/chunk-VO2TTLS5.js +94 -0
  132. package/dist/chunk-X3DMMX27.js +11 -0
  133. package/dist/chunk-YHMRX6YA.js +455 -0
  134. package/dist/components/index.css +1756 -0
  135. package/dist/components/index.d.ts +11299 -0
  136. package/dist/components/index.js +1110 -0
  137. package/dist/context/index.d.ts +8 -0
  138. package/dist/context/index.js +8 -0
  139. package/dist/core.d.ts +2599 -0
  140. package/dist/core.js +3 -0
  141. package/dist/design-classes/index.cjs +431 -0
  142. package/dist/design-classes/index.d.cts +165 -0
  143. package/dist/design-classes/index.d.ts +165 -0
  144. package/dist/design-classes/index.js +399 -0
  145. package/dist/emojiItems-QGSNAABW.js +20 -0
  146. package/dist/fx-CmQjnHmT.d.ts +371 -0
  147. package/dist/hooks/index.d.ts +971 -0
  148. package/dist/hooks/index.js +8 -0
  149. package/dist/index.d.ts +408 -0
  150. package/dist/index.js +178 -0
  151. package/dist/katexPlugin-FA7NX4PE.css +1161 -0
  152. package/dist/katexPlugin-NCDKOOQY.js +2 -0
  153. package/dist/kernel-client-TZKGHJRY.js +516 -0
  154. package/dist/kernel-wire-wNdAPfhJ.d.ts +88 -0
  155. package/dist/lib/index.d.ts +602 -0
  156. package/dist/lib/index.js +1289 -0
  157. package/dist/paintDispatch-CuJLsr9Y.d.ts +688 -0
  158. package/dist/parseLessonSegments-GpCeMrb2.d.ts +334 -0
  159. package/dist/perf-CKiBKbkw.d.ts +22 -0
  160. package/dist/perf-Dr28-AgT.d.ts +57 -0
  161. package/dist/prism-X5YWKXO5.js +136 -0
  162. package/dist/providers/index.css +1756 -0
  163. package/dist/providers/index.d.ts +355 -0
  164. package/dist/providers/index.js +29 -0
  165. package/dist/renderer/index.d.ts +465 -0
  166. package/dist/renderer/index.js +4 -0
  167. package/dist/runtime/index.css +1756 -0
  168. package/dist/runtime/index.d.ts +239 -0
  169. package/dist/runtime/index.js +28 -0
  170. package/dist/slot-host-CPzrxLo9.d.ts +48 -0
  171. package/dist/ssr/index.cjs +9739 -0
  172. package/dist/ssr/index.d.cts +464 -0
  173. package/dist/ssr/index.d.ts +464 -0
  174. package/dist/ssr/index.js +9703 -0
  175. package/dist/storage/browser/index.d.ts +1 -0
  176. package/dist/storage/browser/index.js +2 -0
  177. package/dist/test-support.d.ts +42 -0
  178. package/dist/test-support.js +181 -0
  179. package/dist/themeTokens-CRd8AEDF.d.ts +125 -0
  180. package/dist/three/index.css +503 -0
  181. package/dist/three/index.d.ts +1185 -0
  182. package/dist/three/index.js +3908 -0
  183. package/dist/useUISlots-CiobNFGb.d.ts +211 -0
  184. package/dist/verification-C5pTeMJv.d.ts +66 -0
  185. package/dist/verificationRegistry-CVrcxG1s.d.ts +122 -0
  186. package/dist/wrapCallbackForEvent-B9QLbhxX.d.ts +19 -0
  187. package/index.css +199 -0
  188. package/package.json +273 -3
  189. package/src/core/lib/band-shapes.json +7 -0
  190. package/src/core/locales/ar.json +1276 -0
  191. package/src/core/locales/en.json +1276 -0
  192. package/src/core/locales/index.ts +54 -0
  193. package/src/core/locales/sl.json +1276 -0
  194. package/src/core/tokens/native-tokens.json +369 -0
  195. package/tailwind-compile.cjs +29 -0
  196. package/tailwind-preset.cjs +1020 -0
  197. package/themes/_base.css +451 -0
  198. package/themes/_contract.md +307 -0
  199. package/themes/_fonts-kenney.css +11 -0
  200. package/themes/_fonts.css +12 -0
  201. package/themes/_foundation.css +105 -0
  202. package/themes/_head.css +22 -0
  203. package/themes/_presets.css +67 -0
  204. package/themes/almadar-heritage.css +455 -0
  205. package/themes/almadar-website.css +269 -0
  206. package/themes/almadar.css +269 -0
  207. package/themes/aqua.css +455 -0
  208. package/themes/arabesque.css +459 -0
  209. package/themes/art-deco.css +457 -0
  210. package/themes/art-nouveau.css +459 -0
  211. package/themes/atelier.css +463 -0
  212. package/themes/bauhaus.css +461 -0
  213. package/themes/bloomberg-dense.css +463 -0
  214. package/themes/blueprint.css +457 -0
  215. package/themes/clay.css +449 -0
  216. package/themes/comic.css +453 -0
  217. package/themes/constructivist.css +457 -0
  218. package/themes/corporate.css +449 -0
  219. package/themes/cyberpunk.css +453 -0
  220. package/themes/frutiger-aero.css +458 -0
  221. package/themes/game-adventure.css +201 -0
  222. package/themes/game-rpg.css +203 -0
  223. package/themes/game-sci-fi.css +201 -0
  224. package/themes/game-ui-pack.css +200 -0
  225. package/themes/gazette.css +449 -0
  226. package/themes/glass.css +457 -0
  227. package/themes/gothic.css +453 -0
  228. package/themes/index.css +21 -0
  229. package/themes/ink-wash.css +459 -0
  230. package/themes/kawaii.css +459 -0
  231. package/themes/kflow.css +310 -0
  232. package/themes/kiosk.css +449 -0
  233. package/themes/linear-clean.css +463 -0
  234. package/themes/luxury.css +451 -0
  235. package/themes/mac-classic.css +455 -0
  236. package/themes/material.css +463 -0
  237. package/themes/memphis.css +453 -0
  238. package/themes/mid-century.css +455 -0
  239. package/themes/minimalist.css +449 -0
  240. package/themes/mudcloth.css +459 -0
  241. package/themes/nata.css +310 -0
  242. package/themes/neon.css +453 -0
  243. package/themes/neumorphic.css +451 -0
  244. package/themes/newsprint.css +455 -0
  245. package/themes/notion-editorial.css +463 -0
  246. package/themes/orb.css +465 -0
  247. package/themes/pixel.css +449 -0
  248. package/themes/prism.css +309 -0
  249. package/themes/rawi.css +310 -0
  250. package/themes/retro.css +452 -0
  251. package/themes/risograph.css +463 -0
  252. package/themes/scandi.css +469 -0
  253. package/themes/sketch.css +455 -0
  254. package/themes/solarpunk.css +469 -0
  255. package/themes/steampunk.css +451 -0
  256. package/themes/swiss.css +455 -0
  257. package/themes/terminal.css +466 -0
  258. package/themes/trait-wars.css +487 -0
  259. package/themes/ukiyo-e.css +459 -0
  260. package/themes/vaporwave.css +455 -0
  261. package/themes/victorian.css +453 -0
  262. package/themes/wabi-sabi.css +459 -0
  263. package/themes/win95.css +455 -0
  264. package/themes/wireframe.css +439 -0
  265. package/themes/zine.css +455 -0
  266. package/README.md +0 -3
@@ -0,0 +1,2 @@
1
+ import './chunk-G7DCAZ22.js';
2
+ export { default as rehypeKatex } from 'rehype-katex';
@@ -0,0 +1,516 @@
1
+ import { createTickDriver, runTickFrame } from './chunk-AU7O65OX.js';
2
+ import { presenceGroup, getTraitPresence } from './chunk-4YXBKHHM.js';
3
+ import './chunk-G7DCAZ22.js';
4
+ import { isJsonObject } from '@almadar/core';
5
+ import { createLocalFold, traceResponse, paintResponse } from '@almadar/shell-runtime';
6
+ import { TraitMountError } from '@almadar/shell-runtime/client/trait-mount-error';
7
+ import { SessionEndedError } from '@almadar/shell-runtime/client/EventTransport';
8
+ import { createLogger } from '@almadar/logger';
9
+
10
+ var log = createLogger("almadar:ui:kernel-client");
11
+ var nextClientSerial = 0;
12
+ var defaultFrameScheduler = (callback) => {
13
+ if (typeof requestAnimationFrame === "function") {
14
+ const handle = requestAnimationFrame(callback);
15
+ return () => cancelAnimationFrame(handle);
16
+ }
17
+ const timer = setTimeout(() => callback(performance.now()), 16);
18
+ return () => clearTimeout(timer);
19
+ };
20
+ function parse(text) {
21
+ return JSON.parse(text);
22
+ }
23
+ function payloadJson(payload) {
24
+ return payload === void 0 ? void 0 : JSON.stringify(payload);
25
+ }
26
+ function createKernelClient(opts) {
27
+ const { store, traitIndex, transport } = opts;
28
+ let loaded;
29
+ const configs = /* @__PURE__ */ new Map();
30
+ const ready = opts.instance.then((k) => {
31
+ loaded = k;
32
+ return k;
33
+ });
34
+ ready.catch(() => void 0);
35
+ const visibleGroups = [...traitIndex.byName].filter(([, entry]) => entry.ticks.some((tick) => tick.whileVisible)).map(([name]) => [name, presenceGroup(traitIndex, name)]);
36
+ const foldTurns = /* @__PURE__ */ new Map();
37
+ const runQueuedFolds = (k) => {
38
+ for (let json = k.nextFold(); json !== void 0; json = k.nextFold()) {
39
+ const next = parse(json);
40
+ const turn = foldTurns.get(next.ticket);
41
+ if (turn === void 0) throw new Error(`kernel wire: the kernel folded ticket ${next.ticket}, which nothing waits on`);
42
+ foldTurns.delete(next.ticket);
43
+ if (next.outcome === "failed") turn.failed(new Error(next.error));
44
+ else turn.ran(next.fold);
45
+ }
46
+ };
47
+ const foldInOrder = (k, flight, answer, alreadyDeliveredJson, baseJson) => settleProgress(k, parse(k.foldInOrder(flight, JSON.stringify(answer), alreadyDeliveredJson, baseJson)));
48
+ const deliverInOrder = (k, flight, emitted) => settleProgress(k, parse(k.deliverEmitToListeners(flight, JSON.stringify(emitted))));
49
+ const deliverOriginInOrder = (k, flight, emitted) => settleProgress(k, parse(k.deliverOriginEmit(flight, JSON.stringify(emitted))));
50
+ const settleProgress = (k, progress) => {
51
+ if (progress.status === "applied") return Promise.resolve(progress.fold);
52
+ const turn = new Promise((ran, failed) => {
53
+ foldTurns.set(progress.ticket, { ran, failed });
54
+ });
55
+ queueMicrotask(() => runQueuedFolds(k));
56
+ return turn;
57
+ };
58
+ const endFlight = (k, flight) => {
59
+ if (flight === null || flight === void 0) return;
60
+ k.endFlight(flight);
61
+ runQueuedFolds(k);
62
+ };
63
+ const flightOf = (wire) => {
64
+ if (wire.flight === null || wire.flight === void 0) throw new Error(`kernel wire: ${wire.seed.trait}.${wire.seed.event} owes a leg and carries no flight`);
65
+ return wire.flight;
66
+ };
67
+ let scopeTail = Promise.resolve();
68
+ const framesSince = (since) => {
69
+ if (loaded === void 0) throw new Error("the kernel is not loaded");
70
+ return parse(loaded.framesSince(since));
71
+ };
72
+ const mirror = (response) => paintResponse(store, framesSince, response);
73
+ const traceStreams = /* @__PURE__ */ new Set();
74
+ const movedTraits = (item) => {
75
+ const dispatch = item["dispatch"];
76
+ const outcomes = dispatch !== void 0 && dispatch !== null && isJsonObject(dispatch) ? dispatch["outcomes"] ?? null : null;
77
+ if (!Array.isArray(outcomes)) return [];
78
+ return outcomes.flatMap((o) => o !== null && isJsonObject(o) && typeof o["trait"] === "string" ? [o["trait"]] : []);
79
+ };
80
+ const publishTrace = (k) => {
81
+ if (traceStreams.size === 0) return;
82
+ const items = parse(k.takeTrace());
83
+ if (!Array.isArray(items)) return;
84
+ for (const item of items) {
85
+ if (item === null || !isJsonObject(item)) continue;
86
+ const moved = movedTraits(item);
87
+ for (const stream of traceStreams) {
88
+ if (moved.some((t) => stream.traits.has(t))) queueMicrotask(() => stream.onItem(item));
89
+ }
90
+ }
91
+ };
92
+ const trace = (k, response) => {
93
+ traceResponse(opts.observer, response);
94
+ publishTrace(k);
95
+ };
96
+ const localFold = createLocalFold({ store, framesSince, ...opts.observer !== void 0 ? { observer: opts.observer } : {} });
97
+ const syncStates = (k, traits) => {
98
+ for (const trait of traits) {
99
+ const state = k.getState(trait);
100
+ if (state !== "" && store.states.getState(trait)?.currentState !== state) store.states.seedState(trait, state);
101
+ }
102
+ };
103
+ const restore = (k, wire, entityId) => {
104
+ const snapshot = wire.snapshot;
105
+ if (snapshot === null) return { clientEffectsByTrait: [] };
106
+ const trait = wire.seed.trait;
107
+ const repaint = parse(k.restore(trait, entityId, JSON.stringify(snapshot)));
108
+ if (snapshot.state !== "") store.states.rollbackState(trait, snapshot.state, entityId, "server-rejected");
109
+ mirror(repaint);
110
+ store.notify();
111
+ return { clientEffectsByTrait: repaint.clientEffectsByTrait ?? [] };
112
+ };
113
+ const planDispatch = (wire, carriesCircuitState) => {
114
+ if (wire.serverLegs.length > 0) {
115
+ return {
116
+ awaiting: wire.awaiting,
117
+ legs: wire.serverLegs.map(({ orbital, leg }) => ({
118
+ orbital,
119
+ leg,
120
+ keepsState: carriesCircuitState || wire.mode === "hybridClientOnly",
121
+ alreadyDelivered: wire.alreadyDelivered,
122
+ foldSeeded: wire.foldSeeded,
123
+ wires: [wire],
124
+ flight: flightOf(wire)
125
+ }))
126
+ };
127
+ }
128
+ if (!carriesCircuitState && wire.statefulLeg !== null) {
129
+ return {
130
+ awaiting: wire.statefulLeg.awaiting,
131
+ legs: [{ orbital: wire.statefulLeg.orbital, leg: wire.statefulLeg.leg, keepsState: true, alreadyDelivered: wire.alreadyDelivered, foldSeeded: [], wires: [wire], flight: flightOf(wire) }]
132
+ };
133
+ }
134
+ return { legs: [], awaiting: [] };
135
+ };
136
+ const mountedSeeds = /* @__PURE__ */ new Map();
137
+ const foldAnswer = async (k, flight, answer) => {
138
+ const applied = await foldInOrder(k, flight, answer, "[]", void 0);
139
+ mirror(applied.response);
140
+ syncStates(k, Object.keys(answer.states));
141
+ return applied;
142
+ };
143
+ const resyncFrames = async (k, flight, orbital, leg, since, request) => {
144
+ if (leg.clientId === void 0) throw new Error("a frame resync needs the client id the leg was posted under");
145
+ const answer = await sendReseeding(k, flight, orbital, { event: "$FRAMES", clientId: leg.clientId, framesSince: since }, request);
146
+ if (answer.success) await foldAnswer(k, flight, answer);
147
+ };
148
+ const sendReseeding = async (k, flight, orbital, sent, request) => {
149
+ if (transport === void 0) throw new Error("no transport");
150
+ try {
151
+ return await transport.send(orbital, sent);
152
+ } catch (err) {
153
+ const seeds = mountedSeeds.get(orbital);
154
+ if (!(err instanceof SessionEndedError) || seeds === void 0 || seeds.length === 0) throw err;
155
+ const reseed = JSON.parse(k.reseedLeg(JSON.stringify(seeds), request.entityId));
156
+ const mounted = await transport.send(orbital, request.locale !== void 0 ? { ...reseed, locale: request.locale } : reseed);
157
+ await foldAnswer(k, flight, mounted);
158
+ store.notify();
159
+ return transport.send(orbital, sent);
160
+ }
161
+ };
162
+ const sendLegs = async (k, legs, request, flags, initial) => {
163
+ const out = {
164
+ response: initial,
165
+ serverEffects: { clientEffectsByTrait: [] },
166
+ success: true,
167
+ rejections: [],
168
+ foldedEmits: []
169
+ };
170
+ if (transport === void 0) return out;
171
+ const queue = [...legs];
172
+ for (let planned = queue.shift(); planned !== void 0; planned = queue.shift()) {
173
+ const shaped = planned.keepsState ? planned.leg : JSON.parse(k.statefulLeg(JSON.stringify(planned.leg)));
174
+ const sent = request.locale !== void 0 ? { ...shaped, locale: request.locale } : shaped;
175
+ const base = k.foldBase(sent.entityByTrait !== void 0 ? JSON.stringify(sent.entityByTrait) : void 0, JSON.stringify(planned.foldSeeded), sent.entityId);
176
+ let posted;
177
+ try {
178
+ posted = await sendReseeding(k, planned.flight, planned.orbital, sent, request);
179
+ } catch (err) {
180
+ if (flags.rollback || flags.mount) for (const wire of planned.wires) restore(k, wire, request.entityId);
181
+ throw err instanceof Error ? err : new Error(String(err));
182
+ }
183
+ if (!posted.success) {
184
+ const optimistic = planned.wires.filter((wire) => wire.mode === "runtimeOptimistic");
185
+ if (flags.rollback && optimistic.length > 0) {
186
+ return { ...out, response: posted, success: false, rolledBack: restore(k, optimistic[0], request.entityId) };
187
+ }
188
+ if (flags.mount) for (const wire of optimistic) restore(k, wire, request.entityId);
189
+ }
190
+ const applied = await foldInOrder(k, planned.flight, posted, JSON.stringify(planned.alreadyDelivered), base);
191
+ log.debug("fold", { orbital: planned.orbital, event: sent.event, posted: { success: posted.success, states: posted.states, emitted: posted.emittedEvents.map((e) => e.event) }, applied: applied.applied, cascadeEmitted: applied.response.emittedEvents.map((e) => e.event) });
192
+ trace(k, applied.response);
193
+ for (const routed of applied.serverLegs) {
194
+ queue.push({ orbital: routed.orbital, leg: routed.leg, keepsState: true, alreadyDelivered: [], foldSeeded: [], wires: [], flight: planned.flight });
195
+ }
196
+ mirror(applied.response);
197
+ if (applied.resync != null) await resyncFrames(k, planned.flight, planned.orbital, sent, applied.resync.since, request);
198
+ syncStates(k, [...Object.keys(posted.states), ...applied.applied.map(([trait]) => trait)]);
199
+ store.notify();
200
+ const fold = applied.response;
201
+ const delivered = new Set(planned.alreadyDelivered.map(([trait, event]) => `${trait}\0${event}`));
202
+ const serverEmits = posted.emittedEvents.filter((e) => !delivered.has(`${e.source?.trait ?? ""}\0${e.event}`));
203
+ const byTrait = [...posted.clientEffectsByTrait ?? [], ...fold.clientEffectsByTrait ?? []];
204
+ out.serverEffects.clientEffectsByTrait?.push(...byTrait);
205
+ out.foldedEmits.push(...serverEmits, ...fold.emittedEvents);
206
+ out.response = {
207
+ ...out.response,
208
+ emittedEvents: [...out.response.emittedEvents, ...serverEmits, ...fold.emittedEvents],
209
+ clientEffectsByTrait: [...out.response.clientEffectsByTrait ?? [], ...byTrait],
210
+ effectResults: [...out.response.effectResults ?? [], ...fold.effectResults ?? []]
211
+ };
212
+ out.success = out.success && posted.success;
213
+ if (posted.error !== void 0) out.error = posted.error;
214
+ out.rejections.push(...(fold.rejections ?? []).filter((r) => r.code === "effect-failed" || r.code === "repaint-failed"));
215
+ }
216
+ return out;
217
+ };
218
+ const post = async (k, wire, request, flags) => {
219
+ const topology = await opts.topology;
220
+ const plan = planDispatch(wire, topology.carriesCircuitState);
221
+ const awaiting = flags.awaiting ? plan.awaiting : [];
222
+ store.awaiting.begin(awaiting);
223
+ try {
224
+ return await sendLegs(k, plan.legs, request, { rollback: flags.rollback, mount: false }, wire.response);
225
+ } finally {
226
+ store.awaiting.end(awaiting.map((a) => a.trait));
227
+ }
228
+ };
229
+ const framePost = (k) => {
230
+ if (transport === void 0) return void 0;
231
+ return {
232
+ postDispatch: async (wire) => {
233
+ try {
234
+ return (await post(k, wire, {}, { rollback: false, awaiting: false })).serverEffects;
235
+ } finally {
236
+ endFlight(k, wire.flight);
237
+ }
238
+ },
239
+ sendBrowserLeg: async (routed, frameResponse) => {
240
+ const flight = k.openFlight();
241
+ try {
242
+ const planned = { orbital: routed.orbital, leg: routed.leg, keepsState: true, alreadyDelivered: [], foldSeeded: [], wires: [], flight };
243
+ return (await sendLegs(k, [planned], {}, { rollback: false, mount: false }, frameResponse)).serverEffects;
244
+ } finally {
245
+ endFlight(k, flight);
246
+ }
247
+ }
248
+ };
249
+ };
250
+ const tickPorts = (k) => ({
251
+ kernel: {
252
+ frame: (nowMs) => {
253
+ const presence = getTraitPresence();
254
+ for (const [traitName, group] of visibleGroups) k.setTraitOnScreen(traitName, presence.state(group) !== "off-screen");
255
+ return k.frame(nowMs);
256
+ },
257
+ framePause: () => k.framePause(),
258
+ frameResume: () => k.frameResume(),
259
+ tickCount: () => k.tickCount()
260
+ },
261
+ client: localFold,
262
+ post: framePost(k)
263
+ });
264
+ const dispatchOne = async (request, hooks, progress) => {
265
+ const traitName = request.targetTrait;
266
+ if (traitName === void 0) throw new Error("dispatch requires request.targetTrait (the seed trait)");
267
+ const k = await ready;
268
+ await scopeTail;
269
+ if (request.runTick !== void 0) {
270
+ const response = parse(k.tick(request.runTick.trait, request.runTick.tick, request.entityId));
271
+ publishTrace(k);
272
+ mirror(response);
273
+ store.notify();
274
+ return { response, mode: parse(k.dispatchMode(request.runTick.trait)) };
275
+ }
276
+ const wire = parse(k.dispatch(traitName, request.entityId, request.event, payloadJson(request.payload)));
277
+ try {
278
+ return await settleDispatch(k, wire, request, hooks, progress);
279
+ } finally {
280
+ endFlight(k, wire.flight);
281
+ }
282
+ };
283
+ const settleDispatch = async (k, wire, request, hooks, progress) => {
284
+ log.debug("dispatch", { trait: wire.seed.trait, event: request.event, mode: wire.mode, legs: wire.serverLegs.length, success: wire.response.success, states: wire.response.states, effects: (wire.response.clientEffectsByTrait ?? []).map((e) => `${e.traitName}:${e.effect[0]}:${e.effect[1] ?? ""}`), emitted: wire.response.emittedEvents.map((e) => e.event) });
285
+ trace(k, wire.response);
286
+ mirror(wire.response);
287
+ store.notify();
288
+ if (transport === void 0 || wire.serverLegs.length === 0 && wire.statefulLeg === null) return { response: wire.response, mode: wire.mode };
289
+ const painters = hooks.filter((h) => h.onLocal !== void 0);
290
+ for (const h of painters) h.onLocal?.(wire.response);
291
+ const posted = await post(k, wire, request, { rollback: true, awaiting: !progress });
292
+ const localPainted = painters.length > 0;
293
+ if (posted.rolledBack !== void 0) {
294
+ return { response: posted.response, mode: wire.mode, ...localPainted ? { localPainted, serverEffects: posted.rolledBack } : {} };
295
+ }
296
+ return localPainted ? { response: posted.response, mode: wire.mode, localPainted, serverEffects: posted.serverEffects } : { response: posted.response, mode: wire.mode };
297
+ };
298
+ const settleMount = async (k, mount, seeds, hooks, baseRequest) => {
299
+ if (mount.failed !== null) {
300
+ const failed = mount.failed;
301
+ throw new TraitMountError(failed.trait, failed.event, new Error(failed.message));
302
+ }
303
+ const wires = mount.seeds;
304
+ for (const wire of wires) {
305
+ const kept = mountedSeeds.get(wire.orbital) ?? [];
306
+ if (!kept.some((s) => s.trait === wire.seed.trait)) mountedSeeds.set(wire.orbital, [...kept, { trait: wire.seed.trait, event: seeds.find((s) => s.trait === wire.seed.trait)?.event ?? "INIT" }]);
307
+ }
308
+ for (const wire of wires) {
309
+ log.debug("mount", { trait: wire.seed.trait, event: wire.seed.event, mode: wire.mode, legs: wire.serverLegs.length, success: wire.response.success });
310
+ trace(k, wire.response);
311
+ mirror(wire.response);
312
+ }
313
+ store.notify();
314
+ for (const wire of wires) hooks?.onLocal?.(wire.seed.trait, wire.response);
315
+ const outcome = {
316
+ seeds: wires.map((w) => ({ trait: w.seed.trait, event: w.seed.event, mode: w.mode, local: w.response })),
317
+ posted: false,
318
+ success: true,
319
+ rejections: [],
320
+ serverEffects: { clientEffectsByTrait: [] },
321
+ emittedEvents: []
322
+ };
323
+ if (transport === void 0) return outcome;
324
+ const topology = await opts.topology;
325
+ const groups = (topology.carriesCircuitState ? mount.legs : mount.statefulLegs).map((group) => {
326
+ const answered = wires.filter((w) => group.seeds.some((s) => s.trait === w.seed.trait && s.event === w.seed.event));
327
+ const flown = answered.filter((w) => w.flight !== null && w.flight !== void 0);
328
+ return { group, answered, flight: Math.min(...(flown.length > 0 ? flown : answered).map(flightOf)) };
329
+ }).sort((a, b) => a.flight - b.flight);
330
+ for (const wire of wires) if (!groups.some(({ answered }) => answered.includes(wire))) endFlight(k, wire.flight);
331
+ for (const { group, answered, flight } of groups) {
332
+ const planned = { orbital: group.orbital, leg: group.leg, keepsState: true, alreadyDelivered: group.alreadyDelivered, foldSeeded: group.foldSeeded, wires: answered, flight };
333
+ store.awaiting.begin(group.awaiting);
334
+ let posted;
335
+ try {
336
+ posted = await sendLegs(k, [planned], baseRequest, { rollback: false, mount: true }, answered[0]?.response ?? outcome.seeds[0].local);
337
+ } finally {
338
+ store.awaiting.end(group.awaiting.map((a) => a.trait));
339
+ for (const wire of answered) endFlight(k, wire.flight);
340
+ }
341
+ outcome.posted = true;
342
+ outcome.success = outcome.success && posted.success;
343
+ if (posted.error !== void 0) outcome.error = posted.error;
344
+ outcome.rejections.push(...posted.rejections);
345
+ outcome.serverEffects.clientEffectsByTrait?.push(...posted.serverEffects.clientEffectsByTrait ?? []);
346
+ outcome.emittedEvents.push(...posted.foldedEmits);
347
+ }
348
+ return outcome;
349
+ };
350
+ const deliver = async (emitted, fold) => {
351
+ const k = await ready;
352
+ await scopeTail;
353
+ const flight = k.openFlight();
354
+ try {
355
+ const applied = await fold(k, flight);
356
+ trace(k, applied.response);
357
+ mirror(applied.response);
358
+ syncStates(k, applied.applied.map(([trait]) => trait));
359
+ store.notify();
360
+ const owed = applied.serverLegs.map((routed) => ({ orbital: routed.orbital, leg: routed.leg, keepsState: true, alreadyDelivered: [], foldSeeded: [], wires: [], flight }));
361
+ const posted = await sendLegs(k, owed, {}, { rollback: false, mount: false }, applied.response);
362
+ return { response: posted.response };
363
+ } finally {
364
+ endFlight(k, flight);
365
+ }
366
+ };
367
+ const clientSerial = nextClientSerial++;
368
+ const release = async (left) => {
369
+ if (transport === void 0 || left.length === 0) return;
370
+ await opts.topology;
371
+ for (const { trait, orbital, leg } of left) {
372
+ transport.send(orbital, leg).catch((err) => log.warn("unmount-post-failed", { trait, orbital, error: String(err) }));
373
+ }
374
+ };
375
+ const client = {
376
+ store,
377
+ dispatch: (request, hooks) => dispatchOne(request, hooks !== void 0 ? [hooks] : [], false),
378
+ dispatchProgress: (request) => dispatchOne(request, [], true),
379
+ foldHostDispatch: async (request, response) => {
380
+ const k = await ready;
381
+ if (request.targetTrait === void 0) throw new Error("foldHostDispatch requires request.targetTrait (the seed trait)");
382
+ const mode = parse(k.dispatchMode(request.targetTrait));
383
+ if (!response.success) return { response: { ...response, clientEffectsByTrait: [] }, mode };
384
+ const flight = k.openFlight();
385
+ try {
386
+ const applied = await foldInOrder(k, flight, response, "[]", void 0);
387
+ trace(k, applied.response);
388
+ mirror(applied.response);
389
+ syncStates(k, [...Object.keys(response.states), ...applied.applied.map(([trait]) => trait)]);
390
+ store.notify();
391
+ const owed = applied.serverLegs.map((routed) => ({ orbital: routed.orbital, leg: routed.leg, keepsState: true, alreadyDelivered: [], foldSeeded: [], wires: [], flight }));
392
+ const posted = await sendLegs(k, owed, request, { rollback: false, mount: false }, applied.response);
393
+ return {
394
+ response: {
395
+ ...response,
396
+ clientEffectsByTrait: [...response.clientEffectsByTrait ?? [], ...posted.response.clientEffectsByTrait ?? []]
397
+ },
398
+ mode
399
+ };
400
+ } finally {
401
+ endFlight(k, flight);
402
+ }
403
+ },
404
+ deliverEmit: (emitted) => deliver(emitted, (k, flight) => foldInOrder(k, flight, { success: true, transitioned: false, states: {}, emittedEvents: [emitted] }, "[]", void 0)),
405
+ deliverToListeners: (emitted) => deliver(emitted, (k, flight) => deliverInOrder(k, flight, emitted)),
406
+ deliverOriginEmit: (emitted) => deliver(emitted, (k, flight) => deliverOriginInOrder(k, flight, emitted)),
407
+ dispatchMount: async (seeds, hooks, base) => {
408
+ const k = await ready;
409
+ await scopeTail;
410
+ const baseRequest = base ?? {};
411
+ k.mount(JSON.stringify(seeds.map((s) => s.trait)));
412
+ const mount = parse(k.dispatchMount(JSON.stringify(seeds), baseRequest.entityId, payloadJson(baseRequest.payload), baseRequest.route));
413
+ try {
414
+ return await settleMount(k, mount, seeds, hooks, baseRequest);
415
+ } finally {
416
+ for (const wire of mount.seeds) endFlight(k, wire.flight);
417
+ }
418
+ },
419
+ routeMounts: async (routePath) => parse((await ready).routeMounts(routePath)),
420
+ pageCircuit: async (page, route) => parse((await ready).pageCircuit(page, route)),
421
+ enter: (routePath, mountKey, traits) => {
422
+ const entered = scopeTail.then(() => ready).then((k) => parse(k.enter(routePath, `${clientSerial}\0${mountKey}`, JSON.stringify(traits))));
423
+ scopeTail = entered.then(() => void 0, () => void 0);
424
+ return entered.then((answer) => {
425
+ void release(answer.left);
426
+ return { seeds: answer.seeds, left: answer.left.map((l) => l.trait) };
427
+ });
428
+ },
429
+ leave: async () => {
430
+ const left = scopeTail.then(() => ready).then((k) => parse(k.leave()));
431
+ scopeTail = left.then(() => void 0, () => void 0);
432
+ await release(await left);
433
+ },
434
+ frame: async (nowMs) => {
435
+ const k = await ready;
436
+ await scopeTail;
437
+ const ran = await runTickFrame(tickPorts(k), () => nowMs);
438
+ publishTrace(k);
439
+ return ran.outcomes;
440
+ },
441
+ framePause: () => loaded?.framePause(),
442
+ frameResume: () => loaded?.frameResume(),
443
+ startFrames: (onFrame, schedule = defaultFrameScheduler) => {
444
+ const presence = getTraitPresence();
445
+ const releases = visibleGroups.map(([, group]) => presence.watch(group));
446
+ let stopped = false;
447
+ let latestMs = 0;
448
+ let nextHandle = 0;
449
+ const cancels = /* @__PURE__ */ new Map();
450
+ const visibility = {
451
+ hidden: () => document.visibilityState === "hidden",
452
+ onChange: (listener) => {
453
+ document.addEventListener("visibilitychange", listener);
454
+ return () => document.removeEventListener("visibilitychange", listener);
455
+ }
456
+ };
457
+ let driver;
458
+ ready.then(async (k) => {
459
+ await scopeTail;
460
+ if (stopped) return;
461
+ driver = createTickDriver({
462
+ ...tickPorts(k),
463
+ now: () => latestMs,
464
+ requestFrame: (callback) => {
465
+ nextHandle += 1;
466
+ const handle = nextHandle;
467
+ cancels.set(handle, schedule((nowMs) => {
468
+ cancels.delete(handle);
469
+ latestMs = nowMs;
470
+ callback(nowMs);
471
+ }));
472
+ return handle;
473
+ },
474
+ cancelFrame: (handle) => {
475
+ cancels.get(handle)?.();
476
+ cancels.delete(handle);
477
+ },
478
+ visibility,
479
+ onApplied: (applied) => {
480
+ publishTrace(k);
481
+ if (!stopped && applied.outcomes.length > 0) onFrame(applied.outcomes);
482
+ },
483
+ onError: (error) => log.error("kernel-frame-failed", { error: error.message })
484
+ });
485
+ driver.start();
486
+ }).catch((error) => log.error("kernel-frame-failed", { error: error.message }));
487
+ return () => {
488
+ stopped = true;
489
+ driver?.stop();
490
+ releases.forEach((release2) => release2());
491
+ };
492
+ },
493
+ traceStream: (traits, onItem) => {
494
+ const stream = { traits: new Set(traits), onItem };
495
+ traceStreams.add(stream);
496
+ void ready.then((k) => k.setTraceOn(true)).catch((error) => log.error("trace-stream-failed", { error: error.message }));
497
+ return () => {
498
+ traceStreams.delete(stream);
499
+ if (traceStreams.size === 0) loaded?.setTraceOn(false);
500
+ };
501
+ },
502
+ traitState: (traitName) => loaded?.getState(traitName),
503
+ sessionTheme: () => loaded?.sessionTheme(),
504
+ traitConfig: (traitName) => {
505
+ if (loaded === void 0) return void 0;
506
+ const held = configs.get(traitName);
507
+ if (held !== void 0) return held;
508
+ const config = parse(loaded.traitConfig(traitName));
509
+ configs.set(traitName, config);
510
+ return config;
511
+ }
512
+ };
513
+ return client;
514
+ }
515
+
516
+ export { createKernelClient };
@@ -0,0 +1,88 @@
1
+ import { KernelModule as KernelModule$1 } from '@almadar/shell-browser/kv';
2
+ import './verification-C5pTeMJv.js';
3
+
4
+ /**
5
+ * The `Kernel` class surface of `@almadar/kernel` (JSON strings in, JSON strings out). The wire data it
6
+ * speaks (`DispatchWire`, `AppliedWire`, `FrameWire`, ...) is imported from `@almadar/core/kernel-wire`.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+
11
+ /** The `Kernel` class `@almadar/kernel` exports: JSON strings in, JSON strings out. */
12
+ interface KernelInstance {
13
+ dispatch(traitName: string, entityId: string | undefined, event: string, payloadJson?: string): string;
14
+ /** A flight for work the kernel did not wire (a dispatch the host ran on its own, a frame's browser leg). */
15
+ openFlight(): number;
16
+ /** `applyServerResponse` in flight order (EXEC-CONC-8): a `FoldProgressWire` as JSON, folded now or queued behind an older flight. */
17
+ foldInOrder(flight: number, responseJson: string, alreadyDeliveredJson?: string, baseJson?: string): string;
18
+ /** `foldInOrder` for an emit that entered from outside the kernel (another client's push): delivered to its declared listeners only, a `FoldProgressWire` as JSON. */
19
+ deliverEmitToListeners(flight: number, emittedJson: string): string;
20
+ /** `deliverEmitToListeners` for a live message of this client's own running call, whose emitter ran its own arm as that call's progress dispatch: the emitter is not delivered its own emit a second time. */
21
+ deliverOriginEmit(flight: number, emittedJson: string): string;
22
+ /** The oldest queued answer that can fold now, folded: a `FoldedNextWire` as JSON, or `undefined` when none waits. */
23
+ nextFold(): string | undefined;
24
+ /** The flight is done: its answers are folded, or the host gave up on them. */
25
+ endFlight(flight: number): boolean;
26
+ /** The rows a posted leg's answer is folded against; `undefined` when the leg carried none. */
27
+ /** The leg as a host that holds the circuit state takes it: only the `[shared]` frame rows its traits read. */
28
+ statefulLeg(legJson: string): string;
29
+ /** The mount a reconnecting client posts to rebuild its session: the seeds with the state and frame this client holds for each. */
30
+ reseedLeg(seedsJson: string, entityId?: string): string;
31
+ foldBase(carriedJson: string | undefined, seededJson: string, entityId?: string): string | undefined;
32
+ dispatchMount(seedsJson: string, entityId?: string, payloadJson?: string, route?: string): string;
33
+ /** The frame delta a painter at version `since` of this kernel's frames needs (`FrameDelta` JSON): empty when current, else a snapshot. */
34
+ framesSince(since: number): string;
35
+ restore(traitName: string, entityId: string | undefined, snapshotJson: string): string;
36
+ tick(traitName: string, tickName: string, entityId?: string): string;
37
+ frame(nowMs: number): string | undefined;
38
+ framePause(): void;
39
+ frameResume(): void;
40
+ tickCount(): number;
41
+ /** The theme key the server bound to this client's session with `theme/set` (mirrored from its frames); `undefined` when none is. */
42
+ sessionTheme(): string | undefined;
43
+ /** The kernel's dispatch mode for a registered trait (`DispatchMode` as JSON text); throws for an unregistered one. */
44
+ dispatchMode(traitName: string): string;
45
+ /** The config the kernel binds as `@config` for a registered trait (JSON text); throws for an unregistered one. */
46
+ traitConfig(traitName: string): string;
47
+ getState(traitName: string, entityId?: string): string;
48
+ /** The page's locale `i18n/t` paints in when a dispatch names none; the program carries its own messages. */
49
+ setViewerLocale(locale: string | undefined): void;
50
+ /** The host runs the listeners of every emit it marks `dispatched` (the JS runtime, `orbital-server`). */
51
+ setHostFansOut(fansOut: boolean): void;
52
+ /** Carry each hop's `@entity` before and after it on the dispatch's transitions, for a verifier (EXEC-STEP-10). */
53
+ setRecordEntityAfter(record: boolean): void;
54
+ /** Record each dispatch as a trace item while on, for the host's `program/live { kind: "trace" }` streams (EXEC-DIST-14). */
55
+ setTraceOn(on: boolean): void;
56
+ /** The trace items recorded since the last take, in dispatch order: a JSON array. */
57
+ takeTrace(): string;
58
+ /** Carry each frame response's `effectResults` (omitted otherwise), for a verifier. */
59
+ setFrameEffectResults(carry: boolean): void;
60
+ /** The kernel's mounts for a host start on `side` (`client|server|process|start`): `MountSeed[]` as JSON. */
61
+ bootMounts(side: string): string;
62
+ /** The kernel's mounts for a client opening `routePath`: `MountSeed[]` as JSON. */
63
+ routeMounts(routePath: string): string;
64
+ /** The circuit a client mounts for `page` or `route` (neither: the initial page): a `PageCircuit` as JSON. */
65
+ pageCircuit(page?: string, route?: string): string;
66
+ /** One question about the registered program (a `ContractQuery` as JSON): its answer as JSON. */
67
+ contractQuery(queryJson: string): string;
68
+ mount(traitsJson: string): void;
69
+ /** The page `mountKey` holds `traitsJson`, opened at `routePath` when it has one: an `Entered` as JSON (the seeds to mount, the traits that left with the legs that release them). */
70
+ enter(routePath: string | undefined, mountKey: string, traitsJson: string): string;
71
+ /** Every trait the page entered leaves: `Left[]` as JSON. */
72
+ leave(): string;
73
+ /** The host's report of whether a trait's rendered output is on screen; gates its `[visible]` ticks. */
74
+ setTraitOnScreen(traitName: string, onScreen: boolean): void;
75
+ seed(entityType: string, rowsJson: string): void;
76
+ free(): void;
77
+ }
78
+ /**
79
+ * What a host's loader resolves: the `@almadar/kernel` module with its WebAssembly already
80
+ * initialised and its language installed (`loadBrowserKernel` in a browser, `initSync` in Node). `@almadar/ui` never imports the
81
+ * package itself, so the default bundle carries none of it.
82
+ */
83
+ interface KernelModule extends KernelModule$1 {
84
+ Kernel: new (resolvedSchemaJson: string, clientId: string) => KernelInstance;
85
+ }
86
+ type KernelLoader = () => Promise<KernelModule>;
87
+
88
+ export type { KernelModule as K, KernelLoader as a, KernelInstance as b };