@homeflare/distilled-proxmox 0.3.2 → 0.3.4

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.
package/README.md CHANGED
@@ -37,6 +37,12 @@ operations the vendor schema itself marks `proxyto: "node"`.
37
37
  Task polling belongs in the Alchemy provider: the SDK exports the generated
38
38
  `getNodeTaskStatus` operation, and the caller owns its bound and failure policy.
39
39
 
40
+ HA resource GET and DELETE expose `HaResourceNotFound`, and HA rule GET exposes
41
+ `HaRuleNotFound`, from pve-ha-manager 5.2.5 (`28c31e41`): `no such resource`,
42
+ `cannot delete service … not HA managed`, and `no such ha rule`. PUT is not
43
+ attached — it does not raise those sentences. Rule DELETE has no absence
44
+ check and stays untyped.
45
+
40
46
  Pool, backup-job, metric-server and network-interface missing reads expose precise typed tags
41
47
  from vendor source at pve-manager 9.2.11. Backup-job absence uses a sole nested
42
48
  `errors.id`; network-interface absence uses the exact sole `errors.iface` — on both its
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=network-changes.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-changes.test.d.ts","sourceRoot":"","sources":["../src/network-changes.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * The interfaces diff is a sibling of `data`. Generic unwrapping must not drop it,
3
+ * and a response without that sibling must still unwrap.
4
+ */
5
+ import { describe, expect, test } from "bun:test";
6
+ import * as Effect from "effect/Effect";
7
+ import * as Layer from "effect/Layer";
8
+ import * as HttpClient from "effect/unstable/http/HttpClient";
9
+ import * as HttpClientResponse from "effect/unstable/http/HttpClientResponse";
10
+ import { credentials } from "./credentials.js";
11
+ import * as Retry from "./retry.js";
12
+ import { getNodeTime, listNodeNetwork } from "./services/nodes.js";
13
+ const creds = credentials({
14
+ tokenId: "root@pam!test",
15
+ secret: "test-secret",
16
+ baseUrl: "https://pve.test:8006",
17
+ });
18
+ const http = (body) => Layer.succeed(HttpClient.HttpClient, HttpClient.make((request) => Effect.succeed(HttpClientResponse.fromWeb(request, Response.json(body, { status: 200 })))));
19
+ const run = (op, body) => Effect.runPromise(op.pipe(Retry.none, Effect.provide(Layer.mergeAll(http(body), creds))));
20
+ describe("network changes sibling", () => {
21
+ test("a staged interfaces diff survives beside data", async () => {
22
+ const changes = "--- a\n+++ b\n+wpa-psk secret-value\n";
23
+ const live = await run(listNodeNetwork({ node: "pve1" }), { data: [{ iface: "vmbr0", type: "bridge" }], changes });
24
+ expect(live).toEqual({
25
+ data: [{ iface: "vmbr0", type: "bridge" }],
26
+ changes,
27
+ });
28
+ });
29
+ test("no changes sibling still unwraps to the interface list", async () => {
30
+ const live = await run(listNodeNetwork({ node: "pve1" }), {
31
+ data: [{ iface: "vmbr0", type: "bridge" }],
32
+ });
33
+ expect(live).toEqual([{ iface: "vmbr0", type: "bridge" }]);
34
+ });
35
+ test("another operation still unwraps data and ignores no sibling", async () => {
36
+ const live = await run(getNodeTime({ node: "pve1" }), {
37
+ data: { time: 1_700_000_000 },
38
+ });
39
+ expect(live).toMatchObject({ time: 1_700_000_000 });
40
+ });
41
+ });
42
+ //# sourceMappingURL=network-changes.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-changes.test.js","sourceRoot":"","sources":["../src/network-changes.test.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,7 @@ import { credentials } from "./credentials.js";
16
16
  import * as Retry from "./retry.js";
17
17
  import { getAccessGroup, getAccessUser, GroupNotFound, UserNotFound, } from "./services/access.js";
18
18
  import { CephFsNotFound, CephPoolNotFound, deleteNodeCephFs, getNodeCephPoolStatus, } from "./services/nodes.js";
19
+ import { deleteClusterHaResource, getClusterHaResource, getClusterHaRule, HaResourceNotFound, HaRuleNotFound, } from "./services/cluster.js";
19
20
  import { getStorage, StorageNotFound } from "./services/storage.js";
20
21
  const testCredentials = credentials({
21
22
  tokenId: "root@pam!test",
@@ -51,6 +52,28 @@ describe("WI-3 typed not-found errors decode from PVE's real wire shape", () =>
51
52
  });
52
53
  expect(error).toBeInstanceOf(CephPoolNotFound);
53
54
  });
55
+ test("a missing HA resource's 500 decodes to HaResourceNotFound", async () => {
56
+ const error = await flipped(getClusterHaResource({ sid: "ct:101" }), 500, {
57
+ message: "no such resource 'ct:101'\n",
58
+ });
59
+ expect(error).toBeInstanceOf(HaResourceNotFound);
60
+ });
61
+ test("deleting an unmanaged HA resource's 500 decodes to HaResourceNotFound", async () => {
62
+ const error = await flipped(deleteClusterHaResource({ sid: "vm:100" }), 500, { message: "cannot delete service 'vm:100', not HA managed!\n" });
63
+ expect(error).toBeInstanceOf(HaResourceNotFound);
64
+ });
65
+ test("a missing HA rule's 500 decodes to HaRuleNotFound", async () => {
66
+ const error = await flipped(getClusterHaRule({ rule: "keep-apart" }), 500, {
67
+ message: "no such ha rule 'keep-apart'\n",
68
+ });
69
+ expect(error).toBeInstanceOf(HaRuleNotFound);
70
+ });
71
+ test("a nearby HA sentence does not become absence", async () => {
72
+ const error = await flipped(getClusterHaResource({ sid: "ct:101" }), 500, {
73
+ message: "service 'ct:101' in error state, must be disabled and fixed first\n",
74
+ });
75
+ expect(error).not.toBeInstanceOf(HaResourceNotFound);
76
+ });
54
77
  test("a missing Ceph filesystem's 500 (on destroy) decodes to CephFsNotFound", async () => {
55
78
  const error = await flipped(deleteNodeCephFs({ node: "n2", name: "ghost-fs" }), 500, { message: "no such cephfs 'ghost-fs'\n" });
56
79
  expect(error).toBeInstanceOf(CephFsNotFound);
@@ -1 +1 @@
1
- {"version":3,"file":"not-found-errors.test.js","sourceRoot":"","sources":["../src/not-found-errors.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,UAAU,MAAM,iCAAiC,CAAC;AAC9D,OAAO,KAAK,kBAAkB,MAAM,yCAAyC,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,EACL,cAAc,EACd,aAAa,EACb,aAAa,EACb,YAAY,GACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEpE,MAAM,eAAe,GAAG,WAAW,CAAC;IAClC,OAAO,EAAE,eAAe;IACxB,MAAM,EAAE,aAAa;IACrB,OAAO,EAAE,uBAAuB;CACjC,CAAC,CAAC;AAEH,MAAM,OAAO,GAAG,CAAC,MAAc,EAAE,IAAa,EAAE,EAAE,CAChD,KAAK,CAAC,OAAO,CACX,UAAU,CAAC,UAAU,EACrB,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CACf,kBAAkB,CAAC,OAAO,CACxB,OAAO,EACP,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAC/C,CACF,CACF,CACF,CAAC;AAEJ,MAAM,OAAO,GAAG,CACd,MAA6C,EAC7C,MAAc,EACd,IAAa,EACb,EAAE,CACF,MAAM,CAAC,UAAU,CACf,MAAM,CAAC,IAAI,CACT,KAAK,CAAC,IAAI,EACV,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,eAAe,CAAC,CAAC,EACtE,MAAM,CAAC,IAAI,CACZ,CACF,CAAC;AAEJ,QAAQ,CAAC,+DAA+D,EAAE,GAAG,EAAE;IAC7E,IAAI,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE;YACnE,OAAO,EAAE,wBAAwB;SAClC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE;YACtE,OAAO,EAAE,+BAA+B;SACzC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,KAAK,GAAG,MAAM,OAAO,CACzB,UAAU,CAAC,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC,EACvD,GAAG,EACH;YACE,OAAO,EAAE,yDAAyD;YAClE,IAAI,EAAE,IAAI;SACX,CACF,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,KAAK,GAAG,MAAM,OAAO,CACzB,qBAAqB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EACzD,GAAG,EACH;YACE,IAAI,EAAE,IAAI;YACV,OAAO,EACL,8EAA8E;SACjF,CACF,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,KAAK,GAAG,MAAM,OAAO,CACzB,gBAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAClD,GAAG,EACH,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAC3C,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"not-found-errors.test.js","sourceRoot":"","sources":["../src/not-found-errors.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAoEA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,KAAK,eAAe,MAAM,sCAAsC,CAAC;AAC7E,OAAO,KAAK,KAAK,GAAG,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,8BAA8B,CAAC;AAKtC,OAAO,EAAE,WAAW,EAAe,MAAM,kBAAkB,CAAC;AAE5D,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AAErB;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GACtB,aAAa,GACb,WAAW,GACX,eAAe,CAAC,eAAe,CAAC;AAEpC,0EAA0E;AAC1E,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC;AAuDnE,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CA4ErD,CAAC"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAoEA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,KAAK,eAAe,MAAM,sCAAsC,CAAC;AAC7E,OAAO,KAAK,KAAK,GAAG,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,8BAA8B,CAAC;AAKtC,OAAO,EAAE,WAAW,EAAe,MAAM,kBAAkB,CAAC;AAE5D,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AAErB;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GACtB,aAAa,GACb,WAAW,GACX,eAAe,CAAC,eAAe,CAAC;AAEpC,0EAA0E;AAC1E,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC;AAuDnE,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAqFrD,CAAC"}
package/dist/protocol.js CHANGED
@@ -138,11 +138,20 @@ export const ProxmoxProtocol = withPveFormArrays(makeRestProtocol({
138
138
  // Unwrap PVE's `{"data": …}` envelope BEFORE the schema-driven decode —
139
139
  // see the module header. `data` is `null`/absent for a Unit-output
140
140
  // operation; `?? {}` is core's own convention for "no body".
141
+ // ⛔ `changes` is a sibling, not a field of `data`. PVE/HTTPServer.pm copies
142
+ // `$rpcenv->get_result_attrib('changes')` beside `data`. Network.pm sets
143
+ // that attrib to the interfaces diff. Dropping it makes a pending reload
144
+ // invisible. Only a string sibling is preserved; every other envelope
145
+ // still unwraps. The network list schema is the union that can decode it.
141
146
  transformResponse: (body) => {
142
147
  if (body !== null &&
143
148
  typeof body === "object" &&
144
149
  "data" in body) {
145
- return body.data ?? {};
150
+ const record = body;
151
+ if (typeof record.changes === "string") {
152
+ return { changes: record.changes, data: record.data ?? [] };
153
+ }
154
+ return record.data ?? {};
146
155
  }
147
156
  return body;
148
157
  },
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=qemu-config-absence.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qemu-config-absence.test.d.ts","sourceRoot":"","sources":["../src/qemu-config-absence.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * QEMU absence is the config-file sentence from AbstractConfig, not every 500.
3
+ * qemu-server Qemu.pm routes GET/PUT through `{vmid}/config` and DELETE through `{vmid}`.
4
+ */
5
+ import { describe, expect, test } from "bun:test";
6
+ import * as Effect from "effect/Effect";
7
+ import * as Layer from "effect/Layer";
8
+ import * as HttpClient from "effect/unstable/http/HttpClient";
9
+ import * as HttpClientResponse from "effect/unstable/http/HttpClientResponse";
10
+ import { credentials } from "./credentials.js";
11
+ import * as Retry from "./retry.js";
12
+ import { deleteNodeQemu, getNodeQemuConfig } from "./services/nodes.js";
13
+ const call = (op, status, body) => Effect.runPromise(op.pipe(Retry.none, Effect.provide(credentials({
14
+ baseUrl: "https://pve.test:8006",
15
+ tokenId: "test@pve!test",
16
+ secret: "fake",
17
+ })), Effect.provide(Layer.succeed(HttpClient.HttpClient, HttpClient.make((request) => Effect.succeed(HttpClientResponse.fromWeb(request, Response.json(body, { status })))))), Effect.flip));
18
+ const missing = {
19
+ data: null,
20
+ message: "Configuration file 'nodes/pve1/qemu-server/150.conf' does not exist\n",
21
+ };
22
+ describe("QEMU config absence", () => {
23
+ test("config GET and guest DELETE share the missing-file tag", async () => {
24
+ expect(await call(getNodeQemuConfig({ node: "pve1", vmid: "150" }), 500, missing)).toMatchObject({ _tag: "QemuConfigNotFound" });
25
+ expect(await call(deleteNodeQemu({ node: "pve1", vmid: "150" }), 500, missing)).toMatchObject({ _tag: "QemuConfigNotFound" });
26
+ });
27
+ test("a container path, a running guest, and a bare 500 stay unrelated", async () => {
28
+ for (const message of [
29
+ "Configuration file 'nodes/pve1/lxc/150.conf' does not exist\n",
30
+ "VM 150 is running - destroy failed\n",
31
+ "unrelated failure",
32
+ ]) {
33
+ const error = await call(getNodeQemuConfig({ node: "pve1", vmid: "150" }), 500, {
34
+ data: null,
35
+ message,
36
+ });
37
+ expect(error).toMatchObject({ _tag: "InternalServerError" });
38
+ }
39
+ });
40
+ });
41
+ //# sourceMappingURL=qemu-config-absence.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qemu-config-absence.test.js","sourceRoot":"","sources":["../src/qemu-config-absence.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,UAAU,MAAM,iCAAiC,CAAC;AAC9D,OAAO,KAAK,kBAAkB,MAAM,yCAAyC,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExE,MAAM,IAAI,GAAG,CACX,EAAyC,EACzC,MAAc,EACd,IAAa,EACb,EAAE,CACF,MAAM,CAAC,UAAU,CACf,EAAE,CAAC,IAAI,CACL,KAAK,CAAC,IAAI,EACV,MAAM,CAAC,OAAO,CACZ,WAAW,CAAC;IACV,OAAO,EAAE,uBAAuB;IAChC,OAAO,EAAE,eAAe;IACxB,MAAM,EAAE,MAAM;CACf,CAAC,CACH,EACD,MAAM,CAAC,OAAO,CACZ,KAAK,CAAC,OAAO,CACX,UAAU,CAAC,UAAU,EACrB,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAC1B,MAAM,CAAC,OAAO,CACZ,kBAAkB,CAAC,OAAO,CACxB,OAAO,EACP,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAChC,CACF,CACF,CACF,CACF,EACD,MAAM,CAAC,IAAI,CACZ,CACF,CAAC;AAEJ,MAAM,OAAO,GAAG;IACd,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,uEAAuE;CACjF,CAAC;AAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAI,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,CACJ,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAC3E,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAChD,MAAM,CACJ,MAAM,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CACxE,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAClF,KAAK,MAAM,OAAO,IAAI;YACpB,+DAA+D;YAC/D,sCAAsC;YACtC,mBAAmB;SACpB,EAAE,CAAC;YACF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE;gBAC9E,IAAI,EAAE,IAAI;gBACV,OAAO;aACR,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -22,6 +22,26 @@ declare const FirewallAliasNotFound_base: S.Class<FirewallAliasNotFound, S.Tagge
22
22
  /** Installed pve-firewall 6.0.5 PVE/API2/Firewall/Aliases.pm:203-204,252, read-only 2026-09-24; SHA256 aa4d71ea897515ca71caa8e04abd142aedf8077058649f793605f014be84db0e. GET and PUT raise HTTP400 Parameter verification failed with the sole field errors.name = no such alias. DELETE is intrinsically idempotent and has no missing-alias exception. Other validation failures remain ParameterVerificationFailed. */
23
23
  export declare class FirewallAliasNotFound extends /*@__PURE__*/ FirewallAliasNotFound_base {
24
24
  }
25
+ declare const HaResourceNotFound_base: S.Class<HaResourceNotFound, S.TaggedStruct<"HaResourceNotFound", {
26
+ readonly message: any;
27
+ }>, import("effect/Cause").YieldableError> & (new (...args: any[]) => {
28
+ "@distilled.cloud/error/categories": {
29
+ BadRequestError: true;
30
+ };
31
+ });
32
+ /** The HA resource does not exist. pve-ha-manager 5.2.5, 28c31e4124ab2440753e7bf843c4dba97637aed8, PVE/API2/HA/Resources.pm:27 (GET, via the read method at line 179) raises no such resource '<sid>', and line 320 (DELETE) raises cannot delete service '<sid>', not HA managed. Both are wire 500. PUT does not raise either sentence and is not attached. */
33
+ export declare class HaResourceNotFound extends /*@__PURE__*/ HaResourceNotFound_base {
34
+ }
35
+ declare const HaRuleNotFound_base: S.Class<HaRuleNotFound, S.TaggedStruct<"HaRuleNotFound", {
36
+ readonly message: any;
37
+ }>, import("effect/Cause").YieldableError> & (new (...args: any[]) => {
38
+ "@distilled.cloud/error/categories": {
39
+ BadRequestError: true;
40
+ };
41
+ });
42
+ /** The HA rule does not exist. pve-ha-manager 5.2.5, 28c31e4124ab2440753e7bf843c4dba97637aed8, PVE/API2/HA/Rules.pm:25 (GET, via the read method at line 247) raises no such ha rule '<ruleid>' as a wire 500. DELETE removes the id with no absence check and is not attached. PUT of a missing rule raises a different sentence and is not this tag. */
43
+ export declare class HaRuleNotFound extends /*@__PURE__*/ HaRuleNotFound_base {
44
+ }
25
45
  declare const MetricServerNotFound_base: S.Class<MetricServerNotFound, S.TaggedStruct<"MetricServerNotFound", {
26
46
  readonly message: any;
27
47
  }>, import("effect/Cause").YieldableError> & (new (...args: any[]) => {
@@ -5338,7 +5358,7 @@ export declare const deleteClusterFirewallRule: API.OperationMethod<DeleteCluste
5338
5358
  export type DeleteClusterHaGroupError = ProxmoxOpError;
5339
5359
  /** Delete ha group configuration. (deprecated in favor of HA rules) (root-privileged endpoint) */
5340
5360
  export declare const deleteClusterHaGroup: API.OperationMethod<DeleteClusterHaGroupRequest, DeleteClusterHaGroupResponse, DeleteClusterHaGroupError, ProxmoxOpContext>;
5341
- export type DeleteClusterHaResourceError = ProxmoxOpError;
5361
+ export type DeleteClusterHaResourceError = HaResourceNotFound | ProxmoxOpError;
5342
5362
  /** Delete resource configuration. (root-privileged endpoint) */
5343
5363
  export declare const deleteClusterHaResource: API.OperationMethod<DeleteClusterHaResourceRequest, DeleteClusterHaResourceResponse, DeleteClusterHaResourceError, ProxmoxOpContext>;
5344
5364
  export type DeleteClusterHaRuleError = ProxmoxOpError;
@@ -5485,10 +5505,10 @@ export declare const getClusterFirewallRule: API.OperationMethod<GetClusterFirew
5485
5505
  export type GetClusterHaGroupError = ProxmoxOpError;
5486
5506
  /** Read ha group configuration. (deprecated in favor of HA rules) */
5487
5507
  export declare const getClusterHaGroup: API.OperationMethod<GetClusterHaGroupRequest, GetClusterHaGroupResponse, GetClusterHaGroupError, ProxmoxOpContext>;
5488
- export type GetClusterHaResourceError = ProxmoxOpError;
5508
+ export type GetClusterHaResourceError = HaResourceNotFound | ProxmoxOpError;
5489
5509
  /** Read resource configuration. */
5490
5510
  export declare const getClusterHaResource: API.OperationMethod<GetClusterHaResourceRequest, GetClusterHaResourceResponse, GetClusterHaResourceError, ProxmoxOpContext>;
5491
- export type GetClusterHaRuleError = ProxmoxOpError;
5511
+ export type GetClusterHaRuleError = HaRuleNotFound | ProxmoxOpError;
5492
5512
  /** Read HA rule. */
5493
5513
  export declare const getClusterHaRule: API.OperationMethod<GetClusterHaRuleRequest, GetClusterHaRuleResponse, GetClusterHaRuleError, ProxmoxOpContext>;
5494
5514
  export type GetClusterHaStatusManagerStatusError = ProxmoxOpError;