selfstore 1.8.24 → 1.8.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +83 -0
  2. package/dist/advanced.d.ts +7 -7
  3. package/dist/advanced.js +15 -14
  4. package/dist/advanced.js.map +1 -1
  5. package/dist/backups.d.ts +4 -4
  6. package/dist/backups.js +9 -8
  7. package/dist/{cache-lock-5RNG6CIK.js → cache-lock-VVAB3CDB.js} +5 -4
  8. package/dist/cache-lock-VVAB3CDB.js.map +1 -0
  9. package/dist/{chunk-JTNFZV2B.js → chunk-25U6AKIX.js} +4 -4
  10. package/dist/{chunk-JTNFZV2B.js.map → chunk-25U6AKIX.js.map} +1 -1
  11. package/dist/{chunk-3KAAPYPO.js → chunk-2BNTCXQN.js} +3 -3
  12. package/dist/{chunk-3KAAPYPO.js.map → chunk-2BNTCXQN.js.map} +1 -1
  13. package/dist/{chunk-LYO36VYB.js → chunk-2PIYIIHY.js} +8 -8
  14. package/dist/{chunk-LYO36VYB.js.map → chunk-2PIYIIHY.js.map} +1 -1
  15. package/dist/{chunk-GW5CYP4C.js → chunk-2TIRUEXR.js} +3 -3
  16. package/dist/{chunk-GW5CYP4C.js.map → chunk-2TIRUEXR.js.map} +1 -1
  17. package/dist/{chunk-EBCQ7ZG7.js → chunk-5DAPYC2K.js} +4 -4
  18. package/dist/{chunk-EBCQ7ZG7.js.map → chunk-5DAPYC2K.js.map} +1 -1
  19. package/dist/{chunk-RREJ2MFN.js → chunk-5UYPKCDB.js} +5 -17
  20. package/dist/chunk-5UYPKCDB.js.map +1 -0
  21. package/dist/{chunk-VRHSBY3T.js → chunk-AZWS7YC3.js} +10 -10
  22. package/dist/{chunk-VRHSBY3T.js.map → chunk-AZWS7YC3.js.map} +1 -1
  23. package/dist/{chunk-XMC67RNM.js → chunk-CSYEIXNY.js} +2 -2
  24. package/dist/{chunk-XMC67RNM.js.map → chunk-CSYEIXNY.js.map} +1 -1
  25. package/dist/{chunk-OY2A5DCB.js → chunk-F4ZZEJ5H.js} +4 -4
  26. package/dist/{chunk-OY2A5DCB.js.map → chunk-F4ZZEJ5H.js.map} +1 -1
  27. package/dist/{chunk-3BWBBGFW.js → chunk-FQ5O4PHK.js} +7 -7
  28. package/dist/{chunk-3BWBBGFW.js.map → chunk-FQ5O4PHK.js.map} +1 -1
  29. package/dist/{chunk-JZHWAX34.js → chunk-GHSHIDF3.js} +4 -4
  30. package/dist/{chunk-JZHWAX34.js.map → chunk-GHSHIDF3.js.map} +1 -1
  31. package/dist/{chunk-23UAUYSW.js → chunk-GSZSZGSD.js} +3 -3
  32. package/dist/{chunk-23UAUYSW.js.map → chunk-GSZSZGSD.js.map} +1 -1
  33. package/dist/{chunk-LUNYYH6D.js → chunk-IDW3WQKF.js} +6 -6
  34. package/dist/{chunk-LUNYYH6D.js.map → chunk-IDW3WQKF.js.map} +1 -1
  35. package/dist/{chunk-757ZOSUI.js → chunk-LF3CC2P3.js} +3 -3
  36. package/dist/{chunk-757ZOSUI.js.map → chunk-LF3CC2P3.js.map} +1 -1
  37. package/dist/{chunk-AUH35AAQ.js → chunk-LQS7AMOD.js} +3 -3
  38. package/dist/{chunk-AUH35AAQ.js.map → chunk-LQS7AMOD.js.map} +1 -1
  39. package/dist/{chunk-HHPJPEEG.js → chunk-RVOBONZF.js} +7 -6
  40. package/dist/chunk-RVOBONZF.js.map +1 -0
  41. package/dist/chunk-SJ3PKQPR.js +10 -0
  42. package/dist/chunk-SJ3PKQPR.js.map +1 -0
  43. package/dist/chunk-WXI2NAPA.js +16 -0
  44. package/dist/chunk-WXI2NAPA.js.map +1 -0
  45. package/dist/{connect-Bob2mofK.d.ts → connect-DoB_DN__.d.ts} +3 -3
  46. package/dist/{drive-86CHuTij.d.ts → drive--mndByvF.d.ts} +1 -1
  47. package/dist/flows.d.ts +5 -5
  48. package/dist/flows.js +12 -11
  49. package/dist/flows.js.map +1 -1
  50. package/dist/groups.js +5 -4
  51. package/dist/groups.js.map +1 -1
  52. package/dist/households.d.ts +1 -1
  53. package/dist/index.d.ts +11 -266
  54. package/dist/index.js +21 -24
  55. package/dist/index.js.map +1 -1
  56. package/dist/{local-l61rREx1.d.ts → local-ClXq1N2M.d.ts} +2 -2
  57. package/dist/local-GGAMRY23.js +8 -0
  58. package/dist/{local-XET4G32B.js.map → local-GGAMRY23.js.map} +1 -1
  59. package/dist/manager-drive-2IUE4WQ2.js +11 -0
  60. package/dist/{manager-drive-YLSLQ63O.js.map → manager-drive-2IUE4WQ2.js.map} +1 -1
  61. package/dist/{manager-Di6lNE4E.d.ts → manager-yCM0M0FL.d.ts} +1 -1
  62. package/dist/proof.d.ts +194 -0
  63. package/dist/proof.js +406 -0
  64. package/dist/proof.js.map +1 -0
  65. package/dist/s3-ABKUTTXE.js +12 -0
  66. package/dist/s3-ABKUTTXE.js.map +1 -0
  67. package/dist/{s3-BsbVn3fw.d.ts → s3-dG1SCnV1.d.ts} +1 -1
  68. package/dist/simple-GdtB5IrG.d.ts +267 -0
  69. package/dist/{store-CIbiNoiE.d.ts → store-CKGrIFQU.d.ts} +2 -2
  70. package/dist/sync.js +2 -2
  71. package/dist/webdav-5SHNR7CL.js +10 -0
  72. package/dist/{webdav-EEQKX5TZ.js.map → webdav-5SHNR7CL.js.map} +1 -1
  73. package/dist/widgets.d.ts +5 -5
  74. package/dist/widgets.js +12 -11
  75. package/dist/widgets.js.map +1 -1
  76. package/llms.txt +24 -1
  77. package/package.json +5 -1
  78. package/dist/cache-lock-5RNG6CIK.js.map +0 -1
  79. package/dist/chunk-HHPJPEEG.js.map +0 -1
  80. package/dist/chunk-RREJ2MFN.js.map +0 -1
  81. package/dist/local-XET4G32B.js +0 -7
  82. package/dist/manager-drive-YLSLQ63O.js +0 -10
  83. package/dist/s3-43RWNCV3.js +0 -11
  84. package/dist/s3-43RWNCV3.js.map +0 -1
  85. package/dist/webdav-EEQKX5TZ.js +0 -9
@@ -0,0 +1,267 @@
1
+ import { a as Snapshot, b as PasswordPolicy, c as SnapshotFile, B as BackupTarget, d as StatusDescriptor, S as StoreError, e as LocalStoreState, L as LocalStore } from './store-CKGrIFQU.js';
2
+ import { L as LocalCache, K as KV } from './cache-ilsK3Tki.js';
3
+ import { SyncConfig } from './sync.js';
4
+ import { R as ResumeOffer, C as ConnectTargets } from './connect-DoB_DN__.js';
5
+ import { f as BackupsManager } from './manager-yCM0M0FL.js';
6
+ import { a as DriveAuth } from './drive--mndByvF.js';
7
+ import { W as WebdavConfig, S as S3Config } from './s3-dG1SCnV1.js';
8
+
9
+ /** What a file body may be handed in as. */
10
+ type FileBytes = Uint8Array | ArrayBuffer | Blob;
11
+
12
+ /** A record as the simple store sees it: plain JSON with a string id (the id
13
+ * field name can be remapped per collection via `sync.ids`). */
14
+ type SimpleRecord = Record<string, unknown>;
15
+
16
+ /** A file on its way into the store. Omit `id` to get the content hash, which
17
+ * is the id that makes the multi-device union safe - see `putFile`. */
18
+ interface PutFileInput {
19
+ /** Defaults to the SHA-256 of the bytes. */
20
+ id?: string;
21
+ /** Defaults to the id. Cosmetic: nothing keys on it. */
22
+ name?: string;
23
+ /** Defaults to 'application/octet-stream'. */
24
+ mime?: string;
25
+ bytes: FileBytes;
26
+ }
27
+ /** Unlock callback for the ultra-sensitive cacheLock mode: return the session
28
+ * secret - a password (Argon2id-derived) or an app-provided key (e.g. a passkey
29
+ * PRF result). Called at boot; called again with { failed: true } after a wrong
30
+ * secret so the app can re-prompt. Throw to abort the boot (user cancelled). */
31
+ type CacheUnlock = (attempt: {
32
+ failed: boolean;
33
+ }) => Promise<string | CryptoKey>;
34
+ /** Options - every one of them optional, the defaults carry a real app. */
35
+ interface SimpleOptions {
36
+ /** Your DATA schema version (default 1). Bump it together with `migrate`. */
37
+ schema?: number;
38
+ /** Upgrade a snapshot written by an older schema version. */
39
+ migrate?: (fromVersion: number, snap: Snapshot) => Snapshot;
40
+ /** Per-collection merge tuning (id field mapping, strategies). The default -
41
+ * records keyed by `id`, later edit wins, deletes propagate - fits most apps. */
42
+ sync?: SyncConfig;
43
+ /**
44
+ * Google Drive, when this app uses it. Two shapes for two situations:
45
+ *
46
+ * `{ clientId }` is the whole wiring - the library builds the browser
47
+ * connection, keeps ONE session for the app (several would mean several
48
+ * consent screens), reuses its token across a reload, remembers which
49
+ * account holds the backup and hands that back to Google so the chooser
50
+ * stops appearing. Nothing else to write.
51
+ *
52
+ * A `DriveAuth` instead, for an app that gets its tokens elsewhere - a
53
+ * server broker holding a refresh token, a native shell.
54
+ *
55
+ * Either way, providing it here is also what lets a connected Drive backup
56
+ * restore itself on the next start.
57
+ */
58
+ drive?: DriveAuth | {
59
+ clientId: string;
60
+ scope?: string;
61
+ };
62
+ /** Where the working copy lives (default: IndexedDB named after the app;
63
+ * in-memory when IndexedDB does not exist, e.g. tests or SSR). */
64
+ cache?: LocalCache;
65
+ /** Auto-save debounce in ms. */
66
+ debounceMs?: number;
67
+ /** Cross-tab coordination (default on in browsers). */
68
+ multiTab?: boolean;
69
+ /** Refuse to ever write or export a plaintext backup: connecting a
70
+ * destination then demands a password (or a group). Off by default. */
71
+ requireEncryption?: boolean;
72
+ /** Reject a backup password weaker than this policy (length, character
73
+ * classes) at protect()/addKey time. Preview the rules with
74
+ * checkPasswordPolicy for a live UI hint. Omit for no policy. */
75
+ passwordPolicy?: PasswordPolicy;
76
+ /** Ultra-sensitive mode: seal the local cache under a key derived from a
77
+ * secret held in memory (this callback), never on disk - so a copy of the
78
+ * browser profile cannot read it. One unlock per session; branch it on the
79
+ * app's existing login to leave the UX unchanged. Browser (IndexedDB) only. */
80
+ cacheLock?: CacheUnlock;
81
+ /** Wire tab focus / network return / interval / tab hide automatically
82
+ * (default true in browsers). Pass false to drive syncing yourself. */
83
+ autoSync?: boolean;
84
+ }
85
+ /** What connecting a destination did. 'merged': it already held a backup and
86
+ * both sides were folded together. 'started': it was empty, this device's data
87
+ * is now its content. 'manual': non-Chromium file fallback - offer
88
+ * downloadBackup() instead. 'cancelled': the user closed the picker/consent. */
89
+ type ConnectOutcome = 'merged' | 'started' | 'manual' | 'cancelled';
90
+ interface SimpleStore<S extends Record<string, SimpleRecord> = Record<string, SimpleRecord>> {
91
+ /** Every record of a collection (treat as read-only; write via put/remove). */
92
+ all<K extends keyof S & string>(collection: K): readonly S[K][];
93
+ /** One record by id, or undefined. */
94
+ get<K extends keyof S & string>(collection: K, id: string): S[K] | undefined;
95
+ /** Insert or replace one record (auto-saves, debounced). Throws a TypeError
96
+ * when the record has no non-empty string id. */
97
+ put<K extends keyof S & string>(collection: K, record: S[K]): Promise<void>;
98
+ /** Insert or replace many records in one save. */
99
+ putAll<K extends keyof S & string>(collection: K, records: S[K][]): Promise<void>;
100
+ /** Delete one record by id (propagates to other devices). Unknown id: no-op. */
101
+ remove<K extends keyof S & string>(collection: K, id: string): Promise<void>;
102
+ /** Empty a collection (every removal propagates). */
103
+ clear<K extends keyof S & string>(collection: K): Promise<void>;
104
+ /** Called after any data change: your writes, another tab, another device,
105
+ * a restore. Returns an unsubscribe. */
106
+ onChange(fn: () => void): () => void;
107
+ /** Every file (treat as read-only; write via putFile/removeFile). */
108
+ allFiles(): readonly SnapshotFile[];
109
+ /** One file by id, or undefined. */
110
+ getFile(id: string): SnapshotFile | undefined;
111
+ /**
112
+ * Store bytes alongside the collections and return the file's id.
113
+ *
114
+ * Files are **immutable per id**. The multi-device merge unions them by id
115
+ * and has no clock to order two bodies, so when two devices hold DIFFERENT
116
+ * bytes under one id, one is kept and the other is dropped - with no
117
+ * conflict reported, because at that level there is nothing to compare.
118
+ *
119
+ * Hence the default id: the SHA-256 of the bytes. Different bytes land on
120
+ * different ids and the union keeps both, which is what makes a CRDT
121
+ * document (Yjs, Automerge) safe to carry here - store its UPDATES, let the
122
+ * union collect them, fold them at load. Tie a file's lifetime to a record
123
+ * so deleting the record tells you which files to remove.
124
+ *
125
+ * Naming the id yourself puts that rule in your hands: identical bytes
126
+ * under an existing id are a no-op, different bytes are refused with a
127
+ * TypeError. `{ replace: true }` does it anyway - right for a body only
128
+ * ever written on one device (a thumbnail, a rendered export), a silent
129
+ * loser as soon as two devices write it.
130
+ */
131
+ putFile(file: PutFileInput, opts?: {
132
+ replace?: boolean;
133
+ }): Promise<string>;
134
+ /** Delete one file by id (propagates to other devices). Unknown id: no-op. */
135
+ removeFile(id: string): Promise<void>;
136
+ /** Connect Google Drive as the durable home. An existing backup there is
137
+ * MERGED with this device (multi-device); an encrypted one needs its
138
+ * password up front (PASSWORD_REQUIRED is thrown before anything changes). */
139
+ connectDrive(auth: DriveAuth, opts?: {
140
+ password?: string;
141
+ }): Promise<ConnectOutcome>;
142
+ /** Connect a disk file (File System Access; falls back to manual download). */
143
+ connectFile(opts?: {
144
+ password?: string;
145
+ }): Promise<ConnectOutcome>;
146
+ /** Connect a WebDAV server (Nextcloud, ownCloud, your own). */
147
+ connectWebdav(config: WebdavConfig, opts?: {
148
+ password?: string;
149
+ }): Promise<ConnectOutcome>;
150
+ /** Connect an S3-compatible bucket you control (Amazon S3, R2, B2, MinIO). */
151
+ connectS3(config: S3Config, opts?: {
152
+ password?: string;
153
+ }): Promise<ConnectOutcome>;
154
+ /** Connect any custom BackupTarget with the same merge semantics. */
155
+ connectTarget(target: BackupTarget, opts?: {
156
+ password?: string;
157
+ }): Promise<ConnectOutcome>;
158
+ /** Back to device-only (the destination keeps its last backup). */
159
+ disconnect(): Promise<void>;
160
+ /** Also write the same encrypted backup to this second destination on
161
+ * every save. A broken copy never gates the store (state.replicas). */
162
+ addReplica(target: BackupTarget, opts?: {
163
+ id?: string;
164
+ }): string;
165
+ /** Stop writing the copy (the destination keeps its last backup). */
166
+ removeReplica(id: string): void;
167
+ /** Encrypt the durable backup end to end with this password (reversible). */
168
+ protect(password: string): Promise<void>;
169
+ /** Remove the backup password. */
170
+ unprotect(): Promise<void>;
171
+ /** status.action === 'unlock': supply the password to resume. */
172
+ unlock(password: string): Promise<boolean>;
173
+ /** status.action === 'reconnect': re-run the destination's auth gesture. */
174
+ reconnect(): Promise<boolean>;
175
+ /** The portable backup file (a real ZIP; encrypted when protect() is on).
176
+ *
177
+ * `{ plaintext: true }` asks for a READABLE copy of a protected store: the
178
+ * same ZIP with `selfstore.json` in the clear, which any tool can open and
179
+ * git can diff. It is the answer to "can I actually get my data out", and
180
+ * it costs nothing: the store, its password and its destination are
181
+ * untouched, so the real backup stays encrypted. Before this, the only way
182
+ * out was `unprotect()`, which rewrites the destination and leaves it
183
+ * readable until you remember to undo it.
184
+ *
185
+ * Refused while locked (there is nothing readable to write), and refused on
186
+ * a store created with `requireEncryption` - that flag means this store
187
+ * never produces cleartext, and an escape hatch would make it a lie. */
188
+ exportBackup(opts?: {
189
+ plaintext?: boolean;
190
+ }): Promise<Blob>;
191
+ /** Download the backup (also resolves the 'manual' file mode's pending flag).
192
+ * False when the user closed the save dialog: nothing was written, the
193
+ * pending flag stands, and the app must not record a backup. */
194
+ downloadBackup(filename?: string): Promise<boolean>;
195
+ /** Load a backup file into this store, replacing the local data (removals
196
+ * propagate like edits). Throws PASSWORD_REQUIRED / DECRYPT_FAILED. */
197
+ importBackup(file: Blob | Uint8Array, opts?: {
198
+ password?: string;
199
+ }): Promise<void>;
200
+ /** Headless status: { state, severity, action, labelKey } - map labelKey to
201
+ * your own copy. */
202
+ readonly status: StatusDescriptor;
203
+ /** The last problem: { code, labelKey, message } - show labelKey, log message. */
204
+ readonly error: StoreError | null;
205
+ /** The full underlying state (advanced reads: journal, peers, mode...). */
206
+ readonly state: LocalStoreState;
207
+ /** Fires on any state change (status flips included) - for framework bindings. */
208
+ subscribe(fn: () => void): () => void;
209
+ /** Save now (called for you on tab hide when autoSync is on). */
210
+ flush(): Promise<void>;
211
+ /** Converge with the destination now (a user gesture like pull-to-refresh). */
212
+ sync(): Promise<void>;
213
+ /** Drop timers and listeners (tests, SPA teardown). */
214
+ dispose(): void;
215
+ /** The escape hatch: the full advanced store this simple one is built on -
216
+ * peers, groups, custom strategies, everything (see selfstore/advanced). */
217
+ readonly advanced: LocalStore;
218
+ /** The attachment point for 'selfstore/flows': the engine plus the cache KV
219
+ * and backup file name a flow needs to build destination targets. Apps on
220
+ * the advanced store hand a flow the same three by themselves. */
221
+ readonly flowHost: {
222
+ engine: LocalStore;
223
+ kv: KV;
224
+ backupName: string;
225
+ };
226
+ /** Who holds the destination, when it is known - the Google address behind a
227
+ * Drive backup. Learned on connect and remembered across sessions, so a
228
+ * surface can NAME the destination ("Google Drive" is not an address) and a
229
+ * re-grant can skip the account chooser. Null for a file, or before a first
230
+ * connect. Reading it costs nothing: no call goes out. */
231
+ readonly account: string | null;
232
+ /** The destination this device already used, ready to hand to a connect flow
233
+ * as `options.resume` - so a returning visitor is offered "reopen my backup"
234
+ * ahead of the plain destinations, instead of re-deriving a decision the
235
+ * library already has on file. Null when there is nothing to resume. */
236
+ resumeOffer(): ResumeOffer | null;
237
+ /**
238
+ * The several-backups manager for this store's destination, or null when
239
+ * there is nothing to manage several of (no Drive configured).
240
+ *
241
+ * The port under it - list, open by id, create, rename, delete - was the last
242
+ * thing an app still assembled from the session the store had built, and the
243
+ * one place it could pick the wrong file id. Built once and remembered; the
244
+ * backups module is imported on demand, so an app that never asks does not
245
+ * carry it.
246
+ */
247
+ backups(): Promise<BackupsManager | null>;
248
+ /**
249
+ * The destinations this store can offer, ready for a connect flow or widget:
250
+ * Drive first when the app configured it, a file always.
251
+ *
252
+ * Consumers were assembling this by hand from the very session the store
253
+ * built - and the order and the "no client id means no Drive card" rule were
254
+ * rediscovered each time. An app wanting a different offer (a WebDAV server,
255
+ * its own target) still writes its own object; this is the default, not a
256
+ * ceiling.
257
+ */
258
+ destinations(): ConnectTargets;
259
+ }
260
+ /**
261
+ * Open (or create) the app's local store. Awaits the initial load, so the
262
+ * returned store is ready: data readable, destination restored, first converge
263
+ * done. See SimpleOptions for the defaults.
264
+ */
265
+ declare function selfstore<S extends Record<string, SimpleRecord> = Record<string, SimpleRecord>>(app: string, options?: SimpleOptions): Promise<SimpleStore<S>>;
266
+
267
+ export { type CacheUnlock as C, type FileBytes as F, type PutFileInput as P, type SimpleRecord as S, type ConnectOutcome as a, type SimpleOptions as b, type SimpleStore as c, selfstore as s };
@@ -149,7 +149,7 @@ interface EncodeOptions {
149
149
  extraSecrets?: string[];
150
150
  }
151
151
 
152
- type SelfstoreErrorCode = 'BAD_FORMAT' | 'UNSUPPORTED_VERSION' | 'PASSWORD_REQUIRED' | 'DECRYPT_FAILED' | 'TOO_LARGE' | 'VERIFY_FAILED' | 'FOREIGN_BACKUP' | 'AUTH_EXPIRED' | 'TARGET_UNAVAILABLE' | 'TARGET_WRITE_FAILED' | 'TARGET_GONE' | 'NOT_CONNECTED' | 'WEAK_PASSWORD' | 'ENCRYPTION_REQUIRED' | 'UNEXPECTEDLY_UNENCRYPTED' | 'SCHEMA_TOO_NEW' | 'IDENTITY_REQUIRED' | 'SIGNATURE_INVALID' | 'NOT_A_RECIPIENT' | 'MANIFEST_ROLLBACK' | 'CLOCK_DRIFT';
152
+ type SelfstoreErrorCode = 'BAD_FORMAT' | 'UNSUPPORTED_VERSION' | 'PASSWORD_REQUIRED' | 'DECRYPT_FAILED' | 'TOO_LARGE' | 'VERIFY_FAILED' | 'FOREIGN_BACKUP' | 'AUTH_EXPIRED' | 'TARGET_UNAVAILABLE' | 'TARGET_WRITE_FAILED' | 'TARGET_GONE' | 'NOT_CONNECTED' | 'WEAK_PASSWORD' | 'ENCRYPTION_REQUIRED' | 'UNEXPECTEDLY_UNENCRYPTED' | 'SCHEMA_TOO_NEW' | 'IDENTITY_REQUIRED' | 'SIGNATURE_INVALID' | 'NOT_A_RECIPIENT' | 'MANIFEST_ROLLBACK' | 'CLOCK_DRIFT' | 'NOTARY_UNAVAILABLE' | 'NOTARY_REFUSED';
153
153
  /**
154
154
  * i18n key for an error code: lower-camel-cased under `error.`, e.g.
155
155
  * 'error.authExpired'. The library ships the key, the app owns the copy;
@@ -627,4 +627,4 @@ interface LocalStore {
627
627
  }
628
628
  declare function createLocalStore(opts: LocalStoreOptions): LocalStore;
629
629
 
630
- export { AuthExpiredError as A, type BackupTarget as B, errorLabelKey as C, isAuthExpired as D, type EncodeOptions as E, isReservedStoreMode as F, isSelfstoreError as G, type Header as H, type KdfParams as K, type LocalStore as L, type MirrorState as M, type PeerSource as P, RESERVED_COLLECTION_PREFIX as R, type StoreError as S, type TargetKind as T, type BuiltinTargetKind as a, type LocalStoreOptions as b, type LocalStoreState as c, type Mode as d, type PasswordCheck as e, type PasswordPolicy as f, type PasswordRequirement as g, type PeerState as h, RESERVED_STORE_MODES as i, type RecipientStanza as j, type ReplicaState as k, SelfstoreError as l, type SelfstoreErrorCode as m, type Severity as n, type Snapshot as o, type SnapshotFile as p, type StatusAction as q, type StatusDescriptor as r, type StatusInput as s, type StorageState as t, type StoreGroupConfig as u, type SyncJournalEntry as v, type SyncSource as w, checkPasswordPolicy as x, createLocalStore as y, deriveStatus as z };
630
+ export { AuthExpiredError as A, type BackupTarget as B, errorLabelKey as C, isAuthExpired as D, type EncodeOptions as E, isReservedStoreMode as F, isSelfstoreError as G, type Header as H, type KdfParams as K, type LocalStore as L, type MirrorState as M, type PeerSource as P, RESERVED_COLLECTION_PREFIX as R, type StoreError as S, type TargetKind as T, type Snapshot as a, type PasswordPolicy as b, type SnapshotFile as c, type StatusDescriptor as d, type LocalStoreState as e, type BuiltinTargetKind as f, type LocalStoreOptions as g, type Mode as h, type PasswordCheck as i, type PasswordRequirement as j, type PeerState as k, RESERVED_STORE_MODES as l, type RecipientStanza as m, type ReplicaState as n, SelfstoreError as o, type SelfstoreErrorCode as p, type Severity as q, type StatusAction as r, type StatusInput as s, type StorageState as t, type StoreGroupConfig as u, type SyncJournalEntry as v, type SyncSource as w, checkPasswordPolicy as x, createLocalStore as y, deriveStatus as z };
package/dist/sync.js CHANGED
@@ -1,5 +1,5 @@
1
- export { changes, createMeta, createNode, detectConflicts, merge, stamp } from './chunk-23UAUYSW.js';
1
+ export { changes, createMeta, createNode, detectConflicts, merge, stamp } from './chunk-GSZSZGSD.js';
2
2
  import './chunk-FJGWTBAL.js';
3
- import './chunk-XMC67RNM.js';
3
+ import './chunk-CSYEIXNY.js';
4
4
  //# sourceMappingURL=sync.js.map
5
5
  //# sourceMappingURL=sync.js.map
@@ -0,0 +1,10 @@
1
+ export { connect, fromSession, peer } from './chunk-GHSHIDF3.js';
2
+ import './chunk-LF3CC2P3.js';
3
+ import './chunk-RVOBONZF.js';
4
+ import './chunk-QBCU7OOP.js';
5
+ import './chunk-F4ZZEJ5H.js';
6
+ import './chunk-5UYPKCDB.js';
7
+ import './chunk-WXI2NAPA.js';
8
+ import './chunk-CSYEIXNY.js';
9
+ //# sourceMappingURL=webdav-5SHNR7CL.js.map
10
+ //# sourceMappingURL=webdav-5SHNR7CL.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"webdav-EEQKX5TZ.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"webdav-5SHNR7CL.js"}
package/dist/widgets.d.ts CHANGED
@@ -1,11 +1,11 @@
1
- import { S as StoreLike, F as FlowHost, C as ConnectTargets, a as ConnectFlowOptions, b as ConnectKind, c as ConnectFlow } from './connect-Bob2mofK.js';
1
+ import { S as StoreLike, F as FlowHost, C as ConnectTargets, a as ConnectFlowOptions, b as ConnectKind, c as ConnectFlow } from './connect-DoB_DN__.js';
2
2
  import { ShareEngine, ShareLevel, ShareFlow, JoinEngine, JoinFlow, ReplicaFlow } from './flows.js';
3
- import { f as BackupsManager } from './manager-Di6lNE4E.js';
4
- import './store-CIbiNoiE.js';
3
+ import { f as BackupsManager } from './manager-yCM0M0FL.js';
4
+ import './store-CKGrIFQU.js';
5
5
  import './cache-ilsK3Tki.js';
6
6
  import './sync.js';
7
- import './drive-86CHuTij.js';
8
- import './s3-BsbVn3fw.js';
7
+ import './drive--mndByvF.js';
8
+ import './s3-dG1SCnV1.js';
9
9
  import './machine-ALMkT3mk.js';
10
10
 
11
11
  /** Flat key -> string map; widgets merge a partial override over EN defaults. */
package/dist/widgets.js CHANGED
@@ -1,14 +1,15 @@
1
- import { saveToDisk, datedName } from './chunk-AUH35AAQ.js';
2
- import { connectFlow, shareFlow, joinFlow } from './chunk-LYO36VYB.js';
3
- import './chunk-3BWBBGFW.js';
4
- import { isOpenSupported } from './chunk-GW5CYP4C.js';
5
- import './chunk-3KAAPYPO.js';
6
- import './chunk-JTNFZV2B.js';
7
- import './chunk-757ZOSUI.js';
8
- import './chunk-HHPJPEEG.js';
9
- import './chunk-OY2A5DCB.js';
10
- import './chunk-RREJ2MFN.js';
11
- import './chunk-XMC67RNM.js';
1
+ import { saveToDisk, datedName } from './chunk-LQS7AMOD.js';
2
+ import { connectFlow, shareFlow, joinFlow } from './chunk-2PIYIIHY.js';
3
+ import './chunk-FQ5O4PHK.js';
4
+ import { isOpenSupported } from './chunk-2TIRUEXR.js';
5
+ import './chunk-2BNTCXQN.js';
6
+ import './chunk-25U6AKIX.js';
7
+ import './chunk-LF3CC2P3.js';
8
+ import './chunk-RVOBONZF.js';
9
+ import './chunk-F4ZZEJ5H.js';
10
+ import './chunk-5UYPKCDB.js';
11
+ import './chunk-WXI2NAPA.js';
12
+ import './chunk-CSYEIXNY.js';
12
13
 
13
14
  // src/widgets/icons.ts
14
15
  var INK = "#8a8f98";