@homeflare/alchemy 0.37.1 → 0.37.3

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 (195) hide show
  1. package/dist/proxmox/backup-job-config.d.ts +95 -0
  2. package/dist/proxmox/backup-job-config.d.ts.map +1 -0
  3. package/dist/proxmox/backup-job-distilled.d.ts +46 -0
  4. package/dist/proxmox/backup-job-distilled.d.ts.map +1 -0
  5. package/dist/proxmox/backup-job.d.ts +9 -26
  6. package/dist/proxmox/backup-job.d.ts.map +1 -1
  7. package/dist/proxmox/ceph-fs-distilled.d.ts +17 -10
  8. package/dist/proxmox/ceph-fs-distilled.d.ts.map +1 -1
  9. package/dist/proxmox/ceph-fs-wire.d.ts +5 -22
  10. package/dist/proxmox/ceph-fs-wire.d.ts.map +1 -1
  11. package/dist/proxmox/ceph-fs.d.ts +3 -3
  12. package/dist/proxmox/distilled-pbs.d.ts +12 -0
  13. package/dist/proxmox/distilled-pbs.d.ts.map +1 -0
  14. package/dist/proxmox/fake-pbs-jobs.d.ts +23 -0
  15. package/dist/proxmox/fake-pbs-jobs.d.ts.map +1 -0
  16. package/dist/proxmox/fake-pbs-notify.d.ts.map +1 -1
  17. package/dist/proxmox/fake-pve.d.ts +1 -1
  18. package/dist/proxmox/fake-pve.d.ts.map +1 -1
  19. package/dist/proxmox/group-wire.d.ts +2 -2
  20. package/dist/proxmox/group-wire.d.ts.map +1 -1
  21. package/dist/proxmox/index.js +1382 -506
  22. package/dist/proxmox/index.js.map +51 -27
  23. package/dist/proxmox/live-core-fixtures.d.ts +40 -0
  24. package/dist/proxmox/live-core-fixtures.d.ts.map +1 -0
  25. package/dist/proxmox/metric-server-config.d.ts +49 -0
  26. package/dist/proxmox/metric-server-config.d.ts.map +1 -0
  27. package/dist/proxmox/metric-server-distilled.d.ts +43 -0
  28. package/dist/proxmox/metric-server-distilled.d.ts.map +1 -0
  29. package/dist/proxmox/metric-server.d.ts +2 -10
  30. package/dist/proxmox/metric-server.d.ts.map +1 -1
  31. package/dist/proxmox/node-network-wire.d.ts +1 -1
  32. package/dist/proxmox/node-network-wire.d.ts.map +1 -1
  33. package/dist/proxmox/notification-matcher-distilled.d.ts +9 -0
  34. package/dist/proxmox/notification-matcher-distilled.d.ts.map +1 -0
  35. package/dist/proxmox/notification-matcher-lifecycle.d.ts +27 -0
  36. package/dist/proxmox/notification-matcher-lifecycle.d.ts.map +1 -0
  37. package/dist/proxmox/notification-matcher.d.ts +5 -5
  38. package/dist/proxmox/notification-matcher.d.ts.map +1 -1
  39. package/dist/proxmox/notification-sdk-input.d.ts +22 -0
  40. package/dist/proxmox/notification-sdk-input.d.ts.map +1 -0
  41. package/dist/proxmox/notification-target-distilled.d.ts +12 -0
  42. package/dist/proxmox/notification-target-distilled.d.ts.map +1 -0
  43. package/dist/proxmox/notification-target-form.d.ts +2 -0
  44. package/dist/proxmox/notification-target-form.d.ts.map +1 -1
  45. package/dist/proxmox/notification-target-lifecycle.d.ts +29 -0
  46. package/dist/proxmox/notification-target-lifecycle.d.ts.map +1 -0
  47. package/dist/proxmox/notification-target-spec.d.ts +5 -0
  48. package/dist/proxmox/notification-target-spec.d.ts.map +1 -0
  49. package/dist/proxmox/notification-target.d.ts +4 -5
  50. package/dist/proxmox/notification-target.d.ts.map +1 -1
  51. package/dist/proxmox/pbs-datastore-endpoint.d.ts +1 -1
  52. package/dist/proxmox/pbs-datastore-form.d.ts +18 -42
  53. package/dist/proxmox/pbs-datastore-form.d.ts.map +1 -1
  54. package/dist/proxmox/pbs-datastore-guard.d.ts +7 -4
  55. package/dist/proxmox/pbs-datastore-guard.d.ts.map +1 -1
  56. package/dist/proxmox/pbs-datastore-lifecycle.d.ts +56 -0
  57. package/dist/proxmox/pbs-datastore-lifecycle.d.ts.map +1 -0
  58. package/dist/proxmox/pbs-datastore-wire.d.ts +21 -0
  59. package/dist/proxmox/pbs-datastore-wire.d.ts.map +1 -0
  60. package/dist/proxmox/pbs-datastore.d.ts +5 -6
  61. package/dist/proxmox/pbs-datastore.d.ts.map +1 -1
  62. package/dist/proxmox/pbs-notification-input.d.ts +18 -0
  63. package/dist/proxmox/pbs-notification-input.d.ts.map +1 -0
  64. package/dist/proxmox/pbs-notification-matcher-distilled.d.ts +11 -0
  65. package/dist/proxmox/pbs-notification-matcher-distilled.d.ts.map +1 -0
  66. package/dist/proxmox/pbs-notification-matcher.d.ts +4 -3
  67. package/dist/proxmox/pbs-notification-matcher.d.ts.map +1 -1
  68. package/dist/proxmox/pbs-notification-target-distilled.d.ts +20 -0
  69. package/dist/proxmox/pbs-notification-target-distilled.d.ts.map +1 -0
  70. package/dist/proxmox/pbs-notification-target-lifecycle.d.ts +4 -4
  71. package/dist/proxmox/pbs-notification-target-lifecycle.d.ts.map +1 -1
  72. package/dist/proxmox/pbs-notification-target.d.ts +1 -1
  73. package/dist/proxmox/pbs-prune-job-lifecycle.d.ts +22 -0
  74. package/dist/proxmox/pbs-prune-job-lifecycle.d.ts.map +1 -0
  75. package/dist/proxmox/pbs-prune-job-spec.d.ts +5 -0
  76. package/dist/proxmox/pbs-prune-job-spec.d.ts.map +1 -0
  77. package/dist/proxmox/pbs-prune-job-wire.d.ts +11 -0
  78. package/dist/proxmox/pbs-prune-job-wire.d.ts.map +1 -0
  79. package/dist/proxmox/pbs-prune-job.d.ts +9 -8
  80. package/dist/proxmox/pbs-prune-job.d.ts.map +1 -1
  81. package/dist/proxmox/pbs-sync-job-attributes.d.ts +34 -0
  82. package/dist/proxmox/pbs-sync-job-attributes.d.ts.map +1 -0
  83. package/dist/proxmox/pbs-sync-job-form.d.ts +21 -22
  84. package/dist/proxmox/pbs-sync-job-form.d.ts.map +1 -1
  85. package/dist/proxmox/pbs-sync-job-lifecycle.d.ts +22 -0
  86. package/dist/proxmox/pbs-sync-job-lifecycle.d.ts.map +1 -0
  87. package/dist/proxmox/pbs-sync-job-wire.d.ts +11 -0
  88. package/dist/proxmox/pbs-sync-job-wire.d.ts.map +1 -0
  89. package/dist/proxmox/pbs-sync-job.d.ts +9 -39
  90. package/dist/proxmox/pbs-sync-job.d.ts.map +1 -1
  91. package/dist/proxmox/pbs-verify-job-lifecycle.d.ts +22 -0
  92. package/dist/proxmox/pbs-verify-job-lifecycle.d.ts.map +1 -0
  93. package/dist/proxmox/pbs-verify-job-spec.d.ts +16 -0
  94. package/dist/proxmox/pbs-verify-job-spec.d.ts.map +1 -0
  95. package/dist/proxmox/pbs-verify-job-wire.d.ts +11 -0
  96. package/dist/proxmox/pbs-verify-job-wire.d.ts.map +1 -0
  97. package/dist/proxmox/pbs-verify-job.d.ts +12 -12
  98. package/dist/proxmox/pbs-verify-job.d.ts.map +1 -1
  99. package/dist/proxmox/pool.d.ts +10 -1
  100. package/dist/proxmox/pool.d.ts.map +1 -1
  101. package/dist/proxmox/storage-wire.d.ts +2 -2
  102. package/dist/proxmox/storage-wire.d.ts.map +1 -1
  103. package/dist/proxmox/user-wire.d.ts +2 -2
  104. package/dist/proxmox/user-wire.d.ts.map +1 -1
  105. package/dist/proxmox/zfs-pool-wire.d.ts +1 -1
  106. package/dist/proxmox/zfs-pool-wire.d.ts.map +1 -1
  107. package/docs/changelog/README.md +22 -0
  108. package/docs/changelog/archive-01.md +176 -0
  109. package/docs/changelog/archive-02.md +180 -0
  110. package/docs/changelog/archive-03.md +179 -0
  111. package/docs/changelog/archive-04.md +178 -0
  112. package/docs/changelog/archive-05.md +177 -0
  113. package/docs/changelog/archive-06.md +180 -0
  114. package/docs/changelog/archive-07.md +180 -0
  115. package/docs/changelog/archive-08.md +178 -0
  116. package/docs/changelog/archive-09.md +181 -0
  117. package/docs/changelog/archive-10.md +182 -0
  118. package/docs/changelog/archive-11.md +182 -0
  119. package/docs/changelog/archive-12.md +183 -0
  120. package/docs/changelog/archive-13.md +180 -0
  121. package/docs/changelog/archive-14.md +178 -0
  122. package/docs/changelog/archive-15.md +181 -0
  123. package/docs/changelog/archive-16.md +182 -0
  124. package/docs/changelog/archive-17.md +183 -0
  125. package/docs/changelog/archive-18.md +55 -0
  126. package/docs/pbs-distilled-jobs.md +31 -0
  127. package/docs/pbs-notifications.md +8 -2
  128. package/docs/proxmox-notification-sdk.md +28 -0
  129. package/docs/proxmox-sdk-migration.md +60 -0
  130. package/docs/proxmox.md +9 -3
  131. package/docs/upstream-conformance-families.md +6 -2
  132. package/package.json +3 -3
  133. package/src/proxmox/adopt-noop.test.ts +4 -5
  134. package/src/proxmox/backup-job-config.ts +95 -0
  135. package/src/proxmox/backup-job-distilled.ts +86 -0
  136. package/src/proxmox/backup-job.ts +78 -116
  137. package/src/proxmox/ceph-fs-delete.test.ts +5 -8
  138. package/src/proxmox/ceph-fs-destroy-sdk.test.ts +98 -0
  139. package/src/proxmox/ceph-fs-distilled.ts +41 -13
  140. package/src/proxmox/ceph-fs-wire.ts +5 -93
  141. package/src/proxmox/ceph-fs.ts +7 -7
  142. package/src/proxmox/constraints.test.ts +9 -8
  143. package/src/proxmox/distilled-pbs.test.ts +87 -0
  144. package/src/proxmox/distilled-pbs.ts +50 -0
  145. package/src/proxmox/fake-pbs-jobs.ts +99 -0
  146. package/src/proxmox/fake-pbs-notify.ts +4 -1
  147. package/src/proxmox/fake-pve.ts +3 -2
  148. package/src/proxmox/live-core-fixtures.ts +126 -0
  149. package/src/proxmox/live-core-lifecycle.test.ts +115 -0
  150. package/src/proxmox/live-core-wire.test.ts +190 -0
  151. package/src/proxmox/metric-server-config.ts +87 -0
  152. package/src/proxmox/metric-server-distilled.ts +81 -0
  153. package/src/proxmox/metric-server.ts +77 -88
  154. package/src/proxmox/notification-distilled.test.ts +162 -0
  155. package/src/proxmox/notification-matcher-distilled.ts +60 -0
  156. package/src/proxmox/notification-matcher-lifecycle.ts +71 -0
  157. package/src/proxmox/notification-matcher.ts +9 -26
  158. package/src/proxmox/notification-replacement.test.ts +190 -0
  159. package/src/proxmox/notification-sdk-input.ts +39 -0
  160. package/src/proxmox/notification-target-distilled.ts +160 -0
  161. package/src/proxmox/notification-target-form.ts +2 -0
  162. package/src/proxmox/notification-target-lifecycle.ts +75 -0
  163. package/src/proxmox/notification-target-spec.ts +68 -0
  164. package/src/proxmox/notification-target.ts +6 -68
  165. package/src/proxmox/pbs-datastore-endpoint.ts +1 -1
  166. package/src/proxmox/pbs-datastore-form.ts +18 -49
  167. package/src/proxmox/pbs-datastore-guard.ts +7 -4
  168. package/src/proxmox/pbs-datastore-lifecycle.ts +114 -0
  169. package/src/proxmox/pbs-datastore-wire.ts +94 -0
  170. package/src/proxmox/pbs-datastore.ts +7 -133
  171. package/src/proxmox/pbs-jobs-delete.test.ts +40 -0
  172. package/src/proxmox/pbs-jobs-sdk.test.ts +215 -0
  173. package/src/proxmox/pbs-notification-errors.test.ts +93 -0
  174. package/src/proxmox/pbs-notification-input.ts +25 -0
  175. package/src/proxmox/pbs-notification-mail.test.ts +64 -0
  176. package/src/proxmox/pbs-notification-matcher-distilled.ts +65 -0
  177. package/src/proxmox/pbs-notification-matcher.ts +70 -17
  178. package/src/proxmox/pbs-notification-target-distilled.ts +124 -0
  179. package/src/proxmox/pbs-notification-target-lifecycle.ts +26 -17
  180. package/src/proxmox/pbs-notification-target.ts +1 -1
  181. package/src/proxmox/pbs-notifications-stack.test.ts +25 -0
  182. package/src/proxmox/pbs-prune-job-lifecycle.ts +52 -0
  183. package/src/proxmox/pbs-prune-job-spec.ts +53 -0
  184. package/src/proxmox/pbs-prune-job-wire.ts +68 -0
  185. package/src/proxmox/pbs-prune-job.ts +10 -58
  186. package/src/proxmox/pbs-sync-job-attributes.ts +33 -0
  187. package/src/proxmox/pbs-sync-job-form.ts +7 -6
  188. package/src/proxmox/pbs-sync-job-lifecycle.ts +46 -0
  189. package/src/proxmox/pbs-sync-job-wire.ts +71 -0
  190. package/src/proxmox/pbs-sync-job.ts +10 -41
  191. package/src/proxmox/pbs-verify-job-lifecycle.ts +52 -0
  192. package/src/proxmox/pbs-verify-job-spec.ts +76 -0
  193. package/src/proxmox/pbs-verify-job-wire.ts +58 -0
  194. package/src/proxmox/pbs-verify-job.ts +13 -85
  195. package/src/proxmox/pool.ts +92 -10
@@ -0,0 +1,95 @@
1
+ /** Pure existing forms, normalization and equality, shared by plan and SDK lifecycle. */
2
+ import type { BackupJobAttributes, BackupJobProps } from './backup-job.ts';
3
+ /**
4
+ * The form for both create and update.
5
+ *
6
+ * ⛔ A FIELD THE DECLARATION LEAVES OUT IS NOT SENT, AND THAT IS LOAD BEARING. PVE's PUT can only
7
+ * SET a key; clearing one needs `delete=<key>`, which this resource deliberately never sends.
8
+ * `updateForm` is handed the props and nothing else, so a `delete` list could only be "every
9
+ * field you did not declare" — and on a job adopted out of the UI that would silently strip
10
+ * settings this resource does not even model, `compress`, `mailto` and `bwlimit` among them, on
11
+ * the first deploy. Leaving undeclared fields alone is the smaller lie, and `matches` tells the
12
+ * same lie consistently: it does not compare what it cannot change.
13
+ *
14
+ * ⚠️ THE FIVE FIELDS PVE DOCUMENTS A DEFAULT FOR ARE ALWAYS SENT AND ALWAYS COMPARED — `enabled`
15
+ * (1), `all` (0), `mode` (snapshot), `notification-mode` (auto), `repeat-missed` (0). That is
16
+ * what makes a hand-flipped `enabled 0` show up as drift rather than as silence, and it is also
17
+ * what stops those five looping: a field compared against a default must be sent as that
18
+ * default, or every plan reports an update the PUT never performs. The cost is worth reading
19
+ * before the first deploy against an adopted job — an omitted `all` is a declaration that this
20
+ * job backs up NOTHING, and PVE accepts a job that selects nothing without a word. Read that
21
+ * first plan; do not deploy it unseen.
22
+ */
23
+ declare const shape: (props: BackupJobProps) => {
24
+ all: string;
25
+ enabled: string;
26
+ mode: "snapshot" | "stop" | "suspend";
27
+ 'notification-mode': "auto" | "legacy-sendmail" | "notification-system";
28
+ 'repeat-missed': string;
29
+ schedule: string;
30
+ comment?: string;
31
+ exclude?: string;
32
+ fleecing?: string;
33
+ 'notes-template'?: string;
34
+ pool?: string;
35
+ 'prune-backups'?: string;
36
+ storage?: string;
37
+ vmid?: string;
38
+ };
39
+ export declare const backupJobSpec: {
40
+ /**
41
+ * ⛔ NO "IS IT REALLY THERE" GUARD, ON PURPOSE. Returning undefined for a job whose JSON is
42
+ * missing some key would be a guess about which keys PVE echoes back, and a wrong guess here
43
+ * does not read as absent-and-harmless: `reconcile` would POST, and POST creates ANOTHER job.
44
+ * Absence is decided by the API declining to answer, which `pveOperations.read` already
45
+ * handles — not by a key being missing from an answer that did arrive.
46
+ */
47
+ attributes: (live: Record<string, unknown>, props: BackupJobProps) => {
48
+ all: boolean;
49
+ comment: string;
50
+ enabled: boolean;
51
+ exclude: string;
52
+ fleecing: string;
53
+ id: string;
54
+ mode: string;
55
+ 'next-run': number;
56
+ 'notes-template': string;
57
+ 'notification-mode': string;
58
+ pool: string;
59
+ 'prune-backups': string;
60
+ 'repeat-missed': boolean;
61
+ schedule: string;
62
+ storage: string;
63
+ vmid: string;
64
+ };
65
+ collection: () => string;
66
+ /** ⛔ `id` IS SENT AND IS NOT OPTIONAL. Everything above depends on PVE not inventing one. */
67
+ createForm: (props: BackupJobProps) => {
68
+ all: string;
69
+ enabled: string;
70
+ mode: "snapshot" | "stop" | "suspend";
71
+ 'notification-mode': "auto" | "legacy-sendmail" | "notification-system";
72
+ 'repeat-missed': string;
73
+ schedule: string;
74
+ comment?: string;
75
+ exclude?: string;
76
+ fleecing?: string;
77
+ 'notes-template'?: string;
78
+ pool?: string;
79
+ 'prune-backups'?: string;
80
+ storage?: string;
81
+ vmid?: string;
82
+ id: string;
83
+ };
84
+ /** Each line reads "not declared, or equal"; the five defaulted fields have no undeclared case. */
85
+ /** The vendor rules these forms are checked against at plan time — resource-spec.ts. */
86
+ endpoint: {
87
+ create: string;
88
+ update: string;
89
+ };
90
+ matches: (attributes: BackupJobAttributes, props: BackupJobProps) => boolean;
91
+ path: (props: BackupJobProps) => string;
92
+ updateForm: typeof shape;
93
+ };
94
+ export {};
95
+ //# sourceMappingURL=backup-job-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup-job-config.d.ts","sourceRoot":"","sources":["../../src/proxmox/backup-job-config.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAI3E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,QAAA,MAAM,KAAK,UAAW,cAAc;;;;;;;;;;;;;;;CAelC,CAAC;AAEH,eAAO,MAAM,aAAa;IACxB;;;;;;OAMG;;;;;;;;;;;;;;;;;;;;IAoBH,6FAA6F;;;;;;;;;;;;;;;;;;IAE7F,mGAAmG;IACnG,wFAAwF;;QAC5E,MAAM;QAA8B,MAAM;;;;;CAqBA,CAAC"}
@@ -0,0 +1,46 @@
1
+ /** Backup-job operations from distilled-proxmox, walked against pve-manager 9.2.11. */
2
+ import * as cluster from '@distilled.cloud/proxmox/cluster';
3
+ import * as Effect from 'effect/Effect';
4
+ import type { BackupJobProps } from './backup-job.ts';
5
+ /** SDK member names differ from the vendor's hyphenated form keys; omission stays omission. */
6
+ export declare const backupJobRequest: (props: BackupJobProps, form?: {
7
+ all: string;
8
+ enabled: string;
9
+ mode: "snapshot" | "stop" | "suspend";
10
+ 'notification-mode': "auto" | "legacy-sendmail" | "notification-system";
11
+ 'repeat-missed': string;
12
+ schedule: string;
13
+ comment?: string;
14
+ exclude?: string;
15
+ fleecing?: string;
16
+ 'notes-template'?: string;
17
+ pool?: string;
18
+ 'prune-backups'?: string;
19
+ storage?: string;
20
+ vmid?: string;
21
+ }) => cluster.PutClusterBackupRequest;
22
+ /**
23
+ * SDK decode also renames NESTED retention keys. Restore the vendor's property-string
24
+ * spelling before the existing canonical comparison, or keep_daily becomes perpetual drift.
25
+ * A property string from an older server remains a property string.
26
+ */
27
+ export declare const readBackupJob: (props: BackupJobProps) => Effect.Effect<{
28
+ all: boolean;
29
+ comment: string;
30
+ enabled: boolean;
31
+ exclude: string;
32
+ fleecing: string;
33
+ id: string;
34
+ mode: string;
35
+ 'next-run': number;
36
+ 'notes-template': string;
37
+ 'notification-mode': string;
38
+ pool: string;
39
+ 'prune-backups': string;
40
+ 'repeat-missed': boolean;
41
+ schedule: string;
42
+ storage: string;
43
+ vmid: string;
44
+ } | undefined, import("@distilled.cloud/caddy").BadGateway | import("@distilled.cloud/caddy").BadRequest | import("@distilled.cloud/caddy").ConfigError | import("@distilled.cloud/caddy").Conflict | Error | import("@distilled.cloud/caddy").Forbidden | import("@distilled.cloud/caddy").GatewayTimeout | import("effect/unstable/http/HttpClientError").HttpClientError | import("@distilled.cloud/caddy").InternalServerError | import("@distilled.cloud/caddy").Locked | import("@distilled.cloud/proxmox/Errors").ParameterVerificationFailed | import("./distilled-pve.ts").PveClusterExhausted | import("./credential-errors.ts").PveCredentialDenied | import("@distilled.cloud/caddy").ServiceUnavailable | import("effect/Cause").TimeoutError | import("@distilled.cloud/caddy").TooManyRequests | import("@distilled.cloud/caddy").Unauthorized | import("@distilled.cloud/caddy").UnprocessableEntity | import("@distilled.cloud/proxmox/Errors").ClientErrors, import("effect/unstable/http/HttpClient").HttpClient>;
45
+ export declare const deleteBackupJob: (props: BackupJobProps) => Effect.Effect<void | cluster.DeleteClusterBackupResponse, import("@distilled.cloud/caddy").BadGateway | import("@distilled.cloud/caddy").BadRequest | import("@distilled.cloud/caddy").ConfigError | import("@distilled.cloud/caddy").Conflict | Error | import("@distilled.cloud/caddy").Forbidden | import("@distilled.cloud/caddy").GatewayTimeout | import("effect/unstable/http/HttpClientError").HttpClientError | import("@distilled.cloud/caddy").InternalServerError | import("@distilled.cloud/caddy").Locked | import("@distilled.cloud/proxmox/Errors").ParameterVerificationFailed | import("./distilled-pve.ts").PveClusterExhausted | import("./credential-errors.ts").PveCredentialDenied | import("@distilled.cloud/caddy").ServiceUnavailable | import("effect/Cause").TimeoutError | import("@distilled.cloud/caddy").TooManyRequests | import("@distilled.cloud/caddy").Unauthorized | import("@distilled.cloud/caddy").UnprocessableEntity | import("@distilled.cloud/proxmox/Errors").ClientErrors, import("effect/unstable/http/HttpClient").HttpClient>;
46
+ //# sourceMappingURL=backup-job-distilled.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup-job-distilled.d.ts","sourceRoot":"","sources":["../../src/proxmox/backup-job-distilled.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,OAAO,KAAK,OAAO,MAAM,kCAAkC,CAAC;AAC5D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAIxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD,+FAA+F;AAC/F,eAAO,MAAM,gBAAgB,UACpB,cAAc;;;;;;;;;;;;;;;MAEpB,OAAO,CAAC,uBAgBV,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,UAAW,cAAc;;;;;;;;;;;;;;;;;o+BA2ChD,CAAC;AAEJ,eAAO,MAAM,eAAe,UAAW,cAAc,ohCAIlD,CAAC"}
@@ -13,14 +13,13 @@
13
13
  * COULD CARRY. PVE's own API schema says so in one parenthesis — `id`: "Job ID (will be
14
14
  * autogenerated)." — and a generated id looks like `backup-f56d8ab7-d524`. A resource that
15
15
  * POSTed without an id would create a SECOND job beside the first on EVERY reconcile, and the
16
- * read-back in `pveOperations` would still pass, because a job did appear: that check asks "is
17
- * the object there", not "is it the one I meant". So `id` is a REQUIRED prop and is always sent
16
+ * read-back could still pass, because a job did appear: that check asks "is the object there",
17
+ * not "is it the one I meant". So `id` is a REQUIRED prop and is always sent
18
18
  * on create. To adopt a job that already exists, declare its existing id; any other id is a new
19
19
  * job beside it, not an adoption.
20
- * ★ AN EXPLICIT id ALSO CLOSES A SECOND HOLE. `pveOperations.read` turns ANY failed GET into
21
- * "absent" — an expired lease, a 403, a node that did not answer — and reconcile then POSTs.
22
- * With an id, PVE refuses a duplicate section id and the deploy fails loudly; without one, that
23
- * same swallowed error would have quietly doubled the cluster's backup jobs.
20
+ * ★ FAILED READS NOW PROPAGATE THROUGH DISTILLED. Only a typed missing-job response means
21
+ * absent. An expired lease, a 403 or an unrelated server error stops reconciliation before
22
+ * any POST. The explicit id remains a second defense against accidentally duplicating jobs.
24
23
  *
25
24
  * ⚠️ `Sys.Modify` ON `/` IS THE GATE AND IT IS NOT A SMALL GRANT. PVE has no Backup.* privilege:
26
25
  * create, update and delete of a vzdump job are all checked against `Sys.Modify` at `/` — the
@@ -31,13 +30,10 @@
31
30
  */
32
31
  import { Resource } from 'alchemy';
33
32
  import * as Provider from 'alchemy/Provider';
34
- import { type PveRequirements, type WithTarget } from './resource.ts';
33
+ import type { PveRequirements, WithTarget } from './resource-spec.ts';
35
34
  /**
36
- * ⚠️ THE PROPS ARE PVE'S OWN KEY NAMES, DASHES INCLUDED. `notes-template` rather than
37
- * `notesTemplate` is deliberate: `createForm` is then a copy rather than a translation table,
38
- * and a translation table is one more place for a key to be renamed and silently never sent. A
39
- * field that is never sent reads back as whatever it already was, which is indistinguishable
40
- * from "PVE ignored me".
35
+ * ★ Public props retain PVE's own dashed field names. The distilled transport maps those
36
+ * existing forms to the SDK's generated identifiers; lifecycle tests check the actual wire.
41
37
  */
42
38
  export interface BackupJobProps extends WithTarget {
43
39
  /** ⛔ The primary key, REQUIRED. Never let PVE generate it — see the ⛔ above. */
@@ -94,19 +90,6 @@ export interface BackupJobAttributes {
94
90
  export interface ProxmoxBackupJob extends Resource<'Proxmox.BackupJob', BackupJobProps, BackupJobAttributes, never, PveRequirements> {
95
91
  }
96
92
  export declare const ProxmoxBackupJob: import("alchemy").ResourceClass<ProxmoxBackupJob>;
97
- /**
98
- * ⛔ Empty for the same reason as every other resource here: adoption must be explicit.
99
- * `GET /cluster/backup` would hand back the job somebody made by hand, and adopting it
100
- * implicitly would give Alchemy the right to DELETE a cluster's only backup schedule the
101
- * first time a line left a stack file.
102
-
103
- *
104
- * ⚠️ DELETING THE JOB DOES NOT DELETE THE BACKUPS, AND THAT CUTS BOTH WAYS. The archives
105
- * stay on the storage, so this looks harmless today; it is destructive in six months,
106
- * when the schedule that should have replaced them has not run since. PVE will not
107
- * refuse this the way it refuses to delete a pool still holding guests — nothing depends
108
- * on a backup job — so the plan line is the only warning anyone gets.
109
-
110
- */
93
+ /** SDK lifecycle walked against pve-manager 9.2.11; failed reads never imply create. */
111
94
  export declare const ProxmoxBackupJobProvider: () => import("effect/Layer").Layer<Provider.Provider<ProxmoxBackupJob>, never, import("effect/unstable/http/HttpClient").HttpClient>;
112
95
  //# sourceMappingURL=backup-job.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"backup-job.d.ts","sourceRoot":"","sources":["../../src/proxmox/backup-job.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAe,MAAM,eAAe,CAAC;AAGnF;;;;;;GAMG;AACH,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,gFAAgF;IAChF,EAAE,EAAE,MAAM,CAAC;IACX,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;IACjB,mGAAmG;IACnG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,2FAA2F;IAC3F,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gGAAgG;IAChG,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gGAAgG;IAChG,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,GAAG,iBAAiB,GAAG,qBAAqB,CAAC;IACzE,yDAAyD;IACzD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;IACb,4FAA4F;IAC5F,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,qFAAqF;IACrF,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAiB,SAAQ,QAAQ,CAChD,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,eAAO,MAAM,gBAAgB,mDAAkD,CAAC;AA6FhF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,wBAAwB,sIACsD,CAAC"}
1
+ {"version":3,"file":"backup-job.d.ts","sourceRoot":"","sources":["../../src/proxmox/backup-job.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AASnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEtE;;;GAGG;AACH,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,gFAAgF;IAChF,EAAE,EAAE,MAAM,CAAC;IACX,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;IACjB,mGAAmG;IACnG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,2FAA2F;IAC3F,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gGAAgG;IAChG,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gGAAgG;IAChG,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,GAAG,iBAAiB,GAAG,qBAAqB,CAAC;IACzE,yDAAyD;IACzD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;IACb,4FAA4F;IAC5F,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,qFAAqF;IACrF,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAiB,SAAQ,QAAQ,CAChD,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,eAAO,MAAM,gBAAgB,mDAAkD,CAAC;AAShF,wFAAwF;AACxF,eAAO,MAAM,wBAAwB,sIAyDlC,CAAC"}
@@ -1,20 +1,16 @@
1
1
  /**
2
- * `Proxmox.CephFs`'s distilled half: the index read and the create — see ceph-fs-wire.ts's own
3
- * header for why `destroyFs` stays there, on `client.ts`, unmigrated.
2
+ * `Proxmox.CephFs`'s distilled transport: index, create, delete and task status.
3
+ * SDK 0.3.0 fixes DELETE query flags and supplies the measured CephFsNotFound tag.
4
4
  *
5
5
  * ⛔ `nodes.updateNodeCephFs` IS distilled's GENERATOR MISNAMING A CREATE, NOT A SECOND ENDPOINT.
6
6
  * Checked directly against its schema (`T.Http({ method: "POST", uri:
7
7
  * "/nodes/{node}/ceph/fs/{name}" })`) rather than trusted from the function name — it is the
8
8
  * SAME single write PVE registers, `createfs`. Harmless once named here for what it is.
9
9
  *
10
- * ★ THE SETTLE POLL IS A SEPARATE FUNCTION FROM ceph-fs-wire.ts's, NOT A SHARED ONE, because it
11
- * calls a different task-status operation on a different transport — `nodes.getNodeTaskStatus`
12
- * here, `pve()` there — but the POLICY is identical on purpose: same cadence
13
- * (`POLL_SECONDS`/`POLL_ATTEMPTS`, imported, not retyped), same "an unreadable status is not
14
- * settled yet, not a failure" tolerance. That tolerance is why this calls the RAW distilled
15
- * operation directly. The former SDK `Task.awaitTask` propagated poll failures; SDK PR #265
16
- * removed that helper because polling policy belongs in the provider. This bounded wait
17
- * still tolerates a missing `Sys.Audit` grant or a node mid-restart until its deadline.
10
+ * ★ CREATE AND DELETE SHARE THE SAME BOUNDED POLL POLICY. The raw getNodeTaskStatus
11
+ * operation preserves this family's tolerance of a missing Sys.Audit grant or a node
12
+ * mid-restart until the deadline. The former SDK Task.awaitTask propagated poll failures;
13
+ * SDK PR #265 removed it because polling policy belongs in the provider.
18
14
  */
19
15
  import * as nodes from '@distilled.cloud/proxmox/nodes';
20
16
  import * as Effect from 'effect/Effect';
@@ -30,4 +26,15 @@ import type { CephFsProps } from './ceph-fs.ts';
30
26
  export declare const readFs: (props: CephFsProps) => Effect.Effect<import("./ceph-fs.ts").CephFsAttributes | undefined, Error | import("./distilled-pve.ts").PveClusterExhausted | import("./credential-errors.ts").PveCredentialDenied | import("effect/Cause").TimeoutError | nodes.ProxmoxOpError, import("effect/unstable/http/HttpClient").HttpClient>;
31
27
  /** POST the create, then wait for the worker. ⛔ The caller still reads back; see ceph-fs.ts. */
32
28
  export declare const createFs: (props: CephFsProps) => Effect.Effect<undefined, Error | import("effect/unstable/http/HttpClientError").HttpClientError | import("./credential-errors.ts").PveCredentialDenied, import("effect/unstable/http/HttpClient").HttpClient>;
29
+ /**
30
+ * DELETE the filesystem, then wait for the worker.
31
+ *
32
+ * ⛔ WHAT THIS TAKES AWAY DEPENDS ENTIRELY ON `remove-pools`, AND THE DEFAULT IS THE SAFE ONE. With
33
+ * it unset PVE removes the filesystem from the MDS map and LEAVES the two pools on disk: every
34
+ * mount breaks, but the bytes are still there for an operator to recover. With it set the pools
35
+ * go too and nothing is recoverable. Leaving it unset also means a later create of the SAME name
36
+ * fails with "ceph pools '<name>_data' and/or '<name>_metadata' already exist" -- that refusal is
37
+ * a BRAKE, not a bug, and it is the last thing standing between a mis-typed rename and the data.
38
+ */
39
+ export declare const destroyFs: (props: CephFsProps) => Effect.Effect<void, Error | import("effect/unstable/http/HttpClientError").HttpClientError | import("./credential-errors.ts").PveCredentialDenied, import("effect/unstable/http/HttpClient").HttpClient>;
33
40
  //# sourceMappingURL=ceph-fs-distilled.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ceph-fs-distilled.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-fs-distilled.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,KAAK,MAAM,gCAAgC,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD;;;;;;;GAOG;AACH,eAAO,MAAM,MAAM,UAAW,WAAW,2SAGtC,CAAC;AA2CJ,gGAAgG;AAChG,eAAO,MAAM,QAAQ,UAAW,WAAW,kNAoBvC,CAAC"}
1
+ {"version":3,"file":"ceph-fs-distilled.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-fs-distilled.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,KAAK,MAAM,gCAAgC,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD;;;;;;;GAOG;AACH,eAAO,MAAM,MAAM,UAAW,WAAW,2SAGtC,CAAC;AA8CJ,gGAAgG;AAChG,eAAO,MAAM,QAAQ,UAAW,WAAW,kNAoBvC,CAAC;AAEL;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,UAAW,WAAW,6MAiBxC,CAAC"}
@@ -49,18 +49,12 @@
49
49
  * Grant it on the `read` role, or every create burns the full cap below and reports the wrong
50
50
  * cause.
51
51
  *
52
- * ★ AS OF 2026-09-24 (decision 43's walk-down, 2c) THIS FILE IS `client.ts`'s HALF ONLY. The read
53
- * (`readRow`) moved to `ceph-fs-distilled.ts`, and so did the create — `nodes.updateNodeCephFs`
54
- * (distilled's own misnamed POST, confirmed against its `T.Http` annotation) plus a SEPARATE
55
- * distilled `settle`, using the raw `getNodeTaskStatus` operation in its own tolerant poll loop
56
- * rather than `Task.awaitTask`, which does not tolerate a poll failure the way this family needs
57
- * (network-apply-read.ts's own header has the fuller reasoning). `destroyFs` stays HERE,
58
- * unmigrated: distilled types `remove_pools`/`remove_storages` as `T.Body` on a DELETE, and the
59
- * ⛔ two paragraphs up is the MEASURED reason PVE would silently ignore both flags if sent that
60
- * way — a real protocol gap, not a judgement call. `settle` below is still shared where it can
61
- * be: `createForm`/`objectPath`/`destroyPath` are pure and reused by the distilled file too.
52
+ * ★ THE ORIGINAL DISTILLED WALK MOVED READ AND CREATE FIRST, leaving DELETE here because
53
+ * SDK flags were annotated as body fields. Distilled Proxmox 0.3.0 fixes their query binding
54
+ * and adds the measured CephFsNotFound tag. All calls now live in ceph-fs-distilled.ts;
55
+ * this file keeps the pure forms, attributes and read-back failure messages. The protocol
56
+ * history above remains load-bearing: moving a DELETE flag back into a body loses it silently.
62
57
  */
63
- import * as Effect from 'effect/Effect';
64
58
  import type { CephFsAttributes, CephFsProps } from './ceph-fs.ts';
65
59
  /**
66
60
  * This filesystem's row of the index, as attributes.
@@ -90,17 +84,6 @@ export declare const CEPH_FS_CREATE = "pve:POST /nodes/{node}/ceph/fs/{name}";
90
84
  * POSTed to — the metric-server.ts case again — and a second copy can only ever disagree with it.
91
85
  */
92
86
  export declare const createForm: (props: CephFsProps) => Record<string, string>;
93
- /**
94
- * DELETE the filesystem, then wait for the worker.
95
- *
96
- * ⛔ WHAT THIS TAKES AWAY DEPENDS ENTIRELY ON `remove-pools`, AND THE DEFAULT IS THE SAFE ONE. With
97
- * it unset PVE removes the filesystem from the MDS map and LEAVES the two pools on disk: every
98
- * mount breaks, but the bytes are still there for an operator to recover. With it set the pools
99
- * go too and nothing is recoverable. Leaving it unset also means a later create of the SAME name
100
- * fails with "ceph pools '<name>_data' and/or '<name>_metadata' already exist" -- that refusal is
101
- * a BRAKE, not a bug, and it is the last thing standing between a mis-typed rename and the data.
102
- */
103
- export declare const destroyFs: (props: CephFsProps) => Effect.Effect<void, Error | import("./credential-errors.ts").PveCredentialDenied, import("effect/unstable/http/HttpClient").HttpClient>;
104
87
  /**
105
88
  * The two read-back failures, as messages rather than as guesses.
106
89
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ceph-fs-wire.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-fs-wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAKlE;;;;;;;;;;GAUG;AACH,eAAO,MAAM,OAAO,SACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SACtB,WAAW,KACjB,gBAAgB,GAAG,SAkBrB,CAAC;AAKF;;;;GAIG;AAEH,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC,6FAA6F;AAC7F,eAAO,MAAM,UAAU,UAAW,WAAW,WAAgD,CAAC;AAE9F,2FAA2F;AAC3F,eAAO,MAAM,cAAc,0CAA0C,CAAC;AAMtE;;;GAGG;AACH,eAAO,MAAM,UAAU,UAAW,WAAW,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAGnE,CAAC;AA2DH;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,UAAW,WAAW,4IAQxC,CAAC;AAEL;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,UAAW,WAAW,UAK1C,CAAC;AAEJ,eAAO,MAAM,YAAY,UAAW,WAAW,UAK5C,CAAC"}
1
+ {"version":3,"file":"ceph-fs-wire.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-fs-wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGlE;;;;;;;;;;GAUG;AACH,eAAO,MAAM,OAAO,SACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SACtB,WAAW,KACjB,gBAAgB,GAAG,SAkBrB,CAAC;AAEF;;;;GAIG;AAEH,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC,6FAA6F;AAC7F,eAAO,MAAM,UAAU,UAAW,WAAW,WAAgD,CAAC;AAE9F,2FAA2F;AAC3F,eAAO,MAAM,cAAc,0CAA0C,CAAC;AAMtE;;;GAGG;AACH,eAAO,MAAM,UAAU,UAAW,WAAW,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAGnE,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,UAAW,WAAW,UAK1C,CAAC;AAEJ,eAAO,MAAM,YAAY,UAAW,WAAW,UAK5C,CAAC"}
@@ -28,9 +28,9 @@
28
28
  *
29
29
  * ★ MIGRATED OFF `client.ts`'s generic `pve()` ONTO `@distilled.cloud/proxmox`'s typed
30
30
  * `nodes.listNodeCephFs`/`updateNodeCephFs` for the READ and the CREATE (2026-09-24, decision
31
- * 43's walk-down, 2c — ceph-fs-distilled.ts). `destroyFs` STAYS on `client.ts`, unmigrated:
32
- * the SDK originally put `remove-pools`/`remove-storages` in a DELETE body, which PVE ignores.
33
- * SDK PR #265 fixes that protocol gap; migrating `destroyFs` remains a separate change.
31
+ * 43's walk-down, 2c — ceph-fs-distilled.ts). DELETE originally stayed on `client.ts`:
32
+ * the SDK put its flags in a body that PVE discards (ceph-fs-wire.ts's history).
33
+ * SDK 0.3.0 fixes the query binding; delete now uses it and catches only CephFsNotFound.
34
34
  * The typed-read follow-up removes the catch-all fold from `readFs`: a failed index must
35
35
  * fail read/diff/reconcile/delete, not report a missing filesystem or a successful destroy.
36
36
  *
@@ -0,0 +1,12 @@
1
+ import type { ProxmoxBackupOpContext } from '@distilled.cloud/proxmox-backup/Protocol';
2
+ import type * as Cause from 'effect/Cause';
3
+ import type * as Duration from 'effect/Duration';
4
+ import * as Effect from 'effect/Effect';
5
+ import type * as HttpClient from 'effect/unstable/http/HttpClient';
6
+ import type { PveCredentialDenied } from './credential-errors.ts';
7
+ import type { PbsTarget, PveCredential, PveRole } from './credentials.ts';
8
+ /** An already-held lease, also used by offline protocol tests. Production uses the default bound. */
9
+ export declare const runPbsWith: <A, E>(target: PbsTarget, credential: PveCredential, op: Effect.Effect<A, E, ProxmoxBackupOpContext>, timeout?: Duration.Input) => Effect.Effect<A, E | Cause.TimeoutError, HttpClient.HttpClient>;
10
+ /** Preserve lease sharing and expose credential refusal and SDK error tags unchanged. */
11
+ export declare const runPbs: <A, E>(target: PbsTarget, role: PveRole, op: Effect.Effect<A, E, ProxmoxBackupOpContext>) => Effect.Effect<A, E | Cause.TimeoutError | PveCredentialDenied | Error, HttpClient.HttpClient>;
12
+ //# sourceMappingURL=distilled-pbs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distilled-pbs.d.ts","sourceRoot":"","sources":["../../src/proxmox/distilled-pbs.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAEvF,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAI1E,qGAAqG;AACrG,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,CAAC,UACrB,SAAS,cACL,aAAa,MACrB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,sBAAsB,CAAC,YACtC,QAAQ,CAAC,KAAK,KACtB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,YAAY,EAAE,UAAU,CAAC,UAAU,CAW9D,CAAC;AAEJ,yFAAyF;AACzF,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,CAAC,UACjB,SAAS,QACX,OAAO,MACT,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,sBAAsB,CAAC,KAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,YAAY,GAAG,mBAAmB,GAAG,KAAK,EAAE,UAAU,CAAC,UAAU,CAI3F,CAAC"}
@@ -0,0 +1,23 @@
1
+ /** Test-only PBS 4.2.6-1 wire fixture. Every HTTP request is intercepted; no live credentials. */
2
+ import * as Layer from 'effect/Layer';
3
+ import type { PbsTarget } from './credentials.ts';
4
+ export declare const PBS_JOBS_TARGET: PbsTarget;
5
+ type Write = {
6
+ method: string;
7
+ path: string;
8
+ form: Record<string, string>;
9
+ };
10
+ export declare const fakePbsJobs: () => {
11
+ rows: Map<string, Record<string, unknown>>;
12
+ writes: Write[];
13
+ calls: {
14
+ method: string;
15
+ path: string;
16
+ }[];
17
+ failRead: (status: number, body: unknown) => void;
18
+ failDelete: (status: number, body: unknown) => void;
19
+ reset: () => void;
20
+ layer: Layer.Layer<import("effect/unstable/http/HttpClient").HttpClient, never, never>;
21
+ };
22
+ export {};
23
+ //# sourceMappingURL=fake-pbs-jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-pbs-jobs.d.ts","sourceRoot":"","sources":["../../src/proxmox/fake-pbs-jobs.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,eAAO,MAAM,eAAe,EAAE,SAI7B,CAAC;AAYF,KAAK,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AAE5E,eAAO,MAAM,WAAW;;;;gBAGC,MAAM;cAAQ,MAAM;;uBAuDtB,MAAM,QAAQ,OAAO;yBAGnB,MAAM,QAAQ,OAAO;;;CAc7C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"fake-pbs-notify.d.ts","sourceRoot":"","sources":["../../src/proxmox/fake-pbs-notify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,KAAK,OAAO,EAAyB,MAAM,eAAe,CAAC;AAepE,MAAM,WAAW,UAAW,SAAQ,OAAO;IACzC,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,wFAAwF;IACxF,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACzC;AA4BD,eAAO,MAAM,UAAU,UACf,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KACtD,UA2CF,CAAC"}
1
+ {"version":3,"file":"fake-pbs-notify.d.ts","sourceRoot":"","sources":["../../src/proxmox/fake-pbs-notify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,KAAK,OAAO,EAAyB,MAAM,eAAe,CAAC;AAepE,MAAM,WAAW,UAAW,SAAQ,OAAO;IACzC,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,wFAAwF;IACxF,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACzC;AA4BD,eAAO,MAAM,UAAU,UACf,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KACtD,UA8CF,CAAC"}
@@ -25,7 +25,7 @@ export interface PveCall {
25
25
  */
26
26
  readonly pairs: readonly (readonly [string, string])[];
27
27
  }
28
- /** Answers one call with its `data`; `undefined` is PVE's `{"data": null}`. */
28
+ /** Answers with `data`, or an explicit Response for SDK error fixtures; undefined is data:null. */
29
29
  export type PveAnswer = (call: PveCall) => unknown;
30
30
  export interface FakePve {
31
31
  readonly calls: PveCall[];
@@ -1 +1 @@
1
- {"version":3,"file":"fake-pve.d.ts","sourceRoot":"","sources":["../../src/proxmox/fake-pve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIlD,eAAO,MAAM,WAAW,EAAE,SAIzB,CAAC;AAEF,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,yFAAyF;IACzF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;CACxD;AAED,+EAA+E;AAC/E,MAAM,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;AAEnD,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;IAC1B,sDAAsD;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,EAAE,CAAC;IAChC,wFAAwF;IACxF,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;CAC9C;AAED,0FAA0F;AAC1F,QAAA,MAAM,SAAS,SAAU,OAAO,KAAK,oFACuD,CAAC;AAE7F,eAAO,MAAM,OAAO,WAAY,SAAS,KAAG,OA4B3C,CAAC;AAEF,sGAAsG;AACtG,eAAO,MAAM,UAAU,GAAI,CAAC,QAAQ,MAAM,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CACO,CAAC"}
1
+ {"version":3,"file":"fake-pve.d.ts","sourceRoot":"","sources":["../../src/proxmox/fake-pve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIlD,eAAO,MAAM,WAAW,EAAE,SAIzB,CAAC;AAEF,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,yFAAyF;IACzF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;CACxD;AAED,mGAAmG;AACnG,MAAM,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;AAEnD,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;IAC1B,sDAAsD;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,EAAE,CAAC;IAChC,wFAAwF;IACxF,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;CAC9C;AAED,0FAA0F;AAC1F,QAAA,MAAM,SAAS,SAAU,OAAO,KAAK,oFACuD,CAAC;AAE7F,eAAO,MAAM,OAAO,WAAY,SAAS,KAAG,OA6B3C,CAAC;AAEF,sGAAsG;AACtG,eAAO,MAAM,UAAU,GAAI,CAAC,QAAQ,MAAM,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CACO,CAAC"}
@@ -48,7 +48,7 @@ export declare const matches: (attributes: GroupAttributes, props: GroupProps) =
48
48
  * release that does answer `{}`, but this function is what actually carries the "not found"
49
49
  * case, as a thrown error — `readGroup` below is the one that folds it.
50
50
  */
51
- export declare const readGroupOrFail: (props: GroupProps) => Effect.Effect<typeof UNREADABLE | GroupAttributes | undefined, import("@distilled.cloud/caddy").BadGateway | import("@distilled.cloud/caddy").BadRequest | import("@distilled.cloud/caddy").ConfigError | Error | import("@distilled.cloud/caddy").GatewayTimeout | access.GroupNotFound | import("effect/unstable/http/HttpClientError").HttpClientError | import("@distilled.cloud/caddy").InternalServerError | import("@distilled.cloud/proxmox/Errors").ParameterVerificationFailed | import("@distilled.cloud/proxmox/Errors").ProxmoxParseError | import("./distilled-pve.ts").PveClusterExhausted | import("@distilled.cloud/caddy").ServiceUnavailable | import("effect/Cause").TimeoutError | import("@distilled.cloud/caddy").TooManyRequests | import("@distilled.cloud/caddy").Unauthorized | import("@distilled.cloud/proxmox/Errors").UnknownProxmoxError, import("effect/unstable/http/HttpClient").HttpClient>;
51
+ export declare const readGroupOrFail: (props: GroupProps) => Effect.Effect<typeof UNREADABLE | GroupAttributes | undefined, import("@distilled.cloud/caddy").BadGateway | import("@distilled.cloud/caddy").BadRequest | import("@distilled.cloud/caddy").ConfigError | import("@distilled.cloud/caddy").Conflict | Error | import("@distilled.cloud/caddy").Forbidden | import("@distilled.cloud/caddy").GatewayTimeout | access.GroupNotFound | import("effect/unstable/http/HttpClientError").HttpClientError | import("@distilled.cloud/caddy").InternalServerError | import("@distilled.cloud/caddy").Locked | import("@distilled.cloud/caddy").NotFound | import("@distilled.cloud/proxmox/Errors").ParameterVerificationFailed | import("@distilled.cloud/proxmox/Errors").ProxmoxParseError | import("./distilled-pve.ts").PveClusterExhausted | import("@distilled.cloud/caddy").ServiceUnavailable | import("effect/Cause").TimeoutError | import("@distilled.cloud/caddy").TooManyRequests | import("@distilled.cloud/caddy").Unauthorized | import("@distilled.cloud/proxmox/Errors").UnknownProxmoxError | import("@distilled.cloud/caddy").UnprocessableEntity, import("effect/unstable/http/HttpClient").HttpClient>;
52
52
  /**
53
53
  * ⛔ ONLY `GroupNotFound` MEANS ABSENT. The initial distilled transport swap preserved a
54
54
  * catch-all fold because PVE reports missing objects as HTTP 500. SDK PR 265 now types that
@@ -57,7 +57,7 @@ export declare const readGroupOrFail: (props: GroupProps) => Effect.Effect<typeo
57
57
  * ★ `readGroupOrFail` remains the strict path used for an already-confirmed state row. This
58
58
  * change narrows cold reads/reconcile without changing that existing drift/diff contract.
59
59
  */
60
- export declare const readGroup: (props: GroupProps) => Effect.Effect<typeof UNREADABLE | GroupAttributes | undefined, import("@distilled.cloud/caddy").BadGateway | import("@distilled.cloud/caddy").BadRequest | import("@distilled.cloud/caddy").ConfigError | Error | import("@distilled.cloud/caddy").GatewayTimeout | import("effect/unstable/http/HttpClientError").HttpClientError | import("@distilled.cloud/caddy").InternalServerError | import("@distilled.cloud/proxmox/Errors").ParameterVerificationFailed | import("@distilled.cloud/proxmox/Errors").ProxmoxParseError | import("./distilled-pve.ts").PveClusterExhausted | import("@distilled.cloud/caddy").ServiceUnavailable | import("effect/Cause").TimeoutError | import("@distilled.cloud/caddy").TooManyRequests | import("@distilled.cloud/caddy").Unauthorized | import("@distilled.cloud/proxmox/Errors").UnknownProxmoxError, import("effect/unstable/http/HttpClient").HttpClient>;
60
+ export declare const readGroup: (props: GroupProps) => Effect.Effect<typeof UNREADABLE | GroupAttributes | undefined, import("@distilled.cloud/caddy").BadGateway | import("@distilled.cloud/caddy").BadRequest | import("@distilled.cloud/caddy").ConfigError | import("@distilled.cloud/caddy").Conflict | Error | import("@distilled.cloud/caddy").Forbidden | import("@distilled.cloud/caddy").GatewayTimeout | import("effect/unstable/http/HttpClientError").HttpClientError | import("@distilled.cloud/caddy").InternalServerError | import("@distilled.cloud/caddy").Locked | import("@distilled.cloud/caddy").NotFound | import("@distilled.cloud/proxmox/Errors").ParameterVerificationFailed | import("@distilled.cloud/proxmox/Errors").ProxmoxParseError | import("./distilled-pve.ts").PveClusterExhausted | import("@distilled.cloud/caddy").ServiceUnavailable | import("effect/Cause").TimeoutError | import("@distilled.cloud/caddy").TooManyRequests | import("@distilled.cloud/caddy").Unauthorized | import("@distilled.cloud/proxmox/Errors").UnknownProxmoxError | import("@distilled.cloud/caddy").UnprocessableEntity, import("effect/unstable/http/HttpClient").HttpClient>;
61
61
  /** `read`/`reconcile` return `Attributes | undefined`; only `diff` tells `UNREADABLE` apart. */
62
62
  export declare const dropUnreadable: (live: GroupAttributes | Unreadable | undefined) => GroupAttributes | undefined;
63
63
  //# sourceMappingURL=group-wire.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"group-wire.d.ts","sourceRoot":"","sources":["../../src/proxmox/group-wire.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,MAAM,MAAM,iCAAiC,CAAC;AAC1D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAoB,MAAM,sBAAsB,CAAC;AAGrF,eAAO,MAAM,YAAY,4BAA4B,CAAC;AACtD,eAAO,MAAM,YAAY,qCAAqC,CAAC;AAE/D;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,YAAa,MAAM,GAAG,SAAS,WAGxD,CAAC;AAQF,eAAO,MAAM,UAAU,UAAW,UAAU,KAAG,MAAM,CAAC,wBAGpD,CAAC;AAEH,iGAAiG;AACjG,eAAO,MAAM,UAAU,UAAW,UAAU,KAAG,MAAM,CAAC,qBAGpD,CAAC;AAaH;;;GAGG;AACH,eAAO,MAAM,OAAO,eAAgB,eAAe,SAAS,UAAU,YACjB,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,eAAe,UAAW,UAAU,o4BAW9C,CAAC;AAEJ;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,UAAW,UAAU,62BACqD,CAAC;AAEjG,gGAAgG;AAChG,eAAO,MAAM,cAAc,SAAU,eAAe,GAAG,UAAU,GAAG,SAAS,gCACrC,CAAC"}
1
+ {"version":3,"file":"group-wire.d.ts","sourceRoot":"","sources":["../../src/proxmox/group-wire.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,MAAM,MAAM,iCAAiC,CAAC;AAC1D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAoB,MAAM,sBAAsB,CAAC;AAGrF,eAAO,MAAM,YAAY,4BAA4B,CAAC;AACtD,eAAO,MAAM,YAAY,qCAAqC,CAAC;AAE/D;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,YAAa,MAAM,GAAG,SAAS,WAGxD,CAAC;AAQF,eAAO,MAAM,UAAU,UAAW,UAAU,KAAG,MAAM,CAAC,wBAGpD,CAAC;AAEH,iGAAiG;AACjG,eAAO,MAAM,UAAU,UAAW,UAAU,KAAG,MAAM,CAAC,qBAGpD,CAAC;AAaH;;;GAGG;AACH,eAAO,MAAM,OAAO,eAAgB,eAAe,SAAS,UAAU,YACjB,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,eAAe,UAAW,UAAU,0mCAW9C,CAAC;AAEJ;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,UAAW,UAAU,mlCACqD,CAAC;AAEjG,gGAAgG;AAChG,eAAO,MAAM,cAAc,SAAU,eAAe,GAAG,UAAU,GAAG,SAAS,gCACrC,CAAC"}