proofscan 0.10.26 → 0.10.28

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 (96) hide show
  1. package/dist/cli.js +4 -2
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/catalog.d.ts.map +1 -1
  4. package/dist/commands/catalog.js +22 -0
  5. package/dist/commands/catalog.js.map +1 -1
  6. package/dist/commands/connectors.d.ts.map +1 -1
  7. package/dist/commands/connectors.js +10 -3
  8. package/dist/commands/connectors.js.map +1 -1
  9. package/dist/commands/index.d.ts +1 -0
  10. package/dist/commands/index.d.ts.map +1 -1
  11. package/dist/commands/index.js +2 -0
  12. package/dist/commands/index.js.map +1 -1
  13. package/dist/commands/monitor.d.ts +6 -0
  14. package/dist/commands/monitor.d.ts.map +1 -0
  15. package/dist/commands/monitor.js +59 -0
  16. package/dist/commands/monitor.js.map +1 -0
  17. package/dist/html/analytics.d.ts +58 -0
  18. package/dist/html/analytics.d.ts.map +1 -0
  19. package/dist/html/analytics.js +337 -0
  20. package/dist/html/analytics.js.map +1 -0
  21. package/dist/html/index.d.ts +5 -2
  22. package/dist/html/index.d.ts.map +1 -1
  23. package/dist/html/index.js +5 -1
  24. package/dist/html/index.js.map +1 -1
  25. package/dist/html/rpc-inspector.d.ts +43 -0
  26. package/dist/html/rpc-inspector.d.ts.map +1 -0
  27. package/dist/html/rpc-inspector.js +922 -0
  28. package/dist/html/rpc-inspector.js.map +1 -0
  29. package/dist/html/templates.d.ts +9 -1
  30. package/dist/html/templates.d.ts.map +1 -1
  31. package/dist/html/templates.js +701 -78
  32. package/dist/html/templates.js.map +1 -1
  33. package/dist/html/types.d.ts +129 -0
  34. package/dist/html/types.d.ts.map +1 -1
  35. package/dist/html/types.js.map +1 -1
  36. package/dist/monitor/data/aggregator.d.ts +13 -0
  37. package/dist/monitor/data/aggregator.d.ts.map +1 -0
  38. package/dist/monitor/data/aggregator.js +101 -0
  39. package/dist/monitor/data/aggregator.js.map +1 -0
  40. package/dist/monitor/data/connectors.d.ts +13 -0
  41. package/dist/monitor/data/connectors.d.ts.map +1 -0
  42. package/dist/monitor/data/connectors.js +326 -0
  43. package/dist/monitor/data/connectors.js.map +1 -0
  44. package/dist/monitor/data/popl.d.ts +30 -0
  45. package/dist/monitor/data/popl.d.ts.map +1 -0
  46. package/dist/monitor/data/popl.js +310 -0
  47. package/dist/monitor/data/popl.js.map +1 -0
  48. package/dist/monitor/index.d.ts +6 -0
  49. package/dist/monitor/index.d.ts.map +1 -0
  50. package/dist/monitor/index.js +6 -0
  51. package/dist/monitor/index.js.map +1 -0
  52. package/dist/monitor/routes/api.d.ts +7 -0
  53. package/dist/monitor/routes/api.d.ts.map +1 -0
  54. package/dist/monitor/routes/api.js +63 -0
  55. package/dist/monitor/routes/api.js.map +1 -0
  56. package/dist/monitor/routes/connectors.d.ts +7 -0
  57. package/dist/monitor/routes/connectors.d.ts.map +1 -0
  58. package/dist/monitor/routes/connectors.js +417 -0
  59. package/dist/monitor/routes/connectors.js.map +1 -0
  60. package/dist/monitor/routes/home.d.ts +7 -0
  61. package/dist/monitor/routes/home.d.ts.map +1 -0
  62. package/dist/monitor/routes/home.js +15 -0
  63. package/dist/monitor/routes/home.js.map +1 -0
  64. package/dist/monitor/routes/index.d.ts +10 -0
  65. package/dist/monitor/routes/index.d.ts.map +1 -0
  66. package/dist/monitor/routes/index.js +19 -0
  67. package/dist/monitor/routes/index.js.map +1 -0
  68. package/dist/monitor/routes/popl.d.ts +7 -0
  69. package/dist/monitor/routes/popl.d.ts.map +1 -0
  70. package/dist/monitor/routes/popl.js +84 -0
  71. package/dist/monitor/routes/popl.js.map +1 -0
  72. package/dist/monitor/server.d.ts +24 -0
  73. package/dist/monitor/server.d.ts.map +1 -0
  74. package/dist/monitor/server.js +52 -0
  75. package/dist/monitor/server.js.map +1 -0
  76. package/dist/monitor/templates/components.d.ts +21 -0
  77. package/dist/monitor/templates/components.d.ts.map +1 -0
  78. package/dist/monitor/templates/components.js +405 -0
  79. package/dist/monitor/templates/components.js.map +1 -0
  80. package/dist/monitor/templates/home.d.ts +9 -0
  81. package/dist/monitor/templates/home.d.ts.map +1 -0
  82. package/dist/monitor/templates/home.js +322 -0
  83. package/dist/monitor/templates/home.js.map +1 -0
  84. package/dist/monitor/templates/layout.d.ts +26 -0
  85. package/dist/monitor/templates/layout.d.ts.map +1 -0
  86. package/dist/monitor/templates/layout.js +186 -0
  87. package/dist/monitor/templates/layout.js.map +1 -0
  88. package/dist/monitor/templates/popl.d.ts +33 -0
  89. package/dist/monitor/templates/popl.d.ts.map +1 -0
  90. package/dist/monitor/templates/popl.js +654 -0
  91. package/dist/monitor/templates/popl.js.map +1 -0
  92. package/dist/monitor/types.d.ts +121 -0
  93. package/dist/monitor/types.d.ts.map +1 -0
  94. package/dist/monitor/types.js +5 -0
  95. package/dist/monitor/types.js.map +1 -0
  96. package/package.json +3 -1
@@ -0,0 +1,654 @@
1
+ /**
2
+ * ProofScan Web Monitor - POPL detail page template
3
+ */
4
+ import { renderLayout, escapeHtml, formatTimestamp } from './layout.js';
5
+ /**
6
+ * Render POPL entry detail page
7
+ */
8
+ export function renderPoplDetailPage(entry) {
9
+ const content = `
10
+ <section class="section">
11
+ ${renderBackNavigation()}
12
+ ${renderEntryHeader(entry)}
13
+ </section>
14
+
15
+ <section class="section">
16
+ <div class="section-title">Source</div>
17
+ ${renderSourceLinks(entry)}
18
+ </section>
19
+
20
+ <section class="section">
21
+ <div class="section-title">Capture Summary</div>
22
+ ${renderCaptureSummary(entry)}
23
+ </section>
24
+
25
+ <section class="section">
26
+ <div class="section-title">Artifacts</div>
27
+ ${renderArtifacts(entry)}
28
+ </section>
29
+ `;
30
+ return renderLayout({
31
+ title: `POPL: ${entry.id} - ProofScan Monitor`,
32
+ generatedAt: new Date().toISOString(),
33
+ content,
34
+ extraStyles: getPoplDetailStyles(),
35
+ });
36
+ }
37
+ /**
38
+ * Render 404 page for POPL entry not found
39
+ */
40
+ export function renderPopl404Page(proofId) {
41
+ const content = `
42
+ <section class="section">
43
+ ${renderBackNavigation()}
44
+ <div class="error-container">
45
+ <h1 class="error-title">POPL Entry Not Found</h1>
46
+ <p class="error-message">
47
+ No POPL entry found with ID: <code>${escapeHtml(proofId)}</code>
48
+ </p>
49
+ <p class="error-hint">
50
+ The entry may have been removed or the ID is incorrect.
51
+ </p>
52
+ </div>
53
+ </section>
54
+ `;
55
+ return renderLayout({
56
+ title: 'POPL Entry Not Found - ProofScan Monitor',
57
+ generatedAt: new Date().toISOString(),
58
+ content,
59
+ extraStyles: getPoplDetailStyles(),
60
+ });
61
+ }
62
+ /**
63
+ * Render back navigation link
64
+ */
65
+ function renderBackNavigation() {
66
+ return `
67
+ <a href="/" class="back-link">← Back to Monitor</a>
68
+ `;
69
+ }
70
+ /**
71
+ * Render entry header with ID and trust badge
72
+ */
73
+ function renderEntryHeader(entry) {
74
+ const trustClass = `trust-level-${entry.trust_level}`;
75
+ const createdFormatted = formatTimestamp(entry.created_at);
76
+ return `
77
+ <div class="popl-header">
78
+ <div class="popl-header-left">
79
+ <h1 class="popl-title">
80
+ POPL Entry: <span class="popl-id">${escapeHtml(entry.id)}</span>
81
+ </h1>
82
+ <p class="popl-subtitle">${escapeHtml(entry.title)}</p>
83
+ <p class="popl-meta">
84
+ Created: ${createdFormatted} by ${escapeHtml(entry.author_name)}
85
+ </p>
86
+ </div>
87
+ <div class="popl-header-right">
88
+ <span class="trust-badge ${trustClass}">
89
+ ${escapeHtml(entry.trust_label)}
90
+ </span>
91
+ </div>
92
+ </div>
93
+ `;
94
+ }
95
+ /**
96
+ * Render source links (Connector and Session)
97
+ */
98
+ function renderSourceLinks(entry) {
99
+ const connectorLink = `/connectors/${encodeURIComponent(entry.connector_id)}`;
100
+ const sessionShort = entry.session_id ? entry.session_id.slice(0, 8) : null;
101
+ const sessionLink = entry.session_id
102
+ ? `/connectors/${encodeURIComponent(entry.connector_id)}?session=${encodeURIComponent(entry.session_id)}`
103
+ : null;
104
+ return `
105
+ <div class="source-links">
106
+ <div class="source-link-item">
107
+ <span class="source-label">Connector:</span>
108
+ <a href="${connectorLink}" class="source-link">
109
+ <span class="badge">${escapeHtml(entry.connector_id)}</span>
110
+ </a>
111
+ </div>
112
+ ${sessionLink
113
+ ? `
114
+ <div class="source-link-item">
115
+ <span class="source-label">Session:</span>
116
+ <a href="${sessionLink}" class="source-link">
117
+ <span class="badge">${escapeHtml(sessionShort ?? '')}</span>
118
+ <span class="session-full">${escapeHtml(entry.session_id ?? '')}</span>
119
+ </a>
120
+ </div>
121
+ `
122
+ : `
123
+ <div class="source-link-item">
124
+ <span class="source-label">Session:</span>
125
+ <span class="no-session">(none)</span>
126
+ </div>
127
+ `}
128
+ <div class="source-link-item">
129
+ <span class="source-label">Target Kind:</span>
130
+ <span class="badge badge-kind">${escapeHtml(entry.target_kind)}</span>
131
+ </div>
132
+ </div>
133
+ `;
134
+ }
135
+ /**
136
+ * Render capture summary
137
+ */
138
+ function renderCaptureSummary(entry) {
139
+ const { capture } = entry;
140
+ const startFormatted = formatTimestamp(capture.started_at);
141
+ const endFormatted = formatTimestamp(capture.ended_at);
142
+ const p50Display = capture.latency_ms_p50 !== null ? `${capture.latency_ms_p50}ms` : '-';
143
+ const p95Display = capture.latency_ms_p95 !== null ? `${capture.latency_ms_p95}ms` : '-';
144
+ return `
145
+ <div class="capture-summary">
146
+ <div class="capture-row">
147
+ <div class="capture-item">
148
+ <span class="capture-label">Window</span>
149
+ <span class="capture-value">${startFormatted} → ${endFormatted}</span>
150
+ </div>
151
+ </div>
152
+ <div class="capture-row">
153
+ <div class="capture-item">
154
+ <span class="capture-label">RPCs</span>
155
+ <span class="capture-value badge">${capture.rpc_total}</span>
156
+ </div>
157
+ <div class="capture-item">
158
+ <span class="capture-label">Errors</span>
159
+ <span class="capture-value badge ${capture.errors > 0 ? 'badge-error' : ''}">${capture.errors}</span>
160
+ </div>
161
+ <div class="capture-item">
162
+ <span class="capture-label">P50</span>
163
+ <span class="capture-value">${p50Display}</span>
164
+ </div>
165
+ <div class="capture-item">
166
+ <span class="capture-label">P95</span>
167
+ <span class="capture-value">${p95Display}</span>
168
+ </div>
169
+ </div>
170
+ ${capture.mcp_servers.length > 0
171
+ ? `
172
+ <div class="capture-row">
173
+ <div class="capture-item">
174
+ <span class="capture-label">MCP Servers</span>
175
+ <span class="capture-value">
176
+ ${capture.mcp_servers.map((s) => `<span class="badge">${escapeHtml(s)}</span>`).join(' ')}
177
+ </span>
178
+ </div>
179
+ </div>
180
+ `
181
+ : ''}
182
+ </div>
183
+ `;
184
+ }
185
+ /**
186
+ * Render artifacts table with links
187
+ */
188
+ function renderArtifacts(entry) {
189
+ if (entry.artifacts.length === 0) {
190
+ return '<p class="no-artifacts">No artifacts</p>';
191
+ }
192
+ const rows = entry.artifacts
193
+ .map((artifact) => `
194
+ <tr>
195
+ <td class="artifact-name">
196
+ <a href="/popl/${encodeURIComponent(entry.id)}/artifacts/${encodeURIComponent(artifact.name)}" class="artifact-link">
197
+ ${escapeHtml(artifact.name)}
198
+ </a>
199
+ </td>
200
+ <td class="artifact-path">${escapeHtml(artifact.path)}</td>
201
+ <td class="artifact-sha256" title="${escapeHtml(artifact.sha256)}">
202
+ ${escapeHtml(artifact.sha256.slice(0, 16))}...
203
+ </td>
204
+ </tr>
205
+ `)
206
+ .join('');
207
+ return `
208
+ <table class="artifacts-table">
209
+ <thead>
210
+ <tr>
211
+ <th>Name</th>
212
+ <th>Path</th>
213
+ <th>SHA256</th>
214
+ </tr>
215
+ </thead>
216
+ <tbody>
217
+ ${rows}
218
+ </tbody>
219
+ </table>
220
+ `;
221
+ }
222
+ /**
223
+ * Get POPL detail page styles
224
+ */
225
+ function getPoplDetailStyles() {
226
+ return `
227
+ .back-link {
228
+ display: inline-block;
229
+ margin-bottom: 16px;
230
+ padding: 6px 12px;
231
+ background: var(--bg-secondary);
232
+ border: 1px solid var(--border-color);
233
+ border-radius: 6px;
234
+ color: var(--accent-blue);
235
+ text-decoration: none;
236
+ font-size: 13px;
237
+ }
238
+
239
+ .back-link:hover {
240
+ border-color: var(--accent-blue);
241
+ background: var(--bg-tertiary);
242
+ }
243
+
244
+ .popl-header {
245
+ display: flex;
246
+ justify-content: space-between;
247
+ align-items: flex-start;
248
+ gap: 16px;
249
+ margin-top: 8px;
250
+ }
251
+
252
+ .popl-header-left {
253
+ flex: 1;
254
+ }
255
+
256
+ .popl-title {
257
+ font-size: 20px;
258
+ font-weight: 600;
259
+ margin: 0 0 8px 0;
260
+ color: var(--text-primary);
261
+ }
262
+
263
+ .popl-id {
264
+ font-family: 'SF Mono', Consolas, monospace;
265
+ color: var(--accent-blue);
266
+ }
267
+
268
+ .popl-subtitle {
269
+ font-size: 14px;
270
+ color: var(--text-secondary);
271
+ margin: 0 0 8px 0;
272
+ }
273
+
274
+ .popl-meta {
275
+ font-size: 12px;
276
+ color: var(--text-secondary);
277
+ margin: 0;
278
+ }
279
+
280
+ .trust-badge {
281
+ display: inline-block;
282
+ padding: 6px 14px;
283
+ border-radius: 16px;
284
+ font-size: 12px;
285
+ font-weight: 500;
286
+ }
287
+
288
+ .trust-level-0 {
289
+ background: var(--bg-tertiary);
290
+ border: 1px solid var(--border-color);
291
+ color: var(--text-secondary);
292
+ }
293
+
294
+ .trust-level-1 {
295
+ background: rgba(63, 185, 80, 0.15);
296
+ border: 1px solid rgba(63, 185, 80, 0.3);
297
+ color: var(--accent-green);
298
+ }
299
+
300
+ .trust-level-2 {
301
+ background: rgba(0, 212, 255, 0.15);
302
+ border: 1px solid rgba(0, 212, 255, 0.3);
303
+ color: var(--accent-blue);
304
+ }
305
+
306
+ .trust-level-3 {
307
+ background: rgba(255, 215, 0, 0.15);
308
+ border: 1px solid rgba(255, 215, 0, 0.3);
309
+ color: #ffd700;
310
+ }
311
+
312
+ .source-links {
313
+ display: flex;
314
+ flex-direction: column;
315
+ gap: 12px;
316
+ }
317
+
318
+ .source-link-item {
319
+ display: flex;
320
+ align-items: center;
321
+ gap: 12px;
322
+ }
323
+
324
+ .source-label {
325
+ min-width: 100px;
326
+ color: var(--text-secondary);
327
+ font-size: 13px;
328
+ }
329
+
330
+ .source-link {
331
+ display: inline-flex;
332
+ align-items: center;
333
+ gap: 8px;
334
+ padding: 6px 12px;
335
+ background: var(--bg-secondary);
336
+ border: 1px solid var(--border-color);
337
+ border-radius: 6px;
338
+ text-decoration: none;
339
+ color: var(--text-primary);
340
+ }
341
+
342
+ .source-link:hover {
343
+ border-color: var(--accent-blue);
344
+ }
345
+
346
+ .source-link .badge {
347
+ color: var(--accent-blue);
348
+ }
349
+
350
+ .session-full {
351
+ font-family: 'SF Mono', Consolas, monospace;
352
+ font-size: 11px;
353
+ color: var(--text-secondary);
354
+ }
355
+
356
+ .no-session {
357
+ color: var(--text-secondary);
358
+ font-style: italic;
359
+ }
360
+
361
+ .badge-kind {
362
+ background: var(--bg-tertiary);
363
+ color: var(--text-secondary);
364
+ }
365
+
366
+ .capture-summary {
367
+ background: var(--bg-secondary);
368
+ border: 1px solid var(--border-color);
369
+ border-radius: 8px;
370
+ padding: 16px;
371
+ }
372
+
373
+ .capture-row {
374
+ display: flex;
375
+ flex-wrap: wrap;
376
+ gap: 24px;
377
+ margin-bottom: 12px;
378
+ }
379
+
380
+ .capture-row:last-child {
381
+ margin-bottom: 0;
382
+ }
383
+
384
+ .capture-item {
385
+ display: flex;
386
+ flex-direction: column;
387
+ gap: 4px;
388
+ }
389
+
390
+ .capture-label {
391
+ font-size: 11px;
392
+ color: var(--text-secondary);
393
+ text-transform: uppercase;
394
+ }
395
+
396
+ .capture-value {
397
+ font-size: 14px;
398
+ color: var(--text-primary);
399
+ }
400
+
401
+ .badge-error {
402
+ background: rgba(248, 81, 73, 0.15);
403
+ border-color: rgba(248, 81, 73, 0.3);
404
+ color: var(--accent-red);
405
+ }
406
+
407
+ .artifacts-table {
408
+ width: 100%;
409
+ border-collapse: collapse;
410
+ background: var(--bg-secondary);
411
+ border: 1px solid var(--border-color);
412
+ border-radius: 8px;
413
+ overflow: hidden;
414
+ }
415
+
416
+ .artifacts-table th,
417
+ .artifacts-table td {
418
+ padding: 10px 14px;
419
+ text-align: left;
420
+ border-bottom: 1px solid var(--border-color);
421
+ }
422
+
423
+ .artifacts-table th {
424
+ background: var(--bg-tertiary);
425
+ color: var(--text-secondary);
426
+ font-weight: 500;
427
+ font-size: 11px;
428
+ text-transform: uppercase;
429
+ }
430
+
431
+ .artifacts-table tbody tr:last-child td {
432
+ border-bottom: none;
433
+ }
434
+
435
+ .artifact-name {
436
+ font-weight: 500;
437
+ color: var(--text-primary);
438
+ }
439
+
440
+ .artifact-path {
441
+ font-family: 'SF Mono', Consolas, monospace;
442
+ font-size: 12px;
443
+ color: var(--text-secondary);
444
+ }
445
+
446
+ .artifact-sha256 {
447
+ font-family: 'SF Mono', Consolas, monospace;
448
+ font-size: 11px;
449
+ color: var(--text-secondary);
450
+ cursor: help;
451
+ }
452
+
453
+ .no-artifacts {
454
+ color: var(--text-secondary);
455
+ font-style: italic;
456
+ }
457
+
458
+ .error-container {
459
+ text-align: center;
460
+ padding: 48px;
461
+ background: var(--bg-secondary);
462
+ border: 1px solid var(--border-color);
463
+ border-radius: 8px;
464
+ }
465
+
466
+ .error-title {
467
+ font-size: 24px;
468
+ color: var(--accent-red);
469
+ margin: 0 0 16px 0;
470
+ }
471
+
472
+ .error-message {
473
+ font-size: 14px;
474
+ color: var(--text-primary);
475
+ margin: 0 0 8px 0;
476
+ }
477
+
478
+ .error-message code {
479
+ font-family: 'SF Mono', Consolas, monospace;
480
+ background: var(--bg-tertiary);
481
+ padding: 2px 6px;
482
+ border-radius: 4px;
483
+ }
484
+
485
+ .error-hint {
486
+ font-size: 13px;
487
+ color: var(--text-secondary);
488
+ margin: 0;
489
+ }
490
+
491
+ .artifact-link {
492
+ color: var(--accent-blue);
493
+ text-decoration: none;
494
+ }
495
+ .artifact-link:hover {
496
+ text-decoration: underline;
497
+ }
498
+ `;
499
+ }
500
+ /**
501
+ * Render artifact content page
502
+ */
503
+ export function renderArtifactPage(options) {
504
+ const { proofId, artifactName, artifact, content, isJson, error } = options;
505
+ let contentHtml;
506
+ if (error) {
507
+ contentHtml = `
508
+ <div class="artifact-error">
509
+ <p class="error-message">${escapeHtml(error)}</p>
510
+ </div>
511
+ `;
512
+ }
513
+ else if (content !== undefined) {
514
+ const formattedContent = isJson ? formatJsonContent(content) : escapeHtml(content);
515
+ contentHtml = `
516
+ <div class="artifact-content-wrapper">
517
+ <div class="artifact-meta">
518
+ <span class="artifact-meta-item">
519
+ <strong>Path:</strong> ${escapeHtml(artifact?.path ?? '')}
520
+ </span>
521
+ <span class="artifact-meta-item">
522
+ <strong>SHA256:</strong> <code>${escapeHtml(artifact?.sha256 ?? '')}</code>
523
+ </span>
524
+ </div>
525
+ <pre class="artifact-content ${isJson ? 'json-content' : ''}">${formattedContent}</pre>
526
+ </div>
527
+ `;
528
+ }
529
+ else {
530
+ contentHtml = '<p class="no-content">No content available</p>';
531
+ }
532
+ const pageContent = `
533
+ <section class="section">
534
+ <a href="/popl/${encodeURIComponent(proofId)}" class="back-link">← Back to POPL Entry</a>
535
+ <div class="artifact-header">
536
+ <h1 class="artifact-title">Artifact: ${escapeHtml(artifactName)}</h1>
537
+ <p class="artifact-entry">POPL Entry: <code>${escapeHtml(proofId)}</code></p>
538
+ </div>
539
+ </section>
540
+
541
+ <section class="section">
542
+ ${contentHtml}
543
+ </section>
544
+ `;
545
+ return renderLayout({
546
+ title: `Artifact: ${artifactName} - ProofScan Monitor`,
547
+ generatedAt: new Date().toISOString(),
548
+ content: pageContent,
549
+ extraStyles: getArtifactPageStyles(),
550
+ });
551
+ }
552
+ /**
553
+ * Format JSON content with syntax highlighting
554
+ */
555
+ function formatJsonContent(content) {
556
+ try {
557
+ const parsed = JSON.parse(content);
558
+ const formatted = JSON.stringify(parsed, null, 2);
559
+ return escapeHtml(formatted);
560
+ }
561
+ catch {
562
+ return escapeHtml(content);
563
+ }
564
+ }
565
+ /**
566
+ * Get artifact page styles
567
+ */
568
+ function getArtifactPageStyles() {
569
+ return `
570
+ ${getPoplDetailStyles()}
571
+
572
+ .artifact-header {
573
+ margin-top: 8px;
574
+ }
575
+
576
+ .artifact-title {
577
+ font-size: 20px;
578
+ font-weight: 600;
579
+ margin: 0 0 8px 0;
580
+ color: var(--text-primary);
581
+ }
582
+
583
+ .artifact-entry {
584
+ font-size: 13px;
585
+ color: var(--text-secondary);
586
+ margin: 0;
587
+ }
588
+
589
+ .artifact-entry code {
590
+ font-family: 'SF Mono', Consolas, monospace;
591
+ color: var(--accent-blue);
592
+ }
593
+
594
+ .artifact-content-wrapper {
595
+ background: var(--bg-secondary);
596
+ border: 1px solid var(--border-color);
597
+ border-radius: 8px;
598
+ overflow: hidden;
599
+ }
600
+
601
+ .artifact-meta {
602
+ display: flex;
603
+ flex-wrap: wrap;
604
+ gap: 16px;
605
+ padding: 12px 16px;
606
+ background: var(--bg-tertiary);
607
+ border-bottom: 1px solid var(--border-color);
608
+ font-size: 12px;
609
+ color: var(--text-secondary);
610
+ }
611
+
612
+ .artifact-meta code {
613
+ font-family: 'SF Mono', Consolas, monospace;
614
+ font-size: 11px;
615
+ word-break: break-all;
616
+ }
617
+
618
+ .artifact-content {
619
+ margin: 0;
620
+ padding: 16px;
621
+ font-family: 'SF Mono', Consolas, monospace;
622
+ font-size: 12px;
623
+ line-height: 1.5;
624
+ overflow-x: auto;
625
+ white-space: pre-wrap;
626
+ word-wrap: break-word;
627
+ color: var(--text-primary);
628
+ max-height: 70vh;
629
+ overflow-y: auto;
630
+ }
631
+
632
+ .artifact-content.json-content {
633
+ white-space: pre;
634
+ }
635
+
636
+ .artifact-error {
637
+ background: rgba(248, 81, 73, 0.1);
638
+ border: 1px solid rgba(248, 81, 73, 0.3);
639
+ border-radius: 8px;
640
+ padding: 16px;
641
+ }
642
+
643
+ .artifact-error .error-message {
644
+ color: var(--accent-red);
645
+ margin: 0;
646
+ }
647
+
648
+ .no-content {
649
+ color: var(--text-secondary);
650
+ font-style: italic;
651
+ }
652
+ `;
653
+ }
654
+ //# sourceMappingURL=popl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popl.js","sourceRoot":"","sources":["../../../src/monitor/templates/popl.ts"],"names":[],"mappings":"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"}