@agent-analytics/paperclip-live-analytics-plugin 0.1.0 → 0.1.1

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.
package/src/ui/main.jsx DELETED
@@ -1,11 +0,0 @@
1
- import React from 'react';
2
- import { createRoot } from 'react-dom/client';
3
- import { App } from './App.jsx';
4
- import './styles.css';
5
-
6
- createRoot(document.getElementById('root')).render(
7
- <React.StrictMode>
8
- <App />
9
- </React.StrictMode>
10
- );
11
-
@@ -1,126 +0,0 @@
1
- import { useEffect, useState } from 'react';
2
- import { ACTION_KEYS, DATA_KEYS } from '../shared/constants.js';
3
- import { deriveWidgetSummary } from '../shared/live-state.js';
4
- import { demoLiveState, demoSettingsData } from './demo-data.js';
5
-
6
- function getBridge() {
7
- return globalThis.__PAPERCLIP_PLUGIN_BRIDGE__ || null;
8
- }
9
-
10
- function getFallbackData(key) {
11
- if (key === DATA_KEYS.livePageLoad) return demoLiveState;
12
- if (key === DATA_KEYS.liveWidgetLoad) return deriveWidgetSummary(demoLiveState);
13
- if (key === DATA_KEYS.settingsLoad) return demoSettingsData;
14
- return null;
15
- }
16
-
17
- export function useHostContext() {
18
- const bridge = getBridge();
19
- if (bridge?.useHostContext) {
20
- return bridge.useHostContext();
21
- }
22
-
23
- const params = new URLSearchParams(globalThis.location?.search || '');
24
- return {
25
- companyId: params.get('companyId') || 'demo-company',
26
- surface: params.get('surface') || 'page',
27
- basePath: '',
28
- };
29
- }
30
-
31
- export function usePluginData(key, payload, options = {}) {
32
- const bridge = getBridge();
33
- if (bridge?.usePluginData) {
34
- return bridge.usePluginData(key, payload, options);
35
- }
36
-
37
- const [data, setData] = useState(() => getFallbackData(key));
38
- const [loading, setLoading] = useState(false);
39
- const [error, setError] = useState(null);
40
-
41
- async function reload() {
42
- setLoading(true);
43
- try {
44
- setData(getFallbackData(key));
45
- setError(null);
46
- } catch (loadError) {
47
- setError(loadError);
48
- } finally {
49
- setLoading(false);
50
- }
51
- }
52
-
53
- useEffect(() => {
54
- if (options.enabled === false) return;
55
- void reload();
56
- }, [key, JSON.stringify(payload), options.enabled]);
57
-
58
- return { data, loading, error, reload };
59
- }
60
-
61
- export function usePluginAction(key) {
62
- const bridge = getBridge();
63
- const [pending, setPending] = useState(false);
64
- const [error, setError] = useState(null);
65
-
66
- async function run(payload) {
67
- setPending(true);
68
- setError(null);
69
- try {
70
- if (bridge?.runAction) {
71
- return await bridge.runAction(key, payload);
72
- }
73
-
74
- if (key === ACTION_KEYS.authStart) {
75
- return {
76
- auth: {
77
- ...demoSettingsData.auth,
78
- status: 'pending',
79
- pendingAuthRequest: {
80
- authRequestId: 'req_demo',
81
- authorizeUrl: 'https://api.agentanalytics.sh/agent-sessions/authorize/req_demo',
82
- approvalCode: 'ABCD2345',
83
- expiresAt: Date.now() + 600_000,
84
- },
85
- },
86
- };
87
- }
88
-
89
- if (key === ACTION_KEYS.settingsSave || key === ACTION_KEYS.mappingUpsert || key === ACTION_KEYS.mappingRemove) {
90
- return demoSettingsData;
91
- }
92
-
93
- if (key === ACTION_KEYS.assetSnooze || key === ACTION_KEYS.assetUnsnooze) {
94
- return {
95
- liveState: demoLiveState,
96
- };
97
- }
98
-
99
- return { ok: true };
100
- } catch (actionError) {
101
- setError(actionError);
102
- throw actionError;
103
- } finally {
104
- setPending(false);
105
- }
106
- }
107
-
108
- return { run, pending, error };
109
- }
110
-
111
- export function usePluginStream(channel, { companyId, onEvent }) {
112
- const bridge = getBridge();
113
-
114
- useEffect(() => {
115
- if (bridge?.subscribeStream) {
116
- return bridge.subscribeStream(channel, { companyId }, onEvent);
117
- }
118
-
119
- const intervalId = setInterval(() => {
120
- onEvent?.(demoLiveState);
121
- }, 15_000);
122
-
123
- return () => clearInterval(intervalId);
124
- }, [bridge, channel, companyId, onEvent]);
125
- }
126
-
package/src/ui/styles.css DELETED
@@ -1,483 +0,0 @@
1
- :root {
2
- --aa-bg: #f0e8dc;
3
- --aa-bg-deep: #e4d6c0;
4
- --aa-ink: #1f2a2a;
5
- --aa-muted: #576665;
6
- --aa-panel: rgba(255, 250, 242, 0.78);
7
- --aa-panel-stroke: rgba(31, 42, 42, 0.11);
8
- --aa-accent: #0f8b8d;
9
- --aa-accent-warm: #dc6f36;
10
- --aa-accent-cool: #265f88;
11
- --aa-live: #1a9a63;
12
- --aa-error: #b24a2f;
13
- --aa-shadow: 0 18px 50px rgba(31, 42, 42, 0.08);
14
- --aa-serif: "Iowan Old Style", "Palatino Linotype", "Book Antiqua", serif;
15
- --aa-sans: "IBM Plex Sans", "Avenir Next", "Segoe UI", sans-serif;
16
- --aa-mono: "IBM Plex Mono", "SFMono-Regular", monospace;
17
- }
18
-
19
- * {
20
- box-sizing: border-box;
21
- }
22
-
23
- body {
24
- margin: 0;
25
- font-family: var(--aa-sans);
26
- color: var(--aa-ink);
27
- background:
28
- radial-gradient(circle at top left, rgba(15, 139, 141, 0.16), transparent 28%),
29
- radial-gradient(circle at top right, rgba(220, 111, 54, 0.16), transparent 22%),
30
- linear-gradient(180deg, #f8f3eb 0%, var(--aa-bg) 45%, var(--aa-bg-deep) 100%);
31
- }
32
-
33
- a {
34
- color: inherit;
35
- text-decoration: none;
36
- }
37
-
38
- button,
39
- input,
40
- select {
41
- font: inherit;
42
- }
43
-
44
- .aa-app {
45
- min-height: 100vh;
46
- padding: 24px;
47
- }
48
-
49
- .aa-page-shell,
50
- .aa-settings-shell {
51
- max-width: 1400px;
52
- margin: 0 auto;
53
- }
54
-
55
- .aa-hero,
56
- .aa-panel,
57
- .aa-widget,
58
- .aa-metric-card,
59
- .aa-asset-card {
60
- background: var(--aa-panel);
61
- border: 1px solid var(--aa-panel-stroke);
62
- box-shadow: var(--aa-shadow);
63
- backdrop-filter: blur(18px);
64
- }
65
-
66
- .aa-hero {
67
- display: flex;
68
- justify-content: space-between;
69
- gap: 24px;
70
- padding: 28px;
71
- border-radius: 28px;
72
- }
73
-
74
- .aa-kicker {
75
- margin: 0 0 8px;
76
- font-family: var(--aa-mono);
77
- font-size: 11px;
78
- letter-spacing: 0.12em;
79
- text-transform: uppercase;
80
- color: var(--aa-muted);
81
- }
82
-
83
- .aa-hero h1,
84
- .aa-panel h2,
85
- .aa-widget h2 {
86
- margin: 0;
87
- font-family: var(--aa-serif);
88
- line-height: 1;
89
- }
90
-
91
- .aa-hero h1 {
92
- font-size: clamp(2.6rem, 5vw, 4.3rem);
93
- max-width: 12ch;
94
- }
95
-
96
- .aa-hero-copy {
97
- max-width: 58ch;
98
- color: var(--aa-muted);
99
- }
100
-
101
- .aa-hero-status {
102
- min-width: 220px;
103
- display: flex;
104
- flex-direction: column;
105
- align-items: flex-end;
106
- gap: 12px;
107
- }
108
-
109
- .aa-metric-grid,
110
- .aa-main-grid,
111
- .aa-evidence-grid,
112
- .aa-asset-grid,
113
- .aa-settings-grid,
114
- .aa-form-grid {
115
- display: grid;
116
- gap: 18px;
117
- }
118
-
119
- .aa-metric-grid {
120
- grid-template-columns: repeat(4, minmax(0, 1fr));
121
- margin: 18px 0;
122
- }
123
-
124
- .aa-metric-card {
125
- border-radius: 22px;
126
- padding: 20px;
127
- }
128
-
129
- .aa-metric-card span,
130
- .aa-label {
131
- display: block;
132
- font-size: 0.82rem;
133
- color: var(--aa-muted);
134
- }
135
-
136
- .aa-metric-card strong {
137
- display: block;
138
- margin-top: 10px;
139
- font-size: 2.3rem;
140
- font-family: var(--aa-serif);
141
- }
142
-
143
- .aa-main-grid {
144
- grid-template-columns: 1.25fr 1fr;
145
- align-items: start;
146
- }
147
-
148
- .aa-panel,
149
- .aa-widget,
150
- .aa-asset-card {
151
- border-radius: 26px;
152
- padding: 22px;
153
- }
154
-
155
- .aa-panel-header,
156
- .aa-widget-header,
157
- .aa-asset-topline,
158
- .aa-widget-footer,
159
- .aa-inline-actions,
160
- .aa-settings-row {
161
- display: flex;
162
- justify-content: space-between;
163
- gap: 14px;
164
- align-items: flex-start;
165
- }
166
-
167
- .aa-world-grid {
168
- display: grid;
169
- grid-template-columns: minmax(260px, 0.9fr) 1.1fr;
170
- gap: 20px;
171
- align-items: center;
172
- }
173
-
174
- .aa-globe {
175
- position: relative;
176
- aspect-ratio: 1;
177
- border-radius: 999px;
178
- background:
179
- radial-gradient(circle at 30% 30%, rgba(15, 139, 141, 0.45), transparent 44%),
180
- radial-gradient(circle at 70% 65%, rgba(220, 111, 54, 0.24), transparent 32%),
181
- linear-gradient(180deg, #173838 0%, #0f6465 100%);
182
- overflow: hidden;
183
- box-shadow: inset 0 0 80px rgba(255, 255, 255, 0.15);
184
- }
185
-
186
- .aa-globe-ring {
187
- position: absolute;
188
- inset: 18%;
189
- border: 1px solid rgba(255, 255, 255, 0.22);
190
- border-radius: 999px;
191
- }
192
-
193
- .aa-globe-ring-two {
194
- inset: 8%;
195
- }
196
-
197
- .aa-globe-ring-three {
198
- inset: 32%;
199
- }
200
-
201
- .aa-globe-core {
202
- position: absolute;
203
- inset: 38%;
204
- display: grid;
205
- place-items: center;
206
- border-radius: 999px;
207
- background: rgba(255, 250, 242, 0.92);
208
- color: var(--aa-ink);
209
- font-family: var(--aa-mono);
210
- letter-spacing: 0.12em;
211
- text-transform: uppercase;
212
- font-size: 0.75rem;
213
- }
214
-
215
- .aa-country-list,
216
- .aa-feed,
217
- .aa-settings-stack {
218
- display: grid;
219
- gap: 12px;
220
- }
221
-
222
- .aa-country-row,
223
- .aa-feed-row,
224
- .aa-mini-row,
225
- .aa-settings-row {
226
- padding: 12px 0;
227
- border-top: 1px solid rgba(31, 42, 42, 0.08);
228
- }
229
-
230
- .aa-country-row:first-child,
231
- .aa-feed-row:first-child,
232
- .aa-mini-row:first-child,
233
- .aa-settings-row:first-child {
234
- border-top: 0;
235
- padding-top: 0;
236
- }
237
-
238
- .aa-country-row strong,
239
- .aa-mini-row strong,
240
- .aa-feed-row strong,
241
- .aa-settings-row strong {
242
- display: block;
243
- }
244
-
245
- .aa-country-row span,
246
- .aa-feed-row span,
247
- .aa-settings-row span {
248
- color: var(--aa-muted);
249
- font-size: 0.92rem;
250
- }
251
-
252
- .aa-country-bar {
253
- width: 100%;
254
- height: 8px;
255
- margin-top: 8px;
256
- border-radius: 999px;
257
- background: rgba(38, 95, 136, 0.12);
258
- overflow: hidden;
259
- }
260
-
261
- .aa-country-bar-fill {
262
- height: 100%;
263
- border-radius: 999px;
264
- background: linear-gradient(90deg, var(--aa-accent) 0%, var(--aa-accent-warm) 100%);
265
- }
266
-
267
- .aa-world-hot,
268
- .aa-status-pill {
269
- padding: 7px 12px;
270
- border-radius: 999px;
271
- font-size: 0.78rem;
272
- font-family: var(--aa-mono);
273
- letter-spacing: 0.08em;
274
- text-transform: uppercase;
275
- }
276
-
277
- .aa-world-hot,
278
- .aa-status-live,
279
- .aa-status-connected,
280
- .aa-status-streaming {
281
- background: rgba(26, 154, 99, 0.14);
282
- color: var(--aa-live);
283
- }
284
-
285
- .aa-status-error,
286
- .aa-status-attention {
287
- background: rgba(178, 74, 47, 0.14);
288
- color: var(--aa-error);
289
- }
290
-
291
- .aa-status-idle,
292
- .aa-status-pending,
293
- .aa-status-disconnected {
294
- background: rgba(38, 95, 136, 0.12);
295
- color: var(--aa-accent-cool);
296
- }
297
-
298
- .aa-mini-panel {
299
- background: rgba(255, 255, 255, 0.42);
300
- border-radius: 20px;
301
- padding: 18px;
302
- border: 1px solid rgba(31, 42, 42, 0.08);
303
- }
304
-
305
- .aa-mini-panel h3,
306
- .aa-assets-section h2 {
307
- margin: 0 0 12px;
308
- font-family: var(--aa-serif);
309
- }
310
-
311
- .aa-feed-row {
312
- display: flex;
313
- justify-content: space-between;
314
- gap: 12px;
315
- }
316
-
317
- .aa-feed-row time {
318
- white-space: nowrap;
319
- font-size: 0.85rem;
320
- color: var(--aa-muted);
321
- }
322
-
323
- .aa-assets-section {
324
- margin-top: 18px;
325
- }
326
-
327
- .aa-asset-grid {
328
- grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
329
- margin-top: 18px;
330
- }
331
-
332
- .aa-asset-card {
333
- display: grid;
334
- gap: 16px;
335
- }
336
-
337
- .aa-asset-metrics,
338
- .aa-asset-details,
339
- .aa-asset-evidence,
340
- .aa-widget-metrics {
341
- display: grid;
342
- grid-template-columns: repeat(3, minmax(0, 1fr));
343
- gap: 12px;
344
- }
345
-
346
- .aa-asset-metrics strong,
347
- .aa-widget-metrics strong {
348
- display: block;
349
- margin-top: 8px;
350
- font-family: var(--aa-serif);
351
- font-size: 1.6rem;
352
- }
353
-
354
- .aa-button {
355
- border: 0;
356
- border-radius: 999px;
357
- padding: 10px 14px;
358
- cursor: pointer;
359
- transition: transform 120ms ease, opacity 120ms ease;
360
- }
361
-
362
- .aa-button:hover {
363
- transform: translateY(-1px);
364
- }
365
-
366
- .aa-button-primary {
367
- background: var(--aa-ink);
368
- color: #fff;
369
- }
370
-
371
- .aa-button-secondary {
372
- background: rgba(15, 139, 141, 0.12);
373
- color: var(--aa-accent);
374
- }
375
-
376
- .aa-button-ghost {
377
- background: transparent;
378
- color: var(--aa-muted);
379
- border: 1px solid rgba(31, 42, 42, 0.12);
380
- }
381
-
382
- .aa-widget {
383
- max-width: 520px;
384
- margin: 0 auto;
385
- }
386
-
387
- .aa-widget-metrics {
388
- margin: 18px 0;
389
- }
390
-
391
- .aa-settings-grid {
392
- grid-template-columns: 1.15fr 0.85fr;
393
- }
394
-
395
- .aa-form-grid {
396
- grid-template-columns: repeat(2, minmax(0, 1fr));
397
- margin-top: 14px;
398
- }
399
-
400
- .aa-form-grid label,
401
- .aa-auth-box label {
402
- display: grid;
403
- gap: 8px;
404
- font-size: 0.92rem;
405
- color: var(--aa-muted);
406
- }
407
-
408
- .aa-form-grid input,
409
- .aa-form-grid select,
410
- .aa-auth-box input {
411
- border-radius: 14px;
412
- border: 1px solid rgba(31, 42, 42, 0.12);
413
- padding: 12px 14px;
414
- background: rgba(255, 255, 255, 0.72);
415
- }
416
-
417
- .aa-auth-box {
418
- display: grid;
419
- gap: 12px;
420
- margin-top: 16px;
421
- padding: 16px;
422
- border-radius: 18px;
423
- background: rgba(255, 255, 255, 0.48);
424
- }
425
-
426
- .aa-checkbox {
427
- display: flex !important;
428
- align-items: center;
429
- gap: 10px;
430
- }
431
-
432
- .aa-muted-note {
433
- color: var(--aa-muted);
434
- font-size: 0.92rem;
435
- display: inline-flex;
436
- align-items: center;
437
- }
438
-
439
- .aa-panel-warning {
440
- border-color: rgba(220, 111, 54, 0.28);
441
- }
442
-
443
- @media (max-width: 1100px) {
444
- .aa-metric-grid,
445
- .aa-main-grid,
446
- .aa-settings-grid,
447
- .aa-world-grid {
448
- grid-template-columns: 1fr;
449
- }
450
-
451
- .aa-hero {
452
- flex-direction: column;
453
- }
454
-
455
- .aa-hero-status {
456
- align-items: flex-start;
457
- }
458
- }
459
-
460
- @media (max-width: 720px) {
461
- .aa-app {
462
- padding: 14px;
463
- }
464
-
465
- .aa-metric-grid,
466
- .aa-form-grid,
467
- .aa-asset-metrics,
468
- .aa-asset-details,
469
- .aa-asset-evidence,
470
- .aa-widget-metrics {
471
- grid-template-columns: 1fr 1fr;
472
- }
473
-
474
- .aa-feed-row,
475
- .aa-panel-header,
476
- .aa-widget-header,
477
- .aa-widget-footer,
478
- .aa-settings-row,
479
- .aa-inline-actions {
480
- flex-direction: column;
481
- }
482
- }
483
-