@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,432 @@
1
+ import { createLogger } from '@almadar/logger';
2
+
3
+ // src/lib/keyMapEvent.ts
4
+ function isEditableTarget(target) {
5
+ if (!(target instanceof HTMLElement)) return false;
6
+ const tag = target.tagName;
7
+ if (tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT") return true;
8
+ if (target.isContentEditable || target.contentEditable === "true") return true;
9
+ const attr = target.getAttribute("contenteditable");
10
+ return attr === "" || attr === "true" || attr === "plaintext-only";
11
+ }
12
+ function keyMapCode(e) {
13
+ let code = e.code;
14
+ if (e.altKey) code = `Alt+${code}`;
15
+ if (e.shiftKey) code = `Shift+${code}`;
16
+ if (e.metaKey || e.ctrlKey) code = `Mod+${code}`;
17
+ return code;
18
+ }
19
+ function resolveKeyMapEvent(map, e) {
20
+ if (!map || isEditableTarget(e.target)) return void 0;
21
+ return map[keyMapCode(e)] ?? map[e.code];
22
+ }
23
+ var log = createLogger("almadar:bridge");
24
+ var MAX_TRANSITIONS = 500;
25
+ function getState() {
26
+ if (typeof window !== "undefined") {
27
+ const w = window;
28
+ if (!w.__verificationRegistryState) {
29
+ w.__verificationRegistryState = {
30
+ checks: /* @__PURE__ */ new Map(),
31
+ transitions: [],
32
+ bridgeHealth: null,
33
+ listeners: /* @__PURE__ */ new Set(),
34
+ traitSnapshots: /* @__PURE__ */ new Map()
35
+ };
36
+ }
37
+ return w.__verificationRegistryState;
38
+ }
39
+ return {
40
+ checks: /* @__PURE__ */ new Map(),
41
+ transitions: [],
42
+ bridgeHealth: null,
43
+ listeners: /* @__PURE__ */ new Set(),
44
+ traitSnapshots: /* @__PURE__ */ new Map()
45
+ };
46
+ }
47
+ function notifyListeners() {
48
+ getState().listeners.forEach((l) => l());
49
+ exposeOnWindow();
50
+ }
51
+ function registerCheck(id, label, status = "pending", details) {
52
+ getState().checks.set(id, { id, label, status, details, updatedAt: Date.now() });
53
+ notifyListeners();
54
+ }
55
+ function updateCheck(id, status, details) {
56
+ const check = getState().checks.get(id);
57
+ if (check) {
58
+ check.status = status;
59
+ if (details !== void 0) check.details = details;
60
+ check.updatedAt = Date.now();
61
+ } else {
62
+ getState().checks.set(id, { id, label: id, status, details, updatedAt: Date.now() });
63
+ }
64
+ notifyListeners();
65
+ }
66
+ function getAllChecks() {
67
+ return Array.from(getState().checks.values());
68
+ }
69
+ function recordTransition(trace) {
70
+ const entry = {
71
+ ...trace,
72
+ id: `t-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`
73
+ };
74
+ log.debug("transition:recorded", { trait: trace.traitName, from: trace.from, to: trace.to, event: trace.event, effectCount: trace.effects.length });
75
+ getState().transitions.push(entry);
76
+ if (getState().transitions.length > MAX_TRANSITIONS) {
77
+ getState().transitions.shift();
78
+ }
79
+ if (entry.event === "INIT") {
80
+ const hasFetch = entry.effects.some((e) => e.type === "fetch");
81
+ const hasEntitySeed = entry.effects.some(
82
+ (e) => e.type === "set" && typeof e.args[0] === "string" && e.args[0].startsWith("@entity.")
83
+ );
84
+ const checkId = `init-fetch-${entry.traitName}`;
85
+ if (hasFetch || hasEntitySeed) {
86
+ registerCheck(
87
+ checkId,
88
+ `INIT transition for "${entry.traitName}" has fetch or entity-seed effect`,
89
+ "pass"
90
+ );
91
+ } else {
92
+ const rendersEntityData = entry.effects.some(
93
+ (e) => e.type === "render-ui" && JSON.stringify(e.args).includes("@entity.")
94
+ );
95
+ if (rendersEntityData) {
96
+ const siblingSeeds = getState().transitions.some(
97
+ (t) => t.event === "INIT" && t.effects.some(
98
+ (e) => e.type === "fetch" || e.type === "set" && typeof e.args[0] === "string" && e.args[0].startsWith("@entity.")
99
+ )
100
+ );
101
+ if (siblingSeeds) {
102
+ registerCheck(
103
+ checkId,
104
+ `INIT transition for "${entry.traitName}" has sibling entity-seed (shared entity)`,
105
+ "pass"
106
+ );
107
+ } else {
108
+ registerCheck(
109
+ checkId,
110
+ `INIT transition for "${entry.traitName}" missing fetch effect`,
111
+ "fail",
112
+ "Entity-bound render-ui without a fetch effect will show empty data"
113
+ );
114
+ }
115
+ }
116
+ }
117
+ }
118
+ const failedEffects = entry.effects.filter((e) => e.status === "failed");
119
+ if (failedEffects.length > 0) {
120
+ registerCheck(
121
+ `effects-${entry.id}`,
122
+ `Effects failed in ${entry.traitName}: ${entry.from} -> ${entry.to}`,
123
+ "fail",
124
+ failedEffects.map((e) => `${e.type}: ${e.error}`).join("; ")
125
+ );
126
+ }
127
+ notifyListeners();
128
+ }
129
+ function getTransitions() {
130
+ return [...getState().transitions];
131
+ }
132
+ function getTransitionsForTrait(traitName) {
133
+ return getState().transitions.filter((t) => t.traitName === traitName);
134
+ }
135
+ function recordServerResponse(orbitalName, event, response) {
136
+ const { effectResults, ...responseFields } = response;
137
+ const serverResponse = {
138
+ ...responseFields,
139
+ orbitalName,
140
+ timestamp: Date.now()
141
+ };
142
+ const entry = {
143
+ id: `srv-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
144
+ traitName: `server:${orbitalName}`,
145
+ from: "server",
146
+ to: "server",
147
+ event,
148
+ effects: effectResults ?? [],
149
+ serverResponse,
150
+ timestamp: Date.now()
151
+ };
152
+ getState().transitions.push(entry);
153
+ if (getState().transitions.length > MAX_TRANSITIONS) {
154
+ getState().transitions.shift();
155
+ }
156
+ if (!response.success && response.error) {
157
+ registerCheck(
158
+ `server-error-${entry.id}`,
159
+ `Server error for ${orbitalName}:${event}`,
160
+ "fail",
161
+ response.error
162
+ );
163
+ }
164
+ notifyListeners();
165
+ }
166
+ function serverEffectTraces(results) {
167
+ if (!results) return [];
168
+ return results.map((r) => {
169
+ const resultId = typeof r.data === "object" && r.data !== null && !Array.isArray(r.data) && "id" in r.data && typeof r.data.id === "string" ? r.data.id : void 0;
170
+ const outcome = r.denied ? "denied" : r.success ? "success" : "failed";
171
+ return {
172
+ type: r.effect,
173
+ ...r.entityType !== void 0 ? { entityName: r.entityType } : {},
174
+ ...r.action === "create" || r.action === "update" || r.action === "delete" || r.action === "batch" ? { action: r.action } : {},
175
+ ...resultId !== void 0 ? { resultId } : {},
176
+ outcome,
177
+ args: [],
178
+ status: outcome === "success" ? "executed" : "failed",
179
+ ...r.error !== void 0 ? { error: r.error } : {},
180
+ ...r.target !== void 0 ? { target: r.target } : {},
181
+ ...r.routed !== void 0 ? { routed: r.routed } : {}
182
+ };
183
+ });
184
+ }
185
+ function recordOrbitalResponse(orbitalName, request, response) {
186
+ recordServerResponse(orbitalName, request.event, {
187
+ success: response.success,
188
+ transitioned: response.transitioned,
189
+ emitted: response.emittedEvents.map((e) => ({ event: e.event, ...e.payload !== void 0 ? { payload: e.payload } : {} })),
190
+ emittedEvents: response.emittedEvents.map((e) => e.event),
191
+ clientEffects: response.clientEffectsByTrait?.length ?? 0,
192
+ dataEntities: Object.fromEntries(Object.entries(response.data ?? {}).map(([name, rows]) => [name, rows.length])),
193
+ ...response.error !== void 0 ? { error: response.error } : {},
194
+ effectResults: serverEffectTraces(response.effectResults)
195
+ });
196
+ }
197
+ function recordingTransport(transport) {
198
+ const subscribe = transport.subscribe?.bind(transport);
199
+ const subscribeHostDispatches = transport.subscribeHostDispatches?.bind(transport);
200
+ return {
201
+ ...transport.hostsBrowserStore !== void 0 ? { hostsBrowserStore: transport.hostsBrowserStore } : {},
202
+ register: (schema) => transport.register(schema),
203
+ unregister: () => transport.unregister(),
204
+ send: async (orbitalName, request) => {
205
+ const response = await transport.send(orbitalName, request);
206
+ recordOrbitalResponse(orbitalName, request, response);
207
+ return response;
208
+ },
209
+ ...subscribe !== void 0 ? { subscribe } : {},
210
+ ...subscribeHostDispatches !== void 0 ? { subscribeHostDispatches } : {}
211
+ };
212
+ }
213
+ function updateBridgeHealth(health) {
214
+ getState().bridgeHealth = { ...health };
215
+ const checkId = "server-bridge";
216
+ if (health.connected) {
217
+ registerCheck(checkId, "Server bridge connected", "pass");
218
+ } else {
219
+ registerCheck(
220
+ checkId,
221
+ "Server bridge disconnected",
222
+ "fail",
223
+ health.lastError || "Bridge is not connected"
224
+ );
225
+ }
226
+ notifyListeners();
227
+ }
228
+ function getBridgeHealth() {
229
+ const bh = getState().bridgeHealth;
230
+ return bh ? { ...bh } : null;
231
+ }
232
+ function getSummary() {
233
+ const allChecks = getAllChecks();
234
+ return {
235
+ totalChecks: allChecks.length,
236
+ passed: allChecks.filter((c) => c.status === "pass").length,
237
+ failed: allChecks.filter((c) => c.status === "fail").length,
238
+ warnings: allChecks.filter((c) => c.status === "warn").length,
239
+ pending: allChecks.filter((c) => c.status === "pending").length
240
+ };
241
+ }
242
+ function getSnapshot() {
243
+ return {
244
+ checks: getAllChecks(),
245
+ transitions: getTransitions(),
246
+ bridge: getBridgeHealth(),
247
+ summary: getSummary(),
248
+ traits: getTraitSnapshots()
249
+ };
250
+ }
251
+ function getTraitSnapshots() {
252
+ const snapshots = [];
253
+ for (const [traitName, getter] of getState().traitSnapshots.entries()) {
254
+ try {
255
+ snapshots.push(getter());
256
+ } catch (err) {
257
+ log.error("traitSnapshot getter failed", { trait: traitName, err: String(err) });
258
+ }
259
+ }
260
+ return snapshots;
261
+ }
262
+ function subscribeToVerification(listener) {
263
+ getState().listeners.add(listener);
264
+ return () => getState().listeners.delete(listener);
265
+ }
266
+ function defaultGetTraitState(traitName) {
267
+ const getter = getState().traitSnapshots.get(traitName);
268
+ if (getter === void 0) return void 0;
269
+ try {
270
+ return getter().currentState;
271
+ } catch {
272
+ return void 0;
273
+ }
274
+ }
275
+ function verifierAttached() {
276
+ return typeof window !== "undefined" && window.__ALMADAR_VERIFY__ === true;
277
+ }
278
+ function exposeOnWindow() {
279
+ if (typeof window === "undefined") return;
280
+ if (!window.__orbitalVerification) {
281
+ window.__orbitalVerification = {
282
+ getSnapshot,
283
+ getChecks: getAllChecks,
284
+ getTransitions,
285
+ getBridge: getBridgeHealth,
286
+ getSummary,
287
+ waitForTransition,
288
+ getTraitSnapshots,
289
+ getTraitState: defaultGetTraitState
290
+ };
291
+ } else {
292
+ if (!window.__orbitalVerification.getTraitSnapshots) {
293
+ window.__orbitalVerification.getTraitSnapshots = getTraitSnapshots;
294
+ }
295
+ if (!window.__orbitalVerification.getTraitState) {
296
+ window.__orbitalVerification.getTraitState = defaultGetTraitState;
297
+ }
298
+ }
299
+ }
300
+ function waitForTransition(event, timeoutMs = 1e4) {
301
+ return new Promise((resolve) => {
302
+ const existing = getState().transitions.find((t) => t.event === event);
303
+ if (existing) {
304
+ resolve(existing);
305
+ return;
306
+ }
307
+ const timeout = setTimeout(() => {
308
+ unsub();
309
+ resolve(null);
310
+ }, timeoutMs);
311
+ const unsub = subscribeToVerification(() => {
312
+ const found = getState().transitions.find((t) => t.event === event);
313
+ if (found) {
314
+ clearTimeout(timeout);
315
+ unsub();
316
+ resolve(found);
317
+ }
318
+ });
319
+ });
320
+ }
321
+ function bindEventBus(eventBus) {
322
+ if (typeof window === "undefined") return;
323
+ log.info("bindEventBus", { hasOnAny: !!eventBus.onAny });
324
+ exposeOnWindow();
325
+ if (window.__orbitalVerification) {
326
+ window.__orbitalVerification.sendEvent = (event, payload, traitScope) => {
327
+ const prefixed = event.startsWith("UI:") ? event : traitScope ? `UI:${traitScope}.${event}` : `UI:${event}`;
328
+ log.debug("sendEvent", { event: prefixed, traitScope, payloadKeys: payload ? Object.keys(payload) : [] });
329
+ eventBus.emit(prefixed, payload);
330
+ };
331
+ const MAX_EVENT_LOG = 5e3;
332
+ const eventLog = [];
333
+ let eventLogDropped = 0;
334
+ const bumpEpoch = () => {
335
+ window.__orbitalVerification.eventLogEpoch = `${Date.now()}-${Math.random().toString(36).slice(2)}`;
336
+ };
337
+ window.__orbitalVerification.eventLog = eventLog;
338
+ window.__orbitalVerification.eventLogDropped = 0;
339
+ bumpEpoch();
340
+ window.__orbitalVerification.clearEventLog = () => {
341
+ eventLog.length = 0;
342
+ eventLogDropped = 0;
343
+ window.__orbitalVerification.eventLogDropped = 0;
344
+ bumpEpoch();
345
+ };
346
+ if (eventBus.onAny) {
347
+ const verificationRegistryEventLogger = (event) => {
348
+ eventLog.push({
349
+ type: event.type,
350
+ payload: event.payload,
351
+ ...event.source === void 0 ? {} : { source: event.source },
352
+ timestamp: Date.now()
353
+ });
354
+ if (eventLog.length > MAX_EVENT_LOG) {
355
+ eventLog.shift();
356
+ eventLogDropped += 1;
357
+ window.__orbitalVerification.eventLogDropped = eventLogDropped;
358
+ }
359
+ };
360
+ Object.defineProperty(verificationRegistryEventLogger, "name", {
361
+ value: "verificationRegistry:eventLog"
362
+ });
363
+ eventBus.onAny(verificationRegistryEventLogger);
364
+ }
365
+ }
366
+ }
367
+ function bindConfigApplier(applyConfig) {
368
+ if (typeof window === "undefined") return () => {
369
+ };
370
+ exposeOnWindow();
371
+ const bridge = window.__orbitalVerification;
372
+ if (!bridge) return () => {
373
+ };
374
+ bridge.applyConfig = applyConfig;
375
+ return () => {
376
+ if (bridge.applyConfig === applyConfig) delete bridge.applyConfig;
377
+ };
378
+ }
379
+ function bindTraitStateGetter(getter) {
380
+ if (typeof window === "undefined") return;
381
+ exposeOnWindow();
382
+ if (window.__orbitalVerification) {
383
+ window.__orbitalVerification.getTraitState = getter;
384
+ }
385
+ }
386
+ function registerTraitSnapshot(traitName, getter) {
387
+ if (typeof window === "undefined") return () => {
388
+ };
389
+ getState().traitSnapshots.set(traitName, getter);
390
+ exposeOnWindow();
391
+ notifyListeners();
392
+ return () => {
393
+ const s = getState();
394
+ if (s.traitSnapshots.get(traitName) === getter) {
395
+ s.traitSnapshots.delete(traitName);
396
+ notifyListeners();
397
+ }
398
+ };
399
+ }
400
+ function bindCanvasCapture(captureFn) {
401
+ if (typeof window === "undefined") return;
402
+ exposeOnWindow();
403
+ if (window.__orbitalVerification) {
404
+ window.__orbitalVerification.captureFrame = captureFn;
405
+ }
406
+ }
407
+ function bindLastDrawables(getDrawables) {
408
+ if (typeof window === "undefined") return;
409
+ exposeOnWindow();
410
+ if (window.__orbitalVerification) {
411
+ window.__orbitalVerification.getLastDrawables = getDrawables;
412
+ }
413
+ }
414
+ function updateAssetStatus(url, status) {
415
+ if (typeof window === "undefined") return;
416
+ exposeOnWindow();
417
+ if (window.__orbitalVerification) {
418
+ if (!window.__orbitalVerification.assetStatus) {
419
+ window.__orbitalVerification.assetStatus = {};
420
+ }
421
+ window.__orbitalVerification.assetStatus[url] = status;
422
+ }
423
+ }
424
+ function clearVerification() {
425
+ getState().checks.clear();
426
+ getState().transitions.length = 0;
427
+ getState().bridgeHealth = null;
428
+ notifyListeners();
429
+ }
430
+ exposeOnWindow();
431
+
432
+ export { bindCanvasCapture, bindConfigApplier, bindEventBus, bindLastDrawables, bindTraitStateGetter, clearVerification, getAllChecks, getBridgeHealth, getSnapshot, getSummary, getTraitSnapshots, getTransitions, getTransitionsForTrait, isEditableTarget, keyMapCode, recordOrbitalResponse, recordServerResponse, recordTransition, recordingTransport, registerCheck, registerTraitSnapshot, resolveKeyMapEvent, serverEffectTraces, subscribeToVerification, updateAssetStatus, updateBridgeHealth, updateCheck, verifierAttached, waitForTransition };