@lapis-notes/history 0.1.4 → 0.2.2

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 +31 -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,130 @@
1
+ /** An advanced move is explicit and retains native recovery until reload. */
2
+ export class StorageController {
3
+ service;
4
+ feedback;
5
+ guard;
6
+ #state = { busy: false, phase: "ready", needsReload: false };
7
+ #closed = false;
8
+ #listeners = new Set();
9
+ #activity = new Set();
10
+ #pending = new Set();
11
+ constructor(service, feedback, guard = (action) => action()) {
12
+ this.service = service;
13
+ this.feedback = feedback;
14
+ this.guard = guard;
15
+ }
16
+ subscribe(listener) {
17
+ this.#listeners.add(listener);
18
+ listener(this.#state);
19
+ return () => this.#listeners.delete(listener);
20
+ }
21
+ subscribeActivity(listener) {
22
+ this.#activity.add(listener);
23
+ listener({ busy: this.#pending.size > 0, phase: this.#state.phase });
24
+ return () => this.#activity.delete(listener);
25
+ }
26
+ #set(patch) {
27
+ if (this.#closed)
28
+ return;
29
+ this.#state = { ...this.#state, ...patch };
30
+ for (const listener of this.#listeners)
31
+ listener(this.#state);
32
+ }
33
+ #announce() {
34
+ for (const listener of this.#activity)
35
+ listener({ busy: this.#pending.size > 0, phase: this.#state.phase });
36
+ }
37
+ #run(phase, action, mutate = false) {
38
+ if (this.#closed || this.#state.busy)
39
+ return Promise.resolve(false);
40
+ this.#set({ busy: true, phase });
41
+ let attempted = false;
42
+ const job = (async () => {
43
+ try {
44
+ const data = mutate
45
+ ? await this.guard(async () => {
46
+ if (this.#closed)
47
+ return undefined;
48
+ attempted = true;
49
+ return action();
50
+ })
51
+ : await action();
52
+ if (!data)
53
+ return false;
54
+ this.#set({ data, needsReload: this.#state.needsReload || mutate });
55
+ if (mutate)
56
+ await this.service.reload();
57
+ if (!this.#closed)
58
+ this.feedback.recovered();
59
+ return true;
60
+ }
61
+ catch (error) {
62
+ if (attempted) {
63
+ // A lost response may already have installed the selected layout.
64
+ // Observe native recovery; never invent a second move request.
65
+ try {
66
+ this.#set({ data: await this.service.status(), needsReload: true });
67
+ }
68
+ catch {
69
+ this.#set({ needsReload: true });
70
+ }
71
+ }
72
+ if (!this.#closed)
73
+ this.feedback.report(error);
74
+ return false;
75
+ }
76
+ finally {
77
+ this.#set({ busy: false, phase: "ready" });
78
+ }
79
+ })();
80
+ const tracked = job.finally(() => {
81
+ this.#pending.delete(tracked);
82
+ this.#announce();
83
+ });
84
+ this.#pending.add(tracked);
85
+ this.#announce();
86
+ return tracked;
87
+ }
88
+ refresh() {
89
+ return this.#run("loading", () => this.service.status());
90
+ }
91
+ reveal() {
92
+ const data = this.#state.data;
93
+ if (!data?.canReveal ||
94
+ data.pending ||
95
+ this.#state.needsReload ||
96
+ !this.service.reveal)
97
+ return Promise.resolve(false);
98
+ return this.#run("revealing", () => this.service.reveal(data.revision));
99
+ }
100
+ change(location) {
101
+ const data = this.#state.data;
102
+ if (!data || data.pending || data.location === location)
103
+ return Promise.resolve(false);
104
+ const id = crypto.randomUUID();
105
+ return this.#run("moving", () => this.service.change(data.revision, location, id), true);
106
+ }
107
+ recover() {
108
+ return this.#run("recovering", () => this.service.recover(), true);
109
+ }
110
+ rollback() {
111
+ const pending = this.#state.data?.pending;
112
+ if (!pending)
113
+ return Promise.resolve(false);
114
+ return this.#run("recovering", () => this.service.rollback(pending.request_id), true);
115
+ }
116
+ reload() {
117
+ return this.#run("reloading", async () => {
118
+ await this.service.reload();
119
+ return this.#state.data ?? (await this.service.status());
120
+ });
121
+ }
122
+ close() {
123
+ this.#closed = true;
124
+ this.#listeners.clear();
125
+ }
126
+ async drained() {
127
+ while (this.#pending.size)
128
+ await Promise.allSettled([...this.#pending]);
129
+ }
130
+ }
@@ -0,0 +1,26 @@
1
+ export type StorageLocation = "external" | "colocated";
2
+ export type StorageStatus = {
3
+ repositoryPath?: string;
4
+ canReveal?: boolean;
5
+ revision: number;
6
+ location: StorageLocation;
7
+ pending: {
8
+ request_id: string;
9
+ location: StorageLocation;
10
+ phase: string;
11
+ } | null;
12
+ };
13
+ export interface StorageService {
14
+ status(): Promise<StorageStatus>;
15
+ change(revision: number, location: StorageLocation, requestId: string): Promise<StorageStatus>;
16
+ recover(): Promise<StorageStatus>;
17
+ rollback(requestId: string): Promise<StorageStatus>;
18
+ reveal?(revision: number): Promise<StorageStatus>;
19
+ reload(): Promise<void>;
20
+ }
21
+ export type StorageState = {
22
+ busy: boolean;
23
+ phase: string;
24
+ data?: StorageStatus;
25
+ needsReload: boolean;
26
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ import type { RemoteService } from "./remote.js";
2
+ import type { PendingSync, SyncService } from "./sync.js";
3
+ /** Guard and persist the original apply identity before any physical writes. */
4
+ export declare function applyCandidate(options: {
5
+ candidate: string;
6
+ revision: number;
7
+ service: SyncService;
8
+ remote: RemoteService;
9
+ recovery: {
10
+ save(pending?: PendingSync): Promise<void>;
11
+ };
12
+ guard: <T>(action: () => Promise<T>) => Promise<T>;
13
+ cancelled(): boolean;
14
+ closed(): boolean;
15
+ pending(value?: PendingSync): void;
16
+ applying(): void;
17
+ }): Promise<void>;
@@ -0,0 +1,45 @@
1
+ /** Guard and persist the original apply identity before any physical writes. */
2
+ export async function applyCandidate(options) {
3
+ const { service, revision, candidate } = options;
4
+ const pending = await options.guard(async () => {
5
+ if (options.cancelled())
6
+ return;
7
+ const current = await options.remote.status();
8
+ if (options.cancelled())
9
+ return;
10
+ if (current.revision !== revision)
11
+ throw new Error("Backup connection changed; synchronize again");
12
+ const preview = await service.preview(candidate, revision);
13
+ if (options.cancelled())
14
+ return;
15
+ const pending = {
16
+ version: 1,
17
+ revision,
18
+ request: {
19
+ request_id: crypto.randomUUID(),
20
+ checkpoint: preview.checkpoint,
21
+ expected: preview.expected,
22
+ },
23
+ };
24
+ return pending;
25
+ });
26
+ if (!pending || options.cancelled())
27
+ return;
28
+ options.pending(pending);
29
+ // App recovery files have their own writers. Persist before reacquiring
30
+ // protection; native apply rejects any changed expected tree or connection.
31
+ await options.recovery.save(pending);
32
+ if (options.closed())
33
+ return;
34
+ const applied = await options.guard(async () => {
35
+ if (options.closed())
36
+ return false;
37
+ options.applying();
38
+ await service.apply(pending.request, revision);
39
+ return true;
40
+ });
41
+ if (!applied || options.closed())
42
+ return;
43
+ await options.recovery.save(undefined);
44
+ options.pending(undefined);
45
+ }
@@ -0,0 +1,31 @@
1
+ import type { RemoteService } from "./remote.js";
2
+ import { type PendingSync, type SyncResolution, type SyncService, type SyncState, type SyncAction } from "./sync.js";
3
+ export declare class SyncController {
4
+ #private;
5
+ readonly remote: RemoteService;
6
+ readonly service: SyncService;
7
+ readonly guard: <T>(action: () => Promise<T>) => Promise<T>;
8
+ readonly feedback: {
9
+ report(error: unknown): void;
10
+ recovered(): void;
11
+ };
12
+ readonly recovery: {
13
+ load(): Promise<unknown>;
14
+ save(pending?: PendingSync): Promise<void>;
15
+ };
16
+ constructor(remote: RemoteService, service: SyncService, guard: <T>(action: () => Promise<T>) => Promise<T>, feedback: {
17
+ report(error: unknown): void;
18
+ recovered(): void;
19
+ }, recovery: {
20
+ load(): Promise<unknown>;
21
+ save(pending?: PendingSync): Promise<void>;
22
+ });
23
+ subscribe(listener: (state: SyncState) => void): () => boolean;
24
+ setEnabled(enabled: boolean): void;
25
+ run(action?: SyncAction): Promise<void>;
26
+ inspect(path: string): Promise<void>;
27
+ resolve(path: string, resolution: SyncResolution): Promise<void>;
28
+ keepCurrent(): Promise<void>;
29
+ close(): void;
30
+ drained(): Promise<void>;
31
+ }
@@ -0,0 +1,300 @@
1
+ import { applyCandidate } from "./sync-application.js";
2
+ import { observePublication, publishSync, refreshPublished, } from "./sync-publication.js";
3
+ import { pendingSync, syncFeedback, idleSyncPhase, } from "./sync.js";
4
+ export class SyncController {
5
+ remote;
6
+ service;
7
+ guard;
8
+ feedback;
9
+ recovery;
10
+ #state = {
11
+ busy: false,
12
+ phase: "ready",
13
+ enabled: true,
14
+ recovery: false,
15
+ };
16
+ #listeners = new Set();
17
+ #closed = false;
18
+ #job;
19
+ #pending;
20
+ #revision = 0;
21
+ #resumeAction = "sync";
22
+ #feedback;
23
+ #conflictKey;
24
+ #operations = new Set();
25
+ constructor(remote, service, guard, feedback, recovery) {
26
+ this.remote = remote;
27
+ this.service = service;
28
+ this.guard = guard;
29
+ this.feedback = feedback;
30
+ this.recovery = recovery;
31
+ this.#feedback = syncFeedback(feedback);
32
+ }
33
+ subscribe(listener) {
34
+ this.#listeners.add(listener);
35
+ listener(this.#state);
36
+ return () => this.#listeners.delete(listener);
37
+ }
38
+ #set(patch) {
39
+ if (this.#closed)
40
+ return;
41
+ this.#state = { ...this.#state, ...patch };
42
+ for (const listener of this.#listeners)
43
+ listener(this.#state);
44
+ }
45
+ setEnabled(enabled) {
46
+ if (this.#state.enabled === enabled)
47
+ return;
48
+ this.#set({ enabled, phase: enabled ? "ready" : "paused" });
49
+ }
50
+ run(action = "sync") {
51
+ if (this.#closed ||
52
+ (action === "sync" && !this.#state.enabled) ||
53
+ (this.#state.busy && !this.#job))
54
+ return Promise.resolve();
55
+ return (this.#job ??= this.#track(this.#execute(action)).finally(() => {
56
+ this.#job = undefined;
57
+ }));
58
+ }
59
+ async #applyPending() {
60
+ if (!this.#pending)
61
+ return;
62
+ const original = this.#pending;
63
+ this.#set({ phase: "applying", recovery: true });
64
+ await this.guard(async () => {
65
+ if (!this.#closed)
66
+ await this.service.apply(original.request, original.revision);
67
+ });
68
+ if (this.#closed)
69
+ return;
70
+ await this.recovery.save(undefined);
71
+ if (this.#pending === original)
72
+ this.#pending = undefined;
73
+ this.#set({ recovery: false });
74
+ }
75
+ #cancelled(action) {
76
+ return this.#closed || (action === "sync" && !this.#state.enabled);
77
+ }
78
+ async #execute(action) {
79
+ this.#set({
80
+ busy: true,
81
+ phase: action === "status" ? this.#state.phase : "fetching",
82
+ });
83
+ try {
84
+ if (action === "fetch" || action === "status") {
85
+ let upstream = await this.remote.status();
86
+ if (this.#closed)
87
+ return;
88
+ this.#set({ upstream });
89
+ if (action === "fetch") {
90
+ if (!upstream.configuration)
91
+ throw new Error("Connect an upstream repository first");
92
+ upstream = await this.remote.fetch(upstream.revision);
93
+ }
94
+ if (this.#closed)
95
+ return;
96
+ this.#set({ upstream, phase: idleSyncPhase(this.#state) });
97
+ if (action === "fetch")
98
+ this.#feedback.recovered();
99
+ return;
100
+ }
101
+ if (!this.#pending) {
102
+ const stored = await this.recovery.load();
103
+ this.#pending = pendingSync(stored);
104
+ if (stored != null && !this.#pending) {
105
+ this.#set({ recovery: true });
106
+ throw new Error("Saved synchronization recovery is invalid; keep current files before synchronizing again");
107
+ }
108
+ }
109
+ if (this.#closed)
110
+ return;
111
+ if (action === "push" &&
112
+ (this.#pending ||
113
+ this.#state.recovery ||
114
+ this.#state.proposal?.conflicts.length))
115
+ throw new Error("Review pending synchronization before pushing");
116
+ await this.#applyPending();
117
+ if (this.#cancelled(action))
118
+ return;
119
+ let remote = await this.remote.status();
120
+ this.#set({ upstream: remote });
121
+ if (this.#cancelled(action))
122
+ return;
123
+ if (!remote.configuration) {
124
+ if (action !== "sync")
125
+ throw new Error("Connect an upstream repository first");
126
+ this.#set({ phase: "ready" });
127
+ this.#feedback.recovered();
128
+ return;
129
+ }
130
+ remote = await observePublication(this.remote, remote);
131
+ if (this.#cancelled(action))
132
+ return;
133
+ this.#set({ upstream: remote });
134
+ if (!remote.configuration)
135
+ return;
136
+ this.#revision = remote.revision;
137
+ if (action === "push") {
138
+ if (!remote.configuration.canPush)
139
+ throw new Error("This account cannot push to the upstream repository");
140
+ const captured = await this.guard(async () => {
141
+ if (this.#cancelled(action))
142
+ return false;
143
+ await this.remote.keepCurrent();
144
+ return true;
145
+ });
146
+ if (!captured || this.#cancelled(action))
147
+ return;
148
+ this.#set({ phase: "publishing" });
149
+ await publishSync(this.service, remote.revision);
150
+ if (this.#closed)
151
+ return;
152
+ this.#set({ upstream: await refreshPublished(this.remote, remote) });
153
+ this.#set({ phase: idleSyncPhase(this.#state) });
154
+ this.#feedback.recovered();
155
+ return;
156
+ }
157
+ this.#resumeAction = action;
158
+ const proposal = await this.service.prepare(remote.revision);
159
+ if (this.#cancelled(action))
160
+ return;
161
+ this.#set({ proposal: proposal ?? undefined, conflict: undefined });
162
+ if (proposal?.conflicts.length) {
163
+ this.#set({ phase: "conflicts" });
164
+ if (this.#conflictKey !== proposal.candidate?.commit) {
165
+ this.#conflictKey = proposal.candidate?.commit;
166
+ this.#feedback.report(new Error("Backup has conflicts. Open Backup settings to review them."));
167
+ }
168
+ return;
169
+ }
170
+ if (proposal?.candidate) {
171
+ await applyCandidate({
172
+ candidate: proposal.candidate.commit,
173
+ revision: remote.revision,
174
+ service: this.service,
175
+ remote: this.remote,
176
+ recovery: this.recovery,
177
+ guard: this.guard,
178
+ cancelled: () => this.#cancelled(action),
179
+ closed: () => this.#closed,
180
+ pending: (next) => {
181
+ this.#pending = next;
182
+ if (!next)
183
+ this.#set({ recovery: false });
184
+ },
185
+ applying: () => this.#set({ phase: "applying", recovery: true }),
186
+ });
187
+ }
188
+ if (this.#cancelled(action))
189
+ return;
190
+ if (action === "sync" && remote.configuration.canPush) {
191
+ this.#set({ phase: "publishing" });
192
+ await publishSync(this.service, remote.revision);
193
+ remote = await refreshPublished(this.remote, remote);
194
+ }
195
+ if (!this.#closed) {
196
+ this.#set({
197
+ upstream: action === "sync" ? remote : await this.remote.status(),
198
+ });
199
+ this.#set({
200
+ phase: this.#state.enabled ? "ready" : "paused",
201
+ proposal: undefined,
202
+ ...(action === "sync" ? { lastSuccess: Date.now() } : {}),
203
+ });
204
+ this.#feedback.recovered();
205
+ }
206
+ }
207
+ catch (error) {
208
+ if (!this.#closed) {
209
+ this.#set({
210
+ phase: "attention",
211
+ recovery: this.#state.recovery || !!this.#pending,
212
+ });
213
+ this.#feedback.report(error);
214
+ }
215
+ }
216
+ finally {
217
+ this.#set({ busy: false });
218
+ }
219
+ }
220
+ async inspect(path) {
221
+ const proposal = this.#state.proposal;
222
+ if (this.#closed || this.#state.busy || !proposal?.candidate)
223
+ return;
224
+ this.#set({ busy: true });
225
+ try {
226
+ const conflict = await this.#track(this.service.conflict(proposal.candidate.commit, path, this.#revision));
227
+ this.#set({ conflict });
228
+ }
229
+ catch (error) {
230
+ if (!this.#closed)
231
+ this.#feedback.report(error);
232
+ }
233
+ finally {
234
+ this.#set({ busy: false });
235
+ }
236
+ }
237
+ async resolve(path, resolution) {
238
+ const proposal = this.#state.proposal;
239
+ if (this.#closed || this.#state.busy || !proposal?.candidate)
240
+ return;
241
+ this.#set({ busy: true });
242
+ try {
243
+ const candidate = await this.#track(this.service.resolve(proposal.candidate.commit, path, resolution, this.#revision));
244
+ if (this.#closed)
245
+ return;
246
+ this.#set({
247
+ proposal: {
248
+ ...proposal,
249
+ candidate,
250
+ conflicts: proposal.conflicts.filter((value) => value !== path),
251
+ },
252
+ conflict: undefined,
253
+ });
254
+ this.#feedback.recovered();
255
+ }
256
+ catch (error) {
257
+ if (!this.#closed)
258
+ this.#feedback.report(error);
259
+ }
260
+ finally {
261
+ this.#set({ busy: false });
262
+ }
263
+ if (!this.#state.proposal?.conflicts.length)
264
+ await this.run(this.#resumeAction);
265
+ }
266
+ async keepCurrent() {
267
+ if (this.#closed || this.#state.busy)
268
+ return;
269
+ this.#set({ busy: true });
270
+ try {
271
+ await this.#track(this.guard(() => this.remote.keepCurrent()));
272
+ if (this.#closed)
273
+ return;
274
+ await this.recovery.save(undefined);
275
+ this.#pending = undefined;
276
+ this.#set({ recovery: false, phase: "ready" });
277
+ this.#feedback.recovered();
278
+ }
279
+ catch (error) {
280
+ if (!this.#closed)
281
+ this.#feedback.report(error);
282
+ }
283
+ finally {
284
+ this.#set({ busy: false });
285
+ }
286
+ }
287
+ close() {
288
+ this.#closed = true;
289
+ this.#listeners.clear();
290
+ }
291
+ #track(job) {
292
+ this.#operations.add(job);
293
+ void job.finally(() => this.#operations.delete(job)).catch(() => { });
294
+ return job;
295
+ }
296
+ async drained() {
297
+ while (this.#operations.size)
298
+ await Promise.allSettled([...this.#operations]);
299
+ }
300
+ }
@@ -0,0 +1,7 @@
1
+ import type { RemoteService, RemoteSnapshot } from "./remote.js";
2
+ import type { SyncService } from "./sync.js";
3
+ /** Observe the retained intent before allowing any new publication request. */
4
+ export declare function observePublication(service: RemoteService, snapshot: RemoteSnapshot): Promise<RemoteSnapshot>;
5
+ export declare function publishSync(service: SyncService, revision: number): Promise<void>;
6
+ /** A proven push stays successful even if refreshing its optional counts fails. */
7
+ export declare function refreshPublished(service: RemoteService, previous: RemoteSnapshot): Promise<RemoteSnapshot>;
@@ -0,0 +1,29 @@
1
+ /** Observe the retained intent before allowing any new publication request. */
2
+ export async function observePublication(service, snapshot) {
3
+ if (!snapshot.publication || !service.publication)
4
+ return snapshot;
5
+ const current = await service.publication.observe(snapshot.revision, snapshot.publication.request_id);
6
+ if (current.publication &&
7
+ (current.publication.outcome !== "prepared" ||
8
+ !current.configuration?.canPush))
9
+ throw new Error("The original push still needs observation; local history is safe");
10
+ return current;
11
+ }
12
+ export async function publishSync(service, revision) {
13
+ const result = await service.publish(revision, crypto.randomUUID());
14
+ if (result !== "complete")
15
+ throw new Error(result === "unknown"
16
+ ? "The original push still needs observation; local history is safe"
17
+ : result === "stopped"
18
+ ? "The original push stopped tracking; synchronize again to create a new request"
19
+ : "The remote advanced; synchronization will fetch and merge again");
20
+ }
21
+ /** A proven push stays successful even if refreshing its optional counts fails. */
22
+ export async function refreshPublished(service, previous) {
23
+ try {
24
+ return await service.fetch(previous.revision);
25
+ }
26
+ catch {
27
+ return { ...previous, divergence: null };
28
+ }
29
+ }
@@ -0,0 +1,7 @@
1
+ import { updateRepositoryData } from "./plugin-data.js";
2
+ import { type PendingSync } from "./sync.js";
3
+ /** The completing command can clear only the record that it loaded or saved. */
4
+ export declare function syncRecovery(owner: Parameters<typeof updateRepositoryData>[0]): {
5
+ load(): Promise<unknown>;
6
+ save(pending?: PendingSync): Promise<void>;
7
+ };
@@ -0,0 +1,27 @@
1
+ import { updateRepositoryData } from "./plugin-data.js";
2
+ import { pendingSync } from "./sync.js";
3
+ /** The completing command can clear only the record that it loaded or saved. */
4
+ export function syncRecovery(owner) {
5
+ let original;
6
+ return {
7
+ async load() {
8
+ original = (await owner.loadData())?.pendingSync;
9
+ return original;
10
+ },
11
+ async save(pending) {
12
+ if (pending)
13
+ original = pending;
14
+ const own = original;
15
+ await updateRepositoryData(owner, (current) => {
16
+ if (pending)
17
+ return { pendingSync: pending };
18
+ const selected = pendingSync(current.pendingSync);
19
+ const expected = pendingSync(own);
20
+ const matches = expected
21
+ ? selected?.request.request_id === expected.request.request_id
22
+ : JSON.stringify(current.pendingSync) === JSON.stringify(own);
23
+ return matches ? { pendingSync: null } : {};
24
+ });
25
+ },
26
+ };
27
+ }