@lapis-notes/history 0.1.4 → 0.2.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.
Files changed (329) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +1 -1
  3. package/dist/repository/NOTICE.md +11 -0
  4. package/dist/repository/components/RepositoryAuthorAvatar.svelte +77 -0
  5. package/dist/repository/components/RepositoryAuthorAvatar.svelte.d.ts +11 -0
  6. package/dist/repository/components/RepositoryBackupStatus.svelte +236 -0
  7. package/dist/repository/components/RepositoryBackupStatus.svelte.d.ts +11 -0
  8. package/dist/repository/components/RepositoryChangedFiles.svelte +104 -0
  9. package/dist/repository/components/RepositoryChangedFiles.svelte.d.ts +13 -0
  10. package/dist/repository/components/RepositoryCommitMessage.svelte +93 -0
  11. package/dist/repository/components/RepositoryCommitMessage.svelte.d.ts +6 -0
  12. package/dist/repository/components/RepositoryCommitPicker.svelte +205 -0
  13. package/dist/repository/components/RepositoryCommitPicker.svelte.d.ts +17 -0
  14. package/dist/repository/components/RepositoryComparisonBar.svelte +71 -0
  15. package/dist/repository/components/RepositoryComparisonBar.svelte.d.ts +9 -0
  16. package/dist/repository/components/RepositoryComparisonTime.svelte +32 -0
  17. package/dist/repository/components/RepositoryComparisonTime.svelte.d.ts +6 -0
  18. package/dist/repository/components/RepositoryDiff.svelte +56 -0
  19. package/dist/repository/components/RepositoryDiff.svelte.d.ts +11 -0
  20. package/dist/repository/components/RepositoryDiffColumn.svelte +78 -0
  21. package/dist/repository/components/RepositoryDiffColumn.svelte.d.ts +14 -0
  22. package/dist/repository/components/RepositoryDiffControls.svelte +117 -0
  23. package/dist/repository/components/RepositoryDiffControls.svelte.d.ts +8 -0
  24. package/dist/repository/components/RepositoryFileHistory.svelte +170 -0
  25. package/dist/repository/components/RepositoryFileHistory.svelte.d.ts +10 -0
  26. package/dist/repository/components/RepositoryFileTitle.svelte +30 -0
  27. package/dist/repository/components/RepositoryFileTitle.svelte.d.ts +6 -0
  28. package/dist/repository/components/RepositoryGraph.svelte +216 -0
  29. package/dist/repository/components/RepositoryGraph.svelte.d.ts +19 -0
  30. package/dist/repository/components/RepositoryGraphSvg.svelte +110 -0
  31. package/dist/repository/components/RepositoryGraphSvg.svelte.d.ts +11 -0
  32. package/dist/repository/components/RepositoryIdentifiers.svelte +221 -0
  33. package/dist/repository/components/RepositoryIdentifiers.svelte.d.ts +15 -0
  34. package/dist/repository/components/RepositoryLogHeader.svelte +90 -0
  35. package/dist/repository/components/RepositoryLogHeader.svelte.d.ts +23 -0
  36. package/dist/repository/components/RepositoryOperationArguments.svelte +52 -0
  37. package/dist/repository/components/RepositoryOperationArguments.svelte.d.ts +6 -0
  38. package/dist/repository/components/RepositoryOperationColumn.svelte +163 -0
  39. package/dist/repository/components/RepositoryOperationColumn.svelte.d.ts +11 -0
  40. package/dist/repository/components/RepositoryOperationFiles.svelte +245 -0
  41. package/dist/repository/components/RepositoryOperationFiles.svelte.d.ts +14 -0
  42. package/dist/repository/components/RepositoryOperationMessage.svelte +169 -0
  43. package/dist/repository/components/RepositoryOperationMessage.svelte.d.ts +10 -0
  44. package/dist/repository/components/RepositoryOperationOption.svelte +183 -0
  45. package/dist/repository/components/RepositoryOperationOption.svelte.d.ts +10 -0
  46. package/dist/repository/components/RepositoryOperationParentPicker.svelte +188 -0
  47. package/dist/repository/components/RepositoryOperationParentPicker.svelte.d.ts +14 -0
  48. package/dist/repository/components/RepositoryOperationPinPicker.svelte +170 -0
  49. package/dist/repository/components/RepositoryOperationPinPicker.svelte.d.ts +13 -0
  50. package/dist/repository/components/RepositoryOperationRail.svelte +136 -0
  51. package/dist/repository/components/RepositoryOperationRail.svelte.d.ts +9 -0
  52. package/dist/repository/components/RepositoryOperationTarget.svelte +99 -0
  53. package/dist/repository/components/RepositoryOperationTarget.svelte.d.ts +8 -0
  54. package/dist/repository/components/RepositoryOperations.svelte +199 -0
  55. package/dist/repository/components/RepositoryOperations.svelte.d.ts +12 -0
  56. package/dist/repository/components/RepositoryPanel.svelte +207 -0
  57. package/dist/repository/components/RepositoryPanel.svelte.d.ts +15 -0
  58. package/dist/repository/components/RepositoryParentSummary.svelte +52 -0
  59. package/dist/repository/components/RepositoryParentSummary.svelte.d.ts +10 -0
  60. package/dist/repository/components/RepositoryPickerSearch.svelte +51 -0
  61. package/dist/repository/components/RepositoryPickerSearch.svelte.d.ts +11 -0
  62. package/dist/repository/components/RepositoryRestoreDialog.svelte +81 -0
  63. package/dist/repository/components/RepositoryRestoreDialog.svelte.d.ts +7 -0
  64. package/dist/repository/components/RepositoryRevisionActions.svelte +53 -0
  65. package/dist/repository/components/RepositoryRevisionActions.svelte.d.ts +9 -0
  66. package/dist/repository/components/RepositoryRevisionFiles.svelte +110 -0
  67. package/dist/repository/components/RepositoryRevisionFiles.svelte.d.ts +14 -0
  68. package/dist/repository/components/RepositoryRevisionOption.svelte +60 -0
  69. package/dist/repository/components/RepositoryRevisionOption.svelte.d.ts +9 -0
  70. package/dist/repository/components/RepositoryRevisionPicker.svelte +165 -0
  71. package/dist/repository/components/RepositoryRevisionPicker.svelte.d.ts +14 -0
  72. package/dist/repository/components/RepositoryRevisions.svelte +115 -0
  73. package/dist/repository/components/RepositoryRevisions.svelte.d.ts +20 -0
  74. package/dist/repository/components/RepositoryShell.svelte +44 -0
  75. package/dist/repository/components/RepositoryShell.svelte.d.ts +11 -0
  76. package/dist/repository/components/RepositorySkeleton.svelte +138 -0
  77. package/dist/repository/components/RepositorySkeleton.svelte.d.ts +7 -0
  78. package/dist/repository/components/RepositorySourcePicker.svelte +114 -0
  79. package/dist/repository/components/RepositorySourcePicker.svelte.d.ts +7 -0
  80. package/dist/repository/components/RepositoryUpstreamActions.svelte +125 -0
  81. package/dist/repository/components/RepositoryUpstreamActions.svelte.d.ts +8 -0
  82. package/dist/repository/components/RepositoryWorkingCopyStatus.svelte +290 -0
  83. package/dist/repository/components/RepositoryWorkingCopyStatus.svelte.d.ts +11 -0
  84. package/dist/repository/components/RepositoryWorkspacePicker.svelte +158 -0
  85. package/dist/repository/components/RepositoryWorkspacePicker.svelte.d.ts +11 -0
  86. package/dist/repository/components/backup/AdoptionSettings.svelte +95 -0
  87. package/dist/repository/components/backup/AdoptionSettings.svelte.d.ts +7 -0
  88. package/dist/repository/components/backup/BackupCard.svelte +79 -0
  89. package/dist/repository/components/backup/BackupCard.svelte.d.ts +14 -0
  90. package/dist/repository/components/backup/BackupField.svelte +45 -0
  91. package/dist/repository/components/backup/BackupField.svelte.d.ts +10 -0
  92. package/dist/repository/components/backup/BackupSelect.svelte +71 -0
  93. package/dist/repository/components/backup/BackupSelect.svelte.d.ts +35 -0
  94. package/dist/repository/components/backup/BackupSettings.svelte +122 -0
  95. package/dist/repository/components/backup/BackupSettings.svelte.d.ts +18 -0
  96. package/dist/repository/components/backup/BackupSettingsField.svelte +13 -0
  97. package/dist/repository/components/backup/BackupSettingsField.svelte.d.ts +4 -0
  98. package/dist/repository/components/backup/ForgeAccounts.svelte +231 -0
  99. package/dist/repository/components/backup/ForgeAccounts.svelte.d.ts +9 -0
  100. package/dist/repository/components/backup/ForgeAuthorization.svelte +267 -0
  101. package/dist/repository/components/backup/ForgeAuthorization.svelte.d.ts +9 -0
  102. package/dist/repository/components/backup/ForgeIcon.svelte +21 -0
  103. package/dist/repository/components/backup/ForgeIcon.svelte.d.ts +7 -0
  104. package/dist/repository/components/backup/PublicationRecovery.svelte +129 -0
  105. package/dist/repository/components/backup/PublicationRecovery.svelte.d.ts +11 -0
  106. package/dist/repository/components/backup/RemoteSettings.svelte +288 -0
  107. package/dist/repository/components/backup/RemoteSettings.svelte.d.ts +11 -0
  108. package/dist/repository/components/backup/RepositorySettingsPage.svelte +51 -0
  109. package/dist/repository/components/backup/RepositorySettingsPage.svelte.d.ts +4 -0
  110. package/dist/repository/components/backup/StorageSettings.svelte +158 -0
  111. package/dist/repository/components/backup/StorageSettings.svelte.d.ts +7 -0
  112. package/dist/repository/components/backup/SyncConflictEditor.svelte +158 -0
  113. package/dist/repository/components/backup/SyncConflictEditor.svelte.d.ts +9 -0
  114. package/dist/repository/components/backup/SyncSettings.svelte +97 -0
  115. package/dist/repository/components/backup/SyncSettings.svelte.d.ts +9 -0
  116. package/dist/repository/components/backup/adoption-settings.d.ts +7 -0
  117. package/dist/repository/components/backup/adoption-settings.js +42 -0
  118. package/dist/repository/components/backup/backup-settings.d.ts +35 -0
  119. package/dist/repository/components/backup/backup-settings.js +96 -0
  120. package/dist/repository/components/backup/forge-icons.d.ts +10 -0
  121. package/dist/repository/components/backup/forge-icons.js +11 -0
  122. package/dist/repository/components/backup/remote-restore.d.ts +3 -0
  123. package/dist/repository/components/backup/remote-restore.js +17 -0
  124. package/dist/repository/components/backup/storage-settings.d.ts +8 -0
  125. package/dist/repository/components/backup/storage-settings.js +23 -0
  126. package/dist/repository/components/blame/RepositoryBlameCommitTitle.svelte +212 -0
  127. package/dist/repository/components/blame/RepositoryBlameCommitTitle.svelte.d.ts +14 -0
  128. package/dist/repository/components/blame/RepositoryBlameGroup.svelte +189 -0
  129. package/dist/repository/components/blame/RepositoryBlameGroup.svelte.d.ts +20 -0
  130. package/dist/repository/components/blame/RepositoryBlamePanel.svelte +148 -0
  131. package/dist/repository/components/blame/RepositoryBlamePanel.svelte.d.ts +13 -0
  132. package/dist/repository/components/blame/RepositoryBlameRows.svelte +137 -0
  133. package/dist/repository/components/blame/RepositoryBlameRows.svelte.d.ts +32 -0
  134. package/dist/repository/components/blame/RepositoryBlameView.svelte +121 -0
  135. package/dist/repository/components/blame/RepositoryBlameView.svelte.d.ts +16 -0
  136. package/dist/repository/components/blame/blame-view.d.ts +16 -0
  137. package/dist/repository/components/blame/blame-view.js +73 -0
  138. package/dist/repository/components/blame/editor-actions.d.ts +3 -0
  139. package/dist/repository/components/blame/editor-actions.js +53 -0
  140. package/dist/repository/components/conflicts/RepositoryConflictActions.svelte +83 -0
  141. package/dist/repository/components/conflicts/RepositoryConflictActions.svelte.d.ts +13 -0
  142. package/dist/repository/components/conflicts/RepositoryConflictBody.svelte +93 -0
  143. package/dist/repository/components/conflicts/RepositoryConflictBody.svelte.d.ts +16 -0
  144. package/dist/repository/components/conflicts/RepositoryConflictFileTree.svelte +84 -0
  145. package/dist/repository/components/conflicts/RepositoryConflictFileTree.svelte.d.ts +21 -0
  146. package/dist/repository/components/conflicts/RepositoryConflictPath.svelte +35 -0
  147. package/dist/repository/components/conflicts/RepositoryConflictPath.svelte.d.ts +9 -0
  148. package/dist/repository/components/conflicts/RepositoryConflictResolution.svelte +133 -0
  149. package/dist/repository/components/conflicts/RepositoryConflictResolution.svelte.d.ts +12 -0
  150. package/dist/repository/components/conflicts/RepositoryConflictSurface.svelte +105 -0
  151. package/dist/repository/components/conflicts/RepositoryConflictSurface.svelte.d.ts +23 -0
  152. package/dist/repository/components/conflicts/RepositoryConflictText.svelte +104 -0
  153. package/dist/repository/components/conflicts/RepositoryConflictText.svelte.d.ts +26 -0
  154. package/dist/repository/components/conflicts/RepositorySidebarToggleIcon.svelte +52 -0
  155. package/dist/repository/components/conflicts/RepositorySidebarToggleIcon.svelte.d.ts +7 -0
  156. package/dist/repository/components/conflicts/repository-conflict-file-tree.css +73 -0
  157. package/dist/repository/components/conflicts/repository-conflicts.css +125 -0
  158. package/dist/repository/components/file-history-view.d.ts +15 -0
  159. package/dist/repository/components/file-history-view.js +110 -0
  160. package/dist/repository/components/operation-view.d.ts +16 -0
  161. package/dist/repository/components/operation-view.js +95 -0
  162. package/dist/repository/components/repository-backup.d.ts +22 -0
  163. package/dist/repository/components/repository-backup.js +75 -0
  164. package/dist/repository/components/repository-column-chrome.css +35 -0
  165. package/dist/repository/components/repository-commit-picker.css +55 -0
  166. package/dist/repository/components/repository-feedback.d.ts +7 -0
  167. package/dist/repository/components/repository-feedback.js +40 -0
  168. package/dist/repository/components/repository-identifiers.css +199 -0
  169. package/dist/repository/components/repository-navigation.d.ts +4 -0
  170. package/dist/repository/components/repository-navigation.js +16 -0
  171. package/dist/repository/components/repository-operation-column.css +112 -0
  172. package/dist/repository/components/repository-picker-options.css +11 -0
  173. package/dist/repository/components/repository-plugin.d.ts +33 -0
  174. package/dist/repository/components/repository-plugin.js +191 -0
  175. package/dist/repository/components/repository-review-identifiers.css +50 -0
  176. package/dist/repository/components/repository-status.d.ts +13 -0
  177. package/dist/repository/components/repository-status.js +227 -0
  178. package/dist/repository/components/repository-sync.d.ts +13 -0
  179. package/dist/repository/components/repository-sync.js +93 -0
  180. package/dist/repository/components/repository-tools.d.ts +3 -0
  181. package/dist/repository/components/repository-tools.js +13 -0
  182. package/dist/repository/components/repository-view.d.ts +16 -0
  183. package/dist/repository/components/repository-view.js +140 -0
  184. package/dist/repository/components/restore-controller.d.ts +9 -0
  185. package/dist/repository/components/restore-controller.js +44 -0
  186. package/dist/repository/components/search/search-provider.d.ts +3 -0
  187. package/dist/repository/components/search/search-provider.js +185 -0
  188. package/dist/repository/controllers/adoption-controller.d.ts +29 -0
  189. package/dist/repository/controllers/adoption-controller.js +145 -0
  190. package/dist/repository/controllers/adoption.d.ts +30 -0
  191. package/dist/repository/controllers/adoption.js +21 -0
  192. package/dist/repository/controllers/ai-history.d.ts +57 -0
  193. package/dist/repository/controllers/ai-history.js +51 -0
  194. package/dist/repository/controllers/author.d.ts +2 -0
  195. package/dist/repository/controllers/author.js +11 -0
  196. package/dist/repository/controllers/background-work.d.ts +14 -0
  197. package/dist/repository/controllers/background-work.js +57 -0
  198. package/dist/repository/controllers/backup-follow.d.ts +5 -0
  199. package/dist/repository/controllers/backup-follow.js +29 -0
  200. package/dist/repository/controllers/backup.d.ts +39 -0
  201. package/dist/repository/controllers/backup.js +129 -0
  202. package/dist/repository/controllers/blame-chunks.d.ts +13 -0
  203. package/dist/repository/controllers/blame-chunks.js +51 -0
  204. package/dist/repository/controllers/blame-controller.d.ts +17 -0
  205. package/dist/repository/controllers/blame-controller.js +148 -0
  206. package/dist/repository/controllers/blame-model.d.ts +25 -0
  207. package/dist/repository/controllers/blame-model.js +31 -0
  208. package/dist/repository/controllers/blame-preferences.d.ts +3 -0
  209. package/dist/repository/controllers/blame-preferences.js +18 -0
  210. package/dist/repository/controllers/commit-cards.d.ts +4 -0
  211. package/dist/repository/controllers/commit-cards.js +38 -0
  212. package/dist/repository/controllers/conflict-menu.d.ts +2 -0
  213. package/dist/repository/controllers/conflict-menu.js +1 -0
  214. package/dist/repository/controllers/file-history-controller.d.ts +29 -0
  215. package/dist/repository/controllers/file-history-controller.js +182 -0
  216. package/dist/repository/controllers/forge-accounts.d.ts +48 -0
  217. package/dist/repository/controllers/forge-accounts.js +1 -0
  218. package/dist/repository/controllers/forge-controller.d.ts +24 -0
  219. package/dist/repository/controllers/forge-controller.js +168 -0
  220. package/dist/repository/controllers/graph/model.d.ts +20 -0
  221. package/dist/repository/controllers/graph/model.js +33 -0
  222. package/dist/repository/controllers/graph/repository-log-graph.d.ts +44 -0
  223. package/dist/repository/controllers/graph/repository-log-graph.js +182 -0
  224. package/dist/repository/controllers/graph/repository-log-lanes.d.ts +7 -0
  225. package/dist/repository/controllers/graph/repository-log-lanes.js +19 -0
  226. package/dist/repository/controllers/graph/revision-id.d.ts +3 -0
  227. package/dist/repository/controllers/graph/revision-id.js +10 -0
  228. package/dist/repository/controllers/history-canvas.d.ts +2 -0
  229. package/dist/repository/controllers/history-canvas.js +45 -0
  230. package/dist/repository/controllers/history-controller.d.ts +31 -0
  231. package/dist/repository/controllers/history-controller.js +238 -0
  232. package/dist/repository/controllers/history-files.d.ts +7 -0
  233. package/dist/repository/controllers/history-files.js +18 -0
  234. package/dist/repository/controllers/history-graph.d.ts +20 -0
  235. package/dist/repository/controllers/history-graph.js +89 -0
  236. package/dist/repository/controllers/history-index-controller.d.ts +22 -0
  237. package/dist/repository/controllers/history-index-controller.js +77 -0
  238. package/dist/repository/controllers/history-lifetime.d.ts +13 -0
  239. package/dist/repository/controllers/history-lifetime.js +40 -0
  240. package/dist/repository/controllers/history-reader.d.ts +22 -0
  241. package/dist/repository/controllers/history-reader.js +1 -0
  242. package/dist/repository/controllers/history-search-expression.d.ts +9 -0
  243. package/dist/repository/controllers/history-search-expression.js +86 -0
  244. package/dist/repository/controllers/history-selection.d.ts +5 -0
  245. package/dist/repository/controllers/history-selection.js +32 -0
  246. package/dist/repository/controllers/history-source.d.ts +10 -0
  247. package/dist/repository/controllers/history-source.js +7 -0
  248. package/dist/repository/controllers/history-state.d.ts +34 -0
  249. package/dist/repository/controllers/history-state.js +55 -0
  250. package/dist/repository/controllers/indexed-search-validation.d.ts +4 -0
  251. package/dist/repository/controllers/indexed-search-validation.js +64 -0
  252. package/dist/repository/controllers/indexed-search.d.ts +11 -0
  253. package/dist/repository/controllers/indexed-search.js +1 -0
  254. package/dist/repository/controllers/log-canvas.d.ts +2 -0
  255. package/dist/repository/controllers/log-canvas.js +25 -0
  256. package/dist/repository/controllers/native-indexed-search.d.ts +4 -0
  257. package/dist/repository/controllers/native-indexed-search.js +10 -0
  258. package/dist/repository/controllers/open-history-revision.d.ts +3 -0
  259. package/dist/repository/controllers/open-history-revision.js +8 -0
  260. package/dist/repository/controllers/operation-command.d.ts +2 -0
  261. package/dist/repository/controllers/operation-command.js +55 -0
  262. package/dist/repository/controllers/operation-controller.d.ts +33 -0
  263. package/dist/repository/controllers/operation-controller.js +267 -0
  264. package/dist/repository/controllers/operation-files.d.ts +33 -0
  265. package/dist/repository/controllers/operation-files.js +182 -0
  266. package/dist/repository/controllers/operation-graph.d.ts +17 -0
  267. package/dist/repository/controllers/operation-graph.js +50 -0
  268. package/dist/repository/controllers/operation-message.d.ts +5 -0
  269. package/dist/repository/controllers/operation-message.js +18 -0
  270. package/dist/repository/controllers/operation-metadata.d.ts +5 -0
  271. package/dist/repository/controllers/operation-metadata.js +26 -0
  272. package/dist/repository/controllers/operation-parent.d.ts +5 -0
  273. package/dist/repository/controllers/operation-parent.js +46 -0
  274. package/dist/repository/controllers/operation-state.d.ts +28 -0
  275. package/dist/repository/controllers/operation-state.js +26 -0
  276. package/dist/repository/controllers/parent-candidates.d.ts +4 -0
  277. package/dist/repository/controllers/parent-candidates.js +27 -0
  278. package/dist/repository/controllers/plugin-data.d.ts +9 -0
  279. package/dist/repository/controllers/plugin-data.js +33 -0
  280. package/dist/repository/controllers/preparation-queue.d.ts +9 -0
  281. package/dist/repository/controllers/preparation-queue.js +55 -0
  282. package/dist/repository/controllers/remote-controller.d.ts +23 -0
  283. package/dist/repository/controllers/remote-controller.js +98 -0
  284. package/dist/repository/controllers/remote.d.ts +48 -0
  285. package/dist/repository/controllers/remote.js +13 -0
  286. package/dist/repository/controllers/restore-recovery.d.ts +3 -0
  287. package/dist/repository/controllers/restore-recovery.js +32 -0
  288. package/dist/repository/controllers/restore.d.ts +66 -0
  289. package/dist/repository/controllers/restore.js +201 -0
  290. package/dist/repository/controllers/revision-comparison.d.ts +20 -0
  291. package/dist/repository/controllers/revision-comparison.js +89 -0
  292. package/dist/repository/controllers/search-controller.d.ts +19 -0
  293. package/dist/repository/controllers/search-controller.js +105 -0
  294. package/dist/repository/controllers/search-page.d.ts +2 -0
  295. package/dist/repository/controllers/search-page.js +39 -0
  296. package/dist/repository/controllers/search.d.ts +51 -0
  297. package/dist/repository/controllers/search.js +8 -0
  298. package/dist/repository/controllers/services.d.ts +7 -0
  299. package/dist/repository/controllers/services.js +24 -0
  300. package/dist/repository/controllers/storage-controller.d.ts +30 -0
  301. package/dist/repository/controllers/storage-controller.js +130 -0
  302. package/dist/repository/controllers/storage.d.ts +26 -0
  303. package/dist/repository/controllers/storage.js +1 -0
  304. package/dist/repository/controllers/sync-application.d.ts +17 -0
  305. package/dist/repository/controllers/sync-application.js +45 -0
  306. package/dist/repository/controllers/sync-controller.d.ts +31 -0
  307. package/dist/repository/controllers/sync-controller.js +300 -0
  308. package/dist/repository/controllers/sync-publication.d.ts +7 -0
  309. package/dist/repository/controllers/sync-publication.js +29 -0
  310. package/dist/repository/controllers/sync-recovery.d.ts +7 -0
  311. package/dist/repository/controllers/sync-recovery.js +27 -0
  312. package/dist/repository/controllers/sync.d.ts +62 -0
  313. package/dist/repository/controllers/sync.js +38 -0
  314. package/dist/repository/controllers/tags.d.ts +7 -0
  315. package/dist/repository/controllers/tags.js +71 -0
  316. package/dist/repository/controllers/transcript-paths.d.ts +2 -0
  317. package/dist/repository/controllers/transcript-paths.js +17 -0
  318. package/dist/repository/controllers/transcript-writers.d.ts +9 -0
  319. package/dist/repository/controllers/transcript-writers.js +37 -0
  320. package/dist/repository/controllers/working-copy-controller.d.ts +22 -0
  321. package/dist/repository/controllers/working-copy-controller.js +58 -0
  322. package/dist/repository/controllers/working-copy-status.d.ts +16 -0
  323. package/dist/repository/controllers/working-copy-status.js +57 -0
  324. package/dist/repository/controllers/workspaces.d.ts +7 -0
  325. package/dist/repository/controllers/workspaces.js +4 -0
  326. package/dist/repository/index.d.ts +9 -0
  327. package/dist/repository/index.js +6 -0
  328. package/manifest.json +2 -2
  329. package/package.json +41 -9
@@ -0,0 +1,185 @@
1
+ import { Notice, parseSearchQueryAst, } from "@lapis-notes/api";
2
+ import { BackgroundWork } from "../../controllers/background-work.js";
3
+ import { HistoryIndexController } from "../../controllers/history-index-controller.js";
4
+ import { historyExpression, historyRanges, historyTerms, } from "../../controllers/history-search-expression.js";
5
+ function hitModel(hit, query) {
6
+ const record = hit.record, checkpoint = record.revision.checkpoint;
7
+ const path = record.path ?? undefined;
8
+ const commit = record.deleted
9
+ ? (record.previous ?? checkpoint.commit)
10
+ : checkpoint.commit;
11
+ return {
12
+ id: `${checkpoint.commit}/${path ?? "checkpoint"}`,
13
+ groupId: path ?? "checkpoints",
14
+ path,
15
+ title: path
16
+ ? path
17
+ .split("/")
18
+ .at(-1)
19
+ .replace(/\.[^.]+$/, "")
20
+ : "Checkpoints",
21
+ extension: path?.split(".").at(-1),
22
+ timestamp: checkpoint.timestamp_millis,
23
+ version: {
24
+ id: checkpoint.commit,
25
+ label: checkpoint.description.split("\n")[0] || "Saved checkpoint",
26
+ author: record.revision.author,
27
+ timestamp: checkpoint.timestamp_millis,
28
+ contentId: record.content_id ?? undefined,
29
+ },
30
+ badges: [
31
+ path ? "Saved version" : "Checkpoint",
32
+ ...(record.deleted ? ["Deleted"] : []),
33
+ ...(record.unavailable ? ["Path only"] : []),
34
+ ],
35
+ matches: [
36
+ {
37
+ id: "excerpt",
38
+ field: record.unavailable ? "path" : path ? "content" : "checkpoint",
39
+ text: hit.excerpt,
40
+ ranges: historyRanges(hit.excerpt, historyTerms(parseSearchQueryAst(query).expression)),
41
+ line: hit.line ?? undefined,
42
+ context: hit.line && path && !record.unavailable && !record.deleted
43
+ ? JSON.stringify({ start: hit.line - 1, end: hit.line })
44
+ : undefined,
45
+ },
46
+ ],
47
+ target: {
48
+ operation: checkpoint.operation,
49
+ commit,
50
+ ...(path ? { path } : {}),
51
+ query,
52
+ },
53
+ };
54
+ }
55
+ export function registerHistoryResultProvider(plugin, service) {
56
+ const index = new HistoryIndexController(service, plugin.feedback("History search index", "history-search-index"));
57
+ const work = new BackgroundWork(plugin.app.notifications, plugin.id);
58
+ const progress = work.follow("Indexing saved vault history", index);
59
+ const listeners = new Set();
60
+ let generation = -1, closed = false, phase = "ready";
61
+ const changed = index.subscribe((state) => {
62
+ if ((state.status && generation !== state.status.generation) ||
63
+ phase !== state.phase) {
64
+ generation = state.status?.generation ?? generation;
65
+ phase = state.phase;
66
+ for (const listener of listeners)
67
+ listener();
68
+ }
69
+ });
70
+ const activate = async (hit, _match) => {
71
+ if (closed)
72
+ throw new Error("History search is closed");
73
+ if (hit.target.path)
74
+ await plugin.openBlame(hit.target.operation, hit.target.commit, hit.target.path);
75
+ else
76
+ await plugin.open(hit.target.operation, hit.target.commit);
77
+ };
78
+ const registration = plugin.registerSearchResultProvider("saved-versions", {
79
+ label: "Repository history",
80
+ scope: "history",
81
+ fields: ["file", "path", "content", "author", "before", "after", "commit"],
82
+ modes: ["lexical"],
83
+ subscribe(listener) {
84
+ listeners.add(listener);
85
+ return () => {
86
+ listeners.delete(listener);
87
+ };
88
+ },
89
+ async search(request) {
90
+ request.signal.throwIfAborted();
91
+ const page = await work.run("Searching saved vault history", () => service.query({
92
+ expression: historyExpression(request.query.expression),
93
+ case_sensitive: request.caseSensitive,
94
+ cursor: request.cursor ?? null,
95
+ limit: Math.min(100, request.limit),
96
+ }));
97
+ request.signal.throwIfAborted();
98
+ return {
99
+ generation: String(page.status.generation),
100
+ hits: page.hits.map((hit) => hitModel(hit, request.text)),
101
+ next: page.next ?? undefined,
102
+ status: {
103
+ phase: page.status.complete
104
+ ? "ready"
105
+ : phase === "paused"
106
+ ? "paused"
107
+ : "indexing",
108
+ description: phase === "paused"
109
+ ? "Indexing paused; showing available saved history"
110
+ : undefined,
111
+ indexed: page.status.indexed,
112
+ complete: page.status.complete,
113
+ omitted: page.status.omitted,
114
+ },
115
+ };
116
+ },
117
+ activate,
118
+ async expand(hit, match, direction, signal) {
119
+ signal.throwIfAborted();
120
+ const range = JSON.parse(match.context ?? "{}");
121
+ const start = direction === "before"
122
+ ? Math.max(0, Number(range.start) - 5)
123
+ : Number(range.start);
124
+ const end = direction === "after" ? Number(range.end) + 5 : Number(range.end);
125
+ const result = await service.context({
126
+ commit: hit.target.commit,
127
+ path: hit.target.path,
128
+ start,
129
+ end,
130
+ });
131
+ signal.throwIfAborted();
132
+ return {
133
+ ...match,
134
+ text: result.text,
135
+ line: result.start + 1,
136
+ ranges: historyRanges(result.text, historyTerms(parseSearchQueryAst(hit.target.query ?? "").expression)),
137
+ context: result.before || result.after
138
+ ? JSON.stringify({ start: result.start, end: result.end })
139
+ : undefined,
140
+ };
141
+ },
142
+ });
143
+ index.start();
144
+ plugin.app.workspace.onLayoutReady(() => {
145
+ if (closed)
146
+ return;
147
+ plugin.app.workspace.iterateAllLeaves((leaf) => {
148
+ const view = leaf.getViewState();
149
+ if (view.type !== "repository-history-search" &&
150
+ view.state?.__missingViewType !== "repository-history-search")
151
+ return;
152
+ void leaf
153
+ .setViewState({
154
+ ...view,
155
+ type: "search",
156
+ state: {
157
+ query: typeof view.state?.query === "string" ? view.state.query : "",
158
+ scope: "history",
159
+ },
160
+ }, { activatePlugins: false })
161
+ .catch((error) => plugin.report(error));
162
+ });
163
+ });
164
+ plugin.addCommand({
165
+ id: "open-history-search",
166
+ name: "Search saved vault history",
167
+ callback: () => {
168
+ if (!plugin.app.plugins.plugins.has("search")) {
169
+ new Notice("Enable Search to search saved vault history");
170
+ return;
171
+ }
172
+ void plugin.app.commands
173
+ .executeCommand("search:open-search", "", "history")
174
+ .catch((error) => plugin.report(error));
175
+ },
176
+ });
177
+ return async () => {
178
+ closed = true;
179
+ registration.dispose();
180
+ changed();
181
+ await index.close();
182
+ progress();
183
+ listeners.clear();
184
+ };
185
+ }
@@ -0,0 +1,29 @@
1
+ import { type AdoptionService, type AdoptionState, type AdoptionRecovery } from "./adoption.js";
2
+ type Guard = <T>(action: () => Promise<T>) => Promise<T | undefined>;
3
+ /** An explicit ancestry import never replaces current vault files or its source. */
4
+ export declare class AdoptionController {
5
+ #private;
6
+ readonly service: AdoptionService;
7
+ readonly recovery: AdoptionRecovery;
8
+ readonly feedback: {
9
+ report(error: unknown): void;
10
+ recovered(): void;
11
+ };
12
+ readonly guard: Guard;
13
+ constructor(service: AdoptionService, recovery: AdoptionRecovery, feedback: {
14
+ report(error: unknown): void;
15
+ recovered(): void;
16
+ }, guard?: Guard);
17
+ subscribe(listener: (state: AdoptionState) => void): () => boolean;
18
+ subscribeActivity(listener: (state: {
19
+ busy: boolean;
20
+ phase: string;
21
+ }) => void): () => boolean;
22
+ refresh(): Promise<boolean>;
23
+ adopt(): Promise<boolean>;
24
+ resume(): Promise<boolean>;
25
+ stop(): Promise<boolean>;
26
+ close(): void;
27
+ drained(): Promise<void>;
28
+ }
29
+ export {};
@@ -0,0 +1,145 @@
1
+ import { adoptionRequest, } from "./adoption.js";
2
+ /** An explicit ancestry import never replaces current vault files or its source. */
3
+ export class AdoptionController {
4
+ service;
5
+ recovery;
6
+ feedback;
7
+ guard;
8
+ #state = { busy: false, phase: "ready" };
9
+ #closed = false;
10
+ #listeners = new Set();
11
+ #activity = new Set();
12
+ #pending = new Set();
13
+ constructor(service, recovery, feedback, guard = (action) => action()) {
14
+ this.service = service;
15
+ this.recovery = recovery;
16
+ this.feedback = feedback;
17
+ this.guard = guard;
18
+ }
19
+ subscribe(listener) {
20
+ this.#listeners.add(listener);
21
+ listener(this.#state);
22
+ return () => this.#listeners.delete(listener);
23
+ }
24
+ subscribeActivity(listener) {
25
+ this.#activity.add(listener);
26
+ this.#announce();
27
+ return () => this.#activity.delete(listener);
28
+ }
29
+ #set(patch) {
30
+ if (this.#closed)
31
+ return;
32
+ this.#state = { ...this.#state, ...patch };
33
+ for (const listener of this.#listeners)
34
+ listener(this.#state);
35
+ }
36
+ #announce() {
37
+ for (const listener of this.#activity)
38
+ listener({ busy: this.#pending.size > 0, phase: this.#state.phase });
39
+ }
40
+ #run(phase, action) {
41
+ if (this.#closed || this.#state.busy)
42
+ return Promise.resolve(false);
43
+ this.#set({ busy: true, phase });
44
+ const job = (async () => {
45
+ try {
46
+ const accepted = await action();
47
+ if (accepted !== false && !this.#closed)
48
+ this.feedback.recovered();
49
+ return accepted !== false;
50
+ }
51
+ catch (error) {
52
+ if (!this.#closed)
53
+ this.feedback.report(error);
54
+ return false;
55
+ }
56
+ finally {
57
+ this.#set({ busy: false, phase: "ready" });
58
+ }
59
+ })();
60
+ const tracked = job.finally(() => {
61
+ this.#pending.delete(tracked);
62
+ this.#announce();
63
+ });
64
+ this.#pending.add(tracked);
65
+ this.#announce();
66
+ return tracked;
67
+ }
68
+ refresh() {
69
+ return this.#run("loading", async () => {
70
+ const request = await this.recovery.load();
71
+ const data = await this.service.status();
72
+ this.#set({ data, request: request ?? data.pending ?? undefined });
73
+ if (data.source_unavailable) {
74
+ this.feedback.report(new Error("Original repository history could not be inspected. Pending import recovery remains available."));
75
+ return false;
76
+ }
77
+ });
78
+ }
79
+ adopt() {
80
+ if (this.#state.request || !this.#state.data?.source)
81
+ return Promise.resolve(false);
82
+ const request = adoptionRequest({
83
+ request_id: crypto.randomUUID(),
84
+ source: this.#state.data.source,
85
+ });
86
+ return this.#run("importing", async () => {
87
+ // Recovery uses App-owned file writers, which the native mutation guard
88
+ // protects too. Prepare before persisting, then reacquire for import.
89
+ const prepared = await this.guard(async () => !this.#closed);
90
+ if (prepared !== true)
91
+ return false;
92
+ await this.recovery.save(request);
93
+ this.#set({ request });
94
+ const data = await this.guard(async () => {
95
+ if (!this.#closed)
96
+ return this.service.adopt(request);
97
+ });
98
+ if (!data)
99
+ return false;
100
+ await this.recovery.save(undefined);
101
+ this.#set({ data, request: undefined });
102
+ return true;
103
+ });
104
+ }
105
+ resume() {
106
+ const request = this.#state.request;
107
+ if (!request)
108
+ return Promise.resolve(false);
109
+ return this.#run("recovering", async () => {
110
+ const data = await this.guard(async () => {
111
+ if (!this.#closed)
112
+ return this.service.adopt(request);
113
+ });
114
+ if (!data)
115
+ return false;
116
+ await this.recovery.save(undefined);
117
+ this.#set({ data, request: undefined });
118
+ return true;
119
+ });
120
+ }
121
+ stop() {
122
+ const request = this.#state.request;
123
+ if (!request)
124
+ return Promise.resolve(false);
125
+ return this.#run("stopping", async () => {
126
+ const data = await this.guard(async () => {
127
+ if (!this.#closed)
128
+ return this.service.stop(request.request_id);
129
+ });
130
+ if (!data)
131
+ return false;
132
+ await this.recovery.save(undefined);
133
+ this.#set({ data, request: undefined });
134
+ return true;
135
+ });
136
+ }
137
+ close() {
138
+ this.#closed = true;
139
+ this.#listeners.clear();
140
+ }
141
+ async drained() {
142
+ while (this.#pending.size)
143
+ await Promise.allSettled([...this.#pending]);
144
+ }
145
+ }
@@ -0,0 +1,30 @@
1
+ export type ExistingHistory = {
2
+ operation: string;
3
+ commit: string;
4
+ };
5
+ export type AdoptionRequest = {
6
+ request_id: string;
7
+ source: ExistingHistory;
8
+ };
9
+ export type AdoptionStatus = {
10
+ source_unavailable?: boolean;
11
+ source: ExistingHistory | null;
12
+ pending: AdoptionRequest | null;
13
+ };
14
+ export interface AdoptionService {
15
+ status(): Promise<AdoptionStatus>;
16
+ adopt(request: AdoptionRequest): Promise<AdoptionStatus>;
17
+ stop(id: string): Promise<AdoptionStatus>;
18
+ }
19
+ export interface AdoptionRecovery {
20
+ load(): Promise<AdoptionRequest | undefined>;
21
+ save(request: AdoptionRequest | undefined): Promise<void>;
22
+ }
23
+ export declare function existingHistory(value: unknown): ExistingHistory;
24
+ export declare function adoptionRequest(value: unknown): AdoptionRequest;
25
+ export type AdoptionState = {
26
+ busy: boolean;
27
+ phase: string;
28
+ data?: AdoptionStatus;
29
+ request?: AdoptionRequest;
30
+ };
@@ -0,0 +1,21 @@
1
+ export function existingHistory(value) {
2
+ const source = value;
3
+ if (!source ||
4
+ typeof source.operation !== "string" ||
5
+ typeof source.commit !== "string" ||
6
+ !/^[a-f0-9]{128}$/.test(source.operation) ||
7
+ !/^[a-f0-9]{40}$/.test(source.commit))
8
+ throw new Error("Invalid original history selection");
9
+ return source;
10
+ }
11
+ export function adoptionRequest(value) {
12
+ const request = value;
13
+ if (!request ||
14
+ typeof request.request_id !== "string" ||
15
+ !/^[a-zA-Z0-9-]{1,128}$/.test(request.request_id))
16
+ throw new Error("Invalid original history import request");
17
+ return {
18
+ request_id: request.request_id,
19
+ source: existingHistory(request.source),
20
+ };
21
+ }
@@ -0,0 +1,57 @@
1
+ import type { App } from "@lapis-notes/api";
2
+ import type { BackupCheckpoint } from "./backup.js";
3
+ import type { HistoryReader } from "./history-reader.js";
4
+ export type AiTurnContext = {
5
+ conversation: string;
6
+ turn: string;
7
+ message: string | null;
8
+ binding: string | null;
9
+ session: string | null;
10
+ agent: string;
11
+ harness: string;
12
+ requested_model: string | null;
13
+ resolved_model: string | null;
14
+ };
15
+ export type AiTurnOutcome = "completed" | "failed" | "cancelled" | "unknown";
16
+ export type AiTurnRecord = {
17
+ version: 1;
18
+ context: AiTurnContext;
19
+ started_at: number;
20
+ ended_at: number | null;
21
+ phase: "running" | "complete" | "incomplete";
22
+ outcome: AiTurnOutcome | null;
23
+ before: BackupCheckpoint;
24
+ after: BackupCheckpoint | null;
25
+ };
26
+ export type AiUndoPreview = {
27
+ paths: string[];
28
+ expected: string;
29
+ };
30
+ export type AiUndoRequest = AiUndoPreview & {
31
+ request_id: string;
32
+ conversation: string;
33
+ turn: string;
34
+ };
35
+ export interface AiHistoryService {
36
+ begin(context: AiTurnContext): Promise<AiTurnRecord>;
37
+ bind(context: AiTurnContext): Promise<AiTurnRecord>;
38
+ end(conversation: string, turn: string, outcome: AiTurnOutcome): Promise<AiTurnRecord>;
39
+ list(conversation: string, after?: string): Promise<{
40
+ records: AiTurnRecord[];
41
+ next: string | null;
42
+ }>;
43
+ read(conversation: string, turn: string): Promise<AiTurnRecord>;
44
+ previewUndo(conversation: string, turn: string, paths: string[]): Promise<AiUndoPreview>;
45
+ undo(request: AiUndoRequest): Promise<unknown>;
46
+ pendingUndo(): Promise<AiUndoRequest[]>;
47
+ }
48
+ export type AiHistoryBinding = {
49
+ service: AiHistoryService;
50
+ reader: HistoryReader;
51
+ enabled(): boolean;
52
+ guard<T>(action: () => Promise<T>): Promise<T>;
53
+ reveal(record: AiTurnRecord): Promise<void>;
54
+ };
55
+ export declare function bindAiHistory(app: App, binding: AiHistoryBinding): () => void;
56
+ export declare const ownedAiHistory: (app?: App) => AiHistoryBinding | undefined;
57
+ export declare function parseAiTurn(value: unknown): AiTurnRecord;
@@ -0,0 +1,51 @@
1
+ const bindings = new WeakMap();
2
+ export function bindAiHistory(app, binding) {
3
+ if (bindings.has(app))
4
+ throw new Error("AI history is already bound");
5
+ bindings.set(app, binding);
6
+ return () => {
7
+ if (bindings.get(app) === binding)
8
+ bindings.delete(app);
9
+ };
10
+ }
11
+ export const ownedAiHistory = (app) => app ? bindings.get(app) : undefined;
12
+ export function parseAiTurn(value) {
13
+ const row = value;
14
+ const checkpoint = (p) => p &&
15
+ /^[0-9a-f]{40,128}$/u.test(p.commit) &&
16
+ /^[0-9a-f]{40,128}$/u.test(p.operation) &&
17
+ typeof p.description === "string" &&
18
+ Number.isSafeInteger(p.timestamp_millis);
19
+ if (!row ||
20
+ row.version !== 1 ||
21
+ !row.context ||
22
+ !["running", "complete", "incomplete"].includes(row.phase) ||
23
+ !Number.isSafeInteger(row.started_at) ||
24
+ (row.ended_at !== null && !Number.isSafeInteger(row.ended_at)) ||
25
+ (row.outcome !== null &&
26
+ !["completed", "failed", "cancelled", "unknown"].includes(row.outcome)) ||
27
+ (row.phase === "complete" &&
28
+ (!row.after || !row.outcome || row.outcome === "unknown")) ||
29
+ !checkpoint(row.before) ||
30
+ (row.after !== null && !checkpoint(row.after)))
31
+ throw new Error("Invalid AI history record");
32
+ for (const id of [row.context.conversation, row.context.turn])
33
+ if (typeof id !== "string" || !/^[a-zA-Z0-9-]{1,128}$/u.test(id))
34
+ throw new Error("Invalid AI history identity");
35
+ for (const text of [
36
+ row.context.agent,
37
+ row.context.harness,
38
+ row.context.message,
39
+ row.context.binding,
40
+ row.context.session,
41
+ row.context.requested_model,
42
+ row.context.resolved_model,
43
+ ])
44
+ if (text !== null &&
45
+ (typeof text !== "string" ||
46
+ !text.length ||
47
+ text.length > 256 ||
48
+ /[\u0000-\u001f\u007f]/u.test(text)))
49
+ throw new Error("Invalid AI history context");
50
+ return row;
51
+ }
@@ -0,0 +1,2 @@
1
+ /** Display-only lookup; native identities and profile resolution stay host-owned. */
2
+ export declare function reviewGravatar(email: string): Promise<string | undefined>;
@@ -0,0 +1,11 @@
1
+ /** Display-only lookup; native identities and profile resolution stay host-owned. */
2
+ export async function reviewGravatar(email) {
3
+ const normalized = email.trim().toLowerCase();
4
+ if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/u.test(normalized))
5
+ return;
6
+ if (normalized.endsWith("@nostr.invalid"))
7
+ return;
8
+ const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(normalized));
9
+ const hash = Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, "0")).join("");
10
+ return `https://www.gravatar.com/avatar/${hash}?d=404&s=80`;
11
+ }
@@ -0,0 +1,14 @@
1
+ import type { App, NotificationProgressHandle } from "@lapis-notes/api";
2
+ /** App-owned status progress; the caller retains error feedback and lifetime. */
3
+ export declare class BackgroundWork {
4
+ #private;
5
+ constructor(notifications: Pick<App["notifications"], "createProgress">, source: string);
6
+ begin(title: string, message?: string): NotificationProgressHandle;
7
+ run<T>(title: string, task: () => Promise<T>): Promise<T>;
8
+ follow(title: string, controller: {
9
+ subscribe(listener: (state: {
10
+ busy: boolean;
11
+ phase: string;
12
+ }) => void): () => void;
13
+ }): () => void;
14
+ }
@@ -0,0 +1,57 @@
1
+ import { untrack } from "svelte";
2
+ /** App-owned status progress; the caller retains error feedback and lifetime. */
3
+ export class BackgroundWork {
4
+ #notifications;
5
+ #source;
6
+ constructor(notifications, source) {
7
+ this.#notifications = notifications;
8
+ this.#source = source;
9
+ }
10
+ begin(title, message) {
11
+ return untrack(() => this.#notifications.createProgress({
12
+ title,
13
+ message,
14
+ source: this.#source,
15
+ location: "status",
16
+ cancellable: false,
17
+ persistOnComplete: false,
18
+ persistOnError: false,
19
+ }));
20
+ }
21
+ async run(title, task) {
22
+ const progress = this.begin(title);
23
+ try {
24
+ // Progress publication and imperative task setup must not become inputs
25
+ // of a Svelte effect that invokes this command.
26
+ const value = await untrack(task);
27
+ progress.complete();
28
+ return value;
29
+ }
30
+ catch (error) {
31
+ progress.fail(error);
32
+ throw error;
33
+ }
34
+ }
35
+ follow(title, controller) {
36
+ let progress;
37
+ const unsubscribe = controller.subscribe((state) => {
38
+ if (state.busy) {
39
+ progress ??= this.begin(title);
40
+ progress.report({
41
+ message: state.phase === "loading"
42
+ ? "Preparing pinned repository data"
43
+ : "Reading repository changes",
44
+ });
45
+ }
46
+ else {
47
+ progress?.complete();
48
+ progress = undefined;
49
+ }
50
+ });
51
+ return () => {
52
+ unsubscribe();
53
+ progress?.complete();
54
+ progress = undefined;
55
+ };
56
+ }
57
+ }
@@ -0,0 +1,5 @@
1
+ import type { BackupController } from "./backup.js";
2
+ /** Coalesce captures while retaining independent, explicitly pinned views. */
3
+ export declare function followBackup(backup: BackupController | undefined, controller: {
4
+ checkpointChanged(operation: string): Promise<void>;
5
+ }): () => void;
@@ -0,0 +1,29 @@
1
+ /** Coalesce captures while retaining independent, explicitly pinned views. */
2
+ export function followBackup(backup, controller) {
3
+ let closed = false, running = false;
4
+ let next;
5
+ const dispose = backup?.subscribe((state) => {
6
+ if (state.phase !== "ready" || !state.checkpoint)
7
+ return;
8
+ next = state.checkpoint.operation;
9
+ if (!running)
10
+ void drain();
11
+ });
12
+ async function drain() {
13
+ running = true;
14
+ try {
15
+ while (!closed && next) {
16
+ const operation = next;
17
+ next = undefined;
18
+ await controller.checkpointChanged(operation);
19
+ }
20
+ }
21
+ finally {
22
+ running = false;
23
+ }
24
+ }
25
+ return () => {
26
+ closed = true;
27
+ dispose?.();
28
+ };
29
+ }