@homeflare/alchemy 0.14.0 → 0.15.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 (90) hide show
  1. package/dist/openbao/index.d.ts +10 -3
  2. package/dist/openbao/index.d.ts.map +1 -1
  3. package/dist/proxmox/acl.d.ts.map +1 -1
  4. package/dist/proxmox/backup-job.d.ts.map +1 -1
  5. package/dist/proxmox/constraint-guard.d.ts +28 -0
  6. package/dist/proxmox/constraint-guard.d.ts.map +1 -0
  7. package/dist/proxmox/constraints.d.ts +71 -0
  8. package/dist/proxmox/constraints.d.ts.map +1 -0
  9. package/dist/proxmox/firewall-alias.d.ts.map +1 -1
  10. package/dist/proxmox/generated/constraints/index.d.ts +19 -0
  11. package/dist/proxmox/generated/constraints/index.d.ts.map +1 -0
  12. package/dist/proxmox/generated/constraints/pbs-config.d.ts +18 -0
  13. package/dist/proxmox/generated/constraints/pbs-config.d.ts.map +1 -0
  14. package/dist/proxmox/generated/constraints/pve-access.d.ts +18 -0
  15. package/dist/proxmox/generated/constraints/pve-access.d.ts.map +1 -0
  16. package/dist/proxmox/generated/constraints/pve-cluster.d.ts +18 -0
  17. package/dist/proxmox/generated/constraints/pve-cluster.d.ts.map +1 -0
  18. package/dist/proxmox/generated/constraints/pve-pools.d.ts +18 -0
  19. package/dist/proxmox/generated/constraints/pve-pools.d.ts.map +1 -0
  20. package/dist/proxmox/generated/constraints/pve-storage.d.ts +18 -0
  21. package/dist/proxmox/generated/constraints/pve-storage.d.ts.map +1 -0
  22. package/dist/proxmox/group.d.ts.map +1 -1
  23. package/dist/proxmox/ha-resource.d.ts.map +1 -1
  24. package/dist/proxmox/ha-rule.d.ts.map +1 -1
  25. package/dist/proxmox/index.d.ts +6 -1
  26. package/dist/proxmox/index.d.ts.map +1 -1
  27. package/dist/proxmox/index.js +816 -257
  28. package/dist/proxmox/index.js.map +33 -24
  29. package/dist/proxmox/notification-matcher.d.ts.map +1 -1
  30. package/dist/proxmox/pbs-datastore-endpoint.d.ts +22 -0
  31. package/dist/proxmox/pbs-datastore-endpoint.d.ts.map +1 -0
  32. package/dist/proxmox/pbs-datastore.d.ts.map +1 -1
  33. package/dist/proxmox/pbs-notification-matcher.d.ts.map +1 -1
  34. package/dist/proxmox/pbs-prune-job.d.ts.map +1 -1
  35. package/dist/proxmox/pbs-sync-job-form.d.ts.map +1 -1
  36. package/dist/proxmox/pbs-verify-job.d.ts.map +1 -1
  37. package/dist/proxmox/pool.d.ts.map +1 -1
  38. package/dist/proxmox/provision-baseline.d.ts +30 -5
  39. package/dist/proxmox/provision-baseline.d.ts.map +1 -1
  40. package/dist/proxmox/replication-job.d.ts.map +1 -1
  41. package/dist/proxmox/resource-spec.d.ts +120 -0
  42. package/dist/proxmox/resource-spec.d.ts.map +1 -0
  43. package/dist/proxmox/resource.d.ts +10 -91
  44. package/dist/proxmox/resource.d.ts.map +1 -1
  45. package/dist/proxmox/role.d.ts.map +1 -1
  46. package/dist/proxmox/sdn-vnet.d.ts.map +1 -1
  47. package/dist/proxmox/sdn-zone.d.ts.map +1 -1
  48. package/dist/proxmox/storage.d.ts.map +1 -1
  49. package/dist/proxmox/user.d.ts.map +1 -1
  50. package/docs/provision-baseline.md +34 -7
  51. package/docs/proxmox-lxc.md +40 -0
  52. package/package.json +1 -1
  53. package/src/openbao/index-types.test.ts +87 -0
  54. package/src/openbao/index.ts +15 -3
  55. package/src/proxmox/acl.ts +2 -0
  56. package/src/proxmox/backup-job.ts +2 -0
  57. package/src/proxmox/constraint-guard.ts +53 -0
  58. package/src/proxmox/constraints.test.ts +260 -0
  59. package/src/proxmox/constraints.ts +135 -0
  60. package/src/proxmox/firewall-alias.ts +5 -0
  61. package/src/proxmox/generated/constraints/index.ts +31 -0
  62. package/src/proxmox/generated/constraints/pbs-config.ts +141 -0
  63. package/src/proxmox/generated/constraints/pve-access.ts +57 -0
  64. package/src/proxmox/generated/constraints/pve-cluster.ts +174 -0
  65. package/src/proxmox/generated/constraints/pve-pools.ts +26 -0
  66. package/src/proxmox/generated/constraints/pve-storage.ts +75 -0
  67. package/src/proxmox/group.ts +2 -0
  68. package/src/proxmox/ha-resource.ts +5 -0
  69. package/src/proxmox/ha-rule.ts +2 -0
  70. package/src/proxmox/index.ts +12 -0
  71. package/src/proxmox/lxc-interior.test.ts +61 -0
  72. package/src/proxmox/notification-matcher.ts +5 -0
  73. package/src/proxmox/pbs-datastore-endpoint.ts +29 -0
  74. package/src/proxmox/pbs-datastore.ts +8 -1
  75. package/src/proxmox/pbs-notification-matcher.ts +5 -0
  76. package/src/proxmox/pbs-prune-job.ts +2 -0
  77. package/src/proxmox/pbs-sync-job-form.ts +2 -0
  78. package/src/proxmox/pbs-verify-job.ts +2 -0
  79. package/src/proxmox/pool.ts +2 -0
  80. package/src/proxmox/provision-baseline.test.ts +38 -0
  81. package/src/proxmox/provision-baseline.ts +73 -14
  82. package/src/proxmox/provision-bootstrap.test.ts +51 -0
  83. package/src/proxmox/replication-job.ts +5 -0
  84. package/src/proxmox/resource-spec.ts +117 -0
  85. package/src/proxmox/resource.ts +50 -91
  86. package/src/proxmox/role.ts +2 -0
  87. package/src/proxmox/sdn-vnet.ts +2 -0
  88. package/src/proxmox/sdn-zone.ts +2 -0
  89. package/src/proxmox/storage.ts +2 -0
  90. package/src/proxmox/user.ts +2 -0
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Generated proxmox-backup-server parameter constraints for `/config` — DO NOT EDIT BY HAND.
3
+ *
4
+ * Run: bun codegen/constraints.ts
5
+ * Manifest entry: `pbs-apidoc` — proxmox-backup-server 4.2.6-1 (running 4.2.3)
6
+ * sha256 274ab9f6fc075aea, read on a PBS host from
7
+ * /usr/share/doc/proxmox-backup/html/api-viewer/apidoc.js
8
+ *
9
+ * 10 of this product's 144 POST/PUT endpoints are tabled across all areas: the ones
10
+ * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
+ * and therefore unchecked at plan time.
12
+ *
13
+ * ⚠️ A `patternSource` with no `pattern` beside it is a rule that could NOT be carried into a
14
+ * JavaScript RegExp faithfully (codegen/pattern.ts). It is recorded and NOT enforced.
15
+ */
16
+ import type { EndpointConstraints } from '../../constraints.ts';
17
+
18
+ export const PBS_CONFIG_CONSTRAINTS: Readonly<Record<string, EndpointConstraints>> = {
19
+ "pbs:POST /config/datastore": {
20
+ "backing-device": {"pattern":"^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$","patternSource":"/^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/","type":"string"},
21
+ "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
22
+ "keep-daily": {"minimum":1,"type":"integer"},
23
+ "keep-hourly": {"minimum":1,"type":"integer"},
24
+ "keep-last": {"minimum":1,"type":"integer"},
25
+ "keep-monthly": {"minimum":1,"type":"integer"},
26
+ "keep-weekly": {"minimum":1,"type":"integer"},
27
+ "keep-yearly": {"minimum":1,"type":"integer"},
28
+ "name": {"maxLength":32,"minLength":3,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","required":true,"type":"string"},
29
+ "notification-mode": {"default":"notification-system","enum":["legacy-sendmail","notification-system"],"type":"string"},
30
+ "notify-user": {"maxLength":64,"minLength":3,"pattern":"^(?:[^\\s:/\\x00-\\x1f\\x7f]+)@(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[^\\s:/[:cntrl:]]+)@(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","type":"string"},
31
+ "path": {"maxLength":4096,"minLength":1,"required":true,"type":"string"},
32
+ },
33
+ "pbs:POST /config/notifications/matchers": {
34
+ "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
35
+ "mode": {"default":"all","enum":["all","any"],"type":"string"},
36
+ "name": {"maxLength":32,"minLength":2,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","required":true,"type":"string"},
37
+ "origin": {"enum":["user-created","builtin","modified-builtin"],"type":"string"},
38
+ },
39
+ "pbs:POST /config/prune": {
40
+ "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
41
+ "id": {"maxLength":32,"minLength":3,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","required":true,"type":"string"},
42
+ "keep-daily": {"minimum":1,"type":"integer"},
43
+ "keep-hourly": {"minimum":1,"type":"integer"},
44
+ "keep-last": {"minimum":1,"type":"integer"},
45
+ "keep-monthly": {"minimum":1,"type":"integer"},
46
+ "keep-weekly": {"minimum":1,"type":"integer"},
47
+ "keep-yearly": {"minimum":1,"type":"integer"},
48
+ "max-depth": {"maximum":7,"minimum":0,"type":"integer"},
49
+ "ns": {"maxLength":256,"pattern":"^(?:(?:(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)/){0,7}(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))?$","patternSource":"/^(?:(?:(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)/){0,7}(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))?$/","type":"string"},
50
+ "schedule": {"required":true,"type":"string"},
51
+ "store": {"maxLength":32,"minLength":3,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","required":true,"type":"string"},
52
+ },
53
+ "pbs:POST /config/sync": {
54
+ "active-encryption-key": {"maxLength":32,"minLength":3,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","type":"string"},
55
+ "burst-in": {"maxLength":64,"minLength":1,"type":"string"},
56
+ "burst-out": {"maxLength":64,"minLength":1,"type":"string"},
57
+ "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
58
+ "id": {"maxLength":32,"minLength":3,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","required":true,"type":"string"},
59
+ "max-depth": {"maximum":7,"minimum":0,"type":"integer"},
60
+ "ns": {"maxLength":256,"pattern":"^(?:(?:(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)/){0,7}(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))?$","patternSource":"/^(?:(?:(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)/){0,7}(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))?$/","type":"string"},
61
+ "owner": {"maxLength":64,"minLength":3,"pattern":"^(?:(?:[^\\s:/\\x00-\\x1f\\x7f]+)@(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)|(?:[^\\s:/\\x00-\\x1f\\x7f]+)@(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)!(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))$","patternSource":"/^(?:(?:[^\\s:/[:cntrl:]]+)@(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)|(?:[^\\s:/[:cntrl:]]+)@(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)!(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))$/","type":"string"},
62
+ "rate-in": {"maxLength":64,"minLength":1,"type":"string"},
63
+ "rate-out": {"maxLength":64,"minLength":1,"type":"string"},
64
+ "remote": {"maxLength":32,"minLength":3,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","type":"string"},
65
+ "remote-ns": {"maxLength":256,"pattern":"^(?:(?:(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)/){0,7}(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))?$","patternSource":"/^(?:(?:(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)/){0,7}(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))?$/","type":"string"},
66
+ "remote-store": {"maxLength":32,"minLength":3,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","required":true,"type":"string"},
67
+ "store": {"maxLength":32,"minLength":3,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","required":true,"type":"string"},
68
+ "sync-direction": {"default":"pull","enum":["pull","push"],"type":"string"},
69
+ "transfer-last": {"minimum":1,"type":"integer"},
70
+ "worker-threads": {"default":"1","maximum":32,"minimum":1,"type":"integer"},
71
+ },
72
+ "pbs:POST /config/verify": {
73
+ "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
74
+ "id": {"maxLength":32,"minLength":3,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","required":true,"type":"string"},
75
+ "max-depth": {"default":"7","maximum":7,"minimum":0,"type":"integer"},
76
+ "ns": {"maxLength":256,"pattern":"^(?:(?:(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)/){0,7}(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))?$","patternSource":"/^(?:(?:(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)/){0,7}(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))?$/","type":"string"},
77
+ "outdated-after": {"minimum":0,"type":"integer"},
78
+ "read-threads": {"default":"1","maximum":32,"minimum":1,"type":"integer"},
79
+ "store": {"maxLength":32,"minLength":3,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","required":true,"type":"string"},
80
+ "verify-threads": {"default":"4","maximum":32,"minimum":1,"type":"integer"},
81
+ },
82
+ "pbs:PUT /config/datastore/{name}": {
83
+ "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
84
+ "digest": {"pattern":"^[a-f0-9]{64}$","patternSource":"/^[a-f0-9]{64}$/","type":"string"},
85
+ "keep-daily": {"minimum":1,"type":"integer"},
86
+ "keep-hourly": {"minimum":1,"type":"integer"},
87
+ "keep-last": {"minimum":1,"type":"integer"},
88
+ "keep-monthly": {"minimum":1,"type":"integer"},
89
+ "keep-weekly": {"minimum":1,"type":"integer"},
90
+ "keep-yearly": {"minimum":1,"type":"integer"},
91
+ "notification-mode": {"default":"notification-system","enum":["legacy-sendmail","notification-system"],"type":"string"},
92
+ "notify-user": {"maxLength":64,"minLength":3,"pattern":"^(?:[^\\s:/\\x00-\\x1f\\x7f]+)@(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[^\\s:/[:cntrl:]]+)@(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","type":"string"},
93
+ },
94
+ "pbs:PUT /config/notifications/matchers/{name}": {
95
+ "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
96
+ "digest": {"pattern":"^[a-f0-9]{64}$","patternSource":"/^[a-f0-9]{64}$/","type":"string"},
97
+ "mode": {"default":"all","enum":["all","any"],"type":"string"},
98
+ },
99
+ "pbs:PUT /config/prune/{id}": {
100
+ "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
101
+ "digest": {"pattern":"^[a-f0-9]{64}$","patternSource":"/^[a-f0-9]{64}$/","type":"string"},
102
+ "keep-daily": {"minimum":1,"type":"integer"},
103
+ "keep-hourly": {"minimum":1,"type":"integer"},
104
+ "keep-last": {"minimum":1,"type":"integer"},
105
+ "keep-monthly": {"minimum":1,"type":"integer"},
106
+ "keep-weekly": {"minimum":1,"type":"integer"},
107
+ "keep-yearly": {"minimum":1,"type":"integer"},
108
+ "max-depth": {"maximum":7,"minimum":0,"type":"integer"},
109
+ "ns": {"maxLength":256,"pattern":"^(?:(?:(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)/){0,7}(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))?$","patternSource":"/^(?:(?:(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)/){0,7}(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))?$/","type":"string"},
110
+ "store": {"maxLength":32,"minLength":3,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","type":"string"},
111
+ },
112
+ "pbs:PUT /config/sync/{id}": {
113
+ "active-encryption-key": {"maxLength":32,"minLength":3,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","type":"string"},
114
+ "burst-in": {"maxLength":64,"minLength":1,"type":"string"},
115
+ "burst-out": {"maxLength":64,"minLength":1,"type":"string"},
116
+ "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
117
+ "digest": {"pattern":"^[a-f0-9]{64}$","patternSource":"/^[a-f0-9]{64}$/","type":"string"},
118
+ "max-depth": {"maximum":7,"minimum":0,"type":"integer"},
119
+ "ns": {"maxLength":256,"pattern":"^(?:(?:(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)/){0,7}(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))?$","patternSource":"/^(?:(?:(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)/){0,7}(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))?$/","type":"string"},
120
+ "owner": {"maxLength":64,"minLength":3,"pattern":"^(?:(?:[^\\s:/\\x00-\\x1f\\x7f]+)@(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)|(?:[^\\s:/\\x00-\\x1f\\x7f]+)@(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)!(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))$","patternSource":"/^(?:(?:[^\\s:/[:cntrl:]]+)@(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)|(?:[^\\s:/[:cntrl:]]+)@(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)!(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))$/","type":"string"},
121
+ "rate-in": {"maxLength":64,"minLength":1,"type":"string"},
122
+ "rate-out": {"maxLength":64,"minLength":1,"type":"string"},
123
+ "remote": {"maxLength":32,"minLength":3,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","type":"string"},
124
+ "remote-ns": {"maxLength":256,"pattern":"^(?:(?:(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)/){0,7}(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))?$","patternSource":"/^(?:(?:(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)/){0,7}(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))?$/","type":"string"},
125
+ "remote-store": {"maxLength":32,"minLength":3,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","type":"string"},
126
+ "store": {"maxLength":32,"minLength":3,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","type":"string"},
127
+ "sync-direction": {"default":"pull","enum":["pull","push"],"type":"string"},
128
+ "transfer-last": {"minimum":1,"type":"integer"},
129
+ "worker-threads": {"default":"1","maximum":32,"minimum":1,"type":"integer"},
130
+ },
131
+ "pbs:PUT /config/verify/{id}": {
132
+ "comment": {"maxLength":128,"pattern":"^[^\\x00-\\x1f\\x7f]*$","patternSource":"/^[[:^cntrl:]]*$/","type":"string"},
133
+ "digest": {"pattern":"^[a-f0-9]{64}$","patternSource":"/^[a-f0-9]{64}$/","type":"string"},
134
+ "max-depth": {"default":"7","maximum":7,"minimum":0,"type":"integer"},
135
+ "ns": {"maxLength":256,"pattern":"^(?:(?:(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)/){0,7}(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))?$","patternSource":"/^(?:(?:(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)/){0,7}(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*))?$/","type":"string"},
136
+ "outdated-after": {"minimum":0,"type":"integer"},
137
+ "read-threads": {"default":"1","maximum":32,"minimum":1,"type":"integer"},
138
+ "store": {"maxLength":32,"minLength":3,"pattern":"^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$","patternSource":"/^(?:[A-Za-z0-9_][A-Za-z0-9._\\-]*)$/","type":"string"},
139
+ "verify-threads": {"default":"4","maximum":32,"minimum":1,"type":"integer"},
140
+ },
141
+ };
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Generated pve-manager parameter constraints for `/access` — DO NOT EDIT BY HAND.
3
+ *
4
+ * Run: bun codegen/constraints.ts
5
+ * Manifest entry: `pve-apidoc` — pve-manager 9.2.11/f6997e698c7933ea
6
+ * sha256 9def8f13611184ee, read on a PVE cluster node from
7
+ * /usr/share/pve-docs/api-viewer/apidoc.js
8
+ *
9
+ * 27 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
+ * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
+ * and therefore unchecked at plan time.
12
+ *
13
+ * ⚠️ A `patternSource` with no `pattern` beside it is a rule that could NOT be carried into a
14
+ * JavaScript RegExp faithfully (codegen/pattern.ts). It is recorded and NOT enforced.
15
+ */
16
+ import type { EndpointConstraints } from '../../constraints.ts';
17
+
18
+ export const PVE_ACCESS_CONSTRAINTS: Readonly<Record<string, EndpointConstraints>> = {
19
+ "pve:POST /access/groups": {
20
+ "groupid": {"format":"pve-groupid","required":true,"type":"string"},
21
+ },
22
+ "pve:POST /access/roles": {
23
+ "privs": {"format":"pve-priv-list","type":"string"},
24
+ "roleid": {"format":"pve-roleid","required":true,"type":"string"},
25
+ },
26
+ "pve:POST /access/users": {
27
+ "comment": {"maxLength":2048,"type":"string"},
28
+ "email": {"format":"email-opt","maxLength":254,"type":"string"},
29
+ "expire": {"minimum":0,"type":"integer"},
30
+ "firstname": {"maxLength":1024,"type":"string"},
31
+ "groups": {"format":"pve-groupid-list","type":"string"},
32
+ "keys": {"pattern":"[0-9a-zA-Z!=]{0,4096}","patternSource":"[0-9a-zA-Z!=]{0,4096}","type":"string"},
33
+ "lastname": {"maxLength":1024,"type":"string"},
34
+ "password": {"maxLength":64,"minLength":8,"type":"string"},
35
+ "userid": {"format":"pve-userid","maxLength":64,"required":true,"type":"string"},
36
+ },
37
+ "pve:PUT /access/acl": {
38
+ "groups": {"format":"pve-groupid-list","type":"string"},
39
+ "path": {"required":true,"type":"string"},
40
+ "roles": {"format":"pve-roleid-list","required":true,"type":"string"},
41
+ "tokens": {"format":"pve-tokenid-list","type":"string"},
42
+ "users": {"format":"pve-userid-list","type":"string"},
43
+ },
44
+ "pve:PUT /access/groups/{groupid}": {},
45
+ "pve:PUT /access/roles/{roleid}": {
46
+ "privs": {"format":"pve-priv-list","type":"string"},
47
+ },
48
+ "pve:PUT /access/users/{userid}": {
49
+ "comment": {"maxLength":2048,"type":"string"},
50
+ "email": {"format":"email-opt","maxLength":254,"type":"string"},
51
+ "expire": {"minimum":0,"type":"integer"},
52
+ "firstname": {"maxLength":1024,"type":"string"},
53
+ "groups": {"format":"pve-groupid-list","type":"string"},
54
+ "keys": {"pattern":"[0-9a-zA-Z!=]{0,4096}","patternSource":"[0-9a-zA-Z!=]{0,4096}","type":"string"},
55
+ "lastname": {"maxLength":1024,"type":"string"},
56
+ },
57
+ };
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Generated pve-manager parameter constraints for `/cluster` — DO NOT EDIT BY HAND.
3
+ *
4
+ * Run: bun codegen/constraints.ts
5
+ * Manifest entry: `pve-apidoc` — pve-manager 9.2.11/f6997e698c7933ea
6
+ * sha256 9def8f13611184ee, read on a PVE cluster node from
7
+ * /usr/share/pve-docs/api-viewer/apidoc.js
8
+ *
9
+ * 27 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
+ * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
+ * and therefore unchecked at plan time.
12
+ *
13
+ * ⚠️ A `patternSource` with no `pattern` beside it is a rule that could NOT be carried into a
14
+ * JavaScript RegExp faithfully (codegen/pattern.ts). It is recorded and NOT enforced.
15
+ */
16
+ import type { EndpointConstraints } from '../../constraints.ts';
17
+
18
+ export const PVE_CLUSTER_CONSTRAINTS: Readonly<Record<string, EndpointConstraints>> = {
19
+ "pve:POST /cluster/backup": {
20
+ "bwlimit": {"default":"0","minimum":0,"type":"integer"},
21
+ "comment": {"maxLength":512,"type":"string"},
22
+ "compress": {"default":"0","enum":["0","1","gzip","lzo","zstd"],"type":"string"},
23
+ "dow": {"default":"mon,tue,wed,thu,fri,sat,sun","format":"pve-day-of-week-list","type":"string"},
24
+ "exclude": {"format":"pve-vmid-list","type":"string"},
25
+ "fleecing": {"format":"backup-fleecing","type":"string"},
26
+ "id": {"format":"pve-configid","type":"string"},
27
+ "ionice": {"default":"7","maximum":8,"minimum":0,"type":"integer"},
28
+ "lockwait": {"default":"180","minimum":0,"type":"integer"},
29
+ "mailnotification": {"default":"always","enum":["always","failure"],"type":"string"},
30
+ "mailto": {"format":"email-or-username-list","type":"string"},
31
+ "mode": {"default":"snapshot","enum":["snapshot","suspend","stop"],"type":"string"},
32
+ "node": {"format":"pve-node","type":"string"},
33
+ "notes-template": {"maxLength":1024,"type":"string"},
34
+ "notification-mode": {"default":"auto","enum":["auto","legacy-sendmail","notification-system"],"type":"string"},
35
+ "pbs-change-detection-mode": {"enum":["legacy","data","metadata"],"type":"string"},
36
+ "performance": {"format":"backup-performance","type":"string"},
37
+ "prune-backups": {"default":"keep-all=1","format":"prune-backups","type":"string"},
38
+ "schedule": {"format":"pve-calendar-event","maxLength":128,"type":"string"},
39
+ "starttime": {"pattern":"\\d{1,2}:\\d{1,2}","patternSource":"\\d{1,2}:\\d{1,2}","type":"string"},
40
+ "stopwait": {"default":"10","minimum":0,"type":"integer"},
41
+ "storage": {"format":"pve-storage-id","type":"string"},
42
+ "vmid": {"format":"pve-vmid-list","type":"string"},
43
+ },
44
+ "pve:POST /cluster/firewall/aliases": {
45
+ "cidr": {"format":"IPorCIDR","required":true,"type":"string"},
46
+ "comment": {"format":"pve-fw-comment-spec","type":"string"},
47
+ "name": {"maxLength":64,"minLength":2,"pattern":"[A-Za-z][A-Za-z0-9\\-\\_]+","patternSource":"[A-Za-z][A-Za-z0-9\\-\\_]+","required":true,"type":"string"},
48
+ },
49
+ "pve:POST /cluster/ha/resources": {
50
+ "comment": {"maxLength":4096,"type":"string"},
51
+ "group": {"format":"pve-configid","type":"string"},
52
+ "max_relocate": {"default":"1","minimum":0,"type":"integer"},
53
+ "max_restart": {"default":"1","minimum":0,"type":"integer"},
54
+ "sid": {"format":"pve-ha-resource-or-vm-id","required":true,"type":"string"},
55
+ "state": {"default":"started","enum":["started","stopped","enabled","disabled","ignored"],"type":"string"},
56
+ "type": {"enum":["ct","vm"],"type":"string"},
57
+ },
58
+ "pve:POST /cluster/ha/rules": {},
59
+ "pve:POST /cluster/notifications/matchers": {
60
+ "mode": {"default":"all","enum":["all","any"],"type":"string"},
61
+ "name": {"format":"pve-configid","required":true,"type":"string"},
62
+ },
63
+ "pve:POST /cluster/replication": {
64
+ "comment": {"maxLength":4096,"type":"string"},
65
+ "id": {"format":"pve-replication-job-id","pattern":"[1-9][0-9]{2,8}-\\d{1,9}","patternSource":"[1-9][0-9]{2,8}-\\d{1,9}","required":true,"type":"string"},
66
+ "rate": {"minimum":1,"type":"number"},
67
+ "remove_job": {"enum":["local","full"],"type":"string"},
68
+ "schedule": {"default":"*/15","format":"pve-calendar-event","maxLength":128,"type":"string"},
69
+ "source": {"format":"pve-node","type":"string"},
70
+ "target": {"format":"pve-node","required":true,"type":"string"},
71
+ "type": {"enum":["local"],"required":true,"type":"string"},
72
+ },
73
+ "pve:POST /cluster/sdn/vnets": {
74
+ "alias": {"maxLength":256,"patternSource":"(?^i:[\\(\\)-_.\\w\\d\\s]{0,256})","type":"string"},
75
+ "tag": {"maximum":16777215,"minimum":1,"type":"integer"},
76
+ "type": {"enum":["vnet"],"type":"string"},
77
+ "vnet": {"maxLength":8,"minLength":2,"pattern":"[a-zA-Z][a-zA-Z0-9]*[a-zA-Z0-9]","patternSource":"[a-zA-Z][a-zA-Z0-9]*[a-zA-Z0-9]","required":true,"type":"string"},
78
+ "zone": {"required":true,"type":"string"},
79
+ },
80
+ "pve:POST /cluster/sdn/zones": {
81
+ "dhcp": {"enum":["dnsmasq"],"type":"string"},
82
+ "dnszone": {"format":"dns-name","type":"string"},
83
+ "exitnodes": {"format":"pve-node-list","type":"string"},
84
+ "exitnodes-primary": {"format":"pve-node","type":"string"},
85
+ "fabric": {"format":"pve-sdn-fabric-id","type":"string"},
86
+ "mac": {"format":"mac-addr","type":"string"},
87
+ "nodes": {"format":"pve-node-list","type":"string"},
88
+ "peers": {"format":"ip-list","type":"string"},
89
+ "rt-import": {"format":"pve-sdn-bgp-rt-list","type":"string"},
90
+ "tag": {"minimum":0,"type":"integer"},
91
+ "type": {"enum":["evpn","faucet","qinq","simple","vlan","vxlan"],"format":"pve-configid","required":true,"type":"string"},
92
+ "vlan-protocol": {"default":"802.1q","enum":["802.1q","802.1ad"],"type":"string"},
93
+ "vrf-vxlan": {"maximum":16777215,"minimum":1,"type":"integer"},
94
+ "vxlan-port": {"default":"4789","maximum":65536,"minimum":1,"type":"integer"},
95
+ "zone": {"maxLength":8,"minLength":2,"pattern":"[a-zA-Z][a-zA-Z0-9]*[a-zA-Z0-9]","patternSource":"[a-zA-Z][a-zA-Z0-9]*[a-zA-Z0-9]","required":true,"type":"string"},
96
+ },
97
+ "pve:PUT /cluster/backup/{id}": {
98
+ "bwlimit": {"default":"0","minimum":0,"type":"integer"},
99
+ "comment": {"maxLength":512,"type":"string"},
100
+ "compress": {"default":"0","enum":["0","1","gzip","lzo","zstd"],"type":"string"},
101
+ "delete": {"format":"pve-configid-list","type":"string"},
102
+ "dow": {"format":"pve-day-of-week-list","type":"string"},
103
+ "exclude": {"format":"pve-vmid-list","type":"string"},
104
+ "fleecing": {"format":"backup-fleecing","type":"string"},
105
+ "ionice": {"default":"7","maximum":8,"minimum":0,"type":"integer"},
106
+ "lockwait": {"default":"180","minimum":0,"type":"integer"},
107
+ "mailnotification": {"default":"always","enum":["always","failure"],"type":"string"},
108
+ "mailto": {"format":"email-or-username-list","type":"string"},
109
+ "mode": {"default":"snapshot","enum":["snapshot","suspend","stop"],"type":"string"},
110
+ "node": {"format":"pve-node","type":"string"},
111
+ "notes-template": {"maxLength":1024,"type":"string"},
112
+ "notification-mode": {"default":"auto","enum":["auto","legacy-sendmail","notification-system"],"type":"string"},
113
+ "pbs-change-detection-mode": {"enum":["legacy","data","metadata"],"type":"string"},
114
+ "performance": {"format":"backup-performance","type":"string"},
115
+ "prune-backups": {"default":"keep-all=1","format":"prune-backups","type":"string"},
116
+ "schedule": {"format":"pve-calendar-event","maxLength":128,"type":"string"},
117
+ "starttime": {"pattern":"\\d{1,2}:\\d{1,2}","patternSource":"\\d{1,2}:\\d{1,2}","type":"string"},
118
+ "stopwait": {"default":"10","minimum":0,"type":"integer"},
119
+ "storage": {"format":"pve-storage-id","type":"string"},
120
+ "vmid": {"format":"pve-vmid-list","type":"string"},
121
+ },
122
+ "pve:PUT /cluster/firewall/aliases/{name}": {
123
+ "cidr": {"format":"IPorCIDR","required":true,"type":"string"},
124
+ "comment": {"format":"pve-fw-comment-spec","type":"string"},
125
+ "digest": {"maxLength":64,"type":"string"},
126
+ "rename": {"maxLength":64,"minLength":2,"pattern":"[A-Za-z][A-Za-z0-9\\-\\_]+","patternSource":"[A-Za-z][A-Za-z0-9\\-\\_]+","type":"string"},
127
+ },
128
+ "pve:PUT /cluster/ha/resources/{sid}": {
129
+ "comment": {"maxLength":4096,"type":"string"},
130
+ "delete": {"format":"pve-configid-list","maxLength":4096,"type":"string"},
131
+ "digest": {"maxLength":64,"type":"string"},
132
+ "group": {"format":"pve-configid","type":"string"},
133
+ "max_relocate": {"default":"1","minimum":0,"type":"integer"},
134
+ "max_restart": {"default":"1","minimum":0,"type":"integer"},
135
+ "state": {"default":"started","enum":["started","stopped","enabled","disabled","ignored"],"type":"string"},
136
+ },
137
+ "pve:PUT /cluster/ha/rules/{rule}": {},
138
+ "pve:PUT /cluster/notifications/matchers/{name}": {
139
+ "digest": {"maxLength":64,"type":"string"},
140
+ "mode": {"default":"all","enum":["all","any"],"type":"string"},
141
+ },
142
+ "pve:PUT /cluster/replication/{id}": {
143
+ "comment": {"maxLength":4096,"type":"string"},
144
+ "delete": {"format":"pve-configid-list","maxLength":4096,"type":"string"},
145
+ "digest": {"maxLength":64,"type":"string"},
146
+ "rate": {"minimum":1,"type":"number"},
147
+ "remove_job": {"enum":["local","full"],"type":"string"},
148
+ "schedule": {"default":"*/15","format":"pve-calendar-event","maxLength":128,"type":"string"},
149
+ "source": {"format":"pve-node","type":"string"},
150
+ },
151
+ "pve:PUT /cluster/sdn/vnets/{vnet}": {
152
+ "alias": {"maxLength":256,"patternSource":"(?^i:[\\(\\)-_.\\w\\d\\s]{0,256})","type":"string"},
153
+ "delete": {"format":"pve-configid-list","maxLength":4096,"type":"string"},
154
+ "digest": {"maxLength":64,"type":"string"},
155
+ "tag": {"maximum":16777215,"minimum":1,"type":"integer"},
156
+ },
157
+ "pve:PUT /cluster/sdn/zones/{zone}": {
158
+ "delete": {"format":"pve-configid-list","maxLength":4096,"type":"string"},
159
+ "dhcp": {"enum":["dnsmasq"],"type":"string"},
160
+ "digest": {"maxLength":64,"type":"string"},
161
+ "dnszone": {"format":"dns-name","type":"string"},
162
+ "exitnodes": {"format":"pve-node-list","type":"string"},
163
+ "exitnodes-primary": {"format":"pve-node","type":"string"},
164
+ "fabric": {"format":"pve-sdn-fabric-id","type":"string"},
165
+ "mac": {"format":"mac-addr","type":"string"},
166
+ "nodes": {"format":"pve-node-list","type":"string"},
167
+ "peers": {"format":"ip-list","type":"string"},
168
+ "rt-import": {"format":"pve-sdn-bgp-rt-list","type":"string"},
169
+ "tag": {"minimum":0,"type":"integer"},
170
+ "vlan-protocol": {"default":"802.1q","enum":["802.1q","802.1ad"],"type":"string"},
171
+ "vrf-vxlan": {"maximum":16777215,"minimum":1,"type":"integer"},
172
+ "vxlan-port": {"default":"4789","maximum":65536,"minimum":1,"type":"integer"},
173
+ },
174
+ };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Generated pve-manager parameter constraints for `/pools` — DO NOT EDIT BY HAND.
3
+ *
4
+ * Run: bun codegen/constraints.ts
5
+ * Manifest entry: `pve-apidoc` — pve-manager 9.2.11/f6997e698c7933ea
6
+ * sha256 9def8f13611184ee, read on a PVE cluster node from
7
+ * /usr/share/pve-docs/api-viewer/apidoc.js
8
+ *
9
+ * 27 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
+ * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
+ * and therefore unchecked at plan time.
12
+ *
13
+ * ⚠️ A `patternSource` with no `pattern` beside it is a rule that could NOT be carried into a
14
+ * JavaScript RegExp faithfully (codegen/pattern.ts). It is recorded and NOT enforced.
15
+ */
16
+ import type { EndpointConstraints } from '../../constraints.ts';
17
+
18
+ export const PVE_POOLS_CONSTRAINTS: Readonly<Record<string, EndpointConstraints>> = {
19
+ "pve:POST /pools": {
20
+ "poolid": {"format":"pve-poolid","required":true,"type":"string"},
21
+ },
22
+ "pve:PUT /pools/{poolid}": {
23
+ "storage": {"format":"pve-storage-id-list","type":"string"},
24
+ "vms": {"format":"pve-vmid-list","type":"string"},
25
+ },
26
+ };
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Generated pve-manager parameter constraints for `/storage` — DO NOT EDIT BY HAND.
3
+ *
4
+ * Run: bun codegen/constraints.ts
5
+ * Manifest entry: `pve-apidoc` — pve-manager 9.2.11/f6997e698c7933ea
6
+ * sha256 9def8f13611184ee, read on a PVE cluster node from
7
+ * /usr/share/pve-docs/api-viewer/apidoc.js
8
+ *
9
+ * 27 of this product's 258 POST/PUT endpoints are tabled across all areas: the ones
10
+ * this package writes to, named in its own source. Every other vendor write endpoint is UNTABLED
11
+ * and therefore unchecked at plan time.
12
+ *
13
+ * ⚠️ A `patternSource` with no `pattern` beside it is a rule that could NOT be carried into a
14
+ * JavaScript RegExp faithfully (codegen/pattern.ts). It is recorded and NOT enforced.
15
+ */
16
+ import type { EndpointConstraints } from '../../constraints.ts';
17
+
18
+ export const PVE_STORAGE_CONSTRAINTS: Readonly<Record<string, EndpointConstraints>> = {
19
+ "pve:POST /storage": {
20
+ "base": {"format":"pve-volume-id","type":"string"},
21
+ "blocksize": {"format":"pve-storage-zfs-blocksize","type":"string"},
22
+ "content": {"format":"pve-storage-content-list","type":"string"},
23
+ "content-dirs": {"format":"pve-dir-override-list","type":"string"},
24
+ "domain": {"maxLength":256,"type":"string"},
25
+ "export": {"format":"pve-storage-path","type":"string"},
26
+ "fingerprint": {"pattern":"([A-Fa-f0-9]{2}:){31}[A-Fa-f0-9]{2}","patternSource":"([A-Fa-f0-9]{2}:){31}[A-Fa-f0-9]{2}","type":"string"},
27
+ "format": {"enum":["raw","qcow2","subvol","vmdk"],"type":"string"},
28
+ "fs-name": {"format":"pve-configid","type":"string"},
29
+ "max-protected-backups": {"default":"Unlimited for users with Datastore.Allocate privilege, 5 for other users","minimum":-1,"type":"integer"},
30
+ "monhost": {"format":"pve-storage-portal-dns-list","type":"string"},
31
+ "mountpoint": {"format":"pve-storage-path","type":"string"},
32
+ "nodes": {"format":"pve-node-list","type":"string"},
33
+ "options": {"format":"pve-storage-options","type":"string"},
34
+ "password": {"maxLength":256,"type":"string"},
35
+ "path": {"format":"pve-storage-path","type":"string"},
36
+ "port": {"maximum":65535,"minimum":1,"type":"integer"},
37
+ "portal": {"format":"pve-storage-portal-dns","type":"string"},
38
+ "preallocation": {"default":"metadata","enum":["off","metadata","falloc","full"],"type":"string"},
39
+ "prune-backups": {"format":"prune-backups","type":"string"},
40
+ "saferemove-stepsize": {"default":"32","enum":["1","2","4","8","16","32"],"type":"integer"},
41
+ "server": {"format":"pve-storage-server","type":"string"},
42
+ "smbversion": {"default":"default","enum":["default","2.0","2.1","3","3.0","3.11"],"type":"string"},
43
+ "storage": {"format":"pve-storage-id","required":true,"type":"string"},
44
+ "subdir": {"format":"pve-storage-path","type":"string"},
45
+ "thinpool": {"format":"pve-storage-vgname","type":"string"},
46
+ "type": {"enum":["btrfs","cephfs","cifs","dir","esxi","iscsi","iscsidirect","lvm","lvmthin","nfs","pbs","rbd","zfs","zfspool"],"required":true,"type":"string"},
47
+ "vgname": {"format":"pve-storage-vgname","type":"string"},
48
+ "zfs-base-path": {"format":"pve-storage-path","type":"string"},
49
+ },
50
+ "pve:PUT /storage/{storage}": {
51
+ "blocksize": {"format":"pve-storage-zfs-blocksize","type":"string"},
52
+ "content": {"format":"pve-storage-content-list","type":"string"},
53
+ "content-dirs": {"format":"pve-dir-override-list","type":"string"},
54
+ "delete": {"format":"pve-configid-list","maxLength":4096,"type":"string"},
55
+ "digest": {"maxLength":64,"type":"string"},
56
+ "domain": {"maxLength":256,"type":"string"},
57
+ "fingerprint": {"pattern":"([A-Fa-f0-9]{2}:){31}[A-Fa-f0-9]{2}","patternSource":"([A-Fa-f0-9]{2}:){31}[A-Fa-f0-9]{2}","type":"string"},
58
+ "format": {"enum":["raw","qcow2","subvol","vmdk"],"type":"string"},
59
+ "fs-name": {"format":"pve-configid","type":"string"},
60
+ "max-protected-backups": {"default":"Unlimited for users with Datastore.Allocate privilege, 5 for other users","minimum":-1,"type":"integer"},
61
+ "monhost": {"format":"pve-storage-portal-dns-list","type":"string"},
62
+ "mountpoint": {"format":"pve-storage-path","type":"string"},
63
+ "nodes": {"format":"pve-node-list","type":"string"},
64
+ "options": {"format":"pve-storage-options","type":"string"},
65
+ "password": {"maxLength":256,"type":"string"},
66
+ "port": {"maximum":65535,"minimum":1,"type":"integer"},
67
+ "preallocation": {"default":"metadata","enum":["off","metadata","falloc","full"],"type":"string"},
68
+ "prune-backups": {"format":"prune-backups","type":"string"},
69
+ "saferemove-stepsize": {"default":"32","enum":["1","2","4","8","16","32"],"type":"integer"},
70
+ "server": {"format":"pve-storage-server","type":"string"},
71
+ "smbversion": {"default":"default","enum":["default","2.0","2.1","3","3.0","3.11"],"type":"string"},
72
+ "subdir": {"format":"pve-storage-path","type":"string"},
73
+ "zfs-base-path": {"format":"pve-storage-path","type":"string"},
74
+ },
75
+ };
@@ -176,6 +176,8 @@ const handlers = pveHandlers<GroupProps, GroupAttributes>({
176
176
  * `resource.ts` states once in the ⛔ on adoption: a field deliberately out of `matches` is a
177
177
  * field this resource does not manage.
178
178
  */
179
+ /** The vendor rules these forms are checked against at plan time — resource-spec.ts. */
180
+ endpoint: { create: 'pve:POST /access/groups', update: 'pve:PUT /access/groups/{groupid}' },
179
181
  matches: (attributes, props) => attributes.comment === storedComment(props.comment),
180
182
  path: (props) => `access/groups/${props.groupid}`,
181
183
  /**
@@ -137,6 +137,11 @@ const handlers = pveHandlers<HaResourceProps, HaResourceAttributes>({
137
137
  * ⚠️ `sid` AND `type` ARE NOT COMPARED EITHER: sid is the path, so a change there is a different
138
138
  * object, and type is create-only — it is read back from the prefix, never edited.
139
139
  */
140
+ /** The vendor rules these forms are checked against at plan time — resource-spec.ts. */
141
+ endpoint: {
142
+ create: 'pve:POST /cluster/ha/resources',
143
+ update: 'pve:PUT /cluster/ha/resources/{sid}',
144
+ },
140
145
  matches: (attributes, props) =>
141
146
  attributes.state === (props.state ?? 'started') &&
142
147
  attributes.comment === (props.comment ?? '') &&
@@ -206,6 +206,8 @@ const handlers = pveHandlers<HaRuleProps, HaRuleAttributes>({
206
206
  * ⚠️ THE COMMENT IS COMPARED AS PVE WILL STORE IT, not as it was declared — `commentText` and
207
207
  * its ⛔ explain why a `%XX` in a comment does not survive the round trip.
208
208
  */
209
+ /** The vendor rules these forms are checked against at plan time — resource-spec.ts. */
210
+ endpoint: { create: 'pve:POST /cluster/ha/rules', update: 'pve:PUT /cluster/ha/rules/{rule}' },
209
211
  matches: (attributes, props) =>
210
212
  attributes.resources === csv(props.resources) &&
211
213
  attributes.affinity === props.affinity &&
@@ -18,6 +18,9 @@
18
18
  * ★ THE NOTIFICATION FAMILIES JOINED 2026-09-22: PBS targets and matchers, the PVE matcher, the
19
19
  * `FromEnv` shape their write-only values take, and the Alertmanager body template
20
20
  * (docs/pbs-notifications.md; the template alone: docs/pbs-alertmanager-body.md).
21
+ * ★ THE VENDOR CONSTRAINT READER JOINED 2026-09-22 (codegen/README.md). `constraintsFor` and
22
+ * `violations` are exported so a CONSUMING stack can assert its own declarations offline — the
23
+ * `deploy:pbs` that failed on a 128-character comment had no way to ask that question.
21
24
  * ★ Anything else unlisted is still reachable by path if you genuinely need
22
25
  * it — that is a deliberate, visible act rather than an accident of barrelling.
23
26
  */
@@ -30,6 +33,13 @@ export { ProxmoxCephFlagProvider } from './ceph-flag.ts';
30
33
  export { ProxmoxCephFsProvider } from './ceph-fs.ts';
31
34
  export { ProxmoxCephOsdProvider } from './ceph-osd.ts';
32
35
  export { ProxmoxCephPool, ProxmoxCephPoolProvider } from './ceph-pool.ts';
36
+ export { constraintsFor, formViolations } from './constraint-guard.ts';
37
+ export {
38
+ type EndpointConstraints,
39
+ type EndpointKey,
40
+ type ParamConstraint,
41
+ violations,
42
+ } from './constraints.ts';
33
43
  export { ProxmoxFirewallAliasProvider } from './firewall-alias.ts';
34
44
  export { ProxmoxGroup, ProxmoxGroupProvider } from './group.ts';
35
45
  export { ProxmoxHaResource, ProxmoxHaResourceProvider } from './ha-resource.ts';
@@ -63,7 +73,9 @@ export { ProxmoxPool, ProxmoxPoolProvider } from './pool.ts';
63
73
  export {
64
74
  PROVISION_DEFAULTS,
65
75
  PROVISION_PRIVILEGES,
76
+ type CoreProvisionNames,
66
77
  type ProvisionBaseline,
78
+ type ProvisionComments,
67
79
  type ProvisionLane,
68
80
  type ProvisionNames,
69
81
  type ResolvedProvisionNames,