@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
@@ -1025,6 +1025,20 @@ import * as Duration from "effect/Duration";
1025
1025
  import * as Effect3 from "effect/Effect";
1026
1026
  import * as Exit from "effect/Exit";
1027
1027
 
1028
+ // src/proxmox/credentials.ts
1029
+ var VALID_TIER = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
1030
+ var mintTier = (target, role) => {
1031
+ if (target.scheme !== "pve")
1032
+ return role;
1033
+ const tier = target.roles?.[role];
1034
+ if (tier === undefined)
1035
+ return role;
1036
+ if (!VALID_TIER.test(tier)) {
1037
+ throw new Error(`PveTarget.roles.${role} = ${JSON.stringify(tier)} is not a valid OpenBao tier name -- ` + 'it would be interpolated straight into "<mount>/creds/<tier>" and must be a plain name ' + '(letters, digits, ".", "_", "-", not starting with one of those and not "..").');
1038
+ }
1039
+ return tier;
1040
+ };
1041
+
1028
1042
  // src/proxmox/mint.ts
1029
1043
  import * as Effect2 from "effect/Effect";
1030
1044
  import * as Option from "effect/Option";
@@ -1038,14 +1052,15 @@ import * as Data from "effect/Data";
1038
1052
 
1039
1053
  class PveCredentialDenied extends Data.TaggedError("PveCredentialDenied") {
1040
1054
  get message() {
1041
- return `OpenBao GET /v1/${this.mount}/creds/${this.role} -> 403: ${this.detail}. This identity's ` + "AppRole has no grant for this role -- a refused read, not evidence the object is gone.";
1055
+ return `OpenBao GET /v1/${this.mount}/creds/${this.tier} -> 403: ${this.detail}. This identity's ` + "AppRole has no grant for this role -- a refused read, not evidence the object is gone.";
1042
1056
  }
1043
1057
  }
1044
1058
 
1045
1059
  // src/proxmox/mint.ts
1046
1060
  var baoVariable = (env, name) => env[`BAO_${name}`] ?? env[`VAULT_${name}`] ?? "";
1047
1061
  var mint = (target, role, env = process.env) => Effect2.gen(function* () {
1048
- const path = `${target.mount}/creds/${role}`;
1062
+ const tier = mintTier(target, role);
1063
+ const path = `${target.mount}/creds/${tier}`;
1049
1064
  const refuse = (status2, detail) => new Error(`OpenBao GET /v1/${path} -> ${status2 === 0 ? "no response" : status2}: ${detail}`);
1050
1065
  const address = baoVariable(env, "AGENT_ADDR") || baoVariable(env, "ADDR") || "https://127.0.0.1:8200";
1051
1066
  const socket = address.startsWith("unix://") ? address.slice("unix://".length) : undefined;
@@ -1078,14 +1093,14 @@ var mint = (target, role, env = process.env) => Effect2.gen(function* () {
1078
1093
  const isOpenBaoBody = Array.isArray(errors);
1079
1094
  const detail = isOpenBaoBody ? errors.map(String).join("; ") : "not an OpenBao error body";
1080
1095
  if (status === 403 && isOpenBaoBody) {
1081
- return yield* Effect2.fail(new PveCredentialDenied({ detail, mount: target.mount, role }));
1096
+ return yield* Effect2.fail(new PveCredentialDenied({ detail, mount: target.mount, tier }));
1082
1097
  }
1083
1098
  return yield* Effect2.fail(refuse(status, detail || "(no errors given)"));
1084
1099
  }
1085
1100
  const tokenId = parsed?.data?.token_id;
1086
1101
  const secret = parsed?.data?.secret;
1087
1102
  if (typeof tokenId !== "string" || typeof secret !== "string") {
1088
- return yield* Effect2.fail(new Error(`${target.mount}/creds/${role} returned no token_id/secret. Either this approle lacks ` + `the grant, or the mount is not ${target.mount}. Say which mount and role you needed ` + `than falling back to a stored credential -- every stored PVE token is read-only.`));
1103
+ return yield* Effect2.fail(new Error(`${target.mount}/creds/${tier} returned no token_id/secret. Either this approle lacks ` + `the grant, or the mount is not ${target.mount}. Say which mount and role you needed ` + `than falling back to a stored credential -- every stored PVE token is read-only.`));
1089
1104
  }
1090
1105
  const lease = parsed?.lease_duration;
1091
1106
  const leaseSeconds = typeof lease === "number" ? lease : 0;
@@ -1097,13 +1112,14 @@ var authorization = (credential, target) => target.scheme === "pbs" ? `PBSAPITok
1097
1112
  var REMINT_MARGIN_SECONDS = 60;
1098
1113
  var keyOf = (target, role) => ({
1099
1114
  mount: target.mount,
1100
- role,
1101
- scheme: target.scheme
1115
+ scheme: target.scheme,
1116
+ tier: mintTier(target, role)
1102
1117
  });
1103
1118
  var timeToLive = (exit) => Exit.isSuccess(exit) && exit.value.leaseSeconds > REMINT_MARGIN_SECONDS ? Duration.seconds(exit.value.leaseSeconds - REMINT_MARGIN_SECONDS) : Duration.zero;
1104
1119
  var makeLeases = (mintFor) => Cache.makeWith(mintFor, { capacity: 64, requireServicesAt: "lookup", timeToLive });
1105
- var targetForKey = (key) => key.scheme === "pbs" ? { api: "https://pbs.invalid/api2/json", mount: key.mount, scheme: "pbs" } : { members: [], mount: key.mount, scheme: "pve" };
1106
- var leases = Effect3.runSync(makeLeases((key) => mint(targetForKey(key), key.role)));
1120
+ var targetForKey = (key) => key.scheme === "pbs" ? { api: "https://pbs.invalid/api2/json", mount: key.mount, scheme: "pbs" } : { members: [], mount: key.mount, roles: { read: key.tier }, scheme: "pve" };
1121
+ var mintForKey = (key, env = process.env) => mint(targetForKey(key), key.scheme === "pbs" ? key.tier : "read", env);
1122
+ var leases = Effect3.runSync(makeLeases(mintForKey));
1107
1123
  var leased = (target, role) => Cache.get(leases, keyOf(target, role));
1108
1124
 
1109
1125
  // src/proxmox/members.ts
@@ -1233,7 +1249,7 @@ var runPve = (target, role, isWrite, op) => Effect5.gen(function* () {
1233
1249
  import * as Effect6 from "effect/Effect";
1234
1250
  var UNREADABLE = Symbol("pve-unreadable");
1235
1251
  var readOrUnreadable = (effect) => effect.pipe(Effect6.catchTag("PveCredentialDenied", () => Effect6.succeed(UNREADABLE)));
1236
- var unreadableWarning = (type, identity2) => Effect6.logWarning(`${type} ${identity2}: the read was refused (no grant for this credential's role) -- ` + "reporting noop rather than forcing an update with nothing compared. Re-plan on a lane " + "that can read this object before trusting this row.");
1252
+ var unreadableWarning = (type, identity2, mount, tier) => Effect6.logWarning(`${type} ${identity2}: the read of ${mount}/creds/${tier} was refused (no grant for this ` + "credential's role) -- reporting noop rather than forcing an update with nothing compared. " + "Re-plan on a lane that can read this object before trusting this row.");
1237
1253
 
1238
1254
  // src/proxmox/acl.ts
1239
1255
  var ProxmoxAcl = Resource("Proxmox.Acl");
@@ -1255,7 +1271,7 @@ var ProxmoxAclProvider = () => Provider.effect(ProxmoxAcl, Effect7.succeed(Proxm
1255
1271
  return;
1256
1272
  const live = yield* readAttributes(news);
1257
1273
  if (live === UNREADABLE) {
1258
- yield* unreadableWarning("Proxmox.Acl", identity(news));
1274
+ yield* unreadableWarning("Proxmox.Acl", identity(news), news.target.mount, mintTier(news.target, "provision"));
1259
1275
  return { action: "noop" };
1260
1276
  }
1261
1277
  return live !== undefined && matches(live, news) ? { action: "noop" } : { action: "update" };
@@ -1425,7 +1441,7 @@ var ProxmoxApiTokenProvider = () => Provider2.effect(ProxmoxApiToken, Effect8.su
1425
1441
  return;
1426
1442
  const live = yield* readToken(news);
1427
1443
  if (live === UNREADABLE) {
1428
- yield* unreadableWarning("Proxmox.ApiToken", `${news.userid}!${news.tokenid}`);
1444
+ yield* unreadableWarning("Proxmox.ApiToken", `${news.userid}!${news.tokenid}`, news.target.mount, mintTier(news.target, "provision"));
1429
1445
  return { action: "noop" };
1430
1446
  }
1431
1447
  return live !== undefined && matches2(live, news) ? { action: "noop" } : { action: "update" };
@@ -2393,7 +2409,7 @@ var ProxmoxGroupProvider = () => Provider10.effect(ProxmoxGroup, Effect28.succee
2393
2409
  return;
2394
2410
  const live = yield* readGroupOrFail(news);
2395
2411
  if (live === UNREADABLE) {
2396
- yield* unreadableWarning("Proxmox.Group", news.groupid);
2412
+ yield* unreadableWarning("Proxmox.Group", news.groupid, news.target.mount, mintTier(news.target, "read"));
2397
2413
  return { action: "noop" };
2398
2414
  }
2399
2415
  if (live === undefined) {
@@ -3866,7 +3882,7 @@ var ProxmoxNodeNetworkProvider = () => Provider16.effect(ProxmoxNodeNetwork, Eff
3866
3882
  return;
3867
3883
  const live = yield* readInterfaceOrFail(news);
3868
3884
  if (live === UNREADABLE) {
3869
- yield* unreadableWarning("Proxmox.NodeNetwork", `${news.node}/${news.iface}`);
3885
+ yield* unreadableWarning("Proxmox.NodeNetwork", `${news.node}/${news.iface}`, news.target.mount, mintTier(news.target, "read"));
3870
3886
  return { action: "noop" };
3871
3887
  }
3872
3888
  if (live === undefined) {
@@ -5801,7 +5817,7 @@ var ProxmoxRoleProvider = () => Provider26.effect(ProxmoxRole, Effect78.succeed(
5801
5817
  return;
5802
5818
  const live = yield* readRole(news);
5803
5819
  if (live === UNREADABLE) {
5804
- yield* unreadableWarning("Proxmox.Role", news.roleid);
5820
+ yield* unreadableWarning("Proxmox.Role", news.roleid, news.target.mount, mintTier(news.target, "read"));
5805
5821
  return { action: "noop" };
5806
5822
  }
5807
5823
  if (live === undefined) {
@@ -5901,7 +5917,7 @@ var ProxmoxUserProvider = () => Provider27.effect(ProxmoxUser, Effect80.succeed(
5901
5917
  return;
5902
5918
  const live = yield* readUserOrFail(news);
5903
5919
  if (live === UNREADABLE) {
5904
- yield* unreadableWarning("Proxmox.User", news.userid);
5920
+ yield* unreadableWarning("Proxmox.User", news.userid, news.target.mount, mintTier(news.target, "read"));
5905
5921
  return { action: "noop" };
5906
5922
  }
5907
5923
  if (live === undefined) {
@@ -6904,33 +6920,9 @@ import * as Provider35 from "alchemy/Provider";
6904
6920
  import * as storage2 from "@distilled.cloud/proxmox/storage";
6905
6921
  import * as Effect97 from "effect/Effect";
6906
6922
 
6907
- // src/proxmox/storage-form.ts
6908
- var STORAGE_CREATE = "pve:POST /storage";
6909
- var STORAGE_UPDATE = "pve:PUT /storage/{storage}";
6910
- var field6 = (name, value) => value === undefined ? {} : { [name]: value };
6911
- var locatorForm = (locator) => ({ ...locator });
6912
- var underscored = (form2) => Object.fromEntries(Object.entries(form2).map(([key, value]) => [key.replaceAll("-", "_"), value]));
6913
- var mutable2 = (props) => ({
6914
- ...field6("comment", props.comment),
6915
- ...field6("content", props.content),
6916
- ...field6("disable", flag(props.disable)),
6917
- ...field6("nodes", props.nodes),
6918
- ...field6("preallocation", props.preallocation),
6919
- ...field6("prune-backups", props["prune-backups"]),
6920
- ...field6("shared", flag(props.shared))
6921
- });
6922
- var createForm11 = (props) => ({
6923
- ...locatorForm(props.locator),
6924
- ...mutable2(props),
6925
- storage: props.storage,
6926
- type: props.type
6927
- });
6928
- var updateForm9 = (props) => ({
6929
- ...mutable2(props),
6930
- storage: props.storage
6931
- });
6932
- var toDistilledCreate4 = (props) => underscored(createForm11(props));
6933
- var toDistilledUpdate3 = (props) => underscored(updateForm9(props));
6923
+ // src/proxmox/storage-plugin-options.ts
6924
+ var SHARED_ACCEPTED_TYPES = new Set(["dir", "lvm", "btrfs", "esxi"]);
6925
+ var sharedAccepted = (type) => SHARED_ACCEPTED_TYPES.has(type);
6934
6926
 
6935
6927
  // src/proxmox/storage-wire.ts
6936
6928
  import * as storage from "@distilled.cloud/proxmox/storage";
@@ -6956,7 +6948,44 @@ var attributesOf10 = (live, props) => {
6956
6948
  var readStorageOrFail = (props) => readOrUnreadable(runPve(props.target, "provision", false, storage.getStorage({ storage: props.storage }))).pipe(Effect96.map((live) => live === UNREADABLE ? UNREADABLE : attributesOf10(live, props)));
6957
6949
  var readStorage = (props) => readStorageOrFail(props).pipe(Effect96.catchTag("StorageNotFound", () => Effect96.succeed(undefined)));
6958
6950
  var dropUnreadable7 = (live) => live === UNREADABLE ? undefined : live;
6959
- var matches10 = (attributes2, props) => sameList2(props.content, attributes2.content) && sameList2(props.nodes, attributes2.nodes) && sameList2(props["prune-backups"], attributes2["prune-backups"]) && same7(props.disable, attributes2.disable) && same7(props.shared, attributes2.shared) && same7(props.preallocation, attributes2.preallocation) && same7(props.comment, attributes2.comment);
6951
+ var changedProps = (live, props) => ({
6952
+ ...sameList2(props.content, live.content) ? {} : { content: props.content },
6953
+ ...sameList2(props.nodes, live.nodes) ? {} : { nodes: props.nodes },
6954
+ ...sameList2(props["prune-backups"], live["prune-backups"]) ? {} : { "prune-backups": props["prune-backups"] },
6955
+ ...same7(props.disable, live.disable) ? {} : { disable: props.disable },
6956
+ ...sharedAccepted(props.type) && !same7(props.shared, live.shared) ? { shared: props.shared } : {},
6957
+ ...same7(props.preallocation, live.preallocation) ? {} : { preallocation: props.preallocation },
6958
+ ...same7(props.comment, live.comment) ? {} : { comment: props.comment }
6959
+ });
6960
+ var matches10 = (attributes2, props) => !sharedAccepted(props.type) && !same7(props.shared, attributes2.shared) ? Effect96.die(new Error(`storage/${props.storage}: declared shared: ${String(props.shared)}, but PVE reports ` + `${String(attributes2.shared)} and '${props.type}' storages never accept a 'shared' ` + "write (storage-plugin-options.ts) -- remove the declared shared or set it to match " + "what PVE already reports; this value can never be applied.")) : Effect96.succeed(Object.keys(changedProps(attributes2, props)).length === 0);
6961
+
6962
+ // src/proxmox/storage-form.ts
6963
+ var STORAGE_CREATE = "pve:POST /storage";
6964
+ var STORAGE_UPDATE = "pve:PUT /storage/{storage}";
6965
+ var field6 = (name, value) => value === undefined ? {} : { [name]: value };
6966
+ var locatorForm = (locator) => ({ ...locator });
6967
+ var underscored = (form2) => Object.fromEntries(Object.entries(form2).map(([key, value]) => [key.replaceAll("-", "_"), value]));
6968
+ var mutable2 = (type, props) => ({
6969
+ ...field6("comment", props.comment),
6970
+ ...field6("content", props.content),
6971
+ ...field6("disable", flag(props.disable)),
6972
+ ...field6("nodes", props.nodes),
6973
+ ...field6("preallocation", props.preallocation),
6974
+ ...field6("prune-backups", props["prune-backups"]),
6975
+ ...sharedAccepted(type) ? field6("shared", flag(props.shared)) : {}
6976
+ });
6977
+ var createForm11 = (props) => ({
6978
+ ...locatorForm(props.locator),
6979
+ ...mutable2(props.type, props),
6980
+ storage: props.storage,
6981
+ type: props.type
6982
+ });
6983
+ var updateForm9 = (props, live) => ({
6984
+ ...mutable2(props.type, live === undefined ? props : changedProps(live, props)),
6985
+ storage: props.storage
6986
+ });
6987
+ var toDistilledCreate4 = (props) => underscored(createForm11(props));
6988
+ var toDistilledUpdate3 = (form2) => underscored(form2);
6960
6989
 
6961
6990
  // src/proxmox/storage.ts
6962
6991
  var ProxmoxStorage = Resource35("Proxmox.Storage", {
@@ -6971,28 +7000,29 @@ var ProxmoxStorageProvider = () => Provider35.effect(ProxmoxStorage, Effect97.su
6971
7000
  if (!isResolved30(news))
6972
7001
  return;
6973
7002
  yield* guardWrite2(STORAGE_CREATE, createForm11(news), output === undefined);
6974
- yield* guardWrite2(STORAGE_UPDATE, updateForm9(news), false);
7003
+ yield* guardWrite2(STORAGE_UPDATE, updateForm9(news, undefined), false);
6975
7004
  if (output === undefined)
6976
7005
  return;
6977
7006
  const live = yield* readStorageOrFail(news);
6978
7007
  if (live === UNREADABLE) {
6979
- yield* unreadableWarning("Proxmox.Storage", news.storage);
7008
+ yield* unreadableWarning("Proxmox.Storage", news.storage, news.target.mount, mintTier(news.target, "provision"));
6980
7009
  return { action: "noop" };
6981
7010
  }
6982
7011
  if (live === undefined) {
6983
7012
  yield* guardWrite2(STORAGE_CREATE, createForm11(news), true);
6984
7013
  return { action: "update" };
6985
7014
  }
6986
- return matches10(live, news) ? { action: "noop" } : { action: "update" };
7015
+ return (yield* matches10(live, news)) ? { action: "noop" } : { action: "update" };
6987
7016
  }),
6988
7017
  reconcile: Effect97.fn(function* ({ news }) {
6989
7018
  const before = dropUnreadable7(yield* readStorage(news));
6990
7019
  yield* guardWrite2(STORAGE_CREATE, createForm11(news), before === undefined);
6991
- yield* guardWrite2(STORAGE_UPDATE, updateForm9(news), false);
7020
+ const update2 = updateForm9(news, before);
7021
+ yield* guardWrite2(STORAGE_UPDATE, update2, false);
6992
7022
  if (before === undefined) {
6993
7023
  yield* runPve(news.target, "provision", true, storage2.createStorage(toDistilledCreate4(news)));
6994
- } else if (!matches10(before, news)) {
6995
- yield* runPve(news.target, "provision", true, storage2.putStorage(toDistilledUpdate3(news)));
7024
+ } else if (!(yield* matches10(before, news))) {
7025
+ yield* runPve(news.target, "provision", true, storage2.putStorage(toDistilledUpdate3(update2)));
6996
7026
  }
6997
7027
  const after = dropUnreadable7(yield* readStorage(news));
6998
7028
  if (after === undefined) {
@@ -7098,7 +7128,7 @@ var ProxmoxZfsPoolProvider = () => Provider36.effect(ProxmoxZfsPool, Effect100.s
7098
7128
  return;
7099
7129
  const live = yield* readPoolOrFail(news);
7100
7130
  if (live === UNREADABLE) {
7101
- yield* unreadableWarning("Proxmox.ZfsPool", `${news.node}/${news.name}`);
7131
+ yield* unreadableWarning("Proxmox.ZfsPool", `${news.node}/${news.name}`, news.target.mount, mintTier(news.target, "read"));
7102
7132
  return { action: "noop" };
7103
7133
  }
7104
7134
  if (live === undefined) {
@@ -7193,5 +7223,5 @@ export {
7193
7223
  violations
7194
7224
  };
7195
7225
 
7196
- //# debugId=CF5040306473FBD564756E2164756E21
7226
+ //# debugId=71934628F9E3FB7664756E2164756E21
7197
7227
  //# sourceMappingURL=index.js.map