@rudderjs/telescope 0.0.1 → 1.0.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 (150) hide show
  1. package/README.md +101 -27
  2. package/dist/api/routes.d.ts +10 -6
  3. package/dist/api/routes.d.ts.map +1 -1
  4. package/dist/api/routes.js +42 -54
  5. package/dist/api/routes.js.map +1 -1
  6. package/dist/batch-context.d.ts +19 -0
  7. package/dist/batch-context.d.ts.map +1 -0
  8. package/dist/batch-context.js +24 -0
  9. package/dist/batch-context.js.map +1 -0
  10. package/dist/collectors/ai.d.ts +13 -0
  11. package/dist/collectors/ai.d.ts.map +1 -0
  12. package/dist/collectors/ai.js +61 -0
  13. package/dist/collectors/ai.js.map +1 -0
  14. package/dist/collectors/broadcast.d.ts +10 -0
  15. package/dist/collectors/broadcast.d.ts.map +1 -0
  16. package/dist/collectors/broadcast.js +46 -0
  17. package/dist/collectors/broadcast.js.map +1 -0
  18. package/dist/collectors/cache.d.ts.map +1 -1
  19. package/dist/collectors/cache.js +5 -4
  20. package/dist/collectors/cache.js.map +1 -1
  21. package/dist/collectors/command.d.ts +21 -0
  22. package/dist/collectors/command.d.ts.map +1 -0
  23. package/dist/collectors/command.js +55 -0
  24. package/dist/collectors/command.js.map +1 -0
  25. package/dist/collectors/dump.d.ts +17 -0
  26. package/dist/collectors/dump.d.ts.map +1 -0
  27. package/dist/collectors/dump.js +37 -0
  28. package/dist/collectors/dump.js.map +1 -0
  29. package/dist/collectors/event.d.ts.map +1 -1
  30. package/dist/collectors/event.js +2 -1
  31. package/dist/collectors/event.js.map +1 -1
  32. package/dist/collectors/exception.d.ts +1 -0
  33. package/dist/collectors/exception.d.ts.map +1 -1
  34. package/dist/collectors/exception.js +23 -4
  35. package/dist/collectors/exception.js.map +1 -1
  36. package/dist/collectors/gate.d.ts +18 -0
  37. package/dist/collectors/gate.d.ts.map +1 -0
  38. package/dist/collectors/gate.js +49 -0
  39. package/dist/collectors/gate.js.map +1 -0
  40. package/dist/collectors/http.d.ts +21 -0
  41. package/dist/collectors/http.d.ts.map +1 -0
  42. package/dist/collectors/http.js +64 -0
  43. package/dist/collectors/http.js.map +1 -0
  44. package/dist/collectors/job.d.ts.map +1 -1
  45. package/dist/collectors/job.js +3 -2
  46. package/dist/collectors/job.js.map +1 -1
  47. package/dist/collectors/live.d.ts +13 -0
  48. package/dist/collectors/live.d.ts.map +1 -0
  49. package/dist/collectors/live.js +60 -0
  50. package/dist/collectors/live.js.map +1 -0
  51. package/dist/collectors/log.d.ts.map +1 -1
  52. package/dist/collectors/log.js +2 -1
  53. package/dist/collectors/log.js.map +1 -1
  54. package/dist/collectors/mail.d.ts.map +1 -1
  55. package/dist/collectors/mail.js +2 -1
  56. package/dist/collectors/mail.js.map +1 -1
  57. package/dist/collectors/mcp.d.ts +14 -0
  58. package/dist/collectors/mcp.d.ts.map +1 -0
  59. package/dist/collectors/mcp.js +49 -0
  60. package/dist/collectors/mcp.js.map +1 -0
  61. package/dist/collectors/model.d.ts +6 -0
  62. package/dist/collectors/model.d.ts.map +1 -1
  63. package/dist/collectors/model.js +44 -1
  64. package/dist/collectors/model.js.map +1 -1
  65. package/dist/collectors/notification.d.ts.map +1 -1
  66. package/dist/collectors/notification.js +2 -1
  67. package/dist/collectors/notification.js.map +1 -1
  68. package/dist/collectors/query.d.ts.map +1 -1
  69. package/dist/collectors/query.js +5 -3
  70. package/dist/collectors/query.js.map +1 -1
  71. package/dist/collectors/request.d.ts +2 -1
  72. package/dist/collectors/request.d.ts.map +1 -1
  73. package/dist/collectors/request.js +78 -4
  74. package/dist/collectors/request.js.map +1 -1
  75. package/dist/index.d.ts +17 -2
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +152 -95
  78. package/dist/index.js.map +1 -1
  79. package/dist/redact.d.ts +25 -0
  80. package/dist/redact.d.ts.map +1 -0
  81. package/dist/redact.js +55 -0
  82. package/dist/redact.js.map +1 -0
  83. package/dist/routes.d.ts +22 -0
  84. package/dist/routes.d.ts.map +1 -0
  85. package/dist/routes.js +105 -0
  86. package/dist/routes.js.map +1 -0
  87. package/dist/storage.d.ts.map +1 -1
  88. package/dist/storage.js +13 -0
  89. package/dist/storage.js.map +1 -1
  90. package/dist/types.d.ts +32 -1
  91. package/dist/types.d.ts.map +1 -1
  92. package/dist/types.js +13 -0
  93. package/dist/types.js.map +1 -1
  94. package/dist/views/vanilla/Dashboard.d.ts +10 -0
  95. package/dist/views/vanilla/Dashboard.d.ts.map +1 -0
  96. package/dist/views/vanilla/Dashboard.js +48 -0
  97. package/dist/views/vanilla/Dashboard.js.map +1 -0
  98. package/dist/views/vanilla/EntryList.d.ts +29 -0
  99. package/dist/views/vanilla/EntryList.d.ts.map +1 -0
  100. package/dist/views/vanilla/EntryList.js +172 -0
  101. package/dist/views/vanilla/EntryList.js.map +1 -0
  102. package/dist/views/vanilla/Layout.d.ts +25 -0
  103. package/dist/views/vanilla/Layout.d.ts.map +1 -0
  104. package/dist/views/vanilla/Layout.js +225 -0
  105. package/dist/views/vanilla/Layout.js.map +1 -0
  106. package/dist/views/vanilla/_html.d.ts +27 -0
  107. package/dist/views/vanilla/_html.d.ts.map +1 -0
  108. package/dist/views/vanilla/_html.js +55 -0
  109. package/dist/views/vanilla/_html.js.map +1 -0
  110. package/dist/views/vanilla/columns.d.ts +20 -0
  111. package/dist/views/vanilla/columns.d.ts.map +1 -0
  112. package/dist/views/vanilla/columns.js +181 -0
  113. package/dist/views/vanilla/columns.js.map +1 -0
  114. package/dist/views/vanilla/details/Batch.d.ts +14 -0
  115. package/dist/views/vanilla/details/Batch.d.ts.map +1 -0
  116. package/dist/views/vanilla/details/Batch.js +120 -0
  117. package/dist/views/vanilla/details/Batch.js.map +1 -0
  118. package/dist/views/vanilla/details/Layout.d.ts +21 -0
  119. package/dist/views/vanilla/details/Layout.d.ts.map +1 -0
  120. package/dist/views/vanilla/details/Layout.js +163 -0
  121. package/dist/views/vanilla/details/Layout.js.map +1 -0
  122. package/dist/views/vanilla/details/NotFound.d.ts +8 -0
  123. package/dist/views/vanilla/details/NotFound.d.ts.map +1 -0
  124. package/dist/views/vanilla/details/NotFound.js +20 -0
  125. package/dist/views/vanilla/details/NotFound.js.map +1 -0
  126. package/dist/views/vanilla/details/index.d.ts +5 -0
  127. package/dist/views/vanilla/details/index.d.ts.map +1 -0
  128. package/dist/views/vanilla/details/index.js +5 -0
  129. package/dist/views/vanilla/details/index.js.map +1 -0
  130. package/dist/views/vanilla/details/sections.d.ts +46 -0
  131. package/dist/views/vanilla/details/sections.d.ts.map +1 -0
  132. package/dist/views/vanilla/details/sections.js +145 -0
  133. package/dist/views/vanilla/details/sections.js.map +1 -0
  134. package/dist/views/vanilla/details/views.d.ts +15 -0
  135. package/dist/views/vanilla/details/views.d.ts.map +1 -0
  136. package/dist/views/vanilla/details/views.js +534 -0
  137. package/dist/views/vanilla/details/views.js.map +1 -0
  138. package/dist/views/vanilla/index.d.ts +5 -0
  139. package/dist/views/vanilla/index.d.ts.map +1 -0
  140. package/dist/views/vanilla/index.js +5 -0
  141. package/dist/views/vanilla/index.js.map +1 -0
  142. package/package.json +53 -13
  143. package/dist/ui/layout.d.ts +0 -11
  144. package/dist/ui/layout.d.ts.map +0 -1
  145. package/dist/ui/layout.js +0 -69
  146. package/dist/ui/layout.js.map +0 -1
  147. package/dist/ui/pages.d.ts +0 -21
  148. package/dist/ui/pages.d.ts.map +0 -1
  149. package/dist/ui/pages.js +0 -225
  150. package/dist/ui/pages.js.map +0 -1
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Shared HTML chrome for Telescope dashboard pages.
3
+ *
4
+ * Vanilla mode (raw template literals + Alpine.js + Tailwind via CDN). No
5
+ * client framework dependency, no build step. The package's UI is fully
6
+ * self-contained so telescope can debug a host app of any framework.
7
+ *
8
+ * SPA navigation: the `telescopeSpa()` Alpine component intercepts internal
9
+ * link clicks, fetches the target page via `fetch()`, swaps the `<main>`
10
+ * content, and pushes to `history.pushState()`. The sidebar never reloads.
11
+ * Back/forward buttons work via `popstate`. External links fall through.
12
+ */
13
+ export function Layout(props) {
14
+ const { title, body, basePath, activePath } = props;
15
+ const nav = [
16
+ { label: 'Dashboard', path: '', icon: 'M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6' },
17
+ { label: 'Requests', path: '/requests', icon: 'M13 10V3L4 14h7v7l9-11h-7z' },
18
+ { label: 'Queries', path: '/queries', icon: 'M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4' },
19
+ { label: 'Jobs', path: '/jobs', icon: 'M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10' },
20
+ { label: 'Exceptions', path: '/exceptions', icon: 'M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z' },
21
+ { label: 'Logs', path: '/logs', icon: 'M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z' },
22
+ { label: 'Mail', path: '/mail', icon: 'M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z' },
23
+ { label: 'Notifications', path: '/notifications', icon: 'M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9' },
24
+ { label: 'Events', path: '/events', icon: 'M13 10V3L4 14h7v7l9-11h-7z' },
25
+ { label: 'Cache', path: '/cache', icon: 'M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4' },
26
+ { label: 'Schedule', path: '/schedule', icon: 'M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z' },
27
+ { label: 'Models', path: '/models', icon: 'M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10' },
28
+ { label: 'Commands', path: '/commands', icon: 'M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z' },
29
+ { label: 'HTTP Client', path: '/http', icon: 'M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9' },
30
+ { label: 'Gates', path: '/gates', icon: 'M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z' },
31
+ { label: 'Dumps', path: '/dumps', icon: 'M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4' },
32
+ { label: 'WebSockets', path: '/broadcasts', icon: 'M5.636 18.364a9 9 0 010-12.728m12.728 0a9 9 0 010 12.728m-9.9-2.829a5 5 0 010-7.07m7.072 0a5 5 0 010 7.07M13 12a1 1 0 11-2 0 1 1 0 012 0z' },
33
+ { label: 'AI', path: '/ai', icon: 'M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z' },
34
+ { label: 'MCP', path: '/mcp', icon: 'M13 10V3L4 14h7v7l9-11h-7z' },
35
+ { label: 'Live (Yjs)', path: '/live', icon: 'M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z' },
36
+ ];
37
+ // Build nav with Alpine-driven active state
38
+ const navHtml = nav.map(n => {
39
+ const href = `${basePath}${n.path}`;
40
+ const pathExpr = n.path === '' ? `'/'` : `'${n.path}'`;
41
+ return `<a href="${href}" @click.prevent="navigate('${href}')"
42
+ class="flex items-center gap-3 px-3 py-2 text-sm rounded-lg transition"
43
+ :class="currentPath === ${pathExpr} ? 'bg-indigo-50 text-indigo-700 font-medium dark:bg-indigo-950 dark:text-indigo-300' : 'text-gray-600 hover:bg-gray-50 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-gray-200'">
44
+ <svg class="w-4 h-4 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="${n.icon}"/></svg>
45
+ ${n.label}
46
+ </a>`;
47
+ }).join('\n ');
48
+ return `<!DOCTYPE html>
49
+ <html lang="en">
50
+ <head>
51
+ <meta charset="UTF-8">
52
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
53
+ <title>${title} — Telescope</title>
54
+ <script>tailwindcss = { config: { darkMode: 'class' } }</script>
55
+ <script src="https://cdn.tailwindcss.com"></script>
56
+ <script>
57
+ if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
58
+ document.documentElement.classList.add('dark')
59
+ }
60
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', e => {
61
+ document.documentElement.classList.toggle('dark', e.matches)
62
+ })
63
+ </script>
64
+ <script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
65
+ <style>
66
+ [x-cloak] { display: none !important; }
67
+ .badge { @apply inline-flex items-center px-2 py-0.5 rounded text-xs font-medium; }
68
+ </style>
69
+ </head>
70
+ <body class="bg-gray-50 dark:bg-gray-950 text-gray-900 dark:text-gray-100 font-sans antialiased">
71
+ <div x-data="telescopeSpa()" @popstate.window="onPopState()" class="flex min-h-screen">
72
+ <!-- Sidebar -->
73
+ <aside class="w-56 bg-white dark:bg-gray-900 border-r border-gray-200 dark:border-gray-800 flex flex-col">
74
+ <div class="px-4 py-5 flex items-center gap-2 border-b border-gray-100 dark:border-gray-800">
75
+ <a href="${basePath}" @click.prevent="navigate('${basePath}')" class="flex items-center gap-2">
76
+ <div class="w-7 h-7 bg-violet-600 rounded-lg flex items-center justify-center">
77
+ <svg class="w-4 h-4 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
78
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"/>
79
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"/>
80
+ </svg>
81
+ </div>
82
+ <span class="font-semibold text-sm">Telescope</span>
83
+ </a>
84
+ </div>
85
+ <nav class="flex-1 px-3 py-4 space-y-0.5 overflow-y-auto">
86
+ ${navHtml}
87
+ </nav>
88
+ </aside>
89
+
90
+ <!-- Main content -->
91
+ <main id="telescope-main" class="flex-1 overflow-auto" @telescope:navigate.window="navigate($event.detail)">
92
+ <!-- Toolbar -->
93
+ <div class="border-b border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900 px-6 py-2 flex items-center justify-end gap-2"
94
+ x-data="telescopeToolbar('${basePath}/api')">
95
+ <button @click="toggleRecording()" class="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-lg transition"
96
+ :class="recording ? 'bg-green-50 text-green-700 hover:bg-green-100' : 'bg-red-50 text-red-700 hover:bg-red-100'">
97
+ <span class="w-2 h-2 rounded-full" :class="recording ? 'bg-green-500' : 'bg-red-500'"></span>
98
+ <span x-text="recording ? 'Recording' : 'Paused'"></span>
99
+ </button>
100
+ <button @click="clearAll()" class="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-lg bg-gray-50 dark:bg-gray-800 text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 transition">
101
+ <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"/></svg>
102
+ Clear
103
+ </button>
104
+ <button @click="refresh()" class="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-lg bg-gray-50 dark:bg-gray-800 text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 transition">
105
+ <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"/></svg>
106
+ Refresh
107
+ </button>
108
+ </div>
109
+ <div class="max-w-6xl mx-auto px-6 py-8">
110
+ ${body}
111
+ </div>
112
+ </main>
113
+ </div>
114
+
115
+ <script>
116
+ function telescopeToolbar(apiPrefix) {
117
+ return {
118
+ recording: true,
119
+ async init() {
120
+ const data = await fetch(apiPrefix + '/recording').then(r => r.json())
121
+ this.recording = data.recording
122
+ },
123
+ async toggleRecording() {
124
+ const data = await fetch(apiPrefix + '/recording', { method: 'PATCH' }).then(r => r.json())
125
+ this.recording = data.recording
126
+ },
127
+ async clearAll() {
128
+ if (!confirm('Clear all telescope entries?')) return
129
+ await fetch(apiPrefix + '/entries', { method: 'DELETE' })
130
+ this.$dispatch('telescope:navigate', location.href)
131
+ },
132
+ refresh() {
133
+ this.$dispatch('telescope:navigate', location.href)
134
+ }
135
+ }
136
+ }
137
+
138
+ function telescopeSpa() {
139
+ const basePath = '${basePath}'
140
+ return {
141
+ currentPath: '${activePath}',
142
+
143
+ async navigate(href) {
144
+ // Stop any running auto-refresh timers from the previous page
145
+ this.stopPageTimers()
146
+
147
+ try {
148
+ const res = await fetch(href)
149
+ if (!res.ok) { window.location.href = href; return }
150
+ const text = await res.text()
151
+ const doc = new DOMParser().parseFromString(text, 'text/html')
152
+ const newMain = doc.getElementById('telescope-main')
153
+ if (!newMain) { window.location.href = href; return }
154
+
155
+ const mainEl = document.getElementById('telescope-main')
156
+
157
+ // Tear down old Alpine trees before replacing content
158
+ Alpine.mutateDom(() => {
159
+ mainEl.innerHTML = newMain.innerHTML
160
+ })
161
+
162
+ // Execute <script> tags from the swapped content — innerHTML
163
+ // doesn't execute scripts, so we need to manually create and
164
+ // append new <script> elements.
165
+ mainEl.querySelectorAll('script').forEach(oldScript => {
166
+ const newScript = document.createElement('script')
167
+ newScript.textContent = oldScript.textContent
168
+ oldScript.replaceWith(newScript)
169
+ })
170
+
171
+ // Now initialize Alpine on the new DOM
172
+ Alpine.initTree(mainEl)
173
+
174
+ // Update active path (strip basePath prefix for sidebar matching)
175
+ const url = new URL(href, location.origin)
176
+ const relative = url.pathname.replace(basePath, '') || '/'
177
+ this.currentPath = relative
178
+
179
+ // Update browser URL and title
180
+ const newTitle = doc.querySelector('title')
181
+ if (newTitle) document.title = newTitle.textContent
182
+ // Don't push if this was triggered by back/forward
183
+ if (this._isPopState) {
184
+ this._isPopState = false
185
+ } else {
186
+ history.pushState(null, '', href)
187
+ }
188
+ } catch (e) {
189
+ console.error('[Telescope SPA]', e)
190
+ window.location.href = href
191
+ }
192
+ },
193
+
194
+ onPopState() {
195
+ this.stopPageTimers()
196
+ // Fetch the page the browser navigated to
197
+ this._isPopState = true
198
+ this.navigate(location.href)
199
+ },
200
+
201
+ _isPopState: false,
202
+
203
+ stopPageTimers() {
204
+ // Clear any auto-refresh intervals from EntryList pages
205
+ const mainEl = document.getElementById('telescope-main')
206
+ if (mainEl) {
207
+ mainEl.querySelectorAll('[x-data]').forEach(el => {
208
+ if (el._x_dataStack) {
209
+ for (const data of el._x_dataStack) {
210
+ if (data._refreshTimer) {
211
+ clearInterval(data._refreshTimer)
212
+ data._refreshTimer = null
213
+ }
214
+ }
215
+ }
216
+ })
217
+ }
218
+ }
219
+ }
220
+ }
221
+ </script>
222
+ </body>
223
+ </html>`;
224
+ }
225
+ //# sourceMappingURL=Layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../../src/views/vanilla/Layout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAeH,MAAM,UAAU,MAAM,CAAC,KAAkB;IACvC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,KAAK,CAAA;IAEnD,MAAM,GAAG,GAAc;QACrB,EAAE,KAAK,EAAE,WAAW,EAAM,IAAI,EAAE,EAAE,EAAe,IAAI,EAAE,kJAAkJ,EAAE;QAC3M,EAAE,KAAK,EAAE,UAAU,EAAO,IAAI,EAAE,WAAW,EAAM,IAAI,EAAE,4BAA4B,EAAE;QACrF,EAAE,KAAK,EAAE,SAAS,EAAQ,IAAI,EAAE,UAAU,EAAO,IAAI,EAAE,6GAA6G,EAAE;QACtK,EAAE,KAAK,EAAE,MAAM,EAAW,IAAI,EAAE,OAAO,EAAU,IAAI,EAAE,wJAAwJ,EAAE;QACjN,EAAE,KAAK,EAAE,YAAY,EAAK,IAAI,EAAE,aAAa,EAAI,IAAI,EAAE,sIAAsI,EAAE;QAC/L,EAAE,KAAK,EAAE,MAAM,EAAW,IAAI,EAAE,OAAO,EAAU,IAAI,EAAE,sHAAsH,EAAE;QAC/K,EAAE,KAAK,EAAE,MAAM,EAAW,IAAI,EAAE,OAAO,EAAU,IAAI,EAAE,sGAAsG,EAAE;QAC/J,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,+LAA+L,EAAE;QACzP,EAAE,KAAK,EAAE,QAAQ,EAAS,IAAI,EAAE,SAAS,EAAQ,IAAI,EAAE,4BAA4B,EAAE;QACrF,EAAE,KAAK,EAAE,OAAO,EAAU,IAAI,EAAE,QAAQ,EAAS,IAAI,EAAE,mFAAmF,EAAE;QAC5I,EAAE,KAAK,EAAE,UAAU,EAAO,IAAI,EAAE,WAAW,EAAM,IAAI,EAAE,6CAA6C,EAAE;QACtG,EAAE,KAAK,EAAE,QAAQ,EAAS,IAAI,EAAE,SAAS,EAAQ,IAAI,EAAE,wJAAwJ,EAAE;QACjN,EAAE,KAAK,EAAE,UAAU,EAAO,IAAI,EAAE,WAAW,EAAM,IAAI,EAAE,sFAAsF,EAAE;QAC/I,EAAE,KAAK,EAAE,aAAa,EAAI,IAAI,EAAE,OAAO,EAAU,IAAI,EAAE,sIAAsI,EAAE;QAC/L,EAAE,KAAK,EAAE,OAAO,EAAU,IAAI,EAAE,QAAQ,EAAS,IAAI,EAAE,sGAAsG,EAAE;QAC/J,EAAE,KAAK,EAAE,OAAO,EAAU,IAAI,EAAE,QAAQ,EAAS,IAAI,EAAE,uCAAuC,EAAE;QAChG,EAAE,KAAK,EAAE,YAAY,EAAK,IAAI,EAAE,aAAa,EAAI,IAAI,EAAE,2IAA2I,EAAE;QACpM,EAAE,KAAK,EAAE,IAAI,EAAY,IAAI,EAAE,KAAK,EAAY,IAAI,EAAE,kNAAkN,EAAE;QAC1Q,EAAE,KAAK,EAAE,KAAK,EAAW,IAAI,EAAE,MAAM,EAAW,IAAI,EAAE,4BAA4B,EAAE;QACpF,EAAE,KAAK,EAAE,YAAY,EAAK,IAAI,EAAE,OAAO,EAAU,IAAI,EAAE,sMAAsM,EAAE;KAChQ,CAAA;IAED,4CAA4C;IAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAC1B,MAAM,IAAI,GAAG,GAAG,QAAQ,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;QACnC,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAA;QACtD,OAAO,YAAY,IAAI,+BAA+B,IAAI;;oCAE1B,QAAQ;0KAC8H,CAAC,CAAC,IAAI;QACxK,CAAC,CAAC,KAAK;SACN,CAAA;IACP,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAErB,OAAO;;;;;WAKE,KAAK;;;;;;;;;;;;;;;;;;;;;;mBAsBG,QAAQ,+BAA+B,QAAQ;;;;;;;;;;;UAWxD,OAAO;;;;;;;;uCAQsB,QAAQ;;;;;;;;;;;;;;;;UAgBrC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BA6BY,QAAQ;;wBAEV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAkF1B,CAAA;AACR,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Tiny HTML templating helper — inlined from `@rudderjs/view`'s `html\`\``,
3
+ * `escapeHtml`, and `SafeString` so telescope doesn't need to pull
4
+ * `@rudderjs/view` (which has a `vike` peer dep that's unwanted baggage
5
+ * for a self-contained debug tool).
6
+ *
7
+ * If `@rudderjs/view` ever drops the Vike peer or splits the HTML helpers
8
+ * into a separate package, this file can be replaced with a one-line
9
+ * `export ... from '@rudderjs/view'`.
10
+ *
11
+ * The semantics match `@rudderjs/view` exactly:
12
+ * - Primitives are escaped via `escapeHtml`
13
+ * - `null`/`undefined`/`false` render as empty string
14
+ * - Arrays recursively render and join (no separator)
15
+ * - `SafeString` instances pass through unchanged (the escape hatch for
16
+ * composing nested templates or injecting trusted markup)
17
+ */
18
+ export declare class SafeString {
19
+ readonly value: string;
20
+ constructor(value: string);
21
+ toString(): string;
22
+ }
23
+ export declare function escapeHtml(value: unknown): string;
24
+ export declare function html(strings: TemplateStringsArray, ...values: unknown[]): SafeString;
25
+ /** Wrap pre-rendered, trusted HTML so it passes through `html\`\`` interpolation unchanged. */
26
+ export declare function raw(value: string): SafeString;
27
+ //# sourceMappingURL=_html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_html.d.ts","sourceRoot":"","sources":["../../../src/views/vanilla/_html.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,qBAAa,UAAU;aACO,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM;IACzC,QAAQ,IAAI,MAAM;CACnB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQjD;AASD,wBAAgB,IAAI,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAMpF;AAED,+FAA+F;AAC/F,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAE7C"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Tiny HTML templating helper — inlined from `@rudderjs/view`'s `html\`\``,
3
+ * `escapeHtml`, and `SafeString` so telescope doesn't need to pull
4
+ * `@rudderjs/view` (which has a `vike` peer dep that's unwanted baggage
5
+ * for a self-contained debug tool).
6
+ *
7
+ * If `@rudderjs/view` ever drops the Vike peer or splits the HTML helpers
8
+ * into a separate package, this file can be replaced with a one-line
9
+ * `export ... from '@rudderjs/view'`.
10
+ *
11
+ * The semantics match `@rudderjs/view` exactly:
12
+ * - Primitives are escaped via `escapeHtml`
13
+ * - `null`/`undefined`/`false` render as empty string
14
+ * - Arrays recursively render and join (no separator)
15
+ * - `SafeString` instances pass through unchanged (the escape hatch for
16
+ * composing nested templates or injecting trusted markup)
17
+ */
18
+ export class SafeString {
19
+ value;
20
+ constructor(value) {
21
+ this.value = value;
22
+ }
23
+ toString() { return this.value; }
24
+ }
25
+ export function escapeHtml(value) {
26
+ if (value === null || value === undefined)
27
+ return '';
28
+ return String(value)
29
+ .replace(/&/g, '&amp;')
30
+ .replace(/</g, '&lt;')
31
+ .replace(/>/g, '&gt;')
32
+ .replace(/"/g, '&quot;')
33
+ .replace(/'/g, '&#39;');
34
+ }
35
+ function renderHtmlValue(value) {
36
+ if (value === null || value === undefined || value === false)
37
+ return '';
38
+ if (value instanceof SafeString)
39
+ return value.value;
40
+ if (Array.isArray(value))
41
+ return value.map(renderHtmlValue).join('');
42
+ return escapeHtml(value);
43
+ }
44
+ export function html(strings, ...values) {
45
+ let out = strings[0] ?? '';
46
+ for (let i = 0; i < values.length; i++) {
47
+ out += renderHtmlValue(values[i]) + (strings[i + 1] ?? '');
48
+ }
49
+ return new SafeString(out);
50
+ }
51
+ /** Wrap pre-rendered, trusted HTML so it passes through `html\`\`` interpolation unchanged. */
52
+ export function raw(value) {
53
+ return new SafeString(value);
54
+ }
55
+ //# sourceMappingURL=_html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_html.js","sourceRoot":"","sources":["../../../src/views/vanilla/_html.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,OAAO,UAAU;IACO;IAA5B,YAA4B,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;IAAG,CAAC;IAC7C,QAAQ,KAAa,OAAO,IAAI,CAAC,KAAK,CAAA,CAAC,CAAC;CACzC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAA;IACpD,OAAO,MAAM,CAAC,KAAK,CAAC;SACjB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;AAC3B,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,EAAE,CAAA;IACvE,IAAI,KAAK,YAAY,UAAU;QAAE,OAAO,KAAK,CAAC,KAAK,CAAA;IACnD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACpE,OAAO,UAAU,CAAC,KAAK,CAAC,CAAA;AAC1B,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAA6B,EAAE,GAAG,MAAiB;IACtE,IAAI,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IAC5D,CAAC;IACD,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;AAC5B,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,GAAG,CAAC,KAAa;IAC/B,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAAA;AAC9B,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { Column } from './EntryList.js';
2
+ /**
3
+ * Per-watcher column configurations for the generic `EntryList` template.
4
+ *
5
+ * Each entry maps a watcher type to its display config. The map key is
6
+ * the entry type as it appears in the URL (e.g. `requests`, `queries`),
7
+ * NOT the singular `EntryType` from `../../src/types.ts`.
8
+ *
9
+ * IMPORTANT: Column `key` expressions are placed inside HTML `x-text="..."`
10
+ * attributes (double-quoted). Use single quotes for string literals inside
11
+ * expressions — e.g. `"entry.content.status || '—'"` not `'...'`.
12
+ */
13
+ export interface PageConfig {
14
+ /** Singular type name passed to EntryList — backend uses pluralisation rules */
15
+ type: string;
16
+ title: string;
17
+ columns: Column[];
18
+ }
19
+ export declare const pages: Record<string, PageConfig>;
20
+ //# sourceMappingURL=columns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columns.d.ts","sourceRoot":"","sources":["../../../src/views/vanilla/columns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAE5C;;;;;;;;;;GAUG;AACH,MAAM,WAAW,UAAU;IACzB,gFAAgF;IAChF,IAAI,EAAK,MAAM,CAAA;IACf,KAAK,EAAI,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAqM5C,CAAA"}
@@ -0,0 +1,181 @@
1
+ export const pages = {
2
+ requests: {
3
+ type: 'request',
4
+ title: 'Requests',
5
+ columns: [
6
+ { label: 'Method', key: 'entry.content.method', badge: true },
7
+ { label: 'Path', key: 'entry.content.path', mono: true },
8
+ { label: 'Status', key: "entry.content.status || '—'", badge: true },
9
+ { label: 'Duration', key: "entry.content.duration + 'ms'", className: 'text-right' },
10
+ ],
11
+ },
12
+ queries: {
13
+ type: 'query',
14
+ title: 'Queries',
15
+ columns: [
16
+ { label: 'SQL', key: 'entry.content.sql', mono: true, className: 'truncate max-w-md' },
17
+ { label: 'Duration', key: "entry.content.duration + 'ms'", className: 'text-right' },
18
+ { label: 'Model', key: "entry.content.model || '—'" },
19
+ ],
20
+ },
21
+ jobs: {
22
+ type: 'job',
23
+ title: 'Jobs',
24
+ columns: [
25
+ { label: 'Class', key: 'entry.content.class', mono: true },
26
+ { label: 'Queue', key: 'entry.content.queue' },
27
+ { label: 'Status', key: 'entry.content.status', badge: true },
28
+ { label: 'Duration', key: "(entry.content.duration || 0) + 'ms'", className: 'text-right' },
29
+ ],
30
+ },
31
+ exceptions: {
32
+ type: 'exception',
33
+ title: 'Exceptions',
34
+ columns: [
35
+ { label: 'Class', key: 'entry.content.class', mono: true, className: 'text-red-600' },
36
+ { label: 'Message', key: 'entry.content.message', className: 'truncate max-w-md' },
37
+ ],
38
+ },
39
+ logs: {
40
+ type: 'log',
41
+ title: 'Logs',
42
+ columns: [
43
+ { label: 'Level', key: 'entry.content.level', badge: true },
44
+ { label: 'Channel', key: 'entry.content.channel' },
45
+ { label: 'Message', key: 'entry.content.message', className: 'truncate max-w-lg' },
46
+ ],
47
+ },
48
+ mail: {
49
+ type: 'mail',
50
+ title: 'Mail',
51
+ columns: [
52
+ { label: 'Class', key: 'entry.content.class', mono: true },
53
+ { label: 'Subject', key: 'entry.content.subject', className: 'truncate max-w-md' },
54
+ { label: 'To', key: "Array.isArray(entry.content.to) ? entry.content.to.join(', ') : entry.content.to" },
55
+ ],
56
+ },
57
+ notifications: {
58
+ type: 'notification',
59
+ title: 'Notifications',
60
+ columns: [
61
+ { label: 'Class', key: 'entry.content.class', mono: true },
62
+ { label: 'Channel', key: 'entry.content.channel' },
63
+ { label: 'Notifiable', key: 'entry.content.notifiable' },
64
+ ],
65
+ },
66
+ events: {
67
+ type: 'event',
68
+ title: 'Events',
69
+ columns: [
70
+ { label: 'Name', key: 'entry.content.name', mono: true },
71
+ ],
72
+ },
73
+ cache: {
74
+ type: 'cache',
75
+ title: 'Cache',
76
+ columns: [
77
+ { label: 'Key', key: "entry.content.key || '—'", mono: true, className: 'truncate max-w-md' },
78
+ { label: 'Operation', key: 'entry.content.operation', badge: true },
79
+ ],
80
+ },
81
+ schedule: {
82
+ type: 'schedule',
83
+ title: 'Scheduled Tasks',
84
+ columns: [
85
+ { label: 'Description', key: 'entry.content.description' },
86
+ { label: 'Expression', key: 'entry.content.expression', mono: true },
87
+ { label: 'Status', key: 'entry.content.status', badge: true },
88
+ { label: 'Duration', key: "(entry.content.duration || 0) + 'ms'", className: 'text-right' },
89
+ ],
90
+ },
91
+ models: {
92
+ type: 'model',
93
+ title: 'Model Changes',
94
+ columns: [
95
+ { label: 'Model', key: 'entry.content.model', mono: true },
96
+ { label: 'Action', key: 'entry.content.action', badge: true },
97
+ ],
98
+ },
99
+ commands: {
100
+ type: 'command',
101
+ title: 'Commands',
102
+ columns: [
103
+ { label: 'Name', key: 'entry.content.name', mono: true },
104
+ { label: 'Source', key: 'entry.content.source', badge: true },
105
+ { label: 'Exit', key: 'entry.content.exitCode', className: 'text-right font-mono text-xs' },
106
+ { label: 'Duration', key: "(entry.content.duration || 0) + 'ms'", className: 'text-right' },
107
+ ],
108
+ },
109
+ http: {
110
+ type: 'http',
111
+ title: 'HTTP Client',
112
+ columns: [
113
+ { label: 'Method', key: 'entry.content.method', badge: true },
114
+ { label: 'URL', key: 'entry.content.url', mono: true, className: 'truncate max-w-md' },
115
+ { label: 'Status', key: "entry.content.status || 'ERR'", badge: true },
116
+ { label: 'Duration', key: "(entry.content.duration || 0) + 'ms'", className: 'text-right' },
117
+ ],
118
+ },
119
+ gates: {
120
+ type: 'gate',
121
+ title: 'Gates',
122
+ columns: [
123
+ { label: 'Ability', key: 'entry.content.ability', mono: true },
124
+ { label: 'Result', key: "entry.content.allowed ? 'Allowed' : 'Denied'", badge: true },
125
+ { label: 'Via', key: 'entry.content.resolvedVia', badge: true },
126
+ { label: 'Duration', key: "(entry.content.duration || 0) + 'ms'", className: 'text-right' },
127
+ ],
128
+ },
129
+ dumps: {
130
+ type: 'dump',
131
+ title: 'Dumps',
132
+ columns: [
133
+ { label: 'Method', key: 'entry.content.method', badge: true },
134
+ { label: 'Args', key: "entry.content.count + ' value(s)'" },
135
+ { label: 'Caller', key: "entry.content.caller || '—'", mono: true, className: 'truncate max-w-md text-xs' },
136
+ ],
137
+ },
138
+ broadcasts: {
139
+ type: 'broadcast',
140
+ title: 'WebSockets',
141
+ columns: [
142
+ { label: 'Kind', key: 'entry.content.kind', badge: true },
143
+ { label: 'Channel', key: "entry.content.channel || '—'", mono: true, className: 'truncate max-w-md' },
144
+ { label: 'Event', key: "entry.content.event || '—'" },
145
+ { label: 'Conn', key: "(entry.content.connectionId || '').slice(0, 8) || '—'", mono: true, className: 'text-xs' },
146
+ ],
147
+ },
148
+ live: {
149
+ type: 'live',
150
+ title: 'Live (Yjs)',
151
+ columns: [
152
+ { label: 'Kind', key: 'entry.content.kind', badge: true },
153
+ { label: 'Doc', key: "entry.content.docName || '—'", mono: true, className: 'truncate max-w-xs' },
154
+ { label: 'Client', key: "(entry.content.clientId || '').slice(0, 8) || '—'", mono: true, className: 'text-xs' },
155
+ { label: 'Bytes', key: "entry.content.byteSize != null ? entry.content.byteSize : '—'", className: 'text-right font-mono text-xs' },
156
+ ],
157
+ },
158
+ ai: {
159
+ type: 'ai',
160
+ title: 'AI',
161
+ columns: [
162
+ { label: 'Agent', key: 'entry.content.agentName' },
163
+ { label: 'Model', key: 'entry.content.model', badge: true },
164
+ { label: 'Tokens', key: "entry.content.tokens?.total ?? '—'" },
165
+ { label: 'Tools', key: "entry.content.toolCallCount || '—'" },
166
+ { label: 'Duration', key: "entry.content.duration + 'ms'" },
167
+ ],
168
+ },
169
+ mcp: {
170
+ type: 'mcp',
171
+ title: 'MCP',
172
+ columns: [
173
+ { label: 'Server', key: 'entry.content.serverName', badge: true },
174
+ { label: 'Type', key: "entry.content.kind ? entry.content.kind.split('.')[0] : '—'", badge: true },
175
+ { label: 'Name', key: 'entry.content.name', mono: true, className: 'truncate max-w-xs' },
176
+ { label: 'Duration', key: "entry.content.duration != null ? Math.round(entry.content.duration) + 'ms' : '—'", className: 'text-right font-mono text-xs' },
177
+ { label: 'Status', key: "entry.content.error ? 'Failed' : 'OK'", badge: true },
178
+ ],
179
+ },
180
+ };
181
+ //# sourceMappingURL=columns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columns.js","sourceRoot":"","sources":["../../../src/views/vanilla/columns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { TelescopeEntry } from '../../../types.js';
2
+ export interface BatchPageProps {
3
+ basePath: string;
4
+ batchId: string;
5
+ entries: TelescopeEntry[];
6
+ }
7
+ /**
8
+ * Batch view — lists every entry sharing one `batchId`. Typically a single
9
+ * HTTP request and all the queries / cache lookups / events / model writes
10
+ * it triggered. The framework's batch propagation through the request
11
+ * lifecycle is what makes this useful.
12
+ */
13
+ export declare function BatchPage(props: BatchPageProps): string;
14
+ //# sourceMappingURL=Batch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Batch.d.ts","sourceRoot":"","sources":["../../../../src/views/vanilla/details/Batch.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAEvD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAG,MAAM,CAAA;IAChB,OAAO,EAAG,cAAc,EAAE,CAAA;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CA2FvD"}