@thinkingos/vsl-sdk 0.4.5 → 1.1.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.
package/dist/index.d.ts CHANGED
@@ -1,24 +1,39 @@
1
1
  /**
2
- * DOM extraction (T1.1.2, ROADMAP.md M1.1).
2
+ * Unified ID Generator for VSL (M1.7 optimization).
3
3
  *
4
- * Обходит дерево от корня (по умолчанию document.body) и извлекает все видимые
5
- * элементы с координатами (getBoundingClientRect), собственным текстом, атрибутами и CSS-подмножеством (Level 3, T1.5.1).
6
- * Покрывает тот же набор элементов, что и root.querySelectorAll('*'), минус отфильтрованные.
4
+ * Strategy:
5
+ * 1. Priority: use existing DOM `id` if present (stable, readable)
6
+ * 2. Fallback: short generated IDs with abbreviated types (btn_1, inp_2, cont_3)
7
7
  *
8
- * Фильтр невидимых (семантика ARCHITECTURE.md; CSS-уровень 3 вне scope M1.1):
9
- * - непрендеримые теги (script/style/link/meta/noscript/template/head/title/base) —
10
- * никогда не отрисовываются → пропуск поддерева;
11
- * - display: none → элемент и всё поддерево не отрисованы → пропуск поддерева;
12
- * - visibility: hidden → сам элемент невидим, но дети могут быть видимы
13
- * (visibility: visible) → элемент не включается, поддерево обходится;
14
- * - нулевой прямоугольник (width <= 0 || height <= 0) → нет видимого бокса, но дети
15
- * (например, overflow) могут быть видимы → элемент не включается, поддерево обходится.
16
- *
17
- * indexPath — индексы среди ЭЛЕМЕНТНЫХ детей на каждом уровне, вычисляются по
18
- * структуре DOM ДО фильтрации: позиция стабильна независимо от фильтров — основа
19
- * детерминированных ID VSL (решение note_1789916091535: без Date.now()/Math.random(),
20
- * база для diffing в M1.2).
8
+ * Works for both browser path (SegmentedElement) and HTTP path (cheerio elements).
9
+ * IDs are deterministic (DOM traversal order is stable) and unique within a snapshot.
10
+ */
11
+ /** Type abbreviations for short ID generation. */
12
+ declare const TYPE_ABBREVIATIONS: Readonly<Record<string, string>>;
13
+ /**
14
+ * ID Generator class for a single snapshot.
15
+ * Maintains a global counter to ensure uniqueness across the entire snapshot.
16
+ */
17
+ declare class IdGenerator {
18
+ private typeCounters;
19
+ /**
20
+ * Generate ID for an element.
21
+ *
22
+ * @param elementId - Existing DOM id attribute (if present)
23
+ * @param vslType - VSL type of the element (for fallback abbreviation)
24
+ * @returns Generated ID string
25
+ */
26
+ generate(elementId: string | null | undefined, vslType: string | null): string;
27
+ /** Reset counters (for testing or new snapshot). */
28
+ reset(): void;
29
+ /** Get current counter value for a type (for debugging). */
30
+ getCounter(type?: string): number;
31
+ }
32
+ /**
33
+ * Create a new ID generator for a snapshot.
21
34
  */
35
+ declare function createIdGenerator(): IdGenerator;
36
+
22
37
  interface Rect {
23
38
  x: number;
24
39
  y: number;
@@ -78,8 +93,11 @@ declare function ownText(el: Element): string;
78
93
  /**
79
94
  * Извлекает видимое поддерево DOM, начиная с root (по умолчанию document.body).
80
95
  * Сам root не включается — возвращается лес его видимых потомков.
96
+ *
97
+ * @param root — корневой элемент для обхода (по умолчанию document.body)
98
+ * @param url — URL страницы (для Prompt Injection Filter whitelist, T1.8.5)
81
99
  */
82
- declare function extractDomTree(root?: Element): ExtractedElement[];
100
+ declare function extractDomTree(root?: Element, url?: string): ExtractedElement[];
83
101
 
84
102
  /**
85
103
  * Типы VSL JSON (DESIGN_SYSTEM.md §4, ARCHITECTURE.md §2.3).
@@ -1099,7 +1117,7 @@ declare const ACTION_TOOL_SCHEMA: {
1099
1117
  action: {
1100
1118
  type: string;
1101
1119
  description: string;
1102
- enum: ("select" | "type" | "click" | "expand" | "collapse" | "close" | "check" | "uncheck" | "clear" | "scroll" | "hover" | "focus" | "blur" | "drag" | "drop" | "submit" | "reset" | "open" | "wait" | "navigate" | "go_back" | "go_forward" | "refresh" | "download")[];
1120
+ enum: ("select" | "scroll" | "type" | "click" | "expand" | "collapse" | "close" | "check" | "uncheck" | "clear" | "hover" | "focus" | "blur" | "drag" | "drop" | "submit" | "reset" | "open" | "wait" | "navigate" | "go_back" | "go_forward" | "refresh" | "download")[];
1103
1121
  };
1104
1122
  target_id: {
1105
1123
  type: string;
@@ -1311,6 +1329,349 @@ declare function executeAction(action: LlmAction, options?: ExecutorOptions): Pr
1311
1329
  */
1312
1330
  declare function resolveTarget(targetId: string, options?: ExecutorOptions): Element;
1313
1331
 
1332
+ /**
1333
+ * Remote Patterns Loader (T1.8.3, M1.8, DEC-027).
1334
+ *
1335
+ * Загружает паттерны инъекций с удалённого CDN/GitHub, кэширует локально,
1336
+ * обеспечивает fallback на bundled patterns при отсутствии интернета.
1337
+ *
1338
+ * Архитектура:
1339
+ * - Fetch: загрузка с remote URL (https://vsl.dev/patterns/latest.json)
1340
+ * - Cache: локальное кэширование (~/.vsl/cache/remote-patterns.json)
1341
+ * - Fallback: если fetch не удался, используем кэш или bundled patterns
1342
+ * - TTL: кэш валиден 24 часа (настраивается)
1343
+ */
1344
+
1345
+ /** Опции remote patterns loader. */
1346
+ interface RemotePatternsLoaderOptions {
1347
+ /** URL для загрузки remote patterns. */
1348
+ remoteUrl?: string;
1349
+ /** Путь к локальному кэшу remote patterns. */
1350
+ cachePath?: string;
1351
+ /** TTL кэша в миллисекундах (по умолчанию 24 часа). */
1352
+ cacheTtlMs?: number;
1353
+ /** Включить/выключить remote loader (по умолчанию true). */
1354
+ enabled?: boolean;
1355
+ /** Timeout для HTTP-запроса в миллисекундах (по умолчанию 5000). */
1356
+ timeoutMs?: number;
1357
+ }
1358
+ /** Результат загрузки remote patterns. */
1359
+ interface RemotePatternsResult {
1360
+ /** Загруженные паттерны. */
1361
+ patterns: InjectionPattern[];
1362
+ /** Источник паттернов: 'remote' (свежая загрузка), 'cache' (из кэша), 'none' (нет паттернов). */
1363
+ source: 'remote' | 'cache' | 'none';
1364
+ /** Был ли использован fallback (если remote fetch не удался). */
1365
+ fallbackUsed: boolean;
1366
+ /** Ошибка (если произошла). */
1367
+ error?: string;
1368
+ }
1369
+ /**
1370
+ * Remote Patterns Loader — загрузка паттернов с CDN/GitHub.
1371
+ *
1372
+ * Использование:
1373
+ * * const loader = new RemotePatternsLoader({
1374
+ * remoteUrl: 'https://vsl.dev/patterns/latest.json',
1375
+ * cacheTtlMs: 24 * 60 * 60 * 1000, // 24 часа
1376
+ * });
1377
+ *
1378
+ * const result = await loader.load();
1379
+ * console.log(result.patterns); // Загруженные паттерны
1380
+ * console.log(result.source); // 'remote' | 'cache' | 'none'
1381
+ * */
1382
+ declare class RemotePatternsLoader {
1383
+ private remoteUrl;
1384
+ private cachePath;
1385
+ private cacheTtlMs;
1386
+ private enabled;
1387
+ private timeoutMs;
1388
+ constructor(options?: RemotePatternsLoaderOptions);
1389
+ /**
1390
+ * Загружает remote patterns с fallback на кэш.
1391
+ *
1392
+ * Логика:
1393
+ * 1. Если enabled === false — возвращаем empty
1394
+ * 2. Проверяем кэш — если валиден (TTL не истёк), используем кэш
1395
+ * 3. Пытаемся загрузить с remote URL
1396
+ * 4. Если загрузка успешна — обновляем кэш, возвращаем remote patterns
1397
+ * 5. Если загрузка не удалась — используем кэш (fallback)
1398
+ * 6. Если кэша нет — возвращаем empty
1399
+ */
1400
+ load(): Promise<RemotePatternsResult>;
1401
+ /**
1402
+ * Загружает паттерны с remote URL.
1403
+ */
1404
+ private fetchRemotePatterns;
1405
+ /**
1406
+ * Проверяет валидность паттерна.
1407
+ */
1408
+ private isValidPattern;
1409
+ /**
1410
+ * Читает кэш из файла.
1411
+ */
1412
+ private readCache;
1413
+ /**
1414
+ * Записывает паттерны в кэш.
1415
+ */
1416
+ private writeCache;
1417
+ /**
1418
+ * Проверяет валидность кэша (TTL не истёк).
1419
+ */
1420
+ private isCacheValid;
1421
+ /**
1422
+ * Очищает кэш (для тестирования).
1423
+ */
1424
+ clearCache(): void;
1425
+ /**
1426
+ * Получает информацию о кэше (для диагностики).
1427
+ */
1428
+ getCacheInfo(): {
1429
+ exists: boolean;
1430
+ lastFetched?: string;
1431
+ patternCount?: number;
1432
+ };
1433
+ /**
1434
+ * Получает URL для загрузки remote patterns.
1435
+ */
1436
+ getRemoteUrl(): string;
1437
+ /**
1438
+ * Устанавливает URL для загрузки remote patterns.
1439
+ */
1440
+ setRemoteUrl(url: string): void;
1441
+ }
1442
+
1443
+ /**
1444
+ * Prompt Injection Filter (T1.8.1, M1.8, DEC-027).
1445
+ *
1446
+ * Слой безопасности на входе Capture Layer — сразу после извлечения текста из любого источника
1447
+ * (DOM, raw HTML), до сегментации и упаковки в VSL JSON.
1448
+ *
1449
+ * Архитектура:
1450
+ * - Scanner — regex-паттерны для обнаружения инъекций
1451
+ * - Logger — security audit trail (локальное хранение)
1452
+ * - Stripper — вырезание инъекций из текста
1453
+ *
1454
+ * 3 уровня паттернов:
1455
+ * - Bundled (patterns_v1.json в SDK)
1456
+ * - Remote (CDN/GitHub, автозагрузка при запуске)
1457
+ * - Custom (пользовательские через vsl.config.json)
1458
+ *
1459
+ * Действия:
1460
+ * - strip — вырезать инъекцию, оставить остальной контент
1461
+ * - log — только логировать обнаружение
1462
+ * - block — блокировать весь текст (вернуть пустую строку)
1463
+ *
1464
+ * False positive strategy:
1465
+ * - Confidence threshold (0.7 по умолчанию)
1466
+ * - Domain whitelist (доверенные домены пропускаются)
1467
+ * - User override (отключение фильтра для конкретных доменов)
1468
+ */
1469
+
1470
+ /** Тип паттерна (пока только regex, ML зарезервирован). */
1471
+ type PatternType = 'regex' | 'ml';
1472
+ /** Уровень серьёзности инъекции. */
1473
+ type Severity = 'low' | 'medium' | 'high' | 'critical';
1474
+ /** Действие при обнаружении инъекции. */
1475
+ type FilterAction = 'strip' | 'log' | 'block';
1476
+ /** Формат паттерна для обнаружения инъекций. */
1477
+ interface InjectionPattern {
1478
+ /** Уникальный идентификатор паттерна. */
1479
+ id: string;
1480
+ /** Regex-паттерн для обнаружения инъекции. */
1481
+ pattern: string;
1482
+ /** Тип паттерна (regex или ml). */
1483
+ type: PatternType;
1484
+ /** Уровень серьёзности. */
1485
+ severity: Severity;
1486
+ /** Действие при обнаружении. */
1487
+ action: FilterAction;
1488
+ /** Описание паттерна. */
1489
+ description: string;
1490
+ /** Confidence threshold (0-1), по умолчанию 0.7. */
1491
+ confidence?: number;
1492
+ }
1493
+ /** Результат сканирования текста. */
1494
+ interface ScanResult {
1495
+ /** Очищенный текст (после strip/block). */
1496
+ cleanText: string;
1497
+ /** Обнаруженные инъекции. */
1498
+ detections: Detection[];
1499
+ /** Был ли текст заблокирован полностью. */
1500
+ blocked: boolean;
1501
+ /** Время сканирования (мс). */
1502
+ scanTimeMs: number;
1503
+ }
1504
+ /** Обнаруженная инъекция. */
1505
+ interface Detection {
1506
+ /** ID паттерна, который сработал. */
1507
+ patternId: string;
1508
+ /** Описание паттерна. */
1509
+ description: string;
1510
+ /** Уровень серьёзности. */
1511
+ severity: Severity;
1512
+ /** Действие, которое было выполнено. */
1513
+ action: FilterAction;
1514
+ /** Текст, который совпал с паттерном. */
1515
+ matchedText: string;
1516
+ /** Позиция в исходном тексте (start index). */
1517
+ index: number;
1518
+ /** Контекст вокруг совпадения (для аудита). */
1519
+ context: string;
1520
+ }
1521
+ /** Запись в security audit log. */
1522
+ interface SecurityLogEntry {
1523
+ /** Timestamp обнаружения (ISO 8601). */
1524
+ timestamp: string;
1525
+ /** URL страницы (если доступен). */
1526
+ url?: string;
1527
+ /** ID паттерна. */
1528
+ patternId: string;
1529
+ /** Описание паттерна. */
1530
+ description: string;
1531
+ /** Уровень серьёзности. */
1532
+ severity: Severity;
1533
+ /** Действие, которое было выполнено. */
1534
+ action: FilterAction;
1535
+ /** Текст, который совпал с паттерном. */
1536
+ matchedText: string;
1537
+ /** Контекст вокруг совпадения. */
1538
+ context: string;
1539
+ }
1540
+ /** Опции конфигурации фильтра. */
1541
+ interface FilterOptions {
1542
+ /** Включить/выключить фильтр (по умолчанию true). */
1543
+ enabled?: boolean;
1544
+ /** Confidence threshold (0-1, по умолчанию 0.7). */
1545
+ confidenceThreshold?: number;
1546
+ /** Domain whitelist — доверенные домены, которые пропускаются. */
1547
+ domainWhitelist?: string[];
1548
+ /** Путь к bundled patterns.json. */
1549
+ bundledPatternsPath?: string;
1550
+ /** Путь к remote patterns (локальный кэш). */
1551
+ remotePatternsPath?: string;
1552
+ /** Custom patterns (из vsl.config.json). */
1553
+ customPatterns?: InjectionPattern[];
1554
+ /** Путь к security audit log. */
1555
+ logPath?: string;
1556
+ /** Максимальный размер лога (количество записей, по умолчанию 10000). */
1557
+ maxLogEntries?: number;
1558
+ /** Опции для RemotePatternsLoader (автозагрузка с CDN). */
1559
+ remoteLoader?: RemotePatternsLoaderOptions;
1560
+ }
1561
+ /**
1562
+ * Prompt Injection Filter — основной класс фильтра.
1563
+ *
1564
+ * Использование:
1565
+ * * const filter = new PromptInjectionFilter({
1566
+ * enabled: true,
1567
+ * confidenceThreshold: 0.7,
1568
+ * domainWhitelist: ['github.com', 'docs.google.com'],
1569
+ * });
1570
+ *
1571
+ * const result = filter.scan(text, 'https://example.com');
1572
+ * console.log(result.cleanText); // Очищенный текст
1573
+ * console.log(result.detections); // Обнаруженные инъекции
1574
+ * */
1575
+ declare class PromptInjectionFilter {
1576
+ private enabled;
1577
+ private confidenceThreshold;
1578
+ private domainWhitelist;
1579
+ private patterns;
1580
+ private logPath;
1581
+ private maxLogEntries;
1582
+ private logEntries;
1583
+ private remoteLoader;
1584
+ constructor(options?: FilterOptions);
1585
+ /**
1586
+ * Загружает паттерны из всех источников (bundled, remote, custom).
1587
+ */
1588
+ private loadPatterns;
1589
+ /**
1590
+ * Асинхронно загружает remote patterns через RemotePatternsLoader.
1591
+ * Вызывается опционально для обновления паттернов с CDN/GitHub.
1592
+ *
1593
+ * @returns Результат загрузки remote patterns
1594
+ */
1595
+ loadRemotePatterns(): Promise<{
1596
+ patterns: number;
1597
+ source: string;
1598
+ fallbackUsed: boolean;
1599
+ error?: string;
1600
+ }>;
1601
+ /**
1602
+ * Получает информацию о кэше remote patterns.
1603
+ */
1604
+ getRemoteCacheInfo(): {
1605
+ exists: boolean;
1606
+ lastFetched?: string;
1607
+ patternCount?: number;
1608
+ };
1609
+ /**
1610
+ * Очищает кэш remote patterns.
1611
+ */
1612
+ clearRemoteCache(): void;
1613
+ /**
1614
+ * Загружает существующие логи из файла.
1615
+ */
1616
+ private loadExistingLogs;
1617
+ /**
1618
+ * Проверяет, находится ли URL в whitelist.
1619
+ */
1620
+ isWhitelisted(url?: string): boolean;
1621
+ /**
1622
+ * Сканирует текст на наличие инъекций.
1623
+ *
1624
+ * @param text — текст для сканирования
1625
+ * @param url — URL страницы (для whitelist и логирования)
1626
+ * @returns Результат сканирования с очищенным текстом и списком обнаружений
1627
+ */
1628
+ scan(text: string, url?: string): ScanResult;
1629
+ /**
1630
+ * Логирует обнаружение в security audit trail.
1631
+ */
1632
+ private logDetection;
1633
+ /**
1634
+ * Записывает одну запись в лог-файл.
1635
+ */
1636
+ private writeLogEntry;
1637
+ /**
1638
+ * Получает все логи (для аудита).
1639
+ */
1640
+ getLogs(): SecurityLogEntry[];
1641
+ /**
1642
+ * Очищает логи (для тестирования).
1643
+ */
1644
+ clearLogs(): void;
1645
+ /**
1646
+ * Добавляет custom pattern динамически.
1647
+ */
1648
+ addCustomPattern(pattern: InjectionPattern): void;
1649
+ /**
1650
+ * Удаляет custom pattern по ID.
1651
+ */
1652
+ removePattern(patternId: string): boolean;
1653
+ /**
1654
+ * Получает количество загруженных паттернов.
1655
+ */
1656
+ getPatternCount(): number;
1657
+ /**
1658
+ * Включает/выключает фильтр.
1659
+ */
1660
+ setEnabled(enabled: boolean): void;
1661
+ /**
1662
+ * Проверяет, включён ли фильтр.
1663
+ */
1664
+ isEnabled(): boolean;
1665
+ }
1666
+ /**
1667
+ * Фабричная функция для создания фильтра с дефолтными настройками.
1668
+ */
1669
+ declare function createFilter(options?: FilterOptions): PromptInjectionFilter;
1670
+ /**
1671
+ * Получает глобальный экземпляр фильтра.
1672
+ */
1673
+ declare function getGlobalFilter(): PromptInjectionFilter;
1674
+
1314
1675
  /**
1315
1676
  * VSL SDK — публичное API. Точка входа:
1316
1677
  * - Snapshot generation (M1.1): capture → segment → build;
@@ -1321,4 +1682,4 @@ declare function resolveTarget(targetId: string, options?: ExecutorOptions): Ele
1321
1682
 
1322
1683
  declare const VSL_SDK_VERSION = "0.1.0";
1323
1684
 
1324
- export { ACTION_TOOL_DESCRIPTION, ACTION_TOOL_NAME, ACTION_TOOL_SCHEMA, ARIA_ROLE_TYPE_MAP, ActionExecutionError, type ActionResult, AlibabaAdapter, AnthropicAdapter, type BuildOptions, type CacheEntry, type CacheStore, type DecideInput, type DiffOptions, type ExecutorOptions, type ExtractedElement, type FewShotExample, LEVEL1_TAG_MAP, type LlmAction, type LlmAdapter, type LlmAdapterConfig, LlmError, type LlmResponse, type LlmTransport, type LlmUsage, LlmValidationError, type MutationObserverHandle, OpenAIAdapter, type Rect, type RetryOptions, type SegmentedElement, type SendPromptOptions, type Sleep, type SnapshotInput, type SnapshotResult, VALID_ACTIONS, VSL_SDK_VERSION, VSL_VERSION, type ValidAction, type VisualFragment, type VisualFragmentData, type VisualFragmentStore, type VisualFragmentType, type VslCanvas, type VslDiff, type VslDiffChanges, type VslDocument, type VslFragmentMeta, type VslInput, type VslModifiedObject, type VslObject, type VslObjectWithVf, type VslRemovedObject, VslSnapshotSession, type VslState, type VslType, type VslViewport, attachMutationObserver, buildSystemPrompt, buildUserPrompt, buildVslDocument, collectIds, computeContentHash, computeCoordHash, createCacheStore, diffVslDocuments, executeAction, extractDomTree, isAriaHidden, isVslDiff, ownText, resolveAriaRoleType, resolveLevel1Type, resolveSt, resolveTarget, retryWithBackoff, segmentTree, validateAction };
1685
+ export { ACTION_TOOL_DESCRIPTION, ACTION_TOOL_NAME, ACTION_TOOL_SCHEMA, ARIA_ROLE_TYPE_MAP, ActionExecutionError, type ActionResult, AlibabaAdapter, AnthropicAdapter, type BuildOptions, type CacheEntry, type CacheStore, type DecideInput, type Detection, type DiffOptions, type ExecutorOptions, type ExtractedElement, type FewShotExample, type FilterAction, type FilterOptions, IdGenerator, type InjectionPattern, LEVEL1_TAG_MAP, type LlmAction, type LlmAdapter, type LlmAdapterConfig, LlmError, type LlmResponse, type LlmTransport, type LlmUsage, LlmValidationError, type MutationObserverHandle, OpenAIAdapter, type PatternType, PromptInjectionFilter, type Rect, RemotePatternsLoader, type RemotePatternsLoaderOptions, type RemotePatternsResult, type RetryOptions, type ScanResult, type SecurityLogEntry, type SegmentedElement, type SendPromptOptions, type Severity, type Sleep, type SnapshotInput, type SnapshotResult, TYPE_ABBREVIATIONS, VALID_ACTIONS, VSL_SDK_VERSION, VSL_VERSION, type ValidAction, type VisualFragment, type VisualFragmentData, type VisualFragmentStore, type VisualFragmentType, type VslCanvas, type VslDiff, type VslDiffChanges, type VslDocument, type VslFragmentMeta, type VslInput, type VslModifiedObject, type VslObject, type VslObjectWithVf, type VslRemovedObject, VslSnapshotSession, type VslState, type VslType, type VslViewport, attachMutationObserver, buildSystemPrompt, buildUserPrompt, buildVslDocument, collectIds, computeContentHash, computeCoordHash, createCacheStore, createFilter, createIdGenerator, diffVslDocuments, executeAction, extractDomTree, getGlobalFilter, isAriaHidden, isVslDiff, ownText, resolveAriaRoleType, resolveLevel1Type, resolveSt, resolveTarget, retryWithBackoff, segmentTree, validateAction };