@homeflare/alchemy 0.20.0 → 0.22.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 (191) hide show
  1. package/README.md +27 -0
  2. package/dist/caddy/access-forward-auth.d.ts +56 -0
  3. package/dist/caddy/access-forward-auth.d.ts.map +1 -0
  4. package/dist/caddy/index.d.ts +6 -0
  5. package/dist/caddy/index.d.ts.map +1 -1
  6. package/dist/caddy/index.js +169 -75
  7. package/dist/caddy/index.js.map +10 -7
  8. package/dist/cloudflare/mcp-server-api.d.ts +135 -0
  9. package/dist/cloudflare/mcp-server-api.d.ts.map +1 -0
  10. package/dist/cloudflare/mcp-server-form.d.ts +116 -0
  11. package/dist/cloudflare/mcp-server-form.d.ts.map +1 -0
  12. package/dist/index.d.ts +1 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/launchd/file-converge.d.ts +70 -0
  15. package/dist/launchd/file-converge.d.ts.map +1 -0
  16. package/dist/launchd/file-identity.d.ts +32 -0
  17. package/dist/launchd/file-identity.d.ts.map +1 -0
  18. package/dist/launchd/host-file-form.d.ts +2 -0
  19. package/dist/launchd/host-file-form.d.ts.map +1 -1
  20. package/dist/launchd/host-file-lifecycle.d.ts +11 -24
  21. package/dist/launchd/host-file-lifecycle.d.ts.map +1 -1
  22. package/dist/launchd/host-file.d.ts.map +1 -1
  23. package/dist/launchd/index.d.ts +2 -0
  24. package/dist/launchd/index.d.ts.map +1 -1
  25. package/dist/launchd/index.js +225 -120
  26. package/dist/launchd/index.js.map +13 -10
  27. package/dist/launchd/local-runner.d.ts.map +1 -1
  28. package/dist/launchd/port-claims.d.ts +31 -0
  29. package/dist/launchd/port-claims.d.ts.map +1 -0
  30. package/dist/launchd/runner.d.ts +17 -2
  31. package/dist/launchd/runner.d.ts.map +1 -1
  32. package/dist/launchd/sudo-runner.d.ts +11 -0
  33. package/dist/launchd/sudo-runner.d.ts.map +1 -1
  34. package/dist/linux/index.js.map +3 -3
  35. package/dist/linux/sudo-listing.d.ts +47 -0
  36. package/dist/linux/sudo-listing.d.ts.map +1 -0
  37. package/dist/proxmox/credential-literals.d.ts +1 -1
  38. package/dist/proxmox/credential-literals.d.ts.map +1 -1
  39. package/dist/proxmox/generated/pbs/nodes-node.d.ts +1 -1
  40. package/dist/proxmox/generated/pbs/nodes-node.d.ts.map +1 -1
  41. package/dist/proxmox/generated/pbs.d.ts +7 -0
  42. package/dist/proxmox/generated/pbs.d.ts.map +1 -1
  43. package/dist/proxmox/generated/pve.d.ts +7 -0
  44. package/dist/proxmox/generated/pve.d.ts.map +1 -1
  45. package/dist/proxmox/index.d.ts +1 -1
  46. package/dist/proxmox/index.d.ts.map +1 -1
  47. package/dist/proxmox/index.js +2 -2
  48. package/dist/proxmox/index.js.map +9 -9
  49. package/dist/proxmox/pbs-notification-target-form.d.ts +1 -1
  50. package/dist/proxmox/pbs-notification-target-form.d.ts.map +1 -1
  51. package/dist/proxmox/pbs-notification-target.d.ts +1 -1
  52. package/dist/proxmox/pbs-notification-target.d.ts.map +1 -1
  53. package/dist/release/archive.d.ts +11 -0
  54. package/dist/release/archive.d.ts.map +1 -0
  55. package/dist/release/binary-claim.d.ts +53 -0
  56. package/dist/release/binary-claim.d.ts.map +1 -0
  57. package/dist/release/binary-diff.d.ts +38 -0
  58. package/dist/release/binary-diff.d.ts.map +1 -0
  59. package/dist/release/binary-form.d.ts +118 -0
  60. package/dist/release/binary-form.d.ts.map +1 -0
  61. package/dist/release/binary-lifecycle.d.ts +55 -0
  62. package/dist/release/binary-lifecycle.d.ts.map +1 -0
  63. package/dist/release/binary-read.d.ts +11 -0
  64. package/dist/release/binary-read.d.ts.map +1 -0
  65. package/dist/release/binary.d.ts +68 -0
  66. package/dist/release/binary.d.ts.map +1 -0
  67. package/dist/release/catalog.d.ts +113 -0
  68. package/dist/release/catalog.d.ts.map +1 -0
  69. package/dist/release/checksums.d.ts +22 -0
  70. package/dist/release/checksums.d.ts.map +1 -0
  71. package/dist/release/declared-pins.d.ts +4 -0
  72. package/dist/release/declared-pins.d.ts.map +1 -0
  73. package/dist/release/download.d.ts +44 -0
  74. package/dist/release/download.d.ts.map +1 -0
  75. package/dist/release/fake-deploy.d.ts +48 -0
  76. package/dist/release/fake-deploy.d.ts.map +1 -0
  77. package/dist/release/fake-engine.d.ts +8 -0
  78. package/dist/release/fake-engine.d.ts.map +1 -0
  79. package/dist/release/fake-install.d.ts +39 -0
  80. package/dist/release/fake-install.d.ts.map +1 -0
  81. package/dist/release/fake-provider.d.ts +58 -0
  82. package/dist/release/fake-provider.d.ts.map +1 -0
  83. package/dist/release/fake-release.d.ts +95 -0
  84. package/dist/release/fake-release.d.ts.map +1 -0
  85. package/dist/release/index.d.ts +25 -0
  86. package/dist/release/index.d.ts.map +1 -0
  87. package/dist/release/index.js +1425 -0
  88. package/dist/release/index.js.map +36 -0
  89. package/dist/release/openbao.d.ts +35 -0
  90. package/dist/release/openbao.d.ts.map +1 -0
  91. package/dist/release/providers.d.ts +19 -0
  92. package/dist/release/providers.d.ts.map +1 -0
  93. package/dist/release/refused.d.ts +39 -0
  94. package/dist/release/refused.d.ts.map +1 -0
  95. package/dist/release/tar.d.ts +14 -0
  96. package/dist/release/tar.d.ts.map +1 -0
  97. package/dist/release/victoria.d.ts +36 -0
  98. package/dist/release/victoria.d.ts.map +1 -0
  99. package/dist/{proxmox → secrets}/write-only.d.ts.map +1 -1
  100. package/docs/launchd-ports.md +109 -0
  101. package/docs/launchd.md +5 -0
  102. package/docs/release-binary-catalogs.md +138 -0
  103. package/docs/release-binary-measured.md +163 -0
  104. package/docs/release-binary-openbao.md +151 -0
  105. package/docs/release-binary-refusals.md +57 -0
  106. package/docs/release-binary-upstream.md +163 -0
  107. package/docs/release-binary.md +165 -0
  108. package/package.json +5 -1
  109. package/src/caddy/access-forward-auth.test.ts +63 -0
  110. package/src/caddy/access-forward-auth.ts +120 -0
  111. package/src/caddy/index.ts +10 -0
  112. package/src/caddy/providers.test.ts +4 -0
  113. package/src/cloudflare/mcp-server-api.ts +294 -0
  114. package/src/cloudflare/mcp-server-form.ts +219 -0
  115. package/src/index.ts +1 -0
  116. package/src/launchd/file-converge.ts +233 -0
  117. package/src/launchd/file-identity.ts +69 -0
  118. package/src/launchd/host-file-alias.test.ts +65 -0
  119. package/src/launchd/host-file-form.ts +2 -1
  120. package/src/launchd/host-file-lifecycle.ts +25 -144
  121. package/src/launchd/host-file.ts +8 -2
  122. package/src/launchd/index.ts +2 -0
  123. package/src/launchd/local-runner.test.ts +12 -1
  124. package/src/launchd/local-runner.ts +2 -0
  125. package/src/launchd/port-claims.test.ts +124 -0
  126. package/src/launchd/port-claims.ts +102 -0
  127. package/src/launchd/providers.test.ts +3 -0
  128. package/src/launchd/runner.ts +17 -2
  129. package/src/launchd/sudo-runner.ts +11 -0
  130. package/src/linux/sudo-listing.ts +122 -0
  131. package/src/proxmox/credential-literals.ts +1 -1
  132. package/src/proxmox/generated/pbs/nodes-node.ts +1 -1
  133. package/src/proxmox/generated/pbs.ts +7 -0
  134. package/src/proxmox/generated/pve.ts +7 -0
  135. package/src/proxmox/index.ts +1 -1
  136. package/src/proxmox/pbs-notification-target-form.ts +1 -1
  137. package/src/proxmox/pbs-notification-target-lifecycle.ts +1 -1
  138. package/src/proxmox/pbs-notification-target-wire.ts +1 -1
  139. package/src/proxmox/pbs-notification-target.ts +1 -1
  140. package/src/release/adopt-parity.test.ts +106 -0
  141. package/src/release/apply-pins.test.ts +128 -0
  142. package/src/release/archive.ts +94 -0
  143. package/src/release/binary-alias.test.ts +109 -0
  144. package/src/release/binary-claim.ts +80 -0
  145. package/src/release/binary-claims.test.ts +47 -0
  146. package/src/release/binary-diff.ts +73 -0
  147. package/src/release/binary-form.ts +229 -0
  148. package/src/release/binary-lifecycle.test.ts +90 -0
  149. package/src/release/binary-lifecycle.ts +202 -0
  150. package/src/release/binary-read.ts +55 -0
  151. package/src/release/binary-refusals.test.ts +192 -0
  152. package/src/release/binary-sudo.test.ts +93 -0
  153. package/src/release/binary.ts +181 -0
  154. package/src/release/catalog.test.ts +167 -0
  155. package/src/release/catalog.ts +238 -0
  156. package/src/release/checksums.test.ts +35 -0
  157. package/src/release/checksums.ts +43 -0
  158. package/src/release/declared-pins.ts +39 -0
  159. package/src/release/download.test.ts +138 -0
  160. package/src/release/download.ts +110 -0
  161. package/src/release/error-channel.test.ts +69 -0
  162. package/src/release/fake-deploy.ts +87 -0
  163. package/src/release/fake-engine.ts +50 -0
  164. package/src/release/fake-install.ts +59 -0
  165. package/src/release/fake-provider.ts +68 -0
  166. package/src/release/fake-release.ts +185 -0
  167. package/src/release/fixtures/openbao/checksums.txt +83 -0
  168. package/src/release/fixtures/openbao/checksums.txt.gpgsig +0 -0
  169. package/src/release/fixtures/openbao/darwin-assets.txt +12 -0
  170. package/src/release/fixtures/openbao/openbao-gpg-pub-20240618.asc +109 -0
  171. package/src/release/fixtures/victoria/darwin-arm64-assets.txt +22 -0
  172. package/src/release/fixtures/victoria/victoria-logs-darwin-arm64-v1.52.0_checksums.txt +2 -0
  173. package/src/release/fixtures/victoria/victoria-metrics-darwin-arm64-v1.151.0_checksums.txt +2 -0
  174. package/src/release/fixtures/victoria/victoria-traces-darwin-arm64-v0.10.0_checksums.txt +2 -0
  175. package/src/release/fixtures/victoria/vmutils-darwin-arm64-v1.151.0_checksums.txt +8 -0
  176. package/src/release/index.ts +44 -0
  177. package/src/release/openbao.test.ts +120 -0
  178. package/src/release/openbao.ts +86 -0
  179. package/src/release/plan.test.ts +189 -0
  180. package/src/release/provider-refusals.test.ts +48 -0
  181. package/src/release/providers.test.ts +175 -0
  182. package/src/release/providers.ts +24 -0
  183. package/src/release/recovery-read.test.ts +44 -0
  184. package/src/release/refused.ts +40 -0
  185. package/src/release/tar.test.ts +142 -0
  186. package/src/release/tar.ts +195 -0
  187. package/src/release/victoria.test.ts +108 -0
  188. package/src/release/victoria.ts +154 -0
  189. package/src/{proxmox → secrets}/write-only.ts +6 -0
  190. /package/dist/{proxmox → secrets}/write-only.d.ts +0 -0
  191. /package/src/{proxmox → secrets}/write-only.test.ts +0 -0
@@ -19,7 +19,7 @@
19
19
  */
20
20
  import type { PveForm } from './client.ts';
21
21
  import type { PbsNotificationTargetAttributes, PbsNotificationTargetProps } from './pbs-notification-target.ts';
22
- import { type Environment } from './write-only.ts';
22
+ import { type Environment } from '../secrets/write-only.ts';
23
23
  type Props = PbsNotificationTargetProps;
24
24
  /**
25
25
  * Why this declaration cannot be written, or nothing. Checked at PLAN, so a webhook without a
@@ -1 +1 @@
1
- {"version":3,"file":"pbs-notification-target-form.d.ts","sourceRoot":"","sources":["../../src/proxmox/pbs-notification-target-form.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,KAAK,EACV,+BAA+B,EAC/B,0BAA0B,EAC3B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,KAAK,WAAW,EAAyC,MAAM,iBAAiB,CAAC;AAE1F,KAAK,KAAK,GAAG,0BAA0B,CAAC;AAkCxC;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,UAAW,KAAK,KAAG,MAAM,EAsB7C,CAAC;AAIF,sFAAsF;AACtF,eAAO,MAAM,aAAa,UAAW,KAAK,QAAO,WAAW;;;;;;;;;;;CAgB3D,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;AAKvD,4FAA4F;AAC5F,eAAO,MAAM,YAAY,SAAU,+BAA+B,SAAS,KAAK,KAAG,OAagB,CAAC;AAEpG,eAAO,MAAM,WAAW,SAChB,+BAA+B,SAC9B,KAAK,UACJ,MAAM,KACb,UAKF,CAAC;AAEF,eAAO,MAAM,WAAW,SAChB,+BAA+B,SAC9B,KAAK,UACJ,MAAM,UACN,MAAM,KACb,UAMF,CAAC;AAEF,oFAAoF;AACpF,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAmCD;;;;;GAKG;AACH,eAAO,MAAM,UAAU,UACd,KAAK,UACJ,MAAM,SACP,KAAK,QACN,QAAQ,GAAG,QAAQ,KACxB,OAkBF,CAAC"}
1
+ {"version":3,"file":"pbs-notification-target-form.d.ts","sourceRoot":"","sources":["../../src/proxmox/pbs-notification-target-form.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,KAAK,EACV,+BAA+B,EAC/B,0BAA0B,EAC3B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,KAAK,WAAW,EAAyC,MAAM,0BAA0B,CAAC;AAEnG,KAAK,KAAK,GAAG,0BAA0B,CAAC;AAkCxC;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,UAAW,KAAK,KAAG,MAAM,EAsB7C,CAAC;AAIF,sFAAsF;AACtF,eAAO,MAAM,aAAa,UAAW,KAAK,QAAO,WAAW;;;;;;;;;;;CAgB3D,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;AAKvD,4FAA4F;AAC5F,eAAO,MAAM,YAAY,SAAU,+BAA+B,SAAS,KAAK,KAAG,OAagB,CAAC;AAEpG,eAAO,MAAM,WAAW,SAChB,+BAA+B,SAC9B,KAAK,UACJ,MAAM,KACb,UAKF,CAAC;AAEF,eAAO,MAAM,WAAW,SAChB,+BAA+B,SAC9B,KAAK,UACJ,MAAM,UACN,MAAM,KACb,UAMF,CAAC;AAEF,oFAAoF;AACpF,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAmCD;;;;;GAKG;AACH,eAAO,MAAM,UAAU,UACd,KAAK,UACJ,MAAM,SACP,KAAK,QACN,QAAQ,GAAG,QAAQ,KACxB,OAkBF,CAAC"}
@@ -29,7 +29,7 @@
29
29
  import { Resource } from 'alchemy';
30
30
  import * as Provider from 'alchemy/Provider';
31
31
  import type { PveRequirements, WithPbsTarget } from './resource.ts';
32
- import type { FromEnv } from './write-only.ts';
32
+ import type { FromEnv } from '../secrets/write-only.ts';
33
33
  export type PbsNotificationTargetType = 'sendmail' | 'smtp' | 'webhook';
34
34
  /**
35
35
  * ⚠️ PBS'S OWN KEY NAMES, DASHES INCLUDED, for the reason backup-job.ts gives. A field outside its
@@ -1 +1 @@
1
- {"version":3,"file":"pbs-notification-target.d.ts","sourceRoot":"","sources":["../../src/proxmox/pbs-notification-target.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pbs-notification-target.d.ts","sourceRoot":"","sources":["../../src/proxmox/pbs-notification-target.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAG7C,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,MAAM,yBAAyB,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;AAExE;;;;GAIG;AACH,MAAM,WAAW,0BAA2B,SAAQ,aAAa;IAC/D,6EAA6E;IAC7E,IAAI,EAAE,yBAAyB,CAAC;IAChC,yFAAyF;IACzF,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iEAAiE;IACjE,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,4EAA4E;IAC5E,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,0CAA0C;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,KAAK,CAAC;IACvC,YAAY;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8FAA8F;IAC9F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;IAChC;;;;OAIG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC;IACpD;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oFAAoF;IACpF,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC5C;AAED,2EAA2E;AAC3E,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,yBAAyB,CAAC;IAChC,gFAAgF;IAChF,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAsB,SAAQ,QAAQ,CACrD,wBAAwB,EACxB,0BAA0B,EAC1B,+BAA+B,EAC/B,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,eAAO,MAAM,qBAAqB,wDAA4D,CAAC;AAE/F;;;GAGG;AACH,eAAO,MAAM,6BAA6B,2IAIvC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { PinnedDownload } from './binary-form.ts';
2
+ import { type TarContents } from './tar.ts';
3
+ /** Gunzip and read a tar, keeping only `wanted`. Throws ArchiveRefused. */
4
+ export declare const extractMembers: (gzipped: Uint8Array, wanted: ReadonlySet<string>) => Promise<TarContents>;
5
+ /**
6
+ * The declared member's bytes out of a downloaded archive, both layers checked.
7
+ * ⚠️ `archive` may be shared with another resource's extraction (download.ts sharingInFlight):
8
+ * this only reads it.
9
+ */
10
+ export declare const verifiedMember: (archive: Uint8Array, release: PinnedDownload) => Promise<Uint8Array>;
11
+ //# sourceMappingURL=archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/release/archive.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,KAAK,WAAW,EAAa,MAAM,UAAU,CAAC;AAKvD,2EAA2E;AAC3E,eAAO,MAAM,cAAc,YAChB,UAAU,UACX,WAAW,CAAC,MAAM,CAAC,KAC1B,OAAO,CAAC,WAAW,CA8BrB,CAAC;AAUF;;;;GAIG;AACH,eAAO,MAAM,cAAc,YAChB,UAAU,WACV,cAAc,KACtB,OAAO,CAAC,UAAU,CAepB,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * What a Release.Binary may take over at a path it holds no state for: ONLY the pinned binary, and
3
+ * only under `--adopt`. Asked the same way at plan (binary-diff.ts) and at apply
4
+ * (binary-lifecycle.ts), so a plan never says `adopted` or `create` for a file the apply would then
5
+ * overwrite or silently claim.
6
+ *
7
+ * ⛔ OTHER BYTES ARE NEVER ADOPTED, `--adopt` OR NOT. 🔴 MEASURED 2026-09-22 (adopt-parity.test.ts,
8
+ * through Alchemy's own Plan and Apply): under `--adopt`, a file with other bytes at the path
9
+ * planned as `adopted` — beta.79 forces an `adopted` update after every takeover and prints it for
10
+ * drift too — and the apply downloaded the archive and overwrote that file in place. With the
11
+ * directory an Output (the probe skipped) the same file planned as `create`, and was overwritten.
12
+ * ★ Refused rather than converged, which is what Host.File does with a file it adopts: a binary's
13
+ * content is named entirely by its pin, so "adopting" other bytes is replacing them under
14
+ * whatever runs them, with no rollback but a re-download — the very overwrite binary-form.ts
15
+ * inPlaceRefusal refuses for a re-pin. The pinned bytes with another mode or owner ARE adopted;
16
+ * the apply re-writes the bytes already on disk.
17
+ * ⛔ THE PINNED BYTES WITH NO STATE ARE NOT OURS WITHOUT `--adopt` — AT APPLY AS AT PLAN. The probe
18
+ * already says `Unowned` for them (docs/ownership.md: identical is not ours). file-converge.ts
19
+ * accepts them at apply as the resume of an interrupted install, and that gap is where the probe
20
+ * never runs: every first deploy that passes `directory: dir.path`. 🔴 MEASURED 2026-09-22: a
21
+ * declaration renamed (a new logical id, the same path) in a deploy that also changed its
22
+ * HostDirectory's mode claimed the identical file at apply without `--adopt`; the orphan delete of
23
+ * the old name then removed it, and the deploy reported success with the binary gone. With the
24
+ * directory unchanged, the probe refused that same rename.
25
+ * ⚠️ THE COST: an install interrupted between its write and its commit while a prop was an
26
+ * Output now resumes only with `--adopt` — as the same install with every prop resolved already
27
+ * did (its recovery read is `Unowned`), and as ownership.md says a create or replace interrupted
28
+ * while a prop was an Output does. A retained old version is not re-claimed by a rollback either.
29
+ * ★ `renamedFrom()` IS THE REMEDY FOR A RENAME: `.pipe(renamedFrom('old-id'))` migrates the row
30
+ * and keeps the file (adopt-parity.test.ts). 🔴 MEASURED 2026-09-22: the same rename under
31
+ * `--adopt` claimed the file, the old name's delete then removed it, and the deploy succeeded
32
+ * with the binary gone. binary.ts's delete now leaves a path another declaration installed in
33
+ * the same deploy, so that is kept too — as an adoption, not as the old row. ⚠️ That guard sees
34
+ * only this deploy's claims, by spelling; nothing here sees another row's claim in state.
35
+ * ★ HOW DIFF TELLS A TAKEOVER FROM ITS OWN ROW. Every row this resource commits records the digest
36
+ * reconcile READ BACK, which it checked equal to the pin — so `output.sha256 === olds.sha256` for
37
+ * every row of its own, and an update never changes the digest (a new digest is a new path, a
38
+ * `replace`). The engine hands diff anything else only after a read of a path it holds no state
39
+ * for: the adoption probe (`olds` = the declaration) or the recovery read of an interrupted
40
+ * create (`olds` = its row). A non-file reads with digest '' (file-converge.ts).
41
+ */
42
+ import { type FileTarget } from '../launchd/file-converge.ts';
43
+ import type { HostRunner } from '../launchd/runner.ts';
44
+ /** Plan side: why diff must refuse `found` — a digest read at a path with no state — or undefined. */
45
+ export declare const adoptionProblem: (found: string, pinned: string) => string | undefined;
46
+ /**
47
+ * Apply side, for a reconcile with no `output` — a create, a replace's new generation, or the
48
+ * resume of either: why it must not write, or undefined. `adopt` is adoptsAtApply's answer (never
49
+ * true for a fresh replace). A symlink or directory is left to convergeFile, which refuses it by
50
+ * kind.
51
+ */
52
+ export declare const claimProblem: (runner: HostRunner, want: FileTarget, adopt: boolean) => Promise<string | undefined>;
53
+ //# sourceMappingURL=binary-claim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-claim.d.ts","sourceRoot":"","sources":["../../src/release/binary-claim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,OAAO,EAAE,KAAK,UAAU,EAAsB,MAAM,6BAA6B,CAAC;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AASvD,sGAAsG;AACtG,eAAO,MAAM,eAAe,UAAW,MAAM,UAAU,MAAM,KAAG,MAAM,GAAG,SACA,CAAC;AAE1E;;;;;GAKG;AACH,eAAO,MAAM,YAAY,WACf,UAAU,QACZ,UAAU,SACT,OAAO,KACb,OAAO,CAAC,MAAM,GAAG,SAAS,CAc5B,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Release.Binary's plan-time answer: refuse what the plan can already see is wrong, `replace` when
3
+ * the binary's identity moves, and otherwise compare the live file with the declaration.
4
+ *
5
+ * ⛔ THE PINS MUST BE PLAIN VALUES, AND ARE CHECKED EVEN WHILE `directory` IS AN OUTPUT. A pin that
6
+ * is an Output would be computed during the deploy — a fetch by another name — so a malformed or
7
+ * non-literal pin fails the plan here, before a byte is fetched, whatever else is unresolved.
8
+ * ⚠️ A CREATE IS NEVER DIFFED: the engine plans a first deploy without calling diff, and skips
9
+ * the adoption probe while any prop is an Output. A pin wired from another resource's Output on
10
+ * a FIRST deploy therefore reaches no plan-time check; reconcile refuses it before any host call
11
+ * or request, from the props as the stack program declared them (declared-pins.ts). 🔴 Until
12
+ * 2026-09-22 it was checked there for shape only, and a swapped archive with swapped digests
13
+ * installed (apply-pins.test.ts).
14
+ * ⛔ A NEW PIN IS A NEW PATH (binary-form.ts inPlaceRefusal). When the path is resolved and
15
+ * unchanged, a changed pin is refused here; when it is resolved and new, it is a `replace`.
16
+ * ⚠️ WHILE THE DIRECTORY IS STILL AN OUTPUT the path is unknown, and the answer depends on whether
17
+ * the BYTES move, because the path may turn out not to have:
18
+ * - other bytes (or another name) → `replace`. If the path did not move after all, the new
19
+ * generation's create finds the old file, which does not hold its bytes, and refuses
20
+ * (file-converge.ts never overwrites what a generation does not own).
21
+ * - the same bytes from another archive (a re-pin, a repack) → `update`, NEVER `replace`. 🔴 A
22
+ * replace onto the same path would accept the old file as its own (same bytes, same mode) and
23
+ * then Phase 2 would delete the OLD generation — at that same path, taking the new one's file
24
+ * with it. An update reaches reconcile with `olds`, whose in-place guard refuses the same path,
25
+ * and whose move (file-converge.ts) writes the new path before removing the old.
26
+ * ★ Not the engine's default either way: a changed prop is an update by default, which is
27
+ * exactly the in-place overwrite this resource refuses.
28
+ * ★ Create-before-delete: two versions can sit in two directories at once, so nothing forces
29
+ * `deleteFirst`; the old file goes only once the new one is written and verified.
30
+ * ⚠️ HOUSE, NOT UPSTREAM: this reads the live file at plan time and can answer `noop`. Upstream's
31
+ * guidance is a diff that rarely does either (docs/release-binary-upstream.md).
32
+ */
33
+ import { type Diff } from 'alchemy/Diff';
34
+ import type { Input } from 'alchemy/Input';
35
+ import type { HostRunner } from '../launchd/runner.ts';
36
+ import { type ReleaseBinaryAttributes, type ReleaseBinaryProps } from './binary-form.ts';
37
+ export declare const diffBinary: (runner: HostRunner, news: Input<ReleaseBinaryProps>, olds: ReleaseBinaryProps, output: ReleaseBinaryAttributes) => Promise<Diff | undefined>;
38
+ //# sourceMappingURL=binary-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-diff.d.ts","sourceRoot":"","sources":["../../src/release/binary-diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAAE,KAAK,IAAI,EAAc,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAG3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EAIxB,MAAM,kBAAkB,CAAC;AAG1B,eAAO,MAAM,UAAU,WACb,UAAU,QACZ,KAAK,CAAC,kBAAkB,CAAC,QACzB,kBAAkB,UAChB,uBAAuB,KAC9B,OAAO,CAAC,IAAI,GAAG,SAAS,CAoB1B,CAAC"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Release.Binary's props, attributes and validation — the pure half of the provider.
3
+ *
4
+ * ★ THE PINNED ARCHIVE IS A PROP, NOT A LOOKUP. Repository, tag, exact asset name, size, the
5
+ * archive's SHA-256, the member and the member's SHA-256 all arrive as props — usually spread from
6
+ * a vendor data set (victoria.ts) by `catalogBinary()`. So the resource knows no vendor at all: a
7
+ * second vendor is a second data module, never a change here, and the resource is the shape
8
+ * Alchemy could accept (docs/release-binary-upstream.md).
9
+ * ⛔ NOTHING ESTATE-SPECIFIC IS A CONSTANT HERE. The install directory, owner, group and mode are
10
+ * the consuming stack's props. A stack that keeps binaries under `/opt/<estate>/obs/bin` says so
11
+ * in its own code.
12
+ * ⛔ EVERY PIN IS REQUIRED, AND WELL-FORMED OR REFUSED. There is no "latest", no optional digest and
13
+ * no fallback to a checksum file fetched at apply — see victoria.ts for why a pin beats a fetch.
14
+ */
15
+ import type { HostFileAttributes } from '../launchd/host-file-form.ts';
16
+ /** One release archive, pinned: where it is published, and the bytes it must be. */
17
+ export interface ReleaseArchive {
18
+ /** The GitHub repository that publishes it, `owner/name`: `'VictoriaMetrics/VictoriaMetrics'`. */
19
+ readonly repo: string;
20
+ /** The release tag, exactly as published: `'v1.151.0'`. */
21
+ readonly tag: string;
22
+ /**
23
+ * The asset's file name, whole: `'vmutils-darwin-arm64-v1.151.0.tar.gz'`. ⛔ Never a prefix or a
24
+ * pattern — `-enterprise` and `-cluster` siblings share every prefix with it.
25
+ */
26
+ readonly asset: string;
27
+ /** Bytes, per the release API. A download that runs past this is cut off and refused. */
28
+ readonly size: number;
29
+ /** The archive's SHA-256, lower-case hex, as the vendor's checksum file lists it. */
30
+ readonly sha256: string;
31
+ }
32
+ export interface ReleaseBinaryProps {
33
+ /** The pinned archive the binary comes out of. `catalogBinary()` fills it from a data set. */
34
+ archive: ReleaseArchive;
35
+ /** The archive member to extract, by its exact name: `'vmalert-prod'`. Nothing else is unpacked. */
36
+ member: string;
37
+ /** The member's own SHA-256 — what the installed file must hash to. */
38
+ sha256: string;
39
+ /**
40
+ * The installed file name: `'vmalert'`. ★ Separate from `member` on purpose — VictoriaMetrics
41
+ * names every member `<binary>-prod`, and a job's argv[0] should not carry that.
42
+ */
43
+ name: string;
44
+ /**
45
+ * The directory the binary is written into. ⛔ It must already exist — declare it with
46
+ * `HostDirectory` and pass that resource's `path`, which also orders it first. ★ Give each
47
+ * version its own directory (`catalogDirectory()`): an upgrade is then a new path — a
48
+ * create-before-delete replace, never an overwrite under a running daemon — and a rollback is a
49
+ * path. A new pin at the SAME path is refused (binary-diff.ts).
50
+ */
51
+ directory: string;
52
+ /**
53
+ * Permission bits. ⛔ Owner-readable and -executable, never group- or world-writable, never
54
+ * setuid, setgid or sticky — a writable binary is whoever-can-write's code, run as whoever runs
55
+ * the daemon. Its directory must not be group- or world-writable either (binary-lifecycle.ts).
56
+ * @default 0o755
57
+ */
58
+ mode?: number;
59
+ /** User name or numeric uid. Omitted: whoever the runner writes as. */
60
+ owner?: string | number;
61
+ /** Group name or numeric gid. Omitted: the directory's default group. */
62
+ group?: string | number;
63
+ }
64
+ export interface ReleaseBinaryAttributes extends HostFileAttributes {
65
+ /** The archive the bytes came from, whole. */
66
+ url: string;
67
+ /** The archive member installed, by its exact name: `vmalert-prod`. */
68
+ member: string;
69
+ }
70
+ /** Everything a download and its two checks need: one archive, one member, both digests. */
71
+ export type PinnedDownload = {
72
+ readonly url: string;
73
+ readonly size: number;
74
+ /** The archive's pinned SHA-256. */
75
+ readonly sha256: string;
76
+ /** The archive member to extract, by exact name. */
77
+ readonly member: string;
78
+ /** The member's pinned SHA-256. */
79
+ readonly memberSha256: string;
80
+ };
81
+ export declare const DEFAULT_BINARY_MODE = 493;
82
+ /**
83
+ * The release-asset URL. ★ GITHUB'S DOWNLOAD PATH, NOT THE API: it needs no token and spends no rate
84
+ * limit (it redirects to a signed CDN URL — measured 2026-09-22 with HEAD). Every consumer the
85
+ * estate census found publishes on GitHub except Grafana (grafana.com), which is not a
86
+ * single-binary consumer anyway (docs/release-binary-catalogs.md). A second source kind arrives
87
+ * with its first consumer, not before.
88
+ */
89
+ export declare const releaseUrl: (repo: string, tag: string, asset: string) => string;
90
+ /** Where a declaration puts its binary: `<directory>/<name>`. */
91
+ export declare const releaseBinaryPath: (props: {
92
+ readonly directory: string;
93
+ readonly name: string;
94
+ }) => string;
95
+ /** The download a declaration means. ⚠️ Validate first (binaryProblems): this trusts its input. */
96
+ export declare const pinnedDownload: (props: ReleaseBinaryProps) => PinnedDownload;
97
+ export declare const modeProblems: (mode: number) => string[];
98
+ export declare const MAX_ARCHIVE: number;
99
+ /** Everything wrong with the pins alone — plain strings in any declaration, resolved or not. */
100
+ export declare const pinProblems: (props: {
101
+ readonly archive?: Partial<ReleaseArchive>;
102
+ readonly member?: unknown;
103
+ readonly sha256?: unknown;
104
+ readonly name?: unknown;
105
+ }) => string[];
106
+ type Pins = Pick<ReleaseBinaryProps, 'archive' | 'member' | 'sha256'>;
107
+ /** Whether two declarations pin different bytes: another archive, member or member digest. */
108
+ export declare const pinsMoved: (olds: Pins, news: Pins) => boolean;
109
+ /**
110
+ * ⛔ A NEW PIN IS A NEW PATH. The same path with other bytes would overwrite a binary under the
111
+ * daemon running it, and leave no rollback but a re-download — so it is refused, at plan when the
112
+ * path is resolved (binary-diff.ts) and at apply otherwise (binary-lifecycle.ts).
113
+ */
114
+ export declare const inPlaceRefusal: (olds: Pins, news: Pins) => string;
115
+ /** Everything wrong with a declaration, before any host or network is asked anything. */
116
+ export declare const binaryProblems: (props: ReleaseBinaryProps) => string[];
117
+ export {};
118
+ //# sourceMappingURL=binary-form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-form.d.ts","sourceRoot":"","sources":["../../src/release/binary-form.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Release.Binary's read / reconcile / delete as plain async functions over a HostRunner and a
3
+ * FetchArchive, so the lifecycle runs against fakes of both in tests. (diff: binary-diff.ts.)
4
+ *
5
+ * ⛔ ONE WRITER. The verified bytes reach the host through file-converge.ts — the path Host.File's
6
+ * bytes take — and so through `HostRunner.writeFileAtomic` alone: a temp file in the same
7
+ * directory, mode and owner set, rename. Under sudoRunner that is its staged `install -S`.
8
+ * Nothing here opens a file, spawns `tar`, or stages a download on disk.
9
+ * ★ REFUSE BEFORE TOUCHING ANYTHING. Validation runs before the first host call, the host checks
10
+ * run before the first download, and the digest checks run before the one write — so every
11
+ * refusal but a failed read-back can say "Nothing was written."
12
+ * ★ AN INSTALLED BINARY IS RECOGNISED BY ITS DIGEST. A file whose SHA-256 is the pin needs no
13
+ * download to confirm, and a mode or owner fix re-writes the bytes already on disk.
14
+ */
15
+ import { type FileTarget } from '../launchd/file-converge.ts';
16
+ import type { HostRunner } from '../launchd/runner.ts';
17
+ import { type PinnedDownload, type ReleaseBinaryAttributes, type ReleaseBinaryProps } from './binary-form.ts';
18
+ import type { FetchArchive } from './download.ts';
19
+ import { BinaryRefused } from './refused.ts';
20
+ export declare const NOTHING = "Nothing was written.";
21
+ export declare const refuse: (path: string, message: string) => BinaryRefused;
22
+ export type Desired = {
23
+ readonly want: FileTarget;
24
+ readonly download: PinnedDownload;
25
+ };
26
+ /** Validate every prop, then resolve owner and group through the runner. */
27
+ export declare const desiredBinary: (runner: HostRunner, props: ReleaseBinaryProps) => Promise<Desired>;
28
+ /**
29
+ * The file at the declaration's path, or undefined when absent — the adoption probe's answer.
30
+ * ★ Its `sha256` is the digest of the bytes on disk, so a caller sees at once whether it is the
31
+ * pinned binary (equal to `props.sha256`) without anything being executed.
32
+ */
33
+ export declare const readBinary: (runner: HostRunner, props: ReleaseBinaryProps) => Promise<ReleaseBinaryAttributes | undefined>;
34
+ /** An owned binary as it is now, at the path state recorded — no pins needed to find it. */
35
+ export declare const refreshBinary: (runner: HostRunner, output: ReleaseBinaryAttributes) => Promise<ReleaseBinaryAttributes | undefined>;
36
+ export type ReconcileOptions = {
37
+ /** The attributes state holds; undefined on a create. */
38
+ readonly output?: ReleaseBinaryAttributes | undefined;
39
+ /** The props state holds; undefined on a create and on an adoption. */
40
+ readonly olds?: ReleaseBinaryProps | undefined;
41
+ /** adoptsAtApply's answer. What it may take over is convergeFile's ⛔. @default false */
42
+ readonly adopt?: boolean;
43
+ /** Progress for the deploy log — the engine's `session.note`. */
44
+ readonly note?: (message: string) => Promise<void>;
45
+ /**
46
+ * What is wrong with the pins as the stack program DECLARED them (declared-pins.ts) — an Output
47
+ * there resolves to a plausible plain string by the time it reaches `props`. @default []
48
+ */
49
+ readonly declared?: readonly string[];
50
+ };
51
+ /** Install the declared binary unless it is already there, and return it as read back. */
52
+ export declare const reconcileBinary: (runner: HostRunner, fetch: FetchArchive, props: ReleaseBinaryProps, options?: ReconcileOptions) => Promise<ReleaseBinaryAttributes>;
53
+ /** Remove the binary. Idempotent. ⛔ Refuses a path that has since become a symlink or directory. */
54
+ export declare const deleteBinary: (runner: HostRunner, output: ReleaseBinaryAttributes) => Promise<void>;
55
+ //# sourceMappingURL=binary-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-lifecycle.d.ts","sourceRoot":"","sources":["../../src/release/binary-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EACL,KAAK,UAAU,EAKhB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGvD,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EAMxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAkB,aAAa,EAAoC,MAAM,cAAc,CAAC;AAE/F,eAAO,MAAM,OAAO,yBAAyB,CAAC;AAE9C,eAAO,MAAM,MAAM,SAAU,MAAM,WAAW,MAAM,KAAG,aACe,CAAC;AAgBvE,MAAM,MAAM,OAAO,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,CAAC;AAEvF,4EAA4E;AAC5E,eAAO,MAAM,aAAa,WAChB,UAAU,SACX,kBAAkB,KACxB,OAAO,CAAC,OAAO,CAOjB,CAAC;AAOF;;;;GAIG;AACH,eAAO,MAAM,UAAU,WACb,UAAU,SACX,kBAAkB,KACxB,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAI7C,CAAC;AAEF,4FAA4F;AAC5F,eAAO,MAAM,aAAa,WAChB,UAAU,UACV,uBAAuB,KAC9B,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAG7C,CAAC;AAgCF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,yDAAyD;IACzD,QAAQ,CAAC,MAAM,CAAC,EAAE,uBAAuB,GAAG,SAAS,CAAC;IACtD,uEAAuE;IACvE,QAAQ,CAAC,IAAI,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAC/C,wFAAwF;IACxF,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,iEAAiE;IACjE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC,CAAC;AAEF,0FAA0F;AAC1F,eAAO,MAAM,eAAe,WAClB,UAAU,SACX,YAAY,SACZ,kBAAkB,YAChB,gBAAgB,KACxB,OAAO,CAAC,uBAAuB,CA2CjC,CAAC;AAEF,oGAAoG;AACpG,eAAO,MAAM,YAAY,WAAY,UAAU,UAAU,uBAAuB,KAAG,OAAO,CAAC,IAAI,CACtD,CAAC"}
@@ -0,0 +1,11 @@
1
+ import * as Effect from 'effect/Effect';
2
+ import type { HostRunner } from '../launchd/runner.ts';
3
+ type Ask = {
4
+ readonly fqn: string;
5
+ readonly instanceId: string;
6
+ readonly olds: unknown;
7
+ };
8
+ /** The file a declaration (or a row) names, as `Unowned` — or undefined when there is none. */
9
+ export declare const readWithoutState: (runner: HostRunner, ask: Ask) => Effect.Effect<import("./binary-form.ts").ReleaseBinaryAttributes | undefined, Error, never>;
10
+ export {};
11
+ //# sourceMappingURL=binary-read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-read.d.ts","sourceRoot":"","sources":["../../src/release/binary-read.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAKvD,KAAK,GAAG,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEzF,+FAA+F;AAC/F,eAAO,MAAM,gBAAgB,WAAY,UAAU,OAAO,GAAG,gGAkBzD,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * `Release.Binary` — one binary out of a pinned release archive, written onto a host and verified
3
+ * twice: the archive against its pinned SHA-256, then the binary against its own.
4
+ *
5
+ * - reconcile — validate every prop; download the archive by its exact URL; verify it; unpack ONLY
6
+ * the declared member; verify that; write it atomically through the HostRunner; read it back. A
7
+ * file already holding the pinned bytes is never downloaded again.
8
+ * - read — lstat plus the SHA-256 of the bytes; never runs the binary.
9
+ * - diff — the pins, the path, then mode and owner against the live file (binary-diff.ts).
10
+ * - replace — when the path moves (a new version is a new directory): create-before-delete.
11
+ * - delete — removes the file, never the directory.
12
+ *
13
+ * ★ VENDOR-NEUTRAL. The pinned archive arrives as props, usually from a data set beside this
14
+ * (victoria.ts) through `catalogBinary()`; nothing here knows a vendor, a package or a version.
15
+ * ⛔ IT INSTALLS; IT NEVER STARTS. No launchctl, no systemctl, no restart: the job that runs the
16
+ * binary is the stack's own `LaunchdJob`, which puts this resource's `path` in its argv so the
17
+ * engine installs first and restarts the job when the path moves.
18
+ * ⚠️ NOTHING IS ADOPTED WITHOUT `--adopt`, AT PLAN OR AT APPLY: the probe reads a file already at
19
+ * the path as `Unowned` — even one holding exactly the pinned bytes (docs/ownership.md) — and
20
+ * where the probe never ran (a prop was an Output) reconcile refuses it the same way. With
21
+ * `--adopt`, a file holding the pinned bytes is recognised by its digest and taken over without
22
+ * a download. ⛔ A file with OTHER bytes is never adopted, `--adopt` or not: that would be an
23
+ * overwrite in place that the plan prints as `adopted` (binary-claim.ts, both halves).
24
+ */
25
+ import { Resource } from 'alchemy';
26
+ import * as Provider from 'alchemy/Provider';
27
+ import * as HttpClient from 'effect/unstable/http/HttpClient';
28
+ import { HostRunnerService } from '../launchd/runner.ts';
29
+ import { type ReleaseBinaryAttributes, type ReleaseBinaryProps } from './binary-form.ts';
30
+ import { type DownloadPolicy } from './download.ts';
31
+ export type { ReleaseBinaryAttributes, ReleaseBinaryProps } from './binary-form.ts';
32
+ export interface ReleaseBinary extends Resource<'Release.Binary', ReleaseBinaryProps, ReleaseBinaryAttributes> {
33
+ }
34
+ /**
35
+ * One binary from a pinned release archive, installed onto a host and verified against digests
36
+ * the stack pins in code — the archive's, then the binary's own.
37
+ *
38
+ * ### Installing a binary
39
+ *
40
+ * The directory is declared first and passed by its `path`, which orders the two; the job that
41
+ * runs the binary references the binary's `path`, which orders the job after it.
42
+ *
43
+ * **Example:**
44
+ *
45
+ * ```ts
46
+ * const vmalertOf = { package: 'vmutils', version: '1.151.0', platform: 'darwin-arm64', binary: 'vmalert' };
47
+ * const dir = yield* HostDirectory('vmutils-1.151.0', {
48
+ * path: catalogDirectory('/opt/example/bin', vmalertOf),
49
+ * mode: 0o755,
50
+ * });
51
+ * const vmalert = yield* ReleaseBinary('vmalert', {
52
+ * ...catalogBinary(VICTORIA_RELEASES, vmalertOf),
53
+ * directory: dir.path,
54
+ * });
55
+ * // LaunchdJob(…, { programArguments: [vmalert.path, '--httpListenAddr=127.0.0.1:8880'] })
56
+ * ```
57
+ *
58
+ * @resource
59
+ */
60
+ export declare const ReleaseBinary: import("alchemy").ResourceClass<ReleaseBinary>;
61
+ /** Test seams — NOT on the barrel. Every caller outside tests uses the defaults. */
62
+ export type ReleaseBinaryInternals = {
63
+ readonly download?: DownloadPolicy;
64
+ };
65
+ export declare const makeReleaseBinaryProvider: (internals?: ReleaseBinaryInternals) => import("effect/Layer").Layer<Provider.Provider<ReleaseBinary>, never, HostRunnerService | HttpClient.HttpClient>;
66
+ /** The provider, as a stack uses it. It needs a HostRunnerService and an HttpClient. */
67
+ export declare const ReleaseBinaryProvider: () => import("effect/Layer").Layer<Provider.Provider<ReleaseBinary>, never, HostRunnerService | HttpClient.HttpClient>;
68
+ //# sourceMappingURL=binary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary.d.ts","sourceRoot":"","sources":["../../src/release/binary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,UAAU,MAAM,iCAAiC,CAAC;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAIzD,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EAExB,MAAM,kBAAkB,CAAC;AAU1B,OAAO,EAAE,KAAK,cAAc,EAAqC,MAAM,eAAe,CAAC;AAEvF,YAAY,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEpF,MAAM,WAAW,aAAc,SAAQ,QAAQ,CAC7C,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,CACxB;CAAG;AAEJ;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,aAAa,gDAA4C,CAAC;AAEvE,oFAAoF;AACpF,MAAM,MAAM,sBAAsB,GAAG;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAA;CAAE,CAAC;AAE5E,eAAO,MAAM,yBAAyB,eAAe,sBAAsB,qHAyFxE,CAAC;AAEJ,wFAAwF;AACxF,eAAO,MAAM,qBAAqB,wHAAoC,CAAC"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * A vendor's pinned releases as DATA, and the one way to turn an entry into Release.Binary props —
3
+ * or into the reasons there is none. Pure: no network, no host.
4
+ *
5
+ * ★ THE DATA SITS BESIDE THE RESOURCE, NOT INSIDE IT. A catalog (victoria.ts is the first) is the
6
+ * reviewed record of what one vendor published: exact asset names, sizes, both digest layers and
7
+ * where each was copied from. The resource takes one pinned archive as props and never reads a
8
+ * catalog, so adding a vendor is a data module with its own walk-down, never a resource change.
9
+ * ★ A VERSION THE CATALOG DOES NOT LIST IS A REFUSAL, NOT A DOWNLOAD ATTEMPT. `catalogBinary()` runs
10
+ * in the stack's own program — which `alchemy plan` evaluates — so an unknown version, a
11
+ * `-enterprise` spelling or a `v` prefix fails the plan before any resource is asked anything,
12
+ * let alone fetches a byte.
13
+ * ⛔ ADD A VENDOR ONLY AFTER ITS OWN WALK-DOWN (docs/release-binary-catalogs.md): its checksum
14
+ * format read byte-exact, and its binary's linkage measured (`otool -L`). Vendor binaries were
15
+ * measured self-contained ONLY for the five Victoria ones; that is not a property of "Go".
16
+ * ★ `computed` IS A SECOND, LESSER OWNER OF A MEMBER'S DIGEST — never the vendor's, always ours,
17
+ * for a checksum file that never lists the member at all (OpenBao: archives and SBOMs only,
18
+ * never `bao`; docs/release-binary-openbao.md is the walk-down). `checksums.signature` records
19
+ * how the checksum file's OWN authorship was checked, if a vendor publishes one to check.
20
+ */
21
+ import type { ReleaseArchive, ReleaseBinaryProps } from './binary-form.ts';
22
+ /**
23
+ * A member digest WE computed, because the vendor's checksum file never lists it — read
24
+ * checksums.ts's header before adding one: most vendors list archives only.
25
+ */
26
+ export interface ComputedDigest {
27
+ readonly sha256: string;
28
+ /** The date it was computed, from the archive whose pinned SHA-256 matched that day. */
29
+ readonly recorded: string;
30
+ }
31
+ /** How the checksum file itself was checked, beyond its own SHA-256 — openpgp today. */
32
+ export interface ChecksumSignature {
33
+ readonly kind: 'openpgp';
34
+ /** The detached signature asset's URL. */
35
+ readonly url: string;
36
+ readonly sha256: string;
37
+ /** The public key it was checked against. */
38
+ readonly key: {
39
+ readonly url: string;
40
+ readonly sha256: string;
41
+ readonly fingerprint: string;
42
+ };
43
+ /** The date `gpgv` was run, recorded once — never re-run at apply or by CI. */
44
+ readonly verified: string;
45
+ }
46
+ /** One release archive as a catalog records it: the pin, plus where every digest came from. */
47
+ export interface PinnedArchive extends ReleaseArchive {
48
+ /** Archive member → its SHA-256. Every member the vendor's checksum file lists, not just ours. */
49
+ readonly members: Readonly<Record<string, string>>;
50
+ /**
51
+ * Archive member → a digest WE computed, for a checksum file that never lists it (OpenBao's
52
+ * lists archives and SBOMs, never `bao`). ⛔ NOT A VENDOR FACT: computed from the bytes of an
53
+ * archive whose own SHA-256 already matched the pin, never filed beside `members`. A member in
54
+ * both is refused (catalogProblems) — two owners of one pin is a data-set bug, not a choice.
55
+ */
56
+ readonly computed?: Readonly<Record<string, ComputedDigest>>;
57
+ /** The checksum file the digests were copied from, its own SHA-256, and when. Never fetched. */
58
+ readonly checksums: {
59
+ readonly url: string;
60
+ readonly sha256: string;
61
+ readonly recorded: string;
62
+ /** How the checksum file's own authorship was checked, if at all. Optional: not every vendor publishes one. */
63
+ readonly signature?: ChecksumSignature;
64
+ };
65
+ }
66
+ /** One package (one archive per version and platform) of a vendor. */
67
+ export interface CatalogPackage {
68
+ /**
69
+ * Installed name → archive member, written out, never derived: a member the vendor adds is
70
+ * installable only once somebody names it here.
71
+ */
72
+ readonly binaries: Readonly<Record<string, string>>;
73
+ /** Version (as the catalog spells it) → platform (the vendor's spelling) → archive. */
74
+ readonly versions: Readonly<Record<string, Readonly<Record<string, PinnedArchive>>>>;
75
+ }
76
+ /** A vendor's pinned releases. */
77
+ export interface ReleaseCatalog {
78
+ /** Who publishes these, for refusals: `'VictoriaMetrics'`. */
79
+ readonly vendor: string;
80
+ readonly packages: Readonly<Record<string, CatalogPackage>>;
81
+ }
82
+ /** Which binary a stack asks a catalog for. */
83
+ export type CatalogRequest = {
84
+ readonly package: string;
85
+ readonly version: string;
86
+ readonly platform: string;
87
+ /** The installed name — `vmalert`, not the member `vmalert-prod`. */
88
+ readonly binary: string;
89
+ };
90
+ /** The pinned half of Release.Binary's props; the stack adds `directory`, `mode` and owner. */
91
+ export type PinnedBinary = Pick<ReleaseBinaryProps, 'archive' | 'member' | 'sha256' | 'name'>;
92
+ /** Everything wrong with a request against a catalog; empty when it resolves. */
93
+ export declare const catalogProblems: (catalog: ReleaseCatalog, request: CatalogRequest) => string[];
94
+ /**
95
+ * The pinned props for one binary out of a catalog. ⛔ Throws BinaryRefused for anything the
96
+ * catalog does not pin — in a stack program, that fails the plan before anything is fetched.
97
+ */
98
+ export declare const catalogBinary: (catalog: ReleaseCatalog, request: CatalogRequest) => PinnedBinary;
99
+ /** `<root>/<package>-<version>`: one directory per version, so an upgrade is a new path. */
100
+ export declare const catalogDirectory: (root: string, request: Pick<CatalogRequest, 'package' | 'version'>) => string;
101
+ /** What a catalog says an installed binary is, found by its SHA-256 alone. */
102
+ export type IdentifiedBinary = CatalogRequest & {
103
+ readonly vendor: string;
104
+ };
105
+ /**
106
+ * Name an installed file by its digest — never by running it. ★ IDENTITY BY SHA-256: the running
107
+ * Nix victoria-traces reports an empty version (`vm_app_version{version=""}` on /metrics, measured
108
+ * 2026-09-22 — its build sets no buildinfo), a stamped build prints `-version` to STDERR, not
109
+ * stdout (lib/buildinfo, read, not run), and executing a binary to learn what it is runs the very
110
+ * bytes whose provenance is the question. A digest needs a read, nothing more.
111
+ */
112
+ export declare const identifyBinary: (catalogs: readonly ReleaseCatalog[], sha256: string) => IdentifiedBinary | undefined;
113
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/release/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * A vendor checksum file in `sha256sum` text mode, parsed strictly — the shape every pin in
3
+ * victoria.ts was copied from.
4
+ *
5
+ * ★ WHY PARSE A FILE THE PROVIDER NEVER FETCHES. The pins are the ground truth at apply; this is
6
+ * the ground truth when a pin is WRITTEN. victoria.test.ts feeds it the exact bytes of all four
7
+ * recorded files (fixtures/victoria/, each matching GitHub's digest of that asset AS READ on the
8
+ * recorded date — no test re-reads it) and requires the catalog to equal what it reads, so a pin
9
+ * typed by hand, a line missed, or a member added by the vendor is a failing test rather than a
10
+ * trusted typo.
11
+ * ⛔ STRICT, BECAUSE THE FORMAT IS KNOWN. Measured 2026-09-22 on all four files: `sha256sum` text
12
+ * mode — `<64 lowercase hex><two spaces><name>` per line, LF endings, a trailing newline, the
13
+ * archive on line 1 and one `-prod` member per line after it. Anything else (a `*` binary-mode
14
+ * marker, CRLF, upper-case hex, a blank line, a repeated name) is a refusal: a file that no longer
15
+ * has this shape is a vendor change to read before any pin moves, not something to guess past.
16
+ * ⚠️ ONE FORMAT, MEASURED FOR ONE VENDOR. Other vendors list archives only (Prometheus, vector,
17
+ * pyroscope, OpenBao — the estate census, 2026-09-22) or publish digests in JSON (grafana.com). A
18
+ * catalog for one of them reads ITS format byte-exact first; nothing here is assumed to fit it.
19
+ */
20
+ /** Name → SHA-256, in file order. Throws, naming the line, on anything but the measured shape. */
21
+ export declare const parseChecksums: (text: string) => ReadonlyMap<string, string>;
22
+ //# sourceMappingURL=checksums.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checksums.d.ts","sourceRoot":"","sources":["../../src/release/checksums.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,kGAAkG;AAClG,eAAO,MAAM,cAAc,SAAU,MAAM,KAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAmBvE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import * as Effect from 'effect/Effect';
2
+ /** Everything wrong with the pins of the resource at `fqn` as its stack program declared them. */
3
+ export declare const declaredPinProblems: (fqn: string) => Effect.Effect<string[]>;
4
+ //# sourceMappingURL=declared-pins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"declared-pins.d.ts","sourceRoot":"","sources":["../../src/release/declared-pins.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAIxC,kGAAkG;AAClG,eAAO,MAAM,mBAAmB,QAAS,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAUpE,CAAC"}