proofscan 0.10.26 → 0.10.27

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 (92) 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 +58 -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 +3 -2
  22. package/dist/html/index.d.ts.map +1 -1
  23. package/dist/html/index.js +3 -1
  24. package/dist/html/index.js.map +1 -1
  25. package/dist/html/templates.d.ts +9 -1
  26. package/dist/html/templates.d.ts.map +1 -1
  27. package/dist/html/templates.js +580 -30
  28. package/dist/html/templates.js.map +1 -1
  29. package/dist/html/types.d.ts +93 -0
  30. package/dist/html/types.d.ts.map +1 -1
  31. package/dist/html/types.js.map +1 -1
  32. package/dist/monitor/data/aggregator.d.ts +13 -0
  33. package/dist/monitor/data/aggregator.d.ts.map +1 -0
  34. package/dist/monitor/data/aggregator.js +101 -0
  35. package/dist/monitor/data/aggregator.js.map +1 -0
  36. package/dist/monitor/data/connectors.d.ts +13 -0
  37. package/dist/monitor/data/connectors.d.ts.map +1 -0
  38. package/dist/monitor/data/connectors.js +326 -0
  39. package/dist/monitor/data/connectors.js.map +1 -0
  40. package/dist/monitor/data/popl.d.ts +30 -0
  41. package/dist/monitor/data/popl.d.ts.map +1 -0
  42. package/dist/monitor/data/popl.js +310 -0
  43. package/dist/monitor/data/popl.js.map +1 -0
  44. package/dist/monitor/index.d.ts +6 -0
  45. package/dist/monitor/index.d.ts.map +1 -0
  46. package/dist/monitor/index.js +6 -0
  47. package/dist/monitor/index.js.map +1 -0
  48. package/dist/monitor/routes/api.d.ts +7 -0
  49. package/dist/monitor/routes/api.d.ts.map +1 -0
  50. package/dist/monitor/routes/api.js +63 -0
  51. package/dist/monitor/routes/api.js.map +1 -0
  52. package/dist/monitor/routes/connectors.d.ts +7 -0
  53. package/dist/monitor/routes/connectors.d.ts.map +1 -0
  54. package/dist/monitor/routes/connectors.js +417 -0
  55. package/dist/monitor/routes/connectors.js.map +1 -0
  56. package/dist/monitor/routes/home.d.ts +7 -0
  57. package/dist/monitor/routes/home.d.ts.map +1 -0
  58. package/dist/monitor/routes/home.js +15 -0
  59. package/dist/monitor/routes/home.js.map +1 -0
  60. package/dist/monitor/routes/index.d.ts +10 -0
  61. package/dist/monitor/routes/index.d.ts.map +1 -0
  62. package/dist/monitor/routes/index.js +19 -0
  63. package/dist/monitor/routes/index.js.map +1 -0
  64. package/dist/monitor/routes/popl.d.ts +7 -0
  65. package/dist/monitor/routes/popl.d.ts.map +1 -0
  66. package/dist/monitor/routes/popl.js +84 -0
  67. package/dist/monitor/routes/popl.js.map +1 -0
  68. package/dist/monitor/server.d.ts +24 -0
  69. package/dist/monitor/server.d.ts.map +1 -0
  70. package/dist/monitor/server.js +52 -0
  71. package/dist/monitor/server.js.map +1 -0
  72. package/dist/monitor/templates/components.d.ts +21 -0
  73. package/dist/monitor/templates/components.d.ts.map +1 -0
  74. package/dist/monitor/templates/components.js +405 -0
  75. package/dist/monitor/templates/components.js.map +1 -0
  76. package/dist/monitor/templates/home.d.ts +9 -0
  77. package/dist/monitor/templates/home.d.ts.map +1 -0
  78. package/dist/monitor/templates/home.js +322 -0
  79. package/dist/monitor/templates/home.js.map +1 -0
  80. package/dist/monitor/templates/layout.d.ts +26 -0
  81. package/dist/monitor/templates/layout.d.ts.map +1 -0
  82. package/dist/monitor/templates/layout.js +186 -0
  83. package/dist/monitor/templates/layout.js.map +1 -0
  84. package/dist/monitor/templates/popl.d.ts +33 -0
  85. package/dist/monitor/templates/popl.d.ts.map +1 -0
  86. package/dist/monitor/templates/popl.js +654 -0
  87. package/dist/monitor/templates/popl.js.map +1 -0
  88. package/dist/monitor/types.d.ts +121 -0
  89. package/dist/monitor/types.d.ts.map +1 -0
  90. package/dist/monitor/types.js +5 -0
  91. package/dist/monitor/types.js.map +1 -0
  92. package/package.json +3 -1
@@ -0,0 +1,84 @@
1
+ /**
2
+ * ProofScan Web Monitor - POPL entry routes
3
+ */
4
+ import { Hono } from 'hono';
5
+ import { join, resolve, relative } from 'path';
6
+ import { readFile, stat } from 'fs/promises';
7
+ import { renderPoplDetailPage, renderPopl404Page, renderArtifactPage } from '../templates/popl.js';
8
+ import { getPoplEntry } from '../data/popl.js';
9
+ export const poplRoutes = new Hono();
10
+ // GET /:proof_id - POPL entry detail page
11
+ poplRoutes.get('/:proof_id', async (c) => {
12
+ const proofId = c.req.param('proof_id');
13
+ const entry = await getPoplEntry(proofId);
14
+ if (!entry) {
15
+ return c.html(renderPopl404Page(proofId), 404);
16
+ }
17
+ const html = renderPoplDetailPage(entry);
18
+ return c.html(html);
19
+ });
20
+ // GET /:proof_id/artifacts/:name - View artifact content
21
+ poplRoutes.get('/:proof_id/artifacts/:name', async (c) => {
22
+ const proofId = c.req.param('proof_id');
23
+ const artifactName = c.req.param('name');
24
+ const entry = await getPoplEntry(proofId);
25
+ if (!entry) {
26
+ return c.html(renderPopl404Page(proofId), 404);
27
+ }
28
+ // Find artifact by name
29
+ const artifact = entry.artifacts.find((a) => a.name === artifactName);
30
+ if (!artifact) {
31
+ return c.html(renderArtifactPage({
32
+ proofId,
33
+ artifactName,
34
+ error: `Artifact "${artifactName}" not found in POPL entry`,
35
+ }), 404);
36
+ }
37
+ // Try to read the artifact file
38
+ const poplDir = join(process.cwd(), '.popl', 'popl_entries', proofId);
39
+ const artifactPath = resolve(poplDir, artifact.path);
40
+ // Security: Prevent path traversal attacks
41
+ const relativePath = relative(poplDir, artifactPath);
42
+ if (relativePath.startsWith('..') || relativePath.startsWith('/')) {
43
+ return c.html(renderArtifactPage({
44
+ proofId,
45
+ artifactName,
46
+ artifact,
47
+ error: 'Invalid artifact path: access denied',
48
+ }), 403);
49
+ }
50
+ try {
51
+ // Check if file exists and get stats
52
+ const fileStat = await stat(artifactPath);
53
+ const maxSize = 1024 * 1024; // 1MB limit for display
54
+ if (fileStat.size > maxSize) {
55
+ return c.html(renderArtifactPage({
56
+ proofId,
57
+ artifactName,
58
+ artifact,
59
+ error: `File too large to display (${(fileStat.size / 1024 / 1024).toFixed(2)} MB). Maximum: 1 MB`,
60
+ }), 200);
61
+ }
62
+ const content = await readFile(artifactPath, 'utf-8');
63
+ // Determine content type based on file extension
64
+ const ext = artifact.path.split('.').pop()?.toLowerCase();
65
+ const isJson = ext === 'json' || content.trim().startsWith('{') || content.trim().startsWith('[');
66
+ return c.html(renderArtifactPage({
67
+ proofId,
68
+ artifactName,
69
+ artifact,
70
+ content,
71
+ isJson,
72
+ }));
73
+ }
74
+ catch (err) {
75
+ const errorMessage = err instanceof Error ? err.message : 'Unknown error';
76
+ return c.html(renderArtifactPage({
77
+ proofId,
78
+ artifactName,
79
+ artifact,
80
+ error: `Failed to read artifact: ${errorMessage}`,
81
+ }), 500);
82
+ }
83
+ });
84
+ //# sourceMappingURL=popl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popl.js","sourceRoot":"","sources":["../../../src/monitor/routes/popl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * ProofScan Web Monitor - Hono Server
3
+ */
4
+ import { Hono } from 'hono';
5
+ import type { Server } from 'node:http';
6
+ import type { MonitorServerOptions } from './types.js';
7
+ /**
8
+ * Context variables available in all routes
9
+ */
10
+ export type MonitorEnv = {
11
+ Variables: {
12
+ configPath: string;
13
+ generatedAt: string;
14
+ };
15
+ };
16
+ /**
17
+ * Create the Hono application with all routes
18
+ */
19
+ export declare function createMonitorApp(options: MonitorServerOptions): Hono<MonitorEnv>;
20
+ /**
21
+ * Start the monitor server
22
+ */
23
+ export declare function startMonitorServer(options: MonitorServerOptions): Promise<Server>;
24
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/monitor/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGvD;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE;QACT,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAC,UAAU,CAAC,CAchF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,MAAM,CAAC,CA8BjB"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * ProofScan Web Monitor - Hono Server
3
+ */
4
+ import { Hono } from 'hono';
5
+ import { serve } from '@hono/node-server';
6
+ import { registerRoutes } from './routes/index.js';
7
+ /**
8
+ * Create the Hono application with all routes
9
+ */
10
+ export function createMonitorApp(options) {
11
+ const app = new Hono();
12
+ // Middleware: inject context into all requests
13
+ app.use('*', async (c, next) => {
14
+ c.set('configPath', options.configPath);
15
+ c.set('generatedAt', new Date().toISOString());
16
+ await next();
17
+ });
18
+ // Register all routes
19
+ registerRoutes(app);
20
+ return app;
21
+ }
22
+ /**
23
+ * Start the monitor server
24
+ */
25
+ export function startMonitorServer(options) {
26
+ return new Promise((resolve, reject) => {
27
+ const app = createMonitorApp(options);
28
+ const server = serve({
29
+ fetch: app.fetch,
30
+ port: options.port,
31
+ hostname: options.host,
32
+ }, (info) => {
33
+ console.log(`ProofScan Monitor running at http://${info.address}:${info.port}`);
34
+ console.log(' Mode: Offline (read-only)');
35
+ console.log(' Press Ctrl+C to stop');
36
+ console.log('');
37
+ resolve(server);
38
+ });
39
+ // Handle server errors (e.g., EADDRINUSE)
40
+ server.on('error', (err) => {
41
+ if (err.code === 'EADDRINUSE') {
42
+ console.error(`Error: Port ${options.port} is already in use`);
43
+ console.error(`Try a different port with: pfs monitor start --port <port>`);
44
+ reject(err);
45
+ }
46
+ else {
47
+ reject(err);
48
+ }
49
+ });
50
+ });
51
+ }
52
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/monitor/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG1C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAYnD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAA6B;IAC5D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAc,CAAC;IAEnC,+CAA+C;IAC/C,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QAC7B,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QACxC,CAAC,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/C,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,sBAAsB;IACtB,cAAc,CAAC,GAAG,CAAC,CAAC;IAEpB,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAA6B;IAE7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAEtC,MAAM,MAAM,GAAG,KAAK,CAClB;YACE,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,OAAO,CAAC,IAAI;SACvB,EACD,CAAC,IAAI,EAAE,EAAE;YACP,OAAO,CAAC,GAAG,CAAC,uCAAuC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAChF,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,MAA2B,CAAC,CAAC;QACvC,CAAC,CACF,CAAC;QAEF,0CAA0C;QACzC,MAA4B,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YACvE,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC9B,OAAO,CAAC,KAAK,CAAC,eAAe,OAAO,CAAC,IAAI,oBAAoB,CAAC,CAAC;gBAC/D,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;gBAC5E,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * ProofScan Web Monitor - UI Components
3
+ */
4
+ import type { MonitorConnectorCard, MonitorPoplKpis } from '../types.js';
5
+ /**
6
+ * Render POPL KPI panel with latest entries list
7
+ */
8
+ export declare function renderPoplPanel(popl: MonitorPoplKpis | null): string;
9
+ /**
10
+ * Get POPL panel styles
11
+ */
12
+ export declare function getPoplPanelStyles(): string;
13
+ /**
14
+ * Render connector card
15
+ */
16
+ export declare function renderConnectorCard(card: MonitorConnectorCard): string;
17
+ /**
18
+ * Get connector card styles
19
+ */
20
+ export declare function getConnectorCardStyles(): string;
21
+ //# sourceMappingURL=components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../../src/monitor/templates/components.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,oBAAoB,EACpB,eAAe,EAEhB,MAAM,aAAa,CAAC;AAGrB;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,GAAG,MAAM,CAuDpE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAuI3C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAgDtE;AAoDD;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAoG/C"}
@@ -0,0 +1,405 @@
1
+ /**
2
+ * ProofScan Web Monitor - UI Components
3
+ */
4
+ import { escapeHtml } from './layout.js';
5
+ /**
6
+ * Render POPL KPI panel with latest entries list
7
+ */
8
+ export function renderPoplPanel(popl) {
9
+ if (!popl) {
10
+ return `
11
+ <div class="popl-panel popl-empty">
12
+ <div class="popl-title">POPL</div>
13
+ <div class="popl-message">Not initialized</div>
14
+ </div>
15
+ `;
16
+ }
17
+ // Render latest entries list
18
+ const latestEntriesHtml = popl.latest_entries.length > 0
19
+ ? `
20
+ <div class="popl-latest-list">
21
+ <div class="popl-latest-title">Recent Entries</div>
22
+ ${popl.latest_entries
23
+ .map((entry) => {
24
+ const trustClass = `popl-trust-${entry.trust_level}`;
25
+ const shortId = entry.id.slice(0, 12);
26
+ return `
27
+ <a href="/popl/${encodeURIComponent(entry.id)}" class="popl-latest-item">
28
+ <span class="popl-latest-id">${escapeHtml(shortId)}...</span>
29
+ <span class="popl-latest-badge ${trustClass}">${escapeHtml(entry.trust_label)}</span>
30
+ </a>
31
+ `;
32
+ })
33
+ .join('')}
34
+ </div>
35
+ `
36
+ : '<div class="popl-no-entries">No entries yet</div>';
37
+ return `
38
+ <div class="popl-panel">
39
+ <div class="popl-kpis">
40
+ <div class="popl-kpi">
41
+ <span class="popl-value">${popl.entries}</span>
42
+ <span class="popl-label">Entries</span>
43
+ </div>
44
+ <div class="popl-kpi">
45
+ <span class="popl-value popl-inscribed">${popl.inscribed}</span>
46
+ <span class="popl-label">Inscribed</span>
47
+ </div>
48
+ <div class="popl-kpi">
49
+ <span class="popl-value popl-ipfs">${popl.ipfs_only}</span>
50
+ <span class="popl-label">IPFS Only</span>
51
+ </div>
52
+ <div class="popl-kpi">
53
+ <span class="popl-value popl-failed">${popl.failed}</span>
54
+ <span class="popl-label">Failed</span>
55
+ </div>
56
+ </div>
57
+ ${latestEntriesHtml}
58
+ </div>
59
+ `;
60
+ }
61
+ /**
62
+ * Get POPL panel styles
63
+ */
64
+ export function getPoplPanelStyles() {
65
+ return `
66
+ .popl-panel {
67
+ background: var(--bg-secondary);
68
+ border: 1px solid var(--border-color);
69
+ border-radius: 8px;
70
+ padding: 16px;
71
+ }
72
+
73
+ .popl-panel.popl-empty {
74
+ display: flex;
75
+ align-items: center;
76
+ gap: 12px;
77
+ }
78
+
79
+ .popl-title {
80
+ font-weight: 600;
81
+ color: var(--text-secondary);
82
+ }
83
+
84
+ .popl-message {
85
+ color: var(--text-secondary);
86
+ font-size: 12px;
87
+ }
88
+
89
+ .popl-kpis {
90
+ display: flex;
91
+ gap: 24px;
92
+ margin-bottom: 8px;
93
+ }
94
+
95
+ .popl-kpi {
96
+ display: flex;
97
+ flex-direction: column;
98
+ align-items: center;
99
+ }
100
+
101
+ .popl-value {
102
+ font-size: 20px;
103
+ font-weight: 600;
104
+ color: var(--accent-blue);
105
+ font-family: 'SF Mono', Consolas, monospace;
106
+ }
107
+
108
+ .popl-value.popl-inscribed { color: var(--accent-green); }
109
+ .popl-value.popl-ipfs { color: var(--accent-yellow); }
110
+ .popl-value.popl-failed { color: var(--accent-red); }
111
+
112
+ .popl-label {
113
+ font-size: 11px;
114
+ color: var(--text-secondary);
115
+ text-transform: uppercase;
116
+ }
117
+
118
+ .popl-latest {
119
+ font-size: 12px;
120
+ color: var(--text-secondary);
121
+ }
122
+
123
+ .popl-latest-list {
124
+ margin-top: 12px;
125
+ padding-top: 12px;
126
+ border-top: 1px solid var(--border-color);
127
+ }
128
+
129
+ .popl-latest-title {
130
+ font-size: 11px;
131
+ color: var(--text-secondary);
132
+ text-transform: uppercase;
133
+ margin-bottom: 8px;
134
+ }
135
+
136
+ .popl-latest-item {
137
+ display: flex;
138
+ align-items: center;
139
+ justify-content: space-between;
140
+ padding: 6px 8px;
141
+ margin-bottom: 4px;
142
+ background: var(--bg-tertiary);
143
+ border: 1px solid transparent;
144
+ border-radius: 4px;
145
+ text-decoration: none;
146
+ transition: border-color 0.15s;
147
+ }
148
+
149
+ .popl-latest-item:hover {
150
+ border-color: var(--accent-blue);
151
+ }
152
+
153
+ .popl-latest-id {
154
+ font-family: 'SF Mono', Consolas, monospace;
155
+ font-size: 11px;
156
+ color: var(--accent-blue);
157
+ }
158
+
159
+ .popl-latest-badge {
160
+ padding: 2px 8px;
161
+ border-radius: 10px;
162
+ font-size: 10px;
163
+ font-weight: 500;
164
+ }
165
+
166
+ .popl-trust-0 {
167
+ background: var(--bg-tertiary);
168
+ border: 1px solid var(--border-color);
169
+ color: var(--text-secondary);
170
+ }
171
+
172
+ .popl-trust-1 {
173
+ background: rgba(63, 185, 80, 0.15);
174
+ border: 1px solid rgba(63, 185, 80, 0.3);
175
+ color: var(--accent-green);
176
+ }
177
+
178
+ .popl-trust-2 {
179
+ background: rgba(0, 212, 255, 0.15);
180
+ border: 1px solid rgba(0, 212, 255, 0.3);
181
+ color: var(--accent-blue);
182
+ }
183
+
184
+ .popl-trust-3 {
185
+ background: rgba(255, 215, 0, 0.15);
186
+ border: 1px solid rgba(255, 215, 0, 0.3);
187
+ color: #ffd700;
188
+ }
189
+
190
+ .popl-no-entries {
191
+ font-size: 12px;
192
+ color: var(--text-secondary);
193
+ font-style: italic;
194
+ margin-top: 12px;
195
+ padding-top: 12px;
196
+ border-top: 1px solid var(--border-color);
197
+ }
198
+ `;
199
+ }
200
+ /**
201
+ * Render connector card
202
+ */
203
+ export function renderConnectorCard(card) {
204
+ const statusBadge = getStatusBadge(card.status);
205
+ const enabledBadge = card.enabled
206
+ ? '<span class="badge badge-enabled">Enabled</span>'
207
+ : '<span class="badge badge-disabled">Disabled</span>';
208
+ const capabilities = renderCapabilities(card.capabilities);
209
+ const transportBadge = `<span class="badge badge-transport">${card.transport}</span>`;
210
+ const disabledClass = card.enabled ? '' : 'card-disabled';
211
+ return `
212
+ <a href="/connectors/${escapeHtml(card.connector_id)}" class="connector-card ${disabledClass}" data-id="${escapeHtml(card.connector_id)}" data-capabilities="${getCapabilitiesData(card.capabilities)}" data-transport="${card.transport}">
213
+ <div class="card-header">
214
+ <div class="card-title">${escapeHtml(card.connector_id)}</div>
215
+ <div class="card-badges">
216
+ ${statusBadge}
217
+ ${enabledBadge}
218
+ </div>
219
+ </div>
220
+ <div class="card-package">${escapeHtml(card.package_name)}@${escapeHtml(card.package_version)}</div>
221
+ <div class="card-capabilities">
222
+ ${capabilities}
223
+ ${transportBadge}
224
+ </div>
225
+ <div class="card-kpis">
226
+ <div class="card-kpi">
227
+ <span class="kpi-value">${formatNumber(card.kpis.sessions)}</span>
228
+ <span class="kpi-label">Sessions</span>
229
+ </div>
230
+ <div class="card-kpi">
231
+ <span class="kpi-value">${formatNumber(card.kpis.rpcs)}</span>
232
+ <span class="kpi-label">RPCs</span>
233
+ </div>
234
+ <div class="card-kpi">
235
+ <span class="kpi-value">${formatNumber(card.kpis.errors)}</span>
236
+ <span class="kpi-label">Errors</span>
237
+ </div>
238
+ <div class="card-kpi">
239
+ <span class="kpi-value">${card.kpis.avg_latency_ms !== null ? card.kpis.avg_latency_ms + 'ms' : '-'}</span>
240
+ <span class="kpi-label">Avg</span>
241
+ </div>
242
+ </div>
243
+ <div class="card-footer">
244
+ <span class="card-activity">Last: ${escapeHtml(card.last_activity_relative)}</span>
245
+ </div>
246
+ </a>
247
+ `;
248
+ }
249
+ /**
250
+ * Get status badge HTML
251
+ */
252
+ function getStatusBadge(status) {
253
+ const classes = {
254
+ OK: 'badge-ok',
255
+ WARN: 'badge-warn',
256
+ ERR: 'badge-err',
257
+ OFFLINE: 'badge-offline',
258
+ };
259
+ return `<span class="badge ${classes[status]}">${status}</span>`;
260
+ }
261
+ /**
262
+ * Render capability badges
263
+ */
264
+ function renderCapabilities(capabilities) {
265
+ const badges = [];
266
+ if (capabilities.tools)
267
+ badges.push('<span class="badge badge-capability">tools</span>');
268
+ if (capabilities.resources)
269
+ badges.push('<span class="badge badge-capability">resources</span>');
270
+ if (capabilities.prompts)
271
+ badges.push('<span class="badge badge-capability">prompts</span>');
272
+ if (capabilities.subscriptions)
273
+ badges.push('<span class="badge badge-capability">subscriptions</span>');
274
+ return badges.join('');
275
+ }
276
+ /**
277
+ * Get capabilities as data attribute value
278
+ */
279
+ function getCapabilitiesData(capabilities) {
280
+ const caps = [];
281
+ if (capabilities.tools)
282
+ caps.push('tools');
283
+ if (capabilities.resources)
284
+ caps.push('resources');
285
+ if (capabilities.prompts)
286
+ caps.push('prompts');
287
+ if (capabilities.subscriptions)
288
+ caps.push('subscriptions');
289
+ return caps.join(',');
290
+ }
291
+ /**
292
+ * Format number with K/M suffix
293
+ */
294
+ function formatNumber(n) {
295
+ if (n >= 1000000)
296
+ return (n / 1000000).toFixed(1) + 'M';
297
+ if (n >= 1000)
298
+ return (n / 1000).toFixed(1) + 'K';
299
+ return String(n);
300
+ }
301
+ /**
302
+ * Get connector card styles
303
+ */
304
+ export function getConnectorCardStyles() {
305
+ return `
306
+ .connector-cards {
307
+ display: grid;
308
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
309
+ gap: 16px;
310
+ }
311
+
312
+ .connector-card {
313
+ display: block;
314
+ background: var(--bg-secondary);
315
+ border: 1px solid var(--border-color);
316
+ border-radius: 8px;
317
+ padding: 16px;
318
+ text-decoration: none;
319
+ transition: border-color 0.15s, transform 0.15s;
320
+ }
321
+
322
+ .connector-card:hover {
323
+ border-color: var(--accent-blue);
324
+ transform: translateY(-2px);
325
+ text-decoration: none;
326
+ }
327
+
328
+ .connector-card.card-disabled {
329
+ opacity: 0.6;
330
+ }
331
+
332
+ .connector-card.card-disabled:hover {
333
+ opacity: 0.8;
334
+ }
335
+
336
+ .card-header {
337
+ display: flex;
338
+ justify-content: space-between;
339
+ align-items: flex-start;
340
+ margin-bottom: 8px;
341
+ }
342
+
343
+ .card-title {
344
+ font-size: 16px;
345
+ font-weight: 600;
346
+ color: var(--text-primary);
347
+ }
348
+
349
+ .card-badges {
350
+ display: flex;
351
+ gap: 6px;
352
+ }
353
+
354
+ .card-package {
355
+ font-size: 12px;
356
+ color: var(--text-secondary);
357
+ font-family: 'SF Mono', Consolas, monospace;
358
+ margin-bottom: 12px;
359
+ }
360
+
361
+ .card-capabilities {
362
+ display: flex;
363
+ flex-wrap: wrap;
364
+ gap: 6px;
365
+ margin-bottom: 12px;
366
+ }
367
+
368
+ .card-kpis {
369
+ display: grid;
370
+ grid-template-columns: repeat(4, 1fr);
371
+ gap: 8px;
372
+ padding: 12px 0;
373
+ border-top: 1px solid var(--border-color);
374
+ border-bottom: 1px solid var(--border-color);
375
+ }
376
+
377
+ .card-kpi {
378
+ text-align: center;
379
+ }
380
+
381
+ .card-kpi .kpi-value {
382
+ display: block;
383
+ font-size: 14px;
384
+ font-weight: 600;
385
+ color: var(--accent-blue);
386
+ font-family: 'SF Mono', Consolas, monospace;
387
+ }
388
+
389
+ .card-kpi .kpi-label {
390
+ font-size: 10px;
391
+ color: var(--text-secondary);
392
+ text-transform: uppercase;
393
+ }
394
+
395
+ .card-footer {
396
+ padding-top: 8px;
397
+ }
398
+
399
+ .card-activity {
400
+ font-size: 12px;
401
+ color: var(--text-secondary);
402
+ }
403
+ `;
404
+ }
405
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../../../src/monitor/templates/components.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * ProofScan Web Monitor - Home page template
3
+ */
4
+ import type { MonitorHomeData } from '../types.js';
5
+ /**
6
+ * Render home page HTML
7
+ */
8
+ export declare function renderHomePage(data: MonitorHomeData): string;
9
+ //# sourceMappingURL=home.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../../src/monitor/templates/home.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAUnD;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CA0D5D"}