@almadar/ui 2.46.1 → 2.47.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.
@@ -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.0",
4
4
  "description": "React UI components, hooks, and providers for Almadar",
5
5
  "type": "module",
6
6
  "main": "./dist/components/index.js",