@opendatalabs/personal-server-ts-core 0.0.1-canary.0d0705b

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 (185) hide show
  1. package/dist/auth/web3-signed.d.ts +48 -0
  2. package/dist/auth/web3-signed.d.ts.map +1 -0
  3. package/dist/auth/web3-signed.js +110 -0
  4. package/dist/auth/web3-signed.js.map +1 -0
  5. package/dist/config/defaults.d.ts +5 -0
  6. package/dist/config/defaults.d.ts.map +1 -0
  7. package/dist/config/defaults.js +7 -0
  8. package/dist/config/defaults.js.map +1 -0
  9. package/dist/config/index.d.ts +3 -0
  10. package/dist/config/index.d.ts.map +1 -0
  11. package/dist/config/index.js +3 -0
  12. package/dist/config/index.js.map +1 -0
  13. package/dist/config/loader.d.ts +9 -0
  14. package/dist/config/loader.d.ts.map +1 -0
  15. package/dist/config/loader.js +36 -0
  16. package/dist/config/loader.js.map +1 -0
  17. package/dist/errors/catalog.d.ts +41 -0
  18. package/dist/errors/catalog.d.ts.map +1 -0
  19. package/dist/errors/catalog.js +79 -0
  20. package/dist/errors/catalog.js.map +1 -0
  21. package/dist/gateway/client.d.ts +98 -0
  22. package/dist/gateway/client.d.ts.map +1 -0
  23. package/dist/gateway/client.js +171 -0
  24. package/dist/gateway/client.js.map +1 -0
  25. package/dist/grants/eip712.d.ts +28 -0
  26. package/dist/grants/eip712.d.ts.map +1 -0
  27. package/dist/grants/eip712.js +30 -0
  28. package/dist/grants/eip712.js.map +1 -0
  29. package/dist/grants/index.d.ts +5 -0
  30. package/dist/grants/index.d.ts.map +1 -0
  31. package/dist/grants/index.js +3 -0
  32. package/dist/grants/index.js.map +1 -0
  33. package/dist/grants/types.d.ts +29 -0
  34. package/dist/grants/types.d.ts.map +1 -0
  35. package/dist/grants/types.js +6 -0
  36. package/dist/grants/types.js.map +1 -0
  37. package/dist/grants/verify.d.ts +24 -0
  38. package/dist/grants/verify.d.ts.map +1 -0
  39. package/dist/grants/verify.js +71 -0
  40. package/dist/grants/verify.js.map +1 -0
  41. package/dist/keys/derive.d.ts +18 -0
  42. package/dist/keys/derive.d.ts.map +1 -0
  43. package/dist/keys/derive.js +43 -0
  44. package/dist/keys/derive.js.map +1 -0
  45. package/dist/keys/index.d.ts +3 -0
  46. package/dist/keys/index.d.ts.map +1 -0
  47. package/dist/keys/index.js +3 -0
  48. package/dist/keys/index.js.map +1 -0
  49. package/dist/keys/server-account.d.ts +28 -0
  50. package/dist/keys/server-account.d.ts.map +1 -0
  51. package/dist/keys/server-account.js +48 -0
  52. package/dist/keys/server-account.js.map +1 -0
  53. package/dist/logger/index.d.ts +5 -0
  54. package/dist/logger/index.d.ts.map +1 -0
  55. package/dist/logger/index.js +9 -0
  56. package/dist/logger/index.js.map +1 -0
  57. package/dist/logging/access-log.d.ts +15 -0
  58. package/dist/logging/access-log.d.ts.map +1 -0
  59. package/dist/logging/access-log.js +25 -0
  60. package/dist/logging/access-log.js.map +1 -0
  61. package/dist/logging/access-reader.d.ts +19 -0
  62. package/dist/logging/access-reader.d.ts.map +1 -0
  63. package/dist/logging/access-reader.js +50 -0
  64. package/dist/logging/access-reader.js.map +1 -0
  65. package/dist/schemas/data-file.d.ts +20 -0
  66. package/dist/schemas/data-file.d.ts.map +1 -0
  67. package/dist/schemas/data-file.js +23 -0
  68. package/dist/schemas/data-file.js.map +1 -0
  69. package/dist/schemas/server-config.d.ts +103 -0
  70. package/dist/schemas/server-config.d.ts.map +1 -0
  71. package/dist/schemas/server-config.js +109 -0
  72. package/dist/schemas/server-config.js.map +1 -0
  73. package/dist/scopes/index.d.ts +3 -0
  74. package/dist/scopes/index.d.ts.map +1 -0
  75. package/dist/scopes/index.js +3 -0
  76. package/dist/scopes/index.js.map +1 -0
  77. package/dist/scopes/match.d.ts +13 -0
  78. package/dist/scopes/match.d.ts.map +1 -0
  79. package/dist/scopes/match.js +23 -0
  80. package/dist/scopes/match.js.map +1 -0
  81. package/dist/scopes/parse.d.ts +12 -0
  82. package/dist/scopes/parse.d.ts.map +1 -0
  83. package/dist/scopes/parse.js +29 -0
  84. package/dist/scopes/parse.js.map +1 -0
  85. package/dist/signing/eip712.d.ts +56 -0
  86. package/dist/signing/eip712.d.ts.map +1 -0
  87. package/dist/signing/eip712.js +57 -0
  88. package/dist/signing/eip712.js.map +1 -0
  89. package/dist/signing/index.d.ts +4 -0
  90. package/dist/signing/index.d.ts.map +1 -0
  91. package/dist/signing/index.js +4 -0
  92. package/dist/signing/index.js.map +1 -0
  93. package/dist/signing/request-signer.d.ts +12 -0
  94. package/dist/signing/request-signer.d.ts.map +1 -0
  95. package/dist/signing/request-signer.js +47 -0
  96. package/dist/signing/request-signer.js.map +1 -0
  97. package/dist/signing/signer.d.ts +14 -0
  98. package/dist/signing/signer.d.ts.map +1 -0
  99. package/dist/signing/signer.js +37 -0
  100. package/dist/signing/signer.js.map +1 -0
  101. package/dist/storage/adapters/index.d.ts +3 -0
  102. package/dist/storage/adapters/index.d.ts.map +1 -0
  103. package/dist/storage/adapters/index.js +2 -0
  104. package/dist/storage/adapters/index.js.map +1 -0
  105. package/dist/storage/adapters/interface.d.ts +47 -0
  106. package/dist/storage/adapters/interface.d.ts.map +1 -0
  107. package/dist/storage/adapters/interface.js +2 -0
  108. package/dist/storage/adapters/interface.js.map +1 -0
  109. package/dist/storage/adapters/vana.d.ts +32 -0
  110. package/dist/storage/adapters/vana.d.ts.map +1 -0
  111. package/dist/storage/adapters/vana.js +96 -0
  112. package/dist/storage/adapters/vana.js.map +1 -0
  113. package/dist/storage/encryption/decrypt.d.ts +10 -0
  114. package/dist/storage/encryption/decrypt.d.ts.map +1 -0
  115. package/dist/storage/encryption/decrypt.js +19 -0
  116. package/dist/storage/encryption/decrypt.js.map +1 -0
  117. package/dist/storage/encryption/encrypt.d.ts +10 -0
  118. package/dist/storage/encryption/encrypt.d.ts.map +1 -0
  119. package/dist/storage/encryption/encrypt.js +19 -0
  120. package/dist/storage/encryption/encrypt.js.map +1 -0
  121. package/dist/storage/encryption/index.d.ts +3 -0
  122. package/dist/storage/encryption/index.d.ts.map +1 -0
  123. package/dist/storage/encryption/index.js +3 -0
  124. package/dist/storage/encryption/index.js.map +1 -0
  125. package/dist/storage/hierarchy/index.d.ts +4 -0
  126. package/dist/storage/hierarchy/index.d.ts.map +1 -0
  127. package/dist/storage/hierarchy/index.js +3 -0
  128. package/dist/storage/hierarchy/index.js.map +1 -0
  129. package/dist/storage/hierarchy/manager.d.ts +23 -0
  130. package/dist/storage/hierarchy/manager.d.ts.map +1 -0
  131. package/dist/storage/hierarchy/manager.js +60 -0
  132. package/dist/storage/hierarchy/manager.js.map +1 -0
  133. package/dist/storage/hierarchy/paths.d.ts +11 -0
  134. package/dist/storage/hierarchy/paths.d.ts.map +1 -0
  135. package/dist/storage/hierarchy/paths.js +36 -0
  136. package/dist/storage/hierarchy/paths.js.map +1 -0
  137. package/dist/storage/index/index.d.ts +4 -0
  138. package/dist/storage/index/index.d.ts.map +1 -0
  139. package/dist/storage/index/index.js +3 -0
  140. package/dist/storage/index/index.js.map +1 -0
  141. package/dist/storage/index/manager.d.ts +37 -0
  142. package/dist/storage/index/manager.d.ts.map +1 -0
  143. package/dist/storage/index/manager.js +132 -0
  144. package/dist/storage/index/manager.js.map +1 -0
  145. package/dist/storage/index/schema.d.ts +4 -0
  146. package/dist/storage/index/schema.d.ts.map +1 -0
  147. package/dist/storage/index/schema.js +27 -0
  148. package/dist/storage/index/schema.js.map +1 -0
  149. package/dist/storage/index/types.d.ts +20 -0
  150. package/dist/storage/index/types.d.ts.map +1 -0
  151. package/dist/storage/index/types.js +2 -0
  152. package/dist/storage/index/types.js.map +1 -0
  153. package/dist/sync/cursor.d.ts +12 -0
  154. package/dist/sync/cursor.d.ts.map +1 -0
  155. package/dist/sync/cursor.js +19 -0
  156. package/dist/sync/cursor.js.map +1 -0
  157. package/dist/sync/engine/sync-manager.d.ts +25 -0
  158. package/dist/sync/engine/sync-manager.d.ts.map +1 -0
  159. package/dist/sync/engine/sync-manager.js +136 -0
  160. package/dist/sync/engine/sync-manager.js.map +1 -0
  161. package/dist/sync/index.d.ts +4 -0
  162. package/dist/sync/index.d.ts.map +1 -0
  163. package/dist/sync/index.js +3 -0
  164. package/dist/sync/index.js.map +1 -0
  165. package/dist/sync/types.d.ts +40 -0
  166. package/dist/sync/types.d.ts.map +1 -0
  167. package/dist/sync/types.js +2 -0
  168. package/dist/sync/types.js.map +1 -0
  169. package/dist/sync/workers/download.d.ts +41 -0
  170. package/dist/sync/workers/download.d.ts.map +1 -0
  171. package/dist/sync/workers/download.js +90 -0
  172. package/dist/sync/workers/download.js.map +1 -0
  173. package/dist/sync/workers/upload.d.ts +43 -0
  174. package/dist/sync/workers/upload.d.ts.map +1 -0
  175. package/dist/sync/workers/upload.js +75 -0
  176. package/dist/sync/workers/upload.js.map +1 -0
  177. package/dist/test-utils/index.d.ts +2 -0
  178. package/dist/test-utils/index.d.ts.map +1 -0
  179. package/dist/test-utils/index.js +2 -0
  180. package/dist/test-utils/index.js.map +1 -0
  181. package/dist/test-utils/wallet.d.ts +40 -0
  182. package/dist/test-utils/wallet.d.ts.map +1 -0
  183. package/dist/test-utils/wallet.js +72 -0
  184. package/dist/test-utils/wallet.js.map +1 -0
  185. package/package.json +115 -0
@@ -0,0 +1,4 @@
1
+ export { fileRegistrationDomain, grantRegistrationDomain, grantRevocationDomain, serverRegistrationDomain, FILE_REGISTRATION_TYPES, GRANT_REGISTRATION_TYPES, GRANT_REVOCATION_TYPES, SERVER_REGISTRATION_TYPES, } from "./eip712.js";
2
+ export { createServerSigner } from "./signer.js";
3
+ export { createRequestSigner } from "./request-signer.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/signing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,yBAAyB,GAK1B,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,kBAAkB,EAAqB,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * RequestSigner — produces Web3Signed Authorization headers for HTTP requests.
3
+ * Used by the Vana Storage adapter for authenticated blob operations.
4
+ */
5
+ import type { ServerAccount } from "../keys/server-account.js";
6
+ import type { RequestSigner } from "../storage/adapters/vana.js";
7
+ /**
8
+ * Create a RequestSigner that produces Web3Signed Authorization headers
9
+ * using the server account's EIP-191 signing capability.
10
+ */
11
+ export declare function createRequestSigner(account: ServerAccount): RequestSigner;
12
+ //# sourceMappingURL=request-signer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-signer.d.ts","sourceRoot":"","sources":["../../src/signing/request-signer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAWjE;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,CAsCzE"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * RequestSigner — produces Web3Signed Authorization headers for HTTP requests.
3
+ * Used by the Vana Storage adapter for authenticated blob operations.
4
+ */
5
+ import { createHash } from "node:crypto";
6
+ /** Base64url encode a string (no padding). */
7
+ function base64urlEncode(input) {
8
+ return Buffer.from(input, "utf-8")
9
+ .toString("base64")
10
+ .replace(/\+/g, "-")
11
+ .replace(/\//g, "_")
12
+ .replace(/=+$/, "");
13
+ }
14
+ /**
15
+ * Create a RequestSigner that produces Web3Signed Authorization headers
16
+ * using the server account's EIP-191 signing capability.
17
+ */
18
+ export function createRequestSigner(account) {
19
+ return {
20
+ async signRequest(params) {
21
+ const now = Math.floor(Date.now() / 1000);
22
+ const payload = {
23
+ aud: params.aud,
24
+ bodyHash: params.body
25
+ ? createHash("sha256").update(params.body).digest("hex")
26
+ : "",
27
+ exp: now + 300,
28
+ iat: now,
29
+ method: params.method,
30
+ uri: params.uri,
31
+ };
32
+ // Sort keys for deterministic serialization
33
+ const sortedPayload = Object.keys(payload)
34
+ .sort()
35
+ .reduce((acc, key) => {
36
+ acc[key] = payload[key];
37
+ return acc;
38
+ }, {});
39
+ const payloadJson = JSON.stringify(sortedPayload);
40
+ const payloadBase64 = base64urlEncode(payloadJson);
41
+ // Sign the base64url string via EIP-191
42
+ const signature = await account.signMessage(payloadBase64);
43
+ return `Web3Signed ${payloadBase64}.${signature}`;
44
+ },
45
+ };
46
+ }
47
+ //# sourceMappingURL=request-signer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-signer.js","sourceRoot":"","sources":["../../src/signing/request-signer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,8CAA8C;AAC9C,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC;SAC/B,QAAQ,CAAC,QAAQ,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAsB;IACxD,OAAO;QACL,KAAK,CAAC,WAAW,CAAC,MAKjB;YACC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAE1C,MAAM,OAAO,GAA4B;gBACvC,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,QAAQ,EAAE,MAAM,CAAC,IAAI;oBACnB,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBACxD,CAAC,CAAC,EAAE;gBACN,GAAG,EAAE,GAAG,GAAG,GAAG;gBACd,GAAG,EAAE,GAAG;gBACR,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,GAAG,EAAE,MAAM,CAAC,GAAG;aAChB,CAAC;YAEF,4CAA4C;YAC5C,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;iBACvC,IAAI,EAAE;iBACN,MAAM,CAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBAC5C,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;gBACxB,OAAO,GAAG,CAAC;YACb,CAAC,EAAE,EAAE,CAAC,CAAC;YAET,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAClD,MAAM,aAAa,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;YAEnD,wCAAwC;YACxC,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;YAE3D,OAAO,cAAc,aAAa,IAAI,SAAS,EAAE,CAAC;QACpD,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * ServerSigner — signs EIP-712 messages for gateway write operations.
3
+ * Uses the ServerAccount's derived key for all signatures.
4
+ */
5
+ import type { ServerAccount } from "../keys/server-account.js";
6
+ import type { GatewayConfig } from "../schemas/server-config.js";
7
+ import { type FileRegistrationMessage, type GrantRegistrationMessage, type GrantRevocationMessage } from "./eip712.js";
8
+ export interface ServerSigner {
9
+ signFileRegistration(msg: FileRegistrationMessage): Promise<`0x${string}`>;
10
+ signGrantRegistration(msg: GrantRegistrationMessage): Promise<`0x${string}`>;
11
+ signGrantRevocation(msg: GrantRevocationMessage): Promise<`0x${string}`>;
12
+ }
13
+ export declare function createServerSigner(account: ServerAccount, gatewayConfig: GatewayConfig): ServerSigner;
14
+ //# sourceMappingURL=signer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/signing/signer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAOL,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC5B,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,YAAY;IAC3B,oBAAoB,CAAC,GAAG,EAAE,uBAAuB,GAAG,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;IAC3E,qBAAqB,CAAC,GAAG,EAAE,wBAAwB,GAAG,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;IAC7E,mBAAmB,CAAC,GAAG,EAAE,sBAAsB,GAAG,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;CAC1E;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,aAAa,EACtB,aAAa,EAAE,aAAa,GAC3B,YAAY,CAsCd"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * ServerSigner — signs EIP-712 messages for gateway write operations.
3
+ * Uses the ServerAccount's derived key for all signatures.
4
+ */
5
+ import { fileRegistrationDomain, grantRegistrationDomain, grantRevocationDomain, FILE_REGISTRATION_TYPES, GRANT_REGISTRATION_TYPES, GRANT_REVOCATION_TYPES, } from "./eip712.js";
6
+ export function createServerSigner(account, gatewayConfig) {
7
+ return {
8
+ async signFileRegistration(msg) {
9
+ return account.signTypedData({
10
+ domain: fileRegistrationDomain(gatewayConfig),
11
+ types: FILE_REGISTRATION_TYPES,
12
+ primaryType: "FileRegistration",
13
+ message: msg,
14
+ });
15
+ },
16
+ async signGrantRegistration(msg) {
17
+ return account.signTypedData({
18
+ domain: grantRegistrationDomain(gatewayConfig),
19
+ types: GRANT_REGISTRATION_TYPES,
20
+ primaryType: "GrantRegistration",
21
+ message: {
22
+ ...msg,
23
+ fileIds: msg.fileIds.map((id) => id),
24
+ },
25
+ });
26
+ },
27
+ async signGrantRevocation(msg) {
28
+ return account.signTypedData({
29
+ domain: grantRevocationDomain(gatewayConfig),
30
+ types: GRANT_REVOCATION_TYPES,
31
+ primaryType: "GrantRevocation",
32
+ message: msg,
33
+ });
34
+ },
35
+ };
36
+ }
37
+ //# sourceMappingURL=signer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.js","sourceRoot":"","sources":["../../src/signing/signer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,GAIvB,MAAM,aAAa,CAAC;AAQrB,MAAM,UAAU,kBAAkB,CAChC,OAAsB,EACtB,aAA4B;IAE5B,OAAO;QACL,KAAK,CAAC,oBAAoB,CACxB,GAA4B;YAE5B,OAAO,OAAO,CAAC,aAAa,CAAC;gBAC3B,MAAM,EAAE,sBAAsB,CAAC,aAAa,CAAC;gBAC7C,KAAK,EAAE,uBAAuB;gBAC9B,WAAW,EAAE,kBAAkB;gBAC/B,OAAO,EAAE,GAAyC;aACnD,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,qBAAqB,CACzB,GAA6B;YAE7B,OAAO,OAAO,CAAC,aAAa,CAAC;gBAC3B,MAAM,EAAE,uBAAuB,CAAC,aAAa,CAAC;gBAC9C,KAAK,EAAE,wBAAwB;gBAC/B,WAAW,EAAE,mBAAmB;gBAChC,OAAO,EAAE;oBACP,GAAG,GAAG;oBACN,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;iBACC;aACxC,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,mBAAmB,CACvB,GAA2B;YAE3B,OAAO,OAAO,CAAC,aAAa,CAAC;gBAC3B,MAAM,EAAE,qBAAqB,CAAC,aAAa,CAAC;gBAC5C,KAAK,EAAE,sBAAsB;gBAC7B,WAAW,EAAE,iBAAiB;gBAC9B,OAAO,EAAE,GAAyC;aACnD,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export type { StorageAdapter } from "./interface.js";
2
+ export { createVanaStorageAdapter, type VanaStorageOptions, type RequestSigner, } from "./vana.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/adapters/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EACL,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,KAAK,aAAa,GACnB,MAAM,WAAW,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createVanaStorageAdapter, } from "./vana.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/adapters/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,GAGzB,MAAM,WAAW,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Abstract storage backend adapter.
3
+ * All methods operate on encrypted binary blobs.
4
+ * Keys are opaque strings (e.g., "{scope}/{collectedAt}").
5
+ */
6
+ export interface StorageAdapter {
7
+ /**
8
+ * Upload an encrypted blob to the storage backend.
9
+ * @param key - unique storage key / path
10
+ * @param data - encrypted binary data
11
+ * @returns URL where the blob is accessible
12
+ */
13
+ upload(key: string, data: Uint8Array): Promise<string>;
14
+ /**
15
+ * Download an encrypted blob from the storage backend.
16
+ * @param url - storage URL returned by upload()
17
+ * @returns encrypted binary data
18
+ * @throws if blob not found
19
+ */
20
+ download(url: string): Promise<Uint8Array>;
21
+ /**
22
+ * Delete an encrypted blob from the storage backend.
23
+ * @param url - storage URL
24
+ * @returns true if deleted, false if not found
25
+ */
26
+ delete(url: string): Promise<boolean>;
27
+ /**
28
+ * Check if a blob exists in the storage backend.
29
+ * @param url - storage URL
30
+ * @returns true if blob exists
31
+ */
32
+ exists(url: string): Promise<boolean>;
33
+ /**
34
+ * Bulk delete all blobs for a scope.
35
+ * Optional — not all backends support bulk delete.
36
+ * @param scope - scope identifier (dot notation)
37
+ * @returns count of blobs deleted
38
+ */
39
+ deleteScope?(scope: string): Promise<number>;
40
+ /**
41
+ * Delete all blobs for the owner.
42
+ * Optional — not all backends support bulk delete.
43
+ * @returns count of blobs deleted
44
+ */
45
+ deleteAll?(): Promise<number>;
46
+ }
47
+ //# sourceMappingURL=interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/storage/adapters/interface.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEvD;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAE3C;;;;OAIG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtC;;;;OAIG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtC;;;;;OAKG;IACH,WAAW,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE7C;;;;OAIG;IACH,SAAS,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../src/storage/adapters/interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Vana Storage adapter.
3
+ * Uses REST: PUT/GET/DELETE/HEAD against {apiUrl}/v1/blobs/{ownerAddress}/{key}
4
+ * Auth: Web3Signed header on all requests (see vana-storage-design.md Section 3).
5
+ * URL format: full HTTPS URL (no vana:// scheme).
6
+ */
7
+ import type { StorageAdapter } from "./interface.js";
8
+ /**
9
+ * Signs HTTP requests for Web3Signed auth.
10
+ * Produces "Web3Signed {base64url(payload)}.{signature}" header values.
11
+ * Implementation provided by the caller (typically wraps the server keypair).
12
+ */
13
+ export interface RequestSigner {
14
+ /**
15
+ * Produce a Web3Signed Authorization header value for an HTTP request.
16
+ * @param params - request metadata to sign
17
+ * @returns full Authorization header value (e.g., "Web3Signed ...")
18
+ */
19
+ signRequest(params: {
20
+ aud: string;
21
+ method: string;
22
+ uri: string;
23
+ body?: Uint8Array;
24
+ }): Promise<string>;
25
+ }
26
+ export interface VanaStorageOptions {
27
+ apiUrl: string;
28
+ ownerAddress: string;
29
+ signer: RequestSigner;
30
+ }
31
+ export declare function createVanaStorageAdapter(options: VanaStorageOptions): StorageAdapter;
32
+ //# sourceMappingURL=vana.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vana.d.ts","sourceRoot":"","sources":["../../../src/storage/adapters/vana.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE;QAClB,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,CAAC,EAAE,UAAU,CAAC;KACnB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,kBAAkB,GAC1B,cAAc,CA6GhB"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Vana Storage adapter.
3
+ * Uses REST: PUT/GET/DELETE/HEAD against {apiUrl}/v1/blobs/{ownerAddress}/{key}
4
+ * Auth: Web3Signed header on all requests (see vana-storage-design.md Section 3).
5
+ * URL format: full HTTPS URL (no vana:// scheme).
6
+ */
7
+ export function createVanaStorageAdapter(options) {
8
+ const base = options.apiUrl.replace(/\/+$/, "");
9
+ const { ownerAddress, signer } = options;
10
+ function blobUrl(key) {
11
+ return `${base}/v1/blobs/${ownerAddress}/${key}`;
12
+ }
13
+ async function authHeaders(method, uri, body) {
14
+ const header = await signer.signRequest({
15
+ aud: options.apiUrl,
16
+ method,
17
+ uri,
18
+ body,
19
+ });
20
+ return { Authorization: header };
21
+ }
22
+ return {
23
+ async upload(key, data) {
24
+ const url = blobUrl(key);
25
+ const uri = `/v1/blobs/${ownerAddress}/${key}`;
26
+ const auth = await authHeaders("PUT", uri, data);
27
+ const res = await fetch(url, {
28
+ method: "PUT",
29
+ body: Buffer.from(data),
30
+ headers: {
31
+ "Content-Type": "application/octet-stream",
32
+ ...auth,
33
+ },
34
+ });
35
+ if (!res.ok) {
36
+ throw new Error(`Vana Storage upload failed: ${res.status} ${res.statusText}`);
37
+ }
38
+ return url;
39
+ },
40
+ async download(storageUrl) {
41
+ const uri = new URL(storageUrl).pathname;
42
+ const auth = await authHeaders("GET", uri);
43
+ const res = await fetch(storageUrl, { headers: auth });
44
+ if (res.status === 404) {
45
+ throw new Error(`Blob not found: ${storageUrl}`);
46
+ }
47
+ if (!res.ok) {
48
+ throw new Error(`Vana Storage download failed: ${res.status} ${res.statusText}`);
49
+ }
50
+ return new Uint8Array(await res.arrayBuffer());
51
+ },
52
+ async delete(storageUrl) {
53
+ const uri = new URL(storageUrl).pathname;
54
+ const auth = await authHeaders("DELETE", uri);
55
+ const res = await fetch(storageUrl, {
56
+ method: "DELETE",
57
+ headers: auth,
58
+ });
59
+ if (res.status === 404)
60
+ return false;
61
+ if (!res.ok) {
62
+ throw new Error(`Vana Storage delete failed: ${res.status} ${res.statusText}`);
63
+ }
64
+ return true;
65
+ },
66
+ async exists(storageUrl) {
67
+ const uri = new URL(storageUrl).pathname;
68
+ const auth = await authHeaders("HEAD", uri);
69
+ const res = await fetch(storageUrl, { method: "HEAD", headers: auth });
70
+ return res.ok;
71
+ },
72
+ async deleteScope(scope) {
73
+ const url = `${base}/v1/blobs/${ownerAddress}/${scope}`;
74
+ const uri = `/v1/blobs/${ownerAddress}/${scope}`;
75
+ const auth = await authHeaders("DELETE", uri);
76
+ const res = await fetch(url, { method: "DELETE", headers: auth });
77
+ if (!res.ok) {
78
+ throw new Error(`Vana Storage deleteScope failed: ${res.status} ${res.statusText}`);
79
+ }
80
+ const body = (await res.json());
81
+ return body.count ?? 0;
82
+ },
83
+ async deleteAll() {
84
+ const url = `${base}/v1/blobs/${ownerAddress}`;
85
+ const uri = `/v1/blobs/${ownerAddress}`;
86
+ const auth = await authHeaders("DELETE", uri);
87
+ const res = await fetch(url, { method: "DELETE", headers: auth });
88
+ if (!res.ok) {
89
+ throw new Error(`Vana Storage deleteAll failed: ${res.status} ${res.statusText}`);
90
+ }
91
+ const body = (await res.json());
92
+ return body.count ?? 0;
93
+ },
94
+ };
95
+ }
96
+ //# sourceMappingURL=vana.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vana.js","sourceRoot":"","sources":["../../../src/storage/adapters/vana.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Decrypt an OpenPGP password-encrypted binary.
3
+ *
4
+ * @param encrypted - OpenPGP encrypted binary data
5
+ * @param password - hex-encoded scope key
6
+ * @returns plaintext Uint8Array
7
+ * @throws if password is wrong or data is corrupted
8
+ */
9
+ export declare function decryptWithPassword(encrypted: Uint8Array, password: string): Promise<Uint8Array>;
10
+ //# sourceMappingURL=decrypt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decrypt.d.ts","sourceRoot":"","sources":["../../../src/storage/encryption/decrypt.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,UAAU,EACrB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC,CAQrB"}
@@ -0,0 +1,19 @@
1
+ import * as openpgp from "openpgp";
2
+ /**
3
+ * Decrypt an OpenPGP password-encrypted binary.
4
+ *
5
+ * @param encrypted - OpenPGP encrypted binary data
6
+ * @param password - hex-encoded scope key
7
+ * @returns plaintext Uint8Array
8
+ * @throws if password is wrong or data is corrupted
9
+ */
10
+ export async function decryptWithPassword(encrypted, password) {
11
+ const message = await openpgp.readMessage({ binaryMessage: encrypted });
12
+ const { data } = await openpgp.decrypt({
13
+ message,
14
+ passwords: [password],
15
+ format: "binary",
16
+ });
17
+ return data;
18
+ }
19
+ //# sourceMappingURL=decrypt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decrypt.js","sourceRoot":"","sources":["../../../src/storage/encryption/decrypt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAEnC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAAqB,EACrB,QAAgB;IAEhB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC;IACxE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC;QACrC,OAAO;QACP,SAAS,EAAE,CAAC,QAAQ,CAAC;QACrB,MAAM,EAAE,QAAQ;KACjB,CAAC,CAAC;IACH,OAAO,IAAkB,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Encrypt plaintext using OpenPGP password-based encryption.
3
+ * Produces the same binary format as vana-sdk.
4
+ *
5
+ * @param plaintext - data to encrypt (typically JSON.stringify of envelope)
6
+ * @param password - hex-encoded scope key from deriveScopeKey()
7
+ * @returns OpenPGP encrypted binary (Uint8Array)
8
+ */
9
+ export declare function encryptWithPassword(plaintext: Uint8Array, password: string): Promise<Uint8Array>;
10
+ //# sourceMappingURL=encrypt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../../src/storage/encryption/encrypt.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,UAAU,EACrB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC,CAQrB"}
@@ -0,0 +1,19 @@
1
+ import * as openpgp from "openpgp";
2
+ /**
3
+ * Encrypt plaintext using OpenPGP password-based encryption.
4
+ * Produces the same binary format as vana-sdk.
5
+ *
6
+ * @param plaintext - data to encrypt (typically JSON.stringify of envelope)
7
+ * @param password - hex-encoded scope key from deriveScopeKey()
8
+ * @returns OpenPGP encrypted binary (Uint8Array)
9
+ */
10
+ export async function encryptWithPassword(plaintext, password) {
11
+ const message = await openpgp.createMessage({ binary: plaintext });
12
+ const encrypted = await openpgp.encrypt({
13
+ message,
14
+ passwords: [password],
15
+ format: "binary",
16
+ });
17
+ return encrypted;
18
+ }
19
+ //# sourceMappingURL=encrypt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encrypt.js","sourceRoot":"","sources":["../../../src/storage/encryption/encrypt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAEnC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAAqB,EACrB,QAAgB;IAEhB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC;QACtC,OAAO;QACP,SAAS,EAAE,CAAC,QAAQ,CAAC;QACrB,MAAM,EAAE,QAAQ;KACjB,CAAC,CAAC;IACH,OAAO,SAAuB,CAAC;AACjC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { encryptWithPassword } from "./encrypt.js";
2
+ export { decryptWithPassword } from "./decrypt.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/encryption/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { encryptWithPassword } from "./encrypt.js";
2
+ export { decryptWithPassword } from "./decrypt.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/encryption/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { timestampToFilename, filenameToTimestamp, buildDataFilePath, buildScopeDir, generateCollectedAt, } from "./paths.js";
2
+ export { writeDataFile, readDataFile, listVersions, deleteDataFile, deleteAllForScope, } from "./manager.js";
3
+ export type { HierarchyManagerOptions, WriteResult } from "./manager.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/hierarchy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { timestampToFilename, filenameToTimestamp, buildDataFilePath, buildScopeDir, generateCollectedAt, } from "./paths.js";
2
+ export { writeDataFile, readDataFile, listVersions, deleteDataFile, deleteAllForScope, } from "./manager.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/hierarchy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,iBAAiB,GAClB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { DataFileEnvelope } from "../../schemas/data-file.js";
2
+ export interface HierarchyManagerOptions {
3
+ dataDir: string;
4
+ }
5
+ export interface WriteResult {
6
+ path: string;
7
+ relativePath: string;
8
+ sizeBytes: number;
9
+ }
10
+ /** Atomic write: mkdir -p, write temp file, rename */
11
+ export declare function writeDataFile(options: HierarchyManagerOptions, envelope: DataFileEnvelope): Promise<WriteResult>;
12
+ /** Read and parse a data file */
13
+ export declare function readDataFile(options: HierarchyManagerOptions, scope: string, collectedAt: string): Promise<DataFileEnvelope>;
14
+ /** List version filenames for a scope, newest first. Empty array if scope dir doesn't exist. */
15
+ export declare function listVersions(options: HierarchyManagerOptions, scope: string): Promise<string[]>;
16
+ /** Delete a single data file */
17
+ export declare function deleteDataFile(options: HierarchyManagerOptions, scope: string, collectedAt: string): Promise<void>;
18
+ /**
19
+ * Delete all files for a scope by removing the scope directory recursively.
20
+ * No-op if directory doesn't exist.
21
+ */
22
+ export declare function deleteAllForScope(options: HierarchyManagerOptions, scope: string): Promise<void>;
23
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/storage/hierarchy/manager.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAQnE,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,sDAAsD;AACtD,wBAAsB,aAAa,CACjC,OAAO,EAAE,uBAAuB,EAChC,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,WAAW,CAAC,CAuBtB;AAED,iCAAiC;AACjC,wBAAsB,YAAY,CAChC,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAI3B;AAED,gGAAgG;AAChG,wBAAsB,YAAY,CAChC,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBnB;AAED,gCAAgC;AAChC,wBAAsB,cAAc,CAClC,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAGf"}
@@ -0,0 +1,60 @@
1
+ import { mkdir, readFile, writeFile, readdir, unlink, rename, stat, rm, } from "node:fs/promises";
2
+ import { dirname, relative } from "node:path";
3
+ import { randomUUID } from "node:crypto";
4
+ import { DataFileEnvelopeSchema } from "../../schemas/data-file.js";
5
+ import { buildDataFilePath, buildScopeDir, filenameToTimestamp, } from "./paths.js";
6
+ /** Atomic write: mkdir -p, write temp file, rename */
7
+ export async function writeDataFile(options, envelope) {
8
+ const filePath = buildDataFilePath(options.dataDir, envelope.scope, envelope.collectedAt);
9
+ const dir = dirname(filePath);
10
+ await mkdir(dir, { recursive: true });
11
+ const content = JSON.stringify(envelope, null, 2);
12
+ const tempPath = filePath + ".tmp." + randomUUID();
13
+ await writeFile(tempPath, content, "utf-8");
14
+ await rename(tempPath, filePath);
15
+ const stats = await stat(filePath);
16
+ return {
17
+ path: filePath,
18
+ relativePath: relative(options.dataDir, filePath),
19
+ sizeBytes: stats.size,
20
+ };
21
+ }
22
+ /** Read and parse a data file */
23
+ export async function readDataFile(options, scope, collectedAt) {
24
+ const filePath = buildDataFilePath(options.dataDir, scope, collectedAt);
25
+ const content = await readFile(filePath, "utf-8");
26
+ return DataFileEnvelopeSchema.parse(JSON.parse(content));
27
+ }
28
+ /** List version filenames for a scope, newest first. Empty array if scope dir doesn't exist. */
29
+ export async function listVersions(options, scope) {
30
+ const scopeDir = buildScopeDir(options.dataDir, scope);
31
+ let entries;
32
+ try {
33
+ entries = await readdir(scopeDir);
34
+ }
35
+ catch (err) {
36
+ if (err.code === "ENOENT") {
37
+ return [];
38
+ }
39
+ throw err;
40
+ }
41
+ const jsonFiles = entries
42
+ .filter((f) => f.endsWith(".json"))
43
+ .sort()
44
+ .reverse();
45
+ return jsonFiles.map((f) => filenameToTimestamp(f.replace(".json", "")));
46
+ }
47
+ /** Delete a single data file */
48
+ export async function deleteDataFile(options, scope, collectedAt) {
49
+ const filePath = buildDataFilePath(options.dataDir, scope, collectedAt);
50
+ await unlink(filePath);
51
+ }
52
+ /**
53
+ * Delete all files for a scope by removing the scope directory recursively.
54
+ * No-op if directory doesn't exist.
55
+ */
56
+ export async function deleteAllForScope(options, scope) {
57
+ const scopeDir = buildScopeDir(options.dataDir, scope);
58
+ await rm(scopeDir, { recursive: true, force: true });
59
+ }
60
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/storage/hierarchy/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /** "2026-01-21T10:00:00Z" → "2026-01-21T10-00-00Z" */
2
+ export declare function timestampToFilename(isoTimestamp: string): string;
3
+ /** "2026-01-21T10-00-00Z" → "2026-01-21T10:00:00Z" */
4
+ export declare function filenameToTimestamp(filename: string): string;
5
+ /** Full file path: join(baseDir, ...scopeSegments, timestamp.json) */
6
+ export declare function buildDataFilePath(baseDir: string, scope: string, collectedAt: string): string;
7
+ /** Directory path for a scope */
8
+ export declare function buildScopeDir(baseDir: string, scope: string): string;
9
+ /** Generate current UTC timestamp without milliseconds, ending in Z */
10
+ export declare function generateCollectedAt(): string;
11
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/storage/hierarchy/paths.ts"],"names":[],"mappings":"AAGA,sDAAsD;AACtD,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,sDAAsD;AACtD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS5D;AAED,sEAAsE;AACtE,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,MAAM,CAIR;AAED,iCAAiC;AACjC,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGpE;AAED,uEAAuE;AACvE,wBAAgB,mBAAmB,IAAI,MAAM,CAI5C"}