@tensorix/metahub 0.3.2 → 0.4.1

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 (180) hide show
  1. package/README.md +23 -10
  2. package/README.zh-CN.md +23 -10
  3. package/dist/cli/edge-worker-script.d.ts +4 -0
  4. package/dist/cli/edge-worker-script.d.ts.map +1 -0
  5. package/dist/cli.js +16716 -8375
  6. package/dist/cli.js.map +110 -60
  7. package/dist/core/access-policy.d.ts +82 -0
  8. package/dist/core/access-policy.d.ts.map +1 -0
  9. package/dist/core/blobs-core.d.ts +19 -0
  10. package/dist/core/blobs-core.d.ts.map +1 -1
  11. package/dist/core/blobs.d.ts.map +1 -1
  12. package/dist/core/compact.d.ts.map +1 -1
  13. package/dist/core/config.d.ts +13 -0
  14. package/dist/core/config.d.ts.map +1 -1
  15. package/dist/core/crdt.d.ts +29 -2
  16. package/dist/core/crdt.d.ts.map +1 -1
  17. package/dist/core/data-map.d.ts +105 -0
  18. package/dist/core/data-map.d.ts.map +1 -0
  19. package/dist/core/db.d.ts +1 -1
  20. package/dist/core/db.d.ts.map +1 -1
  21. package/dist/core/documents.d.ts.map +1 -1
  22. package/dist/core/errors.d.ts +2 -0
  23. package/dist/core/errors.d.ts.map +1 -1
  24. package/dist/core/grants-core.d.ts +132 -0
  25. package/dist/core/grants-core.d.ts.map +1 -0
  26. package/dist/core/guest-intent.d.ts +33 -0
  27. package/dist/core/guest-intent.d.ts.map +1 -0
  28. package/dist/core/hash.d.ts +4 -0
  29. package/dist/core/hash.d.ts.map +1 -0
  30. package/dist/core/history.d.ts.map +1 -1
  31. package/dist/core/hlc.d.ts +5 -0
  32. package/dist/core/hlc.d.ts.map +1 -1
  33. package/dist/core/ids.d.ts +1 -1
  34. package/dist/core/ids.d.ts.map +1 -1
  35. package/dist/core/inject-runtime.d.ts +8 -0
  36. package/dist/core/inject-runtime.d.ts.map +1 -0
  37. package/dist/core/intent-retention.d.ts +23 -0
  38. package/dist/core/intent-retention.d.ts.map +1 -0
  39. package/dist/core/md/inline.d.ts +6 -2
  40. package/dist/core/md/inline.d.ts.map +1 -1
  41. package/dist/core/node.d.ts +13 -0
  42. package/dist/core/node.d.ts.map +1 -1
  43. package/dist/core/properties.d.ts +8 -0
  44. package/dist/core/properties.d.ts.map +1 -1
  45. package/dist/core/records.d.ts +31 -0
  46. package/dist/core/records.d.ts.map +1 -1
  47. package/dist/core/schema-init.d.ts +19 -2
  48. package/dist/core/schema-init.d.ts.map +1 -1
  49. package/dist/core/schema.d.ts +1 -1
  50. package/dist/core/schema.d.ts.map +1 -1
  51. package/dist/core/shares.d.ts +15 -0
  52. package/dist/core/shares.d.ts.map +1 -1
  53. package/dist/core/site-channel-lifecycle.d.ts +10 -0
  54. package/dist/core/site-channel-lifecycle.d.ts.map +1 -0
  55. package/dist/core/site-channel-store.d.ts +120 -0
  56. package/dist/core/site-channel-store.d.ts.map +1 -0
  57. package/dist/core/site-channels.d.ts +65 -0
  58. package/dist/core/site-channels.d.ts.map +1 -0
  59. package/dist/core/sites-core.d.ts +100 -7
  60. package/dist/core/sites-core.d.ts.map +1 -1
  61. package/dist/core/sites.d.ts +65 -2
  62. package/dist/core/sites.d.ts.map +1 -1
  63. package/dist/core/sync/anti-abuse.d.ts +26 -0
  64. package/dist/core/sync/anti-abuse.d.ts.map +1 -0
  65. package/dist/core/sync/auth.d.ts +30 -2
  66. package/dist/core/sync/auth.d.ts.map +1 -1
  67. package/dist/core/sync/blob-routes.d.ts.map +1 -1
  68. package/dist/core/sync/cf-api.d.ts +54 -0
  69. package/dist/core/sync/cf-api.d.ts.map +1 -0
  70. package/dist/core/sync/cf-oauth.d.ts +91 -0
  71. package/dist/core/sync/cf-oauth.d.ts.map +1 -0
  72. package/dist/core/sync/client.d.ts +12 -0
  73. package/dist/core/sync/client.d.ts.map +1 -1
  74. package/dist/core/sync/data-map-db.d.ts +8 -0
  75. package/dist/core/sync/data-map-db.d.ts.map +1 -0
  76. package/dist/core/sync/devices.d.ts +65 -0
  77. package/dist/core/sync/devices.d.ts.map +1 -0
  78. package/dist/core/sync/drop-host.d.ts +40 -0
  79. package/dist/core/sync/drop-host.d.ts.map +1 -0
  80. package/dist/core/sync/drop-keys.d.ts +64 -0
  81. package/dist/core/sync/drop-keys.d.ts.map +1 -0
  82. package/dist/core/sync/drop-protocol.d.ts +94 -0
  83. package/dist/core/sync/drop-protocol.d.ts.map +1 -0
  84. package/dist/core/sync/drop-pull.d.ts +67 -0
  85. package/dist/core/sync/drop-pull.d.ts.map +1 -0
  86. package/dist/core/sync/drop-wire.d.ts +39 -0
  87. package/dist/core/sync/drop-wire.d.ts.map +1 -0
  88. package/dist/core/sync/e2ee.d.ts +3 -0
  89. package/dist/core/sync/e2ee.d.ts.map +1 -1
  90. package/dist/core/sync/edge-config.d.ts +77 -0
  91. package/dist/core/sync/edge-config.d.ts.map +1 -0
  92. package/dist/core/sync/edge-connect.d.ts +13 -0
  93. package/dist/core/sync/edge-connect.d.ts.map +1 -0
  94. package/dist/core/sync/edge-service.d.ts +100 -0
  95. package/dist/core/sync/edge-service.d.ts.map +1 -0
  96. package/dist/core/sync/grants-routes.d.ts +46 -0
  97. package/dist/core/sync/grants-routes.d.ts.map +1 -0
  98. package/dist/core/sync/guest-session.d.ts +29 -0
  99. package/dist/core/sync/guest-session.d.ts.map +1 -0
  100. package/dist/core/sync/html-escape.d.ts +2 -0
  101. package/dist/core/sync/html-escape.d.ts.map +1 -0
  102. package/dist/core/sync/http-status.d.ts +14 -0
  103. package/dist/core/sync/http-status.d.ts.map +1 -0
  104. package/dist/core/sync/http-util.d.ts +6 -0
  105. package/dist/core/sync/http-util.d.ts.map +1 -0
  106. package/dist/core/sync/pairing.d.ts +9 -9
  107. package/dist/core/sync/pairing.d.ts.map +1 -1
  108. package/dist/core/sync/partition.d.ts +77 -0
  109. package/dist/core/sync/partition.d.ts.map +1 -0
  110. package/dist/core/sync/peers-routes.d.ts.map +1 -1
  111. package/dist/core/sync/peers.d.ts +77 -0
  112. package/dist/core/sync/peers.d.ts.map +1 -1
  113. package/dist/core/sync/protocol.d.ts +2 -0
  114. package/dist/core/sync/protocol.d.ts.map +1 -1
  115. package/dist/core/sync/rate-limit.d.ts +20 -0
  116. package/dist/core/sync/rate-limit.d.ts.map +1 -0
  117. package/dist/core/sync/recovery.d.ts +9 -0
  118. package/dist/core/sync/recovery.d.ts.map +1 -0
  119. package/dist/core/sync/room-client.d.ts +50 -0
  120. package/dist/core/sync/room-client.d.ts.map +1 -0
  121. package/dist/core/sync/room-peer.d.ts +62 -0
  122. package/dist/core/sync/room-peer.d.ts.map +1 -0
  123. package/dist/core/sync/room-protocol.d.ts +130 -0
  124. package/dist/core/sync/room-protocol.d.ts.map +1 -0
  125. package/dist/core/sync/room-serve.d.ts +38 -0
  126. package/dist/core/sync/room-serve.d.ts.map +1 -0
  127. package/dist/core/sync/room-url.d.ts +4 -0
  128. package/dist/core/sync/room-url.d.ts.map +1 -0
  129. package/dist/core/sync/routes.d.ts +4 -1
  130. package/dist/core/sync/routes.d.ts.map +1 -1
  131. package/dist/core/sync/seal.d.ts +22 -0
  132. package/dist/core/sync/seal.d.ts.map +1 -0
  133. package/dist/core/sync/server.d.ts +7 -0
  134. package/dist/core/sync/server.d.ts.map +1 -1
  135. package/dist/core/sync/share-actions.d.ts +55 -6
  136. package/dist/core/sync/share-actions.d.ts.map +1 -1
  137. package/dist/core/sync/share-export.d.ts +14 -0
  138. package/dist/core/sync/share-export.d.ts.map +1 -1
  139. package/dist/core/sync/share-render.d.ts +9 -1
  140. package/dist/core/sync/share-render.d.ts.map +1 -1
  141. package/dist/core/sync/share-serve.d.ts +5 -1
  142. package/dist/core/sync/share-serve.d.ts.map +1 -1
  143. package/dist/core/sync/site-channel-reconcile.d.ts +26 -0
  144. package/dist/core/sync/site-channel-reconcile.d.ts.map +1 -0
  145. package/dist/core/sync/site-publish-recovery.d.ts +32 -0
  146. package/dist/core/sync/site-publish-recovery.d.ts.map +1 -0
  147. package/dist/core/sync/site-reachability.d.ts +13 -0
  148. package/dist/core/sync/site-reachability.d.ts.map +1 -0
  149. package/dist/core/sync/sites-routes.d.ts.map +1 -1
  150. package/dist/core/sync/sites-serve.d.ts +24 -1
  151. package/dist/core/sync/sites-serve.d.ts.map +1 -1
  152. package/dist/core/sync/storage-s3-bun.d.ts +1 -24
  153. package/dist/core/sync/storage-s3-bun.d.ts.map +1 -1
  154. package/dist/core/sync/storage-s3-sign.d.ts +43 -0
  155. package/dist/core/sync/storage-s3-sign.d.ts.map +1 -0
  156. package/dist/core/sync/storage.d.ts +59 -0
  157. package/dist/core/sync/storage.d.ts.map +1 -1
  158. package/dist/db-worker.js +206 -76
  159. package/dist/edge-worker.js +4038 -0
  160. package/dist/index.js +13715 -7064
  161. package/dist/index.js.map +88 -42
  162. package/dist/metahub-sdk.js +10 -1
  163. package/dist/mh-runtime.js +1 -1
  164. package/dist/room/do-driver.d.ts +30 -0
  165. package/dist/room/do-driver.d.ts.map +1 -0
  166. package/dist/sw.js +10 -1
  167. package/dist/webui/server/edge-routes.d.ts +3 -0
  168. package/dist/webui/server/edge-routes.d.ts.map +1 -0
  169. package/dist/webui/server/json-handler.d.ts +4 -0
  170. package/dist/webui/server/json-handler.d.ts.map +1 -0
  171. package/dist/webui/server/routes.d.ts.map +1 -1
  172. package/dist/webui/server/share-routes.d.ts.map +1 -1
  173. package/dist/webui/server/site-hosting-routes.d.ts +7 -0
  174. package/dist/webui/server/site-hosting-routes.d.ts.map +1 -0
  175. package/dist/webui.js +208 -147
  176. package/dist/workers/edge-worker.d.ts +66 -0
  177. package/dist/workers/edge-worker.d.ts.map +1 -0
  178. package/dist/workers/room.d.ts +34 -0
  179. package/dist/workers/room.d.ts.map +1 -0
  180. package/package.json +2 -2
@@ -1,33 +1,10 @@
1
1
  import { type S3Config } from "./storage.ts";
2
- /** SigV4 presigned GET cap: 7 days (604800s) is the protocol maximum. */
3
- export declare const MAX_PRESIGN_SECONDS = 604800;
4
- /**
5
- * Build a presigned GET URL for one object (used by the object-storage share
6
- * path — the recipient fetches the ciphertext directly from the bucket, no
7
- * credential in the link). Addressing mirrors corsEndpoint (virtual-hosted vs
8
- * path-style). `expiresSec` is clamped to the 7-day SigV4 maximum.
9
- */
10
- export declare function presignGet(config: S3Config, key: string, expiresSec: number): Promise<string>;
11
- /** Read the bucket's current CORS config (raw XML), or null if none is set. */
12
- export declare function getBucketCors(config: S3Config): Promise<string | null>;
13
- /**
14
- * Build the PutBucketCors XML body from the bucket's current config. PutBucketCors
15
- * replaces the whole config, so we keep every rule that isn't ours and re-emit our
16
- * managed rule (id=metahub-pwa). `merge` decides our rule's origins:
17
- * - false (CLI `peer cors`): SET — exactly `origins` (lets the user shrink/reset).
18
- * - true (auto-open on bucket-attach): UNION with the managed rule's existing
19
- * origins, so attaching the same bucket from a second shell/origin (a homelab
20
- * server origin alongside the official PWA shell) adds to the allow-list
21
- * instead of clobbering it.
22
- * A wildcard `*` collapses the set. Pure (no I/O) so it's unit-testable.
23
- */
24
- export declare function buildCorsXml(existing: string | null, origins: string[], merge: boolean): string;
25
2
  /**
26
3
  * Allow a browser shell served from `origins` to talk to the bucket directly
27
4
  * (GET/PUT/HEAD/DELETE) via GET-merge-PUT (see buildCorsXml). `opts.merge` unions
28
5
  * with existing managed origins instead of replacing them — used when a second
29
6
  * origin attaches the same bucket. Content-MD5 is required by the CORS API
30
- * (S3 and COS both).
7
+ * (S3 and COS both) — the reason this one operation is Bun-only.
31
8
  */
32
9
  export declare function putBucketCors(config: S3Config, origins: string[], opts?: {
33
10
  merge?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"storage-s3-bun.d.ts","sourceRoot":"","sources":["../../../src/core/sync/storage-s3-bun.ts"],"names":[],"mappings":"AAUA,OAAO,EAML,KAAK,QAAQ,EACd,MAAM,cAAc,CAAC;AAiHtB,yEAAyE;AACzE,eAAO,MAAM,mBAAmB,SAAS,CAAC;AAE1C;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAanG;AAED,+EAA+E;AAC/E,wBAAsB,aAAa,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS5E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAoB/F;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,QAAQ,EAChB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7B,OAAO,CAAC,IAAI,CAAC,CAmBf"}
1
+ {"version":3,"file":"storage-s3-bun.d.ts","sourceRoot":"","sources":["../../../src/core/sync/storage-s3-bun.ts"],"names":[],"mappings":"AAgBA,OAAO,EAOL,KAAK,QAAQ,EACd,MAAM,cAAc,CAAC;AA8FtB;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,QAAQ,EAChB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7B,OAAO,CAAC,IAAI,CAAC,CAmBf"}
@@ -0,0 +1,43 @@
1
+ import { AwsClient } from "aws4fetch";
2
+ import { type S3Config } from "./storage.ts";
3
+ /** THE aws4fetch signer for this config — one construction shared by the CAS
4
+ * put, the CORS bootstrap and presignGet, so a signer-config fix can't land in
5
+ * one call site and 403 the others. */
6
+ export declare function awsSigner(config: S3Config): AwsClient;
7
+ /** Bucket-level base URL: virtual-hosted has the bucket in the host already
8
+ * (COS), path-style puts it in the path (R2/MinIO/S3). */
9
+ export declare function bucketBase(config: S3Config): string;
10
+ /** Object URL for one key. Each segment is encoded but the slashes are kept;
11
+ * aws4fetch decodes then canonically re-encodes for the signature, so a valid
12
+ * URL round-trips. One definition, so the signed URL and the fetched URL can't
13
+ * drift apart across runtimes. */
14
+ export declare function objectUrlOf(config: S3Config, key: string): string;
15
+ export declare const MANAGED_CORS_RULE_ID = "metahub-pwa";
16
+ export declare function corsEndpoint(config: S3Config): {
17
+ aws: AwsClient;
18
+ url: string;
19
+ };
20
+ /** SigV4 presigned GET cap: 7 days (604800s) is the protocol maximum. */
21
+ export declare const MAX_PRESIGN_SECONDS = 604800;
22
+ /**
23
+ * Build a presigned GET URL for one object (used by the object-storage share
24
+ * path — the recipient fetches the ciphertext directly from the bucket, no
25
+ * credential in the link). Addressing mirrors corsEndpoint (virtual-hosted vs
26
+ * path-style). `expiresSec` is clamped to the 7-day SigV4 maximum.
27
+ */
28
+ export declare function presignGet(config: S3Config, key: string, expiresSec: number): Promise<string>;
29
+ /** Read the bucket's current CORS config (raw XML), or null if none is set. */
30
+ export declare function getBucketCors(config: S3Config): Promise<string | null>;
31
+ /**
32
+ * Build the PutBucketCors XML body from the bucket's current config. PutBucketCors
33
+ * replaces the whole config, so we keep every rule that isn't ours and re-emit our
34
+ * managed rule (id=metahub-pwa). `merge` decides our rule's origins:
35
+ * - false (CLI `peer cors`): SET — exactly `origins` (lets the user shrink/reset).
36
+ * - true (auto-open on bucket-attach): UNION with the managed rule's existing
37
+ * origins, so attaching the same bucket from a second shell/origin (a homelab
38
+ * server origin alongside the official PWA shell) adds to the allow-list
39
+ * instead of clobbering it.
40
+ * A wildcard `*` collapses the set. Pure (no I/O) so it's unit-testable.
41
+ */
42
+ export declare function buildCorsXml(existing: string | null, origins: string[], merge: boolean): string;
43
+ //# sourceMappingURL=storage-s3-sign.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-s3-sign.d.ts","sourceRoot":"","sources":["../../../src/core/sync/storage-s3-sign.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAwB,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEnE;;wCAEwC;AACxC,wBAAgB,SAAS,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAOrD;AAED;2DAC2D;AAC3D,wBAAgB,UAAU,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAGnD;AAED;;;mCAGmC;AACnC,wBAAgB,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjE;AAWD,eAAO,MAAM,oBAAoB,gBAAgB,CAAC;AAElD,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG;IAAE,GAAG,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAE9E;AA6BD,yEAAyE;AACzE,eAAO,MAAM,mBAAmB,SAAS,CAAC;AAE1C;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMnG;AAED,+EAA+E;AAC/E,wBAAsB,aAAa,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS5E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAoB/F"}
@@ -1,5 +1,6 @@
1
1
  import type { DbDriver } from "../driver.ts";
2
2
  import type { SyncResult } from "./client.ts";
3
+ import { type KeyEnvelope } from "./e2ee.ts";
3
4
  /** An 's3' peer's bucket settings, stored as JSON in peers.config (local-only). */
4
5
  export interface S3Config {
5
6
  endpoint: string;
@@ -48,6 +49,12 @@ export interface StoragePutOpts {
48
49
  * compare-and-set so two devices initializing the same empty bucket can't
49
50
  * clobber each other's master key. */
50
51
  ifNoneMatch?: boolean;
52
+ /** Conditional overwrite (S3 `If-Match: <etag>`): fail with MhError("conflict")
53
+ * if the object's current ETag differs from this one — a compare-and-set for
54
+ * read-modify-write updates (drop-key rotation) so a concurrent writer can't
55
+ * silently clobber the loser's freshly-appended key. Both real clients honor
56
+ * it; a mock that ignores it simply performs an unconditional put. */
57
+ ifMatch?: string;
51
58
  }
52
59
  /** The minimal object-store surface storage-sync needs. Implemented per runtime:
53
60
  * Bun.S3Client on the CLI/desktop (storage-s3-bun.ts), aws4fetch SigV4 + fetch
@@ -67,6 +74,26 @@ type StorageClientFactory = (config: S3Config) => StorageClient;
67
74
  /** Register this runtime's S3 client builder (see the per-runtime impls). */
68
75
  export declare function setStorageClientFactory(f: StorageClientFactory): void;
69
76
  export declare function storageClientFor(config: S3Config): StorageClient;
77
+ /** Open a bucket's CORS for browser origins (PutBucketCors). Same runtime-adapter
78
+ * shape as the client factory, but unlike list/get/put/del this one has NO
79
+ * browser implementation and never will: PutBucketCors needs a Content-MD5 that
80
+ * WebCrypto can't produce, and the call would itself be a cross-origin request
81
+ * the bucket hasn't whitelisted yet. So a device holding the credentials opens
82
+ * CORS on the browser's behalf (see storage-s3-bun.ts). */
83
+ export type BucketCorsAdmin = (config: S3Config, origins: string[], opts?: {
84
+ merge?: boolean;
85
+ }) => Promise<void>;
86
+ export declare function setBucketCorsAdmin(f: BucketCorsAdmin): void;
87
+ /** null on runtimes that structurally can't do this (the browser replica) —
88
+ * callers report that honestly instead of pretending CORS was opened. */
89
+ export declare function bucketCorsAdmin(): BucketCorsAdmin | null;
90
+ /** The bucket's normalized namespace root for a configured prefix — exported so
91
+ * sibling namespaces (drop keys, publisher lease) key off the same layout. */
92
+ export declare function storageBasePrefix(prefix: string): string;
93
+ /** Object key of the write-inbox recipient keyring (drop-keys.ts): the wrapped
94
+ * P-256 private keys live next to keys/main.json, bucket-authoritative so any
95
+ * elected device can decrypt inbox envelopes. */
96
+ export declare function dropKeysObjectKey(prefix: string): string;
70
97
  /** Upload a blob's bytes to the bucket (idempotent via If-None-Match). Returns
71
98
  * true when actually written, false when the object already existed. */
72
99
  export declare function putBucketBlob(config: S3Config, hash: string, bytes: Uint8Array): Promise<boolean>;
@@ -78,6 +105,12 @@ export declare function putBucketBlob(config: S3Config, hash: string, bytes: Uin
78
105
  export declare function listBucketBlobHashes(config: S3Config): Promise<Set<string>>;
79
106
  /** Fetch a blob's bytes from the bucket, or null if absent. */
80
107
  export declare function getBucketBlob(config: S3Config, hash: string): Promise<Uint8Array | null>;
108
+ /** Discover the node prefixes under oplog/. Asks for a delimited (one-level)
109
+ * listing so a backend that honors it returns just the "<node>/" folders
110
+ * instead of every segment; nodesFromKeys derives the same node set whether the
111
+ * backend collapsed them or returned full keys. Exported for the device roster
112
+ * (sync/devices.ts refreshBucketPresence). */
113
+ export declare function listRemoteNodes(client: StorageClient, base: string): Promise<string[]>;
81
114
  /**
82
115
  * Resolve the master key for a bucket at setup: read keys/main.json and unwrap
83
116
  * with the passphrase, or — when absent — generate a key, wrap it, and upload
@@ -86,6 +119,32 @@ export declare function getBucketBlob(config: S3Config, hash: string): Promise<U
86
119
  * Wrong passphrase throws `auth` (from unwrapMasterKey).
87
120
  */
88
121
  export declare function provisionMasterKey(client: StorageClient, config: S3Config, passphrase: string): Promise<string | null>;
122
+ /** Current ETag of one object via a targeted list, or null when absent / the
123
+ * client doesn't surface etags (callers then forgo CAS). */
124
+ export declare function objectEtag(client: StorageClient, key: string): Promise<string | null>;
125
+ /** The bucket's wrapped-master-key envelope, or null when absent. Read-only —
126
+ * unlike provisionMasterKey this never creates one (rotate flows must not
127
+ * mint a fresh K that mismatches existing ciphertext). */
128
+ export declare function readMasterKeyEnvelope(client: StorageClient, config: S3Config): Promise<KeyEnvelope | null>;
129
+ /**
130
+ * Prove `rawKey` is THIS bucket's master key by decrypting a small existing
131
+ * ciphertext object (a snapshot's .vc sidecar, else any segment, else a
132
+ * snapshot body) — the GCM tag makes success a cryptographic verdict. Returns
133
+ * "no_ciphertext" for a bucket holding no encrypted objects yet (fresh/empty);
134
+ * callers proceed with a warning. Throws MhError("auth") on a mismatch — the
135
+ * guard that keeps a *valid key for the wrong bucket* (recovery-code mixups)
136
+ * from rewrapping this bucket's envelope and bricking future joins.
137
+ */
138
+ export declare function verifyMasterKey(client: StorageClient, config: S3Config, rawKey: Uint8Array): Promise<"verified" | "no_ciphertext">;
139
+ /**
140
+ * Rewrap keys/main.json under a NEW passphrase, keeping K unchanged — all
141
+ * ciphertext and every device's cached K stay valid; only devices joining
142
+ * later need the new passphrase. Compare-and-set: If-Match on the current
143
+ * envelope's ETag (If-None-Match create when absent — which also restores a
144
+ * deleted envelope). Throws "conflict" when a concurrent rewrap won; callers
145
+ * retry against the winner (idempotent — same K).
146
+ */
147
+ export declare function rewrapMasterKey(client: StorageClient, config: S3Config, rawKey: Uint8Array, newPassphrase: string): Promise<void>;
89
148
  /**
90
149
  * Publish a winners-only snapshot and truncate this node's own segments. Every
91
150
  * op we've uploaded so far is in the local oplog now, so the snapshot (winners
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/core/sync/storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/core/sync/storage.ts"],"names":[],"mappings":"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"}