@homeflare/alchemy 0.36.0 → 0.37.0

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 (99) hide show
  1. package/README.md +14 -0
  2. package/dist/argocd/cluster.d.ts +102 -0
  3. package/dist/argocd/cluster.d.ts.map +1 -0
  4. package/dist/argocd/credentials.d.ts +37 -0
  5. package/dist/argocd/credentials.d.ts.map +1 -0
  6. package/dist/argocd/fake-argocd.d.ts +42 -0
  7. package/dist/argocd/fake-argocd.d.ts.map +1 -0
  8. package/dist/argocd/git-credentials.d.ts +29 -0
  9. package/dist/argocd/git-credentials.d.ts.map +1 -0
  10. package/dist/argocd/index.d.ts +19 -0
  11. package/dist/argocd/index.d.ts.map +1 -0
  12. package/dist/argocd/index.js +306 -0
  13. package/dist/argocd/index.js.map +17 -0
  14. package/dist/argocd/providers.d.ts +13 -0
  15. package/dist/argocd/providers.d.ts.map +1 -0
  16. package/dist/argocd/repo-creds.d.ts +67 -0
  17. package/dist/argocd/repo-creds.d.ts.map +1 -0
  18. package/dist/argocd/repository.d.ts +87 -0
  19. package/dist/argocd/repository.d.ts.map +1 -0
  20. package/dist/argocd/resource.d.ts +90 -0
  21. package/dist/argocd/resource.d.ts.map +1 -0
  22. package/dist/cloudflare/index.js +4 -4
  23. package/dist/cloudflare/index.js.map +3 -3
  24. package/dist/cloudflare/r2-bucket-lock.d.ts +14 -5
  25. package/dist/cloudflare/r2-bucket-lock.d.ts.map +1 -1
  26. package/dist/litellm/index.js.map +2 -2
  27. package/dist/litellm/operations.d.ts.map +1 -1
  28. package/dist/proxmox/ceph-daemon-form.d.ts +4 -5
  29. package/dist/proxmox/ceph-daemon-form.d.ts.map +1 -1
  30. package/dist/proxmox/ceph-daemon-wire.d.ts +33 -0
  31. package/dist/proxmox/ceph-daemon-wire.d.ts.map +1 -0
  32. package/dist/proxmox/ceph-daemon.d.ts +35 -0
  33. package/dist/proxmox/ceph-daemon.d.ts.map +1 -1
  34. package/dist/proxmox/ceph-fs-distilled.d.ts +14 -0
  35. package/dist/proxmox/ceph-fs-distilled.d.ts.map +1 -0
  36. package/dist/proxmox/ceph-fs-wire.d.ts +20 -11
  37. package/dist/proxmox/ceph-fs-wire.d.ts.map +1 -1
  38. package/dist/proxmox/ceph-fs.d.ts +31 -6
  39. package/dist/proxmox/ceph-fs.d.ts.map +1 -1
  40. package/dist/proxmox/ceph-osd-tree.d.ts +12 -3
  41. package/dist/proxmox/ceph-osd-tree.d.ts.map +1 -1
  42. package/dist/proxmox/ceph-osd-write.d.ts +17 -2
  43. package/dist/proxmox/ceph-osd-write.d.ts.map +1 -1
  44. package/dist/proxmox/ceph-osd.d.ts +6 -0
  45. package/dist/proxmox/ceph-osd.d.ts.map +1 -1
  46. package/dist/proxmox/ceph-pool-settle.d.ts +10 -4
  47. package/dist/proxmox/ceph-pool-settle.d.ts.map +1 -1
  48. package/dist/proxmox/ceph-pool-wire.d.ts +46 -0
  49. package/dist/proxmox/ceph-pool-wire.d.ts.map +1 -0
  50. package/dist/proxmox/ceph-pool.d.ts +10 -5
  51. package/dist/proxmox/ceph-pool.d.ts.map +1 -1
  52. package/dist/proxmox/group-wire.d.ts +1 -1
  53. package/dist/proxmox/group-wire.d.ts.map +1 -1
  54. package/dist/proxmox/index.js +611 -477
  55. package/dist/proxmox/index.js.map +15 -12
  56. package/dist/proxmox/storage-wire.d.ts +8 -1
  57. package/dist/proxmox/storage-wire.d.ts.map +1 -1
  58. package/dist/proxmox/user-wire.d.ts +1 -1
  59. package/dist/proxmox/user-wire.d.ts.map +1 -1
  60. package/docs/argocd-kubernetes.md +100 -0
  61. package/docs/argocd.md +139 -0
  62. package/docs/credentials.md +9 -0
  63. package/docs/litellm.md +17 -0
  64. package/docs/peers.md +7 -0
  65. package/docs/unifi.md +45 -0
  66. package/package.json +8 -3
  67. package/src/argocd/cluster.test.ts +120 -0
  68. package/src/argocd/cluster.ts +222 -0
  69. package/src/argocd/credentials.ts +38 -0
  70. package/src/argocd/fake-argocd.ts +60 -0
  71. package/src/argocd/git-credentials.ts +71 -0
  72. package/src/argocd/index.ts +40 -0
  73. package/src/argocd/providers.ts +17 -0
  74. package/src/argocd/repo-creds.test.ts +123 -0
  75. package/src/argocd/repo-creds.ts +115 -0
  76. package/src/argocd/repository.test.ts +167 -0
  77. package/src/argocd/repository.ts +165 -0
  78. package/src/argocd/resource.ts +150 -0
  79. package/src/cloudflare/r2-bucket-lock.test.ts +54 -18
  80. package/src/cloudflare/r2-bucket-lock.ts +25 -18
  81. package/src/litellm/operations.ts +8 -4
  82. package/src/proxmox/ceph-daemon-form.ts +7 -8
  83. package/src/proxmox/ceph-daemon-wire.ts +115 -0
  84. package/src/proxmox/ceph-daemon-write.test.ts +158 -0
  85. package/src/proxmox/ceph-daemon.ts +65 -47
  86. package/src/proxmox/ceph-fs-delete.test.ts +81 -0
  87. package/src/proxmox/ceph-fs-distilled.ts +102 -0
  88. package/src/proxmox/ceph-fs-wire.ts +17 -31
  89. package/src/proxmox/ceph-fs-write.test.ts +67 -0
  90. package/src/proxmox/ceph-fs.ts +66 -69
  91. package/src/proxmox/ceph-osd-tree.ts +14 -5
  92. package/src/proxmox/ceph-osd-write.test.ts +61 -0
  93. package/src/proxmox/ceph-osd-write.ts +33 -6
  94. package/src/proxmox/ceph-osd.ts +6 -0
  95. package/src/proxmox/ceph-pool-settle.ts +13 -7
  96. package/src/proxmox/ceph-pool-wire.ts +110 -0
  97. package/src/proxmox/ceph-pool-write.test.ts +145 -0
  98. package/src/proxmox/ceph-pool.ts +87 -98
  99. package/src/proxmox/distilled-task-await.test.ts +0 -124
@@ -1 +1 @@
1
- {"version":3,"file":"ceph-fs-wire.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-fs-wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;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;AAaF,6FAA6F;AAC7F,eAAO,MAAM,UAAU,UAAW,WAAW,WAAgD,CAAC;AAM9F;;;GAGG;AACH,eAAO,MAAM,UAAU,UAAW,WAAW,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAGnE,CAAC;AA2DH;;;;;;;;;GASG;AACH,eAAO,MAAM,QAAQ,UAAW,WAAW,iJAiBvC,CAAC;AAEL;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
@@ -19,12 +19,21 @@
19
19
  * below returns the INDEX and `attributes` picks this filesystem out of the array client-side —
20
20
  * the shape acl.ts uses for the one flat `GET /access/acl`. The POST goes to the `{name}` path,
21
21
  * so `collection()` is the LONGER of the two strings, the mirror of metric-server.ts.
22
- * ⚠️ AND THAT IS WHY `delete` AND `reconcile` ARE HAND-WRITTEN BELOW rather than taken from
23
- * `pveHandlers`. `pveOperations.destroy` deletes `spec.path`, which here is the index:
24
- * `DELETE /nodes/{node}/ceph/fs` is not a route, so a factory delete would fail every destroy
25
- * while the filesystem stayed exactly where it was. `reconcile` is hand-written for a second,
26
- * independent reason — the forked worker — set out in ceph-fs-wire.ts. acl.ts is the
27
- * precedent for a family that genuinely does not fit; this is the second.
22
+ * ⚠️ AND THAT IS WHY EVERY HANDLER BELOW IS HAND-WRITTEN rather than taken from a factory. A
23
+ * factory `destroy` deletes the read path, which here is the index: `DELETE /nodes/{node}/
24
+ * ceph/fs` is not a route, so it would fail every destroy while the filesystem stayed exactly
25
+ * where it was. `reconcile` is hand-written for a second, independent reason — the forked
26
+ * worker — set out in ceph-fs-wire.ts. acl.ts is the precedent for a family that genuinely
27
+ * does not fit a shared shape.
28
+ *
29
+ * ★ MIGRATED OFF `client.ts`'s generic `pve()` ONTO `@distilled.cloud/proxmox`'s typed
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
+ * distilled types the delete's `remove-pools`/`remove-storages` flags as a request BODY, and
33
+ * this file's own next ⛔ (unchanged from before this migration) is the measured reason PVE
34
+ * would silently ignore both on a DELETE sent that way — ceph-fs-wire.ts's header has the fuller
35
+ * evidence. `readFs`/`diff`/`reconcile` keep the SAME single-fold, present-is-settled shape this
36
+ * family always had; see ceph-pool-wire.ts's own header for why that is not a bug left unfixed.
28
37
  *
29
38
  * ⛔ CREATING A CephFS CREATES TWO CEPH POOLS, AND A `Proxmox.CephPool` MUST NOT ALSO DECLARE THEM.
30
39
  * `createfs` builds `<name>_data` and `<name>_metadata` itself and refuses outright if either
@@ -120,5 +129,21 @@ export interface ProxmoxCephFs extends Resource<'Proxmox.CephFs', CephFsProps, C
120
129
  }
121
130
  /** ★ `retain` by default — a filesystem holding data cannot be rebuilt. See the ★ in resource.ts. */
122
131
  export declare const ProxmoxCephFs: import("alchemy").ResourceClass<ProxmoxCephFs>;
132
+ /**
133
+ * ⛔ NOTHING IS COMPARED, AND THAT IS THE MOST DELIBERATE LINE IN THIS FILE. A CephFS has no
134
+ * readable, writable field: the index returns only the name and the pools behind it, and every
135
+ * prop this resource accepts is create-time or delete-time. So "present" IS "settled", and the
136
+ * only honest comparison is none at all.
137
+ * ⚠️ THE TEMPTING ADDITION IS `pg_num`, AND IT WOULD BE THE WORST BUG THIS PACKAGE HAS SHIPPED.
138
+ * It is not in the index at all, so it can only be read from the pool endpoint — where the
139
+ * autoscaler owns it. MEASURED on C1 today: created at 128, live at 32, with the metadata
140
+ * pool already scheduled down to 16. Compared, that is an eternal mismatch — and since there
141
+ * is no update path, treating this as a diff would plan a REPLACE. The plan would destroy and
142
+ * rebuild a live filesystem on every deploy, triggered by a daemon on its own schedule.
143
+ * ⚠️ `data_pools` AND `metadata_pool_id` ARE OUT FOR THE ORDINARY REASONS: a set PVE returns
144
+ * in its own order, and an integer id for something written as a name. `name` is out because
145
+ * it is the FILTER that produced these attributes, so comparing it is true by construction —
146
+ * an identity change is handled in `diff`, not here. `node` is out because it is a route.
147
+ */
123
148
  export declare const ProxmoxCephFsProvider: () => import("effect/Layer").Layer<Provider.Provider<ProxmoxCephFs>, never, import("effect/unstable/http/HttpClient").HttpClient>;
124
149
  //# sourceMappingURL=ceph-fs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ceph-fs.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-fs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAW7C,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAiB,MAAM,eAAe,CAAC;AAErF,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC7C,2FAA2F;IAC3F,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+FAA+F;IAC/F,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,4FAA4F;IAC5F,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAc,SAAQ,QAAQ,CAC7C,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,qGAAqG;AACrG,eAAO,MAAM,aAAa,gDAExB,CAAC;AA6BH,eAAO,MAAM,qBAAqB,mIA6E/B,CAAC"}
1
+ {"version":3,"file":"ceph-fs.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-fs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAK7C,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAEtE,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC7C,2FAA2F;IAC3F,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+FAA+F;IAC/F,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,4FAA4F;IAC5F,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAc,SAAQ,QAAQ,CAC7C,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,qGAAqG;AACrG,eAAO,MAAM,aAAa,gDAExB,CAAC;AAEH;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,qBAAqB,mIAkF/B,CAAC"}
@@ -56,6 +56,7 @@
56
56
  * maintenance — the churn-that-reads-like-drift that keeps `digest` out of storage.ts.
57
57
  *
58
58
  */
59
+ import * as nodes from '@distilled.cloud/proxmox/nodes';
59
60
  import * as Effect from 'effect/Effect';
60
61
  import type { CephOsdProps } from './ceph-osd.ts';
61
62
  /** A CRUSH node. Buckets carry `children`; an OSD leaf carries `type: 'osd'`. */
@@ -146,9 +147,17 @@ export declare const osdAttributes: (leaf: CrushNode, props: CephOsdProps) => Ce
146
147
  * ★ IT LIVES HERE RATHER THAN IN ceph-osd.ts BECAUSE THE READ SIDE IS THIS FILE'S WHOLE JOB —
147
148
  * `findOsd` and `osdAttributes` are the two halves it composes, and keeping the caller beside
148
149
  * them is what let ceph-osd.ts come back under the 250-line cap when create and delete were
149
- * added. ⚠️ A 404 or a 403 both arrive here as `undefined`: see the ⛔ on `readRole` in
150
- * resource.ts for why that distinction is invisible and what it costs.
150
+ * added.
151
+ *
152
+ * ★ MIGRATED OFF `client.ts`'s `pve()` ONTO `@distilled.cloud/proxmox`'s typed `nodes.
153
+ * getNodeCephOsd` (2026-09-24, decision 43, 2c) — the tree endpoint, confirmed against
154
+ * distilled's own schema to still answer `{flags?, root: unknown}`, matching the shape
155
+ * `osdLeaves` already walks. ⛔ STILL NO `Effect.orElseSucceed` — the ⛔ on `handlers.read` in
156
+ * ceph-osd.ts is unchanged and is still the reason: this path is a collection that always
157
+ * exists while Ceph is installed, so a failure here is never "the OSD is gone" and must
158
+ * propagate rather than fold. This is the one migrated Ceph family that does NOT match
159
+ * ceph-pool-wire.ts's/ceph-fs-distilled.ts's single-fold shape, because it never had it.
151
160
  */
152
- export declare const readOsd: (props: CephOsdProps) => Effect.Effect<CephOsdAttributes | undefined, Error | import("./credential-errors.ts").PveCredentialDenied, import("effect/unstable/http/HttpClient").HttpClient>;
161
+ export declare const readOsd: (props: CephOsdProps) => Effect.Effect<CephOsdAttributes | undefined, Error | import("./distilled-pve.ts").PveClusterExhausted | import("./credential-errors.ts").PveCredentialDenied | import("effect/Cause").TimeoutError | nodes.ProxmoxOpError, import("effect/unstable/http/HttpClient").HttpClient>;
153
162
  export {};
154
163
  //# sourceMappingURL=ceph-osd-tree.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ceph-osd-tree.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-osd-tree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAIlD,iFAAiF;AACjF,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAOzC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,SAAS,SAAU,SAAS,KAAG,SAAS,EAQpD,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,OAAO,SAAU,SAAS,SAAS,MAAM,0BACiB,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;IACf,iGAAiG;IACjG,EAAE,EAAE,OAAO,CAAC;IACZ,8FAA8F;IAC9F,YAAY,EAAE,MAAM,CAAC;IACrB,kGAAkG;IAClG,QAAQ,EAAE,MAAM,CAAC;IACjB,4FAA4F;IAC5F,GAAG,EAAE,MAAM,CAAC;IACZ,iGAAiG;IACjG,WAAW,EAAE,MAAM,CAAC;IACpB,uFAAuF;IACvF,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,aAAa,SAAU,SAAS,SAAS,YAAY,KAAG,iBAanE,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,OAAO,UAAW,YAAY,qKAMxC,CAAC"}
1
+ {"version":3,"file":"ceph-osd-tree.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-osd-tree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,OAAO,KAAK,KAAK,MAAM,gCAAgC,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAIlD,iFAAiF;AACjF,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAOzC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,SAAS,SAAU,SAAS,KAAG,SAAS,EAQpD,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,OAAO,SAAU,SAAS,SAAS,MAAM,0BACiB,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;IACf,iGAAiG;IACjG,EAAE,EAAE,OAAO,CAAC;IACZ,8FAA8F;IAC9F,YAAY,EAAE,MAAM,CAAC;IACrB,kGAAkG;IAClG,QAAQ,EAAE,MAAM,CAAC;IACjB,4FAA4F;IAC5F,GAAG,EAAE,MAAM,CAAC;IACZ,iGAAiG;IACjG,WAAW,EAAE,MAAM,CAAC;IACpB,uFAAuF;IACvF,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,aAAa,SAAU,SAAS,SAAS,YAAY,KAAG,iBAanE,CAAC;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,OAAO,UAAW,YAAY,qRAMxC,CAAC"}
@@ -11,6 +11,7 @@
11
11
  * `defaultRemovalPolicy: 'retain'`, so removing a declaration does NOT reach `destroyOsd` — a
12
12
  * caller opts in with `.pipe(RemovalPolicy.destroy())`.
13
13
  */
14
+ import * as nodes from '@distilled.cloud/proxmox/nodes';
14
15
  import * as Effect from 'effect/Effect';
15
16
  import type { CephOsdProps } from './ceph-osd.ts';
16
17
  import type { EndpointKey } from './constraints.ts';
@@ -32,7 +33,7 @@ export declare const OSD_CREATE_ENDPOINT: EndpointKey;
32
33
  * ⚠️ `dev` is `string | undefined` on the props and non-optional here: `createOsd` refuses first.
33
34
  */
34
35
  export declare const createOsdForm: (props: CephOsdProps, dev: string) => Record<string, string>;
35
- export declare const createOsd: (news: CephOsdProps) => Effect.Effect<import("./ceph-osd-tree.ts").CephOsdAttributes, Error | import("./credential-errors.ts").PveCredentialDenied, import("effect/unstable/http/HttpClient").HttpClient>;
36
+ export declare const createOsd: (news: CephOsdProps) => Effect.Effect<import("./ceph-osd-tree.ts").CephOsdAttributes, Error | import("effect/unstable/http/HttpClientError").HttpClientError | import("./credential-errors.ts").PveCredentialDenied, import("effect/unstable/http/HttpClient").HttpClient>;
36
37
  /**
37
38
  * ⛔ REMOVING THE DECLARATION REMOVES THE ASSERTION, NOT THE REPLICA, AND THAT ASYMMETRY IS THE
38
39
  * POINT. `DELETE /nodes/{node}/ceph/osd/{osdid}` takes a replica out of a live pool — with
@@ -50,6 +51,20 @@ export declare const createOsd: (news: CephOsdProps) => Effect.Effect<import("./
50
51
  *
51
52
  * ⚠️ `cleanup` DEFAULTS TO FALSE, so the logical volumes survive and the disk can be re-added
52
53
  * without a rebuild. Ceph still starts backfilling the missing copies the moment the OSD goes.
54
+ *
55
+ * ⚠️ `cleanup` RIDES A DELETE BODY, ON `client.ts` AND ON DISTILLED ALIKE — PRE-EXISTING, NOT
56
+ * INTRODUCED HERE. `client.ts`'s own `buildRequest` (client.ts) puts `form` in the body for
57
+ * every method, DELETE included, and CHECKED against distilled's generated
58
+ * `DeleteNodeCephOsdRequest`: `cleanup` carries no `T.Query()` annotation either, so it also
59
+ * defaults to a body field. ceph-fs-wire.ts's own ⛔ (measured from PVE's `AnyEvent.pm`) is that
60
+ * PVE's server never reads a body on DELETE — so `cleanup=1` was ALREADY silently ignored by
61
+ * the live cluster before this migration, on the unmigrated code too. Migrating carries the
62
+ * SAME behaviour forward exactly, byte-for-byte, rather than introducing a new gap; unlike
63
+ * `Proxmox.CephFs`'s delete, this is not a reason to keep the call on the hand client. It has
64
+ * zero practical effect today regardless, since the whole DELETE 403s for this package's
65
+ * credential either way (the root-only ⛔ at the top of ceph-osd.ts) — flagged separately as a
66
+ * pre-existing, out-of-scope bug worth its own fix (move `cleanup` into the query string, the
67
+ * way `destroyPath` in ceph-fs-wire.ts already does).
53
68
  */
54
- export declare const destroyOsd: (olds: CephOsdProps) => Effect.Effect<unknown, Error | import("./credential-errors.ts").PveCredentialDenied, import("effect/unstable/http/HttpClient").HttpClient>;
69
+ export declare const destroyOsd: (olds: CephOsdProps) => Effect.Effect<string, Error | import("./distilled-pve.ts").PveClusterExhausted | import("./credential-errors.ts").PveCredentialDenied | import("effect/Cause").TimeoutError | nodes.ProxmoxOpError, import("effect/unstable/http/HttpClient").HttpClient>;
55
70
  //# sourceMappingURL=ceph-osd-write.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ceph-osd-write.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-osd-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAA+C,CAAC;AAIlF;;;GAGG;AACH,eAAO,MAAM,aAAa,UAAW,YAAY,OAAO,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAGpF,CAAC;AAEH,eAAO,MAAM,SAAS,2MA6BpB,CAAC;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,UAAU,SAAU,YAAY,+IAO1C,CAAC"}
1
+ {"version":3,"file":"ceph-osd-write.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-osd-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,KAAK,MAAM,gCAAgC,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAA+C,CAAC;AAIlF;;;GAGG;AACH,eAAO,MAAM,aAAa,UAAW,YAAY,OAAO,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAGpF,CAAC;AAEH,eAAO,MAAM,SAAS,4QAsCpB,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,UAAU,SAAU,YAAY,8PAU1C,CAAC"}
@@ -33,6 +33,12 @@
33
33
  * `hf-provision@pve!…` token would likely be answered 403 however wide its role. That is a
34
34
  * reason to leave the write lane closed, not something to confirm by trying: if the reasoning
35
35
  * is wrong, the confirmation costs a disk.
36
+ *
37
+ * ★ MIGRATED OFF `client.ts` ONTO `@distilled.cloud/proxmox` (2026-09-24, decision 43, 2c) — this
38
+ * file itself never called `pve()` directly, so nothing here changed; ceph-osd-tree.ts's own
39
+ * header has the read side (still no `Effect.orElseSucceed`, unlike every other migrated Ceph
40
+ * family), ceph-osd-write.ts's has the write side and the one pre-existing, out-of-scope gap
41
+ * this migration carries forward rather than fixes.
36
42
  */
37
43
  import { Resource } from 'alchemy';
38
44
  import * as Provider from 'alchemy/Provider';
@@ -1 +1 @@
1
- {"version":3,"file":"ceph-osd.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-osd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD;;;GAGG;AACH,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAElC,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,8FAA8F;IAC9F,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;OAQG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,cAAe,SAAQ,QAAQ,CAC9C,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,iDAEzB,CAAC;AA+HH,eAAO,MAAM,sBAAsB,oIACoD,CAAC"}
1
+ {"version":3,"file":"ceph-osd.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-osd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD;;;GAGG;AACH,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAElC,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,8FAA8F;IAC9F,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;OAQG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,cAAe,SAAQ,QAAQ,CAC9C,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,iDAEzB,CAAC;AA+HH,eAAO,MAAM,sBAAsB,oIACoD,CAAC"}
@@ -6,14 +6,15 @@
6
6
  * synchronous. Ceph's are not — a pool delete returns before the PGs are gone — so this file is
7
7
  * the polling that difference forces, and ceph-pool.ts is the declaration.
8
8
  */
9
+ import * as nodes from '@distilled.cloud/proxmox/nodes';
9
10
  import * as Effect from 'effect/Effect';
10
11
  import type { CephPoolAttributes, CephPoolProps } from './ceph-pool-form.ts';
11
12
  import type { PveRequirements } from './resource.ts';
12
13
  /**
13
14
  * ⚠️ THE DEPENDENCIES ARE PASSED IN RATHER THAN IMPORTED, and that is what made this file
14
- * separable at all. `collection`, `object` and `ops.read` are module-level bindings in
15
- * ceph-pool.ts; importing them back would be a runtime cycle, and duplicating them would be two
16
- * definitions of one path. Passing them is the pattern zfs-pool-write.ts already uses.
15
+ * separable at all. `ops.read` — now `readPoolStatus` (ceph-pool-wire.ts) — is a module-level
16
+ * binding in ceph-pool.ts; importing it back would be a runtime cycle, and duplicating it would
17
+ * be two definitions of one path. Passing it is the pattern zfs-pool-write.ts already uses.
17
18
  */
18
19
  export type PoolRead = (props: CephPoolProps) => Effect.Effect<CephPoolAttributes | undefined, never, PveRequirements>;
19
20
  /**
@@ -23,8 +24,13 @@ export type PoolRead = (props: CephPoolProps) => Effect.Effect<CephPoolAttribute
23
24
  * rather than folded, so "I could not ask" fails the deploy instead of creating over live data.
24
25
  * An empty list is trusted: the collection 403s when the role is too narrow rather than
25
26
  * filtering, so `[]` really does mean a cluster with no pools.
27
+ *
28
+ * ⚠️ `describe` IS STILL A PLAIN STRING (ceph-pool.ts builds it from `object`/`collection` in
29
+ * ceph-pool-form.ts) — this function no longer takes a `collection` PATH, since
30
+ * `nodes.listNodeCephPool` addresses the endpoint itself; the parameter list keeps `describe`
31
+ * only, to name the object in the refusal message.
26
32
  */
27
- export declare const confirmAbsent: (props: CephPoolProps, collection: string, describe: string) => Effect.Effect<void, Error | import("./credential-errors.ts").PveCredentialDenied, import("effect/unstable/http/HttpClient").HttpClient>;
33
+ export declare const confirmAbsent: (props: CephPoolProps, describe: string) => Effect.Effect<void, Error | import("./distilled-pve.ts").PveClusterExhausted | import("./credential-errors.ts").PveCredentialDenied | import("effect/Cause").TimeoutError | nodes.ProxmoxOpError, import("effect/unstable/http/HttpClient").HttpClient>;
28
34
  /**
29
35
  * Wait for the cluster to agree, then answer the last thing it said.
30
36
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ceph-pool-settle.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-pool-settle.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,CACrB,KAAK,EAAE,aAAa,KACjB,MAAM,CAAC,MAAM,CAAC,kBAAkB,GAAG,SAAS,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;AAE3E;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,UAAW,aAAa,cAAc,MAAM,YAAY,MAAM,4IAcrF,CAAC;AAEJ;;;;;;;;;GASG;AACH,eAAO,MAAM,MAAM,UACV,aAAa,QACd,QAAQ,QACR,CAAC,IAAI,EAAE,kBAAkB,GAAG,SAAS,KAAK,OAAO,+GASrD,CAAC"}
1
+ {"version":3,"file":"ceph-pool-settle.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-pool-settle.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,KAAK,MAAM,gCAAgC,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,CACrB,KAAK,EAAE,aAAa,KACjB,MAAM,CAAC,MAAM,CAAC,kBAAkB,GAAG,SAAS,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;AAE3E;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,aAAa,UAAW,aAAa,YAAY,MAAM,4PAcjE,CAAC;AAEJ;;;;;;;;;GASG;AACH,eAAO,MAAM,MAAM,UACV,aAAa,QACd,QAAQ,QACR,CAAC,IAAI,EAAE,kBAAkB,GAAG,SAAS,KAAK,OAAO,+GASrD,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * `Proxmox.CephPool`'s distilled wire lane: the status read, and the two request translations.
3
+ *
4
+ * ★ SPLIT OUT OF ceph-pool-form.ts FOR THE 250-LINE CAP (that file is already near it) — the seam
5
+ * is "touches the cluster or not", the same one ceph-pool-form.ts itself draws against
6
+ * ceph-pool.ts. Nothing in ceph-pool-form.ts changed: `createBody`/`updateBody` still build the
7
+ * PVE form, unaware distilled exists: this file is the ONLY place that translates one into a
8
+ * typed distilled request.
9
+ *
10
+ * ⛔ ONE READ FUNCTION, NOT THE readXOrFail/foldingX PAIR user.ts/group.ts/storage.ts/zfs-pool.ts/
11
+ * node-network-wire.ts CARRY. THIS IS A DELIBERATE, MEASURED DIFFERENCE, NOT AN OVERSIGHT. Those
12
+ * families were BUILT with (or later given, after the NodeNetwork adversarial review) the
13
+ * dual-path pattern because their `diff`/`read` hooks needed to tell "genuinely absent" apart
14
+ * from "a transient failure" at specific call sites. CephPool's PRE-MIGRATION behaviour never
15
+ * had that distinction: `resource.ts`'s generic `pveOperations.read` — what `ops.read`/`ops.diff`
16
+ * called before this PR — folds EVERY failure into `undefined` unconditionally
17
+ * (`Effect.orElseSucceed(() => undefined)`, no `output`-branching, checked directly against
18
+ * `resource.ts` 2026-09-24). This migration's own rule is that every existing refusal and guard
19
+ * survives byte-for-byte — not that it gets upgraded on the way past. `readPoolStatus` below
20
+ * reproduces that exact single-fold shape; it does not add the newer pattern.
21
+ * ⚠️ WORTH A LATER, SEPARATELY-SCOPED DECISION: this means CephPool (like CephDaemon) still folds
22
+ * a refused OpenBao mint into "absent" too, same as every other pre-`unreadable-read.ts` family
23
+ * — the cries-wolf class `Proxmox.NodeNetwork`/`Proxmox.ZfsPool`/`Proxmox.Storage` were fixed
24
+ * against. Noted here rather than fixed here, since fixing it is a behaviour change this PR's
25
+ * own rules do not ask for.
26
+ */
27
+ import * as nodes from '@distilled.cloud/proxmox/nodes';
28
+ import * as Effect from 'effect/Effect';
29
+ import { type CephPoolAttributes, type CephPoolProps } from './ceph-pool-form.ts';
30
+ /**
31
+ * The live pool, or `undefined` — folds every failure, exactly as `ops.read` did. Used by `read`,
32
+ * `diff` (via `ceph-pool.ts`'s own hand-written `reconcile`, which predates the factory) and
33
+ * `settle` (ceph-pool-settle.ts) alike, matching the ONE-function shape this family had before.
34
+ *
35
+ * ⛔ `verbose=1` IS WHAT MAKES `applications` VISIBLE AT ALL — ceph-pool.ts's own header has the
36
+ * measured reason and the cost (two extra, unguarded mon commands PVE runs to answer it).
37
+ */
38
+ export declare const readPoolStatus: (props: CephPoolProps) => Effect.Effect<CephPoolAttributes | undefined, never, import("effect/unstable/http/HttpClient").HttpClient>;
39
+ /** The two endpoints, as the keys `guardWrite` (distilled-guard.ts) checks both forms against. */
40
+ export declare const CEPH_POOL_CREATE = "pve:POST /nodes/{node}/ceph/pool";
41
+ export declare const CEPH_POOL_UPDATE = "pve:PUT /nodes/{node}/ceph/pool/{name}";
42
+ /** The actual `createNodeCephPool` call body — `createBody`, translated. No field is renamed. */
43
+ export declare const toDistilledCreate: (props: CephPoolProps) => nodes.CreateNodeCephPoolRequest;
44
+ /** The actual `putNodeCephPool` call body — `updateBody`, translated. No field is renamed. */
45
+ export declare const toDistilledUpdate: (props: CephPoolProps) => nodes.PutNodeCephPoolRequest;
46
+ //# sourceMappingURL=ceph-pool-wire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ceph-pool-wire.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-pool-wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,KAAK,KAAK,MAAM,gCAAgC,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAKnB,MAAM,qBAAqB,CAAC;AAqC7B;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,UAAW,aAAa,+GAShD,CAAC;AAEJ,kGAAkG;AAClG,eAAO,MAAM,gBAAgB,qCAAqC,CAAC;AACnE,eAAO,MAAM,gBAAgB,2CAA2C,CAAC;AAEzE,iGAAiG;AACjG,eAAO,MAAM,iBAAiB,UAAW,aAAa,KAAG,KAAK,CAAC,yBAIb,CAAC;AAEnD,8FAA8F;AAC9F,eAAO,MAAM,iBAAiB,UAAW,aAAa,KAAG,KAAK,CAAC,sBAKhB,CAAC"}
@@ -5,11 +5,16 @@
5
5
  * ⛔ IT DOES NOT USE `pveHandlers`, AND THE REASON IS MEASURED RATHER THAN STYLISTIC: THE READ AND
6
6
  * THE WRITES SIT AT DIFFERENT PATHS. `GET /nodes/{node}/ceph/pool/{name}` is `poolindex` and
7
7
  * answers `[{"name":"status"}]` — an INDEX OF CHILDREN, not the pool. The pool is one level
8
- * further down, at `.../status` (`getpool`), which accepts no PUT and no DELETE. A `PveSpec`
9
- * carries ONE `path` for read, update and delete, so this family cannot be spelled in it. `path`
10
- * below is therefore the READ path and nothing else consumes it: `ops.reconcile` and
11
- * `ops.destroy` go unused and the two write handlers name their own path. acl.ts is the
12
- * precedent for hand-writing the five handlers over `pveOperations`.
8
+ * further down, at `.../status` (`getpool`), which accepts no PUT and no DELETE. Every handler
9
+ * below is hand-written for that reason, on `client.ts` and now on distilled alike — acl.ts is
10
+ * the precedent for hand-writing over the factory.
11
+ *
12
+ * ★ MIGRATED OFF `client.ts`'s generic `pve()` ONTO `@distilled.cloud/proxmox`'s typed
13
+ * `nodes.getNodeCephPoolStatus`/`createNodeCephPool`/`putNodeCephPool`/`deleteNodeCephPool`/
14
+ * `listNodeCephPool` (2026-09-24, decision 43's walk-down, 2c). `distilled-pve.ts`'s `runPve`
15
+ * replaces `pve()`; `readPoolStatus` (ceph-pool-wire.ts) keeps the SAME single-fold shape this
16
+ * family always had — see that file's own header for why this migration does not also add the
17
+ * newer dual-path pattern `Proxmox.NodeNetwork` carries.
13
18
  *
14
19
  * ⛔ A CREATE FIRED AT A POOL THAT ALREADY EXISTS IS NOT A NO-OP, IT IS A PG MERGE — the second ⛔
15
20
  * in ceph-pool-form.ts has the evidence, and `confirmAbsent` below is the guard that stops it.
@@ -1 +1 @@
1
- {"version":3,"file":"ceph-pool.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EASnB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,KAAK,eAAe,EAA+B,MAAM,eAAe,CAAC;AAIlF,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,CAAC;AAElD,MAAM,WAAW,eAAgB,SAAQ,QAAQ,CAC/C,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,kGAAkG;AAClG,eAAO,MAAM,eAAe,kDAE1B,CAAC;AAsEH,eAAO,MAAM,uBAAuB,qIAuFjC,CAAC"}
1
+ {"version":3,"file":"ceph-pool.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAG7C,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAMnB,MAAM,qBAAqB,CAAC;AAW7B,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAGrD,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,CAAC;AAElD,MAAM,WAAW,eAAgB,SAAQ,QAAQ,CAC/C,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,kGAAkG;AAClG,eAAO,MAAM,eAAe,kDAE1B,CAAC;AAqBH,eAAO,MAAM,uBAAuB,qIAkHjC,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 | 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 | 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>;
52
52
  /**
53
53
  * ⛔ FOLDS A GENUINE READ FAILURE TO `undefined` TOO, AND ONLY `read`/`reconcile` MAY USE IT.
54
54
  * PVE's OWN missing-group answer is a thrown 500 (the ⛔ above), so `reconcile`'s create branch
@@ -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,62BAW9C,CAAC;AAEJ;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,SAAS,UAAW,UAAU,gIACyB,CAAC;AAErE,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,o4BAW9C,CAAC;AAEJ;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,SAAS,UAAW,UAAU,gIACyB,CAAC;AAErE,gGAAgG;AAChG,eAAO,MAAM,cAAc,SAAU,eAAe,GAAG,UAAU,GAAG,SAAS,gCACrC,CAAC"}