@graphty/remote-logger 0.0.1 → 1.2.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 (138) hide show
  1. package/README.md +944 -28
  2. package/bin/remote-log-server.js +3 -0
  3. package/dist/client/RemoteLogClient.d.ts +116 -0
  4. package/dist/client/RemoteLogClient.d.ts.map +1 -0
  5. package/dist/client/RemoteLogClient.js +269 -0
  6. package/dist/client/RemoteLogClient.js.map +1 -0
  7. package/dist/client/index.d.ts +7 -0
  8. package/dist/client/index.d.ts.map +1 -0
  9. package/dist/client/index.js +6 -0
  10. package/dist/client/index.js.map +1 -0
  11. package/dist/client/types.d.ts +60 -0
  12. package/dist/client/types.d.ts.map +1 -0
  13. package/dist/client/types.js +6 -0
  14. package/dist/client/types.js.map +1 -0
  15. package/dist/index.d.ts +22 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +23 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/mcp/index.d.ts +9 -0
  20. package/dist/mcp/index.d.ts.map +1 -0
  21. package/dist/mcp/index.js +9 -0
  22. package/dist/mcp/index.js.map +1 -0
  23. package/dist/mcp/mcp-server.d.ts +32 -0
  24. package/dist/mcp/mcp-server.d.ts.map +1 -0
  25. package/dist/mcp/mcp-server.js +270 -0
  26. package/dist/mcp/mcp-server.js.map +1 -0
  27. package/dist/mcp/tools/index.d.ts +14 -0
  28. package/dist/mcp/tools/index.d.ts.map +1 -0
  29. package/dist/mcp/tools/index.js +14 -0
  30. package/dist/mcp/tools/index.js.map +1 -0
  31. package/dist/mcp/tools/logs-clear.d.ts +76 -0
  32. package/dist/mcp/tools/logs-clear.d.ts.map +1 -0
  33. package/dist/mcp/tools/logs-clear.js +58 -0
  34. package/dist/mcp/tools/logs-clear.js.map +1 -0
  35. package/dist/mcp/tools/logs-get-all.d.ts +60 -0
  36. package/dist/mcp/tools/logs-get-all.d.ts.map +1 -0
  37. package/dist/mcp/tools/logs-get-all.js +50 -0
  38. package/dist/mcp/tools/logs-get-all.js.map +1 -0
  39. package/dist/mcp/tools/logs-get-errors.d.ts +65 -0
  40. package/dist/mcp/tools/logs-get-errors.d.ts.map +1 -0
  41. package/dist/mcp/tools/logs-get-errors.js +46 -0
  42. package/dist/mcp/tools/logs-get-errors.js.map +1 -0
  43. package/dist/mcp/tools/logs-get-file-path.d.ts +75 -0
  44. package/dist/mcp/tools/logs-get-file-path.d.ts.map +1 -0
  45. package/dist/mcp/tools/logs-get-file-path.js +90 -0
  46. package/dist/mcp/tools/logs-get-file-path.js.map +1 -0
  47. package/dist/mcp/tools/logs-get-recent.d.ts +89 -0
  48. package/dist/mcp/tools/logs-get-recent.d.ts.map +1 -0
  49. package/dist/mcp/tools/logs-get-recent.js +74 -0
  50. package/dist/mcp/tools/logs-get-recent.js.map +1 -0
  51. package/dist/mcp/tools/logs-list-sessions.d.ts +64 -0
  52. package/dist/mcp/tools/logs-list-sessions.d.ts.map +1 -0
  53. package/dist/mcp/tools/logs-list-sessions.js +48 -0
  54. package/dist/mcp/tools/logs-list-sessions.js.map +1 -0
  55. package/dist/mcp/tools/logs-receive.d.ts +150 -0
  56. package/dist/mcp/tools/logs-receive.d.ts.map +1 -0
  57. package/dist/mcp/tools/logs-receive.js +68 -0
  58. package/dist/mcp/tools/logs-receive.js.map +1 -0
  59. package/dist/mcp/tools/logs-search.d.ts +91 -0
  60. package/dist/mcp/tools/logs-search.d.ts.map +1 -0
  61. package/dist/mcp/tools/logs-search.js +68 -0
  62. package/dist/mcp/tools/logs-search.js.map +1 -0
  63. package/dist/mcp/tools/logs-status.d.ts +45 -0
  64. package/dist/mcp/tools/logs-status.d.ts.map +1 -0
  65. package/dist/mcp/tools/logs-status.js +45 -0
  66. package/dist/mcp/tools/logs-status.js.map +1 -0
  67. package/dist/server/dual-server.d.ts +76 -0
  68. package/dist/server/dual-server.d.ts.map +1 -0
  69. package/dist/server/dual-server.js +214 -0
  70. package/dist/server/dual-server.js.map +1 -0
  71. package/dist/server/index.d.ts +12 -0
  72. package/dist/server/index.d.ts.map +1 -0
  73. package/dist/server/index.js +12 -0
  74. package/dist/server/index.js.map +1 -0
  75. package/dist/server/jsonl-writer.d.ts +93 -0
  76. package/dist/server/jsonl-writer.d.ts.map +1 -0
  77. package/dist/server/jsonl-writer.js +205 -0
  78. package/dist/server/jsonl-writer.js.map +1 -0
  79. package/dist/server/log-server.d.ts +126 -0
  80. package/dist/server/log-server.d.ts.map +1 -0
  81. package/dist/server/log-server.js +589 -0
  82. package/dist/server/log-server.js.map +1 -0
  83. package/dist/server/log-storage.d.ts +301 -0
  84. package/dist/server/log-storage.d.ts.map +1 -0
  85. package/dist/server/log-storage.js +408 -0
  86. package/dist/server/log-storage.js.map +1 -0
  87. package/dist/server/marker-utils.d.ts +69 -0
  88. package/dist/server/marker-utils.d.ts.map +1 -0
  89. package/dist/server/marker-utils.js +118 -0
  90. package/dist/server/marker-utils.js.map +1 -0
  91. package/dist/server/self-signed-cert.d.ts +30 -0
  92. package/dist/server/self-signed-cert.d.ts.map +1 -0
  93. package/dist/server/self-signed-cert.js +83 -0
  94. package/dist/server/self-signed-cert.js.map +1 -0
  95. package/dist/ui/ConsoleCaptureUI.d.ts +118 -0
  96. package/dist/ui/ConsoleCaptureUI.d.ts.map +1 -0
  97. package/dist/ui/ConsoleCaptureUI.js +571 -0
  98. package/dist/ui/ConsoleCaptureUI.js.map +1 -0
  99. package/dist/ui/index.d.ts +15 -0
  100. package/dist/ui/index.d.ts.map +1 -0
  101. package/dist/ui/index.js +15 -0
  102. package/dist/ui/index.js.map +1 -0
  103. package/dist/vite/index.d.ts +8 -0
  104. package/dist/vite/index.d.ts.map +1 -0
  105. package/dist/vite/index.js +8 -0
  106. package/dist/vite/index.js.map +1 -0
  107. package/dist/vite/plugin.d.ts +42 -0
  108. package/dist/vite/plugin.d.ts.map +1 -0
  109. package/dist/vite/plugin.js +46 -0
  110. package/dist/vite/plugin.js.map +1 -0
  111. package/package.json +90 -7
  112. package/src/client/RemoteLogClient.ts +328 -0
  113. package/src/client/index.ts +7 -0
  114. package/src/client/types.ts +62 -0
  115. package/src/index.ts +28 -0
  116. package/src/mcp/index.ts +25 -0
  117. package/src/mcp/mcp-server.ts +364 -0
  118. package/src/mcp/tools/index.ts +69 -0
  119. package/src/mcp/tools/logs-clear.ts +86 -0
  120. package/src/mcp/tools/logs-get-all.ts +78 -0
  121. package/src/mcp/tools/logs-get-errors.ts +71 -0
  122. package/src/mcp/tools/logs-get-file-path.ts +121 -0
  123. package/src/mcp/tools/logs-get-recent.ts +104 -0
  124. package/src/mcp/tools/logs-list-sessions.ts +71 -0
  125. package/src/mcp/tools/logs-receive.ts +96 -0
  126. package/src/mcp/tools/logs-search.ts +95 -0
  127. package/src/mcp/tools/logs-status.ts +69 -0
  128. package/src/server/dual-server.ts +308 -0
  129. package/src/server/index.ts +54 -0
  130. package/src/server/jsonl-writer.ts +277 -0
  131. package/src/server/log-server.ts +763 -0
  132. package/src/server/log-storage.ts +651 -0
  133. package/src/server/marker-utils.ts +144 -0
  134. package/src/server/self-signed-cert.ts +93 -0
  135. package/src/ui/ConsoleCaptureUI.ts +649 -0
  136. package/src/ui/index.ts +15 -0
  137. package/src/vite/index.ts +8 -0
  138. package/src/vite/plugin.ts +59 -0
@@ -0,0 +1,571 @@
1
+ /**
2
+ * ConsoleCaptureUI - Console capture with floating UI widget
3
+ *
4
+ * Intercepts console output (log, error, warn, info, debug) and provides
5
+ * a floating button UI with copy, download, view, and clear functionality.
6
+ *
7
+ * Features:
8
+ * - Floating button in top-right corner
9
+ * - Menu with Copy, Download, Clear, and Show Logs options
10
+ * - Works on mobile devices and in XR environments
11
+ * - Global window.__console__ methods for programmatic access
12
+ *
13
+ * Usage:
14
+ * import { initConsoleCaptureUI } from "@graphty/remote-logger/ui";
15
+ * initConsoleCaptureUI();
16
+ *
17
+ * Or programmatically:
18
+ * const ui = new ConsoleCaptureUI();
19
+ * console.log("This is captured");
20
+ * ui.destroy(); // Clean up when done
21
+ */
22
+ // Get reference to the global console object
23
+ const globalConsole = globalThis.console;
24
+ /**
25
+ * ConsoleCaptureUI class - captures console output and provides floating UI widget
26
+ */
27
+ export class ConsoleCaptureUI {
28
+ /**
29
+ * Creates a new ConsoleCaptureUI instance that intercepts console methods
30
+ * and creates a floating UI widget
31
+ */
32
+ constructor() {
33
+ this.logs = [];
34
+ this.buttonContainer = null;
35
+ // Store original methods at construction time
36
+ this.originalMethods = {
37
+ log: globalConsole.log.bind(globalConsole),
38
+ error: globalConsole.error.bind(globalConsole),
39
+ warn: globalConsole.warn.bind(globalConsole),
40
+ info: globalConsole.info.bind(globalConsole),
41
+ debug: globalConsole.debug.bind(globalConsole),
42
+ };
43
+ this.interceptConsole();
44
+ this.createUI();
45
+ this.setupGlobalMethods();
46
+ }
47
+ /**
48
+ * Intercept all console methods to capture output
49
+ */
50
+ interceptConsole() {
51
+ const methods = [
52
+ "log",
53
+ "error",
54
+ "warn",
55
+ "info",
56
+ "debug",
57
+ ];
58
+ for (const method of methods) {
59
+ const original = this.originalMethods[method];
60
+ // Override the console method - this is intentional for this module
61
+ globalConsole[method] = (...args) => {
62
+ // Capture the log entry
63
+ this.logs.push({
64
+ type: method,
65
+ args: args,
66
+ timestamp: new Date().toISOString(),
67
+ });
68
+ this.updateButtonBadge();
69
+ // Still call the original method
70
+ original.apply(globalConsole, args);
71
+ };
72
+ }
73
+ }
74
+ /**
75
+ * Create the floating UI button and menu
76
+ */
77
+ createUI() {
78
+ if (typeof document === "undefined") {
79
+ return;
80
+ }
81
+ // Create floating button container
82
+ this.buttonContainer = document.createElement("div");
83
+ this.buttonContainer.id = "console-capture-container";
84
+ this.buttonContainer.innerHTML = `
85
+ <button id="console-capture-btn" style="
86
+ position: fixed;
87
+ top: 20px;
88
+ right: 20px;
89
+ width: 32px;
90
+ height: 32px;
91
+ border-radius: 16px;
92
+ background: rgba(128, 128, 128, 0.3);
93
+ color: rgba(255, 255, 255, 0.8);
94
+ border: 1px solid rgba(255, 255, 255, 0.2);
95
+ cursor: pointer;
96
+ box-shadow: 0 1px 4px rgba(0,0,0,0.1);
97
+ z-index: 99999;
98
+ font-size: 14px;
99
+ display: flex;
100
+ align-items: center;
101
+ justify-content: center;
102
+ transition: all 0.2s;
103
+ opacity: 0.6;
104
+ ">📋</button>
105
+ <div id="console-capture-menu" style="
106
+ position: fixed;
107
+ top: 60px;
108
+ right: 20px;
109
+ background: white;
110
+ border-radius: 8px;
111
+ box-shadow: 0 2px 20px rgba(0,0,0,0.2);
112
+ padding: 10px;
113
+ z-index: 99998;
114
+ display: none;
115
+ ">
116
+ <button id="cc-copy" style="
117
+ display: block;
118
+ width: 100%;
119
+ padding: 8px 16px;
120
+ margin: 4px 0;
121
+ border: none;
122
+ background: #4CAF50;
123
+ color: white;
124
+ border-radius: 4px;
125
+ cursor: pointer;
126
+ ">📋 Copy Logs</button>
127
+ <button id="cc-download" style="
128
+ display: block;
129
+ width: 100%;
130
+ padding: 8px 16px;
131
+ margin: 4px 0;
132
+ border: none;
133
+ background: #FF9800;
134
+ color: white;
135
+ border-radius: 4px;
136
+ cursor: pointer;
137
+ ">💾 Download</button>
138
+ <button id="cc-clear" style="
139
+ display: block;
140
+ width: 100%;
141
+ padding: 8px 16px;
142
+ margin: 4px 0;
143
+ border: none;
144
+ background: #f44336;
145
+ color: white;
146
+ border-radius: 4px;
147
+ cursor: pointer;
148
+ ">🗑️ Clear</button>
149
+ <button id="cc-show" style="
150
+ display: block;
151
+ width: 100%;
152
+ padding: 8px 16px;
153
+ margin: 4px 0;
154
+ border: none;
155
+ background: #9C27B0;
156
+ color: white;
157
+ border-radius: 4px;
158
+ cursor: pointer;
159
+ ">👁️ Show Logs</button>
160
+ <div style="
161
+ margin-top: 10px;
162
+ padding-top: 10px;
163
+ border-top: 1px solid #ddd;
164
+ font-size: 12px;
165
+ color: #666;
166
+ text-align: center;
167
+ ">
168
+ <div>Logs: <span id="cc-count">0</span></div>
169
+ </div>
170
+ </div>
171
+ `;
172
+ document.body.appendChild(this.buttonContainer);
173
+ // Add event listeners
174
+ const btn = document.getElementById("console-capture-btn");
175
+ const menu = document.getElementById("console-capture-menu");
176
+ if (btn && menu) {
177
+ // Add hover effect to make button more visible on hover
178
+ btn.addEventListener("mouseenter", () => {
179
+ btn.style.opacity = "1";
180
+ btn.style.background = "rgba(128, 128, 128, 0.5)";
181
+ });
182
+ btn.addEventListener("mouseleave", () => {
183
+ btn.style.opacity = "0.6";
184
+ btn.style.background = "rgba(128, 128, 128, 0.3)";
185
+ });
186
+ btn.addEventListener("click", () => {
187
+ menu.style.display =
188
+ menu.style.display === "none" ? "block" : "none";
189
+ });
190
+ const copyBtn = document.getElementById("cc-copy");
191
+ const downloadBtn = document.getElementById("cc-download");
192
+ const clearBtn = document.getElementById("cc-clear");
193
+ const showBtn = document.getElementById("cc-show");
194
+ if (copyBtn) {
195
+ copyBtn.addEventListener("click", () => {
196
+ void this.copyLogs();
197
+ menu.style.display = "none";
198
+ });
199
+ }
200
+ if (downloadBtn) {
201
+ downloadBtn.addEventListener("click", () => {
202
+ this.downloadLogs();
203
+ menu.style.display = "none";
204
+ });
205
+ }
206
+ if (clearBtn) {
207
+ clearBtn.addEventListener("click", () => {
208
+ this.clearLogs();
209
+ menu.style.display = "none";
210
+ });
211
+ }
212
+ if (showBtn) {
213
+ showBtn.addEventListener("click", () => {
214
+ this.showLogsModal();
215
+ menu.style.display = "none";
216
+ });
217
+ }
218
+ // Close menu when clicking outside
219
+ document.addEventListener("click", (e) => {
220
+ if (this.buttonContainer &&
221
+ !this.buttonContainer.contains(e.target)) {
222
+ menu.style.display = "none";
223
+ }
224
+ });
225
+ }
226
+ }
227
+ /**
228
+ * Update the log count badge in the menu
229
+ */
230
+ updateButtonBadge() {
231
+ if (typeof document === "undefined") {
232
+ return;
233
+ }
234
+ const count = document.getElementById("cc-count");
235
+ if (count) {
236
+ count.textContent = String(this.logs.length);
237
+ }
238
+ }
239
+ /**
240
+ * Format a single log entry as a string
241
+ * @param log - The log entry to format
242
+ * @returns Formatted log string
243
+ */
244
+ formatLog(log) {
245
+ const args = log.args
246
+ .map((arg) => {
247
+ if (typeof arg === "string") {
248
+ return arg;
249
+ }
250
+ if (arg instanceof Error) {
251
+ return `${arg.name}: ${arg.message}\n${arg.stack ?? ""}`;
252
+ }
253
+ try {
254
+ return JSON.stringify(arg, null, 2);
255
+ }
256
+ catch {
257
+ return String(arg);
258
+ }
259
+ })
260
+ .join(" ");
261
+ return `[${log.timestamp}] [${log.type.toUpperCase()}] ${args}`;
262
+ }
263
+ /**
264
+ * Setup global window.__console__ methods for easy access
265
+ */
266
+ setupGlobalMethods() {
267
+ if (typeof window !== "undefined") {
268
+ window.__console__ = {
269
+ copy: () => this.copyLogs(),
270
+ download: () => {
271
+ this.downloadLogs();
272
+ },
273
+ clear: () => {
274
+ this.clearLogs();
275
+ },
276
+ get: () => this.getLogs(),
277
+ logs: this.logs,
278
+ };
279
+ }
280
+ }
281
+ /**
282
+ * Show success indicator on the button
283
+ */
284
+ showCopySuccess() {
285
+ if (typeof document === "undefined") {
286
+ return;
287
+ }
288
+ const btn = document.getElementById("console-capture-btn");
289
+ if (btn) {
290
+ btn.innerHTML = "✅";
291
+ setTimeout(() => {
292
+ btn.innerHTML = "📋";
293
+ }, 1500);
294
+ }
295
+ globalConsole.log("📋 Console logs copied to clipboard!");
296
+ }
297
+ /**
298
+ * Show error indicator on the button and fallback message
299
+ */
300
+ showCopyError() {
301
+ if (typeof document === "undefined") {
302
+ return;
303
+ }
304
+ const btn = document.getElementById("console-capture-btn");
305
+ if (btn) {
306
+ btn.innerHTML = "❌";
307
+ setTimeout(() => {
308
+ btn.innerHTML = "📋";
309
+ }, 1500);
310
+ }
311
+ // Show logs in console as fallback
312
+ globalConsole.log("❌ Failed to copy to clipboard. Here are your logs:");
313
+ globalConsole.log("═".repeat(50));
314
+ globalConsole.log(this.getLogs());
315
+ globalConsole.log("═".repeat(50));
316
+ }
317
+ /**
318
+ * Fallback copy method using textarea (for mobile devices)
319
+ * @param text - The text to copy
320
+ */
321
+ copyUsingTextarea(text) {
322
+ if (typeof document === "undefined") {
323
+ return;
324
+ }
325
+ // Create temporary textarea
326
+ const textarea = document.createElement("textarea");
327
+ textarea.value = text;
328
+ textarea.style.cssText =
329
+ "position: absolute; left: -9999px; top: -9999px;";
330
+ document.body.appendChild(textarea);
331
+ // Select and copy
332
+ textarea.select();
333
+ textarea.setSelectionRange(0, 99999); // For mobile devices
334
+ try {
335
+ // execCommand is deprecated but still necessary as a fallback for:
336
+ // - Older mobile browsers that don't support Clipboard API
337
+ // - iOS Safari in certain contexts where Clipboard API fails
338
+ // - XR/VR browsers with limited API support
339
+ // This provides the best compatibility across all target platforms
340
+ // eslint-disable-next-line @typescript-eslint/no-deprecated -- Required fallback for mobile/XR compatibility
341
+ const success = document.execCommand("copy");
342
+ if (success) {
343
+ this.showCopySuccess();
344
+ }
345
+ else {
346
+ this.showCopyError();
347
+ }
348
+ }
349
+ catch {
350
+ this.showCopyError();
351
+ }
352
+ finally {
353
+ document.body.removeChild(textarea);
354
+ }
355
+ }
356
+ /**
357
+ * Show a modal dialog with all captured logs
358
+ */
359
+ showLogsModal() {
360
+ if (typeof document === "undefined") {
361
+ return;
362
+ }
363
+ // Remove existing modal if any
364
+ const existing = document.getElementById("console-logs-modal");
365
+ if (existing) {
366
+ existing.remove();
367
+ }
368
+ const modal = document.createElement("div");
369
+ modal.id = "console-logs-modal";
370
+ modal.innerHTML = `
371
+ <div style="
372
+ position: fixed;
373
+ top: 0;
374
+ left: 0;
375
+ right: 0;
376
+ bottom: 0;
377
+ background: rgba(0,0,0,0.5);
378
+ z-index: 100001;
379
+ display: flex;
380
+ align-items: center;
381
+ justify-content: center;
382
+ ">
383
+ <div style="
384
+ background: white;
385
+ border-radius: 8px;
386
+ width: 90%;
387
+ max-width: 800px;
388
+ height: 85vh;
389
+ max-height: 85vh;
390
+ display: flex;
391
+ flex-direction: column;
392
+ box-shadow: 0 4px 20px rgba(0,0,0,0.3);
393
+ ">
394
+ <div style="
395
+ padding: 16px;
396
+ border-bottom: 1px solid #ddd;
397
+ display: flex;
398
+ justify-content: space-between;
399
+ align-items: center;
400
+ ">
401
+ <h3 style="margin: 0; color: #333;">Console Logs</h3>
402
+ <button id="close-modal" style="
403
+ background: none;
404
+ border: none;
405
+ font-size: 24px;
406
+ cursor: pointer;
407
+ color: #666;
408
+ ">×</button>
409
+ </div>
410
+ <textarea id="logs-textarea" style="
411
+ flex: 1;
412
+ margin: 16px;
413
+ padding: 12px;
414
+ border: 1px solid #ddd;
415
+ border-radius: 4px;
416
+ font-family: monospace;
417
+ font-size: 12px;
418
+ resize: none;
419
+ background: #f5f5f5;
420
+ min-height: 50vh;
421
+ overflow-y: auto;
422
+ " readonly>${this.getLogs()}</textarea>
423
+ <div style="
424
+ padding: 16px;
425
+ border-top: 1px solid #ddd;
426
+ text-align: center;
427
+ ">
428
+ <button id="select-all-logs" style="
429
+ padding: 8px 24px;
430
+ background: #2196F3;
431
+ color: white;
432
+ border: none;
433
+ border-radius: 4px;
434
+ cursor: pointer;
435
+ font-size: 14px;
436
+ ">Select All</button>
437
+ <span style="
438
+ margin-left: 16px;
439
+ color: #666;
440
+ font-size: 14px;
441
+ ">Press Ctrl+C (or Cmd+C) to copy</span>
442
+ </div>
443
+ </div>
444
+ </div>
445
+ `;
446
+ document.body.appendChild(modal);
447
+ // Event listeners
448
+ const closeBtn = document.getElementById("close-modal");
449
+ if (closeBtn) {
450
+ closeBtn.addEventListener("click", () => {
451
+ modal.remove();
452
+ });
453
+ }
454
+ modal.addEventListener("click", (e) => {
455
+ if (e.target === modal.firstElementChild) {
456
+ modal.remove();
457
+ }
458
+ });
459
+ const textarea = document.getElementById("logs-textarea");
460
+ const selectAllBtn = document.getElementById("select-all-logs");
461
+ if (selectAllBtn && textarea) {
462
+ selectAllBtn.addEventListener("click", () => {
463
+ textarea.select();
464
+ textarea.focus();
465
+ });
466
+ }
467
+ // Auto-select on open
468
+ if (textarea) {
469
+ setTimeout(() => {
470
+ textarea.select();
471
+ textarea.focus();
472
+ }, 100);
473
+ }
474
+ }
475
+ /**
476
+ * Get all captured logs as a formatted string
477
+ * @returns Formatted log string with timestamps and levels
478
+ */
479
+ getLogs() {
480
+ return this.logs.map((log) => this.formatLog(log)).join("\n");
481
+ }
482
+ /**
483
+ * Clear all captured logs
484
+ */
485
+ clearLogs() {
486
+ this.logs = [];
487
+ this.updateButtonBadge();
488
+ globalConsole.log("🗑️ Console logs cleared");
489
+ }
490
+ /**
491
+ * Copy logs to clipboard
492
+ */
493
+ async copyLogs() {
494
+ const text = this.getLogs();
495
+ try {
496
+ // Try modern clipboard API first
497
+ if (typeof navigator !== "undefined" &&
498
+ navigator.clipboard &&
499
+ navigator.clipboard.writeText) {
500
+ await navigator.clipboard.writeText(text);
501
+ this.showCopySuccess();
502
+ }
503
+ else {
504
+ // Fallback method using textarea
505
+ this.copyUsingTextarea(text);
506
+ }
507
+ }
508
+ catch {
509
+ // If modern API fails, try fallback
510
+ globalConsole.warn("Clipboard API failed, using fallback");
511
+ this.copyUsingTextarea(text);
512
+ }
513
+ }
514
+ /**
515
+ * Download logs as a text file
516
+ */
517
+ downloadLogs() {
518
+ if (typeof document === "undefined") {
519
+ return;
520
+ }
521
+ const text = this.getLogs();
522
+ const blob = new Blob([text], { type: "text/plain" });
523
+ const url = URL.createObjectURL(blob);
524
+ const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
525
+ const filename = `console-logs-${timestamp}.txt`;
526
+ const link = document.createElement("a");
527
+ link.href = url;
528
+ link.download = filename;
529
+ document.body.appendChild(link);
530
+ link.click();
531
+ document.body.removeChild(link);
532
+ URL.revokeObjectURL(url);
533
+ globalConsole.log("💾 Console logs downloaded!");
534
+ }
535
+ /**
536
+ * Restore original console methods and clean up UI
537
+ */
538
+ destroy() {
539
+ // Restore original console methods
540
+ globalConsole.log = this.originalMethods.log;
541
+ globalConsole.error = this.originalMethods.error;
542
+ globalConsole.warn = this.originalMethods.warn;
543
+ globalConsole.info = this.originalMethods.info;
544
+ globalConsole.debug = this.originalMethods.debug;
545
+ // Remove UI elements
546
+ if (typeof document !== "undefined" &&
547
+ this.buttonContainer &&
548
+ this.buttonContainer.parentNode) {
549
+ this.buttonContainer.parentNode.removeChild(this.buttonContainer);
550
+ }
551
+ // Remove modal if open
552
+ if (typeof document !== "undefined") {
553
+ const modal = document.getElementById("console-logs-modal");
554
+ if (modal) {
555
+ modal.remove();
556
+ }
557
+ }
558
+ // Remove global methods
559
+ if (typeof window !== "undefined") {
560
+ delete window.__console__;
561
+ }
562
+ }
563
+ }
564
+ /**
565
+ * Convenience function to initialize ConsoleCaptureUI
566
+ * @returns A new ConsoleCaptureUI instance
567
+ */
568
+ export function initConsoleCaptureUI() {
569
+ return new ConsoleCaptureUI();
570
+ }
571
+ //# sourceMappingURL=ConsoleCaptureUI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConsoleCaptureUI.js","sourceRoot":"","sources":["../../src/ui/ConsoleCaptureUI.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * UI components for console capture and display.
3
+ *
4
+ * Usage:
5
+ * import { initConsoleCaptureUI } from "@graphty/remote-logger/ui";
6
+ * initConsoleCaptureUI();
7
+ *
8
+ * Or access programmatically:
9
+ * import { ConsoleCaptureUI } from "@graphty/remote-logger/ui";
10
+ * const ui = new ConsoleCaptureUI();
11
+ * console.log("This will be captured");
12
+ * console.log(ui.getLogs());
13
+ */
14
+ export { ConsoleCaptureUI, initConsoleCaptureUI } from "./ConsoleCaptureUI.js";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * UI components for console capture and display.
3
+ *
4
+ * Usage:
5
+ * import { initConsoleCaptureUI } from "@graphty/remote-logger/ui";
6
+ * initConsoleCaptureUI();
7
+ *
8
+ * Or access programmatically:
9
+ * import { ConsoleCaptureUI } from "@graphty/remote-logger/ui";
10
+ * const ui = new ConsoleCaptureUI();
11
+ * console.log("This will be captured");
12
+ * console.log(ui.getLogs());
13
+ */
14
+ export { ConsoleCaptureUI, initConsoleCaptureUI } from "./ConsoleCaptureUI.js";
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Vite integration for remote-logger.
3
+ *
4
+ * Provides a Vite plugin for automatic project marker injection.
5
+ * @module vite
6
+ */
7
+ export { remoteLoggerPlugin } from "./plugin.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Vite integration for remote-logger.
3
+ *
4
+ * Provides a Vite plugin for automatic project marker injection.
5
+ * @module vite
6
+ */
7
+ export { remoteLoggerPlugin } from "./plugin.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}