@veltdev/sdk 4.5.6-beta.15 → 4.5.6-beta.16

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,109 @@
1
+ /**
2
+ * Content hash for secure, privacy-preserving element validation.
3
+ */
4
+ export interface ContentHash {
5
+ /** MD5 hash value (base36 encoded, ~12 characters) */
6
+ value: string;
7
+ /** Hashing algorithm (always 'md5') */
8
+ algorithm: 'md5';
9
+ /** Source of hash (always 'textContent') */
10
+ source: 'textContent';
11
+ }
12
+ /**
13
+ * Robust anchor record for reliable DOM element re-location.
14
+ *
15
+ * Survives:
16
+ * - Page reloads
17
+ * - Framework re-renders (React, Vue, Angular)
18
+ * - Dynamic ID changes
19
+ * - Minor DOM restructuring
20
+ *
21
+ * Does not survive:
22
+ * - Major redesigns
23
+ * - Content reordering (sort, filter)
24
+ * - Element removal
25
+ *
26
+ * **Resolution Strategy (priority order):**
27
+ * 1. id (90) - Stable, non-dynamic ID
28
+ * 2. css (80/60) - Attribute selector
29
+ * 3. robustXPath (50) - Attribute-based path
30
+ * 4. containerHints (40) - Scoped search
31
+ * 5. xPath variants (32-28) - Structural fallback
32
+ * 6. contentHash (15) - Hash-based scan
33
+ *
34
+ * **Validation boosts:** tagName (+10), contentHash (+30)
35
+ *
36
+ * **Security:** No plaintext storage, MD5 hash only.
37
+ */
38
+ export interface AnchorRecord {
39
+ /** Schema version (current: "1.0") */
40
+ version: '1.0';
41
+ /**
42
+ * Stable element ID (non-dynamic only).
43
+ *
44
+ * Excluded patterns:
45
+ * - yui_* (YUI framework)
46
+ */
47
+ id?: string;
48
+ /** Tag name (uppercase, e.g., 'DIV', 'BUTTON') */
49
+ tagName: string;
50
+ /**
51
+ * CSS selector from stable attributes.
52
+ *
53
+ * Example: `[data-testid='submit-btn'][role='button']`
54
+ */
55
+ elementSelector?: string;
56
+ /**
57
+ * XPath variants (in order of stability):
58
+ *
59
+ * 1. robustXPath - Attribute-based (MOST STABLE)
60
+ * - Prioritizes: data-* > role > stable ID > aria-* > position
61
+ * - Example: `//div[@role='main']/.../li[5]/span`
62
+ * - Ignores dynamic IDs
63
+ * - Stops at landmarks (main, nav, etc.)
64
+ *
65
+ * 2. xPath - Basic XPath (uses IDs when available)
66
+ * 3. cfXPath - Positional with class hints
67
+ * 4. fXPath - Pure positional (most fragile)
68
+ */
69
+ robustXPath?: string;
70
+ xPath?: string;
71
+ fXPath?: string;
72
+ cfXPath?: string;
73
+ /**
74
+ * Content hash for secure validation.
75
+ */
76
+ contentHash?: ContentHash;
77
+ /** Creation timestamp (milliseconds since epoch) */
78
+ createdAt?: number;
79
+ /** Parent element anchor record */
80
+ parent?: AnchorRecord;
81
+ }
82
+ /**
83
+ * Result of anchor resolution.
84
+ */
85
+ export interface AnchorResolution {
86
+ /** Resolved element (null if not found) */
87
+ element: Element | null;
88
+ /**
89
+ * Resolution method used.
90
+ * Values: 'id', 'css', 'robustXPath', 'xPath', 'cfXPath', 'fXPath', 'contentHash', 'ancestor+tag'
91
+ */
92
+ matchedBy?: string;
93
+ /**
94
+ * Confidence score (0-120+).
95
+ *
96
+ * - 90+: High (unique ID)
97
+ * - 80-89: Good (unique CSS, stable attributes)
98
+ * - 40-79: Moderate (scoped search, multiple candidates)
99
+ * - 15-39: Low (XPath, hash-based fallback)
100
+ */
101
+ score?: number;
102
+ /**
103
+ * Score breakdown.
104
+ */
105
+ scoreBreakdown?: {
106
+ method: string;
107
+ score: number;
108
+ }[];
109
+ }
@@ -1,3 +1,4 @@
1
+ import { AnchorRecord } from './anchor-record.data.model';
1
2
  export declare class TargetElement {
2
3
  /**
3
4
  * Xpath of target element
@@ -19,4 +20,8 @@ export declare class TargetElement {
19
20
  * Relative left position of cursor on target element
20
21
  */
21
22
  leftPercentage: number;
23
+ /**
24
+ * Robust anchor descriptor for the element
25
+ */
26
+ anchor?: AnchorRecord | null;
22
27
  }
@@ -1,3 +1,4 @@
1
+ import { AnchorRecord } from "./anchor-record.data.model";
1
2
  export declare class TargetTextRange {
2
3
  /**
3
4
  * Xpath of common Ancestor Container
@@ -11,6 +12,10 @@ export declare class TargetTextRange {
11
12
  * Full xpath of common Ancestor Container with class names
12
13
  */
13
14
  commonAncestorContainerCFXpath?: string;
15
+ /**
16
+ * Anchor of common Ancestor Container
17
+ */
18
+ commonAncestorContainerAnchor?: AnchorRecord;
14
19
  /**
15
20
  * Selected text
16
21
  */
package/models.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './app/utils/enums';
2
+ export * from './app/models/data/anchor-record.data.model';
2
3
  export * from './app/models/data/attachment.model';
3
4
  export * from './app/models/data/area-annotation.data.model';
4
5
  export * from './app/models/data/arrow-annotation.data.model';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@veltdev/sdk",
3
- "version": "4.5.6-beta.15",
3
+ "version": "4.5.6-beta.16",
4
4
  "description": "Velt is an SDK to add collaborative features to your product within minutes. Example: Comments like Figma, Frame.io, Google docs or sheets, Recording like Loom, Huddles like Slack and much more.",
5
5
  "homepage": "https://velt.dev",
6
6
  "keywords": [