@thinkingos/vsl-sdk 0.2.0 → 0.3.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.mts CHANGED
@@ -845,32 +845,6 @@ interface EnrichWithVisionDeps {
845
845
  extractor: FragmentExtractor;
846
846
  }
847
847
 
848
- /**
849
- * VSL Snapshot Session (T1.2.4, ROADMAP.md M1.2; ARCHITECTURE.md §2.4/§5.2/§6.3).
850
- *
851
- * Stateful-фасад над пайплайном capture→segment→build→cache→diff:
852
- * - первый вызов или смена URL → полный VslDocument; кэш очищается и
853
- * заполняется объектами документа; счётчик версий сбрасывается в 1;
854
- * - тот же URL → VslDiff последнего документа против нового (формат §6.2):
855
- * diff_version = version + 1, base_version = version;
856
- * - viewport изменился при том же URL → дополнительно
857
- * store.invalidateCoordinates() — «сброс координат» §5.2, НЕ полный сброс.
858
- *
859
- * Состояние {lastUrl, lastViewport, lastDocument, version} — в памяти
860
- * экземпляра; VslDocument (канон §4) версиями НЕ расширяется.
861
- *
862
- * Политика кэша — store отражает текущий документ: full → clear + заполнение;
863
- * diff → удалённые invalidate, добавленные (поддеревья) и изменённые set из
864
- * нового документа; неизменённые остаются кэшированными (после resize — с
865
- * обнулённым coordHash: наблюдаемый эффект invalidateCoordinates).
866
- *
867
- * input.url/viewport/timestamp/background передаются в BuildOptions ЯВНО —
868
- * дефолты builder (window.innerWidth/innerHeight/location.href/document.title)
869
- * вычислялись бы от глобалов: недетерминированны в тестах и недоступны в Node;
870
- * title — из input, иначе root.ownerDocument.title (портативный фолбэк — фикс
871
- * packaging-smoke demo:cache-diff).
872
- */
873
-
874
848
  /** Результат snapshot(): полный документ (1-й вызов / URL change) или дифф. */
875
849
  type SnapshotResult = VslDocument | VslDiff;
876
850
  /** Type guard: различение диффа и полного документа (контракт T1.2.4). */
@@ -909,11 +883,26 @@ declare class VslSnapshotSession {
909
883
  private lastDocument;
910
884
  private version;
911
885
  constructor(store?: CacheStore);
886
+ /**
887
+ * Сбрасывает состояние сессии (URL, viewport, документ, версия).
888
+ * Следующий вызов snapshot() вернёт полный документ (как первый вызов).
889
+ */
890
+ clear(): void;
891
+ /** Возвращает последний полный документ (не diff). */
892
+ getLastDocument(): VslDocument | null;
893
+ /** Текущая версия документа (инкрементируется при каждом diff). */
894
+ getVersion(): number;
912
895
  /**
913
896
  * Строит VSL из DOM поддерева root (extractDomTree → segmentTree →
914
897
  * buildVslDocument) и возвращает полный документ либо дифф (см. шапку).
915
898
  */
916
899
  snapshot(root: Element, input: SnapshotInput): SnapshotResult;
900
+ /**
901
+ * Вариант snapshot() для pre-extracted elements (MCP сервер, Node.js контекст).
902
+ * Принимает ExtractedElement[] напрямую (без DOM Element), проходит тот же
903
+ * pipeline: segmentTree → buildVslDocument → cache/diff.
904
+ */
905
+ snapshotFromElements(extractedElements: readonly ExtractedElement[], input: SnapshotInput): SnapshotResult;
917
906
  /**
918
907
  * Vision-вариант конвейера (T1.5.5): segmentTree → enrichWithVision (Level 5
919
908
  * fallback — аннотация t + vf/vf_meta на элементах ДО сборки) → buildVslDocument
@@ -922,8 +911,18 @@ declare class VslSnapshotSession {
922
911
  * (base64) возвращаются ОТДЕЛЬНО — в документе только метаданные (DEC-015).
923
912
  */
924
913
  snapshotWithVision(root: Element, input: SnapshotInput, vision: EnrichWithVisionDeps): Promise<VisionSnapshotResult>;
914
+ /**
915
+ * Vision-вариант для pre-extracted elements (MCP сервер, Node.js контекст).
916
+ * Полный pipeline: segmentTree → enrichWithVision → buildVslDocument → cache/diff.
917
+ */
918
+ snapshotWithVisionFromElements(extractedElements: readonly ExtractedElement[], input: SnapshotInput, vision: EnrichWithVisionDeps): Promise<VisionSnapshotResult>;
925
919
  /** BuildOptions из input + портативный title (логика бывшего snapshot()). */
926
920
  private buildOptions;
921
+ /**
922
+ * BuildOptions из input без DOM Element (для snapshotFromElements).
923
+ * Title берётся только из input (нет фолбэка на root.ownerDocument.title).
924
+ */
925
+ private buildOptionsFromInput;
927
926
  /** Сборка документа + кэш/дифф (логика бывшего snapshot(), см. шапку модуля). */
928
927
  private commit;
929
928
  }
package/dist/index.d.ts CHANGED
@@ -845,32 +845,6 @@ interface EnrichWithVisionDeps {
845
845
  extractor: FragmentExtractor;
846
846
  }
847
847
 
848
- /**
849
- * VSL Snapshot Session (T1.2.4, ROADMAP.md M1.2; ARCHITECTURE.md §2.4/§5.2/§6.3).
850
- *
851
- * Stateful-фасад над пайплайном capture→segment→build→cache→diff:
852
- * - первый вызов или смена URL → полный VslDocument; кэш очищается и
853
- * заполняется объектами документа; счётчик версий сбрасывается в 1;
854
- * - тот же URL → VslDiff последнего документа против нового (формат §6.2):
855
- * diff_version = version + 1, base_version = version;
856
- * - viewport изменился при том же URL → дополнительно
857
- * store.invalidateCoordinates() — «сброс координат» §5.2, НЕ полный сброс.
858
- *
859
- * Состояние {lastUrl, lastViewport, lastDocument, version} — в памяти
860
- * экземпляра; VslDocument (канон §4) версиями НЕ расширяется.
861
- *
862
- * Политика кэша — store отражает текущий документ: full → clear + заполнение;
863
- * diff → удалённые invalidate, добавленные (поддеревья) и изменённые set из
864
- * нового документа; неизменённые остаются кэшированными (после resize — с
865
- * обнулённым coordHash: наблюдаемый эффект invalidateCoordinates).
866
- *
867
- * input.url/viewport/timestamp/background передаются в BuildOptions ЯВНО —
868
- * дефолты builder (window.innerWidth/innerHeight/location.href/document.title)
869
- * вычислялись бы от глобалов: недетерминированны в тестах и недоступны в Node;
870
- * title — из input, иначе root.ownerDocument.title (портативный фолбэк — фикс
871
- * packaging-smoke demo:cache-diff).
872
- */
873
-
874
848
  /** Результат snapshot(): полный документ (1-й вызов / URL change) или дифф. */
875
849
  type SnapshotResult = VslDocument | VslDiff;
876
850
  /** Type guard: различение диффа и полного документа (контракт T1.2.4). */
@@ -909,11 +883,26 @@ declare class VslSnapshotSession {
909
883
  private lastDocument;
910
884
  private version;
911
885
  constructor(store?: CacheStore);
886
+ /**
887
+ * Сбрасывает состояние сессии (URL, viewport, документ, версия).
888
+ * Следующий вызов snapshot() вернёт полный документ (как первый вызов).
889
+ */
890
+ clear(): void;
891
+ /** Возвращает последний полный документ (не diff). */
892
+ getLastDocument(): VslDocument | null;
893
+ /** Текущая версия документа (инкрементируется при каждом diff). */
894
+ getVersion(): number;
912
895
  /**
913
896
  * Строит VSL из DOM поддерева root (extractDomTree → segmentTree →
914
897
  * buildVslDocument) и возвращает полный документ либо дифф (см. шапку).
915
898
  */
916
899
  snapshot(root: Element, input: SnapshotInput): SnapshotResult;
900
+ /**
901
+ * Вариант snapshot() для pre-extracted elements (MCP сервер, Node.js контекст).
902
+ * Принимает ExtractedElement[] напрямую (без DOM Element), проходит тот же
903
+ * pipeline: segmentTree → buildVslDocument → cache/diff.
904
+ */
905
+ snapshotFromElements(extractedElements: readonly ExtractedElement[], input: SnapshotInput): SnapshotResult;
917
906
  /**
918
907
  * Vision-вариант конвейера (T1.5.5): segmentTree → enrichWithVision (Level 5
919
908
  * fallback — аннотация t + vf/vf_meta на элементах ДО сборки) → buildVslDocument
@@ -922,8 +911,18 @@ declare class VslSnapshotSession {
922
911
  * (base64) возвращаются ОТДЕЛЬНО — в документе только метаданные (DEC-015).
923
912
  */
924
913
  snapshotWithVision(root: Element, input: SnapshotInput, vision: EnrichWithVisionDeps): Promise<VisionSnapshotResult>;
914
+ /**
915
+ * Vision-вариант для pre-extracted elements (MCP сервер, Node.js контекст).
916
+ * Полный pipeline: segmentTree → enrichWithVision → buildVslDocument → cache/diff.
917
+ */
918
+ snapshotWithVisionFromElements(extractedElements: readonly ExtractedElement[], input: SnapshotInput, vision: EnrichWithVisionDeps): Promise<VisionSnapshotResult>;
925
919
  /** BuildOptions из input + портативный title (логика бывшего snapshot()). */
926
920
  private buildOptions;
921
+ /**
922
+ * BuildOptions из input без DOM Element (для snapshotFromElements).
923
+ * Title берётся только из input (нет фолбэка на root.ownerDocument.title).
924
+ */
925
+ private buildOptionsFromInput;
927
926
  /** Сборка документа + кэш/дифф (логика бывшего snapshot(), см. шапку модуля). */
928
927
  private commit;
929
928
  }
package/dist/index.js CHANGED
@@ -652,6 +652,8 @@ function objectsEqual(a, b) {
652
652
  return computeContentHash(a) === computeContentHash(b) && computeCoordHash(a) === computeCoordHash(b);
653
653
  }
654
654
  function tuple2Equal(a, b) {
655
+ if (a === null || a === void 0) return b === null || b === void 0;
656
+ if (b === null || b === void 0) return false;
655
657
  return a[0] === b[0] && a[1] === b[1];
656
658
  }
657
659
  function stringArrayEqual(a, b) {
@@ -788,6 +790,25 @@ var VslSnapshotSession = class {
788
790
  constructor(store = createCacheStore()) {
789
791
  this.store = store;
790
792
  }
793
+ /**
794
+ * Сбрасывает состояние сессии (URL, viewport, документ, версия).
795
+ * Следующий вызов snapshot() вернёт полный документ (как первый вызов).
796
+ */
797
+ clear() {
798
+ this.store.clear();
799
+ this.lastUrl = null;
800
+ this.lastViewport = null;
801
+ this.lastDocument = null;
802
+ this.version = 0;
803
+ }
804
+ /** Возвращает последний полный документ (не diff). */
805
+ getLastDocument() {
806
+ return this.lastDocument;
807
+ }
808
+ /** Текущая версия документа (инкрементируется при каждом diff). */
809
+ getVersion() {
810
+ return this.version;
811
+ }
791
812
  /**
792
813
  * Строит VSL из DOM поддерева root (extractDomTree → segmentTree →
793
814
  * buildVslDocument) и возвращает полный документ либо дифф (см. шапку).
@@ -796,6 +817,15 @@ var VslSnapshotSession = class {
796
817
  const elements = segmentTree(extractDomTree(root));
797
818
  return this.commit(elements, this.buildOptions(root, input), input);
798
819
  }
820
+ /**
821
+ * Вариант snapshot() для pre-extracted elements (MCP сервер, Node.js контекст).
822
+ * Принимает ExtractedElement[] напрямую (без DOM Element), проходит тот же
823
+ * pipeline: segmentTree → buildVslDocument → cache/diff.
824
+ */
825
+ snapshotFromElements(extractedElements, input) {
826
+ const elements = segmentTree(extractedElements);
827
+ return this.commit(elements, this.buildOptionsFromInput(input), input);
828
+ }
799
829
  /**
800
830
  * Vision-вариант конвейера (T1.5.5): segmentTree → enrichWithVision (Level 5
801
831
  * fallback — аннотация t + vf/vf_meta на элементах ДО сборки) → buildVslDocument
@@ -809,6 +839,16 @@ var VslSnapshotSession = class {
809
839
  const snapshot = this.commit(elements, this.buildOptions(root, input), input);
810
840
  return { snapshot, fragments: visionResult.fragments };
811
841
  }
842
+ /**
843
+ * Vision-вариант для pre-extracted elements (MCP сервер, Node.js контекст).
844
+ * Полный pipeline: segmentTree → enrichWithVision → buildVslDocument → cache/diff.
845
+ */
846
+ async snapshotWithVisionFromElements(extractedElements, input, vision) {
847
+ const elements = segmentTree(extractedElements);
848
+ const visionResult = await enrichWithVision(elements, vision);
849
+ const snapshot = this.commit(elements, this.buildOptionsFromInput(input), input);
850
+ return { snapshot, fragments: visionResult.fragments };
851
+ }
812
852
  /** BuildOptions из input + портативный title (логика бывшего snapshot()). */
813
853
  buildOptions(root, input) {
814
854
  const options = {
@@ -820,6 +860,20 @@ var VslSnapshotSession = class {
820
860
  if (input.background !== void 0) options.background = input.background;
821
861
  return options;
822
862
  }
863
+ /**
864
+ * BuildOptions из input без DOM Element (для snapshotFromElements).
865
+ * Title берётся только из input (нет фолбэка на root.ownerDocument.title).
866
+ */
867
+ buildOptionsFromInput(input) {
868
+ const options = {
869
+ viewport: { width: input.viewport.width, height: input.viewport.height },
870
+ url: input.url
871
+ };
872
+ if (input.title !== void 0) options.title = input.title;
873
+ if (input.timestamp !== void 0) options.timestamp = input.timestamp;
874
+ if (input.background !== void 0) options.background = input.background;
875
+ return options;
876
+ }
823
877
  /** Сборка документа + кэш/дифф (логика бывшего snapshot(), см. шапку модуля). */
824
878
  commit(elements, options, input) {
825
879
  const nextDocument = buildVslDocument(elements, options);