@you-agent-factory/factory-visualizers 0.0.0 → 0.0.2

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.
@@ -0,0 +1,511 @@
1
+ @import "@xyflow/react/dist/style.css";
2
+
3
+ .factory-recording-topology-replay {
4
+ display: grid;
5
+ box-sizing: border-box;
6
+ inline-size: 100%;
7
+ min-inline-size: 0;
8
+ gap: 1rem;
9
+ }
10
+
11
+ .factory-emulator-controls {
12
+ display: grid;
13
+ gap: 1rem;
14
+ }
15
+
16
+ .factory-emulator-view {
17
+ display: grid;
18
+ box-sizing: border-box;
19
+ inline-size: 100%;
20
+ min-inline-size: 0;
21
+ gap: 1rem;
22
+ }
23
+
24
+ .factory-emulator-view__submission {
25
+ min-inline-size: 0;
26
+ }
27
+
28
+ .factory-emulator-failure {
29
+ box-sizing: border-box;
30
+ inline-size: 100%;
31
+ min-inline-size: 0;
32
+ padding: 1rem;
33
+ color: var(--color-on-surface);
34
+ background: var(--color-surface-container-low);
35
+ border: 1px solid var(--color-error);
36
+ border-radius: 1rem;
37
+ }
38
+
39
+ .factory-emulator-failure__content {
40
+ display: grid;
41
+ justify-items: center;
42
+ gap: 1rem;
43
+ padding: 1.5rem;
44
+ color: var(--color-on-surface-variant);
45
+ text-align: center;
46
+ background: var(--color-surface-container);
47
+ border: 1px dashed var(--color-outline-variant);
48
+ border-radius: 0.75rem;
49
+ }
50
+
51
+ .factory-emulator-failure__content > * {
52
+ margin: 0;
53
+ }
54
+
55
+ .factory-recording-topology-replay__tick {
56
+ margin: 0;
57
+ color: var(--color-on-surface-variant);
58
+ }
59
+
60
+ .factory-timeline-scrubber {
61
+ box-sizing: border-box;
62
+ inline-size: 100%;
63
+ min-inline-size: 0;
64
+ padding: 1rem;
65
+ color: var(--color-on-surface);
66
+ background: var(--color-surface-container-low);
67
+ border: 1px solid var(--color-outline-variant);
68
+ border-radius: 1rem;
69
+ }
70
+
71
+ .factory-topology-replay {
72
+ box-sizing: border-box;
73
+ position: relative;
74
+ inline-size: 100%;
75
+ block-size: clamp(28rem, 68vh, 48rem);
76
+ min-inline-size: 0;
77
+ overflow: hidden;
78
+ color: var(--color-on-surface);
79
+ background: var(--color-surface-container-low);
80
+ border: 1px solid var(--color-outline-variant);
81
+ border-radius: 1rem;
82
+ }
83
+
84
+ .factory-topology-replay--state {
85
+ display: grid;
86
+ place-items: center;
87
+ padding: 1rem;
88
+ }
89
+
90
+ .factory-topology-replay__state {
91
+ display: grid;
92
+ max-inline-size: 32rem;
93
+ justify-items: center;
94
+ gap: 1rem;
95
+ padding: 1.5rem;
96
+ color: var(--color-on-surface-variant);
97
+ text-align: center;
98
+ background: var(--color-surface-container);
99
+ border: 1px dashed var(--color-outline-variant);
100
+ border-radius: 0.75rem;
101
+ }
102
+
103
+ .factory-topology-replay__state[role="alert"] {
104
+ border-color: var(--color-error);
105
+ }
106
+
107
+ .factory-topology-replay__state > * {
108
+ margin: 0;
109
+ }
110
+
111
+ .factory-topology-replay .react-flow__node {
112
+ inline-size: 13.5rem;
113
+ }
114
+
115
+ .factory-topology-replay
116
+ .react-flow__node:has(.factory-topology-replay__annotation) {
117
+ inline-size: auto;
118
+ }
119
+
120
+ .factory-topology-replay__annotation-toggle {
121
+ position: absolute;
122
+ z-index: 5;
123
+ inset-block-start: 1rem;
124
+ inset-inline-end: 1rem;
125
+ padding: 0.5rem 0.75rem;
126
+ color: var(--color-on-surface);
127
+ cursor: pointer;
128
+ background: var(--color-surface-container-high);
129
+ border: 1px solid var(--color-outline);
130
+ border-radius: 0.5rem;
131
+ }
132
+
133
+ .factory-topology-replay__annotation-toggle:focus-visible {
134
+ outline: 0.1875rem solid var(--color-on-surface);
135
+ outline-offset: 0.25rem;
136
+ }
137
+
138
+ .factory-topology-replay__active-work {
139
+ position: absolute;
140
+ z-index: 5;
141
+ inset-block-start: 1rem;
142
+ inset-inline-start: 1rem;
143
+ box-sizing: border-box;
144
+ max-inline-size: calc(100% - 2rem);
145
+ padding: 0.5rem 0.75rem;
146
+ color: var(--color-on-surface);
147
+ background: var(--color-surface-container-high);
148
+ border: 1px solid var(--color-outline);
149
+ border-radius: 0.5rem;
150
+ }
151
+
152
+ .factory-topology-replay__active-work ul {
153
+ display: grid;
154
+ gap: 0.25rem;
155
+ padding: 0;
156
+ margin: 0;
157
+ list-style: none;
158
+ }
159
+
160
+ .factory-topology-replay__active-work li {
161
+ display: flex;
162
+ flex-wrap: wrap;
163
+ gap: 0.25rem 0.75rem;
164
+ justify-content: space-between;
165
+ }
166
+
167
+ .factory-topology-replay__active-work li > * {
168
+ min-inline-size: 0;
169
+ overflow-wrap: anywhere;
170
+ }
171
+
172
+ .factory-topology-replay__active-work p {
173
+ margin: 0.25rem 0 0;
174
+ color: var(--color-on-surface-variant);
175
+ }
176
+
177
+ .factory-topology-replay__annotation {
178
+ box-sizing: border-box;
179
+ display: grid;
180
+ gap: 0.5rem;
181
+ padding: 0.75rem;
182
+ margin: 0;
183
+ color: var(--color-on-surface);
184
+ pointer-events: none;
185
+ background: var(--color-surface-container);
186
+ border: 1px solid var(--color-outline);
187
+ border-radius: 0.75rem;
188
+ }
189
+
190
+ .factory-topology-replay__annotation[data-tone="accent"] {
191
+ border-color: var(--color-primary, var(--color-af-foundation-accent));
192
+ }
193
+
194
+ .factory-topology-replay__annotation[data-tone="info"] {
195
+ border-color: var(--color-info);
196
+ }
197
+
198
+ .factory-topology-replay__annotation[data-tone="success"] {
199
+ border-color: var(--color-success);
200
+ }
201
+
202
+ .factory-topology-replay__annotation[data-tone="warning"] {
203
+ border-color: var(--color-warning);
204
+ }
205
+
206
+ .factory-topology-replay__annotation[data-tone="danger"] {
207
+ border-color: var(--color-error);
208
+ }
209
+
210
+ .factory-topology-replay__annotation-title,
211
+ .factory-topology-replay__annotation-body {
212
+ overflow-wrap: anywhere;
213
+ }
214
+
215
+ .factory-topology-replay__annotation-body {
216
+ white-space: pre-wrap;
217
+ }
218
+
219
+ .factory-topology-replay__annotation--image {
220
+ display: block;
221
+ padding: 0;
222
+ overflow: hidden;
223
+ }
224
+
225
+ .factory-topology-replay__annotation-image {
226
+ display: block;
227
+ inline-size: 100%;
228
+ block-size: 100%;
229
+ object-fit: contain;
230
+ }
231
+
232
+ .factory-topology-replay__annotation-image-state {
233
+ display: grid;
234
+ min-block-size: 4rem;
235
+ place-items: center;
236
+ padding: 0.75rem;
237
+ color: var(--color-on-surface-variant);
238
+ text-align: center;
239
+ }
240
+
241
+ .factory-topology-replay__annotation-image-state[role="alert"] {
242
+ color: var(--color-error);
243
+ }
244
+
245
+ .factory-topology-replay__node-button,
246
+ .factory-topology-replay__node-static {
247
+ display: block;
248
+ inline-size: 100%;
249
+ margin: 0;
250
+ }
251
+
252
+ .factory-topology-replay__node-button:focus-visible {
253
+ border-radius: 0.625rem;
254
+ outline: 0.1875rem solid
255
+ var(--color-primary, var(--color-af-foundation-accent));
256
+ outline-offset: 0.25rem;
257
+ }
258
+
259
+ .factory-topology-replay__legend {
260
+ display: inline-block;
261
+ padding: 0.5rem 0.75rem;
262
+ margin: 0 0 0.75rem;
263
+ color: var(--color-on-surface);
264
+ background: var(--color-surface-container-low);
265
+ border: 1px solid var(--color-outline-variant);
266
+ border-radius: 0.5rem;
267
+ }
268
+
269
+ .factory-topology-replay__legend ul {
270
+ display: grid;
271
+ gap: 0.25rem;
272
+ padding: 0;
273
+ margin: 0.25rem 0 0;
274
+ list-style: none;
275
+ }
276
+
277
+ .factory-topology-replay__legend li {
278
+ display: flex;
279
+ align-items: center;
280
+ gap: 0.5rem;
281
+ }
282
+
283
+ .factory-topology-replay__legend-swatch {
284
+ inline-size: 1rem;
285
+ block-size: 0.1875rem;
286
+ background: var(--color-outline);
287
+ }
288
+
289
+ .factory-topology-replay__legend-swatch--active {
290
+ background: var(--color-warning);
291
+ }
292
+
293
+ .factory-topology-replay__node-title,
294
+ .factory-topology-replay__node-kind,
295
+ .factory-topology-replay__node-cue {
296
+ display: block;
297
+ min-inline-size: 0;
298
+ overflow-wrap: anywhere;
299
+ }
300
+
301
+ .factory-topology-replay__node-kind,
302
+ .factory-topology-replay__node-cue {
303
+ color: var(--color-on-surface-variant);
304
+ font-size: 0.75rem;
305
+ }
306
+
307
+ .factory-topology-replay__node-kind {
308
+ text-transform: capitalize;
309
+ }
310
+
311
+ .factory-topology-replay__node-cue {
312
+ margin-block-start: 0.25rem;
313
+ }
314
+
315
+ .factory-topology-replay__node-activity-detail {
316
+ min-inline-size: 0;
317
+ }
318
+
319
+ .factory-topology-replay__node-empty-state {
320
+ display: block;
321
+ margin-block-start: 0.25rem;
322
+ color: var(--color-on-surface-variant);
323
+ overflow-wrap: anywhere;
324
+ white-space: pre-wrap;
325
+ }
326
+
327
+ .factory-topology-replay__node-empty-state-image {
328
+ display: block;
329
+ max-inline-size: 100%;
330
+ max-block-size: 8rem;
331
+ margin-block-start: 0.5rem;
332
+ object-fit: contain;
333
+ }
334
+
335
+ .factory-topology-replay__node--active {
336
+ border-block-start: 0.25rem solid var(--color-warning);
337
+ }
338
+
339
+ .factory-topology-replay .react-flow__edge.animated path {
340
+ stroke: var(--color-warning);
341
+ stroke-width: 0.1875rem;
342
+ }
343
+
344
+ .factory-timeline-scrubber__header,
345
+ .factory-timeline-scrubber__controls {
346
+ display: flex;
347
+ flex-wrap: wrap;
348
+ align-items: center;
349
+ justify-content: space-between;
350
+ gap: 0.75rem 1rem;
351
+ }
352
+
353
+ .factory-timeline-scrubber__header > *,
354
+ .factory-timeline-scrubber__status,
355
+ .factory-timeline-scrubber__action-status {
356
+ margin: 0;
357
+ }
358
+
359
+ .factory-timeline-scrubber__position,
360
+ .factory-timeline-scrubber__status,
361
+ .factory-timeline-scrubber__action-status {
362
+ color: var(--color-on-surface-variant);
363
+ }
364
+
365
+ .factory-timeline-scrubber__controls {
366
+ margin-block-start: 1rem;
367
+ }
368
+
369
+ .factory-timeline-scrubber__range {
370
+ flex: 1 1 18rem;
371
+ min-inline-size: min(100%, 12rem);
372
+ accent-color: var(--color-primary, var(--color-af-foundation-accent));
373
+ cursor: pointer;
374
+ }
375
+
376
+ .factory-timeline-scrubber__range:focus {
377
+ outline: 0.1875rem solid
378
+ var(--color-primary, var(--color-af-foundation-accent));
379
+ outline-offset: 0.25rem;
380
+ }
381
+
382
+ .factory-timeline-scrubber__range:disabled {
383
+ cursor: not-allowed;
384
+ opacity: 0.55;
385
+ }
386
+
387
+ .factory-timeline-scrubber__status {
388
+ margin-block-start: 0.75rem;
389
+ }
390
+
391
+ .factory-timeline-scrubber__action-status {
392
+ margin-block-start: 0.25rem;
393
+ }
394
+
395
+ .factory-work-progress {
396
+ box-sizing: border-box;
397
+ inline-size: 100%;
398
+ min-inline-size: 0;
399
+ padding: 1rem;
400
+ color: var(--color-on-surface);
401
+ background: var(--color-surface-container-low);
402
+ border: 1px solid var(--color-outline-variant);
403
+ border-radius: 1rem;
404
+ }
405
+
406
+ .factory-work-progress__header {
407
+ display: flex;
408
+ flex-wrap: wrap;
409
+ align-items: baseline;
410
+ justify-content: space-between;
411
+ gap: 0.5rem 1rem;
412
+ }
413
+
414
+ .factory-work-progress__header > * {
415
+ margin: 0;
416
+ }
417
+
418
+ .factory-work-progress__total {
419
+ color: var(--color-on-surface-variant);
420
+ }
421
+
422
+ .factory-work-progress__categories {
423
+ display: grid;
424
+ grid-template-columns: minmax(0, 1fr);
425
+ gap: 0.75rem;
426
+ padding: 0;
427
+ margin: 1rem 0 0;
428
+ list-style: none;
429
+ }
430
+
431
+ .factory-work-progress__category {
432
+ display: flex;
433
+ min-inline-size: 0;
434
+ align-items: center;
435
+ gap: 0.625rem;
436
+ padding: 0.75rem;
437
+ background: var(--color-surface-container);
438
+ border: 1px solid var(--color-outline);
439
+ border-inline-start: 0.25rem solid var(--color-info);
440
+ border-radius: 0.75rem;
441
+ }
442
+
443
+ .factory-work-progress__category[data-work-progress-category="active"] {
444
+ border-inline-start-color: var(--color-warning);
445
+ }
446
+
447
+ .factory-work-progress__category[data-work-progress-category="completed"] {
448
+ border-inline-start-color: var(--color-success);
449
+ }
450
+
451
+ .factory-work-progress__category[data-work-progress-category="failed"] {
452
+ border-inline-start-color: var(--color-error);
453
+ }
454
+
455
+ .factory-work-progress__category[data-work-progress-category="unclassified"] {
456
+ border-inline-start-color: var(--color-outline-variant);
457
+ }
458
+
459
+ .factory-work-progress__cue {
460
+ display: inline-grid;
461
+ flex: 0 0 1.75rem;
462
+ block-size: 1.75rem;
463
+ place-items: center;
464
+ font-weight: 700;
465
+ border: 1px solid currentColor;
466
+ border-radius: 999px;
467
+ }
468
+
469
+ .factory-work-progress__message {
470
+ min-inline-size: 0;
471
+ overflow-wrap: anywhere;
472
+ }
473
+
474
+ .factory-work-progress__empty {
475
+ padding: 1rem;
476
+ margin: 1rem 0 0;
477
+ color: var(--color-on-surface-variant);
478
+ text-align: center;
479
+ background: var(--color-surface-container);
480
+ border: 1px dashed var(--color-outline-variant);
481
+ border-radius: 0.75rem;
482
+ }
483
+
484
+ @media (min-width: 34rem) {
485
+ .factory-work-progress__categories {
486
+ grid-template-columns: repeat(2, minmax(0, 1fr));
487
+ }
488
+ }
489
+
490
+ @media (min-width: 60rem) {
491
+ .factory-work-progress__categories {
492
+ grid-template-columns: repeat(5, minmax(0, 1fr));
493
+ }
494
+ }
495
+
496
+ @media (prefers-reduced-motion: reduce) {
497
+ .factory-topology-replay *,
498
+ .factory-timeline-scrubber *,
499
+ .factory-emulator-controls *,
500
+ .factory-emulator-view *,
501
+ .factory-work-progress * {
502
+ scroll-behavior: auto;
503
+ animation-duration: 0.01ms;
504
+ animation-iteration-count: 1;
505
+ transition-duration: 0.01ms;
506
+ }
507
+
508
+ .factory-topology-replay .react-flow__edge.animated path {
509
+ animation: none;
510
+ }
511
+ }
@@ -0,0 +1,27 @@
1
+ export type FactoryVisualizerErrorKind = "endpoint" | "layout" | "projection" | "react-flow" | "render";
2
+ export interface FactoryVisualizerErrorCause {
3
+ code?: string;
4
+ name: string;
5
+ }
6
+ export interface FactoryVisualizerError {
7
+ cause?: FactoryVisualizerErrorCause;
8
+ kind: FactoryVisualizerErrorKind;
9
+ message: string;
10
+ recoverable: boolean;
11
+ }
12
+ export interface FactoryVisualizationLayoutDiagnostic {
13
+ issues: readonly Pick<FactoryVisualizationLayoutIssue, "category" | "code" | "path">[];
14
+ kind: "layout-validation";
15
+ message: string;
16
+ recoverable: true;
17
+ }
18
+ export type FactoryTopologyReplayError = FactoryVisualizerError | FactoryVisualizationLayoutDiagnostic;
19
+ export declare class FactoryVisualizerInternalError extends Error {
20
+ readonly kind: FactoryVisualizerErrorKind;
21
+ readonly originalCause: unknown;
22
+ constructor(kind: FactoryVisualizerErrorKind, cause?: unknown);
23
+ }
24
+ export declare function toFactoryVisualizerError(kind: FactoryVisualizerErrorKind, cause?: unknown): FactoryVisualizerError;
25
+ export declare function normalizeFactoryVisualizerError(error: unknown, fallbackKind: FactoryVisualizerErrorKind): FactoryVisualizerError;
26
+ export declare function factoryVisualizerErrorKey(error: FactoryVisualizerError): string;
27
+ import type { FactoryVisualizationLayoutIssue } from "@you-agent-factory/client";
@@ -0,0 +1,19 @@
1
+ import type { FactoryWorkProgressCategory, FactoryWorkProgressProjection } from "@you-agent-factory/factory-replay";
2
+ import type { HTMLAttributes } from "react";
3
+ export interface WorkProgressCategoryMessage {
4
+ plural: (formattedCount: string) => string;
5
+ singular: (formattedCount: string) => string;
6
+ }
7
+ export interface WorkProgressVisualizerMessages {
8
+ categories: Record<FactoryWorkProgressCategory, WorkProgressCategoryMessage>;
9
+ empty: string;
10
+ regionLabel: string;
11
+ title: string;
12
+ total: (formattedTotal: string) => string;
13
+ }
14
+ export interface WorkProgressVisualizerProps extends Omit<HTMLAttributes<HTMLElement>, "children"> {
15
+ formatNumber: (value: number) => string;
16
+ messages: WorkProgressVisualizerMessages;
17
+ projection: FactoryWorkProgressProjection;
18
+ }
19
+ export declare function WorkProgressVisualizer({ className, formatNumber, messages, projection, ...sectionProps }: WorkProgressVisualizerProps): import("react").JSX.Element;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@you-agent-factory/factory-visualizers",
3
- "version": "0.0.0",
3
+ "version": "0.0.2",
4
4
  "description": "Controlled React visualizers for caller-prepared Factory replay projections.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -38,6 +38,7 @@
38
38
  "check:pack": "node scripts/verify-package-pack.mjs",
39
39
  "check:package-boundary": "node scripts/check-package-boundary.mjs",
40
40
  "lint": "biome check .",
41
+ "prepack": "bun run build",
41
42
  "prepare:dependencies": "bun run --cwd ../client build && bun run --cwd ../components build && bun run --cwd ../factory-replay build",
42
43
  "storybook": "storybook dev -p 6027",
43
44
  "test": "vitest run --config vitest.config.ts",
@@ -47,12 +48,12 @@
47
48
  "verify": "bun run typecheck && bun run lint && bun run test && bun run build && bun run test-storybook && bun run check:package-boundary && bun run check:pack && bun run check:installed-consumer"
48
49
  },
49
50
  "dependencies": {
50
- "@you-agent-factory/components": "0.0.0",
51
+ "@you-agent-factory/components": "0.0.2",
51
52
  "@xyflow/react": "^12.10.2"
52
53
  },
53
54
  "peerDependencies": {
54
- "@you-agent-factory/client": "0.0.0",
55
- "@you-agent-factory/factory-replay": "0.0.0",
55
+ "@you-agent-factory/client": "0.0.2",
56
+ "@you-agent-factory/factory-replay": "0.0.2",
56
57
  "react": "^19.0.0",
57
58
  "react-dom": "^19.0.0"
58
59
  },