@homeflare/alchemy 0.40.0 → 0.42.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 (110) hide show
  1. package/dist/caddy/index.js.map +2 -2
  2. package/dist/ceph/index.js +2 -1
  3. package/dist/ceph/index.js.map +3 -3
  4. package/dist/launchd/fake-runner.d.ts.map +1 -1
  5. package/dist/launchd/index.d.ts +1 -1
  6. package/dist/launchd/index.d.ts.map +1 -1
  7. package/dist/launchd/index.js +7 -1
  8. package/dist/launchd/index.js.map +5 -5
  9. package/dist/launchd/local-runner.d.ts.map +1 -1
  10. package/dist/launchd/runner.d.ts +21 -0
  11. package/dist/launchd/runner.d.ts.map +1 -1
  12. package/dist/launchd/sudo-runner.d.ts.map +1 -1
  13. package/dist/linux/directory-lifecycle.d.ts.map +1 -1
  14. package/dist/linux/fake-linux-host.d.ts.map +1 -1
  15. package/dist/linux/index.d.ts +1 -1
  16. package/dist/linux/index.d.ts.map +1 -1
  17. package/dist/linux/index.js +16 -4
  18. package/dist/linux/index.js.map +7 -7
  19. package/dist/linux/ssh-runner.d.ts.map +1 -1
  20. package/dist/linux/sudo-runner.d.ts.map +1 -1
  21. package/dist/opnsense/alias-form.d.ts +14 -1
  22. package/dist/opnsense/alias-form.d.ts.map +1 -1
  23. package/dist/opnsense/alias.d.ts +1 -1
  24. package/dist/opnsense/alias.d.ts.map +1 -1
  25. package/dist/opnsense/group-form.d.ts +8 -2
  26. package/dist/opnsense/group-form.d.ts.map +1 -1
  27. package/dist/opnsense/group.d.ts +1 -1
  28. package/dist/opnsense/group.d.ts.map +1 -1
  29. package/dist/opnsense/index.js +15 -7
  30. package/dist/opnsense/index.js.map +7 -7
  31. package/dist/opnsense/wire.d.ts +42 -12
  32. package/dist/opnsense/wire.d.ts.map +1 -1
  33. package/dist/proxmox/acl.d.ts.map +1 -1
  34. package/dist/proxmox/api-token.d.ts.map +1 -1
  35. package/dist/proxmox/credential-errors.d.ts +18 -4
  36. package/dist/proxmox/credential-errors.d.ts.map +1 -1
  37. package/dist/proxmox/credentials.d.ts +35 -1
  38. package/dist/proxmox/credentials.d.ts.map +1 -1
  39. package/dist/proxmox/group.d.ts.map +1 -1
  40. package/dist/proxmox/index.js +81 -51
  41. package/dist/proxmox/index.js.map +19 -17
  42. package/dist/proxmox/lease-cache.d.ts +67 -5
  43. package/dist/proxmox/lease-cache.d.ts.map +1 -1
  44. package/dist/proxmox/mint.d.ts +4 -2
  45. package/dist/proxmox/mint.d.ts.map +1 -1
  46. package/dist/proxmox/node-network.d.ts.map +1 -1
  47. package/dist/proxmox/role.d.ts.map +1 -1
  48. package/dist/proxmox/storage-form.d.ts +28 -3
  49. package/dist/proxmox/storage-form.d.ts.map +1 -1
  50. package/dist/proxmox/storage-plugin-options.d.ts +2 -0
  51. package/dist/proxmox/storage-plugin-options.d.ts.map +1 -0
  52. package/dist/proxmox/storage-wire.d.ts +28 -1
  53. package/dist/proxmox/storage-wire.d.ts.map +1 -1
  54. package/dist/proxmox/storage.d.ts +6 -1
  55. package/dist/proxmox/storage.d.ts.map +1 -1
  56. package/dist/proxmox/unreadable-read.d.ts +8 -1
  57. package/dist/proxmox/unreadable-read.d.ts.map +1 -1
  58. package/dist/proxmox/user.d.ts.map +1 -1
  59. package/dist/proxmox/zfs-pool.d.ts.map +1 -1
  60. package/dist/release/index.d.ts +1 -1
  61. package/dist/release/index.d.ts.map +1 -1
  62. package/dist/release/index.js.map +2 -2
  63. package/docs/credentials.md +14 -1
  64. package/docs/distilled-interim.md +7 -0
  65. package/docs/launchd.md +5 -3
  66. package/docs/provider-standard.md +5 -1
  67. package/docs/talos-argocd-dogfood.md +160 -0
  68. package/package.json +2 -2
  69. package/src/launchd/fake-runner.ts +2 -0
  70. package/src/launchd/index.ts +8 -1
  71. package/src/launchd/local-runner.ts +16 -1
  72. package/src/launchd/runner.ts +22 -0
  73. package/src/launchd/sudo-runner.ts +3 -0
  74. package/src/linux/directory-lifecycle.ts +18 -3
  75. package/src/linux/directory-sudo.test.ts +59 -0
  76. package/src/linux/directory.test.ts +34 -8
  77. package/src/linux/fake-linux-host.ts +2 -0
  78. package/src/linux/index.ts +1 -0
  79. package/src/linux/ssh-runner.ts +4 -0
  80. package/src/linux/sudo-runner.ts +3 -0
  81. package/src/opnsense/alias-form.test.ts +24 -12
  82. package/src/opnsense/alias-form.ts +20 -7
  83. package/src/opnsense/alias.test.ts +13 -6
  84. package/src/opnsense/alias.ts +16 -10
  85. package/src/opnsense/group-form.test.ts +12 -8
  86. package/src/opnsense/group-form.ts +13 -4
  87. package/src/opnsense/group.test.ts +18 -7
  88. package/src/opnsense/group.ts +10 -3
  89. package/src/opnsense/wire.ts +57 -12
  90. package/src/proxmox/acl.ts +7 -1
  91. package/src/proxmox/api-token.ts +7 -1
  92. package/src/proxmox/credential-errors.ts +19 -5
  93. package/src/proxmox/credentials.test.ts +73 -1
  94. package/src/proxmox/credentials.ts +72 -1
  95. package/src/proxmox/group.ts +7 -1
  96. package/src/proxmox/lease-cache-mint.test.ts +70 -0
  97. package/src/proxmox/lease-cache.test.ts +83 -7
  98. package/src/proxmox/lease-cache.ts +74 -10
  99. package/src/proxmox/mint.ts +12 -5
  100. package/src/proxmox/node-network.ts +7 -1
  101. package/src/proxmox/role.ts +7 -1
  102. package/src/proxmox/storage-form.ts +48 -8
  103. package/src/proxmox/storage-plugin-options.ts +45 -0
  104. package/src/proxmox/storage-update.test.ts +183 -0
  105. package/src/proxmox/storage-wire.ts +54 -7
  106. package/src/proxmox/storage.ts +25 -7
  107. package/src/proxmox/unreadable-read.ts +16 -4
  108. package/src/proxmox/user.ts +7 -1
  109. package/src/proxmox/zfs-pool.ts +7 -1
  110. package/src/release/index.ts +1 -0
@@ -47,23 +47,49 @@ import * as Cache from 'effect/Cache';
47
47
  import * as Duration from 'effect/Duration';
48
48
  import * as Effect from 'effect/Effect';
49
49
  import * as Exit from 'effect/Exit';
50
- import { type ApiTarget, type PveCredential, type PveRole } from './credentials.ts';
50
+ import { type ApiTarget, type BaoEnvironment, type PveCredential, type PveRole } from './credentials.ts';
51
51
  /**
52
52
  * What a credential is cached under.
53
53
  *
54
- * ⛔ KEYED ON THE OPENBAO MOUNT AND ROLE, NOT ON A MEMBER HOSTNAME. A PVE API token is
55
- * cluster-wide — `user.cfg` is replicated — so node-b, node-c and node-d share one credential. Keying on
56
- * `api` would mint three identical tokens when failover rotates members.
54
+ * ⛔ KEYED ON THE OPENBAO MOUNT AND TIER, NOT ON A MEMBER HOSTNAME OR ON `role` (M3, red team on
55
+ * K-T1). A PVE API token is cluster-wide — `user.cfg` is replicated — so node-b, node-c and
56
+ * node-d share one credential. Keying on `api` would mint three identical tokens when failover
57
+ * rotates members. `role` USED to be part of this key too, but the minted credential depends
58
+ * only on `(mount, scheme, tier)` — `role` only ever fed `mintTier` to re-derive the tier the
59
+ * key already carries — so `roles: { read: 'x', provision: 'x' }` (one tier for both roles, the
60
+ * shape `docs/credentials.md` itself recommends) used to open TWO cache entries and mint TWO
61
+ * byte-for-byte interchangeable tokens for what is provably one credential. Dropping `role`
62
+ * collapses that back to one entry without changing the default case, where `tier === role`
63
+ * already.
57
64
  * ★ THE MOUNT CANNOT COLLIDE ACROSS CLUSTERS: `proxmox-c1`, `proxmox-c2` and `pbs-c1` are
58
65
  * distinct OpenBao mounts with distinct policies; two estates never share a mount name.
59
66
  * ★ A PLAIN OBJECT IS A SAFE KEY BECAUSE EFFECT COMPARES KEYS STRUCTURALLY — two separately built
60
67
  * literals with the same fields are one entry, which the probe above measured.
68
+ *
69
+ * ⛔ `tier` IS THE KEY, NOT `role` (K-T1). `targetForKey` below has to RECONSTRUCT a target from
70
+ * the key alone (it does not keep the caller's original `ApiTarget` around), and a
71
+ * `PveTarget.roles` override lives on THAT original target, not on `role` — so without `tier`
72
+ * in the key, every `leased()` call for an overridden role would resolve its override once at
73
+ * the first `keyOf`, then reuse whatever `targetForKey` happens to reconstruct on a cache miss,
74
+ * and TWO DIFFERENT overrides sharing one `{mount, scheme}` (e.g. one consumer's default `read`
75
+ * tier and another's `roles: {read: 'x'}` override, same mount) would collide into ONE cache
76
+ * entry and hand each other's credential to the wrong caller. Resolving the tier at `keyOf` —
77
+ * where the real target is still in hand — and keying on it closes that: two different tiers
78
+ * are two different entries, always.
61
79
  */
62
80
  export type LeaseKey = {
63
81
  readonly mount: string;
64
- readonly role: PveRole;
65
82
  readonly scheme: ApiTarget['scheme'];
83
+ readonly tier: string;
66
84
  };
85
+ /**
86
+ * ⚠️ EXPORTED FOR THE TEST (I1, red team on K-T1). This is the one line the whole PR exists
87
+ * for — `tier: mintTier(target, role)` is what makes an overridden `PveTarget.roles` reach the
88
+ * cached path at all. Nothing else in this file's test suite calls `keyOf` or `leased`
89
+ * directly, so without this export a regression here (e.g. reverting to `tier: role`) passed
90
+ * the whole suite silently.
91
+ */
92
+ export declare const keyOf: (target: ApiTarget, role: PveRole) => LeaseKey;
67
93
  /**
68
94
  * How long a freshly minted credential may be handed out again.
69
95
  *
@@ -87,6 +113,42 @@ export declare const timeToLive: (exit: Exit.Exit<PveCredential, unknown>) => Du
87
113
  * ⚠️ EXPORTED FOR THE TEST, which hands it a counting mint instead of calling OpenBao.
88
114
  */
89
115
  export declare const makeLeases: <E, R>(mintFor: (key: LeaseKey) => Effect.Effect<PveCredential, E, R>) => Effect.Effect<Cache.Cache<LeaseKey, PveCredential, E, R>, never, never>;
116
+ /**
117
+ * ⛔ CARRIES `key.tier` BACK IN AS A `roles` OVERRIDE (K-T1), SO `mint`'S OWN `mintTier` CALL
118
+ * REPRODUCES THE SAME TIER `keyOf` ALREADY RESOLVED. This target is synthetic — it is never the
119
+ * caller's real `PveTarget` (`members`/`api` are throwaway placeholders `mint` never reads) —
120
+ * and, since M3 dropped `role` from `LeaseKey`, it no longer even knows which semantic role
121
+ * produced `key.tier`. It doesn't need to: `roles: { read: key.tier }` plus always minting with
122
+ * the fixed role `'read'` (below) makes `mintTier(targetForKey(key), 'read') === key.tier`
123
+ * unconditionally, because `mintTier` only ever consults the ONE role it's called with. Which
124
+ * role the ORIGINAL caller asked for is irrelevant here — `keyOf` already folded that into
125
+ * `key.tier` before this function ever sees the key.
126
+ * ⚠️ THE PBS BRANCH MINTS WITH `key.tier` ITSELF AS THE ROLE, NOT `'read'`. A `PbsTarget` has no
127
+ * `roles` override (see `credentials.ts`'s ⛔ on `PbsTarget`), so `mintTier` for `scheme:'pbs'`
128
+ * always returns its `role` argument unchanged — meaning `key.tier` for a PBS key IS the literal
129
+ * role name (`'read'`/`'provision'`) `keyOf` recorded. Passing anything else here would ask
130
+ * OpenBao for the wrong tier.
131
+ * ⚠️ EXPORTED FOR THE TEST, which checks that round trip directly rather than only through the
132
+ * cache's externally visible behaviour.
133
+ */
134
+ export declare const targetForKey: (key: LeaseKey) => ApiTarget;
135
+ /**
136
+ * ⚠️ EXPORTED FOR THE TEST (second red-team pass on K-T1). `targetForKey`'s own tests call
137
+ * `mintTier(targetForKey(key), 'read')` to check the round trip, which hand-reproduces this
138
+ * function's fixed choice of `'read'` as the pve mint role rather than exercising it — change
139
+ * that choice here and those tests keep passing while a live cache miss mints the wrong tier.
140
+ * Testing this function directly (against a fake OpenBao) pins the choice itself.
141
+ *
142
+ * ⚠️ `env` DEFAULTS TO `process.env`, SAME AS `mint` ITSELF (credentials.ts) — the cache's real
143
+ * caller below (`Effect.runSync(makeLeases(mintForKey))`) always calls this with one argument,
144
+ * so the default is what production runs on. The parameter exists only so the test can pass a
145
+ * fake OpenBao's address without touching the real environment.
146
+ */
147
+ export declare const mintForKey: (key: LeaseKey, env?: BaoEnvironment) => Effect.Effect<{
148
+ leaseSeconds: number;
149
+ secret: string;
150
+ tokenId: string;
151
+ }, Error | import("./credential-errors.ts").PveCredentialDenied, import("effect/unstable/http/HttpClient").HttpClient>;
90
152
  /**
91
153
  * A credential for `role` on `target`: a still-valid lease when one is kept, one shared mint when
92
154
  * not.
@@ -1 +1 @@
1
- {"version":3,"file":"lease-cache.d.ts","sourceRoot":"","sources":["../../src/proxmox/lease-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,KAAK,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAgBpF;;;;;;;;;;GAUG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;CACtC,CAAC;AAQF;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,SAAU,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,KAAG,QAAQ,CAAC,QAG3D,CAAC;AAEpB;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,KAAK,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC,4EACX,CAAC;AASrF;;;;;;GAMG;AACH,eAAO,MAAM,MAAM,WAAY,SAAS,QAAQ,OAAO,qJAA2C,CAAC"}
1
+ {"version":3,"file":"lease-cache.d.ts","sourceRoot":"","sources":["../../src/proxmox/lease-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AACpC,OAAO,EACL,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,OAAO,EAEb,MAAM,kBAAkB,CAAC;AAgB1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,KAAK,WAAY,SAAS,QAAQ,OAAO,KAAG,QAIvD,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,SAAU,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,KAAG,QAAQ,CAAC,QAG3D,CAAC;AAEpB;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,KAAK,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC,4EACX,CAAC;AAErF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,YAAY,QAAS,QAAQ,KAAG,SAGoC,CAAC;AAElF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,UAAU,QAAS,QAAQ,QAAO,cAAc;;;;sHACwB,CAAC;AAItF;;;;;;GAMG;AACH,eAAO,MAAM,MAAM,WAAY,SAAS,QAAQ,OAAO,qJAA2C,CAAC"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Minting one PVE/PBS credential from OpenBao: `GET /v1/<mount>/creds/<role>`, alive for five
2
+ * Minting one PVE/PBS credential from OpenBao: `GET /v1/<mount>/creds/<tier>`, alive for five
3
3
  * minutes. Split out of `credentials.ts` (2026-09-24) to keep that file's TYPES under the
4
4
  * 250-line cap once `PveCredentialDenied`'s catchers needed a real header there; the reasoning
5
5
  * for WHY the estate mints rather than stores a token is still credentials.ts's own header.
@@ -12,7 +12,9 @@ import * as HttpClient from 'effect/unstable/http/HttpClient';
12
12
  import { PveCredentialDenied } from './credential-errors.ts';
13
13
  import type { ApiTarget, BaoEnvironment, PveCredential, PveRole } from './credentials.ts';
14
14
  /**
15
- * Mint one credential for `role`: `GET /v1/<mount>/creds/<role>` on OpenBao's HTTP API.
15
+ * Mint one credential for `role`: `GET /v1/<mount>/creds/<tier>` on OpenBao's HTTP API, where
16
+ * `tier` is `mintTier(target, role)` (credentials.ts) — `role` itself unless `target.roles`
17
+ * overrides it (K-T1).
16
18
  *
17
19
  * 🔴 IT SHELLED OUT TO `bao read -format=json` UNTIL 2026-09-14. The case for the CLI was that one
18
20
  * client could not disagree with `bao kv get` about what this machine may do. <estate>/openbao then
@@ -1 +1 @@
1
- {"version":3,"file":"mint.d.ts","sourceRoot":"","sources":["../../src/proxmox/mint.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAIxC,OAAO,KAAK,UAAU,MAAM,iCAAiC,CAAC;AAE9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAM1F;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,IAAI,WAAY,SAAS,QAAQ,OAAO,QAAO,cAAc;;;;sDAoGtE,CAAC;AAEL;;;;;GAKG;AACH,eAAO,MAAM,aAAa,eAAgB,aAAa,UAAU,SAAS,KAAG,MAGf,CAAC"}
1
+ {"version":3,"file":"mint.d.ts","sourceRoot":"","sources":["../../src/proxmox/mint.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAIxC,OAAO,KAAK,UAAU,MAAM,iCAAiC,CAAC;AAE9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAM1F;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,IAAI,WAAY,SAAS,QAAQ,OAAO,QAAO,cAAc;;;;sDAwGtE,CAAC;AAEL;;;;;GAKG;AACH,eAAO,MAAM,aAAa,eAAgB,aAAa,UAAU,SAAS,KAAG,MAGf,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"node-network.d.ts","sourceRoot":"","sources":["../../src/proxmox/node-network.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0EG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAI7C,OAAO,EAGL,KAAK,gBAAgB,EAGtB,MAAM,wBAAwB,CAAC;AAOhC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEpE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,YAAY,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAIrF,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,WAAW,kBAAmB,SAAQ,QAAQ,CAClD,qBAAqB,EACrB,gBAAgB,EAChB,qBAAqB,EACrB,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,gGAAgG;AAChG,eAAO,MAAM,kBAAkB,qDAE7B,CAAC;AAiCH,eAAO,MAAM,0BAA0B,wIAuFpC,CAAC"}
1
+ {"version":3,"file":"node-network.d.ts","sourceRoot":"","sources":["../../src/proxmox/node-network.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0EG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAI7C,OAAO,EAGL,KAAK,gBAAgB,EAGtB,MAAM,wBAAwB,CAAC;AAOhC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAGpE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,YAAY,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAIrF,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,WAAW,kBAAmB,SAAQ,QAAQ,CAClD,qBAAqB,EACrB,gBAAgB,EAChB,qBAAqB,EACrB,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,gGAAgG;AAChG,eAAO,MAAM,kBAAkB,qDAE7B,CAAC;AAiCH,eAAO,MAAM,0BAA0B,wIA4FpC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"role.d.ts","sourceRoot":"","sources":["../../src/proxmox/role.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAa7C,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAStE,MAAM,WAAW,SAAU,SAAQ,UAAU;IAC3C;;;;;;OAMG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;OAOG;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,4FAA4F;IAC5F,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,WAAY,SAAQ,QAAQ,CAC3C,cAAc,EACd,SAAS,EACT,cAAc,EACd,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,eAAO,MAAM,WAAW,8CAAwC,CAAC;AAwBjE,eAAO,MAAM,mBAAmB,iIA+E7B,CAAC"}
1
+ {"version":3,"file":"role.d.ts","sourceRoot":"","sources":["../../src/proxmox/role.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAa7C,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAUtE,MAAM,WAAW,SAAU,SAAQ,UAAU;IAC3C;;;;;;OAMG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;OAOG;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,4FAA4F;IAC5F,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,WAAY,SAAQ,QAAQ,CAC3C,cAAc,EACd,SAAS,EACT,cAAc,EACd,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,eAAO,MAAM,WAAW,8CAAwC,CAAC;AAwBjE,eAAO,MAAM,mBAAmB,iIAoF7B,CAAC"}
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import type * as storage from '@distilled.cloud/proxmox/storage';
7
7
  import type { StorageProps } from './storage.ts';
8
+ import type { StorageAttributes } from './storage-wire.ts';
8
9
  export declare const STORAGE_CREATE = "pve:POST /storage";
9
10
  export declare const STORAGE_UPDATE = "pve:PUT /storage/{storage}";
10
11
  /**
@@ -26,6 +27,12 @@ export type StorageLocator = Record<string, string> & {
26
27
  keyring?: never;
27
28
  'encryption-key'?: never;
28
29
  };
30
+ /**
31
+ * The 7 fields `mutable()` reads, narrowed out of `StorageProps` — not `StorageProps` itself, so
32
+ * a partial diff (storage-wire.ts's `changedProps`, which carries none of `storage`/`locator`/
33
+ * `target`) can satisfy this type directly.
34
+ */
35
+ export type MutableFields = Pick<StorageProps, 'comment' | 'content' | 'disable' | 'nodes' | 'preallocation' | 'prune-backups' | 'shared'>;
29
36
  /**
30
37
  * ⚠️ THE BAG IS SPREAD FIRST SO NOTHING IN IT CAN SHADOW A FIELD THIS RESOURCE MANAGES. A stray
31
38
  * `storage` or `type` in a locator would otherwise rename the object being created, and PVE
@@ -39,8 +46,19 @@ export declare const createForm: (props: StorageProps) => Record<string, string>
39
46
  * (`PutStorageRequest` has no `type`, and the plugin locator fields it does carry are for a
40
47
  * different purpose: moving an existing volume, not re-pointing the definition), and comparing
41
48
  * either could only plan an update that no write can apply: a plan that reports work forever.
49
+ *
50
+ * ★ PARTIAL ON A KNOWN LIVE OBJECT — THE FIX FOR THE MEASURED BUG. `live === undefined` means
51
+ * there is no live row to diff against yet (`diff()`'s own early sanity check, run before any
52
+ * read; and the "about to create" branch in `reconcile()`) and this returns the FULL declared
53
+ * set, same as before this change. Once `live` is a real read, only `changedProps`
54
+ * (storage-wire.ts) — the declared fields that actually differ from what PVE just reported —
55
+ * reach the wire. Before this, `reconcile` PUT the full declared set whenever ANYTHING
56
+ * differed, so a declared `shared` that already MATCHED live still rode along on every update;
57
+ * for `storage-cephfs-tb4` (`content` was the only real drift, measured 2026-09-27) that meant
58
+ * sending `shared` to a plugin whose own `options()` never accepts it (storage-plugin-options.ts
59
+ * has the vendor citation), and PVE answered `unexpected property 'shared'`.
42
60
  */
43
- export declare const updateForm: (props: StorageProps) => Record<string, string>;
61
+ export declare const updateForm: (props: StorageProps, live: StorageAttributes | undefined) => Record<string, string>;
44
62
  /**
45
63
  * The actual `createStorage` call body — `createForm`, translated once. See `underscored`.
46
64
  * ⚠️ `as unknown as` — same load-bearing cast as `locatorForm`'s own ⚠️: a plain
@@ -49,6 +67,13 @@ export declare const updateForm: (props: StorageProps) => Record<string, string>
49
67
  * interface's own (all-optional-but-two) properties.
50
68
  */
51
69
  export declare const toDistilledCreate: (props: StorageProps) => storage.CreateStorageRequest;
52
- /** The actual `putStorage` call body — `updateForm`, translated once. See `toDistilledCreate`. */
53
- export declare const toDistilledUpdate: (props: StorageProps) => storage.PutStorageRequest;
70
+ /**
71
+ * The actual `putStorage` call body — translated once. See `toDistilledCreate`.
72
+ * ⚠️ TAKES THE ALREADY-BUILT FORM, NOT `props`+`live` — storage.ts's `reconcile` computes
73
+ * `updateForm(news, before)` exactly ONCE and passes that SAME object here and to `guardWrite`,
74
+ * so the vendor-constraint check and the wire body can never diverge. Two independent calls to
75
+ * `updateForm`, each running its own `changedProps`, would still agree today, but "the guard
76
+ * checks what is actually sent" (the house rule this fix follows) should not depend on that.
77
+ */
78
+ export declare const toDistilledUpdate: (form: Record<string, string>) => storage.PutStorageRequest;
54
79
  //# sourceMappingURL=storage-form.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage-form.d.ts","sourceRoot":"","sources":["../../src/proxmox/storage-form.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,KAAK,OAAO,MAAM,kCAAkC,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,eAAO,MAAM,cAAc,sBAAsB,CAAC;AAClD,eAAO,MAAM,cAAc,+BAA+B,CAAC;AAE3D;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG;IACpD,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,OAAO,CAAC,EAAE,KAAK,CAAC;IAChB,gBAAgB,CAAC,EAAE,KAAK,CAAC;CAC1B,CAAC;AA4EF;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,UAAW,YAAY,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAKpE,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,UAAU,UAAW,YAAY,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAGpE,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,UAAW,YAAY,KAAG,OAAO,CAAC,oBACW,CAAC;AAE5E,kGAAkG;AAClG,eAAO,MAAM,iBAAiB,UAAW,YAAY,KAAG,OAAO,CAAC,iBACQ,CAAC"}
1
+ {"version":3,"file":"storage-form.d.ts","sourceRoot":"","sources":["../../src/proxmox/storage-form.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,KAAK,OAAO,MAAM,kCAAkC,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,eAAO,MAAM,cAAc,sBAAsB,CAAC;AAClD,eAAO,MAAM,cAAc,+BAA+B,CAAC;AAE3D;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG;IACpD,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,OAAO,CAAC,EAAE,KAAK,CAAC;IAChB,gBAAgB,CAAC,EAAE,KAAK,CAAC;CAC1B,CAAC;AA+CF;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,IAAI,CAC9B,YAAY,EACZ,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,eAAe,GAAG,eAAe,GAAG,QAAQ,CAC3F,CAAC;AAqCF;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,UAAW,YAAY,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAKpE,CAAC;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,UAAU,UACd,YAAY,QACb,iBAAiB,GAAG,SAAS,KAClC,MAAM,CAAC,MAAM,EAAE,MAAM,CAGtB,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,UAAW,YAAY,KAAG,OAAO,CAAC,oBACW,CAAC;AAE5E;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,SAAU,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAG,OAAO,CAAC,iBACd,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const sharedAccepted: (type: string) => boolean;
2
+ //# sourceMappingURL=storage-plugin-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-plugin-options.d.ts","sourceRoot":"","sources":["../../src/proxmox/storage-plugin-options.ts"],"names":[],"mappings":"AA4CA,eAAO,MAAM,cAAc,SAAU,MAAM,KAAG,OAA0C,CAAC"}
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import * as storage from '@distilled.cloud/proxmox/storage';
8
8
  import * as Effect from 'effect/Effect';
9
+ import type { MutableFields } from './storage-form.ts';
9
10
  import type { StorageProps } from './storage.ts';
10
11
  import { UNREADABLE, type Unreadable } from './unreadable-read.ts';
11
12
  export interface StorageAttributes {
@@ -52,9 +53,35 @@ export declare const readStorageOrFail: (props: StorageProps) => Effect.Effect<t
52
53
  export declare const readStorage: (props: StorageProps) => Effect.Effect<typeof UNREADABLE | StorageAttributes | 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>;
53
54
  /** `read`/`reconcile` return `Attributes | undefined`; only `diff` tells `UNREADABLE` apart. */
54
55
  export declare const dropUnreadable: (live: StorageAttributes | Unreadable | undefined) => StorageAttributes | undefined;
56
+ /**
57
+ * The declared fields (of the 7 `mutable()` — storage-form.ts — ever writes) whose value
58
+ * genuinely differs from what PVE just reported. `matches` below and storage-form.ts's
59
+ * `updateForm` share this one comparison, so the plan's noop/update verdict and the partial PUT
60
+ * body it sends can never disagree about what "changed" means for a list, a boolean or `shared`.
61
+ *
62
+ * ⛔ `shared` IS SKIPPED ENTIRELY FOR A TYPE THAT DOESN'T ACCEPT IT (storage-plugin-options.ts's
63
+ * `sharedAccepted`, vendor-cited there) — the same treatment `type` already gets below
64
+ * (create-only, never compared) and for the identical reason: PVE will never apply a `shared`
65
+ * PUT for cephfs/rbd/zfspool/… (it 500s, `unexpected property 'shared'` — the bug this family
66
+ * shipped with, measured 2026-09-27), so comparing it against a live value that can never move
67
+ * to match could only ever report `update` forever. Without this skip, `mutable()`'s own gate
68
+ * (storage-form.ts) would still keep `shared` out of the wire body, but `matches` would keep
69
+ * reporting drift for a field nothing can ever apply — a plan that never reaches noop.
70
+ */
71
+ export declare const changedProps: (live: StorageAttributes, props: StorageProps) => Partial<MutableFields>;
55
72
  /**
56
73
  * ⚠️ `type` IS NEVER COMPARED — CREATE-ONLY (`storage.ts`'s own `StorageProps.type` doc), so a
57
74
  * changed declaration plans `noop` on it, same as before the migration.
75
+ *
76
+ * ⛔ A DECLARED `shared` A TYPE CAN NEVER APPLY MUST FAIL LOUD, NOT NOOP FOREVER — PR 314's own
77
+ * red team, 2026-09-27. `changedProps` above leaves `shared` out of its result whenever the
78
+ * type is outside `sharedAccepted`, on purpose (PVE 500s on the PUT otherwise) — but that
79
+ * means a genuinely disagreeing declared value would otherwise vanish into an empty diff and
80
+ * report `noop` forever, with the recorded attribute silently stuck on whatever PVE already
81
+ * has. `maxfiles` (storage.ts's header) refuses that same class of bug at compile time; this is
82
+ * the update-time equivalent for a field that can't be typed away. So this checks the ONE case
83
+ * `changedProps` deliberately can't see — declared and live actually differ, on a type that can
84
+ * never carry the write — and dies with a message naming the fix, before `changedProps` runs.
58
85
  */
59
- export declare const matches: (attributes: StorageAttributes, props: StorageProps) => boolean;
86
+ export declare const matches: (attributes: StorageAttributes, props: StorageProps) => Effect.Effect<boolean, never, never>;
60
87
  //# sourceMappingURL=storage-wire.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage-wire.d.ts","sourceRoot":"","sources":["../../src/proxmox/storage-wire.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,OAAO,MAAM,kCAAkC,CAAC;AAC5D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAoB,MAAM,sBAAsB,CAAC;AAGrF,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,6FAA6F;IAC7F,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAmBD,eAAO,MAAM,QAAQ,aAAc,MAAM,GAAG,SAAS,QAAQ,MAAM,YACN,CAAC;AAE9D,eAAO,MAAM,IAAI,GAAI,CAAC,YAAY,CAAC,GAAG,SAAS,QAAQ,CAAC,YACX,CAAC;AAwB9C;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,iBAAiB,UAAW,YAAY,mmCAGyC,CAAC;AAE/F;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,UAAW,YAAY,qlCAG5C,CAAC;AAEJ,gGAAgG;AAChG,eAAO,MAAM,cAAc,SAAU,iBAAiB,GAAG,UAAU,GAAG,SAAS,kCACvC,CAAC;AAEzC;;;GAGG;AACH,eAAO,MAAM,OAAO,eAAgB,iBAAiB,SAAS,YAAY,YAOjC,CAAC"}
1
+ {"version":3,"file":"storage-wire.d.ts","sourceRoot":"","sources":["../../src/proxmox/storage-wire.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,OAAO,MAAM,kCAAkC,CAAC;AAC5D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAoB,MAAM,sBAAsB,CAAC;AAGrF,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,6FAA6F;IAC7F,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAmBD,eAAO,MAAM,QAAQ,aAAc,MAAM,GAAG,SAAS,QAAQ,MAAM,YACN,CAAC;AAE9D,eAAO,MAAM,IAAI,GAAI,CAAC,YAAY,CAAC,GAAG,SAAS,QAAQ,CAAC,YACX,CAAC;AAwB9C;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,iBAAiB,UAAW,YAAY,mmCAGyC,CAAC;AAE/F;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,UAAW,YAAY,qlCAG5C,CAAC;AAEJ,gGAAgG;AAChG,eAAO,MAAM,cAAc,SAAU,iBAAiB,GAAG,UAAU,GAAG,SAAS,kCACvC,CAAC;AAEzC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,YAAY,SACjB,iBAAiB,SAChB,YAAY,KAClB,OAAO,CAAC,aAAa,CAYtB,CAAC;AAEH;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,OAAO,eAAgB,iBAAiB,SAAS,YAAY,yCAUK,CAAC"}
@@ -95,7 +95,12 @@ export interface StorageProps extends WithTarget {
95
95
  nodes?: string;
96
96
  /** Keeps the definition but stops PVE using it. */
97
97
  disable?: boolean;
98
- /** Tells PVE the same volumes are visible from every node — a claim, not a mechanism. */
98
+ /**
99
+ * Tells PVE the same volumes are visible from every node — a claim, not a mechanism.
100
+ * ⚠️ ONLY SENT WHEN THE TYPE'S OWN PLUGIN ACCEPTS IT (storage-plugin-options.ts, vendor-cited)
101
+ * — elsewhere it is dropped from the wire, and a disagreeing declared value dies the plan
102
+ * loud (storage-wire.ts's `matches`) rather than PUTting a field PVE would refuse outright.
103
+ */
99
104
  shared?: boolean;
100
105
  /** `off` | `metadata` | `falloc` | `full`. File-based plugins only. */
101
106
  preallocation?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/proxmox/storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAI7C,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAYtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,gGAAgG;AAChG,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,CAAC;AAElD,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,6FAA6F;IAC7F,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yFAAyF;IACzF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uEAAuE;IACvE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB;AAED,MAAM,WAAW,cAAe,SAAQ,QAAQ,CAC9C,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,qGAAqG;AACrG,eAAO,MAAM,cAAc,iDAEzB,CAAC;AAEH,eAAO,MAAM,sBAAsB,oIAgGhC,CAAC"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/proxmox/storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAI7C,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAatE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,gGAAgG;AAChG,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,CAAC;AAElD,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,6FAA6F;IAC7F,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uEAAuE;IACvE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB;AAED,MAAM,WAAW,cAAe,SAAQ,QAAQ,CAC9C,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,qGAAqG;AACrG,eAAO,MAAM,cAAc,iDAEzB,CAAC;AAEH,eAAO,MAAM,sBAAsB,oIA4GhC,CAAC"}
@@ -45,6 +45,13 @@ export declare const readOrUnreadable: <A, E, R>(effect: Effect.Effect<A, E | Pv
45
45
  * in `bun run plan`'s own output (Effect's default logger), even though the Diff type has
46
46
  * nowhere to carry the distinction through to the printed action. See the header for why a log
47
47
  * line, not a failed diff or a fourth Diff action, is what "the plan reports" means here.
48
+ *
49
+ * ⛔ M6 (Opus red team, K-T1): NAMES `mount` AND `tier`, NOT JUST THE RESOURCE. Before this, the
50
+ * line read "no grant for this credential's role" with nothing to act on — an operator debugging
51
+ * a scoped-down `PveTarget.roles` override (the whole point of K-T1) had to go re-derive which
52
+ * mount and tier the read actually asked OpenBao for before they could even open that mount's
53
+ * policy. `PveCredentialDenied`'s own message already made this exact call — reading `tier`, not
54
+ * `role`, per that class's own ⛔ — so this warning takes the same two fields for the same reason.
48
55
  */
49
- export declare const unreadableWarning: (type: string, identity: string) => Effect.Effect<void>;
56
+ export declare const unreadableWarning: (type: string, identity: string, mount: string, tier: string) => Effect.Effect<void>;
50
57
  //# sourceMappingURL=unreadable-read.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"unreadable-read.d.ts","sourceRoot":"","sources":["../../src/proxmox/unreadable-read.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,sFAAsF;AACtF,eAAO,MAAM,UAAU,eAA2B,CAAC;AACnD,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC;AAE3C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,mBAAmB,EAAE,CAAC,CAAC,KACnD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,CAAC,CACkD,CAAC;AAExF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,SAAU,MAAM,YAAY,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAKlF,CAAC"}
1
+ {"version":3,"file":"unreadable-read.d.ts","sourceRoot":"","sources":["../../src/proxmox/unreadable-read.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,sFAAsF;AACtF,eAAO,MAAM,UAAU,eAA2B,CAAC;AACnD,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC;AAE3C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,mBAAmB,EAAE,CAAC,CAAC,KACnD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,CAAC,CACkD,CAAC;AAExF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,iBAAiB,SACtB,MAAM,YACF,MAAM,SACT,MAAM,QACP,MAAM,KACX,MAAM,CAAC,MAAM,CAAC,IAAI,CAKlB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/proxmox/user.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAI7C,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AActE,MAAM,WAAW,SAAU,SAAQ,UAAU;IAC3C;;;;;;;OAOG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mGAAmG;IACnG,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kFAAkF;IAClF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2FAA2F;IAC3F,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,qFAAqF;IACrF,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAY,SAAQ,QAAQ,CAC3C,cAAc,EACd,SAAS,EACT,cAAc,EACd,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,eAAO,MAAM,WAAW,8CAAwC,CAAC;AAEjE,eAAO,MAAM,mBAAmB,iIAgG7B,CAAC"}
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/proxmox/user.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAI7C,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAetE,MAAM,WAAW,SAAU,SAAQ,UAAU;IAC3C;;;;;;;OAOG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mGAAmG;IACnG,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kFAAkF;IAClF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2FAA2F;IAC3F,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,qFAAqF;IACrF,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAY,SAAQ,QAAQ,CAC3C,cAAc,EACd,SAAS,EACT,cAAc,EACd,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,eAAO,MAAM,WAAW,8CAAwC,CAAC;AAEjE,eAAO,MAAM,mBAAmB,iIAqG7B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"zfs-pool.d.ts","sourceRoot":"","sources":["../../src/proxmox/zfs-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAI7C,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvE;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,+FAA+F;IAC/F,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAe,SAAQ,QAAQ,CAC9C,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,mGAAmG;AACnG,eAAO,MAAM,cAAc,iDAEzB,CAAC;AAEH,eAAO,MAAM,sBAAsB,oIAyEhC,CAAC"}
1
+ {"version":3,"file":"zfs-pool.d.ts","sourceRoot":"","sources":["../../src/proxmox/zfs-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAI7C,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAItE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvE;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,+FAA+F;IAC/F,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAe,SAAQ,QAAQ,CAC9C,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,mGAAmG;AACnG,eAAO,MAAM,cAAc,iDAEzB,CAAC;AAEH,eAAO,MAAM,sBAAsB,oIA8EhC,CAAC"}
@@ -20,6 +20,6 @@ export { OPENBAO_RELEASES } from './openbao.ts';
20
20
  export { releaseProviders } from './providers.ts';
21
21
  export { ArchiveRefused, BinaryRefused, ChecksumMismatch, DownloadFailed } from './refused.ts';
22
22
  export { VICTORIA_RELEASES } from './victoria.ts';
23
- export type { ExecResult, FileStat, HostRunner, HostUser, WriteOptions, } from '../launchd/runner.ts';
23
+ export type { ExecResult, FileStat, HostPlatform, HostRunner, HostUser, WriteOptions, } from '../launchd/runner.ts';
24
24
  export { HostRunnerService, hostRunnerLayer } from '../launchd/runner.ts';
25
25
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/release/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,YAAY,EACV,cAAc,EACd,cAAc,EACd,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACnE,YAAY,EACV,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/F,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,YAAY,EACV,UAAU,EACV,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,YAAY,GACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/release/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,YAAY,EACV,cAAc,EACd,cAAc,EACd,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACnE,YAAY,EACV,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/F,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,YAAY,EACV,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,YAAY,GACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}