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

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/dist/styles.css CHANGED
@@ -1,18 +1,7 @@
1
1
  @import "@xyflow/react/dist/style.css";
2
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
-
3
+ .factory-recording-topology-replay,
4
+ .factory-emulator-controls,
16
5
  .factory-emulator-view {
17
6
  display: grid;
18
7
  box-sizing: border-box;
@@ -25,18 +14,26 @@
25
14
  min-inline-size: 0;
26
15
  }
27
16
 
28
- .factory-emulator-failure {
17
+ .factory-emulator-failure,
18
+ .factory-timeline-scrubber,
19
+ .factory-work-progress {
29
20
  box-sizing: border-box;
30
21
  inline-size: 100%;
31
22
  min-inline-size: 0;
32
23
  padding: 1rem;
33
24
  color: var(--color-on-surface);
34
25
  background: var(--color-surface-container-low);
35
- border: 1px solid var(--color-error);
26
+ border: 1px solid var(--color-outline-variant);
36
27
  border-radius: 1rem;
37
28
  }
38
29
 
39
- .factory-emulator-failure__content {
30
+ .factory-emulator-failure {
31
+ border-color: var(--color-error);
32
+ }
33
+
34
+ .factory-emulator-failure__content,
35
+ .factory-topology-replay__state,
36
+ .factory-work-progress__empty {
40
37
  display: grid;
41
38
  justify-items: center;
42
39
  gap: 1rem;
@@ -48,29 +45,23 @@
48
45
  border-radius: 0.75rem;
49
46
  }
50
47
 
51
- .factory-emulator-failure__content > * {
48
+ .factory-emulator-failure__content > *,
49
+ .factory-topology-replay__state > * {
52
50
  margin: 0;
53
51
  }
54
52
 
55
- .factory-recording-topology-replay__tick {
53
+ .factory-recording-topology-replay__tick,
54
+ .factory-timeline-scrubber__position,
55
+ .factory-timeline-scrubber__status,
56
+ .factory-timeline-scrubber__action-status,
57
+ .factory-work-progress__total {
56
58
  margin: 0;
57
59
  color: var(--color-on-surface-variant);
58
60
  }
59
61
 
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
62
  .factory-topology-replay {
72
- box-sizing: border-box;
73
63
  position: relative;
64
+ box-sizing: border-box;
74
65
  inline-size: 100%;
75
66
  block-size: clamp(28rem, 68vh, 48rem);
76
67
  min-inline-size: 0;
@@ -88,261 +79,16 @@
88
79
  }
89
80
 
90
81
  .factory-topology-replay__state {
91
- display: grid;
92
82
  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
83
  }
102
84
 
103
85
  .factory-topology-replay__state[role="alert"] {
104
86
  border-color: var(--color-error);
105
87
  }
106
88
 
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
89
  .factory-timeline-scrubber__header,
345
- .factory-timeline-scrubber__controls {
90
+ .factory-timeline-scrubber__controls,
91
+ .factory-work-progress__header {
346
92
  display: flex;
347
93
  flex-wrap: wrap;
348
94
  align-items: center;
@@ -352,16 +98,11 @@
352
98
 
353
99
  .factory-timeline-scrubber__header > *,
354
100
  .factory-timeline-scrubber__status,
355
- .factory-timeline-scrubber__action-status {
101
+ .factory-timeline-scrubber__action-status,
102
+ .factory-work-progress__header > * {
356
103
  margin: 0;
357
104
  }
358
105
 
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
106
  .factory-timeline-scrubber__controls {
366
107
  margin-block-start: 1rem;
367
108
  }
@@ -392,33 +133,6 @@
392
133
  margin-block-start: 0.25rem;
393
134
  }
394
135
 
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
136
  .factory-work-progress__categories {
423
137
  display: grid;
424
138
  grid-template-columns: minmax(0, 1fr);
@@ -474,11 +188,6 @@
474
188
  .factory-work-progress__empty {
475
189
  padding: 1rem;
476
190
  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
191
  }
483
192
 
484
193
  @media (min-width: 34rem) {
@@ -504,8 +213,4 @@
504
213
  animation-iteration-count: 1;
505
214
  transition-duration: 0.01ms;
506
215
  }
507
-
508
- .factory-topology-replay .react-flow__edge.animated path {
509
- animation: none;
510
- }
511
216
  }
@@ -9,13 +9,7 @@ export interface FactoryVisualizerError {
9
9
  message: string;
10
10
  recoverable: boolean;
11
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;
12
+ export type FactoryTopologyReplayError = FactoryVisualizerError;
19
13
  export declare class FactoryVisualizerInternalError extends Error {
20
14
  readonly kind: FactoryVisualizerErrorKind;
21
15
  readonly originalCause: unknown;
@@ -24,4 +18,3 @@ export declare class FactoryVisualizerInternalError extends Error {
24
18
  export declare function toFactoryVisualizerError(kind: FactoryVisualizerErrorKind, cause?: unknown): FactoryVisualizerError;
25
19
  export declare function normalizeFactoryVisualizerError(error: unknown, fallbackKind: FactoryVisualizerErrorKind): FactoryVisualizerError;
26
20
  export declare function factoryVisualizerErrorKey(error: FactoryVisualizerError): string;
27
- import type { FactoryVisualizationLayoutIssue } from "@you-agent-factory/client";
@@ -16,4 +16,4 @@ export interface WorkProgressVisualizerProps extends Omit<HTMLAttributes<HTMLEle
16
16
  messages: WorkProgressVisualizerMessages;
17
17
  projection: FactoryWorkProgressProjection;
18
18
  }
19
- export declare function WorkProgressVisualizer({ className, formatNumber, messages, projection, ...sectionProps }: WorkProgressVisualizerProps): import("react").JSX.Element;
19
+ export declare function WorkProgressVisualizer({ className, formatNumber, messages, projection, ...sectionProps }: WorkProgressVisualizerProps): import("react/jsx-runtime").JSX.Element;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@you-agent-factory/factory-visualizers",
3
- "version": "0.0.2",
4
- "description": "Controlled React visualizers for caller-prepared Factory replay projections.",
3
+ "version": "0.0.6",
4
+ "description": "Controlled React hosts for the canonical Factory semantic graph.",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -32,14 +32,14 @@
32
32
  "./examples/support-playback.factory-recording.v1.json": "./examples/support-playback.factory-recording.v1.json"
33
33
  },
34
34
  "scripts": {
35
- "build": "node scripts/build-package.mjs",
35
+ "build": "bun run prepare:dependencies && bun run build:current",
36
+ "build:current": "node scripts/build-package.mjs",
36
37
  "build-storybook": "storybook build --loglevel warn",
37
38
  "check:installed-consumer": "node scripts/verify-installed-consumer.mjs",
38
39
  "check:pack": "node scripts/verify-package-pack.mjs",
39
40
  "check:package-boundary": "node scripts/check-package-boundary.mjs",
40
41
  "lint": "biome check .",
41
- "prepack": "bun run build",
42
- "prepare:dependencies": "bun run --cwd ../client build && bun run --cwd ../components build && bun run --cwd ../factory-replay build",
42
+ "prepare:dependencies": "bun run --cwd ../client build && bun run --cwd ../components build && bun run --cwd ../factory-replay build && bun run --cwd ../factory-graph build",
43
43
  "storybook": "storybook dev -p 6027",
44
44
  "test": "vitest run --config vitest.config.ts",
45
45
  "test-storybook": "bun run build-storybook && bun run verify:accessibility-responsive",
@@ -48,12 +48,13 @@
48
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"
49
49
  },
50
50
  "dependencies": {
51
- "@you-agent-factory/components": "0.0.2",
51
+ "@you-agent-factory/components": "0.0.6",
52
+ "@you-agent-factory/factory-graph": "0.0.0",
52
53
  "@xyflow/react": "^12.10.2"
53
54
  },
54
55
  "peerDependencies": {
55
- "@you-agent-factory/client": "0.0.2",
56
- "@you-agent-factory/factory-replay": "0.0.2",
56
+ "@you-agent-factory/client": "0.0.6",
57
+ "@you-agent-factory/factory-replay": "0.0.6",
57
58
  "react": "^19.0.0",
58
59
  "react-dom": "^19.0.0"
59
60
  },
@@ -66,8 +67,9 @@
66
67
  "@types/react": "^19.2.2",
67
68
  "@types/react-dom": "^19.2.2",
68
69
  "@vitejs/plugin-react-swc": "^4.1.0",
69
- "@you-agent-factory/client": "file:../client",
70
- "@you-agent-factory/factory-replay": "file:../factory-replay",
70
+ "@you-agent-factory/client": "0.0.6",
71
+ "@you-agent-factory/factory-graph": "workspace:*",
72
+ "@you-agent-factory/factory-replay": "0.0.6",
71
73
  "axe-core": "^4.10.2",
72
74
  "happy-dom": "^20.9.0",
73
75
  "jest-axe": "^10.0.0",
@@ -1,11 +0,0 @@
1
- import type { FactoryActivityProjection } from "@you-agent-factory/factory-replay";
2
- export interface FactoryTopologyActiveWorkRow {
3
- durationTicks: number;
4
- id: string;
5
- }
6
- export interface FactoryTopologyActiveWorkSummary {
7
- overflowCount: number;
8
- rows: readonly FactoryTopologyActiveWorkRow[];
9
- }
10
- /** Derives bounded, read-only Work activity from the prepared projection. */
11
- export declare function projectFactoryTopologyActiveWork(activity: FactoryActivityProjection): FactoryTopologyActiveWorkSummary;
@@ -1,14 +0,0 @@
1
- /** Optional presentation regions for the public, read-only Factory topology. */
2
- export type FactoryTopologyChromeRegion = "legend" | "background" | "viewportControls" | "visibilityControls";
3
- export type FactoryTopologyChromePreset = "full" | "minimal" | "none";
4
- export interface FactoryTopologyChromeConfiguration {
5
- background?: boolean;
6
- legend?: boolean;
7
- preset?: FactoryTopologyChromePreset;
8
- viewportControls?: boolean;
9
- visibilityControls?: boolean;
10
- }
11
- export type ResolvedFactoryTopologyChrome = Readonly<Record<FactoryTopologyChromeRegion, boolean>>;
12
- export declare const DEFAULT_FACTORY_TOPOLOGY_CHROME_PRESET: FactoryTopologyChromePreset;
13
- /** Resolves presentation without receiving or changing replay projection data. */
14
- export declare function resolveFactoryTopologyChrome(configuration?: FactoryTopologyChromeConfiguration): ResolvedFactoryTopologyChrome;
@@ -1,12 +0,0 @@
1
- import type { Edge, Node } from "@xyflow/react";
2
- import type { FactoryVisualizationLayoutV1 } from "@you-agent-factory/client";
3
- import type { FactoryTopologyNode } from "@you-agent-factory/factory-replay";
4
- import type { FactoryTopologyReplayMessages, FactoryTopologyReplayProjection } from "./factory-topology-replay";
5
- import type { AnnotationNodeData, TopologyNodeData } from "./factory-topology-replay-nodes";
6
- export interface FactoryTopologyFlowProjection {
7
- edges: Edge[];
8
- nodes: Node<TopologyNodeData | AnnotationNodeData>[];
9
- validEndpoints: boolean;
10
- }
11
- /** Convert immutable replay projections into disposable React Flow view data. */
12
- export declare function projectFactoryTopologyFlow(projection: FactoryTopologyReplayProjection, messages: FactoryTopologyReplayMessages, selectedNodeId: string | undefined, onSelectNode: ((node: FactoryTopologyNode) => void) | undefined, prefersReducedMotion?: boolean, layout?: FactoryVisualizationLayoutV1): FactoryTopologyFlowProjection;
@@ -1,32 +0,0 @@
1
- import type { Node, NodeProps } from "@xyflow/react";
2
- import type { FactoryVisualizationAnnotation, FactoryVisualizationNodeEmptyState } from "@you-agent-factory/client";
3
- import type { FactoryTopologyNode } from "@you-agent-factory/factory-replay";
4
- import type { FactoryTopologyReplayMessages } from "./factory-topology-replay";
5
- export interface TopologyNodeData extends Record<string, unknown> {
6
- activityCount: number;
7
- emptyState?: FactoryVisualizationNodeEmptyState["content"];
8
- messages: FactoryTopologyReplayMessages;
9
- node: FactoryTopologyNode;
10
- occupancy?: {
11
- capacity?: number;
12
- evidence: "known" | "unavailable";
13
- occupied?: number;
14
- };
15
- onSelectNode?: (node: FactoryTopologyNode) => void;
16
- selected: boolean;
17
- workStateCount?: {
18
- count?: number;
19
- evidence: "known" | "unavailable";
20
- };
21
- }
22
- export interface AnnotationNodeData extends Record<string, unknown> {
23
- annotation: FactoryVisualizationAnnotation;
24
- messages: FactoryTopologyReplayMessages;
25
- }
26
- export declare const nodeTypes: {
27
- factoryTopologyAnnotation: typeof FactoryTopologyAnnotationView;
28
- factoryTopologyNode: typeof FactoryTopologyNodeView;
29
- };
30
- declare function FactoryTopologyAnnotationView({ data, }: NodeProps<Node<AnnotationNodeData>>): import("react").JSX.Element;
31
- declare function FactoryTopologyNodeView({ data }: NodeProps<Node<TopologyNodeData>>): import("react").JSX.Element;
32
- export {};