@im-nobsidian/core 0.11.0 → 0.13.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
@@ -464,6 +464,66 @@ interface PushResult {
464
464
  readonly moved: number;
465
465
  readonly failed: FailedOperation[];
466
466
  readonly duration: number;
467
+ /**
468
+ * 볼트에서 고쳤지만 올리지 않은 읽기 전용 속성(수식 · 롤업 · ID …) — Notion 이 값을 정한다. 다음 pull 이 Notion
469
+ * 값으로 되돌리므로 화면이 알린다. 예전에는 로그 한 줄만 남아 고친 값이 말없이 사라졌다. 없으면 빈 목록 · 생략.
470
+ */
471
+ readonly readOnlySkipped?: readonly ReadOnlySkip[];
472
+ /**
473
+ * 볼트에서 지웠지만 Notion 에서 지우지 않은 노트(`sync.deleteSync` 꺼짐) — 다음 pull 이 Notion 에서 되살린다.
474
+ * 예전에는 아무 말 없이 대기로 적기만 해, 지운 파일이 다음 pull 에 말없이 돌아왔다(D8). 없으면 빈 목록 · 생략.
475
+ */
476
+ readonly unsentDeletions?: readonly string[];
477
+ /**
478
+ * 볼트에서 바꾼 DB 속성 이름(Obsidian 의 속성 이름 바꾸기)을 Notion 의 열 이름으로 바꾼 것 — dry-run 은 바꿀 것
479
+ * (ADR-045). 없으면 생략.
480
+ */
481
+ readonly renamedProperties?: readonly PropertyRename[];
482
+ /** 볼트에서 고친 사이드카의 속성을 Notion DB 에 올린 것 — dry-run 은 올릴 것(ADR-045). 없으면 생략. */
483
+ readonly schemaEdits?: readonly SchemaEdit[];
484
+ /** 볼트에서 고친 `.base` 보기를 Notion 보기에 올린 것(ADR-046) — dry-run 이면 올릴 것. */
485
+ readonly viewEdits?: readonly ViewEdit[];
486
+ }
487
+ /** 고친 `.base` 의 보기 하나가 Notion 보기에 한 일 — {@link PushResult.viewEdits}. */
488
+ interface ViewEdit {
489
+ /** `.base` 경로. */
490
+ readonly path: string;
491
+ /** 보기 이름(바꿨으면 새 이름). */
492
+ readonly view: string;
493
+ /** 이름을 바꿨으면 옛 이름. */
494
+ readonly from?: string;
495
+ /** 올린 것 — 이름 · 열 · 정렬 · 필터. */
496
+ readonly changed: readonly ("name" | "columns" | "sort" | "filter")[];
497
+ }
498
+ /** 고친 사이드카 하나가 Notion DB 에 한 일 — {@link PushResult.schemaEdits}. */
499
+ interface SchemaEdit {
500
+ /** 사이드카 경로. */
501
+ readonly path: string;
502
+ readonly added: readonly string[];
503
+ readonly removed: readonly string[];
504
+ /** 옛 이름 → 새 이름. */
505
+ readonly renamed: ReadonlyArray<readonly [string, string]>;
506
+ /** 속성 이름 → 새 타입. */
507
+ readonly retyped: ReadonlyArray<readonly [string, string]>;
508
+ /** 설정(수식 · 숫자 형식 · 옵션)을 바꾼 속성. */
509
+ readonly redefined: readonly string[];
510
+ /**
511
+ * 지운 선택 옵션 — 속성 이름 → 옵션 이름. Notion 은 그 옵션을 가진 행의 값을 비운다(옵션 이름을 바꾼 것도 지우고
512
+ * 새로 만든 것이다). 없으면 지운 옵션이 없다.
513
+ */
514
+ readonly droppedOptions?: ReadonlyArray<readonly [string, readonly string[]]>;
515
+ }
516
+ /** 볼트에서 바꾼 DB 속성 이름 하나 — {@link PushResult.renamedProperties}. */
517
+ interface PropertyRename {
518
+ /** DB 폴더. */
519
+ readonly folder: string;
520
+ readonly from: string;
521
+ readonly to: string;
522
+ }
523
+ /** 노트 하나에서 올리지 않은 읽기 전용 속성. */
524
+ interface ReadOnlySkip {
525
+ readonly path: string;
526
+ readonly properties: readonly string[];
467
527
  }
468
528
  /**
469
529
  * 전체 대조를 한 이유 (ADR-027).
@@ -490,13 +550,30 @@ interface RemoteScanInfo {
490
550
  readonly nextFullAt: string | null;
491
551
  /**
492
552
  * Notion 에서 지운 노트가 아직 볼트에 반영되지 않았을 수 있나 — 바뀐 것만 찾았고 원격 삭제를 볼트에
493
- * 반영하는 설정(`sync.deleteSync`)일 때. 다음 전체 대조가 반영한다. 설정이 꺼져 있으면 원격 삭제는
553
+ * 반영하는 설정(`sync.deleteSync`)일 때. pull 은 추적 중인 것을 차례로 몇 개씩 묻는다 — 이번에 모두
554
+ * 물었으면 false 다. 나머지는 다음 pull 들 · 다음 전체 대조가 반영한다. 설정이 꺼져 있으면 원격 삭제는
494
555
  * 볼트에 반영하지 않으므로 늘 false 다.
495
556
  */
496
557
  readonly deletionsDeferred: boolean;
497
558
  /** 바뀐 것이 보이지 않아 조회하지 않은 DB 수 — pull 에만. */
498
559
  readonly skippedDatabases?: number;
499
560
  }
561
+ /** Notion 에서 바뀐 DB 속성을 행 노트의 키에 옮긴 것(ADR-045). */
562
+ interface SchemaFollowed {
563
+ /** DB 폴더. */
564
+ readonly folder: string;
565
+ /** 옛 이름 → 새 이름. */
566
+ readonly renamed: ReadonlyArray<readonly [string, string]>;
567
+ /** Notion 에서 지운 속성. */
568
+ readonly removed: readonly string[];
569
+ /** 키를 바꾼 행 노트 수. */
570
+ readonly rows: number;
571
+ /** 지운 속성이지만 올리지 않은 로컬 값이 있어 노트에 남긴 키. */
572
+ readonly kept: ReadonlyArray<{
573
+ readonly path: string;
574
+ readonly key: string;
575
+ }>;
576
+ }
500
577
  interface PullResult {
501
578
  readonly created: number;
502
579
  readonly updated: number;
@@ -507,6 +584,19 @@ interface PullResult {
507
584
  * 파일이 없어졌다가 복구됐다는 사실 자체를 알 수 없다.
508
585
  */
509
586
  readonly restored: number;
587
+ /** 되살린(dry-run 은 되살릴) 노트 · 행의 경로 — {@link restored} 의 목록. 없으면 생략. */
588
+ readonly restoredPaths?: readonly string[];
589
+ /**
590
+ * 볼트에서 고쳐 덮어쓰지 않은 사이드카(`.notion.json`) — push 하면 고친 속성을 Notion 에 올린다(ADR-045). 없으면 생략.
591
+ */
592
+ readonly heldSidecars?: readonly string[];
593
+ /**
594
+ * 볼트에서 보기를 고쳐 덮어쓰지 않은 `.base` — push 하면 고친 보기 이름 · 열 · 정렬 · 필터를 Notion 에 올린다(ADR-046).
595
+ * 없으면 생략.
596
+ */
597
+ readonly heldBases?: readonly string[];
598
+ /** Notion 에서 바뀐 속성을 행 노트에 옮긴 DB 마다(ADR-045). 없으면 생략. */
599
+ readonly schemaFollowed?: readonly SchemaFollowed[];
510
600
  readonly conflicts: Conflict[];
511
601
  readonly writtenPaths: string[];
512
602
  readonly failed: FailedOperation[];
@@ -760,6 +850,13 @@ interface ViewRequest {
760
850
  readonly quick_filters?: Record<string, unknown>;
761
851
  readonly configuration?: Record<string, unknown>;
762
852
  }
853
+ /** `views.update` 에 보낼 고침 — 보내지 않은 항목은 그대로, null 은 지운다. */
854
+ interface ViewUpdateRequest {
855
+ readonly name?: string;
856
+ readonly filter?: unknown;
857
+ readonly sorts?: unknown[] | null;
858
+ readonly configuration?: Record<string, unknown>;
859
+ }
763
860
  interface DatabaseViewsConfig {
764
861
  readonly databaseId: string;
765
862
  readonly databaseName?: string;
@@ -1266,6 +1363,8 @@ declare class PropertyMapper {
1266
1363
  * 호출측이 기준에서 빼 두고 다시 보낸다.
1267
1364
  */
1268
1365
  relationKeys(keys: readonly string[]): string[];
1366
+ /** 이 속성들 가운데 Notion 이 값을 정하는 것(수식 · 롤업 · ID · 생성일 …) — 볼트에서 고쳐도 보낼 수 없다. */
1367
+ readOnlyKeys(keys: readonly string[]): string[];
1269
1368
  /**
1270
1369
  * 값을 보낼 수 있는 속성만, pull 이 적는 모양으로 — 원격 값과 로컬 값을 견줄 때 쓴다.
1271
1370
  *
@@ -1379,10 +1478,14 @@ interface DatabaseMeta {
1379
1478
  readonly databaseId: string;
1380
1479
  /** DB 제목. 없으면 "". */
1381
1480
  readonly title: string;
1382
- /** 행을 조회할 data source. 비었으면 옛 단일 소스 DB 다 — DB id 로 조회한다. */
1481
+ /**
1482
+ * 행을 조회할 data source. 비었으면 옛 단일 소스 DB 다 — DB id 로 조회한다. `properties` 는 그 소스만의 속성
1483
+ * 스키마(읽지 못했으면 없다) — 속성 id 는 소스마다 따로 붙는다.
1484
+ */
1383
1485
  readonly dataSources: ReadonlyArray<{
1384
1486
  readonly id: string;
1385
1487
  readonly name: string;
1488
+ readonly properties?: Readonly<Record<string, unknown>>;
1386
1489
  }>;
1387
1490
  /**
1388
1491
  * 속성 스키마 — 읽을 수 있는 모든 data source 의 속성을 합친 것(이름이 겹치면 앞의 것). 읽을 수 있는 data
@@ -1473,6 +1576,8 @@ declare class NotionClient {
1473
1576
  title: string;
1474
1577
  properties?: Record<string, unknown>;
1475
1578
  children?: BlockObjectResponse[];
1579
+ /** 행을 둘 data source — 데이터 소스가 여럿인 DB 는 이것이 있어야 만든다. */
1580
+ dataSourceId?: string;
1476
1581
  }): Promise<PageObjectResponse>;
1477
1582
  /**
1478
1583
  * 페이지 아래에 DB 를 만든다(ADR-036). 같은 요청이 두 번 적용되면 DB 가 둘이 된다 — 다시 보내지 않는다.
@@ -1507,6 +1612,8 @@ declare class NotionClient {
1507
1612
  title: string;
1508
1613
  markdown: string;
1509
1614
  properties?: Record<string, unknown>;
1615
+ /** 행을 둘 data source — 데이터 소스가 여럿인 DB 는 이것이 있어야 만든다. */
1616
+ dataSourceId?: string;
1510
1617
  }): Promise<PageObjectResponse>;
1511
1618
  /**
1512
1619
  * {@link createPageWithMarkdown} 이 버린 맨 앞 `# H1` 을 되살린다 — 그 markdown 이 H1 으로
@@ -1802,6 +1909,11 @@ declare class NotionClient {
1802
1909
  }): Promise<string>;
1803
1910
  /** 보기를 지운다. DB 의 마지막 보기는 지우지 못한다(400). */
1804
1911
  deleteView(viewId: string): Promise<void>;
1912
+ /**
1913
+ * 보기를 고친다(ADR-046). 보내지 않은 항목은 그대로 두고 null 은 지운다. `configuration.properties` 는 통째로 바뀐다 —
1914
+ * 목록에 없는 속성은 숨겨지고 목록 차례가 열 차례다(2026-10-29 실측).
1915
+ */
1916
+ updateView(viewId: string, request: ViewUpdateRequest): Promise<void>;
1805
1917
  getView(viewId: string): Promise<ViewConfig | null>;
1806
1918
  getDatabaseViewsConfig(databaseId: string): Promise<DatabaseViewsConfig>;
1807
1919
  extractCover(page: PageObjectResponse): PageCover | null;
@@ -1826,6 +1938,12 @@ declare class NotionClient {
1826
1938
  * 슬롯을 붙잡아 남을 막는 대신, 다 같이 보는 이 게이트로 쉬게 한다.
1827
1939
  */
1828
1940
  private cooldownUntil;
1941
+ /**
1942
+ * Free 워크스페이스 블록 한도에 막힌 거절과 그 시각. 막힌 동안 블록을 만드는 요청은 보내지 않고 이 거절을 그대로
1943
+ * 돌려준다 — 플랜을 올리기 전에는 풀리지 않으므로 노트마다 같은 거절을 받으러 가지 않는다. 그 사이 플랜을
1944
+ * 올렸을 수 있어 {@link BLOCK_LIMIT_RECHECK_MS} 가 지나면 다시 보내 본다.
1945
+ */
1946
+ private blockLimit;
1829
1947
  /**
1830
1948
  * 요청 1건을 rate limit 슬롯 안에서 실행하고, 재시도 가능한 실패는 백오프 후 다시 시도한다.
1831
1949
  *
@@ -1953,6 +2071,29 @@ declare class NotionBlockBuilder {
1953
2071
  static table(rows: string[][], hasColumnHeader?: boolean, hasRowHeader?: boolean): NotionBlock;
1954
2072
  }
1955
2073
 
2074
+ /** 찾을 레코드 — {@link IStateDB.getAll} 이 그대로 만족한다. */
2075
+ interface NestedFolderRecord {
2076
+ readonly obsidianPath: string;
2077
+ readonly notionPageId: string | null;
2078
+ readonly notionParentId: string | null;
2079
+ readonly fileType: string;
2080
+ }
2081
+ /** 두 겹 하나 — 바깥(Notion 부모)과 안쪽(같은 이름의 자식). */
2082
+ interface NestedFolderPage {
2083
+ /** 두 겹이 나타내는 볼트 폴더. */
2084
+ readonly folder: string;
2085
+ readonly outer: {
2086
+ readonly path: string;
2087
+ readonly notionPageId: string;
2088
+ };
2089
+ readonly inner: {
2090
+ readonly path: string;
2091
+ readonly notionPageId: string;
2092
+ };
2093
+ }
2094
+ /** 같은 폴더를 나타내면서 Notion 에서 부모 · 자식인 레코드 쌍. 폴더 경로 순. */
2095
+ declare function findNestedFolderPages(records: readonly NestedFolderRecord[]): NestedFolderPage[];
2096
+
1956
2097
  /**
1957
2098
  * DB 완결성 게이트 — "원격에 있는 행이 볼트에도 전부 있는가"를 대조한다.
1958
2099
  *
@@ -1981,6 +2122,7 @@ declare class NotionBlockBuilder {
1981
2122
  * 를 순회하는 SSOT — 하나만 쓴다. 여기서 별도 쿼리를 짜면 검증기가 피검증 대상과 다른
1982
2123
  * 열거 규칙을 갖게 돼, 게이트가 통과해도 실제 pull 은 놓치는 상황이 생긴다.
1983
2124
  */
2125
+
1984
2126
  /** 원격 행 열거 — {@link NotionClient} 가 그대로 만족한다(전 data source 순회 SSOT). */
1985
2127
  interface CompletenessRemoteSource {
1986
2128
  queryAllDatabasePages(databaseId: string, filter?: unknown): Promise<Array<{
@@ -2080,6 +2222,11 @@ interface VaultCompletenessReport {
2080
2222
  readonly databases: CompletenessReport;
2081
2223
  /** 페이지 모드에서만 채워진다. DB 모드에는 root 서브트리가 없어 `null`. */
2082
2224
  readonly pages: PageCompletenessReport | null;
2225
+ /**
2226
+ * 같은 이름의 두 겹 폴더 페이지 — 예전 빌드가 남긴 것(ADR-012). 알리기만 한다: 사람이 정할 일이라
2227
+ * `complete` 에 넣지 않는다.
2228
+ */
2229
+ readonly nestedFolderPages: readonly NestedFolderPage[];
2083
2230
  /** 두 대조가 모두 통과. */
2084
2231
  readonly complete: boolean;
2085
2232
  }
@@ -2161,6 +2308,11 @@ interface VaultFS {
2161
2308
  moveFile(from: string, to: string): Promise<void>;
2162
2309
  exists(path: string): Promise<boolean>;
2163
2310
  ensureFolder(path: string): Promise<void>;
2311
+ /**
2312
+ * 폴더가 완전히 비었으면 지운다 — 파일 · 폴더 · 숨김 파일이 하나라도 있으면 두고 false. 없거나 폴더가 아니어도
2313
+ * false. Notion 에서 지운 폴더 페이지의 폴더를 치울 때 쓴다. 없으면 폴더를 지우지 않는다.
2314
+ */
2315
+ removeEmptyFolder?(path: string): Promise<boolean>;
2164
2316
  listMarkdownFiles(): Promise<FileInfo[]>;
2165
2317
  listMarkdownFileStats(): Promise<FileStatInfo[]>;
2166
2318
  listNonMarkdownFiles(): Promise<NonMdFileInfo[]>;
@@ -2247,6 +2399,17 @@ interface BaseFileOptions {
2247
2399
  readonly rangeEnds?: ReadonlyMap<string, string>;
2248
2400
  }
2249
2401
  type BasesViewType = "table" | "cards" | "list";
2402
+ /** `.base` 에 쓴 보기 하나가 어느 Notion 보기에서 왔나 — `views[]` 와 같은 차례(push 가 고친 보기를 올린다, ADR-046). */
2403
+ interface WrittenBasesView {
2404
+ readonly viewId: string;
2405
+ /** Notion 필터 가운데 `.base` 로 옮기지 못한 조건이 있다 — 볼트의 필터로 Notion 필터를 덮으면 그 조건이 사라진다. */
2406
+ readonly lossyFilter: boolean;
2407
+ }
2408
+ /** `.base` 내용과 그 안의 보기들의 출처. */
2409
+ interface GeneratedBaseFile {
2410
+ readonly content: string;
2411
+ readonly views: readonly WrittenBasesView[];
2412
+ }
2250
2413
  /** Notion 뷰 하나를 Bases 로 옮길 때의 판정. */
2251
2414
  interface BasesViewMapping {
2252
2415
  /** Bases 뷰 타입. `null` = 대응이 없어 `.base` 에 실을 수 없음. */
@@ -2260,9 +2423,9 @@ interface BasesViewMapping {
2260
2423
  /**
2261
2424
  * Notion 뷰 타입 → Obsidian Bases 뷰 매핑(SSOT).
2262
2425
  *
2263
- * 뷰는 현재 pull-authoritative — Notion API 가 2026-03-19 뷰 생성/수정/삭제를 열었지만
2264
- * 본 프로젝트는 아직 뷰 write-back 을 구현하지 않았다(로드맵 항목). push 로 되돌릴 수
2265
- * 없는 동안 "조용한 유실 금지"는 곧 "보존 + 정직한 degrade 리포트"를 의미한다.
2426
+ * 볼트에서 고친 보기의 이름 · 열 · 정렬 · 필터는 push 가 Notion 보기에 올린다(ADR-046). 보기 타입은 옮기지
2427
+ * 않는다 — 대응이 없는 것은 "보존 + 정직한 degrade 리포트"다. 칸반(Bases 1.14)은 최소 지원 버전(1.12.4)에
2428
+ * 없어 보드를 카드로 둔다.
2266
2429
  *
2267
2430
  * 달력·타임라인은 예전에 `null` 이었다 — 즉 `.base` 에서 **통째로 사라졌다**. 사이드카에는
2268
2431
  * 남지만 Obsidian 을 여는 사람 눈에는 그 뷰가 애초에 없었던 것처럼 보인다. 격자·축은
@@ -2276,6 +2439,8 @@ declare function basesViewMappingOf(notionType: string): BasesViewMapping;
2276
2439
  declare function basesViewTypeOf(notionType: string): BasesViewType | null;
2277
2440
  declare class BaseFileGenerator {
2278
2441
  generate(options: BaseFileOptions): string;
2442
+ /** `.base` 내용과 함께 쓴 보기마다 어느 Notion 보기에서 왔는지 돌려준다 — pull 이 기록해 push 가 견준다. */
2443
+ generateWithViews(options: BaseFileOptions): GeneratedBaseFile;
2279
2444
  private writeFilters;
2280
2445
  private needsContentCoverFormula;
2281
2446
  private writeFormulas;
@@ -2489,6 +2654,12 @@ declare class SyncOrchestrator {
2489
2654
  private readonly databaseSyncer;
2490
2655
  /** DB 행 push 용 — DB 마다 스키마를 읽은 매퍼. 실행마다 비운다(S-01). */
2491
2656
  private readonly rowSchemas;
2657
+ /** 볼트에서 바꾼 DB 속성 이름을 Notion 의 열 이름으로(ADR-045). */
2658
+ private readonly vaultRenames;
2659
+ /** 볼트에서 고친 사이드카의 속성을 Notion DB 의 열로(ADR-045). */
2660
+ private readonly sidecarEdits;
2661
+ /** 볼트에서 고친 `.base` 의 보기를 Notion 보기로(ADR-046). */
2662
+ private readonly viewEdits;
2492
2663
  private readonly observation;
2493
2664
  private readonly placement;
2494
2665
  private readonly databaseCreator;
@@ -2516,6 +2687,11 @@ declare class SyncOrchestrator {
2516
2687
  */
2517
2688
  private assertConnectionScope;
2518
2689
  private executePush;
2690
+ /**
2691
+ * 볼트에서 지운 이 노트를 Notion 에서 지우지 않아 다음 pull 이 되살리나 — deleteSync 가 꺼져 있고 pull 이
2692
+ * 되살리는 레코드일 때. 예전에는 대기로 적기만 하고 알리지 않아, 지운 파일이 말없이 돌아왔다(D8).
2693
+ */
2694
+ private unsentDeletion;
2519
2695
  /**
2520
2696
  * 만든 DB 에 relation · rollup · formula 를 붙이고, 행 스키마를 다시 읽게 한 뒤 보기를 만든다. 실패는
2521
2697
  * 다음 push 가 이어 붙인다 — 행은 그대로 올린다.
@@ -2634,6 +2810,8 @@ declare class NodeVaultFS implements VaultFS {
2634
2810
  writeFile(path: string, content: string): Promise<void>;
2635
2811
  writeBinary(path: string, data: Buffer): Promise<void>;
2636
2812
  deleteFile(path: string): Promise<void>;
2813
+ /** `rmdir` 는 비지 않은 폴더를 지우지 않는다(ENOTEMPTY) — 숨김 파일도 그대로 둔다. */
2814
+ removeEmptyFolder(path: string): Promise<boolean>;
2637
2815
  moveFile(from: string, to: string): Promise<void>;
2638
2816
  exists(path: string): Promise<boolean>;
2639
2817
  ensureFolder(path: string): Promise<void>;
@@ -2692,6 +2870,8 @@ interface ImageDownloadResult {
2692
2870
  readonly fileHash?: string;
2693
2871
  /** 임베드 별칭으로 쓸 이름 — 받은 이름에서 이 볼트가 붙인 내용 해시를 뗀 것({@link withoutOwnHash}). */
2694
2872
  readonly name?: string;
2873
+ /** 크기 상한을 넘어 받지 않은 파일의 크기(바이트) — 받았거나 다른 이유로 못 받았으면 없다. */
2874
+ readonly skippedBytes?: number;
2695
2875
  }
2696
2876
  interface ImageUploadResult {
2697
2877
  readonly localPath: string;
@@ -2982,14 +3162,55 @@ declare class ConversionPipeline {
2982
3162
  private readonly postProcessors;
2983
3163
  registerPreProcessor(processor: Processor): void;
2984
3164
  registerPostProcessor(processor: Processor): void;
3165
+ /**
3166
+ * 토글 헤딩은 Markdown API 경로가 변환한다(`toggle-heading.ts`) — 블록 경로로 보내면 콜아웃이 옛 이모지 꼴로
3167
+ * 바뀐다(`CalloutTransformer`). 예전에 여기 있던 토글 헤딩 탐지는 띄어 쓴 마커를 찾아 한 번도 맞지 않았다.
3168
+ */
2985
3169
  selectPath(content: string): ConversionPath;
2986
3170
  convertToNotion(markdown: string, context: ConversionContext): ConversionResult;
2987
3171
  convertToMarkdown(content: string, context: ConversionContext, metadata?: ProcessorMetadata): string;
2988
3172
  }
2989
3173
 
3174
+ /**
3175
+ * pull 이 `.base` 에 쓴 보기 하나의 기록 — push 가 볼트에서 고친 보기를 이것과 견줘 Notion 보기에 올린다(ADR-046).
3176
+ *
3177
+ * 견주는 값(이름 · 열 · 정렬 · 필터)은 쓴 글자가 아니라 **YAML 로 읽은 값**이다. Obsidian 은 보기를 고치면 `.base` 를
3178
+ * 통째로 다시 쓴다 — 주석이 사라지고 키 차례 · 따옴표가 바뀐다(1.13.7 실측). 읽은 값으로 견줘야 그런 차이를 고친 것으로
3179
+ * 보지 않는다.
3180
+ */
3181
+ interface BaseViewRecord {
3182
+ readonly viewId: string;
3183
+ /** Bases 보기 타입 — 이름을 바꾼 보기를 자리로 찾을 때 같은 타입인지 본다. */
3184
+ readonly type: string;
3185
+ readonly name: string;
3186
+ readonly order?: readonly string[];
3187
+ readonly sort?: readonly BasesSort[];
3188
+ readonly filters?: unknown;
3189
+ /** Notion 필터에 `.base` 로 옮기지 못한 조건이 있었다 — 볼트의 필터로 덮으면 그 조건이 사라진다. */
3190
+ readonly lossyFilter?: true;
3191
+ /** 그때 Notion 보기의 지문({@link viewFingerprint}) — 그 사이 Notion 에서도 고쳤는지 가른다. */
3192
+ readonly notion: string;
3193
+ }
3194
+ interface BasesSort {
3195
+ readonly property: string;
3196
+ readonly direction: string;
3197
+ }
3198
+
2990
3199
  interface DbBaseFile {
2991
3200
  readonly basePath: string;
2992
3201
  readonly title: string;
3202
+ /**
3203
+ * pull 이 그 경로에 마지막으로 쓴 내용의 해시 — 파일이 이것과 다르면 볼트에서 고친 것이라 덮어쓰지 않는다. 예전 버전이
3204
+ * 적은 기록에는 없다 — 그때는 가를 수 없어 예전처럼 쓰고, 쓴 해시부터 적는다.
3205
+ */
3206
+ readonly hash?: string;
3207
+ /**
3208
+ * pull 이 쓴 보기들 — 볼트에서 고친 보기를 push 가 Notion 보기에 올릴 때 견준다(ADR-046). pull 이 이 경로에 쓴
3209
+ * 파일에만 있다(직접 만든 `.base` 에는 없다).
3210
+ */
3211
+ readonly views?: readonly BaseViewRecord[];
3212
+ /** 올리지 않는 나머지의 지문(`restSignature`) — 같아야 고친 것을 모두 올린 것이다. */
3213
+ readonly rest?: string;
2993
3214
  }
2994
3215
  /**
2995
3216
  * DB 마다 실제로 기록한 `.base` 경로와 DB 제목 — 인라인 DB placeholder 를 `.base` 임베드로 바꿀 때
@@ -3007,6 +3228,8 @@ declare class DbBaseFiles {
3007
3228
  private loadedRaw;
3008
3229
  constructor(stateDb: Pick<IStateDB, "getMeta" | "setMeta">);
3009
3230
  get(databaseId: string): DbBaseFile | undefined;
3231
+ /** 기록한 DB 모두 — 키는 줄인 DB id. */
3232
+ all(): Array<[string, DbBaseFile]>;
3010
3233
  set(databaseId: string, info: DbBaseFile): void;
3011
3234
  /** 상태 메타에서 읽는다 — 값이 그대로면 읽어 둔 것을 쓴다. 없거나 깨졌으면 비어 있다 — 이번 실행이 기록하는 것부터 다시 쌓는다. */
3012
3235
  private load;
@@ -3151,17 +3374,29 @@ declare class DatabaseSyncer {
3151
3374
  */
3152
3375
  private readonly appearances;
3153
3376
  private readonly baseFileGenerator;
3154
- /** 사용자가 만든 `.base` 라 덮어쓰지 않았다고 이미 알린 경로 — 한 pull 이 같은 DB 를 여러 번 다시 쓴다. */
3377
+ /** 사용자가 만들거나 고친 `.base` 라 덮어쓰지 않았다고 이미 알린 경로 — 한 pull 이 같은 DB 를 여러 번 다시 쓴다. */
3155
3378
  private readonly keptUserBases;
3156
3379
  private readonly sidecarGenerator;
3157
3380
  /** Notion 에서 바꾼 제목으로 이름을 바꾼 행과 실제로 옮긴 차례 — pull 마감이 가져가 다른 노트의 링크를 고친다. */
3158
3381
  private readonly relocator;
3159
3382
  private renamedRows;
3383
+ /** 볼트에서 사라져 되살린 행의 경로 — pull 마감이 가져가 화면에 알린다(D8). */
3384
+ private restoredRows;
3385
+ /** Notion 에서 바뀐 속성을 행 노트에 옮긴 것 — pull 마감이 가져가 화면에 알린다(ADR-045). */
3386
+ private schemaFollowed;
3387
+ /** pull 이 마지막으로 쓴 사이드카 — 볼트에서 고친 것은 덮어쓰지 않는다(ADR-045). */
3388
+ private readonly sidecarBases;
3389
+ /** 이번 pull 이 고쳐 둔 것이라 덮어쓰지 않은 사이드카 경로. */
3390
+ private heldSidecars;
3391
+ /** 이번 pull 이 볼트에서 고친 것이라 덮어쓰지 않은 `.base` 경로(ADR-046). */
3392
+ private heldBases;
3160
3393
  /**
3161
3394
  * 실제로 기록한 .base 경로/DB 제목 — placeholder 임베드 재작성(F22)의 SSOT. 이번 pull 이 조회하지
3162
3395
  * 않은 DB 의 것도 남아 있다({@link DbBaseFiles}).
3163
3396
  */
3164
3397
  readonly baseFileInfo: DbBaseFiles;
3398
+ /** DB 마다 지난 pull 이 본 속성 — Notion 에서 바꾼 속성 이름을 행 노트에 옮기는 근거(ADR-045). */
3399
+ private readonly schemaLedger;
3165
3400
  private get decorations();
3166
3401
  constructor(config: Config, stateDb: IStateDB, notionClient: NotionClient, vaultFs: VaultFS, pipeline: ConversionPipeline, imageHandler: ImageHandler,
3167
3402
  /**
@@ -3252,30 +3487,53 @@ declare class DatabaseSyncer {
3252
3487
  * (틀린) 전제로 db-row 를 제외해 두었기에 양쪽 어디에도 복원 경로가 없는 상태였다.
3253
3488
  * deleteSync 가 켜져 있으면 되살리지 않는다 — 지운 것은 Notion 에서도 지우라는 뜻이고, sync 는
3254
3489
  * pull 을 먼저 돌려 되살리면 뒤이은 push 가 지울 것을 잃는다(detectMissingLocalFiles 와 같다).
3255
- * · 예전 버전이 적은 날짜 모양이 남은 행은 그 줄만 새 모양으로 고쳐 쓴다({@link outdatedDateForm},
3256
- * F-08).
3490
+ * · 예전 버전이 적은 날짜 모양이 남은 행, Notion 이 새로 만들거나 타입을 바꾼 속성의 값이 다른 행은 그 줄만
3491
+ * 고쳐 쓴다({@link staleKeysToRewrite}, F-08 · ADR-045).
3492
+ *
3493
+ * @param refreshed 이 행의 data source 에서 새로 생기거나 타입이 바뀐 속성의 키(ADR-045).
3257
3494
  */
3258
3495
  private rowAction;
3259
3496
  /**
3260
- * 원격이 그대로인 행이지만 예전 버전이 적은 날짜 모양(`…Z` · `…+09:00` · `{start, end}`)이 남아 새
3261
- * 모양으로 고쳐 쓸 행인가(F-08, {@link PropertyMapper.outdatedDateKeys}). 고쳐 쓰면 사본도 새 모양이
3262
- * 되어 다음 pull 은 건너뛴다.
3497
+ * 원격이 그대로인 행이지만 그 줄만 고쳐 쓸 키가 있는가 — 예전 버전이 적은 날짜 모양(`…Z` · `…+09:00` ·
3498
+ * `{start, end}`, F-08, {@link PropertyMapper.outdatedDateKeys}), 또는 Notion 이 새로 만들거나 타입을 바꾼
3499
+ * 속성의 값이 적힌 것과 다른 키(ADR-045 — 수식 열을 더하면 행마다 값이 생기지만 행의 수정 시각은 그대로다).
3500
+ * 고쳐 쓰면 사본도 새 값이 되어 다음 pull 은 건너뛴다.
3263
3501
  *
3264
3502
  * 지난 동기화 뒤 로컬을 고친 행은 고르지 않는다 — 로컬 편집을 지키느라 쓰지 않으니 pull 마다 고르기만
3265
3503
  * 한다. 그 편집을 올린 뒤의 pull 이 고른다. 로컬 파일을 읽지 못하면 고르지 않는다.
3266
3504
  */
3267
- private outdatedDateForm;
3505
+ private staleKeysToRewrite;
3506
+ /** 적힌 frontmatter 에서 받은 값으로 고쳐 쓸 키 — {@link staleKeysToRewrite}. */
3507
+ private staleKeys;
3268
3508
  /**
3269
- * 예전 버전이 적은 날짜 모양이 남은 행에서 그 키들만 새 모양으로 고쳐 쓴다(F-08) — 원격이 그대로라 본문 ·
3270
- * 첨부는 다시 받지 않는다. 본문은 한 글자도 바꾸지 않고, 다른 키의 줄은 그대로 둔다(키 단위로 나눠 읽을
3271
- * 수 없는 frontmatter 는 값만 지킨다 — {@link mergeRowFrontmatter}).
3509
+ * 원격이 그대로인 행에서 {@link staleKeys} 의 키만 받은 값으로 고쳐 쓴다 — 본문 · 첨부는 다시 받지 않는다. 본문은
3510
+ * 한 글자도 바꾸지 않고, 다른 키의 줄은 그대로 둔다(키 단위로 나눠 읽을 수 없는 frontmatter 는 값만 지킨다 —
3511
+ * {@link mergeRowFrontmatter}).
3272
3512
  *
3273
3513
  * 예전에는 행을 통째로 다시 받았다. 행마다 본문을 읽어 요청이 늘고, 다시 그릴 때마다 달라지는 본문(빈
3274
3514
  * 블록 · 첨부 이름)까지 바뀌었다 — 실볼트 사본에서 다시 받은 149행 중 99행.
3275
3515
  *
3276
3516
  * 고른 뒤 로컬을 고쳤으면 쓰지 않는다(`skipped`) — 이어지는 push 가 올린다.
3277
3517
  */
3278
- private rewriteDateForms;
3518
+ private rewriteStaleKeys;
3519
+ /**
3520
+ * Notion 에서 바뀐 속성을 지난 pull 이 본 스키마와 id 로 견줘 행 노트에 옮긴다(ADR-045) — 이름을 바꾼 속성은 키
3521
+ * 이름을, 지운 속성은 키를. 새로 생기거나 타입이 바뀐 속성은 돌려준다 — 그대로인 행도 그 값을 고쳐 쓴다.
3522
+ *
3523
+ * 처음 보는 DB 는 견줄 것이 없어 적기만 한다. 행 하나라도 옮기지 못하면 본 스키마를 적지 않는다 — 다음 pull 이 다시
3524
+ * 옮긴다(이미 옮긴 행은 바꿀 것이 없다).
3525
+ *
3526
+ * @returns 바뀐 속성(data source → 바뀐 것, 바뀐 소스만)과 키를 바꾼 행의 레코드 id.
3527
+ */
3528
+ private followSchema;
3529
+ /** 옮긴 것을 pull 마감이 알리게 적는다 — 이름 바꿈 · 지움이 있었던 DB 만. 날짜 범위 끝 키는 따로 세지 않는다. */
3530
+ private noteSchemaFollowed;
3531
+ /** 이번 pull 이 행 노트에 옮긴 Notion 속성 변경 — 가져가면 비운다(ADR-045). */
3532
+ /** 고쳐 둔 것이라 덮어쓰지 않은 사이드카 — 가져가면 비운다. */
3533
+ takeHeldSidecars(): string[];
3534
+ /** 고쳐 둔 것이라 덮어쓰지 않은 `.base` — 가져가면 비운다. */
3535
+ takeHeldBases(): string[];
3536
+ takeSchemaFollowed(): SchemaFollowed[];
3279
3537
  /** 이 DB 의 추적 행 가운데 이번 조회에 없던 것 — 지워졌는지는 아직 모른다. */
3280
3538
  private unlistedRows;
3281
3539
  /**
@@ -3309,8 +3567,8 @@ declare class DatabaseSyncer {
3309
3567
  */
3310
3568
  private appearanceOf;
3311
3569
  private readAppearance;
3312
- /** pull 이 쓰지 않은 `.base` · 사이드카가 이미 있는가 — 없거나 읽지 못하면 false. */
3313
- private isUserFile;
3570
+ /** 볼트에서 고친 `.base` 를 덮어쓰거나 지우지 않았다고 한 번 알린다. */
3571
+ private warnEditedBase;
3314
3572
  /**
3315
3573
  * DB 제목이 바뀌면 `.base`/`.notion.json` 파일명(safeName)이 바뀌어 옛 이름의 산출물이
3316
3574
  * 같은 폴더에 고아로 잔존한다(drift·부활 원인). DB 폴더 **직속**의 산출물 중 현재 이름이
@@ -3376,6 +3634,8 @@ declare class DatabaseSyncer {
3376
3634
  * (아직 push 하지 않은 노트)을 새 행이 덮어쓰면 그 글이 사라졌다. 일반 페이지 받기(`claimFilePath`)처럼 피한다.
3377
3635
  */
3378
3636
  private rowPathOwners;
3637
+ /** 되살린 행의 경로를 가져가고 비운다. */
3638
+ takeRestoredRows(): string[];
3379
3639
  /** 이름을 바꾼 행을 가져가고 비운다. */
3380
3640
  takeRenamedRows(): {
3381
3641
  renamed: RemoteMove[];
@@ -3535,15 +3795,15 @@ declare class FrontmatterGenerator implements Processor {
3535
3795
  * 핵심 전제(F28 교훈): DB 에 저장된 startIndex 는 **push 시점 문자열**의 절대
3536
3796
  * 오프셋이라 pull 산출물에서는 무의미하다 — 프론트매터 앞·단어 한가운데에
3537
3797
  * 마커를 박아 파일을 파손시켰다. 재삽입은 반드시
3538
- * 1) 이미 의미적으로 복원된 마커는 건너뛰고(위키링크 → `[[...]]` 존재 등),
3798
+ * 1) 다른 복원기가 맡는 마커는 건너뛰고(위키링크 · 미디어 · 표 정렬),
3539
3799
  * 2) 텍스트 앵커(__anchor)를 1차 위치 수단으로 쓰며,
3540
3800
  * 3) 프론트매터 뒤·줄 경계에만, 마커 단독 줄로 삽입한다.
3541
3801
  *
3542
3802
  * 이중 모드: `__anchor` 키가 없는 마커는 구버전 DB blob(수집기가 앵커를 안 남기던
3543
3803
  * 시절)이다. 이들은 구계약 — "변환이 마커만 제거했다면 startIndex 오프셋 원문 삽입이
3544
3804
  * 원본을 정확히 재구성한다" — 을 유지하되 프론트매터 앞 삽입만 금지한다. 위해한
3545
- * 레거시 사례(빈 params 껍데기, 이미 복원된 위키링크)는 render-null 폐기와 의미
3546
- * 복원 검사가 이미 걸러낸다.
3805
+ * 레거시 사례(빈 params 껍데기, 위키링크)는 render-null 폐기와 다른 복원기 검사가
3806
+ * 이미 걸러낸다.
3547
3807
  */
3548
3808
  declare class PreserveMarkerInjector implements Processor {
3549
3809
  readonly name = "PreserveMarkerInjector";
@@ -3551,8 +3811,8 @@ declare class PreserveMarkerInjector implements Processor {
3551
3811
  process(input: ProcessorInput): ProcessorOutput;
3552
3812
  /** 마커의 본문 표현. 복원 불가능한(빈) 마커는 null — 삽입하지 않고 폐기한다. */
3553
3813
  private renderMarker;
3554
- /** 마커가 이미 원래 문법으로 복원돼 있으면 재삽입은 중복·오염이다. */
3555
- private isSemanticallyRestored;
3814
+ /** 다른 복원기가 맡는 마커 — 본문에 다시 끼우면 중복 · 오염이다. */
3815
+ private restoredElsewhere;
3556
3816
  /** 삽입 위치: 앵커 → startIndex(줄 경계 보정) 순. 항상 프론트매터 뒤. */
3557
3817
  private findInsertionPoint;
3558
3818
  }
@@ -3804,7 +4064,7 @@ declare function resolvePropertyName(propertyId: string, schema: Record<string,
3804
4064
  *
3805
4065
  * ## 부분 번역의 안전 규칙 — 이 파일의 핵심
3806
4066
  *
3807
- * Notion 필터 문법은 Bases 보다 넓다(rollup any/every/none, 상대 날짜, formula 등).
4067
+ * Notion 필터 문법은 Bases 보다 넓다(rollup any/every/none, 이번 주(this_week), formula 등).
3808
4068
  * 못 옮기는 리프를 만났을 때 **어느 방향으로 틀릴지**는 논리 위치에 따라 다르다:
3809
4069
  *
3810
4070
  * - `and` 안에서 리프 하나를 버리면 조건이 느슨해진다 → 결과는 **상위집합**.
@@ -3987,7 +4247,9 @@ declare function notionIdsEqual(a: string, b: string): boolean;
3987
4247
  * markdown-api 경로(convertPageMentions)가 동일 형태로 수렴하도록 한다(rank20/I3).
3988
4248
  */
3989
4249
  declare function compactNotionId(id: string): string;
4250
+ declare function shortNotionId(id: string): string;
3990
4251
 
4252
+ /** Notion 제목 → 볼트 파일 이름(확장자 없이). */
3991
4253
  declare function sanitizeFileName(name: string): string;
3992
4254
 
3993
4255
  /** 노트(마크다운 파일)의 경로 · 이름인가. */
@@ -4142,6 +4404,7 @@ declare class FilteredVaultFS implements VaultFS {
4142
4404
  moveFile(from: string, to: string): Promise<void>;
4143
4405
  exists(path: string): Promise<boolean>;
4144
4406
  ensureFolder(path: string): Promise<void>;
4407
+ removeEmptyFolder(path: string): Promise<boolean>;
4145
4408
  getFileStat(path: string): Promise<FileStatInfo | null>;
4146
4409
  }
4147
4410
 
@@ -4211,6 +4474,7 @@ declare class ScopedVaultFS implements VaultFS {
4211
4474
  moveFile(from: string, to: string): Promise<void>;
4212
4475
  exists(path: string): Promise<boolean>;
4213
4476
  ensureFolder(path: string): Promise<void>;
4477
+ removeEmptyFolder(path: string): Promise<boolean>;
4214
4478
  /** 맡은 노트만 읽는다 — 볼트 전체의 본문을 읽지 않는다. */
4215
4479
  listMarkdownFiles(): Promise<FileInfo[]>;
4216
4480
  listMarkdownFileStats(): Promise<FileStatInfo[]>;
@@ -4348,6 +4612,16 @@ declare function parseDesignColor(token: string | undefined): DesignColor | unde
4348
4612
  /** 한 줄을 읽는다. 마커가 없는 줄은 글 조각 하나뿐인 결과를 돌려준다. */
4349
4613
  declare function readDesignLine(line: string): DesignLine;
4350
4614
 
4615
+ /** 제목 줄인가. */
4616
+ declare function isHeadingLine(line: string): boolean;
4617
+ /** 제목 아래로 내린 마커만 있는 줄인가 — 앞줄이 제목일 때 그 제목의 것이다. */
4618
+ declare function isHeadingMarkerLine(line: string): boolean;
4619
+ /**
4620
+ * 한 섹션의 원문 줄 — 섹션이 제목으로 끝나고 다음 줄이 그 제목의 마커 줄이면 제목 줄 끝에 붙여 돌려준다.
4621
+ * Obsidian 은 그 마커 줄을 다음 섹션으로 가르므로, 읽기 화면이 제목을 칠하려면 다음 줄을 함께 봐야 한다.
4622
+ */
4623
+ declare function sectionLinesWithHeadingMarkers(all: readonly string[], start: number, end: number): string[];
4624
+
4351
4625
  /**
4352
4626
  * Notion 컬럼이 볼트 노트의 어느 줄에 걸치나 (#74).
4353
4627
  *
@@ -4380,4 +4654,4 @@ declare function readColumnLayout(lines: readonly string[]): (ColumnPlace | unde
4380
4654
  /** 열 이름표 — `열 2/3 · 50%`. 비율이 없으면 `열 2/3`. */
4381
4655
  declare function columnLabel(place: ColumnPlace): string;
4382
4656
 
4383
- export { BaseFileGenerator, type BaseFileOptions, type BasePropertyOption, type BasePropertySchema, type BaseStatusGroup, type BaseSyncOptions, type BasesFilterNode, type BasesViewMapping, type BasesViewType, BlankLineCollapser, type BookmarkTarget, CONFIG_FILE, type CalendarEntry, type CalloutDesign, CalloutRestorer, CalloutTransformer, ChangeDetector, type ChangeDiff, ColorAnnotator, type ColumnPlace, type CompletenessFailure, type CompletenessLocalSource, type CompletenessOptions, type CompletenessRemoteSource, type CompletenessReport, type Config, ConfigManager, ConfigSchema, type Conflict, ConflictResolver, type ConflictStrategy, ConnectionBoundaryError, ConnectionScopeError, type ConversionContext, type ConversionPath, ConversionPipeline, type ConversionResult, type CoverConfig, type DBEntry, DB_VIEWS_FILE, DB_VIEWS_PATH, DEFAULT_CONFIG, DEFAULT_TITLE_PROPERTY, DEFAULT_WATCH_DEBOUNCE_MS, DIFF_SIGN, type DatabaseCompleteness, type DatabaseSyncConfig, type DatabaseSyncResult, DatabaseSyncer, type DatabaseViewsConfig, type DeferredCode, type DegradeNote, type DesignColor, type DesignLine, type DesignSegment, type DiffHunk, type DiffLine, EmbedResolver, EntryEditor, type FailedOperation, type FidelityClassification, type FidelityContext, type FidelityDefect, type FidelityDefectForm, type FidelitySummary, type FileDownloadResult, FileHandler, type FileInfo, type FileRegistryEntry, type FileStatInfo, type FileSystemEntry, type FileType, type FileUploadResult, FileWatcher, type FilterCondition, FilteredVaultFS, type FolderDatabaseReport, type FolderMoveChange, FrontmatterExtractor, FrontmatterGenerator, type FullScanReason, GITIGNORE_ENTRY, type GatedOperation, type GroupByConfig, type GroupedEntries, IGNORE_FILE, INTERNAL_DIR, INTERNAL_DIR_GLOB, type IStateDB, type ImageDownloadResult, ImageHandler, type ImageReference, type InferredProperty, InlineAnnotationPreserver, InlineDBParser, type InlineStyle, type LineDiffOptions, type LineRange, type LocalChange, LocalImageRestorer, type LocalMoveAdoption, type LocalScan, type LocalScanOptions, type Logger, MARKER_BRAND, type MappingResult, type MappingType, MathNormalizer, MentionToWikilink, type MergeConflictRegion, type MergeResult, NOTION_COLOR_NAMES, NOTION_TOKEN_PREFIX, NOTION_TO_BASES_VIEW, NodeVaultFS, type NonMdFileInfo, type NotionBlock, NotionBlockBuilder, NotionClient, type NotionClientOptions, type NotionColor, type NotionPageNode, type NotionRichText, type RichTextItem as NotionRichTextItem, type NotionSidecar, OBSIDIAN_CONFIG_DIR, type OperationType, type PageCompletenessRemoteSource, type PageCompletenessReport, type PageCover, type PageCreationPlan, type PageIcon, PathFilter, type PathFilterConfig, type PendingOperation, PendingWalError, type PlannedRow, type PreserveMarker, PreserveMarkerCollector, PreserveMarkerInjector, type Processor, type ProcessorInput, type ProcessorMetadata, type ProcessorOutput, type ProgressCallback, type ProgressItem, PropertiesTableInjector, PropertiesTableRestorer, PropertyMapper, type PropertyOption, type PropertySchema, type PropertyValue, type PullOptions, type PullResult, type PushOptions, type PushResult, RENDER_LINE_RULES, type RecordPendingInput, type RegisterFileInput, type RemoteChange, type RemoteMove, type RemoteMoveSkip, type RemoteObservation, type RemoteScanInfo, type RenameHints, type RenameKind, type RenderFinding, type RenderLineRule, type ResolutionChoice, type ResolutionResult, type RichTextSegment, type RowProgress, SAVED_STATE_TABLES_QUERY, SEPARATOR_BODY, STATE_DB_FILE, STATE_DB_MIGRATIONS, STATE_DB_PATH, SavedStateDbError, ScopedVaultFS, SidecarGenerator, type SidecarProperty, type SidecarView, StateDB, StateDbLockedError, type StateDbMigration, type StateDbTool, StateDbUnavailableError, StateLock, type StateLockClaim, type StateLockOwner, type StatusOptions, type StatusResult, type StyledRange, SyncBusyError, type SyncDirection, type SyncOptions, SyncOrchestrator, type SyncRecord, type SyncResult, type SyncStatus, type TableLineDesign, type TranslationResult, TreeMapper, UnsupportedBlockStripper, type UpsertSyncRecord, type VaultCompletenessReport, type VaultFS, type ViewConfig, ViewDataProvider, type ViewPropertyConfig, type ViewRenderData, type ViewType, WIKILINK_LOOKUPS, type WatchSyncOptions, type WatchSyncScope, WatchSyncService, type WikilinkEntry, type WikilinkLookup, WikilinkResolver, applicableChoices, assertNoPendingWal, basesViewMappingOf, basesViewTypeOf, choiceForStrategy, classifyBodyFidelity, columnLabel, compactNotionId, computeBufferHash, computeHash, configDirFrom, connectionFolderOf, createDefaultPipeline, extractCalendarEntries, filterByMonth, filterEntries, findConnectionFolders, formatUnifiedDiff, generateColorCSS, generateId, getLogger, getNotionBgColor, getNotionColor, getVisibleProperties, groupEntries, hasColumnLayout, hasDesignMarker, inAnyPathScope, isInternalPath, isMarkdownPath, isRemoteDeletion, lineDiff, lintRenderedMarkdown, matchesPathScope, normalizeNotionId, normalizeVaultPath, noteNameFromPath, notionIdFromInput, notionIdsEqual, operationLabel, parseDesignColor, parseIgnorePatterns, pendingWalBytes, readColumnLayout, readDesignLine, resolvePropertyName, sanitizeFileName, setLogger, sortEntries, stateDbLockPath, stateDbWalPath, stripMarkdownExtension, summarizeFidelity, systemTimeZone, threeWayMerge, toVaultPath, translateNotionFilter, verifyDatabaseCompleteness, verifyPageCompleteness, wikilinkLookupsIn };
4657
+ export { BaseFileGenerator, type BaseFileOptions, type BasePropertyOption, type BasePropertySchema, type BaseStatusGroup, type BaseSyncOptions, type BasesFilterNode, type BasesViewMapping, type BasesViewType, BlankLineCollapser, type BookmarkTarget, CONFIG_FILE, type CalendarEntry, type CalloutDesign, CalloutRestorer, CalloutTransformer, ChangeDetector, type ChangeDiff, ColorAnnotator, type ColumnPlace, type CompletenessFailure, type CompletenessLocalSource, type CompletenessOptions, type CompletenessRemoteSource, type CompletenessReport, type Config, ConfigManager, ConfigSchema, type Conflict, ConflictResolver, type ConflictStrategy, ConnectionBoundaryError, ConnectionScopeError, type ConversionContext, type ConversionPath, ConversionPipeline, type ConversionResult, type CoverConfig, type DBEntry, DB_VIEWS_FILE, DB_VIEWS_PATH, DEFAULT_CONFIG, DEFAULT_TITLE_PROPERTY, DEFAULT_WATCH_DEBOUNCE_MS, DIFF_SIGN, type DatabaseCompleteness, type DatabaseSyncConfig, type DatabaseSyncResult, DatabaseSyncer, type DatabaseViewsConfig, type DeferredCode, type DegradeNote, type DesignColor, type DesignLine, type DesignSegment, type DiffHunk, type DiffLine, EmbedResolver, EntryEditor, type FailedOperation, type FidelityClassification, type FidelityContext, type FidelityDefect, type FidelityDefectForm, type FidelitySummary, type FileDownloadResult, FileHandler, type FileInfo, type FileRegistryEntry, type FileStatInfo, type FileSystemEntry, type FileType, type FileUploadResult, FileWatcher, type FilterCondition, FilteredVaultFS, type FolderDatabaseReport, type FolderMoveChange, FrontmatterExtractor, FrontmatterGenerator, type FullScanReason, GITIGNORE_ENTRY, type GatedOperation, type GroupByConfig, type GroupedEntries, IGNORE_FILE, INTERNAL_DIR, INTERNAL_DIR_GLOB, type IStateDB, type ImageDownloadResult, ImageHandler, type ImageReference, type InferredProperty, InlineAnnotationPreserver, InlineDBParser, type InlineStyle, type LineDiffOptions, type LineRange, type LocalChange, LocalImageRestorer, type LocalMoveAdoption, type LocalScan, type LocalScanOptions, type Logger, MARKER_BRAND, type MappingResult, type MappingType, MathNormalizer, MentionToWikilink, type MergeConflictRegion, type MergeResult, NOTION_COLOR_NAMES, NOTION_TOKEN_PREFIX, NOTION_TO_BASES_VIEW, type NestedFolderPage, type NestedFolderRecord, NodeVaultFS, type NonMdFileInfo, type NotionBlock, NotionBlockBuilder, NotionClient, type NotionClientOptions, type NotionColor, type NotionPageNode, type NotionRichText, type RichTextItem as NotionRichTextItem, type NotionSidecar, OBSIDIAN_CONFIG_DIR, type OperationType, type PageCompletenessRemoteSource, type PageCompletenessReport, type PageCover, type PageCreationPlan, type PageIcon, PathFilter, type PathFilterConfig, type PendingOperation, PendingWalError, type PlannedRow, type PreserveMarker, PreserveMarkerCollector, PreserveMarkerInjector, type Processor, type ProcessorInput, type ProcessorMetadata, type ProcessorOutput, type ProgressCallback, type ProgressItem, PropertiesTableInjector, PropertiesTableRestorer, PropertyMapper, type PropertyOption, type PropertyRename, type PropertySchema, type PropertyValue, type PullOptions, type PullResult, type PushOptions, type PushResult, RENDER_LINE_RULES, type ReadOnlySkip, type RecordPendingInput, type RegisterFileInput, type RemoteChange, type RemoteMove, type RemoteMoveSkip, type RemoteObservation, type RemoteScanInfo, type RenameHints, type RenameKind, type RenderFinding, type RenderLineRule, type ResolutionChoice, type ResolutionResult, type RichTextSegment, type RowProgress, SAVED_STATE_TABLES_QUERY, SEPARATOR_BODY, STATE_DB_FILE, STATE_DB_MIGRATIONS, STATE_DB_PATH, SavedStateDbError, type SchemaEdit, type SchemaFollowed, ScopedVaultFS, SidecarGenerator, type SidecarProperty, type SidecarView, StateDB, StateDbLockedError, type StateDbMigration, type StateDbTool, StateDbUnavailableError, StateLock, type StateLockClaim, type StateLockOwner, type StatusOptions, type StatusResult, type StyledRange, SyncBusyError, type SyncDirection, type SyncOptions, SyncOrchestrator, type SyncRecord, type SyncResult, type SyncStatus, type TableLineDesign, type TranslationResult, TreeMapper, UnsupportedBlockStripper, type UpsertSyncRecord, type VaultCompletenessReport, type VaultFS, type ViewConfig, ViewDataProvider, type ViewEdit, type ViewPropertyConfig, type ViewRenderData, type ViewType, WIKILINK_LOOKUPS, type WatchSyncOptions, type WatchSyncScope, WatchSyncService, type WikilinkEntry, type WikilinkLookup, WikilinkResolver, applicableChoices, assertNoPendingWal, basesViewMappingOf, basesViewTypeOf, choiceForStrategy, classifyBodyFidelity, columnLabel, compactNotionId, computeBufferHash, computeHash, configDirFrom, connectionFolderOf, createDefaultPipeline, extractCalendarEntries, filterByMonth, filterEntries, findConnectionFolders, findNestedFolderPages, formatUnifiedDiff, generateColorCSS, generateId, getLogger, getNotionBgColor, getNotionColor, getVisibleProperties, groupEntries, hasColumnLayout, hasDesignMarker, inAnyPathScope, isHeadingLine, isHeadingMarkerLine, isInternalPath, isMarkdownPath, isRemoteDeletion, lineDiff, lintRenderedMarkdown, matchesPathScope, normalizeNotionId, normalizeVaultPath, noteNameFromPath, notionIdFromInput, notionIdsEqual, operationLabel, parseDesignColor, parseIgnorePatterns, pendingWalBytes, readColumnLayout, readDesignLine, resolvePropertyName, sanitizeFileName, sectionLinesWithHeadingMarkers, setLogger, shortNotionId, sortEntries, stateDbLockPath, stateDbWalPath, stripMarkdownExtension, summarizeFidelity, systemTimeZone, threeWayMerge, toVaultPath, translateNotionFilter, verifyDatabaseCompleteness, verifyPageCompleteness, wikilinkLookupsIn };