Compare commits

...

367 Commits

Author SHA1 Message Date
vorotamoroz 1e7c1db1c4 fix generated type path 2026-06-11 09:37:20 +01:00
vorotamoroz 8df9a1b53b fix paths 2026-06-11 07:57:04 +01:00
vorotamoroz 32c9f76c93 add type defs for community automatic review 2026-06-11 06:14:58 +01:00
vorotamoroz 7e65e5dc68 fix imports 2026-06-11 06:12:39 +01:00
vorotamoroz c03fa5213f fix imports 2026-06-11 04:28:07 +01:00
vorotamoroz 3b538a143a fix tool 2026-06-11 04:20:26 +01:00
vorotamoroz 3c6ec75c00 fix imports 2026-06-11 04:09:43 +01:00
vorotamoroz 27e9b68510 (chore): Resolving circular references 2026-06-10 11:45:41 +01:00
vorotamoroz e4b36602ec (chore): split utils 2026-06-10 11:22:34 +01:00
vorotamoroz 36827d4799 update submodule 2026-06-10 10:38:59 +01:00
vorotamoroz f596e7dd68 (chore): fix import paths 2026-06-10 10:33:41 +01:00
vorotamoroz b0ac01e52f append exclude 2026-06-10 10:31:40 +01:00
vorotamoroz b4077bd1f5 (chore): add utility for refactoring 2026-06-10 10:29:56 +01:00
vorotamoroz 675de883e9 (chore): fix import paths 2026-06-10 09:40:55 +01:00
vorotamoroz 4b8de7c915 Add importAlias 2026-06-10 09:40:43 +01:00
vorotamoroz 4f8a74107c remove unnecessary package 2026-06-09 08:11:05 +01:00
vorotamoroz 42ed0d8795 update dir notation 2026-06-09 07:25:41 +01:00
vorotamoroz 54c2b1c6db reduce no-explicit-any 2026-06-09 05:59:02 +01:00
vorotamoroz 0856693aac Add instruction 2026-06-09 02:26:07 +01:00
vorotamoroz 39d78a04ac Enhance remote database management and add --vault option
Added new commands for remote database management and introduced --vault option for daemon and mirror commands.
2026-06-08 21:12:42 +09:00
vorotamoroz 0b8d73ccd8 Merge pull request #948 from vrtmrz/adjust_overwrite_prevention
Adjust overwrite prevention
2026-06-08 19:57:20 +09:00
vorotamoroz 5921a71227 Add CI 2026-06-08 10:52:00 +00:00
vorotamoroz a40929c9e4 fixed: enhance conflict handling by adding settings check for document writes 2026-06-08 10:47:34 +00:00
vorotamoroz 2d8a285201 Port new tests 2026-06-08 10:38:54 +00:00
vorotamoroz d9903bfe9e Merge pull request #947 from vrtmrz/0_25_74
Release: 0.25.74
2026-06-08 19:29:33 +09:00
vorotamoroz a6e7dddf7f Merge branch '0_25_74' into cli_test_deno 2026-06-08 11:29:06 +01:00
vorotamoroz 9a51c78011 tweak specificity 2026-06-08 11:18:35 +01:00
vorotamoroz 7b9c0b011f bump 2026-06-08 11:15:13 +01:00
vorotamoroz 26a050e6f6 Merge pull request #946 from vrtmrz/cli_vaultpath
feat:  decouple the database and vault directories
2026-06-08 19:12:11 +09:00
vorotamoroz 34162f747c fix corrupted test, update submodule 2026-06-08 11:10:37 +01:00
vorotamoroz 9e87ee4da1 Merge branch 'main' into cli_vaultpath 2026-06-08 19:07:02 +09:00
vorotamoroz ba5d4c434b Merge pull request #945 from vrtmrz/fix_941
fixed: ignore hidden files completely if hidden file sync disabled
2026-06-08 18:57:09 +09:00
vorotamoroz 8f44f4c61d Merge remote-tracking branch 'origin/main' into fix_941 2026-06-08 10:55:47 +01:00
vorotamoroz 23d8a1ecc3 update submodule 2026-06-08 10:51:08 +01:00
vorotamoroz a46abcad52 Merge branch 'main' into fix_941 2026-06-08 10:50:34 +01:00
vorotamoroz 347e1fcee5 Merge pull request #944 from vrtmrz/fix_911
fixed: fix automatic merging behaviour
2026-06-08 18:47:29 +09:00
vorotamoroz d85d8bc5e4 Merge branch 'main' into fix_911 2026-06-08 18:45:35 +09:00
vorotamoroz c493fb6f66 Merge pull request #942 from vrtmrz/feat_cli_database_commands
feat: Added new remote management commands
2026-06-08 18:44:32 +09:00
vorotamoroz cf173caf88 feat: decouple the database and vault directories 2026-06-08 10:43:10 +01:00
vorotamoroz a41c7b2f70 Merge pull request #928 from starskyzheng/feat/cli-daemon-vault-option
feat(cli): add --vault option for daemon and mirror commands
2026-06-08 18:03:25 +09:00
vorotamoroz 3acaa7f269 update readme 2026-06-08 09:26:43 +01:00
vorotamoroz 85787eddb3 fixed: ignore hidden files completely if hidden file sync disabled 2026-06-08 09:24:59 +01:00
vorotamoroz 8cbb233df7 fixed: fix automatic merging behaviour 2026-06-08 09:04:12 +01:00
vorotamoroz 5922186a0e feat: Added new remote management commands 2026-06-08 04:23:22 +00:00
vorotamoroz 60f21eb9d2 detect loopback and coturn option 2026-06-05 09:44:17 +01:00
vorotamoroz 6b7816d334 add coturn for test 2026-06-05 09:39:39 +01:00
vorotamoroz 369e62ee8d Improved: we can set empty for turnServer explicitly. 2026-06-05 09:27:19 +01:00
vorotamoroz 37593bbee6 Update CI to use deno 2026-06-05 09:07:38 +01:00
vorotamoroz baa51a66a7 Merge branch 'main' into cli_test_deno 2026-06-05 08:34:31 +01:00
郑泽宇 be979a3bf1 fix(cli): respect mirror positional arg before --vault flag
Per vrtmrz's review feedback, restore the mirror [vault-path] positional
argument support with correct priority order:
  mirror positional arg > --vault flag > databasePath

Also update --vault help text and CLI README with the new option.
2026-06-05 11:50:23 +08:00
vorotamoroz 31050c9cb8 update docs 2026-06-05 03:05:13 +09:00
vorotamoroz 1b44ab9f2b docs: update documentation 2026-06-05 01:57:03 +09:00
vorotamoroz 3a78c70539 (chore) update terms 2026-06-05 01:24:46 +09:00
vorotamoroz 0f08ad435f (chore): improve English 2026-06-05 01:08:54 +09:00
vorotamoroz 96abd930b3 Merge pull request #938 from vrtmrz/0_25_73
Release 0.25.73
2026-06-04 18:50:11 +09:00
vorotamoroz 4581db45c4 bump 2026-06-04 10:44:56 +01:00
vorotamoroz 05cab8ec66 Merge pull request #937 from vrtmrz/fix_926
fix: adjust CouchDB's database name checking to its specification
2026-06-04 18:39:38 +09:00
vorotamoroz b005625ef3 Merge branch 'main' into fix_926 2026-06-04 18:38:26 +09:00
vorotamoroz e5408b4dd7 Merge pull request #936 from vrtmrz/fix_path_handling_on_windows_cli
Fix: No longer path corruption on windows environment
2026-06-04 18:37:47 +09:00
vorotamoroz 95a9b1b41c Merge pull request #935 from vrtmrz/fix_first_fetch2
fixed: `Reset Syncronisation on This Device` for minio and P2P
2026-06-04 18:37:23 +09:00
vorotamoroz 2aa8bc1165 fix: adjust CouchDB's database name checking to its specification (#926). 2026-06-04 10:35:15 +01:00
vorotamoroz f8998d5441 (fixed): No longer path corruption on windows environment (at least, pass the check) on CLI 2026-06-04 10:17:34 +01:00
vorotamoroz 26f5f54f24 fixed: Reset Syncronisation on This Device for minio and P2P is now working properly. 2026-06-04 09:40:27 +01:00
vorotamoroz 99f3aca024 Merge pull request #933 from vrtmrz/0_25_71
0 25 72
2026-06-03 20:22:29 +09:00
vorotamoroz 194397dd94 bump again 2026-06-03 12:12:21 +01:00
vorotamoroz afa79d78dc bump 2026-06-03 11:18:25 +01:00
vorotamoroz 9a9440a768 Merge branch 'improve_first_fetch' into 0_25_71 2026-06-03 11:03:46 +01:00
vorotamoroz e375860af8 fix importing issue and unit test issue 2026-06-03 06:58:19 +01:00
vorotamoroz b57f34c15b Revise devs note 2026-06-03 01:13:50 +00:00
vorotamoroz b82fd9f04b Revise redflag.md option descriptions
Updated descriptions for redflag options in troubleshooting documentation.
2026-06-02 21:14:42 +09:00
vorotamoroz bb77426b7b update dependencies and bump 2026-06-02 12:50:46 +01:00
vorotamoroz 1bef5fbef3 Merge branch 'fix_warns' into improve_first_fetch 2026-06-02 12:36:32 +01:00
vorotamoroz 7d2ba1b0b9 ### Improved
- Database fetching (a.k.a. Reset Synchronisation on This Device) on the initialisation now supports streaming and is faster (CouchDB only)
- The database fetching process has been streamlined, and database operations are now suspended until it has been completed
- The initial synchronisation process has been simplified, making it easier to synchronise files with the remote server
- We can select the remote database to fetch from during the initialisation, when there are multiple remote databases configured (e.g. multiple CouchDBs or S3 remotes)
2026-06-02 12:34:46 +01:00
vorotamoroz ac6b9a4dad fix bad English 2026-06-01 12:13:01 +01:00
vorotamoroz 225e2c5096 bump 2026-06-01 12:10:56 +01:00
vorotamoroz 674d68b7d9 Fixed:
-  No longer the status element breaks other plugins' interaction (#930).
2026-06-01 12:05:31 +01:00
vorotamoroz 0e6dd300ef Merge branch 'fix_warns' into improve_first_fetch 2026-06-01 11:22:01 +01:00
vorotamoroz 8171db353a bump 2026-06-01 11:19:42 +01:00
vorotamoroz 6ab1556880 prettify 2026-06-01 11:19:32 +01:00
vorotamoroz cd2bff5fc7 Refactor types in svelte components. 2026-06-01 11:18:23 +01:00
vorotamoroz 5a280c7919 (feat): Bulk database fetching is now work in progress. This feature is expected to speed up rebuilds and setups. (WIP) 2026-06-01 10:41:48 +01:00
vorotamoroz c6697327d5 Fixed typings
Fixed wrong typing for serviceHub, svelte dialog
2026-06-01 06:20:33 +01:00
vorotamoroz 7c203a522a Aligned to eslint rules and fixed following things:
This commit may contains behavioural changes.

- Fix for the issue with corrupted log displays
- Wrap the activeDocument
- Reduced potential type errors and strengthened certain checks
- Made error handling more robust (by rewriting the error class)
2026-06-01 05:28:03 +01:00
vorotamoroz c80c294d93 satisfies
Address following rules
-
- @typescript-eslint/unbound-method
- obsidianmd/prefer-active-doc
- obsidianmd/prefer-window-timer

Improve typing
2026-06-01 04:20:47 +01:00
vorotamoroz 3e65ae932d Address following rules
- @typescript-eslint/no-redundant-type-constituents
2026-06-01 03:50:51 +01:00
vorotamoroz f710f03380 Address following rules
- @typescript-eslint/no-redundant-type-constituents
- @typescript-eslint/no-unnecessary-type-assertion
2026-06-01 03:37:55 +01:00
vorotamoroz b887269fc1 change eslint for more progressive 2026-06-01 02:37:07 +01:00
vorotamoroz 56a234e6d7 chore: wrap timer functions 2026-05-31 19:03:43 +09:00
vorotamoroz 39014b2294 use coreEnvVars for some vars 2026-05-30 23:59:36 +09:00
vorotamoroz 24e6c110a3 Remove unused imports 2026-05-30 23:53:19 +09:00
vorotamoroz f24d110552 Change type assertion 2026-05-30 23:49:32 +09:00
vorotamoroz 7189c1c05a Update dependency
set no-deprecated to warn
2026-05-30 23:42:32 +09:00
vorotamoroz 547afe9a86 remove unused eslint comment
use _fetch instead of fetch
add ignore list
2026-05-30 23:32:46 +09:00
vorotamoroz 7b5876037d Add ignores 2026-05-30 23:22:17 +09:00
vorotamoroz b714c00644 (chore): Improve type assertion, remove unused imports 2026-05-29 04:19:58 +01:00
郑泽宇 fff6df535f feat(cli): add --vault option for daemon and mirror commands
Allow specifying a separate vault directory for .md files, decoupled from
the database directory (where PouchDB data lives).

- Add --vault/-V flag to CLI options parser
- Use vaultPath (or fallback to databasePath) for file system operations
- Works with both daemon and mirror commands
- Log vault path alongside database path at startup
2026-05-28 16:44:34 +08:00
vorotamoroz e14e771bfb (chore): tidied tsconfig and eslint, and some incorrect imports 2026-05-28 04:42:03 +01:00
vorotamoroz 1130bbcee8 remove unmaintained tests 2026-05-26 11:33:14 +01:00
vorotamoroz 8841ef4619 fix css duplicated props 2026-05-26 11:27:31 +01:00
vorotamoroz 45fe0b3682 chore: lint: enable cache and concurrency 2026-05-26 11:24:41 +01:00
vorotamoroz 8d3825abc9 Merge pull request #925 from vrtmrz/v0_25_70
Releasing v0.25.70
2026-05-25 18:38:04 +09:00
vorotamoroz c5f9841b85 chore: fix grammatical error 2026-05-25 10:14:18 +01:00
vorotamoroz d36d176d99 bump 2026-05-25 10:10:46 +01:00
vorotamoroz 38b2cf73ed Update lib (forgot to include #942) 2026-05-25 09:55:11 +01:00
vorotamoroz 40b15a6950 Merge pull request #924 from vrtmrz/p2p_add_fix_and_diag
Improvements: More diagnostic information for P2P connections
2026-05-25 17:52:37 +09:00
vorotamoroz e312bb7640 Merge pull request #891 from SeleiXi/feat/conflict-diff-jump
feat: add diff navigation to conflict resolver
2026-05-25 17:51:49 +09:00
Ching Wing Kwok 852c0e6c13 Merge branch 'main' into feat/conflict-diff-jump 2026-05-25 15:38:21 +08:00
vorotamoroz 7c1bcf9e9b Merge pull request #889 from SeleiXi/diff-only-button
feat: add diff-only view button to document history
2026-05-25 14:00:11 +09:00
vorotamoroz 2b79bed085 Merge branch 'main' into pr/SeleiXi/889 2026-05-25 05:43:36 +01:00
vorotamoroz 6b1e0c4aa8 Merge pull request #890 from SeleiXi/feat/history-search
feat: Add document history search
2026-05-25 12:55:29 +09:00
vorotamoroz 3c3645eba4 Improved: More diagnostic information for P2P connections is now shown, including why a connection failure occurred and the current connection status. 2026-05-25 04:31:22 +01:00
SeleiXi 009cc3c87a Merge remote-tracking branch 'origin/main' into feat/conflict-diff-jump
# Conflicts:
#	src/modules/features/InteractiveConflictResolving/ConflictResolveModal.ts
2026-05-23 02:06:52 +08:00
SeleiXi fc5fd4be94 Merge remote-tracking branch 'origin/main' into feat/history-search
# Conflicts:
#	src/lib
#	src/modules/features/DocumentHistory/DocumentHistoryModal.ts
2026-05-23 02:05:33 +08:00
SeleiXi 8ed1acf79d Merge remote-tracking branch 'origin/main' into diff-only-button
# Conflicts:
#	src/modules/features/DocumentHistory/DocumentHistoryModal.ts
2026-05-23 02:04:48 +08:00
vorotamoroz c518223d21 Merge pull request #923 from vrtmrz/p2p_add_fix_and_diag
0.25.69: Fix P2P, add diag feature
2026-05-23 00:47:36 +09:00
vorotamoroz caaff618e9 fix grammar 2026-05-22 16:40:40 +01:00
vorotamoroz 148aa8505e bump 2026-05-22 16:38:44 +01:00
vorotamoroz f9a626a858 ### Fixed
- No longer the P2P passphrase mismatch causes a server shutdown.
- Settings related to P2P synchronisation are now correctly applied on start-up and no longer reverted.

### New features
- Diagnostic P2P connection stats are now available.
  - These stats indicate the number of connection trials, successes, and, failures.
2026-05-22 16:37:05 +01:00
vorotamoroz 2f10121d6c Merge remote-tracking branch 'origin/main' into cli_test_deno 2026-05-22 10:19:30 +00:00
vorotamoroz 1b8747115c Merge pull request #922 from vrtmrz/update_trystero
Releasing v0.25.68 (dependency and P2P update)
2026-05-22 19:17:22 +09:00
vorotamoroz e739302fb9 bump 2026-05-22 11:11:18 +01:00
vorotamoroz 8f20d53f55 Update trystero, typed well. fixed some potentially problems
Weaken terser for libraries
2026-05-22 11:01:51 +01:00
vorotamoroz 3ab80190d6 test fix ci (Redundant test) 2026-05-22 03:48:41 +00:00
vorotamoroz 8948bf2803 test cli:p2p use nonce for peername 2026-05-22 03:48:02 +00:00
vorotamoroz 486fd15c60 fix resouce handling 2026-05-22 03:46:56 +00:00
vorotamoroz 5fd85c71ca test: chore: prettify 2026-05-22 03:20:28 +00:00
vorotamoroz c1f41910c4 test: add actions / caching 2026-05-22 03:20:11 +00:00
vorotamoroz 3693d6a6b6 test: add port ready, container cleanup 2026-05-22 03:19:48 +00:00
vorotamoroz cc3c992b1d cli: add large-file-test and benchmark between couchdb and p2p 2026-05-22 03:05:44 +00:00
vorotamoroz df390ac456 test: fix deno test helpers 2026-05-22 03:02:11 +00:00
vorotamoroz fd84b0377b Update actions 2026-05-21 10:02:46 +01:00
vorotamoroz 340d416b76 Merge pull request #920 from vrtmrz/v0_25_66
Release v0.25.67
2026-05-20 19:44:41 +09:00
vorotamoroz 3034af8d69 bump again 2026-05-20 11:37:51 +01:00
vorotamoroz da3020bd45 fixed: fix auto-correction mismatch 2026-05-20 11:34:28 +01:00
vorotamoroz ce232c1002 bump 2026-05-20 11:14:41 +01:00
vorotamoroz 0e13926400 fixed: update lib
I should do this with #919
2026-05-20 11:10:43 +01:00
vorotamoroz fab7ec996a Merge pull request #919 from vrtmrz:feat_cli_remote_select
feat: add CLI commands to handle multiple remote configuration
2026-05-20 19:05:49 +09:00
vorotamoroz 88e22f99c5 Merge pull request #917 from vrtmrz:feat_tweak_auto_adjust
feat: implement auto-accept compatible tweak
2026-05-20 19:02:58 +09:00
vorotamoroz 83cbabf06f Merge branch 'main' into feat_tweak_auto_adjust 2026-05-20 11:01:51 +01:00
vorotamoroz 5e8d3b8f02 Update lib 2026-05-20 11:00:38 +01:00
vorotamoroz 1167b41340 feat: add CLI commands to handle multiple remote configuration 2026-05-20 05:10:42 +01:00
vorotamoroz 67da3964e5 Merge pull request #918 from vrtmrz/v0_25_65
V0.25.65
2026-05-19 20:27:34 +09:00
vorotamoroz 45ebc7eb6b Update the doc and issue report, and bump 2026-05-19 12:17:26 +01:00
vorotamoroz cc5ead68bc minor layout fix 2026-05-19 11:59:54 +01:00
vorotamoroz 9b9e4f22f3 Merge pull request #916 from vrtmrz:fix_866
fixed: Now Chunk Splitter: `V3: Fine Deduplication`
2026-05-19 19:46:08 +09:00
vorotamoroz 7823f46053 Merge branch 'main' into fix_866 2026-05-19 11:45:41 +01:00
vorotamoroz d6d8e548b3 Merge pull request #915 from vrtmrz/improve_log_feature
Improve log features
2026-05-19 19:40:28 +09:00
vorotamoroz 44b1ed7610 Merge branch 'main' into improve_log_feature 2026-05-19 11:40:14 +01:00
vorotamoroz 5786da5534 merged 2026-05-19 11:38:05 +01:00
vorotamoroz 042a80dd44 Merge pull request #914 from vrtmrz/fix_ios_resume
fix: Fix an issue about resuming from background on iOS (#888).
2026-05-19 19:34:49 +09:00
vorotamoroz ee30f6cd6d fixed: Now Chunk Splitter: V3: Fine Deduplication is working fine again (#866). 2026-05-19 11:26:35 +01:00
vorotamoroz 977a300808 fix grammatical error 2026-05-19 04:10:39 +01:00
vorotamoroz a392ccab6a - Improved an error verbosity on concurrent processing on start-up process.
- Now the `report` includes recent logs (of verbosity `verbose` even settings is not set to `verbose`).
- Updating logs is now debounced to avoid excessive updates during rapid log generation.
- Added a `Generate full report for opening the issue with debug info` command to the command palette, which generates a report without opening the settings dialogue.
2026-05-19 04:09:04 +01:00
vorotamoroz dfdfa5383b grammatical fix 2026-05-19 01:55:10 +01:00
vorotamoroz a08294ab16 fix: Fix an issue about resuming from background on iOS (#888). 2026-05-18 12:30:03 +01:00
vorotamoroz e8c33a0d6a feat: implement auto-accept compatible tweak setting and enhance mismatch resolution logic 2026-05-18 11:21:53 +01:00
vorotamoroz d6bf453a6d Merge branch 'main' of https://github.com/vrtmrz/obsidian-livesync 2026-05-18 11:07:43 +01:00
vorotamoroz e80cdc2dae remove unused files 2026-05-18 08:47:03 +01:00
vorotamoroz 60780678fd Merge pull request #903 from Joysimple/cli-docker
bugfix: Add package-lock.json into docker build
2026-05-18 12:38:12 +09:00
vorotamoroz 273e7a2b63 Merge pull request #909 from vrtmrz/p2p_config_selectable
P2p config selectable (a.k.a. v0.25.64)
2026-05-17 13:24:40 +09:00
vorotamoroz 2572c54744 Track main 2026-05-17 13:17:09 +09:00
vorotamoroz 6a7c987985 bump 2026-05-17 13:13:21 +09:00
vorotamoroz 6ef866a77c P2P: Enhance status pane and card with active remote selection and replication features
- Added active P2P remote selector and creation option in the status pane.
- Introduced immediate replication action for accepted peers.
- Updated status control icons for clarity.
- Display stable Room ID suffix above Peer ID in the status card.
- Implemented dedicated active remote configuration for P2P features.
- Added migration support for P2P active remote selection.
- Improved unit test coverage for P2P settings.
2026-05-17 13:08:51 +09:00
vorotamoroz eea26dee74 Update about P2P 2026-05-17 02:35:20 +09:00
vorotamoroz ee24fe8c24 Merge pull request #904 from vrtmrz/enhance_fix_p2p
Fixed: fixed P2P bugs and and implement new UI
2026-05-17 02:32:50 +09:00
vorotamoroz 9d9364af36 Fix updates.md 2026-05-17 02:24:58 +09:00
vorotamoroz 83228e2077 Fix P2P replicator creation and enhance error handling in synchronization functions 2026-05-17 02:23:58 +09:00
vorotamoroz a379b5bd78 bump 2026-05-17 01:40:50 +09:00
vorotamoroz 4ed1749652 Enhance P2P synchronization features and UI improvements 2026-05-17 01:36:09 +09:00
vorotamoroz 9a90256a8a Enhance P2P synchronization features and UI improvements 2026-05-16 23:50:08 +09:00
vorotamoroz f0628a0d2c Improve UI 2026-05-16 23:09:11 +09:00
vorotamoroz d5e2f57781 Fixed: fixed P2P bugs and and implement new UI 2026-05-15 10:18:53 +01:00
Nikolay Sokolov 02673a1631 bugfix: Add package-lock.json into docker build 2026-05-14 23:17:37 -07:00
vorotamoroz 91c9746886 Merge pull request #900 from vrtmrz/v0_25_62
Releasing v0.25.62
2026-05-14 20:15:02 +09:00
vorotamoroz 75b44b1636 bump 2026-05-14 09:40:12 +00:00
vorotamoroz f1fe48c1ee add version-bump 2026-05-14 09:35:53 +00:00
vorotamoroz 437e7c0d9c Fixed an issue where a connection could not be established when attempting to connect to a brand-new remote database without going through the set-up wizard or configuration checking 2026-05-14 09:32:34 +00:00
vorotamoroz 5ffa7ec7ee Merge pull request #897 from vrtmrz/v0_25_61
Releaseing v0.25.61
2026-05-13 23:06:57 +09:00
vorotamoroz a1859f5d2e bump 2026-05-13 14:44:38 +01:00
vorotamoroz 785af8cb8f Merge pull request #896 from vrtmrz/address_community_review
Address community review
2026-05-13 22:29:37 +09:00
vorotamoroz 06e1f4aa4a Update subrepo pointer 2026-05-13 14:25:49 +01:00
vorotamoroz 767f22ce9c Merge branch 'address_community_review' of https://github.com/vrtmrz/obsidian-livesync into address_community_review 2026-05-13 14:16:51 +01:00
vorotamoroz 6a9bba702c chore: ran prettier 2026-05-13 14:10:56 +01:00
vorotamoroz de2397dc3f Adding a rough DI 2026-05-13 14:10:55 +01:00
vorotamoroz daaad9212e Fix package-lock 2026-05-13 14:10:54 +01:00
vorotamoroz a6891374a1 chore: Package modernise, update linter 2026-05-13 14:10:01 +01:00
vorotamoroz b1cadf0549 prettify 2026-05-13 14:07:58 +01:00
vorotamoroz 95f40cc954 (chore): removing DOM Operation 2026-05-13 14:07:58 +01:00
vorotamoroz 8deaf123d6 Update eslint config to ignore file,
fix some type error on LiveSyncBaseCore
2026-05-13 14:06:51 +01:00
vorotamoroz 053813bffb Update for review once 2026-05-13 14:06:51 +01:00
vorotamoroz cc7af03618 chore: Package modernise, update linter 2026-05-13 14:06:51 +01:00
vorotamoroz a130e3700e prettify 2026-05-13 14:06:50 +01:00
vorotamoroz 0549e901b2 (chore): removing DOM Operation 2026-05-13 14:06:49 +01:00
vorotamoroz e9afe06968 Merge pull request #895 from vrtmrz/update_lib
Update lib to fix P2P problems and merging contributions
2026-05-13 22:01:17 +09:00
vorotamoroz c45aca4794 fixed: fixed subrepo pointer
I thought I’d rebased it, but it turns out everything had been merged.
2026-05-13 13:45:09 +01:00
vorotamoroz e2c54aaf43 Update lib to fix P2P problems 2026-05-13 13:31:11 +01:00
vorotamoroz 37715d4c9f chore: ran prettier 2026-05-13 11:12:40 +00:00
vorotamoroz 106367fa41 Adding a rough DI 2026-05-13 11:09:04 +00:00
vorotamoroz 538130aa91 Fix package-lock 2026-05-13 11:36:01 +01:00
vorotamoroz c9d0357fec Merge branch 'address_community_review' of https://github.com/vrtmrz/obsidian-livesync into address_community_review 2026-05-13 11:35:01 +01:00
vorotamoroz d05c76da36 Update eslint config to ignore file,
fix some type error on LiveSyncBaseCore
2026-05-13 11:33:46 +01:00
vorotamoroz d2eb6ecbaf Update for review once 2026-05-13 11:33:46 +01:00
vorotamoroz 25a6fde212 chore: Package modernise, update linter 2026-05-13 11:33:45 +01:00
vorotamoroz e8f8b680ef prettify 2026-05-13 11:33:03 +01:00
vorotamoroz 6c30f2b863 (chore): removing DOM Operation 2026-05-13 11:33:03 +01:00
vorotamoroz 8dda24a689 Merge pull request #882 from vrtmrz/p2p-rpc
feat: use new p2p-rpc wrapper
2026-05-13 19:24:26 +09:00
vorotamoroz fbbb63906a Merge branch 'main' into p2p-rpc 2026-05-13 19:22:03 +09:00
vorotamoroz 1e66a7f144 Merge pull request #894 from vrtmrz/fix_unexpected_error_on_startup
fixed: fixed unexpected error during startup
2026-05-13 19:16:18 +09:00
vorotamoroz df79d81475 fixed: fixed unexpected error during startup 2026-05-13 10:14:47 +00:00
vorotamoroz ad71355859 Merge pull request #893 from brian-spackman/fix-fractional-mtime-on-linux
fix: truncate sub-millisecond CLI mtimes to prevent mobile crash
2026-05-13 19:12:56 +09:00
vorotamoroz 95dc079fad Merge pull request #843 from andrewleech/daemon-sync
cli: implement continuous sync daemon mode
2026-05-13 18:53:59 +09:00
vorotamoroz 770d4af4a0 Update eslint config to ignore file,
fix some type error on LiveSyncBaseCore
2026-05-13 10:15:45 +01:00
vorotamoroz 3b311248cb Update for review once 2026-05-13 08:02:50 +01:00
Andrew Leech 67996f6d0a cli: fix stale stat.size in NodeVaultAdapter causing corrupted file errors
chokidar stats are captured at poll time and may not reflect the file's
final byte length by the time vault.read() is called. The downstream
integrity check compares stat.size to content length; a mismatch causes
other LiveSync clients to reject the file as corrupted.

Fix by updating file.stat.size from the actual content in read() and
readBinary().

Co-authored-by: Joysimple <Joysimple@users.noreply.github.com>
2026-05-13 16:56:08 +10:00
vorotamoroz 5772811a45 chore: Package modernise, update linter 2026-05-13 04:40:32 +01:00
vorotamoroz 55529cd71e prettify 2026-05-13 03:58:08 +01:00
vorotamoroz 2e9b8b7b62 (chore): removing DOM Operation 2026-05-13 03:55:11 +01:00
Andrew Leech 4ab2e41d18 cli daemon: set disableCheckingConfigMismatch for headless operation
The config mismatch dialog's defaultAction is "Dismiss" which blocks
replication. Since the daemon cannot resolve mismatches interactively,
skip the check entirely and accept the remote configuration as-is.
2026-05-13 11:21:06 +10:00
Andrew Leech c0ad8ee15a cli: add configurable ignore rules and deployment artifacts
IgnoreRules (src/apps/cli/serviceModules/IgnoreRules.ts):
- Reads .livesync/ignore for user-defined glob patterns
- Applies gitignore matchBase semantics: patterns without / get **/ prefix,
  patterns ending with / get ** appended for directory contents
- Supports `import: .gitignore` directive to merge gitignore patterns
- Rejects negation patterns with a warning (not fully supportable)
- Integrated into both daemon and mirror commands via isTargetFile handler

Wiring:
- IgnoreRules loaded before LiveSyncBaseCore construction so beginWatch()
  receives rules when it fires during onLoad/onFirstInitialise
- Passed through initialiseServiceModulesCLI -> StorageEventManagerCLI ->
  CLIStorageEventManagerAdapter -> CLIWatchAdapter

Deployment:
- src/apps/cli/deploy/livesync-cli.service - systemd unit template
- src/apps/cli/deploy/install.sh - user/system install script

Testing:
- src/apps/cli/test/test-daemon-linux.sh - e2e tests for ignore rules
- src/apps/cli/serviceModules/IgnoreRules.unit.spec.ts - 15 unit tests
- src/apps/cli/commands/daemonCommand.unit.spec.ts - 7 unit tests
2026-05-13 11:21:06 +10:00
Andrew Leech e6ae516493 cli: implement local→CouchDB file watching via chokidar
- Add chokidar ^4.0.0 as dependency (root package.json, runtime-package.json)
- Mark chokidar as external in vite.config.ts (not bundled, loaded at runtime)
- Implement CLIWatchAdapter.beginWatch() with chokidar:
  - ignoreInitial: true (startup files handled by mirror scan)
  - awaitWriteFinish to prevent partial-write events
  - Excludes dotfiles and .livesync/ directory at watcher level
  - Maps add/change/unlink/addDir/unlinkDir to IStorageEventWatchHandlers
  - Fatal error handler: logs clearly and releases watcher resources
- Add close() to CLIWatchAdapter, StorageEventManagerCLI for clean shutdown
- Register onUnload hook in CLIServiceModules to close watcher on shutdown
2026-05-13 11:21:06 +10:00
Andrew Leech a4d5ef4620 cli: implement daemon startup sequence and CouchDB→local sync
- Add daemon command to help text and --interval/-i flag for polling mode
- Capture original sync settings before suspendAllSync() clobbers them
- Implement daemon startup: mirror scan → restore settings → applySettings()
  which triggers the full suspend/resume lifecycle and starts the _changes feed
- Guard processSynchroniseResult no-op to non-daemon commands so default
  handler writes incoming CouchDB changes to the local filesystem
- Polling mode: restore settings + clearInterval-safe try/catch error handling
- Warn when both liveSync and syncOnStart are false after restore (no-op config)
- Fix: only block indefinitely if daemon startup succeeded
2026-05-13 11:21:06 +10:00
Brian Spackman 3f7bb047ac fix: floor sub-millisecond CLI mtimes to prevent mobile crash
On Linux, fs.Stats.mtimeMs and ctimeMs return floats with sub-millisecond
precision derived from the kernel's nanosecond filesystem mtime. Stored
raw, this produces document timestamps like 1778511180024.462 in CouchDB
rather than integer milliseconds.

Mobile clients running LiveSync 0.25.60 have been observed to crash when
processing change-feed updates carrying non-integer millisecond timestamps
from CLI-written documents. Desktop and mobile GUI plugins write integer
milliseconds, so the crash only manifests when the headless CLI on Linux
is the source. Whether the issue was introduced in 0.25.60 or had been
latent in earlier versions hasn't been investigated; 0.25.60 is the
version where the crash was confirmed and the fix verified.

Floor the values at every stat-read site (six across three adapters and
one command) so CLI-written documents carry integer-millisecond
timestamps consistent with the rest of the mesh.
2026-05-12 18:00:25 -06:00
SeleiXi 5454e1106f feat: add diff navigation to conflict resolver 2026-05-13 00:19:56 +08:00
SeleiXi 0d9397c8b9 fix: resolve UI alignment issue for diff navigation buttons 2026-05-12 00:52:20 +08:00
SeleiXi 429a3ff1fd feat: add diff-only view button to document history 2026-05-11 23:53:07 +08:00
SeleiXi bfff6ea7b8 feat: add document history search support 2026-05-11 22:45:42 +08:00
vorotamoroz b6b153c0de Merge pull request #887 from vrtmrz/add_ignore_to_eslint
chore: Change eslint config to ignore _tools
2026-05-11 21:01:47 +09:00
vorotamoroz eca6a6e0ba chore: Change eslint config to ignore _tools 2026-05-11 13:00:32 +01:00
vorotamoroz ca43d96c46 Merge pull request #886 from vrtmrz/fix_prettier
Fix prettier config
2026-05-11 20:34:22 +09:00
vorotamoroz 112e3c8b1d Fix prettier config 2026-05-11 12:33:32 +01:00
vorotamoroz d1eb105801 Merge pull request #872 from OriBoharon/make-cli-onboarding-easier
added documentaion and a hook build script to make onbaording easier when trying to build the cli app
2026-05-11 18:43:00 +09:00
vorotamoroz d5b93e89cd Change the default issue report label from 'bug' to 'uncategorised' 2026-05-11 17:55:31 +09:00
vorotamoroz e96fe7cde1 Merge pull request #885 from vrtmrz/tidy_file
(chore) remove obsoleted file
2026-05-11 17:52:22 +09:00
vorotamoroz 68e0610f1d (chore) remove obsoleted file 2026-05-11 09:49:32 +01:00
vorotamoroz a6be20695a feat: use new p2p-rpc wrapper 2026-05-11 03:49:35 +01:00
vorotamoroz 772b6ecf26 Merge pull request #871 from SeleiXi/feat/diff-navigation-buttons
feat: Add diff navigation buttons for Document History
2026-05-09 22:51:04 +09:00
SeleiXi 81dc7f604b feat: auto navigation to diff 2026-05-09 14:07:08 +08:00
vorotamoroz a9c87fa52e - Add default test environment
- Fixed to use environment by APIs
- Make test parallel
2026-05-08 03:04:14 +00:00
vorotamoroz e81f023943 Add default test env 2026-05-08 03:01:22 +00:00
vorotamoroz 2afe12ad2d fix pattern 2026-05-07 11:28:01 +01:00
vorotamoroz 4a9d6c1349 Add ci 2026-05-07 11:23:51 +01:00
vorotamoroz 279fc8876e feat(tests): enhance push/pull test with Docker integration and improved environment variable handling
style(test): format comment
2026-05-07 11:22:56 +01:00
vorotamoroz cc3d30dbcf feat(tests): add Deno-based tests for checking CLI functionality in the same-codebase between platforms. 2026-05-07 11:06:12 +01:00
vorotamoroz 39e82cc8a1 Fixed: Fix timing issue during test 2026-05-06 21:56:13 +09:00
bori 7a4b76a550 added documentaion and a hook build script to make onbaording easier 2026-05-02 18:51:07 +03:00
SeleiXi f9294446ba feat: add diff block navigation to Document History modal
Add prev/next buttons to jump between diff blocks in the
Document History view. Includes position indicator and
auto-scroll with visual focus highlighting.
2026-05-02 22:18:43 +08:00
vorotamoroz fa7ef62302 Fix: adjusting help
Co-authored-by: Copilot <copilot@github.com>
2026-04-29 18:42:54 +09:00
vorotamoroz 81d8224330 bump
Co-authored-by: Copilot <copilot@github.com>
2026-04-29 18:39:48 +09:00
vorotamoroz cc466a4b3c ### Fixed
- Now larger settings can be exported and imported via QR code without issues. (#595)

- Fixed some errors during serialisation and deserialisation of the settings, which caused issues in some cases when importing/exporting settings via QR code.

Co-authored-by: Copilot <copilot@github.com>
2026-04-29 18:37:44 +09:00
vorotamoroz ceebca7de9 Merge pull request #862 from fabiomanz/main
chore: remove obsolete `version` attribute from docker-compose.yml
2026-04-29 17:30:35 +09:00
Fabio c2f696d0a4 chore: attribute version is obsolete 2026-04-29 07:07:45 +00:00
vorotamoroz 1aa7c45794 Fix the readme
Co-authored-by: Copilot <copilot@github.com>
2026-04-29 12:55:34 +09:00
vorotamoroz faefa80cbd Fix again 2026-04-29 12:40:40 +09:00
vorotamoroz 3737eacffd Fix readme
Co-authored-by: Copilot <copilot@github.com>
2026-04-29 12:39:42 +09:00
vorotamoroz 4c0af0b608 Fixed(cli):
- `ls` and `mirror` commands now provide informative feedback when no documents are found or filters skip all files, resolving the issue where they would exit silently (#860).
- The command-line argument `vault` has been renamed to a more appropriate name, `databaseDir`.
- The `mirror` command now accepts a `vault` directory, which specifies the location where the actual files are stored. For compatibility reasons, the previous behaviour is still supported.

Co-authored-by: Copilot <copilot@github.com>
2026-04-29 12:22:00 +09:00
vorotamoroz bb69eb13e7 bump 2026-04-27 11:15:07 +09:00
vorotamoroz 7c9db6376f Fixed:
- No longer Setup-wizard drops username and password silently. (#865)
- Setup URI is now correctly imported (#859).
- now French translation is added.
2026-04-27 11:14:06 +09:00
vorotamoroz 4c04e4e676 Merge pull request #863 from koteitan/fix/859-strip-trailing-slash-from-uri
fix: strip trailing slash from couchDB_URI to avoid double-slash 401
2026-04-27 11:08:11 +09:00
koteitan 14ec35b257 fix: strip trailing slash from couchDB_URI to avoid double-slash 401
When couchDB_URI ends with a trailing slash (e.g. https://host/), the
database name concatenation produces a double-slash path
(https://host//obsidiannotes), which causes CouchDB to reject requests
with 401 "Name or password is incorrect".

Strip trailing slashes from couchDB_URI / baseUri at the path
concatenation sites in:
- src/common/utils.ts (_requestToCouchDBFetch, _requestToCouchDB)
- src/features/LocalDatabaseMainte/CmdLocalDatabaseMainte.ts

The companion fix for the replication path is in the livesync-commonlib
submodule.

Ref: #859
2026-04-27 00:12:57 +09:00
vorotamoroz b609e4973c Merge remote-tracking branch 'refs/remotes/origin/main' 2026-04-25 20:37:08 +09:00
vorotamoroz 354f0be9a3 bump
Co-authored-by: Copilot <copilot@github.com>
2026-04-25 20:16:50 +09:00
vorotamoroz 16804ed34c Merge pull request #842 from kdavh/patch-1
Update README.md, fix webpeer link
2026-04-25 19:07:56 +09:00
vorotamoroz 31bd270869 Fixed: Hidden file JSON conflicts no longer keep re-opening and dismissing the merge dialogue before we can act, which fixes persistent unresolvable data.json conflicts in plug-in settings sync (related: #850).
Co-authored-by: Copilot <copilot@github.com>
2026-04-25 17:22:25 +09:00
vorotamoroz b5d054f259 Fixed: Issue report generation now redacts remoteConfigurations connection strings and keeps only the scheme (e.g. sls+https://), so credentials are not exposed in reports.
Co-authored-by: Copilot <copilot@github.com>
2026-04-25 17:09:43 +09:00
vorotamoroz 1ef2955d00 - Fixed a worker-side recursion issue that could raise Maximum call stack size exceeded during chunk splitting (related: #855).
- Improved background worker crash cleanup so pending split/encryption tasks are released cleanly instead of being left in a waiting state (related: #855).
- On start-up, the selected remote configuration is now applied to runtime connection fields as well, reducing intermittent authentication failures caused by stale runtime settings (related: #855).

Co-authored-by: Copilot <copilot@github.com>
2026-04-25 16:51:37 +09:00
vorotamoroz 6ef56063b3 Fixed: No longer credentials are broken during object storage configuration (related: #852).
Co-authored-by: Copilot <copilot@github.com>
2026-04-25 15:03:38 +09:00
vorotamoroz a912585800 Improve issue template
Co-authored-by: Copilot <copilot@github.com>
2026-04-25 14:01:18 +09:00
vorotamoroz 7a863625bc bump 2026-04-09 04:32:34 +01:00
vorotamoroz 99b4037820 Fixed
- Packing a batch during the journal sync now continues even if the batch contains no items to upload.
2026-04-06 12:51:09 +01:00
vorotamoroz d59b5dc2f9 Fixed
- Remote configuration URIs are now correctly encrypted when saved after editing in the settings dialogue.
- Fixed an issue where devices could no longer upload after another device performed 'Fresh Start Wipe' and 'Overwrite remote' in Object Storage mode (#848).
2026-04-06 11:47:19 +01:00
vorotamoroz 4d0203e4ca Update: beta tagging 2026-04-06 11:46:51 +01:00
vorotamoroz 3e4db571cd Fixed
- Remote configuration URIs are now correctly encrypted when saved after editing in the settings dialogue.
- Fixed an issue where devices could no longer upload after another device performed 'Fresh Start Wipe' and 'Overwrite remote' in Object Storage mode (#848).
2026-04-06 11:45:26 +01:00
vorotamoroz b0a9bd84d6 bump 2026-04-05 18:21:38 +09:00
vorotamoroz 8c4e62e7c1 ### Fixed
- Now surely remote configurations are editable in the settings dialogue.
- We can fetch remote settings from the remote and apply them to the local settings for each remote configuration entry.
- No longer layout breaking occurs when the description of a remote configuration entry is too long.
2026-04-05 18:20:56 +09:00
vorotamoroz 3e03d1dbd5 bump 2026-04-05 17:48:00 +09:00
vorotamoroz 0dbf4cface bump 2026-04-05 17:47:45 +09:00
vorotamoroz bc22d61a3a Fixed: Now error messages are kept hidden if the show status inside the editor is disabled. 2026-04-05 17:43:29 +09:00
vorotamoroz d709bcc1d0 Add encryption for connection management 2026-04-05 16:24:34 +09:00
vorotamoroz d7088be8af Improved: remote management 2026-04-05 16:00:57 +09:00
vorotamoroz f17f1ecd93 ### Fixed
- No unexpected error (about a replicator) during early stage of initialisation.

### New features

- Now we can configure multiple Remote Databases of the same type, e.g, multiple CouchDBs or S3 remotes.
- We can switch between multiple Remote Databases in the settings dialogue.
2026-04-03 13:47:56 +01:00
vorotamoroz bf556bd9f4 Merge pull request #838 from chinhkrb113/contribai/docs/undocumented-test-environment-variables
📝 Docs: Undocumented test environment variables
2026-04-03 13:05:05 +09:00
vorotamoroz 8b40969fa3 Add ru locale 2026-04-02 10:28:58 +00:00
vorotamoroz 6cce931a88 Add test for CLI 2026-04-02 09:58:25 +00:00
vorotamoroz 216861f2c3 Prettified 2026-04-02 10:33:36 +01:00
vorotamoroz 6ce724afb4 Add dockerfiles to webapp and webpeer 2026-04-02 10:33:13 +01:00
vorotamoroz 2e3e106fb2 Fix dockerfile 2026-04-02 10:31:17 +01:00
vorotamoroz 00f2606a2f Added a bit for development on Windows. 2026-04-02 10:31:03 +01:00
vorotamoroz 3c94a44285 Fixed: Replication progress is now correctly saved and restored in the CLI. 2026-04-02 10:30:14 +01:00
vorotamoroz 4c0908acde Add CI Build for cli-docker image 2026-04-02 07:47:10 +01:00
vorotamoroz cda27fb7f8 - Update trystero to v0.23.0
- Add dockerfile for CLI
- Change relay image for testing on arm64
2026-03-31 07:17:51 +00:00
vorotamoroz 837a828cec Fix: fix update note... 2026-03-30 09:20:01 +01:00
vorotamoroz 4c8e13ccb9 bump 2026-03-30 09:14:49 +01:00
vorotamoroz 1ae4eaab02 Merge pull request #805 from L4z3x/patch-1
[docs] added changing docker compose data and etc folder ownership to user 5984.
2026-03-30 17:04:12 +09:00
chinhkrb113 b1efbf74c7 docs: clarify P2P_TEST_RELAY as Nostr relay 2026-03-30 02:18:25 +07:00
kdavh 12f04f6cf7 Update README.md, fix webpeer link 2026-03-28 12:47:28 -04:00
vorotamoroz a937feed3f Merge pull request #833 from rewse/fix/cli-sync-locked-error-message
fix(cli): show actionable error when sync fails due to locked remote DB
2026-03-28 23:58:34 +09:00
ChinhLee 2de9899a99 docs: undocumented test environment variables
The P2P test suite relies on several specific environment variables (e.g., `P2P_TEST_ROOM_ID`, `P2P_TEST_PASSPHRASE`, `P2P_TEST_RELAY`) loaded from `.env` or `.test.env`. Because these are not documented anywhere in the repository, new contributors will be unable to configure their local environment to run the P2P tests successfully.

Affected files: vitest.config.p2p.ts

Signed-off-by: ChinhLee <76194645+chinhkrb113@users.noreply.github.com>
2026-03-27 22:26:00 +07:00
vorotamoroz a0af6201a5 - No longer Peer-to-Peer Sync is not enabled. We cannot open a new connection. error occurs when we have not enabled P2P sync and are not expected to use it (#830). 2026-03-26 13:13:27 +01:00
vorotamoroz 9c7c6c8859 Merge pull request #831 from rewse/fix/cli-entrypoint-polyfill-default
fix(cli): handle incomplete localStorage in Node.js v25+
2026-03-26 20:36:46 +09:00
vorotamoroz 38d7cae1bc update some dependencies and ran npm-update. 2026-03-26 12:15:38 +01:00
vorotamoroz fee34f0dcb Update dependency: deduplicate 2026-03-26 11:55:06 +01:00
Shibata, Tats e01f7f4d92 test(cli): add TODO comment and locked-remote-DB test script
- Add inline TODO comment in runCommand.ts about standardising
  replication failure cause identification logic.
- Add test-sync-locked-remote-linux.sh that verifies:
  1. sync succeeds when the remote milestone is not locked.
  2. sync fails with an actionable error when the remote milestone
     has locked=true and accepted_nodes is empty.
2026-03-26 00:58:51 +09:00
Shibata, Tats 985004bc0e fix(cli): show actionable error when sync fails due to locked remote DB
When the remote database is locked and the CLI device is not in the
accepted_nodes list, openReplication returns false with no CLI-specific
guidance. The existing log message ('Fetch rebuilt DB, explicit
unlocking or chunk clean-up is required') is aimed at the Obsidian
plugin UI.

Check the replicator's remoteLockedAndDeviceNotAccepted flag after
sync failure and print a clear message directing the user to unlock
from the Obsidian plugin.

Ref: #832
2026-03-22 12:37:17 +09:00
Shibata, Tats 967a78d657 fix(cli): handle incomplete localStorage in Node.js v25+
Node.js v25 provides a built-in localStorage on globalThis, but without
`--localstorage-file` it is an empty object lacking getItem/setItem.
The existing check `!("localStorage" in globalThis)` passes, so the
polyfill is skipped and the CLI crashes with:

  TypeError: localStorage.getItem is not a function

Check for getItem as well so the polyfill is applied when the native
implementation is incomplete.
2026-03-22 11:57:47 +09:00
vorotamoroz 2ff60dd5ac Add missed files 2026-03-18 12:20:52 +01:00
vorotamoroz c3341da242 Fix english 2026-03-18 12:05:15 +01:00
vorotamoroz c2bfaeb5a9 Fixed: wrong import 2026-03-18 12:03:51 +01:00
vorotamoroz c454616e1c bump 2026-03-18 12:01:57 +01:00
vorotamoroz c88e73b7d3 Add note 2026-03-18 11:55:50 +01:00
vorotamoroz 3a29818612 - Delete items which are no longer used that might cause potential problems
- Fix Some Imports
- Fix floating promises on tests
2026-03-18 11:54:22 +01:00
vorotamoroz ee69085830 Fixed: Some buttons on the setting dialogue now respond correctly again (#827). 2026-03-18 11:51:52 +01:00
vorotamoroz 3963f7c971 Refactored: P2P replicator has been refactored to be a little roust and easier to understand. 2026-03-18 11:49:41 +01:00
vorotamoroz 602fcef949 - Fixed the issue where the detail level was not being applied in the log pane.
- Pop-ups are now shown.
- Add coverage for test.
- Pop-ups are now shown in the web app as well.
2026-03-18 11:48:31 +01:00
vorotamoroz 075d260fdd Fixed:
- Fixed the corrupted display of the help message.
- Remove some unnecessary codes.
2026-03-18 11:46:52 +01:00
vorotamoroz 0717093d81 update for npm ci 2026-03-17 20:09:28 +09:00
vorotamoroz 1f87a9fd3d port setupManager, setupProtocol to serviceFeature
remove styles on webapp UI, and add stylesheet
2026-03-17 19:58:12 +09:00
vorotamoroz fdd3a3aecb Add: vaultSelector (webapp) 2026-03-17 19:51:04 +09:00
vorotamoroz d8281390c4 bump 2026-03-17 10:34:29 +01:00
vorotamoroz 08b1712f39 bump 2026-03-16 00:49:54 +09:00
vorotamoroz 6c69547cef ### Fixed
- Fixed flaky timing issues in P2P synchronisation.
- Fixed more binary file handling issues in CLI.

### Tests

- Rewrite P2P end-to-end tests to use the CLI as host.
2026-03-16 00:48:22 +09:00
vorotamoroz 89bf0488c3 Refactor: More refactor P2P Replicator 2026-03-15 04:07:47 +09:00
vorotamoroz 653cf8dfbe Refactor: Refactor P2P Replicator 2026-03-15 03:33:03 +09:00
vorotamoroz 33338506cf bump 2026-03-14 17:02:16 +09:00
vorotamoroz 9dd479e597 Fix for an issue where conflicts cannot be resolved in Journal Sync
Remove unnecessary test calling in CLI
2026-03-14 16:51:30 +09:00
vorotamoroz 8cad4cdf80 Add workaround for my mac 2026-03-14 16:50:43 +09:00
vorotamoroz beced219c7 Fix: exit code 2026-03-14 16:13:14 +09:00
vorotamoroz dfe13b1abd Fixed:
- No longer unexpected `Unhandled Rejections` during P2P operations (waiting acceptance).
CLI new features
- P2P sync has been implemented.
2026-03-14 15:08:31 +09:00
vorotamoroz bf93bddbdd Fix: prevent transfer twice. 2026-03-13 23:34:38 +09:00
vorotamoroz 44890a34e8 remove conflicting option. 2026-03-13 23:08:05 +09:00
vorotamoroz a14aa201a8 Merge branch 'beta' of https://github.com/vrtmrz/obsidian-livesync into beta 2026-03-13 18:13:12 +09:00
vorotamoroz 338a9ba9fa Add: mirror command
Tidy: test
2026-03-13 18:01:38 +09:00
vorotamoroz 0c65b5add9 Add: mirror command 2026-03-13 12:55:46 +09:00
vorotamoroz 29ce9a5df4 remove todo 2026-03-12 12:45:39 +01:00
vorotamoroz 10f5cb8b42 add paths 2026-03-12 12:31:53 +01:00
vorotamoroz 8aad3716d4 fix grammatical errors 2026-03-12 12:29:43 +01:00
vorotamoroz d45f41500a Fix: no longer duplicated addLog setHandler 2026-03-12 12:27:47 +01:00
vorotamoroz 4cc0a11d86 Add ci cli-e2e 2026-03-12 12:23:13 +01:00
vorotamoroz ad0a6b458f bump 2026-03-12 12:16:00 +01:00
vorotamoroz 6ae1d5d6a5 update readme 2026-03-12 12:07:05 +01:00
vorotamoroz 84110aee97 update readme 2026-03-12 19:46:52 +09:00
vorotamoroz 4646577f35 Update 2026-03-12 19:42:10 +09:00
vorotamoroz 822d957976 Refactor: separate entrypoint and main,
Fix: readlng binary file
2026-03-12 19:41:10 +09:00
vorotamoroz d4aedf59f3 A- Add more tests.
- Object Storage support has also been confirmed (and fixed) in CLI.
2026-03-12 18:20:55 +09:00
vorotamoroz 5d80258a77 Add e2e-test (not passed yet)
Refine readme
2026-03-12 12:20:39 +09:00
vorotamoroz fa14531599 Add note 2026-03-12 03:03:03 +09:00
vorotamoroz 7992b3c2b9 Wrote the test (but untested) 2026-03-12 03:01:46 +09:00
vorotamoroz 5872cad1e5 Implement commands 2026-03-12 02:56:30 +09:00
vorotamoroz 16c0dfef4c Remove the grandiloquence from the note written in work in progress. 2026-03-11 23:51:35 +09:00
vorotamoroz 70c7624c7a Add note 2026-03-11 14:58:06 +01:00
vorotamoroz 4a0d5e99d0 Fix import path and add readme 2026-03-11 14:57:36 +01:00
vorotamoroz 0742773e1e Add self-hosted-livesync-cli to src/apps/cli as a headless, and a dedicated version. 2026-03-11 14:51:01 +01:00
vorotamoroz 2f8bc4fef2 - Now useOfflineScanner, useCheckRemoteSize, and useRedFlagFeatures are set from main.ts, instead of LiveSyncBaseCore. 2026-03-11 14:44:37 +01:00
vorotamoroz 0dfd42259d 11th March, 2026
Now, Self-hosted LiveSync has finally begun to be split into the Self-hosted LiveSync plugin for Obsidian, and a properly abstracted version of it.
This may not offer much benefit to Obsidian plugin users, or might even cause a slight inconvenience, but I believe it will certainly help improve testability and make the ecosystem better.
However, I do not see the point in putting something with little benefit into beta, so I am handling this on the alpha branch. I would actually preferred to create an R&D branch, but I was not keen on the ampersand, and I feel it will eventually become a proper beta anyway.

### Refactored

- Separated `ObsidianLiveSyncPlugin` into `ObsidianLiveSyncPlugin` and `LiveSyncBaseCore`.
- Now `LiveSyncCore` indicates the type specified version of `LiveSyncBaseCore`.
- Referencing `plugin.xxx` has been rewritten to referencing the corresponding service or `core.xxx`.

### Internal API changes

- Storage Access APIs are now yielding Promises. This is to allow more limited storage platforms to be supported.

### R&D

- Browser-version of Self-hosted LiveSync is now in development. This is not intended for public use now, but I will eventually make it available for testing.
- We can see the code in `src/apps/webapp` for the browser version.
2026-03-11 05:47:00 +01:00
vorotamoroz 9cf630320c Merge remote-tracking branch 'refs/remotes/origin/main' 2026-03-09 10:38:17 +09:00
vorotamoroz 584adc9296 bump 2026-03-09 10:25:19 +09:00
vorotamoroz f7dba6854f ### Fixed
- No longer unexpected deletion-propagation occurs when the parent directory is not empty (#813).

### Revert reversions
- Reverted the reversion of ModuleCheckRemoteSize. Now it is back to the service feature.
2026-03-09 10:24:49 +09:00
vorotamoroz 1d83e0ee31 manifest.json を更新 2026-03-08 17:24:54 +09:00
vorotamoroz d0244bd6d0 bump 2026-03-07 18:36:54 +09:00
vorotamoroz 79bb5e1c77 ### Reverted
- Reverted to ModuleRedFlag and ModuleInitializerFile to the previous version because of some unexpected issues. (#813)
2026-03-07 18:36:10 +09:00
vorotamoroz 3403712e24 Downgrade version from 0.25.50 to 0.25.48 for #813 2026-03-07 13:13:37 +09:00
vorotamoroz 8faa19629b bump 2026-03-03 13:39:13 +00:00
vorotamoroz 7ff9c666ce Fix: No more credentials logged 2026-03-03 13:34:18 +00:00
vorotamoroz d8bc2806e0 bump 2026-03-03 13:27:23 +00:00
vorotamoroz 62f78b4028 Modify unit-ci to upload coverage 2026-03-03 13:22:17 +00:00
vorotamoroz cf9d2720ce ### Fixed
- No longer deleted files are not clickable in the Global History pane.
- Diff view now uses more specific classes (#803).
- A message of configuration mismatching slightly added for better understanding.
    - Now it says `When replication is initiated manually via the command palette or ribbon, a dialogue box will open to address this.` to make it clear that the user can fix the issue by themselves.

### Refactored

- `ModuleRedFlag` has been refactored to `serviceFeatures/redFlag` and also tested.
- `ModuleInitializerFile` has been refactored to `lib/serviceFeatures/offlineScanner` and also tested.
2026-03-03 13:19:22 +00:00
vorotamoroz 09115dfe15 Fixed: Styles on the diff-dialogue has been qualified. 2026-03-02 10:52:14 +00:00
L4z3x 310496d0b8 added changing docker compose data and etc folder, to prevent permissions errors
while trying to follow the docker compose guide i created the data folders using the root user, and had this error when i run the stack:
`touch: cannot touch '/opt/couchdb/etc/local.d/docker.ini': Permission denied`

the problem was solved by changing the ownership of the folder to the user 5984, then one in the docker compose file.
2026-02-23 22:21:18 +01:00
713 changed files with 64415 additions and 21882 deletions
+31
View File
@@ -0,0 +1,31 @@
# Git history
.git/
.gitignore
# Dependencies — re-installed inside Docker
node_modules/
src/apps/cli/node_modules/
# Pre-built CLI output — rebuilt inside Docker
src/apps/cli/dist/
# Obsidian plugin build outputs
main.js
main_org.js
pouchdb-browser.js
production/
# Test coverage and reports
coverage/
# Local environment / secrets
.env
*.env
.test.env
# local config files
*.local
# OS artefacts
.DS_Store
Thumbs.db
+1
View File
@@ -0,0 +1 @@
*.sh text eol=lf
+47 -41
View File
@@ -2,77 +2,83 @@
name: Issue report
about: Create a report to help us improve
title: ''
labels: ''
labels: 'uncategorised'
assignees: ''
---
Thank you for taking the time to report this issue!
To improve the process, I would like to ask you to let me know the information in advance.
Before filling in this form, please read: [How to report an issue](../docs/to_issue_reporting.md).
All instructions and examples, and empty entries can be deleted.
Just for your information, a [filled example](https://docs.vrtmrz.net/LiveSync/hintandtrivia/Issue+example) is also written.
Issues with sufficient information will be prioritised.
## Abstract
The synchronisation hung up immediately after connecting.
---
## Expected behaviour
- Synchronisation ends with the message `Replication completed`
- Everything synchronised
## Required
## Actually happened
- Synchronisation has been cancelled with the message `TypeError ... ` (captured in the attached log, around LL.10-LL.12)
- No files synchronised
### Abstract
<!-- Briefly describe the problem in one or two sentences. -->
## Reproducing procedure
### Expected behaviour
<!-- What did you expect to happen? -->
1. Configure LiveSync as in the attached material.
2. Click the replication button on the ribbon.
3. Synchronising has begun.
4. About two or three seconds later, we got the error `TypeError ... `.
5. Replication has been stopped. No files synchronised.
### Actually happened
<!-- What actually happened? Include any error messages. -->
Note: If you do not catch the reproducing procedure, please let me know the frequency and signs.
## Report materials
If the information is not available, do not hesitate to report it as it is. You can also of course omit it if you think this is indeed unnecessary. If it is necessary, I will ask you.
### Report from the LiveSync
For more information, please refer to [Making the report](https://docs.vrtmrz.net/LiveSync/hintandtrivia/Making+the+report).
<details>
<summary>Report from hatch</summary>
```
<!-- paste here -->
```
</details>
### Reproducing procedure
<!-- Step-by-step instructions to reproduce the issue. If you cannot reproduce it reliably, please describe the frequency and any signs you noticed. -->
### Obsidian debug info
Please provide debug info for **each device involved**. The primary device (where the issue occurred) is required; others are strongly recommended. If your issue involves synchronisation between devices, debug info from relevant devices is very helpful.
To get it: open the command palette → "Show debug info".
<details>
<summary>Debug info</summary>
<summary>Device 1 (primary)</summary>
```
<!-- paste here -->
```
</details>
### Plug-in log
We can see the log by tapping the Document box icon. If you noticed something suspicious, please let me know.
Note: **Please enable `Verbose Log`**. For detail, refer to [Logging](https://docs.vrtmrz.net/LiveSync/hintandtrivia/Logging), please.
<details>
<summary>Plug-in log</summary>
<summary>Device 2 (if applicable)</summary>
```
<!-- paste here -->
```
</details>
### Network log
Network logs displayed in DevTools will possibly help with connection-related issues. To capture that, please refer to [DevTools](https://docs.vrtmrz.net/LiveSync/hintandtrivia/DevTools).
### LiveSync version
The hatch report (below) includes version information. If you cannot provide the report, please fill in the version here.
- Self-hosted LiveSync version: <!-- e.g. 0.23.0 — find it in Obsidian Settings → Community Plugins -->
### Report and Logs from LiveSync
Perform a `Generate full report for opening the issue with debug info` command and provide the generated report. This contains detailed information and recent 1000 log lines, which is very helpful for debugging. **PLEASE AMEND THE REPORT TO REMOVE ANY SENSITIVE INFORMATION BEFORE PASTING.**
If too large to paste here, upload to [Gist](https://gist.github.com/) and share the link.
<details>
<summary>Report and Logs (primary)</summary>
```
<!-- paste here or link to Gist -->
```
</details>
<details>
<summary>Report and Logs (if applicable)</summary>
```
<!-- paste here or link to Gist -->
```
</details>
---
## Optional
### Screenshots
If applicable, please add screenshots to help explain your problem.
### Other information, insights and intuition.
### Other information, insights and intuition
Please provide any additional context or information about the problem.
+157
View File
@@ -0,0 +1,157 @@
name: cli-deno-tests
on:
push:
branches:
- main
- beta
paths:
- '.github/workflows/cli-deno-tests.yml'
- 'src/apps/cli/**'
- 'src/lib/src/API/processSetting.ts'
- 'package.json'
- 'package-lock.json'
pull_request:
paths:
- '.github/workflows/cli-deno-tests.yml'
- 'src/apps/cli/**'
- 'src/lib/src/API/processSetting.ts'
- 'package.json'
- 'package-lock.json'
workflow_dispatch:
inputs:
test_task:
description: 'Deno test task to run'
type: choice
options:
- test:ci
- test:p2p
- test:all
- test:local
- test:e2e-matrix
default: test:ci
enable_debug:
description: 'Enable verbose and debug logging'
type: boolean
default: false
use_coturn:
description: 'Enable local coturn container for P2P tests'
type: boolean
default: false
permissions:
contents: read
jobs:
prepare:
runs-on: ubuntu-latest
outputs:
task_matrix: ${{ steps.select.outputs.task_matrix }}
steps:
- name: Select task matrix
id: select
shell: bash
run: |
set -euo pipefail
SELECTED_TASK="${{ github.event_name == 'workflow_dispatch' && inputs.test_task || 'test:ci' }}"
echo "[INFO] Selected task set: $SELECTED_TASK"
case "$SELECTED_TASK" in
test:ci)
TASK_MATRIX='["test:setup-put-cat","test:mirror","test:daemon","test:push-pull","test:decoupled-vault","test:sync-two-local","test:sync-locked-remote","test:remote-commands","test:e2e-matrix:couchdb-enc0","test:e2e-matrix:couchdb-enc1","test:e2e-matrix:minio-enc0","test:e2e-matrix:minio-enc1"]'
;;
test:p2p)
TASK_MATRIX='["test:p2p-host","test:p2p-peers","test:p2p-sync","test:p2p-three-nodes","test:p2p-upload-download"]'
;;
test:all)
TASK_MATRIX='["test:setup-put-cat","test:mirror","test:daemon","test:push-pull","test:decoupled-vault","test:sync-two-local","test:sync-locked-remote","test:remote-commands","test:p2p-host","test:p2p-peers","test:p2p-sync","test:p2p-three-nodes","test:p2p-upload-download","test:e2e-matrix:couchdb-enc0","test:e2e-matrix:couchdb-enc1","test:e2e-matrix:minio-enc0","test:e2e-matrix:minio-enc1"]'
;;
test:local)
TASK_MATRIX='["test:setup-put-cat","test:mirror","test:daemon"]'
;;
test:e2e-matrix)
TASK_MATRIX='["test:e2e-matrix:couchdb-enc0","test:e2e-matrix:couchdb-enc1","test:e2e-matrix:minio-enc0","test:e2e-matrix:minio-enc1"]'
;;
*)
echo "[ERROR] Unknown task set: $SELECTED_TASK" >&2
exit 1
;;
esac
echo "task_matrix=$TASK_MATRIX" >> "$GITHUB_OUTPUT"
test:
needs: prepare
runs-on: ubuntu-latest
timeout-minutes: 60
env:
DENO_DIR: ~/.cache/deno
strategy:
fail-fast: false
matrix:
task: ${{ fromJson(needs.prepare.outputs.task_matrix) }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '24.x'
cache: 'npm'
cache-dependency-path: package-lock.json
- name: Setup Deno
uses: denoland/setup-deno@v2
with:
deno-version: v2.x
- name: Cache Deno dependencies
uses: actions/cache@v4
with:
path: ~/.cache/deno
key: ${{ runner.os }}-deno-${{ hashFiles('src/apps/cli/testdeno/deno.lock', 'src/apps/cli/testdeno/deno.json') }}
restore-keys: |
${{ runner.os }}-deno-
- name: Install dependencies
run: npm ci
- name: Build CLI
working-directory: src/apps/cli
run: npm run build
- name: Create .test.env
working-directory: src/apps/cli
run: |
cat <<EOF > .test.env
hostname=http://127.0.0.1:5989/
dbname=livesync-test-db-ci
username=admin
password=testpassword
minioEndpoint=http://127.0.0.1:9000
accessKey=minioadmin
secretKey=minioadmin
bucketName=livesync-test-bucket-ci
EOF
- name: Run Deno tests
working-directory: src/apps/cli/testdeno
env:
LIVESYNC_DOCKER_MODE: native
LIVESYNC_CLI_RETRY: 3
LIVESYNC_CLI_DEBUG: ${{ inputs.enable_debug == true && '1' || '0' }}
LIVESYNC_CLI_VERBOSE: ${{ inputs.enable_debug == true && '1' || '0' }}
LIVESYNC_USE_COTURN: ${{ inputs.use_coturn == true && '1' || '0' }}
run: |
TASK="${{ matrix.task }}"
echo "[INFO] Running Deno task: $TASK"
deno task "$TASK"
- name: Stop leftover containers
if: always()
run: |
docker stop couchdb-test minio-test relay-test coturn-test >/dev/null 2>&1 || true
docker rm couchdb-test minio-test relay-test coturn-test >/dev/null 2>&1 || true
+101
View File
@@ -0,0 +1,101 @@
# Build and push the CLI Docker image to GitHub Container Registry (GHCR).#
# Image tag format: <manifest-version>-<unix-epoch>-cli
# Example: 0.25.56-1743500000-cli
#
# The image is also tagged 'latest' for convenience.
# Image name: ghcr.io/<owner>/livesync-cli
name: Build and Push CLI Docker Image
on:
push:
tags:
- "*.*.*-cli"
workflow_dispatch:
inputs:
dry_run:
description: Build only (do not push image to GHCR)
required: false
type: boolean
default: true
force:
description: Continue to build/push even if CLI E2E fails (workflow_dispatch only)
required: false
type: boolean
default: false
jobs:
build-and-push:
runs-on: ubuntu-latest
timeout-minutes: 90
permissions:
contents: read
packages: write
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Derive image tag
id: meta
run: |
VERSION=$(jq -r '.version' manifest.json)
EPOCH=$(date +%s)
TAG="${VERSION}-${EPOCH}-cli"
IMAGE="ghcr.io/${{ github.repository_owner }}/livesync-cli"
echo "tag=${TAG}" >> $GITHUB_OUTPUT
echo "image=${IMAGE}" >> $GITHUB_OUTPUT
echo "full=${IMAGE}:${TAG}" >> $GITHUB_OUTPUT
echo "version=${IMAGE}:${VERSION}-cli" >> $GITHUB_OUTPUT
echo "latest=${IMAGE}:latest" >> $GITHUB_OUTPUT
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "24.x"
cache: "npm"
- name: Install dependencies
run: npm ci
- name: Run CLI E2E (docker)
id: e2e
continue-on-error: ${{ github.event_name == 'workflow_dispatch' && inputs.force }}
working-directory: src/apps/cli
env:
CI: true
run: npm run test:e2e:docker:all
- name: Stop test containers (safety net)
if: always()
working-directory: src/apps/cli
run: |
# Keep this as a safety net for future suites/steps that may leave containers running.
bash ./util/couchdb-stop.sh >/dev/null 2>&1 || true
bash ./util/minio-stop.sh >/dev/null 2>&1 || true
bash ./util/p2p-stop.sh >/dev/null 2>&1 || true
- name: Build and push
if: ${{ steps.e2e.outcome == 'success' || (github.event_name == 'workflow_dispatch' && inputs.force) }}
uses: docker/build-push-action@v6
with:
context: .
file: src/apps/cli/Dockerfile
push: ${{ !(github.event_name == 'workflow_dispatch' && inputs.dry_run) }}
tags: |
${{ steps.meta.outputs.full }}
${{ steps.meta.outputs.version }}
${{ steps.meta.outputs.latest }}
cache-from: type=gha
cache-to: type=gha,mode=max
+67
View File
@@ -0,0 +1,67 @@
# Run CLI E2E tests
name: cli-e2e
on:
workflow_dispatch:
inputs:
suite:
description: 'CLI E2E suite to run'
type: choice
options:
- two-vaults-matrix
- two-vaults-couchdb
- two-vaults-minio
default: two-vaults-matrix
permissions:
contents: read
jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '24.x'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run CLI E2E suite
working-directory: src/apps/cli
env:
CI: true
TEST_SUITE: ${{ github.event_name == 'workflow_dispatch' && inputs.suite || 'two-vaults-matrix' }}
run: |
set -euo pipefail
echo "[INFO] Running CLI E2E suite: $TEST_SUITE"
case "$TEST_SUITE" in
two-vaults-matrix)
npm run test:e2e:two-vaults:matrix
;;
two-vaults-couchdb)
REMOTE_TYPE=COUCHDB ENCRYPT=0 npm run test:e2e:two-vaults
;;
two-vaults-minio)
REMOTE_TYPE=MINIO ENCRYPT=0 npm run test:e2e:two-vaults
;;
*)
echo "[ERROR] Unknown suite: $TEST_SUITE" >&2
exit 1
;;
esac
- name: Stop test containers
if: always()
working-directory: src/apps/cli
run: |
bash ./util/couchdb-stop.sh >/dev/null 2>&1 || true
bash ./util/minio-stop.sh >/dev/null 2>&1 || true
+1 -1
View File
@@ -56,7 +56,7 @@ jobs:
if: ${{ inputs.testsuite == '' || inputs.testsuite == 'suitep2p/' }}
env:
CI: true
run: npm run test suitep2p/
run: npm run test:p2p
- name: Stop test services (CouchDB)
run: npm run test:docker-couchdb:stop
if: ${{ inputs.testsuite == '' || inputs.testsuite == 'suite/' }}
+12 -56
View File
@@ -9,6 +9,10 @@ on:
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: write
id-token: write
attestations: write
steps:
- uses: actions/checkout@v4
with:
@@ -29,68 +33,20 @@ jobs:
run: |
npm ci
npm run build --if-present
# Attest
- name: Attest Plugin Artifacts
uses: actions/attest-build-provenance@v4
with:
subject-path: |
main.js
manifest.json
styles.css
# Package the required files into a zip
- name: Package
run: |
mkdir ${{ github.event.repository.name }}
cp main.js manifest.json styles.css README.md ${{ github.event.repository.name }}
zip -r ${{ github.event.repository.name }}.zip ${{ github.event.repository.name }}
# Create the release on github
# - name: Create Release
# id: create_release
# uses: actions/create-release@v1
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# VERSION: ${{ steps.version.outputs.tag }}
# with:
# tag_name: ${{ steps.version.outputs.tag }}
# release_name: ${{ steps.version.outputs.tag }}
# draft: true
# prerelease: false
# # Upload the packaged release file
# - name: Upload zip file
# id: upload-zip
# uses: actions/upload-release-asset@v1
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# with:
# upload_url: ${{ steps.create_release.outputs.upload_url }}
# asset_path: ./${{ github.event.repository.name }}.zip
# asset_name: ${{ github.event.repository.name }}-${{ steps.version.outputs.tag }}.zip
# asset_content_type: application/zip
# # Upload the main.js
# - name: Upload main.js
# id: upload-main
# uses: actions/upload-release-asset@v1
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# with:
# upload_url: ${{ steps.create_release.outputs.upload_url }}
# asset_path: ./main.js
# asset_name: main.js
# asset_content_type: text/javascript
# # Upload the manifest.json
# - name: Upload manifest.json
# id: upload-manifest
# uses: actions/upload-release-asset@v1
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# with:
# upload_url: ${{ steps.create_release.outputs.upload_url }}
# asset_path: ./manifest.json
# asset_name: manifest.json
# asset_content_type: application/json
# # Upload the style.css
# - name: Upload styles.css
# id: upload-css
# uses: actions/upload-release-asset@v1
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# with:
# upload_url: ${{ steps.create_release.outputs.upload_url }}
# asset_path: ./styles.css
# asset_name: styles.css
# asset_content_type: text/css
- name: Create Release and Upload Assets
uses: softprops/action-gh-release@v2
with:
+35 -4
View File
@@ -7,6 +7,29 @@ on:
branches:
- main
- beta
paths:
- 'src/**'
- 'test/**'
- 'package.json'
- 'package-lock.json'
- 'tsconfig.json'
- 'vite.config.ts'
- 'vitest.config*.ts'
- 'esbuild.config.mjs'
- 'eslint.config.mjs'
- '.github/workflows/unit-ci.yml'
pull_request:
paths:
- 'src/**'
- 'test/**'
- 'package.json'
- 'package-lock.json'
- 'tsconfig.json'
- 'vite.config.ts'
- 'vitest.config*.ts'
- 'esbuild.config.mjs'
- 'eslint.config.mjs'
- '.github/workflows/unit-ci.yml'
permissions:
contents: read
@@ -30,8 +53,16 @@ jobs:
- name: Install dependencies
run: npm ci
- name: Install test dependencies (Playwright Chromium)
run: npm run test:install-dependencies
# unit tests do not require Playwright, so we can skip installing its dependencies to save time
# - name: Install test dependencies (Playwright Chromium)
# run: npm run test:install-dependencies
- name: Run unit tests suite
run: npm run test:unit
- name: Run unit tests suite with coverage
run: npm run test:unit:coverage
- name: Upload coverage report
if: always()
uses: actions/upload-artifact@v4
with:
name: coverage-report
path: coverage/**
+5 -1
View File
@@ -27,4 +27,8 @@ data.json
cov_profile/**
coverage
coverage
src/apps/cli/dist/*
_testdata/**
utils/bench/splitResults.csv
.eslintcache
+1 -1
View File
@@ -13,7 +13,7 @@ const prettierConfig = {
tabWidth: 4,
printWidth: 120,
semi: true,
endOfLine: "cr",
endOfLine: "lf",
...localPrettierConfig,
};
+68
View File
@@ -0,0 +1,68 @@
# AI Coding Assistant Instructions (AGENTS.md)
When working on this repository (writing code, comments, documentation, or commits), you MUST follow these guidelines to maintain consistency.
## Required Reference Files
Before making changes to documentation, user-facing text, or settings:
1. Read [docs/terms.md](file:///Users/vorotamoroz/dev/js/obsidian-livesync/docs/terms.md) for terminology, vocabulary conventions, and technical definitions.
2. Read [docs/settings.md](file:///Users/vorotamoroz/dev/js/obsidian-livesync/docs/settings.md) (and [docs/settings_ja.md](file:///Users/vorotamoroz/dev/js/obsidian-livesync/docs/settings_ja.md)) for UI settings and setting key mappings.
3. Read [docs/troubleshooting.md](file:///Users/vorotamoroz/dev/js/obsidian-livesync/docs/troubleshooting.md) for troubleshooting guidelines and common recovery steps (such as flag files and SCRAM state).
4. Read [devs.md](file:///Users/vorotamoroz/dev/js/obsidian-livesync/devs.md) for development workflows, module architecture, and testing infrastructure.
---
## Documentation and User-Facing Text Rules
Always adhere to the following stylistic and spelling rules:
1. **British English Spelling**:
- Write all documentation and user-facing messages in British English. If in doubt, the BBC News Styleguide may be useful as a reference.
- **Traditional Spelling (Trad-spelling)**: Use `-ise` and `-isation` suffixes instead of `-ize` and `-ization` (for example: 'initialisation', 'synchronisation', and 'organisation').
- **Oxford Comma**: Use the serial (Oxford) comma to separate items in lists of three or more (for example: 'settings, snippets, and themes' instead of 'settings, snippets and themes').
- **Logical Punctuation**: Place punctuation marks (such as commas and full stops) outside quotation marks unless they are part of the quoted text itself (for example: write 'dialogue', not 'dialogue,').
2. **No Contractions**:
- Do not use contractions in general text or documentation (for example: write "do not" instead of "don't", "cannot" instead of "can't", and "is not" instead of "isn't").
3. **Quotation Style**:
- Prefer single quotation marks (`'`) over double quotation marks (`"`) in general documentation text, unless the context requires double quotes (for example, inside JSON code blocks).
4. **Specific Terminology and Spelling**:
- Use **'dialogue'** in documentation, user-facing messages, and general text. Use **'dialog'** only inside source code (e.g. class names, methods).
- Use the hyphenated form **'plug-in'** in user-facing text. Use **'plugin'** only in codebase files, configuration settings, or technical contexts.
5. **User Communication Language**:
- Always reply to the user in the language in which they asked the question.
---
## Technical & Architecture Rules
1. **Database Structure**:
- Remember that Self-hosted LiveSync splits files into **Metadata** (file properties, size, paths) and **Chunks** (actual content). Do not store raw content in the metadata document directly.
2. **Setup and Recovery**:
- **Fast Setup (Simple Fetch)** is the preferred flow for initial replication on secondary devices. It utilises stream-based replication for high speed and delays local file reflection to suppress temporary synchronisation warnings.
- **Flag files** (such as `redflag.md`, `redflag2.md`, and `redflag3.md`) at the root of the vault control the boot-up sequence and trigger automated fetch/rebuild tasks.
3. **Subrepositories**:
- The directory [src/lib](file:///Users/vorotamoroz/dev/js/obsidian-livesync/src/lib) is a subrepository (Git submodule) pointing to the shared library `livesync-commonlib`. Do not make modifications inside this directory without careful consideration, as changes affect the shared library.
4. **Application Directories**:
- The directory [src/apps](file:///Users/vorotamoroz/dev/js/obsidian-livesync/src/apps) contains independent application modules:
- `cli`: A Command Line Interface application. Tests specifically for the CLI (both unit and End-to-End tests) are located and executed within [src/apps/cli](file:///Users/vorotamoroz/dev/js/obsidian-livesync/src/apps/cli) using its local `package.json` scripts.
- `webapp`: A Web-based application.
- `webpeer`: A Web-based peer utility.
---
## Development & Verification Commands
Before submitting code, you should run verification scripts locally to ensure correct syntax and function.
1. **Lint and Type Checking**:
- Run `npm run check` to perform code verification. This runs type-checking (`tsc-check`), ESLint (`lint`), and Svelte checks (`svelte-check`).
2. **Unit Tests**:
- Run `npm run test:unit` to execute fast local unit tests.
- Run `npm run test` or `npm run test:full` for full testing suites (including dockerised services).
3. **Build**:
- Run `npm run build` to compile the production bundle (`main.js`).
- Run `npm run dev` for the development watch/build task.
+26 -25
View File
@@ -4,7 +4,7 @@
Self-hosted LiveSync is a community-developed synchronisation plug-in available on all Obsidian-compatible platforms. It leverages robust server solutions such as CouchDB or object storage systems (e.g., MinIO, S3, R2, etc.) to ensure reliable data synchronisation.
Additionally, it supports peer-to-peer synchronisation using WebRTC now (experimental), enabling you to synchronise your notes directly between devices without relying on a server.
Additionally, it supports peer-to-peer synchronisation using WebRTC, enabling you to synchronise your notes directly between devices without relying on a server. Documentation is available for [Peer-to-Peer Synchronisation](./docs/p2p_sync_updates_2026.md).
![obsidian_live_sync_demo](https://user-images.githubusercontent.com/45774780/137355323-f57a8b09-abf2-4501-836c-8cb7d2ff24a3.gif)
@@ -24,18 +24,18 @@ Additionally, it supports peer-to-peer synchronisation using WebRTC now (experim
- WebRTC is a peer-to-peer synchronisation method, so **at least one device must be online to synchronise**.
- Instead of keeping your device online as a stable peer, you can use two pseudo-peers:
- [livesync-serverpeer](https://github.com/vrtmrz/livesync-serverpeer): A pseudo-client running on the server for receiving and sending data between devices.
- [webpeer](https://github.com/vrtmrz/livesync-commonlib/tree/main/apps/webpeer): A pseudo-client for receiving and sending data between devices.
- A pre-built instance is available at [fancy-syncing.vrtmrz.net/webpeer](https://fancy-syncing.vrtmrz.net/webpeer/) (hosted on the vrtmrz blog site). This is also peer-to-peer. Feel free to use it.
- [webpeer](https://github.com/vrtmrz/obsidian-livesync/tree/main/src/apps/webpeer): A pseudo-client for receiving and sending data between devices.
- A pre-built instance is available at [fancy-syncing.vrtmrz.net/webpeer](https://fancy-syncing.vrtmrz.net/webpeer/) (hosted on the vrtmrz's blog site). This is also peer-to-peer. Feel free to use it.
- For more information, refer to the [English explanatory article](https://fancy-syncing.vrtmrz.net/blog/0034-p2p-sync-en.html) or the [Japanese explanatory article](https://fancy-syncing.vrtmrz.net/blog/0034-p2p-sync).
This plug-in may be particularly useful for researchers, engineers, and developers who need to keep their notes fully self-hosted for security reasons. It is also suitable for anyone seeking the peace of mind that comes with knowing their notes remain entirely private.
>[!IMPORTANT]
> - Before installing or upgrading this plug-in, please back up your vault.
> - Do not enable this plug-in alongside another synchronisation solution at the same time (including iCloud and Obsidian Sync).
> - Do not enable this plug-in alongside another synchronisation solution (including iCloud and Obsidian Sync).
> - For backups, we also provide a plug-in called [Differential ZIP Backup](https://github.com/vrtmrz/diffzip).
## How to use
## How to Use
### 3-minute setup - CouchDB on fly.io
@@ -43,54 +43,55 @@ This plug-in may be particularly useful for researchers, engineers, and develope
[![LiveSync Setup onto Fly.io SpeedRun 2024 using Google Colab](https://img.youtube.com/vi/7sa_I1832Xc/0.jpg)](https://www.youtube.com/watch?v=7sa_I1832Xc)
1. [Setup CouchDB on fly.io](docs/setup_flyio.md)
1. [Set up CouchDB on fly.io](docs/setup_flyio.md)
2. Configure plug-in in [Quick Setup](docs/quick_setup.md)
### Manually Setup
### Manual Setup
1. Setup the server
1. [Setup CouchDB on fly.io](docs/setup_flyio.md)
2. [Setup your CouchDB](docs/setup_own_server.md)
1. Set up the server
1. [Set up CouchDB on fly.io](docs/setup_flyio.md)
2. [Set up your CouchDB](docs/setup_own_server.md)
2. Configure plug-in in [Quick Setup](docs/quick_setup.md)
> [!TIP]
> Fly.io is no longer free. Fortunately, despite some issues, we can still use IBM Cloudant. Refer to [Setup IBM Cloudant](docs/setup_cloudant.md).
> And also, we can use peer-to-peer synchronisation without a server. Or very cheap Object Storage -- Cloudflare R2 can be used for free.
> HOWEVER, most importantly, we can use the server that we trust. Therefore, please set up your own server.
> CouchDB can be run on a Raspberry Pi. (But please be careful about the security of your server).
> Fly.io is no longer free. Fortunately, we can still use IBM Cloudant despite some limitations. Refer to [Set up IBM Cloudant](docs/setup_cloudant.md).
> We can also use peer-to-peer synchronisation without a server. Alternatively, cheap object storage like Cloudflare R2 can be used for free.
> However, most importantly, we can use a server that we trust. Therefore, please set up your own server.
> CouchDB can also be run on a Raspberry Pi (please be mindful of your server's security).
## Information in StatusBar
## Information in the Status Bar
Synchronization status is shown in the status bar with the following icons.
Synchronisation status is shown in the status bar with the following icons.
- Activity Indicator
- 📲 Network request
- Status
- ⏹️ Stopped
- 💤 LiveSync enabled. Waiting for changes
- ⚡️ Synchronization in progress
- ⚡️ Synchronisation in progress
- ⚠ An error occurred
- Statistical indicator
- Statistical Indicators
- ↑ Uploaded chunks and metadata
- ↓ Downloaded chunks and metadata
- Progress indicator
- Progress Indicators
- 📥 Unprocessed transferred items
- 📄 Working database operation
- 💾 Working write storage processes
- ⏳ Working read storage processes
- 🛫 Pending read storage processes
- 📬 Batched read storage processes
- ⚙️ Working or pending storage processes of hidden files
- ⚙️ Working or pending storage processes for hidden files
- 🧩 Waiting chunks
- 🔌 Working Customisation items (Configuration, snippets, and plug-ins)
- 🔌 Working customisation items (configuration, snippets, and plug-ins)
To prevent file and database corruption, please wait to stop Obsidian until all progress indicators have disappeared as possible (The plugin will also try to resume, though). Especially in case of if you have deleted or renamed files.
To prevent file and database corruption, please avoid closing Obsidian until all progress indicators have disappeared as much as possible (although the plug-in will attempt to resume if interrupted). This is especially important if you have deleted or renamed files.
## Tips and Troubleshooting
If you are having problems getting the plugin working see: [Tips and Troubleshooting](docs/troubleshooting.md).
- If you want a faster and simpler initial replication when setting up subsequent devices, see the [Fast Setup Guide](docs/tips/fast-setup.md).
- If you are having problems getting the plug-in working, see [Tips and Troubleshooting](docs/troubleshooting.md).
## Acknowledgements
The project has been in continual progress and harmony thanks to:
The project has been in continual progress and harmony thanks to the following:
- Many [Contributors](https://github.com/vrtmrz/obsidian-livesync/graphs/contributors).
- Many [GitHub Sponsors](https://github.com/sponsors/vrtmrz#sponsors).
- JetBrains Community Programs / Support for Open-Source Projects. <img src="https://resources.jetbrains.com/storage/products/company/brand/logos/jetbrains.png" alt="JetBrains logo" height="24">
@@ -98,7 +99,7 @@ The project has been in continual progress and harmony thanks to:
May those who have contributed be honoured and remembered for their kindness and generosity.
## Development Guide
Please refer to [Development Guide](devs.md) for development setup, testing infrastructure, code conventions, and more.
Please refer to the [Development Guide](devs.md) for development setup, testing infrastructure, code conventions, and more.
## License
+2 -1
View File
@@ -78,7 +78,8 @@ NDAや類似の契約や義務、倫理を守る必要のある、研究者、
## Tips and Troubleshooting
何かこまったら、[Tips and Troubleshooting](docs/troubleshooting.md)をご参照ください。
- 2台目以降のセットアップ時に、初期同期をより迅速かつ簡単に行うには、[ファストセットアップガイド](docs/tips/fast-setup_ja.md)をご参照ください。
- 何かこまったら、[Tips and Troubleshooting](docs/troubleshooting.md)をご参照ください。
## License
+134
View File
@@ -0,0 +1,134 @@
import type { SimpleStore } from "octagonal-wheels/databases/SimpleStoreBase";
import type { HasSettings, ObsidianLiveSyncSettings } from "@lib/common/models/setting.type";
import type { EntryDoc } from "@lib/common/models/db.definition";
import type { Confirm } from "@lib/interfaces/Confirm";
import type { DatabaseFileAccess } from "@lib/interfaces/DatabaseFileAccess";
import type { Rebuilder } from "@lib/interfaces/DatabaseRebuilder";
import type { IFileHandler } from "@lib/interfaces/FileHandler";
import type { StorageAccess } from "@lib/interfaces/StorageAccess";
import type { LiveSyncLocalDBEnv } from "@lib/pouchdb/LiveSyncLocalDB";
import type { LiveSyncCouchDBReplicatorEnv } from "@lib/replication/couchdb/LiveSyncReplicator";
import type { CheckPointInfo } from "@lib/replication/journal/JournalSyncTypes";
import type { LiveSyncJournalReplicatorEnv } from "@lib/replication/journal/LiveSyncJournalReplicatorEnv";
import type { LiveSyncReplicatorEnv } from "@lib/replication/LiveSyncAbstractReplicator";
import type { ServiceContext } from "@lib/services/base/ServiceBase";
import type { InjectableServiceHub } from "@lib/services/InjectableServices";
import { AbstractModule } from "./modules/AbstractModule";
import type { ServiceModules } from "@lib/interfaces/ServiceModule";
export declare class LiveSyncBaseCore<T extends ServiceContext = ServiceContext, TCommands extends IMinimumLiveSyncCommands = IMinimumLiveSyncCommands> implements LiveSyncLocalDBEnv, LiveSyncReplicatorEnv, LiveSyncJournalReplicatorEnv, LiveSyncCouchDBReplicatorEnv, HasSettings<ObsidianLiveSyncSettings> {
addOns: TCommands[];
/**
* register an add-onn to the plug-in.
* Add-ons are features that are not essential to the core functionality of the plugin,
* @param addOn
*/
private _registerAddOn;
/**
* Get an add-on by its class name. Returns undefined if not found.
* @param cls
* @returns
*/
getAddOn<T extends TCommands>(cls: string): T | undefined;
constructor(serviceHub: InjectableServiceHub<T>, serviceModuleInitialiser: (core: LiveSyncBaseCore<T, TCommands>, serviceHub: InjectableServiceHub<T>) => ServiceModules, extraModuleInitialiser: (core: LiveSyncBaseCore<T, TCommands>) => AbstractModule[], addOnsInitialiser: (core: LiveSyncBaseCore<T, TCommands>) => TCommands[], featuresInitialiser: (core: LiveSyncBaseCore<T, TCommands>) => void);
/**
* The service hub for managing all services.
*/
_services: InjectableServiceHub<T> | undefined;
get services(): InjectableServiceHub<T>;
/**
* Service Modules
*/
protected _serviceModules: ServiceModules;
get serviceModules(): ServiceModules;
/**
* The modules of the plug-in. Modules are responsible for specific features or functionalities of the plug-in, such as file handling, conflict resolution, replication, etc.
*/
private modules;
/**
* Get a module by its class. Throws an error if not found.
* Mostly used for getting SetupManager.
* @param constructor
* @returns
*/
getModule<T extends AbstractModule>(constructor: new (...args: any[]) => T): T;
/**
* Register a module to the plug-in.
* @param module The module to register.
*/
private _registerModule;
registerModules(extraModules?: AbstractModule[]): void;
/**
* Bind module functions to services.
*/
bindModuleFunctions(): void;
/**
* @obsolete Use services.UI.confirm instead. The confirm function to show a confirmation dialog to the user.
*/
get confirm(): Confirm;
/**
* @obsolete Use services.setting.currentSettings instead. The current settings of the plug-in.
*/
get settings(): ObsidianLiveSyncSettings;
/**
* @obsolete Use services.setting.settings instead. Set the settings of the plug-in.
*/
set settings(value: ObsidianLiveSyncSettings);
/**
* @obsolete Use services.setting.currentSettings instead. Get the settings of the plug-in.
* @returns The current settings of the plug-in.
*/
getSettings(): ObsidianLiveSyncSettings;
/**
* @obsolete Use services.database.localDatabase instead. The local database instance.
*/
get localDatabase(): import("@lib/pouchdb/LiveSyncLocalDB").LiveSyncLocalDB;
/**
* @obsolete Use services.database.localDatabase instead. Get the PouchDB database instance. Note that this is not the same as the local database instance, which is a wrapper around the PouchDB database.
* @returns The PouchDB database instance.
*/
getDatabase(): PouchDB.Database<EntryDoc>;
/**
* @obsolete Use services.keyValueDB.simpleStore instead. A simple key-value store for storing non-file data, such as checkpoints, sync status, etc.
*/
get simpleStore(): SimpleStore<CheckPointInfo>;
/**
* @obsolete Use services.replication.getActiveReplicator instead. Get the active replicator instance. Note that there can be multiple replicators, but only one can be active at a time.
*/
get replicator(): import("@lib/replication/LiveSyncAbstractReplicator").LiveSyncAbstractReplicator;
/**
* @obsolete Use services.keyValueDB.kvDB instead. Get the key-value database instance. This is used for storing large data that cannot be stored in the simple store, such as file metadata, etc.
*/
get kvDB(): import("./lib/src/interfaces/KeyValueDatabase").KeyValueDatabase;
/**
* Storage Accessor for handling file operations.
* @obsolete Use serviceModules.storageAccess instead.
*/
get storageAccess(): StorageAccess;
/**
* Database File Accessor for handling file operations related to the database, such as exporting the database, importing from a file, etc.
* @obsolete Use serviceModules.databaseFileAccess instead.
*/
get databaseFileAccess(): DatabaseFileAccess;
/**
* File Handler for handling file operations related to replication, such as resolving conflicts, applying changes from replication, etc.
* @obsolete Use serviceModules.fileHandler instead.
*/
get fileHandler(): IFileHandler;
/**
* Rebuilder for handling database rebuilding operations.
* @obsolete Use serviceModules.rebuilder instead.
*/
get rebuilder(): Rebuilder;
/**
* Initialise ServiceFeatures.
* (Please refer `serviceFeatures` for more details)
*/
initialiseServiceFeatures(): void;
}
export interface IMinimumLiveSyncCommands {
onunload(): void;
onload(): void | Promise<void>;
constructor: {
name: string;
};
}
+3
View File
@@ -0,0 +1,3 @@
import type { KeyValueDatabase } from "@lib/interfaces/KeyValueDatabase.ts";
export { OpenKeyValueDatabase } from "./KeyValueDBv2.ts";
export declare const _OpenKeyValueDatabase: (dbKey: string) => Promise<KeyValueDatabase>;
+24
View File
@@ -0,0 +1,24 @@
import type { KeyValueDatabase } from "@lib/interfaces/KeyValueDatabase";
import { type IDBPDatabase } from "idb";
export declare function OpenKeyValueDatabase(dbKey: string): Promise<KeyValueDatabase>;
export declare class IDBKeyValueDatabase implements KeyValueDatabase {
protected _dbPromise: Promise<IDBPDatabase<unknown>> | null;
protected dbKey: string;
protected storeKey: string;
protected _isDestroyed: boolean;
protected destroyedPromise: Promise<void> | null;
get isDestroyed(): boolean;
get ensuredDestroyed(): Promise<void>;
getIsReady(): Promise<boolean>;
protected ensureDB(): Promise<IDBPDatabase<unknown>>;
protected closeDB(setDestroyed?: boolean): Promise<void>;
get DB(): Promise<IDBPDatabase<unknown>>;
constructor(dbKey: string);
get<U>(key: IDBValidKey): Promise<U>;
set<U>(key: IDBValidKey, value: U): Promise<IDBValidKey>;
del(key: IDBValidKey): Promise<void>;
clear(): Promise<void>;
keys(query?: IDBValidKey | IDBKeyRange, count?: number): Promise<IDBValidKey[]>;
close(): Promise<void>;
destroy(): Promise<void>;
}
+12
View File
@@ -0,0 +1,12 @@
import type { NecessaryServices } from "@lib/interfaces/ServiceModule";
type PeriodicProcessorHost = NecessaryServices<"API" | "control", never>;
export declare class PeriodicProcessor {
_process: () => Promise<unknown>;
_timer?: number;
_core: PeriodicProcessorHost;
constructor(core: PeriodicProcessorHost, process: () => Promise<unknown>);
process(): Promise<void>;
enable(interval: number): void;
disable(): void;
}
export {};
+9
View File
@@ -0,0 +1,9 @@
import { ItemView } from "@/deps.ts";
import { type mount } from "svelte";
export declare abstract class SvelteItemView extends ItemView {
abstract instantiateComponent(target: HTMLElement): ReturnType<typeof mount> | Promise<ReturnType<typeof mount>>;
component?: ReturnType<typeof mount>;
onOpen(): Promise<void>;
_dismountComponent(): Promise<void>;
onClose(): Promise<void>;
}
+36
View File
@@ -0,0 +1,36 @@
import { eventHub } from "@lib/hub/hub";
export declare const EVENT_PLUGIN_LOADED = "plugin-loaded";
export declare const EVENT_PLUGIN_UNLOADED = "plugin-unloaded";
export declare const EVENT_FILE_SAVED = "file-saved";
export declare const EVENT_LEAF_ACTIVE_CHANGED = "leaf-active-changed";
export declare const EVENT_REQUEST_OPEN_SETTINGS = "request-open-settings";
export declare const EVENT_REQUEST_OPEN_SETTING_WIZARD = "request-open-setting-wizard";
export declare const EVENT_REQUEST_OPEN_SETUP_URI = "request-open-setup-uri";
export declare const EVENT_REQUEST_COPY_SETUP_URI = "request-copy-setup-uri";
export declare const EVENT_REQUEST_SHOW_SETUP_QR = "request-show-setup-qr";
export declare const EVENT_REQUEST_RELOAD_SETTING_TAB = "reload-setting-tab";
export declare const EVENT_REQUEST_OPEN_PLUGIN_SYNC_DIALOG = "request-open-plugin-sync-dialog";
export declare const EVENT_REQUEST_RUN_DOCTOR = "request-run-doctor";
export declare const EVENT_REQUEST_RUN_FIX_INCOMPLETE = "request-run-fix-incomplete";
export declare const EVENT_ANALYSE_DB_USAGE = "analyse-db-usage";
export declare const EVENT_REQUEST_PERFORM_GC_V3 = "request-perform-gc-v3";
declare global {
interface LSEvents {
[EVENT_PLUGIN_LOADED]: undefined;
[EVENT_PLUGIN_UNLOADED]: undefined;
[EVENT_REQUEST_OPEN_PLUGIN_SYNC_DIALOG]: undefined;
[EVENT_REQUEST_OPEN_SETTINGS]: undefined;
[EVENT_REQUEST_OPEN_SETTING_WIZARD]: undefined;
[EVENT_REQUEST_RELOAD_SETTING_TAB]: undefined;
[EVENT_LEAF_ACTIVE_CHANGED]: undefined;
[EVENT_REQUEST_OPEN_SETUP_URI]: undefined;
[EVENT_REQUEST_COPY_SETUP_URI]: undefined;
[EVENT_REQUEST_SHOW_SETUP_QR]: undefined;
[EVENT_REQUEST_RUN_DOCTOR]: string;
[EVENT_REQUEST_RUN_FIX_INCOMPLETE]: undefined;
[EVENT_ANALYSE_DB_USAGE]: undefined;
[EVENT_REQUEST_PERFORM_GC_V3]: undefined;
}
}
export * from "@lib/events/coreEvents.ts";
export { eventHub };
+14
View File
@@ -0,0 +1,14 @@
import type { TFile } from "@/deps";
import type { FilePathWithPrefix, LoadedEntry } from "@lib/common/models/db.type";
export declare const EVENT_REQUEST_SHOW_HISTORY = "show-history";
declare global {
interface LSEvents {
[EVENT_REQUEST_SHOW_HISTORY]: {
file: TFile;
fileOnDB: LoadedEntry;
} | {
file: FilePathWithPrefix;
fileOnDB: LoadedEntry;
};
}
}
+12
View File
@@ -0,0 +1,12 @@
import type { ObsidianLiveSyncSettings } from "@lib/common/models/setting.type";
import type { LiveSyncBaseCore } from "@/LiveSyncBaseCore";
export declare function generateReport(settings: ObsidianLiveSyncSettings, core: LiveSyncBaseCore): Promise<{
obsidianInfo: {
navigator: string;
fileSystem: string;
};
responseConfig: Record<string, unknown>;
pluginConfig: ObsidianLiveSyncSettings;
manifestVersion: string;
packageVersion: string;
}>;
+3
View File
@@ -0,0 +1,3 @@
import { PersistentMap } from "octagonal-wheels/dataobject/PersistentMap";
export declare let sameChangePairs: PersistentMap<number[]>;
export declare function initializeStores(vaultName: string): void;
+47
View File
@@ -0,0 +1,47 @@
import { type PluginManifest, TFile } from "@/deps.ts";
import type { DatabaseEntry, FilePath } from "@lib/common/models/db.type";
import type { EntryBody } from "@lib/common/models/db.definition";
export type { CacheData, FileEventItem } from "@lib/common/types.ts";
export interface PluginDataEntry extends DatabaseEntry {
deviceVaultName: string;
mtime: number;
manifest: PluginManifest;
mainJs: string;
manifestJson: string;
styleCss?: string;
dataJson?: string;
_conflicts?: string[];
type: "plugin";
}
export interface PluginList {
[key: string]: PluginDataEntry[];
}
export interface DevicePluginList {
[key: string]: PluginDataEntry;
}
export declare const PERIODIC_PLUGIN_SWEEP = 60;
export interface InternalFileInfo {
path: FilePath;
mtime: number;
ctime: number;
size: number;
deleted?: boolean;
}
export interface FileInfo {
path: FilePath;
mtime: number;
ctime: number;
size: number;
deleted?: boolean;
file: TFile;
}
export type queueItem = {
entry: EntryBody;
missingChildren: string[];
timeout?: number;
done?: boolean;
warned?: boolean;
};
export declare const FileWatchEventQueueMax = 10;
export { configURIBase, configURIBaseQR } from "@lib/common/types.ts";
export { CHeader, PSCHeader, PSCHeaderEnd, ICHeader, ICHeaderEnd, ICHeaderLength, ICXHeader, } from "@lib/common/models/fileaccess.const.ts";
+61
View File
@@ -0,0 +1,61 @@
import { TAbstractFile } from "@/deps.ts";
import type { AnyEntry, DocumentID, EntryHasPath, FilePath, FilePathWithPrefix } from "@lib/common/models/db.type";
import type { CouchDBCredentials } from "@lib/common/models/auth.type";
import type { UXFileInfo, UXFileInfoStub } from "@lib/common/models/fileaccess.type";
export { ICHeader, ICXHeader } from "./types.ts";
import type { KeyValueDatabase } from "@lib/interfaces/KeyValueDatabase.ts";
export { scheduleTask, cancelTask, cancelAllTasks } from "octagonal-wheels/concurrency/task";
export declare function path2id(filename: FilePathWithPrefix | FilePath, obfuscatePassphrase: string | false, caseInsensitive: boolean): Promise<DocumentID>;
export declare function id2path(id: DocumentID, entry?: EntryHasPath): FilePathWithPrefix;
export declare function getPathFromTFile(file: TAbstractFile): FilePath;
import { isInternalFile, getPathFromUXFileInfo, getStoragePathFromUXFileInfo, getDatabasePathFromUXFileInfo } from "@lib/common/typeUtils.ts";
export { isInternalFile, getPathFromUXFileInfo, getStoragePathFromUXFileInfo, getDatabasePathFromUXFileInfo };
export declare function memoObject<T>(key: string, obj: T): T;
export declare function memoIfNotExist<T>(key: string, func: () => T | Promise<T>): Promise<T>;
export declare function retrieveMemoObject<T>(key: string): T | false;
export declare function disposeMemoObject(key: string): void;
export declare function isValidPath(filename: string): boolean;
export declare function trimPrefix(target: string, prefix: string): string;
export { isInternalMetadata, id2InternalMetadataId, isChunk, isCustomisationSyncMetadata, isPluginMetadata, stripInternalMetadataPrefix, } from "@lib/common/typeUtils.ts";
export declare const _requestToCouchDBFetch: (baseUri: string, username: string, password: string, path?: string, body?: unknown, method?: string) => Promise<Response>;
export declare const _requestToCouchDB: (baseUri: string, credentials: CouchDBCredentials, origin: string, path?: string, body?: unknown, method?: string, customHeaders?: Record<string, string>) => Promise<import("obsidian").RequestUrlResponse>;
/**
* @deprecated Use requestToCouchDBWithCredentials instead.
*/
export declare const requestToCouchDB: (baseUri: string, username: string, password: string, origin?: string, key?: string, body?: string, method?: string, customHeaders?: Record<string, string>) => Promise<import("obsidian").RequestUrlResponse>;
export declare function requestToCouchDBWithCredentials(baseUri: string, credentials: CouchDBCredentials, origin?: string, key?: string, body?: string, method?: string, customHeaders?: Record<string, string>): Promise<import("obsidian").RequestUrlResponse>;
import { BASE_IS_NEW, EVEN, TARGET_IS_NEW } from "@lib/common/models/shared.const.symbols.ts";
export { BASE_IS_NEW, EVEN, TARGET_IS_NEW };
import { compareMTime } from "@lib/common/utils.database.ts";
export { compareMTime };
export declare function markChangesAreSame(file: AnyEntry | string | UXFileInfoStub, mtime1: number, mtime2: number): true | undefined;
export declare function unmarkChanges(file: AnyEntry | string | UXFileInfoStub): void;
export declare function isMarkedAsSameChanges(file: UXFileInfoStub | AnyEntry | string, mtimes: number[]): typeof EVEN | undefined;
export declare function compareFileFreshness(baseFile: UXFileInfoStub | AnyEntry | undefined, checkTarget: UXFileInfo | AnyEntry | undefined): typeof BASE_IS_NEW | typeof TARGET_IS_NEW | typeof EVEN;
export type MemoOption = {
key: string;
forceUpdate?: boolean;
validator?: (context: Map<string, unknown>) => boolean;
};
export declare function useMemo<T>({ key, forceUpdate, validator }: MemoOption, updateFunc: (context: Map<string, unknown>, prev: T) => T): T;
export declare function useStatic<T>(key: string): {
value: T | undefined;
};
export declare function useStatic<T>(key: string, initial: T): {
value: T;
};
export declare function disposeMemo(key: string): void;
export declare function disposeAllMemo(): void;
export declare function getLogLevel(showNotice: boolean): 32 | 64;
export type MapLike<K, V> = {
set(key: K, value: V): Map<K, V>;
clear(): void;
delete(key: K): boolean;
get(key: K): V | undefined;
has(key: K): boolean;
keys: () => IterableIterator<K>;
get size(): number;
};
export declare function autosaveCache<K, V>(db: KeyValueDatabase, mapKey: string): Promise<MapLike<K, V>>;
export declare function onlyInNTimes(n: number, proc: (progress: number) => unknown): () => void;
export { displayRev } from "@lib/common/utils.ts";
+6
View File
@@ -0,0 +1,6 @@
import type { FilePath } from "@lib/common/models/db.type";
export { addIcon, App, debounce, Editor, FuzzySuggestModal, MarkdownRenderer, MarkdownView, Modal, Notice, Platform, Plugin, PluginSettingTab, requestUrl, sanitizeHTMLToDom, Setting, stringifyYaml, TAbstractFile, TextAreaComponent, TFile, TFolder, parseYaml, ItemView, WorkspaceLeaf, Menu, request, getLanguage, ButtonComponent, TextComponent, ToggleComponent, DropdownComponent, } from "obsidian";
export type { DataWriteOptions, PluginManifest, RequestUrlParam, RequestUrlResponse, MarkdownFileInfo, ListedFiles, ValueComponent, Stat, } from "obsidian";
declare const normalizePath: <T extends string | FilePath>(from: T) => T;
export { normalizePath };
export { type Diff, DIFF_DELETE, DIFF_EQUAL, DIFF_INSERT, diff_match_patch } from "diff-match-patch";
+147
View File
@@ -0,0 +1,147 @@
import { type PluginManifest, type App } from "@/deps.ts";
import type { EntryDoc } from "@lib/common/models/db.definition";
import type { LoadedEntry, FilePathWithPrefix, FilePath, AnyEntry } from "@lib/common/models/db.type";
import { LiveSyncCommands } from "@/features/LiveSyncCommands.ts";
import { PeriodicProcessor } from "@/common/PeriodicProcessor.ts";
import { QueueProcessor } from "octagonal-wheels/concurrency/processor";
import type ObsidianLiveSyncPlugin from "@/main.ts";
import type { PluginDialogModal } from "./PluginDialogModal.ts";
import type { InjectableServiceHub } from "@lib/services/InjectableServices.ts";
import type { LiveSyncCore } from "@/main.ts";
declare global {
interface OPTIONAL_SYNC_FEATURES {
DISABLE: "DISABLE";
CUSTOMIZE: "CUSTOMIZE";
DISABLE_CUSTOM: "DISABLE_CUSTOM";
}
}
export declare const pluginList: import("svelte/store").Writable<PluginDataExDisplay[]>;
export declare const pluginIsEnumerating: import("svelte/store").Writable<boolean>;
export declare const pluginV2Progress: import("svelte/store").Writable<number>;
export type PluginDataExFile = {
filename: string;
data: string[];
mtime: number;
size: number;
version?: string;
hash?: string;
displayName?: string;
};
export interface IPluginDataExDisplay {
documentPath: FilePathWithPrefix;
category: string;
name: string;
term: string;
displayName?: string;
files: (LoadedEntryPluginDataExFile | PluginDataExFile)[];
version?: string;
mtime: number;
}
export type PluginDataExDisplay = {
documentPath: FilePathWithPrefix;
category: string;
name: string;
term: string;
displayName?: string;
files: PluginDataExFile[];
version?: string;
mtime: number;
};
type LoadedEntryPluginDataExFile = LoadedEntry & PluginDataExFile;
export declare const pluginManifests: Map<string, PluginManifest>;
export declare const pluginManifestStore: import("svelte/store").Writable<Map<string, PluginManifest>>;
export declare class PluginDataExDisplayV2 {
documentPath: FilePathWithPrefix;
category: string;
term: string;
files: LoadedEntryPluginDataExFile[];
name: string;
confKey: string;
constructor(data: IPluginDataExDisplay);
setFile(file: LoadedEntryPluginDataExFile): Promise<void>;
deleteFile(filename: string): void;
_displayName: string | undefined;
_version: string | undefined;
applyLoadedManifest(): void;
get displayName(): string;
get version(): string | undefined;
get mtime(): number;
}
export type PluginDataEx = {
documentPath?: FilePathWithPrefix;
category: string;
name: string;
displayName?: string;
term: string;
files: PluginDataExFile[];
version?: string;
mtime: number;
};
export declare class ConfigSync extends LiveSyncCommands {
pluginDialogClass: new (app: App, plugin: ObsidianLiveSyncPlugin) => PluginDialogModal;
constructor(plugin: ObsidianLiveSyncPlugin, core: LiveSyncCore, pluginDialogClass: new (app: App, plugin: ObsidianLiveSyncPlugin) => PluginDialogModal);
get configDir(): string;
get kvDB(): import("../../lib/src/interfaces/KeyValueDatabase.ts").KeyValueDatabase;
get useV2(): boolean;
get useSyncPluginEtc(): boolean;
isThisModuleEnabled(): boolean;
pluginDialog?: PluginDialogModal;
periodicPluginSweepProcessor: PeriodicProcessor;
pluginList: IPluginDataExDisplay[];
showPluginSyncModal(): void;
hidePluginSyncModal(): void;
onunload(): void;
addRibbonIcon: (icon: string, title: string, callback: (evt: MouseEvent) => any) => HTMLElement;
onload(): void;
getFileCategory(filePath: string): "CONFIG" | "THEME" | "SNIPPET" | "PLUGIN_MAIN" | "PLUGIN_ETC" | "PLUGIN_DATA" | "";
isTargetPath(filePath: string): boolean;
private _everyOnDatabaseInitialized;
_everyBeforeReplicate(showNotice: boolean): Promise<boolean>;
_everyOnResumeProcess(): Promise<boolean>;
_everyAfterResumeProcess(): Promise<boolean>;
reloadPluginList(showMessage: boolean): Promise<void>;
loadPluginData(path: FilePathWithPrefix): Promise<PluginDataExDisplay | false>;
pluginScanProcessor: QueueProcessor<AnyEntry, never>;
pluginScanProcessorV2: QueueProcessor<AnyEntry, never>;
filenameToUnifiedKey(path: string, termOverRide?: string): FilePathWithPrefix;
filenameWithUnifiedKey(path: string, termOverRide?: string): FilePathWithPrefix;
unifiedKeyPrefixOfTerminal(termOverRide?: string): FilePathWithPrefix;
parseUnifiedPath(unifiedPath: FilePathWithPrefix): {
category: string;
device: string;
key: string;
filename: string;
pathV1: FilePathWithPrefix;
};
loadedManifest_mTime: Map<string, number>;
createPluginDataExFileV2(unifiedPathV2: FilePathWithPrefix, loaded?: LoadedEntry): Promise<false | LoadedEntryPluginDataExFile>;
createPluginDataFromV2(unifiedPathV2: FilePathWithPrefix): PluginDataExDisplayV2 | undefined;
updatingV2Count: number;
updatePluginListV2(showMessage: boolean, unifiedFilenameWithKey: FilePathWithPrefix): Promise<void>;
migrateV1ToV2(showMessage: boolean, entry: AnyEntry): Promise<void>;
updatePluginList(showMessage: boolean, updatedDocumentPath?: FilePathWithPrefix): Promise<void>;
compareUsingDisplayData(dataA: IPluginDataExDisplay, dataB: IPluginDataExDisplay, compareEach?: boolean): Promise<boolean>;
applyDataV2(data: PluginDataExDisplayV2, content?: string): Promise<boolean>;
applyData(data: IPluginDataExDisplay, content?: string): Promise<boolean>;
deleteData(data: PluginDataEx): Promise<boolean>;
_anyModuleParsedReplicationResultItem(docs: PouchDB.Core.ExistingDocument<EntryDoc>): Promise<boolean>;
_everyRealizeSettingSyncMode(): Promise<boolean>;
recentProcessedInternalFiles: string[];
makeEntryFromFile(path: FilePath): Promise<false | PluginDataExFile>;
storeCustomisationFileV2(path: FilePath, term: string, force?: boolean): Promise<boolean | PouchDB.Core.Response | undefined>;
storeCustomizationFiles(path: FilePath, termOverRide?: string): Promise<boolean | PouchDB.Core.Response | undefined>;
_anyProcessOptionalFileEvent(path: FilePath): Promise<boolean>;
watchVaultRawEventsAsync(path: FilePath): Promise<boolean>;
scanAllConfigFiles(showMessage: boolean): Promise<void>;
deleteConfigOnDatabase(prefixedFileName: FilePathWithPrefix, forceWrite?: boolean): Promise<boolean>;
scanInternalFiles(): Promise<FilePath[]>;
private _allAskUsingOptionalSyncFeature;
private __askHiddenFileConfiguration;
_anyGetOptionalConflictCheckMethod(path: FilePathWithPrefix): Promise<boolean | "newer">;
private _allSuspendExtraSync;
private _allConfigureOptionalSyncFeature;
configureHiddenFileSync(mode: keyof OPTIONAL_SYNC_FEATURES): Promise<void>;
getFiles(path: string, lastDepth: number): Promise<string[]>;
onBindFunction(core: LiveSyncCore, services: InjectableServiceHub): void;
}
export {};
+11
View File
@@ -0,0 +1,11 @@
import { mount } from "svelte";
import { App, Modal } from "@/deps.ts";
import type ObsidianLiveSyncPlugin from "@/main.ts";
export declare class PluginDialogModal extends Modal {
plugin: ObsidianLiveSyncPlugin;
component: ReturnType<typeof mount> | undefined;
isOpened(): boolean;
constructor(app: App, plugin: ObsidianLiveSyncPlugin);
onOpen(): void;
onClose(): void;
}
@@ -0,0 +1,19 @@
import { App, Modal } from "@/deps.ts";
import type { FilePath, LoadedEntry } from "@lib/common/models/db.type";
import { mount } from "svelte";
export declare class JsonResolveModal extends Modal {
filename: FilePath;
callback?: (keepRev?: string, mergedStr?: string) => Promise<void>;
docs: LoadedEntry[];
component?: ReturnType<typeof mount>;
nameA: string;
nameB: string;
defaultSelect: string;
keepOrder: boolean;
hideLocal: boolean;
title: string;
constructor(app: App, filename: FilePath, docs: LoadedEntry[], callback: (keepRev?: string, mergedStr?: string) => Promise<void>, nameA?: string, nameB?: string, defaultSelect?: string, keepOrder?: boolean, hideLocal?: boolean, title?: string);
UICallback(keepRev?: string, mergedStr?: string): Promise<void>;
onOpen(): void;
onClose(): void;
}
@@ -0,0 +1,153 @@
import type { LoadedEntry, FilePathWithPrefix, FilePath, DocumentID, MetaEntry } from "@lib/common/models/db.type";
import type { UXFileInfo, UXStat, UXDataWriteOptions } from "@lib/common/models/fileaccess.type";
import { type InternalFileInfo } from "@/common/types.ts";
import type { CustomRegExp } from "@lib/common/utils.regexp.ts";
import { type MapLike } from "@/common/utils.ts";
import { PeriodicProcessor } from "@/common/PeriodicProcessor.ts";
import { LiveSyncCommands } from "@/features/LiveSyncCommands.ts";
import { QueueProcessor } from "octagonal-wheels/concurrency/processor";
import type { LiveSyncCore } from "@/main.ts";
type SyncDirection = "push" | "pull" | "safe" | "pullForce" | "pushForce";
declare global {
interface OPTIONAL_SYNC_FEATURES {
FETCH: "FETCH";
OVERWRITE: "OVERWRITE";
MERGE: "MERGE";
DISABLE: "DISABLE";
DISABLE_HIDDEN: "DISABLE_HIDDEN";
}
}
export declare class HiddenFileSync extends LiveSyncCommands {
isThisModuleEnabled(): boolean;
periodicInternalFileScanProcessor: PeriodicProcessor;
get kvDB(): import("../../lib/src/interfaces/KeyValueDatabase").KeyValueDatabase;
getConflictedDoc(path: FilePathWithPrefix, rev: string): Promise<false | import("../../lib/src/common/types").diff_result_leaf>;
onunload(): void;
onload(): void;
private _everyOnDatabaseInitialized;
_everyBeforeReplicate(showNotice: boolean): Promise<boolean>;
private _everyOnloadAfterLoadSettings;
updateSettingCache(): void;
isReady(): boolean;
performStartupScan(showNotice: boolean): Promise<void>;
_everyOnResumeProcess(): Promise<boolean>;
_everyRealizeSettingSyncMode(): Promise<boolean>;
_anyProcessOptionalFileEvent(path: FilePath): Promise<boolean>;
_anyGetOptionalConflictCheckMethod(path: FilePathWithPrefix): Promise<boolean | "newer">;
_anyProcessOptionalSyncFiles(doc: LoadedEntry): Promise<boolean>;
loadFileWithInfo(path: FilePath): Promise<UXFileInfo>;
_fileInfoLastProcessed: MapLike<string, string>;
_fileInfoLastKnown: MapLike<string, number>;
_databaseInfoLastProcessed: MapLike<string, string>;
statToKey(stat: UXStat | null): string;
docToKey(doc: LoadedEntry | MetaEntry): string;
fileToStatKey(file: FilePath, stat?: UXStat | null): Promise<string>;
updateLastProcessedFile(file: FilePath, keySrc: string | UXStat): void;
updateLastProcessedAsActualFile(file: FilePath, stat?: UXStat | null): Promise<void>;
resetLastProcessedFile(targetFiles: FilePath[] | false): void;
getLastProcessedFileMTime(file: FilePath): number;
getLastProcessedFileKey(file: FilePath): string | undefined;
getLastProcessedDatabaseKey(file: FilePath): string | undefined;
updateLastProcessedDatabase(file: FilePath, keySrc: string | MetaEntry | LoadedEntry): void;
updateLastProcessed(path: FilePath, db: MetaEntry | LoadedEntry, stat: UXStat): void;
updateLastProcessedDeletion(path: FilePath, db: MetaEntry | LoadedEntry | false): void;
ensureDir(path: FilePath): Promise<void>;
writeFile(path: FilePath, data: string | ArrayBuffer, opt?: UXDataWriteOptions): Promise<UXStat | null>;
__removeFile(path: FilePath): Promise<"OK" | "ALREADY" | false>;
triggerEvent(path: FilePath): Promise<void>;
updateLastProcessedAsActualDatabase(file: FilePath, doc?: MetaEntry | LoadedEntry | null | false): Promise<void>;
resetLastProcessedDatabase(targetFiles: FilePath[] | false): void;
adoptCurrentStorageFilesAsProcessed(targetFiles: FilePath[] | false): Promise<void>;
adoptCurrentDatabaseFilesAsProcessed(targetFiles: FilePath[] | false): Promise<void>;
semaphore: import("octagonal-wheels/concurrency/semaphore_v2").SemaphoreObject;
serializedForEvent<T>(file: FilePath, fn: () => Promise<T>): Promise<T>;
useStorageFiles(files: FilePath[], showNotice?: boolean, onlyNew?: boolean): Promise<void>;
trackScannedStorageChanges(processFiles: FilePath[], showNotice?: boolean, onlyNew?: boolean, forceWriteAll?: boolean, includeDeleted?: boolean): Promise<void>;
scanAllStorageChanges(showNotice?: boolean, onlyNew?: boolean, forceWriteAll?: boolean, includeDeleted?: boolean): Promise<void | null>;
/**
* check the file is changed or not, and if changed, process it.
*/
trackStorageFileModification(path: FilePath, onlyNew?: boolean, forceWrite?: boolean, includeDeleted?: boolean): Promise<boolean | undefined>;
pendingConflictChecks: Set<FilePathWithPrefix>;
queueConflictCheck(path: FilePathWithPrefix): void;
finishConflictCheck(path: FilePathWithPrefix): void;
requeueConflictCheck(path: FilePathWithPrefix): void;
resolveConflictOnInternalFiles(): Promise<void>;
resolveByNewerEntry(id: DocumentID, path: FilePathWithPrefix, currentDoc: MetaEntry, currentRev: string, conflictedRev: string): Promise<void>;
conflictResolutionProcessor: QueueProcessor<FilePathWithPrefix, {
path: FilePathWithPrefix;
revA: string;
revB: string;
id: DocumentID;
doc: MetaEntry & PouchDB.Core.IdMeta & PouchDB.Core.GetMeta;
}>;
showJSONMergeDialogAndMerge(docA: LoadedEntry, docB: LoadedEntry): Promise<boolean>;
getDocProps(doc: LoadedEntry): {
id: DocumentID;
rev: string | undefined;
revDisplay: string;
prefixedPath: FilePathWithPrefix;
path: FilePath;
isDeleted: boolean;
shortenedId: string;
shortenedPath: string;
};
processReplicationResult(doc: LoadedEntry): Promise<boolean>;
cacheFileRegExps: Map<string, CustomRegExp[][]>;
/**
* Parses the regular expression settings for hidden file synchronization.
* @returns An object containing the ignore and target filters.
*/
parseRegExpSettings(): {
ignoreFilter: CustomRegExp[];
targetFilter: CustomRegExp[];
};
/**
* Checks if the target file path matches the defined patterns.
*/
isTargetFileInPatterns(path: string): boolean;
cacheCustomisationSyncIgnoredFiles: Map<string, string[]>;
/**
* Gets the list of files ignored for customization synchronization.
* @returns An array of ignored file paths (lowercase).
*/
getCustomisationSynchronizationIgnoredFiles(): string[];
/**
* Checks if the given path is not ignored by customization synchronization.
* @param path The file path to check.
* @returns True if the path is not ignored; otherwise, false.
*/
isNotIgnoredByCustomisationSync(path: string): boolean;
isHiddenFileSyncHandlingPath(path: FilePath): boolean;
isTargetFile(path: FilePath): Promise<boolean>;
trackScannedDatabaseChange(processFiles: MetaEntry[], showNotice?: boolean, onlyNew?: boolean, forceWriteAll?: boolean, includeDeletion?: boolean): Promise<void>;
applyOfflineChanges(showNotice: boolean): Promise<void>;
scanAllDatabaseChanges(showNotice?: boolean, onlyNew?: boolean, forceWriteAll?: boolean, includeDeletion?: boolean): Promise<void | null>;
useDatabaseFiles(files: MetaEntry[], showNotice?: boolean, onlyNew?: boolean): Promise<boolean>;
trackDatabaseFileModification(path: FilePath, headerLine: string, preventDoubleProcess?: boolean, onlyNew?: boolean, meta?: MetaEntry | false, includeDeletion?: boolean): Promise<boolean>;
queuedNotificationFiles: Set<string>;
notifyConfigChange(): void;
queueNotification(key: FilePath): void;
rebuildMerging(showNotice: boolean, targetFiles?: FilePath[] | false): Promise<FilePath[]>;
rebuildFromStorage(showNotice: boolean, targetFiles?: FilePath[] | false, onlyNew?: boolean): Promise<FilePath[]>;
getAllDatabaseFiles(): Promise<MetaEntry[]>;
rebuildFromDatabase(showNotice: boolean, targetFiles?: FilePath[] | false, onlyNew?: boolean): Promise<MetaEntry[]>;
initialiseInternalFileSync(direction: SyncDirection, showMessage: boolean, targetFilesSrc?: string[] | false): Promise<void>;
__loadBaseSaveData(file: FilePath, includeContent?: boolean): Promise<LoadedEntry | false>;
storeInternalFileToDatabase(file: InternalFileInfo | UXFileInfo, forceWrite?: boolean): Promise<boolean | undefined>;
deleteInternalFileOnDatabase(filenameSrc: FilePath, forceWrite?: boolean): Promise<boolean | undefined>;
extractInternalFileFromDatabase(storageFilePath: FilePath, force?: boolean, metaEntry?: MetaEntry | LoadedEntry, preventDoubleProcess?: boolean, onlyNew?: boolean, includeDeletion?: boolean): Promise<boolean | undefined>;
__checkIsNeedToWriteFile(storageFilePath: FilePath, content: string | ArrayBuffer): Promise<boolean>;
__writeFile(storageFilePath: FilePath, fileOnDB: LoadedEntry, force: boolean): Promise<false | UXStat>;
__deleteFile(storageFilePath: FilePath): Promise<false | "OK" | "ALREADY">;
private _allAskUsingOptionalSyncFeature;
private __askHiddenFileConfiguration;
private _allSuspendExtraSync;
private _allConfigureOptionalSyncFeature;
configureHiddenFileSync(mode: keyof OPTIONAL_SYNC_FEATURES): Promise<void>;
scanInternalFileNames(): Promise<FilePath[]>;
scanInternalFiles(): Promise<InternalFileInfo[]>;
getFiles(path: string, checkFunction: (path: FilePath) => Promise<boolean> | boolean): Promise<string[]>;
onBindFunction(core: LiveSyncCore, services: typeof core.services): void;
}
export {};
+35
View File
@@ -0,0 +1,35 @@
import type { AnyEntry, DocumentID, FilePath, FilePathWithPrefix } from "@lib/common/models/db.type";
import type { LOG_LEVEL } from "@lib/common/logger";
import type ObsidianLiveSyncPlugin from "@/main.ts";
import type { LiveSyncCore } from "@/main.ts";
import { createInstanceLogFunction } from "@lib/services/lib/logUtils.ts";
export declare abstract class LiveSyncCommands {
/**
* @deprecated This class is deprecated. Please use core
*/
plugin: ObsidianLiveSyncPlugin;
core: LiveSyncCore;
get app(): import("obsidian").App;
get settings(): import("../lib/src/common/types").ObsidianLiveSyncSettings;
get localDatabase(): import("../lib/src/pouchdb/LiveSyncLocalDB").LiveSyncLocalDB;
get services(): import("../lib/src/services/InjectableServices").InjectableServiceHub<import("../lib/src/services/implements/obsidian/ObsidianServiceContext").ObsidianServiceContext>;
path2id(filename: FilePathWithPrefix | FilePath, prefix?: string): Promise<DocumentID>;
getPath(entry: AnyEntry): FilePathWithPrefix;
constructor(plugin: ObsidianLiveSyncPlugin, core: LiveSyncCore);
abstract onunload(): void;
abstract onload(): void | Promise<void>;
_isMainReady(): boolean;
_isMainSuspended(): boolean;
_isDatabaseReady(): boolean;
_log: ReturnType<typeof createInstanceLogFunction>;
_verbose: (msg: unknown, key?: string) => void;
_info: (msg: unknown, key?: string) => void;
_notice: (msg: unknown, key?: string) => void;
_progress: (prefix?: string, level?: LOG_LEVEL) => {
log: (msg: unknown) => void;
once: (msg: unknown) => void;
done: (msg?: string) => void;
};
_debug: (msg: unknown, key?: string) => void;
onBindFunction(core: LiveSyncCore, services: typeof core.services): void;
}
@@ -0,0 +1,58 @@
import type { DocumentID, EntryLeaf } from "@lib/common/models/db.type";
import type { EntryDoc } from "@lib/common/models/db.definition";
import { LiveSyncCommands } from "@/features/LiveSyncCommands";
type ChunkID = DocumentID;
type NoteDocumentID = DocumentID;
type Rev = string;
type ChunkUsageMap = Map<NoteDocumentID, Map<Rev, Set<ChunkID>>>;
export declare class LocalDatabaseMaintenance extends LiveSyncCommands {
onunload(): void;
onload(): void | Promise<void>;
allChunks(includeDeleted?: boolean): Promise<{
used: Set<string>;
existing: Map<string, EntryLeaf>;
}>;
get database(): PouchDB.Database<EntryDoc>;
clearHash(): void;
confirm(title: string, message: string, affirmative?: string, negative?: string): Promise<boolean>;
isAvailable(): boolean;
/**
* Resurrect deleted chunks that are still used in the database.
*/
resurrectChunks(): Promise<void>;
/**
* Commit deletion of files that are marked as deleted.
* This method makes the deletion permanent, and the files will not be recovered.
* After this, chunks that are used in the deleted files become ready for compaction.
*/
commitFileDeletion(): Promise<void>;
/**
* Commit deletion of chunks that are not used in the database.
* This method makes the deletion permanent, and the chunks will not be recovered if the database run compaction.
* After this, the database can shrink the database size by compaction.
* It is recommended to compact the database after this operation (History should be kept once before compaction).
*/
commitChunkDeletion(): Promise<void>;
/**
* Compact the database.
* This method removes all deleted chunks that are not used in the database.
* Make sure all devices are synchronized before running this method.
*/
markUnusedChunks(): Promise<void>;
removeUnusedChunks(): Promise<void>;
scanUnusedChunks(): Promise<{
chunkSet: Set<DocumentID>;
chunkUsageMap: ChunkUsageMap;
unusedSet: Set<DocumentID>;
}>;
/**
* Track changes in the database and update the chunk usage map for garbage collection.
* Note that this only able to perform without Fetch chunks on demand.
*/
trackChanges(fromStart?: boolean, showNotice?: boolean): Promise<void>;
performGC(showingNotice?: boolean): Promise<void>;
analyseDatabase(): Promise<void>;
compactDatabase(): Promise<void>;
gcv3(): Promise<void>;
}
export {};
@@ -0,0 +1,21 @@
import { App, Modal } from "@/deps.ts";
import { mount } from "svelte";
import type { LiveSyncTrysteroReplicator } from "@lib/replication/trystero/LiveSyncTrysteroReplicator";
export type P2POpenReplicationModalCallback = {
onSync: (peerId: string) => Promise<void>;
onSyncAndClose: (peerId: string) => Promise<void>;
};
export declare class P2POpenReplicationModal extends Modal {
liveSyncReplicator: LiveSyncTrysteroReplicator;
callback?: P2POpenReplicationModalCallback;
component?: ReturnType<typeof mount>;
showResult: boolean;
title: string;
onClosed?: () => void;
rebuildMode: boolean;
constructor(app: App, liveSyncReplicator: LiveSyncTrysteroReplicator, callback?: P2POpenReplicationModalCallback, showResult?: boolean, title?: string, onClosed?: () => void, rebuildMode?: boolean);
onSync(peerId: string): Promise<void>;
onSyncAndClose(peerId: string): Promise<void>;
onOpen(): void;
onClose(): void;
}
@@ -0,0 +1,22 @@
import { App } from "@/deps.ts";
import type { LiveSyncTrysteroReplicator } from "@lib/replication/trystero/LiveSyncTrysteroReplicator";
/**
* Creates an openReplicationUI factory for Obsidian environments.
* Returns a per-replicator closure that opens the P2P Replication modal
* and performs bidirectional sync (pull then push on success).
*
* Usage:
* const factory = createOpenReplicationUI(app);
* useP2PReplicatorFeature(core, factory);
*/
export declare function createOpenReplicationUI(app: App): (replicator: LiveSyncTrysteroReplicator) => (showResult: boolean) => Promise<boolean | void>;
/**
* Creates an openRebuildUI factory for Obsidian environments.
* Opens the P2P Replication modal in "rebuild" mode — one-way pull only,
* with setOnSetup / clearOnSetup bracketing the replicateFrom call.
*
* Usage:
* const factory = createOpenRebuildUI(app);
* useP2PReplicatorFeature(core, createOpenReplicationUI(app), factory);
*/
export declare function createOpenRebuildUI(app: App): (replicator: LiveSyncTrysteroReplicator) => (showResult: boolean) => Promise<boolean | void>;
@@ -0,0 +1,28 @@
import { Menu, WorkspaceLeaf } from "@/deps.ts";
import { SvelteItemView } from "@/common/SvelteItemView.ts";
import { type PeerStatus } from "@lib/replication/trystero/P2PReplicatorPaneCommon.ts";
import type { LiveSyncBaseCore } from "@/LiveSyncBaseCore.ts";
import type { P2PPaneParams } from "@lib/replication/trystero/UseP2PReplicatorResult";
export declare const VIEW_TYPE_P2P = "p2p-replicator";
export declare class P2PReplicatorPaneView extends SvelteItemView {
core: LiveSyncBaseCore;
private _p2pResult;
icon: string;
title: string;
navigation: boolean;
getIcon(): string;
get replicator(): import("../../../lib/src/replication/trystero/LiveSyncTrysteroReplicator").LiveSyncTrysteroReplicator;
replicateFrom(peer: PeerStatus): Promise<void>;
replicateTo(peer: PeerStatus): Promise<void>;
getRemoteConfig(peer: PeerStatus): Promise<void>;
toggleProp(peer: PeerStatus, prop: "syncOnConnect" | "watchOnConnect" | "syncOnReplicationCommand"): Promise<void>;
m?: Menu;
constructor(leaf: WorkspaceLeaf, core: LiveSyncBaseCore, p2pResult: P2PPaneParams);
getViewType(): string;
getDisplayText(): string;
onClose(): Promise<void>;
instantiateComponent(target: HTMLElement): {
$on?(type: string, callback: (e: any) => void): () => void;
$set?(props: Partial<Record<string, any>>): void;
} & Record<string, any>;
}
@@ -0,0 +1,19 @@
import { WorkspaceLeaf } from "@/deps.ts";
import { SvelteItemView } from "@/common/SvelteItemView.ts";
import type { LiveSyncBaseCore } from "@/LiveSyncBaseCore.ts";
import type { P2PPaneParams } from "@lib/replication/trystero/UseP2PReplicatorResult";
export declare const VIEW_TYPE_P2P_SERVER_STATUS = "p2p-server-status";
export declare class P2PServerStatusPaneView extends SvelteItemView {
core: LiveSyncBaseCore;
private _p2pResult;
icon: string;
navigation: boolean;
constructor(leaf: WorkspaceLeaf, core: LiveSyncBaseCore, p2pResult: P2PPaneParams);
getIcon(): string;
getViewType(): string;
getDisplayText(): string;
instantiateComponent(target: HTMLElement): {
$on?(type: string, callback: (e: any) => void): () => void;
$set?(props: Partial<Record<string, any>>): void;
} & Record<string, any>;
}
+2
View File
@@ -0,0 +1,2 @@
export { DirectFileManipulator } from "./DirectFileManipulatorV2.ts";
export type { DirectFileManipulatorOptions } from "./DirectFileManipulatorV2.ts";
+41
View File
@@ -0,0 +1,41 @@
import type { ObsidianLiveSyncSettings } from "@lib/common/models/setting.type";
/**
* Encode settings to a tiny array to encode in QRCode,
* Due to size limitation of QR code, we encode settings as an array instead of object.
* @param settings settings to encode
*/
export declare function encodeSettingsToQRCodeData(settings: ObsidianLiveSyncSettings): string;
/**
* Decode settings from QR code data string
* @param qr data string from QR code
* @returns Decoded settings
*/
export declare function decodeSettingsFromQRCodeData(qr: string): ObsidianLiveSyncSettings;
export declare const enum OutputFormat {
SVG = 0,
ASCII = 1
}
export interface SplitQRCodeData {
total: number;
parts: string[];
}
/**
* Encode setting string to QR code in specified format
* @param settingString Setting string to encode
* @param format Output format
*/
export declare function encodeQR(settingString: string, format: OutputFormat): string | SplitQRCodeData;
type ErasureProperties = keyof ObsidianLiveSyncSettings;
/**
* Generate setup URI with encrypted settings
* @param settingString Settings to encode
* @param passphrase Passphrase to encrypt the settings
* @param removeProperties Properties to remove from the settings
* Means these properties will not be included in the generated setup URI,
* See also necessaryErasureProperties for properties that will always be removed.
* @param skipDefaultValue Whether to skip default values
* @returns Generated setup URI
*/
export declare function encodeSettingsToSetupURI(settingString: ObsidianLiveSyncSettings, passphrase: string, removeProperties?: ErasureProperties[], skipDefaultValue?: boolean): Promise<string>;
export declare function decodeSettingsFromSetupURI(uri: string, passphrase: string): Promise<false | ObsidianLiveSyncSettings>;
export {};
+24
View File
@@ -0,0 +1,24 @@
import type { FilePathWithPrefix } from "@lib/common/models/db.type";
import type { ISettingService } from "@lib/services/base/IService.ts";
/**
* ContentSplitter interface for splitting content into chunks.
*/
export type SplitOptions = {
blob: Blob;
path: FilePathWithPrefix;
pieceSize: number;
plainSplit: boolean;
minimumChunkSize: number;
useWorker: boolean;
useSegmenter: boolean;
};
/**
* The maximum size, in bytes, of a document to be processed by the content splitter in the foreground.
*/
export declare const MAX_CHUNKS_SIZE_ON_UI = 1024;
/**
* Options for the content splitter.
*/
export type ContentSplitterOptions = {
settingService: ISettingService;
};
@@ -0,0 +1,51 @@
import type { SavingEntry } from "@lib/common/models/db.type";
import { type ContentSplitterOptions, type SplitOptions } from "./ContentSplitter.ts";
export declare abstract class ContentSplitterCore {
/**
* Options for the content splitter.
* These settings include the chunk splitter version and other configurations.
*/
options: ContentSplitterOptions;
/**
* Task for initialising the content splitter.
* This ensures that the splitter is initialised before any operations are performed.
*/
initialised: Promise<boolean> | undefined;
/**
* Constructor for the content splitter core.
* @param params Content splitter options
*/
constructor(params: ContentSplitterOptions);
/**
* Initialise the content splitter with the provided options.
* @param options Content splitter options
*/
abstract initialise(options: ContentSplitterOptions): Promise<boolean>;
/**
* Split the content of the loaded entry into chunks.
* @param entry The loaded entry to be split into chunks
*/
abstract splitContent(entry: SavingEntry): Promise<AsyncGenerator<string, void, unknown> | Generator<string, void, unknown>>;
}
export declare abstract class ContentSplitterBase extends ContentSplitterCore {
initialise(_options: ContentSplitterOptions): Promise<boolean>;
/**
* Check whether the content splitter is available for the given settings.
* @param setting Content splitter options
* @returns True if the content splitter is available; false otherwise
*/
static isAvailableFor(setting: ContentSplitterOptions): boolean;
/**
* Process the content and split it into chunks.
* @param options Blob content to be split into chunks
*/
abstract processSplit(options: SplitOptions): Promise<AsyncGenerator<string, void, unknown> | Generator<string, void, unknown>>;
getParamsFor(entry: SavingEntry): SplitOptions;
/**
* Split the content of the loaded entry into chunks.
* This method waits for the initialisation task to complete before proceeding.
* @param entry The loaded entry to be split into chunks
* @returns A generator that yields the split chunks
*/
splitContent(entry: SavingEntry): Promise<AsyncGenerator<string, void, unknown> | Generator<string, void, unknown>>;
}
@@ -0,0 +1,9 @@
import type { ContentSplitterOptions, SplitOptions } from "./ContentSplitter.ts";
import { ContentSplitterBase } from "./ContentSplitterBase.ts";
/**
* Rabin-Karp content splitter for efficient chunking
*/
export declare class ContentSplitterRabinKarp extends ContentSplitterBase {
static isAvailableFor(setting: ContentSplitterOptions): boolean;
processSplit(options: SplitOptions): Promise<AsyncGenerator<string, void, unknown> | Generator<string, void, unknown>>;
}
@@ -0,0 +1,9 @@
import type { ContentSplitterOptions, SplitOptions } from "./ContentSplitter";
import { ContentSplitterBase } from "./ContentSplitterBase";
/**
* Legacy content splitter for version 1.
*/
export declare class ContentSplitterV1 extends ContentSplitterBase {
static isAvailableFor(setting: ContentSplitterOptions): boolean;
processSplit(options: SplitOptions): Promise<AsyncGenerator<string, void, unknown> | Generator<string, void, unknown>>;
}
@@ -0,0 +1,9 @@
import type { ContentSplitterOptions, SplitOptions } from "./ContentSplitter.ts";
import { ContentSplitterBase } from "./ContentSplitterBase.ts";
/**
* Content splitter for version 2, which supports segmenter-based splitting.
*/
export declare class ContentSplitterV2 extends ContentSplitterBase {
static isAvailableFor(setting: ContentSplitterOptions): boolean;
processSplit(options: SplitOptions): Promise<AsyncGenerator<string, void, unknown> | Generator<string, void, unknown>>;
}
@@ -0,0 +1,12 @@
import type { SavingEntry } from "@lib/common/models/db.type";
import type { ContentSplitterOptions } from "./ContentSplitter";
import { ContentSplitterCore, type ContentSplitterBase } from "./ContentSplitterBase";
/**
* ContentSplitter class that manages the active content splitter based on the provided settings.
*/
export declare class ContentSplitter extends ContentSplitterCore {
_activeSplitter: ContentSplitterBase;
constructor(options: ContentSplitterOptions);
initialise(options: ContentSplitterOptions): Promise<boolean>;
splitContent(entry: SavingEntry): Promise<AsyncGenerator<string, void, unknown> | Generator<string, void, unknown>>;
}
+2
View File
@@ -0,0 +1,2 @@
export type { HasSetResult, HasGetInitialData, ComponentHasResult, GuestDialogProps, DialogSvelteComponentBaseProps, DialogControlBase, } from "@lib/services/implements/base/SvelteDialog.ts";
export { CONTEXT_DIALOG_CONTROLS, setupDialogContext, getDialogContext, SvelteDialogManagerBase, } from "@lib/services/implements/base/SvelteDialog.ts";
+7
View File
@@ -0,0 +1,7 @@
import { type SlipBoard } from "octagonal-wheels/bureau/SlipBoard";
declare global {
interface Slips extends LSSlips {
_dummy: undefined;
}
}
export declare const globalSlipBoard: SlipBoard<Slips>;
+30
View File
@@ -0,0 +1,30 @@
import type { CouchDBConnection, BucketSyncSetting, P2PConnectionInfo } from "./models/setting.type";
export type RemoteConfigurationResult = {
type: "couchdb";
settings: CouchDBConnection;
} | {
type: "s3";
settings: BucketSyncSetting;
} | {
type: "p2p";
settings: P2PConnectionInfo;
} | {
type: "webdav";
settings: any;
};
export declare class ConnectionStringParser {
/**
* Restore settings from URI
*/
static parse(uriString: string): RemoteConfigurationResult;
/**
* 設定からURIを生成する
*/
static serialize(config: RemoteConfigurationResult): string;
private static parseCouchDB;
private static serializeCouchDB;
private static parseS3;
private static serializeS3;
private static parseP2P;
private static serializeP2P;
}
+47
View File
@@ -0,0 +1,47 @@
interface ErrorWithCause extends Error {
cause?: unknown;
}
/**
* Error class for Self-hosted LiveSync errors.
* This class extends the base LiveSyncError class and provides additional context for errors related to LiveSync operations.
* It includes a name property and a cause property to capture the original error.
* The status property returns the HTTP status code if available, defaulting to 500 for internal server errors.
* The class also includes static methods to check whether an error is caused by a specific error class.
*/
export declare class LiveSyncError extends Error implements ErrorWithCause {
name: string;
cause?: Error | object | string;
overrideStatus?: number;
/**
* Returns the HTTP status code associated with the error, if available.
* If the error has a status property, it returns that; otherwise, it defaults to 500 (Internal Server Error).
* @returns {number} The HTTP status code.
*/
get status(): number;
/**
* Constructs a new LiveSyncError instance.
* @param message The error message to be displayed.
*/
constructor(message: string, options?: {
cause?: unknown;
status?: number;
});
/**
* Determines whether an error is caused by a specific error class.
* @param error The error to examine.
* @param errorClass The error class to compare against.
* @returns True if the error is caused by the specified error class; otherwise, false.
* @example
* LiveSyncError.isCausedBy(someSyncParamsFetchError, SyncParamsNotFoundError); // Returns true if the error is caused by SyncParamsNotFoundError; this is usually represented as SyncParamsFetchError at the uppermost layer.
*/
static isCausedBy<T extends LiveSyncError>(error: unknown, errorClass: new (...args: any[]) => T): boolean;
/**
* Creates a new instance of the error class from an existing error.
* @param error The error to wrap.
* @returns A new instance of the error class with the original error's message and stack trace.
*/
static fromError<T extends typeof LiveSyncError>(this: T, error: unknown): InstanceType<T>;
}
export declare class LiveSyncFatalError extends LiveSyncError {
}
export {};
+78
View File
@@ -0,0 +1,78 @@
import type { Confirm } from "@lib/interfaces/Confirm";
import type { ObsidianLiveSyncSettings } from "@lib/common/models/setting.type";
declare enum ConditionType {
PLATFORM_CASE_INSENSITIVE = "platform-case-insensitive",
PLATFORM_CASE_SENSITIVE = "platform-case-sensitive",
REMOTE_CASE_SENSITIVE = "remote-case-sensitive"
}
export declare enum RuleLevel {
Must = 0,
Necessary = 1,
Recommended = 2,
Optional = 3
}
type BaseRule<TType extends string, TValue> = {
level?: RuleLevel;
requireRebuild?: boolean;
requireRebuildLocal?: boolean;
recommendRebuild?: boolean;
reason?: string;
reasonFunc?: (settings: Partial<ObsidianLiveSyncSettings>) => string;
condition?: ConditionType[];
detectionFunc?: (settings: Partial<ObsidianLiveSyncSettings>) => boolean;
value?: TValue;
valueDisplay?: string;
valueDisplayFunc?: (settings: Partial<ObsidianLiveSyncSettings>) => string;
obsoleteValues?: TValue[];
};
type NumberRuleExact = BaseRule<"number", number> & {};
type NumberRuleRange = BaseRule<"number", number> & {
min?: number;
max?: number;
step?: number;
};
type StringRangeRule = BaseRule<"string", string> & {
minLength?: number;
maxLength?: number;
regexp?: string;
};
type StringRule = BaseRule<"string", string> & {};
type BooleanRule = BaseRule<"boolean", boolean> & {};
export type RuleForType<T> = T extends number ? NumberRuleExact | NumberRuleRange : T extends string ? StringRule | StringRangeRule : T extends boolean ? BooleanRule : never;
export type AnyRule = NumberRuleExact | NumberRuleRange | StringRule | StringRangeRule | BooleanRule;
type DoctorCheckSettings = Omit<Partial<ObsidianLiveSyncSettings>, "remoteConfigurations" | "pluginSyncExtendedSetting">;
export type DoctorRegulation = {
version: string;
rules: {
[P in keyof DoctorCheckSettings]: RuleForType<DoctorCheckSettings[P]>;
};
};
export declare const DoctorRegulationV0_24_16: DoctorRegulation;
export declare const DoctorRegulationV0_24_30: DoctorRegulation;
export declare const DoctorRegulationV0_25_0: DoctorRegulation;
export declare const DoctorRegulationV0_25_27: DoctorRegulation;
export declare const DoctorRegulation: DoctorRegulation;
export declare function checkUnsuitableValues(setting: Partial<ObsidianLiveSyncSettings>, regulation?: DoctorRegulation): DoctorRegulation;
export declare const RebuildOptions: {
readonly AutomaticAcceptable: 0;
readonly ConfirmIfRequired: 1;
readonly SkipEvenIfRequired: 2;
};
export type RebuildOptionsType = (typeof RebuildOptions)[keyof typeof RebuildOptions];
export type DoctorOptions = {
localRebuild: RebuildOptionsType;
remoteRebuild: RebuildOptionsType;
activateReason?: string;
forceRescan?: boolean;
};
export type DoctorResult = {
settings: ObsidianLiveSyncSettings;
shouldRebuild: boolean;
shouldRebuildLocal: boolean;
isModified: boolean;
};
export type HasConfirm = {
confirm: Confirm;
};
export declare function performDoctorConsultation(env: HasConfirm, settings: ObsidianLiveSyncSettings, { localRebuild, remoteRebuild, activateReason, forceRescan, }: DoctorOptions): Promise<DoctorResult>;
export {};
+16
View File
@@ -0,0 +1,16 @@
declare class Context<T extends Record<string | number | symbol, any> = object> {
_data: Partial<T>;
children: WeakRef<Context<T>>[];
parent?: Context<T>;
constructor(base?: Context<T>, data?: Partial<T>);
set<V extends keyof T>(key: V, value: T[V]): void;
get<V extends keyof T>(key: V): T[V] | undefined;
setInGlobalContext<V extends keyof T>(key: V, value: T[V]): void;
setInNearestContext<V extends keyof T>(key: V, value: T[V]): void;
spawnContext<V extends Record<string, any>>(data?: V): Context<V & T>;
_disposeChild(child: Context<any>): void;
dispose(): void;
}
export declare function getContext<T extends U, U extends Record<string, any> = object>(data?: T): Context<T & object>;
export declare function getIndependentContext<T extends U, U extends Record<string, any> = object>(data?: T): Context<T>;
export {};
+21
View File
@@ -0,0 +1,21 @@
import type { getLanguage as ObsidianGetLanguage } from "obsidian";
export declare function setGetLanguage(func: typeof ObsidianGetLanguage): void;
export declare function getLanguage(): string;
export declare const compatGlobal: typeof window;
export type CompatTimeoutHandle = ReturnType<typeof setTimeout> | number;
export type CompatIntervalHandle = ReturnType<typeof setInterval> | number;
/**
* A wrapper around the global fetch function to ensure compatibility across different environments.
* In Obsidian, they recommend using their own requestUrl for better performance and reliability.
* However, at least for now, requestUrl cannot handle multiple concurrent requests, which causes
* problems for synchronise lively. So we will use the global fetch for now.
* If the situation changes in the future, change this function to use requestUrl.
* @param {RequestInfo} input The resource that you wish to fetch. Can be either a string or a Request object.
* @param {RequestInit} [init] An options object containing any custom settings that you want to apply to the request.
* @returns {Promise<Response>} A Promise that resolves to the Response to that request, whether it is successful or not.
*/
export declare const _fetch: {
(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
} & typeof fetch;
export declare const _activeDocument: Document;
+3
View File
@@ -0,0 +1,3 @@
declare const manifestVersion: string;
declare const packageVersion: string;
export { manifestVersion, packageVersion };
+18
View File
@@ -0,0 +1,18 @@
import type { AllMessageKeys, I18N_LANGS } from "./rosetta";
import type { TaggedType } from "@lib/common/models/shared.type.util";
export declare let currentLang: I18N_LANGS;
export declare function getResolvedLang(lang?: I18N_LANGS): I18N_LANGS;
export declare function isAutoDisplayLanguage(lang: I18N_LANGS): boolean;
export declare function __getMissingTranslations(): string[];
export declare function __onMissingTranslation(callback: (key: string) => void): void;
export declare function setLang(lang: I18N_LANGS): void;
export declare function $t(message: string, lang?: I18N_LANGS): string;
export declare function translateIfAvailable(message: string, lang?: I18N_LANGS): string;
/**
* TagFunction to Automatically translate.
* @param strings
* @param values
* @returns
*/
export declare function $f(strings: TemplateStringsArray, ...values: string[]): string;
export declare function $msg<T extends AllMessageKeys>(key: T, params?: Record<string, string>, lang?: I18N_LANGS): TaggedType<string, T>;
+2
View File
@@ -0,0 +1,2 @@
export * from "octagonal-wheels/common/logger";
export type * from "octagonal-wheels/common/logger";
@@ -0,0 +1,7 @@
import { PartialMessages as def } from "./def.ts";
import { type MESSAGE } from "@lib/common/rosetta.ts";
type MessageKeys = keyof typeof def.def;
export declare const allMessages: {
[key: string]: MESSAGE;
};
export { type MessageKeys };
File diff suppressed because it is too large Load Diff
+297
View File
@@ -0,0 +1,297 @@
export declare const PartialMessages: {
readonly de: {
"(Active)": string;
"(RegExp) Empty to sync all files. Set filter as a regular expression to limit synchronising files.": string;
"(RegExp) If this is set, any changes to local and remote files that match this will be skipped.": string;
"(Select this if you are already using synchronisation on another computer or smartphone.) This option is suitable if you are new to LiveSync and want to set it up from scratch.": string;
"(Select this if you are configuring this device as the first synchronisation device.) This option is suitable if you are new to LiveSync and want to set it up from scratch.": string;
"> [!INFO]- The connected devices have been detected as follows:\n${devices}": string;
"A Setup URI is a single string of text containing your server address and authentication details. Using a URI, if one was generated by your server installation script, provides a simple and secure configuration.": string;
Activate: string;
"Add default patterns": string;
"Add new connection": string;
"All devices have the same progress value (${progress}). Your devices seem to be synchronised. And be able to proceed with Garbage Collection.": string;
Back: string;
"Back to non-configured": string;
Cancel: string;
"Cancel Garbage Collection": string;
"Check and convert non-path-obfuscated files": string;
"Check for documents that have not been converted to path-obfuscated IDs and convert them if necessary.": string;
"cmdConfigSync.showCustomizationSync": string;
"Compaction in progress on remote database...": string;
"Compaction on remote database completed successfully.": string;
"Compaction on remote database failed.": string;
"Compaction on remote database timed out.": string;
"Compare the content of files between on local database and storage. If not matched, you will be asked which one you want to keep.": string;
"Compatibility (Conflict Behaviour)": string;
"Compatibility (Database structure)": string;
"Compatibility (Internal API Usage)": string;
"Compatibility (Metadata)": string;
"Compatibility (Remote Database)": string;
"Compatibility (Trouble addressed)": string;
Configure: string;
"Configure And Change Remote": string;
"Configure E2EE": string;
"Configure Remote": string;
"Configure the same server information as your other devices again, manually, very advanced users only.": string;
"Connection Method": string;
"Continue to CouchDB setup": string;
"Continue to Peer-to-Peer only setup": string;
"Continue to S3/MinIO/R2 setup": string;
Copy: string;
"Cross-platform": string;
"Current adapter: {adapter}": string;
"Customization Sync (Beta3)": string;
"Database Adapter": string;
Default: string;
Delete: string;
"Delete all customization sync data": string;
"Delete all data on the remote server.": string;
"Delete local database to reset or uninstall Self-hosted LiveSync": string;
"Delete Remote Configuration": string;
"Delete remote configuration '{name}'?": string;
desktop: string;
Device: string;
"Device name": string;
"Device Setup Method": string;
"Disables all synchronization and restart.": string;
"Display name": string;
Duplicate: string;
"Duplicate remote": string;
"E2EE Configuration": string;
"Edge case addressing (Behaviour)": string;
"Edge case addressing (Database)": string;
"Edge case addressing (Processing)": string;
"Emergency restart": string;
"Encrypting sensitive configuration items": string;
"Enter Server Information": string;
"Enter the server information manually": string;
Export: string;
"Failed to connect to remote for compaction.": string;
"Failed to connect to remote for compaction. ${reason}": string;
"Failed to start one-shot replication before Garbage Collection. Garbage Collection Cancelled.": string;
"Failed to start replication after Garbage Collection.": string;
"Fetch remote settings": string;
"File to resolve conflict": string;
"First, please select the option that best describes your current situation.": string;
"Flag and restart": string;
"Fresh Start Wipe": string;
"Garbage Collection cancelled by user.": string;
"Garbage Collection completed. Deleted chunks: ${deletedChunks} / ${totalChunks}. Time taken: ${seconds} seconds.": string;
"Garbage Collection Confirmation": string;
"Garbage Collection V3 (Beta)": string;
"Garbage Collection: Found ${unusedChunks} unused chunks to delete.": string;
"Garbage Collection: Scanned ${scanned} / ~${docCount}": string;
"Garbage Collection: Scanning completed. Total chunks: ${totalChunks}, Used chunks: ${usedChunks}": string;
"Hidden Files": string;
"Hide completely": string;
"How to display network errors when the sync server is unreachable.": string;
"How would you like to configure the connection to your server?": string;
"I am adding a device to an existing synchronisation setup": string;
"I am setting this up for the first time": string;
"I know my server details, let me enter them": string;
"If enabled, the \u26D4 icon will be shown inside the status instead of the file warnings banner. No details will be shown.": string;
"Ignore and Proceed": string;
"Ignore patterns": string;
"Import connection": string;
"Initialise all journal history, On the next sync, every item will be received and sent.": string;
Later: string;
"Limit: {datetime} ({timestamp})": string;
Lock: string;
"Lock Server": string;
"Lock the remote server to prevent synchronization with other devices.": string;
"More actions": string;
"Network warning style": string;
"New Remote": string;
"No connected device information found. Cancelling Garbage Collection.": string;
"No limit configured": string;
"No, please take me back": string;
"Node ID": string;
"Node Information Missing": string;
"Non-Synchronising files": string;
"Normal Files": string;
"Obsidian version": string;
"obsidianLiveSyncSettingTab.btnApply": string;
"obsidianLiveSyncSettingTab.btnDisable": string;
"obsidianLiveSyncSettingTab.btnNext": string;
"obsidianLiveSyncSettingTab.buttonNext": string;
"obsidianLiveSyncSettingTab.defaultLanguage": string;
"obsidianLiveSyncSettingTab.labelDisabled": string;
"obsidianLiveSyncSettingTab.labelEnabled": string;
"obsidianLiveSyncSettingTab.logConfiguredDisabled": string;
"obsidianLiveSyncSettingTab.logConfiguredLiveSync": string;
"obsidianLiveSyncSettingTab.logConfiguredPeriodic": string;
"obsidianLiveSyncSettingTab.logSelectAnyPreset": string;
"obsidianLiveSyncSettingTab.msgConfigCheckFailed": string;
"obsidianLiveSyncSettingTab.msgEnableEncryptionRecommendation": string;
"obsidianLiveSyncSettingTab.msgFetchConfigFromRemote": string;
"obsidianLiveSyncSettingTab.msgGenerateSetupURI": string;
"obsidianLiveSyncSettingTab.msgInvalidPassphrase": string;
"obsidianLiveSyncSettingTab.msgSelectAndApplyPreset": string;
"obsidianLiveSyncSettingTab.nameDisableHiddenFileSync": string;
"obsidianLiveSyncSettingTab.nameEnableHiddenFileSync": string;
"obsidianLiveSyncSettingTab.nameHiddenFileSynchronization": string;
"obsidianLiveSyncSettingTab.optionDisableAllAutomatic": string;
"obsidianLiveSyncSettingTab.optionLiveSync": string;
"obsidianLiveSyncSettingTab.optionOnEvents": string;
"obsidianLiveSyncSettingTab.optionPeriodicAndEvents": string;
"obsidianLiveSyncSettingTab.optionPeriodicWithBatch": string;
"obsidianLiveSyncSettingTab.titleAppearance": string;
"obsidianLiveSyncSettingTab.titleConflictResolution": string;
"obsidianLiveSyncSettingTab.titleCongratulations": string;
"obsidianLiveSyncSettingTab.titleCouchDB": string;
"obsidianLiveSyncSettingTab.titleDeletionPropagation": string;
"obsidianLiveSyncSettingTab.titleEncryptionNotEnabled": string;
"obsidianLiveSyncSettingTab.titleEncryptionPassphraseInvalid": string;
"obsidianLiveSyncSettingTab.titleFetchConfig": string;
"obsidianLiveSyncSettingTab.titleHiddenFiles": string;
"obsidianLiveSyncSettingTab.titleLogging": string;
"obsidianLiveSyncSettingTab.titleMinioS3R2": string;
"obsidianLiveSyncSettingTab.titleNotification": string;
"obsidianLiveSyncSettingTab.titleRemoteConfigCheckFailed": string;
"obsidianLiveSyncSettingTab.titleRemoteServer": string;
"obsidianLiveSyncSettingTab.titleSynchronizationMethod": string;
"obsidianLiveSyncSettingTab.titleSynchronizationPreset": string;
"obsidianLiveSyncSettingTab.titleSyncSettingsViaMarkdown": string;
"obsidianLiveSyncSettingTab.titleUpdateThinning": string;
Ok: string;
"Old Algorithm": string;
"Older fallback (Slow, W/O WebAssembly)": string;
"Overwrite patterns": string;
"Overwrite remote": string;
"Overwrite remote with local DB and passphrase.": string;
"Overwrite Server Data with This Device's Files": string;
"paneMaintenance.markDeviceResolvedAfterBackup": string;
"paneMaintenance.remoteLockedAndDeviceNotAccepted": string;
"paneMaintenance.remoteLockedResolvedDevice": string;
"paneMaintenance.unlockDatabaseReady": string;
"Paste a connection string": string;
"Paste the Setup URI generated from one of your active devices.": string;
"Patterns to match files for overwriting instead of merging": string;
"Patterns to match files for syncing": string;
"Peer-to-Peer only": string;
"Peer-to-Peer Synchronisation": string;
Perform: string;
"Perform cleanup": string;
"Perform Garbage Collection": string;
"Perform Garbage Collection to remove unused chunks and reduce database size.": string;
"Pick a file to resolve conflict": string;
"Please disable 'Read chunks online' in settings to use Garbage Collection.": string;
"Please enable 'Compute revisions for chunks' in settings to use Garbage Collection.": string;
"Please select 'Cancel' explicitly to cancel this operation.": string;
"Please select a method to import the settings from another device.": string;
"Please select an option to proceed": string;
"Please select the type of server to which you are connecting.": string;
"Please set this device name": string;
"Plug-in version": string;
"Proceed Garbage Collection": string;
"Proceed with Setup URI": string;
"Proceeding with Garbage Collection, ignoring missing nodes.": string;
"Proceeding with Garbage Collection.": string;
Progress: string;
"PureJS fallback (Fast, W/O WebAssembly)": string;
"Purge all download/upload cache.": string;
"Purge all journal counter": string;
"Rebuild local and remote database with local files.": string;
"Rebuilding Operations (Remote Only)": string;
"Recreate all": string;
"Recreate missing chunks for all files": string;
Remediation: string;
"Remediation Setting Changed": string;
"Remote Database Tweak (In sunset)": string;
"Remote Databases": string;
"Remote name": string;
Rename: string;
Resend: string;
"Resend all chunks to the remote.": string;
Reset: string;
"Reset all": string;
"Reset all journal counter": string;
"Reset journal received history": string;
"Reset journal sent history": string;
"Reset received": string;
"Reset sent history": string;
"Reset Synchronisation information": string;
"Reset Synchronisation on This Device": string;
"Resolve All": string;
"Resolve all conflicted files": string;
"Resolve All conflicted files by the newer one": string;
"Resolve all conflicted files by the newer one. Caution: This will overwrite the older one, and cannot resurrect the overwritten one.": string;
"Restart Now": string;
"Restore or reconstruct local database from remote.": string;
"S3/MinIO/R2 Object Storage": string;
"Scan a QR Code (Recommended for mobile)": string;
"Scan the QR code displayed on an active device using this device's camera.": string;
"Schedule and Restart": string;
"Scram!": string;
"Select the database adapter to use.": string;
Send: string;
"Send chunks": string;
"Setting.GenerateKeyPair.Desc": string;
"Setting.GenerateKeyPair.Title": string;
"Setup URI dialog cancelled.": string;
"Setup.RemoteE2EE.AdvancedTitle": string;
"Setup.RemoteE2EE.AlgorithmWarning": string;
"Setup.RemoteE2EE.ButtonCancel": string;
"Setup.RemoteE2EE.ButtonProceed": string;
"Setup.RemoteE2EE.DefaultAlgorithmDesc": string;
"Setup.RemoteE2EE.Guidance": string;
"Setup.RemoteE2EE.LabelEncrypt": string;
"Setup.RemoteE2EE.LabelEncryptionAlgorithm": string;
"Setup.RemoteE2EE.LabelObfuscateProperties": string;
"Setup.RemoteE2EE.MultiDestinationWarning": string;
"Setup.RemoteE2EE.ObfuscatePropertiesDesc": string;
"Setup.RemoteE2EE.PassphraseValidationLine1": string;
"Setup.RemoteE2EE.PassphraseValidationLine2": string;
"Setup.RemoteE2EE.PlaceholderPassphrase": string;
"Setup.RemoteE2EE.StronglyRecommendedLine1": string;
"Setup.RemoteE2EE.StronglyRecommendedLine2": string;
"Setup.RemoteE2EE.StronglyRecommendedTitle": string;
"Setup.RemoteE2EE.Title": string;
"Setup.ScanQRCode.ButtonClose": string;
"Setup.ScanQRCode.Guidance": string;
"Setup.ScanQRCode.Step1": string;
"Setup.ScanQRCode.Step2": string;
"Setup.ScanQRCode.Step3": string;
"Setup.ScanQRCode.Step4": string;
"Setup.ScanQRCode.Title": string;
"Setup.UseSetupURI.ButtonCancel": string;
"Setup.UseSetupURI.ButtonProceed": string;
"Setup.UseSetupURI.ErrorFailedToParse": string;
"Setup.UseSetupURI.ErrorPassphraseRequired": string;
"Setup.UseSetupURI.GuidanceLine1": string;
"Setup.UseSetupURI.GuidanceLine2": string;
"Setup.UseSetupURI.InvalidInfo": string;
"Setup.UseSetupURI.LabelPassphrase": string;
"Setup.UseSetupURI.LabelSetupURI": string;
"Setup.UseSetupURI.PlaceholderPassphrase": string;
"Setup.UseSetupURI.Title": string;
"Setup.UseSetupURI.ValidInfo": string;
"Show full banner": string;
"Show icon only": string;
"Show status icon instead of file warnings banner": string;
"Some devices have differing progress values (max: ${maxProgress}, min: ${minProgress}).\nThis may indicate that some devices have not completed synchronisation, which could lead to conflicts. Strongly recommend confirming that all devices are synchronised before proceeding.": string;
"Switch to IDB": string;
"Switch to IndexedDB": string;
"Synchronisation utilising journal files. You must have set up an S3/MinIO/R2 compatible object storage.": string;
"Synchronising files": string;
Syncing: string;
"Target patterns": string;
"The following accepted nodes are missing its node information:\n- ${missingNodes}\n\nThis indicates that they have not been connected for some time or have been left on an older version.\nIt is preferable to update all devices if possible. If you have any devices that are no longer in use, you can clear all accepted nodes by locking the remote once.": string;
"This feature enables direct synchronisation between devices. No server is required, but both devices must be online at the same time for synchronisation to occur, and some features may be limited. Internet connection is only required to signalling (detecting peers) and not for data transfer.": string;
"This is an advanced option for users who do not have a URI or who wish to configure detailed settings.": string;
"This is the most suitable synchronisation method for the design. All functions are available. You must have set up a CouchDB instance.": string;
"This will recreate chunks for all files. If there were missing chunks, this may fix the errors.": string;
"Use a Setup URI (Recommended)": string;
"Verify all": string;
"Verify and repair all files": string;
"We will now guide you through a few questions to simplify the synchronisation setup.": string;
"We will now proceed with the server configuration.": string;
"Welcome to Self-hosted LiveSync": string;
"xxhash32 (Fast but less collision resistance)": string;
"xxhash64 (Fastest)": string;
"Yes, I want to add this device to my existing synchronisation": string;
"Yes, I want to set up a new synchronisation": string;
"You are adding this device to an existing synchronisation setup.": string;
};
};
File diff suppressed because it is too large Load Diff
+689
View File
@@ -0,0 +1,689 @@
export declare const PartialMessages: {
readonly es: {
"(Active)": string;
"(BETA) Always overwrite with a newer file": string;
"(Beta) Use ignore files": string;
"(Days passed, 0 to disable automatic-deletion)": string;
"(ex. Read chunks online) If this option is enabled, LiveSync reads chunks online directly instead of replicating them locally. Increasing Custom chunk size is recommended.": string;
"(MB) If this is set, changes to local and remote files that are larger than this will be skipped. If the file becomes smaller again, a newer one will be used.": string;
"(Mega chars)": string;
"(Not recommended) If set, credentials will be stored in the file.": string;
"(Obsolete) Use an old adapter for compatibility": string;
"(RegExp) Empty to sync all files. Set filter as a regular expression to limit synchronising files.": string;
"(RegExp) If this is set, any changes to local and remote files that match this will be skipped.": string;
"(Select this if you are already using synchronisation on another computer or smartphone.) This option is suitable if you are new to LiveSync and want to set it up from scratch.": string;
"(Select this if you are configuring this device as the first synchronisation device.) This option is suitable if you are new to LiveSync and want to set it up from scratch.": string;
"A Setup URI is a single string of text containing your server address and authentication details. Using a URI, if one was generated by your server installation script, provides a simple and secure configuration.": string;
"Access Key": string;
Activate: string;
"Add default patterns": string;
"Add new connection": string;
"Always prompt merge conflicts": string;
"Apply Latest Change if Conflicting": string;
"Apply preset configuration": string;
"Ask a passphrase at every launch": string;
"Automatically Sync all files when opening Obsidian.": string;
Back: string;
"Back to non-configured": string;
"Batch database update": string;
"Batch limit": string;
"Batch size": string;
"Batch size of on-demand fetching": string;
"Before v0.17.16, we used an old adapter for the local database. Now the new adapter is preferred. However, it needs local database rebuilding. Please disable this toggle when you have enough time. If leave it enabled, also while fetching from the remote database, you will be asked to disable this.": string;
"Bucket Name": string;
Cancel: string;
"Check and convert non-path-obfuscated files": string;
"Check for documents that have not been converted to path-obfuscated IDs and convert them if necessary.": string;
"cmdConfigSync.showCustomizationSync": string;
"Comma separated `.gitignore, .dockerignore`": string;
"Compare the content of files between on local database and storage. If not matched, you will be asked which one you want to keep.": string;
"Compatibility (Conflict Behaviour)": string;
"Compatibility (Database structure)": string;
"Compatibility (Internal API Usage)": string;
"Compatibility (Metadata)": string;
"Compatibility (Remote Database)": string;
"Compatibility (Trouble addressed)": string;
"Compute revisions for chunks (Previous behaviour)": string;
"Configuration Encryption": string;
Configure: string;
"Configure And Change Remote": string;
"Configure E2EE": string;
"Configure Remote": string;
"Configure the same server information as your other devices again, manually, very advanced users only.": string;
"Connection Method": string;
"Continue to CouchDB setup": string;
"Continue to Peer-to-Peer only setup": string;
"Continue to S3/MinIO/R2 setup": string;
Copy: string;
"CouchDB Connection Tweak": string;
"Cross-platform": string;
"Current adapter: {adapter}": string;
"Customization Sync": string;
"Customization Sync (Beta3)": string;
"Data Compression": string;
"Database Adapter": string;
"Database Name": string;
"Database suffix": string;
Default: string;
"Delay conflict resolution of inactive files": string;
"Delay merge conflict prompt for inactive files.": string;
Delete: string;
"Delete all customization sync data": string;
"Delete all data on the remote server.": string;
"Delete local database to reset or uninstall Self-hosted LiveSync": string;
"Delete old metadata of deleted files on start-up": string;
"Delete Remote Configuration": string;
"Delete remote configuration '{name}'?": string;
desktop: string;
Developer: string;
"Device name": string;
"Device Setup Method": string;
"Disables all synchronization and restart.": string;
"Disables logging, only shows notifications. Please disable if you report an issue.": string;
"Display Language": string;
"Display name": string;
"Do not check configuration mismatch before replication": string;
"Do not keep metadata of deleted files.": string;
"Do not split chunks in the background": string;
"Do not use internal API": string;
Duplicate: string;
"Duplicate remote": string;
"E2EE Configuration": string;
"Edge case addressing (Behaviour)": string;
"Edge case addressing (Database)": string;
"Edge case addressing (Processing)": string;
"Emergency restart": string;
"Enable advanced features": string;
"Enable customization sync": string;
"Enable Developers' Debug Tools.": string;
"Enable edge case treatment features": string;
"Enable poweruser features": string;
"Enable this if your Object Storage doesn't support CORS": string;
"Enable this option to automatically apply the most recent change to documents even when it conflicts": string;
"Encrypt contents on the remote database. If you use the plugin's synchronization feature, enabling this is recommended.": string;
"Encrypting sensitive configuration items": string;
"Encryption phassphrase. If changed, you should overwrite the server's database with the new (encrypted) files.": string;
"End-to-End Encryption": string;
"Endpoint URL": string;
"Enhance chunk size": string;
"Enter Server Information": string;
"Enter the server information manually": string;
Export: string;
Fetch: string;
"Fetch chunks on demand": string;
"Fetch database with previous behaviour": string;
"Fetch remote settings": string;
"File to resolve conflict": string;
Filename: string;
"First, please select the option that best describes your current situation.": string;
"Flag and restart": string;
"Forces the file to be synced when opened.": string;
"Fresh Start Wipe": string;
"Garbage Collection V3 (Beta)": string;
"Handle files as Case-Sensitive": string;
"Hidden Files": string;
"How to display network errors when the sync server is unreachable.": string;
"How would you like to configure the connection to your server?": string;
"I am adding a device to an existing synchronisation setup": string;
"I am setting this up for the first time": string;
"I know my server details, let me enter them": string;
"If disabled(toggled), chunks will be split on the UI thread (Previous behaviour).": string;
"If enabled per-filed efficient customization sync will be used. We need a small migration when enabling this. And all devices should be updated to v0.23.18. Once we enabled this, we lost a compatibility with old versions.": string;
"If enabled, chunks will be split into no more than 100 items. However, dedupe is slightly weaker.": string;
"If enabled, newly created chunks are temporarily kept within the document, and graduated to become independent chunks once stabilised.": string;
"If enabled, the \u26D4 icon will be shown inside the status instead of the file warnings banner. No details will be shown.": string;
"If enabled, the file under 1kb will be processed in the UI thread.": string;
"If enabled, the notification of hidden files change will be suppressed.": string;
"If this enabled, all chunks will be stored with the revision made from its content. (Previous behaviour)": string;
"If this enabled, All files are handled as case-Sensitive (Previous behaviour).": string;
"If this enabled, chunks will be split into semantically meaningful segments. Not all platforms support this feature.": string;
"If this is set, changes to local files which are matched by the ignore files will be skipped. Remote changes are determined using local ignore files.": string;
"If this option is enabled, PouchDB will hold the connection open for 60 seconds, and if no change arrives in that time, close and reopen the socket, instead of holding it open indefinitely. Useful when a proxy limits request duration but can increase resource usage.": string;
"Ignore files": string;
"Ignore patterns": string;
"Import connection": string;
"Incubate Chunks in Document": string;
"Initialise all journal history, On the next sync, every item will be received and sent.": string;
"Interval (sec)": string;
"Keep empty folder": string;
"lang-de": string;
"lang-es": string;
"lang-fr": string;
"lang-ja": string;
"lang-ru": string;
"lang-zh": string;
"lang-zh-tw": string;
Later: string;
"Limit: {datetime} ({timestamp})": string;
"LiveSync could not handle multiple vaults which have same name without different prefix, This should be automatically configured.": string;
"liveSyncReplicator.beforeLiveSync": string;
"liveSyncReplicator.cantReplicateLowerValue": string;
"liveSyncReplicator.checkingLastSyncPoint": string;
"liveSyncReplicator.couldNotConnectTo": string;
"liveSyncReplicator.couldNotConnectToRemoteDb": string;
"liveSyncReplicator.couldNotConnectToServer": string;
"liveSyncReplicator.couldNotConnectToURI": string;
"liveSyncReplicator.couldNotMarkResolveRemoteDb": string;
"liveSyncReplicator.liveSyncBegin": string;
"liveSyncReplicator.lockRemoteDb": string;
"liveSyncReplicator.markDeviceResolved": string;
"liveSyncReplicator.oneShotSyncBegin": string;
"liveSyncReplicator.remoteDbCorrupted": string;
"liveSyncReplicator.remoteDbCreatedOrConnected": string;
"liveSyncReplicator.remoteDbDestroyed": string;
"liveSyncReplicator.remoteDbDestroyError": string;
"liveSyncReplicator.remoteDbMarkedResolved": string;
"liveSyncReplicator.replicationClosed": string;
"liveSyncReplicator.replicationInProgress": string;
"liveSyncReplicator.retryLowerBatchSize": string;
"liveSyncReplicator.unlockRemoteDb": string;
"liveSyncSetting.errorNoSuchSettingItem": string;
"liveSyncSetting.originalValue": string;
"liveSyncSetting.valueShouldBeInRange": string;
"liveSyncSettings.btnApply": string;
"Local Database Tweak": string;
Lock: string;
"Lock Server": string;
"Lock the remote server to prevent synchronization with other devices.": string;
"logPane.autoScroll": string;
"logPane.logWindowOpened": string;
"logPane.pause": string;
"logPane.title": string;
"logPane.wrap": string;
"Maximum delay for batch database updating": string;
"Maximum file size": string;
"Maximum Incubating Chunk Size": string;
"Maximum Incubating Chunks": string;
"Maximum Incubation Period": string;
"MB (0 to disable).": string;
"Memory cache": string;
"Memory cache size (by total characters)": string;
"Memory cache size (by total items)": string;
Merge: string;
"Minimum delay for batch database updating": string;
"moduleCheckRemoteSize.logCheckingStorageSizes": string;
"moduleCheckRemoteSize.logCurrentStorageSize": string;
"moduleCheckRemoteSize.logExceededWarning": string;
"moduleCheckRemoteSize.logThresholdEnlarged": string;
"moduleCheckRemoteSize.msgConfirmRebuild": string;
"moduleCheckRemoteSize.msgDatabaseGrowing": string;
"moduleCheckRemoteSize.msgSetDBCapacity": string;
"moduleCheckRemoteSize.option2GB": string;
"moduleCheckRemoteSize.option800MB": string;
"moduleCheckRemoteSize.optionAskMeLater": string;
"moduleCheckRemoteSize.optionDismiss": string;
"moduleCheckRemoteSize.optionIncreaseLimit": string;
"moduleCheckRemoteSize.optionNoWarn": string;
"moduleCheckRemoteSize.optionRebuildAll": string;
"moduleCheckRemoteSize.titleDatabaseSizeLimitExceeded": string;
"moduleCheckRemoteSize.titleDatabaseSizeNotify": string;
"moduleInputUIObsidian.defaultTitleConfirmation": string;
"moduleInputUIObsidian.defaultTitleSelect": string;
"moduleInputUIObsidian.optionNo": string;
"moduleInputUIObsidian.optionYes": string;
"moduleLiveSyncMain.logAdditionalSafetyScan": string;
"moduleLiveSyncMain.logLoadingPlugin": string;
"moduleLiveSyncMain.logPluginInitCancelled": string;
"moduleLiveSyncMain.logPluginVersion": string;
"moduleLiveSyncMain.logReadChangelog": string;
"moduleLiveSyncMain.logSafetyScanCompleted": string;
"moduleLiveSyncMain.logSafetyScanFailed": string;
"moduleLiveSyncMain.logUnloadingPlugin": string;
"moduleLiveSyncMain.logVersionUpdate": string;
"moduleLiveSyncMain.msgScramEnabled": string;
"moduleLiveSyncMain.optionKeepLiveSyncDisabled": string;
"moduleLiveSyncMain.optionResumeAndRestart": string;
"moduleLiveSyncMain.titleScramEnabled": string;
"moduleLocalDatabase.logWaitingForReady": string;
"moduleLog.showLog": string;
"moduleMigration.docUri": string;
"moduleMigration.logBulkSendCorrupted": string;
"moduleMigration.logFetchRemoteTweakFailed": string;
"moduleMigration.logLocalDatabaseNotReady": string;
"moduleMigration.logMigratedSameBehaviour": string;
"moduleMigration.logMigrationFailed": string;
"moduleMigration.logRedflag2CreationFail": string;
"moduleMigration.logRemoteTweakUnavailable": string;
"moduleMigration.logSetupCancelled": string;
"moduleMigration.msgFetchRemoteAgain": string;
"moduleMigration.msgInitialSetup": string;
"moduleMigration.msgRecommendSetupUri": string;
"moduleMigration.msgSinceV02321": string;
"moduleMigration.optionAdjustRemote": string;
"moduleMigration.optionDecideLater": string;
"moduleMigration.optionEnableBoth": string;
"moduleMigration.optionEnableFilenameCaseInsensitive": string;
"moduleMigration.optionEnableFixedRevisionForChunks": string;
"moduleMigration.optionHaveSetupUri": string;
"moduleMigration.optionKeepPreviousBehaviour": string;
"moduleMigration.optionManualSetup": string;
"moduleMigration.optionNoAskAgain": string;
"moduleObsidianMenu.replicate": string;
"More actions": string;
"Move remotely deleted files to the trash, instead of deleting.": string;
"Network warning style": string;
"New Remote": string;
"No limit configured": string;
"No, please take me back": string;
"Non-Synchronising files": string;
"Normal Files": string;
"Not all messages have been translated. And, please revert to \"Default\" when reporting errors.": string;
"Notify all setting files": string;
"Notify customized": string;
"Notify when other device has newly customized.": string;
"Notify when the estimated remote storage size exceeds on start up": string;
"Number of batches to process at a time. Defaults to 40. Minimum is 2. This along with batch size controls how many docs are kept in memory at a time.": string;
"Number of changes to sync at a time. Defaults to 50. Minimum is 2.": string;
"obsidianLiveSyncSettingTab.btnApply": string;
"obsidianLiveSyncSettingTab.btnCheck": string;
"obsidianLiveSyncSettingTab.btnCopy": string;
"obsidianLiveSyncSettingTab.btnDisable": string;
"obsidianLiveSyncSettingTab.btnDiscard": string;
"obsidianLiveSyncSettingTab.btnEnable": string;
"obsidianLiveSyncSettingTab.btnFix": string;
"obsidianLiveSyncSettingTab.btnGotItAndUpdated": string;
"obsidianLiveSyncSettingTab.btnNext": string;
"obsidianLiveSyncSettingTab.btnStart": string;
"obsidianLiveSyncSettingTab.btnTest": string;
"obsidianLiveSyncSettingTab.btnUse": string;
"obsidianLiveSyncSettingTab.buttonFetch": string;
"obsidianLiveSyncSettingTab.buttonNext": string;
"obsidianLiveSyncSettingTab.defaultLanguage": string;
"obsidianLiveSyncSettingTab.descConnectSetupURI": string;
"obsidianLiveSyncSettingTab.descCopySetupURI": string;
"obsidianLiveSyncSettingTab.descEnableLiveSync": string;
"obsidianLiveSyncSettingTab.descFetchConfigFromRemote": string;
"obsidianLiveSyncSettingTab.descManualSetup": string;
"obsidianLiveSyncSettingTab.descTestDatabaseConnection": string;
"obsidianLiveSyncSettingTab.descValidateDatabaseConfig": string;
"obsidianLiveSyncSettingTab.errAccessForbidden": string;
"obsidianLiveSyncSettingTab.errCannotContinueTest": string;
"obsidianLiveSyncSettingTab.errCorsCredentials": string;
"obsidianLiveSyncSettingTab.errCorsNotAllowingCredentials": string;
"obsidianLiveSyncSettingTab.errCorsOrigins": string;
"obsidianLiveSyncSettingTab.errEnableCors": string;
"obsidianLiveSyncSettingTab.errMaxDocumentSize": string;
"obsidianLiveSyncSettingTab.errMaxRequestSize": string;
"obsidianLiveSyncSettingTab.errMissingWwwAuth": string;
"obsidianLiveSyncSettingTab.errRequireValidUser": string;
"obsidianLiveSyncSettingTab.errRequireValidUserAuth": string;
"obsidianLiveSyncSettingTab.labelDisabled": string;
"obsidianLiveSyncSettingTab.labelEnabled": string;
"obsidianLiveSyncSettingTab.levelAdvanced": string;
"obsidianLiveSyncSettingTab.levelEdgeCase": string;
"obsidianLiveSyncSettingTab.levelPowerUser": string;
"obsidianLiveSyncSettingTab.linkOpenInBrowser": string;
"obsidianLiveSyncSettingTab.linkPageTop": string;
"obsidianLiveSyncSettingTab.linkTipsAndTroubleshooting": string;
"obsidianLiveSyncSettingTab.linkTroubleshooting": string;
"obsidianLiveSyncSettingTab.logCannotUseCloudant": string;
"obsidianLiveSyncSettingTab.logCheckingConfigDone": string;
"obsidianLiveSyncSettingTab.logCheckingConfigFailed": string;
"obsidianLiveSyncSettingTab.logCheckingDbConfig": string;
"obsidianLiveSyncSettingTab.logCheckPassphraseFailed": string;
"obsidianLiveSyncSettingTab.logConfiguredDisabled": string;
"obsidianLiveSyncSettingTab.logConfiguredLiveSync": string;
"obsidianLiveSyncSettingTab.logConfiguredPeriodic": string;
"obsidianLiveSyncSettingTab.logCouchDbConfigFail": string;
"obsidianLiveSyncSettingTab.logCouchDbConfigSet": string;
"obsidianLiveSyncSettingTab.logCouchDbConfigUpdated": string;
"obsidianLiveSyncSettingTab.logDatabaseConnected": string;
"obsidianLiveSyncSettingTab.logEncryptionNoPassphrase": string;
"obsidianLiveSyncSettingTab.logEncryptionNoSupport": string;
"obsidianLiveSyncSettingTab.logErrorOccurred": string;
"obsidianLiveSyncSettingTab.logEstimatedSize": string;
"obsidianLiveSyncSettingTab.logPassphraseInvalid": string;
"obsidianLiveSyncSettingTab.logPassphraseNotCompatible": string;
"obsidianLiveSyncSettingTab.logRebuildNote": string;
"obsidianLiveSyncSettingTab.logSelectAnyPreset": string;
"obsidianLiveSyncSettingTab.msgAreYouSureProceed": string;
"obsidianLiveSyncSettingTab.msgChangesNeedToBeApplied": string;
"obsidianLiveSyncSettingTab.msgConfigCheck": string;
"obsidianLiveSyncSettingTab.msgConfigCheckFailed": string;
"obsidianLiveSyncSettingTab.msgConnectionCheck": string;
"obsidianLiveSyncSettingTab.msgConnectionProxyNote": string;
"obsidianLiveSyncSettingTab.msgCurrentOrigin": string;
"obsidianLiveSyncSettingTab.msgDiscardConfirmation": string;
"obsidianLiveSyncSettingTab.msgDone": string;
"obsidianLiveSyncSettingTab.msgEnableCors": string;
"obsidianLiveSyncSettingTab.msgEnableEncryptionRecommendation": string;
"obsidianLiveSyncSettingTab.msgFetchConfigFromRemote": string;
"obsidianLiveSyncSettingTab.msgGenerateSetupURI": string;
"obsidianLiveSyncSettingTab.msgIfConfigNotPersistent": string;
"obsidianLiveSyncSettingTab.msgInvalidPassphrase": string;
"obsidianLiveSyncSettingTab.msgNewVersionNote": string;
"obsidianLiveSyncSettingTab.msgNonHTTPSInfo": string;
"obsidianLiveSyncSettingTab.msgNonHTTPSWarning": string;
"obsidianLiveSyncSettingTab.msgNotice": string;
"obsidianLiveSyncSettingTab.msgObjectStorageWarning": string;
"obsidianLiveSyncSettingTab.msgOriginCheck": string;
"obsidianLiveSyncSettingTab.msgRebuildRequired": string;
"obsidianLiveSyncSettingTab.msgSelectAndApplyPreset": string;
"obsidianLiveSyncSettingTab.msgSetCorsCredentials": string;
"obsidianLiveSyncSettingTab.msgSetCorsOrigins": string;
"obsidianLiveSyncSettingTab.msgSetMaxDocSize": string;
"obsidianLiveSyncSettingTab.msgSetMaxRequestSize": string;
"obsidianLiveSyncSettingTab.msgSetRequireValidUser": string;
"obsidianLiveSyncSettingTab.msgSetRequireValidUserAuth": string;
"obsidianLiveSyncSettingTab.msgSettingModified": string;
"obsidianLiveSyncSettingTab.msgSettingsUnchangeableDuringSync": string;
"obsidianLiveSyncSettingTab.msgSetWwwAuth": string;
"obsidianLiveSyncSettingTab.nameApplySettings": string;
"obsidianLiveSyncSettingTab.nameConnectSetupURI": string;
"obsidianLiveSyncSettingTab.nameCopySetupURI": string;
"obsidianLiveSyncSettingTab.nameDisableHiddenFileSync": string;
"obsidianLiveSyncSettingTab.nameDiscardSettings": string;
"obsidianLiveSyncSettingTab.nameEnableHiddenFileSync": string;
"obsidianLiveSyncSettingTab.nameEnableLiveSync": string;
"obsidianLiveSyncSettingTab.nameHiddenFileSynchronization": string;
"obsidianLiveSyncSettingTab.nameManualSetup": string;
"obsidianLiveSyncSettingTab.nameTestConnection": string;
"obsidianLiveSyncSettingTab.nameTestDatabaseConnection": string;
"obsidianLiveSyncSettingTab.nameValidateDatabaseConfig": string;
"obsidianLiveSyncSettingTab.okAdminPrivileges": string;
"obsidianLiveSyncSettingTab.okCorsCredentials": string;
"obsidianLiveSyncSettingTab.okCorsCredentialsForOrigin": string;
"obsidianLiveSyncSettingTab.okCorsOriginMatched": string;
"obsidianLiveSyncSettingTab.okCorsOrigins": string;
"obsidianLiveSyncSettingTab.okEnableCors": string;
"obsidianLiveSyncSettingTab.okMaxDocumentSize": string;
"obsidianLiveSyncSettingTab.okMaxRequestSize": string;
"obsidianLiveSyncSettingTab.okRequireValidUser": string;
"obsidianLiveSyncSettingTab.okRequireValidUserAuth": string;
"obsidianLiveSyncSettingTab.okWwwAuth": string;
"obsidianLiveSyncSettingTab.optionApply": string;
"obsidianLiveSyncSettingTab.optionCancel": string;
"obsidianLiveSyncSettingTab.optionCouchDB": string;
"obsidianLiveSyncSettingTab.optionDisableAllAutomatic": string;
"obsidianLiveSyncSettingTab.optionFetchFromRemote": string;
"obsidianLiveSyncSettingTab.optionHere": string;
"obsidianLiveSyncSettingTab.optionLiveSync": string;
"obsidianLiveSyncSettingTab.optionMinioS3R2": string;
"obsidianLiveSyncSettingTab.optionOkReadEverything": string;
"obsidianLiveSyncSettingTab.optionOnEvents": string;
"obsidianLiveSyncSettingTab.optionPeriodicAndEvents": string;
"obsidianLiveSyncSettingTab.optionPeriodicWithBatch": string;
"obsidianLiveSyncSettingTab.optionRebuildBoth": string;
"obsidianLiveSyncSettingTab.optionSaveOnlySettings": string;
"obsidianLiveSyncSettingTab.panelChangeLog": string;
"obsidianLiveSyncSettingTab.panelGeneralSettings": string;
"obsidianLiveSyncSettingTab.panelPrivacyEncryption": string;
"obsidianLiveSyncSettingTab.panelRemoteConfiguration": string;
"obsidianLiveSyncSettingTab.panelSetup": string;
"obsidianLiveSyncSettingTab.titleAppearance": string;
"obsidianLiveSyncSettingTab.titleConflictResolution": string;
"obsidianLiveSyncSettingTab.titleCongratulations": string;
"obsidianLiveSyncSettingTab.titleCouchDB": string;
"obsidianLiveSyncSettingTab.titleDeletionPropagation": string;
"obsidianLiveSyncSettingTab.titleEncryptionNotEnabled": string;
"obsidianLiveSyncSettingTab.titleEncryptionPassphraseInvalid": string;
"obsidianLiveSyncSettingTab.titleExtraFeatures": string;
"obsidianLiveSyncSettingTab.titleFetchConfig": string;
"obsidianLiveSyncSettingTab.titleFetchConfigFromRemote": string;
"obsidianLiveSyncSettingTab.titleFetchSettings": string;
"obsidianLiveSyncSettingTab.titleHiddenFiles": string;
"obsidianLiveSyncSettingTab.titleLogging": string;
"obsidianLiveSyncSettingTab.titleMinioS3R2": string;
"obsidianLiveSyncSettingTab.titleNotification": string;
"obsidianLiveSyncSettingTab.titleOnlineTips": string;
"obsidianLiveSyncSettingTab.titleQuickSetup": string;
"obsidianLiveSyncSettingTab.titleRebuildRequired": string;
"obsidianLiveSyncSettingTab.titleRemoteConfigCheckFailed": string;
"obsidianLiveSyncSettingTab.titleRemoteServer": string;
"obsidianLiveSyncSettingTab.titleReset": string;
"obsidianLiveSyncSettingTab.titleSetupOtherDevices": string;
"obsidianLiveSyncSettingTab.titleSynchronizationMethod": string;
"obsidianLiveSyncSettingTab.titleSynchronizationPreset": string;
"obsidianLiveSyncSettingTab.titleSyncSettings": string;
"obsidianLiveSyncSettingTab.titleSyncSettingsViaMarkdown": string;
"obsidianLiveSyncSettingTab.titleUpdateThinning": string;
"obsidianLiveSyncSettingTab.warnCorsOriginUnmatched": string;
"obsidianLiveSyncSettingTab.warnNoAdmin": string;
Ok: string;
"Old Algorithm": string;
"Older fallback (Slow, W/O WebAssembly)": string;
Open: string;
"Open the dialog": string;
Overwrite: string;
"Overwrite patterns": string;
"Overwrite remote": string;
"Overwrite remote with local DB and passphrase.": string;
"Overwrite Server Data with This Device's Files": string;
"paneMaintenance.markDeviceResolvedAfterBackup": string;
"paneMaintenance.remoteLockedAndDeviceNotAccepted": string;
"paneMaintenance.remoteLockedResolvedDevice": string;
"paneMaintenance.unlockDatabaseReady": string;
Passphrase: string;
"Passphrase of sensitive configuration items": string;
password: string;
Password: string;
"Paste a connection string": string;
"Paste the Setup URI generated from one of your active devices.": string;
"Path Obfuscation": string;
"Patterns to match files for overwriting instead of merging": string;
"Patterns to match files for syncing": string;
"Peer-to-Peer only": string;
"Peer-to-Peer Synchronisation": string;
"Per-file-saved customization sync": string;
Perform: string;
"Perform cleanup": string;
"Perform Garbage Collection": string;
"Perform Garbage Collection to remove unused chunks and reduce database size.": string;
"Periodic Sync interval": string;
"Pick a file to resolve conflict": string;
"Please select a method to import the settings from another device.": string;
"Please select an option to proceed": string;
"Please select the type of server to which you are connecting.": string;
"Please set device name to identify this device. This name should be unique among your devices. While not configured, we cannot enable this feature.": string;
"Please set this device name": string;
Presets: string;
"Proceed with Setup URI": string;
"Process small files in the foreground": string;
"PureJS fallback (Fast, W/O WebAssembly)": string;
"Purge all download/upload cache.": string;
"Purge all journal counter": string;
"Rebuild local and remote database with local files.": string;
"Rebuilding Operations (Remote Only)": string;
"Recreate all": string;
"Recreate missing chunks for all files": string;
"Reducing the frequency with which on-disk changes are reflected into the DB": string;
Region: string;
Remediation: string;
"Remediation Setting Changed": string;
"Remote Database Tweak (In sunset)": string;
"Remote Databases": string;
"Remote name": string;
"Remote server type": string;
"Remote Type": string;
Rename: string;
"Requires restart of Obsidian": string;
"Requires restart of Obsidian.": string;
Resend: string;
"Resend all chunks to the remote.": string;
Reset: string;
"Reset all": string;
"Reset all journal counter": string;
"Reset journal received history": string;
"Reset journal sent history": string;
"Reset received": string;
"Reset sent history": string;
"Reset Synchronisation information": string;
"Reset Synchronisation on This Device": string;
"Resolve All": string;
"Resolve all conflicted files": string;
"Resolve All conflicted files by the newer one": string;
"Resolve all conflicted files by the newer one. Caution: This will overwrite the older one, and cannot resurrect the overwritten one.": string;
"Restart Now": string;
"Restore or reconstruct local database from remote.": string;
"S3/MinIO/R2 Object Storage": string;
"Save settings to a markdown file. You will be notified when new settings arrive. You can set different files by the platform.": string;
"Saving will be performed forcefully after this number of seconds.": string;
"Scan a QR Code (Recommended for mobile)": string;
"Scan changes on customization sync": string;
"Scan customization automatically": string;
"Scan customization before replicating.": string;
"Scan customization every 1 minute.": string;
"Scan customization periodically": string;
"Scan for hidden files before replication": string;
"Scan hidden files periodically": string;
"Scan the QR code displayed on an active device using this device's camera.": string;
"Schedule and Restart": string;
"Scram!": string;
"Seconds, 0 to disable": string;
"Seconds. Saving to the local database will be delayed until this value after we stop typing or saving.": string;
"Secret Key": string;
"Select the database adapter to use.": string;
Send: string;
"Send chunks": string;
"Server URI": string;
"Setting.GenerateKeyPair.Desc": string;
"Setting.GenerateKeyPair.Title": string;
"Setup.> [!INFO]- The connected devices have been detected as follows:\n${devices}": string;
"Setup.All devices have the same progress value (${progress}). Your devices seem to be synchronised. And be able to proceed with Garbage Collection.": string;
"Setup.Cancel Garbage Collection": string;
"Setup.Compaction in progress on remote database...": string;
"Setup.Compaction on remote database completed successfully.": string;
"Setup.Compaction on remote database failed.": string;
"Setup.Compaction on remote database timed out.": string;
"Setup.Device": string;
"Setup.Failed to connect to remote for compaction.": string;
"Setup.Failed to connect to remote for compaction. ${reason}": string;
"Setup.Failed to start one-shot replication before Garbage Collection. Garbage Collection Cancelled.": string;
"Setup.Failed to start replication after Garbage Collection.": string;
"Setup.Garbage Collection cancelled by user.": string;
"Setup.Garbage Collection completed. Deleted chunks: ${deletedChunks} / ${totalChunks}. Time taken: ${seconds} seconds.": string;
"Setup.Garbage Collection Confirmation": string;
"Setup.Garbage Collection: Found ${unusedChunks} unused chunks to delete.": string;
"Setup.Garbage Collection: Scanned ${scanned} / ~${docCount}": string;
"Setup.Garbage Collection: Scanning completed. Total chunks: ${totalChunks}, Used chunks: ${usedChunks}": string;
"Setup.Ignore and Proceed": string;
"Setup.No connected device information found. Cancelling Garbage Collection.": string;
"Setup.Node ID": string;
"Setup.Node Information Missing": string;
"Setup.Obsidian version": string;
"Setup.optionNoSetupUri": string;
"Setup.optionRemindNextLaunch": string;
"Setup.optionSetupWizard": string;
"Setup.optionYesFetchAgain": string;
"Setup.Please disable 'Read chunks online' in settings to use Garbage Collection.": string;
"Setup.Please enable 'Compute revisions for chunks' in settings to use Garbage Collection.": string;
"Setup.Please select 'Cancel' explicitly to cancel this operation.": string;
"Setup.Plug-in version": string;
"Setup.Proceed Garbage Collection": string;
"Setup.Proceeding with Garbage Collection, ignoring missing nodes.": string;
"Setup.Proceeding with Garbage Collection.": string;
"Setup.Progress": string;
"Setup.RemoteE2EE.AdvancedTitle": string;
"Setup.RemoteE2EE.AlgorithmWarning": string;
"Setup.RemoteE2EE.ButtonCancel": string;
"Setup.RemoteE2EE.ButtonProceed": string;
"Setup.RemoteE2EE.DefaultAlgorithmDesc": string;
"Setup.RemoteE2EE.Guidance": string;
"Setup.RemoteE2EE.LabelEncrypt": string;
"Setup.RemoteE2EE.LabelEncryptionAlgorithm": string;
"Setup.RemoteE2EE.LabelObfuscateProperties": string;
"Setup.RemoteE2EE.MultiDestinationWarning": string;
"Setup.RemoteE2EE.ObfuscatePropertiesDesc": string;
"Setup.RemoteE2EE.PassphraseValidationLine1": string;
"Setup.RemoteE2EE.PassphraseValidationLine2": string;
"Setup.RemoteE2EE.PlaceholderPassphrase": string;
"Setup.RemoteE2EE.StronglyRecommendedLine1": string;
"Setup.RemoteE2EE.StronglyRecommendedLine2": string;
"Setup.RemoteE2EE.StronglyRecommendedTitle": string;
"Setup.RemoteE2EE.Title": string;
"Setup.ScanQRCode.ButtonClose": string;
"Setup.ScanQRCode.Guidance": string;
"Setup.ScanQRCode.Step1": string;
"Setup.ScanQRCode.Step2": string;
"Setup.ScanQRCode.Step3": string;
"Setup.ScanQRCode.Step4": string;
"Setup.ScanQRCode.Title": string;
"Setup.Setup URI dialog cancelled.": string;
"Setup.Some devices have differing progress values (max: ${maxProgress}, min: ${minProgress}).\nThis may indicate that some devices have not completed synchronisation, which could lead to conflicts. Strongly recommend confirming that all devices are synchronised before proceeding.": string;
"Setup.The following accepted nodes are missing its node information:\n- ${missingNodes}\n\nThis indicates that they have not been connected for some time or have been left on an older version.\nIt is preferable to update all devices if possible. If you have any devices that are no longer in use, you can clear all accepted nodes by locking the remote once.": string;
"Setup.titleCaseSensitivity": string;
"Setup.titleRecommendSetupUri": string;
"Setup.titleWelcome": string;
"Setup.UseSetupURI.ButtonCancel": string;
"Setup.UseSetupURI.ButtonProceed": string;
"Setup.UseSetupURI.ErrorFailedToParse": string;
"Setup.UseSetupURI.ErrorPassphraseRequired": string;
"Setup.UseSetupURI.GuidanceLine1": string;
"Setup.UseSetupURI.GuidanceLine2": string;
"Setup.UseSetupURI.InvalidInfo": string;
"Setup.UseSetupURI.LabelPassphrase": string;
"Setup.UseSetupURI.LabelSetupURI": string;
"Setup.UseSetupURI.PlaceholderPassphrase": string;
"Setup.UseSetupURI.Title": string;
"Setup.UseSetupURI.ValidInfo": string;
"Should we keep folders that don't have any files inside?": string;
"Should we only check for conflicts when a file is opened?": string;
"Should we prompt you about conflicting files when a file is opened?": string;
"Should we prompt you for every single merge, even if we can safely merge automatcially?": string;
"Show full banner": string;
"Show only notifications": string;
"Show status as icons only": string;
"Show status icon instead of file warnings banner": string;
"Show status inside the editor": string;
"Show status on the status bar": string;
"Show verbose log. Please enable if you report an issue.": string;
"Starts synchronisation when a file is saved.": string;
"Stop reflecting database changes to storage files.": string;
"Stop watching for file changes.": string;
"Suppress notification of hidden files change": string;
"Suspend database reflecting": string;
"Suspend file watching": string;
"Switch to IDB": string;
"Switch to IndexedDB": string;
"Sync after merging file": string;
"Sync automatically after merging files": string;
"Sync Mode": string;
"Sync on Editor Save": string;
"Sync on File Open": string;
"Sync on Save": string;
"Sync on Startup": string;
"Synchronisation utilising journal files. You must have set up an S3/MinIO/R2 compatible object storage.": string;
"Synchronising files": string;
Syncing: string;
"Target patterns": string;
"Testing only - Resolve file conflicts by syncing newer copies of the file, this can overwrite modified files. Be Warned.": string;
"The delay for consecutive on-demand fetches": string;
"The Hash algorithm for chunk IDs": string;
"The maximum duration for which chunks can be incubated within the document. Chunks exceeding this period will graduate to independent chunks.": string;
"The maximum number of chunks that can be incubated within the document. Chunks exceeding this number will immediately graduate to independent chunks.": string;
"The maximum total size of chunks that can be incubated within the document. Chunks exceeding this size will immediately graduate to independent chunks.": string;
"This feature enables direct synchronisation between devices. No server is required, but both devices must be online at the same time for synchronisation to occur, and some features may be limited. Internet connection is only required to signalling (detecting peers) and not for data transfer.": string;
"This is an advanced option for users who do not have a URI or who wish to configure detailed settings.": string;
"This is the most suitable synchronisation method for the design. All functions are available. You must have set up a CouchDB instance.": string;
"This passphrase will not be copied to another device. It will be set to `Default` until you configure it again.": string;
"This will recreate chunks for all files. If there were missing chunks, this may fix the errors.": string;
"Transfer Tweak": string;
"Unique name between all synchronized devices. To edit this setting, please disable customization sync once.": string;
"Use a custom passphrase": string;
"Use a Setup URI (Recommended)": string;
"Use Custom HTTP Handler": string;
"Use dynamic iteration count": string;
"Use Segmented-splitter": string;
"Use splitting-limit-capped chunk splitter": string;
"Use the trash bin": string;
"Use timeouts instead of heartbeats": string;
username: string;
Username: string;
"Verbose Log": string;
"Verify all": string;
"Verify and repair all files": string;
"Warning! This will have a serious impact on performance. And the logs will not be synchronised under the default name. Please be careful with logs; they often contain your confidential information.": string;
"We cannot change the device name while this feature is enabled. Please disable this feature to change the device name.": string;
"We will now guide you through a few questions to simplify the synchronisation setup.": string;
"We will now proceed with the server configuration.": string;
"Welcome to Self-hosted LiveSync": string;
"When you save a file in the editor, start a sync automatically": string;
"Write credentials in the file": string;
"Write logs into the file": string;
"xxhash32 (Fast but less collision resistance)": string;
"xxhash64 (Fastest)": string;
"Yes, I want to add this device to my existing synchronisation": string;
"Yes, I want to set up a new synchronisation": string;
"You are adding this device to an existing synchronisation setup.": string;
};
};
+582
View File
@@ -0,0 +1,582 @@
export declare const PartialMessages: {
readonly fr: {
"(BETA) Always overwrite with a newer file": string;
"(Beta) Use ignore files": string;
"(Days passed, 0 to disable automatic-deletion)": string;
"(ex. Read chunks online) If this option is enabled, LiveSync reads chunks online directly instead of replicating them locally. Increasing Custom chunk size is recommended.": string;
"(MB) If this is set, changes to local and remote files that are larger than this will be skipped. If the file becomes smaller again, a newer one will be used.": string;
"(Mega chars)": string;
"(Not recommended) If set, credentials will be stored in the file.": string;
"(Obsolete) Use an old adapter for compatibility": string;
"Access Key": string;
"Active Remote Configuration": string;
"Always prompt merge conflicts": string;
Analyse: string;
"Analyse database usage": string;
"Analyse database usage and generate a TSV report for diagnosis yourself. You can paste the generated report with any spreadsheet you like.": string;
"Apply Latest Change if Conflicting": string;
"Apply preset configuration": string;
"Automatically Sync all files when opening Obsidian.": string;
"Batch database update": string;
"Batch limit": string;
"Batch size": string;
"Batch size of on-demand fetching": string;
"Before v0.17.16, we used an old adapter for the local database. Now the new adapter is preferred. However, it needs local database rebuilding. Please disable this toggle when you have enough time. If leave it enabled, also while fetching from the remote database, you will be asked to disable this.": string;
"Bucket Name": string;
Check: string;
"cmdConfigSync.showCustomizationSync": string;
"Comma separated `.gitignore, .dockerignore`": string;
"Compute revisions for chunks": string;
"Copy Report to clipboard": string;
"Data Compression": string;
"Database Name": string;
"Database suffix": string;
"Delay conflict resolution of inactive files": string;
"Delay merge conflict prompt for inactive files.": string;
"Delete old metadata of deleted files on start-up": string;
"Device name": string;
"dialog.yourLanguageAvailable": string;
"dialog.yourLanguageAvailable.btnRevertToDefault": string;
"dialog.yourLanguageAvailable.Title": string;
"Disables logging, only shows notifications. Please disable if you report an issue.": string;
"Display Language": string;
"Do not check configuration mismatch before replication": string;
"Do not keep metadata of deleted files.": string;
"Do not split chunks in the background": string;
"Do not use internal API": string;
"Doctor.Button.DismissThisVersion": string;
"Doctor.Button.Fix": string;
"Doctor.Button.FixButNoRebuild": string;
"Doctor.Button.No": string;
"Doctor.Button.Skip": string;
"Doctor.Button.Yes": string;
"Doctor.Dialogue.Main": string;
"Doctor.Dialogue.MainFix": string;
"Doctor.Dialogue.Title": string;
"Doctor.Dialogue.TitleAlmostDone": string;
"Doctor.Dialogue.TitleFix": string;
"Doctor.Level.Must": string;
"Doctor.Level.Necessary": string;
"Doctor.Level.Optional": string;
"Doctor.Level.Recommended": string;
"Doctor.Message.NoIssues": string;
"Doctor.Message.RebuildLocalRequired": string;
"Doctor.Message.RebuildRequired": string;
"Doctor.Message.SomeSkipped": string;
"Doctor.RULES.E2EE_V02500.REASON": string;
"Enable advanced features": string;
"Enable customization sync": string;
"Enable Developers' Debug Tools.": string;
"Enable edge case treatment features": string;
"Enable poweruser features": string;
"Enable this if your Object Storage doesn't support CORS": string;
"Enable this option to automatically apply the most recent change to documents even when it conflicts": string;
"Encrypt contents on the remote database. If you use the plugin's synchronization feature, enabling this is recommended.": string;
"Encrypting sensitive configuration items": string;
"Encryption phassphrase. If changed, you should overwrite the server's database with the new (encrypted) files.": string;
"End-to-End Encryption": string;
"Endpoint URL": string;
"Enhance chunk size": string;
"Fetch chunks on demand": string;
"Fetch database with previous behaviour": string;
Filename: string;
"Forces the file to be synced when opened.": string;
"Handle files as Case-Sensitive": string;
"If disabled(toggled), chunks will be split on the UI thread (Previous behaviour).": string;
"If enabled per-filed efficient customization sync will be used. We need a small migration when enabling this. And all devices should be updated to v0.23.18. Once we enabled this, we lost a compatibility with old versions.": string;
"If enabled, chunks will be split into no more than 100 items. However, dedupe is slightly weaker.": string;
"If enabled, newly created chunks are temporarily kept within the document, and graduated to become independent chunks once stabilised.": string;
"If enabled, the \u26D4 icon will be shown inside the status instead of the file warnings banner. No details will be shown.": string;
"If enabled, the file under 1kb will be processed in the UI thread.": string;
"If enabled, the notification of hidden files change will be suppressed.": string;
"If this enabled, all chunks will be stored with the revision made from its content. (Previous behaviour)": string;
"If this enabled, All files are handled as case-Sensitive (Previous behaviour).": string;
"If this enabled, chunks will be split into semantically meaningful segments. Not all platforms support this feature.": string;
"If this is set, changes to local files which are matched by the ignore files will be skipped. Remote changes are determined using local ignore files.": string;
"If this option is enabled, PouchDB will hold the connection open for 60 seconds, and if no change arrives in that time, close and reopen the socket, instead of holding it open indefinitely. Useful when a proxy limits request duration but can increase resource usage.": string;
"Ignore files": string;
"Incubate Chunks in Document": string;
"Interval (sec)": string;
"K.exp": string;
"K.long_p2p_sync": string;
"K.P2P": string;
"K.Peer": string;
"K.ScanCustomization": string;
"K.short_p2p_sync": string;
"K.title_p2p_sync": string;
"Keep empty folder": string;
lang_def: string;
"lang-de": string;
"lang-def": string;
"lang-es": string;
"lang-fr": string;
"lang-ja": string;
"lang-ko": string;
"lang-ru": string;
"lang-zh": string;
"lang-zh-tw": string;
"LiveSync could not handle multiple vaults which have same name without different prefix, This should be automatically configured.": string;
"liveSyncReplicator.beforeLiveSync": string;
"liveSyncReplicator.cantReplicateLowerValue": string;
"liveSyncReplicator.checkingLastSyncPoint": string;
"liveSyncReplicator.couldNotConnectTo": string;
"liveSyncReplicator.couldNotConnectToRemoteDb": string;
"liveSyncReplicator.couldNotConnectToServer": string;
"liveSyncReplicator.couldNotConnectToURI": string;
"liveSyncReplicator.couldNotMarkResolveRemoteDb": string;
"liveSyncReplicator.liveSyncBegin": string;
"liveSyncReplicator.lockRemoteDb": string;
"liveSyncReplicator.markDeviceResolved": string;
"liveSyncReplicator.oneShotSyncBegin": string;
"liveSyncReplicator.remoteDbCorrupted": string;
"liveSyncReplicator.remoteDbCreatedOrConnected": string;
"liveSyncReplicator.remoteDbDestroyed": string;
"liveSyncReplicator.remoteDbDestroyError": string;
"liveSyncReplicator.remoteDbMarkedResolved": string;
"liveSyncReplicator.replicationClosed": string;
"liveSyncReplicator.replicationInProgress": string;
"liveSyncReplicator.retryLowerBatchSize": string;
"liveSyncReplicator.unlockRemoteDb": string;
"liveSyncSetting.errorNoSuchSettingItem": string;
"liveSyncSetting.originalValue": string;
"liveSyncSetting.valueShouldBeInRange": string;
"liveSyncSettings.btnApply": string;
"logPane.autoScroll": string;
"logPane.logWindowOpened": string;
"logPane.pause": string;
"logPane.title": string;
"logPane.wrap": string;
"Maximum delay for batch database updating": string;
"Maximum file size": string;
"Maximum Incubating Chunk Size": string;
"Maximum Incubating Chunks": string;
"Maximum Incubation Period": string;
"MB (0 to disable).": string;
"Memory cache size (by total characters)": string;
"Memory cache size (by total items)": string;
"Minimum delay for batch database updating": string;
"Minimum interval for syncing": string;
"moduleCheckRemoteSize.logCheckingStorageSizes": string;
"moduleCheckRemoteSize.logCurrentStorageSize": string;
"moduleCheckRemoteSize.logExceededWarning": string;
"moduleCheckRemoteSize.logThresholdEnlarged": string;
"moduleCheckRemoteSize.msgConfirmRebuild": string;
"moduleCheckRemoteSize.msgDatabaseGrowing": string;
"moduleCheckRemoteSize.msgSetDBCapacity": string;
"moduleCheckRemoteSize.option2GB": string;
"moduleCheckRemoteSize.option800MB": string;
"moduleCheckRemoteSize.optionAskMeLater": string;
"moduleCheckRemoteSize.optionDismiss": string;
"moduleCheckRemoteSize.optionIncreaseLimit": string;
"moduleCheckRemoteSize.optionNoWarn": string;
"moduleCheckRemoteSize.optionRebuildAll": string;
"moduleCheckRemoteSize.titleDatabaseSizeLimitExceeded": string;
"moduleCheckRemoteSize.titleDatabaseSizeNotify": string;
"moduleInputUIObsidian.defaultTitleConfirmation": string;
"moduleInputUIObsidian.defaultTitleSelect": string;
"moduleInputUIObsidian.optionNo": string;
"moduleInputUIObsidian.optionYes": string;
"moduleLiveSyncMain.logAdditionalSafetyScan": string;
"moduleLiveSyncMain.logLoadingPlugin": string;
"moduleLiveSyncMain.logPluginInitCancelled": string;
"moduleLiveSyncMain.logPluginVersion": string;
"moduleLiveSyncMain.logReadChangelog": string;
"moduleLiveSyncMain.logSafetyScanCompleted": string;
"moduleLiveSyncMain.logSafetyScanFailed": string;
"moduleLiveSyncMain.logUnloadingPlugin": string;
"moduleLiveSyncMain.logVersionUpdate": string;
"moduleLiveSyncMain.msgScramEnabled": string;
"moduleLiveSyncMain.optionKeepLiveSyncDisabled": string;
"moduleLiveSyncMain.optionResumeAndRestart": string;
"moduleLiveSyncMain.titleScramEnabled": string;
"moduleLocalDatabase.logWaitingForReady": string;
"moduleLog.showLog": string;
"moduleMigration.docUri": string;
"moduleMigration.fix0256.buttons.checkItLater": string;
"moduleMigration.fix0256.buttons.DismissForever": string;
"moduleMigration.fix0256.buttons.fix": string;
"moduleMigration.fix0256.message": string;
"moduleMigration.fix0256.messageUnrecoverable": string;
"moduleMigration.fix0256.title": string;
"moduleMigration.insecureChunkExist.buttons.fetch": string;
"moduleMigration.insecureChunkExist.buttons.later": string;
"moduleMigration.insecureChunkExist.buttons.rebuild": string;
"moduleMigration.insecureChunkExist.laterMessage": string;
"moduleMigration.insecureChunkExist.message": string;
"moduleMigration.insecureChunkExist.title": string;
"moduleMigration.logBulkSendCorrupted": string;
"moduleMigration.logFetchRemoteTweakFailed": string;
"moduleMigration.logLocalDatabaseNotReady": string;
"moduleMigration.logMigratedSameBehaviour": string;
"moduleMigration.logMigrationFailed": string;
"moduleMigration.logRedflag2CreationFail": string;
"moduleMigration.logRemoteTweakUnavailable": string;
"moduleMigration.logSetupCancelled": string;
"moduleMigration.msgFetchRemoteAgain": string;
"moduleMigration.msgInitialSetup": string;
"moduleMigration.msgRecommendSetupUri": string;
"moduleMigration.msgSinceV02321": string;
"moduleMigration.optionAdjustRemote": string;
"moduleMigration.optionDecideLater": string;
"moduleMigration.optionEnableBoth": string;
"moduleMigration.optionEnableFilenameCaseInsensitive": string;
"moduleMigration.optionEnableFixedRevisionForChunks": string;
"moduleMigration.optionHaveSetupUri": string;
"moduleMigration.optionKeepPreviousBehaviour": string;
"moduleMigration.optionManualSetup": string;
"moduleMigration.optionNoAskAgain": string;
"moduleMigration.optionNoSetupUri": string;
"moduleMigration.optionRemindNextLaunch": string;
"moduleMigration.optionSetupViaP2P": string;
"moduleMigration.optionSetupWizard": string;
"moduleMigration.optionYesFetchAgain": string;
"moduleMigration.titleCaseSensitivity": string;
"moduleMigration.titleRecommendSetupUri": string;
"moduleMigration.titleWelcome": string;
"moduleObsidianMenu.replicate": string;
"Move remotely deleted files to the trash, instead of deleting.": string;
"Not all messages have been translated. And, please revert to \"Default\" when reporting errors.": string;
"Notify all setting files": string;
"Notify customized": string;
"Notify when other device has newly customized.": string;
"Notify when the estimated remote storage size exceeds on start up": string;
"Number of batches to process at a time. Defaults to 40. Minimum is 2. This along with batch size controls how many docs are kept in memory at a time.": string;
"Number of changes to sync at a time. Defaults to 50. Minimum is 2.": string;
"obsidianLiveSyncSettingTab.btnApply": string;
"obsidianLiveSyncSettingTab.btnCheck": string;
"obsidianLiveSyncSettingTab.btnCopy": string;
"obsidianLiveSyncSettingTab.btnDisable": string;
"obsidianLiveSyncSettingTab.btnDiscard": string;
"obsidianLiveSyncSettingTab.btnEnable": string;
"obsidianLiveSyncSettingTab.btnFix": string;
"obsidianLiveSyncSettingTab.btnGotItAndUpdated": string;
"obsidianLiveSyncSettingTab.btnNext": string;
"obsidianLiveSyncSettingTab.btnStart": string;
"obsidianLiveSyncSettingTab.btnTest": string;
"obsidianLiveSyncSettingTab.btnUse": string;
"obsidianLiveSyncSettingTab.buttonFetch": string;
"obsidianLiveSyncSettingTab.buttonNext": string;
"obsidianLiveSyncSettingTab.defaultLanguage": string;
"obsidianLiveSyncSettingTab.descConnectSetupURI": string;
"obsidianLiveSyncSettingTab.descCopySetupURI": string;
"obsidianLiveSyncSettingTab.descEnableLiveSync": string;
"obsidianLiveSyncSettingTab.descFetchConfigFromRemote": string;
"obsidianLiveSyncSettingTab.descManualSetup": string;
"obsidianLiveSyncSettingTab.descTestDatabaseConnection": string;
"obsidianLiveSyncSettingTab.descValidateDatabaseConfig": string;
"obsidianLiveSyncSettingTab.errAccessForbidden": string;
"obsidianLiveSyncSettingTab.errCannotContinueTest": string;
"obsidianLiveSyncSettingTab.errCorsCredentials": string;
"obsidianLiveSyncSettingTab.errCorsNotAllowingCredentials": string;
"obsidianLiveSyncSettingTab.errCorsOrigins": string;
"obsidianLiveSyncSettingTab.errEnableCors": string;
"obsidianLiveSyncSettingTab.errEnableCorsChttpd": string;
"obsidianLiveSyncSettingTab.errMaxDocumentSize": string;
"obsidianLiveSyncSettingTab.errMaxRequestSize": string;
"obsidianLiveSyncSettingTab.errMissingWwwAuth": string;
"obsidianLiveSyncSettingTab.errRequireValidUser": string;
"obsidianLiveSyncSettingTab.errRequireValidUserAuth": string;
"obsidianLiveSyncSettingTab.labelDisabled": string;
"obsidianLiveSyncSettingTab.labelEnabled": string;
"obsidianLiveSyncSettingTab.levelAdvanced": string;
"obsidianLiveSyncSettingTab.levelEdgeCase": string;
"obsidianLiveSyncSettingTab.levelPowerUser": string;
"obsidianLiveSyncSettingTab.linkOpenInBrowser": string;
"obsidianLiveSyncSettingTab.linkPageTop": string;
"obsidianLiveSyncSettingTab.linkTipsAndTroubleshooting": string;
"obsidianLiveSyncSettingTab.linkTroubleshooting": string;
"obsidianLiveSyncSettingTab.logCannotUseCloudant": string;
"obsidianLiveSyncSettingTab.logCheckingConfigDone": string;
"obsidianLiveSyncSettingTab.logCheckingConfigFailed": string;
"obsidianLiveSyncSettingTab.logCheckingDbConfig": string;
"obsidianLiveSyncSettingTab.logCheckPassphraseFailed": string;
"obsidianLiveSyncSettingTab.logConfiguredDisabled": string;
"obsidianLiveSyncSettingTab.logConfiguredLiveSync": string;
"obsidianLiveSyncSettingTab.logConfiguredPeriodic": string;
"obsidianLiveSyncSettingTab.logCouchDbConfigFail": string;
"obsidianLiveSyncSettingTab.logCouchDbConfigSet": string;
"obsidianLiveSyncSettingTab.logCouchDbConfigUpdated": string;
"obsidianLiveSyncSettingTab.logDatabaseConnected": string;
"obsidianLiveSyncSettingTab.logEncryptionNoPassphrase": string;
"obsidianLiveSyncSettingTab.logEncryptionNoSupport": string;
"obsidianLiveSyncSettingTab.logErrorOccurred": string;
"obsidianLiveSyncSettingTab.logEstimatedSize": string;
"obsidianLiveSyncSettingTab.logPassphraseInvalid": string;
"obsidianLiveSyncSettingTab.logPassphraseNotCompatible": string;
"obsidianLiveSyncSettingTab.logRebuildNote": string;
"obsidianLiveSyncSettingTab.logSelectAnyPreset": string;
"obsidianLiveSyncSettingTab.msgAreYouSureProceed": string;
"obsidianLiveSyncSettingTab.msgChangesNeedToBeApplied": string;
"obsidianLiveSyncSettingTab.msgConfigCheck": string;
"obsidianLiveSyncSettingTab.msgConfigCheckFailed": string;
"obsidianLiveSyncSettingTab.msgConnectionCheck": string;
"obsidianLiveSyncSettingTab.msgConnectionProxyNote": string;
"obsidianLiveSyncSettingTab.msgCurrentOrigin": string;
"obsidianLiveSyncSettingTab.msgDiscardConfirmation": string;
"obsidianLiveSyncSettingTab.msgDone": string;
"obsidianLiveSyncSettingTab.msgEnableCors": string;
"obsidianLiveSyncSettingTab.msgEnableCorsChttpd": string;
"obsidianLiveSyncSettingTab.msgEnableEncryptionRecommendation": string;
"obsidianLiveSyncSettingTab.msgFetchConfigFromRemote": string;
"obsidianLiveSyncSettingTab.msgGenerateSetupURI": string;
"obsidianLiveSyncSettingTab.msgIfConfigNotPersistent": string;
"obsidianLiveSyncSettingTab.msgInvalidPassphrase": string;
"obsidianLiveSyncSettingTab.msgNewVersionNote": string;
"obsidianLiveSyncSettingTab.msgNonHTTPSInfo": string;
"obsidianLiveSyncSettingTab.msgNonHTTPSWarning": string;
"obsidianLiveSyncSettingTab.msgNotice": string;
"obsidianLiveSyncSettingTab.msgObjectStorageWarning": string;
"obsidianLiveSyncSettingTab.msgOriginCheck": string;
"obsidianLiveSyncSettingTab.msgRebuildRequired": string;
"obsidianLiveSyncSettingTab.msgSelectAndApplyPreset": string;
"obsidianLiveSyncSettingTab.msgSetCorsCredentials": string;
"obsidianLiveSyncSettingTab.msgSetCorsOrigins": string;
"obsidianLiveSyncSettingTab.msgSetMaxDocSize": string;
"obsidianLiveSyncSettingTab.msgSetMaxRequestSize": string;
"obsidianLiveSyncSettingTab.msgSetRequireValidUser": string;
"obsidianLiveSyncSettingTab.msgSetRequireValidUserAuth": string;
"obsidianLiveSyncSettingTab.msgSettingModified": string;
"obsidianLiveSyncSettingTab.msgSettingsUnchangeableDuringSync": string;
"obsidianLiveSyncSettingTab.msgSetWwwAuth": string;
"obsidianLiveSyncSettingTab.nameApplySettings": string;
"obsidianLiveSyncSettingTab.nameConnectSetupURI": string;
"obsidianLiveSyncSettingTab.nameCopySetupURI": string;
"obsidianLiveSyncSettingTab.nameDisableHiddenFileSync": string;
"obsidianLiveSyncSettingTab.nameDiscardSettings": string;
"obsidianLiveSyncSettingTab.nameEnableHiddenFileSync": string;
"obsidianLiveSyncSettingTab.nameEnableLiveSync": string;
"obsidianLiveSyncSettingTab.nameHiddenFileSynchronization": string;
"obsidianLiveSyncSettingTab.nameManualSetup": string;
"obsidianLiveSyncSettingTab.nameTestConnection": string;
"obsidianLiveSyncSettingTab.nameTestDatabaseConnection": string;
"obsidianLiveSyncSettingTab.nameValidateDatabaseConfig": string;
"obsidianLiveSyncSettingTab.okAdminPrivileges": string;
"obsidianLiveSyncSettingTab.okCorsCredentials": string;
"obsidianLiveSyncSettingTab.okCorsCredentialsForOrigin": string;
"obsidianLiveSyncSettingTab.okCorsOriginMatched": string;
"obsidianLiveSyncSettingTab.okCorsOrigins": string;
"obsidianLiveSyncSettingTab.okEnableCors": string;
"obsidianLiveSyncSettingTab.okEnableCorsChttpd": string;
"obsidianLiveSyncSettingTab.okMaxDocumentSize": string;
"obsidianLiveSyncSettingTab.okMaxRequestSize": string;
"obsidianLiveSyncSettingTab.okRequireValidUser": string;
"obsidianLiveSyncSettingTab.okRequireValidUserAuth": string;
"obsidianLiveSyncSettingTab.okWwwAuth": string;
"obsidianLiveSyncSettingTab.optionApply": string;
"obsidianLiveSyncSettingTab.optionCancel": string;
"obsidianLiveSyncSettingTab.optionCouchDB": string;
"obsidianLiveSyncSettingTab.optionDisableAllAutomatic": string;
"obsidianLiveSyncSettingTab.optionFetchFromRemote": string;
"obsidianLiveSyncSettingTab.optionHere": string;
"obsidianLiveSyncSettingTab.optionLiveSync": string;
"obsidianLiveSyncSettingTab.optionMinioS3R2": string;
"obsidianLiveSyncSettingTab.optionOkReadEverything": string;
"obsidianLiveSyncSettingTab.optionOnEvents": string;
"obsidianLiveSyncSettingTab.optionPeriodicAndEvents": string;
"obsidianLiveSyncSettingTab.optionPeriodicWithBatch": string;
"obsidianLiveSyncSettingTab.optionRebuildBoth": string;
"obsidianLiveSyncSettingTab.optionSaveOnlySettings": string;
"obsidianLiveSyncSettingTab.panelChangeLog": string;
"obsidianLiveSyncSettingTab.panelGeneralSettings": string;
"obsidianLiveSyncSettingTab.panelPrivacyEncryption": string;
"obsidianLiveSyncSettingTab.panelRemoteConfiguration": string;
"obsidianLiveSyncSettingTab.panelSetup": string;
"obsidianLiveSyncSettingTab.serverVersion": string;
"obsidianLiveSyncSettingTab.titleActiveRemoteServer": string;
"obsidianLiveSyncSettingTab.titleAppearance": string;
"obsidianLiveSyncSettingTab.titleConflictResolution": string;
"obsidianLiveSyncSettingTab.titleCongratulations": string;
"obsidianLiveSyncSettingTab.titleCouchDB": string;
"obsidianLiveSyncSettingTab.titleDeletionPropagation": string;
"obsidianLiveSyncSettingTab.titleEncryptionNotEnabled": string;
"obsidianLiveSyncSettingTab.titleEncryptionPassphraseInvalid": string;
"obsidianLiveSyncSettingTab.titleExtraFeatures": string;
"obsidianLiveSyncSettingTab.titleFetchConfig": string;
"obsidianLiveSyncSettingTab.titleFetchConfigFromRemote": string;
"obsidianLiveSyncSettingTab.titleFetchSettings": string;
"obsidianLiveSyncSettingTab.titleHiddenFiles": string;
"obsidianLiveSyncSettingTab.titleLogging": string;
"obsidianLiveSyncSettingTab.titleMinioS3R2": string;
"obsidianLiveSyncSettingTab.titleNotification": string;
"obsidianLiveSyncSettingTab.titleOnlineTips": string;
"obsidianLiveSyncSettingTab.titleQuickSetup": string;
"obsidianLiveSyncSettingTab.titleRebuildRequired": string;
"obsidianLiveSyncSettingTab.titleRemoteConfigCheckFailed": string;
"obsidianLiveSyncSettingTab.titleRemoteServer": string;
"obsidianLiveSyncSettingTab.titleReset": string;
"obsidianLiveSyncSettingTab.titleSetupOtherDevices": string;
"obsidianLiveSyncSettingTab.titleSynchronizationMethod": string;
"obsidianLiveSyncSettingTab.titleSynchronizationPreset": string;
"obsidianLiveSyncSettingTab.titleSyncSettings": string;
"obsidianLiveSyncSettingTab.titleSyncSettingsViaMarkdown": string;
"obsidianLiveSyncSettingTab.titleUpdateThinning": string;
"obsidianLiveSyncSettingTab.warnCorsOriginUnmatched": string;
"obsidianLiveSyncSettingTab.warnNoAdmin": string;
"P2P.AskPassphraseForDecrypt": string;
"P2P.AskPassphraseForShare": string;
"P2P.DisabledButNeed": string;
"P2P.FailedToOpen": string;
"P2P.NoAutoSyncPeers": string;
"P2P.NoKnownPeers": string;
"P2P.Note.description": string;
"P2P.Note.important_note": string;
"P2P.Note.important_note_sub": string;
"P2P.Note.Summary": string;
"P2P.NotEnabled": string;
"P2P.P2PReplication": string;
"P2P.PaneTitle": string;
"P2P.ReplicatorInstanceMissing": string;
"P2P.SeemsOffline": string;
"P2P.SyncAlreadyRunning": string;
"P2P.SyncCompleted": string;
"P2P.SyncStartedWith": string;
Passphrase: string;
"Passphrase of sensitive configuration items": string;
password: string;
Password: string;
"Path Obfuscation": string;
"Per-file-saved customization sync": string;
"Periodic Sync interval": string;
"Prepare the 'report' to create an issue": string;
Presets: string;
"Process small files in the foreground": string;
"Property Encryption": string;
"RedFlag.Fetch.Method.Desc": string;
"RedFlag.Fetch.Method.FetchSafer": string;
"RedFlag.Fetch.Method.FetchSmoother": string;
"RedFlag.Fetch.Method.FetchTraditional": string;
"RedFlag.Fetch.Method.Title": string;
"RedFlag.FetchRemoteConfig.Buttons.Cancel": string;
"RedFlag.FetchRemoteConfig.Buttons.Fetch": string;
"RedFlag.FetchRemoteConfig.Message": string;
"RedFlag.FetchRemoteConfig.Title": string;
"Reducing the frequency with which on-disk changes are reflected into the DB": string;
Region: string;
"Remote server type": string;
"Remote Type": string;
"Replicator.Dialogue.Locked.Action.Dismiss": string;
"Replicator.Dialogue.Locked.Action.Fetch": string;
"Replicator.Dialogue.Locked.Action.Unlock": string;
"Replicator.Dialogue.Locked.Message": string;
"Replicator.Dialogue.Locked.Message.Fetch": string;
"Replicator.Dialogue.Locked.Message.Unlocked": string;
"Replicator.Dialogue.Locked.Title": string;
"Replicator.Message.Cleaned": string;
"Replicator.Message.InitialiseFatalError": string;
"Replicator.Message.Pending": string;
"Replicator.Message.SomeModuleFailed": string;
"Replicator.Message.VersionUpFlash": string;
"Requires restart of Obsidian": string;
"Requires restart of Obsidian.": string;
"Rerun Onboarding Wizard": string;
"Rerun the onboarding wizard to set up Self-hosted LiveSync again.": string;
"Rerun Wizard": string;
"Reset notification threshold and check the remote database usage": string;
"Reset the remote storage size threshold and check the remote storage size again.": string;
"Run Doctor": string;
"Save settings to a markdown file. You will be notified when new settings arrive. You can set different files by the platform.": string;
"Saving will be performed forcefully after this number of seconds.": string;
"Scan changes on customization sync": string;
"Scan customization automatically": string;
"Scan customization before replicating.": string;
"Scan customization every 1 minute.": string;
"Scan customization periodically": string;
"Scan for hidden files before replication": string;
"Scan hidden files periodically": string;
"Seconds, 0 to disable": string;
"Seconds. Saving to the local database will be delayed until this value after we stop typing or saving.": string;
"Secret Key": string;
"Server URI": string;
"Setting.GenerateKeyPair.Desc": string;
"Setting.GenerateKeyPair.Title": string;
"Setting.TroubleShooting": string;
"Setting.TroubleShooting.Doctor": string;
"Setting.TroubleShooting.Doctor.Desc": string;
"Setting.TroubleShooting.ScanBrokenFiles": string;
"Setting.TroubleShooting.ScanBrokenFiles.Desc": string;
"SettingTab.Message.AskRebuild": string;
"Setup.Apply.Buttons.ApplyAndFetch": string;
"Setup.Apply.Buttons.ApplyAndMerge": string;
"Setup.Apply.Buttons.ApplyAndRebuild": string;
"Setup.Apply.Buttons.Cancel": string;
"Setup.Apply.Buttons.OnlyApply": string;
"Setup.Apply.Message": string;
"Setup.Apply.Title": string;
"Setup.Apply.WarningRebuildRecommended": string;
"Setup.Doctor.Buttons.No": string;
"Setup.Doctor.Buttons.Yes": string;
"Setup.Doctor.Message": string;
"Setup.Doctor.Title": string;
"Setup.FetchRemoteConf.Buttons.Fetch": string;
"Setup.FetchRemoteConf.Buttons.Skip": string;
"Setup.FetchRemoteConf.Message": string;
"Setup.FetchRemoteConf.Title": string;
"Setup.QRCode": string;
"Setup.ShowQRCode": string;
"Setup.ShowQRCode.Desc": string;
"Should we keep folders that don't have any files inside?": string;
"Should we only check for conflicts when a file is opened?": string;
"Should we prompt you about conflicting files when a file is opened?": string;
"Should we prompt you for every single merge, even if we can safely merge automatcially?": string;
"Show only notifications": string;
"Show status as icons only": string;
"Show status icon instead of file warnings banner": string;
"Show status inside the editor": string;
"Show status on the status bar": string;
"Show verbose log. Please enable if you report an issue.": string;
"Starts synchronisation when a file is saved.": string;
"Stop reflecting database changes to storage files.": string;
"Stop watching for file changes.": string;
"Suppress notification of hidden files change": string;
"Suspend database reflecting": string;
"Suspend file watching": string;
"Sync after merging file": string;
"Sync automatically after merging files": string;
"Sync Mode": string;
"Sync on Editor Save": string;
"Sync on File Open": string;
"Sync on Save": string;
"Sync on Startup": string;
"Testing only - Resolve file conflicts by syncing newer copies of the file, this can overwrite modified files. Be Warned.": string;
"The delay for consecutive on-demand fetches": string;
"The Hash algorithm for chunk IDs": string;
"The maximum duration for which chunks can be incubated within the document. Chunks exceeding this period will graduate to independent chunks.": string;
"The maximum number of chunks that can be incubated within the document. Chunks exceeding this number will immediately graduate to independent chunks.": string;
"The maximum total size of chunks that can be incubated within the document. Chunks exceeding this size will immediately graduate to independent chunks.": string;
"The minimum interval for automatic synchronisation on event.": string;
"This passphrase will not be copied to another device. It will be set to `Default` until you configure it again.": string;
"TweakMismatchResolve.Action.Dismiss": string;
"TweakMismatchResolve.Action.UseConfigured": string;
"TweakMismatchResolve.Action.UseMine": string;
"TweakMismatchResolve.Action.UseMineAcceptIncompatible": string;
"TweakMismatchResolve.Action.UseMineWithRebuild": string;
"TweakMismatchResolve.Action.UseRemote": string;
"TweakMismatchResolve.Action.UseRemoteAcceptIncompatible": string;
"TweakMismatchResolve.Action.UseRemoteWithRebuild": string;
"TweakMismatchResolve.Message.Main": string;
"TweakMismatchResolve.Message.MainTweakResolving": string;
"TweakMismatchResolve.Message.UseRemote.WarningRebuildRecommended": string;
"TweakMismatchResolve.Message.UseRemote.WarningRebuildRequired": string;
"TweakMismatchResolve.Message.WarningIncompatibleRebuildRecommended": string;
"TweakMismatchResolve.Message.WarningIncompatibleRebuildRequired": string;
"TweakMismatchResolve.Table": string;
"TweakMismatchResolve.Table.Row": string;
"TweakMismatchResolve.Title": string;
"TweakMismatchResolve.Title.TweakResolving": string;
"TweakMismatchResolve.Title.UseRemoteConfig": string;
"Unique name between all synchronized devices. To edit this setting, please disable customization sync once.": string;
"Use Custom HTTP Handler": string;
"Use dynamic iteration count": string;
"Use Segmented-splitter": string;
"Use splitting-limit-capped chunk splitter": string;
"Use the trash bin": string;
"Use timeouts instead of heartbeats": string;
username: string;
Username: string;
"Verbose Log": string;
"Warning! This will have a serious impact on performance. And the logs will not be synchronised under the default name. Please be careful with logs; they often contain your confidential information.": string;
"When you save a file in the editor, start a sync automatically": string;
"Write credentials in the file": string;
"Write logs into the file": string;
};
};
+583
View File
@@ -0,0 +1,583 @@
export declare const PartialMessages: {
readonly he: {
"(BETA) Always overwrite with a newer file": string;
"(Beta) Use ignore files": string;
"(Days passed, 0 to disable automatic-deletion)": string;
"(ex. Read chunks online) If this option is enabled, LiveSync reads chunks online directly instead of replicating them locally. Increasing Custom chunk size is recommended.": string;
"(MB) If this is set, changes to local and remote files that are larger than this will be skipped. If the file becomes smaller again, a newer one will be used.": string;
"(Mega chars)": string;
"(Not recommended) If set, credentials will be stored in the file.": string;
"(Obsolete) Use an old adapter for compatibility": string;
"Access Key": string;
"Active Remote Configuration": string;
"Always prompt merge conflicts": string;
Analyse: string;
"Analyse database usage": string;
"Analyse database usage and generate a TSV report for diagnosis yourself. You can paste the generated report with any spreadsheet you like.": string;
"Apply Latest Change if Conflicting": string;
"Apply preset configuration": string;
"Automatically Sync all files when opening Obsidian.": string;
"Batch database update": string;
"Batch limit": string;
"Batch size": string;
"Batch size of on-demand fetching": string;
"Before v0.17.16, we used an old adapter for the local database. Now the new adapter is preferred. However, it needs local database rebuilding. Please disable this toggle when you have enough time. If leave it enabled, also while fetching from the remote database, you will be asked to disable this.": string;
"Bucket Name": string;
Check: string;
"cmdConfigSync.showCustomizationSync": string;
"Comma separated `.gitignore, .dockerignore`": string;
"Compute revisions for chunks": string;
"Copy Report to clipboard": string;
"Data Compression": string;
"Database Name": string;
"Database suffix": string;
"Delay conflict resolution of inactive files": string;
"Delay merge conflict prompt for inactive files.": string;
"Delete old metadata of deleted files on start-up": string;
"Device name": string;
"dialog.yourLanguageAvailable": string;
"dialog.yourLanguageAvailable.btnRevertToDefault": string;
"dialog.yourLanguageAvailable.Title": string;
"Disables logging, only shows notifications. Please disable if you report an issue.": string;
"Display Language": string;
"Do not check configuration mismatch before replication": string;
"Do not keep metadata of deleted files.": string;
"Do not split chunks in the background": string;
"Do not use internal API": string;
"Doctor.Button.DismissThisVersion": string;
"Doctor.Button.Fix": string;
"Doctor.Button.FixButNoRebuild": string;
"Doctor.Button.No": string;
"Doctor.Button.Skip": string;
"Doctor.Button.Yes": string;
"Doctor.Dialogue.Main": string;
"Doctor.Dialogue.MainFix": string;
"Doctor.Dialogue.Title": string;
"Doctor.Dialogue.TitleAlmostDone": string;
"Doctor.Dialogue.TitleFix": string;
"Doctor.Level.Must": string;
"Doctor.Level.Necessary": string;
"Doctor.Level.Optional": string;
"Doctor.Level.Recommended": string;
"Doctor.Message.NoIssues": string;
"Doctor.Message.RebuildLocalRequired": string;
"Doctor.Message.RebuildRequired": string;
"Doctor.Message.SomeSkipped": string;
"Doctor.RULES.E2EE_V02500.REASON": string;
"Enable advanced features": string;
"Enable customization sync": string;
"Enable Developers' Debug Tools.": string;
"Enable edge case treatment features": string;
"Enable poweruser features": string;
"Enable this if your Object Storage doesn't support CORS": string;
"Enable this option to automatically apply the most recent change to documents even when it conflicts": string;
"Encrypt contents on the remote database. If you use the plugin's synchronization feature, enabling this is recommended.": string;
"Encrypting sensitive configuration items": string;
"Encryption phassphrase. If changed, you should overwrite the server's database with the new (encrypted) files.": string;
"End-to-End Encryption": string;
"Endpoint URL": string;
"Enhance chunk size": string;
"Fetch chunks on demand": string;
"Fetch database with previous behaviour": string;
Filename: string;
"Forces the file to be synced when opened.": string;
"Handle files as Case-Sensitive": string;
"If disabled(toggled), chunks will be split on the UI thread (Previous behaviour).": string;
"If enabled per-filed efficient customization sync will be used. We need a small migration when enabling this. And all devices should be updated to v0.23.18. Once we enabled this, we lost a compatibility with old versions.": string;
"If enabled, chunks will be split into no more than 100 items. However, dedupe is slightly weaker.": string;
"If enabled, newly created chunks are temporarily kept within the document, and graduated to become independent chunks once stabilised.": string;
"If enabled, the \u26D4 icon will be shown inside the status instead of the file warnings banner. No details will be shown.": string;
"If enabled, the file under 1kb will be processed in the UI thread.": string;
"If enabled, the notification of hidden files change will be suppressed.": string;
"If this enabled, all chunks will be stored with the revision made from its content. (Previous behaviour)": string;
"If this enabled, All files are handled as case-Sensitive (Previous behaviour).": string;
"If this enabled, chunks will be split into semantically meaningful segments. Not all platforms support this feature.": string;
"If this is set, changes to local files which are matched by the ignore files will be skipped. Remote changes are determined using local ignore files.": string;
"If this option is enabled, PouchDB will hold the connection open for 60 seconds, and if no change arrives in that time, close and reopen the socket, instead of holding it open indefinitely. Useful when a proxy limits request duration but can increase resource usage.": string;
"Ignore files": string;
"Incubate Chunks in Document": string;
"Interval (sec)": string;
"K.exp": string;
"K.long_p2p_sync": string;
"K.P2P": string;
"K.Peer": string;
"K.ScanCustomization": string;
"K.short_p2p_sync": string;
"K.title_p2p_sync": string;
"Keep empty folder": string;
lang_def: string;
"lang-de": string;
"lang-def": string;
"lang-es": string;
"lang-fr": string;
"lang-he": string;
"lang-ja": string;
"lang-ko": string;
"lang-ru": string;
"lang-zh": string;
"lang-zh-tw": string;
"LiveSync could not handle multiple vaults which have same name without different prefix, This should be automatically configured.": string;
"liveSyncReplicator.beforeLiveSync": string;
"liveSyncReplicator.cantReplicateLowerValue": string;
"liveSyncReplicator.checkingLastSyncPoint": string;
"liveSyncReplicator.couldNotConnectTo": string;
"liveSyncReplicator.couldNotConnectToRemoteDb": string;
"liveSyncReplicator.couldNotConnectToServer": string;
"liveSyncReplicator.couldNotConnectToURI": string;
"liveSyncReplicator.couldNotMarkResolveRemoteDb": string;
"liveSyncReplicator.liveSyncBegin": string;
"liveSyncReplicator.lockRemoteDb": string;
"liveSyncReplicator.markDeviceResolved": string;
"liveSyncReplicator.oneShotSyncBegin": string;
"liveSyncReplicator.remoteDbCorrupted": string;
"liveSyncReplicator.remoteDbCreatedOrConnected": string;
"liveSyncReplicator.remoteDbDestroyed": string;
"liveSyncReplicator.remoteDbDestroyError": string;
"liveSyncReplicator.remoteDbMarkedResolved": string;
"liveSyncReplicator.replicationClosed": string;
"liveSyncReplicator.replicationInProgress": string;
"liveSyncReplicator.retryLowerBatchSize": string;
"liveSyncReplicator.unlockRemoteDb": string;
"liveSyncSetting.errorNoSuchSettingItem": string;
"liveSyncSetting.originalValue": string;
"liveSyncSetting.valueShouldBeInRange": string;
"liveSyncSettings.btnApply": string;
"logPane.autoScroll": string;
"logPane.logWindowOpened": string;
"logPane.pause": string;
"logPane.title": string;
"logPane.wrap": string;
"Maximum delay for batch database updating": string;
"Maximum file size": string;
"Maximum Incubating Chunk Size": string;
"Maximum Incubating Chunks": string;
"Maximum Incubation Period": string;
"MB (0 to disable).": string;
"Memory cache size (by total characters)": string;
"Memory cache size (by total items)": string;
"Minimum delay for batch database updating": string;
"Minimum interval for syncing": string;
"moduleCheckRemoteSize.logCheckingStorageSizes": string;
"moduleCheckRemoteSize.logCurrentStorageSize": string;
"moduleCheckRemoteSize.logExceededWarning": string;
"moduleCheckRemoteSize.logThresholdEnlarged": string;
"moduleCheckRemoteSize.msgConfirmRebuild": string;
"moduleCheckRemoteSize.msgDatabaseGrowing": string;
"moduleCheckRemoteSize.msgSetDBCapacity": string;
"moduleCheckRemoteSize.option2GB": string;
"moduleCheckRemoteSize.option800MB": string;
"moduleCheckRemoteSize.optionAskMeLater": string;
"moduleCheckRemoteSize.optionDismiss": string;
"moduleCheckRemoteSize.optionIncreaseLimit": string;
"moduleCheckRemoteSize.optionNoWarn": string;
"moduleCheckRemoteSize.optionRebuildAll": string;
"moduleCheckRemoteSize.titleDatabaseSizeLimitExceeded": string;
"moduleCheckRemoteSize.titleDatabaseSizeNotify": string;
"moduleInputUIObsidian.defaultTitleConfirmation": string;
"moduleInputUIObsidian.defaultTitleSelect": string;
"moduleInputUIObsidian.optionNo": string;
"moduleInputUIObsidian.optionYes": string;
"moduleLiveSyncMain.logAdditionalSafetyScan": string;
"moduleLiveSyncMain.logLoadingPlugin": string;
"moduleLiveSyncMain.logPluginInitCancelled": string;
"moduleLiveSyncMain.logPluginVersion": string;
"moduleLiveSyncMain.logReadChangelog": string;
"moduleLiveSyncMain.logSafetyScanCompleted": string;
"moduleLiveSyncMain.logSafetyScanFailed": string;
"moduleLiveSyncMain.logUnloadingPlugin": string;
"moduleLiveSyncMain.logVersionUpdate": string;
"moduleLiveSyncMain.msgScramEnabled": string;
"moduleLiveSyncMain.optionKeepLiveSyncDisabled": string;
"moduleLiveSyncMain.optionResumeAndRestart": string;
"moduleLiveSyncMain.titleScramEnabled": string;
"moduleLocalDatabase.logWaitingForReady": string;
"moduleLog.showLog": string;
"moduleMigration.docUri": string;
"moduleMigration.fix0256.buttons.checkItLater": string;
"moduleMigration.fix0256.buttons.DismissForever": string;
"moduleMigration.fix0256.buttons.fix": string;
"moduleMigration.fix0256.message": string;
"moduleMigration.fix0256.messageUnrecoverable": string;
"moduleMigration.fix0256.title": string;
"moduleMigration.insecureChunkExist.buttons.fetch": string;
"moduleMigration.insecureChunkExist.buttons.later": string;
"moduleMigration.insecureChunkExist.buttons.rebuild": string;
"moduleMigration.insecureChunkExist.laterMessage": string;
"moduleMigration.insecureChunkExist.message": string;
"moduleMigration.insecureChunkExist.title": string;
"moduleMigration.logBulkSendCorrupted": string;
"moduleMigration.logFetchRemoteTweakFailed": string;
"moduleMigration.logLocalDatabaseNotReady": string;
"moduleMigration.logMigratedSameBehaviour": string;
"moduleMigration.logMigrationFailed": string;
"moduleMigration.logRedflag2CreationFail": string;
"moduleMigration.logRemoteTweakUnavailable": string;
"moduleMigration.logSetupCancelled": string;
"moduleMigration.msgFetchRemoteAgain": string;
"moduleMigration.msgInitialSetup": string;
"moduleMigration.msgRecommendSetupUri": string;
"moduleMigration.msgSinceV02321": string;
"moduleMigration.optionAdjustRemote": string;
"moduleMigration.optionDecideLater": string;
"moduleMigration.optionEnableBoth": string;
"moduleMigration.optionEnableFilenameCaseInsensitive": string;
"moduleMigration.optionEnableFixedRevisionForChunks": string;
"moduleMigration.optionHaveSetupUri": string;
"moduleMigration.optionKeepPreviousBehaviour": string;
"moduleMigration.optionManualSetup": string;
"moduleMigration.optionNoAskAgain": string;
"moduleMigration.optionNoSetupUri": string;
"moduleMigration.optionRemindNextLaunch": string;
"moduleMigration.optionSetupViaP2P": string;
"moduleMigration.optionSetupWizard": string;
"moduleMigration.optionYesFetchAgain": string;
"moduleMigration.titleCaseSensitivity": string;
"moduleMigration.titleRecommendSetupUri": string;
"moduleMigration.titleWelcome": string;
"moduleObsidianMenu.replicate": string;
"Move remotely deleted files to the trash, instead of deleting.": string;
"Not all messages have been translated. And, please revert to \"Default\" when reporting errors.": string;
"Notify all setting files": string;
"Notify customized": string;
"Notify when other device has newly customized.": string;
"Notify when the estimated remote storage size exceeds on start up": string;
"Number of batches to process at a time. Defaults to 40. Minimum is 2. This along with batch size controls how many docs are kept in memory at a time.": string;
"Number of changes to sync at a time. Defaults to 50. Minimum is 2.": string;
"obsidianLiveSyncSettingTab.btnApply": string;
"obsidianLiveSyncSettingTab.btnCheck": string;
"obsidianLiveSyncSettingTab.btnCopy": string;
"obsidianLiveSyncSettingTab.btnDisable": string;
"obsidianLiveSyncSettingTab.btnDiscard": string;
"obsidianLiveSyncSettingTab.btnEnable": string;
"obsidianLiveSyncSettingTab.btnFix": string;
"obsidianLiveSyncSettingTab.btnGotItAndUpdated": string;
"obsidianLiveSyncSettingTab.btnNext": string;
"obsidianLiveSyncSettingTab.btnStart": string;
"obsidianLiveSyncSettingTab.btnTest": string;
"obsidianLiveSyncSettingTab.btnUse": string;
"obsidianLiveSyncSettingTab.buttonFetch": string;
"obsidianLiveSyncSettingTab.buttonNext": string;
"obsidianLiveSyncSettingTab.defaultLanguage": string;
"obsidianLiveSyncSettingTab.descConnectSetupURI": string;
"obsidianLiveSyncSettingTab.descCopySetupURI": string;
"obsidianLiveSyncSettingTab.descEnableLiveSync": string;
"obsidianLiveSyncSettingTab.descFetchConfigFromRemote": string;
"obsidianLiveSyncSettingTab.descManualSetup": string;
"obsidianLiveSyncSettingTab.descTestDatabaseConnection": string;
"obsidianLiveSyncSettingTab.descValidateDatabaseConfig": string;
"obsidianLiveSyncSettingTab.errAccessForbidden": string;
"obsidianLiveSyncSettingTab.errCannotContinueTest": string;
"obsidianLiveSyncSettingTab.errCorsCredentials": string;
"obsidianLiveSyncSettingTab.errCorsNotAllowingCredentials": string;
"obsidianLiveSyncSettingTab.errCorsOrigins": string;
"obsidianLiveSyncSettingTab.errEnableCors": string;
"obsidianLiveSyncSettingTab.errEnableCorsChttpd": string;
"obsidianLiveSyncSettingTab.errMaxDocumentSize": string;
"obsidianLiveSyncSettingTab.errMaxRequestSize": string;
"obsidianLiveSyncSettingTab.errMissingWwwAuth": string;
"obsidianLiveSyncSettingTab.errRequireValidUser": string;
"obsidianLiveSyncSettingTab.errRequireValidUserAuth": string;
"obsidianLiveSyncSettingTab.labelDisabled": string;
"obsidianLiveSyncSettingTab.labelEnabled": string;
"obsidianLiveSyncSettingTab.levelAdvanced": string;
"obsidianLiveSyncSettingTab.levelEdgeCase": string;
"obsidianLiveSyncSettingTab.levelPowerUser": string;
"obsidianLiveSyncSettingTab.linkOpenInBrowser": string;
"obsidianLiveSyncSettingTab.linkPageTop": string;
"obsidianLiveSyncSettingTab.linkTipsAndTroubleshooting": string;
"obsidianLiveSyncSettingTab.linkTroubleshooting": string;
"obsidianLiveSyncSettingTab.logCannotUseCloudant": string;
"obsidianLiveSyncSettingTab.logCheckingConfigDone": string;
"obsidianLiveSyncSettingTab.logCheckingConfigFailed": string;
"obsidianLiveSyncSettingTab.logCheckingDbConfig": string;
"obsidianLiveSyncSettingTab.logCheckPassphraseFailed": string;
"obsidianLiveSyncSettingTab.logConfiguredDisabled": string;
"obsidianLiveSyncSettingTab.logConfiguredLiveSync": string;
"obsidianLiveSyncSettingTab.logConfiguredPeriodic": string;
"obsidianLiveSyncSettingTab.logCouchDbConfigFail": string;
"obsidianLiveSyncSettingTab.logCouchDbConfigSet": string;
"obsidianLiveSyncSettingTab.logCouchDbConfigUpdated": string;
"obsidianLiveSyncSettingTab.logDatabaseConnected": string;
"obsidianLiveSyncSettingTab.logEncryptionNoPassphrase": string;
"obsidianLiveSyncSettingTab.logEncryptionNoSupport": string;
"obsidianLiveSyncSettingTab.logErrorOccurred": string;
"obsidianLiveSyncSettingTab.logEstimatedSize": string;
"obsidianLiveSyncSettingTab.logPassphraseInvalid": string;
"obsidianLiveSyncSettingTab.logPassphraseNotCompatible": string;
"obsidianLiveSyncSettingTab.logRebuildNote": string;
"obsidianLiveSyncSettingTab.logSelectAnyPreset": string;
"obsidianLiveSyncSettingTab.msgAreYouSureProceed": string;
"obsidianLiveSyncSettingTab.msgChangesNeedToBeApplied": string;
"obsidianLiveSyncSettingTab.msgConfigCheck": string;
"obsidianLiveSyncSettingTab.msgConfigCheckFailed": string;
"obsidianLiveSyncSettingTab.msgConnectionCheck": string;
"obsidianLiveSyncSettingTab.msgConnectionProxyNote": string;
"obsidianLiveSyncSettingTab.msgCurrentOrigin": string;
"obsidianLiveSyncSettingTab.msgDiscardConfirmation": string;
"obsidianLiveSyncSettingTab.msgDone": string;
"obsidianLiveSyncSettingTab.msgEnableCors": string;
"obsidianLiveSyncSettingTab.msgEnableCorsChttpd": string;
"obsidianLiveSyncSettingTab.msgEnableEncryptionRecommendation": string;
"obsidianLiveSyncSettingTab.msgFetchConfigFromRemote": string;
"obsidianLiveSyncSettingTab.msgGenerateSetupURI": string;
"obsidianLiveSyncSettingTab.msgIfConfigNotPersistent": string;
"obsidianLiveSyncSettingTab.msgInvalidPassphrase": string;
"obsidianLiveSyncSettingTab.msgNewVersionNote": string;
"obsidianLiveSyncSettingTab.msgNonHTTPSInfo": string;
"obsidianLiveSyncSettingTab.msgNonHTTPSWarning": string;
"obsidianLiveSyncSettingTab.msgNotice": string;
"obsidianLiveSyncSettingTab.msgObjectStorageWarning": string;
"obsidianLiveSyncSettingTab.msgOriginCheck": string;
"obsidianLiveSyncSettingTab.msgRebuildRequired": string;
"obsidianLiveSyncSettingTab.msgSelectAndApplyPreset": string;
"obsidianLiveSyncSettingTab.msgSetCorsCredentials": string;
"obsidianLiveSyncSettingTab.msgSetCorsOrigins": string;
"obsidianLiveSyncSettingTab.msgSetMaxDocSize": string;
"obsidianLiveSyncSettingTab.msgSetMaxRequestSize": string;
"obsidianLiveSyncSettingTab.msgSetRequireValidUser": string;
"obsidianLiveSyncSettingTab.msgSetRequireValidUserAuth": string;
"obsidianLiveSyncSettingTab.msgSettingModified": string;
"obsidianLiveSyncSettingTab.msgSettingsUnchangeableDuringSync": string;
"obsidianLiveSyncSettingTab.msgSetWwwAuth": string;
"obsidianLiveSyncSettingTab.nameApplySettings": string;
"obsidianLiveSyncSettingTab.nameConnectSetupURI": string;
"obsidianLiveSyncSettingTab.nameCopySetupURI": string;
"obsidianLiveSyncSettingTab.nameDisableHiddenFileSync": string;
"obsidianLiveSyncSettingTab.nameDiscardSettings": string;
"obsidianLiveSyncSettingTab.nameEnableHiddenFileSync": string;
"obsidianLiveSyncSettingTab.nameEnableLiveSync": string;
"obsidianLiveSyncSettingTab.nameHiddenFileSynchronization": string;
"obsidianLiveSyncSettingTab.nameManualSetup": string;
"obsidianLiveSyncSettingTab.nameTestConnection": string;
"obsidianLiveSyncSettingTab.nameTestDatabaseConnection": string;
"obsidianLiveSyncSettingTab.nameValidateDatabaseConfig": string;
"obsidianLiveSyncSettingTab.okAdminPrivileges": string;
"obsidianLiveSyncSettingTab.okCorsCredentials": string;
"obsidianLiveSyncSettingTab.okCorsCredentialsForOrigin": string;
"obsidianLiveSyncSettingTab.okCorsOriginMatched": string;
"obsidianLiveSyncSettingTab.okCorsOrigins": string;
"obsidianLiveSyncSettingTab.okEnableCors": string;
"obsidianLiveSyncSettingTab.okEnableCorsChttpd": string;
"obsidianLiveSyncSettingTab.okMaxDocumentSize": string;
"obsidianLiveSyncSettingTab.okMaxRequestSize": string;
"obsidianLiveSyncSettingTab.okRequireValidUser": string;
"obsidianLiveSyncSettingTab.okRequireValidUserAuth": string;
"obsidianLiveSyncSettingTab.okWwwAuth": string;
"obsidianLiveSyncSettingTab.optionApply": string;
"obsidianLiveSyncSettingTab.optionCancel": string;
"obsidianLiveSyncSettingTab.optionCouchDB": string;
"obsidianLiveSyncSettingTab.optionDisableAllAutomatic": string;
"obsidianLiveSyncSettingTab.optionFetchFromRemote": string;
"obsidianLiveSyncSettingTab.optionHere": string;
"obsidianLiveSyncSettingTab.optionLiveSync": string;
"obsidianLiveSyncSettingTab.optionMinioS3R2": string;
"obsidianLiveSyncSettingTab.optionOkReadEverything": string;
"obsidianLiveSyncSettingTab.optionOnEvents": string;
"obsidianLiveSyncSettingTab.optionPeriodicAndEvents": string;
"obsidianLiveSyncSettingTab.optionPeriodicWithBatch": string;
"obsidianLiveSyncSettingTab.optionRebuildBoth": string;
"obsidianLiveSyncSettingTab.optionSaveOnlySettings": string;
"obsidianLiveSyncSettingTab.panelChangeLog": string;
"obsidianLiveSyncSettingTab.panelGeneralSettings": string;
"obsidianLiveSyncSettingTab.panelPrivacyEncryption": string;
"obsidianLiveSyncSettingTab.panelRemoteConfiguration": string;
"obsidianLiveSyncSettingTab.panelSetup": string;
"obsidianLiveSyncSettingTab.serverVersion": string;
"obsidianLiveSyncSettingTab.titleActiveRemoteServer": string;
"obsidianLiveSyncSettingTab.titleAppearance": string;
"obsidianLiveSyncSettingTab.titleConflictResolution": string;
"obsidianLiveSyncSettingTab.titleCongratulations": string;
"obsidianLiveSyncSettingTab.titleCouchDB": string;
"obsidianLiveSyncSettingTab.titleDeletionPropagation": string;
"obsidianLiveSyncSettingTab.titleEncryptionNotEnabled": string;
"obsidianLiveSyncSettingTab.titleEncryptionPassphraseInvalid": string;
"obsidianLiveSyncSettingTab.titleExtraFeatures": string;
"obsidianLiveSyncSettingTab.titleFetchConfig": string;
"obsidianLiveSyncSettingTab.titleFetchConfigFromRemote": string;
"obsidianLiveSyncSettingTab.titleFetchSettings": string;
"obsidianLiveSyncSettingTab.titleHiddenFiles": string;
"obsidianLiveSyncSettingTab.titleLogging": string;
"obsidianLiveSyncSettingTab.titleMinioS3R2": string;
"obsidianLiveSyncSettingTab.titleNotification": string;
"obsidianLiveSyncSettingTab.titleOnlineTips": string;
"obsidianLiveSyncSettingTab.titleQuickSetup": string;
"obsidianLiveSyncSettingTab.titleRebuildRequired": string;
"obsidianLiveSyncSettingTab.titleRemoteConfigCheckFailed": string;
"obsidianLiveSyncSettingTab.titleRemoteServer": string;
"obsidianLiveSyncSettingTab.titleReset": string;
"obsidianLiveSyncSettingTab.titleSetupOtherDevices": string;
"obsidianLiveSyncSettingTab.titleSynchronizationMethod": string;
"obsidianLiveSyncSettingTab.titleSynchronizationPreset": string;
"obsidianLiveSyncSettingTab.titleSyncSettings": string;
"obsidianLiveSyncSettingTab.titleSyncSettingsViaMarkdown": string;
"obsidianLiveSyncSettingTab.titleUpdateThinning": string;
"obsidianLiveSyncSettingTab.warnCorsOriginUnmatched": string;
"obsidianLiveSyncSettingTab.warnNoAdmin": string;
"P2P.AskPassphraseForDecrypt": string;
"P2P.AskPassphraseForShare": string;
"P2P.DisabledButNeed": string;
"P2P.FailedToOpen": string;
"P2P.NoAutoSyncPeers": string;
"P2P.NoKnownPeers": string;
"P2P.Note.description": string;
"P2P.Note.important_note": string;
"P2P.Note.important_note_sub": string;
"P2P.Note.Summary": string;
"P2P.NotEnabled": string;
"P2P.P2PReplication": string;
"P2P.PaneTitle": string;
"P2P.ReplicatorInstanceMissing": string;
"P2P.SeemsOffline": string;
"P2P.SyncAlreadyRunning": string;
"P2P.SyncCompleted": string;
"P2P.SyncStartedWith": string;
Passphrase: string;
"Passphrase of sensitive configuration items": string;
password: string;
Password: string;
"Path Obfuscation": string;
"Per-file-saved customization sync": string;
"Periodic Sync interval": string;
"Prepare the 'report' to create an issue": string;
Presets: string;
"Process small files in the foreground": string;
"Property Encryption": string;
"RedFlag.Fetch.Method.Desc": string;
"RedFlag.Fetch.Method.FetchSafer": string;
"RedFlag.Fetch.Method.FetchSmoother": string;
"RedFlag.Fetch.Method.FetchTraditional": string;
"RedFlag.Fetch.Method.Title": string;
"RedFlag.FetchRemoteConfig.Buttons.Cancel": string;
"RedFlag.FetchRemoteConfig.Buttons.Fetch": string;
"RedFlag.FetchRemoteConfig.Message": string;
"RedFlag.FetchRemoteConfig.Title": string;
"Reducing the frequency with which on-disk changes are reflected into the DB": string;
Region: string;
"Remote server type": string;
"Remote Type": string;
"Replicator.Dialogue.Locked.Action.Dismiss": string;
"Replicator.Dialogue.Locked.Action.Fetch": string;
"Replicator.Dialogue.Locked.Action.Unlock": string;
"Replicator.Dialogue.Locked.Message": string;
"Replicator.Dialogue.Locked.Message.Fetch": string;
"Replicator.Dialogue.Locked.Message.Unlocked": string;
"Replicator.Dialogue.Locked.Title": string;
"Replicator.Message.Cleaned": string;
"Replicator.Message.InitialiseFatalError": string;
"Replicator.Message.Pending": string;
"Replicator.Message.SomeModuleFailed": string;
"Replicator.Message.VersionUpFlash": string;
"Requires restart of Obsidian": string;
"Requires restart of Obsidian.": string;
"Rerun Onboarding Wizard": string;
"Rerun the onboarding wizard to set up Self-hosted LiveSync again.": string;
"Rerun Wizard": string;
"Reset notification threshold and check the remote database usage": string;
"Reset the remote storage size threshold and check the remote storage size again.": string;
"Run Doctor": string;
"Save settings to a markdown file. You will be notified when new settings arrive. You can set different files by the platform.": string;
"Saving will be performed forcefully after this number of seconds.": string;
"Scan changes on customization sync": string;
"Scan customization automatically": string;
"Scan customization before replicating.": string;
"Scan customization every 1 minute.": string;
"Scan customization periodically": string;
"Scan for hidden files before replication": string;
"Scan hidden files periodically": string;
"Seconds, 0 to disable": string;
"Seconds. Saving to the local database will be delayed until this value after we stop typing or saving.": string;
"Secret Key": string;
"Server URI": string;
"Setting.GenerateKeyPair.Desc": string;
"Setting.GenerateKeyPair.Title": string;
"Setting.TroubleShooting": string;
"Setting.TroubleShooting.Doctor": string;
"Setting.TroubleShooting.Doctor.Desc": string;
"Setting.TroubleShooting.ScanBrokenFiles": string;
"Setting.TroubleShooting.ScanBrokenFiles.Desc": string;
"SettingTab.Message.AskRebuild": string;
"Setup.Apply.Buttons.ApplyAndFetch": string;
"Setup.Apply.Buttons.ApplyAndMerge": string;
"Setup.Apply.Buttons.ApplyAndRebuild": string;
"Setup.Apply.Buttons.Cancel": string;
"Setup.Apply.Buttons.OnlyApply": string;
"Setup.Apply.Message": string;
"Setup.Apply.Title": string;
"Setup.Apply.WarningRebuildRecommended": string;
"Setup.Doctor.Buttons.No": string;
"Setup.Doctor.Buttons.Yes": string;
"Setup.Doctor.Message": string;
"Setup.Doctor.Title": string;
"Setup.FetchRemoteConf.Buttons.Fetch": string;
"Setup.FetchRemoteConf.Buttons.Skip": string;
"Setup.FetchRemoteConf.Message": string;
"Setup.FetchRemoteConf.Title": string;
"Setup.QRCode": string;
"Setup.ShowQRCode": string;
"Setup.ShowQRCode.Desc": string;
"Should we keep folders that don't have any files inside?": string;
"Should we only check for conflicts when a file is opened?": string;
"Should we prompt you about conflicting files when a file is opened?": string;
"Should we prompt you for every single merge, even if we can safely merge automatcially?": string;
"Show only notifications": string;
"Show status as icons only": string;
"Show status icon instead of file warnings banner": string;
"Show status inside the editor": string;
"Show status on the status bar": string;
"Show verbose log. Please enable if you report an issue.": string;
"Starts synchronisation when a file is saved.": string;
"Stop reflecting database changes to storage files.": string;
"Stop watching for file changes.": string;
"Suppress notification of hidden files change": string;
"Suspend database reflecting": string;
"Suspend file watching": string;
"Sync after merging file": string;
"Sync automatically after merging files": string;
"Sync Mode": string;
"Sync on Editor Save": string;
"Sync on File Open": string;
"Sync on Save": string;
"Sync on Startup": string;
"Testing only - Resolve file conflicts by syncing newer copies of the file, this can overwrite modified files. Be Warned.": string;
"The delay for consecutive on-demand fetches": string;
"The Hash algorithm for chunk IDs": string;
"The maximum duration for which chunks can be incubated within the document. Chunks exceeding this period will graduate to independent chunks.": string;
"The maximum number of chunks that can be incubated within the document. Chunks exceeding this number will immediately graduate to independent chunks.": string;
"The maximum total size of chunks that can be incubated within the document. Chunks exceeding this size will immediately graduate to independent chunks.": string;
"The minimum interval for automatic synchronisation on event.": string;
"This passphrase will not be copied to another device. It will be set to `Default` until you configure it again.": string;
"TweakMismatchResolve.Action.Dismiss": string;
"TweakMismatchResolve.Action.UseConfigured": string;
"TweakMismatchResolve.Action.UseMine": string;
"TweakMismatchResolve.Action.UseMineAcceptIncompatible": string;
"TweakMismatchResolve.Action.UseMineWithRebuild": string;
"TweakMismatchResolve.Action.UseRemote": string;
"TweakMismatchResolve.Action.UseRemoteAcceptIncompatible": string;
"TweakMismatchResolve.Action.UseRemoteWithRebuild": string;
"TweakMismatchResolve.Message.Main": string;
"TweakMismatchResolve.Message.MainTweakResolving": string;
"TweakMismatchResolve.Message.UseRemote.WarningRebuildRecommended": string;
"TweakMismatchResolve.Message.UseRemote.WarningRebuildRequired": string;
"TweakMismatchResolve.Message.WarningIncompatibleRebuildRecommended": string;
"TweakMismatchResolve.Message.WarningIncompatibleRebuildRequired": string;
"TweakMismatchResolve.Table": string;
"TweakMismatchResolve.Table.Row": string;
"TweakMismatchResolve.Title": string;
"TweakMismatchResolve.Title.TweakResolving": string;
"TweakMismatchResolve.Title.UseRemoteConfig": string;
"Unique name between all synchronized devices. To edit this setting, please disable customization sync once.": string;
"Use Custom HTTP Handler": string;
"Use dynamic iteration count": string;
"Use Segmented-splitter": string;
"Use splitting-limit-capped chunk splitter": string;
"Use the trash bin": string;
"Use timeouts instead of heartbeats": string;
username: string;
Username: string;
"Verbose Log": string;
"Warning! This will have a serious impact on performance. And the logs will not be synchronised under the default name. Please be careful with logs; they often contain your confidential information.": string;
"When you save a file in the editor, start a sync automatically": string;
"Write credentials in the file": string;
"Write logs into the file": string;
};
};
+838
View File
@@ -0,0 +1,838 @@
export declare const PartialMessages: {
readonly ja: {
"(Active)": string;
"(BETA) Always overwrite with a newer file": string;
"(Beta) Use ignore files": string;
"(Days passed, 0 to disable automatic-deletion)": string;
"(ex. Read chunks online) If this option is enabled, LiveSync reads chunks online directly instead of replicating them locally. Increasing Custom chunk size is recommended.": string;
"(MB) If this is set, changes to local and remote files that are larger than this will be skipped. If the file becomes smaller again, a newer one will be used.": string;
"(Mega chars)": string;
"(Not recommended) If set, credentials will be stored in the file.": string;
"(Obsolete) Use an old adapter for compatibility": string;
"(RegExp) Empty to sync all files. Set filter as a regular expression to limit synchronising files.": string;
"(RegExp) If this is set, any changes to local and remote files that match this will be skipped.": string;
"(Select this if you are already using synchronisation on another computer or smartphone.) This option is suitable if you are new to LiveSync and want to set it up from scratch.": string;
"(Select this if you are configuring this device as the first synchronisation device.) This option is suitable if you are new to LiveSync and want to set it up from scratch.": string;
"> [!INFO]- The connected devices have been detected as follows:\n${devices}": string;
"A Setup URI is a single string of text containing your server address and authentication details. Using a URI, if one was generated by your server installation script, provides a simple and secure configuration.": string;
"Access Key": string;
Activate: string;
"Add default patterns": string;
"Add new connection": string;
"All devices have the same progress value (${progress}). Your devices seem to be synchronised. And be able to proceed with Garbage Collection.": string;
"Always prompt merge conflicts": string;
"Analyse database usage": string;
"Analyse database usage and generate a TSV report for diagnosis yourself. You can paste the generated report with any spreadsheet you like.": string;
"Apply Latest Change if Conflicting": string;
"Apply preset configuration": string;
"Ask a passphrase at every launch": string;
"Automatically Sync all files when opening Obsidian.": string;
Back: string;
"Back to non-configured": string;
"Batch database update": string;
"Batch limit": string;
"Batch size": string;
"Batch size of on-demand fetching": string;
"Before v0.17.16, we used an old adapter for the local database. Now the new adapter is preferred. However, it needs local database rebuilding. Please disable this toggle when you have enough time. If leave it enabled, also while fetching from the remote database, you will be asked to disable this.": string;
"Bucket Name": string;
Cancel: string;
"Cancel Garbage Collection": string;
"Check and convert non-path-obfuscated files": string;
"Check for documents that have not been converted to path-obfuscated IDs and convert them if necessary.": string;
"cmdConfigSync.showCustomizationSync": string;
"Comma separated `.gitignore, .dockerignore`": string;
"Compaction in progress on remote database...": string;
"Compaction on remote database completed successfully.": string;
"Compaction on remote database failed.": string;
"Compaction on remote database timed out.": string;
"Compare the content of files between on local database and storage. If not matched, you will be asked which one you want to keep.": string;
"Compatibility (Conflict Behaviour)": string;
"Compatibility (Database structure)": string;
"Compatibility (Internal API Usage)": string;
"Compatibility (Metadata)": string;
"Compatibility (Remote Database)": string;
"Compatibility (Trouble addressed)": string;
"Compute revisions for chunks": string;
"Configuration Encryption": string;
Configure: string;
"Configure And Change Remote": string;
"Configure E2EE": string;
"Configure Remote": string;
"Configure the same server information as your other devices again, manually, very advanced users only.": string;
"Connection Method": string;
"Continue to CouchDB setup": string;
"Continue to Peer-to-Peer only setup": string;
"Continue to S3/MinIO/R2 setup": string;
Copy: string;
"Copy Report to clipboard": string;
"CouchDB Connection Tweak": string;
"Cross-platform": string;
"Current adapter: {adapter}": string;
"Customization Sync": string;
"Customization Sync (Beta3)": string;
"Data Compression": string;
"Database Adapter": string;
"Database Name": string;
"Database suffix": string;
Default: string;
"Delay conflict resolution of inactive files": string;
"Delay merge conflict prompt for inactive files.": string;
Delete: string;
"Delete all customization sync data": string;
"Delete all data on the remote server.": string;
"Delete local database to reset or uninstall Self-hosted LiveSync": string;
"Delete old metadata of deleted files on start-up": string;
"Delete Remote Configuration": string;
"Delete remote configuration '{name}'?": string;
desktop: string;
Developer: string;
Device: string;
"Device name": string;
"Device Setup Method": string;
"dialog.yourLanguageAvailable": string;
"dialog.yourLanguageAvailable.btnRevertToDefault": string;
"dialog.yourLanguageAvailable.Title": string;
"Disables all synchronization and restart.": string;
"Disables logging, only shows notifications. Please disable if you report an issue.": string;
"Display Language": string;
"Display name": string;
"Do not check configuration mismatch before replication": string;
"Do not keep metadata of deleted files.": string;
"Do not split chunks in the background": string;
"Do not use internal API": string;
"Doctor.Button.DismissThisVersion": string;
"Doctor.Button.Fix": string;
"Doctor.Button.FixButNoRebuild": string;
"Doctor.Button.No": string;
"Doctor.Button.Skip": string;
"Doctor.Button.Yes": string;
"Doctor.Dialogue.Main": string;
"Doctor.Dialogue.MainFix": string;
"Doctor.Dialogue.Title": string;
"Doctor.Dialogue.TitleAlmostDone": string;
"Doctor.Dialogue.TitleFix": string;
"Doctor.Level.Must": string;
"Doctor.Level.Necessary": string;
"Doctor.Level.Optional": string;
"Doctor.Level.Recommended": string;
"Doctor.Message.NoIssues": string;
"Doctor.Message.RebuildLocalRequired": string;
"Doctor.Message.RebuildRequired": string;
"Doctor.Message.SomeSkipped": string;
"Doctor.RULES.E2EE_V02500.REASON": string;
Duplicate: string;
"Duplicate remote": string;
"E2EE Configuration": string;
"Edge case addressing (Behaviour)": string;
"Edge case addressing (Database)": string;
"Edge case addressing (Processing)": string;
"Emergency restart": string;
"Enable advanced features": string;
"Enable customization sync": string;
"Enable Developers' Debug Tools.": string;
"Enable edge case treatment features": string;
"Enable poweruser features": string;
"Enable this if your Object Storage doesn't support CORS": string;
"Enable this option to automatically apply the most recent change to documents even when it conflicts": string;
"Encrypt contents on the remote database. If you use the plugin's synchronization feature, enabling this is recommended.": string;
"Encrypting sensitive configuration items": string;
"Encryption phassphrase. If changed, you should overwrite the server's database with the new (encrypted) files.": string;
"End-to-End Encryption": string;
"Endpoint URL": string;
"Enhance chunk size": string;
"Enter Server Information": string;
"Enter the server information manually": string;
Export: string;
"Failed to connect to remote for compaction.": string;
"Failed to connect to remote for compaction. ${reason}": string;
"Failed to start one-shot replication before Garbage Collection. Garbage Collection Cancelled.": string;
"Failed to start replication after Garbage Collection.": string;
Fetch: string;
"Fetch chunks on demand": string;
"Fetch database with previous behaviour": string;
"Fetch remote settings": string;
"File to resolve conflict": string;
Filename: string;
"First, please select the option that best describes your current situation.": string;
"Flag and restart": string;
"Forces the file to be synced when opened.": string;
"Fresh Start Wipe": string;
"Garbage Collection cancelled by user.": string;
"Garbage Collection completed. Deleted chunks: ${deletedChunks} / ${totalChunks}. Time taken: ${seconds} seconds.": string;
"Garbage Collection Confirmation": string;
"Garbage Collection V3 (Beta)": string;
"Garbage Collection: Found ${unusedChunks} unused chunks to delete.": string;
"Garbage Collection: Scanned ${scanned} / ~${docCount}": string;
"Garbage Collection: Scanning completed. Total chunks: ${totalChunks}, Used chunks: ${usedChunks}": string;
"Handle files as Case-Sensitive": string;
"Hidden Files": string;
"How to display network errors when the sync server is unreachable.": string;
"How would you like to configure the connection to your server?": string;
"I am adding a device to an existing synchronisation setup": string;
"I am setting this up for the first time": string;
"I know my server details, let me enter them": string;
"If disabled(toggled), chunks will be split on the UI thread (Previous behaviour).": string;
"If enabled per-filed efficient customization sync will be used. We need a small migration when enabling this. And all devices should be updated to v0.23.18. Once we enabled this, we lost a compatibility with old versions.": string;
"If enabled, chunks will be split into no more than 100 items. However, dedupe is slightly weaker.": string;
"If enabled, newly created chunks are temporarily kept within the document, and graduated to become independent chunks once stabilised.": string;
"If enabled, the \u26D4 icon will be shown inside the status instead of the file warnings banner. No details will be shown.": string;
"If enabled, the file under 1kb will be processed in the UI thread.": string;
"If enabled, the notification of hidden files change will be suppressed.": string;
"If this enabled, all chunks will be stored with the revision made from its content. (Previous behaviour)": string;
"If this enabled, All files are handled as case-Sensitive (Previous behaviour).": string;
"If this enabled, chunks will be split into semantically meaningful segments. Not all platforms support this feature.": string;
"If this is set, changes to local files which are matched by the ignore files will be skipped. Remote changes are determined using local ignore files.": string;
"If this option is enabled, PouchDB will hold the connection open for 60 seconds, and if no change arrives in that time, close and reopen the socket, instead of holding it open indefinitely. Useful when a proxy limits request duration but can increase resource usage.": string;
"Ignore and Proceed": string;
"Ignore files": string;
"Ignore patterns": string;
"Import connection": string;
"Incubate Chunks in Document": string;
"Initialise all journal history, On the next sync, every item will be received and sent.": string;
"Interval (sec)": string;
"K.exp": string;
"K.long_p2p_sync": string;
"K.P2P": string;
"K.Peer": string;
"K.ScanCustomization": string;
"K.short_p2p_sync": string;
"K.title_p2p_sync": string;
"Keep empty folder": string;
lang_def: string;
"lang-de": string;
"lang-def": string;
"lang-es": string;
"lang-fr": string;
"lang-ja": string;
"lang-ko": string;
"lang-ru": string;
"lang-zh": string;
"lang-zh-tw": string;
Later: string;
"Limit: {datetime} ({timestamp})": string;
"LiveSync could not handle multiple vaults which have same name without different prefix, This should be automatically configured.": string;
"liveSyncReplicator.beforeLiveSync": string;
"liveSyncReplicator.cantReplicateLowerValue": string;
"liveSyncReplicator.checkingLastSyncPoint": string;
"liveSyncReplicator.couldNotConnectTo": string;
"liveSyncReplicator.couldNotConnectToRemoteDb": string;
"liveSyncReplicator.couldNotConnectToServer": string;
"liveSyncReplicator.couldNotConnectToURI": string;
"liveSyncReplicator.couldNotMarkResolveRemoteDb": string;
"liveSyncReplicator.liveSyncBegin": string;
"liveSyncReplicator.lockRemoteDb": string;
"liveSyncReplicator.markDeviceResolved": string;
"liveSyncReplicator.oneShotSyncBegin": string;
"liveSyncReplicator.remoteDbCorrupted": string;
"liveSyncReplicator.remoteDbCreatedOrConnected": string;
"liveSyncReplicator.remoteDbDestroyed": string;
"liveSyncReplicator.remoteDbDestroyError": string;
"liveSyncReplicator.remoteDbMarkedResolved": string;
"liveSyncReplicator.replicationClosed": string;
"liveSyncReplicator.replicationInProgress": string;
"liveSyncReplicator.retryLowerBatchSize": string;
"liveSyncReplicator.unlockRemoteDb": string;
"liveSyncSetting.errorNoSuchSettingItem": string;
"liveSyncSetting.originalValue": string;
"liveSyncSetting.valueShouldBeInRange": string;
"liveSyncSettings.btnApply": string;
"Local Database Tweak": string;
Lock: string;
"Lock Server": string;
"Lock the remote server to prevent synchronization with other devices.": string;
"logPane.autoScroll": string;
"logPane.logWindowOpened": string;
"logPane.pause": string;
"logPane.title": string;
"logPane.wrap": string;
"Maximum delay for batch database updating": string;
"Maximum file size": string;
"Maximum Incubating Chunk Size": string;
"Maximum Incubating Chunks": string;
"Maximum Incubation Period": string;
"MB (0 to disable).": string;
"Memory cache": string;
"Memory cache size (by total characters)": string;
"Memory cache size (by total items)": string;
Merge: string;
"Minimum delay for batch database updating": string;
"Minimum interval for syncing": string;
"moduleCheckRemoteSize.logCheckingStorageSizes": string;
"moduleCheckRemoteSize.logCurrentStorageSize": string;
"moduleCheckRemoteSize.logExceededWarning": string;
"moduleCheckRemoteSize.logThresholdEnlarged": string;
"moduleCheckRemoteSize.msgConfirmRebuild": string;
"moduleCheckRemoteSize.msgDatabaseGrowing": string;
"moduleCheckRemoteSize.msgSetDBCapacity": string;
"moduleCheckRemoteSize.option2GB": string;
"moduleCheckRemoteSize.option800MB": string;
"moduleCheckRemoteSize.optionAskMeLater": string;
"moduleCheckRemoteSize.optionDismiss": string;
"moduleCheckRemoteSize.optionIncreaseLimit": string;
"moduleCheckRemoteSize.optionNoWarn": string;
"moduleCheckRemoteSize.optionRebuildAll": string;
"moduleCheckRemoteSize.titleDatabaseSizeLimitExceeded": string;
"moduleCheckRemoteSize.titleDatabaseSizeNotify": string;
"moduleInputUIObsidian.defaultTitleConfirmation": string;
"moduleInputUIObsidian.defaultTitleSelect": string;
"moduleInputUIObsidian.optionNo": string;
"moduleInputUIObsidian.optionYes": string;
"moduleLiveSyncMain.logAdditionalSafetyScan": string;
"moduleLiveSyncMain.logLoadingPlugin": string;
"moduleLiveSyncMain.logPluginInitCancelled": string;
"moduleLiveSyncMain.logPluginVersion": string;
"moduleLiveSyncMain.logReadChangelog": string;
"moduleLiveSyncMain.logSafetyScanCompleted": string;
"moduleLiveSyncMain.logSafetyScanFailed": string;
"moduleLiveSyncMain.logUnloadingPlugin": string;
"moduleLiveSyncMain.logVersionUpdate": string;
"moduleLiveSyncMain.msgScramEnabled": string;
"moduleLiveSyncMain.optionKeepLiveSyncDisabled": string;
"moduleLiveSyncMain.optionResumeAndRestart": string;
"moduleLiveSyncMain.titleScramEnabled": string;
"moduleLocalDatabase.logWaitingForReady": string;
"moduleLog.showLog": string;
"moduleMigration.docUri": string;
"moduleMigration.fix0256.buttons.checkItLater": string;
"moduleMigration.fix0256.buttons.DismissForever": string;
"moduleMigration.fix0256.buttons.fix": string;
"moduleMigration.fix0256.message": string;
"moduleMigration.fix0256.messageUnrecoverable": string;
"moduleMigration.fix0256.title": string;
"moduleMigration.insecureChunkExist.buttons.fetch": string;
"moduleMigration.insecureChunkExist.buttons.later": string;
"moduleMigration.insecureChunkExist.buttons.rebuild": string;
"moduleMigration.insecureChunkExist.laterMessage": string;
"moduleMigration.insecureChunkExist.message": string;
"moduleMigration.insecureChunkExist.title": string;
"moduleMigration.logBulkSendCorrupted": string;
"moduleMigration.logFetchRemoteTweakFailed": string;
"moduleMigration.logLocalDatabaseNotReady": string;
"moduleMigration.logMigratedSameBehaviour": string;
"moduleMigration.logMigrationFailed": string;
"moduleMigration.logRedflag2CreationFail": string;
"moduleMigration.logRemoteTweakUnavailable": string;
"moduleMigration.logSetupCancelled": string;
"moduleMigration.msgFetchRemoteAgain": string;
"moduleMigration.msgInitialSetup": string;
"moduleMigration.msgRecommendSetupUri": string;
"moduleMigration.msgSinceV02321": string;
"moduleMigration.optionAdjustRemote": string;
"moduleMigration.optionDecideLater": string;
"moduleMigration.optionEnableBoth": string;
"moduleMigration.optionEnableFilenameCaseInsensitive": string;
"moduleMigration.optionEnableFixedRevisionForChunks": string;
"moduleMigration.optionHaveSetupUri": string;
"moduleMigration.optionKeepPreviousBehaviour": string;
"moduleMigration.optionManualSetup": string;
"moduleMigration.optionNoAskAgain": string;
"moduleMigration.optionNoSetupUri": string;
"moduleMigration.optionRemindNextLaunch": string;
"moduleMigration.optionSetupViaP2P": string;
"moduleMigration.optionSetupWizard": string;
"moduleMigration.optionYesFetchAgain": string;
"moduleMigration.titleCaseSensitivity": string;
"moduleMigration.titleRecommendSetupUri": string;
"moduleMigration.titleWelcome": string;
"moduleObsidianMenu.replicate": string;
"More actions": string;
"Move remotely deleted files to the trash, instead of deleting.": string;
"Network warning style": string;
"New Remote": string;
"No connected device information found. Cancelling Garbage Collection.": string;
"No limit configured": string;
"No, please take me back": string;
"Node ID": string;
"Node Information Missing": string;
"Non-Synchronising files": string;
"Normal Files": string;
"Not all messages have been translated. And, please revert to \"Default\" when reporting errors.": string;
"Notify all setting files": string;
"Notify customized": string;
"Notify when other device has newly customized.": string;
"Notify when the estimated remote storage size exceeds on start up": string;
"Number of batches to process at a time. Defaults to 40. Minimum is 2. This along with batch size controls how many docs are kept in memory at a time.": string;
"Number of changes to sync at a time. Defaults to 50. Minimum is 2.": string;
"Obsidian version": string;
"obsidianLiveSyncSettingTab.btnApply": string;
"obsidianLiveSyncSettingTab.btnCheck": string;
"obsidianLiveSyncSettingTab.btnCopy": string;
"obsidianLiveSyncSettingTab.btnDisable": string;
"obsidianLiveSyncSettingTab.btnDiscard": string;
"obsidianLiveSyncSettingTab.btnEnable": string;
"obsidianLiveSyncSettingTab.btnFix": string;
"obsidianLiveSyncSettingTab.btnGotItAndUpdated": string;
"obsidianLiveSyncSettingTab.btnNext": string;
"obsidianLiveSyncSettingTab.btnStart": string;
"obsidianLiveSyncSettingTab.btnTest": string;
"obsidianLiveSyncSettingTab.btnUse": string;
"obsidianLiveSyncSettingTab.buttonFetch": string;
"obsidianLiveSyncSettingTab.buttonNext": string;
"obsidianLiveSyncSettingTab.defaultLanguage": string;
"obsidianLiveSyncSettingTab.descConnectSetupURI": string;
"obsidianLiveSyncSettingTab.descCopySetupURI": string;
"obsidianLiveSyncSettingTab.descEnableLiveSync": string;
"obsidianLiveSyncSettingTab.descFetchConfigFromRemote": string;
"obsidianLiveSyncSettingTab.descManualSetup": string;
"obsidianLiveSyncSettingTab.descTestDatabaseConnection": string;
"obsidianLiveSyncSettingTab.descValidateDatabaseConfig": string;
"obsidianLiveSyncSettingTab.errAccessForbidden": string;
"obsidianLiveSyncSettingTab.errCannotContinueTest": string;
"obsidianLiveSyncSettingTab.errCorsCredentials": string;
"obsidianLiveSyncSettingTab.errCorsNotAllowingCredentials": string;
"obsidianLiveSyncSettingTab.errCorsOrigins": string;
"obsidianLiveSyncSettingTab.errEnableCors": string;
"obsidianLiveSyncSettingTab.errEnableCorsChttpd": string;
"obsidianLiveSyncSettingTab.errMaxDocumentSize": string;
"obsidianLiveSyncSettingTab.errMaxRequestSize": string;
"obsidianLiveSyncSettingTab.errMissingWwwAuth": string;
"obsidianLiveSyncSettingTab.errRequireValidUser": string;
"obsidianLiveSyncSettingTab.errRequireValidUserAuth": string;
"obsidianLiveSyncSettingTab.labelDisabled": string;
"obsidianLiveSyncSettingTab.labelEnabled": string;
"obsidianLiveSyncSettingTab.levelAdvanced": string;
"obsidianLiveSyncSettingTab.levelEdgeCase": string;
"obsidianLiveSyncSettingTab.levelPowerUser": string;
"obsidianLiveSyncSettingTab.linkOpenInBrowser": string;
"obsidianLiveSyncSettingTab.linkPageTop": string;
"obsidianLiveSyncSettingTab.linkTipsAndTroubleshooting": string;
"obsidianLiveSyncSettingTab.linkTroubleshooting": string;
"obsidianLiveSyncSettingTab.logCannotUseCloudant": string;
"obsidianLiveSyncSettingTab.logCheckingConfigDone": string;
"obsidianLiveSyncSettingTab.logCheckingConfigFailed": string;
"obsidianLiveSyncSettingTab.logCheckingDbConfig": string;
"obsidianLiveSyncSettingTab.logCheckPassphraseFailed": string;
"obsidianLiveSyncSettingTab.logConfiguredDisabled": string;
"obsidianLiveSyncSettingTab.logConfiguredLiveSync": string;
"obsidianLiveSyncSettingTab.logConfiguredPeriodic": string;
"obsidianLiveSyncSettingTab.logCouchDbConfigFail": string;
"obsidianLiveSyncSettingTab.logCouchDbConfigSet": string;
"obsidianLiveSyncSettingTab.logCouchDbConfigUpdated": string;
"obsidianLiveSyncSettingTab.logDatabaseConnected": string;
"obsidianLiveSyncSettingTab.logEncryptionNoPassphrase": string;
"obsidianLiveSyncSettingTab.logEncryptionNoSupport": string;
"obsidianLiveSyncSettingTab.logErrorOccurred": string;
"obsidianLiveSyncSettingTab.logEstimatedSize": string;
"obsidianLiveSyncSettingTab.logPassphraseInvalid": string;
"obsidianLiveSyncSettingTab.logPassphraseNotCompatible": string;
"obsidianLiveSyncSettingTab.logRebuildNote": string;
"obsidianLiveSyncSettingTab.logSelectAnyPreset": string;
"obsidianLiveSyncSettingTab.msgAreYouSureProceed": string;
"obsidianLiveSyncSettingTab.msgChangesNeedToBeApplied": string;
"obsidianLiveSyncSettingTab.msgConfigCheck": string;
"obsidianLiveSyncSettingTab.msgConfigCheckFailed": string;
"obsidianLiveSyncSettingTab.msgConnectionCheck": string;
"obsidianLiveSyncSettingTab.msgConnectionProxyNote": string;
"obsidianLiveSyncSettingTab.msgCurrentOrigin": string;
"obsidianLiveSyncSettingTab.msgDiscardConfirmation": string;
"obsidianLiveSyncSettingTab.msgDone": string;
"obsidianLiveSyncSettingTab.msgEnableCors": string;
"obsidianLiveSyncSettingTab.msgEnableCorsChttpd": string;
"obsidianLiveSyncSettingTab.msgEnableEncryptionRecommendation": string;
"obsidianLiveSyncSettingTab.msgFetchConfigFromRemote": string;
"obsidianLiveSyncSettingTab.msgGenerateSetupURI": string;
"obsidianLiveSyncSettingTab.msgIfConfigNotPersistent": string;
"obsidianLiveSyncSettingTab.msgInvalidPassphrase": string;
"obsidianLiveSyncSettingTab.msgNewVersionNote": string;
"obsidianLiveSyncSettingTab.msgNonHTTPSInfo": string;
"obsidianLiveSyncSettingTab.msgNonHTTPSWarning": string;
"obsidianLiveSyncSettingTab.msgNotice": string;
"obsidianLiveSyncSettingTab.msgObjectStorageWarning": string;
"obsidianLiveSyncSettingTab.msgOriginCheck": string;
"obsidianLiveSyncSettingTab.msgRebuildRequired": string;
"obsidianLiveSyncSettingTab.msgSelectAndApplyPreset": string;
"obsidianLiveSyncSettingTab.msgSetCorsCredentials": string;
"obsidianLiveSyncSettingTab.msgSetCorsOrigins": string;
"obsidianLiveSyncSettingTab.msgSetMaxDocSize": string;
"obsidianLiveSyncSettingTab.msgSetMaxRequestSize": string;
"obsidianLiveSyncSettingTab.msgSetRequireValidUser": string;
"obsidianLiveSyncSettingTab.msgSetRequireValidUserAuth": string;
"obsidianLiveSyncSettingTab.msgSettingModified": string;
"obsidianLiveSyncSettingTab.msgSettingsUnchangeableDuringSync": string;
"obsidianLiveSyncSettingTab.msgSetWwwAuth": string;
"obsidianLiveSyncSettingTab.nameApplySettings": string;
"obsidianLiveSyncSettingTab.nameConnectSetupURI": string;
"obsidianLiveSyncSettingTab.nameCopySetupURI": string;
"obsidianLiveSyncSettingTab.nameDisableHiddenFileSync": string;
"obsidianLiveSyncSettingTab.nameDiscardSettings": string;
"obsidianLiveSyncSettingTab.nameEnableHiddenFileSync": string;
"obsidianLiveSyncSettingTab.nameEnableLiveSync": string;
"obsidianLiveSyncSettingTab.nameHiddenFileSynchronization": string;
"obsidianLiveSyncSettingTab.nameManualSetup": string;
"obsidianLiveSyncSettingTab.nameTestConnection": string;
"obsidianLiveSyncSettingTab.nameTestDatabaseConnection": string;
"obsidianLiveSyncSettingTab.nameValidateDatabaseConfig": string;
"obsidianLiveSyncSettingTab.okAdminPrivileges": string;
"obsidianLiveSyncSettingTab.okCorsCredentials": string;
"obsidianLiveSyncSettingTab.okCorsCredentialsForOrigin": string;
"obsidianLiveSyncSettingTab.okCorsOriginMatched": string;
"obsidianLiveSyncSettingTab.okCorsOrigins": string;
"obsidianLiveSyncSettingTab.okEnableCors": string;
"obsidianLiveSyncSettingTab.okEnableCorsChttpd": string;
"obsidianLiveSyncSettingTab.okMaxDocumentSize": string;
"obsidianLiveSyncSettingTab.okMaxRequestSize": string;
"obsidianLiveSyncSettingTab.okRequireValidUser": string;
"obsidianLiveSyncSettingTab.okRequireValidUserAuth": string;
"obsidianLiveSyncSettingTab.okWwwAuth": string;
"obsidianLiveSyncSettingTab.optionApply": string;
"obsidianLiveSyncSettingTab.optionCancel": string;
"obsidianLiveSyncSettingTab.optionCouchDB": string;
"obsidianLiveSyncSettingTab.optionDisableAllAutomatic": string;
"obsidianLiveSyncSettingTab.optionFetchFromRemote": string;
"obsidianLiveSyncSettingTab.optionHere": string;
"obsidianLiveSyncSettingTab.optionLiveSync": string;
"obsidianLiveSyncSettingTab.optionMinioS3R2": string;
"obsidianLiveSyncSettingTab.optionOkReadEverything": string;
"obsidianLiveSyncSettingTab.optionOnEvents": string;
"obsidianLiveSyncSettingTab.optionPeriodicAndEvents": string;
"obsidianLiveSyncSettingTab.optionPeriodicWithBatch": string;
"obsidianLiveSyncSettingTab.optionRebuildBoth": string;
"obsidianLiveSyncSettingTab.optionSaveOnlySettings": string;
"obsidianLiveSyncSettingTab.panelChangeLog": string;
"obsidianLiveSyncSettingTab.panelGeneralSettings": string;
"obsidianLiveSyncSettingTab.panelPrivacyEncryption": string;
"obsidianLiveSyncSettingTab.panelRemoteConfiguration": string;
"obsidianLiveSyncSettingTab.panelSetup": string;
"obsidianLiveSyncSettingTab.serverVersion": string;
"obsidianLiveSyncSettingTab.titleActiveRemoteServer": string;
"obsidianLiveSyncSettingTab.titleAppearance": string;
"obsidianLiveSyncSettingTab.titleConflictResolution": string;
"obsidianLiveSyncSettingTab.titleCongratulations": string;
"obsidianLiveSyncSettingTab.titleCouchDB": string;
"obsidianLiveSyncSettingTab.titleDeletionPropagation": string;
"obsidianLiveSyncSettingTab.titleEncryptionNotEnabled": string;
"obsidianLiveSyncSettingTab.titleEncryptionPassphraseInvalid": string;
"obsidianLiveSyncSettingTab.titleExtraFeatures": string;
"obsidianLiveSyncSettingTab.titleFetchConfig": string;
"obsidianLiveSyncSettingTab.titleFetchConfigFromRemote": string;
"obsidianLiveSyncSettingTab.titleFetchSettings": string;
"obsidianLiveSyncSettingTab.titleHiddenFiles": string;
"obsidianLiveSyncSettingTab.titleLogging": string;
"obsidianLiveSyncSettingTab.titleMinioS3R2": string;
"obsidianLiveSyncSettingTab.titleNotification": string;
"obsidianLiveSyncSettingTab.titleOnlineTips": string;
"obsidianLiveSyncSettingTab.titleQuickSetup": string;
"obsidianLiveSyncSettingTab.titleRebuildRequired": string;
"obsidianLiveSyncSettingTab.titleRemoteConfigCheckFailed": string;
"obsidianLiveSyncSettingTab.titleRemoteServer": string;
"obsidianLiveSyncSettingTab.titleReset": string;
"obsidianLiveSyncSettingTab.titleSetupOtherDevices": string;
"obsidianLiveSyncSettingTab.titleSynchronizationMethod": string;
"obsidianLiveSyncSettingTab.titleSynchronizationPreset": string;
"obsidianLiveSyncSettingTab.titleSyncSettings": string;
"obsidianLiveSyncSettingTab.titleSyncSettingsViaMarkdown": string;
"obsidianLiveSyncSettingTab.titleUpdateThinning": string;
"obsidianLiveSyncSettingTab.warnCorsOriginUnmatched": string;
"obsidianLiveSyncSettingTab.warnNoAdmin": string;
Ok: string;
"Old Algorithm": string;
"Older fallback (Slow, W/O WebAssembly)": string;
Open: string;
"Open the dialog": string;
Overwrite: string;
"Overwrite patterns": string;
"Overwrite remote": string;
"Overwrite remote with local DB and passphrase.": string;
"Overwrite Server Data with This Device's Files": string;
"P2P.AskPassphraseForDecrypt": string;
"P2P.AskPassphraseForShare": string;
"P2P.DisabledButNeed": string;
"P2P.FailedToOpen": string;
"P2P.NoAutoSyncPeers": string;
"P2P.NoKnownPeers": string;
"P2P.Note.description": string;
"P2P.Note.important_note": string;
"P2P.Note.important_note_sub": string;
"P2P.Note.Summary": string;
"P2P.NotEnabled": string;
"P2P.P2PReplication": string;
"P2P.PaneTitle": string;
"P2P.ReplicatorInstanceMissing": string;
"P2P.SeemsOffline": string;
"P2P.SyncAlreadyRunning": string;
"P2P.SyncCompleted": string;
"P2P.SyncStartedWith": string;
"paneMaintenance.markDeviceResolvedAfterBackup": string;
"paneMaintenance.remoteLockedAndDeviceNotAccepted": string;
"paneMaintenance.remoteLockedResolvedDevice": string;
"paneMaintenance.unlockDatabaseReady": string;
Passphrase: string;
"Passphrase of sensitive configuration items": string;
password: string;
Password: string;
"Paste a connection string": string;
"Paste the Setup URI generated from one of your active devices.": string;
"Path Obfuscation": string;
"Patterns to match files for overwriting instead of merging": string;
"Patterns to match files for syncing": string;
"Peer-to-Peer only": string;
"Peer-to-Peer Synchronisation": string;
"Per-file-saved customization sync": string;
Perform: string;
"Perform cleanup": string;
"Perform Garbage Collection": string;
"Perform Garbage Collection to remove unused chunks and reduce database size.": string;
"Periodic Sync interval": string;
"Pick a file to resolve conflict": string;
"Please disable 'Read chunks online' in settings to use Garbage Collection.": string;
"Please enable 'Compute revisions for chunks' in settings to use Garbage Collection.": string;
"Please select 'Cancel' explicitly to cancel this operation.": string;
"Please select a method to import the settings from another device.": string;
"Please select an option to proceed": string;
"Please select the type of server to which you are connecting.": string;
"Please set device name to identify this device. This name should be unique among your devices. While not configured, we cannot enable this feature.": string;
"Please set this device name": string;
"Plug-in version": string;
"Prepare the 'report' to create an issue": string;
Presets: string;
"Proceed Garbage Collection": string;
"Proceed with Setup URI": string;
"Proceeding with Garbage Collection, ignoring missing nodes.": string;
"Proceeding with Garbage Collection.": string;
"Process small files in the foreground": string;
Progress: string;
"PureJS fallback (Fast, W/O WebAssembly)": string;
"Purge all download/upload cache.": string;
"Purge all journal counter": string;
"Rebuild local and remote database with local files.": string;
"Rebuilding Operations (Remote Only)": string;
"Recreate all": string;
"Recreate missing chunks for all files": string;
"RedFlag.Fetch.Method.Desc": string;
"RedFlag.Fetch.Method.FetchSafer": string;
"RedFlag.Fetch.Method.FetchSmoother": string;
"RedFlag.Fetch.Method.FetchTraditional": string;
"RedFlag.Fetch.Method.Title": string;
"RedFlag.FetchRemoteConfig.Buttons.Cancel": string;
"RedFlag.FetchRemoteConfig.Buttons.Fetch": string;
"RedFlag.FetchRemoteConfig.Message": string;
"RedFlag.FetchRemoteConfig.Title": string;
"Reduces storage space by discarding all non-latest revisions. This requires the same amount of free space on the remote server and the local client.": string;
"Reducing the frequency with which on-disk changes are reflected into the DB": string;
Region: string;
Remediation: string;
"Remediation Setting Changed": string;
"Remote Database Tweak (In sunset)": string;
"Remote Databases": string;
"Remote name": string;
"Remote server type": string;
"Remote Type": string;
Rename: string;
"Replicator.Dialogue.Locked.Action.Dismiss": string;
"Replicator.Dialogue.Locked.Action.Fetch": string;
"Replicator.Dialogue.Locked.Action.Unlock": string;
"Replicator.Dialogue.Locked.Message": string;
"Replicator.Dialogue.Locked.Message.Fetch": string;
"Replicator.Dialogue.Locked.Message.Unlocked": string;
"Replicator.Dialogue.Locked.Title": string;
"Replicator.Message.Cleaned": string;
"Replicator.Message.InitialiseFatalError": string;
"Replicator.Message.Pending": string;
"Replicator.Message.SomeModuleFailed": string;
"Replicator.Message.VersionUpFlash": string;
"Requires restart of Obsidian": string;
"Requires restart of Obsidian.": string;
"Rerun Onboarding Wizard": string;
"Rerun the onboarding wizard to set up Self-hosted LiveSync again.": string;
"Rerun Wizard": string;
Resend: string;
"Resend all chunks to the remote.": string;
Reset: string;
"Reset all": string;
"Reset all journal counter": string;
"Reset journal received history": string;
"Reset journal sent history": string;
"Reset notification threshold and check the remote database usage": string;
"Reset received": string;
"Reset sent history": string;
"Reset Synchronisation information": string;
"Reset Synchronisation on This Device": string;
"Reset the remote storage size threshold and check the remote storage size again.": string;
"Resolve All": string;
"Resolve all conflicted files": string;
"Resolve All conflicted files by the newer one": string;
"Resolve all conflicted files by the newer one. Caution: This will overwrite the older one, and cannot resurrect the overwritten one.": string;
"Restart Now": string;
"Restore or reconstruct local database from remote.": string;
"Run Doctor": string;
"S3/MinIO/R2 Object Storage": string;
"Save settings to a markdown file. You will be notified when new settings arrive. You can set different files by the platform.": string;
"Saving will be performed forcefully after this number of seconds.": string;
"Scan a QR Code (Recommended for mobile)": string;
"Scan changes on customization sync": string;
"Scan customization automatically": string;
"Scan customization before replicating.": string;
"Scan customization every 1 minute.": string;
"Scan customization periodically": string;
"Scan for Broken files": string;
"Scan for hidden files before replication": string;
"Scan hidden files periodically": string;
"Scan the QR code displayed on an active device using this device's camera.": string;
"Schedule and Restart": string;
"Scram Switches": string;
"Scram!": string;
"Seconds, 0 to disable": string;
"Seconds. Saving to the local database will be delayed until this value after we stop typing or saving.": string;
"Secret Key": string;
"Select the database adapter to use.": string;
Send: string;
"Send chunks": string;
"Server URI": string;
"Setting.GenerateKeyPair.Desc": string;
"Setting.GenerateKeyPair.Title": string;
"Setting.TroubleShooting": string;
"Setting.TroubleShooting.Doctor": string;
"Setting.TroubleShooting.Doctor.Desc": string;
"Setting.TroubleShooting.ScanBrokenFiles": string;
"Setting.TroubleShooting.ScanBrokenFiles.Desc": string;
"SettingTab.Message.AskRebuild": string;
"Setup URI dialog cancelled.": string;
"Setup.Apply.Buttons.ApplyAndFetch": string;
"Setup.Apply.Buttons.ApplyAndMerge": string;
"Setup.Apply.Buttons.ApplyAndRebuild": string;
"Setup.Apply.Buttons.Cancel": string;
"Setup.Apply.Buttons.OnlyApply": string;
"Setup.Apply.Message": string;
"Setup.Apply.Title": string;
"Setup.Apply.WarningRebuildRecommended": string;
"Setup.Doctor.Buttons.No": string;
"Setup.Doctor.Buttons.Yes": string;
"Setup.Doctor.Message": string;
"Setup.Doctor.Title": string;
"Setup.FetchRemoteConf.Buttons.Fetch": string;
"Setup.FetchRemoteConf.Buttons.Skip": string;
"Setup.FetchRemoteConf.Message": string;
"Setup.FetchRemoteConf.Title": string;
"Setup.QRCode": string;
"Setup.RemoteE2EE.AdvancedTitle": string;
"Setup.RemoteE2EE.AlgorithmWarning": string;
"Setup.RemoteE2EE.ButtonCancel": string;
"Setup.RemoteE2EE.ButtonProceed": string;
"Setup.RemoteE2EE.DefaultAlgorithmDesc": string;
"Setup.RemoteE2EE.Guidance": string;
"Setup.RemoteE2EE.LabelEncrypt": string;
"Setup.RemoteE2EE.LabelEncryptionAlgorithm": string;
"Setup.RemoteE2EE.LabelObfuscateProperties": string;
"Setup.RemoteE2EE.MultiDestinationWarning": string;
"Setup.RemoteE2EE.ObfuscatePropertiesDesc": string;
"Setup.RemoteE2EE.PassphraseValidationLine1": string;
"Setup.RemoteE2EE.PassphraseValidationLine2": string;
"Setup.RemoteE2EE.PlaceholderPassphrase": string;
"Setup.RemoteE2EE.StronglyRecommendedLine1": string;
"Setup.RemoteE2EE.StronglyRecommendedLine2": string;
"Setup.RemoteE2EE.StronglyRecommendedTitle": string;
"Setup.RemoteE2EE.Title": string;
"Setup.ScanQRCode.ButtonClose": string;
"Setup.ScanQRCode.Guidance": string;
"Setup.ScanQRCode.Step1": string;
"Setup.ScanQRCode.Step2": string;
"Setup.ScanQRCode.Step3": string;
"Setup.ScanQRCode.Step4": string;
"Setup.ScanQRCode.Title": string;
"Setup.ShowQRCode": string;
"Setup.ShowQRCode.Desc": string;
"Setup.UseSetupURI.ButtonCancel": string;
"Setup.UseSetupURI.ButtonProceed": string;
"Setup.UseSetupURI.ErrorFailedToParse": string;
"Setup.UseSetupURI.ErrorPassphraseRequired": string;
"Setup.UseSetupURI.GuidanceLine1": string;
"Setup.UseSetupURI.GuidanceLine2": string;
"Setup.UseSetupURI.InvalidInfo": string;
"Setup.UseSetupURI.LabelPassphrase": string;
"Setup.UseSetupURI.LabelSetupURI": string;
"Setup.UseSetupURI.PlaceholderPassphrase": string;
"Setup.UseSetupURI.Title": string;
"Setup.UseSetupURI.ValidInfo": string;
"Should we keep folders that don't have any files inside?": string;
"Should we only check for conflicts when a file is opened?": string;
"Should we prompt you about conflicting files when a file is opened?": string;
"Should we prompt you for every single merge, even if we can safely merge automatcially?": string;
"Show full banner": string;
"Show only notifications": string;
"Show status as icons only": string;
"Show status icon instead of file warnings banner": string;
"Show status inside the editor": string;
"Show status on the status bar": string;
"Show verbose log. Please enable if you report an issue.": string;
"Some devices have differing progress values (max: ${maxProgress}, min: ${minProgress}).\nThis may indicate that some devices have not completed synchronisation, which could lead to conflicts. Strongly recommend confirming that all devices are synchronised before proceeding.": string;
"Starts synchronisation when a file is saved.": string;
"Stop reflecting database changes to storage files.": string;
"Stop watching for file changes.": string;
"Suppress notification of hidden files change": string;
"Suspend database reflecting": string;
"Suspend file watching": string;
"Switch to IDB": string;
"Switch to IndexedDB": string;
"Sync after merging file": string;
"Sync automatically after merging files": string;
"Sync Mode": string;
"Sync on Editor Save": string;
"Sync on File Open": string;
"Sync on Save": string;
"Sync on Startup": string;
"Synchronisation utilising journal files. You must have set up an S3/MinIO/R2 compatible object storage.": string;
"Synchronising files": string;
Syncing: string;
"Target patterns": string;
"Testing only - Resolve file conflicts by syncing newer copies of the file, this can overwrite modified files. Be Warned.": string;
"The delay for consecutive on-demand fetches": string;
"The following accepted nodes are missing its node information:\n- ${missingNodes}\n\nThis indicates that they have not been connected for some time or have been left on an older version.\nIt is preferable to update all devices if possible. If you have any devices that are no longer in use, you can clear all accepted nodes by locking the remote once.": string;
"The Hash algorithm for chunk IDs": string;
"The maximum duration for which chunks can be incubated within the document. Chunks exceeding this period will graduate to independent chunks.": string;
"The maximum number of chunks that can be incubated within the document. Chunks exceeding this number will immediately graduate to independent chunks.": string;
"The maximum total size of chunks that can be incubated within the document. Chunks exceeding this size will immediately graduate to independent chunks.": string;
"The minimum interval for automatic synchronisation on event.": string;
"This feature enables direct synchronisation between devices. No server is required, but both devices must be online at the same time for synchronisation to occur, and some features may be limited. Internet connection is only required to signalling (detecting peers) and not for data transfer.": string;
"This is an advanced option for users who do not have a URI or who wish to configure detailed settings.": string;
"This is the most suitable synchronisation method for the design. All functions are available. You must have set up a CouchDB instance.": string;
"This passphrase will not be copied to another device. It will be set to `Default` until you configure it again.": string;
"This will recreate chunks for all files. If there were missing chunks, this may fix the errors.": string;
"Transfer Tweak": string;
"TweakMismatchResolve.Action.Dismiss": string;
"TweakMismatchResolve.Action.UseConfigured": string;
"TweakMismatchResolve.Action.UseMine": string;
"TweakMismatchResolve.Action.UseMineAcceptIncompatible": string;
"TweakMismatchResolve.Action.UseMineWithRebuild": string;
"TweakMismatchResolve.Action.UseRemote": string;
"TweakMismatchResolve.Action.UseRemoteAcceptIncompatible": string;
"TweakMismatchResolve.Action.UseRemoteWithRebuild": string;
"TweakMismatchResolve.Message.Main": string;
"TweakMismatchResolve.Message.MainTweakResolving": string;
"TweakMismatchResolve.Message.UseRemote.WarningRebuildRecommended": string;
"TweakMismatchResolve.Message.UseRemote.WarningRebuildRequired": string;
"TweakMismatchResolve.Message.WarningIncompatibleRebuildRecommended": string;
"TweakMismatchResolve.Message.WarningIncompatibleRebuildRequired": string;
"TweakMismatchResolve.Table": string;
"TweakMismatchResolve.Table.Row": string;
"TweakMismatchResolve.Title": string;
"TweakMismatchResolve.Title.TweakResolving": string;
"TweakMismatchResolve.Title.UseRemoteConfig": string;
"Unique name between all synchronized devices. To edit this setting, please disable customization sync once.": string;
"Use a custom passphrase": string;
"Use a Setup URI (Recommended)": string;
"Use Custom HTTP Handler": string;
"Use dynamic iteration count": string;
"Use Segmented-splitter": string;
"Use splitting-limit-capped chunk splitter": string;
"Use the trash bin": string;
"Use timeouts instead of heartbeats": string;
username: string;
Username: string;
"Verbose Log": string;
"Verify all": string;
"Verify and repair all files": string;
"Warning! This will have a serious impact on performance. And the logs will not be synchronised under the default name. Please be careful with logs; they often contain your confidential information.": string;
"We cannot change the device name while this feature is enabled. Please disable this feature to change the device name.": string;
"We will now guide you through a few questions to simplify the synchronisation setup.": string;
"We will now proceed with the server configuration.": string;
"Welcome to Self-hosted LiveSync": string;
"When you save a file in the editor, start a sync automatically": string;
"Write credentials in the file": string;
"Write logs into the file": string;
"xxhash32 (Fast but less collision resistance)": string;
"xxhash64 (Fastest)": string;
"Yes, I want to add this device to my existing synchronisation": string;
"Yes, I want to set up a new synchronisation": string;
"You are adding this device to an existing synchronisation setup.": string;
};
};
+800
View File
@@ -0,0 +1,800 @@
export declare const PartialMessages: {
readonly ko: {
"(Active)": string;
"(BETA) Always overwrite with a newer file": string;
"(Beta) Use ignore files": string;
"(Days passed, 0 to disable automatic-deletion)": string;
"(ex. Read chunks online) If this option is enabled, LiveSync reads chunks online directly instead of replicating them locally. Increasing Custom chunk size is recommended.": string;
"(MB) If this is set, changes to local and remote files that are larger than this will be skipped. If the file becomes smaller again, a newer one will be used.": string;
"(Mega chars)": string;
"(Not recommended) If set, credentials will be stored in the file.": string;
"(Obsolete) Use an old adapter for compatibility": string;
"(RegExp) Empty to sync all files. Set filter as a regular expression to limit synchronising files.": string;
"(RegExp) If this is set, any changes to local and remote files that match this will be skipped.": string;
"(Select this if you are already using synchronisation on another computer or smartphone.) This option is suitable if you are new to LiveSync and want to set it up from scratch.": string;
"(Select this if you are configuring this device as the first synchronisation device.) This option is suitable if you are new to LiveSync and want to set it up from scratch.": string;
"> [!INFO]- The connected devices have been detected as follows:\n${devices}": string;
"A Setup URI is a single string of text containing your server address and authentication details. Using a URI, if one was generated by your server installation script, provides a simple and secure configuration.": string;
"Access Key": string;
Activate: string;
"Add default patterns": string;
"Add new connection": string;
"All devices have the same progress value (${progress}). Your devices seem to be synchronised. And be able to proceed with Garbage Collection.": string;
"Always prompt merge conflicts": string;
"Analyse database usage": string;
"Analyse database usage and generate a TSV report for diagnosis yourself. You can paste the generated report with any spreadsheet you like.": string;
"Apply Latest Change if Conflicting": string;
"Apply preset configuration": string;
"Ask a passphrase at every launch": string;
"Automatically Sync all files when opening Obsidian.": string;
Back: string;
"Back to non-configured": string;
"Batch database update": string;
"Batch limit": string;
"Batch size": string;
"Batch size of on-demand fetching": string;
"Before v0.17.16, we used an old adapter for the local database. Now the new adapter is preferred. However, it needs local database rebuilding. Please disable this toggle when you have enough time. If leave it enabled, also while fetching from the remote database, you will be asked to disable this.": string;
"Bucket Name": string;
Cancel: string;
"Cancel Garbage Collection": string;
"Check and convert non-path-obfuscated files": string;
"Check for documents that have not been converted to path-obfuscated IDs and convert them if necessary.": string;
"cmdConfigSync.showCustomizationSync": string;
"Comma separated `.gitignore, .dockerignore`": string;
"Compaction in progress on remote database...": string;
"Compaction on remote database completed successfully.": string;
"Compaction on remote database failed.": string;
"Compaction on remote database timed out.": string;
"Compare the content of files between on local database and storage. If not matched, you will be asked which one you want to keep.": string;
"Compatibility (Conflict Behaviour)": string;
"Compatibility (Database structure)": string;
"Compatibility (Internal API Usage)": string;
"Compatibility (Metadata)": string;
"Compatibility (Remote Database)": string;
"Compatibility (Trouble addressed)": string;
"Compute revisions for chunks": string;
"Configuration Encryption": string;
Configure: string;
"Configure And Change Remote": string;
"Configure E2EE": string;
"Configure Remote": string;
"Configure the same server information as your other devices again, manually, very advanced users only.": string;
"Connection Method": string;
"Continue to CouchDB setup": string;
"Continue to Peer-to-Peer only setup": string;
"Continue to S3/MinIO/R2 setup": string;
Copy: string;
"Copy Report to clipboard": string;
"CouchDB Connection Tweak": string;
"Cross-platform": string;
"Current adapter: {adapter}": string;
"Customization Sync": string;
"Customization Sync (Beta3)": string;
"Data Compression": string;
"Database Adapter": string;
"Database Name": string;
"Database suffix": string;
Default: string;
"Delay conflict resolution of inactive files": string;
"Delay merge conflict prompt for inactive files.": string;
Delete: string;
"Delete all customization sync data": string;
"Delete all data on the remote server.": string;
"Delete local database to reset or uninstall Self-hosted LiveSync": string;
"Delete old metadata of deleted files on start-up": string;
"Delete Remote Configuration": string;
"Delete remote configuration '{name}'?": string;
desktop: string;
Developer: string;
Device: string;
"Device name": string;
"Device Setup Method": string;
"dialog.yourLanguageAvailable": string;
"dialog.yourLanguageAvailable.btnRevertToDefault": string;
"dialog.yourLanguageAvailable.Title": string;
"Disables all synchronization and restart.": string;
"Disables logging, only shows notifications. Please disable if you report an issue.": string;
"Display Language": string;
"Display name": string;
"Do not check configuration mismatch before replication": string;
"Do not keep metadata of deleted files.": string;
"Do not split chunks in the background": string;
"Do not use internal API": string;
"Doctor.Button.DismissThisVersion": string;
"Doctor.Button.Fix": string;
"Doctor.Button.FixButNoRebuild": string;
"Doctor.Button.No": string;
"Doctor.Button.Skip": string;
"Doctor.Button.Yes": string;
"Doctor.Dialogue.Main": string;
"Doctor.Dialogue.MainFix": string;
"Doctor.Dialogue.Title": string;
"Doctor.Dialogue.TitleAlmostDone": string;
"Doctor.Dialogue.TitleFix": string;
"Doctor.Level.Must": string;
"Doctor.Level.Necessary": string;
"Doctor.Level.Optional": string;
"Doctor.Level.Recommended": string;
"Doctor.Message.NoIssues": string;
"Doctor.Message.RebuildLocalRequired": string;
"Doctor.Message.RebuildRequired": string;
"Doctor.Message.SomeSkipped": string;
Duplicate: string;
"Duplicate remote": string;
"E2EE Configuration": string;
"Edge case addressing (Behaviour)": string;
"Edge case addressing (Database)": string;
"Edge case addressing (Processing)": string;
"Emergency restart": string;
"Enable advanced features": string;
"Enable customization sync": string;
"Enable Developers' Debug Tools.": string;
"Enable edge case treatment features": string;
"Enable poweruser features": string;
"Enable this if your Object Storage doesn't support CORS": string;
"Enable this option to automatically apply the most recent change to documents even when it conflicts": string;
"Encrypt contents on the remote database. If you use the plugin's synchronization feature, enabling this is recommended.": string;
"Encrypting sensitive configuration items": string;
"Encryption phassphrase. If changed, you should overwrite the server's database with the new (encrypted) files.": string;
"End-to-End Encryption": string;
"Endpoint URL": string;
"Enhance chunk size": string;
"Enter Server Information": string;
"Enter the server information manually": string;
Export: string;
"Failed to connect to remote for compaction.": string;
"Failed to connect to remote for compaction. ${reason}": string;
"Failed to start one-shot replication before Garbage Collection. Garbage Collection Cancelled.": string;
"Failed to start replication after Garbage Collection.": string;
Fetch: string;
"Fetch chunks on demand": string;
"Fetch database with previous behaviour": string;
"Fetch remote settings": string;
"File to resolve conflict": string;
Filename: string;
"First, please select the option that best describes your current situation.": string;
"Flag and restart": string;
"Forces the file to be synced when opened.": string;
"Fresh Start Wipe": string;
"Garbage Collection cancelled by user.": string;
"Garbage Collection completed. Deleted chunks: ${deletedChunks} / ${totalChunks}. Time taken: ${seconds} seconds.": string;
"Garbage Collection Confirmation": string;
"Garbage Collection V3 (Beta)": string;
"Garbage Collection: Found ${unusedChunks} unused chunks to delete.": string;
"Garbage Collection: Scanned ${scanned} / ~${docCount}": string;
"Garbage Collection: Scanning completed. Total chunks: ${totalChunks}, Used chunks: ${usedChunks}": string;
"Handle files as Case-Sensitive": string;
"Hidden Files": string;
"How to display network errors when the sync server is unreachable.": string;
"How would you like to configure the connection to your server?": string;
"I am adding a device to an existing synchronisation setup": string;
"I am setting this up for the first time": string;
"I know my server details, let me enter them": string;
"If disabled(toggled), chunks will be split on the UI thread (Previous behaviour).": string;
"If enabled per-filed efficient customization sync will be used. We need a small migration when enabling this. And all devices should be updated to v0.23.18. Once we enabled this, we lost a compatibility with old versions.": string;
"If enabled, chunks will be split into no more than 100 items. However, dedupe is slightly weaker.": string;
"If enabled, newly created chunks are temporarily kept within the document, and graduated to become independent chunks once stabilised.": string;
"If enabled, the \u26D4 icon will be shown inside the status instead of the file warnings banner. No details will be shown.": string;
"If enabled, the file under 1kb will be processed in the UI thread.": string;
"If enabled, the notification of hidden files change will be suppressed.": string;
"If this enabled, all chunks will be stored with the revision made from its content. (Previous behaviour)": string;
"If this enabled, All files are handled as case-Sensitive (Previous behaviour).": string;
"If this enabled, chunks will be split into semantically meaningful segments. Not all platforms support this feature.": string;
"If this is set, changes to local files which are matched by the ignore files will be skipped. Remote changes are determined using local ignore files.": string;
"If this option is enabled, PouchDB will hold the connection open for 60 seconds, and if no change arrives in that time, close and reopen the socket, instead of holding it open indefinitely. Useful when a proxy limits request duration but can increase resource usage.": string;
"Ignore and Proceed": string;
"Ignore files": string;
"Ignore patterns": string;
"Import connection": string;
"Incubate Chunks in Document": string;
"Initialise all journal history, On the next sync, every item will be received and sent.": string;
"Interval (sec)": string;
"K.exp": string;
"K.long_p2p_sync": string;
"K.P2P": string;
"K.Peer": string;
"K.ScanCustomization": string;
"K.short_p2p_sync": string;
"K.title_p2p_sync": string;
"Keep empty folder": string;
lang_def: string;
"lang-de": string;
"lang-def": string;
"lang-es": string;
"lang-fr": string;
"lang-ja": string;
"lang-ko": string;
"lang-ru": string;
"lang-zh": string;
"lang-zh-tw": string;
Later: string;
"Limit: {datetime} ({timestamp})": string;
"LiveSync could not handle multiple vaults which have same name without different prefix, This should be automatically configured.": string;
"liveSyncReplicator.beforeLiveSync": string;
"liveSyncReplicator.cantReplicateLowerValue": string;
"liveSyncReplicator.checkingLastSyncPoint": string;
"liveSyncReplicator.couldNotConnectTo": string;
"liveSyncReplicator.couldNotConnectToRemoteDb": string;
"liveSyncReplicator.couldNotConnectToServer": string;
"liveSyncReplicator.couldNotConnectToURI": string;
"liveSyncReplicator.couldNotMarkResolveRemoteDb": string;
"liveSyncReplicator.liveSyncBegin": string;
"liveSyncReplicator.lockRemoteDb": string;
"liveSyncReplicator.markDeviceResolved": string;
"liveSyncReplicator.oneShotSyncBegin": string;
"liveSyncReplicator.remoteDbCorrupted": string;
"liveSyncReplicator.remoteDbCreatedOrConnected": string;
"liveSyncReplicator.remoteDbDestroyed": string;
"liveSyncReplicator.remoteDbDestroyError": string;
"liveSyncReplicator.remoteDbMarkedResolved": string;
"liveSyncReplicator.replicationClosed": string;
"liveSyncReplicator.replicationInProgress": string;
"liveSyncReplicator.retryLowerBatchSize": string;
"liveSyncReplicator.unlockRemoteDb": string;
"liveSyncSetting.errorNoSuchSettingItem": string;
"liveSyncSetting.originalValue": string;
"liveSyncSetting.valueShouldBeInRange": string;
"liveSyncSettings.btnApply": string;
"Local Database Tweak": string;
Lock: string;
"Lock Server": string;
"Lock the remote server to prevent synchronization with other devices.": string;
"logPane.autoScroll": string;
"logPane.logWindowOpened": string;
"logPane.pause": string;
"logPane.title": string;
"logPane.wrap": string;
"Maximum delay for batch database updating": string;
"Maximum file size": string;
"Maximum Incubating Chunk Size": string;
"Maximum Incubating Chunks": string;
"Maximum Incubation Period": string;
"MB (0 to disable).": string;
"Memory cache": string;
"Memory cache size (by total characters)": string;
"Memory cache size (by total items)": string;
Merge: string;
"Minimum delay for batch database updating": string;
"Minimum interval for syncing": string;
"moduleCheckRemoteSize.logCheckingStorageSizes": string;
"moduleCheckRemoteSize.logCurrentStorageSize": string;
"moduleCheckRemoteSize.logExceededWarning": string;
"moduleCheckRemoteSize.logThresholdEnlarged": string;
"moduleCheckRemoteSize.msgConfirmRebuild": string;
"moduleCheckRemoteSize.msgDatabaseGrowing": string;
"moduleCheckRemoteSize.msgSetDBCapacity": string;
"moduleCheckRemoteSize.option2GB": string;
"moduleCheckRemoteSize.option800MB": string;
"moduleCheckRemoteSize.optionAskMeLater": string;
"moduleCheckRemoteSize.optionDismiss": string;
"moduleCheckRemoteSize.optionIncreaseLimit": string;
"moduleCheckRemoteSize.optionNoWarn": string;
"moduleCheckRemoteSize.optionRebuildAll": string;
"moduleCheckRemoteSize.titleDatabaseSizeLimitExceeded": string;
"moduleCheckRemoteSize.titleDatabaseSizeNotify": string;
"moduleInputUIObsidian.defaultTitleConfirmation": string;
"moduleInputUIObsidian.defaultTitleSelect": string;
"moduleInputUIObsidian.optionNo": string;
"moduleInputUIObsidian.optionYes": string;
"moduleLiveSyncMain.logAdditionalSafetyScan": string;
"moduleLiveSyncMain.logLoadingPlugin": string;
"moduleLiveSyncMain.logPluginInitCancelled": string;
"moduleLiveSyncMain.logPluginVersion": string;
"moduleLiveSyncMain.logReadChangelog": string;
"moduleLiveSyncMain.logSafetyScanCompleted": string;
"moduleLiveSyncMain.logSafetyScanFailed": string;
"moduleLiveSyncMain.logUnloadingPlugin": string;
"moduleLiveSyncMain.logVersionUpdate": string;
"moduleLiveSyncMain.msgScramEnabled": string;
"moduleLiveSyncMain.optionKeepLiveSyncDisabled": string;
"moduleLiveSyncMain.optionResumeAndRestart": string;
"moduleLiveSyncMain.titleScramEnabled": string;
"moduleLocalDatabase.logWaitingForReady": string;
"moduleLog.showLog": string;
"moduleMigration.docUri": string;
"moduleMigration.logBulkSendCorrupted": string;
"moduleMigration.logFetchRemoteTweakFailed": string;
"moduleMigration.logLocalDatabaseNotReady": string;
"moduleMigration.logMigratedSameBehaviour": string;
"moduleMigration.logMigrationFailed": string;
"moduleMigration.logRedflag2CreationFail": string;
"moduleMigration.logRemoteTweakUnavailable": string;
"moduleMigration.logSetupCancelled": string;
"moduleMigration.msgFetchRemoteAgain": string;
"moduleMigration.msgInitialSetup": string;
"moduleMigration.msgRecommendSetupUri": string;
"moduleMigration.msgSinceV02321": string;
"moduleMigration.optionAdjustRemote": string;
"moduleMigration.optionDecideLater": string;
"moduleMigration.optionEnableBoth": string;
"moduleMigration.optionEnableFilenameCaseInsensitive": string;
"moduleMigration.optionEnableFixedRevisionForChunks": string;
"moduleMigration.optionHaveSetupUri": string;
"moduleMigration.optionKeepPreviousBehaviour": string;
"moduleMigration.optionManualSetup": string;
"moduleMigration.optionNoAskAgain": string;
"moduleMigration.optionNoSetupUri": string;
"moduleMigration.optionRemindNextLaunch": string;
"moduleMigration.optionSetupViaP2P": string;
"moduleMigration.optionSetupWizard": string;
"moduleMigration.optionYesFetchAgain": string;
"moduleMigration.titleCaseSensitivity": string;
"moduleMigration.titleRecommendSetupUri": string;
"moduleMigration.titleWelcome": string;
"moduleObsidianMenu.replicate": string;
"More actions": string;
"Move remotely deleted files to the trash, instead of deleting.": string;
"Network warning style": string;
"New Remote": string;
"No connected device information found. Cancelling Garbage Collection.": string;
"No limit configured": string;
"No, please take me back": string;
"Node ID": string;
"Node Information Missing": string;
"Non-Synchronising files": string;
"Normal Files": string;
"Not all messages have been translated. And, please revert to \"Default\" when reporting errors.": string;
"Notify all setting files": string;
"Notify customized": string;
"Notify when other device has newly customized.": string;
"Notify when the estimated remote storage size exceeds on start up": string;
"Number of batches to process at a time. Defaults to 40. Minimum is 2. This along with batch size controls how many docs are kept in memory at a time.": string;
"Number of changes to sync at a time. Defaults to 50. Minimum is 2.": string;
"Obsidian version": string;
"obsidianLiveSyncSettingTab.btnApply": string;
"obsidianLiveSyncSettingTab.btnCheck": string;
"obsidianLiveSyncSettingTab.btnCopy": string;
"obsidianLiveSyncSettingTab.btnDisable": string;
"obsidianLiveSyncSettingTab.btnDiscard": string;
"obsidianLiveSyncSettingTab.btnEnable": string;
"obsidianLiveSyncSettingTab.btnFix": string;
"obsidianLiveSyncSettingTab.btnGotItAndUpdated": string;
"obsidianLiveSyncSettingTab.btnNext": string;
"obsidianLiveSyncSettingTab.btnStart": string;
"obsidianLiveSyncSettingTab.btnTest": string;
"obsidianLiveSyncSettingTab.btnUse": string;
"obsidianLiveSyncSettingTab.buttonFetch": string;
"obsidianLiveSyncSettingTab.buttonNext": string;
"obsidianLiveSyncSettingTab.defaultLanguage": string;
"obsidianLiveSyncSettingTab.descConnectSetupURI": string;
"obsidianLiveSyncSettingTab.descCopySetupURI": string;
"obsidianLiveSyncSettingTab.descEnableLiveSync": string;
"obsidianLiveSyncSettingTab.descFetchConfigFromRemote": string;
"obsidianLiveSyncSettingTab.descManualSetup": string;
"obsidianLiveSyncSettingTab.descTestDatabaseConnection": string;
"obsidianLiveSyncSettingTab.descValidateDatabaseConfig": string;
"obsidianLiveSyncSettingTab.errAccessForbidden": string;
"obsidianLiveSyncSettingTab.errCannotContinueTest": string;
"obsidianLiveSyncSettingTab.errCorsCredentials": string;
"obsidianLiveSyncSettingTab.errCorsNotAllowingCredentials": string;
"obsidianLiveSyncSettingTab.errCorsOrigins": string;
"obsidianLiveSyncSettingTab.errEnableCors": string;
"obsidianLiveSyncSettingTab.errMaxDocumentSize": string;
"obsidianLiveSyncSettingTab.errMaxRequestSize": string;
"obsidianLiveSyncSettingTab.errMissingWwwAuth": string;
"obsidianLiveSyncSettingTab.errRequireValidUser": string;
"obsidianLiveSyncSettingTab.errRequireValidUserAuth": string;
"obsidianLiveSyncSettingTab.labelDisabled": string;
"obsidianLiveSyncSettingTab.labelEnabled": string;
"obsidianLiveSyncSettingTab.levelAdvanced": string;
"obsidianLiveSyncSettingTab.levelEdgeCase": string;
"obsidianLiveSyncSettingTab.levelPowerUser": string;
"obsidianLiveSyncSettingTab.linkOpenInBrowser": string;
"obsidianLiveSyncSettingTab.linkPageTop": string;
"obsidianLiveSyncSettingTab.linkTipsAndTroubleshooting": string;
"obsidianLiveSyncSettingTab.linkTroubleshooting": string;
"obsidianLiveSyncSettingTab.logCannotUseCloudant": string;
"obsidianLiveSyncSettingTab.logCheckingConfigDone": string;
"obsidianLiveSyncSettingTab.logCheckingConfigFailed": string;
"obsidianLiveSyncSettingTab.logCheckingDbConfig": string;
"obsidianLiveSyncSettingTab.logCheckPassphraseFailed": string;
"obsidianLiveSyncSettingTab.logConfiguredDisabled": string;
"obsidianLiveSyncSettingTab.logConfiguredLiveSync": string;
"obsidianLiveSyncSettingTab.logConfiguredPeriodic": string;
"obsidianLiveSyncSettingTab.logCouchDbConfigFail": string;
"obsidianLiveSyncSettingTab.logCouchDbConfigSet": string;
"obsidianLiveSyncSettingTab.logCouchDbConfigUpdated": string;
"obsidianLiveSyncSettingTab.logDatabaseConnected": string;
"obsidianLiveSyncSettingTab.logEncryptionNoPassphrase": string;
"obsidianLiveSyncSettingTab.logEncryptionNoSupport": string;
"obsidianLiveSyncSettingTab.logErrorOccurred": string;
"obsidianLiveSyncSettingTab.logEstimatedSize": string;
"obsidianLiveSyncSettingTab.logPassphraseInvalid": string;
"obsidianLiveSyncSettingTab.logPassphraseNotCompatible": string;
"obsidianLiveSyncSettingTab.logRebuildNote": string;
"obsidianLiveSyncSettingTab.logSelectAnyPreset": string;
"obsidianLiveSyncSettingTab.msgAreYouSureProceed": string;
"obsidianLiveSyncSettingTab.msgChangesNeedToBeApplied": string;
"obsidianLiveSyncSettingTab.msgConfigCheck": string;
"obsidianLiveSyncSettingTab.msgConfigCheckFailed": string;
"obsidianLiveSyncSettingTab.msgConnectionCheck": string;
"obsidianLiveSyncSettingTab.msgConnectionProxyNote": string;
"obsidianLiveSyncSettingTab.msgCurrentOrigin": string;
"obsidianLiveSyncSettingTab.msgDiscardConfirmation": string;
"obsidianLiveSyncSettingTab.msgDone": string;
"obsidianLiveSyncSettingTab.msgEnableCors": string;
"obsidianLiveSyncSettingTab.msgEnableEncryptionRecommendation": string;
"obsidianLiveSyncSettingTab.msgFetchConfigFromRemote": string;
"obsidianLiveSyncSettingTab.msgGenerateSetupURI": string;
"obsidianLiveSyncSettingTab.msgIfConfigNotPersistent": string;
"obsidianLiveSyncSettingTab.msgInvalidPassphrase": string;
"obsidianLiveSyncSettingTab.msgNewVersionNote": string;
"obsidianLiveSyncSettingTab.msgNonHTTPSInfo": string;
"obsidianLiveSyncSettingTab.msgNonHTTPSWarning": string;
"obsidianLiveSyncSettingTab.msgNotice": string;
"obsidianLiveSyncSettingTab.msgObjectStorageWarning": string;
"obsidianLiveSyncSettingTab.msgOriginCheck": string;
"obsidianLiveSyncSettingTab.msgRebuildRequired": string;
"obsidianLiveSyncSettingTab.msgSelectAndApplyPreset": string;
"obsidianLiveSyncSettingTab.msgSetCorsCredentials": string;
"obsidianLiveSyncSettingTab.msgSetCorsOrigins": string;
"obsidianLiveSyncSettingTab.msgSetMaxDocSize": string;
"obsidianLiveSyncSettingTab.msgSetMaxRequestSize": string;
"obsidianLiveSyncSettingTab.msgSetRequireValidUser": string;
"obsidianLiveSyncSettingTab.msgSetRequireValidUserAuth": string;
"obsidianLiveSyncSettingTab.msgSettingModified": string;
"obsidianLiveSyncSettingTab.msgSettingsUnchangeableDuringSync": string;
"obsidianLiveSyncSettingTab.msgSetWwwAuth": string;
"obsidianLiveSyncSettingTab.nameApplySettings": string;
"obsidianLiveSyncSettingTab.nameConnectSetupURI": string;
"obsidianLiveSyncSettingTab.nameCopySetupURI": string;
"obsidianLiveSyncSettingTab.nameDisableHiddenFileSync": string;
"obsidianLiveSyncSettingTab.nameDiscardSettings": string;
"obsidianLiveSyncSettingTab.nameEnableHiddenFileSync": string;
"obsidianLiveSyncSettingTab.nameEnableLiveSync": string;
"obsidianLiveSyncSettingTab.nameHiddenFileSynchronization": string;
"obsidianLiveSyncSettingTab.nameManualSetup": string;
"obsidianLiveSyncSettingTab.nameTestConnection": string;
"obsidianLiveSyncSettingTab.nameTestDatabaseConnection": string;
"obsidianLiveSyncSettingTab.nameValidateDatabaseConfig": string;
"obsidianLiveSyncSettingTab.okAdminPrivileges": string;
"obsidianLiveSyncSettingTab.okCorsCredentials": string;
"obsidianLiveSyncSettingTab.okCorsCredentialsForOrigin": string;
"obsidianLiveSyncSettingTab.okCorsOriginMatched": string;
"obsidianLiveSyncSettingTab.okCorsOrigins": string;
"obsidianLiveSyncSettingTab.okEnableCors": string;
"obsidianLiveSyncSettingTab.okMaxDocumentSize": string;
"obsidianLiveSyncSettingTab.okMaxRequestSize": string;
"obsidianLiveSyncSettingTab.okRequireValidUser": string;
"obsidianLiveSyncSettingTab.okRequireValidUserAuth": string;
"obsidianLiveSyncSettingTab.okWwwAuth": string;
"obsidianLiveSyncSettingTab.optionApply": string;
"obsidianLiveSyncSettingTab.optionCancel": string;
"obsidianLiveSyncSettingTab.optionCouchDB": string;
"obsidianLiveSyncSettingTab.optionDisableAllAutomatic": string;
"obsidianLiveSyncSettingTab.optionFetchFromRemote": string;
"obsidianLiveSyncSettingTab.optionHere": string;
"obsidianLiveSyncSettingTab.optionLiveSync": string;
"obsidianLiveSyncSettingTab.optionMinioS3R2": string;
"obsidianLiveSyncSettingTab.optionOkReadEverything": string;
"obsidianLiveSyncSettingTab.optionOnEvents": string;
"obsidianLiveSyncSettingTab.optionPeriodicAndEvents": string;
"obsidianLiveSyncSettingTab.optionPeriodicWithBatch": string;
"obsidianLiveSyncSettingTab.optionRebuildBoth": string;
"obsidianLiveSyncSettingTab.optionSaveOnlySettings": string;
"obsidianLiveSyncSettingTab.panelChangeLog": string;
"obsidianLiveSyncSettingTab.panelGeneralSettings": string;
"obsidianLiveSyncSettingTab.panelPrivacyEncryption": string;
"obsidianLiveSyncSettingTab.panelRemoteConfiguration": string;
"obsidianLiveSyncSettingTab.panelSetup": string;
"obsidianLiveSyncSettingTab.titleAppearance": string;
"obsidianLiveSyncSettingTab.titleConflictResolution": string;
"obsidianLiveSyncSettingTab.titleCongratulations": string;
"obsidianLiveSyncSettingTab.titleCouchDB": string;
"obsidianLiveSyncSettingTab.titleDeletionPropagation": string;
"obsidianLiveSyncSettingTab.titleEncryptionNotEnabled": string;
"obsidianLiveSyncSettingTab.titleEncryptionPassphraseInvalid": string;
"obsidianLiveSyncSettingTab.titleExtraFeatures": string;
"obsidianLiveSyncSettingTab.titleFetchConfig": string;
"obsidianLiveSyncSettingTab.titleFetchConfigFromRemote": string;
"obsidianLiveSyncSettingTab.titleFetchSettings": string;
"obsidianLiveSyncSettingTab.titleHiddenFiles": string;
"obsidianLiveSyncSettingTab.titleLogging": string;
"obsidianLiveSyncSettingTab.titleMinioS3R2": string;
"obsidianLiveSyncSettingTab.titleNotification": string;
"obsidianLiveSyncSettingTab.titleOnlineTips": string;
"obsidianLiveSyncSettingTab.titleQuickSetup": string;
"obsidianLiveSyncSettingTab.titleRebuildRequired": string;
"obsidianLiveSyncSettingTab.titleRemoteConfigCheckFailed": string;
"obsidianLiveSyncSettingTab.titleRemoteServer": string;
"obsidianLiveSyncSettingTab.titleReset": string;
"obsidianLiveSyncSettingTab.titleSetupOtherDevices": string;
"obsidianLiveSyncSettingTab.titleSynchronizationMethod": string;
"obsidianLiveSyncSettingTab.titleSynchronizationPreset": string;
"obsidianLiveSyncSettingTab.titleSyncSettings": string;
"obsidianLiveSyncSettingTab.titleSyncSettingsViaMarkdown": string;
"obsidianLiveSyncSettingTab.titleUpdateThinning": string;
"obsidianLiveSyncSettingTab.warnCorsOriginUnmatched": string;
"obsidianLiveSyncSettingTab.warnNoAdmin": string;
Ok: string;
"Old Algorithm": string;
"Older fallback (Slow, W/O WebAssembly)": string;
Open: string;
"Open the dialog": string;
Overwrite: string;
"Overwrite patterns": string;
"Overwrite remote": string;
"Overwrite remote with local DB and passphrase.": string;
"Overwrite Server Data with This Device's Files": string;
"P2P.AskPassphraseForDecrypt": string;
"P2P.AskPassphraseForShare": string;
"P2P.DisabledButNeed": string;
"P2P.FailedToOpen": string;
"P2P.NoAutoSyncPeers": string;
"P2P.NoKnownPeers": string;
"P2P.Note.description": string;
"P2P.Note.important_note": string;
"P2P.Note.important_note_sub": string;
"P2P.Note.Summary": string;
"P2P.NotEnabled": string;
"P2P.P2PReplication": string;
"P2P.PaneTitle": string;
"P2P.ReplicatorInstanceMissing": string;
"P2P.SeemsOffline": string;
"P2P.SyncAlreadyRunning": string;
"P2P.SyncCompleted": string;
"P2P.SyncStartedWith": string;
"paneMaintenance.markDeviceResolvedAfterBackup": string;
"paneMaintenance.remoteLockedAndDeviceNotAccepted": string;
"paneMaintenance.remoteLockedResolvedDevice": string;
"paneMaintenance.unlockDatabaseReady": string;
Passphrase: string;
"Passphrase of sensitive configuration items": string;
password: string;
Password: string;
"Paste a connection string": string;
"Paste the Setup URI generated from one of your active devices.": string;
"Path Obfuscation": string;
"Patterns to match files for overwriting instead of merging": string;
"Patterns to match files for syncing": string;
"Peer-to-Peer only": string;
"Peer-to-Peer Synchronisation": string;
"Per-file-saved customization sync": string;
Perform: string;
"Perform cleanup": string;
"Perform Garbage Collection": string;
"Perform Garbage Collection to remove unused chunks and reduce database size.": string;
"Periodic Sync interval": string;
"Pick a file to resolve conflict": string;
"Please disable 'Read chunks online' in settings to use Garbage Collection.": string;
"Please enable 'Compute revisions for chunks' in settings to use Garbage Collection.": string;
"Please select 'Cancel' explicitly to cancel this operation.": string;
"Please select a method to import the settings from another device.": string;
"Please select an option to proceed": string;
"Please select the type of server to which you are connecting.": string;
"Please set device name to identify this device. This name should be unique among your devices. While not configured, we cannot enable this feature.": string;
"Please set this device name": string;
"Plug-in version": string;
"Prepare the 'report' to create an issue": string;
Presets: string;
"Proceed Garbage Collection": string;
"Proceed with Setup URI": string;
"Proceeding with Garbage Collection, ignoring missing nodes.": string;
"Proceeding with Garbage Collection.": string;
"Process small files in the foreground": string;
Progress: string;
"PureJS fallback (Fast, W/O WebAssembly)": string;
"Purge all download/upload cache.": string;
"Purge all journal counter": string;
"Rebuild local and remote database with local files.": string;
"Rebuilding Operations (Remote Only)": string;
"Recreate all": string;
"Recreate missing chunks for all files": string;
"RedFlag.Fetch.Method.Desc": string;
"RedFlag.Fetch.Method.FetchSafer": string;
"RedFlag.Fetch.Method.FetchSmoother": string;
"RedFlag.Fetch.Method.FetchTraditional": string;
"RedFlag.Fetch.Method.Title": string;
"Reduces storage space by discarding all non-latest revisions. This requires the same amount of free space on the remote server and the local client.": string;
"Reducing the frequency with which on-disk changes are reflected into the DB": string;
Region: string;
Remediation: string;
"Remediation Setting Changed": string;
"Remote Database Tweak (In sunset)": string;
"Remote Databases": string;
"Remote name": string;
"Remote server type": string;
"Remote Type": string;
Rename: string;
"Replicator.Dialogue.Locked.Action.Dismiss": string;
"Replicator.Dialogue.Locked.Action.Fetch": string;
"Replicator.Dialogue.Locked.Action.Unlock": string;
"Replicator.Dialogue.Locked.Message": string;
"Replicator.Dialogue.Locked.Message.Fetch": string;
"Replicator.Dialogue.Locked.Message.Unlocked": string;
"Replicator.Dialogue.Locked.Title": string;
"Replicator.Message.Cleaned": string;
"Replicator.Message.InitialiseFatalError": string;
"Replicator.Message.Pending": string;
"Replicator.Message.SomeModuleFailed": string;
"Replicator.Message.VersionUpFlash": string;
"Requires restart of Obsidian": string;
"Requires restart of Obsidian.": string;
"Rerun Onboarding Wizard": string;
"Rerun the onboarding wizard to set up Self-hosted LiveSync again.": string;
"Rerun Wizard": string;
Resend: string;
"Resend all chunks to the remote.": string;
Reset: string;
"Reset all": string;
"Reset all journal counter": string;
"Reset journal received history": string;
"Reset journal sent history": string;
"Reset notification threshold and check the remote database usage": string;
"Reset received": string;
"Reset sent history": string;
"Reset Synchronisation information": string;
"Reset Synchronisation on This Device": string;
"Reset the remote storage size threshold and check the remote storage size again.": string;
"Resolve All": string;
"Resolve all conflicted files": string;
"Resolve All conflicted files by the newer one": string;
"Resolve all conflicted files by the newer one. Caution: This will overwrite the older one, and cannot resurrect the overwritten one.": string;
"Restart Now": string;
"Restore or reconstruct local database from remote.": string;
"Run Doctor": string;
"S3/MinIO/R2 Object Storage": string;
"Save settings to a markdown file. You will be notified when new settings arrive. You can set different files by the platform.": string;
"Saving will be performed forcefully after this number of seconds.": string;
"Scan a QR Code (Recommended for mobile)": string;
"Scan changes on customization sync": string;
"Scan customization automatically": string;
"Scan customization before replicating.": string;
"Scan customization every 1 minute.": string;
"Scan customization periodically": string;
"Scan for Broken files": string;
"Scan for hidden files before replication": string;
"Scan hidden files periodically": string;
"Scan the QR code displayed on an active device using this device's camera.": string;
"Schedule and Restart": string;
"Scram Switches": string;
"Scram!": string;
"Seconds, 0 to disable": string;
"Seconds. Saving to the local database will be delayed until this value after we stop typing or saving.": string;
"Secret Key": string;
"Select the database adapter to use.": string;
Send: string;
"Send chunks": string;
"Server URI": string;
"Setting.GenerateKeyPair.Desc": string;
"Setting.GenerateKeyPair.Title": string;
"Setting.TroubleShooting": string;
"Setting.TroubleShooting.Doctor": string;
"Setting.TroubleShooting.Doctor.Desc": string;
"Setting.TroubleShooting.ScanBrokenFiles": string;
"Setting.TroubleShooting.ScanBrokenFiles.Desc": string;
"SettingTab.Message.AskRebuild": string;
"Setup URI dialog cancelled.": string;
"Setup.QRCode": string;
"Setup.RemoteE2EE.AdvancedTitle": string;
"Setup.RemoteE2EE.AlgorithmWarning": string;
"Setup.RemoteE2EE.ButtonCancel": string;
"Setup.RemoteE2EE.ButtonProceed": string;
"Setup.RemoteE2EE.DefaultAlgorithmDesc": string;
"Setup.RemoteE2EE.Guidance": string;
"Setup.RemoteE2EE.LabelEncrypt": string;
"Setup.RemoteE2EE.LabelEncryptionAlgorithm": string;
"Setup.RemoteE2EE.LabelObfuscateProperties": string;
"Setup.RemoteE2EE.MultiDestinationWarning": string;
"Setup.RemoteE2EE.ObfuscatePropertiesDesc": string;
"Setup.RemoteE2EE.PassphraseValidationLine1": string;
"Setup.RemoteE2EE.PassphraseValidationLine2": string;
"Setup.RemoteE2EE.PlaceholderPassphrase": string;
"Setup.RemoteE2EE.StronglyRecommendedLine1": string;
"Setup.RemoteE2EE.StronglyRecommendedLine2": string;
"Setup.RemoteE2EE.StronglyRecommendedTitle": string;
"Setup.RemoteE2EE.Title": string;
"Setup.ScanQRCode.ButtonClose": string;
"Setup.ScanQRCode.Guidance": string;
"Setup.ScanQRCode.Step1": string;
"Setup.ScanQRCode.Step2": string;
"Setup.ScanQRCode.Step3": string;
"Setup.ScanQRCode.Step4": string;
"Setup.ScanQRCode.Title": string;
"Setup.ShowQRCode": string;
"Setup.ShowQRCode.Desc": string;
"Setup.UseSetupURI.ButtonCancel": string;
"Setup.UseSetupURI.ButtonProceed": string;
"Setup.UseSetupURI.ErrorFailedToParse": string;
"Setup.UseSetupURI.ErrorPassphraseRequired": string;
"Setup.UseSetupURI.GuidanceLine1": string;
"Setup.UseSetupURI.GuidanceLine2": string;
"Setup.UseSetupURI.InvalidInfo": string;
"Setup.UseSetupURI.LabelPassphrase": string;
"Setup.UseSetupURI.LabelSetupURI": string;
"Setup.UseSetupURI.PlaceholderPassphrase": string;
"Setup.UseSetupURI.Title": string;
"Setup.UseSetupURI.ValidInfo": string;
"Should we keep folders that don't have any files inside?": string;
"Should we only check for conflicts when a file is opened?": string;
"Should we prompt you about conflicting files when a file is opened?": string;
"Should we prompt you for every single merge, even if we can safely merge automatcially?": string;
"Show full banner": string;
"Show only notifications": string;
"Show status as icons only": string;
"Show status icon instead of file warnings banner": string;
"Show status inside the editor": string;
"Show status on the status bar": string;
"Show verbose log. Please enable if you report an issue.": string;
"Some devices have differing progress values (max: ${maxProgress}, min: ${minProgress}).\nThis may indicate that some devices have not completed synchronisation, which could lead to conflicts. Strongly recommend confirming that all devices are synchronised before proceeding.": string;
"Starts synchronisation when a file is saved.": string;
"Stop reflecting database changes to storage files.": string;
"Stop watching for file changes.": string;
"Suppress notification of hidden files change": string;
"Suspend database reflecting": string;
"Suspend file watching": string;
"Switch to IDB": string;
"Switch to IndexedDB": string;
"Sync after merging file": string;
"Sync automatically after merging files": string;
"Sync Mode": string;
"Sync on Editor Save": string;
"Sync on File Open": string;
"Sync on Save": string;
"Sync on Startup": string;
"Synchronisation utilising journal files. You must have set up an S3/MinIO/R2 compatible object storage.": string;
"Synchronising files": string;
Syncing: string;
"Target patterns": string;
"Testing only - Resolve file conflicts by syncing newer copies of the file, this can overwrite modified files. Be Warned.": string;
"The delay for consecutive on-demand fetches": string;
"The following accepted nodes are missing its node information:\n- ${missingNodes}\n\nThis indicates that they have not been connected for some time or have been left on an older version.\nIt is preferable to update all devices if possible. If you have any devices that are no longer in use, you can clear all accepted nodes by locking the remote once.": string;
"The Hash algorithm for chunk IDs": string;
"The maximum duration for which chunks can be incubated within the document. Chunks exceeding this period will graduate to independent chunks.": string;
"The maximum number of chunks that can be incubated within the document. Chunks exceeding this number will immediately graduate to independent chunks.": string;
"The maximum total size of chunks that can be incubated within the document. Chunks exceeding this size will immediately graduate to independent chunks.": string;
"The minimum interval for automatic synchronisation on event.": string;
"This feature enables direct synchronisation between devices. No server is required, but both devices must be online at the same time for synchronisation to occur, and some features may be limited. Internet connection is only required to signalling (detecting peers) and not for data transfer.": string;
"This is an advanced option for users who do not have a URI or who wish to configure detailed settings.": string;
"This is the most suitable synchronisation method for the design. All functions are available. You must have set up a CouchDB instance.": string;
"This passphrase will not be copied to another device. It will be set to `Default` until you configure it again.": string;
"This will recreate chunks for all files. If there were missing chunks, this may fix the errors.": string;
"Transfer Tweak": string;
"TweakMismatchResolve.Action.Dismiss": string;
"TweakMismatchResolve.Action.UseConfigured": string;
"TweakMismatchResolve.Action.UseMine": string;
"TweakMismatchResolve.Action.UseMineAcceptIncompatible": string;
"TweakMismatchResolve.Action.UseMineWithRebuild": string;
"TweakMismatchResolve.Action.UseRemote": string;
"TweakMismatchResolve.Action.UseRemoteAcceptIncompatible": string;
"TweakMismatchResolve.Action.UseRemoteWithRebuild": string;
"TweakMismatchResolve.Message.Main": string;
"TweakMismatchResolve.Message.MainTweakResolving": string;
"TweakMismatchResolve.Message.UseRemote.WarningRebuildRecommended": string;
"TweakMismatchResolve.Message.UseRemote.WarningRebuildRequired": string;
"TweakMismatchResolve.Message.WarningIncompatibleRebuildRecommended": string;
"TweakMismatchResolve.Message.WarningIncompatibleRebuildRequired": string;
"TweakMismatchResolve.Table": string;
"TweakMismatchResolve.Table.Row": string;
"TweakMismatchResolve.Title": string;
"TweakMismatchResolve.Title.TweakResolving": string;
"TweakMismatchResolve.Title.UseRemoteConfig": string;
"Unique name between all synchronized devices. To edit this setting, please disable customization sync once.": string;
"Use a custom passphrase": string;
"Use a Setup URI (Recommended)": string;
"Use Custom HTTP Handler": string;
"Use dynamic iteration count": string;
"Use Segmented-splitter": string;
"Use splitting-limit-capped chunk splitter": string;
"Use the trash bin": string;
"Use timeouts instead of heartbeats": string;
username: string;
Username: string;
"Verbose Log": string;
"Verify all": string;
"Verify and repair all files": string;
"Warning! This will have a serious impact on performance. And the logs will not be synchronised under the default name. Please be careful with logs; they often contain your confidential information.": string;
"We cannot change the device name while this feature is enabled. Please disable this feature to change the device name.": string;
"We will now guide you through a few questions to simplify the synchronisation setup.": string;
"We will now proceed with the server configuration.": string;
"Welcome to Self-hosted LiveSync": string;
"When you save a file in the editor, start a sync automatically": string;
"Write credentials in the file": string;
"Write logs into the file": string;
"xxhash32 (Fast but less collision resistance)": string;
"xxhash64 (Fastest)": string;
"Yes, I want to add this device to my existing synchronisation": string;
"Yes, I want to set up a new synchronisation": string;
"You are adding this device to an existing synchronisation setup.": string;
};
};
+858
View File
@@ -0,0 +1,858 @@
export declare const PartialMessages: {
readonly ru: {
"(Active)": string;
"(BETA) Always overwrite with a newer file": string;
"(Beta) Use ignore files": string;
"(Days passed, 0 to disable automatic-deletion)": string;
"(ex. Read chunks online) If this option is enabled, LiveSync reads chunks online directly instead of replicating them locally. Increasing Custom chunk size is recommended.": string;
"(MB) If this is set, changes to local and remote files that are larger than this will be skipped. If the file becomes smaller again, a newer one will be used.": string;
"(Mega chars)": string;
"(Not recommended) If set, credentials will be stored in the file": string;
"(Not recommended) If set, credentials will be stored in the file.": string;
"(Obsolete) Use an old adapter for compatibility": string;
"(RegExp) Empty to sync all files. Set filter as a regular expression to limit synchronising files.": string;
"(RegExp) If this is set, any changes to local and remote files that match this will be skipped.": string;
"(Select this if you are already using synchronisation on another computer or smartphone.) This option is suitable if you are new to LiveSync and want to set it up from scratch.": string;
"(Select this if you are configuring this device as the first synchronisation device.) This option is suitable if you are new to LiveSync and want to set it up from scratch.": string;
"> [!INFO]- The connected devices have been detected as follows:\n${devices}": string;
"A Setup URI is a single string of text containing your server address and authentication details. Using a URI, if one was generated by your server installation script, provides a simple and secure configuration.": string;
"Access Key": string;
Activate: string;
"Active Remote Configuration": string;
"Add default patterns": string;
"Add new connection": string;
"All devices have the same progress value (${progress}). Your devices seem to be synchronised. And be able to proceed with Garbage Collection.": string;
"Always prompt merge conflicts": string;
Analyse: string;
"Analyse database usage": string;
"Analyse database usage and generate a TSV report for diagnosis yourself. You can paste the generated report with any spreadsheet you like.": string;
"Apply Latest Change if Conflicting": string;
"Apply preset configuration": string;
"Ask a passphrase at every launch": string;
"Automatically Sync all files when opening Obsidian.": string;
Back: string;
"Back to non-configured": string;
"Batch database update": string;
"Batch limit": string;
"Batch size": string;
"Batch size of on-demand fetching": string;
"Before v0.17.16, we used an old adapter for the local database. Now the new adapter is preferred. However, it needs local database rebuilding.": string;
"Before v0.17.16, we used an old adapter for the local database. Now the new adapter is preferred. However, it needs local database rebuilding. Please disable this toggle when you have enough time. If leave it enabled, also while fetching from the remote database, you will be asked to disable this.": string;
"Bucket Name": string;
Cancel: string;
"Cancel Garbage Collection": string;
Check: string;
"Check and convert non-path-obfuscated files": string;
"Check for documents that have not been converted to path-obfuscated IDs and convert them if necessary.": string;
"cmdConfigSync.showCustomizationSync": string;
"Comma separated `.gitignore, .dockerignore`": string;
"Compaction in progress on remote database...": string;
"Compaction on remote database completed successfully.": string;
"Compaction on remote database failed.": string;
"Compaction on remote database timed out.": string;
"Compare the content of files between on local database and storage. If not matched, you will be asked which one you want to keep.": string;
"Compatibility (Conflict Behaviour)": string;
"Compatibility (Database structure)": string;
"Compatibility (Internal API Usage)": string;
"Compatibility (Metadata)": string;
"Compatibility (Remote Database)": string;
"Compatibility (Trouble addressed)": string;
"Compute revisions for chunks": string;
"Configuration Encryption": string;
Configure: string;
"Configure And Change Remote": string;
"Configure E2EE": string;
"Configure Remote": string;
"Configure the same server information as your other devices again, manually, very advanced users only.": string;
"Connection Method": string;
"Continue to CouchDB setup": string;
"Continue to Peer-to-Peer only setup": string;
"Continue to S3/MinIO/R2 setup": string;
Copy: string;
"Copy Report to clipboard": string;
"CouchDB Connection Tweak": string;
"Cross-platform": string;
"Current adapter: {adapter}": string;
"Customization Sync": string;
"Customization Sync (Beta3)": string;
"Data Compression": string;
"Database Adapter": string;
"Database Name": string;
"Database suffix": string;
Default: string;
"Delay conflict resolution of inactive files": string;
"Delay merge conflict prompt for inactive files.": string;
Delete: string;
"Delete all customization sync data": string;
"Delete all data on the remote server.": string;
"Delete local database to reset or uninstall Self-hosted LiveSync": string;
"Delete old metadata of deleted files on start-up": string;
"Delete Remote Configuration": string;
"Delete remote configuration '{name}'?": string;
descConnectSetupURI: string;
descCopySetupURI: string;
descEnableLiveSync: string;
descFetchConfigFromRemote: string;
descManualSetup: string;
descTestDatabaseConnection: string;
descValidateDatabaseConfig: string;
desktop: string;
Developer: string;
Device: string;
"Device name": string;
"Device Setup Method": string;
"dialog.yourLanguageAvailable": string;
"dialog.yourLanguageAvailable.btnRevertToDefault": string;
"dialog.yourLanguageAvailable.Title": string;
"Disables all synchronization and restart.": string;
"Disables logging, only shows notifications. Please disable if you report an issue.": string;
"Display Language": string;
"Display name": string;
"Do not check configuration mismatch before replication": string;
"Do not keep metadata of deleted files.": string;
"Do not split chunks in the background": string;
"Do not use internal API": string;
"Doctor.Button.DismissThisVersion": string;
"Doctor.Button.Fix": string;
"Doctor.Button.FixButNoRebuild": string;
"Doctor.Button.No": string;
"Doctor.Button.Skip": string;
"Doctor.Button.Yes": string;
"Doctor.Dialogue.Main": string;
"Doctor.Dialogue.MainFix": string;
"Doctor.Dialogue.Title": string;
"Doctor.Dialogue.TitleAlmostDone": string;
"Doctor.Dialogue.TitleFix": string;
"Doctor.Level.Must": string;
"Doctor.Level.Necessary": string;
"Doctor.Level.Optional": string;
"Doctor.Level.Recommended": string;
"Doctor.Message.NoIssues": string;
"Doctor.Message.RebuildLocalRequired": string;
"Doctor.Message.RebuildRequired": string;
"Doctor.Message.SomeSkipped": string;
"Doctor.RULES.E2EE_V02500.REASON": string;
Duplicate: string;
"Duplicate remote": string;
"E2EE Configuration": string;
"Edge case addressing (Behaviour)": string;
"Edge case addressing (Database)": string;
"Edge case addressing (Processing)": string;
"Emergency restart": string;
"Enable advanced features": string;
"Enable customization sync": string;
"Enable Developers' Debug Tools.": string;
"Enable edge case treatment features": string;
"Enable poweruser features": string;
"Enable this if your Object Storage doesn't support CORS": string;
"Enable this option to automatically apply the most recent change to documents even when it conflicts": string;
"Encrypt contents on the remote database. If you use the plugin's synchronization feature, enabling this is recommended.": string;
"Encrypting sensitive configuration items": string;
"Encryption phassphrase. If changed, you should overwrite the server's database with the new (encrypted) files.": string;
"End-to-End Encryption": string;
"Endpoint URL": string;
"Enhance chunk size": string;
"Enter Server Information": string;
"Enter the server information manually": string;
Export: string;
"Failed to connect to remote for compaction.": string;
"Failed to connect to remote for compaction. ${reason}": string;
"Failed to start one-shot replication before Garbage Collection. Garbage Collection Cancelled.": string;
"Failed to start replication after Garbage Collection.": string;
Fetch: string;
"Fetch chunks on demand": string;
"Fetch database with previous behaviour": string;
"Fetch remote settings": string;
"File to resolve conflict": string;
Filename: string;
"First, please select the option that best describes your current situation.": string;
"Flag and restart": string;
"Forces the file to be synced when opened.": string;
"Fresh Start Wipe": string;
"Garbage Collection cancelled by user.": string;
"Garbage Collection completed. Deleted chunks: ${deletedChunks} / ${totalChunks}. Time taken: ${seconds} seconds.": string;
"Garbage Collection Confirmation": string;
"Garbage Collection V3 (Beta)": string;
"Garbage Collection: Found ${unusedChunks} unused chunks to delete.": string;
"Garbage Collection: Scanned ${scanned} / ~${docCount}": string;
"Garbage Collection: Scanning completed. Total chunks: ${totalChunks}, Used chunks: ${usedChunks}": string;
"Handle files as Case-Sensitive": string;
"Hidden Files": string;
"How to display network errors when the sync server is unreachable.": string;
"How would you like to configure the connection to your server?": string;
"I am adding a device to an existing synchronisation setup": string;
"I am setting this up for the first time": string;
"I know my server details, let me enter them": string;
"If disabled(toggled), chunks will be split on the UI thread (Previous behaviour).": string;
"If enabled per-filed efficient customization sync will be used. We need a small migration when enabling this.": string;
"If enabled per-filed efficient customization sync will be used. We need a small migration when enabling this. And all devices should be updated to v0.23.18. Once we enabled this, we lost a compatibility with old versions.": string;
"If enabled, chunks will be split into no more than 100 items. However, dedupe is slightly weaker.": string;
"If enabled, newly created chunks are temporarily kept within the document, and graduated to become independent chunks once stabilised.": string;
"If enabled, the \u26D4 icon will be shown inside the status instead of the file warnings banner. No details will be shown.": string;
"If enabled, the file under 1kb will be processed in the UI thread.": string;
"If enabled, the notification of hidden files change will be suppressed.": string;
"If this enabled, all chunks will be stored with the revision made from its content. (Previous behaviour)": string;
"If this enabled, All files are handled as case-Sensitive (Previous behaviour).": string;
"If this enabled, chunks will be split into semantically meaningful segments. Not all platforms support this feature.": string;
"If this is set, changes to local files which are matched by the ignore files will be skipped.": string;
"If this is set, changes to local files which are matched by the ignore files will be skipped. Remote changes are determined using local ignore files.": string;
"If this option is enabled, PouchDB will hold the connection open for 60 seconds, and if no change arrives in that time, close and reopen the socket, instead of holding it open indefinitely.": string;
"If this option is enabled, PouchDB will hold the connection open for 60 seconds, and if no change arrives in that time, close and reopen the socket, instead of holding it open indefinitely. Useful when a proxy limits request duration but can increase resource usage.": string;
"Ignore and Proceed": string;
"Ignore files": string;
"Ignore patterns": string;
"Import connection": string;
"Incubate Chunks in Document": string;
"Initialise all journal history, On the next sync, every item will be received and sent.": string;
"Interval (sec)": string;
"K.exp": string;
"K.long_p2p_sync": string;
"K.P2P": string;
"K.Peer": string;
"K.ScanCustomization": string;
"K.short_p2p_sync": string;
"K.title_p2p_sync": string;
"Keep empty folder": string;
lang_def: string;
"lang-de": string;
"lang-def": string;
"lang-es": string;
"lang-fr": string;
"lang-ja": string;
"lang-ko": string;
"lang-ru": string;
"lang-zh": string;
"lang-zh-tw": string;
Later: string;
"Limit: {datetime} ({timestamp})": string;
"LiveSync could not handle multiple vaults which have same name without different prefix, This should be automatically configured.": string;
"liveSyncReplicator.beforeLiveSync": string;
"liveSyncReplicator.cantReplicateLowerValue": string;
"liveSyncReplicator.checkingLastSyncPoint": string;
"liveSyncReplicator.couldNotConnectTo": string;
"liveSyncReplicator.couldNotConnectToRemoteDb": string;
"liveSyncReplicator.couldNotConnectToServer": string;
"liveSyncReplicator.couldNotConnectToURI": string;
"liveSyncReplicator.couldNotMarkResolveRemoteDb": string;
"liveSyncReplicator.liveSyncBegin": string;
"liveSyncReplicator.lockRemoteDb": string;
"liveSyncReplicator.markDeviceResolved": string;
"liveSyncReplicator.oneShotSyncBegin": string;
"liveSyncReplicator.remoteDbCorrupted": string;
"liveSyncReplicator.remoteDbCreatedOrConnected": string;
"liveSyncReplicator.remoteDbDestroyed": string;
"liveSyncReplicator.remoteDbDestroyError": string;
"liveSyncReplicator.remoteDbMarkedResolved": string;
"liveSyncReplicator.replicationClosed": string;
"liveSyncReplicator.replicationInProgress": string;
"liveSyncReplicator.retryLowerBatchSize": string;
"liveSyncReplicator.unlockRemoteDb": string;
"liveSyncSetting.errorNoSuchSettingItem": string;
"liveSyncSetting.originalValue": string;
"liveSyncSetting.valueShouldBeInRange": string;
"liveSyncSettings.btnApply": string;
"Local Database Tweak": string;
Lock: string;
"Lock Server": string;
"Lock the remote server to prevent synchronization with other devices.": string;
"logPane.autoScroll": string;
"logPane.logWindowOpened": string;
"logPane.pause": string;
"logPane.title": string;
"logPane.wrap": string;
"Maximum delay for batch database updating": string;
"Maximum file size": string;
"Maximum Incubating Chunk Size": string;
"Maximum Incubating Chunks": string;
"Maximum Incubation Period": string;
"MB (0 to disable).": string;
"Memory cache": string;
"Memory cache size (by total characters)": string;
"Memory cache size (by total items)": string;
Merge: string;
"Minimum delay for batch database updating": string;
"Minimum interval for syncing": string;
"moduleCheckRemoteSize.logCheckingStorageSizes": string;
"moduleCheckRemoteSize.logCurrentStorageSize": string;
"moduleCheckRemoteSize.logExceededWarning": string;
"moduleCheckRemoteSize.logThresholdEnlarged": string;
"moduleCheckRemoteSize.msgConfirmRebuild": string;
"moduleCheckRemoteSize.msgDatabaseGrowing": string;
"moduleCheckRemoteSize.msgSetDBCapacity": string;
"moduleCheckRemoteSize.option2GB": string;
"moduleCheckRemoteSize.option800MB": string;
"moduleCheckRemoteSize.optionAskMeLater": string;
"moduleCheckRemoteSize.optionDismiss": string;
"moduleCheckRemoteSize.optionIncreaseLimit": string;
"moduleCheckRemoteSize.optionNoWarn": string;
"moduleCheckRemoteSize.optionRebuildAll": string;
"moduleCheckRemoteSize.titleDatabaseSizeLimitExceeded": string;
"moduleCheckRemoteSize.titleDatabaseSizeNotify": string;
"moduleInputUIObsidian.defaultTitleConfirmation": string;
"moduleInputUIObsidian.defaultTitleSelect": string;
"moduleInputUIObsidian.optionNo": string;
"moduleInputUIObsidian.optionYes": string;
"moduleLiveSyncMain.logAdditionalSafetyScan": string;
"moduleLiveSyncMain.logLoadingPlugin": string;
"moduleLiveSyncMain.logPluginInitCancelled": string;
"moduleLiveSyncMain.logPluginVersion": string;
"moduleLiveSyncMain.logReadChangelog": string;
"moduleLiveSyncMain.logSafetyScanCompleted": string;
"moduleLiveSyncMain.logSafetyScanFailed": string;
"moduleLiveSyncMain.logUnloadingPlugin": string;
"moduleLiveSyncMain.logVersionUpdate": string;
"moduleLiveSyncMain.msgScramEnabled": string;
"moduleLiveSyncMain.optionKeepLiveSyncDisabled": string;
"moduleLiveSyncMain.optionResumeAndRestart": string;
"moduleLiveSyncMain.titleScramEnabled": string;
"moduleLocalDatabase.logWaitingForReady": string;
"moduleLog.showLog": string;
"moduleMigration.docUri": string;
"moduleMigration.fix0256.buttons.checkItLater": string;
"moduleMigration.fix0256.buttons.DismissForever": string;
"moduleMigration.fix0256.buttons.fix": string;
"moduleMigration.fix0256.message": string;
"moduleMigration.fix0256.messageUnrecoverable": string;
"moduleMigration.fix0256.title": string;
"moduleMigration.insecureChunkExist.buttons.fetch": string;
"moduleMigration.insecureChunkExist.buttons.later": string;
"moduleMigration.insecureChunkExist.buttons.rebuild": string;
"moduleMigration.insecureChunkExist.laterMessage": string;
"moduleMigration.insecureChunkExist.message": string;
"moduleMigration.insecureChunkExist.title": string;
"moduleMigration.logBulkSendCorrupted": string;
"moduleMigration.logFetchRemoteTweakFailed": string;
"moduleMigration.logLocalDatabaseNotReady": string;
"moduleMigration.logMigratedSameBehaviour": string;
"moduleMigration.logMigrationFailed": string;
"moduleMigration.logRedflag2CreationFail": string;
"moduleMigration.logRemoteTweakUnavailable": string;
"moduleMigration.logSetupCancelled": string;
"moduleMigration.msgFetchRemoteAgain": string;
"moduleMigration.msgInitialSetup": string;
"moduleMigration.msgRecommendSetupUri": string;
"moduleMigration.msgSinceV02321": string;
"moduleMigration.optionAdjustRemote": string;
"moduleMigration.optionDecideLater": string;
"moduleMigration.optionEnableBoth": string;
"moduleMigration.optionEnableFilenameCaseInsensitive": string;
"moduleMigration.optionEnableFixedRevisionForChunks": string;
"moduleMigration.optionHaveSetupUri": string;
"moduleMigration.optionKeepPreviousBehaviour": string;
"moduleMigration.optionManualSetup": string;
"moduleMigration.optionNoAskAgain": string;
"moduleMigration.optionNoSetupUri": string;
"moduleMigration.optionRemindNextLaunch": string;
"moduleMigration.optionSetupViaP2P": string;
"moduleMigration.optionSetupWizard": string;
"moduleMigration.optionYesFetchAgain": string;
"moduleMigration.titleCaseSensitivity": string;
"moduleMigration.titleRecommendSetupUri": string;
"moduleMigration.titleWelcome": string;
"moduleObsidianMenu.replicate": string;
"More actions": string;
"Move remotely deleted files to the trash, instead of deleting.": string;
"Network warning style": string;
"New Remote": string;
"No connected device information found. Cancelling Garbage Collection.": string;
"No limit configured": string;
"No, please take me back": string;
"Node ID": string;
"Node Information Missing": string;
"Non-Synchronising files": string;
"Normal Files": string;
"Not all messages have been translated. And, please revert to \"Default\" when reporting errors.": string;
"Notify all setting files": string;
"Notify customized": string;
"Notify when other device has newly customized.": string;
"Notify when the estimated remote storage size exceeds on start up": string;
"Number of batches to process at a time. Defaults to 40. Minimum is 2.": string;
"Number of batches to process at a time. Defaults to 40. Minimum is 2. This along with batch size controls how many docs are kept in memory at a time.": string;
"Number of changes to sync at a time. Defaults to 50. Minimum is 2.": string;
"Obsidian version": string;
"obsidianLiveSyncSettingTab.btnApply": string;
"obsidianLiveSyncSettingTab.btnCheck": string;
"obsidianLiveSyncSettingTab.btnCopy": string;
"obsidianLiveSyncSettingTab.btnDisable": string;
"obsidianLiveSyncSettingTab.btnDiscard": string;
"obsidianLiveSyncSettingTab.btnEnable": string;
"obsidianLiveSyncSettingTab.btnFix": string;
"obsidianLiveSyncSettingTab.btnGotItAndUpdated": string;
"obsidianLiveSyncSettingTab.btnNext": string;
"obsidianLiveSyncSettingTab.btnStart": string;
"obsidianLiveSyncSettingTab.btnTest": string;
"obsidianLiveSyncSettingTab.btnUse": string;
"obsidianLiveSyncSettingTab.buttonFetch": string;
"obsidianLiveSyncSettingTab.buttonNext": string;
"obsidianLiveSyncSettingTab.defaultLanguage": string;
"obsidianLiveSyncSettingTab.descConnectSetupURI": string;
"obsidianLiveSyncSettingTab.descCopySetupURI": string;
"obsidianLiveSyncSettingTab.descEnableLiveSync": string;
"obsidianLiveSyncSettingTab.descFetchConfigFromRemote": string;
"obsidianLiveSyncSettingTab.descManualSetup": string;
"obsidianLiveSyncSettingTab.descTestDatabaseConnection": string;
"obsidianLiveSyncSettingTab.descValidateDatabaseConfig": string;
"obsidianLiveSyncSettingTab.errAccessForbidden": string;
"obsidianLiveSyncSettingTab.errCannotContinueTest": string;
"obsidianLiveSyncSettingTab.errCorsCredentials": string;
"obsidianLiveSyncSettingTab.errCorsNotAllowingCredentials": string;
"obsidianLiveSyncSettingTab.errCorsOrigins": string;
"obsidianLiveSyncSettingTab.errEnableCors": string;
"obsidianLiveSyncSettingTab.errEnableCorsChttpd": string;
"obsidianLiveSyncSettingTab.errMaxDocumentSize": string;
"obsidianLiveSyncSettingTab.errMaxRequestSize": string;
"obsidianLiveSyncSettingTab.errMissingWwwAuth": string;
"obsidianLiveSyncSettingTab.errRequireValidUser": string;
"obsidianLiveSyncSettingTab.errRequireValidUserAuth": string;
"obsidianLiveSyncSettingTab.labelDisabled": string;
"obsidianLiveSyncSettingTab.labelEnabled": string;
"obsidianLiveSyncSettingTab.levelAdvanced": string;
"obsidianLiveSyncSettingTab.levelEdgeCase": string;
"obsidianLiveSyncSettingTab.levelPowerUser": string;
"obsidianLiveSyncSettingTab.linkOpenInBrowser": string;
"obsidianLiveSyncSettingTab.linkPageTop": string;
"obsidianLiveSyncSettingTab.linkTipsAndTroubleshooting": string;
"obsidianLiveSyncSettingTab.linkTroubleshooting": string;
"obsidianLiveSyncSettingTab.logCannotUseCloudant": string;
"obsidianLiveSyncSettingTab.logCheckingConfigDone": string;
"obsidianLiveSyncSettingTab.logCheckingConfigFailed": string;
"obsidianLiveSyncSettingTab.logCheckingDbConfig": string;
"obsidianLiveSyncSettingTab.logCheckPassphraseFailed": string;
"obsidianLiveSyncSettingTab.logConfiguredDisabled": string;
"obsidianLiveSyncSettingTab.logConfiguredLiveSync": string;
"obsidianLiveSyncSettingTab.logConfiguredPeriodic": string;
"obsidianLiveSyncSettingTab.logCouchDbConfigFail": string;
"obsidianLiveSyncSettingTab.logCouchDbConfigSet": string;
"obsidianLiveSyncSettingTab.logCouchDbConfigUpdated": string;
"obsidianLiveSyncSettingTab.logDatabaseConnected": string;
"obsidianLiveSyncSettingTab.logEncryptionNoPassphrase": string;
"obsidianLiveSyncSettingTab.logEncryptionNoSupport": string;
"obsidianLiveSyncSettingTab.logErrorOccurred": string;
"obsidianLiveSyncSettingTab.logEstimatedSize": string;
"obsidianLiveSyncSettingTab.logPassphraseInvalid": string;
"obsidianLiveSyncSettingTab.logPassphraseNotCompatible": string;
"obsidianLiveSyncSettingTab.logRebuildNote": string;
"obsidianLiveSyncSettingTab.logSelectAnyPreset": string;
"obsidianLiveSyncSettingTab.msgAreYouSureProceed": string;
"obsidianLiveSyncSettingTab.msgChangesNeedToBeApplied": string;
"obsidianLiveSyncSettingTab.msgConfigCheck": string;
"obsidianLiveSyncSettingTab.msgConfigCheckFailed": string;
"obsidianLiveSyncSettingTab.msgConnectionCheck": string;
"obsidianLiveSyncSettingTab.msgConnectionProxyNote": string;
"obsidianLiveSyncSettingTab.msgCurrentOrigin": string;
"obsidianLiveSyncSettingTab.msgDiscardConfirmation": string;
"obsidianLiveSyncSettingTab.msgDone": string;
"obsidianLiveSyncSettingTab.msgEnableCors": string;
"obsidianLiveSyncSettingTab.msgEnableCorsChttpd": string;
"obsidianLiveSyncSettingTab.msgEnableEncryptionRecommendation": string;
"obsidianLiveSyncSettingTab.msgFetchConfigFromRemote": string;
"obsidianLiveSyncSettingTab.msgGenerateSetupURI": string;
"obsidianLiveSyncSettingTab.msgIfConfigNotPersistent": string;
"obsidianLiveSyncSettingTab.msgInvalidPassphrase": string;
"obsidianLiveSyncSettingTab.msgNewVersionNote": string;
"obsidianLiveSyncSettingTab.msgNonHTTPSInfo": string;
"obsidianLiveSyncSettingTab.msgNonHTTPSWarning": string;
"obsidianLiveSyncSettingTab.msgNotice": string;
"obsidianLiveSyncSettingTab.msgObjectStorageWarning": string;
"obsidianLiveSyncSettingTab.msgOriginCheck": string;
"obsidianLiveSyncSettingTab.msgRebuildRequired": string;
"obsidianLiveSyncSettingTab.msgSelectAndApplyPreset": string;
"obsidianLiveSyncSettingTab.msgSetCorsCredentials": string;
"obsidianLiveSyncSettingTab.msgSetCorsOrigins": string;
"obsidianLiveSyncSettingTab.msgSetMaxDocSize": string;
"obsidianLiveSyncSettingTab.msgSetMaxRequestSize": string;
"obsidianLiveSyncSettingTab.msgSetRequireValidUser": string;
"obsidianLiveSyncSettingTab.msgSetRequireValidUserAuth": string;
"obsidianLiveSyncSettingTab.msgSettingModified": string;
"obsidianLiveSyncSettingTab.msgSettingsUnchangeableDuringSync": string;
"obsidianLiveSyncSettingTab.msgSetWwwAuth": string;
"obsidianLiveSyncSettingTab.nameApplySettings": string;
"obsidianLiveSyncSettingTab.nameConnectSetupURI": string;
"obsidianLiveSyncSettingTab.nameCopySetupURI": string;
"obsidianLiveSyncSettingTab.nameDisableHiddenFileSync": string;
"obsidianLiveSyncSettingTab.nameDiscardSettings": string;
"obsidianLiveSyncSettingTab.nameEnableHiddenFileSync": string;
"obsidianLiveSyncSettingTab.nameEnableLiveSync": string;
"obsidianLiveSyncSettingTab.nameHiddenFileSynchronization": string;
"obsidianLiveSyncSettingTab.nameManualSetup": string;
"obsidianLiveSyncSettingTab.nameTestConnection": string;
"obsidianLiveSyncSettingTab.nameTestDatabaseConnection": string;
"obsidianLiveSyncSettingTab.nameValidateDatabaseConfig": string;
"obsidianLiveSyncSettingTab.okAdminPrivileges": string;
"obsidianLiveSyncSettingTab.okCorsCredentials": string;
"obsidianLiveSyncSettingTab.okCorsCredentialsForOrigin": string;
"obsidianLiveSyncSettingTab.okCorsOriginMatched": string;
"obsidianLiveSyncSettingTab.okCorsOrigins": string;
"obsidianLiveSyncSettingTab.okEnableCors": string;
"obsidianLiveSyncSettingTab.okEnableCorsChttpd": string;
"obsidianLiveSyncSettingTab.okMaxDocumentSize": string;
"obsidianLiveSyncSettingTab.okMaxRequestSize": string;
"obsidianLiveSyncSettingTab.okRequireValidUser": string;
"obsidianLiveSyncSettingTab.okRequireValidUserAuth": string;
"obsidianLiveSyncSettingTab.okWwwAuth": string;
"obsidianLiveSyncSettingTab.optionApply": string;
"obsidianLiveSyncSettingTab.optionCancel": string;
"obsidianLiveSyncSettingTab.optionCouchDB": string;
"obsidianLiveSyncSettingTab.optionDisableAllAutomatic": string;
"obsidianLiveSyncSettingTab.optionFetchFromRemote": string;
"obsidianLiveSyncSettingTab.optionHere": string;
"obsidianLiveSyncSettingTab.optionLiveSync": string;
"obsidianLiveSyncSettingTab.optionMinioS3R2": string;
"obsidianLiveSyncSettingTab.optionOkReadEverything": string;
"obsidianLiveSyncSettingTab.optionOnEvents": string;
"obsidianLiveSyncSettingTab.optionPeriodicAndEvents": string;
"obsidianLiveSyncSettingTab.optionPeriodicWithBatch": string;
"obsidianLiveSyncSettingTab.optionRebuildBoth": string;
"obsidianLiveSyncSettingTab.optionSaveOnlySettings": string;
"obsidianLiveSyncSettingTab.panelChangeLog": string;
"obsidianLiveSyncSettingTab.panelGeneralSettings": string;
"obsidianLiveSyncSettingTab.panelPrivacyEncryption": string;
"obsidianLiveSyncSettingTab.panelRemoteConfiguration": string;
"obsidianLiveSyncSettingTab.panelSetup": string;
"obsidianLiveSyncSettingTab.serverVersion": string;
"obsidianLiveSyncSettingTab.titleActiveRemoteServer": string;
"obsidianLiveSyncSettingTab.titleAppearance": string;
"obsidianLiveSyncSettingTab.titleConflictResolution": string;
"obsidianLiveSyncSettingTab.titleCongratulations": string;
"obsidianLiveSyncSettingTab.titleCouchDB": string;
"obsidianLiveSyncSettingTab.titleDeletionPropagation": string;
"obsidianLiveSyncSettingTab.titleEncryptionNotEnabled": string;
"obsidianLiveSyncSettingTab.titleEncryptionPassphraseInvalid": string;
"obsidianLiveSyncSettingTab.titleExtraFeatures": string;
"obsidianLiveSyncSettingTab.titleFetchConfig": string;
"obsidianLiveSyncSettingTab.titleFetchConfigFromRemote": string;
"obsidianLiveSyncSettingTab.titleFetchSettings": string;
"obsidianLiveSyncSettingTab.titleHiddenFiles": string;
"obsidianLiveSyncSettingTab.titleLogging": string;
"obsidianLiveSyncSettingTab.titleMinioS3R2": string;
"obsidianLiveSyncSettingTab.titleNotification": string;
"obsidianLiveSyncSettingTab.titleOnlineTips": string;
"obsidianLiveSyncSettingTab.titleQuickSetup": string;
"obsidianLiveSyncSettingTab.titleRebuildRequired": string;
"obsidianLiveSyncSettingTab.titleRemoteConfigCheckFailed": string;
"obsidianLiveSyncSettingTab.titleRemoteServer": string;
"obsidianLiveSyncSettingTab.titleReset": string;
"obsidianLiveSyncSettingTab.titleSetupOtherDevices": string;
"obsidianLiveSyncSettingTab.titleSynchronizationMethod": string;
"obsidianLiveSyncSettingTab.titleSynchronizationPreset": string;
"obsidianLiveSyncSettingTab.titleSyncSettings": string;
"obsidianLiveSyncSettingTab.titleSyncSettingsViaMarkdown": string;
"obsidianLiveSyncSettingTab.titleUpdateThinning": string;
"obsidianLiveSyncSettingTab.warnCorsOriginUnmatched": string;
"obsidianLiveSyncSettingTab.warnNoAdmin": string;
Ok: string;
"Old Algorithm": string;
"Older fallback (Slow, W/O WebAssembly)": string;
Open: string;
"Open the dialog": string;
Overwrite: string;
"Overwrite patterns": string;
"Overwrite remote": string;
"Overwrite remote with local DB and passphrase.": string;
"Overwrite Server Data with This Device's Files": string;
"P2P.AskPassphraseForDecrypt": string;
"P2P.AskPassphraseForShare": string;
"P2P.DisabledButNeed": string;
"P2P.FailedToOpen": string;
"P2P.NoAutoSyncPeers": string;
"P2P.NoKnownPeers": string;
"P2P.Note.description": string;
"P2P.Note.important_note": string;
"P2P.Note.important_note_sub": string;
"P2P.Note.Summary": string;
"P2P.NotEnabled": string;
"P2P.P2PReplication": string;
"P2P.PaneTitle": string;
"P2P.ReplicatorInstanceMissing": string;
"P2P.SeemsOffline": string;
"P2P.SyncAlreadyRunning": string;
"P2P.SyncCompleted": string;
"P2P.SyncStartedWith": string;
"paneMaintenance.markDeviceResolvedAfterBackup": string;
"paneMaintenance.remoteLockedAndDeviceNotAccepted": string;
"paneMaintenance.remoteLockedResolvedDevice": string;
"paneMaintenance.unlockDatabaseReady": string;
Passphrase: string;
"Passphrase of sensitive configuration items": string;
password: string;
Password: string;
"Paste a connection string": string;
"Paste the Setup URI generated from one of your active devices.": string;
"Path Obfuscation": string;
"Patterns to match files for overwriting instead of merging": string;
"Patterns to match files for syncing": string;
"Peer-to-Peer only": string;
"Peer-to-Peer Synchronisation": string;
"Per-file-saved customization sync": string;
Perform: string;
"Perform cleanup": string;
"Perform Garbage Collection": string;
"Perform Garbage Collection to remove unused chunks and reduce database size.": string;
"Periodic Sync interval": string;
"Pick a file to resolve conflict": string;
"Please disable 'Read chunks online' in settings to use Garbage Collection.": string;
"Please enable 'Compute revisions for chunks' in settings to use Garbage Collection.": string;
"Please select 'Cancel' explicitly to cancel this operation.": string;
"Please select a method to import the settings from another device.": string;
"Please select an option to proceed": string;
"Please select the type of server to which you are connecting.": string;
"Please set device name to identify this device. This name should be unique among your devices. While not configured, we cannot enable this feature.": string;
"Please set this device name": string;
"Plug-in version": string;
"Prepare the 'report' to create an issue": string;
Presets: string;
"Proceed Garbage Collection": string;
"Proceed with Setup URI": string;
"Proceeding with Garbage Collection, ignoring missing nodes.": string;
"Proceeding with Garbage Collection.": string;
"Process small files in the foreground": string;
Progress: string;
"Property Encryption": string;
"PureJS fallback (Fast, W/O WebAssembly)": string;
"Purge all download/upload cache.": string;
"Purge all journal counter": string;
"Rebuild local and remote database with local files.": string;
"Rebuilding Operations (Remote Only)": string;
"Recreate all": string;
"Recreate missing chunks for all files": string;
"RedFlag.Fetch.Method.Desc": string;
"RedFlag.Fetch.Method.FetchSafer": string;
"RedFlag.Fetch.Method.FetchSmoother": string;
"RedFlag.Fetch.Method.FetchTraditional": string;
"RedFlag.Fetch.Method.Title": string;
"RedFlag.FetchRemoteConfig.Buttons.Cancel": string;
"RedFlag.FetchRemoteConfig.Buttons.Fetch": string;
"RedFlag.FetchRemoteConfig.Message": string;
"RedFlag.FetchRemoteConfig.Title": string;
"Reducing the frequency with which on-disk changes are reflected into the DB": string;
Region: string;
Remediation: string;
"Remediation Setting Changed": string;
"Remote Database Tweak (In sunset)": string;
"Remote Databases": string;
"Remote name": string;
"Remote server type": string;
"Remote Type": string;
Rename: string;
"Replicator.Dialogue.Locked.Action.Dismiss": string;
"Replicator.Dialogue.Locked.Action.Fetch": string;
"Replicator.Dialogue.Locked.Action.Unlock": string;
"Replicator.Dialogue.Locked.Message": string;
"Replicator.Dialogue.Locked.Message.Fetch": string;
"Replicator.Dialogue.Locked.Message.Unlocked": string;
"Replicator.Dialogue.Locked.Title": string;
"Replicator.Message.Cleaned": string;
"Replicator.Message.InitialiseFatalError": string;
"Replicator.Message.Pending": string;
"Replicator.Message.SomeModuleFailed": string;
"Replicator.Message.VersionUpFlash": string;
"Requires restart of Obsidian": string;
"Requires restart of Obsidian.": string;
"Rerun Onboarding Wizard": string;
"Rerun the onboarding wizard to set up Self-hosted LiveSync again.": string;
"Rerun Wizard": string;
Resend: string;
"Resend all chunks to the remote.": string;
Reset: string;
"Reset all": string;
"Reset all journal counter": string;
"Reset journal received history": string;
"Reset journal sent history": string;
"Reset notification threshold and check the remote database usage": string;
"Reset received": string;
"Reset sent history": string;
"Reset Synchronisation information": string;
"Reset Synchronisation on This Device": string;
"Reset the remote storage size threshold and check the remote storage size again.": string;
"Resolve All": string;
"Resolve all conflicted files": string;
"Resolve All conflicted files by the newer one": string;
"Resolve all conflicted files by the newer one. Caution: This will overwrite the older one, and cannot resurrect the overwritten one.": string;
"Restart Now": string;
"Restore or reconstruct local database from remote.": string;
"Run Doctor": string;
"S3/MinIO/R2 Object Storage": string;
"Save settings to a markdown file.": string;
"Save settings to a markdown file. You will be notified when new settings arrive. You can set different files by the platform.": string;
"Saving will be performed forcefully after this number of seconds.": string;
"Scan a QR Code (Recommended for mobile)": string;
"Scan changes on customization sync": string;
"Scan customization automatically": string;
"Scan customization before replicating.": string;
"Scan customization every 1 minute.": string;
"Scan customization periodically": string;
"Scan for hidden files before replication": string;
"Scan hidden files periodically": string;
"Scan the QR code displayed on an active device using this device's camera.": string;
"Schedule and Restart": string;
"Scram!": string;
"Seconds, 0 to disable": string;
"Seconds. Saving to the local database will be delayed until this value after we stop typing or saving.": string;
"Secret Key": string;
"Select the database adapter to use.": string;
Send: string;
"Send chunks": string;
"Server URI": string;
"Setting.GenerateKeyPair.Desc": string;
"Setting.GenerateKeyPair.Title": string;
"Setting.TroubleShooting": string;
"Setting.TroubleShooting.Doctor": string;
"Setting.TroubleShooting.Doctor.Desc": string;
"Setting.TroubleShooting.ScanBrokenFiles": string;
"Setting.TroubleShooting.ScanBrokenFiles.Desc": string;
"SettingTab.Message.AskRebuild": string;
"Setup URI dialog cancelled.": string;
"Setup.Apply.Buttons.ApplyAndFetch": string;
"Setup.Apply.Buttons.ApplyAndMerge": string;
"Setup.Apply.Buttons.ApplyAndRebuild": string;
"Setup.Apply.Buttons.Cancel": string;
"Setup.Apply.Buttons.OnlyApply": string;
"Setup.Apply.Message": string;
"Setup.Apply.Title": string;
"Setup.Apply.WarningRebuildRecommended": string;
"Setup.Doctor.Buttons.No": string;
"Setup.Doctor.Buttons.Yes": string;
"Setup.Doctor.Message": string;
"Setup.Doctor.Title": string;
"Setup.FetchRemoteConf.Buttons.Fetch": string;
"Setup.FetchRemoteConf.Buttons.Skip": string;
"Setup.FetchRemoteConf.Message": string;
"Setup.FetchRemoteConf.Title": string;
"Setup.QRCode": string;
"Setup.RemoteE2EE.AdvancedTitle": string;
"Setup.RemoteE2EE.AlgorithmWarning": string;
"Setup.RemoteE2EE.ButtonCancel": string;
"Setup.RemoteE2EE.ButtonProceed": string;
"Setup.RemoteE2EE.DefaultAlgorithmDesc": string;
"Setup.RemoteE2EE.Guidance": string;
"Setup.RemoteE2EE.LabelEncrypt": string;
"Setup.RemoteE2EE.LabelEncryptionAlgorithm": string;
"Setup.RemoteE2EE.LabelObfuscateProperties": string;
"Setup.RemoteE2EE.MultiDestinationWarning": string;
"Setup.RemoteE2EE.ObfuscatePropertiesDesc": string;
"Setup.RemoteE2EE.PassphraseValidationLine1": string;
"Setup.RemoteE2EE.PassphraseValidationLine2": string;
"Setup.RemoteE2EE.PlaceholderPassphrase": string;
"Setup.RemoteE2EE.StronglyRecommendedLine1": string;
"Setup.RemoteE2EE.StronglyRecommendedLine2": string;
"Setup.RemoteE2EE.StronglyRecommendedTitle": string;
"Setup.RemoteE2EE.Title": string;
"Setup.ScanQRCode.ButtonClose": string;
"Setup.ScanQRCode.Guidance": string;
"Setup.ScanQRCode.Step1": string;
"Setup.ScanQRCode.Step2": string;
"Setup.ScanQRCode.Step3": string;
"Setup.ScanQRCode.Step4": string;
"Setup.ScanQRCode.Title": string;
"Setup.ShowQRCode": string;
"Setup.ShowQRCode.Desc": string;
"Setup.UseSetupURI.ButtonCancel": string;
"Setup.UseSetupURI.ButtonProceed": string;
"Setup.UseSetupURI.ErrorFailedToParse": string;
"Setup.UseSetupURI.ErrorPassphraseRequired": string;
"Setup.UseSetupURI.GuidanceLine1": string;
"Setup.UseSetupURI.GuidanceLine2": string;
"Setup.UseSetupURI.InvalidInfo": string;
"Setup.UseSetupURI.LabelPassphrase": string;
"Setup.UseSetupURI.LabelSetupURI": string;
"Setup.UseSetupURI.PlaceholderPassphrase": string;
"Setup.UseSetupURI.Title": string;
"Setup.UseSetupURI.ValidInfo": string;
"Should we keep folders that don't have any files inside?": string;
"Should we only check for conflicts when a file is opened?": string;
"Should we prompt you about conflicting files when a file is opened?": string;
"Should we prompt you for every single merge, even if we can safely merge automatcially?": string;
"Show full banner": string;
"Show only notifications": string;
"Show status as icons only": string;
"Show status icon instead of file warnings banner": string;
"Show status inside the editor": string;
"Show status on the status bar": string;
"Show verbose log. Please enable if you report an issue.": string;
"Some devices have differing progress values (max: ${maxProgress}, min: ${minProgress}).\nThis may indicate that some devices have not completed synchronisation, which could lead to conflicts. Strongly recommend confirming that all devices are synchronised before proceeding.": string;
"Starts synchronisation when a file is saved.": string;
"Stop reflecting database changes to storage files.": string;
"Stop watching for file changes.": string;
"Suppress notification of hidden files change": string;
"Suspend database reflecting": string;
"Suspend file watching": string;
"Switch to IDB": string;
"Switch to IndexedDB": string;
"Sync after merging file": string;
"Sync automatically after merging files": string;
"Sync Mode": string;
"Sync on Editor Save": string;
"Sync on File Open": string;
"Sync on Save": string;
"Sync on Startup": string;
"Synchronisation utilising journal files. You must have set up an S3/MinIO/R2 compatible object storage.": string;
"Synchronising files": string;
Syncing: string;
"Target patterns": string;
"Testing only - Resolve file conflicts by syncing newer copies of the file, this can overwrite modified files. Be Warned.": string;
"The delay for consecutive on-demand fetches": string;
"The following accepted nodes are missing its node information:\n- ${missingNodes}\n\nThis indicates that they have not been connected for some time or have been left on an older version.\nIt is preferable to update all devices if possible. If you have any devices that are no longer in use, you can clear all accepted nodes by locking the remote once.": string;
"The Hash algorithm for chunk IDs": string;
"The maximum duration for which chunks can be incubated within the document.": string;
"The maximum duration for which chunks can be incubated within the document. Chunks exceeding this period will graduate to independent chunks.": string;
"The maximum number of chunks that can be incubated within the document.": string;
"The maximum number of chunks that can be incubated within the document. Chunks exceeding this number will immediately graduate to independent chunks.": string;
"The maximum total size of chunks that can be incubated within the document.": string;
"The maximum total size of chunks that can be incubated within the document. Chunks exceeding this size will immediately graduate to independent chunks.": string;
"The minimum interval for automatic synchronisation on event.": string;
"This feature enables direct synchronisation between devices. No server is required, but both devices must be online at the same time for synchronisation to occur, and some features may be limited. Internet connection is only required to signalling (detecting peers) and not for data transfer.": string;
"This is an advanced option for users who do not have a URI or who wish to configure detailed settings.": string;
"This is the most suitable synchronisation method for the design. All functions are available. You must have set up a CouchDB instance.": string;
"This passphrase will not be copied to another device. It will be set to until you configure it again.": string;
"This passphrase will not be copied to another device. It will be set to `Default` until you configure it again.": string;
"This will recreate chunks for all files. If there were missing chunks, this may fix the errors.": string;
"Transfer Tweak": string;
"TweakMismatchResolve.Action.Dismiss": string;
"TweakMismatchResolve.Action.UseConfigured": string;
"TweakMismatchResolve.Action.UseMine": string;
"TweakMismatchResolve.Action.UseMineAcceptIncompatible": string;
"TweakMismatchResolve.Action.UseMineWithRebuild": string;
"TweakMismatchResolve.Action.UseRemote": string;
"TweakMismatchResolve.Action.UseRemoteAcceptIncompatible": string;
"TweakMismatchResolve.Action.UseRemoteWithRebuild": string;
"TweakMismatchResolve.Message.Main": string;
"TweakMismatchResolve.Message.MainTweakResolving": string;
"TweakMismatchResolve.Message.UseRemote.WarningRebuildRecommended": string;
"TweakMismatchResolve.Message.UseRemote.WarningRebuildRequired": string;
"TweakMismatchResolve.Message.WarningIncompatibleRebuildRecommended": string;
"TweakMismatchResolve.Message.WarningIncompatibleRebuildRequired": string;
"TweakMismatchResolve.Table": string;
"TweakMismatchResolve.Table.Row": string;
"TweakMismatchResolve.Title": string;
"TweakMismatchResolve.Title.TweakResolving": string;
"TweakMismatchResolve.Title.UseRemoteConfig": string;
"Unique name between all synchronized devices. To edit this setting, please disable customization sync once.": string;
"Use a custom passphrase": string;
"Use a Setup URI (Recommended)": string;
"Use Custom HTTP Handler": string;
"Use dynamic iteration count": string;
"Use Segmented-splitter": string;
"Use splitting-limit-capped chunk splitter": string;
"Use the trash bin": string;
"Use timeouts instead of heartbeats": string;
username: string;
Username: string;
"Verbose Log": string;
"Verify all": string;
"Verify and repair all files": string;
"Warning! This will have a serious impact on performance. And the logs will not be synchronised under the default name.": string;
"Warning! This will have a serious impact on performance. And the logs will not be synchronised under the default name. Please be careful with logs; they often contain your confidential information.": string;
"We cannot change the device name while this feature is enabled. Please disable this feature to change the device name.": string;
"We will now guide you through a few questions to simplify the synchronisation setup.": string;
"We will now proceed with the server configuration.": string;
"Welcome to Self-hosted LiveSync": string;
"When you save a file in the editor, start a sync automatically": string;
"Write credentials in the file": string;
"Write logs into the file": string;
"xxhash32 (Fast but less collision resistance)": string;
"xxhash64 (Fastest)": string;
"Yes, I want to add this device to my existing synchronisation": string;
"Yes, I want to set up a new synchronisation": string;
"You are adding this device to an existing synchronisation setup.": string;
};
};
+384
View File
@@ -0,0 +1,384 @@
export declare const PartialMessages: {
readonly "zh-tw": {
"(Active)": string;
"(RegExp) Empty to sync all files. Set filter as a regular expression to limit synchronising files.": string;
"(RegExp) If this is set, any changes to local and remote files that match this will be skipped.": string;
"(Select this if you are already using synchronisation on another computer or smartphone.) This option is suitable if you are new to LiveSync and want to set it up from scratch.": string;
"(Select this if you are configuring this device as the first synchronisation device.) This option is suitable if you are new to LiveSync and want to set it up from scratch.": string;
"> [!INFO]- The connected devices have been detected as follows:\n${devices}": string;
"A Setup URI is a single string of text containing your server address and authentication details. Using a URI, if one was generated by your server installation script, provides a simple and secure configuration.": string;
Activate: string;
"Active Remote Configuration": string;
"Add default patterns": string;
"Add new connection": string;
"All devices have the same progress value (${progress}). Your devices seem to be synchronised. And be able to proceed with Garbage Collection.": string;
"Always prompt merge conflicts": string;
Analyse: string;
"Analyse database usage": string;
"Analyse database usage and generate a TSV report for diagnosis yourself. You can paste the generated report with any spreadsheet you like.": string;
"Apply Latest Change if Conflicting": string;
"Apply preset configuration": string;
"Ask a passphrase at every launch": string;
"Automatically Sync all files when opening Obsidian.": string;
Back: string;
"Back to non-configured": string;
"Batch database update": string;
"Batch limit": string;
"Batch size": string;
"Batch size of on-demand fetching": string;
"Bucket Name": string;
Cancel: string;
"Cancel Garbage Collection": string;
Check: string;
"Check and convert non-path-obfuscated files": string;
"Check for documents that have not been converted to path-obfuscated IDs and convert them if necessary.": string;
"cmdConfigSync.showCustomizationSync": string;
"Compaction in progress on remote database...": string;
"Compaction on remote database completed successfully.": string;
"Compaction on remote database failed.": string;
"Compaction on remote database timed out.": string;
"Compare the content of files between on local database and storage. If not matched, you will be asked which one you want to keep.": string;
"Compatibility (Conflict Behaviour)": string;
"Compatibility (Database structure)": string;
"Compatibility (Internal API Usage)": string;
"Compatibility (Metadata)": string;
"Compatibility (Remote Database)": string;
"Compatibility (Trouble addressed)": string;
"Configuration Encryption": string;
Configure: string;
"Configure And Change Remote": string;
"Configure E2EE": string;
"Configure Remote": string;
"Configure the same server information as your other devices again, manually, very advanced users only.": string;
"Connection Method": string;
"Continue to CouchDB setup": string;
"Continue to Peer-to-Peer only setup": string;
"Continue to S3/MinIO/R2 setup": string;
Copy: string;
"Copy Report to clipboard": string;
"CouchDB Connection Tweak": string;
"Cross-platform": string;
"Current adapter: {adapter}": string;
"Customization Sync": string;
"Customization Sync (Beta3)": string;
"Data Compression": string;
"Database -> Storage": string;
"Database Adapter": string;
"Database Name": string;
"Database suffix": string;
Default: string;
"Delay conflict resolution of inactive files": string;
"Delay merge conflict prompt for inactive files.": string;
Delete: string;
"Delete all customization sync data": string;
"Delete all data on the remote server.": string;
"Delete local database to reset or uninstall Self-hosted LiveSync": string;
"Delete old metadata of deleted files on start-up": string;
"Delete Remote Configuration": string;
"Delete remote configuration '{name}'?": string;
desktop: string;
Developer: string;
Device: string;
"Device name": string;
"Device Setup Method": string;
"dialog.yourLanguageAvailable": string;
"dialog.yourLanguageAvailable.btnRevertToDefault": string;
"dialog.yourLanguageAvailable.Title": string;
"Disables all synchronization and restart.": string;
"Disables logging, only shows notifications. Please disable if you report an issue.": string;
"Display Language": string;
"Display name": string;
"Do not check configuration mismatch before replication": string;
"Do not keep metadata of deleted files.": string;
"Do not split chunks in the background": string;
"Do not use internal API": string;
"Document History": string;
Duplicate: string;
"Duplicate remote": string;
"E2EE Configuration": string;
"Edge case addressing (Behaviour)": string;
"Edge case addressing (Database)": string;
"Edge case addressing (Processing)": string;
"Emergency restart": string;
"Enable advanced features": string;
"Enable customization sync": string;
"Enable Developers' Debug Tools.": string;
"Enable edge case treatment features": string;
"Enable poweruser features": string;
"Enable this if your Object Storage doesn't support CORS": string;
"Enable this option to automatically apply the most recent change to documents even when it conflicts": string;
"Encrypt contents on the remote database. If you use the plugin's synchronization feature, enabling this is recommended.": string;
"Encrypting sensitive configuration items": string;
"Encryption phassphrase. If changed, you should overwrite the server's database with the new (encrypted) files.": string;
"End-to-End Encryption": string;
"Endpoint URL": string;
"Enhance chunk size": string;
"Enter Server Information": string;
"Enter the server information manually": string;
Export: string;
"Failed to connect to remote for compaction.": string;
"Failed to connect to remote for compaction. ${reason}": string;
"Failed to start one-shot replication before Garbage Collection. Garbage Collection Cancelled.": string;
"Failed to start replication after Garbage Collection.": string;
Fetch: string;
"Fetch chunks on demand": string;
"Fetch database with previous behaviour": string;
"Fetch remote settings": string;
"File to resolve conflict": string;
"File to view History": string;
Filename: string;
"First, please select the option that best describes your current situation.": string;
"Flag and restart": string;
"Forces the file to be synced when opened.": string;
"Fresh Start Wipe": string;
"Garbage Collection cancelled by user.": string;
"Garbage Collection completed. Deleted chunks: ${deletedChunks} / ${totalChunks}. Time taken: ${seconds} seconds.": string;
"Garbage Collection Confirmation": string;
"Garbage Collection V3 (Beta)": string;
"Garbage Collection: Found ${unusedChunks} unused chunks to delete.": string;
"Garbage Collection: Scanned ${scanned} / ~${docCount}": string;
"Garbage Collection: Scanning completed. Total chunks: ${totalChunks}, Used chunks: ${usedChunks}": string;
"Handle files as Case-Sensitive": string;
"Hidden Files": string;
"Hide completely": string;
"Highlight diff": string;
"How to display network errors when the sync server is unreachable.": string;
"How would you like to configure the connection to your server?": string;
"I am adding a device to an existing synchronisation setup": string;
"I am setting this up for the first time": string;
"I know my server details, let me enter them": string;
"If disabled(toggled), chunks will be split on the UI thread (Previous behaviour).": string;
"If enabled per-filed efficient customization sync will be used. We need a small migration when enabling this. And all devices should be updated to v0.23.18. Once we enabled this, we lost a compatibility with old versions.": string;
"If enabled, chunks will be split into no more than 100 items. However, dedupe is slightly weaker.": string;
"If enabled, newly created chunks are temporarily kept within the document, and graduated to become independent chunks once stabilised.": string;
"If enabled, the \u26D4 icon will be shown inside the status instead of the file warnings banner. No details will be shown.": string;
"If enabled, the file under 1kb will be processed in the UI thread.": string;
"If enabled, the notification of hidden files change will be suppressed.": string;
"If this enabled, all chunks will be stored with the revision made from its content. (Previous behaviour)": string;
"If this enabled, All files are handled as case-Sensitive (Previous behaviour).": string;
"If this enabled, chunks will be split into semantically meaningful segments. Not all platforms support this feature.": string;
"If you reached the payload size limit when using IBM Cloudant, please decrease batch size and batch limit to a lower value.": string;
"Ignore and Proceed": string;
"Ignore patterns": string;
"Import connection": string;
"Initialise all journal history, On the next sync, every item will be received and sent.": string;
"Initialise journal received history. On the next sync, every item except this device sent will be downloaded again.": string;
"Initialise journal sent history. On the next sync, every item except this device received will be sent again.": string;
Later: string;
"Limit: {datetime} ({timestamp})": string;
Lock: string;
"Lock Server": string;
"Lock the remote server to prevent synchronization with other devices.": string;
"Minimum interval for syncing": string;
"More actions": string;
"Network warning style": string;
"New Remote": string;
"No connected device information found. Cancelling Garbage Collection.": string;
"No limit configured": string;
"No, please take me back": string;
"Node ID": string;
"Node Information Missing": string;
"Non-Synchronising files": string;
"Normal Files": string;
"Obsidian version": string;
"obsidianLiveSyncSettingTab.btnApply": string;
"obsidianLiveSyncSettingTab.btnDisable": string;
"obsidianLiveSyncSettingTab.btnNext": string;
"obsidianLiveSyncSettingTab.buttonNext": string;
"obsidianLiveSyncSettingTab.defaultLanguage": string;
"obsidianLiveSyncSettingTab.labelDisabled": string;
"obsidianLiveSyncSettingTab.labelEnabled": string;
"obsidianLiveSyncSettingTab.logConfiguredDisabled": string;
"obsidianLiveSyncSettingTab.logConfiguredLiveSync": string;
"obsidianLiveSyncSettingTab.logConfiguredPeriodic": string;
"obsidianLiveSyncSettingTab.logSelectAnyPreset": string;
"obsidianLiveSyncSettingTab.msgConfigCheckFailed": string;
"obsidianLiveSyncSettingTab.msgEnableEncryptionRecommendation": string;
"obsidianLiveSyncSettingTab.msgFetchConfigFromRemote": string;
"obsidianLiveSyncSettingTab.msgGenerateSetupURI": string;
"obsidianLiveSyncSettingTab.msgInvalidPassphrase": string;
"obsidianLiveSyncSettingTab.msgSelectAndApplyPreset": string;
"obsidianLiveSyncSettingTab.nameDisableHiddenFileSync": string;
"obsidianLiveSyncSettingTab.nameEnableHiddenFileSync": string;
"obsidianLiveSyncSettingTab.nameHiddenFileSynchronization": string;
"obsidianLiveSyncSettingTab.optionDisableAllAutomatic": string;
"obsidianLiveSyncSettingTab.optionLiveSync": string;
"obsidianLiveSyncSettingTab.optionOnEvents": string;
"obsidianLiveSyncSettingTab.optionPeriodicAndEvents": string;
"obsidianLiveSyncSettingTab.optionPeriodicWithBatch": string;
"obsidianLiveSyncSettingTab.titleAppearance": string;
"obsidianLiveSyncSettingTab.titleConflictResolution": string;
"obsidianLiveSyncSettingTab.titleCongratulations": string;
"obsidianLiveSyncSettingTab.titleCouchDB": string;
"obsidianLiveSyncSettingTab.titleDeletionPropagation": string;
"obsidianLiveSyncSettingTab.titleEncryptionNotEnabled": string;
"obsidianLiveSyncSettingTab.titleEncryptionPassphraseInvalid": string;
"obsidianLiveSyncSettingTab.titleFetchConfig": string;
"obsidianLiveSyncSettingTab.titleHiddenFiles": string;
"obsidianLiveSyncSettingTab.titleLogging": string;
"obsidianLiveSyncSettingTab.titleMinioS3R2": string;
"obsidianLiveSyncSettingTab.titleNotification": string;
"obsidianLiveSyncSettingTab.titleRemoteConfigCheckFailed": string;
"obsidianLiveSyncSettingTab.titleRemoteServer": string;
"obsidianLiveSyncSettingTab.titleSynchronizationMethod": string;
"obsidianLiveSyncSettingTab.titleSynchronizationPreset": string;
"obsidianLiveSyncSettingTab.titleSyncSettingsViaMarkdown": string;
"obsidianLiveSyncSettingTab.titleUpdateThinning": string;
Ok: string;
"Old Algorithm": string;
"Older fallback (Slow, W/O WebAssembly)": string;
"Overwrite patterns": string;
"Overwrite remote": string;
"Overwrite remote with local DB and passphrase.": string;
"Overwrite Server Data with This Device's Files": string;
"paneMaintenance.markDeviceResolvedAfterBackup": string;
"paneMaintenance.remoteLockedAndDeviceNotAccepted": string;
"paneMaintenance.remoteLockedResolvedDevice": string;
"paneMaintenance.unlockDatabaseReady": string;
"Paste a connection string": string;
"Paste the Setup URI generated from one of your active devices.": string;
"Patterns to match files for overwriting instead of merging": string;
"Patterns to match files for syncing": string;
"Peer-to-Peer only": string;
"Peer-to-Peer Synchronisation": string;
Perform: string;
"Perform cleanup": string;
"Perform Garbage Collection": string;
"Perform Garbage Collection to remove unused chunks and reduce database size.": string;
"Pick a file to resolve conflict": string;
"Pick a file to show history": string;
"Please disable 'Read chunks online' in settings to use Garbage Collection.": string;
"Please enable 'Compute revisions for chunks' in settings to use Garbage Collection.": string;
"Please select 'Cancel' explicitly to cancel this operation.": string;
"Please select a method to import the settings from another device.": string;
"Please select an option to proceed": string;
"Please select the type of server to which you are connecting.": string;
"Please set this device name": string;
"Plug-in version": string;
"Prepare the 'report' to create an issue": string;
"Proceed Garbage Collection": string;
"Proceed with Setup URI": string;
"Proceeding with Garbage Collection, ignoring missing nodes.": string;
"Proceeding with Garbage Collection.": string;
Progress: string;
"PureJS fallback (Fast, W/O WebAssembly)": string;
"Purge all download/upload cache.": string;
"Purge all journal counter": string;
"Rebuild local and remote database with local files.": string;
"Rebuilding Operations (Remote Only)": string;
"Recovery and Repair": string;
"Recreate all": string;
"Recreate missing chunks for all files": string;
"Reduces storage space by discarding all non-latest revisions. This requires the same amount of free space on the remote server and the local client.": string;
Remediation: string;
"Remediation Setting Changed": string;
"Remote Database Tweak (In sunset)": string;
"Remote Databases": string;
"Remote name": string;
Rename: string;
"Rerun Onboarding Wizard": string;
"Rerun the onboarding wizard to set up Self-hosted LiveSync again.": string;
"Rerun Wizard": string;
Resend: string;
"Resend all chunks to the remote.": string;
Reset: string;
"Reset all": string;
"Reset all journal counter": string;
"Reset journal received history": string;
"Reset journal sent history": string;
"Reset notification threshold and check the remote database usage": string;
"Reset received": string;
"Reset sent history": string;
"Reset Synchronisation information": string;
"Reset Synchronisation on This Device": string;
"Reset the remote storage size threshold and check the remote storage size again.": string;
"Resolve All": string;
"Resolve all conflicted files": string;
"Resolve All conflicted files by the newer one": string;
"Resolve all conflicted files by the newer one. Caution: This will overwrite the older one, and cannot resurrect the overwritten one.": string;
"Restart Now": string;
"Restarting Obsidian is strongly recommended. Until restart, some changes may not take effect, and display may be inconsistent. Are you sure to restart now?": string;
"Restore or reconstruct local database from remote.": string;
"Run Doctor": string;
"S3/MinIO/R2 Object Storage": string;
"Scan a QR Code (Recommended for mobile)": string;
"Scan for Broken files": string;
"Scan the QR code displayed on an active device using this device's camera.": string;
"Schedule and Restart": string;
"Scram Switches": string;
"Scram!": string;
"Select the database adapter to use.": string;
Send: string;
"Send chunks": string;
"Setting.GenerateKeyPair.Desc": string;
"Setting.GenerateKeyPair.Title": string;
"Setup URI dialog cancelled.": string;
"Setup.RemoteE2EE.AdvancedTitle": string;
"Setup.RemoteE2EE.AlgorithmWarning": string;
"Setup.RemoteE2EE.ButtonCancel": string;
"Setup.RemoteE2EE.ButtonProceed": string;
"Setup.RemoteE2EE.DefaultAlgorithmDesc": string;
"Setup.RemoteE2EE.Guidance": string;
"Setup.RemoteE2EE.LabelEncrypt": string;
"Setup.RemoteE2EE.LabelEncryptionAlgorithm": string;
"Setup.RemoteE2EE.LabelObfuscateProperties": string;
"Setup.RemoteE2EE.MultiDestinationWarning": string;
"Setup.RemoteE2EE.ObfuscatePropertiesDesc": string;
"Setup.RemoteE2EE.PassphraseValidationLine1": string;
"Setup.RemoteE2EE.PassphraseValidationLine2": string;
"Setup.RemoteE2EE.PlaceholderPassphrase": string;
"Setup.RemoteE2EE.StronglyRecommendedLine1": string;
"Setup.RemoteE2EE.StronglyRecommendedLine2": string;
"Setup.RemoteE2EE.StronglyRecommendedTitle": string;
"Setup.RemoteE2EE.Title": string;
"Setup.ScanQRCode.ButtonClose": string;
"Setup.ScanQRCode.Guidance": string;
"Setup.ScanQRCode.Step1": string;
"Setup.ScanQRCode.Step2": string;
"Setup.ScanQRCode.Step3": string;
"Setup.ScanQRCode.Step4": string;
"Setup.ScanQRCode.Title": string;
"Setup.UseSetupURI.ButtonCancel": string;
"Setup.UseSetupURI.ButtonProceed": string;
"Setup.UseSetupURI.ErrorFailedToParse": string;
"Setup.UseSetupURI.ErrorPassphraseRequired": string;
"Setup.UseSetupURI.GuidanceLine1": string;
"Setup.UseSetupURI.GuidanceLine2": string;
"Setup.UseSetupURI.InvalidInfo": string;
"Setup.UseSetupURI.LabelPassphrase": string;
"Setup.UseSetupURI.LabelSetupURI": string;
"Setup.UseSetupURI.PlaceholderPassphrase": string;
"Setup.UseSetupURI.Title": string;
"Setup.UseSetupURI.ValidInfo": string;
"Show full banner": string;
"Show history": string;
"Show icon only": string;
"Show status icon instead of file warnings banner": string;
"Some devices have differing progress values (max: ${maxProgress}, min: ${minProgress}).\nThis may indicate that some devices have not completed synchronisation, which could lead to conflicts. Strongly recommend confirming that all devices are synchronised before proceeding.": string;
"Storage -> Database": string;
"Switch to IDB": string;
"Switch to IndexedDB": string;
"Synchronisation utilising journal files. You must have set up an S3/MinIO/R2 compatible object storage.": string;
"Synchronising files": string;
Syncing: string;
"Target patterns": string;
"The following accepted nodes are missing its node information:\n- ${missingNodes}\n\nThis indicates that they have not been connected for some time or have been left on an older version.\nIt is preferable to update all devices if possible. If you have any devices that are no longer in use, you can clear all accepted nodes by locking the remote once.": string;
"The IndexedDB adapter often offers superior performance in certain scenarios, but it has been found to cause memory leaks when used with LiveSync mode. When using LiveSync mode, please use IDB adapter instead.": string;
"The minimum interval for automatic synchronisation on event.": string;
"This feature enables direct synchronisation between devices. No server is required, but both devices must be online at the same time for synchronisation to occur, and some features may be limited. Internet connection is only required to signalling (detecting peers) and not for data transfer.": string;
"This is an advanced option for users who do not have a URI or who wish to configure detailed settings.": string;
"This is the most suitable synchronisation method for the design. All functions are available. You must have set up a CouchDB instance.": string;
"This will recreate chunks for all files. If there were missing chunks, this may fix the errors.": string;
"Use a Setup URI (Recommended)": string;
"Verify all": string;
"Verify and repair all files": string;
"We will now guide you through a few questions to simplify the synchronisation setup.": string;
"We will now proceed with the server configuration.": string;
"Welcome to Self-hosted LiveSync": string;
"xxhash32 (Fast but less collision resistance)": string;
"xxhash64 (Fastest)": string;
"Yes, I want to add this device to my existing synchronisation": string;
"Yes, I want to set up a new synchronisation": string;
"You are adding this device to an existing synchronisation setup.": string;
};
};
File diff suppressed because it is too large Load Diff
+41
View File
@@ -0,0 +1,41 @@
export type CouchDBCredentials = BasicCredentials | JWTCredentials;
export type JWTAlgorithm = "HS256" | "HS512" | "ES256" | "ES512" | "";
export type Credential = {
username: string;
password: string;
};
export type BasicCredentials = {
username: string;
password: string;
type: "basic";
};
export type JWTCredentials = {
jwtAlgorithm: JWTAlgorithm;
jwtKey: string;
jwtKid: string;
jwtSub: string;
jwtExpDuration: number;
type: "jwt";
};
export interface JWTHeader {
alg: string;
typ: string;
kid?: string;
}
export interface JWTPayload {
sub: string;
exp: number;
iss?: string;
iat: number;
[key: string]: unknown;
}
export interface JWTParams {
header: JWTHeader;
payload: JWTPayload;
credentials: JWTCredentials;
}
export interface PreparedJWT {
header: JWTHeader;
payload: JWTPayload;
token: string;
}
+20
View File
@@ -0,0 +1,20 @@
import type { DocumentID } from "./db.type";
export declare const VERSIONING_DOCID: DocumentID;
export declare const MILESTONE_DOCID: DocumentID;
export declare const NODEINFO_DOCID: DocumentID;
export declare const SYNCINFO_ID: DocumentID;
export declare const EntryTypes: {
readonly NOTE_LEGACY: "notes";
readonly NOTE_BINARY: "newnote";
readonly NOTE_PLAIN: "plain";
readonly INTERNAL_FILE: "internalfile";
readonly CHUNK: "leaf";
readonly CHUNK_PACK: "chunkpack";
readonly VERSION_INFO: "versioninfo";
readonly SYNC_INFO: "syncinfo";
readonly SYNC_PARAMETERS: "sync-parameters";
readonly MILESTONE_INFO: "milestoneinfo";
readonly NODE_INFO: "nodeinfo";
};
export declare const NoteTypes: ("notes" | "newnote" | "plain")[];
export declare const ChunkTypes: ("leaf" | "chunkpack")[];
+56
View File
@@ -0,0 +1,56 @@
import type { MILESTONE_DOCID, NODEINFO_DOCID } from "./db.const";
import type { AnyEntry, ChunkVersionRange, DatabaseEntry, EntryChunkPack, EntryLeaf, EntryTypes, EntryVersionInfo, LoadedEntry, MetaEntry } from "./db.type";
import type { TweakValues } from "./tweak.definition";
export type NodeKey = string;
export interface DeviceInfo {
/**
* Name of the device (Initially from deviceAndVaultName setting, configurable).
*/
device_name: string;
/**
* Vault name (From vaultName setting).
*/
vault_name: string;
/**
* Obsidian App version of the device.
*/
app_version: string;
/**
* Plugin version of the device.
*/
plugin_version: string;
progress: string;
}
export interface NodeData extends DeviceInfo {
/**
* Epoch time in milliseconds when the device last connected.
*/
last_connected: number;
}
export interface EntryMilestoneInfo extends DatabaseEntry {
_id: typeof MILESTONE_DOCID;
type: EntryTypes["MILESTONE_INFO"];
created: number;
accepted_nodes: string[];
node_info: {
[key: NodeKey]: NodeData;
};
locked: boolean;
cleaned?: boolean;
node_chunk_info: {
[key: NodeKey]: ChunkVersionRange;
};
tweak_values: {
[key: NodeKey]: TweakValues;
};
}
export interface EntryNodeInfo extends DatabaseEntry {
_id: typeof NODEINFO_DOCID;
type: EntryTypes["NODE_INFO"];
nodeid: string;
v20220607?: boolean;
}
export type EntryBody = AnyEntry;
export type EntryDoc = EntryBody | LoadedEntry | EntryLeaf | EntryVersionInfo | EntryMilestoneInfo | EntryNodeInfo | EntryChunkPack;
export type EntryDocResponse = EntryDoc & PouchDB.Core.IdMeta & PouchDB.Core.GetMeta;
export declare function isMetaEntry(entry: AnyEntry): entry is MetaEntry;
+175
View File
@@ -0,0 +1,175 @@
import type { TaggedType } from "octagonal-wheels/common/types";
import type { EntryTypes, SYNCINFO_ID } from "./db.const";
export type FilePath = TaggedType<string, "FilePath">;
export type FilePathWithPrefixLC = TaggedType<string, "FilePathWithPrefixLC">;
export type FilePathWithPrefix = TaggedType<string, "FilePathWithPrefix"> | FilePath | FilePathWithPrefixLC;
export type DocumentID = TaggedType<string, "documentId">;
export type EntryType = (typeof EntryTypes)[keyof typeof EntryTypes];
export type EntryTypes = typeof EntryTypes;
export type EntryTypeNotes = EntryTypes["NOTE_BINARY"] | EntryTypes["NOTE_PLAIN"];
export type EntryTypeNotesWithLegacy = EntryTypeNotes | EntryTypes["NOTE_LEGACY"];
/**
* Represents an entry in the database.
*/
export interface DatabaseEntry {
/**
* The ID of the document.
*/
_id: DocumentID;
/**
* The revision of the document.
*/
_rev?: string;
/**
* Deleted flag.
*/
_deleted?: boolean;
/**
* Conflicts (if exists).
*/
_conflicts?: string[];
}
/**
* Represents the base structure for an entry that represents a file.
*/
export interface EntryBase {
/**
* The creation time of the file.
*/
ctime: number;
/**
* The modification time of the file.
*/
mtime: number;
/**
* The size of the file.
*/
size: number;
/**
* Deleted flag.
*/
deleted?: boolean;
}
export type EdenChunk = {
data: string;
epoch: number;
};
export type EntryWithEden = {
eden: Record<DocumentID, EdenChunk>;
};
/**
* Represents the common fields for all database entries representing physical files.
*/
export interface FileEntryBase extends DatabaseEntry, EntryBase, EntryWithEden {
/**
* The path of the file.
*/
path: FilePathWithPrefix;
}
/**
* Represents an entry that contains children (chunk IDs).
*/
export interface EntryWithChildren {
/**
* Chunk IDs indicating the contents of the file.
*/
children: string[];
}
/**
* Represents an entry that contains content data.
*/
export interface EntryWithData<T = string | string[] | Blob> {
/**
* Contents / payload of the entry.
*/
data: T;
}
/**
* Represents an entry that contains document body text.
*/
export type EntryWithBody = EntryWithData<string | string[]>;
/**
* Represents an entry that contains a binary Blob.
*/
export type EntryWithBlob = EntryWithData<Blob>;
/**
* Represents a legacy note entry where file content is stored directly in the metadata.
*/
export interface NoteEntry extends FileEntryBase, EntryWithBody {
/**
* The type of the entry.
*/
type: EntryTypes["NOTE_LEGACY"];
}
/**
* Represents a chunk-split binary file entry.
*/
export interface NewEntry extends FileEntryBase, EntryWithChildren {
/**
* The type of the entry.
*/
type: EntryTypes["NOTE_BINARY"];
}
/**
* Represents a chunk-split plain text file entry.
*/
export interface PlainEntry extends FileEntryBase, EntryWithChildren {
/**
* The type of the entry.
*/
type: EntryTypes["NOTE_PLAIN"];
}
/**
* Represents a customization / configuration file entry.
* @deprecated Use NewEntry or PlainEntry directly.
*/
export type InternalFileEntry = NewEntry;
/**
* Represents any file-related database entry.
*/
export type AnyEntry = NoteEntry | NewEntry | PlainEntry;
/**
* Represents a file entry after its contents have been loaded and assembled.
*/
export type LoadedEntry = AnyEntry & EntryWithBody & {
datatype: EntryTypeNotes;
};
/**
* Represents a file entry prepared for saving.
*/
export type SavingEntry = AnyEntry & EntryWithBlob & {
datatype: EntryTypeNotes;
};
/**
* Represents a metadata entry (chunked file entry) without full content.
*/
export type MetaEntry = NewEntry | PlainEntry;
/**
* Represents a leaf (chunk) document in the database.
*/
export interface EntryLeaf extends DatabaseEntry, EntryWithData<string> {
type: EntryTypes["CHUNK"];
isCorrupted?: boolean;
}
/**
* Represents a chunk pack document.
*/
export interface EntryChunkPack extends DatabaseEntry, EntryWithData<string> {
type: EntryTypes["CHUNK_PACK"];
}
export interface EntryVersionInfo extends DatabaseEntry {
type: EntryTypes["VERSION_INFO"];
version: number;
}
export interface EntryHasPath {
path: FilePathWithPrefix | FilePath;
}
export interface ChunkVersionRange {
min: number;
max: number;
current: number;
}
export interface SyncInfo extends DatabaseEntry, EntryWithData<string> {
_id: typeof SYNCINFO_ID;
type: EntryTypes["SYNC_INFO"];
}
+16
View File
@@ -0,0 +1,16 @@
import type { AUTO_MERGED, CANCELLED, MISSING_OR_ERROR, NOT_CONFLICTED } from "./shared.const.symbols";
export type diff_result_leaf = {
rev: string;
data: string;
ctime: number;
mtime: number;
deleted?: boolean;
};
export type dmp_result = Array<[number, string]>;
export type diff_result = {
left: diff_result_leaf;
right: diff_result_leaf;
diff: dmp_result;
};
export type DIFF_CHECK_RESULT_AUTO = typeof CANCELLED | typeof AUTO_MERGED | typeof NOT_CONFLICTED | typeof MISSING_OR_ERROR;
export type diff_check_result = DIFF_CHECK_RESULT_AUTO | diff_result;
@@ -0,0 +1,7 @@
export declare const CHeader = "h:";
export declare const PSCHeader = "ps:";
export declare const PSCHeaderEnd = "ps;";
export declare const ICHeader = "i:";
export declare const ICHeaderEnd = "i;";
export declare const ICHeaderLength: number;
export declare const ICXHeader = "ix:";
+83
View File
@@ -0,0 +1,83 @@
import type { FilePath, FilePathWithPrefix } from "./db.type";
export interface UXStat {
size: number;
mtime: number;
ctime: number;
type: "file" | "folder";
}
/**
* Represents the common base properties for any filesystem object stub.
*/
export interface UXFileSystemStubBase {
name: string;
path: FilePath | FilePathWithPrefix;
deleted?: boolean;
isInternal?: boolean;
}
/**
* Represents a stub for a regular file.
*/
export interface UXFileInfoStub extends UXFileSystemStubBase {
stat: UXStat;
isFolder?: false;
}
/**
* Represents a complete file containing its binary body.
*/
export interface UXFileInfo extends UXFileInfoStub {
body: Blob;
}
export type UXAbstractInfoStub = UXFileInfoStub | UXFolderInfo;
/**
* Represents a stub for an internal/hidden file.
*/
export interface UXInternalFileInfoStub extends UXFileSystemStubBase {
isFolder?: false;
isInternal: true;
stat: undefined;
}
/**
* Represents information about a folder.
*/
export interface UXFolderInfo extends UXFileSystemStubBase {
isFolder: true;
children: UXFileInfoStub[];
parent: FilePath | FilePathWithPrefix | undefined;
}
export interface UXDataWriteOptions {
/**
* Time of creation, represented as a unix timestamp, in milliseconds.
* Omit this if you want to keep the default behaviour.
* @public
* */
ctime?: number;
/**
* Time of last modification, represented as a unix timestamp, in milliseconds.
* Omit this if you want to keep the default behaviour.
* @public
* */
mtime?: number;
}
export type CacheData = string | ArrayBuffer;
export type FileEventType = "CREATE" | "DELETE" | "CHANGED" | "INTERNAL";
export interface FileEventArgs {
file: UXFileInfoStub | UXInternalFileInfoStub;
cache?: CacheData;
oldPath?: string;
ctx?: unknown;
}
export interface FileEventItem {
type: FileEventType;
args: FileEventArgs;
key: string;
skipBatchWait?: boolean;
cancelled?: boolean;
batched?: boolean;
}
export interface FileWithFileStat extends Omit<UXStat, "type"> {
path: FilePath;
}
export interface FileWithStatAsProp {
path: FilePath;
stat: Omit<UXStat, "type">;
}
+32
View File
@@ -0,0 +1,32 @@
import type { FilePath } from "./db.type";
export declare const PREFIXMD_LOGFILE = "livesync_log_";
export declare const PREFIXMD_LOGFILE_UC = "LIVESYNC_LOG_";
export declare const FlagFilesOriginal: {
readonly SUSPEND_ALL: FilePath;
readonly REBUILD_ALL: FilePath;
readonly FETCH_ALL: FilePath;
};
export declare const FlagFilesHumanReadable: {
readonly REBUILD_ALL: FilePath;
readonly FETCH_ALL: FilePath;
};
/**
* @deprecated Use `FlagFilesOriginal.SUSPEND_ALL` instead.
*/
export declare const FLAGMD_REDFLAG: FilePath;
/**
* @deprecated Use `FlagFilesHumanReadable.REBUILD_ALL` instead.
*/
export declare const FLAGMD_REDFLAG2: FilePath;
/**
* @deprecated Use `FlagFilesHumanReadable.FETCH_ALL` instead.
*/
export declare const FLAGMD_REDFLAG2_HR: FilePath;
/**
* @deprecated Use `FlagFilesOriginal.FETCH_ALL` instead.
*/
export declare const FLAGMD_REDFLAG3: FilePath;
/**
* @deprecated Use `FlagFilesHumanReadable.FETCH_ALL` instead.
*/
export declare const FLAGMD_REDFLAG3_HR: FilePath;
+49
View File
@@ -0,0 +1,49 @@
export declare const SETTING_VERSION_INITIAL = 0;
export declare const SETTING_VERSION_SUPPORT_CASE_INSENSITIVE = 10;
export declare const CURRENT_SETTING_VERSION = 10;
export declare const RemoteTypes: {
readonly REMOTE_COUCHDB: "";
readonly REMOTE_MINIO: "MINIO";
readonly REMOTE_P2P: "ONLY_P2P";
};
export declare const REMOTE_COUCHDB: "";
export declare const REMOTE_MINIO: "MINIO";
export declare const REMOTE_P2P: "ONLY_P2P";
export declare const E2EEAlgorithmNames: {
readonly "": "V1: Legacy";
readonly v2: "V2: AES-256-GCM With HKDF";
readonly forceV1: "Force-V1: Force Legacy (Not recommended)";
};
export declare const E2EEAlgorithms: {
readonly V1: "";
readonly V2: "v2";
readonly ForceV1: "forceV1";
};
export declare const HashAlgorithms: {
readonly XXHASH32: "xxhash32";
readonly XXHASH64: "xxhash64";
readonly MIXED_PUREJS: "mixed-purejs";
readonly SHA1: "sha1";
readonly LEGACY: "";
};
export declare const ChunkAlgorithmNames: {
readonly v1: "V1: Legacy";
readonly v2: "V2: Simple (Default)";
readonly "v2-segmenter": "V2.5: Lexical chunks";
readonly "v3-rabin-karp": "V3: Fine deduplication";
};
export declare const ChunkAlgorithms: {
readonly V1: "v1";
readonly V2: "v2";
readonly V2Segmenter: "v2-segmenter";
readonly RabinKarp: "v3-rabin-karp";
};
export declare const MODE_SELECTIVE = 0;
export declare const MODE_AUTOMATIC = 1;
export declare const MODE_PAUSED = 2;
export declare const MODE_SHINY = 3;
export declare const NetworkWarningStyles: {
readonly BANNER: "";
readonly ICON: "icon";
readonly HIDDEN: "hidden";
};
@@ -0,0 +1,3 @@
import { type ObsidianLiveSyncSettings, type P2PSyncSetting } from "./setting.type";
export declare const P2P_DEFAULT_SETTINGS: P2PSyncSetting;
export declare const DEFAULT_SETTINGS: ObsidianLiveSyncSettings;
@@ -0,0 +1,5 @@
import type { ObsidianLiveSyncSettings } from "./setting.type";
export declare const PREFERRED_BASE: Partial<ObsidianLiveSyncSettings>;
export declare const PREFERRED_SETTING_CLOUDANT: Partial<ObsidianLiveSyncSettings>;
export declare const PREFERRED_SETTING_SELF_HOSTED: Partial<ObsidianLiveSyncSettings>;
export declare const PREFERRED_JOURNAL_SYNC: Partial<ObsidianLiveSyncSettings>;
@@ -0,0 +1,2 @@
import type { ObsidianLiveSyncSettings } from "./setting.type";
export declare const KeyIndexOfSettings: Record<keyof ObsidianLiveSyncSettings, number>;
+893
View File
@@ -0,0 +1,893 @@
import type { ChunkAlgorithms, E2EEAlgorithms, HashAlgorithms, MODE_AUTOMATIC, MODE_PAUSED, MODE_SELECTIVE, MODE_SHINY, RemoteTypes } from "./setting.const";
import type { I18N_LANGS } from "@lib/common/rosetta";
import type { CustomRegExpSourceList } from "./shared.type.util";
import type { JWTAlgorithm } from "./auth.type";
/**
* Represents the connection details required to connect to a CouchDB instance.
*/
export interface CouchDBConnection {
/**
* The URI of the CouchDB instance.
*/
couchDB_URI: string;
/**
* The username to use when connecting to the CouchDB instance.
*/
couchDB_USER: string;
/**
* The password to use when connecting to the CouchDB instance.
*/
couchDB_PASSWORD: string;
/**
* The name of the database to use.
*/
couchDB_DBNAME: string;
/**
* e.g. `x-some-header: some-value\n x-some-header2: some-value2`
*/
couchDB_CustomHeaders: string;
useJWT: boolean;
jwtAlgorithm: JWTAlgorithm;
jwtKey: string;
jwtKid: string;
jwtSub: string;
jwtExpDuration: number;
/**
* Use Request API to avoid `inevitable` CORS problem.
* Seems stable, so promoted to the normal setting.
*/
useRequestAPI: boolean;
}
/**
* Interface representing the settings for periodic replication.
*/
interface PeriodicReplicationSettings {
/**
* Indicates whether periodic replication is enabled.
*/
periodicReplication: boolean;
/**
* The interval, in milliseconds, at which periodic replication occurs.
*/
periodicReplicationInterval: number;
}
export type ConfigPassphraseStore = "" | "LOCALSTORAGE" | "ASK_AT_LAUNCH";
/**
* Represents the user settings that are encrypted.
*/
interface EncryptedUserSettings {
/**
* The store for the configuration passphrase.
*/
configPassphraseStore: ConfigPassphraseStore;
/**
* The encrypted passphrase used for E2EE.
*/
encryptedPassphrase: string;
/**
* The encrypted connection details for CouchDB.
*/
encryptedCouchDBConnection: string;
}
/**
* Interface representing the settings for different sync invocation methods.
*/
interface SyncMethodSettings {
/**
* Synchronise in Live. This is an exclusive setting against other sync methods.
*/
liveSync: boolean;
/**
* automatically run sync on save.
* File modification will trigger the sync, even if the file is not changed on the editor.
*/
syncOnSave: boolean;
/**
* automatically run sync on starting the plug-in.
*/
syncOnStart: boolean;
/**
* automatically run sync on opening a file.
*/
syncOnFileOpen: boolean;
/**
* automatically run sync on editor save.
* Different from syncOnSave, this is only reacts to the editor save event.
*/
syncOnEditorSave: boolean;
/**
* The minimum delay between synchronisation operations (in milliseconds).
* If the operation is triggered before this delay, the operation will be delayed until the delay is over, and executed as a single operation.
*/
syncMinimumInterval: number;
}
/**
* Interface representing the settings for file handling.
*/
interface FileHandlingSettings {
/**
* Use trash instead of actually delete.
*/
trashInsteadDelete: boolean;
/**
* Do not delete the folder even if it has got empty.
*/
doNotDeleteFolder: boolean;
/**
* Thinning out the changes and make a single change for the same file.
*/
batchSave: boolean;
batchSaveMinimumDelay: number;
batchSaveMaximumDelay: number;
/**
* Maximum size of the file to be synchronized (in MB).
*/
syncMaxSizeInMB: number;
/**
* Use ignore files.
*/
useIgnoreFiles: boolean;
/**
* Ignore files pattern, i,e, `.gitignore, .obsidianignore` (This should be separated by comma)
*/
ignoreFiles: string;
/**
* Do not prevent write if the size is mismatched.
*/
processSizeMismatchedFiles: boolean;
}
/**
* Interface representing the settings for Hidden File Sync.
*/
interface InternalFileSettings {
/**
* Synchronise internal files.
*/
syncInternalFiles: boolean;
/**
* Scan internal files before replication.
*/
syncInternalFilesBeforeReplication: boolean;
/**
* Interval for scanning internal files (in seconds).
*/
syncInternalFilesInterval: number;
/**
* Ignore patterns for internal files.
* (Comma separated list of regular expressions)
*/
syncInternalFilesIgnorePatterns: CustomRegExpSourceList<",">;
/**
* Limit patterns for internal files.
*/
syncInternalFilesTargetPatterns: CustomRegExpSourceList<",">;
/**
* Enable watch internal file changes (This option uses the unexposed API)
*/
watchInternalFileChanges: boolean;
/**
* Suppress notification of hidden files change.
*/
suppressNotifyHiddenFilesChange: boolean;
/**
* Overwrite instead of merging patterns for internal files.
*/
syncInternalFileOverwritePatterns: CustomRegExpSourceList<",">;
}
export type SYNC_MODE = typeof MODE_SELECTIVE | typeof MODE_AUTOMATIC | typeof MODE_PAUSED | typeof MODE_SHINY;
export interface PluginSyncSettingEntry {
key: string;
mode: SYNC_MODE;
files: string[];
}
/**
* Interface representing the settings for plugin synchronisation.
*/
interface PluginSyncSettings {
/**
* Indicates whether plugin synchronisation is enabled.
*/
usePluginSync: boolean;
/**
* Indicates whether plugin settings synchronisation is enabled.
*/
usePluginSettings: boolean;
/**
* Indicates whether to show the device's own plugins.
*/
showOwnPlugins: boolean;
/**
* Indicates whether to automatically scan plugins.
*/
autoSweepPlugins: boolean;
/**
* Indicates whether to periodically scan plugins automatically.
*/
autoSweepPluginsPeriodic: boolean;
/**
* Indicates whether to notify when a plugin or setting is updated.
*/
notifyPluginOrSettingUpdated: boolean;
/**
* The name of the device and vault.
* This is used to identify the device and vault among synchronised devices and vaults.
* Hence, this should be unique among devices and vaults.
*/
deviceAndVaultName: string;
/**
* Indicates whether the v2 of plugin synchronisation is enabled.
*/
usePluginSyncV2: boolean;
/**
* Indicates whether additional plugin synchronisation settings are enabled.
* This setting is hidden from the UI.
*/
usePluginEtc: boolean;
/**
* Extended settings for plugin synchronisation.
*/
pluginSyncExtendedSetting: Record<PluginSyncSettingEntry["key"], PluginSyncSettingEntry>;
}
/**
* Interface representing the user interface settings.
*/
interface UISettings {
/**
* Indicates whether verbose logging has been enabled.
*/
showVerboseLog: boolean;
/**
* Indicates whether less information should be shown in the log.
*/
lessInformationInLog: boolean;
/**
* Indicates whether longer status line should be shown inside the editor.
*/
showLongerLogInsideEditor: boolean;
/**
* Indicates whether the status line should be shown on the editor.
*/
showStatusOnEditor: boolean;
/**
* Indicates whether the status line should be shown on the status bar.
*/
showStatusOnStatusbar: boolean;
/**
* Indicates whether only icons instead of status line should be shown on the editor.
*/
showOnlyIconsOnEditor: boolean;
/**
* Hide File warning notice bar.
*/
hideFileWarningNotice: boolean;
/**
* How to display connection error warnings.
* "banner" shows the full banner, "icon" shows only an icon, "hidden" suppresses entirely.
*/
networkWarningStyle: "" | "icon" | "hidden";
/**
* The language to be used for display.
*/
displayLanguage: I18N_LANGS;
}
/**
* Interface representing the settings for mode of exposing advanced things.
*/
interface ModeSettings {
/**
* Indicates whether the advanced mode is enabled.
*/
useAdvancedMode: boolean;
/**
* Indicates whether the power user mode is enabled.
*/
usePowerUserMode: boolean;
/**
* Indicates whether the edge case mode is enabled.
*/
useEdgeCaseMode: boolean;
}
/**
* Interface representing the settings for debug mode.
*/
interface DebugModeSettings {
/**
* Indicates whether the debug tools of Self-hosted LiveSync are enabled.
*/
enableDebugTools: boolean;
/**
* Indicates whether to write log to the file.
*/
writeLogToTheFile: boolean;
}
/**
* Interface representing additional tweak settings.
*/
interface ExtraTweakSettings {
/**
* The threshold value for notifying about the size of remote storage.
* When the size of the remote storage exceeds this threshold, a notification will be triggered.
*/
notifyThresholdOfRemoteStorageSize: number;
}
/**
* Interface representing the settings for beta tweaks.
*/
interface BetaTweakSettings {
/**
* Indicates whether to disable the WebWorker for generating chunks.
*/
disableWorkerForGeneratingChunks: boolean;
/**
* Indicates whether to process small files in the UI thread.
*/
processSmallFilesInUIThread: boolean;
}
/**
* Interface representing the settings for synchronising settings via file.
*/
interface SettingSyncSettings {
/**
* The file path where the settings is stored.
*/
settingSyncFile: string;
/**
* Indicates whether to write credentials for settings synchronising.
*/
writeCredentialsForSettingSync: boolean;
/**
* Indicates whether to notify all settings synchronising files events.
*/
notifyAllSettingSyncFile: boolean;
}
/**
* Represents settings that are considered obsolete and are not configurable from the UI.
*/
interface ObsoleteSettings {
/**
* Saving delay (in milliseconds).
*/
savingDelay: number;
/**
* Garbage collection delay (in milliseconds). Now, no longer GC is implemented.
*/
gcDelay: number;
/**
* Skip older files on sync. No effect now.
*/
skipOlderFilesOnSync: boolean;
/**
* Use the IndexedDB adapter. Now always true. Should be.
*/
useIndexedDBAdapter: boolean;
}
/**
* Interface representing some data stored in the settings for the plugin.
*/
interface DataOnSettings {
/**
* VersionUp flash message which is shown when some incompatible changes are made during the update.
*/
versionUpFlash: string;
/**
* Setting file version, to migrate the settings.
*/
settingVersion: number;
/**
* Indicates whether the setting of the plug-in is configured once.
*/
isConfigured?: boolean;
/**
* The user-last-read version number.
*/
lastReadUpdates: number;
/**
* The last checked version by the doctor.
*/
doctorProcessedVersion: string;
}
/**
* Interface representing the settings for a safety valve mechanism.
*/
interface SafetyValveSettings {
/**
* Indicates whether file watching should be suspended.
*/
suspendFileWatching: boolean;
/**
* Indicates whether parsing and reflecting of replication results should be suspended.
*/
suspendParseReplicationResult: boolean;
/**
* Indicates whether suspension should be avoided during fetching operations.
*/
doNotSuspendOnFetching: boolean;
/**
* Maximum file modification time applied to reflected file events
*/
maxMTimeForReflectEvents: number;
}
/**
* Represents the settings required to synchronise with a bucket.
*/
export interface BucketSyncSetting {
/**
* The access key to use when connecting to the bucket.
*/
accessKey: string;
/**
* The secret to use when connecting to the bucket.
*/
secretKey: string;
/**
* The name of bucket to use.
*/
bucket: string;
/**
* The region of the bucket.
*/
region: string;
/**
* The endpoint of the bucket.
*/
endpoint: string;
/**
* Indicates whether to use a custom request handler.
* (This is for CORS issue).
*/
useCustomRequestHandler: boolean;
bucketCustomHeaders: string;
/**
* The prefix to use for the bucket (e.g., "my-bucket/", means mostly like a folder).
*/
bucketPrefix: string;
/**
* Indicates whether to force path style access.
*/
forcePathStyle: boolean;
}
export interface LocalDBSettings {
/**
* Indicates whether to use the IndexedDB adapter for the local database.
* @deprecated
*/
useIndexedDBAdapter: boolean;
}
export type RemoteType = (typeof RemoteTypes)[keyof typeof RemoteTypes];
export declare enum AutoAccepting {
NONE = 0,
ALL = 1
}
export interface P2PConnectionInfo {
/**
* Indicates whether P2P connection is enabled.
*/
P2P_Enabled: boolean;
/**
* Nostr relay server URL. (Comma separated list)
* This is only for the channelling server to establish for the P2P connection.
* No data is transferred through this server.
*/
P2P_relays: string;
/**
* The room ID for `your devices`. This should be unique among the users.
* (Or, lines will be got mixed up).
*/
P2P_roomID: string;
/**
* The passphrase for your devices.
* It can be empty, but it will help you if you have a duplicate Room ID.
*/
P2P_passphrase: string;
/**
* The Application ID for the P2P connection.
* This is used to identify the application using the P2P network.
* In Self-hosted LiveSync, fixed to "self-hosted-livesync".
*/
P2P_AppID: string;
/**
* Indicates whether to auto-start the P2P connection on launch.
*/
P2P_AutoStart: boolean;
/**
* Indicates whether to automatically broadcast changes to connected peers.
*/
P2P_AutoBroadcast: boolean;
/**
* The name of the device peer (This only for editing-setting purpose, not saved in the actual setting file, due to avoid setting-sync issues).
*/
P2P_DevicePeerName?: string;
/**
* The TURN server URLs for the P2P connection. (Comma separated list)
*/
P2P_turnServers: string;
/**
* The TURN username for the P2P connection.
*/
P2P_turnUsername: string;
/**
* The TURN credential (password, secret, etc...) for the P2P connection.
*/
P2P_turnCredential: string;
/**
* Use Diagnostic Wrapper for RTCPeerConnection to collect statistics.
*/
P2P_useDiagRTC?: boolean;
}
export interface P2PSyncSetting extends P2PConnectionInfo {
P2P_AutoAccepting: AutoAccepting;
P2P_AutoSyncPeers: string;
P2P_AutoWatchPeers: string;
P2P_SyncOnReplication: string;
P2P_RebuildFrom: string;
P2P_AutoAcceptingPeers: string;
P2P_AutoDenyingPeers: string;
P2P_IsHeadless?: boolean;
}
/**
* Interface representing the settings for a remote type.
*/
export interface RemoteTypeSettings {
/**
* The type of the remote.
*/
remoteType: RemoteType;
}
export type E2EEAlgorithm = (typeof E2EEAlgorithms)[keyof typeof E2EEAlgorithms] | "";
/**
* Represents the settings used for End-to-End encryption.
*/
export interface EncryptionSettings {
/**
* Indicates whether E2EE is enabled.
*/
encrypt: boolean;
/**
* The passphrase used for E2EE.
*/
passphrase: string;
/**
* Indicates whether path obfuscation is used.
* If not, the path will be stored as it is, as the document ID.
*/
usePathObfuscation: boolean;
/**
* The algorithm used for hashing the passphrase.
* This is used for E2EE.
*/
E2EEAlgorithm: E2EEAlgorithm;
}
export type HashAlgorithm = (typeof HashAlgorithms)[keyof typeof HashAlgorithms];
export type ChunkSplitterVersion = (typeof ChunkAlgorithms)[keyof typeof ChunkAlgorithms] | "";
/**
* Interface representing the settings for chunk processing.
*/
interface ChunkSettings {
/**
* The algorithm used for hashing chunks.
*/
hashAlg: HashAlgorithm;
/**
* The minimum size of a chunk in chars.
*/
minimumChunkSize: number;
/**
* The custom size of a chunk.
* Note: This value used as a coefficient for the normal chunk size.
*/
customChunkSize: number;
/**
* The threshold for considering a line as long.
* (Not respected in v0.24.x).
*/
longLineThreshold: number;
/**
* Flag indicating whether to use a segmenter for chunking.
* @deprecated use chunkSplitterVersion instead.
*/
useSegmenter: boolean;
/**
* Flag indicating whether to enable version 2 of the chunk splitter.
* @deprecated use chunkSplitterVersion instead.
*/
enableChunkSplitterV2: boolean;
/**
* Flag indicating whether to avoid using a fixed revision for chunks.
*/
doNotUseFixedRevisionForChunks: boolean;
/**
* The version of the chunk splitter to use.
*/
chunkSplitterVersion: ChunkSplitterVersion;
}
/**
* Settings for on-demand chunk fetching.
*/
interface OnDemandChunkSettings {
/**
* Indicates whether chunks should be fetch online. (means replication transfers only metadata).
*/
readChunksOnline: boolean;
/**
* Indicates whether to use only local chunks without fetching online.
*/
useOnlyLocalChunk: boolean;
/**
* The number of concurrent chunk reads allowed when fetching online.
*/
concurrencyOfReadChunksOnline: number;
/**
* The minimum interval (in milliseconds) between consecutive online chunk fetching.
*/
minimumIntervalOfReadChunksOnline: number;
}
/**
* Configuration settings for Eden.
*/
interface EdenSettings {
/**
* Indicates whether Eden is enabled.
*/
useEden: boolean;
/**
* The maximum number of chunks allowed in Eden.
*/
maxChunksInEden: number;
/**
* The maximum total length allowed in Eden.
*/
maxTotalLengthInEden: number;
/**
* The maximum age allowed in Eden.
*/
maxAgeInEden: number;
}
/**
* Interface representing obsolete settings for an remote database.
*/
interface ObsoleteRemoteDBSettings {
/**
* Indicates whether to check the integrity of the data on save.
*/
checkIntegrityOnSave: boolean;
/**
* Indicates whether to use history tracking.
* (Now always true)
*/
useHistory: boolean;
/**
* Indicates whether to disable using API of Obsidian.
* (Now always true: Note: Obsidian cannot handle multiple requests at the same time).
*/
disableRequestURI: boolean;
/**
* Indicates whether to send data in bulk chunks.
*/
sendChunksBulk: boolean;
/**
* The maximum size of the bulk chunks to be sent.
*/
sendChunksBulkMaxSize: number;
/**
* Indicates whether to use a dynamic iteration count.
*/
useDynamicIterationCount: boolean;
/**
* Indicates weather to pace the replication processing interval.
* Now (v0.24.x) not be respected.
*/
doNotPaceReplication: boolean;
}
/**
* Interface representing the settings for beta tweaks for the remote database.
*/
interface BetaRemoteDBSettings {
/**
* Indicates whether compression is enabled for the remote database.
*/
enableCompression: boolean;
}
/**
* Interface representing the some data stored on the settings.
*/
interface DataOnRemoteDBSettings {
/**
* VersionUp flash message which is shown when some incompatible changes are made during the update.
*/
versionUpFlash: string;
/**
* Unix timestamp (ms) of the latest tweak update.
* Used to determine which side has newer tweak values.
*/
tweakModified: number | undefined;
}
/**
* Interface representing the settings for replication.
*/
interface ReplicationSetting {
/**
* The maximum number of documents to be processed in a batch.
*/
batch_size: number;
/**
* The maximum number of batches to be processed.
*/
batches_limit: number;
}
/**
* Interface representing the settings for targetting files.
*/
interface FileHandlingSettings {
/**
* The regular expression for files to be synchronised.
*/
syncOnlyRegEx: CustomRegExpSourceList<"|[]|">;
/**
* The regular expression for files to be ignored during synchronisation.
*/
syncIgnoreRegEx: CustomRegExpSourceList<"|[]|">;
}
/**
* Interface representing the settings for processing behaviour.
*/
interface ProcessingBehaviourSettings {
/**
* Hash cache maximum count.
*/
hashCacheMaxCount: number;
/**
* Hash cache maximum amount.
*/
hashCacheMaxAmount: number;
}
/**
* Interface representing the settings for remote database tweaks.
*/
interface RemoteDBTweakSettings {
/**
* Indicates whether to ignore the version check.
*/
ignoreVersionCheck: boolean;
/**
* Indicates whether to ignore and continue syncing even if the configuration-mismatch is detected.
* (Note: Mismatched settings can lead to inappropriate de-duplication, leading to storage wastage and increased traffic).
*/
disableCheckingConfigMismatch: boolean;
/**
* Automatically accepts compatible-but-lossy tweak mismatches.
* If undefined, the feature is not configured yet.
*/
autoAcceptCompatibleTweak: boolean | undefined;
}
/**
* Interface representing the settings for optional and not exposed remote database settings.
*/
interface OptionalAndNotExposedRemoteDBSettings {
/**
* Indicates whether to accept empty passphrase.
* This not meant to `Not be encrypted`, but `Be encrypted with empty passphrase`.
*/
permitEmptyPassphrase: boolean;
}
/**
* Interface representing the settings for cross-platform interoperability.
*/
interface CrossPlatformInteroperabilitySettings {
/**
* Indicates whether to handle filename case sensitively.
*/
handleFilenameCaseSensitive: boolean;
}
/**
* Interface representing the settings for conflict handling.
*/
interface ConflictHandlingSettings {
/**
* Indicates whether to check conflicts only on file open.
*/
checkConflictOnlyOnOpen: boolean;
/**
* Indicates whether to show the merge dialog only on active file.
*/
showMergeDialogOnlyOnActive: boolean;
}
/**
* Settings that define the behavior of the merge process.
*/
interface MergeBehaviourSettings {
/**
* Indicates whether to synchronise after merging.
*/
syncAfterMerge: boolean;
/**
* Determines if conflicts should be resolved by choosing the newer file.
*/
resolveConflictsByNewerFile: boolean;
/**
* Specifies whether to write documents even if there are conflicts.
*/
writeDocumentsIfConflicted: boolean;
/**
* Disables automatic merging of markdown files.
*/
disableMarkdownAutoMerge: boolean;
}
/**
* Configuration settings for handling edge cases in the application.
*/
interface EdgeCaseHandlingSettings {
/**
* An optional suffix to append to the database name after the vault name.
*/
additionalSuffixOfDatabaseName: string | undefined;
/**
* Flag to disable the worker thread for generating chunks.
*/
disableWorkerForGeneratingChunks: boolean;
/**
* Flag to process small files in the UI thread instead of a worker thread.
*/
processSmallFilesInUIThread: boolean;
/**
* Indicates whether to use timeout for PouchDB replication.
*/
useTimeouts: boolean;
}
/**
* Configuration settings for handling deleted files.
*/
interface DeletedFileMetadataSettings {
/**
* Indicates whether to delete metadata of deleted files.
*/
deleteMetadataOfDeletedFiles: boolean;
/**
* The number of days to wait before automatically deleting metadata of deleted files.
*/
automaticallyDeleteMetadataOfDeletedFiles: number;
}
/**
* Represents a single remote configuration.
*/
export interface RemoteConfiguration {
/**
* Unique identifier for this configuration.
*/
id: string;
/**
* Display name for the configuration.
*/
name: string;
/**
* The connection string (URI) for the remote.
* This may be an encrypted string if configPassphraseStore is set.
*/
uri: string;
/**
* Indicates whether this configuration is encrypted.
*/
isEncrypted: boolean;
}
export interface RemoteConfigurations {
/**
* The list of remote configurations.
*/
remoteConfigurations: Record<string, RemoteConfiguration>;
/**
* The ID of the currently active remote configuration.
*/
activeConfigurationId: string;
/**
* The ID of the active remote configuration dedicated for P2P features.
* If empty, P2P features should request explicit selection from the user.
*/
P2P_ActiveRemoteConfigurationId: string;
}
interface ObsidianLiveSyncSettings_PluginSetting extends SyncMethodSettings, UISettings, FileHandlingSettings, MergeBehaviourSettings, EncryptedUserSettings, PeriodicReplicationSettings, InternalFileSettings, PluginSyncSettings, ModeSettings, ExtraTweakSettings, BetaTweakSettings, ObsoleteSettings, DebugModeSettings, SettingSyncSettings, SafetyValveSettings, DataOnSettings, RemoteConfigurations {
}
export type RemoteDBSettings = CouchDBConnection & BucketSyncSetting & RemoteTypeSettings & EncryptionSettings & ChunkSettings & EdenSettings & DataOnRemoteDBSettings & ObsoleteRemoteDBSettings & OnDemandChunkSettings & BetaRemoteDBSettings & ReplicationSetting & RemoteDBTweakSettings & FileHandlingSettings & ProcessingBehaviourSettings & OptionalAndNotExposedRemoteDBSettings & CrossPlatformInteroperabilitySettings & ConflictHandlingSettings & EdgeCaseHandlingSettings & DeletedFileMetadataSettings & P2PSyncSetting & RemoteConfigurations;
export type ObsidianLiveSyncSettings = ObsidianLiveSyncSettings_PluginSetting & RemoteDBSettings & LocalDBSettings;
export interface HasSettings<T extends Partial<ObsidianLiveSyncSettings>> {
settings: T;
}
export {};
@@ -0,0 +1,28 @@
export declare const MAX_DOC_SIZE = 1000;
export declare const MAX_DOC_SIZE_BIN = 102400;
export declare const VER = 12;
export declare const RECENT_MODIFIED_DOCS_QTY = 30;
export declare const LEAF_WAIT_TIMEOUT = 30000;
export declare const LEAF_WAIT_ONLY_REMOTE = 5000;
export declare const LEAF_WAIT_TIMEOUT_SEQUENTIAL_REPLICATOR = 5000;
export declare const REPLICATION_BUSY_TIMEOUT = 3000000;
export declare const SALT_OF_PASSPHRASE = "rHGMPtr6oWw7VSa3W3wpa8fT8U";
export declare const SALT_OF_ID = "a83hrf7f\u0003y7sa8g31";
export declare const SEED_MURMURHASH = 305419896;
export declare const IDPrefixes: {
Obfuscated: string;
Chunk: string;
EncryptedChunk: string;
};
/**
* @deprecated Use `IDPrefixes.Obfuscated` instead.
*/
export declare const PREFIX_OBFUSCATED = "f:";
/**
* @deprecated Use `IDPrefixes.Chunk` instead.
*/
export declare const PREFIX_CHUNK = "h:";
/**
* @deprecated Use `IDPrefixes.EncryptedChunk` instead.
*/
export declare const PREFIX_ENCRYPTED_CHUNK = "h:+";
+5
View File
@@ -0,0 +1,5 @@
export declare const SETTING_KEY_P2P_DEVICE_NAME = "p2p_device_name";
export declare const configURIBase = "obsidian://setuplivesync?settings=";
export declare const configURIBaseQR = "obsidian://setuplivesync?settingsQR=";
export declare const SuffixDatabaseName = "-livesync-v2";
export declare const ExtraSuffixIndexedDB = "-indexeddb";
@@ -0,0 +1,9 @@
export declare const CANCELLED: unique symbol;
export declare const AUTO_MERGED: unique symbol;
export declare const NOT_CONFLICTED: unique symbol;
export declare const MISSING_OR_ERROR: unique symbol;
export declare const LEAVE_TO_SUBSEQUENT: unique symbol;
export declare const TIME_ARGUMENT_INFINITY: unique symbol;
export declare const BASE_IS_NEW: unique symbol;
export declare const TARGET_IS_NEW: unique symbol;
export declare const EVEN: unique symbol;
@@ -0,0 +1,36 @@
import type { ObsidianLiveSyncSettings } from "./setting.type";
export declare const LEVEL_ADVANCED = "ADVANCED";
export declare const LEVEL_POWER_USER = "POWER_USER";
export declare const LEVEL_EDGE_CASE = "EDGE_CASE";
export type ConfigLevel = "" | "ADVANCED" | "POWER_USER" | "EDGE_CASE";
export type ConfigurationItem = {
name: string;
desc?: string;
placeHolder?: string;
status?: "BETA" | "ALPHA" | "EXPERIMENTAL";
obsolete?: boolean;
level?: ConfigLevel;
isHidden?: boolean;
isAdvanced?: boolean;
};
export declare const configurationNames: Partial<Record<keyof ObsidianLiveSyncSettings, ConfigurationItem>>;
/**
* Get human readable Configuration stability
* @param status
* @returns
*/
export declare function statusDisplay(status?: string): string;
/**
* Get human readable configuration name.
* @param key configuration key
* @param alt
* @returns
*/
export declare function confName(key: keyof ObsidianLiveSyncSettings, alt?: string): string;
/**
* Get human readable configuration description.
* @param key configuration key
* @param alt
* @returns
*/
export declare function confDesc(key: keyof ObsidianLiveSyncSettings, alt?: string): string | undefined;
+22
View File
@@ -0,0 +1,22 @@
export declare const DatabaseConnectingStatuses: {
readonly STARTED: "STARTED";
readonly NOT_CONNECTED: "NOT_CONNECTED";
readonly PAUSED: "PAUSED";
readonly CONNECTED: "CONNECTED";
readonly COMPLETED: "COMPLETED";
readonly CLOSED: "CLOSED";
readonly ERRORED: "ERRORED";
readonly JOURNAL_SEND: "JOURNAL_SEND";
readonly JOURNAL_RECEIVE: "JOURNAL_RECEIVE";
};
export type DatabaseConnectingStatus = (typeof DatabaseConnectingStatuses)[keyof typeof DatabaseConnectingStatuses];
export type ReplicationStatics = {
sent: number;
arrived: number;
maxPullSeq: number;
maxPushSeq: number;
lastSyncPullSeq: number;
lastSyncPushSeq: number;
syncStatus: DatabaseConnectingStatus;
};
export declare const DEFAULT_REPLICATION_STATICS: ReplicationStatics;
@@ -0,0 +1,8 @@
import type { TaggedType } from "octagonal-wheels/common/types";
export type { TaggedType };
export type CustomRegExpSource = TaggedType<string, "CustomRegExp">;
export type CustomRegExpSourceList<D extends string = ","> = TaggedType<string, `CustomRegExpList${D}`>;
export type ParsedCustomRegExp = [isInverted: boolean, pattern: string];
export type Prettify<T> = {
[K in keyof T]: T[K];
} & {};
+18
View File
@@ -0,0 +1,18 @@
import { EntryTypes } from "./db.const";
import type { DatabaseEntry, DocumentID } from "./db.type";
export declare const ProtocolVersions: {
readonly UNSET: undefined;
readonly LEGACY: 1;
readonly ADVANCED_E2EE: 2;
};
export type ProtocolVersion = (typeof ProtocolVersions)[keyof typeof ProtocolVersions];
export declare const DOCID_SYNC_PARAMETERS: DocumentID;
export declare const DOCID_JOURNAL_SYNC_PARAMETERS: DocumentID;
export interface SyncParameters extends DatabaseEntry {
_id: typeof DOCID_SYNC_PARAMETERS;
_rev?: string;
type: (typeof EntryTypes)["SYNC_PARAMETERS"];
protocolVersion: ProtocolVersion;
pbkdf2salt: string;
}
export declare const DEFAULT_SYNC_PARAMETERS: SyncParameters;
+190
View File
@@ -0,0 +1,190 @@
import type { ObsidianLiveSyncSettings } from "./setting.type";
export declare const TweakValuesShouldMatchedTemplate: Partial<ObsidianLiveSyncSettings>;
type TweakKeys = keyof TweakValues;
export declare const IncompatibleChanges: TweakKeys[];
export declare const CompatibleButLossyChanges: TweakKeys[];
type IncompatibleRecommendationPatterns<T extends TweakKeys> = {
key: T;
isRecommendation?: boolean;
} & ({
from: TweakValues[T];
to: TweakValues[T];
} | {
from: TweakValues[T];
} | {
to: TweakValues[T];
});
export declare const IncompatibleChangesInSpecificPattern: IncompatibleRecommendationPatterns<TweakKeys>[];
export declare const TweakValuesRecommendedTemplate: Partial<ObsidianLiveSyncSettings>;
export declare const TweakValuesDefault: Partial<ObsidianLiveSyncSettings>;
export declare const TweakValuesTemplate: {
tweakModified: number;
liveSync?: boolean | undefined;
syncOnSave?: boolean | undefined;
syncOnStart?: boolean | undefined;
syncOnFileOpen?: boolean | undefined;
syncOnEditorSave?: boolean | undefined;
syncMinimumInterval?: number | undefined;
showVerboseLog?: boolean | undefined;
lessInformationInLog?: boolean | undefined;
showLongerLogInsideEditor?: boolean | undefined;
showStatusOnEditor?: boolean | undefined;
showStatusOnStatusbar?: boolean | undefined;
showOnlyIconsOnEditor?: boolean | undefined;
hideFileWarningNotice?: boolean | undefined;
networkWarningStyle?: "" | "icon" | "hidden" | undefined;
displayLanguage?: import("../rosetta").I18N_LANGS | undefined;
trashInsteadDelete?: boolean | undefined;
doNotDeleteFolder?: boolean | undefined;
batchSave?: boolean | undefined;
batchSaveMinimumDelay?: number | undefined;
batchSaveMaximumDelay?: number | undefined;
syncMaxSizeInMB?: number | undefined;
useIgnoreFiles?: boolean | undefined;
ignoreFiles?: string | undefined;
processSizeMismatchedFiles?: boolean | undefined;
syncOnlyRegEx?: import("./shared.type.util").CustomRegExpSourceList<"|[]|"> | undefined;
syncIgnoreRegEx?: import("./shared.type.util").CustomRegExpSourceList<"|[]|"> | undefined;
syncAfterMerge?: boolean | undefined;
resolveConflictsByNewerFile?: boolean | undefined;
writeDocumentsIfConflicted?: boolean | undefined;
disableMarkdownAutoMerge?: boolean | undefined;
configPassphraseStore?: import("./setting.type").ConfigPassphraseStore | undefined;
encryptedPassphrase?: string | undefined;
encryptedCouchDBConnection?: string | undefined;
periodicReplication?: boolean | undefined;
periodicReplicationInterval?: number | undefined;
syncInternalFiles?: boolean | undefined;
syncInternalFilesBeforeReplication?: boolean | undefined;
syncInternalFilesInterval?: number | undefined;
syncInternalFilesIgnorePatterns?: import("./shared.type.util").CustomRegExpSourceList<","> | undefined;
syncInternalFilesTargetPatterns?: import("./shared.type.util").CustomRegExpSourceList<","> | undefined;
watchInternalFileChanges?: boolean | undefined;
suppressNotifyHiddenFilesChange?: boolean | undefined;
syncInternalFileOverwritePatterns?: import("./shared.type.util").CustomRegExpSourceList<","> | undefined;
usePluginSync?: boolean | undefined;
usePluginSettings?: boolean | undefined;
showOwnPlugins?: boolean | undefined;
autoSweepPlugins?: boolean | undefined;
autoSweepPluginsPeriodic?: boolean | undefined;
notifyPluginOrSettingUpdated?: boolean | undefined;
deviceAndVaultName?: string | undefined;
usePluginSyncV2?: boolean | undefined;
usePluginEtc?: boolean | undefined;
pluginSyncExtendedSetting?: Record<string, import("./setting.type").PluginSyncSettingEntry> | undefined;
useAdvancedMode?: boolean | undefined;
usePowerUserMode?: boolean | undefined;
useEdgeCaseMode?: boolean | undefined;
notifyThresholdOfRemoteStorageSize?: number | undefined;
disableWorkerForGeneratingChunks?: boolean | undefined;
processSmallFilesInUIThread?: boolean | undefined;
savingDelay?: number | undefined;
gcDelay?: number | undefined;
skipOlderFilesOnSync?: boolean | undefined;
useIndexedDBAdapter?: boolean | undefined;
enableDebugTools?: boolean | undefined;
writeLogToTheFile?: boolean | undefined;
settingSyncFile?: string | undefined;
writeCredentialsForSettingSync?: boolean | undefined;
notifyAllSettingSyncFile?: boolean | undefined;
suspendFileWatching?: boolean | undefined;
suspendParseReplicationResult?: boolean | undefined;
doNotSuspendOnFetching?: boolean | undefined;
maxMTimeForReflectEvents?: number | undefined;
versionUpFlash?: string | undefined;
settingVersion?: number | undefined;
isConfigured?: boolean;
lastReadUpdates?: number | undefined;
doctorProcessedVersion?: string | undefined;
remoteConfigurations?: Record<string, import("./setting.type").RemoteConfiguration> | undefined;
activeConfigurationId?: string | undefined;
P2P_ActiveRemoteConfigurationId?: string | undefined;
couchDB_URI?: string | undefined;
couchDB_USER?: string | undefined;
couchDB_PASSWORD?: string | undefined;
couchDB_DBNAME?: string | undefined;
couchDB_CustomHeaders?: string | undefined;
useJWT?: boolean | undefined;
jwtAlgorithm?: import("./auth.type").JWTAlgorithm | undefined;
jwtKey?: string | undefined;
jwtKid?: string | undefined;
jwtSub?: string | undefined;
jwtExpDuration?: number | undefined;
useRequestAPI?: boolean | undefined;
accessKey?: string | undefined;
secretKey?: string | undefined;
bucket?: string | undefined;
region?: string | undefined;
endpoint?: string | undefined;
useCustomRequestHandler?: boolean | undefined;
bucketCustomHeaders?: string | undefined;
bucketPrefix?: string | undefined;
forcePathStyle?: boolean | undefined;
remoteType?: import("./setting.type").RemoteType | undefined;
encrypt?: boolean | undefined;
passphrase?: string | undefined;
usePathObfuscation?: boolean | undefined;
E2EEAlgorithm?: import("./setting.type").E2EEAlgorithm | undefined;
hashAlg?: import("./setting.type").HashAlgorithm | undefined;
minimumChunkSize?: number | undefined;
customChunkSize?: number | undefined;
longLineThreshold?: number | undefined;
useSegmenter?: boolean | undefined;
enableChunkSplitterV2?: boolean | undefined;
doNotUseFixedRevisionForChunks?: boolean | undefined;
chunkSplitterVersion?: import("./setting.type").ChunkSplitterVersion | undefined;
useEden?: boolean | undefined;
maxChunksInEden?: number | undefined;
maxTotalLengthInEden?: number | undefined;
maxAgeInEden?: number | undefined;
checkIntegrityOnSave?: boolean | undefined;
useHistory?: boolean | undefined;
disableRequestURI?: boolean | undefined;
sendChunksBulk?: boolean | undefined;
sendChunksBulkMaxSize?: number | undefined;
useDynamicIterationCount?: boolean | undefined;
doNotPaceReplication?: boolean | undefined;
readChunksOnline?: boolean | undefined;
useOnlyLocalChunk?: boolean | undefined;
concurrencyOfReadChunksOnline?: number | undefined;
minimumIntervalOfReadChunksOnline?: number | undefined;
enableCompression?: boolean | undefined;
batch_size?: number | undefined;
batches_limit?: number | undefined;
ignoreVersionCheck?: boolean | undefined;
disableCheckingConfigMismatch?: boolean | undefined;
autoAcceptCompatibleTweak?: boolean | undefined;
hashCacheMaxCount?: number | undefined;
hashCacheMaxAmount?: number | undefined;
permitEmptyPassphrase?: boolean | undefined;
handleFilenameCaseSensitive?: boolean | undefined;
checkConflictOnlyOnOpen?: boolean | undefined;
showMergeDialogOnlyOnActive?: boolean | undefined;
additionalSuffixOfDatabaseName?: string | undefined;
useTimeouts?: boolean | undefined;
deleteMetadataOfDeletedFiles?: boolean | undefined;
automaticallyDeleteMetadataOfDeletedFiles?: number | undefined;
P2P_AutoAccepting?: import("./setting.type").AutoAccepting | undefined;
P2P_AutoSyncPeers?: string | undefined;
P2P_AutoWatchPeers?: string | undefined;
P2P_SyncOnReplication?: string | undefined;
P2P_RebuildFrom?: string | undefined;
P2P_AutoAcceptingPeers?: string | undefined;
P2P_AutoDenyingPeers?: string | undefined;
P2P_IsHeadless?: boolean;
P2P_Enabled?: boolean | undefined;
P2P_relays?: string | undefined;
P2P_roomID?: string | undefined;
P2P_passphrase?: string | undefined;
P2P_AppID?: string | undefined;
P2P_AutoStart?: boolean | undefined;
P2P_AutoBroadcast?: boolean | undefined;
P2P_DevicePeerName?: string;
P2P_turnServers?: string | undefined;
P2P_turnUsername?: string | undefined;
P2P_turnCredential?: string | undefined;
P2P_useDiagRTC?: boolean;
};
export type TweakValues = Partial<typeof TweakValuesTemplate>;
export declare const DEVICE_ID_PREFERRED = "PREFERRED";
export {};
+42
View File
@@ -0,0 +1,42 @@
/**
# Rosetta stone
- To localise messages to your language, please write a translation to this file and submit a PR.
- Please order languages in alphabetic order, if you write multiple items.
## Notice to ensure that your favours are not wasted.
If you plan to utilise machine translation engines to contribute translated resources,
please ensure the engine's terms of service are compatible with our project's license.
Your diligence in this matter helps maintain compliance and avoid potential licensing issues.
Thank you for your consideration.
Usually, our projects (Self-hosted LiveSync and its families) are licensed under MIT License.
To see details, please refer to the LICENSES file on each repository.
## How to internationalise untranslated items?
1. Change the message literal to use `$msg`
"Could not parse YAML" -> $msg('anyKey')
2. Create `ls-debug` folder under the `.obsidian` folder of your vault.
3. Run Self-hosted LiveSync in dev mode (npm run dev).
4. You will get the `missing-translation-YYYY-MM-DD.jsonl` under `ls-debug`. Please copy and paste inside `allMessages` and write the translations.
5. Send me the PR!
*/
declare const LANG_DE = "de";
declare const LANG_ES = "es";
declare const LANG_FR = "fr";
declare const LANG_HE = "he";
declare const LANG_JA = "ja";
declare const LANG_RU = "ru";
declare const LANG_ZH = "zh";
declare const LANG_KO = "ko";
declare const LANG_ZH_TW = "zh-tw";
declare const LANG_DEF = "def";
export declare const SUPPORTED_I18N_LANGS: string[];
export type I18N_LANGS = typeof LANG_DEF | typeof LANG_DE | typeof LANG_ES | typeof LANG_FR | typeof LANG_HE | typeof LANG_JA | typeof LANG_KO | typeof LANG_RU | typeof LANG_ZH | typeof LANG_ZH_TW | "";
export type MESSAGE = {
[key in I18N_LANGS]?: string;
};
import { type MessageKeys } from "./messages/combinedMessages.dev";
export declare function expandKeywords<T extends Record<string, U>, U extends Record<string, string>>(message: T, lang: I18N_LANGS, recurseLimit?: number): T;
export type AllMessageKeys = MessageKeys;
export {};
+215
View File
@@ -0,0 +1,215 @@
import type { ConfigurationItem } from "@lib/common/models/shared.definition.configNames";
import type { ObsidianLiveSyncSettings } from "@lib/common/models/setting.type";
type ExtractPropertiesByType<T, U> = {
[K in keyof T as T[K] extends U ? K : never]: T[K] extends U ? K : never;
};
export type FilterStringKeys<T> = keyof ExtractPropertiesByType<T, string | undefined>;
export type FilterBooleanKeys<T> = keyof ExtractPropertiesByType<T, boolean | undefined>;
export type FilterNumberKeys<T> = keyof ExtractPropertiesByType<T, number | undefined>;
import type { FilePath, FilePathWithPrefixLC, FilePathWithPrefix, DocumentID } from "./models/db.type.ts";
export type { FilePath, FilePathWithPrefixLC, FilePathWithPrefix, DocumentID };
/**
* Self-hosted LiveSync settings pane items.
*/
export type OnDialogSettings = {
configPassphrase: string;
preset: "" | "PERIODIC" | "LIVESYNC" | "DISABLE";
syncMode: "ONEVENTS" | "PERIODIC" | "LIVESYNC";
dummy: number;
deviceAndVaultName: string;
};
/**
* Default settings for the OnDialogSettings.
* Not used for the common library, but used for the Obsidian plugin.
*/
export declare const OnDialogSettingsDefault: OnDialogSettings;
export declare const AllSettingDefault: {
configPassphrase: string;
preset: "" | "PERIODIC" | "LIVESYNC" | "DISABLE";
syncMode: "ONEVENTS" | "PERIODIC" | "LIVESYNC";
dummy: number;
deviceAndVaultName: string;
liveSync: boolean;
syncOnSave: boolean;
syncOnStart: boolean;
syncOnFileOpen: boolean;
syncOnEditorSave: boolean;
syncMinimumInterval: number;
showVerboseLog: boolean;
lessInformationInLog: boolean;
showLongerLogInsideEditor: boolean;
showStatusOnEditor: boolean;
showStatusOnStatusbar: boolean;
showOnlyIconsOnEditor: boolean;
hideFileWarningNotice: boolean;
networkWarningStyle: "" | "icon" | "hidden";
displayLanguage: import("./rosetta.ts").I18N_LANGS;
trashInsteadDelete: boolean;
doNotDeleteFolder: boolean;
batchSave: boolean;
batchSaveMinimumDelay: number;
batchSaveMaximumDelay: number;
syncMaxSizeInMB: number;
useIgnoreFiles: boolean;
ignoreFiles: string;
processSizeMismatchedFiles: boolean;
syncOnlyRegEx: import("./types.ts").CustomRegExpSourceList<"|[]|">;
syncIgnoreRegEx: import("./types.ts").CustomRegExpSourceList<"|[]|">;
syncAfterMerge: boolean;
resolveConflictsByNewerFile: boolean;
writeDocumentsIfConflicted: boolean;
disableMarkdownAutoMerge: boolean;
configPassphraseStore: import("@lib/common/models/setting.type").ConfigPassphraseStore;
encryptedPassphrase: string;
encryptedCouchDBConnection: string;
periodicReplication: boolean;
periodicReplicationInterval: number;
syncInternalFiles: boolean;
syncInternalFilesBeforeReplication: boolean;
syncInternalFilesInterval: number;
syncInternalFilesIgnorePatterns: import("./types.ts").CustomRegExpSourceList<",">;
syncInternalFilesTargetPatterns: import("./types.ts").CustomRegExpSourceList<",">;
watchInternalFileChanges: boolean;
suppressNotifyHiddenFilesChange: boolean;
syncInternalFileOverwritePatterns: import("./types.ts").CustomRegExpSourceList<",">;
usePluginSync: boolean;
usePluginSettings: boolean;
showOwnPlugins: boolean;
autoSweepPlugins: boolean;
autoSweepPluginsPeriodic: boolean;
notifyPluginOrSettingUpdated: boolean;
usePluginSyncV2: boolean;
usePluginEtc: boolean;
pluginSyncExtendedSetting: Record<import("@lib/common/models/setting.type").PluginSyncSettingEntry["key"], import("@lib/common/models/setting.type").PluginSyncSettingEntry>;
useAdvancedMode: boolean;
usePowerUserMode: boolean;
useEdgeCaseMode: boolean;
notifyThresholdOfRemoteStorageSize: number;
disableWorkerForGeneratingChunks: boolean;
processSmallFilesInUIThread: boolean;
savingDelay: number;
gcDelay: number;
skipOlderFilesOnSync: boolean;
useIndexedDBAdapter: boolean;
enableDebugTools: boolean;
writeLogToTheFile: boolean;
settingSyncFile: string;
writeCredentialsForSettingSync: boolean;
notifyAllSettingSyncFile: boolean;
suspendFileWatching: boolean;
suspendParseReplicationResult: boolean;
doNotSuspendOnFetching: boolean;
maxMTimeForReflectEvents: number;
versionUpFlash: string;
settingVersion: number;
isConfigured?: boolean;
lastReadUpdates: number;
doctorProcessedVersion: string;
remoteConfigurations: Record<string, import("@lib/common/models/setting.type").RemoteConfiguration>;
activeConfigurationId: string;
P2P_ActiveRemoteConfigurationId: string;
couchDB_URI: string;
couchDB_USER: string;
couchDB_PASSWORD: string;
couchDB_DBNAME: string;
couchDB_CustomHeaders: string;
useJWT: boolean;
jwtAlgorithm: import("./models/auth.type.ts").JWTAlgorithm;
jwtKey: string;
jwtKid: string;
jwtSub: string;
jwtExpDuration: number;
useRequestAPI: boolean;
accessKey: string;
secretKey: string;
bucket: string;
region: string;
endpoint: string;
useCustomRequestHandler: boolean;
bucketCustomHeaders: string;
bucketPrefix: string;
forcePathStyle: boolean;
remoteType: import("@lib/common/models/setting.type").RemoteType;
encrypt: boolean;
passphrase: string;
usePathObfuscation: boolean;
E2EEAlgorithm: import("@lib/common/models/setting.type").E2EEAlgorithm;
hashAlg: import("@lib/common/models/setting.type").HashAlgorithm;
minimumChunkSize: number;
customChunkSize: number;
longLineThreshold: number;
useSegmenter: boolean;
enableChunkSplitterV2: boolean;
doNotUseFixedRevisionForChunks: boolean;
chunkSplitterVersion: import("@lib/common/models/setting.type").ChunkSplitterVersion;
useEden: boolean;
maxChunksInEden: number;
maxTotalLengthInEden: number;
maxAgeInEden: number;
tweakModified: number | undefined;
checkIntegrityOnSave: boolean;
useHistory: boolean;
disableRequestURI: boolean;
sendChunksBulk: boolean;
sendChunksBulkMaxSize: number;
useDynamicIterationCount: boolean;
doNotPaceReplication: boolean;
readChunksOnline: boolean;
useOnlyLocalChunk: boolean;
concurrencyOfReadChunksOnline: number;
minimumIntervalOfReadChunksOnline: number;
enableCompression: boolean;
batch_size: number;
batches_limit: number;
ignoreVersionCheck: boolean;
disableCheckingConfigMismatch: boolean;
autoAcceptCompatibleTweak: boolean | undefined;
hashCacheMaxCount: number;
hashCacheMaxAmount: number;
permitEmptyPassphrase: boolean;
handleFilenameCaseSensitive: boolean;
checkConflictOnlyOnOpen: boolean;
showMergeDialogOnlyOnActive: boolean;
additionalSuffixOfDatabaseName: string | undefined;
useTimeouts: boolean;
deleteMetadataOfDeletedFiles: boolean;
automaticallyDeleteMetadataOfDeletedFiles: number;
P2P_AutoAccepting: import("@lib/common/models/setting.type").AutoAccepting;
P2P_AutoSyncPeers: string;
P2P_AutoWatchPeers: string;
P2P_SyncOnReplication: string;
P2P_RebuildFrom: string;
P2P_AutoAcceptingPeers: string;
P2P_AutoDenyingPeers: string;
P2P_IsHeadless?: boolean;
P2P_Enabled: boolean;
P2P_relays: string;
P2P_roomID: string;
P2P_passphrase: string;
P2P_AppID: string;
P2P_AutoStart: boolean;
P2P_AutoBroadcast: boolean;
P2P_DevicePeerName?: string;
P2P_turnServers: string;
P2P_turnUsername: string;
P2P_turnCredential: string;
P2P_useDiagRTC?: boolean;
};
export type AllSettings = ObsidianLiveSyncSettings & OnDialogSettings;
export type AllStringItemKey = FilterStringKeys<AllSettings>;
export type AllNumericItemKey = FilterNumberKeys<AllSettings>;
export type AllBooleanItemKey = FilterBooleanKeys<AllSettings>;
export type AllSettingItemKey = AllStringItemKey | AllNumericItemKey | AllBooleanItemKey;
export type ValueOf<T extends AllSettingItemKey> = T extends AllStringItemKey ? string : T extends AllNumericItemKey ? number : T extends AllBooleanItemKey ? boolean : AllSettings[T];
export declare const SettingInformation: Partial<Record<keyof AllSettings, ConfigurationItem>>;
export declare function getConfig(key: AllSettingItemKey): false | {
name: string;
desc?: string;
placeHolder?: string;
status?: "BETA" | "ALPHA" | "EXPERIMENTAL";
obsolete?: boolean;
level?: import("@lib/common/models/shared.definition.configNames").ConfigLevel;
isHidden?: boolean;
isAdvanced?: boolean;
};
export declare function getConfName(key: AllSettingItemKey): string;
+17
View File
@@ -0,0 +1,17 @@
import type { DocumentID, FilePath, FilePathWithPrefix } from "./models/db.type";
import type { UXFileInfoStub } from "@lib/common/models/fileaccess.type";
/**
* returns is internal chunk of file
* @param id ID
* @returns
*/
export declare function isInternalMetadata(id: FilePath | FilePathWithPrefix | DocumentID): boolean;
export declare function isInternalFile(file: UXFileInfoStub | string | FilePathWithPrefix): boolean;
export declare function stripInternalMetadataPrefix<T extends FilePath | FilePathWithPrefix | DocumentID>(id: T): T;
export declare function id2InternalMetadataId(id: DocumentID): DocumentID;
export declare function isChunk(str: string): boolean;
export declare function isPluginMetadata(str: string): boolean;
export declare function isCustomisationSyncMetadata(str: string): boolean;
export declare function getPathFromUXFileInfo(file: UXFileInfoStub | string | FilePathWithPrefix): FilePathWithPrefix;
export declare function getStoragePathFromUXFileInfo(file: UXFileInfoStub | string | FilePathWithPrefix): FilePath;
export declare function getDatabasePathFromUXFileInfo(file: UXFileInfoStub | string | FilePathWithPrefix): FilePathWithPrefix;
+107
View File
@@ -0,0 +1,107 @@
export type { TaggedType } from "./models/shared.type.util.ts";
export { LOG_LEVEL_DEBUG, LOG_LEVEL_INFO, LOG_LEVEL_NOTICE, LOG_LEVEL_URGENT, LOG_LEVEL_VERBOSE, } from "octagonal-wheels/common/logger";
export type { LOG_LEVEL } from "octagonal-wheels/common/logger";
import { RESULT_NOT_FOUND, RESULT_TIMED_OUT } from "octagonal-wheels/common/const";
import type { Credential } from "./models/auth.type.ts";
import type { AnyEntry, ChunkVersionRange, DatabaseEntry, EdenChunk, EntryBase, EntryChunkPack, EntryHasPath, EntryLeaf, EntryType, EntryTypeNotes, EntryTypeNotesWithLegacy, EntryVersionInfo, EntryWithEden, InternalFileEntry, LoadedEntry, MetaEntry, NewEntry, NoteEntry, PlainEntry, SavingEntry, SyncInfo } from "./models/db.type.ts";
import { ChunkTypes, EntryTypes, MILESTONE_DOCID, NODEINFO_DOCID, NoteTypes, SYNCINFO_ID, VERSIONING_DOCID } from "./models/db.const.ts";
import { AUTO_MERGED, CANCELLED, LEAVE_TO_SUBSEQUENT, MISSING_OR_ERROR, NOT_CONFLICTED, TIME_ARGUMENT_INFINITY } from "./models/shared.const.symbols.ts";
import { IDPrefixes, LEAF_WAIT_ONLY_REMOTE, LEAF_WAIT_TIMEOUT, LEAF_WAIT_TIMEOUT_SEQUENTIAL_REPLICATOR, MAX_DOC_SIZE, MAX_DOC_SIZE_BIN, PREFIX_CHUNK, PREFIX_ENCRYPTED_CHUNK, PREFIX_OBFUSCATED, RECENT_MODIFIED_DOCS_QTY, REPLICATION_BUSY_TIMEOUT, SALT_OF_ID, SALT_OF_PASSPHRASE, SEED_MURMURHASH, VER } from "./models/shared.const.behabiour.ts";
import { AutoAccepting, type BucketSyncSetting, type ChunkSplitterVersion, type ConfigPassphraseStore, type CouchDBConnection, type E2EEAlgorithm, type EncryptionSettings, type HashAlgorithm, type HasSettings, type LocalDBSettings, type ObsidianLiveSyncSettings, type P2PConnectionInfo, type P2PSyncSetting, type PluginSyncSettingEntry, type RemoteDBSettings, type RemoteType, type RemoteTypeSettings, type SYNC_MODE } from "./models/setting.type.ts";
import { ChunkAlgorithmNames, ChunkAlgorithms, CURRENT_SETTING_VERSION, E2EEAlgorithmNames, E2EEAlgorithms, HashAlgorithms, REMOTE_COUCHDB, REMOTE_MINIO, REMOTE_P2P, RemoteTypes, SETTING_VERSION_INITIAL, SETTING_VERSION_SUPPORT_CASE_INSENSITIVE, MODE_AUTOMATIC, MODE_PAUSED, MODE_SELECTIVE, MODE_SHINY } from "./models/setting.const.ts";
import { PREFERRED_BASE, PREFERRED_JOURNAL_SYNC, PREFERRED_SETTING_CLOUDANT, PREFERRED_SETTING_SELF_HOSTED } from "./models/setting.const.preferred.ts";
import { P2P_DEFAULT_SETTINGS, DEFAULT_SETTINGS } from "./models/setting.const.defaults.ts";
import { KeyIndexOfSettings } from "./models/setting.const.qr.ts";
import type { DeviceInfo, EntryBody, EntryDoc, EntryDocResponse, EntryMilestoneInfo, EntryNodeInfo, NodeData, NodeKey } from "./models/db.definition.ts";
import { isMetaEntry } from "./models/db.definition.ts";
import type { CouchDBCredentials, BasicCredentials, JWTCredentials, JWTHeader, JWTPayload, JWTParams, PreparedJWT } from "./models/auth.type.ts";
import type { CacheData, FileEventArgs, FileEventItem, FileEventType, UXAbstractInfoStub, UXDataWriteOptions, UXFileInfo, UXFileInfoStub, UXFolderInfo, UXInternalFileInfoStub, UXStat } from "./models/fileaccess.type.ts";
import { SETTING_KEY_P2P_DEVICE_NAME, configURIBase, configURIBaseQR, SuffixDatabaseName, ExtraSuffixIndexedDB } from "./models/shared.const.ts";
import { configurationNames, LEVEL_ADVANCED, LEVEL_POWER_USER, LEVEL_EDGE_CASE, type ConfigLevel, type ConfigurationItem, statusDisplay, confName, confDesc } from "./models/shared.definition.configNames.ts";
import type { CustomRegExpSource, CustomRegExpSourceList, ParsedCustomRegExp, Prettify } from "./models/shared.type.util.ts";
import { ProtocolVersions, type ProtocolVersion, DOCID_SYNC_PARAMETERS, DOCID_JOURNAL_SYNC_PARAMETERS, type SyncParameters, DEFAULT_SYNC_PARAMETERS } from "./models/sync.definition.ts";
import { TweakValuesShouldMatchedTemplate, IncompatibleChanges, CompatibleButLossyChanges, IncompatibleChangesInSpecificPattern, TweakValuesRecommendedTemplate, TweakValuesDefault, TweakValuesTemplate, type TweakValues, DEVICE_ID_PREFERRED } from "./models/tweak.definition.ts";
import type { diff_result_leaf, dmp_result, diff_result, DIFF_CHECK_RESULT_AUTO, diff_check_result } from "./models/diff.definition.ts";
import { PREFIXMD_LOGFILE, PREFIXMD_LOGFILE_UC, FlagFilesOriginal, FlagFilesHumanReadable, FLAGMD_REDFLAG, FLAGMD_REDFLAG2, FLAGMD_REDFLAG2_HR, FLAGMD_REDFLAG3, FLAGMD_REDFLAG3_HR } from "./models/redflag.const.ts";
import { DatabaseConnectingStatuses, type DatabaseConnectingStatus } from "./models/shared.definition.ts";
export { RESULT_NOT_FOUND, RESULT_TIMED_OUT };
export type { FilePath, FilePathWithPrefixLC, FilePathWithPrefix, DocumentID } from "./models/db.type.ts";
export { MAX_DOC_SIZE, MAX_DOC_SIZE_BIN, VER, RECENT_MODIFIED_DOCS_QTY, LEAF_WAIT_TIMEOUT, LEAF_WAIT_ONLY_REMOTE, LEAF_WAIT_TIMEOUT_SEQUENTIAL_REPLICATOR, REPLICATION_BUSY_TIMEOUT, CANCELLED, AUTO_MERGED, NOT_CONFLICTED, MISSING_OR_ERROR, LEAVE_TO_SUBSEQUENT, TIME_ARGUMENT_INFINITY, VERSIONING_DOCID, MILESTONE_DOCID, NODEINFO_DOCID, };
export { type CouchDBConnection };
export type { ConfigPassphraseStore };
export { MODE_SELECTIVE, MODE_AUTOMATIC, MODE_PAUSED, MODE_SHINY, type SYNC_MODE };
export { type PluginSyncSettingEntry };
export { SETTING_VERSION_INITIAL, SETTING_VERSION_SUPPORT_CASE_INSENSITIVE, CURRENT_SETTING_VERSION };
export type { BucketSyncSetting, LocalDBSettings };
export { RemoteTypes, REMOTE_COUCHDB, REMOTE_MINIO, REMOTE_P2P, type RemoteType, AutoAccepting };
export type { P2PConnectionInfo, P2PSyncSetting };
export { P2P_DEFAULT_SETTINGS };
export type { RemoteTypeSettings };
export { E2EEAlgorithmNames, E2EEAlgorithms, type E2EEAlgorithm };
export type { EncryptionSettings };
export { HashAlgorithms, type HashAlgorithm, ChunkAlgorithmNames, ChunkAlgorithms, type ChunkSplitterVersion };
export type { RemoteDBSettings };
export type { ObsidianLiveSyncSettings };
export { DEFAULT_SETTINGS };
export { KeyIndexOfSettings };
export { type HasSettings };
export { PREFERRED_BASE, PREFERRED_SETTING_CLOUDANT, PREFERRED_SETTING_SELF_HOSTED, PREFERRED_JOURNAL_SYNC };
export { EntryTypes, NoteTypes, ChunkTypes, type EntryType, type EntryTypeNotes, type EntryTypeNotesWithLegacy, type DatabaseEntry, type EntryBase, type EdenChunk, type EntryWithEden, type NoteEntry, type NewEntry, type PlainEntry, type InternalFileEntry, type AnyEntry, type LoadedEntry, type SavingEntry, type MetaEntry, isMetaEntry, type EntryLeaf, type EntryChunkPack, type EntryVersionInfo, type EntryHasPath, };
export type { ChunkVersionRange };
export { TweakValuesShouldMatchedTemplate };
export { IncompatibleChanges };
export { CompatibleButLossyChanges };
export { IncompatibleChangesInSpecificPattern };
export { TweakValuesRecommendedTemplate };
export { TweakValuesDefault };
export { configurationNames };
export { LEVEL_ADVANCED };
export { LEVEL_POWER_USER };
export { LEVEL_EDGE_CASE };
export type { ConfigLevel };
export type { ConfigurationItem };
export { statusDisplay };
export { confName };
export { confDesc };
export { TweakValuesTemplate };
export type { TweakValues };
export { DEVICE_ID_PREFERRED };
export type { NodeKey };
export type { DeviceInfo };
export type { NodeData };
export type { EntryMilestoneInfo };
export type { EntryNodeInfo };
export type { EntryBody };
export type { EntryDoc };
export type { diff_result_leaf };
export type { dmp_result };
export type { diff_result };
export type { DIFF_CHECK_RESULT_AUTO };
export type { diff_check_result };
export type { Credential };
export type { EntryDocResponse };
export { DatabaseConnectingStatuses };
export type { DatabaseConnectingStatus };
export { PREFIXMD_LOGFILE, PREFIXMD_LOGFILE_UC, FlagFilesOriginal, FlagFilesHumanReadable, FLAGMD_REDFLAG, FLAGMD_REDFLAG2, FLAGMD_REDFLAG2_HR, FLAGMD_REDFLAG3, FLAGMD_REDFLAG3_HR, };
export { SYNCINFO_ID };
export type { SyncInfo };
export { SALT_OF_PASSPHRASE, SALT_OF_ID, SEED_MURMURHASH, IDPrefixes, PREFIX_OBFUSCATED, PREFIX_CHUNK, PREFIX_ENCRYPTED_CHUNK, };
export type { UXStat, UXFileInfo, UXAbstractInfoStub, UXFileInfoStub, UXInternalFileInfoStub, UXFolderInfo, UXDataWriteOptions, CacheData, FileEventType, FileEventArgs, FileEventItem, };
export type { Prettify };
export type { CouchDBCredentials };
export type { BasicCredentials };
export type { JWTCredentials };
export type { JWTHeader };
export type { JWTPayload };
export type { JWTParams };
export type { PreparedJWT };
export type { CustomRegExpSource };
export type { CustomRegExpSourceList };
export type { ParsedCustomRegExp };
export { ProtocolVersions };
export type { ProtocolVersion };
export { DOCID_SYNC_PARAMETERS };
export { DOCID_JOURNAL_SYNC_PARAMETERS };
export type { SyncParameters };
export { DEFAULT_SYNC_PARAMETERS };
export { SETTING_KEY_P2P_DEVICE_NAME, configURIBase, configURIBaseQR, SuffixDatabaseName, ExtraSuffixIndexedDB };
+10
View File
@@ -0,0 +1,10 @@
export declare function resolveWithIgnoreKnownError<T>(p: Promise<T>, def: T): Promise<T>;
export declare const Parallels: (ps?: Set<Promise<unknown>>) => {
add: (p: Promise<unknown>) => Set<Promise<unknown>>;
wait: (limit: number) => false | Promise<unknown>;
all: () => Promise<unknown[]>;
};
export declare function allSettledWithConcurrencyLimit<T>(processes: Promise<T>[], limit: number): Promise<void>;
export declare const globalConcurrencyController: import("octagonal-wheels/concurrency/semaphore_v2").SemaphoreObject;
export declare function wrapException<T>(func: () => Promise<Awaited<T>>): Promise<Awaited<T> | Error>;
export declare function wrapByDefault<T, U>(func: () => T, onError: (err: Error) => U): T | U;
+25
View File
@@ -0,0 +1,25 @@
import { replaceAll, replaceAllPairs } from "octagonal-wheels/string";
export { replaceAll, replaceAllPairs };
import { concatUInt8Array } from "octagonal-wheels/binary";
export { concatUInt8Array };
import { delay, fireAndForget } from "octagonal-wheels/promises";
export { delay, fireAndForget };
import { arrayToChunkedArray, unique } from "octagonal-wheels/collection";
export { arrayToChunkedArray, unique };
import { extractObject, isObjectDifferent } from "octagonal-wheels/object";
export { extractObject, isObjectDifferent };
import { sendValue, sendSignal, waitForSignal, waitForValue } from "octagonal-wheels/messagepassing/signal";
export { sendValue, sendSignal, waitForSignal, waitForValue };
import { throttle } from "octagonal-wheels/function";
export { throttle };
import type { SimpleStore } from "octagonal-wheels/databases/SimpleStoreBase";
export type { SimpleStore };
export { sizeToHumanReadable } from "octagonal-wheels/number";
export * from "./utils.concurrency";
export * from "./utils.timer";
export * from "./utils.notations";
export * from "./utils.database";
export * from "./utils.regexp";
export * from "./utils.settings";
export * from "./utils.patch";
export * from "./utils.misc";
+23
View File
@@ -0,0 +1,23 @@
import type { AnyEntry, DatabaseEntry, EntryLeaf, SyncInfo, LoadedEntry, SavingEntry, NewEntry, PlainEntry } from "@lib/common/models/db.type";
import { BASE_IS_NEW, EVEN, TARGET_IS_NEW } from "./models/shared.const.symbols.ts";
export declare function getDocData(doc: string | string[]): string;
export declare function getDocDataAsArray(doc: string | string[]): string[];
export declare function getDocDataAsArrayBuffer(doc: string | string[] | ArrayBuffer): Uint8Array<ArrayBuffer>;
export declare function isTextBlob(blob: Blob): boolean;
export declare function createTextBlob(data: string | string[]): Blob;
export declare function createBinaryBlob(data: Uint8Array<ArrayBuffer> | ArrayBuffer): Blob;
export declare function createBlob(data: string | string[] | Uint8Array<ArrayBuffer> | ArrayBuffer | Blob): Blob;
export declare function isTextDocument(doc: LoadedEntry): boolean;
export declare function readAsBlob(doc: LoadedEntry): Blob;
export declare function readContent(doc: LoadedEntry): string | ArrayBuffer;
export declare function isDocContentSame(docA: string | string[] | Blob | ArrayBuffer, docB: string | string[] | Blob | ArrayBuffer): Promise<boolean>;
export declare function isObfuscatedEntry(doc: DatabaseEntry): doc is AnyEntry;
export declare function isEncryptedChunkEntry(doc: DatabaseEntry): doc is EntryLeaf;
export declare function isSyncInfoEntry(doc: DatabaseEntry): doc is SyncInfo;
export declare function determineTypeFromBlob(data: Blob): "newnote" | "plain";
export declare function determineType(path: string, data: string | string[] | Uint8Array | ArrayBuffer | Blob): "newnote" | "plain";
export declare function isAnyNote(doc: DatabaseEntry): doc is NewEntry | PlainEntry;
export declare function isLoadedEntry(doc: DatabaseEntry): doc is LoadedEntry;
export declare function isDeletedEntry(doc: LoadedEntry): boolean;
export declare function createSavingEntryFromLoadedEntry(doc: LoadedEntry): SavingEntry;
export declare function compareMTime(baseMTime: number, targetMTime: number): typeof BASE_IS_NEW | typeof TARGET_IS_NEW | typeof EVEN;
+8
View File
@@ -0,0 +1,8 @@
/**
* Checks if the error is effectively a 404 error from CouchDB or PouchDB.
* @param ex some error object, expected to be from CouchDB or PouchDB.
* @returns true if the error is a 404 not found error, false otherwise.
* @throws if the input is not an object or does not have a numeric "status" property.
*/
export declare function isNotFoundError(ex: unknown): boolean;
export declare function tryGetFilePath(entry: unknown): string | undefined;
+13
View File
@@ -0,0 +1,13 @@
export declare function tryParseJSON<T extends object>(str: string, fallbackValue?: T): T | undefined;
export declare function parseHeaderValues(strHeader: string): Record<string, string>;
export declare function memorizeFuncWithLRUCache<T, U>(func: (key: T) => U): (key: T) => U | undefined;
/**
*
* @param exclusion return only not exclusion
* @returns
*
* ["something",false,"aaaaa"].filter(onlyNot(false)) => yields ["something","aaaaaa"]. but, as string[].
*/
export declare function onlyNot<A, B>(exclusion: B): (item: A | B) => item is Exclude<A, B>;
export declare function isDirty(key: string, value: unknown): boolean;
export declare function setAllItems<T>(set: Set<T>, items: T[]): Set<T>;
+6
View File
@@ -0,0 +1,6 @@
export declare function escapeNewLineFromString(str: string): string;
export declare function unescapeNewLineFromString(str: string): string;
export declare function escapeMarkdownValue<T>(value: T): T;
export declare function timeDeltaToHumanReadable(delta: number): string;
export declare function toRanges(sorted: number[]): string;
export declare function displayRev(rev: string): string;
+2
View File
@@ -0,0 +1,2 @@
export declare function asCopy<T>(obj: T): T;
export declare function ensureError(error: unknown): Error;
+8
View File
@@ -0,0 +1,8 @@
export declare function generatePatchObj(from: Record<string | number | symbol, unknown>, to: Record<string | number | symbol, unknown>): Record<string | number | symbol, unknown>;
export declare function applyPatch(from: Record<string | number | symbol, unknown>, patch: Record<string | number | symbol, unknown>): Record<string | number | symbol, unknown>;
export declare function mergeObject(objA: Record<string | number | symbol, unknown> | [unknown], objB: Record<string | number | symbol, unknown> | [unknown]): unknown[] | {
[k: string]: unknown;
};
export declare function flattenObject(obj: Record<string | number | symbol, unknown>, path?: string[]): [string, unknown][];
export declare function isSensibleMargeApplicable(path: string): boolean;
export declare function isObjectMargeApplicable(path: string): boolean;
+25
View File
@@ -0,0 +1,25 @@
import type { CustomRegExpSource, ParsedCustomRegExp, CustomRegExpSourceList } from "@lib/common/models/shared.type.util";
import type { ObsidianLiveSyncSettings, RemoteDBSettings } from "@lib/common/models/setting.type";
/***
* Parse custom regular expression
* @param regexp
* @returns [negate: boolean, regexp: string]
* @example `!!foo` => [true, "foo"]
* @example `foo` => [false, "foo"]
*/
export declare function parseCustomRegExp(regexp: CustomRegExpSource): ParsedCustomRegExp;
export declare function matchRegExp(regexp: CustomRegExpSource, target: string): boolean;
export declare function isValidRegExp(regexp: CustomRegExpSource): boolean;
export declare function isInvertedRegExp(regexp: CustomRegExpSource): boolean;
export declare function constructCustomRegExpList<D extends string>(items: CustomRegExpSource[], delimiter: D): CustomRegExpSourceList<D>;
export declare function splitCustomRegExpList<D extends string>(list: CustomRegExpSourceList<D>, delimiter: D): CustomRegExpSource[];
export declare class CustomRegExp {
regexp: RegExp;
negate: boolean;
pattern: string;
constructor(regexp: CustomRegExpSource, flags?: string);
test(str: string): boolean;
}
type RegExpSettingKey = "syncOnlyRegEx" | "syncIgnoreRegEx" | "syncInternalFilesIgnorePatterns" | "syncInternalFilesTargetPatterns" | "syncInternalFileOverwritePatterns";
export declare function getFileRegExp(settings: ObsidianLiveSyncSettings | RemoteDBSettings, key: RegExpSettingKey): CustomRegExp[];
export {};

Some files were not shown because too many files have changed in this diff Show More