@hypen-space/core 0.3.9 → 0.3.11

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 (80) hide show
  1. package/dist/{src/app.js → app.js} +15 -2
  2. package/dist/{src/app.js.map → app.js.map} +3 -3
  3. package/dist/{src/components → components}/builtin.js +22 -7
  4. package/dist/{src/components → components}/builtin.js.map +4 -4
  5. package/dist/context.js +387 -0
  6. package/dist/context.js.map +12 -0
  7. package/dist/{src/discovery.js → discovery.js} +18 -4
  8. package/dist/{src/discovery.js.map → discovery.js.map} +4 -4
  9. package/dist/disposable.js +377 -0
  10. package/dist/disposable.js.map +11 -0
  11. package/dist/engine.browser.js +347 -0
  12. package/dist/engine.browser.js.map +11 -0
  13. package/dist/engine.js +320 -0
  14. package/dist/engine.js.map +11 -0
  15. package/dist/events.js +282 -0
  16. package/dist/events.js.map +11 -0
  17. package/dist/{src/index.browser.js → index.browser.js} +278 -229
  18. package/dist/index.browser.js.map +22 -0
  19. package/dist/{src/index.js → index.js} +1377 -1330
  20. package/dist/index.js.map +31 -0
  21. package/dist/loader.js +286 -0
  22. package/dist/loader.js.map +11 -0
  23. package/dist/plugin.js +334 -0
  24. package/dist/plugin.js.map +11 -0
  25. package/dist/{src/remote → remote}/client.js +215 -11
  26. package/dist/remote/client.js.map +14 -0
  27. package/dist/{src/remote → remote}/index.js +234 -210
  28. package/dist/remote/index.js.map +19 -0
  29. package/dist/remote/server.js +1442 -0
  30. package/dist/remote/server.js.map +16 -0
  31. package/dist/renderer.js +264 -0
  32. package/dist/renderer.js.map +11 -0
  33. package/dist/{src/router.js → router.js} +209 -8
  34. package/dist/router.js.map +12 -0
  35. package/package.json +69 -69
  36. package/src/components/builtin.ts +9 -6
  37. package/src/context.ts +10 -7
  38. package/src/discovery.ts +3 -2
  39. package/src/disposable.ts +6 -2
  40. package/src/engine.browser.ts +30 -11
  41. package/src/engine.ts +6 -3
  42. package/src/events.ts +5 -1
  43. package/src/index.browser.ts +20 -0
  44. package/src/index.ts +2 -0
  45. package/src/loader.ts +8 -8
  46. package/src/logger.ts +28 -0
  47. package/src/plugin.ts +2 -1
  48. package/src/remote/client.ts +8 -9
  49. package/src/remote/server.ts +6 -3
  50. package/src/renderer.ts +4 -5
  51. package/src/router.ts +10 -7
  52. package/wasm-browser/hypen_engine_bg.wasm +0 -0
  53. package/wasm-browser/package.json +1 -1
  54. package/wasm-node/hypen_engine_bg.wasm +0 -0
  55. package/wasm-node/package.json +5 -3
  56. package/dist/src/context.js +0 -182
  57. package/dist/src/context.js.map +0 -11
  58. package/dist/src/engine.browser.js +0 -137
  59. package/dist/src/engine.browser.js.map +0 -10
  60. package/dist/src/engine.js +0 -119
  61. package/dist/src/engine.js.map +0 -10
  62. package/dist/src/events.js +0 -80
  63. package/dist/src/events.js.map +0 -10
  64. package/dist/src/index.browser.js.map +0 -22
  65. package/dist/src/index.js.map +0 -31
  66. package/dist/src/loader.js +0 -85
  67. package/dist/src/loader.js.map +0 -10
  68. package/dist/src/plugin.js +0 -134
  69. package/dist/src/plugin.js.map +0 -10
  70. package/dist/src/remote/client.js.map +0 -13
  71. package/dist/src/remote/index.js.map +0 -19
  72. package/dist/src/renderer.js +0 -66
  73. package/dist/src/renderer.js.map +0 -10
  74. package/dist/src/router.js.map +0 -11
  75. /package/dist/{src/remote → remote}/types.js +0 -0
  76. /package/dist/{src/remote → remote}/types.js.map +0 -0
  77. /package/dist/{src/resolver.js → resolver.js} +0 -0
  78. /package/dist/{src/resolver.js.map → resolver.js.map} +0 -0
  79. /package/dist/{src/state.js → state.js} +0 -0
  80. /package/dist/{src/state.js.map → state.js.map} +0 -0
@@ -10,6 +10,205 @@ var __export = (target, all) => {
10
10
  };
11
11
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
12
12
 
13
+ // src/logger.ts
14
+ function isProduction() {
15
+ if (typeof process !== "undefined" && process.env) {
16
+ return false;
17
+ }
18
+ return false;
19
+ }
20
+ function setLogLevel(level) {
21
+ config.level = level;
22
+ }
23
+ function getLogLevel() {
24
+ return config.level;
25
+ }
26
+ function configureLogger(options) {
27
+ config = { ...config, ...options };
28
+ }
29
+ function enableLogging() {
30
+ config.level = "debug";
31
+ }
32
+ function disableLogging() {
33
+ config.level = "none";
34
+ }
35
+ function setDebugMode(enabled) {
36
+ config.level = enabled ? "debug" : "error";
37
+ }
38
+ function isDebugMode() {
39
+ return config.level === "debug";
40
+ }
41
+ function shouldLog(level) {
42
+ return LOG_LEVEL_ORDER[level] >= LOG_LEVEL_ORDER[config.level];
43
+ }
44
+ function formatTag(tag, level) {
45
+ const timestamp = config.timestamps ? `${new Date().toISOString()} ` : "";
46
+ if (config.colors && level !== "none") {
47
+ const color = LOG_LEVEL_COLORS[level];
48
+ return `${timestamp}${color}[${tag}]${RESET_COLOR}`;
49
+ }
50
+ return `${timestamp}[${tag}]`;
51
+ }
52
+
53
+ class Logger {
54
+ tag;
55
+ constructor(tag) {
56
+ this.tag = tag;
57
+ }
58
+ debug(...args) {
59
+ if (!shouldLog("debug"))
60
+ return;
61
+ if (config.handler) {
62
+ config.handler.debug(this.tag, ...args);
63
+ } else {
64
+ console.log(formatTag(this.tag, "debug"), ...args);
65
+ }
66
+ }
67
+ info(...args) {
68
+ if (!shouldLog("info"))
69
+ return;
70
+ if (config.handler) {
71
+ config.handler.info(this.tag, ...args);
72
+ } else {
73
+ console.info(formatTag(this.tag, "info"), ...args);
74
+ }
75
+ }
76
+ warn(...args) {
77
+ if (!shouldLog("warn"))
78
+ return;
79
+ if (config.handler) {
80
+ config.handler.warn(this.tag, ...args);
81
+ } else {
82
+ console.warn(formatTag(this.tag, "warn"), ...args);
83
+ }
84
+ }
85
+ error(...args) {
86
+ if (!shouldLog("error"))
87
+ return;
88
+ if (config.handler) {
89
+ config.handler.error(this.tag, ...args);
90
+ } else {
91
+ console.error(formatTag(this.tag, "error"), ...args);
92
+ }
93
+ }
94
+ time(label, fn) {
95
+ if (!shouldLog("debug")) {
96
+ return fn();
97
+ }
98
+ const start = performance.now();
99
+ try {
100
+ return fn();
101
+ } finally {
102
+ const duration = performance.now() - start;
103
+ this.debug(`${label}: ${duration.toFixed(2)}ms`);
104
+ }
105
+ }
106
+ async timeAsync(label, fn) {
107
+ if (!shouldLog("debug")) {
108
+ return fn();
109
+ }
110
+ const start = performance.now();
111
+ try {
112
+ return await fn();
113
+ } finally {
114
+ const duration = performance.now() - start;
115
+ this.debug(`${label}: ${duration.toFixed(2)}ms`);
116
+ }
117
+ }
118
+ child(subTag) {
119
+ return new Logger(`${this.tag}:${subTag}`);
120
+ }
121
+ debugIf(condition, ...args) {
122
+ if (condition)
123
+ this.debug(...args);
124
+ }
125
+ warnIf(condition, ...args) {
126
+ if (condition)
127
+ this.warn(...args);
128
+ }
129
+ errorIf(condition, ...args) {
130
+ if (condition)
131
+ this.error(...args);
132
+ }
133
+ loggedOnce = new Set;
134
+ warnOnce(key, ...args) {
135
+ if (this.loggedOnce.has(key))
136
+ return;
137
+ this.loggedOnce.add(key);
138
+ this.warn(...args);
139
+ }
140
+ debugOnce(key, ...args) {
141
+ if (this.loggedOnce.has(key))
142
+ return;
143
+ this.loggedOnce.add(key);
144
+ this.debug(...args);
145
+ }
146
+ }
147
+ function createLogger(tag) {
148
+ return new Logger(tag);
149
+ }
150
+ var LOG_LEVEL_ORDER, LOG_LEVEL_COLORS, RESET_COLOR = "\x1B[0m", config, logger, log, frameworkLoggers;
151
+ var init_logger = __esm(() => {
152
+ LOG_LEVEL_ORDER = {
153
+ debug: 0,
154
+ info: 1,
155
+ warn: 2,
156
+ error: 3,
157
+ none: 4
158
+ };
159
+ LOG_LEVEL_COLORS = {
160
+ debug: "\x1B[36m",
161
+ info: "\x1B[32m",
162
+ warn: "\x1B[33m",
163
+ error: "\x1B[31m"
164
+ };
165
+ config = {
166
+ level: isProduction() ? "error" : "debug",
167
+ colors: true,
168
+ timestamps: false
169
+ };
170
+ logger = createLogger("Hypen");
171
+ log = {
172
+ debug: (tag, ...args) => {
173
+ if (!shouldLog("debug"))
174
+ return;
175
+ console.log(formatTag(tag, "debug"), ...args);
176
+ },
177
+ info: (tag, ...args) => {
178
+ if (!shouldLog("info"))
179
+ return;
180
+ console.info(formatTag(tag, "info"), ...args);
181
+ },
182
+ warn: (tag, ...args) => {
183
+ if (!shouldLog("warn"))
184
+ return;
185
+ console.warn(formatTag(tag, "warn"), ...args);
186
+ },
187
+ error: (tag, ...args) => {
188
+ if (!shouldLog("error"))
189
+ return;
190
+ console.error(formatTag(tag, "error"), ...args);
191
+ }
192
+ };
193
+ frameworkLoggers = {
194
+ hypen: createLogger("Hypen"),
195
+ engine: createLogger("Engine"),
196
+ router: createLogger("Router"),
197
+ state: createLogger("State"),
198
+ events: createLogger("Events"),
199
+ remote: createLogger("Remote"),
200
+ renderer: createLogger("Renderer"),
201
+ module: createLogger("Module"),
202
+ lifecycle: createLogger("Lifecycle"),
203
+ loader: createLogger("Loader"),
204
+ context: createLogger("Context"),
205
+ discovery: createLogger("Discovery"),
206
+ plugin: createLogger("Plugin"),
207
+ canvas: createLogger("Canvas"),
208
+ debug: createLogger("Debug")
209
+ };
210
+ });
211
+
13
212
  // src/state.ts
14
213
  function deepClone(obj) {
15
214
  if (obj === null || typeof obj !== "object") {
@@ -396,192 +595,6 @@ var init_result = __esm(() => {
396
595
  };
397
596
  });
398
597
 
399
- // src/logger.ts
400
- function isProduction() {
401
- if (typeof process !== "undefined" && process.env) {
402
- return false;
403
- }
404
- return false;
405
- }
406
- function setLogLevel(level) {
407
- config.level = level;
408
- }
409
- function getLogLevel() {
410
- return config.level;
411
- }
412
- function configureLogger(options) {
413
- config = { ...config, ...options };
414
- }
415
- function enableLogging() {
416
- config.level = "debug";
417
- }
418
- function disableLogging() {
419
- config.level = "none";
420
- }
421
- function shouldLog(level) {
422
- return LOG_LEVEL_ORDER[level] >= LOG_LEVEL_ORDER[config.level];
423
- }
424
- function formatTag(tag, level) {
425
- const timestamp = config.timestamps ? `${new Date().toISOString()} ` : "";
426
- if (config.colors && level !== "none") {
427
- const color = LOG_LEVEL_COLORS[level];
428
- return `${timestamp}${color}[${tag}]${RESET_COLOR}`;
429
- }
430
- return `${timestamp}[${tag}]`;
431
- }
432
-
433
- class Logger {
434
- tag;
435
- constructor(tag) {
436
- this.tag = tag;
437
- }
438
- debug(...args) {
439
- if (!shouldLog("debug"))
440
- return;
441
- if (config.handler) {
442
- config.handler.debug(this.tag, ...args);
443
- } else {
444
- console.log(formatTag(this.tag, "debug"), ...args);
445
- }
446
- }
447
- info(...args) {
448
- if (!shouldLog("info"))
449
- return;
450
- if (config.handler) {
451
- config.handler.info(this.tag, ...args);
452
- } else {
453
- console.info(formatTag(this.tag, "info"), ...args);
454
- }
455
- }
456
- warn(...args) {
457
- if (!shouldLog("warn"))
458
- return;
459
- if (config.handler) {
460
- config.handler.warn(this.tag, ...args);
461
- } else {
462
- console.warn(formatTag(this.tag, "warn"), ...args);
463
- }
464
- }
465
- error(...args) {
466
- if (!shouldLog("error"))
467
- return;
468
- if (config.handler) {
469
- config.handler.error(this.tag, ...args);
470
- } else {
471
- console.error(formatTag(this.tag, "error"), ...args);
472
- }
473
- }
474
- time(label, fn) {
475
- if (!shouldLog("debug")) {
476
- return fn();
477
- }
478
- const start = performance.now();
479
- try {
480
- return fn();
481
- } finally {
482
- const duration = performance.now() - start;
483
- this.debug(`${label}: ${duration.toFixed(2)}ms`);
484
- }
485
- }
486
- async timeAsync(label, fn) {
487
- if (!shouldLog("debug")) {
488
- return fn();
489
- }
490
- const start = performance.now();
491
- try {
492
- return await fn();
493
- } finally {
494
- const duration = performance.now() - start;
495
- this.debug(`${label}: ${duration.toFixed(2)}ms`);
496
- }
497
- }
498
- child(subTag) {
499
- return new Logger(`${this.tag}:${subTag}`);
500
- }
501
- debugIf(condition, ...args) {
502
- if (condition)
503
- this.debug(...args);
504
- }
505
- warnIf(condition, ...args) {
506
- if (condition)
507
- this.warn(...args);
508
- }
509
- errorIf(condition, ...args) {
510
- if (condition)
511
- this.error(...args);
512
- }
513
- loggedOnce = new Set;
514
- warnOnce(key, ...args) {
515
- if (this.loggedOnce.has(key))
516
- return;
517
- this.loggedOnce.add(key);
518
- this.warn(...args);
519
- }
520
- debugOnce(key, ...args) {
521
- if (this.loggedOnce.has(key))
522
- return;
523
- this.loggedOnce.add(key);
524
- this.debug(...args);
525
- }
526
- }
527
- function createLogger(tag) {
528
- return new Logger(tag);
529
- }
530
- var LOG_LEVEL_ORDER, LOG_LEVEL_COLORS, RESET_COLOR = "\x1B[0m", config, logger, log, frameworkLoggers;
531
- var init_logger = __esm(() => {
532
- LOG_LEVEL_ORDER = {
533
- debug: 0,
534
- info: 1,
535
- warn: 2,
536
- error: 3,
537
- none: 4
538
- };
539
- LOG_LEVEL_COLORS = {
540
- debug: "\x1B[36m",
541
- info: "\x1B[32m",
542
- warn: "\x1B[33m",
543
- error: "\x1B[31m"
544
- };
545
- config = {
546
- level: isProduction() ? "error" : "debug",
547
- colors: true,
548
- timestamps: false
549
- };
550
- logger = createLogger("Hypen");
551
- log = {
552
- debug: (tag, ...args) => {
553
- if (!shouldLog("debug"))
554
- return;
555
- console.log(formatTag(tag, "debug"), ...args);
556
- },
557
- info: (tag, ...args) => {
558
- if (!shouldLog("info"))
559
- return;
560
- console.info(formatTag(tag, "info"), ...args);
561
- },
562
- warn: (tag, ...args) => {
563
- if (!shouldLog("warn"))
564
- return;
565
- console.warn(formatTag(tag, "warn"), ...args);
566
- },
567
- error: (tag, ...args) => {
568
- if (!shouldLog("error"))
569
- return;
570
- console.error(formatTag(tag, "error"), ...args);
571
- }
572
- };
573
- frameworkLoggers = {
574
- engine: createLogger("Engine"),
575
- router: createLogger("Router"),
576
- state: createLogger("State"),
577
- events: createLogger("Events"),
578
- remote: createLogger("Remote"),
579
- renderer: createLogger("Renderer"),
580
- module: createLogger("Module"),
581
- lifecycle: createLogger("Lifecycle")
582
- };
583
- });
584
-
585
598
  // src/app.ts
586
599
  var exports_app = {};
587
600
  __export(exports_app, {
@@ -688,9 +701,9 @@ class HypenModuleInstance {
688
701
  });
689
702
  this.engine.setModule(definition.name || "AnonymousModule", definition.actions, definition.stateKeys, getStateSnapshot(this.state));
690
703
  for (const [actionName, handler] of definition.handlers.onAction) {
691
- log2.debug(`Registering action handler: ${actionName} for module ${definition.name}`);
704
+ log3.debug(`Registering action handler: ${actionName} for module ${definition.name}`);
692
705
  this.engine.onAction(actionName, async (action) => {
693
- log2.debug(`Action handler fired: ${actionName}`, action);
706
+ log3.debug(`Action handler fired: ${actionName}`, action);
694
707
  const actionCtx = {
695
708
  name: action.name,
696
709
  payload: action.payload,
@@ -712,7 +725,7 @@ class HypenModuleInstance {
712
725
  throw result.error;
713
726
  }
714
727
  } else {
715
- log2.debug(`Action handler completed: ${actionName}`);
728
+ log3.debug(`Action handler completed: ${actionName}`);
716
729
  }
717
730
  });
718
731
  }
@@ -767,7 +780,7 @@ class HypenModuleInstance {
767
780
  }
768
781
  }
769
782
  } catch (handlerError) {
770
- log2.error("Error in onError handler:", handlerError);
783
+ log3.error("Error in onError handler:", handlerError);
771
784
  }
772
785
  }
773
786
  if (this.globalContext) {
@@ -778,7 +791,7 @@ class HypenModuleInstance {
778
791
  context: eventContext
779
792
  });
780
793
  }
781
- log2.error(`${context.actionName ? `Action "${context.actionName}"` : `Lifecycle "${context.lifecycle}"`} error:`, error);
794
+ log3.error(`${context.actionName ? `Action "${context.actionName}"` : `Lifecycle "${context.lifecycle}"`} error:`, error);
782
795
  return false;
783
796
  }
784
797
  async callCreatedHandler() {
@@ -808,16 +821,18 @@ class HypenModuleInstance {
808
821
  Object.assign(this.state, patch);
809
822
  }
810
823
  }
811
- var log2, app;
824
+ var log3, app;
812
825
  var init_app = __esm(() => {
813
826
  init_result();
814
827
  init_state();
815
828
  init_logger();
816
- log2 = createLogger("ModuleInstance");
829
+ log3 = createLogger("ModuleInstance");
817
830
  app = new HypenApp;
818
831
  });
819
832
 
820
833
  // src/engine.browser.ts
834
+ init_logger();
835
+ var log2 = frameworkLoggers.engine;
821
836
  var wasmInit = null;
822
837
  var WasmEngineClass = null;
823
838
  function mapToObject(value) {
@@ -856,7 +871,7 @@ class Engine {
856
871
  this.wasmEngine = new WasmEngineClass;
857
872
  this.initialized = true;
858
873
  } catch (error) {
859
- console.error("[Hypen] Failed to initialize WASM engine:", error);
874
+ log2.error("Failed to initialize WASM engine:", error);
860
875
  throw error;
861
876
  }
862
877
  }
@@ -892,12 +907,21 @@ class Engine {
892
907
  const safeState = JSON.parse(JSON.stringify(state));
893
908
  engine.renderInto(source, parentNodeId, safeState);
894
909
  }
895
- notifyStateChange(paths, currentState) {
910
+ notifyStateChange(paths, values) {
911
+ const engine = this.ensureInitialized();
912
+ if (paths.length === 0) {
913
+ return;
914
+ }
915
+ const plainValues = JSON.parse(JSON.stringify(values));
916
+ engine.updateStateSparse(paths, plainValues);
917
+ log2.debug("State changed (sparse):", paths);
918
+ }
919
+ notifyStateChangeFull(paths, currentState) {
896
920
  const engine = this.ensureInitialized();
897
921
  const plainObject = JSON.parse(JSON.stringify(currentState));
898
922
  engine.updateState(plainObject);
899
923
  if (paths.length > 0) {
900
- console.debug("[Hypen] State changed:", paths);
924
+ log2.debug("State changed (full):", paths);
901
925
  }
902
926
  }
903
927
  updateState(statePatch) {
@@ -907,7 +931,7 @@ class Engine {
907
931
  }
908
932
  dispatchAction(name, payload) {
909
933
  const engine = this.ensureInitialized();
910
- console.log(`[Engine] Action dispatched: ${name}`);
934
+ log2.debug(`Action dispatched: ${name}`);
911
935
  engine.dispatchAction(name, payload ?? null);
912
936
  }
913
937
  onAction(actionName, handler) {
@@ -917,7 +941,7 @@ class Engine {
917
941
  ...action,
918
942
  payload: action.payload ? mapToObject(action.payload) : action.payload
919
943
  };
920
- Promise.resolve(handler(normalizedAction)).catch(console.error);
944
+ Promise.resolve(handler(normalizedAction)).catch((err) => log2.error("Action handler error:", err));
921
945
  });
922
946
  }
923
947
  setModule(name, actions, stateKeys, initialState) {
@@ -939,6 +963,9 @@ class Engine {
939
963
  }
940
964
 
941
965
  // src/renderer.ts
966
+ init_logger();
967
+ var log4 = frameworkLoggers.renderer;
968
+
942
969
  class BaseRenderer {
943
970
  nodes = new Map;
944
971
  getNode(id) {
@@ -979,16 +1006,14 @@ class BaseRenderer {
979
1006
 
980
1007
  class ConsoleRenderer {
981
1008
  applyPatches(patches) {
982
- console.group("Patches:");
983
- for (const patch of patches) {
984
- console.log(patch);
985
- }
986
- console.groupEnd();
1009
+ log4.debug("Patches:", patches);
987
1010
  }
988
1011
  }
989
1012
 
990
1013
  // src/router.ts
991
1014
  init_state();
1015
+ init_logger();
1016
+ var log5 = frameworkLoggers.router;
992
1017
 
993
1018
  class HypenRouter {
994
1019
  state;
@@ -1026,7 +1051,7 @@ class HypenRouter {
1026
1051
  this.updatePath(newPath, false);
1027
1052
  });
1028
1053
  this.isInitialized = true;
1029
- console.log("Router initialized at:", initialPath);
1054
+ log5.debug("Router initialized at:", initialPath);
1030
1055
  }
1031
1056
  getPathFromBrowser() {
1032
1057
  if (typeof window === "undefined")
@@ -1047,21 +1072,21 @@ class HypenRouter {
1047
1072
  return query;
1048
1073
  }
1049
1074
  push(path) {
1050
- console.log("Router.push:", path);
1075
+ log5.debug("push:", path);
1051
1076
  this.updatePath(path, true);
1052
1077
  }
1053
1078
  replace(path) {
1054
- console.log("Router.replace:", path);
1079
+ log5.debug("replace:", path);
1055
1080
  this.updatePath(path, true, true);
1056
1081
  }
1057
1082
  back() {
1058
- console.log("Router.back");
1083
+ log5.debug("back");
1059
1084
  if (typeof window !== "undefined") {
1060
1085
  window.history.back();
1061
1086
  }
1062
1087
  }
1063
1088
  forward() {
1064
- console.log("Router.forward");
1089
+ log5.debug("forward");
1065
1090
  if (typeof window !== "undefined") {
1066
1091
  window.history.forward();
1067
1092
  }
@@ -1157,7 +1182,7 @@ class HypenRouter {
1157
1182
  try {
1158
1183
  callback(this.getState());
1159
1184
  } catch (error) {
1160
- console.error("[HypenRouter] Error in route subscriber:", error);
1185
+ log5.error("Error in route subscriber:", error);
1161
1186
  }
1162
1187
  return () => {
1163
1188
  this.subscribers.delete(callback);
@@ -1169,7 +1194,7 @@ class HypenRouter {
1169
1194
  try {
1170
1195
  callback(routeState);
1171
1196
  } catch (error) {
1172
- console.error("[HypenRouter] Error in route subscriber:", error);
1197
+ log5.error("Error in route subscriber:", error);
1173
1198
  }
1174
1199
  });
1175
1200
  }
@@ -1186,6 +1211,9 @@ class HypenRouter {
1186
1211
  }
1187
1212
 
1188
1213
  // src/events.ts
1214
+ init_logger();
1215
+ var log6 = frameworkLoggers.events;
1216
+
1189
1217
  class TypedEventEmitter {
1190
1218
  eventBus = new Map;
1191
1219
  emit(event, payload) {
@@ -1197,7 +1225,7 @@ class TypedEventEmitter {
1197
1225
  try {
1198
1226
  handler(payload);
1199
1227
  } catch (error) {
1200
- console.error(`Error in event handler for "${String(event)}":`, error);
1228
+ log6.error(`Error in event handler for "${String(event)}":`, error);
1201
1229
  }
1202
1230
  });
1203
1231
  }
@@ -1249,6 +1277,9 @@ function createEventEmitter() {
1249
1277
  }
1250
1278
 
1251
1279
  // src/context.ts
1280
+ init_logger();
1281
+ var log7 = frameworkLoggers.context;
1282
+
1252
1283
  class HypenGlobalContext {
1253
1284
  modules = new Map;
1254
1285
  typedEvents;
@@ -1261,14 +1292,14 @@ class HypenGlobalContext {
1261
1292
  }
1262
1293
  registerModule(id, instance) {
1263
1294
  if (this.modules.has(id)) {
1264
- console.warn(`Module "${id}" is already registered. Overwriting.`);
1295
+ log7.warn(`Module "${id}" is already registered. Overwriting.`);
1265
1296
  }
1266
1297
  this.modules.set(id, instance);
1267
- console.log(`Registered module: ${id}`);
1298
+ log7.debug(`Registered module: ${id}`);
1268
1299
  }
1269
1300
  unregisterModule(id) {
1270
1301
  this.modules.delete(id);
1271
- console.log(`Unregistered module: ${id}`);
1302
+ log7.debug(`Unregistered module: ${id}`);
1272
1303
  }
1273
1304
  getModule(id) {
1274
1305
  const module = this.modules.get(id);
@@ -1297,14 +1328,14 @@ class HypenGlobalContext {
1297
1328
  emit(event, payload) {
1298
1329
  const handlers = this.legacyEventBus.get(event);
1299
1330
  if (!handlers || handlers.size === 0) {
1300
- console.log(`Event "${event}" emitted but no listeners`);
1331
+ log7.debug(`Event "${event}" emitted but no listeners`);
1301
1332
  } else {
1302
- console.log(`Emitting event: ${event}`, payload);
1333
+ log7.debug(`Emitting event: ${event}`, payload);
1303
1334
  handlers.forEach((handler) => {
1304
1335
  try {
1305
1336
  handler(payload);
1306
1337
  } catch (error) {
1307
- console.error(`Error in event handler for "${event}":`, error);
1338
+ log7.error(`Error in event handler for "${event}":`, error);
1308
1339
  }
1309
1340
  });
1310
1341
  }
@@ -1318,7 +1349,7 @@ class HypenGlobalContext {
1318
1349
  }
1319
1350
  const handlers = this.legacyEventBus.get(event);
1320
1351
  handlers.add(handler);
1321
- console.log(`Listening to event: ${event}`);
1352
+ log7.debug(`Listening to event: ${event}`);
1322
1353
  return () => {
1323
1354
  handlers.delete(handler);
1324
1355
  if (handlers.size === 0) {
@@ -1351,10 +1382,9 @@ class HypenGlobalContext {
1351
1382
  }
1352
1383
  }
1353
1384
 
1354
- // src/remote/client.ts
1355
- init_result();
1356
-
1357
1385
  // src/disposable.ts
1386
+ init_logger();
1387
+ var log8 = frameworkLoggers.lifecycle;
1358
1388
  function isDisposable(obj) {
1359
1389
  return obj !== null && typeof obj === "object" && "dispose" in obj && typeof obj.dispose === "function";
1360
1390
  }
@@ -1386,7 +1416,7 @@ class DisposableStack {
1386
1416
  try {
1387
1417
  item.dispose();
1388
1418
  } catch (error) {
1389
- console.error("[DisposableStack] Error during dispose:", error);
1419
+ log8.error("Error during dispose:", error);
1390
1420
  }
1391
1421
  }
1392
1422
  }
@@ -1477,7 +1507,7 @@ function compositeDisposable(...disposables) {
1477
1507
  try {
1478
1508
  d.dispose();
1479
1509
  } catch (error) {
1480
- console.error("[compositeDisposable] Error during dispose:", error);
1510
+ log8.error("Error during dispose:", error);
1481
1511
  }
1482
1512
  }
1483
1513
  }
@@ -1500,6 +1530,9 @@ function usingSync(resource, fn) {
1500
1530
  }
1501
1531
  }
1502
1532
 
1533
+ // src/remote/client.ts
1534
+ init_result();
1535
+
1503
1536
  // src/retry.ts
1504
1537
  init_result();
1505
1538
  var DEFAULT_OPTIONS = {
@@ -1627,6 +1660,9 @@ var RetryPresets = {
1627
1660
  };
1628
1661
 
1629
1662
  // src/remote/client.ts
1663
+ init_logger();
1664
+ var log9 = frameworkLoggers.remote;
1665
+
1630
1666
  class RemoteEngine {
1631
1667
  ws = null;
1632
1668
  url;
@@ -1733,7 +1769,7 @@ class RemoteEngine {
1733
1769
  }
1734
1770
  dispatchAction(action, payload) {
1735
1771
  if (this.state !== "connected" || !this.ws) {
1736
- console.warn("Cannot dispatch action: not connected");
1772
+ log9.warn("Cannot dispatch action: not connected");
1737
1773
  return;
1738
1774
  }
1739
1775
  const message = {
@@ -1806,7 +1842,7 @@ class RemoteEngine {
1806
1842
  break;
1807
1843
  }
1808
1844
  } catch (e) {
1809
- console.error("Error handling remote message:", e);
1845
+ log9.error("Error handling remote message:", e);
1810
1846
  const error = e instanceof Error ? e : new Error(String(e));
1811
1847
  this.errorCallbacks.forEach((cb) => cb(error));
1812
1848
  }
@@ -1835,7 +1871,7 @@ class RemoteEngine {
1835
1871
  }
1836
1872
  handlePatch(message) {
1837
1873
  if (message.revision <= this.currentRevision) {
1838
- console.warn(`Out of order patch: expected > ${this.currentRevision}, got ${message.revision}`);
1874
+ log9.warn(`Out of order patch: expected > ${this.currentRevision}, got ${message.revision}`);
1839
1875
  return;
1840
1876
  }
1841
1877
  this.currentRevision = message.revision;
@@ -1861,10 +1897,10 @@ class RemoteEngine {
1861
1897
  maxDelayMs: 30000,
1862
1898
  jitter: 0.1,
1863
1899
  onRetry: (attempt, error) => {
1864
- console.log(`Reconnection attempt ${attempt}/${this.options.maxReconnectAttempts} failed: ${error.message}`);
1900
+ log9.debug(`Reconnection attempt ${attempt}/${this.options.maxReconnectAttempts} failed: ${error.message}`);
1865
1901
  }
1866
1902
  }).catch((error) => {
1867
- console.error("Max reconnection attempts reached:", error.message);
1903
+ log9.error("Max reconnection attempts reached:", error.message);
1868
1904
  this.errorCallbacks.forEach((cb) => cb(new ConnectionError(this.url, error, this.options.maxReconnectAttempts)));
1869
1905
  });
1870
1906
  }, this.options.reconnectInterval);
@@ -1874,21 +1910,34 @@ class RemoteEngine {
1874
1910
  // src/index.browser.ts
1875
1911
  init_app();
1876
1912
  init_state();
1913
+ init_logger();
1877
1914
  export {
1915
+ setLogLevel,
1916
+ setDebugMode,
1917
+ logger,
1918
+ log,
1919
+ isDebugMode,
1878
1920
  getStateSnapshot,
1921
+ getLogLevel,
1879
1922
  getElementDisposables,
1923
+ frameworkLoggers,
1924
+ enableLogging,
1880
1925
  disposableWebSocket,
1881
1926
  disposableTimeout,
1882
1927
  disposableSubscription,
1883
1928
  disposableListener,
1884
1929
  disposableInterval,
1885
1930
  disposableAbortController,
1931
+ disableLogging,
1886
1932
  createObservableState,
1933
+ createLogger,
1887
1934
  createEventEmitter,
1935
+ configureLogger,
1888
1936
  batchStateUpdates,
1889
1937
  app,
1890
1938
  TypedEventEmitter,
1891
1939
  RemoteEngine,
1940
+ Logger,
1892
1941
  HypenRouter,
1893
1942
  HypenModuleInstance,
1894
1943
  HypenGlobalContext,
@@ -1900,4 +1949,4 @@ export {
1900
1949
  BaseRenderer
1901
1950
  };
1902
1951
 
1903
- //# debugId=D16DD91257683E1464756E2164756E21
1952
+ //# debugId=9618BA73380775CC64756E2164756E21