@lapis-notes/history 0.1.2 → 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 (334) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/LICENSE.md +3 -7
  3. package/README.md +2 -2
  4. package/dist/history-compare-panel.css +28 -6
  5. package/dist/history-compare-panel.svelte +115 -108
  6. package/dist/repository/NOTICE.md +11 -0
  7. package/dist/repository/components/RepositoryAuthorAvatar.svelte +77 -0
  8. package/dist/repository/components/RepositoryAuthorAvatar.svelte.d.ts +11 -0
  9. package/dist/repository/components/RepositoryBackupStatus.svelte +236 -0
  10. package/dist/repository/components/RepositoryBackupStatus.svelte.d.ts +11 -0
  11. package/dist/repository/components/RepositoryChangedFiles.svelte +104 -0
  12. package/dist/repository/components/RepositoryChangedFiles.svelte.d.ts +13 -0
  13. package/dist/repository/components/RepositoryCommitMessage.svelte +93 -0
  14. package/dist/repository/components/RepositoryCommitMessage.svelte.d.ts +6 -0
  15. package/dist/repository/components/RepositoryCommitPicker.svelte +205 -0
  16. package/dist/repository/components/RepositoryCommitPicker.svelte.d.ts +17 -0
  17. package/dist/repository/components/RepositoryComparisonBar.svelte +71 -0
  18. package/dist/repository/components/RepositoryComparisonBar.svelte.d.ts +9 -0
  19. package/dist/repository/components/RepositoryComparisonTime.svelte +32 -0
  20. package/dist/repository/components/RepositoryComparisonTime.svelte.d.ts +6 -0
  21. package/dist/repository/components/RepositoryDiff.svelte +56 -0
  22. package/dist/repository/components/RepositoryDiff.svelte.d.ts +11 -0
  23. package/dist/repository/components/RepositoryDiffColumn.svelte +78 -0
  24. package/dist/repository/components/RepositoryDiffColumn.svelte.d.ts +14 -0
  25. package/dist/repository/components/RepositoryDiffControls.svelte +117 -0
  26. package/dist/repository/components/RepositoryDiffControls.svelte.d.ts +8 -0
  27. package/dist/repository/components/RepositoryFileHistory.svelte +170 -0
  28. package/dist/repository/components/RepositoryFileHistory.svelte.d.ts +10 -0
  29. package/dist/repository/components/RepositoryFileTitle.svelte +30 -0
  30. package/dist/repository/components/RepositoryFileTitle.svelte.d.ts +6 -0
  31. package/dist/repository/components/RepositoryGraph.svelte +216 -0
  32. package/dist/repository/components/RepositoryGraph.svelte.d.ts +19 -0
  33. package/dist/repository/components/RepositoryGraphSvg.svelte +110 -0
  34. package/dist/repository/components/RepositoryGraphSvg.svelte.d.ts +11 -0
  35. package/dist/repository/components/RepositoryIdentifiers.svelte +221 -0
  36. package/dist/repository/components/RepositoryIdentifiers.svelte.d.ts +15 -0
  37. package/dist/repository/components/RepositoryLogHeader.svelte +90 -0
  38. package/dist/repository/components/RepositoryLogHeader.svelte.d.ts +23 -0
  39. package/dist/repository/components/RepositoryOperationArguments.svelte +52 -0
  40. package/dist/repository/components/RepositoryOperationArguments.svelte.d.ts +6 -0
  41. package/dist/repository/components/RepositoryOperationColumn.svelte +163 -0
  42. package/dist/repository/components/RepositoryOperationColumn.svelte.d.ts +11 -0
  43. package/dist/repository/components/RepositoryOperationFiles.svelte +245 -0
  44. package/dist/repository/components/RepositoryOperationFiles.svelte.d.ts +14 -0
  45. package/dist/repository/components/RepositoryOperationMessage.svelte +169 -0
  46. package/dist/repository/components/RepositoryOperationMessage.svelte.d.ts +10 -0
  47. package/dist/repository/components/RepositoryOperationOption.svelte +183 -0
  48. package/dist/repository/components/RepositoryOperationOption.svelte.d.ts +10 -0
  49. package/dist/repository/components/RepositoryOperationParentPicker.svelte +188 -0
  50. package/dist/repository/components/RepositoryOperationParentPicker.svelte.d.ts +14 -0
  51. package/dist/repository/components/RepositoryOperationPinPicker.svelte +170 -0
  52. package/dist/repository/components/RepositoryOperationPinPicker.svelte.d.ts +13 -0
  53. package/dist/repository/components/RepositoryOperationRail.svelte +136 -0
  54. package/dist/repository/components/RepositoryOperationRail.svelte.d.ts +9 -0
  55. package/dist/repository/components/RepositoryOperationTarget.svelte +99 -0
  56. package/dist/repository/components/RepositoryOperationTarget.svelte.d.ts +8 -0
  57. package/dist/repository/components/RepositoryOperations.svelte +199 -0
  58. package/dist/repository/components/RepositoryOperations.svelte.d.ts +12 -0
  59. package/dist/repository/components/RepositoryPanel.svelte +207 -0
  60. package/dist/repository/components/RepositoryPanel.svelte.d.ts +15 -0
  61. package/dist/repository/components/RepositoryParentSummary.svelte +52 -0
  62. package/dist/repository/components/RepositoryParentSummary.svelte.d.ts +10 -0
  63. package/dist/repository/components/RepositoryPickerSearch.svelte +51 -0
  64. package/dist/repository/components/RepositoryPickerSearch.svelte.d.ts +11 -0
  65. package/dist/repository/components/RepositoryRestoreDialog.svelte +81 -0
  66. package/dist/repository/components/RepositoryRestoreDialog.svelte.d.ts +7 -0
  67. package/dist/repository/components/RepositoryRevisionActions.svelte +53 -0
  68. package/dist/repository/components/RepositoryRevisionActions.svelte.d.ts +9 -0
  69. package/dist/repository/components/RepositoryRevisionFiles.svelte +110 -0
  70. package/dist/repository/components/RepositoryRevisionFiles.svelte.d.ts +14 -0
  71. package/dist/repository/components/RepositoryRevisionOption.svelte +60 -0
  72. package/dist/repository/components/RepositoryRevisionOption.svelte.d.ts +9 -0
  73. package/dist/repository/components/RepositoryRevisionPicker.svelte +165 -0
  74. package/dist/repository/components/RepositoryRevisionPicker.svelte.d.ts +14 -0
  75. package/dist/repository/components/RepositoryRevisions.svelte +115 -0
  76. package/dist/repository/components/RepositoryRevisions.svelte.d.ts +20 -0
  77. package/dist/repository/components/RepositoryShell.svelte +44 -0
  78. package/dist/repository/components/RepositoryShell.svelte.d.ts +11 -0
  79. package/dist/repository/components/RepositorySkeleton.svelte +138 -0
  80. package/dist/repository/components/RepositorySkeleton.svelte.d.ts +7 -0
  81. package/dist/repository/components/RepositorySourcePicker.svelte +114 -0
  82. package/dist/repository/components/RepositorySourcePicker.svelte.d.ts +7 -0
  83. package/dist/repository/components/RepositoryUpstreamActions.svelte +125 -0
  84. package/dist/repository/components/RepositoryUpstreamActions.svelte.d.ts +8 -0
  85. package/dist/repository/components/RepositoryWorkingCopyStatus.svelte +290 -0
  86. package/dist/repository/components/RepositoryWorkingCopyStatus.svelte.d.ts +11 -0
  87. package/dist/repository/components/RepositoryWorkspacePicker.svelte +158 -0
  88. package/dist/repository/components/RepositoryWorkspacePicker.svelte.d.ts +11 -0
  89. package/dist/repository/components/backup/AdoptionSettings.svelte +95 -0
  90. package/dist/repository/components/backup/AdoptionSettings.svelte.d.ts +7 -0
  91. package/dist/repository/components/backup/BackupCard.svelte +79 -0
  92. package/dist/repository/components/backup/BackupCard.svelte.d.ts +14 -0
  93. package/dist/repository/components/backup/BackupField.svelte +45 -0
  94. package/dist/repository/components/backup/BackupField.svelte.d.ts +10 -0
  95. package/dist/repository/components/backup/BackupSelect.svelte +71 -0
  96. package/dist/repository/components/backup/BackupSelect.svelte.d.ts +35 -0
  97. package/dist/repository/components/backup/BackupSettings.svelte +122 -0
  98. package/dist/repository/components/backup/BackupSettings.svelte.d.ts +18 -0
  99. package/dist/repository/components/backup/BackupSettingsField.svelte +13 -0
  100. package/dist/repository/components/backup/BackupSettingsField.svelte.d.ts +4 -0
  101. package/dist/repository/components/backup/ForgeAccounts.svelte +231 -0
  102. package/dist/repository/components/backup/ForgeAccounts.svelte.d.ts +9 -0
  103. package/dist/repository/components/backup/ForgeAuthorization.svelte +267 -0
  104. package/dist/repository/components/backup/ForgeAuthorization.svelte.d.ts +9 -0
  105. package/dist/repository/components/backup/ForgeIcon.svelte +21 -0
  106. package/dist/repository/components/backup/ForgeIcon.svelte.d.ts +7 -0
  107. package/dist/repository/components/backup/PublicationRecovery.svelte +129 -0
  108. package/dist/repository/components/backup/PublicationRecovery.svelte.d.ts +11 -0
  109. package/dist/repository/components/backup/RemoteSettings.svelte +288 -0
  110. package/dist/repository/components/backup/RemoteSettings.svelte.d.ts +11 -0
  111. package/dist/repository/components/backup/RepositorySettingsPage.svelte +51 -0
  112. package/dist/repository/components/backup/RepositorySettingsPage.svelte.d.ts +4 -0
  113. package/dist/repository/components/backup/StorageSettings.svelte +158 -0
  114. package/dist/repository/components/backup/StorageSettings.svelte.d.ts +7 -0
  115. package/dist/repository/components/backup/SyncConflictEditor.svelte +158 -0
  116. package/dist/repository/components/backup/SyncConflictEditor.svelte.d.ts +9 -0
  117. package/dist/repository/components/backup/SyncSettings.svelte +97 -0
  118. package/dist/repository/components/backup/SyncSettings.svelte.d.ts +9 -0
  119. package/dist/repository/components/backup/adoption-settings.d.ts +7 -0
  120. package/dist/repository/components/backup/adoption-settings.js +42 -0
  121. package/dist/repository/components/backup/backup-settings.d.ts +35 -0
  122. package/dist/repository/components/backup/backup-settings.js +96 -0
  123. package/dist/repository/components/backup/forge-icons.d.ts +10 -0
  124. package/dist/repository/components/backup/forge-icons.js +11 -0
  125. package/dist/repository/components/backup/remote-restore.d.ts +3 -0
  126. package/dist/repository/components/backup/remote-restore.js +17 -0
  127. package/dist/repository/components/backup/storage-settings.d.ts +8 -0
  128. package/dist/repository/components/backup/storage-settings.js +23 -0
  129. package/dist/repository/components/blame/RepositoryBlameCommitTitle.svelte +212 -0
  130. package/dist/repository/components/blame/RepositoryBlameCommitTitle.svelte.d.ts +14 -0
  131. package/dist/repository/components/blame/RepositoryBlameGroup.svelte +189 -0
  132. package/dist/repository/components/blame/RepositoryBlameGroup.svelte.d.ts +20 -0
  133. package/dist/repository/components/blame/RepositoryBlamePanel.svelte +148 -0
  134. package/dist/repository/components/blame/RepositoryBlamePanel.svelte.d.ts +13 -0
  135. package/dist/repository/components/blame/RepositoryBlameRows.svelte +137 -0
  136. package/dist/repository/components/blame/RepositoryBlameRows.svelte.d.ts +32 -0
  137. package/dist/repository/components/blame/RepositoryBlameView.svelte +121 -0
  138. package/dist/repository/components/blame/RepositoryBlameView.svelte.d.ts +16 -0
  139. package/dist/repository/components/blame/blame-view.d.ts +16 -0
  140. package/dist/repository/components/blame/blame-view.js +73 -0
  141. package/dist/repository/components/blame/editor-actions.d.ts +3 -0
  142. package/dist/repository/components/blame/editor-actions.js +53 -0
  143. package/dist/repository/components/conflicts/RepositoryConflictActions.svelte +83 -0
  144. package/dist/repository/components/conflicts/RepositoryConflictActions.svelte.d.ts +13 -0
  145. package/dist/repository/components/conflicts/RepositoryConflictBody.svelte +93 -0
  146. package/dist/repository/components/conflicts/RepositoryConflictBody.svelte.d.ts +16 -0
  147. package/dist/repository/components/conflicts/RepositoryConflictFileTree.svelte +84 -0
  148. package/dist/repository/components/conflicts/RepositoryConflictFileTree.svelte.d.ts +21 -0
  149. package/dist/repository/components/conflicts/RepositoryConflictPath.svelte +35 -0
  150. package/dist/repository/components/conflicts/RepositoryConflictPath.svelte.d.ts +9 -0
  151. package/dist/repository/components/conflicts/RepositoryConflictResolution.svelte +133 -0
  152. package/dist/repository/components/conflicts/RepositoryConflictResolution.svelte.d.ts +12 -0
  153. package/dist/repository/components/conflicts/RepositoryConflictSurface.svelte +105 -0
  154. package/dist/repository/components/conflicts/RepositoryConflictSurface.svelte.d.ts +23 -0
  155. package/dist/repository/components/conflicts/RepositoryConflictText.svelte +104 -0
  156. package/dist/repository/components/conflicts/RepositoryConflictText.svelte.d.ts +26 -0
  157. package/dist/repository/components/conflicts/RepositorySidebarToggleIcon.svelte +52 -0
  158. package/dist/repository/components/conflicts/RepositorySidebarToggleIcon.svelte.d.ts +7 -0
  159. package/dist/repository/components/conflicts/repository-conflict-file-tree.css +73 -0
  160. package/dist/repository/components/conflicts/repository-conflicts.css +125 -0
  161. package/dist/repository/components/file-history-view.d.ts +15 -0
  162. package/dist/repository/components/file-history-view.js +110 -0
  163. package/dist/repository/components/operation-view.d.ts +16 -0
  164. package/dist/repository/components/operation-view.js +95 -0
  165. package/dist/repository/components/repository-backup.d.ts +22 -0
  166. package/dist/repository/components/repository-backup.js +75 -0
  167. package/dist/repository/components/repository-column-chrome.css +35 -0
  168. package/dist/repository/components/repository-commit-picker.css +55 -0
  169. package/dist/repository/components/repository-feedback.d.ts +7 -0
  170. package/dist/repository/components/repository-feedback.js +40 -0
  171. package/dist/repository/components/repository-identifiers.css +199 -0
  172. package/dist/repository/components/repository-navigation.d.ts +4 -0
  173. package/dist/repository/components/repository-navigation.js +16 -0
  174. package/dist/repository/components/repository-operation-column.css +112 -0
  175. package/dist/repository/components/repository-picker-options.css +11 -0
  176. package/dist/repository/components/repository-plugin.d.ts +33 -0
  177. package/dist/repository/components/repository-plugin.js +191 -0
  178. package/dist/repository/components/repository-review-identifiers.css +50 -0
  179. package/dist/repository/components/repository-status.d.ts +13 -0
  180. package/dist/repository/components/repository-status.js +227 -0
  181. package/dist/repository/components/repository-sync.d.ts +13 -0
  182. package/dist/repository/components/repository-sync.js +93 -0
  183. package/dist/repository/components/repository-tools.d.ts +3 -0
  184. package/dist/repository/components/repository-tools.js +13 -0
  185. package/dist/repository/components/repository-view.d.ts +16 -0
  186. package/dist/repository/components/repository-view.js +140 -0
  187. package/dist/repository/components/restore-controller.d.ts +9 -0
  188. package/dist/repository/components/restore-controller.js +44 -0
  189. package/dist/repository/components/search/search-provider.d.ts +3 -0
  190. package/dist/repository/components/search/search-provider.js +185 -0
  191. package/dist/repository/controllers/adoption-controller.d.ts +29 -0
  192. package/dist/repository/controllers/adoption-controller.js +145 -0
  193. package/dist/repository/controllers/adoption.d.ts +30 -0
  194. package/dist/repository/controllers/adoption.js +21 -0
  195. package/dist/repository/controllers/ai-history.d.ts +57 -0
  196. package/dist/repository/controllers/ai-history.js +51 -0
  197. package/dist/repository/controllers/author.d.ts +2 -0
  198. package/dist/repository/controllers/author.js +11 -0
  199. package/dist/repository/controllers/background-work.d.ts +14 -0
  200. package/dist/repository/controllers/background-work.js +57 -0
  201. package/dist/repository/controllers/backup-follow.d.ts +5 -0
  202. package/dist/repository/controllers/backup-follow.js +29 -0
  203. package/dist/repository/controllers/backup.d.ts +39 -0
  204. package/dist/repository/controllers/backup.js +129 -0
  205. package/dist/repository/controllers/blame-chunks.d.ts +13 -0
  206. package/dist/repository/controllers/blame-chunks.js +51 -0
  207. package/dist/repository/controllers/blame-controller.d.ts +17 -0
  208. package/dist/repository/controllers/blame-controller.js +148 -0
  209. package/dist/repository/controllers/blame-model.d.ts +25 -0
  210. package/dist/repository/controllers/blame-model.js +31 -0
  211. package/dist/repository/controllers/blame-preferences.d.ts +3 -0
  212. package/dist/repository/controllers/blame-preferences.js +18 -0
  213. package/dist/repository/controllers/commit-cards.d.ts +4 -0
  214. package/dist/repository/controllers/commit-cards.js +38 -0
  215. package/dist/repository/controllers/conflict-menu.d.ts +2 -0
  216. package/dist/repository/controllers/conflict-menu.js +1 -0
  217. package/dist/repository/controllers/file-history-controller.d.ts +29 -0
  218. package/dist/repository/controllers/file-history-controller.js +182 -0
  219. package/dist/repository/controllers/forge-accounts.d.ts +48 -0
  220. package/dist/repository/controllers/forge-accounts.js +1 -0
  221. package/dist/repository/controllers/forge-controller.d.ts +24 -0
  222. package/dist/repository/controllers/forge-controller.js +168 -0
  223. package/dist/repository/controllers/graph/model.d.ts +20 -0
  224. package/dist/repository/controllers/graph/model.js +33 -0
  225. package/dist/repository/controllers/graph/repository-log-graph.d.ts +44 -0
  226. package/dist/repository/controllers/graph/repository-log-graph.js +182 -0
  227. package/dist/repository/controllers/graph/repository-log-lanes.d.ts +7 -0
  228. package/dist/repository/controllers/graph/repository-log-lanes.js +19 -0
  229. package/dist/repository/controllers/graph/revision-id.d.ts +3 -0
  230. package/dist/repository/controllers/graph/revision-id.js +10 -0
  231. package/dist/repository/controllers/history-canvas.d.ts +2 -0
  232. package/dist/repository/controllers/history-canvas.js +45 -0
  233. package/dist/repository/controllers/history-controller.d.ts +31 -0
  234. package/dist/repository/controllers/history-controller.js +238 -0
  235. package/dist/repository/controllers/history-files.d.ts +7 -0
  236. package/dist/repository/controllers/history-files.js +18 -0
  237. package/dist/repository/controllers/history-graph.d.ts +20 -0
  238. package/dist/repository/controllers/history-graph.js +89 -0
  239. package/dist/repository/controllers/history-index-controller.d.ts +22 -0
  240. package/dist/repository/controllers/history-index-controller.js +77 -0
  241. package/dist/repository/controllers/history-lifetime.d.ts +13 -0
  242. package/dist/repository/controllers/history-lifetime.js +40 -0
  243. package/dist/repository/controllers/history-reader.d.ts +22 -0
  244. package/dist/repository/controllers/history-reader.js +1 -0
  245. package/dist/repository/controllers/history-search-expression.d.ts +9 -0
  246. package/dist/repository/controllers/history-search-expression.js +86 -0
  247. package/dist/repository/controllers/history-selection.d.ts +5 -0
  248. package/dist/repository/controllers/history-selection.js +32 -0
  249. package/dist/repository/controllers/history-source.d.ts +10 -0
  250. package/dist/repository/controllers/history-source.js +7 -0
  251. package/dist/repository/controllers/history-state.d.ts +34 -0
  252. package/dist/repository/controllers/history-state.js +55 -0
  253. package/dist/repository/controllers/indexed-search-validation.d.ts +4 -0
  254. package/dist/repository/controllers/indexed-search-validation.js +64 -0
  255. package/dist/repository/controllers/indexed-search.d.ts +11 -0
  256. package/dist/repository/controllers/indexed-search.js +1 -0
  257. package/dist/repository/controllers/log-canvas.d.ts +2 -0
  258. package/dist/repository/controllers/log-canvas.js +25 -0
  259. package/dist/repository/controllers/native-indexed-search.d.ts +4 -0
  260. package/dist/repository/controllers/native-indexed-search.js +10 -0
  261. package/dist/repository/controllers/open-history-revision.d.ts +3 -0
  262. package/dist/repository/controllers/open-history-revision.js +8 -0
  263. package/dist/repository/controllers/operation-command.d.ts +2 -0
  264. package/dist/repository/controllers/operation-command.js +55 -0
  265. package/dist/repository/controllers/operation-controller.d.ts +33 -0
  266. package/dist/repository/controllers/operation-controller.js +267 -0
  267. package/dist/repository/controllers/operation-files.d.ts +33 -0
  268. package/dist/repository/controllers/operation-files.js +182 -0
  269. package/dist/repository/controllers/operation-graph.d.ts +17 -0
  270. package/dist/repository/controllers/operation-graph.js +50 -0
  271. package/dist/repository/controllers/operation-message.d.ts +5 -0
  272. package/dist/repository/controllers/operation-message.js +18 -0
  273. package/dist/repository/controllers/operation-metadata.d.ts +5 -0
  274. package/dist/repository/controllers/operation-metadata.js +26 -0
  275. package/dist/repository/controllers/operation-parent.d.ts +5 -0
  276. package/dist/repository/controllers/operation-parent.js +46 -0
  277. package/dist/repository/controllers/operation-state.d.ts +28 -0
  278. package/dist/repository/controllers/operation-state.js +26 -0
  279. package/dist/repository/controllers/parent-candidates.d.ts +4 -0
  280. package/dist/repository/controllers/parent-candidates.js +27 -0
  281. package/dist/repository/controllers/plugin-data.d.ts +9 -0
  282. package/dist/repository/controllers/plugin-data.js +33 -0
  283. package/dist/repository/controllers/preparation-queue.d.ts +9 -0
  284. package/dist/repository/controllers/preparation-queue.js +55 -0
  285. package/dist/repository/controllers/remote-controller.d.ts +23 -0
  286. package/dist/repository/controllers/remote-controller.js +98 -0
  287. package/dist/repository/controllers/remote.d.ts +48 -0
  288. package/dist/repository/controllers/remote.js +13 -0
  289. package/dist/repository/controllers/restore-recovery.d.ts +3 -0
  290. package/dist/repository/controllers/restore-recovery.js +32 -0
  291. package/dist/repository/controllers/restore.d.ts +66 -0
  292. package/dist/repository/controllers/restore.js +201 -0
  293. package/dist/repository/controllers/revision-comparison.d.ts +20 -0
  294. package/dist/repository/controllers/revision-comparison.js +89 -0
  295. package/dist/repository/controllers/search-controller.d.ts +19 -0
  296. package/dist/repository/controllers/search-controller.js +105 -0
  297. package/dist/repository/controllers/search-page.d.ts +2 -0
  298. package/dist/repository/controllers/search-page.js +39 -0
  299. package/dist/repository/controllers/search.d.ts +51 -0
  300. package/dist/repository/controllers/search.js +8 -0
  301. package/dist/repository/controllers/services.d.ts +7 -0
  302. package/dist/repository/controllers/services.js +24 -0
  303. package/dist/repository/controllers/storage-controller.d.ts +30 -0
  304. package/dist/repository/controllers/storage-controller.js +130 -0
  305. package/dist/repository/controllers/storage.d.ts +26 -0
  306. package/dist/repository/controllers/storage.js +1 -0
  307. package/dist/repository/controllers/sync-application.d.ts +17 -0
  308. package/dist/repository/controllers/sync-application.js +45 -0
  309. package/dist/repository/controllers/sync-controller.d.ts +31 -0
  310. package/dist/repository/controllers/sync-controller.js +300 -0
  311. package/dist/repository/controllers/sync-publication.d.ts +7 -0
  312. package/dist/repository/controllers/sync-publication.js +29 -0
  313. package/dist/repository/controllers/sync-recovery.d.ts +7 -0
  314. package/dist/repository/controllers/sync-recovery.js +27 -0
  315. package/dist/repository/controllers/sync.d.ts +62 -0
  316. package/dist/repository/controllers/sync.js +38 -0
  317. package/dist/repository/controllers/tags.d.ts +7 -0
  318. package/dist/repository/controllers/tags.js +71 -0
  319. package/dist/repository/controllers/transcript-paths.d.ts +2 -0
  320. package/dist/repository/controllers/transcript-paths.js +17 -0
  321. package/dist/repository/controllers/transcript-writers.d.ts +9 -0
  322. package/dist/repository/controllers/transcript-writers.js +37 -0
  323. package/dist/repository/controllers/working-copy-controller.d.ts +22 -0
  324. package/dist/repository/controllers/working-copy-controller.js +58 -0
  325. package/dist/repository/controllers/working-copy-status.d.ts +16 -0
  326. package/dist/repository/controllers/working-copy-status.js +57 -0
  327. package/dist/repository/controllers/workspaces.d.ts +7 -0
  328. package/dist/repository/controllers/workspaces.js +4 -0
  329. package/dist/repository/index.d.ts +9 -0
  330. package/dist/repository/index.js +6 -0
  331. package/manifest.json +12 -3
  332. package/package.json +43 -10
  333. package/registry-content/overview.md +10 -0
  334. package/registry.json +131 -2
@@ -0,0 +1,22 @@
1
+ import type { HistoryIndexStatus, IndexedHistoryService } from "./indexed-search.js";
2
+ export type HistoryIndexState = {
3
+ busy: boolean;
4
+ phase: string;
5
+ status?: HistoryIndexStatus;
6
+ };
7
+ /** Observe cached vault-owned progress; no renderer request schedules a batch. */
8
+ export declare class HistoryIndexController {
9
+ #private;
10
+ readonly service: IndexedHistoryService;
11
+ readonly feedback: {
12
+ report(error: unknown): void;
13
+ recovered(): void;
14
+ };
15
+ constructor(service: IndexedHistoryService, feedback: {
16
+ report(error: unknown): void;
17
+ recovered(): void;
18
+ });
19
+ subscribe(listener: (state: HistoryIndexState) => void): () => void;
20
+ start(): void;
21
+ close(): Promise<void>;
22
+ }
@@ -0,0 +1,77 @@
1
+ /** Observe cached vault-owned progress; no renderer request schedules a batch. */
2
+ export class HistoryIndexController {
3
+ service;
4
+ feedback;
5
+ #closed = false;
6
+ #started = false;
7
+ #job;
8
+ #timer;
9
+ #listeners = new Set();
10
+ #state = { busy: false, phase: "ready" };
11
+ #failure = "";
12
+ constructor(service, feedback) {
13
+ this.service = service;
14
+ this.feedback = feedback;
15
+ }
16
+ subscribe(listener) {
17
+ this.#listeners.add(listener);
18
+ listener(this.#state);
19
+ return () => {
20
+ this.#listeners.delete(listener);
21
+ };
22
+ }
23
+ #set(state) {
24
+ if (this.#closed)
25
+ return;
26
+ this.#state = state;
27
+ for (const listener of this.#listeners)
28
+ listener(state);
29
+ }
30
+ start() {
31
+ if (this.#closed || this.#started)
32
+ return;
33
+ this.#started = true;
34
+ this.#set({ busy: true, phase: "indexing" });
35
+ this.#observe(true);
36
+ }
37
+ #observe(initial = false) {
38
+ if (this.#closed || this.#job)
39
+ return;
40
+ this.#job = this.#read(initial).finally(() => {
41
+ this.#job = undefined;
42
+ if (!this.#closed)
43
+ this.#timer = setTimeout(() => this.#observe(), 1000);
44
+ });
45
+ }
46
+ async #read(initial) {
47
+ try {
48
+ const status = await (initial
49
+ ? this.service.start()
50
+ : this.service.status());
51
+ if (this.#closed)
52
+ return;
53
+ this.#set({
54
+ busy: !status.complete,
55
+ phase: status.complete ? "ready" : "indexing",
56
+ status,
57
+ });
58
+ this.#failure = "";
59
+ this.feedback.recovered();
60
+ }
61
+ catch (error) {
62
+ if (this.#closed)
63
+ return;
64
+ const message = String(error);
65
+ if (message !== this.#failure)
66
+ this.feedback.report(error);
67
+ this.#failure = message;
68
+ this.#set({ ...this.#state, busy: false, phase: "paused" });
69
+ }
70
+ }
71
+ async close() {
72
+ this.#closed = true;
73
+ clearTimeout(this.#timer);
74
+ await this.#job;
75
+ this.#listeners.clear();
76
+ }
77
+ }
@@ -0,0 +1,13 @@
1
+ import type { Handle } from "@lapismd/jj-history";
2
+ import type { HistoryReader } from "./history-reader.js";
3
+ /** Ephemeral handles remain owned until either close or full host release confirms. */
4
+ export declare class HistoryLifetime {
5
+ readonly pending: Set<Promise<unknown>>;
6
+ readonly handles: Set<string>;
7
+ readonly closing: Map<string, Promise<void>>;
8
+ readonly reader: HistoryReader;
9
+ constructor(reader: HistoryReader);
10
+ run(action: () => Promise<void>): Promise<void>;
11
+ closeHandle(handle: Handle): Promise<void>;
12
+ drain(): Promise<void>;
13
+ }
@@ -0,0 +1,40 @@
1
+ /** Ephemeral handles remain owned until either close or full host release confirms. */
2
+ export class HistoryLifetime {
3
+ pending = new Set();
4
+ handles = new Set();
5
+ closing = new Map();
6
+ reader;
7
+ constructor(reader) {
8
+ this.reader = reader;
9
+ }
10
+ run(action) {
11
+ const job = action();
12
+ this.pending.add(job);
13
+ void job.finally(() => this.pending.delete(job)).catch(() => { });
14
+ return job;
15
+ }
16
+ closeHandle(handle) {
17
+ const retained = this.closing.get(handle);
18
+ if (retained)
19
+ return retained;
20
+ const job = this.reader.close(handle).then(() => {
21
+ this.handles.delete(handle);
22
+ });
23
+ this.closing.set(handle, job);
24
+ void job.finally(() => this.closing.delete(handle)).catch(() => { });
25
+ return job;
26
+ }
27
+ async drain() {
28
+ const known = new Set(this.handles);
29
+ // Native close cancels pending reads before draining their workers.
30
+ const closing = Promise.allSettled([...known].map((handle) => this.closeHandle(handle)));
31
+ while (this.pending.size)
32
+ await Promise.allSettled([...this.pending]);
33
+ const late = await Promise.allSettled([...this.handles]
34
+ .filter((handle) => !known.has(handle))
35
+ .map((handle) => this.closeHandle(handle)));
36
+ const failures = [...(await closing), ...late].flatMap((result) => result.status === "rejected" ? [result.reason] : []);
37
+ if (failures.length)
38
+ throw new AggregateError(failures, "Repository history cleanup failed");
39
+ }
40
+ }
@@ -0,0 +1,22 @@
1
+ import type { HistoryClient } from "@lapismd/jj-history";
2
+ /** Transport-independent reader supplied by the host, never by persisted state. */
3
+ export type HistoryReader = Pick<HistoryClient, "heads" | "open" | "status" | "read" | "close"> & Partial<Pick<HistoryClient, "blame">>;
4
+ export type RepositoryLeaveMode = "close" | "reload";
5
+ export interface RepositoryServices {
6
+ aiHistory?: import("./ai-history.js").AiHistoryService;
7
+ adoption?: import("./adoption.js").AdoptionService;
8
+ sources?: () => Promise<{
9
+ original: boolean;
10
+ }>;
11
+ original?: HistoryReader;
12
+ storage?: import("./storage.js").StorageService;
13
+ search?: import("./search.js").HistorySearchService;
14
+ sync?: import("./sync.js").SyncService;
15
+ remote?: import("./remote.js").RemoteService;
16
+ forges?: import("./forge-accounts.js").ForgeService;
17
+ restore?: import("./restore.js").RestoreService;
18
+ backup?: import("./backup.js").BackupService;
19
+ reader: HistoryReader;
20
+ workingCopy?: () => Promise<import("./working-copy-status.js").WorkingCopyStatus>;
21
+ close(mode: RepositoryLeaveMode): Promise<void>;
22
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ import type { SearchQueryExpression } from "@lapis-notes/api";
2
+ import type { HistoryExpression } from "./indexed-search.js";
3
+ /** Lower the shared parser AST; never interpret unsupported syntax as plain text. */
4
+ export declare function historyExpression(node: SearchQueryExpression | null, field?: string | null): HistoryExpression;
5
+ export declare function historyTerms(node: SearchQueryExpression | null): string[];
6
+ export declare function historyRanges(text: string, terms: string[]): {
7
+ start: number;
8
+ end: number;
9
+ }[];
@@ -0,0 +1,86 @@
1
+ /** Lower the shared parser AST; never interpret unsupported syntax as plain text. */
2
+ export function historyExpression(node, field = null) {
3
+ if (!node)
4
+ throw new Error("Enter a history search query");
5
+ switch (node.type) {
6
+ case "group":
7
+ return historyExpression(node.expression, field);
8
+ case "and":
9
+ case "or":
10
+ return {
11
+ type: node.type,
12
+ clauses: node.clauses.map((child) => historyExpression(child, field)),
13
+ };
14
+ case "not":
15
+ return { type: "not", operand: historyExpression(node.operand, field) };
16
+ case "field": {
17
+ if (![
18
+ "file",
19
+ "path",
20
+ "content",
21
+ "author",
22
+ "before",
23
+ "after",
24
+ "commit",
25
+ ].includes(node.name))
26
+ throw new Error(`History does not support ${node.name} filters`);
27
+ return historyExpression(node.value, node.name);
28
+ }
29
+ case "literal": {
30
+ if ((node.kind !== "word" && node.kind !== "phrase") || !node.value)
31
+ throw new Error("History supports text and phrase values");
32
+ let value = node.value;
33
+ if (field === "after" || field === "before") {
34
+ const date = /^\d{4}-\d{2}-\d{2}$/.test(value)
35
+ ? `${value}T00:00:00Z`
36
+ : value;
37
+ const millis = Date.parse(date);
38
+ if (!Number.isSafeInteger(millis))
39
+ throw new Error("Use an ISO date for history date filters");
40
+ // A date-only 'before' includes the entire specified UTC day.
41
+ value = String(millis +
42
+ (field === "before" && /^\d{4}-\d{2}-\d{2}$/.test(node.value)
43
+ ? 86_399_999
44
+ : 0));
45
+ }
46
+ return { type: "term", field, value };
47
+ }
48
+ default:
49
+ throw new Error("This query predicate is unavailable for history");
50
+ }
51
+ }
52
+ export function historyTerms(node) {
53
+ if (!node)
54
+ return [];
55
+ switch (node.type) {
56
+ case "literal":
57
+ return node.value && ["word", "phrase"].includes(node.kind)
58
+ ? [node.value]
59
+ : [];
60
+ case "group":
61
+ return historyTerms(node.expression);
62
+ case "and":
63
+ case "or":
64
+ return node.clauses.flatMap(historyTerms);
65
+ case "field":
66
+ return ["content", "file", "path"].includes(node.name)
67
+ ? historyTerms(node.value)
68
+ : [];
69
+ default:
70
+ return [];
71
+ }
72
+ }
73
+ export function historyRanges(text, terms) {
74
+ const ranges = [];
75
+ for (const term of terms) {
76
+ const haystack = text.toLowerCase(), needle = term.toLowerCase();
77
+ if (!needle)
78
+ continue;
79
+ let start = haystack.indexOf(needle);
80
+ while (start >= 0 && ranges.length < 100) {
81
+ ranges.push({ start, end: start + needle.length });
82
+ start = haystack.indexOf(needle, start + needle.length);
83
+ }
84
+ }
85
+ return ranges.sort((a, b) => a.start - b.start);
86
+ }
@@ -0,0 +1,5 @@
1
+ import type { Handle, LocalCodeSnapshot } from "@lapismd/jj-history";
2
+ import type { HistoryReader } from "./history-reader.js";
3
+ export declare function check(condition: unknown): asserts condition;
4
+ export declare function pause(signal: AbortSignal): Promise<void>;
5
+ export declare function prepared(reader: HistoryReader, handle: Handle, signal: AbortSignal, wait?: typeof pause): Promise<LocalCodeSnapshot>;
@@ -0,0 +1,32 @@
1
+ export function check(condition) {
2
+ if (!condition)
3
+ throw new Error("Repository history returned a different selection");
4
+ }
5
+ export function pause(signal) {
6
+ if (signal.aborted)
7
+ return Promise.reject(signal.reason);
8
+ return new Promise((resolve, reject) => {
9
+ const cancel = () => {
10
+ clearTimeout(timer);
11
+ reject(signal.reason);
12
+ };
13
+ const timer = setTimeout(() => {
14
+ signal.removeEventListener("abort", cancel);
15
+ resolve();
16
+ }, 50);
17
+ signal.addEventListener("abort", cancel, { once: true });
18
+ });
19
+ }
20
+ export async function prepared(reader, handle, signal, wait = pause) {
21
+ for (let attempt = 0; attempt < 100; attempt++) {
22
+ signal.throwIfAborted();
23
+ const status = await reader.status(handle);
24
+ signal.throwIfAborted();
25
+ if (status.state === "ready")
26
+ return status.data;
27
+ if (status.state === "failed")
28
+ throw new Error("Repository history preparation failed");
29
+ await wait(signal);
30
+ }
31
+ throw new Error("Repository history preparation did not finish in time");
32
+ }
@@ -0,0 +1,10 @@
1
+ export type HistorySource = "backup" | "original";
2
+ export declare function historySource(state: Record<string, unknown>): HistorySource;
3
+ export interface HistorySourcePicker {
4
+ selected: HistorySource;
5
+ load(): Promise<{
6
+ original: boolean;
7
+ }>;
8
+ select(source: HistorySource): void;
9
+ report(error: unknown): void;
10
+ }
@@ -0,0 +1,7 @@
1
+ export function historySource(state) {
2
+ if (state.source === undefined || state.source === "backup")
3
+ return "backup";
4
+ if (state.source === "original")
5
+ return "original";
6
+ throw new Error("Invalid repository history source");
7
+ }
@@ -0,0 +1,34 @@
1
+ import type { LocalConflictDescriptor, LocalCodeSnapshot, LocalGraphCommit, LocalCodeObjectKey, LocalFileDiffChange } from "@lapismd/jj-history";
2
+ export interface HistoryState {
3
+ phase: "idle" | "loading" | "ready" | "unavailable";
4
+ busy: boolean;
5
+ workspace: string | null;
6
+ conflicts: LocalConflictDescriptor[];
7
+ conflictsReady: boolean;
8
+ heads: string[];
9
+ headsReady: boolean;
10
+ operation?: string;
11
+ snapshot?: LocalCodeSnapshot;
12
+ commits: LocalGraphCommit[];
13
+ commitsReady: boolean;
14
+ next?: LocalCodeObjectKey | null;
15
+ revision?: LocalGraphCommit;
16
+ base?: string;
17
+ parentCommits: LocalGraphCommit[];
18
+ paths: LocalFileDiffChange[];
19
+ pathsReady: boolean;
20
+ nextPath?: string | null;
21
+ path?: string;
22
+ diff?: LocalFileDiffChange;
23
+ }
24
+ export declare const initialHistoryState: () => HistoryState;
25
+ export declare function revisionLabel(commit: LocalGraphCommit): string;
26
+ export declare function timestampLabel(millis: number | bigint): string;
27
+ export declare function diffText(change: LocalFileDiffChange): {
28
+ oldText: string;
29
+ newText: string;
30
+ } | {
31
+ unavailable: string;
32
+ };
33
+ /** Clears the selected revision and every dependent comparison value. */
34
+ export declare function resetHistoryComparison(): Partial<HistoryState>;
@@ -0,0 +1,55 @@
1
+ export const initialHistoryState = () => ({
2
+ phase: "idle",
3
+ busy: false,
4
+ workspace: null,
5
+ conflicts: [],
6
+ conflictsReady: false,
7
+ heads: [],
8
+ headsReady: false,
9
+ commits: [],
10
+ commitsReady: false,
11
+ parentCommits: [],
12
+ paths: [],
13
+ pathsReady: false,
14
+ operation: undefined,
15
+ snapshot: undefined,
16
+ next: undefined,
17
+ revision: undefined,
18
+ base: undefined,
19
+ nextPath: undefined,
20
+ path: undefined,
21
+ diff: undefined,
22
+ });
23
+ export function revisionLabel(commit) {
24
+ return commit.description.split("\n")[0] || "No description";
25
+ }
26
+ export function timestampLabel(millis) {
27
+ const value = BigInt(millis);
28
+ return value >= -8640000000000000n && value <= 8640000000000000n
29
+ ? new Date(Number(value)).toLocaleString()
30
+ : `${value} milliseconds since epoch`;
31
+ }
32
+ export function diffText(change) {
33
+ if (change.content.status === "unavailable")
34
+ return { unavailable: change.content.reason.replaceAll("_", " ") };
35
+ const oldText = change.content.hunks.map((hunk) => hunk.before).join("");
36
+ const newText = change.content.hunks.map((hunk) => hunk.after).join("");
37
+ if (new TextEncoder().encode(oldText + newText).length > 1024 * 1024)
38
+ return { unavailable: "The text exceeds the preview limit" };
39
+ return { oldText, newText };
40
+ }
41
+ /** Clears the selected revision and every dependent comparison value. */
42
+ export function resetHistoryComparison() {
43
+ return {
44
+ conflicts: [],
45
+ conflictsReady: false,
46
+ revision: undefined,
47
+ parentCommits: [],
48
+ base: undefined,
49
+ paths: [],
50
+ pathsReady: false,
51
+ nextPath: null,
52
+ path: undefined,
53
+ diff: undefined,
54
+ };
55
+ }
@@ -0,0 +1,4 @@
1
+ import type { HistoryIndexStatus, IndexedHistoryPage, HistoryMatchContext } from "./indexed-search.js";
2
+ export declare function indexStatus(value: unknown): HistoryIndexStatus;
3
+ export declare function indexedPage(value: unknown): IndexedHistoryPage;
4
+ export declare function matchContext(value: unknown): HistoryMatchContext;
@@ -0,0 +1,64 @@
1
+ import { searchPage } from "./search-page.js";
2
+ const object = (value) => !!value && typeof value === "object";
3
+ const count = (value) => Number.isSafeInteger(value) && Number(value) >= 0;
4
+ const commit = (value) => typeof value === "string" && /^[0-9a-f]{40}$/.test(value);
5
+ export function indexStatus(value) {
6
+ if (!object(value) ||
7
+ !count(value.generation) ||
8
+ !count(value.indexed) ||
9
+ !count(value.omitted) ||
10
+ typeof value.complete !== "boolean")
11
+ throw new Error("Invalid history index status");
12
+ return value;
13
+ }
14
+ export function indexedPage(value) {
15
+ if (!object(value) ||
16
+ !Array.isArray(value.hits) ||
17
+ value.hits.length > 100 ||
18
+ typeof value.reset !== "boolean" ||
19
+ (value.next != null &&
20
+ (typeof value.next !== "string" || value.next.length > 512)))
21
+ throw new Error("Invalid indexed history response");
22
+ indexStatus(value.status);
23
+ for (const hit of value.hits) {
24
+ if (!object(hit) || !object(hit.record))
25
+ throw new Error("Invalid indexed history hit");
26
+ const record = hit.record;
27
+ searchPage({
28
+ hits: [
29
+ {
30
+ revision: record.revision,
31
+ path: record.path,
32
+ excerpt: hit.excerpt,
33
+ line: hit.line,
34
+ },
35
+ ],
36
+ checkpoints: 0,
37
+ unindexed: 0,
38
+ });
39
+ if (!Array.isArray(record.parents) ||
40
+ record.parents.length > 1024 ||
41
+ !record.parents.every(commit) ||
42
+ typeof record.deleted !== "boolean" ||
43
+ typeof record.unavailable !== "boolean" ||
44
+ (record.previous != null && !commit(record.previous)) ||
45
+ (record.content_id != null &&
46
+ (typeof record.content_id !== "string" ||
47
+ !/^[0-9a-f]{40,128}$/.test(record.content_id))) ||
48
+ (hit.line != null && (!count(hit.line) || Number(hit.line) < 1)))
49
+ throw new Error("Invalid indexed version reference");
50
+ }
51
+ return value;
52
+ }
53
+ export function matchContext(value) {
54
+ if (!object(value) ||
55
+ typeof value.text !== "string" ||
56
+ value.text.length > 32768 ||
57
+ !count(value.start) ||
58
+ !count(value.end) ||
59
+ Number(value.end) < Number(value.start) ||
60
+ typeof value.before !== "boolean" ||
61
+ typeof value.after !== "boolean")
62
+ throw new Error("Invalid saved match context");
63
+ return value;
64
+ }
@@ -0,0 +1,11 @@
1
+ import type { HistoryIndexCommand, HistoryIndexQuery, HistoryIndexProgress, HistoryIndexPage, HistoryIndexContext } from "@lapis-notes/api/native-history-index";
2
+ export type { HistoryExpression, HistoryIndexProgress as HistoryIndexStatus, HistoryIndexHit as IndexedHistoryHit, HistoryIndexPage as IndexedHistoryPage, HistoryIndexContext as HistoryMatchContext, } from "@lapis-notes/api/native-history-index";
3
+ /** Native owners schedule all indexing; renderers observe and query saved data. */
4
+ export interface IndexedHistoryService {
5
+ start(): Promise<HistoryIndexProgress>;
6
+ status(): Promise<HistoryIndexProgress>;
7
+ query(request: HistoryIndexQuery): Promise<HistoryIndexPage>;
8
+ context(request: Omit<Extract<HistoryIndexCommand, {
9
+ kind: "context";
10
+ }>, "kind">): Promise<HistoryIndexContext>;
11
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ /** jj-store log/diff column geometry. The public root owns pane-responsive mode. */
2
+ export declare function createLogCanvas(): import("@lapismd/design-core/shadcn/column-canvas").ColumnCanvasController;
@@ -0,0 +1,25 @@
1
+ import { createColumnCanvasController } from "@lapismd/design-core/shadcn/column-canvas";
2
+ /** jj-store log/diff column geometry. The public root owns pane-responsive mode. */
3
+ export function createLogCanvas() {
4
+ return createColumnCanvasController({
5
+ columns: {
6
+ revisions: {
7
+ defaultWidth: 480,
8
+ minWidth: 360,
9
+ maxWidth: 720,
10
+ collapsible: true,
11
+ resizable: true,
12
+ },
13
+ diff: {
14
+ defaultWidth: 560,
15
+ minWidth: 360,
16
+ maxWidth: 980,
17
+ pathLevel: 1,
18
+ closeable: true,
19
+ closed: true,
20
+ openOnSelect: false,
21
+ resizable: true,
22
+ },
23
+ },
24
+ });
25
+ }
@@ -0,0 +1,4 @@
1
+ import type { NativeHistoryIndex } from "@lapis-notes/api/native-history-index";
2
+ import type { IndexedHistoryService } from "./indexed-search.js";
3
+ /** Hosts retain admission and lifetime; this adapter never steps or stops work. */
4
+ export declare function nativeIndexedHistory(port: NativeHistoryIndex): IndexedHistoryService;
@@ -0,0 +1,10 @@
1
+ import { indexStatus, indexedPage, matchContext, } from "./indexed-search-validation.js";
2
+ /** Hosts retain admission and lifetime; this adapter never steps or stops work. */
3
+ export function nativeIndexedHistory(port) {
4
+ return {
5
+ start: async () => indexStatus(await port.call({ kind: "start" })),
6
+ status: async () => indexStatus(await port.call({ kind: "status" })),
7
+ query: async (search) => indexedPage(await port.call({ kind: "query", search })),
8
+ context: async (request) => matchContext(await port.call({ kind: "context", ...request })),
9
+ };
10
+ }
@@ -0,0 +1,3 @@
1
+ import type { HistoryController } from "./history-controller.js";
2
+ /** Exact native commit reads can open retained search results beyond graph paging. */
3
+ export declare function openHistoryRevision(controller: HistoryController, id: string): Promise<void>;
@@ -0,0 +1,8 @@
1
+ /** Exact native commit reads can open retained search results beyond graph paging. */
2
+ export async function openHistoryRevision(controller, id) {
3
+ const commit = controller.state.commits.find((item) => item.id === id);
4
+ if (commit)
5
+ await controller.selectRevision(commit);
6
+ else
7
+ await controller.openRevision(id);
8
+ }
@@ -0,0 +1,2 @@
1
+ /** Display-only normalization of JJ's recorded transaction argument format. */
2
+ export declare function operationCommandLabel(recorded: string): string;
@@ -0,0 +1,55 @@
1
+ /** Display-only normalization of JJ's recorded transaction argument format. */
2
+ export function operationCommandLabel(recorded) {
3
+ if (recorded.length > 65_536 || /[\r\n\t]/u.test(recorded))
4
+ return recorded;
5
+ const words = [];
6
+ let i = 0;
7
+ while (i < recorded.length) {
8
+ while (recorded[i] === " ")
9
+ i++;
10
+ if (i === recorded.length)
11
+ break;
12
+ let word = "";
13
+ if (recorded[i] === "'") {
14
+ i++;
15
+ let closed = false;
16
+ while (i < recorded.length) {
17
+ if (recorded[i] === "\\" && recorded[i + 1] === "'") {
18
+ word += "'";
19
+ i += 2;
20
+ }
21
+ else if (recorded[i] === "'") {
22
+ i++;
23
+ closed = true;
24
+ break;
25
+ }
26
+ else
27
+ word += recorded[i++];
28
+ }
29
+ if (!closed || (i < recorded.length && recorded[i] !== " "))
30
+ return recorded;
31
+ }
32
+ else {
33
+ const start = i;
34
+ while (i < recorded.length && recorded[i] !== " ")
35
+ i++;
36
+ word = recorded.slice(start, i);
37
+ if (!/^[A-Za-z0-9,./:@_-]+$/u.test(word))
38
+ return recorded;
39
+ }
40
+ words.push(word);
41
+ }
42
+ if (words[0] !== "jj")
43
+ return recorded;
44
+ return words
45
+ .map((word) => {
46
+ if (/^[A-Za-z0-9,./:@_-]+$/u.test(word))
47
+ return word;
48
+ if (!word.includes("'"))
49
+ return `'${word}'`;
50
+ if (!/["$`\\]/u.test(word))
51
+ return `"${word}"`;
52
+ return `'${word.replaceAll("'", "'\\''")}'`;
53
+ })
54
+ .join(" ");
55
+ }