@visual-layer/core 1.0.0

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 (61) hide show
  1. package/dist/artifact-store/index.d.ts +70 -0
  2. package/dist/artifact-store/index.d.ts.map +1 -0
  3. package/dist/artifact-store/index.js +289 -0
  4. package/dist/artifact-store/index.js.map +1 -0
  5. package/dist/browser-adapter.d.ts +1362 -0
  6. package/dist/browser-adapter.d.ts.map +1 -0
  7. package/dist/browser-adapter.js +264 -0
  8. package/dist/browser-adapter.js.map +1 -0
  9. package/dist/confidence.d.ts +8 -0
  10. package/dist/confidence.d.ts.map +1 -0
  11. package/dist/confidence.js +28 -0
  12. package/dist/confidence.js.map +1 -0
  13. package/dist/errors.d.ts +41 -0
  14. package/dist/errors.d.ts.map +1 -0
  15. package/dist/errors.js +33 -0
  16. package/dist/errors.js.map +1 -0
  17. package/dist/geometry/bbox.d.ts +30 -0
  18. package/dist/geometry/bbox.d.ts.map +1 -0
  19. package/dist/geometry/bbox.js +77 -0
  20. package/dist/geometry/bbox.js.map +1 -0
  21. package/dist/geometry/coordinates.d.ts +26 -0
  22. package/dist/geometry/coordinates.d.ts.map +1 -0
  23. package/dist/geometry/coordinates.js +25 -0
  24. package/dist/geometry/coordinates.js.map +1 -0
  25. package/dist/geometry/index.d.ts +3 -0
  26. package/dist/geometry/index.d.ts.map +1 -0
  27. package/dist/geometry/index.js +3 -0
  28. package/dist/geometry/index.js.map +1 -0
  29. package/dist/ids.d.ts +7 -0
  30. package/dist/ids.d.ts.map +1 -0
  31. package/dist/ids.js +21 -0
  32. package/dist/ids.js.map +1 -0
  33. package/dist/index.d.ts +17 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +17 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/provenance.d.ts +7 -0
  38. package/dist/provenance.d.ts.map +1 -0
  39. package/dist/provenance.js +9 -0
  40. package/dist/provenance.js.map +1 -0
  41. package/dist/redaction/index.d.ts +28 -0
  42. package/dist/redaction/index.d.ts.map +1 -0
  43. package/dist/redaction/index.js +97 -0
  44. package/dist/redaction/index.js.map +1 -0
  45. package/dist/schema/index.d.ts +383 -0
  46. package/dist/schema/index.d.ts.map +1 -0
  47. package/dist/schema/index.js +96 -0
  48. package/dist/schema/index.js.map +1 -0
  49. package/dist/text/index.d.ts +18 -0
  50. package/dist/text/index.d.ts.map +1 -0
  51. package/dist/text/index.js +60 -0
  52. package/dist/text/index.js.map +1 -0
  53. package/dist/trace/index.d.ts +64 -0
  54. package/dist/trace/index.d.ts.map +1 -0
  55. package/dist/trace/index.js +63 -0
  56. package/dist/trace/index.js.map +1 -0
  57. package/dist/warnings.d.ts +7 -0
  58. package/dist/warnings.d.ts.map +1 -0
  59. package/dist/warnings.js +10 -0
  60. package/dist/warnings.js.map +1 -0
  61. package/package.json +33 -0
@@ -0,0 +1,96 @@
1
+ /**
2
+ * ScreenGraph schema — the canonical v0 data contract.
3
+ *
4
+ * See VISION_LAYER_MVP_PLAN.md §6 and §18.2 for the accepted contract decisions:
5
+ * - bbox is always [x, y, width, height] in the declared coordinate space.
6
+ * - confidence is always a finite number in [0, 1].
7
+ * - compare_graphs output fields are missingFromActual / extraInActual.
8
+ */
9
+ import { z } from 'zod';
10
+ /* ---------- primitives ---------- */
11
+ /** `[x, y, width, height]`. width/height must be non-negative. */
12
+ export const Bbox = z
13
+ .tuple([z.number().finite(), z.number().finite(), z.number().min(0).finite(), z.number().min(0).finite()])
14
+ .refine((b) => Number.isFinite(b[0]) && Number.isFinite(b[1]), { message: 'bbox origin must be finite' });
15
+ export const CoordinateSpace = z.enum(['viewport', 'screenshot', 'figma']);
16
+ export const ScreenGraphSource = z.enum(['browser', 'figma', 'image', 'hybrid']);
17
+ export const InteractableSource = z.enum(['dom', 'ax', 'figma', 'ocr', 'vision']);
18
+ export const WarningSeverity = z.enum(['info', 'warning', 'error']);
19
+ /** Finite number in [0, 1]. */
20
+ export const Confidence = z.number().finite().min(0).max(1);
21
+ /** Per-dimension grounding scores, each in [0, 1]. */
22
+ export const ScoreBreakdown = z
23
+ .object({
24
+ text: z.number().min(0).max(1).optional(),
25
+ role: z.number().min(0).max(1).optional(),
26
+ bbox: z.number().min(0).max(1).optional(),
27
+ source: z.number().min(0).max(1).optional(),
28
+ })
29
+ .catchall(z.number().min(0).max(1));
30
+ /* ---------- structural types ---------- */
31
+ export const Viewport = z.object({
32
+ width: z.number().min(0).finite(),
33
+ height: z.number().min(0).finite(),
34
+ dpr: z.number().positive().finite().optional(),
35
+ url: z.string().optional(),
36
+ });
37
+ export const Screenshot = z.object({
38
+ artifactId: z.string().min(1),
39
+ sha256: z.string().length(64),
40
+ width: z.number().int().positive(),
41
+ height: z.number().int().positive(),
42
+ mimeType: z.enum(['image/png', 'image/jpeg']),
43
+ });
44
+ export const AttributeValue = z.union([z.string(), z.number(), z.boolean()]);
45
+ export const Interactable = z.object({
46
+ id: z.string().min(1),
47
+ role: z.string().optional(),
48
+ name: z.string().optional(),
49
+ text: z.string().optional(),
50
+ bbox: Bbox,
51
+ coordinateSpace: CoordinateSpace,
52
+ source: z.array(InteractableSource).min(1),
53
+ confidence: Confidence,
54
+ domPath: z.string().optional(),
55
+ axRef: z.string().optional(),
56
+ figmaNodeId: z.string().optional(),
57
+ attributes: z.record(z.string(), AttributeValue).optional(),
58
+ });
59
+ export const Warning = z.object({
60
+ code: z.string().min(1),
61
+ message: z.string().min(1),
62
+ severity: WarningSeverity,
63
+ targetId: z.string().optional(),
64
+ });
65
+ export const Provenance = z.object({
66
+ /** Dotted path to the field this provenance describes, e.g. `interactables[3].bbox`. */
67
+ field: z.string().min(1),
68
+ /** Origin of the value. Either a known source or a free-form adapter label. */
69
+ source: z.union([InteractableSource, z.string().min(1)]),
70
+ confidence: Confidence.optional(),
71
+ note: z.string().optional(),
72
+ });
73
+ /* ---------- graph ---------- */
74
+ /**
75
+ * The MVP freezes domNodes / axNodes / figmaNodes / ocrBlocks / mappings as
76
+ * opaque `unknown[]` — adapters may attach raw upstream payloads, but core
77
+ * only reasons over `interactables`. Concrete shapes land in later versions.
78
+ */
79
+ export const ScreenGraph = z.object({
80
+ id: z.string().min(1),
81
+ version: z.literal('0.1'),
82
+ source: ScreenGraphSource,
83
+ createdAt: z.string().min(1),
84
+ viewport: Viewport.optional(),
85
+ screenshot: Screenshot.optional(),
86
+ interactables: z.array(Interactable),
87
+ domNodes: z.array(z.unknown()).optional(),
88
+ axNodes: z.array(z.unknown()).optional(),
89
+ figmaNodes: z.array(z.unknown()).optional(),
90
+ ocrBlocks: z.array(z.unknown()).optional(),
91
+ mappings: z.array(z.unknown()).default([]),
92
+ warnings: z.array(Warning).default([]),
93
+ provenance: z.array(Provenance).default([]),
94
+ });
95
+ export const SCHEMA_VERSION = '0.1';
96
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Text primitives shared by grounding, compare, and adapters.
3
+ * Core owns these so no other package reinvents them (§18.2).
4
+ */
5
+ /** Lowercase, collapse whitespace, trim surrounding punctuation/whitespace. */
6
+ export declare function normalizeText(input: string): string;
7
+ /** Split normalized text into non-empty word tokens. */
8
+ export declare function tokenizeText(input: string): string[];
9
+ /**
10
+ * Deterministic text similarity in [0, 1].
11
+ * - exact match (after normalize): 1
12
+ * - token-set Jaccard otherwise, with a substring-containment bonus
13
+ * - empty/whitespace inputs: 0
14
+ */
15
+ export declare function compareText(a: string, b: string): number;
16
+ /** Token overlap count (for reading-order / duplicate-label detection). */
17
+ export declare function tokenOverlap(a: string, b: string): number;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/text/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMnD;AAED,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAIpD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAqBxD;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAMzD"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Text primitives shared by grounding, compare, and adapters.
3
+ * Core owns these so no other package reinvents them (§18.2).
4
+ */
5
+ /** Lowercase, collapse whitespace, trim surrounding punctuation/whitespace. */
6
+ export function normalizeText(input) {
7
+ return input
8
+ .toLowerCase()
9
+ .replace(/\s+/g, ' ')
10
+ .replace(/^[^\p{L}\p{N}]+|[^\p{L}\p{N}]+$/gu, '')
11
+ .trim();
12
+ }
13
+ /** Split normalized text into non-empty word tokens. */
14
+ export function tokenizeText(input) {
15
+ return normalizeText(input)
16
+ .split(/[^\p{L}\p{N}]+/u)
17
+ .filter((t) => t.length > 0);
18
+ }
19
+ /**
20
+ * Deterministic text similarity in [0, 1].
21
+ * - exact match (after normalize): 1
22
+ * - token-set Jaccard otherwise, with a substring-containment bonus
23
+ * - empty/whitespace inputs: 0
24
+ */
25
+ export function compareText(a, b) {
26
+ const na = normalizeText(a);
27
+ const nb = normalizeText(b);
28
+ if (na.length === 0 || nb.length === 0)
29
+ return 0;
30
+ if (na === nb)
31
+ return 1;
32
+ const ta = new Set(tokenizeText(a));
33
+ const tb = new Set(tokenizeText(b));
34
+ if (ta.size === 0 || tb.size === 0)
35
+ return 0;
36
+ let inter = 0;
37
+ for (const t of ta)
38
+ if (tb.has(t))
39
+ inter++;
40
+ const unionSize = ta.size + tb.size - inter;
41
+ const jaccard = unionSize === 0 ? 0 : inter / unionSize;
42
+ // substring bonus: "save changes" inside "click save changes button"
43
+ let bonus = 0;
44
+ if (na.length >= 3 && nb.length >= 3) {
45
+ if (na.includes(nb) || nb.includes(na))
46
+ bonus = 0.15;
47
+ }
48
+ return Math.min(1, jaccard + bonus);
49
+ }
50
+ /** Token overlap count (for reading-order / duplicate-label detection). */
51
+ export function tokenOverlap(a, b) {
52
+ const ta = new Set(tokenizeText(a));
53
+ const tb = new Set(tokenizeText(b));
54
+ let n = 0;
55
+ for (const t of ta)
56
+ if (tb.has(t))
57
+ n++;
58
+ return n;
59
+ }
60
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/text/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,+EAA+E;AAC/E,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,mCAAmC,EAAE,EAAE,CAAC;SAChD,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,aAAa,CAAC,KAAK,CAAC;SACxB,KAAK,CAAC,iBAAiB,CAAC;SACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,CAAS,EAAE,CAAS;IAC9C,MAAM,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACjD,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,CAAC,CAAC;IAExB,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAE7C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,KAAK,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC;IAC5C,MAAM,OAAO,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC;IAExD,qEAAqE;IACrE,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACrC,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,KAAK,GAAG,IAAI,CAAC;IACvD,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,YAAY,CAAC,CAAS,EAAE,CAAS;IAC/C,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,CAAC,EAAE,CAAC;IACvC,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Run-level trace. `.visual-layer/artifacts/<runId>/trace.json` records the
3
+ * ordered steps, metrics, and structured errors of a capture/ground/compare run.
4
+ *
5
+ * Size budget (§18.8): warn at 256 KiB, truncate nonessential payloads over
6
+ * 512 KiB while always preserving structured errors and metrics.
7
+ */
8
+ import type { ArtifactStore } from '../artifact-store/index.js';
9
+ export type TraceLevel = 'info' | 'warn' | 'error' | 'metric';
10
+ export interface TraceEvent {
11
+ step: string;
12
+ ts: string;
13
+ level: TraceLevel;
14
+ /** Arbitrary structured payload. Subject to truncation. */
15
+ data?: unknown;
16
+ /** Structured error — always preserved. */
17
+ error?: {
18
+ code: string;
19
+ message: string;
20
+ details?: unknown;
21
+ };
22
+ /** Named metric — always preserved. */
23
+ metric?: {
24
+ name: string;
25
+ value: number;
26
+ unit?: string;
27
+ };
28
+ }
29
+ export interface TraceOptions {
30
+ warnBytes?: number;
31
+ truncateBytes?: number;
32
+ }
33
+ export declare class Trace {
34
+ readonly runId: string;
35
+ private events;
36
+ readonly warnBytes: number;
37
+ readonly truncateBytes: number;
38
+ private warned;
39
+ constructor(runId: string, opts?: TraceOptions);
40
+ event(e: Omit<TraceEvent, 'ts'>): void;
41
+ info(step: string, data?: unknown): void;
42
+ warn(step: string, message: string, data?: unknown): void;
43
+ error(step: string, err: {
44
+ code: string;
45
+ message: string;
46
+ details?: unknown;
47
+ }): void;
48
+ metric(step: string, name: string, value: number, unit?: string): void;
49
+ /** Serialize with truncation. Returns { json, truncated, bytes }. */
50
+ serialize(): {
51
+ json: string;
52
+ truncated: boolean;
53
+ bytes: number;
54
+ warned: boolean;
55
+ };
56
+ flush(store: ArtifactStore): Promise<{
57
+ bytes: number;
58
+ truncated: boolean;
59
+ warned: boolean;
60
+ }>;
61
+ getEvents(): readonly TraceEvent[];
62
+ private dump;
63
+ }
64
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/trace/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE9D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,UAAU,CAAC;IAClB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,2CAA2C;IAC3C,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC7D,uCAAuC;IACvC,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACzD;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAOD,qBAAa,KAAK;IAChB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,MAAM,CAAoB;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,MAAM,CAAS;gBAEX,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB;IAMlD,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,IAAI;IAItC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAIxC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAIzD,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAIpF,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAItE,qEAAqE;IACrE,SAAS,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE;IAsB3E,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;IAMlG,SAAS,IAAI,SAAS,UAAU,EAAE;IAIlC,OAAO,CAAC,IAAI;CAGb"}
@@ -0,0 +1,63 @@
1
+ const DEFAULTS = {
2
+ warnBytes: 256 * 1024,
3
+ truncateBytes: 512 * 1024,
4
+ };
5
+ export class Trace {
6
+ runId;
7
+ events = [];
8
+ warnBytes;
9
+ truncateBytes;
10
+ warned = false;
11
+ constructor(runId, opts = {}) {
12
+ this.runId = runId;
13
+ this.warnBytes = opts.warnBytes ?? DEFAULTS.warnBytes;
14
+ this.truncateBytes = opts.truncateBytes ?? DEFAULTS.truncateBytes;
15
+ }
16
+ event(e) {
17
+ this.events.push({ ...e, ts: new Date().toISOString() });
18
+ }
19
+ info(step, data) {
20
+ this.event({ step, level: 'info', data });
21
+ }
22
+ warn(step, message, data) {
23
+ this.event({ step, level: 'warn', data: data ?? { message } });
24
+ }
25
+ error(step, err) {
26
+ this.event({ step, level: 'error', error: err });
27
+ }
28
+ metric(step, name, value, unit) {
29
+ this.event({ step, level: 'metric', metric: { name, value, unit } });
30
+ }
31
+ /** Serialize with truncation. Returns { json, truncated, bytes }. */
32
+ serialize() {
33
+ let events = this.events;
34
+ let serialized = this.dump(events);
35
+ let truncated = false;
36
+ if (serialized.length > this.truncateBytes) {
37
+ // drop `data` on info events first, keep warn/error/metric payloads
38
+ events = events.map((e) => (e.level === 'info' && e.data !== undefined ? { ...e, data: undefined } : e));
39
+ serialized = this.dump(events);
40
+ truncated = true;
41
+ }
42
+ if (serialized.length > this.truncateBytes) {
43
+ // still too big: drop all `data`, keep errors + metrics + step names
44
+ events = events.map((e) => ({ ...e, data: undefined }));
45
+ serialized = this.dump(events);
46
+ truncated = true;
47
+ }
48
+ const warned = serialized.length > this.warnBytes;
49
+ return { json: serialized, truncated, bytes: serialized.length, warned };
50
+ }
51
+ async flush(store) {
52
+ const { json, truncated, bytes, warned } = this.serialize();
53
+ await store.write(this.runId, 'trace', 'trace', json, { mimeType: 'application/json', redactable: true });
54
+ return { bytes, truncated, warned };
55
+ }
56
+ getEvents() {
57
+ return this.events;
58
+ }
59
+ dump(events) {
60
+ return JSON.stringify({ runId: this.runId, version: '0.1', events }, null, 2);
61
+ }
62
+ }
63
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/trace/index.ts"],"names":[],"mappings":"AA4BA,MAAM,QAAQ,GAAG;IACf,SAAS,EAAE,GAAG,GAAG,IAAI;IACrB,aAAa,EAAE,GAAG,GAAG,IAAI;CACjB,CAAC;AAEX,MAAM,OAAO,KAAK;IACP,KAAK,CAAS;IACf,MAAM,GAAiB,EAAE,CAAC;IACzB,SAAS,CAAS;IAClB,aAAa,CAAS;IACvB,MAAM,GAAG,KAAK,CAAC;IAEvB,YAAY,KAAa,EAAE,OAAqB,EAAE;QAChD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC;QACtD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,QAAQ,CAAC,aAAa,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,CAAyB;QAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,IAAc;QAC/B,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,OAAe,EAAE,IAAc;QAChD,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,IAAY,EAAE,GAAyD;QAC3E,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,IAAY,EAAE,IAAY,EAAE,KAAa,EAAE,IAAa;QAC7D,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,qEAAqE;IACrE,SAAS;QACP,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,IAAI,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3C,oEAAoE;YACpE,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzG,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/B,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3C,qEAAqE;YACrE,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YACxD,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/B,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;QAClD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAoB;QAC9B,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC5D,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1G,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IACtC,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAEO,IAAI,CAAC,MAA6B;QACxC,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ /** Warning constructors. Always use these so warning shape stays consistent. */
2
+ import type { Warning, WarningSeverity } from './schema/index.js';
3
+ export declare function warning(code: string, message: string, severity: WarningSeverity, targetId?: string): Warning;
4
+ export declare const info: (code: string, message: string, targetId?: string) => Warning;
5
+ export declare const warn: (code: string, message: string, targetId?: string) => Warning;
6
+ export declare const errorw: (code: string, message: string, targetId?: string) => Warning;
7
+ //# sourceMappingURL=warnings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warnings.d.ts","sourceRoot":"","sources":["../src/warnings.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAElE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAI5G;AAED,eAAO,MAAM,IAAI,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,EAAE,WAAW,MAAM,KAAG,OAC9B,CAAC;AAE3C,eAAO,MAAM,IAAI,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,EAAE,WAAW,MAAM,KAAG,OAC3B,CAAC;AAE9C,eAAO,MAAM,MAAM,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,EAAE,WAAW,MAAM,KAAG,OAC/B,CAAC"}
@@ -0,0 +1,10 @@
1
+ export function warning(code, message, severity, targetId) {
2
+ const w = { code, message, severity };
3
+ if (targetId !== undefined)
4
+ w.targetId = targetId;
5
+ return w;
6
+ }
7
+ export const info = (code, message, targetId) => warning(code, message, 'info', targetId);
8
+ export const warn = (code, message, targetId) => warning(code, message, 'warning', targetId);
9
+ export const errorw = (code, message, targetId) => warning(code, message, 'error', targetId);
10
+ //# sourceMappingURL=warnings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warnings.js","sourceRoot":"","sources":["../src/warnings.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,OAAe,EAAE,QAAyB,EAAE,QAAiB;IACjG,MAAM,CAAC,GAAY,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC/C,IAAI,QAAQ,KAAK,SAAS;QAAE,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAClD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,QAAiB,EAAW,EAAE,CAChF,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAE3C,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,QAAiB,EAAW,EAAE,CAChF,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAE9C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,QAAiB,EAAW,EAAE,CAClF,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@visual-layer/core",
3
+ "version": "1.0.0",
4
+ "description": "ScreenGraph schema, contracts, artifact store, redaction, browser adapter",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://gitlab.com/locotine/vision-layer.git",
10
+ "directory": "packages/core"
11
+ },
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "main": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js"
21
+ }
22
+ },
23
+ "files": [
24
+ "dist"
25
+ ],
26
+ "dependencies": {
27
+ "zod": "^3.23.8"
28
+ },
29
+ "scripts": {
30
+ "build": "tsc -b",
31
+ "typecheck": "tsc -b"
32
+ }
33
+ }