@push.rocks/smartdb 2.5.2 → 2.5.5

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 (44) hide show
  1. package/dist_rust/rustdb_linux_amd64 +0 -0
  2. package/dist_rust/rustdb_linux_arm64 +0 -0
  3. package/package.json +2 -1
  4. package/ts/00_commitinfo_data.ts +1 -1
  5. package/dist_ts/00_commitinfo_data.d.ts +0 -8
  6. package/dist_ts/00_commitinfo_data.js +0 -9
  7. package/dist_ts/index.d.ts +0 -7
  8. package/dist_ts/index.js +0 -10
  9. package/dist_ts/ts_local/classes.localsmartdb.d.ts +0 -87
  10. package/dist_ts/ts_local/classes.localsmartdb.js +0 -169
  11. package/dist_ts/ts_local/index.d.ts +0 -2
  12. package/dist_ts/ts_local/index.js +0 -2
  13. package/dist_ts/ts_local/plugins.d.ts +0 -1
  14. package/dist_ts/ts_local/plugins.js +0 -3
  15. package/dist_ts/ts_migration/classes.storagemigrator.d.ts +0 -24
  16. package/dist_ts/ts_migration/classes.storagemigrator.js +0 -75
  17. package/dist_ts/ts_migration/index.d.ts +0 -1
  18. package/dist_ts/ts_migration/index.js +0 -2
  19. package/dist_ts/ts_migration/migrators/v0_to_v1.d.ts +0 -9
  20. package/dist_ts/ts_migration/migrators/v0_to_v1.js +0 -225
  21. package/dist_ts/ts_smartdb/index.d.ts +0 -4
  22. package/dist_ts/ts_smartdb/index.js +0 -6
  23. package/dist_ts/ts_smartdb/plugins.d.ts +0 -2
  24. package/dist_ts/ts_smartdb/plugins.js +0 -4
  25. package/dist_ts/ts_smartdb/rust-db-bridge.d.ts +0 -122
  26. package/dist_ts/ts_smartdb/rust-db-bridge.js +0 -113
  27. package/dist_ts/ts_smartdb/server/SmartdbServer.d.ts +0 -104
  28. package/dist_ts/ts_smartdb/server/SmartdbServer.js +0 -166
  29. package/dist_ts/ts_smartdb/server/index.d.ts +0 -2
  30. package/dist_ts/ts_smartdb/server/index.js +0 -3
  31. package/dist_ts_debugserver/bundled.d.ts +0 -4
  32. package/dist_ts_debugserver/bundled.js +0 -12
  33. package/dist_ts_debugserver/classes.debugserver.d.ts +0 -36
  34. package/dist_ts_debugserver/classes.debugserver.js +0 -95
  35. package/dist_ts_debugserver/index.d.ts +0 -2
  36. package/dist_ts_debugserver/index.js +0 -2
  37. package/dist_ts_debugserver/plugins.d.ts +0 -2
  38. package/dist_ts_debugserver/plugins.js +0 -3
  39. package/dist_ts_debugui/index.d.ts +0 -2
  40. package/dist_ts_debugui/index.js +0 -2
  41. package/dist_ts_debugui/plugins.d.ts +0 -1
  42. package/dist_ts_debugui/plugins.js +0 -2
  43. package/dist_ts_debugui/smartdb-debugui.d.ts +0 -62
  44. package/dist_ts_debugui/smartdb-debugui.js +0 -1132
@@ -1,1132 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- import { DeesElement, customElement, html, css, property, state, cssManager } from './plugins.js';
8
- let SmartdbDebugUi = class SmartdbDebugUi extends DeesElement {
9
- #server_accessor_storage = null;
10
- /** Direct server reference (Node-side usage). */
11
- get server() { return this.#server_accessor_storage; }
12
- set server(value) { this.#server_accessor_storage = value; }
13
- #apiBaseUrl_accessor_storage = null;
14
- /** Base URL for HTTP API (browser usage, e.g. "" for same origin). When set, uses fetch instead of direct server calls. */
15
- get apiBaseUrl() { return this.#apiBaseUrl_accessor_storage; }
16
- set apiBaseUrl(value) { this.#apiBaseUrl_accessor_storage = value; }
17
- #refreshInterval_accessor_storage = 2000;
18
- get refreshInterval() { return this.#refreshInterval_accessor_storage; }
19
- set refreshInterval(value) { this.#refreshInterval_accessor_storage = value; }
20
- #activeTab_accessor_storage = 'dashboard';
21
- get activeTab() { return this.#activeTab_accessor_storage; }
22
- set activeTab(value) { this.#activeTab_accessor_storage = value; }
23
- #metrics_accessor_storage = null;
24
- get metrics() { return this.#metrics_accessor_storage; }
25
- set metrics(value) { this.#metrics_accessor_storage = value; }
26
- #oplogStats_accessor_storage = null;
27
- get oplogStats() { return this.#oplogStats_accessor_storage; }
28
- set oplogStats(value) { this.#oplogStats_accessor_storage = value; }
29
- #oplogEntries_accessor_storage = [];
30
- get oplogEntries() { return this.#oplogEntries_accessor_storage; }
31
- set oplogEntries(value) { this.#oplogEntries_accessor_storage = value; }
32
- #collections_accessor_storage = [];
33
- get collections() { return this.#collections_accessor_storage; }
34
- set collections(value) { this.#collections_accessor_storage = value; }
35
- #selectedCollection_accessor_storage = null;
36
- get selectedCollection() { return this.#selectedCollection_accessor_storage; }
37
- set selectedCollection(value) { this.#selectedCollection_accessor_storage = value; }
38
- #documents_accessor_storage = [];
39
- get documents() { return this.#documents_accessor_storage; }
40
- set documents(value) { this.#documents_accessor_storage = value; }
41
- #documentsTotal_accessor_storage = 0;
42
- get documentsTotal() { return this.#documentsTotal_accessor_storage; }
43
- set documentsTotal(value) { this.#documentsTotal_accessor_storage = value; }
44
- #expandedOplogSeqs_accessor_storage = new Set();
45
- get expandedOplogSeqs() { return this.#expandedOplogSeqs_accessor_storage; }
46
- set expandedOplogSeqs(value) { this.#expandedOplogSeqs_accessor_storage = value; }
47
- #revertTargetSeq_accessor_storage = 0;
48
- get revertTargetSeq() { return this.#revertTargetSeq_accessor_storage; }
49
- set revertTargetSeq(value) { this.#revertTargetSeq_accessor_storage = value; }
50
- #revertPreview_accessor_storage = null;
51
- get revertPreview() { return this.#revertPreview_accessor_storage; }
52
- set revertPreview(value) { this.#revertPreview_accessor_storage = value; }
53
- #revertInProgress_accessor_storage = false;
54
- get revertInProgress() { return this.#revertInProgress_accessor_storage; }
55
- set revertInProgress(value) { this.#revertInProgress_accessor_storage = value; }
56
- #oplogFilter_accessor_storage = {};
57
- get oplogFilter() { return this.#oplogFilter_accessor_storage; }
58
- set oplogFilter(value) { this.#oplogFilter_accessor_storage = value; }
59
- static { this.styles = [
60
- cssManager.defaultStyles,
61
- css `
62
- :host {
63
- display: block;
64
- font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
65
- }
66
-
67
- .debugui {
68
- padding: 24px;
69
- background: ${cssManager.bdTheme('#f8fafc', '#09090b')};
70
- min-height: 100vh;
71
- color: ${cssManager.bdTheme('#0f172a', '#f1f5f9')};
72
- }
73
-
74
- .header {
75
- display: flex;
76
- align-items: center;
77
- justify-content: space-between;
78
- margin-bottom: 24px;
79
- }
80
-
81
- .header-left {
82
- display: flex;
83
- align-items: center;
84
- gap: 12px;
85
- }
86
-
87
- .title {
88
- font-size: 24px;
89
- font-weight: 700;
90
- }
91
-
92
- .status-dot {
93
- width: 10px;
94
- height: 10px;
95
- border-radius: 50%;
96
- background: ${cssManager.bdTheme('#22c55e', '#22c55e')};
97
- }
98
-
99
- .status-dot.offline {
100
- background: ${cssManager.bdTheme('#ef4444', '#ef4444')};
101
- }
102
-
103
- /* Tabs */
104
- .tabs {
105
- display: flex;
106
- gap: 2px;
107
- background: ${cssManager.bdTheme('#e2e8f0', '#1e1e1e')};
108
- border-radius: 10px;
109
- padding: 3px;
110
- margin-bottom: 24px;
111
- }
112
-
113
- .tab {
114
- padding: 8px 20px;
115
- border-radius: 8px;
116
- font-size: 13px;
117
- font-weight: 500;
118
- cursor: pointer;
119
- transition: all 0.15s ease;
120
- color: ${cssManager.bdTheme('#64748b', '#94a3b8')};
121
- border: none;
122
- background: none;
123
- }
124
-
125
- .tab:hover {
126
- color: ${cssManager.bdTheme('#0f172a', '#e2e8f0')};
127
- }
128
-
129
- .tab.active {
130
- background: ${cssManager.bdTheme('#ffffff', '#27272a')};
131
- color: ${cssManager.bdTheme('#0f172a', '#f1f5f9')};
132
- box-shadow: 0 1px 3px ${cssManager.bdTheme('rgba(0,0,0,0.08)', 'rgba(0,0,0,0.3)')};
133
- }
134
-
135
- /* Cards */
136
- .card {
137
- background: ${cssManager.bdTheme('#ffffff', '#18181b')};
138
- border: 1px solid ${cssManager.bdTheme('#e2e8f0', '#27272a')};
139
- border-radius: 12px;
140
- padding: 20px;
141
- margin-bottom: 16px;
142
- }
143
-
144
- .card-title {
145
- font-size: 14px;
146
- font-weight: 600;
147
- color: ${cssManager.bdTheme('#64748b', '#94a3b8')};
148
- text-transform: uppercase;
149
- letter-spacing: 0.5px;
150
- margin-bottom: 12px;
151
- }
152
-
153
- /* Stats grid */
154
- .stats-grid {
155
- display: grid;
156
- grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
157
- gap: 16px;
158
- margin-bottom: 24px;
159
- }
160
-
161
- .stat-card {
162
- background: ${cssManager.bdTheme('#ffffff', '#18181b')};
163
- border: 1px solid ${cssManager.bdTheme('#e2e8f0', '#27272a')};
164
- border-radius: 12px;
165
- padding: 20px;
166
- }
167
-
168
- .stat-label {
169
- font-size: 12px;
170
- font-weight: 500;
171
- color: ${cssManager.bdTheme('#94a3b8', '#64748b')};
172
- text-transform: uppercase;
173
- letter-spacing: 0.5px;
174
- margin-bottom: 8px;
175
- }
176
-
177
- .stat-value {
178
- font-size: 28px;
179
- font-weight: 700;
180
- color: ${cssManager.bdTheme('#0f172a', '#f1f5f9')};
181
- }
182
-
183
- /* Collections */
184
- .collections-layout {
185
- display: grid;
186
- grid-template-columns: 280px 1fr;
187
- gap: 16px;
188
- min-height: 500px;
189
- }
190
-
191
- .coll-sidebar {
192
- background: ${cssManager.bdTheme('#ffffff', '#18181b')};
193
- border: 1px solid ${cssManager.bdTheme('#e2e8f0', '#27272a')};
194
- border-radius: 12px;
195
- overflow: hidden;
196
- }
197
-
198
- .coll-item {
199
- padding: 12px 16px;
200
- cursor: pointer;
201
- border-bottom: 1px solid ${cssManager.bdTheme('#f1f5f9', '#27272a')};
202
- transition: background 0.1s ease;
203
- font-size: 13px;
204
- }
205
-
206
- .coll-item:hover {
207
- background: ${cssManager.bdTheme('#f8fafc', '#1f1f23')};
208
- }
209
-
210
- .coll-item.selected {
211
- background: ${cssManager.bdTheme('#eff6ff', '#1e3a5f')};
212
- color: ${cssManager.bdTheme('#1d4ed8', '#93c5fd')};
213
- }
214
-
215
- .coll-name {
216
- font-weight: 500;
217
- }
218
-
219
- .coll-count {
220
- font-size: 11px;
221
- color: ${cssManager.bdTheme('#94a3b8', '#64748b')};
222
- margin-top: 2px;
223
- }
224
-
225
- .doc-viewer {
226
- background: ${cssManager.bdTheme('#ffffff', '#18181b')};
227
- border: 1px solid ${cssManager.bdTheme('#e2e8f0', '#27272a')};
228
- border-radius: 12px;
229
- padding: 20px;
230
- overflow: auto;
231
- }
232
-
233
- .doc-item {
234
- background: ${cssManager.bdTheme('#f8fafc', '#0f0f12')};
235
- border: 1px solid ${cssManager.bdTheme('#e2e8f0', '#27272a')};
236
- border-radius: 8px;
237
- padding: 12px 16px;
238
- margin-bottom: 8px;
239
- font-family: 'JetBrains Mono', 'Fira Code', monospace;
240
- font-size: 12px;
241
- line-height: 1.5;
242
- white-space: pre-wrap;
243
- word-break: break-all;
244
- }
245
-
246
- /* OpLog */
247
- .oplog-filters {
248
- display: flex;
249
- gap: 8px;
250
- margin-bottom: 16px;
251
- flex-wrap: wrap;
252
- }
253
-
254
- .filter-chip {
255
- padding: 6px 12px;
256
- border-radius: 6px;
257
- font-size: 12px;
258
- font-weight: 500;
259
- cursor: pointer;
260
- border: 1px solid ${cssManager.bdTheme('#e2e8f0', '#27272a')};
261
- background: ${cssManager.bdTheme('#ffffff', '#18181b')};
262
- color: ${cssManager.bdTheme('#64748b', '#94a3b8')};
263
- transition: all 0.15s ease;
264
- }
265
-
266
- .filter-chip:hover,
267
- .filter-chip.active {
268
- background: ${cssManager.bdTheme('#eff6ff', '#1e3a5f')};
269
- border-color: ${cssManager.bdTheme('#93c5fd', '#3b82f6')};
270
- color: ${cssManager.bdTheme('#1d4ed8', '#93c5fd')};
271
- }
272
-
273
- .oplog-entry {
274
- background: ${cssManager.bdTheme('#ffffff', '#18181b')};
275
- border: 1px solid ${cssManager.bdTheme('#e2e8f0', '#27272a')};
276
- border-radius: 10px;
277
- margin-bottom: 8px;
278
- overflow: hidden;
279
- transition: box-shadow 0.15s ease;
280
- }
281
-
282
- .oplog-entry:hover {
283
- box-shadow: 0 2px 8px ${cssManager.bdTheme('rgba(0,0,0,0.06)', 'rgba(0,0,0,0.2)')};
284
- }
285
-
286
- .oplog-header {
287
- display: flex;
288
- align-items: center;
289
- gap: 12px;
290
- padding: 12px 16px;
291
- cursor: pointer;
292
- }
293
-
294
- .oplog-seq {
295
- font-family: monospace;
296
- font-size: 11px;
297
- color: ${cssManager.bdTheme('#94a3b8', '#64748b')};
298
- min-width: 40px;
299
- }
300
-
301
- .op-badge {
302
- padding: 3px 8px;
303
- border-radius: 4px;
304
- font-size: 11px;
305
- font-weight: 600;
306
- text-transform: uppercase;
307
- letter-spacing: 0.3px;
308
- }
309
-
310
- .op-badge.insert {
311
- background: ${cssManager.bdTheme('#dcfce7', '#14532d')};
312
- color: ${cssManager.bdTheme('#15803d', '#86efac')};
313
- }
314
-
315
- .op-badge.update {
316
- background: ${cssManager.bdTheme('#dbeafe', '#1e3a8a')};
317
- color: ${cssManager.bdTheme('#1e40af', '#93c5fd')};
318
- }
319
-
320
- .op-badge.delete {
321
- background: ${cssManager.bdTheme('#fee2e2', '#7f1d1d')};
322
- color: ${cssManager.bdTheme('#dc2626', '#fca5a5')};
323
- }
324
-
325
- .oplog-ns {
326
- font-size: 13px;
327
- font-weight: 500;
328
- flex: 1;
329
- }
330
-
331
- .oplog-time {
332
- font-size: 11px;
333
- color: ${cssManager.bdTheme('#94a3b8', '#64748b')};
334
- }
335
-
336
- .oplog-docid {
337
- font-size: 11px;
338
- font-family: monospace;
339
- color: ${cssManager.bdTheme('#94a3b8', '#64748b')};
340
- }
341
-
342
- .oplog-expand {
343
- font-size: 11px;
344
- color: ${cssManager.bdTheme('#94a3b8', '#64748b')};
345
- transition: transform 0.2s ease;
346
- }
347
-
348
- .oplog-expand.expanded {
349
- transform: rotate(90deg);
350
- }
351
-
352
- .oplog-diff {
353
- padding: 0 16px 16px;
354
- border-top: 1px solid ${cssManager.bdTheme('#f1f5f9', '#27272a')};
355
- }
356
-
357
- .diff-row {
358
- display: flex;
359
- align-items: baseline;
360
- gap: 8px;
361
- padding: 4px 0;
362
- font-family: monospace;
363
- font-size: 12px;
364
- line-height: 1.6;
365
- }
366
-
367
- .diff-path {
368
- color: ${cssManager.bdTheme('#64748b', '#94a3b8')};
369
- min-width: 120px;
370
- }
371
-
372
- .diff-added {
373
- color: ${cssManager.bdTheme('#15803d', '#86efac')};
374
- background: ${cssManager.bdTheme('#f0fdf4', '#052e16')};
375
- padding: 1px 4px;
376
- border-radius: 3px;
377
- }
378
-
379
- .diff-removed {
380
- color: ${cssManager.bdTheme('#dc2626', '#fca5a5')};
381
- background: ${cssManager.bdTheme('#fef2f2', '#450a0a')};
382
- padding: 1px 4px;
383
- border-radius: 3px;
384
- }
385
-
386
- .diff-changed-old {
387
- color: ${cssManager.bdTheme('#dc2626', '#fca5a5')};
388
- background: ${cssManager.bdTheme('#fef2f2', '#450a0a')};
389
- padding: 1px 4px;
390
- border-radius: 3px;
391
- text-decoration: line-through;
392
- }
393
-
394
- .diff-changed-new {
395
- color: ${cssManager.bdTheme('#15803d', '#86efac')};
396
- background: ${cssManager.bdTheme('#f0fdf4', '#052e16')};
397
- padding: 1px 4px;
398
- border-radius: 3px;
399
- }
400
-
401
- /* Revert */
402
- .revert-controls {
403
- display: flex;
404
- gap: 12px;
405
- align-items: center;
406
- margin-bottom: 20px;
407
- }
408
-
409
- .revert-input {
410
- padding: 8px 12px;
411
- border-radius: 8px;
412
- border: 1px solid ${cssManager.bdTheme('#e2e8f0', '#27272a')};
413
- background: ${cssManager.bdTheme('#ffffff', '#0f0f12')};
414
- color: ${cssManager.bdTheme('#0f172a', '#f1f5f9')};
415
- font-size: 14px;
416
- font-family: monospace;
417
- width: 120px;
418
- outline: none;
419
- }
420
-
421
- .revert-input:focus {
422
- border-color: ${cssManager.bdTheme('#3b82f6', '#3b82f6')};
423
- }
424
-
425
- .btn {
426
- padding: 8px 16px;
427
- border-radius: 8px;
428
- font-size: 13px;
429
- font-weight: 500;
430
- cursor: pointer;
431
- border: none;
432
- transition: all 0.15s ease;
433
- }
434
-
435
- .btn-primary {
436
- background: ${cssManager.bdTheme('#3b82f6', '#2563eb')};
437
- color: white;
438
- }
439
-
440
- .btn-primary:hover {
441
- background: ${cssManager.bdTheme('#2563eb', '#1d4ed8')};
442
- }
443
-
444
- .btn-danger {
445
- background: ${cssManager.bdTheme('#ef4444', '#dc2626')};
446
- color: white;
447
- }
448
-
449
- .btn-danger:hover {
450
- background: ${cssManager.bdTheme('#dc2626', '#b91c1c')};
451
- }
452
-
453
- .btn:disabled {
454
- opacity: 0.5;
455
- cursor: not-allowed;
456
- }
457
-
458
- .revert-preview {
459
- background: ${cssManager.bdTheme('#fffbeb', '#1c1305')};
460
- border: 1px solid ${cssManager.bdTheme('#fcd34d', '#854d0e')};
461
- border-radius: 10px;
462
- padding: 16px;
463
- margin-bottom: 16px;
464
- }
465
-
466
- .revert-preview-title {
467
- font-weight: 600;
468
- margin-bottom: 8px;
469
- color: ${cssManager.bdTheme('#92400e', '#fbbf24')};
470
- }
471
-
472
- .empty-state {
473
- text-align: center;
474
- padding: 48px 24px;
475
- color: ${cssManager.bdTheme('#94a3b8', '#64748b')};
476
- }
477
-
478
- .empty-state-text {
479
- font-size: 15px;
480
- margin-bottom: 4px;
481
- }
482
-
483
- .empty-state-sub {
484
- font-size: 13px;
485
- }
486
-
487
- .doc-json-block {
488
- background: ${cssManager.bdTheme('#f8fafc', '#0f0f12')};
489
- border: 1px solid ${cssManager.bdTheme('#e2e8f0', '#27272a')};
490
- border-radius: 6px;
491
- padding: 12px;
492
- margin-top: 8px;
493
- font-family: 'JetBrains Mono', 'Fira Code', monospace;
494
- font-size: 11px;
495
- line-height: 1.5;
496
- white-space: pre-wrap;
497
- word-break: break-all;
498
- max-height: 300px;
499
- overflow: auto;
500
- }
501
-
502
- .diff-label {
503
- font-size: 11px;
504
- font-weight: 600;
505
- text-transform: uppercase;
506
- letter-spacing: 0.5px;
507
- margin-top: 12px;
508
- margin-bottom: 4px;
509
- color: ${cssManager.bdTheme('#64748b', '#94a3b8')};
510
- }
511
- `,
512
- ]; }
513
- async connectedCallback() {
514
- await super.connectedCallback();
515
- // Auto-detect: if no server and no explicit apiBaseUrl, default to same-origin HTTP.
516
- if (!this.server && this.apiBaseUrl === null) {
517
- this.apiBaseUrl = '';
518
- }
519
- this.startRefreshing();
520
- }
521
- async disconnectedCallback() {
522
- await super.disconnectedCallback();
523
- this.stopRefreshing();
524
- }
525
- startRefreshing() {
526
- if (this.refreshTimer)
527
- clearInterval(this.refreshTimer);
528
- this.refresh();
529
- this.refreshTimer = setInterval(() => this.refresh(), this.refreshInterval);
530
- }
531
- stopRefreshing() {
532
- if (this.refreshTimer) {
533
- clearInterval(this.refreshTimer);
534
- this.refreshTimer = null;
535
- }
536
- }
537
- // --- Data access layer (supports both direct server calls and HTTP fetch) ---
538
- get useHttp() {
539
- return this.apiBaseUrl !== null;
540
- }
541
- async apiFetch(path, params = {}) {
542
- const base = this.apiBaseUrl ?? '';
543
- const url = new URL(`${base}/api/smartdb${path}`, window.location.origin);
544
- for (const [k, v] of Object.entries(params)) {
545
- if (v !== undefined && v !== null)
546
- url.searchParams.set(k, String(v));
547
- }
548
- const res = await fetch(url.toString());
549
- if (!res.ok)
550
- throw new Error(`HTTP ${res.status}`);
551
- return res.json();
552
- }
553
- async refresh() {
554
- if (!this.useHttp && !this.server?.running) {
555
- this.metrics = null;
556
- this.oplogStats = null;
557
- return;
558
- }
559
- try {
560
- if (this.useHttp) {
561
- const [metrics, oplogStats] = await Promise.all([
562
- this.apiFetch('/metrics'),
563
- this.apiFetch('/oplog/stats'),
564
- ]);
565
- this.metrics = metrics;
566
- this.oplogStats = oplogStats;
567
- }
568
- else {
569
- const [metrics, oplogStats] = await Promise.all([
570
- this.server.getMetrics(),
571
- this.server.getOpLogStats(),
572
- ]);
573
- this.metrics = metrics;
574
- this.oplogStats = oplogStats;
575
- }
576
- if (this.activeTab === 'collections' && this.collections.length === 0) {
577
- await this.loadCollections();
578
- }
579
- if (this.activeTab === 'oplog' || this.activeTab === 'revert') {
580
- await this.loadOplog();
581
- }
582
- }
583
- catch {
584
- // Server may not be running yet.
585
- }
586
- }
587
- async loadOplog() {
588
- if (!this.useHttp && !this.server?.running)
589
- return;
590
- if (this.useHttp) {
591
- const result = await this.apiFetch('/oplog', { limit: 200 });
592
- this.oplogEntries = result.entries;
593
- }
594
- else {
595
- const result = await this.server.getOpLog({ limit: 200 });
596
- this.oplogEntries = result.entries;
597
- }
598
- }
599
- async loadCollections() {
600
- if (!this.useHttp && !this.server?.running)
601
- return;
602
- if (this.useHttp) {
603
- const result = await this.apiFetch('/collections');
604
- this.collections = result.collections;
605
- }
606
- else {
607
- this.collections = await this.server.getCollections();
608
- }
609
- }
610
- async selectCollection(db, name) {
611
- this.selectedCollection = { db, name };
612
- if (this.useHttp) {
613
- const result = await this.apiFetch('/documents', { db, collection: name, limit: 50, skip: 0 });
614
- this.documents = result.documents;
615
- this.documentsTotal = result.total;
616
- }
617
- else {
618
- if (!this.server?.running)
619
- return;
620
- const result = await this.server.getDocuments(db, name, 50, 0);
621
- this.documents = result.documents;
622
- this.documentsTotal = result.total;
623
- }
624
- }
625
- toggleOplogEntry(seq) {
626
- const next = new Set(this.expandedOplogSeqs);
627
- if (next.has(seq)) {
628
- next.delete(seq);
629
- }
630
- else {
631
- next.add(seq);
632
- }
633
- this.expandedOplogSeqs = next;
634
- }
635
- async handlePreviewRevert() {
636
- if (this.revertTargetSeq <= 0)
637
- return;
638
- if (this.useHttp) {
639
- this.revertPreview = await this.apiFetch('/revert', { seq: this.revertTargetSeq, dryRun: true });
640
- }
641
- else {
642
- if (!this.server?.running)
643
- return;
644
- this.revertPreview = await this.server.revertToSeq(this.revertTargetSeq, true);
645
- }
646
- }
647
- async handleExecuteRevert() {
648
- if (this.revertTargetSeq <= 0)
649
- return;
650
- this.revertInProgress = true;
651
- try {
652
- if (this.useHttp) {
653
- await this.apiFetch('/revert', { seq: this.revertTargetSeq, dryRun: false });
654
- }
655
- else {
656
- if (!this.server?.running)
657
- return;
658
- await this.server.revertToSeq(this.revertTargetSeq, false);
659
- }
660
- this.revertPreview = null;
661
- this.revertTargetSeq = 0;
662
- await this.refresh();
663
- }
664
- finally {
665
- this.revertInProgress = false;
666
- }
667
- }
668
- async switchTab(tab) {
669
- this.activeTab = tab;
670
- if (tab === 'collections') {
671
- await this.loadCollections();
672
- }
673
- if (tab === 'oplog' || tab === 'revert') {
674
- await this.loadOplog();
675
- }
676
- }
677
- // --- Diff computation ---
678
- computeDiff(prev, next) {
679
- const diffs = [];
680
- this.diffRecursive(prev || {}, next || {}, '', diffs);
681
- return diffs;
682
- }
683
- diffRecursive(a, b, path, diffs) {
684
- const aKeys = new Set(a && typeof a === 'object' ? Object.keys(a) : []);
685
- const bKeys = new Set(b && typeof b === 'object' ? Object.keys(b) : []);
686
- const allKeys = new Set([...aKeys, ...bKeys]);
687
- for (const key of allKeys) {
688
- const fullPath = path ? `${path}.${key}` : key;
689
- const inA = aKeys.has(key);
690
- const inB = bKeys.has(key);
691
- if (!inA && inB) {
692
- diffs.push({ path: fullPath, type: 'added', newValue: b[key] });
693
- }
694
- else if (inA && !inB) {
695
- diffs.push({ path: fullPath, type: 'removed', oldValue: a[key] });
696
- }
697
- else if (typeof a[key] === 'object' &&
698
- a[key] !== null &&
699
- typeof b[key] === 'object' &&
700
- b[key] !== null &&
701
- !Array.isArray(a[key]) &&
702
- !Array.isArray(b[key])) {
703
- this.diffRecursive(a[key], b[key], fullPath, diffs);
704
- }
705
- else if (JSON.stringify(a[key]) !== JSON.stringify(b[key])) {
706
- diffs.push({
707
- path: fullPath,
708
- type: 'changed',
709
- oldValue: a[key],
710
- newValue: b[key],
711
- });
712
- }
713
- }
714
- }
715
- formatValue(val) {
716
- if (val === null || val === undefined)
717
- return 'null';
718
- if (typeof val === 'string')
719
- return `"${val}"`;
720
- if (typeof val === 'object')
721
- return JSON.stringify(val);
722
- return String(val);
723
- }
724
- formatTime(timestampMs) {
725
- return new Date(timestampMs).toLocaleTimeString(undefined, {
726
- hour: '2-digit',
727
- minute: '2-digit',
728
- second: '2-digit',
729
- fractionalSecondDigits: 3,
730
- });
731
- }
732
- // --- Render ---
733
- render() {
734
- const isOnline = this.useHttp ? this.metrics !== null : (this.server?.running ?? false);
735
- return html `
736
- <div class="debugui">
737
- <div class="header">
738
- <div class="header-left">
739
- <div class="title">SmartDB Debug</div>
740
- <div class="status-dot ${isOnline ? '' : 'offline'}"></div>
741
- </div>
742
- </div>
743
-
744
- <div class="tabs">
745
- ${['dashboard', 'collections', 'oplog', 'revert'].map((tab) => html `
746
- <button
747
- class="tab ${this.activeTab === tab ? 'active' : ''}"
748
- @click=${() => this.switchTab(tab)}
749
- >
750
- ${tab === 'dashboard'
751
- ? 'Dashboard'
752
- : tab === 'collections'
753
- ? 'Collections'
754
- : tab === 'oplog'
755
- ? 'OpLog'
756
- : 'Revert'}
757
- </button>
758
- `)}
759
- </div>
760
-
761
- ${this.activeTab === 'dashboard' ? this.renderDashboard() : ''}
762
- ${this.activeTab === 'collections' ? this.renderCollections() : ''}
763
- ${this.activeTab === 'oplog' ? this.renderOplog() : ''}
764
- ${this.activeTab === 'revert' ? this.renderRevert() : ''}
765
- </div>
766
- `;
767
- }
768
- renderDashboard() {
769
- return html `
770
- <div class="stats-grid">
771
- <div class="stat-card">
772
- <div class="stat-label">Databases</div>
773
- <div class="stat-value">${this.metrics?.databases ?? '-'}</div>
774
- </div>
775
- <div class="stat-card">
776
- <div class="stat-label">Collections</div>
777
- <div class="stat-value">${this.metrics?.collections ?? '-'}</div>
778
- </div>
779
- <div class="stat-card">
780
- <div class="stat-label">OpLog Entries</div>
781
- <div class="stat-value">${this.oplogStats?.totalEntries ?? '-'}</div>
782
- </div>
783
- <div class="stat-card">
784
- <div class="stat-label">Current Seq</div>
785
- <div class="stat-value">${this.oplogStats?.currentSeq ?? '-'}</div>
786
- </div>
787
- <div class="stat-card">
788
- <div class="stat-label">Uptime</div>
789
- <div class="stat-value">
790
- ${this.metrics ? this.formatUptime(this.metrics.uptimeSeconds) : '-'}
791
- </div>
792
- </div>
793
- </div>
794
-
795
- ${this.oplogStats
796
- ? html `
797
- <div class="card">
798
- <div class="card-title">Operations Breakdown</div>
799
- <div class="stats-grid">
800
- <div class="stat-card">
801
- <div class="stat-label">Inserts</div>
802
- <div class="stat-value" style="color: #22c55e">
803
- ${this.oplogStats.entriesByOp.insert}
804
- </div>
805
- </div>
806
- <div class="stat-card">
807
- <div class="stat-label">Updates</div>
808
- <div class="stat-value" style="color: #3b82f6">
809
- ${this.oplogStats.entriesByOp.update}
810
- </div>
811
- </div>
812
- <div class="stat-card">
813
- <div class="stat-label">Deletes</div>
814
- <div class="stat-value" style="color: #ef4444">
815
- ${this.oplogStats.entriesByOp.delete}
816
- </div>
817
- </div>
818
- </div>
819
- </div>
820
- `
821
- : ''}
822
- `;
823
- }
824
- formatUptime(secs) {
825
- if (secs < 60)
826
- return `${secs}s`;
827
- if (secs < 3600)
828
- return `${Math.floor(secs / 60)}m`;
829
- return `${Math.floor(secs / 3600)}h ${Math.floor((secs % 3600) / 60)}m`;
830
- }
831
- renderCollections() {
832
- return html `
833
- <div class="collections-layout">
834
- <div class="coll-sidebar">
835
- ${this.collections.length === 0
836
- ? html `<div class="empty-state">
837
- <div class="empty-state-text">No collections</div>
838
- </div>`
839
- : this.collections.map((c) => html `
840
- <div
841
- class="coll-item ${this.selectedCollection?.db === c.db &&
842
- this.selectedCollection?.name === c.name
843
- ? 'selected'
844
- : ''}"
845
- @click=${() => this.selectCollection(c.db, c.name)}
846
- >
847
- <div class="coll-name">${c.db}.${c.name}</div>
848
- <div class="coll-count">${c.count} documents</div>
849
- </div>
850
- `)}
851
- </div>
852
-
853
- <div class="doc-viewer">
854
- ${this.selectedCollection
855
- ? html `
856
- <div class="card-title">
857
- ${this.selectedCollection.db}.${this.selectedCollection.name}
858
- (${this.documentsTotal} total)
859
- </div>
860
- ${this.documents.length === 0
861
- ? html `<div class="empty-state">
862
- <div class="empty-state-text">No documents</div>
863
- </div>`
864
- : this.documents.map((doc) => html `
865
- <div class="doc-item">${JSON.stringify(doc, null, 2)}</div>
866
- `)}
867
- `
868
- : html `<div class="empty-state">
869
- <div class="empty-state-text">Select a collection</div>
870
- <div class="empty-state-sub">
871
- Choose a collection from the sidebar to browse its documents
872
- </div>
873
- </div>`}
874
- </div>
875
- </div>
876
- `;
877
- }
878
- renderOplog() {
879
- const filtered = this.getFilteredOplog();
880
- return html `
881
- <div class="oplog-filters">
882
- <button
883
- class="filter-chip ${!this.oplogFilter.op ? 'active' : ''}"
884
- @click=${() => (this.oplogFilter = { ...this.oplogFilter, op: undefined })}
885
- >
886
- All
887
- </button>
888
- <button
889
- class="filter-chip ${this.oplogFilter.op === 'insert' ? 'active' : ''}"
890
- @click=${() => (this.oplogFilter = { ...this.oplogFilter, op: 'insert' })}
891
- >
892
- Inserts
893
- </button>
894
- <button
895
- class="filter-chip ${this.oplogFilter.op === 'update' ? 'active' : ''}"
896
- @click=${() => (this.oplogFilter = { ...this.oplogFilter, op: 'update' })}
897
- >
898
- Updates
899
- </button>
900
- <button
901
- class="filter-chip ${this.oplogFilter.op === 'delete' ? 'active' : ''}"
902
- @click=${() => (this.oplogFilter = { ...this.oplogFilter, op: 'delete' })}
903
- >
904
- Deletes
905
- </button>
906
- </div>
907
-
908
- ${filtered.length === 0
909
- ? html `<div class="empty-state">
910
- <div class="empty-state-text">No oplog entries</div>
911
- <div class="empty-state-sub">Write operations will appear here as they occur</div>
912
- </div>`
913
- : [...filtered].reverse().map((entry) => this.renderOplogEntry(entry))}
914
- `;
915
- }
916
- getFilteredOplog() {
917
- let entries = this.oplogEntries;
918
- if (this.oplogFilter.op) {
919
- entries = entries.filter((e) => e.op === this.oplogFilter.op);
920
- }
921
- if (this.oplogFilter.collection) {
922
- entries = entries.filter((e) => `${e.db}.${e.collection}` === this.oplogFilter.collection);
923
- }
924
- return entries;
925
- }
926
- renderOplogEntry(entry) {
927
- const isExpanded = this.expandedOplogSeqs.has(entry.seq);
928
- const diffs = isExpanded
929
- ? this.computeDiff(entry.previousDocument, entry.document)
930
- : [];
931
- return html `
932
- <div class="oplog-entry">
933
- <div class="oplog-header" @click=${() => this.toggleOplogEntry(entry.seq)}>
934
- <span class="oplog-seq">#${entry.seq}</span>
935
- <span class="op-badge ${entry.op}">${entry.op}</span>
936
- <span class="oplog-ns">${entry.db}.${entry.collection}</span>
937
- <span class="oplog-docid">${entry.documentId.substring(0, 12)}...</span>
938
- <span class="oplog-time">${this.formatTime(entry.timestampMs)}</span>
939
- <span class="oplog-expand ${isExpanded ? 'expanded' : ''}">&#9654;</span>
940
- </div>
941
-
942
- ${isExpanded
943
- ? html `
944
- <div class="oplog-diff">
945
- ${entry.op === 'insert'
946
- ? html `
947
- <div class="diff-label">Inserted Document</div>
948
- <div class="doc-json-block">
949
- ${JSON.stringify(entry.document, null, 2)}
950
- </div>
951
- `
952
- : entry.op === 'delete'
953
- ? html `
954
- <div class="diff-label">Deleted Document</div>
955
- <div class="doc-json-block">
956
- ${JSON.stringify(entry.previousDocument, null, 2)}
957
- </div>
958
- `
959
- : html `
960
- <div class="diff-label">Changes</div>
961
- ${diffs.length > 0
962
- ? diffs.map((d) => this.renderDiffRow(d))
963
- : html `<div style="font-size: 12px; color: #94a3b8; padding: 4px 0">
964
- No field-level changes
965
- </div>`}
966
- <div class="diff-label">Before</div>
967
- <div class="doc-json-block">
968
- ${JSON.stringify(entry.previousDocument, null, 2)}
969
- </div>
970
- <div class="diff-label">After</div>
971
- <div class="doc-json-block">
972
- ${JSON.stringify(entry.document, null, 2)}
973
- </div>
974
- `}
975
- </div>
976
- `
977
- : ''}
978
- </div>
979
- `;
980
- }
981
- renderDiffRow(diff) {
982
- return html `
983
- <div class="diff-row">
984
- <span class="diff-path">${diff.path}</span>
985
- ${diff.type === 'added'
986
- ? html `<span class="diff-added">+ ${this.formatValue(diff.newValue)}</span>`
987
- : diff.type === 'removed'
988
- ? html `<span class="diff-removed">- ${this.formatValue(diff.oldValue)}</span>`
989
- : html `
990
- <span class="diff-changed-old">${this.formatValue(diff.oldValue)}</span>
991
- <span style="color: #94a3b8">-></span>
992
- <span class="diff-changed-new">${this.formatValue(diff.newValue)}</span>
993
- `}
994
- </div>
995
- `;
996
- }
997
- renderRevert() {
998
- const currentSeq = this.oplogStats?.currentSeq ?? 0;
999
- return html `
1000
- <div class="card">
1001
- <div class="card-title">Point-in-Time Revert</div>
1002
- <p style="font-size: 13px; color: ${cssManager.bdTheme('#64748b', '#94a3b8')}; margin-bottom: 16px">
1003
- Revert the database to a specific oplog sequence number. All operations after that
1004
- point will be undone in reverse order.
1005
- Current sequence: <strong>${currentSeq}</strong>
1006
- </p>
1007
-
1008
- <div class="revert-controls">
1009
- <label style="font-size: 13px; font-weight: 500">Target seq:</label>
1010
- <input
1011
- class="revert-input"
1012
- type="number"
1013
- min="0"
1014
- max="${currentSeq}"
1015
- .value=${String(this.revertTargetSeq)}
1016
- @input=${(e) => {
1017
- this.revertTargetSeq = parseInt(e.target.value) || 0;
1018
- this.revertPreview = null;
1019
- }}
1020
- />
1021
- <button
1022
- class="btn btn-primary"
1023
- ?disabled=${this.revertTargetSeq <= 0 || this.revertTargetSeq > currentSeq}
1024
- @click=${this.handlePreviewRevert}
1025
- >
1026
- Preview
1027
- </button>
1028
- </div>
1029
-
1030
- ${this.revertPreview
1031
- ? html `
1032
- <div class="revert-preview">
1033
- <div class="revert-preview-title">
1034
- Revert Preview: ${this.revertPreview.reverted} operations to undo
1035
- </div>
1036
- ${this.revertPreview.entries?.map((e) => html `
1037
- <div style="font-size: 12px; padding: 2px 0; font-family: monospace">
1038
- #${e.seq} ${e.op} ${e.db}.${e.collection} (${e.documentId})
1039
- </div>
1040
- `)}
1041
- <div style="margin-top: 12px">
1042
- <button
1043
- class="btn btn-danger"
1044
- ?disabled=${this.revertInProgress}
1045
- @click=${this.handleExecuteRevert}
1046
- >
1047
- ${this.revertInProgress ? 'Reverting...' : 'Execute Revert'}
1048
- </button>
1049
- </div>
1050
- </div>
1051
- `
1052
- : ''}
1053
- </div>
1054
-
1055
- <div class="card">
1056
- <div class="card-title">Recent Operations (newest first)</div>
1057
- ${this.oplogEntries.length === 0
1058
- ? html `<div class="empty-state">
1059
- <div class="empty-state-text">No operations recorded yet</div>
1060
- </div>`
1061
- : [...this.oplogEntries]
1062
- .reverse()
1063
- .slice(0, 20)
1064
- .map((entry) => html `
1065
- <div
1066
- style="display: flex; gap: 8px; align-items: center; padding: 6px 0; font-size: 12px; border-bottom: 1px solid ${cssManager.bdTheme('#f1f5f9', '#27272a')}"
1067
- >
1068
- <span class="oplog-seq">#${entry.seq}</span>
1069
- <span class="op-badge ${entry.op}">${entry.op}</span>
1070
- <span style="flex: 1">${entry.db}.${entry.collection}</span>
1071
- <span style="font-family: monospace; color: ${cssManager.bdTheme('#94a3b8', '#64748b')}"
1072
- >${entry.documentId.substring(0, 12)}</span
1073
- >
1074
- </div>
1075
- `)}
1076
- </div>
1077
- `;
1078
- }
1079
- };
1080
- __decorate([
1081
- property({ type: Object })
1082
- ], SmartdbDebugUi.prototype, "server", null);
1083
- __decorate([
1084
- property({ type: String })
1085
- ], SmartdbDebugUi.prototype, "apiBaseUrl", null);
1086
- __decorate([
1087
- property({ type: Number })
1088
- ], SmartdbDebugUi.prototype, "refreshInterval", null);
1089
- __decorate([
1090
- state()
1091
- ], SmartdbDebugUi.prototype, "activeTab", null);
1092
- __decorate([
1093
- state()
1094
- ], SmartdbDebugUi.prototype, "metrics", null);
1095
- __decorate([
1096
- state()
1097
- ], SmartdbDebugUi.prototype, "oplogStats", null);
1098
- __decorate([
1099
- state()
1100
- ], SmartdbDebugUi.prototype, "oplogEntries", null);
1101
- __decorate([
1102
- state()
1103
- ], SmartdbDebugUi.prototype, "collections", null);
1104
- __decorate([
1105
- state()
1106
- ], SmartdbDebugUi.prototype, "selectedCollection", null);
1107
- __decorate([
1108
- state()
1109
- ], SmartdbDebugUi.prototype, "documents", null);
1110
- __decorate([
1111
- state()
1112
- ], SmartdbDebugUi.prototype, "documentsTotal", null);
1113
- __decorate([
1114
- state()
1115
- ], SmartdbDebugUi.prototype, "expandedOplogSeqs", null);
1116
- __decorate([
1117
- state()
1118
- ], SmartdbDebugUi.prototype, "revertTargetSeq", null);
1119
- __decorate([
1120
- state()
1121
- ], SmartdbDebugUi.prototype, "revertPreview", null);
1122
- __decorate([
1123
- state()
1124
- ], SmartdbDebugUi.prototype, "revertInProgress", null);
1125
- __decorate([
1126
- state()
1127
- ], SmartdbDebugUi.prototype, "oplogFilter", null);
1128
- SmartdbDebugUi = __decorate([
1129
- customElement('smartdb-debugui')
1130
- ], SmartdbDebugUi);
1131
- export { SmartdbDebugUi };
1132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRkYi1kZWJ1Z3VpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfZGVidWd1aS9zbWFydGRiLWRlYnVndWkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBdUMsTUFBTSxjQUFjLENBQUM7QUFtQmhJLElBQU0sY0FBYyxHQUFwQixNQUFNLGNBQWUsU0FBUSxXQUFXO0lBR3BDLDJCQUErQixJQUFJLENBQUM7SUFGN0MsaURBQWlEO0lBRXhDLElBQUEsTUFBTSw0Q0FBOEI7SUFBcEMsSUFBQSxNQUFNLGtEQUE4QjtJQUlwQywrQkFBNEIsSUFBSSxDQUFDO0lBRjFDLDJIQUEySDtJQUVsSCxJQUFBLFVBQVUsZ0RBQXVCO0lBQWpDLElBQUEsVUFBVSxzREFBdUI7SUFHakMsb0NBQTBCLElBQUksQ0FBQztJQUEvQixJQUFBLGVBQWUscURBQWdCO0lBQS9CLElBQUEsZUFBZSwyREFBZ0I7SUFHL0IsOEJBQWtCLFdBQVcsQ0FBQztJQUE5QixJQUFBLFNBQVMsK0NBQXFCO0lBQTlCLElBQUEsU0FBUyxxREFBcUI7SUFHOUIsNEJBQWtDLElBQUksQ0FBQztJQUF2QyxJQUFBLE9BQU8sNkNBQWdDO0lBQXZDLElBQUEsT0FBTyxtREFBZ0M7SUFHdkMsK0JBQWlDLElBQUksQ0FBQztJQUF0QyxJQUFBLFVBQVUsZ0RBQTRCO0lBQXRDLElBQUEsVUFBVSxzREFBNEI7SUFHdEMsaUNBQThCLEVBQUUsQ0FBQztJQUFqQyxJQUFBLFlBQVksa0RBQXFCO0lBQWpDLElBQUEsWUFBWSx3REFBcUI7SUFHakMsZ0NBQWlDLEVBQUUsQ0FBQztJQUFwQyxJQUFBLFdBQVcsaURBQXlCO0lBQXBDLElBQUEsV0FBVyx1REFBeUI7SUFHcEMsdUNBQTBELElBQUksQ0FBQztJQUEvRCxJQUFBLGtCQUFrQix3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