@homeflare/alchemy 0.37.0 → 0.37.2

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 (73) hide show
  1. package/dist/proxmox/ceph-daemon-wire.d.ts +5 -7
  2. package/dist/proxmox/ceph-daemon-wire.d.ts.map +1 -1
  3. package/dist/proxmox/ceph-daemon.d.ts +7 -8
  4. package/dist/proxmox/ceph-daemon.d.ts.map +1 -1
  5. package/dist/proxmox/ceph-fs-distilled.d.ts +31 -5
  6. package/dist/proxmox/ceph-fs-distilled.d.ts.map +1 -1
  7. package/dist/proxmox/ceph-fs-wire.d.ts +5 -22
  8. package/dist/proxmox/ceph-fs-wire.d.ts.map +1 -1
  9. package/dist/proxmox/ceph-fs.d.ts +5 -6
  10. package/dist/proxmox/ceph-fs.d.ts.map +1 -1
  11. package/dist/proxmox/ceph-pool-settle.d.ts +9 -8
  12. package/dist/proxmox/ceph-pool-settle.d.ts.map +1 -1
  13. package/dist/proxmox/ceph-pool-wire.d.ts +11 -20
  14. package/dist/proxmox/ceph-pool-wire.d.ts.map +1 -1
  15. package/dist/proxmox/group-wire.d.ts +8 -13
  16. package/dist/proxmox/group-wire.d.ts.map +1 -1
  17. package/dist/proxmox/index.js +296 -326
  18. package/dist/proxmox/index.js.map +14 -14
  19. package/dist/proxmox/node-network-wire.d.ts +1 -1
  20. package/dist/proxmox/node-network-wire.d.ts.map +1 -1
  21. package/dist/proxmox/storage-wire.d.ts +8 -11
  22. package/dist/proxmox/storage-wire.d.ts.map +1 -1
  23. package/dist/proxmox/unreadable-read.d.ts +7 -7
  24. package/dist/proxmox/user-wire.d.ts +8 -11
  25. package/dist/proxmox/user-wire.d.ts.map +1 -1
  26. package/dist/proxmox/user.d.ts +5 -5
  27. package/dist/proxmox/zfs-pool-wire.d.ts +1 -1
  28. package/dist/proxmox/zfs-pool-wire.d.ts.map +1 -1
  29. package/docs/changelog/README.md +22 -0
  30. package/docs/changelog/archive-01.md +176 -0
  31. package/docs/changelog/archive-02.md +180 -0
  32. package/docs/changelog/archive-03.md +179 -0
  33. package/docs/changelog/archive-04.md +178 -0
  34. package/docs/changelog/archive-05.md +177 -0
  35. package/docs/changelog/archive-06.md +180 -0
  36. package/docs/changelog/archive-07.md +180 -0
  37. package/docs/changelog/archive-08.md +178 -0
  38. package/docs/changelog/archive-09.md +181 -0
  39. package/docs/changelog/archive-10.md +182 -0
  40. package/docs/changelog/archive-11.md +182 -0
  41. package/docs/changelog/archive-12.md +183 -0
  42. package/docs/changelog/archive-13.md +180 -0
  43. package/docs/changelog/archive-14.md +178 -0
  44. package/docs/changelog/archive-15.md +181 -0
  45. package/docs/changelog/archive-16.md +182 -0
  46. package/docs/changelog/archive-17.md +183 -0
  47. package/docs/changelog/archive-18.md +55 -0
  48. package/docs/distilled-interim.md +15 -3
  49. package/docs/provider-standard.md +24 -6
  50. package/docs/proxmox.md +26 -0
  51. package/docs/upstream-conformance-bun.md +67 -0
  52. package/docs/upstream-conformance-conforms.md +55 -0
  53. package/docs/upstream-conformance-families.md +95 -0
  54. package/docs/upstream-conformance-grafana.md +106 -0
  55. package/docs/upstream-conformance.md +20 -298
  56. package/package.json +3 -3
  57. package/src/proxmox/ceph-daemon-wire.ts +4 -7
  58. package/src/proxmox/ceph-daemon.ts +7 -8
  59. package/src/proxmox/ceph-fs-delete.test.ts +5 -8
  60. package/src/proxmox/ceph-fs-destroy-sdk.test.ts +98 -0
  61. package/src/proxmox/ceph-fs-distilled.ts +45 -19
  62. package/src/proxmox/ceph-fs-wire.ts +5 -93
  63. package/src/proxmox/ceph-fs.ts +13 -15
  64. package/src/proxmox/ceph-pool-settle.ts +11 -10
  65. package/src/proxmox/ceph-pool-wire.ts +11 -20
  66. package/src/proxmox/ceph-pool-write.test.ts +9 -8
  67. package/src/proxmox/group-wire.ts +7 -12
  68. package/src/proxmox/read-failure-propagation.test.ts +5 -5
  69. package/src/proxmox/storage-wire.ts +9 -10
  70. package/src/proxmox/typed-absence.test.ts +146 -0
  71. package/src/proxmox/unreadable-read.ts +7 -7
  72. package/src/proxmox/user-wire.ts +7 -10
  73. package/src/proxmox/user.ts +5 -5
@@ -4,11 +4,9 @@
4
4
  * `{node,id}` / `{node,name}`) — the SAME reason `DAEMON_ENDPOINTS` (ceph-daemon-form.ts) is a
5
5
  * per-kind table rather than one templated string.
6
6
  *
7
- * ⛔ ONE READ FUNCTION, NOT THE readXOrFail/foldingX PAIR — the same deliberate, measured
8
- * departure ceph-pool-wire.ts and ceph-fs-distilled.ts explain in full: this family's
9
- * pre-migration `pveOperations.read` (resource.ts) already folded every failure unconditionally,
10
- * with no `output`-branching, so `readDaemon` below reproduces that exact single-fold shape
11
- * rather than gaining the newer dual-path pattern along the way.
7
+ * ⛔ ABSENCE IS A SUCCESSFUL INDEX WITH NO MATCHING ROW. The original transport swap
8
+ * preserved `pveOperations.read`'s catch-all fold; the 2026-09-24 follow-up removes it. A failed
9
+ * mon/mgr/mds list proves nothing about whether a daemon exists, so its SDK error propagates.
12
10
  *
13
11
  * ⚠️ `mon_address` IS THE ONE RENAME THIS FAMILY NEEDS — distilled's generator maps the wire name
14
12
  * `mon-address` to `mon_address` on `UpdateNodeCephMonRequest` (`T.Body("mon-address")`,
@@ -18,8 +16,8 @@
18
16
  import * as nodes from '@distilled.cloud/proxmox/nodes';
19
17
  import * as Effect from 'effect/Effect';
20
18
  import type { CephDaemonKind, CephDaemonProps } from './ceph-daemon.ts';
21
- /** ⛔ FOLDS EVERY FAILURE TO `undefined` — see this file's own header for why. */
22
- export declare const readDaemon: (props: CephDaemonProps) => Effect.Effect<import("./ceph-daemon.ts").CephDaemonAttributes | undefined, never, import("effect/unstable/http/HttpClient").HttpClient>;
19
+ /** A missing row is absent; a failed index read keeps its typed SDK error. */
20
+ export declare const readDaemon: (props: CephDaemonProps) => Effect.Effect<import("./ceph-daemon.ts").CephDaemonAttributes | undefined, Error | import("./distilled-pve.ts").PveClusterExhausted | import("./credential-errors.ts").PveCredentialDenied | import("effect/Cause").TimeoutError | nodes.ProxmoxOpError, import("effect/unstable/http/HttpClient").HttpClient>;
23
21
  /** POST — distilled's generator misnames it "update" (checked against `T.Http`); it is a create. */
24
22
  export declare const createDaemon: (props: CephDaemonProps) => 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>;
25
23
  /** ⚠️ NO FLAGS ON ANY OF THE THREE — unlike CephFs/CephOsd, nothing here is at risk of a
@@ -1 +1 @@
1
- {"version":3,"file":"ceph-daemon-wire.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-daemon-wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,KAAK,MAAM,gCAAgC,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AA+BxE,iFAAiF;AACjF,eAAO,MAAM,UAAU,UAAW,eAAe,4IAI9C,CAAC;AAEJ,oGAAoG;AACpG,eAAO,MAAM,YAAY,UAAW,eAAe,8PA6BlD,CAAC;AAEF;wEACwE;AACxE,eAAO,MAAM,YAAY,UAAW,eAAe,8PAWlD,CAAC;AAEF,wGAAwG;AACxG,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B;oGACoG;AACpG,eAAO,MAAM,UAAU,UAAW,eAAe,UAK9C,CAAC"}
1
+ {"version":3,"file":"ceph-daemon-wire.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-daemon-wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,KAAK,MAAM,gCAAgC,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AA+BxE,8EAA8E;AAC9E,eAAO,MAAM,UAAU,UAAW,eAAe,mTAG9C,CAAC;AAEJ,oGAAoG;AACpG,eAAO,MAAM,YAAY,UAAW,eAAe,8PA6BlD,CAAC;AAEF;wEACwE;AACxE,eAAO,MAAM,YAAY,UAAW,eAAe,8PAWlD,CAAC;AAEF,wGAAwG;AACxG,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B;oGACoG;AACpG,eAAO,MAAM,UAAU,UAAW,eAAe,UAK9C,CAAC"}
@@ -47,8 +47,8 @@
47
47
  * this credential already has it rather than discovering it the next time something is scoped.
48
48
  *
49
49
  * ★ MIGRATED OFF `client.ts` (2026-09-24, decision 43, 2c) — ceph-daemon-wire.ts has the rename
50
- * and why no protocol gap blocks any of the three kinds; `readDaemon` there keeps this family's
51
- * pre-migration single-fold shape (ceph-pool-wire.ts explains why that is not left unfixed).
50
+ * and why no protocol gap blocks any of the three kinds. The follow-up removes the preserved
51
+ * catch-all read fold: only a successful index without this daemon proves absence.
52
52
  */
53
53
  import { Resource } from 'alchemy';
54
54
  import * as Provider from 'alchemy/Provider';
@@ -68,12 +68,11 @@ export interface CephDaemonProps extends WithTarget {
68
68
  /**
69
69
  * The node the daemon RUNS on. Identity — a daemon cannot be moved, only destroyed and rebuilt.
70
70
  * ⚠️ It is also the node whose API is asked, and the read is only as available as that node: a
71
- * node that is down — or has no Ceph installed, or answers 403 — reads as nothing at all,
72
- * because `pveOperations.read` folds EVERY failure into "absent" (a 404 is a legitimate answer
73
- * there and it cannot tell the two apart). Its daemons then plan as `update`, and reconcile
74
- * POSTs a create for a mon that already exists. PVE refuses that with "monitor already
75
- * exists", and the read-back refuses again — so it fails loudly rather than damaging anything,
76
- * but the message will point at the daemon rather than at the node that would not answer.
71
+ * failed index now propagates its error. Before the typed-read follow-up, a down node,
72
+ * missing Ceph installation or 403 was folded to "absent"; its daemons planned `update`
73
+ * and reconcile POSTed a create for a mon that already existed. PVE refused with "monitor
74
+ * already exists", then read-back failed again, obscuring the original node read error.
75
+ * That incident is why collection failure can never prove a daemon is missing.
77
76
  */
78
77
  node: string;
79
78
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ceph-daemon.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAIxC,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAEtE;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAEnD,MAAM,WAAW,eAAgB,SAAQ,UAAU;IACjD,IAAI,EAAE,cAAc,CAAC;IACrB;;;;;;;;;OASG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;OAOG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;;OAQG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,uGAAuG;IACvG,IAAI,EAAE,MAAM,CAAC;IACb,mGAAmG;IACnG,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,MAAM,EAAE,OAAO,CAAC;IAChB,+EAA+E;IAC/E,aAAa,EAAE,OAAO,CAAC;IACvB;;;;;OAKG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,iGAAiG;IACjG,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,iBAAkB,SAAQ,QAAQ,CACjD,oBAAoB,EACpB,eAAe,EACf,oBAAoB,EACpB,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,iGAAiG;AACjG,eAAO,MAAM,iBAAiB,oDAE5B,CAAC;AAEH;;;;;;;;;;;;;;;GAeG;AACH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe;UAA0C,eAAe;8NAQnF,CAAC;AAEH,eAAO,MAAM,yBAAyB,uIA8BnC,CAAC"}
1
+ {"version":3,"file":"ceph-daemon.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAIxC,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAEtE;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAEnD,MAAM,WAAW,eAAgB,SAAQ,UAAU;IACjD,IAAI,EAAE,cAAc,CAAC;IACrB;;;;;;;;OAQG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;OAOG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;;OAQG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,uGAAuG;IACvG,IAAI,EAAE,MAAM,CAAC;IACb,mGAAmG;IACnG,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,MAAM,EAAE,OAAO,CAAC;IAChB,+EAA+E;IAC/E,aAAa,EAAE,OAAO,CAAC;IACvB;;;;;OAKG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,iGAAiG;IACjG,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,iBAAkB,SAAQ,QAAQ,CACjD,oBAAoB,EACpB,eAAe,EACf,oBAAoB,EACpB,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,iGAAiG;AACjG,eAAO,MAAM,iBAAiB,oDAE5B,CAAC;AAEH;;;;;;;;;;;;;;;GAeG;AACH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe;UAA0C,eAAe;8NAQnF,CAAC;AAEH,eAAO,MAAM,yBAAyB,uIA8BnC,CAAC"}
@@ -1,14 +1,40 @@
1
+ /**
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
+ *
5
+ * ⛔ `nodes.updateNodeCephFs` IS distilled's GENERATOR MISNAMING A CREATE, NOT A SECOND ENDPOINT.
6
+ * Checked directly against its schema (`T.Http({ method: "POST", uri:
7
+ * "/nodes/{node}/ceph/fs/{name}" })`) rather than trusted from the function name — it is the
8
+ * SAME single write PVE registers, `createfs`. Harmless once named here for what it is.
9
+ *
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.
14
+ */
15
+ import * as nodes from '@distilled.cloud/proxmox/nodes';
1
16
  import * as Effect from 'effect/Effect';
2
17
  import type { CephFsProps } from './ceph-fs.ts';
3
18
  /**
4
19
  * The index, read via distilled — the same shape `readRow` (ceph-fs-wire.ts) already narrows.
5
20
  *
6
- * ⛔ FOLDS EVERY FAILURE TO `undefined`, matching the pre-migration `pveOperations.read` this
7
- * family used (`resource.ts`, `Effect.orElseSucceed`) — the same single-fold shape
8
- * ceph-pool-wire.ts's `readPoolStatus` preserves and explains: this migration's own rule is
9
- * behaviour surviving byte-for-byte, not the newer dual-path pattern gaining a new family.
21
+ * ⛔ ABSENCE IS A SUCCESSFUL INDEX WITH NO MATCHING FILESYSTEM. The transport swap
22
+ * initially preserved the generic factory's catch-all fold. The 2026-09-24 follow-up removes it:
23
+ * a failed list is not proof that a filesystem is missing. Task polling below retains its
24
+ * separate bounded wait policy; it does not decide whether a resource exists.
10
25
  */
11
- export declare const readFs: (props: CephFsProps) => Effect.Effect<import("./ceph-fs.ts").CephFsAttributes | undefined, never, import("effect/unstable/http/HttpClient").HttpClient>;
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>;
12
27
  /** POST the create, then wait for the worker. ⛔ The caller still reads back; see ceph-fs.ts. */
13
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>;
14
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":"AAoBA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD;;;;;;;GAOG;AACH,eAAO,MAAM,MAAM,UAAW,WAAW,oIAItC,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,12 +28,11 @@
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
- * 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.
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
+ * The typed-read follow-up removes the catch-all fold from `readFs`: a failed index must
35
+ * fail read/diff/reconcile/delete, not report a missing filesystem or a successful destroy.
37
36
  *
38
37
  * ⛔ CREATING A CephFS CREATES TWO CEPH POOLS, AND A `Proxmox.CephPool` MUST NOT ALSO DECLARE THEM.
39
38
  * `createfs` builds `<name>_data` and `<name>_metadata` itself and refuses outright if either
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"ceph-fs.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-fs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;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,mIAiF/B,CAAC"}
@@ -15,15 +15,16 @@ import type { PveRequirements } from './resource.ts';
15
15
  * separable at all. `ops.read` — now `readPoolStatus` (ceph-pool-wire.ts) — is a module-level
16
16
  * binding in ceph-pool.ts; importing it back would be a runtime cycle, and duplicating it would
17
17
  * be two definitions of one path. Passing it is the pattern zfs-pool-write.ts already uses.
18
+ * The error parameter preserves the reader's typed failures through settle; it is not `never`.
18
19
  */
19
- export type PoolRead = (props: CephPoolProps) => Effect.Effect<CephPoolAttributes | undefined, never, PveRequirements>;
20
+ export type PoolRead<E> = (props: CephPoolProps) => Effect.Effect<CephPoolAttributes | undefined, E, PveRequirements>;
20
21
  /**
21
- * ⛔ THE GUARD ON THE CREATE. `read` folds a 403, a timeout and a node that is down into the same
22
- * `undefined` as a pool that is genuinely missing — so "absent" is not evidence. This asks a
23
- * second, different question: does the cluster LIST this pool? A failure is left to propagate
24
- * rather than folded, so "I could not ask" fails the deploy instead of creating over live data.
25
- * An empty list is trusted: the collection 403s when the role is too narrow rather than
26
- * filtering, so `[]` really does mean a cluster with no pools.
22
+ * ⛔ THE GUARD ON THE CREATE. The original read folded 403s/timeouts into absence, so this
23
+ * independent index check prevented creating over a live pool. The typed reader now
24
+ * propagates those failures, but a `CephPoolNotFound` must still not override a listed pool:
25
+ * the measured PG-merge risk warrants keeping both observations. Failed index reads also
26
+ * propagate. An empty list is trusted: the collection refuses a narrow role with 403 rather
27
+ * than filtering, so `[]` really does mean a cluster with no pools.
27
28
  *
28
29
  * ⚠️ `describe` IS STILL A PLAIN STRING (ceph-pool.ts builds it from `object`/`collection` in
29
30
  * ceph-pool-form.ts) — this function no longer takes a `collection` PATH, since
@@ -41,5 +42,5 @@ export declare const confirmAbsent: (props: CephPoolProps, describe: string) =>
41
42
  * ⚠️ SHORT POLLS, LOW CAP: 2s apart, 30 tries, about a minute. A pool create takes seconds; one
42
43
  * still unsettled after a minute is a fault to surface, not a wait to lengthen.
43
44
  */
44
- export declare const settle: (props: CephPoolProps, read: PoolRead, done: (live: CephPoolAttributes | undefined) => boolean) => Effect.Effect<CephPoolAttributes | undefined, never, import("effect/unstable/http/HttpClient").HttpClient>;
45
+ export declare const settle: <E>(props: CephPoolProps, read: PoolRead<E>, done: (live: CephPoolAttributes | undefined) => boolean) => Effect.Effect<CephPoolAttributes | undefined, E, import("effect/unstable/http/HttpClient").HttpClient>;
45
46
  //# sourceMappingURL=ceph-pool-settle.d.ts.map
@@ -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,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"}
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;;;;;;GAMG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CACxB,KAAK,EAAE,aAAa,KACjB,MAAM,CAAC,MAAM,CAAC,kBAAkB,GAAG,SAAS,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;AAEvE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,aAAa,UAAW,aAAa,YAAY,MAAM,4PAcjE,CAAC;AAEJ;;;;;;;;;GASG;AACH,eAAO,MAAM,MAAM,GAAI,CAAC,SACf,aAAa,QACd,QAAQ,CAAC,CAAC,CAAC,QACX,CAAC,IAAI,EAAE,kBAAkB,GAAG,SAAS,KAAK,OAAO,2GASrD,CAAC"}
@@ -7,35 +7,26 @@
7
7
  * PVE form, unaware distilled exists: this file is the ONLY place that translates one into a
8
8
  * typed distilled request.
9
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.
10
+ * ⛔ ONLY TYPED ABSENCE MAY REACH A CREATE. The transport migration deliberately preserved
11
+ * `pveOperations.read`'s catch-all `Effect.orElseSucceed(() => undefined)` to avoid changing
12
+ * behavior during the swap. That also hid refused credentials and transient failures, risking
13
+ * a false update/create. SDK PR #265 added the measured `CephPoolNotFound` tag; the follow-up
14
+ * now catches only it. One reader serves read/diff/reconcile/settle, so all propagate other
15
+ * failures. `confirmAbsent` still checks the index before create: a missing status alone must
16
+ * never override a pool that the index lists (the PG-merge incident, ceph-pool-settle.ts).
26
17
  */
27
18
  import * as nodes from '@distilled.cloud/proxmox/nodes';
28
19
  import * as Effect from 'effect/Effect';
29
20
  import { type CephPoolAttributes, type CephPoolProps } from './ceph-pool-form.ts';
30
21
  /**
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.
22
+ * The live pool, or `undefined` only for the SDK's measured `CephPoolNotFound`. The initial
23
+ * transport swap preserved `ops.read`'s catch-all fold; the 2026-09-24 follow-up removes that ambiguity.
24
+ * Read, reconcile and settle now propagate every other failure instead of assuming absence.
34
25
  *
35
26
  * ⛔ `verbose=1` IS WHAT MAKES `applications` VISIBLE AT ALL — ceph-pool.ts's own header has the
36
27
  * measured reason and the cost (two extra, unguarded mon commands PVE runs to answer it).
37
28
  */
38
- export declare const readPoolStatus: (props: CephPoolProps) => Effect.Effect<CephPoolAttributes | undefined, never, import("effect/unstable/http/HttpClient").HttpClient>;
29
+ export declare const readPoolStatus: (props: CephPoolProps) => Effect.Effect<CephPoolAttributes | undefined, Error | import("./distilled-pve.ts").PveClusterExhausted | import("./credential-errors.ts").PveCredentialDenied | import("effect/Cause").TimeoutError | nodes.ProxmoxOpError, import("effect/unstable/http/HttpClient").HttpClient>;
39
30
  /** The two endpoints, as the keys `guardWrite` (distilled-guard.ts) checks both forms against. */
40
31
  export declare const CEPH_POOL_CREATE = "pve:POST /nodes/{node}/ceph/pool";
41
32
  export declare const CEPH_POOL_UPDATE = "pve:PUT /nodes/{node}/ceph/pool/{name}";
@@ -1 +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"}
1
+ {"version":3,"file":"ceph-pool-wire.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-pool-wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;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,sRAShD,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"}
@@ -48,21 +48,16 @@ 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
- * ⛔ FOLDS A GENUINE READ FAILURE TO `undefined` TOO, AND ONLY `read`/`reconcile` MAY USE IT.
54
- * PVE's OWN missing-group answer is a thrown 500 (the ⛔ above), so `reconcile`'s create branch
55
- * NEEDS "absent" from a failure to ever run at all — without this fold, a brand-new group could
56
- * never be created, because its very-first read would always fail loudly. Safe here because a
57
- * wrongful fold costs at most a redundant `createAccessGroup` POST, which PVE refuses loudly
58
- * ("group already exists") rather than silently corrupting anything.
59
- * ⛔ `group.ts`'s `diff` does **NOT** use this — found 2026-09-24, the SAME bug class as the
60
- * credential denial fix: folding a TRANSIENT failure (a `PveClusterExhausted`, the encoding bug
61
- * above) into "absent" at PLAN TIME is exactly what forced a false `update` with nothing
62
- * compared. `diff` calls `readGroupOrFail` directly instead, so a genuine failure there
63
- * propagates and fails the whole plan loudly — never silently misreports one row.
53
+ * ⛔ ONLY `GroupNotFound` MEANS ABSENT. The initial distilled transport swap preserved a
54
+ * catch-all fold because PVE reports missing objects as HTTP 500. SDK PR 265 now types that
55
+ * measured message, so permission errors, unrelated 500s and exhausted transports propagate
56
+ * instead of triggering a speculative create (decision 49 follow-up, 2026-09-24).
57
+ * ★ `readGroupOrFail` remains the strict path used for an already-confirmed state row. This
58
+ * change narrows cold reads/reconcile without changing that existing drift/diff contract.
64
59
  */
65
- export declare const readGroup: (props: GroupProps) => Effect.Effect<typeof UNREADABLE | GroupAttributes | undefined, never, 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>;
66
61
  /** `read`/`reconcile` return `Attributes | undefined`; only `diff` tells `UNREADABLE` apart. */
67
62
  export declare const dropUnreadable: (live: GroupAttributes | Unreadable | undefined) => GroupAttributes | undefined;
68
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;;;;;;;;;;;;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,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"}