@homeflare/alchemy 0.30.0 → 0.31.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/README.md +22 -0
  2. package/dist/discord/application-command.d.ts +52 -0
  3. package/dist/discord/application-command.d.ts.map +1 -0
  4. package/dist/discord/command-form.d.ts +62 -0
  5. package/dist/discord/command-form.d.ts.map +1 -0
  6. package/dist/discord/credentials.d.ts +35 -0
  7. package/dist/discord/credentials.d.ts.map +1 -0
  8. package/dist/discord/fake-discord.d.ts +44 -0
  9. package/dist/discord/fake-discord.d.ts.map +1 -0
  10. package/dist/discord/guild-application-command.d.ts +53 -0
  11. package/dist/discord/guild-application-command.d.ts.map +1 -0
  12. package/dist/discord/index.d.ts +12 -0
  13. package/dist/discord/index.d.ts.map +1 -0
  14. package/dist/discord/index.js +193 -0
  15. package/dist/discord/index.js.map +15 -0
  16. package/dist/discord/providers.d.ts +15 -0
  17. package/dist/discord/providers.d.ts.map +1 -0
  18. package/dist/discord/resource.d.ts +75 -0
  19. package/dist/discord/resource.d.ts.map +1 -0
  20. package/dist/proxmox/acl-wire.d.ts +26 -0
  21. package/dist/proxmox/acl-wire.d.ts.map +1 -0
  22. package/dist/proxmox/acl.d.ts.map +1 -1
  23. package/dist/proxmox/api-token-form.d.ts +28 -26
  24. package/dist/proxmox/api-token-form.d.ts.map +1 -1
  25. package/dist/proxmox/api-token.d.ts +48 -89
  26. package/dist/proxmox/api-token.d.ts.map +1 -1
  27. package/dist/proxmox/ceph-fs-wire.d.ts +2 -2
  28. package/dist/proxmox/ceph-fs-wire.d.ts.map +1 -1
  29. package/dist/proxmox/ceph-osd-tree.d.ts +1 -1
  30. package/dist/proxmox/ceph-osd-tree.d.ts.map +1 -1
  31. package/dist/proxmox/ceph-osd-write.d.ts +2 -2
  32. package/dist/proxmox/ceph-osd-write.d.ts.map +1 -1
  33. package/dist/proxmox/ceph-pool-settle.d.ts +1 -1
  34. package/dist/proxmox/ceph-pool-settle.d.ts.map +1 -1
  35. package/dist/proxmox/client.d.ts +2 -2
  36. package/dist/proxmox/client.d.ts.map +1 -1
  37. package/dist/proxmox/credential-errors.d.ts +27 -0
  38. package/dist/proxmox/credential-errors.d.ts.map +1 -0
  39. package/dist/proxmox/credentials.d.ts +0 -38
  40. package/dist/proxmox/credentials.d.ts.map +1 -1
  41. package/dist/proxmox/distilled-guard.d.ts +31 -0
  42. package/dist/proxmox/distilled-guard.d.ts.map +1 -0
  43. package/dist/proxmox/distilled-pve.d.ts +11 -4
  44. package/dist/proxmox/distilled-pve.d.ts.map +1 -1
  45. package/dist/proxmox/generated/constraints/index.d.ts +1 -1
  46. package/dist/proxmox/generated/constraints/pve-access.d.ts +1 -1
  47. package/dist/proxmox/generated/constraints/pve-access.d.ts.map +1 -1
  48. package/dist/proxmox/generated/constraints/pve-cluster-backup.d.ts +1 -1
  49. package/dist/proxmox/generated/constraints/pve-cluster-ceph.d.ts +1 -1
  50. package/dist/proxmox/generated/constraints/pve-cluster-firewall.d.ts +1 -1
  51. package/dist/proxmox/generated/constraints/pve-cluster-ha.d.ts +1 -1
  52. package/dist/proxmox/generated/constraints/pve-cluster-metrics.d.ts +1 -1
  53. package/dist/proxmox/generated/constraints/pve-cluster-notifications.d.ts +1 -1
  54. package/dist/proxmox/generated/constraints/pve-cluster-replication.d.ts +1 -1
  55. package/dist/proxmox/generated/constraints/pve-cluster-sdn.d.ts +1 -1
  56. package/dist/proxmox/generated/constraints/pve-nodes-ceph.d.ts +1 -1
  57. package/dist/proxmox/generated/constraints/pve-nodes-disks.d.ts +1 -1
  58. package/dist/proxmox/generated/constraints/pve-nodes-lxc.d.ts +1 -1
  59. package/dist/proxmox/generated/constraints/pve-nodes-network.d.ts +1 -1
  60. package/dist/proxmox/generated/constraints/pve-nodes-qemu.d.ts +1 -1
  61. package/dist/proxmox/generated/constraints/pve-pools.d.ts +1 -1
  62. package/dist/proxmox/generated/constraints/pve-storage.d.ts +1 -1
  63. package/dist/proxmox/group-wire.d.ts +29 -0
  64. package/dist/proxmox/group-wire.d.ts.map +1 -0
  65. package/dist/proxmox/group.d.ts +20 -24
  66. package/dist/proxmox/group.d.ts.map +1 -1
  67. package/dist/proxmox/index.js +725 -509
  68. package/dist/proxmox/index.js.map +40 -33
  69. package/dist/proxmox/lease-cache.d.ts +1 -1
  70. package/dist/proxmox/lease-cache.d.ts.map +1 -1
  71. package/dist/proxmox/lxc-lifecycle.d.ts +5 -5
  72. package/dist/proxmox/lxc-lifecycle.d.ts.map +1 -1
  73. package/dist/proxmox/mint.d.ts +50 -0
  74. package/dist/proxmox/mint.d.ts.map +1 -0
  75. package/dist/proxmox/network-apply-read.d.ts +2 -2
  76. package/dist/proxmox/network-apply-read.d.ts.map +1 -1
  77. package/dist/proxmox/pbs-notification-target-lifecycle.d.ts +2 -2
  78. package/dist/proxmox/pbs-sync-job-form.d.ts +2 -2
  79. package/dist/proxmox/provision-cli-fake.d.ts.map +1 -1
  80. package/dist/proxmox/resource.d.ts +4 -4
  81. package/dist/proxmox/role-wire.d.ts +28 -0
  82. package/dist/proxmox/role-wire.d.ts.map +1 -0
  83. package/dist/proxmox/role.d.ts +36 -52
  84. package/dist/proxmox/role.d.ts.map +1 -1
  85. package/dist/proxmox/sdn-apply-read.d.ts +1 -1
  86. package/dist/proxmox/sdn-apply-read.d.ts.map +1 -1
  87. package/dist/proxmox/unreadable-read.d.ts +50 -0
  88. package/dist/proxmox/unreadable-read.d.ts.map +1 -0
  89. package/dist/proxmox/user-wire.d.ts +18 -0
  90. package/dist/proxmox/user-wire.d.ts.map +1 -0
  91. package/dist/proxmox/user.d.ts +25 -32
  92. package/dist/proxmox/user.d.ts.map +1 -1
  93. package/dist/proxmox/zfs-pool-write.d.ts +2 -2
  94. package/dist/proxmox/zfs-pool-write.d.ts.map +1 -1
  95. package/docs/credentials.md +9 -0
  96. package/docs/discord.md +129 -0
  97. package/docs/upstream-conformance.md +17 -1
  98. package/package.json +5 -1
  99. package/src/discord/application-command.test.ts +103 -0
  100. package/src/discord/application-command.ts +109 -0
  101. package/src/discord/command-form.test.ts +144 -0
  102. package/src/discord/command-form.ts +133 -0
  103. package/src/discord/credentials.ts +36 -0
  104. package/src/discord/fake-discord.ts +70 -0
  105. package/src/discord/guild-application-command.test.ts +215 -0
  106. package/src/discord/guild-application-command.ts +129 -0
  107. package/src/discord/index.ts +31 -0
  108. package/src/discord/providers.ts +18 -0
  109. package/src/discord/resource.ts +164 -0
  110. package/src/discord/retry.test.ts +74 -0
  111. package/src/proxmox/acl-wire.ts +83 -0
  112. package/src/proxmox/acl.ts +29 -82
  113. package/src/proxmox/adopt-noop.test.ts +18 -0
  114. package/src/proxmox/api-token-adopt.test.ts +28 -12
  115. package/src/proxmox/api-token-form.ts +50 -93
  116. package/src/proxmox/api-token.ts +149 -135
  117. package/src/proxmox/client.ts +2 -7
  118. package/src/proxmox/constraints-forms.test.ts +7 -27
  119. package/src/proxmox/credential-errors.ts +33 -0
  120. package/src/proxmox/credentials.test.ts +29 -3
  121. package/src/proxmox/credentials.ts +4 -134
  122. package/src/proxmox/distilled-guard.ts +42 -0
  123. package/src/proxmox/distilled-pve.ts +15 -4
  124. package/src/proxmox/generated/constraints/index.ts +1 -1
  125. package/src/proxmox/generated/constraints/pve-access.ts +1 -4
  126. package/src/proxmox/generated/constraints/pve-cluster-backup.ts +1 -1
  127. package/src/proxmox/generated/constraints/pve-cluster-ceph.ts +1 -1
  128. package/src/proxmox/generated/constraints/pve-cluster-firewall.ts +1 -1
  129. package/src/proxmox/generated/constraints/pve-cluster-ha.ts +1 -1
  130. package/src/proxmox/generated/constraints/pve-cluster-metrics.ts +1 -1
  131. package/src/proxmox/generated/constraints/pve-cluster-notifications.ts +1 -1
  132. package/src/proxmox/generated/constraints/pve-cluster-replication.ts +1 -1
  133. package/src/proxmox/generated/constraints/pve-cluster-sdn.ts +1 -1
  134. package/src/proxmox/generated/constraints/pve-nodes-ceph.ts +1 -1
  135. package/src/proxmox/generated/constraints/pve-nodes-disks.ts +1 -1
  136. package/src/proxmox/generated/constraints/pve-nodes-lxc.ts +1 -1
  137. package/src/proxmox/generated/constraints/pve-nodes-network.ts +1 -1
  138. package/src/proxmox/generated/constraints/pve-nodes-qemu.ts +1 -1
  139. package/src/proxmox/generated/constraints/pve-pools.ts +1 -1
  140. package/src/proxmox/generated/constraints/pve-storage.ts +1 -1
  141. package/src/proxmox/group-wire.ts +63 -0
  142. package/src/proxmox/group.test.ts +110 -0
  143. package/src/proxmox/group.ts +135 -105
  144. package/src/proxmox/lease-cache.ts +2 -1
  145. package/src/proxmox/lxc-lifecycle.ts +2 -1
  146. package/src/proxmox/mint.ts +158 -0
  147. package/src/proxmox/network-apply.ts +1 -1
  148. package/src/proxmox/provision-cli-fake.ts +11 -0
  149. package/src/proxmox/provision-declare.test.ts +6 -1
  150. package/src/proxmox/role-wire.ts +49 -0
  151. package/src/proxmox/role.test.ts +89 -0
  152. package/src/proxmox/role.ts +147 -106
  153. package/src/proxmox/unreadable-read.test.ts +83 -0
  154. package/src/proxmox/unreadable-read.ts +60 -0
  155. package/src/proxmox/user-wire.ts +112 -0
  156. package/src/proxmox/user.test.ts +142 -0
  157. package/src/proxmox/user.ts +132 -129
@@ -28,8 +28,6 @@
28
28
  * secret that reached an attribute would outlive its 300s lease by months, in four places.
29
29
  * Nothing here returns it to a resource; it is used to build a header and then dropped.
30
30
  */
31
- import * as Effect from 'effect/Effect';
32
- import * as HttpClient from 'effect/unstable/http/HttpClient';
33
31
  /**
34
32
  * ★ NO SESSION, ON PURPOSE, AND THIS IS WHAT UNBLOCKED `wip/bao-policy`.
35
33
  * `CommandExecutor.run` requires a `ScopedPlanStatusSession`, and Alchemy gives one to
@@ -114,40 +112,4 @@ export type PveCredential = {
114
112
  };
115
113
  /** The environment `mint` resolves OpenBao from — `process.env` unless a test passes its own. */
116
114
  export type BaoEnvironment = Readonly<Record<string, string | undefined>>;
117
- /**
118
- * Mint one credential for `role`: `GET /v1/<mount>/creds/<role>` on OpenBao's HTTP API.
119
- *
120
- * 🔴 IT SHELLED OUT TO `bao read -format=json` UNTIL 2026-09-14. The case for the CLI was that one
121
- * client could not disagree with `bao kv get` about what this machine may do. <estate>/openbao then
122
- * learned twice what deciding by stderr costs — every failure read as absent, and two commands
123
- * said "absent" in different words — so this reads STATUS CODES: 2xx is a credential, and 403
124
- * (denied), 404 (no such role or mount — a mint has no "absent"), 503 (sealed) all fail.
125
- * ★ THE ENVIRONMENT CONTRACT IS STILL THE CLI's, READ THE CLI's WAY, which keeps the case above
126
- * true (openbao v2.6.2 api/client.go:34-66, 370, 503-507, 761-762, 776-785): BAO_AGENT_ADDR over
127
- * BAO_ADDR over https://127.0.0.1:8200; BAO_NAMESPACE as X-Vault-Namespace; BAO_TOKEN as
128
- * X-Vault-Token; X-Vault-Request always. <estate>/openbao/src/bao-address.ts has the long form.
129
- * ★ AGENT MODE IS NO BAO_TOKEN AND NO TOKEN HEADER. An Agent or Proxy listener with
130
- * `api_proxy { use_auto_auth_token = true }` (or the older `cache { … }`) substitutes its
131
- * auto-auth token exactly when a request carries none — command/agentproxyshared/cache/handler.go
132
- * :29-38, command/agent.go:517-541, command/agent/config/config.go:288-292, and
133
- * website/content/docs/agent-and-proxy/agent/apiproxy.mdx:57-62. The CLI's token-file fallback
134
- * is deliberately not read. ⚠️ So an unset BAO_TOKEN aimed at a SERVER rather than an agent is a
135
- * 403, which reads like a missing grant rather than a missing variable.
136
- * ★ UNIX SOCKETS: `unix:///path` is plain HTTP to `localhost` over that socket, as the CLI does it
137
- * (api/client.go:654-667). Bun's fetch takes a `unix` option; `FetchHttpClient.RequestInit` is
138
- * Effect's documented way to pass fetch options, read from the calling fiber (effect
139
- * FetchHttpClient.ts:59-72). Off Bun it REFUSES, rather than reach http://localhost:80.
140
- */
141
- export declare const mint: (target: ApiTarget, role: PveRole, env?: BaoEnvironment) => Effect.Effect<{
142
- leaseSeconds: number;
143
- secret: string;
144
- tokenId: string;
145
- }, Error, HttpClient.HttpClient>;
146
- /**
147
- * The header PVE wants. `PVEAPIToken=<tokenid>=<secret>`.
148
- *
149
- * ⚠️ THE SEPARATOR IS `=`, NOT `:`. Proxmox rejects the colon form with a 401 that says only
150
- * "authentication failure", which reads as a bad credential rather than as a malformed header.
151
- */
152
- export declare const authorization: (credential: PveCredential, target: ApiTarget) => string;
153
115
  //# sourceMappingURL=credentials.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/proxmox/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAIxC,OAAO,KAAK,UAAU,MAAM,iCAAiC,CAAC;AAG9D;;;;;;;;;;;;GAYG;AACH,uFAAuF;AACvF,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC;AAE3C;;;;;;;GAOG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;CACxB,CAAC;AAEF,oFAAoF;AACpF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;CACxB,CAAC;AAEF,oGAAoG;AACpG,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE9C;;;;;;;GAOG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,sEAAsE;IACtE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gEAAgE;IAChE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,iGAAiG;AACjG,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AAM1E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,IAAI,WAAY,SAAS,QAAQ,OAAO,QAAO,cAAc;;;;gCAuFtE,CAAC;AAEL;;;;;GAKG;AACH,eAAO,MAAM,aAAa,eAAgB,aAAa,UAAU,SAAS,KAAG,MAGf,CAAC"}
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/proxmox/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH;;;;;;;;;;;;GAYG;AACH,uFAAuF;AACvF,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC;AAE3C;;;;;;;GAOG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;CACxB,CAAC;AAEF,oFAAoF;AACpF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;CACxB,CAAC;AAEF,oGAAoG;AACpG,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE9C;;;;;;;GAOG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,sEAAsE;IACtE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gEAAgE;IAChE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,iGAAiG;AACjG,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Vendor-constraint guards (constraint-guard.ts) for a distilled-backed family — the seam
3
+ * acl.ts's own local `guardWrite` established (acl-wire.ts), generalized once a second family
4
+ * (Group) needed the SAME create/update split `resource.ts`'s `specGuards` (resource-guard.ts)
5
+ * gives every family still on `client.ts`. `codegen/constraints.ts` scans this package's SOURCE
6
+ * TEXT for the endpoint-key strings a caller passes here, so a family switching to this helper
7
+ * changes nothing about which vendor rules apply — same keys, same generated tables.
8
+ *
9
+ * ★ WHY `asForm` IS THE ONLY TRANSLATION NEEDED. Distilled's generated request types for every
10
+ * PVE form-urlencoded operation are already `Record<string, string | undefined>` — the SAME
11
+ * shape `PveForm`/`guardForm` want, minus the `?`. There is no JSON vs form-encoding gap to
12
+ * bridge here the way client.ts's `pve()` had to.
13
+ */
14
+ import type * as Effect from 'effect/Effect';
15
+ import type { EndpointKey } from './constraints.ts';
16
+ /**
17
+ * Drops non-string fields — distilled's request type carries `?`, `guardForm` wants a plain
18
+ * form. ⚠️ `body: object`, NOT `Record<string, string | undefined>`: distilled's generated
19
+ * request types are `interface`s with no index signature, so TypeScript refuses that stricter
20
+ * parameter type for every one of them ("index signature ... is missing") even though every
21
+ * field they declare fits it. `object` accepts any of them; the cast below is where the shape
22
+ * is actually asserted, once, rather than at every call site.
23
+ */
24
+ export declare const asForm: (body: object) => Record<string, string>;
25
+ /**
26
+ * `presence`: whether a CREATE is really about to happen (required fields are enforced) or the
27
+ * form is only being value-checked in passing — see resource-guard.ts's own header on why this
28
+ * is not "this is the create form" but "a create is really about to happen".
29
+ */
30
+ export declare const guardWrite: (endpoint: EndpointKey, body: object, presence: boolean) => Effect.Effect<void>;
31
+ //# sourceMappingURL=distilled-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distilled-guard.d.ts","sourceRoot":"","sources":["../../src/proxmox/distilled-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;;;;;;GAOG;AACH,eAAO,MAAM,MAAM,SAAU,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAKxD,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,UAAU,aACX,WAAW,QACf,MAAM,YACF,OAAO,KAChB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAgD,CAAC"}
@@ -55,6 +55,7 @@ import type * as Duration from 'effect/Duration';
55
55
  import * as Effect from 'effect/Effect';
56
56
  import type * as HttpClient from 'effect/unstable/http/HttpClient';
57
57
  import type { ProxmoxOpContext } from '@distilled.cloud/proxmox/Protocol';
58
+ import type { PveCredentialDenied } from './credential-errors.ts';
58
59
  import type { PveCredential, PveRole, PveTarget } from './credentials.ts';
59
60
  import { type MemberAttempt } from './members.ts';
60
61
  /** Every member answered nothing usable — the direct successor to `client.ts`'s `clusterExhausted`. */
@@ -81,9 +82,15 @@ export declare const runPveWith: <A, E>(target: PveTarget, credential: PveCreden
81
82
  * resource file calls.
82
83
  *
83
84
  * ⚠️ `| Error` IN THE RETURN TYPE IS `leased()`'s OWN FAILURE, NOT A NEW ONE THIS FILE ADDS.
84
- * `credentials.ts`'s `mint` fails with a plain `Error` (an OpenBao refusal — sealed, denied, no
85
- * such role) and was never typed more narrowly there; `pve()` carried the same untyped
86
- * possibility before this file existed, just without a signature that said so.
85
+ * `mint.ts`'s `mint` fails with a plain `Error` for most refusals (sealed, no such role) and
86
+ * was never typed more narrowly there; `pve()` carried the same untyped possibility before
87
+ * this file existed, just without a signature that said so.
88
+ *
89
+ * ★ `| PveCredentialDenied` IS SPELLED OUT HERE, NOT LEFT TO COLLAPSE INTO `Error`. It IS an
90
+ * `Error` subtype (Data.TaggedError), so leaving it out of this union would still typecheck —
91
+ * but `Effect.catchTag('PveCredentialDenied', …)` downstream (unreadable-read.ts) needs the
92
+ * tag to be STATICALLY visible in the error channel to compile at all, not merely true at
93
+ * runtime. Naming it here is what lets a migrated family's `readOrUnreadable` catch it.
87
94
  */
88
- export declare const runPve: <A, E>(target: PveTarget, role: PveRole, isWrite: boolean, op: Effect.Effect<A, E, ProxmoxOpContext>) => Effect.Effect<A, E | Cause.TimeoutError | PveClusterExhausted | Error, HttpClient.HttpClient>;
95
+ export declare const runPve: <A, E>(target: PveTarget, role: PveRole, isWrite: boolean, op: Effect.Effect<A, E, ProxmoxOpContext>) => Effect.Effect<A, E | Cause.TimeoutError | PveClusterExhausted | PveCredentialDenied | Error, HttpClient.HttpClient>;
89
96
  //# sourceMappingURL=distilled-pve.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"distilled-pve.d.ts","sourceRoot":"","sources":["../../src/proxmox/distilled-pve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AAEnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE1E,OAAO,EAEL,KAAK,aAAa,EAOnB,MAAM,cAAc,CAAC;AAEtB,uGAAuG;AACvG,qBAAa,mBAAoB,SAAQ,KAAK;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE;IAAvD,YAAqB,QAAQ,EAAE,SAAS,aAAa,EAAE,EAGtD;CACF;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,CAAC,UACrB,SAAS,cACL,aAAa,WAChB,OAAO,MACZ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC,YAChC,QAAQ,CAAC,KAAK,KACtB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,YAAY,GAAG,mBAAmB,EAAE,UAAU,CAAC,UAAU,CA0BnF,CAAC;AAEL;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,CAAC,UACjB,SAAS,QACX,OAAO,WACJ,OAAO,MACZ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC,KACxC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,YAAY,GAAG,mBAAmB,GAAG,KAAK,EAAE,UAAU,CAAC,UAAU,CAI3F,CAAC"}
1
+ {"version":3,"file":"distilled-pve.d.ts","sourceRoot":"","sources":["../../src/proxmox/distilled-pve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AAEnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE1E,OAAO,EAEL,KAAK,aAAa,EAOnB,MAAM,cAAc,CAAC;AAEtB,uGAAuG;AACvG,qBAAa,mBAAoB,SAAQ,KAAK;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE;IAAvD,YAAqB,QAAQ,EAAE,SAAS,aAAa,EAAE,EAGtD;CACF;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,CAAC,UACrB,SAAS,cACL,aAAa,WAChB,OAAO,MACZ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC,YAChC,QAAQ,CAAC,KAAK,KACtB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,YAAY,GAAG,mBAAmB,EAAE,UAAU,CAAC,UAAU,CA0BnF,CAAC;AAEL;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,CAAC,UACjB,SAAS,QACX,OAAO,WACJ,OAAO,MACZ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC,KACxC,MAAM,CAAC,MAAM,CACd,CAAC,EACD,CAAC,GAAG,KAAK,CAAC,YAAY,GAAG,mBAAmB,GAAG,mBAAmB,GAAG,KAAK,EAC1E,UAAU,CAAC,UAAU,CAKnB,CAAC"}
@@ -15,5 +15,5 @@ export declare const PROXMOX_CONSTRAINTS: Readonly<Record<string, EndpointConstr
15
15
  * ★ A DIGEST OF THE DATA, NOT OF THE FILE TEXT, so reformatting is not a stale generation while
16
16
  * changing a 128 to a 129 by hand is. `tests/schema-manifest.test.ts` recomputes it.
17
17
  */
18
- export declare const PROXMOX_CONSTRAINTS_DIGEST = "33b42b52d396c9e0";
18
+ export declare const PROXMOX_CONSTRAINTS_DIGEST = "56eba80750ddb1d2";
19
19
  //# sourceMappingURL=index.d.ts.map
@@ -6,7 +6,7 @@
6
6
  * sha256 9def8f13611184ee, read on a PVE cluster node from
7
7
  * /usr/share/pve-docs/api-viewer/apidoc.js
8
8
  *
9
- * 59 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
9
+ * 58 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
10
  * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
11
  * and therefore unchecked at plan time.
12
12
  *
@@ -1 +1 @@
1
- {"version":3,"file":"pve-access.d.ts","sourceRoot":"","sources":["../../../../src/proxmox/generated/constraints/pve-access.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CA8ChF,CAAC"}
1
+ {"version":3,"file":"pve-access.d.ts","sourceRoot":"","sources":["../../../../src/proxmox/generated/constraints/pve-access.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CA2ChF,CAAC"}
@@ -6,7 +6,7 @@
6
6
  * sha256 9def8f13611184ee, read on a PVE cluster node from
7
7
  * /usr/share/pve-docs/api-viewer/apidoc.js
8
8
  *
9
- * 59 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
9
+ * 58 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
10
  * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
11
  * and therefore unchecked at plan time.
12
12
  *
@@ -6,7 +6,7 @@
6
6
  * sha256 9def8f13611184ee, read on a PVE cluster node from
7
7
  * /usr/share/pve-docs/api-viewer/apidoc.js
8
8
  *
9
- * 59 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
9
+ * 58 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
10
  * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
11
  * and therefore unchecked at plan time.
12
12
  *
@@ -6,7 +6,7 @@
6
6
  * sha256 9def8f13611184ee, read on a PVE cluster node from
7
7
  * /usr/share/pve-docs/api-viewer/apidoc.js
8
8
  *
9
- * 59 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
9
+ * 58 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
10
  * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
11
  * and therefore unchecked at plan time.
12
12
  *
@@ -6,7 +6,7 @@
6
6
  * sha256 9def8f13611184ee, read on a PVE cluster node from
7
7
  * /usr/share/pve-docs/api-viewer/apidoc.js
8
8
  *
9
- * 59 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
9
+ * 58 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
10
  * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
11
  * and therefore unchecked at plan time.
12
12
  *
@@ -6,7 +6,7 @@
6
6
  * sha256 9def8f13611184ee, read on a PVE cluster node from
7
7
  * /usr/share/pve-docs/api-viewer/apidoc.js
8
8
  *
9
- * 59 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
9
+ * 58 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
10
  * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
11
  * and therefore unchecked at plan time.
12
12
  *
@@ -6,7 +6,7 @@
6
6
  * sha256 9def8f13611184ee, read on a PVE cluster node from
7
7
  * /usr/share/pve-docs/api-viewer/apidoc.js
8
8
  *
9
- * 59 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
9
+ * 58 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
10
  * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
11
  * and therefore unchecked at plan time.
12
12
  *
@@ -6,7 +6,7 @@
6
6
  * sha256 9def8f13611184ee, read on a PVE cluster node from
7
7
  * /usr/share/pve-docs/api-viewer/apidoc.js
8
8
  *
9
- * 59 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
9
+ * 58 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
10
  * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
11
  * and therefore unchecked at plan time.
12
12
  *
@@ -6,7 +6,7 @@
6
6
  * sha256 9def8f13611184ee, read on a PVE cluster node from
7
7
  * /usr/share/pve-docs/api-viewer/apidoc.js
8
8
  *
9
- * 59 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
9
+ * 58 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
10
  * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
11
  * and therefore unchecked at plan time.
12
12
  *
@@ -6,7 +6,7 @@
6
6
  * sha256 9def8f13611184ee, read on a PVE cluster node from
7
7
  * /usr/share/pve-docs/api-viewer/apidoc.js
8
8
  *
9
- * 59 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
9
+ * 58 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
10
  * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
11
  * and therefore unchecked at plan time.
12
12
  *
@@ -6,7 +6,7 @@
6
6
  * sha256 9def8f13611184ee, read on a PVE cluster node from
7
7
  * /usr/share/pve-docs/api-viewer/apidoc.js
8
8
  *
9
- * 59 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
9
+ * 58 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
10
  * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
11
  * and therefore unchecked at plan time.
12
12
  *
@@ -6,7 +6,7 @@
6
6
  * sha256 9def8f13611184ee, read on a PVE cluster node from
7
7
  * /usr/share/pve-docs/api-viewer/apidoc.js
8
8
  *
9
- * 59 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
9
+ * 58 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
10
  * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
11
  * and therefore unchecked at plan time.
12
12
  *
@@ -6,7 +6,7 @@
6
6
  * sha256 9def8f13611184ee, read on a PVE cluster node from
7
7
  * /usr/share/pve-docs/api-viewer/apidoc.js
8
8
  *
9
- * 59 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
9
+ * 58 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
10
  * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
11
  * and therefore unchecked at plan time.
12
12
  *
@@ -6,7 +6,7 @@
6
6
  * sha256 9def8f13611184ee, read on a PVE cluster node from
7
7
  * /usr/share/pve-docs/api-viewer/apidoc.js
8
8
  *
9
- * 59 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
9
+ * 58 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
10
  * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
11
  * and therefore unchecked at plan time.
12
12
  *
@@ -6,7 +6,7 @@
6
6
  * sha256 9def8f13611184ee, read on a PVE cluster node from
7
7
  * /usr/share/pve-docs/api-viewer/apidoc.js
8
8
  *
9
- * 59 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
9
+ * 58 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
10
  * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
11
  * and therefore unchecked at plan time.
12
12
  *
@@ -6,7 +6,7 @@
6
6
  * sha256 9def8f13611184ee, read on a PVE cluster node from
7
7
  * /usr/share/pve-docs/api-viewer/apidoc.js
8
8
  *
9
- * 59 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
9
+ * 58 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
10
  * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
11
  * and therefore unchecked at plan time.
12
12
  *
@@ -0,0 +1,29 @@
1
+ /**
2
+ * `Proxmox.Group`'s wire shape: PVE's create/update forms and how a live item becomes
3
+ * attributes. Split out of group.ts (2026-09-24) to keep that file under the 250-line cap —
4
+ * the api-token.ts/api-token-form.ts seam, same reasoning as acl.ts/acl-wire.ts.
5
+ */
6
+ import type * as access from '@distilled.cloud/proxmox/access';
7
+ import type { GroupAttributes, GroupProps } from './group.ts';
8
+ export declare const GROUP_CREATE = "pve:POST /access/groups";
9
+ export declare const GROUP_UPDATE = "pve:PUT /access/groups/{groupid}";
10
+ /**
11
+ * The comment PVE will actually END UP HOLDING for a given declaration.
12
+ *
13
+ * ⛔ PVE CANNOT STORE THE COMMENT `'0'`, AND A PROVIDER THAT DOES NOT MODEL THAT DIFFS FOREVER.
14
+ * `create_group`/`write_user_config`/the config parser all test the comment for TRUTH, and in
15
+ * Perl the one-character string `'0'` is false. So a declared `comment: '0'` is accepted by the
16
+ * API, dropped on the way to `user.cfg`, and read back as absent. Normalising BOTH sides is how
17
+ * `values.ts` already treats `''` as the absence of a boolean rather than as `false`.
18
+ */
19
+ export declare const storedComment: (comment: string | undefined) => string;
20
+ export declare const createForm: (props: GroupProps) => access.CreateAccessGroupRequest;
21
+ /** ⚠️ ALWAYS SENT, EVEN EMPTY — that is how a comment is CLEARED (see group.ts's own header). */
22
+ export declare const updateForm: (props: GroupProps) => access.PutAccessGroupRequest;
23
+ export declare const attributesOf: (live: access.GetAccessGroupResponse, props: GroupProps) => GroupAttributes;
24
+ /**
25
+ * ⚠️ `members` IS NOT COMPARED, AND NOTHING ELSE IS LEFT TO COMPARE. `comment` is the only field
26
+ * a PUT here accepts, so it is the only field whose drift this provider can repair.
27
+ */
28
+ export declare const matches: (attributes: GroupAttributes, props: GroupProps) => boolean;
29
+ //# sourceMappingURL=group-wire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-wire.d.ts","sourceRoot":"","sources":["../../src/proxmox/group-wire.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,KAAK,MAAM,MAAM,iCAAiC,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG9D,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;AAEH,eAAO,MAAM,YAAY,SACjB,MAAM,CAAC,sBAAsB,SAC5B,UAAU,KAChB,eASD,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,OAAO,eAAgB,eAAe,SAAS,UAAU,YACjB,CAAC"}
@@ -22,8 +22,9 @@
22
22
  * "users":"hf-provision@pve,hf-read@pve"}, …]
23
23
  * GET /access/groups/hf-mint -> {"comment":"…","members":["hf-provision@pve","hf-read@pve"]}
24
24
  * The index says `users` and hands back a COMMA STRING; the item says `members` and hands back an
25
- * ARRAY. A reader that looked for `users` on the item path would find nothing, report an empty
26
- * group, and quietly show a delete as harmless.
25
+ * ARRAY. distilled's generator reflects the SAME split (`GetAccessGroupResponse.members: string[]`
26
+ * vs `ListAccessGroupsResponseBodyItem.users?: string`), so reading the item is what keeps this
27
+ * file on the array shape it already normalises.
27
28
  *
28
29
  * ⛔ AND THE ITEM'S ORDER IS NOT STABLE BETWEEN TWO CONSECUTIVE CALLS. MEASURED, seconds apart, on
29
30
  * the same endpoint:
@@ -38,35 +39,37 @@
38
39
  * exactly `comment` and `members`, so the id comes from props — the same arrangement, and the
39
40
  * same reason, as `user.ts`.
40
41
  *
41
- * ★ PRIVILEGES: NOTHING HAD TO BE WIDENED, WHICH MAKES THIS THE FIRST FAMILY HERE THAT COST
42
- * NOTHING. Measured with `pveum user permissions`, 2026-09-13:
42
+ * ★ PRIVILEGES: NOTHING HAD TO BE WIDENED. Measured with `pveum user permissions`, 2026-09-13:
43
43
  * · item GET checks `['perm','/access/groups',['Sys.Audit','Group.Allocate'], any => 1]`, and
44
- * `hf-read@pve` already holds `Sys.Audit` there (propagated from `/` by `PVEAuditor`).
45
- * So `readRole` is left at the default `read` — unlike storage/sdn-zone/sdn-vnet, whose ITEM
46
- * reads PVE gates on an allocate privilege. See the ⛔ on `readRole` in `resource.ts`.
44
+ * `hf-read@pve` already holds `Sys.Audit` there. So `readAttributes` below reads with the
45
+ * default `read` role — unlike acl.ts, user.ts and api-token.ts, whose item/list reads PVE
46
+ * gates on an allocate privilege the 3600s read lease does not hold.
47
47
  * · POST, PUT and DELETE each check `Group.Allocate` on `/access/groups`, and
48
48
  * `hf-provision@pve` holds it via the provision role (`PROVISION_PRIVILEGES`).
49
49
  *
50
50
  * ⛔ `retain` BY DEFAULT, BECAUSE DELETING A GROUP DESTROYS TWO THINGS THIS FILE CANNOT PUT BACK.
51
51
  * Measured in `PVE::AccessControl` on the node:
52
- * · The member list IS the group. `user.cfg` stores it on the GROUP line (`group:<id>:<users>:
53
- * <comment>:`) and DERIVES each user's `groups` map from it at parse time. Deleting the group
54
- * deletes the list, and this resource has no `members` prop to restore it from.
52
+ * · The member list IS the group. `user.cfg` stores it on the GROUP line and DERIVES each
53
+ * user's `groups` map from it at parse time. Deleting the group deletes the list, and this
54
+ * resource has no `members` prop to restore it from.
55
55
  * · `delete_group_acl` then walks the whole ACL tree and drops every grant where the group is
56
56
  * the SUBJECT. On this cluster that is `admins -> Administrator on /` and
57
57
  * `automation -> PVEAuditor on /`: whole populations of access, gone in one call, with no
58
58
  * confirmation and nothing in the plan to suggest it.
59
- * `delete` is FULLY IMPLEMENTED — `DELETE /access/groups/{groupid}` exists, unlike the ACL
60
- * family's — so `.pipe(RemovalPolicy.destroy())` really removes the group. See the ★ in
61
- * `resource.ts` for why the policy is a guard rather than a stubbed-out operation.
59
+ * `delete` is FULLY IMPLEMENTED — `DELETE /access/groups/{groupid}` exists — so
60
+ * `.pipe(RemovalPolicy.destroy())` really removes the group.
62
61
  *
63
- * ⛔ NO SECRET REACHES STATE. A group holds a comment and a list of userids; there is no password,
64
- * no token and no key anywhere on these endpoints. `user.ts`'s ⛔ about unencrypted state applies
65
- * to this package, and this family simply has nothing to trip it.
62
+ * ★ MIGRATED OFF `client.ts`'s generic `pve()`/`pveHandlers` ONTO `@distilled.cloud/proxmox`'s
63
+ * typed `access.getAccessGroup`/`createAccessGroup`/`putAccessGroup`/`deleteAccessGroup`
64
+ * (2026-09-24, decision 43's proxmox walk-down, access sub-area, second resource after Acl).
65
+ * `distilled-pve.ts`'s `runPve` replaces `pve()` as in acl.ts; the CRIES-WOLF FIX
66
+ * (unreadable-read.ts) is wired the same way: a refused `provision` mint on the WRITE-side
67
+ * guard, or a refused `read` mint on the plain read, reports `noop` with a warning rather than
68
+ * forcing `update` with nothing compared.
66
69
  */
67
70
  import { Resource } from 'alchemy';
68
71
  import * as Provider from 'alchemy/Provider';
69
- import { type PveRequirements, type WithTarget } from './resource.ts';
72
+ import type { PveRequirements, WithTarget } from './resource-spec.ts';
70
73
  export interface GroupProps extends WithTarget {
71
74
  /**
72
75
  * PVE's primary key for a group.
@@ -93,12 +96,5 @@ export interface ProxmoxGroup extends Resource<'Proxmox.Group', GroupProps, Grou
93
96
  }
94
97
  /** ★ `retain` by default — a delete takes the membership and the group's grants. See the header. */
95
98
  export declare const ProxmoxGroup: import("alchemy").ResourceClass<ProxmoxGroup>;
96
- /**
97
- * ⛔ THE EMPTY `list` IS INHERITED FROM `pveHandlers` AND IT MATTERS HERE. `GET /access/groups`
98
- * answers with every group on the cluster — on this one that is `admins`, which grants
99
- * `Administrator` on `/` to every human who logs in. Handing it to Alchemy would invite adoption,
100
- * and therefore one day a delete that takes the whole admin group's access with it. Adoption
101
- * stays an explicit act, here as everywhere else in this package.
102
- */
103
99
  export declare const ProxmoxGroupProvider: () => import("effect/Layer").Layer<Provider.Provider<ProxmoxGroup>, never, import("effect/unstable/http/HttpClient").HttpClient>;
104
100
  //# sourceMappingURL=group.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../../src/proxmox/group.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;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,MAAM,WAAW,UAAW,SAAQ,UAAU;IAC5C;;;;;;;OAOG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,iGAAiG;IACjG,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,YAAa,SAAQ,QAAQ,CAC5C,eAAe,EACf,UAAU,EACV,eAAe,EACf,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,oGAAoG;AACpG,eAAO,MAAM,YAAY,+CAEvB,CAAC;AAqFH;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,kIACkD,CAAC"}
1
+ {"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../../src/proxmox/group.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAY7C,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAStE,MAAM,WAAW,UAAW,SAAQ,UAAU;IAC5C;;;;;;;OAOG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,iGAAiG;IACjG,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,YAAa,SAAQ,QAAQ,CAC5C,eAAe,EACf,UAAU,EACV,eAAe,EACf,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,oGAAoG;AACpG,eAAO,MAAM,YAAY,+CAEvB,CAAC;AA2BH,eAAO,MAAM,oBAAoB,kIA4E9B,CAAC"}