@im-nobsidian/core 0.21.0 → 0.22.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
@@ -1578,6 +1578,11 @@ interface NotionClientOptions {
1578
1578
  readonly notifications?: NotificationMode;
1579
1579
  readonly fetch?: typeof globalThis.fetch;
1580
1580
  }
1581
+ /** 덧붙일 자리 — 블록 뒤(`after`) · 맨 앞(`atStart`). 없으면 맨 끝. */
1582
+ interface AppendPosition {
1583
+ readonly after?: string;
1584
+ readonly atStart?: boolean;
1585
+ }
1581
1586
  declare class NotionClient {
1582
1587
  private readonly client;
1583
1588
  private readonly sema;
@@ -1880,31 +1885,31 @@ declare class NotionClient {
1880
1885
  */
1881
1886
  getBlockTree(blockId: string): Promise<BlockTreeNode[]>;
1882
1887
  /**
1883
- * 자식 블록을 덧붙인다. `options.after` 를 주면 그 블록 **바로 뒤**에 삽입한다
1888
+ * 자식 블록을 덧붙인다. `options.after` 를 주면 그 블록 **바로 뒤**에, `options.atStart` 면 맨 앞에 삽입한다
1884
1889
  * (기본은 맨 끝). 자리표시자를 실제 미디어 블록으로 제자리 교체할 때 필요하다.
1885
1890
  *
1886
1891
  * 실측(2025-09-03): position 삽입 응답의 `results` 는 방금 넣은 블록뿐 아니라
1887
1892
  * 삽입 지점 이후의 형제까지 함께 돌려준다. 앞에서부터 batch 길이만큼이 새 블록이므로
1888
1893
  * 배치를 이어 붙일 때는 그 마지막 id 를 다음 기준점으로 삼는다.
1889
1894
  */
1890
- appendChildren(blockId: string, children: unknown[], options?: {
1891
- readonly after?: string;
1892
- }): Promise<string[]>;
1895
+ appendChildren(blockId: string, children: unknown[], options?: AppendPosition): Promise<string[]>;
1893
1896
  /**
1894
1897
  * {@link appendChildren} 과 같되 새로 만든 블록을 통째로 돌려준다. 파일을 붙인 미디어 블록은
1895
1898
  * 응답에 Notion 이 저장한 파일의 URL 이 실려 온다 — 다시 조회하지 않고 그 파일을 알아 둔다(S-05).
1896
1899
  */
1897
- appendChildBlocks(blockId: string, children: unknown[], options?: {
1898
- readonly after?: string;
1899
- }): Promise<(BlockObjectResponse | PartialBlockObjectResponse)[]>;
1900
+ appendChildBlocks(blockId: string, children: unknown[], options?: AppendPosition): Promise<(BlockObjectResponse | PartialBlockObjectResponse)[]>;
1900
1901
  /**
1901
1902
  * 깊이 제한 없는 블록 트리를 맨 끝에 덧붙인다 — 요청 한도(깊이 두 단계 · 100 개 · 1000 블록)를 넘는
1902
1903
  * 자식은 부모를 만든 뒤 그 아래에 마저 붙인다({@link shapeAppendRequests}). 더 깊은 블록의 id 는
1903
1904
  * 응답에 없어 부모의 자식 목록을 읽어 찾는다.
1904
1905
  *
1906
+ * `options.atStart` 면 맨 위 블록을 맨 앞에 넣는다 — 본문 뒤에 둘 블록(폴더 첨부)을 남기고 본문만 바꿀 때.
1907
+ *
1905
1908
  * 중간에 실패하면 그때까지 만든 블록은 남는다 — 호출측이 실패로 알린다.
1906
1909
  */
1907
- appendBlockTree(parentId: string, blocks: readonly BlockRequest[]): Promise<void>;
1910
+ appendBlockTree(parentId: string, blocks: readonly BlockRequest[], options?: {
1911
+ readonly atStart?: boolean;
1912
+ }): Promise<void>;
1908
1913
  deleteBlock(blockId: string): Promise<void>;
1909
1914
  /**
1910
1915
  * 코드 블록의 글을 바꾼다 — Markdown API 로 보낼 수 없는 코드(코드 속 ``` 줄, S-22)를 블록으로
@@ -3335,6 +3340,11 @@ interface FileHandlerOptions {
3335
3340
  * 파일을. 기본 false.
3336
3341
  */
3337
3342
  readonly deleteSync?: boolean;
3343
+ /**
3344
+ * 볼트 맨 위 파일을 싣는 페이지({@link rootFilesPageOf}) — 페이지 모드의 루트. 없으면(DB 모드) 볼트 맨 위 파일은 경고로 남는다.
3345
+ * 루트는 사용자의 페이지라 노트 페이지처럼 적어 둔 폴더 첨부만 제 것으로 본다.
3346
+ */
3347
+ readonly rootPageId?: string | null;
3338
3348
  }
3339
3349
  /**
3340
3350
  * 노트의 페이지에 폴더 첨부 블록을 붙이거나 지울 때(ADR-056) — 그 쓰기로 노트 페이지의 수정 시각 · 본문이 바뀐다. 알리지 않으면
@@ -3372,6 +3382,7 @@ declare class FileHandler {
3372
3382
  private readonly itemTimeoutMs;
3373
3383
  private readonly attachmentsFolder;
3374
3384
  private readonly deleteSync;
3385
+ private readonly rootPageId;
3375
3386
  constructor(vaultFs: VaultFS, notionClient: NotionClient, stateDb: IStateDB, concurrency?: number, options?: FileHandlerOptions);
3376
3387
  private get fetchFn();
3377
3388
  pushFilesForFolder(folderPageId: string, folderPath: string): Promise<FileUploadResult[]>;
@@ -3402,11 +3413,14 @@ declare class FileHandler {
3402
3413
  private inAttachmentsFolder;
3403
3414
  /**
3404
3415
  * 폴더 첨부를 둘 Notion 페이지 — 그 폴더의 Notion 자리({@link folderContainer} 와 같은 차례). 폴더 노트(`X/X.md`)나 노트
3405
- * 이름의 폴더(`X.md` 옆 `X/`)면 그 노트의 페이지 끝(ADR-056), 아니면 push 가 만든 폴더 페이지. 맨 위는 루트 기록이 있을 때만.
3406
- * 행 · DB 폴더는 둘 곳이 없다 — 행의 본문은 행의 것이다.
3416
+ * 이름의 폴더(`X.md` 옆 `X/`)면 그 노트의 페이지 끝(ADR-056), 아니면 push 가 만든 폴더 페이지. 맨 위는 루트 페이지 끝.
3417
+ * 행 이름의 폴더(`DB/행/`)는 그 행의 페이지 끝. DB 폴더는 둘 곳이 없다 — Notion 의 DB 는 본문이 없다.
3407
3418
  */
3408
3419
  private folderPageOf;
3409
- /** 이 폴더를 품은 노트의 페이지 — 폴더 노트 · 노트 이름의 폴더. 없거나 행이면 null. */
3420
+ /**
3421
+ * 이 폴더를 품은 노트의 페이지 — 폴더 노트 · 노트(행 포함) 이름의 폴더 · 볼트 맨 위는 루트 페이지. 본문이 이 도구의 것이
3422
+ * 아니거나(루트) 노트의 것이라, 적어 둔 폴더 첨부만 제 것으로 본다. 없으면 null.
3423
+ */
3410
3424
  private notePageOf;
3411
3425
  private folderRecordPageOf;
3412
3426
  /**
@@ -3729,6 +3743,11 @@ interface RowProgress {
3729
3743
  planned(count: number): void;
3730
3744
  done(item: ProgressItem): void;
3731
3745
  }
3746
+ /** 행 페이지 끝에서 뗀 폴더 첨부 — `complete` 면 빠진 파일을 Notion 에서 지운 것으로 본다. */
3747
+ interface RowFolderFiles {
3748
+ readonly files: readonly FolderFileRef[];
3749
+ readonly complete: boolean;
3750
+ }
3732
3751
  declare class DatabaseSyncer {
3733
3752
  private readonly config;
3734
3753
  private readonly stateDb;
@@ -3746,6 +3765,8 @@ declare class DatabaseSyncer {
3746
3765
  * 채운다({@link RemoteDetector.noteBodyChildren}).
3747
3766
  */
3748
3767
  private readonly noteRowBody;
3768
+ /** 행 이름의 폴더에 그 행 페이지의 폴더 첨부를 받는다(ADR-056) — `PagePuller.receiveFolderFiles`. */
3769
+ private readonly receiveRowFiles;
3749
3770
  private readonly propertyMapper;
3750
3771
  private decorationsCache?;
3751
3772
  /**
@@ -3805,7 +3826,9 @@ declare class DatabaseSyncer {
3805
3826
  * 받은 행 본문(Notion 원문)을 알린다 — 감지가 행의 하위 페이지를 빠뜨렸을 때 그 본문의 자식 태그로
3806
3827
  * 채운다({@link RemoteDetector.noteBodyChildren}).
3807
3828
  */
3808
- noteRowBody?: (pageId: string, rawMarkdown: string) => void);
3829
+ noteRowBody?: (pageId: string, rawMarkdown: string) => void,
3830
+ /** 행 이름의 폴더에 그 행 페이지의 폴더 첨부를 받는다(ADR-056) — `PagePuller.receiveFolderFiles`. */
3831
+ receiveRowFiles?: (folder: string, pageId: string, files: readonly FolderFileRef[], complete: boolean) => Promise<void>);
3809
3832
  pullAll(opts?: {
3810
3833
  readonly paths?: readonly string[];
3811
3834
  readonly progress?: RowProgress;
@@ -4067,6 +4090,8 @@ declare class DatabaseSyncer {
4067
4090
  bodyFingerprint: string;
4068
4091
  /** 원격 본문에 페이지 시절의 속성 블록이 있었나 — 받으며 걷어 냈다. */
4069
4092
  propertiesBlock: boolean;
4093
+ /** 행 끝에서 뗀 폴더 첨부(ADR-056 · 행 이름의 폴더) — 받는 것은 호출측이 정한다. */
4094
+ folderFiles: RowFolderFiles;
4070
4095
  }>;
4071
4096
  /**
4072
4097
  * 행의 본문 밖이 지난 동기화 사본 그대로인가(N-05) — 제목과 보낼 수 있는 속성, 아이콘 · 커버.
@@ -4153,6 +4178,11 @@ declare class DatabaseSyncer {
4153
4178
  * 든다. 추적하는 노트가 없으면 null.
4154
4179
  */
4155
4180
  private adoptedChildrenOf;
4181
+ /**
4182
+ * 이 노트 · 행 옆의 폴더(`from`)가 그것의 것인가 — 하위 페이지가 있거나, 그 페이지에 올린 폴더 첨부(ADR-056)가 든 폴더.
4183
+ * 예전에는 하위 페이지만 보아 행의 이름을 따라 옮길 때 폴더 첨부만 든 폴더가 옛 이름에 남았다.
4184
+ */
4185
+ private holdsChildren;
4156
4186
  /**
4157
4187
  * Notion 에서 바꾼 제목으로 행 이름을 바꿀 자리(`sync.renameOnTitleChange`) — 바꿀 것이 없으면 null.
4158
4188
  * 받기 · pull dry-run · status 가 같은 판정을 쓴다. 행의 하위 페이지 폴더(`행/`)도 새 이름으로 옮기며, 옮길 수
@@ -4164,7 +4194,12 @@ declare class DatabaseSyncer {
4164
4194
  } | {
4165
4195
  reason: string;
4166
4196
  } | null>;
4197
+ /**
4198
+ * 행 하나를 받고 그 행 페이지의 폴더 첨부를 행 이름의 폴더에 받는다(ADR-056) — 노트가 충돌로 남거나 로컬을 지켜도 파일은
4199
+ * 제 규칙대로 받는다(페이지와 같다). 행을 옮겼으면 옮긴 자리로.
4200
+ */
4167
4201
  private pullDatabasePage;
4202
+ private pullDatabaseRow;
4168
4203
  }
4169
4204
 
4170
4205
  declare class FrontmatterExtractor implements Processor {