@almadar/ui 2.46.1 → 2.47.1

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.
@@ -41,6 +41,7 @@ var langToml = require('react-syntax-highlighter/dist/esm/languages/prism/toml')
41
41
  var langGo = require('react-syntax-highlighter/dist/esm/languages/prism/go');
42
42
  var langGraphql = require('react-syntax-highlighter/dist/esm/languages/prism/graphql');
43
43
 
44
+ var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
44
45
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
45
46
 
46
47
  function _interopNamespace(e) {
@@ -90,6 +91,67 @@ var langGraphql__default = /*#__PURE__*/_interopDefault(langGraphql);
90
91
  var __defProp = Object.defineProperty;
91
92
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
92
93
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
94
+
95
+ // lib/logger.ts
96
+ var LEVEL_PRIORITY = { DEBUG: 0, INFO: 1, WARN: 2, ERROR: 3 };
97
+ var ENV = typeof process !== "undefined" && process.env ? process.env : {};
98
+ var VITE_ENV = typeof globalThis !== "undefined" && globalThis.__vite_env__ ? globalThis.__vite_env__ : {};
99
+ function getViteEnv(key) {
100
+ try {
101
+ const meta = ({ url: (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)) });
102
+ return meta?.env?.[key];
103
+ } catch {
104
+ return void 0;
105
+ }
106
+ }
107
+ function envGet(key, viteKey) {
108
+ return ENV[key] ?? (viteKey ? getViteEnv(viteKey) : void 0) ?? VITE_ENV[viteKey ?? key];
109
+ }
110
+ var NODE_ENV = envGet("NODE_ENV", "VITE_NODE_ENV") ?? "development";
111
+ var CONFIGURED_LEVEL = (envGet("LOG_LEVEL", "VITE_LOG_LEVEL") ?? (NODE_ENV === "production" ? "info" : "debug")).toUpperCase();
112
+ var MIN_PRIORITY = LEVEL_PRIORITY[CONFIGURED_LEVEL] ?? 0;
113
+ var DEBUG_FILTER = (envGet("ALMADAR_DEBUG", "VITE_ALMADAR_DEBUG") ?? "").split(",").map((s) => s.trim()).filter(Boolean);
114
+ function matchesNamespace(namespace) {
115
+ if (DEBUG_FILTER.length === 0) return true;
116
+ return DEBUG_FILTER.some((pattern) => {
117
+ if (pattern === "*" || pattern === "almadar:*") return true;
118
+ if (pattern.endsWith(":*")) return namespace.startsWith(pattern.slice(0, -1));
119
+ return namespace === pattern;
120
+ });
121
+ }
122
+ function createLogger(namespace) {
123
+ const nsAllowed = matchesNamespace(namespace);
124
+ const log4 = (level, message, data, correlationId) => {
125
+ if (LEVEL_PRIORITY[level] < MIN_PRIORITY) return;
126
+ if (level === "DEBUG" && !nsAllowed) return;
127
+ const prefix = `[${namespace}]`;
128
+ const logData = correlationId ? { ...data, cid: correlationId } : data;
129
+ switch (level) {
130
+ case "DEBUG":
131
+ console.debug(prefix, message, logData ?? "");
132
+ break;
133
+ case "INFO":
134
+ console.info(prefix, message, logData ?? "");
135
+ break;
136
+ case "WARN":
137
+ console.warn(prefix, message, logData ?? "");
138
+ break;
139
+ case "ERROR":
140
+ console.error(prefix, message, logData ?? "");
141
+ break;
142
+ }
143
+ };
144
+ return {
145
+ debug: (msg, data, cid) => log4("DEBUG", msg, data, cid),
146
+ info: (msg, data, cid) => log4("INFO", msg, data, cid),
147
+ warn: (msg, data, cid) => log4("WARN", msg, data, cid),
148
+ error: (msg, data, cid) => log4("ERROR", msg, data, cid)
149
+ };
150
+ }
151
+
152
+ // hooks/useEventBus.ts
153
+ var log = createLogger("almadar:eventbus");
154
+ var subLog = createLogger("almadar:eventbus:subscribe");
93
155
  function setGlobalEventBus(bus) {
94
156
  if (typeof window !== "undefined") {
95
157
  window.__kflowEventBus = bus;
@@ -111,6 +173,7 @@ var fallbackEventBus = {
111
173
  timestamp: Date.now()
112
174
  };
113
175
  const handlers = fallbackListeners.get(type);
176
+ log.debug("emit", { type, payloadKeys: payload ? Object.keys(payload).length : 0, listenerCount: (handlers?.size ?? 0) + fallbackAnyListeners.size });
114
177
  if (handlers) {
115
178
  handlers.forEach((handler) => {
116
179
  try {
@@ -133,6 +196,7 @@ var fallbackEventBus = {
133
196
  fallbackListeners.set(type, /* @__PURE__ */ new Set());
134
197
  }
135
198
  fallbackListeners.get(type).add(listener);
199
+ subLog.debug("subscribe", { type, totalListeners: fallbackListeners.get(type).size });
136
200
  return () => {
137
201
  const handlers = fallbackListeners.get(type);
138
202
  if (handlers) {
@@ -156,6 +220,7 @@ var fallbackEventBus = {
156
220
  },
157
221
  onAny: (listener) => {
158
222
  fallbackAnyListeners.add(listener);
223
+ subLog.debug("subscribe:any", { totalAnyListeners: fallbackAnyListeners.size });
159
224
  return () => {
160
225
  fallbackAnyListeners.delete(listener);
161
226
  };
@@ -814,6 +879,7 @@ function subscribeToTraitChanges(listener) {
814
879
  }
815
880
 
816
881
  // lib/verificationRegistry.ts
882
+ var log2 = createLogger("almadar:bridge");
817
883
  var MAX_TRANSITIONS = 500;
818
884
  function getState() {
819
885
  if (typeof window !== "undefined") {
@@ -846,6 +912,7 @@ function recordTransition(trace) {
846
912
  ...trace,
847
913
  id: `t-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`
848
914
  };
915
+ log2.info("transition:recorded", { trait: trace.traitName, from: trace.from, to: trace.to, event: trace.event, effectCount: trace.effects.length });
849
916
  getState().transitions.push(entry);
850
917
  if (getState().transitions.length > MAX_TRANSITIONS) {
851
918
  getState().transitions.shift();
@@ -977,10 +1044,12 @@ function waitForTransition(event, timeoutMs = 1e4) {
977
1044
  }
978
1045
  function bindEventBus(eventBus) {
979
1046
  if (typeof window === "undefined") return;
1047
+ log2.info("bindEventBus", { hasOnAny: !!eventBus.onAny });
980
1048
  exposeOnWindow();
981
1049
  if (window.__orbitalVerification) {
982
1050
  window.__orbitalVerification.sendEvent = (event, payload) => {
983
1051
  const prefixed = event.startsWith("UI:") ? event : `UI:${event}`;
1052
+ log2.debug("sendEvent", { event: prefixed, payloadKeys: payload ? Object.keys(payload) : [] });
984
1053
  eventBus.emit(prefixed, payload);
985
1054
  };
986
1055
  const eventLog = [];
@@ -2132,6 +2201,7 @@ function useTheme() {
2132
2201
  }
2133
2202
  return context;
2134
2203
  }
2204
+ var storeLog = createLogger("almadar:entity:store");
2135
2205
  var store = /* @__PURE__ */ new Map();
2136
2206
  var storeListeners = /* @__PURE__ */ new Set();
2137
2207
  var watchCallbacks = /* @__PURE__ */ new Map();
@@ -2171,7 +2241,9 @@ function setAll(entityType, records) {
2171
2241
  }
2172
2242
  }
2173
2243
  const prev = store.get(entityType);
2174
- store.set(entityType, { entities, ids, version: (prev?.version ?? 0) + 1 });
2244
+ const newVersion = (prev?.version ?? 0) + 1;
2245
+ store.set(entityType, { entities, ids, version: newVersion });
2246
+ storeLog.debug("setAll", { entityType, recordCount: records.length, version: newVersion });
2175
2247
  notifyListeners3(entityType, prev);
2176
2248
  }
2177
2249
  function upsertOne(entityType, record) {
@@ -2183,6 +2255,7 @@ function upsertOne(entityType, record) {
2183
2255
  if (!snapshot.ids.includes(id)) snapshot.ids.push(id);
2184
2256
  snapshot.version++;
2185
2257
  store.set(entityType, snapshot);
2258
+ storeLog.debug("upsertOne", { entityType, id, version: snapshot.version });
2186
2259
  notifyListeners3(entityType, prev);
2187
2260
  }
2188
2261
  function addOne(entityType, record) {
@@ -2199,6 +2272,7 @@ function updateOne(entityType, id, changes) {
2199
2272
  snapshot.entities.set(id, { ...snapshot.entities.get(id), ...changes });
2200
2273
  snapshot.version++;
2201
2274
  store.set(entityType, snapshot);
2275
+ storeLog.debug("updateOne", { entityType, id, changedFields: Object.keys(changes), version: snapshot.version });
2202
2276
  notifyListeners3(entityType, prev);
2203
2277
  }
2204
2278
  function removeOne(entityType, id) {
@@ -2212,6 +2286,7 @@ function removeOne(entityType, id) {
2212
2286
  snapshot.entities.delete(id);
2213
2287
  snapshot.version++;
2214
2288
  store.set(entityType, snapshot);
2289
+ storeLog.debug("removeOne", { entityType, id, remainingCount: snapshot.ids.length, version: snapshot.version });
2215
2290
  notifyListeners3(entityType, prev);
2216
2291
  }
2217
2292
  function getSnapshot3(entityType) {
@@ -2260,6 +2335,8 @@ function useEntityStore() {
2260
2335
  function EntityStoreProvider({ children }) {
2261
2336
  return /* @__PURE__ */ jsxRuntime.jsx(EntityStoreContext.Provider, { value: contextValue, children });
2262
2337
  }
2338
+ var busLog = createLogger("almadar:eventbus");
2339
+ var subLog2 = createLogger("almadar:eventbus:subscribe");
2263
2340
  var EventBusContext2 = React117.createContext(null);
2264
2341
  function EventBusProvider({ children, debug: debug2 = false }) {
2265
2342
  const listenersRef = React117.useRef(/* @__PURE__ */ new Map());
@@ -2289,7 +2366,8 @@ function EventBusProvider({ children, debug: debug2 = false }) {
2289
2366
  timestamp: Date.now()
2290
2367
  };
2291
2368
  const listeners6 = listenersRef.current.get(type);
2292
- const listenerCount = listeners6?.size ?? 0;
2369
+ const listenerCount = (listeners6?.size ?? 0) + anyListenersRef.current.size;
2370
+ busLog.debug("emit", { type, payloadKeys: payload ? Object.keys(payload).length : 0, listenerCount });
2293
2371
  if (debug2) {
2294
2372
  if (listenerCount > 0) {
2295
2373
  console.log(`[EventBus] Emit: ${type} \u2192 ${listenerCount} listener(s)`, payload);
@@ -2322,6 +2400,7 @@ function EventBusProvider({ children, debug: debug2 = false }) {
2322
2400
  }
2323
2401
  const listeners6 = listenersRef.current.get(type);
2324
2402
  listeners6.add(listener);
2403
+ subLog2.debug("subscribe", { type, totalListeners: listeners6.size });
2325
2404
  if (debug2) {
2326
2405
  console.log(`[EventBus] Subscribed to '${type}', total: ${listeners6.size}`);
2327
2406
  }
@@ -2348,6 +2427,7 @@ function EventBusProvider({ children, debug: debug2 = false }) {
2348
2427
  }, []);
2349
2428
  const onAny = React117.useCallback((listener) => {
2350
2429
  anyListenersRef.current.add(listener);
2430
+ subLog2.debug("subscribe:any", { totalAnyListeners: anyListenersRef.current.size });
2351
2431
  if (debug2) {
2352
2432
  console.log(`[EventBus] onAny subscribed, total: ${anyListenersRef.current.size}`);
2353
2433
  }
@@ -28492,7 +28572,7 @@ function getAllEvents(traits2) {
28492
28572
  }
28493
28573
  function EventDispatcherTab({ traits: traits2, schema }) {
28494
28574
  const eventBus = useEventBus();
28495
- const [log, setLog] = React117__namespace.useState([]);
28575
+ const [log4, setLog] = React117__namespace.useState([]);
28496
28576
  const prevStatesRef = React117__namespace.useRef(/* @__PURE__ */ new Map());
28497
28577
  React117__namespace.useEffect(() => {
28498
28578
  for (const trait of traits2) {
@@ -28556,9 +28636,9 @@ function EventDispatcherTab({ traits: traits2, schema }) {
28556
28636
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Other Events (not available from current state)" }),
28557
28637
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: unavailableEvents.map((event) => /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "default", size: "sm", className: "opacity-50", children: event }, event)) })
28558
28638
  ] }),
28559
- log.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
28639
+ log4.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
28560
28640
  /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Recent Transitions" }),
28561
- /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: log.map((entry, i) => /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "font-mono text-xs", children: [
28641
+ /* @__PURE__ */ jsxRuntime.jsx(Stack, { gap: "xs", children: log4.map((entry, i) => /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "small", className: "font-mono text-xs", children: [
28562
28642
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-purple-400", children: entry.traitName }),
28563
28643
  " ",
28564
28644
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-gray-500", children: entry.from }),
@@ -33097,6 +33177,7 @@ function UISlotRenderer({
33097
33177
  return wrapped;
33098
33178
  }
33099
33179
  UISlotRenderer.displayName = "UISlotRenderer";
33180
+ var log3 = createLogger("almadar:verify");
33100
33181
  var DISPATCH_SUFFIX = ":DISPATCH";
33101
33182
  var SUCCESS_SUFFIX = ":SUCCESS";
33102
33183
  var ERROR_SUFFIX = ":ERROR";
@@ -33142,6 +33223,7 @@ function VerificationProvider({
33142
33223
  const unsub = eventBus.onAny((evt) => {
33143
33224
  const parsed = parseLifecycleEvent(evt.type);
33144
33225
  if (!parsed) return;
33226
+ log3.debug("lifecycle:event", { kind: parsed.kind, traitName: parsed.traitName, event: parsed.event, type: evt.type });
33145
33227
  const payload = evt.payload ?? {};
33146
33228
  if (parsed.kind === "dispatch") {
33147
33229
  const key = `${parsed.traitName}:${String(payload["event"] ?? "")}`;
@@ -33194,6 +33276,7 @@ function VerificationProvider({
33194
33276
  },
33195
33277
  timestamp: Date.now()
33196
33278
  });
33279
+ log3.info("transition:success", { trait: parsed.traitName, event: parsed.event, from: pending?.from, to: newState, effectCount: effects.length });
33197
33280
  } else if (parsed.kind === "error" && parsed.event) {
33198
33281
  const key = `${parsed.traitName}:${parsed.event}`;
33199
33282
  const pending = pendingRef.current.get(key);
@@ -33223,6 +33306,7 @@ function VerificationProvider({
33223
33306
  },
33224
33307
  timestamp: Date.now()
33225
33308
  });
33309
+ log3.warn("transition:error", { trait: parsed.traitName, event: parsed.event, from: fromState, error: errorMsg });
33226
33310
  }
33227
33311
  });
33228
33312
  registerCheck(
@@ -44,6 +44,67 @@ import langGraphql from 'react-syntax-highlighter/dist/esm/languages/prism/graph
44
44
  var __defProp = Object.defineProperty;
45
45
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
46
46
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
47
+
48
+ // lib/logger.ts
49
+ var LEVEL_PRIORITY = { DEBUG: 0, INFO: 1, WARN: 2, ERROR: 3 };
50
+ var ENV = typeof process !== "undefined" && process.env ? process.env : {};
51
+ var VITE_ENV = typeof globalThis !== "undefined" && globalThis.__vite_env__ ? globalThis.__vite_env__ : {};
52
+ function getViteEnv(key) {
53
+ try {
54
+ const meta = import.meta;
55
+ return meta?.env?.[key];
56
+ } catch {
57
+ return void 0;
58
+ }
59
+ }
60
+ function envGet(key, viteKey) {
61
+ return ENV[key] ?? (viteKey ? getViteEnv(viteKey) : void 0) ?? VITE_ENV[viteKey ?? key];
62
+ }
63
+ var NODE_ENV = envGet("NODE_ENV", "VITE_NODE_ENV") ?? "development";
64
+ var CONFIGURED_LEVEL = (envGet("LOG_LEVEL", "VITE_LOG_LEVEL") ?? (NODE_ENV === "production" ? "info" : "debug")).toUpperCase();
65
+ var MIN_PRIORITY = LEVEL_PRIORITY[CONFIGURED_LEVEL] ?? 0;
66
+ var DEBUG_FILTER = (envGet("ALMADAR_DEBUG", "VITE_ALMADAR_DEBUG") ?? "").split(",").map((s) => s.trim()).filter(Boolean);
67
+ function matchesNamespace(namespace) {
68
+ if (DEBUG_FILTER.length === 0) return true;
69
+ return DEBUG_FILTER.some((pattern) => {
70
+ if (pattern === "*" || pattern === "almadar:*") return true;
71
+ if (pattern.endsWith(":*")) return namespace.startsWith(pattern.slice(0, -1));
72
+ return namespace === pattern;
73
+ });
74
+ }
75
+ function createLogger(namespace) {
76
+ const nsAllowed = matchesNamespace(namespace);
77
+ const log4 = (level, message, data, correlationId) => {
78
+ if (LEVEL_PRIORITY[level] < MIN_PRIORITY) return;
79
+ if (level === "DEBUG" && !nsAllowed) return;
80
+ const prefix = `[${namespace}]`;
81
+ const logData = correlationId ? { ...data, cid: correlationId } : data;
82
+ switch (level) {
83
+ case "DEBUG":
84
+ console.debug(prefix, message, logData ?? "");
85
+ break;
86
+ case "INFO":
87
+ console.info(prefix, message, logData ?? "");
88
+ break;
89
+ case "WARN":
90
+ console.warn(prefix, message, logData ?? "");
91
+ break;
92
+ case "ERROR":
93
+ console.error(prefix, message, logData ?? "");
94
+ break;
95
+ }
96
+ };
97
+ return {
98
+ debug: (msg, data, cid) => log4("DEBUG", msg, data, cid),
99
+ info: (msg, data, cid) => log4("INFO", msg, data, cid),
100
+ warn: (msg, data, cid) => log4("WARN", msg, data, cid),
101
+ error: (msg, data, cid) => log4("ERROR", msg, data, cid)
102
+ };
103
+ }
104
+
105
+ // hooks/useEventBus.ts
106
+ var log = createLogger("almadar:eventbus");
107
+ var subLog = createLogger("almadar:eventbus:subscribe");
47
108
  function setGlobalEventBus(bus) {
48
109
  if (typeof window !== "undefined") {
49
110
  window.__kflowEventBus = bus;
@@ -65,6 +126,7 @@ var fallbackEventBus = {
65
126
  timestamp: Date.now()
66
127
  };
67
128
  const handlers = fallbackListeners.get(type);
129
+ log.debug("emit", { type, payloadKeys: payload ? Object.keys(payload).length : 0, listenerCount: (handlers?.size ?? 0) + fallbackAnyListeners.size });
68
130
  if (handlers) {
69
131
  handlers.forEach((handler) => {
70
132
  try {
@@ -87,6 +149,7 @@ var fallbackEventBus = {
87
149
  fallbackListeners.set(type, /* @__PURE__ */ new Set());
88
150
  }
89
151
  fallbackListeners.get(type).add(listener);
152
+ subLog.debug("subscribe", { type, totalListeners: fallbackListeners.get(type).size });
90
153
  return () => {
91
154
  const handlers = fallbackListeners.get(type);
92
155
  if (handlers) {
@@ -110,6 +173,7 @@ var fallbackEventBus = {
110
173
  },
111
174
  onAny: (listener) => {
112
175
  fallbackAnyListeners.add(listener);
176
+ subLog.debug("subscribe:any", { totalAnyListeners: fallbackAnyListeners.size });
113
177
  return () => {
114
178
  fallbackAnyListeners.delete(listener);
115
179
  };
@@ -768,6 +832,7 @@ function subscribeToTraitChanges(listener) {
768
832
  }
769
833
 
770
834
  // lib/verificationRegistry.ts
835
+ var log2 = createLogger("almadar:bridge");
771
836
  var MAX_TRANSITIONS = 500;
772
837
  function getState() {
773
838
  if (typeof window !== "undefined") {
@@ -800,6 +865,7 @@ function recordTransition(trace) {
800
865
  ...trace,
801
866
  id: `t-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`
802
867
  };
868
+ log2.info("transition:recorded", { trait: trace.traitName, from: trace.from, to: trace.to, event: trace.event, effectCount: trace.effects.length });
803
869
  getState().transitions.push(entry);
804
870
  if (getState().transitions.length > MAX_TRANSITIONS) {
805
871
  getState().transitions.shift();
@@ -931,10 +997,12 @@ function waitForTransition(event, timeoutMs = 1e4) {
931
997
  }
932
998
  function bindEventBus(eventBus) {
933
999
  if (typeof window === "undefined") return;
1000
+ log2.info("bindEventBus", { hasOnAny: !!eventBus.onAny });
934
1001
  exposeOnWindow();
935
1002
  if (window.__orbitalVerification) {
936
1003
  window.__orbitalVerification.sendEvent = (event, payload) => {
937
1004
  const prefixed = event.startsWith("UI:") ? event : `UI:${event}`;
1005
+ log2.debug("sendEvent", { event: prefixed, payloadKeys: payload ? Object.keys(payload) : [] });
938
1006
  eventBus.emit(prefixed, payload);
939
1007
  };
940
1008
  const eventLog = [];
@@ -2086,6 +2154,7 @@ function useTheme() {
2086
2154
  }
2087
2155
  return context;
2088
2156
  }
2157
+ var storeLog = createLogger("almadar:entity:store");
2089
2158
  var store = /* @__PURE__ */ new Map();
2090
2159
  var storeListeners = /* @__PURE__ */ new Set();
2091
2160
  var watchCallbacks = /* @__PURE__ */ new Map();
@@ -2125,7 +2194,9 @@ function setAll(entityType, records) {
2125
2194
  }
2126
2195
  }
2127
2196
  const prev = store.get(entityType);
2128
- store.set(entityType, { entities, ids, version: (prev?.version ?? 0) + 1 });
2197
+ const newVersion = (prev?.version ?? 0) + 1;
2198
+ store.set(entityType, { entities, ids, version: newVersion });
2199
+ storeLog.debug("setAll", { entityType, recordCount: records.length, version: newVersion });
2129
2200
  notifyListeners3(entityType, prev);
2130
2201
  }
2131
2202
  function upsertOne(entityType, record) {
@@ -2137,6 +2208,7 @@ function upsertOne(entityType, record) {
2137
2208
  if (!snapshot.ids.includes(id)) snapshot.ids.push(id);
2138
2209
  snapshot.version++;
2139
2210
  store.set(entityType, snapshot);
2211
+ storeLog.debug("upsertOne", { entityType, id, version: snapshot.version });
2140
2212
  notifyListeners3(entityType, prev);
2141
2213
  }
2142
2214
  function addOne(entityType, record) {
@@ -2153,6 +2225,7 @@ function updateOne(entityType, id, changes) {
2153
2225
  snapshot.entities.set(id, { ...snapshot.entities.get(id), ...changes });
2154
2226
  snapshot.version++;
2155
2227
  store.set(entityType, snapshot);
2228
+ storeLog.debug("updateOne", { entityType, id, changedFields: Object.keys(changes), version: snapshot.version });
2156
2229
  notifyListeners3(entityType, prev);
2157
2230
  }
2158
2231
  function removeOne(entityType, id) {
@@ -2166,6 +2239,7 @@ function removeOne(entityType, id) {
2166
2239
  snapshot.entities.delete(id);
2167
2240
  snapshot.version++;
2168
2241
  store.set(entityType, snapshot);
2242
+ storeLog.debug("removeOne", { entityType, id, remainingCount: snapshot.ids.length, version: snapshot.version });
2169
2243
  notifyListeners3(entityType, prev);
2170
2244
  }
2171
2245
  function getSnapshot3(entityType) {
@@ -2214,6 +2288,8 @@ function useEntityStore() {
2214
2288
  function EntityStoreProvider({ children }) {
2215
2289
  return /* @__PURE__ */ jsx(EntityStoreContext.Provider, { value: contextValue, children });
2216
2290
  }
2291
+ var busLog = createLogger("almadar:eventbus");
2292
+ var subLog2 = createLogger("almadar:eventbus:subscribe");
2217
2293
  var EventBusContext2 = createContext(null);
2218
2294
  function EventBusProvider({ children, debug: debug2 = false }) {
2219
2295
  const listenersRef = useRef(/* @__PURE__ */ new Map());
@@ -2243,7 +2319,8 @@ function EventBusProvider({ children, debug: debug2 = false }) {
2243
2319
  timestamp: Date.now()
2244
2320
  };
2245
2321
  const listeners6 = listenersRef.current.get(type);
2246
- const listenerCount = listeners6?.size ?? 0;
2322
+ const listenerCount = (listeners6?.size ?? 0) + anyListenersRef.current.size;
2323
+ busLog.debug("emit", { type, payloadKeys: payload ? Object.keys(payload).length : 0, listenerCount });
2247
2324
  if (debug2) {
2248
2325
  if (listenerCount > 0) {
2249
2326
  console.log(`[EventBus] Emit: ${type} \u2192 ${listenerCount} listener(s)`, payload);
@@ -2276,6 +2353,7 @@ function EventBusProvider({ children, debug: debug2 = false }) {
2276
2353
  }
2277
2354
  const listeners6 = listenersRef.current.get(type);
2278
2355
  listeners6.add(listener);
2356
+ subLog2.debug("subscribe", { type, totalListeners: listeners6.size });
2279
2357
  if (debug2) {
2280
2358
  console.log(`[EventBus] Subscribed to '${type}', total: ${listeners6.size}`);
2281
2359
  }
@@ -2302,6 +2380,7 @@ function EventBusProvider({ children, debug: debug2 = false }) {
2302
2380
  }, []);
2303
2381
  const onAny = useCallback((listener) => {
2304
2382
  anyListenersRef.current.add(listener);
2383
+ subLog2.debug("subscribe:any", { totalAnyListeners: anyListenersRef.current.size });
2305
2384
  if (debug2) {
2306
2385
  console.log(`[EventBus] onAny subscribed, total: ${anyListenersRef.current.size}`);
2307
2386
  }
@@ -28446,7 +28525,7 @@ function getAllEvents(traits2) {
28446
28525
  }
28447
28526
  function EventDispatcherTab({ traits: traits2, schema }) {
28448
28527
  const eventBus = useEventBus();
28449
- const [log, setLog] = React117.useState([]);
28528
+ const [log4, setLog] = React117.useState([]);
28450
28529
  const prevStatesRef = React117.useRef(/* @__PURE__ */ new Map());
28451
28530
  React117.useEffect(() => {
28452
28531
  for (const trait of traits2) {
@@ -28510,9 +28589,9 @@ function EventDispatcherTab({ traits: traits2, schema }) {
28510
28589
  /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Other Events (not available from current state)" }),
28511
28590
  /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: unavailableEvents.map((event) => /* @__PURE__ */ jsx(Badge, { variant: "default", size: "sm", className: "opacity-50", children: event }, event)) })
28512
28591
  ] }),
28513
- log.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
28592
+ log4.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
28514
28593
  /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-gray-500 mb-1", children: "Recent Transitions" }),
28515
- /* @__PURE__ */ jsx(Stack, { gap: "xs", children: log.map((entry, i) => /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "font-mono text-xs", children: [
28594
+ /* @__PURE__ */ jsx(Stack, { gap: "xs", children: log4.map((entry, i) => /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "font-mono text-xs", children: [
28516
28595
  /* @__PURE__ */ jsx("span", { className: "text-purple-400", children: entry.traitName }),
28517
28596
  " ",
28518
28597
  /* @__PURE__ */ jsx("span", { className: "text-gray-500", children: entry.from }),
@@ -33051,6 +33130,7 @@ function UISlotRenderer({
33051
33130
  return wrapped;
33052
33131
  }
33053
33132
  UISlotRenderer.displayName = "UISlotRenderer";
33133
+ var log3 = createLogger("almadar:verify");
33054
33134
  var DISPATCH_SUFFIX = ":DISPATCH";
33055
33135
  var SUCCESS_SUFFIX = ":SUCCESS";
33056
33136
  var ERROR_SUFFIX = ":ERROR";
@@ -33096,6 +33176,7 @@ function VerificationProvider({
33096
33176
  const unsub = eventBus.onAny((evt) => {
33097
33177
  const parsed = parseLifecycleEvent(evt.type);
33098
33178
  if (!parsed) return;
33179
+ log3.debug("lifecycle:event", { kind: parsed.kind, traitName: parsed.traitName, event: parsed.event, type: evt.type });
33099
33180
  const payload = evt.payload ?? {};
33100
33181
  if (parsed.kind === "dispatch") {
33101
33182
  const key = `${parsed.traitName}:${String(payload["event"] ?? "")}`;
@@ -33148,6 +33229,7 @@ function VerificationProvider({
33148
33229
  },
33149
33230
  timestamp: Date.now()
33150
33231
  });
33232
+ log3.info("transition:success", { trait: parsed.traitName, event: parsed.event, from: pending?.from, to: newState, effectCount: effects.length });
33151
33233
  } else if (parsed.kind === "error" && parsed.event) {
33152
33234
  const key = `${parsed.traitName}:${parsed.event}`;
33153
33235
  const pending = pendingRef.current.get(key);
@@ -33177,6 +33259,7 @@ function VerificationProvider({
33177
33259
  },
33178
33260
  timestamp: Date.now()
33179
33261
  });
33262
+ log3.warn("transition:error", { trait: parsed.traitName, event: parsed.event, from: fromState, error: errorMsg });
33180
33263
  }
33181
33264
  });
33182
33265
  registerCheck(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/ui",
3
- "version": "2.46.1",
3
+ "version": "2.47.1",
4
4
  "description": "React UI components, hooks, and providers for Almadar",
5
5
  "type": "module",
6
6
  "main": "./dist/components/index.js",