@homeflare/alchemy 0.8.0 → 0.10.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 (240) hide show
  1. package/README.md +22 -11
  2. package/dist/caddy/config-lifecycle.d.ts +1 -1
  3. package/dist/caddy/config.d.ts.map +1 -1
  4. package/dist/caddy/index.js +221 -53
  5. package/dist/caddy/index.js.map +13 -9
  6. package/dist/launchd/fake-runner.d.ts +1 -0
  7. package/dist/launchd/fake-runner.d.ts.map +1 -1
  8. package/dist/launchd/fake-sudo.d.ts +1 -0
  9. package/dist/launchd/fake-sudo.d.ts.map +1 -1
  10. package/dist/launchd/host-effect.d.ts +9 -18
  11. package/dist/launchd/host-effect.d.ts.map +1 -1
  12. package/dist/launchd/host-file-lifecycle.d.ts +14 -1
  13. package/dist/launchd/host-file-lifecycle.d.ts.map +1 -1
  14. package/dist/launchd/host-file.d.ts +2 -1
  15. package/dist/launchd/host-file.d.ts.map +1 -1
  16. package/dist/launchd/index.js +345 -86
  17. package/dist/launchd/index.js.map +18 -12
  18. package/dist/launchd/job-lifecycle.d.ts +8 -1
  19. package/dist/launchd/job-lifecycle.d.ts.map +1 -1
  20. package/dist/launchd/job-preflight.d.ts +13 -1
  21. package/dist/launchd/job-preflight.d.ts.map +1 -1
  22. package/dist/launchd/job.d.ts +2 -1
  23. package/dist/launchd/job.d.ts.map +1 -1
  24. package/dist/launchd/runner.d.ts +7 -0
  25. package/dist/launchd/runner.d.ts.map +1 -1
  26. package/dist/launchd/sudo-acl.d.ts +25 -0
  27. package/dist/launchd/sudo-acl.d.ts.map +1 -0
  28. package/dist/launchd/sudo-guard.d.ts +31 -4
  29. package/dist/launchd/sudo-guard.d.ts.map +1 -1
  30. package/dist/launchd/sudo-runner.d.ts +3 -3
  31. package/dist/launchd/sudo-runner.d.ts.map +1 -1
  32. package/dist/launchd/sudo-said.d.ts +10 -0
  33. package/dist/launchd/sudo-said.d.ts.map +1 -0
  34. package/dist/openbao/auth-method-reconcile.d.ts +6 -2
  35. package/dist/openbao/auth-method-reconcile.d.ts.map +1 -1
  36. package/dist/openbao/auth-method.d.ts.map +1 -1
  37. package/dist/openbao/auth-role.d.ts.map +1 -1
  38. package/dist/openbao/cloudflare-role.d.ts.map +1 -1
  39. package/dist/openbao/fake-bao.d.ts +18 -0
  40. package/dist/openbao/fake-bao.d.ts.map +1 -1
  41. package/dist/openbao/fake-core.d.ts +39 -0
  42. package/dist/openbao/fake-core.d.ts.map +1 -0
  43. package/dist/openbao/fake-families.d.ts +6 -3
  44. package/dist/openbao/fake-families.d.ts.map +1 -1
  45. package/dist/openbao/fake-mounts.d.ts +16 -0
  46. package/dist/openbao/fake-mounts.d.ts.map +1 -0
  47. package/dist/openbao/fake-stack.d.ts +5 -1
  48. package/dist/openbao/fake-stack.d.ts.map +1 -1
  49. package/dist/openbao/index.js +541 -270
  50. package/dist/openbao/index.js.map +26 -21
  51. package/dist/openbao/jwt-config.d.ts.map +1 -1
  52. package/dist/openbao/jwt-role.d.ts.map +1 -1
  53. package/dist/openbao/kubernetes-role.d.ts.map +1 -1
  54. package/dist/openbao/mfa-enforcement.d.ts +6 -2
  55. package/dist/openbao/mfa-enforcement.d.ts.map +1 -1
  56. package/dist/openbao/mfa-totp.d.ts +6 -2
  57. package/dist/openbao/mfa-totp.d.ts.map +1 -1
  58. package/dist/openbao/mount-reconcile.d.ts +5 -1
  59. package/dist/openbao/mount-reconcile.d.ts.map +1 -1
  60. package/dist/openbao/mount.d.ts.map +1 -1
  61. package/dist/openbao/pki-role.d.ts.map +1 -1
  62. package/dist/openbao/plugin-reconcile.d.ts +6 -2
  63. package/dist/openbao/plugin-reconcile.d.ts.map +1 -1
  64. package/dist/openbao/plugin.d.ts.map +1 -1
  65. package/dist/openbao/policy.d.ts.map +1 -1
  66. package/dist/openbao/proxmox-role.d.ts.map +1 -1
  67. package/dist/openbao/role-reconcile.d.ts +11 -1
  68. package/dist/openbao/role-reconcile.d.ts.map +1 -1
  69. package/dist/openbao/ssh-role.d.ts.map +1 -1
  70. package/dist/ownership/adopt.d.ts +52 -0
  71. package/dist/ownership/adopt.d.ts.map +1 -0
  72. package/dist/ownership/probe.d.ts +13 -0
  73. package/dist/ownership/probe.d.ts.map +1 -0
  74. package/dist/ownership/resume.d.ts +40 -0
  75. package/dist/ownership/resume.d.ts.map +1 -0
  76. package/dist/ownership/rows.d.ts +33 -0
  77. package/dist/ownership/rows.d.ts.map +1 -0
  78. package/dist/ownership/whole.d.ts +14 -0
  79. package/dist/ownership/whole.d.ts.map +1 -0
  80. package/dist/proxmox/ceph-pool-form.d.ts +3 -3
  81. package/dist/proxmox/ceph-pool.d.ts.map +1 -1
  82. package/dist/proxmox/fake-bao-env.d.ts +3 -0
  83. package/dist/proxmox/fake-bao-env.d.ts.map +1 -0
  84. package/dist/proxmox/fake-pve-lxc.d.ts +42 -0
  85. package/dist/proxmox/fake-pve-lxc.d.ts.map +1 -0
  86. package/dist/proxmox/fake-pve.d.ts +38 -0
  87. package/dist/proxmox/fake-pve.d.ts.map +1 -0
  88. package/dist/proxmox/index.d.ts +6 -2
  89. package/dist/proxmox/index.d.ts.map +1 -1
  90. package/dist/proxmox/index.js +970 -186
  91. package/dist/proxmox/index.js.map +22 -9
  92. package/dist/proxmox/lxc-create-form.d.ts +6 -0
  93. package/dist/proxmox/lxc-create-form.d.ts.map +1 -0
  94. package/dist/proxmox/lxc-harness.d.ts +34 -0
  95. package/dist/proxmox/lxc-harness.d.ts.map +1 -0
  96. package/dist/proxmox/lxc-identity.d.ts +18 -0
  97. package/dist/proxmox/lxc-identity.d.ts.map +1 -0
  98. package/dist/proxmox/lxc-judge.d.ts +46 -0
  99. package/dist/proxmox/lxc-judge.d.ts.map +1 -0
  100. package/dist/proxmox/lxc-lifecycle.d.ts +68 -0
  101. package/dist/proxmox/lxc-lifecycle.d.ts.map +1 -0
  102. package/dist/proxmox/lxc-props.d.ts +139 -0
  103. package/dist/proxmox/lxc-props.d.ts.map +1 -0
  104. package/dist/proxmox/lxc-volume.d.ts +29 -0
  105. package/dist/proxmox/lxc-volume.d.ts.map +1 -0
  106. package/dist/proxmox/lxc-wire.d.ts +51 -0
  107. package/dist/proxmox/lxc-wire.d.ts.map +1 -0
  108. package/dist/proxmox/lxc.d.ts +27 -47
  109. package/dist/proxmox/lxc.d.ts.map +1 -1
  110. package/dist/proxmox/network-apply-read.d.ts +1 -1
  111. package/dist/proxmox/network-apply-read.d.ts.map +1 -1
  112. package/dist/proxmox/pbs-datastore.d.ts.map +1 -1
  113. package/dist/proxmox/resource.d.ts.map +1 -1
  114. package/dist/proxmox/update-guard.d.ts +27 -0
  115. package/dist/proxmox/update-guard.d.ts.map +1 -0
  116. package/dist/verify/args.d.ts +16 -0
  117. package/dist/verify/args.d.ts.map +1 -0
  118. package/dist/verify/cli.d.ts +3 -0
  119. package/dist/verify/cli.d.ts.map +1 -0
  120. package/dist/verify/cli.js +320 -0
  121. package/dist/verify/cli.js.map +15 -0
  122. package/dist/verify/fake-engine.d.ts +57 -0
  123. package/dist/verify/fake-engine.d.ts.map +1 -0
  124. package/dist/verify/index.d.ts +16 -0
  125. package/dist/verify/index.d.ts.map +1 -0
  126. package/dist/verify/index.js +297 -0
  127. package/dist/verify/index.js.map +14 -0
  128. package/dist/verify/report.d.ts +6 -0
  129. package/dist/verify/report.d.ts.map +1 -0
  130. package/dist/verify/rows.d.ts +57 -0
  131. package/dist/verify/rows.d.ts.map +1 -0
  132. package/dist/verify/spy.d.ts +31 -0
  133. package/dist/verify/spy.d.ts.map +1 -0
  134. package/dist/verify/verify.d.ts +43 -0
  135. package/dist/verify/verify.d.ts.map +1 -0
  136. package/docs/adopt-verify.md +108 -0
  137. package/docs/adopted-deploys.md +85 -0
  138. package/docs/credentials.md +15 -0
  139. package/docs/launchd-sudo.md +31 -6
  140. package/docs/launchd.md +7 -3
  141. package/docs/ownership.md +113 -0
  142. package/docs/proxmox-lxc.md +196 -0
  143. package/docs/proxmox.md +12 -0
  144. package/package.json +9 -2
  145. package/src/caddy/adopt-scope.test.ts +1 -1
  146. package/src/caddy/config-lifecycle.ts +1 -1
  147. package/src/caddy/config.ts +2 -1
  148. package/src/launchd/adopt-apply.test.ts +166 -0
  149. package/src/launchd/fake-runner.ts +26 -4
  150. package/src/launchd/host-effect.ts +1 -33
  151. package/src/launchd/host-file-lifecycle.ts +39 -14
  152. package/src/launchd/host-file.ts +13 -4
  153. package/src/launchd/job-lifecycle.ts +22 -14
  154. package/src/launchd/job-preflight.ts +18 -1
  155. package/src/launchd/job.ts +13 -4
  156. package/src/launchd/runner.ts +7 -0
  157. package/src/launchd/sudo-acl.ts +68 -0
  158. package/src/launchd/sudo-chain.test.ts +121 -0
  159. package/src/launchd/sudo-guard.ts +89 -10
  160. package/src/launchd/sudo-modes.test.ts +135 -0
  161. package/src/launchd/sudo-runner.ts +40 -59
  162. package/src/launchd/sudo-said.ts +58 -0
  163. package/src/openbao/README.md +5 -2
  164. package/src/openbao/REPLACE.md +13 -11
  165. package/src/openbao/adopt-core.test.ts +119 -0
  166. package/src/openbao/adopt-families.test.ts +97 -0
  167. package/src/openbao/adopt-holes.test.ts +168 -0
  168. package/src/openbao/adopt-recovery.test.ts +71 -0
  169. package/src/openbao/auth-method-reconcile.ts +15 -3
  170. package/src/openbao/auth-method.ts +15 -6
  171. package/src/openbao/auth-role.ts +14 -4
  172. package/src/openbao/cloudflare-role.ts +17 -4
  173. package/src/openbao/fake-bao.ts +52 -0
  174. package/src/openbao/fake-core.ts +141 -0
  175. package/src/openbao/fake-families.ts +11 -5
  176. package/src/openbao/fake-mounts.ts +74 -0
  177. package/src/openbao/fake-stack.ts +17 -4
  178. package/src/openbao/jwt-config.ts +10 -7
  179. package/src/openbao/jwt-role.ts +10 -7
  180. package/src/openbao/kubernetes-role.ts +13 -7
  181. package/src/openbao/mfa-enforcement.ts +20 -6
  182. package/src/openbao/mfa-totp.ts +22 -7
  183. package/src/openbao/mount-move.test.ts +2 -35
  184. package/src/openbao/mount-reconcile.ts +13 -2
  185. package/src/openbao/mount.ts +15 -6
  186. package/src/openbao/pki-role.ts +15 -4
  187. package/src/openbao/plugin-reconcile.ts +16 -5
  188. package/src/openbao/plugin.ts +17 -6
  189. package/src/openbao/policy.ts +17 -4
  190. package/src/openbao/proxmox-role.ts +13 -4
  191. package/src/openbao/rename-adoption.test.ts +32 -19
  192. package/src/openbao/role-reconcile.ts +23 -0
  193. package/src/openbao/ssh-role.ts +14 -4
  194. package/src/ownership/adopt.ts +122 -0
  195. package/src/ownership/ownership.test.ts +200 -0
  196. package/src/ownership/probe.ts +65 -0
  197. package/src/ownership/resume.ts +118 -0
  198. package/src/ownership/rows.ts +117 -0
  199. package/src/ownership/whole.test.ts +39 -0
  200. package/src/ownership/whole.ts +60 -0
  201. package/src/proxmox/adopt-noop.test.ts +112 -0
  202. package/src/proxmox/ceph-pool-adopt.test.ts +88 -0
  203. package/src/proxmox/ceph-pool-form.ts +3 -3
  204. package/src/proxmox/ceph-pool.ts +10 -3
  205. package/src/proxmox/fake-bao-env.ts +28 -0
  206. package/src/proxmox/fake-pve-lxc.ts +210 -0
  207. package/src/proxmox/fake-pve.ts +75 -0
  208. package/src/proxmox/index.test.ts +6 -6
  209. package/src/proxmox/index.ts +6 -2
  210. package/src/proxmox/lxc-adopt.test.ts +170 -0
  211. package/src/proxmox/lxc-create-form.ts +76 -0
  212. package/src/proxmox/lxc-create.test.ts +126 -0
  213. package/src/proxmox/lxc-guards.test.ts +158 -0
  214. package/src/proxmox/lxc-harness.ts +150 -0
  215. package/src/proxmox/lxc-identity.ts +43 -0
  216. package/src/proxmox/lxc-judge.test.ts +175 -0
  217. package/src/proxmox/lxc-judge.ts +196 -0
  218. package/src/proxmox/lxc-lifecycle.ts +200 -0
  219. package/src/proxmox/lxc-ownership.test.ts +159 -0
  220. package/src/proxmox/lxc-props.ts +215 -0
  221. package/src/proxmox/lxc-read.test.ts +60 -0
  222. package/src/proxmox/lxc-volume.test.ts +96 -0
  223. package/src/proxmox/lxc-volume.ts +153 -0
  224. package/src/proxmox/lxc-wire.ts +210 -0
  225. package/src/proxmox/lxc.ts +216 -93
  226. package/src/proxmox/network-apply-read.ts +3 -1
  227. package/src/proxmox/pbs-datastore.ts +4 -3
  228. package/src/proxmox/resource.ts +7 -7
  229. package/src/proxmox/update-guard.ts +31 -0
  230. package/src/verify/args.ts +82 -0
  231. package/src/verify/cli.test.ts +86 -0
  232. package/src/verify/cli.ts +49 -0
  233. package/src/verify/fake-engine.ts +158 -0
  234. package/src/verify/index.ts +36 -0
  235. package/src/verify/report.ts +52 -0
  236. package/src/verify/rows.ts +169 -0
  237. package/src/verify/spy.test.ts +141 -0
  238. package/src/verify/spy.ts +149 -0
  239. package/src/verify/verify.test.ts +124 -0
  240. package/src/verify/verify.ts +172 -0
@@ -28,7 +28,14 @@ export declare const readJob: (runner: HostRunner, props: Identity) => Promise<L
28
28
  */
29
29
  export declare const replaceDiff: (runner: HostRunner, next: Identity, full: LaunchdJobProps | undefined, output: LaunchdJobAttributes) => Promise<Diff>;
30
30
  export declare const diffJob: (runner: HostRunner, news: LaunchdJobProps, output: LaunchdJobAttributes) => Promise<Diff>;
31
- export declare const reconcileJob: (runner: HostRunner, props: LaunchdJobProps, output: LaunchdJobAttributes | undefined) => Promise<LaunchdJobAttributes>;
31
+ /**
32
+ * `adopt` is whether adoption is on AND this apply is a create or an unfinished generation of our
33
+ * own (ownership/adopt.ts adoptsAtApply): it lets such a generation take over a job already on the
34
+ * host, as the plan's probe would have. A rename onto an occupied label stays refused, as it is at
35
+ * plan time (assertReplaceable) — including a label taken between that plan and a fresh replace's
36
+ * new generation, which the caller never marks adoptable.
37
+ */
38
+ export declare const reconcileJob: (runner: HostRunner, props: LaunchdJobProps, output: LaunchdJobAttributes | undefined, adopt?: boolean) => Promise<LaunchdJobAttributes>;
32
39
  /** Boot out, then remove the plist. Idempotent: an absent job and an absent file are success. */
33
40
  export declare const deleteJob: (runner: HostRunner, output: LaunchdJobAttributes) => Promise<void>;
34
41
  //# sourceMappingURL=job-lifecycle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"job-lifecycle.d.ts","sourceRoot":"","sources":["../../src/launchd/job-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,eAAe,EAIrB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,KAAK,QAAQ,EASd,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAmB9C,uGAAuG;AACvG,eAAO,MAAM,OAAO,WACV,UAAU,SACX,QAAQ,KACd,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAM1C,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,WACd,UAAU,QACZ,QAAQ,QACR,eAAe,GAAG,SAAS,UACzB,oBAAoB,KAC3B,OAAO,CAAC,IAAI,CAMd,CAAC;AAEF,eAAO,MAAM,OAAO,WACV,UAAU,QACZ,eAAe,UACb,oBAAoB,KAC3B,OAAO,CAAC,IAAI,CAad,CAAC;AAEF,eAAO,MAAM,YAAY,WACf,UAAU,SACX,eAAe,UACd,oBAAoB,GAAG,SAAS,KACvC,OAAO,CAAC,oBAAoB,CAsE9B,CAAC;AAEF,iGAAiG;AACjG,eAAO,MAAM,SAAS,WACZ,UAAU,UACV,oBAAoB,KAC3B,OAAO,CAAC,IAAI,CAQd,CAAC"}
1
+ {"version":3,"file":"job-lifecycle.d.ts","sourceRoot":"","sources":["../../src/launchd/job-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,eAAe,EAIrB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,KAAK,QAAQ,EAWd,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAmB9C,uGAAuG;AACvG,eAAO,MAAM,OAAO,WACV,UAAU,SACX,QAAQ,KACd,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAM1C,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,WACd,UAAU,QACZ,QAAQ,QACR,eAAe,GAAG,SAAS,UACzB,oBAAoB,KAC3B,OAAO,CAAC,IAAI,CAMd,CAAC;AAEF,eAAO,MAAM,OAAO,WACV,UAAU,QACZ,eAAe,UACb,oBAAoB,KAC3B,OAAO,CAAC,IAAI,CAiBd,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,WACf,UAAU,SACX,eAAe,UACd,oBAAoB,GAAG,SAAS,sBAEvC,OAAO,CAAC,oBAAoB,CAgE9B,CAAC;AAEF,iGAAiG;AACjG,eAAO,MAAM,SAAS,WACZ,UAAU,UACV,oBAAoB,KAC3B,OAAO,CAAC,IAAI,CAQd,CAAC"}
@@ -12,13 +12,25 @@
12
12
  */
13
13
  import { type LaunchdJobAttributes, type LaunchdJobProps, type ParsedDomain } from './job-form.ts';
14
14
  import { type ServiceStatus } from './launchctl.ts';
15
- import { type HostRunner } from './runner.ts';
15
+ import { type HostRunner, type WriteOptions } from './runner.ts';
16
16
  export type Location = {
17
17
  readonly domain: ParsedDomain;
18
18
  readonly plistPath: string;
19
19
  readonly target: string;
20
20
  };
21
21
  export type Identity = Pick<LaunchdJobProps, 'label' | 'domain'>;
22
+ /**
23
+ * ⚠️ launchd refuses a daemon plist that is not root:wheel or is group/world-writable ("bad
24
+ * ownership/permissions"), so the system domain always writes 0644 root:wheel. An agent's plist
25
+ * belongs to its user. REASONED from launchd's documented behaviour, not measured here (no
26
+ * bootstrap was run to write this); the nix-darwin daemons on the reference host are 0644 root.
27
+ */
28
+ export declare const plistWriteOptions: (domain: ParsedDomain) => WriteOptions;
29
+ /**
30
+ * PLAN TIME, for a plan that will write the plist: the runner's own pre-write refusals
31
+ * (HostRunner.checkWrite — sudoRunner's directory and mode checks), reading only.
32
+ */
33
+ export declare const checkPlistWrite: (runner: HostRunner, location: Location) => Promise<void>;
22
34
  export declare const refuse: (label: string, message: string) => Error;
23
35
  /** Throw every refusal at once, so one plan shows the whole list. */
24
36
  export declare const assertValid: (props: LaunchdJobProps) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"job-preflight.d.ts","sourceRoot":"","sources":["../../src/launchd/job-preflight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,YAAY,EAKlB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,KAAK,aAAa,EAA4B,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,KAAK,UAAU,EAAgB,MAAM,aAAa,CAAC;AAE5D,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,QAAQ,CAAC,CAAC;AAEjE,eAAO,MAAM,MAAM,UAAW,MAAM,WAAW,MAAM,KAAG,KACT,CAAC;AAEhD,qEAAqE;AACrE,eAAO,MAAM,WAAW,UAAW,eAAe,KAAG,IAGpD,CAAC;AAEF,eAAO,MAAM,MAAM,WAAkB,UAAU,SAAS,QAAQ,KAAG,OAAO,CAAC,QAAQ,CAUlF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,WAAY,UAAU,SAAS,MAAM,UAAU,YAAY,KAAG,IAiBxF,CAAC;AAEF,2FAA2F;AAC3F,eAAO,MAAM,SAAS,WACZ,UAAU,SACX,QAAQ,KACd,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAwBvD,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,WAClB,UAAU,SACX,MAAM,YACH,QAAQ,UACV,aAAa,kBACL,MAAM,GAAG,SAAS,KACjC,OAAO,CAAC,IAAI,CAWd,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,WACpB,UAAU,QACZ,QAAQ,QACR,eAAe,GAAG,SAAS,OAC5B,oBAAoB,kBACT,MAAM,GAAG,SAAS,KACjC,OAAO,CAAC,IAAI,CAQd,CAAC"}
1
+ {"version":3,"file":"job-preflight.d.ts","sourceRoot":"","sources":["../../src/launchd/job-preflight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,YAAY,EAKlB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,KAAK,aAAa,EAA4B,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAgB,MAAM,aAAa,CAAC;AAE/E,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,QAAQ,CAAC,CAAC;AAEjE;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,WAAY,YAAY,KAAG,YACsC,CAAC;AAEhG;;;GAGG;AACH,eAAO,MAAM,eAAe,WAAkB,UAAU,YAAY,QAAQ,KAAG,OAAO,CAAC,IAAI,CACd,CAAC;AAE9E,eAAO,MAAM,MAAM,UAAW,MAAM,WAAW,MAAM,KAAG,KACT,CAAC;AAEhD,qEAAqE;AACrE,eAAO,MAAM,WAAW,UAAW,eAAe,KAAG,IAGpD,CAAC;AAEF,eAAO,MAAM,MAAM,WAAkB,UAAU,SAAS,QAAQ,KAAG,OAAO,CAAC,QAAQ,CAUlF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,WAAY,UAAU,SAAS,MAAM,UAAU,YAAY,KAAG,IAiBxF,CAAC;AAEF,2FAA2F;AAC3F,eAAO,MAAM,SAAS,WACZ,UAAU,SACX,QAAQ,KACd,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAwBvD,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,WAClB,UAAU,SACX,MAAM,YACH,QAAQ,UACV,aAAa,kBACL,MAAM,GAAG,SAAS,KACjC,OAAO,CAAC,IAAI,CAWd,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,WACpB,UAAU,QACZ,QAAQ,QACR,eAAe,GAAG,SAAS,OAC5B,oBAAoB,kBACT,MAAM,GAAG,SAAS,KACjC,OAAO,CAAC,IAAI,CASd,CAAC"}
@@ -18,7 +18,8 @@
18
18
  * ⛔ ENVIRONMENT IS NON-SECRET ONLY — see the ⛔ on LaunchdJobProps.environment.
19
19
  * ⛔ NO SILENT SUDO — see assertMayWrite in job-preflight.ts.
20
20
  * ⚠️ NOTHING IS ADOPTED WITHOUT `--adopt`. A label already loaded, or a plist already on disk, reads
21
- * as `Unowned`, so Alchemy refuses to take it over unless asked. Labels under `org.nixos.`,
21
+ * as `Unowned`, so Alchemy refuses to take it over unless asked — and reconcile, where the plan
22
+ * never asked, honours the same `--adopt` / `adopt(…)` (docs/ownership.md). Labels under `org.nixos.`,
22
23
  * `com.apple.` and `homebrew.mxcl.` are refused outright (job-validate.ts) — declare a new label
23
24
  * and cut over instead (docs/launchd.md).
24
25
  */
@@ -1 +1 @@
1
- {"version":3,"file":"job.d.ts","sourceRoot":"","sources":["../../src/launchd/job.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAG7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,YAAY,EACV,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,oBAAoB,EACpB,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,UAAW,SAAQ,QAAQ,CAC1C,aAAa,EACb,eAAe,EACf,oBAAoB,CACrB;CAAG;AAEJ,eAAO,MAAM,UAAU,6CAAsC,CAAC;AAE9D,eAAO,MAAM,kBAAkB,6FA6C5B,CAAC"}
1
+ {"version":3,"file":"job.d.ts","sourceRoot":"","sources":["../../src/launchd/job.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAK7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,YAAY,EACV,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,oBAAoB,EACpB,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,UAAW,SAAQ,QAAQ,CAC1C,aAAa,EACb,eAAe,EACf,oBAAoB,CACrB;CAAG;AAEJ,eAAO,MAAM,UAAU,6CAAsC,CAAC;AAE9D,eAAO,MAAM,kBAAkB,6FAmD5B,CAAC"}
@@ -72,6 +72,13 @@ export interface HostRunner {
72
72
  * ⚠️ The parent directory must exist; creating it would invent an owner and mode nobody declared.
73
73
  */
74
74
  writeFileAtomic(path: string, bytes: Uint8Array, options: WriteOptions): Promise<void>;
75
+ /**
76
+ * PLAN TIME: refuse, reading only and writing nothing, a write this runner would refuse at
77
+ * apply — so the plan shows it before any resource is applied. Optional: a runner without it
78
+ * refuses at the write. ★ sudoRunner implements it with the checks it makes before `sudo -n`;
79
+ * ⛔ it never elevates, so a plan still never calls sudo.
80
+ */
81
+ checkWrite?(path: string, options: WriteOptions): Promise<void>;
75
82
  /** Remove a file. Idempotent: nothing at `path` is success. */
76
83
  removeFile(path: string): Promise<void>;
77
84
  /** A user by name or numeric id, or `undefined` when the host has none. */
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/launchd/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,sGAAsG;AACtG,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;IAC1D,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,uFAAuF;IACvF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7F,MAAM,WAAW,UAAU;IACzB;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,sDAAsD;IACtD,YAAY,IAAI,MAAM,CAAC;IACvB,4DAA4D;IAC5D,IAAI,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACnD,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IACxD,uDAAuD;IACvD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;IAClD;;;;OAIG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvF,+DAA+D;IAC/D,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,2EAA2E;IAC3E,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;IAC5D,kFAAkF;IAClF,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC3D,gFAAgF;IAChF,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;;AAED,uEAAuE;AACvE,qBAAa,iBAAkB,SAAQ,sBAEtC;CAAG;AAEJ,0FAA0F;AAC1F,eAAO,MAAM,eAAe,WAAY,UAAU,KAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,CACxC,CAAC;AAE3C,oFAAoF;AACpF,eAAO,MAAM,YAAY,WAAY,UAAU,KAAG,OACA,CAAC"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/launchd/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,sGAAsG;AACtG,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;IAC1D,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,uFAAuF;IACvF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7F,MAAM,WAAW,UAAU;IACzB;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,sDAAsD;IACtD,YAAY,IAAI,MAAM,CAAC;IACvB,4DAA4D;IAC5D,IAAI,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACnD,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IACxD,uDAAuD;IACvD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;IAClD;;;;OAIG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvF;;;;;OAKG;IACH,UAAU,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,+DAA+D;IAC/D,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,2EAA2E;IAC3E,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;IAC5D,kFAAkF;IAClF,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC3D,gFAAgF;IAChF,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;;AAED,uEAAuE;AACvE,qBAAa,iBAAkB,SAAQ,sBAEtC;CAAG;AAEJ,0FAA0F;AAC1F,eAAO,MAAM,eAAe,WAAY,UAAU,KAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,CACxC,CAAC;AAE3C,oFAAoF;AACpF,eAAO,MAAM,YAAY,WAAY,UAAU,KAAG,OACA,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The ACL half of sudo-guard.ts: mode bits say a directory is root's alone, and an ACL can say
3
+ * otherwise. On macOS an `allow add_file,add_subdirectory,delete_child` entry lets its holder swap
4
+ * what lies under a root-owned `0755` directory — a symlink where the file was — between the
5
+ * guard's lstat checks and the privileged call, exactly as group write would. An inheritable
6
+ * `allow write` hands every file root installs there to its holder.
7
+ *
8
+ * ★ READ WITH `ls -lden`, AS THE OPERATOR — no sudo, and the same read at plan time and before the
9
+ * write. MEASURED 2026-09-21 on macOS 27.2: each entry prints on its own line after the path's,
10
+ * as ` 0: <qualifier> [inherited ]allow|deny <perms>`; `-n` makes the qualifier a UUID, never a
11
+ * name with a space in it. The `+` flag after the mode is NOT reliable — `@` (extended
12
+ * attributes) replaces it in the listing — so the entries are what is read.
13
+ * ⚠️ A DENY ENTRY GRANTS NOTHING (macOS puts `everyone deny delete` on home folders), and an allow
14
+ * of read-only rights (`list`, `search`, `readattr` …) swaps nothing, so neither refuses.
15
+ */
16
+ import type { HostRunner } from './runner.ts';
17
+ export declare const LS = "/bin/ls";
18
+ /** The allow entries in `ls -lden` output that grant a write right, as printed. */
19
+ export declare const aclGrants: (listing: string) => string[];
20
+ /**
21
+ * ⛔ Refuse when any directory in `chain` carries an ACL entry that lets someone write it, or when
22
+ * the ACLs cannot be read at all (fail closed). `path` names the file in the refusal.
23
+ */
24
+ export declare const assertNoAclGrants: (base: HostRunner, path: string, chain: readonly string[]) => Promise<void>;
25
+ //# sourceMappingURL=sudo-acl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sudo-acl.d.ts","sourceRoot":"","sources":["../../src/launchd/sudo-acl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,eAAO,MAAM,EAAE,YAAY,CAAC;AAgB5B,mFAAmF;AACnF,eAAO,MAAM,SAAS,YAAa,MAAM,KAAG,MAAM,EAOnB,CAAC;AAEhC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,SACtB,UAAU,QACV,MAAM,SACL,SAAS,MAAM,EAAE,KACvB,OAAO,CAAC,IAAI,CAed,CAAC"}
@@ -5,14 +5,26 @@
5
5
  * ⛔ WHAT IS LOGGED IS WHAT IS WRITTEN. A symlinked directory under a prefix would make
6
6
  * `install` or `rm`, running as root, act on a path the log never named. So every directory
7
7
  * between the prefix and the file must be a real directory.
8
- * ⚠️ These checks run before the privileged call, so they guard against a mistaken declaration, not
9
- * against someone who can already write inside a prefix and swap a path in between. The prefix
10
- * itself is checked to be root-only (prefixProblem); a directory BELOW it that another user owns
11
- * is not, and that user could swap what lies under it in that window.
8
+ * ⛔ EVERY DIRECTORY FROM THE PREFIX DOWN IS ROOT'S ALONE (decided 2026-09-21). A directory below
9
+ * the prefix that another user owns, or that group or other may write, lets that user swap what
10
+ * lies under it — a symlink where the file was — between these checks and the privileged call.
11
+ * So each one must be owned by root and not group/other-writable (rootOnlyProblem), exactly as
12
+ * the prefix itself must.
13
+ * ⛔ AND EVERY DIRECTORY ABOVE THE PREFIX (red team, 2026-09-21). Whoever may write the prefix's
14
+ * parent may rename the prefix away and put a symlink in its place between these checks and the
15
+ * privileged call — the same swap one level up. So `/` down to the prefix's parent must be
16
+ * root-only too (a root-owned symlink among them, `/etc` -> `private/etc`, is root's own and is
17
+ * followed; its target is root's choice, and not walked).
18
+ * ⛔ AND NO ACL THAT SAYS OTHERWISE (sudo-acl.ts): mode bits are not the whole answer on macOS.
19
+ * ⚠️ These checks run before the privileged call, as the deploying user. They guard against a
20
+ * mistaken declaration and against every user but root; root itself could still change a path
21
+ * in that window.
12
22
  */
13
23
  import type { HostRunner, WriteOptions } from './runner.ts';
14
24
  /** The directories strictly between `prefix` and the file at `path`. */
15
25
  export declare const betweenDirs: (prefix: string, path: string) => string[];
26
+ /** The directories strictly above `prefix`: `/`, then each one down to the prefix's parent. */
27
+ export declare const aboveDirs: (prefix: string) => string[];
16
28
  /**
17
29
  * What must be at `path` itself: a regular file, or (for a write or a remove) nothing yet.
18
30
  * ⚠️ A DIRECTORY AT THE DESTINATION IS THE TRAP: `install src dir` copies INTO the directory
@@ -24,6 +36,21 @@ export type Expect = 'file' | 'file-or-absent';
24
36
  * prefix and `path`, and anything but a file at it.
25
37
  */
26
38
  export declare const assertPlainPath: (base: HostRunner, prefix: string, path: string, expect: Expect) => Promise<'file' | 'absent'>;
39
+ /**
40
+ * ⛔ A ROOT-OWNED FILE UNDER A PREFIX IS ROOT'S TO CHANGE, AND ONLY ROOT'S (decided 2026-09-21).
41
+ * Group- or world-writable, anyone in that class rewrites a file root installed — a daemon's
42
+ * config, a script a LaunchDaemon runs as root — which is root by another name. Setuid or setgid,
43
+ * it runs as root (or its group) for whoever executes it. install(1) would apply either, as root.
44
+ * ★ Root-owned is an omitted owner (the runner installs as root under a prefix) or uid 0. A file
45
+ * handed to another user is that user's to change; the sticky bit changes nothing on a file.
46
+ */
47
+ export declare const modeProblem: (options: WriteOptions) => string | undefined;
48
+ /**
49
+ * Every check a write under `prefix` meets before anything is staged or run as root: the mode, the
50
+ * path (assertPlainPath) and the read-back (assertReadableBack). ★ Reads only, as the deploying
51
+ * user — so sudoRunner's `checkWrite` runs it at PLAN time too, and a plan still never calls sudo.
52
+ */
53
+ export declare const assertInstallable: (base: HostRunner, prefix: string, path: string, options: WriteOptions, groups: readonly number[] | undefined) => Promise<void>;
27
54
  /**
28
55
  * POSIX read permission for one uid: owner class, else group class, else other. `undefined` when
29
56
  * only group membership could decide and the groups are unknown.
@@ -1 +1 @@
1
- {"version":3,"file":"sudo-guard.d.ts","sourceRoot":"","sources":["../../src/launchd/sudo-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAY,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMtE,wEAAwE;AACxE,eAAO,MAAM,WAAW,WAAY,MAAM,QAAQ,MAAM,KAAG,MAAM,EAMhE,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,gBAAgB,CAAC;AAuB/C;;;GAGG;AACH,eAAO,MAAM,eAAe,SACpB,UAAU,UACR,MAAM,QACR,MAAM,UACJ,MAAM,KACb,OAAO,CAAC,MAAM,GAAG,QAAQ,CAwB3B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,OAAO,SACZ;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,OACtE,MAAM,UACH,SAAS,MAAM,EAAE,GAAG,SAAS,KACpC,OAAO,GAAG,SASZ,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,SACvB,UAAU,QACV,MAAM,WACH,YAAY,UACb,SAAS,MAAM,EAAE,GAAG,SAAS,KACpC,OAAO,CAAC,IAAI,CAYd,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,SAAgB,UAAU,KAAG,OAAO,CAAC,SAAS,MAAM,EAAE,GAAG,SAAS,CAI5F,CAAC"}
1
+ {"version":3,"file":"sudo-guard.d.ts","sourceRoot":"","sources":["../../src/launchd/sudo-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,EAAY,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOtE,wEAAwE;AACxE,eAAO,MAAM,WAAW,WAAY,MAAM,QAAQ,MAAM,KAAG,MAAM,EAMhE,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,SAAS,WAAY,MAAM,KAAG,MAAM,EAGhD,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,gBAAgB,CAAC;AAuB/C;;;GAGG;AACH,eAAO,MAAM,eAAe,SACpB,UAAU,UACR,MAAM,QACR,MAAM,UACJ,MAAM,KACb,OAAO,CAAC,MAAM,GAAG,QAAQ,CA6C3B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,YAAa,YAAY,KAAG,MAAM,GAAG,SAO5D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,SACtB,UAAU,UACR,MAAM,QACR,MAAM,WACH,YAAY,UACb,SAAS,MAAM,EAAE,GAAG,SAAS,KACpC,OAAO,CAAC,IAAI,CAWd,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,OAAO,SACZ;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,OACtE,MAAM,UACH,SAAS,MAAM,EAAE,GAAG,SAAS,KACpC,OAAO,GAAG,SASZ,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,SACvB,UAAU,QACV,MAAM,WACH,YAAY,UACb,SAAS,MAAM,EAAE,GAAG,SAAS,KACpC,OAAO,CAAC,IAAI,CAYd,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,SAAgB,UAAU,KAAG,OAAO,CAAC,SAAS,MAAM,EAAE,GAAG,SAAS,CAI5F,CAAC"}
@@ -21,9 +21,9 @@
21
21
  * ★ `install -S`: install(1) on macOS 27.2 (read 2026-09-21) always writes a temp file in the
22
22
  * target directory and renames it, so the file is never torn, and -S adds the fsync that
23
23
  * localRunner's `handle.sync()` does.
24
- * ⚠️ REASONED, NOT MEASURED: sudo's failure text. The kit never runs sudo. The strings below follow
25
- * sudoers(5) for sudo 1.9.17p2 on macOS 27.2 ("a password is required": -n was given but a
26
- * password was needed) and sudo(8) (sudo exits 1 when it fails itself).
24
+ * ⚠️ REASONED, NOT MEASURED: sudo's failure text (sudo-said.ts has the strings and their sources).
25
+ * ⛔ EVERY CHECK BEFORE SUDO ALSO RUNS AT PLAN TIME (`checkWrite`, 2026-09-21): the mode, the
26
+ * directories from the prefix down, the read-back. Reads only, as the operator — never sudo.
27
27
  */
28
28
  import { type LocalRunnerOptions } from './local-runner.ts';
29
29
  import type { HostRunner } from './runner.ts';
@@ -1 +1 @@
1
- {"version":3,"file":"sudo-runner.d.ts","sourceRoot":"","sources":["../../src/launchd/sudo-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,KAAK,kBAAkB,EAA0B,MAAM,mBAAmB,CAAC;AACpF,OAAO,KAAK,EAAc,UAAU,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAIL,gBAAgB,EAMjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,iBAAiB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B,MAAM,MAAM,iBAAiB,GAAG,kBAAkB,GAAG;IACnD;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,uFAAuF;IACvF,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF,iGAAiG;AACjG,MAAM,MAAM,QAAQ,GAAG;IACrB,gFAAgF;IAChF,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,sFAAsF;IACtF,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IAC9D,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC,CAAC;AA2BF,eAAO,MAAM,cAAc,eAAgB,SAAS,MAAM,EAAE,QAAQ,QAAQ,KAAG,UA2H9E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,YAAa,iBAAiB,KAAG,UAYvD,CAAC"}
1
+ {"version":3,"file":"sudo-runner.d.ts","sourceRoot":"","sources":["../../src/launchd/sudo-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,KAAK,kBAAkB,EAAe,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,EAAc,UAAU,EAAgB,MAAM,aAAa,CAAC;AACxE,OAAO,EAIL,gBAAgB,EAMjB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,iBAAiB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B,MAAM,MAAM,iBAAiB,GAAG,kBAAkB,GAAG;IACnD;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,uFAAuF;IACvF,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF,iGAAiG;AACjG,MAAM,MAAM,QAAQ,GAAG;IACrB,gFAAgF;IAChF,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,sFAAsF;IACtF,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IAC9D,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC,CAAC;AAEF,eAAO,MAAM,cAAc,eAAgB,SAAS,MAAM,EAAE,QAAQ,QAAQ,KAAG,UAgI9E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,YAAa,iBAAiB,KAAG,UAYvD,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ExecResult } from './runner.ts';
2
+ import { SudoRefusedError } from './sudo-allowlist.ts';
3
+ /** ★ An EACCES outside every prefix is almost always a directory the stack forgot to declare. */
4
+ export declare const undeclared: (path: string, prefixes: readonly string[]) => (cause: unknown) => never;
5
+ /**
6
+ * The refusal sudo itself answered for `shown` (the argv as JSON), or `undefined` when the command
7
+ * ran — whatever its own exit code. ★ `SudoRefusedError` always means nothing ran as root.
8
+ */
9
+ export declare const sudoRefusal: (shown: string, result: ExecResult) => SudoRefusedError | undefined;
10
+ //# sourceMappingURL=sudo-said.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sudo-said.d.ts","sourceRoot":"","sources":["../../src/launchd/sudo-said.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAcvD,iGAAiG;AACjG,eAAO,MAAM,UAAU,SACd,MAAM,YAAY,SAAS,MAAM,EAAE,aAClC,OAAO,KAAG,KAQjB,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,WAAW,UAAW,MAAM,UAAU,UAAU,KAAG,gBAAgB,GAAG,SAelF,CAAC"}
@@ -6,10 +6,14 @@
6
6
  */
7
7
  import * as Effect from 'effect/Effect';
8
8
  import type * as HttpClient from 'effect/unstable/http/HttpClient';
9
+ import type { Claim } from '../ownership/adopt.ts';
9
10
  import { type BaoAuthMethodAttributes, type BaoAuthMethodProps } from './auth-method-form.ts';
10
11
  import type { BaoError } from './bao-status.ts';
11
12
  import type { RemountError, RemountOptions } from './remount-wire.ts';
12
13
  export declare const readMethod: (props: BaoAuthMethodProps) => Effect.Effect<BaoAuthMethodAttributes | undefined, BaoError, HttpClient.HttpClient>;
13
- /** Converge one auth method. `stated` is the path in Alchemy's state, if any. */
14
- export declare const reconcileAuthMethod: (news: BaoAuthMethodProps, stated: string | undefined, options?: RemountOptions) => Effect.Effect<BaoAuthMethodAttributes, BaoError | RemountError, HttpClient.HttpClient>;
14
+ /**
15
+ * Converge one auth method. `stated` is the path in Alchemy's state, if any.
16
+ * ⛔ `claim`: the same first-reconcile takeover refusal as reconcileMount's (auth-method.ts passes it).
17
+ */
18
+ export declare const reconcileAuthMethod: (news: BaoAuthMethodProps, stated: string | undefined, options?: RemountOptions, claim?: Claim) => Effect.Effect<BaoAuthMethodAttributes, BaoError | RemountError, HttpClient.HttpClient>;
15
19
  //# sourceMappingURL=auth-method-reconcile.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-method-reconcile.d.ts","sourceRoot":"","sources":["../../src/openbao/auth-method-reconcile.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AACnE,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EAKxB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEtE,eAAO,MAAM,UAAU,UACd,kBAAkB,KACxB,MAAM,CAAC,MAAM,CAAC,uBAAuB,GAAG,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,UAAU,CAKjF,CAAC;AAUL,iFAAiF;AACjF,eAAO,MAAM,mBAAmB,SACxB,kBAAkB,UAChB,MAAM,GAAG,SAAS,YAChB,cAAc,KACvB,MAAM,CAAC,MAAM,CAAC,uBAAuB,EAAE,QAAQ,GAAG,YAAY,EAAE,UAAU,CAAC,UAAU,CA8BpF,CAAC"}
1
+ {"version":3,"file":"auth-method-reconcile.d.ts","sourceRoot":"","sources":["../../src/openbao/auth-method-reconcile.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EAKxB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEtE,eAAO,MAAM,UAAU,UACd,kBAAkB,KACxB,MAAM,CAAC,MAAM,CAAC,uBAAuB,GAAG,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,UAAU,CAKjF,CAAC;AAUL;;;GAGG;AACH,eAAO,MAAM,mBAAmB,SACxB,kBAAkB,UAChB,MAAM,GAAG,SAAS,YAChB,cAAc,UAChB,KAAK,KACZ,MAAM,CAAC,MAAM,CAAC,uBAAuB,EAAE,QAAQ,GAAG,YAAY,EAAE,UAAU,CAAC,UAAU,CAqCpF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth-method.d.ts","sourceRoot":"","sources":["../../src/openbao/auth-method.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AACnE,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EAExB,MAAM,uBAAuB,CAAC;AAK/B,YAAY,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,CAAC;AAE5D,MAAM,WAAW,aAAc,SAAQ,QAAQ,CAC7C,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,EACvB,KAAK,EACL,UAAU,CAAC,UAAU,CACtB;CAAG;AAEJ,eAAO,MAAM,aAAa,gDAExB,CAAC;AAEH,eAAO,MAAM,qBAAqB,oGAqD/B,CAAC"}
1
+ {"version":3,"file":"auth-method.d.ts","sourceRoot":"","sources":["../../src/openbao/auth-method.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AAInE,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EAExB,MAAM,uBAAuB,CAAC;AAK/B,YAAY,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,CAAC;AAE5D,MAAM,WAAW,aAAc,SAAQ,QAAQ,CAC7C,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,EACvB,KAAK,EACL,UAAU,CAAC,UAAU,CACtB;CAAG;AAEJ,eAAO,MAAM,aAAa,gDAExB,CAAC;AAEH,eAAO,MAAM,qBAAqB,oGA2D/B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth-role.d.ts","sourceRoot":"","sources":["../../src/openbao/auth-role.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AACnE,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EAKtB,MAAM,qBAAqB,CAAC;AAI7B,YAAY,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,CAAC;AAExD,MAAM,WAAW,WAAY,SAAQ,QAAQ,CAC3C,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,KAAK,EACL,UAAU,CAAC,UAAU,CACtB;CAAG;AAEJ,eAAO,MAAM,WAAW,8CAEtB,CAAC;AAiBH,eAAO,MAAM,mBAAmB,kGA6E7B,CAAC"}
1
+ {"version":3,"file":"auth-role.d.ts","sourceRoot":"","sources":["../../src/openbao/auth-role.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AAInE,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EAKtB,MAAM,qBAAqB,CAAC;AAI7B,YAAY,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,CAAC;AAExD,MAAM,WAAW,WAAY,SAAQ,QAAQ,CAC3C,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,KAAK,EACL,UAAU,CAAC,UAAU,CACtB;CAAG;AAEJ,eAAO,MAAM,WAAW,8CAEtB,CAAC;AAiBH,eAAO,MAAM,mBAAmB,kGAoF7B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"cloudflare-role.d.ts","sourceRoot":"","sources":["../../src/openbao/cloudflare-role.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AAEnE,OAAO,EAAE,0BAA0B,EAAiB,MAAM,mCAAmC,CAAC;AAE9F,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,sBAAsB,EAM5B,MAAM,2BAA2B,CAAC;AAQnC,YAAY,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,CAAC;AAEpE;;;;;GAKG;AACH,MAAM,WAAW,iBAAkB,SAAQ,QAAQ,CACjD,oBAAoB,EACpB,sBAAsB,EACtB,2BAA2B,EAC3B,KAAK,EACL,UAAU,CAAC,UAAU,CACtB;CAAG;AAEJ,eAAO,MAAM,iBAAiB,oDAE5B,CAAC;AAKH,eAAO,MAAM,yBAAyB,qIAyInC,CAAC"}
1
+ {"version":3,"file":"cloudflare-role.d.ts","sourceRoot":"","sources":["../../src/openbao/cloudflare-role.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AAKnE,OAAO,EAAE,0BAA0B,EAAiB,MAAM,mCAAmC,CAAC;AAE9F,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,sBAAsB,EAM5B,MAAM,2BAA2B,CAAC;AAQnC,YAAY,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,CAAC;AAEpE;;;;;GAKG;AACH,MAAM,WAAW,iBAAkB,SAAQ,QAAQ,CACjD,oBAAoB,EACpB,sBAAsB,EACtB,2BAA2B,EAC3B,KAAK,EACL,UAAU,CAAC,UAAU,CACtB;CAAG;AAEJ,eAAO,MAAM,iBAAiB,oDAE5B,CAAC;AAKH,eAAO,MAAM,yBAAyB,qIAmJnC,CAAC"}
@@ -36,5 +36,23 @@ export declare const withFake: (answer: Answer, body: (bao: Fake) => Promise<voi
36
36
  export declare const run: <A, E>(env: BaoEnvironment, effect: Effect.Effect<A, E, HttpClient.HttpClient>) => Promise<A>;
37
37
  /** The effect's failure — rejects if it succeeded. */
38
38
  export declare const runFailure: <A, E>(env: BaoEnvironment, effect: Effect.Effect<A, E, HttpClient.HttpClient>) => Promise<E>;
39
+ /**
40
+ * An injected crash between a write and its commit. Once armed, `crashNext()` fails the first read
41
+ * that follows a write with a 500 — a reconcile whose write landed and whose read-back, and so the
42
+ * engine's commit, never did — and `crashNext('write')` lands the next write and then answers it
43
+ * 500, for a reconcile that reads nothing back (Bao.Policy). Either leaves the `creating` /
44
+ * `replacing` row a killed deploy leaves.
45
+ */
46
+ export declare const crashAfterWrite: () => {
47
+ crashNext: (at?: 'read-back' | 'write') => void;
48
+ wrap: (answer: (seen: Seen) => Reply) => (seen: Seen) => Reply;
49
+ };
50
+ /**
51
+ * A deploy killed BEFORE a resource's reconcile ran: the first write to a path ending in `suffix` is
52
+ * refused (500) without landing. Aimed at an upstream, it fails every create waiting on it after
53
+ * Apply has committed their `creating` rows — rows whose create never asked whose object sat at
54
+ * its identity (ownership/whole.ts).
55
+ */
56
+ export declare const refuseWriteOnce: (suffix: string) => (answer: (seen: Seen) => Reply) => (seen: Seen) => Reply;
39
57
  export {};
40
58
  //# sourceMappingURL=fake-bao.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fake-bao.d.ts","sourceRoot":"","sources":["../../src/openbao/fake-bao.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGvD,qCAAqC;AACrC,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,iGAAiG;AACjG,MAAM,MAAM,KAAK,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjG,MAAM,MAAM,IAAI,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IAAC,IAAI,IAAI,IAAI,CAAA;CAAE,CAAC;AAErF,6FAA6F;AAC7F,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;AAErD,eAAO,MAAM,OAAO,WAAY,MAAM,SAAS,MAAM,KAAG,IAwBvD,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,QAAQ,WACX,MAAM,QACR,CAAC,GAAG,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,SAC3B,MAAM,kBAQd,CAAC;AAKF,gFAAgF;AAChF,eAAO,MAAM,GAAG,GAAI,CAAC,EAAE,CAAC,OACjB,cAAc,UACX,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,eACP,CAAC;AAE9C,sDAAsD;AACtD,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,CAAC,OACxB,cAAc,UACX,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,eACM,CAAC"}
1
+ {"version":3,"file":"fake-bao.d.ts","sourceRoot":"","sources":["../../src/openbao/fake-bao.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGvD,qCAAqC;AACrC,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,iGAAiG;AACjG,MAAM,MAAM,KAAK,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjG,MAAM,MAAM,IAAI,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IAAC,IAAI,IAAI,IAAI,CAAA;CAAE,CAAC;AAErF,6FAA6F;AAC7F,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;AAErD,eAAO,MAAM,OAAO,WAAY,MAAM,SAAS,MAAM,KAAG,IAwBvD,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,QAAQ,WACX,MAAM,QACR,CAAC,GAAG,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,SAC3B,MAAM,kBAQd,CAAC;AAKF,gFAAgF;AAChF,eAAO,MAAM,GAAG,GAAI,CAAC,EAAE,CAAC,OACjB,cAAc,UACX,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,eACP,CAAC;AAE9C,sDAAsD;AACtD,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,CAAC,OACxB,cAAc,UACX,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,eACM,CAAC;AAE3D;;;;;;GAMG;AACH,eAAO,MAAM,eAAe;IAKxB,SAAS,QAAO,WAAW,GAAG,OAAO;IAIrC,IAAI,WACO,CAAC,IAAI,EAAE,IAAI,KAAK,KAAK,YACvB,IAAI,KAAG,KAAK;CAcxB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,WAAY,MAAM,cAE5B,CAAC,IAAI,EAAE,IAAI,KAAK,KAAK,YAC5B,IAAI,KAAG,KAOjB,CAAC"}
@@ -0,0 +1,39 @@
1
+ import * as Layer from 'effect/Layer';
2
+ import type * as Output from 'alchemy/Output';
3
+ import { BaoAuthMethod } from './auth-method.ts';
4
+ import { BaoCloudflareRole } from './cloudflare-role.ts';
5
+ import type { Reply, Seen } from './fake-bao.ts';
6
+ import { type FakeStack, type StackBody } from './fake-stack.ts';
7
+ import { BaoMount } from './mount.ts';
8
+ import { BaoPolicy } from './policy.ts';
9
+ import { BaoProxmoxRole } from './proxmox-role.ts';
10
+ export declare const coreProviders: Layer.Layer<import("effect/unstable/http/HttpClient").HttpClient | import("alchemy").Provider<BaoAuthMethod> | import("alchemy").Provider<import("./auth-role.ts").BaoAuthRole> | import("alchemy").Provider<BaoCloudflareRole> | import("alchemy").Provider<BaoMount> | import("alchemy").Provider<BaoPolicy> | import("alchemy").Provider<BaoProxmoxRole>, never, import("effect/unstable/http/HttpClient").HttpClient>;
11
+ /** Every store behind one answer, routed by path. */
12
+ export declare const coreEstate: () => ((seen: Seen) => Reply) & {
13
+ auth: {
14
+ answer: (seen: Seen) => Reply;
15
+ readonly table: Map<string, string>;
16
+ };
17
+ cloudflare: import("./fake-engines.ts").Store;
18
+ mounts: {
19
+ answer: (seen: Seen) => Reply;
20
+ readonly table: Map<string, string>;
21
+ };
22
+ policies: import("./fake-engines.ts").Store;
23
+ proxmox: import("./fake-engines.ts").Store;
24
+ roles: import("./fake-engines.ts").Store;
25
+ };
26
+ export type CoreEstate = ReturnType<typeof coreEstate>;
27
+ type Text = string | Output.Output<string>;
28
+ export interface CoreRow {
29
+ readonly family: string;
30
+ /** One resource, logical id `id`, at the row's fixed identity. */
31
+ readonly declare: (id: string, knob: Text) => StackBody;
32
+ /** Whether the fake holds the object. */
33
+ readonly has: (estate: CoreEstate) => boolean;
34
+ }
35
+ export declare const CORE: readonly CoreRow[];
36
+ /** One stack over a fresh core estate, plus `owner`: a second stack over the same fake. */
37
+ export declare const withCore: (body: (stack: FakeStack, estate: CoreEstate, seen: Seen[], owner: FakeStack) => Promise<void>, answer?: (estate: CoreEstate) => (seen: Seen) => Reply) => Promise<void>;
38
+ export {};
39
+ //# sourceMappingURL=fake-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-core.d.ts","sourceRoot":"","sources":["../../src/openbao/fake-core.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAyB,MAAM,kBAAkB,CAAC;AAIxE,OAAO,EAAE,iBAAiB,EAA6B,MAAM,sBAAsB,CAAC;AACpF,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAIjD,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAA4B,MAAM,iBAAiB,CAAC;AAC3F,OAAO,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAA0B,MAAM,mBAAmB,CAAC;AAQ3E,eAAO,MAAM,aAAa,2ZASzB,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,UAAU,gBASC,IAAI,KAAG,KAAK;;;;;;;;;;;;;CAYnC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAEvD,KAAK,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAE3C,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC;IACxD,yCAAyC;IACzC,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC;CAC/C;AAED,eAAO,MAAM,IAAI,EAAE,SAAS,OAAO,EAiDlC,CAAC;AAEF,2FAA2F;AAC3F,eAAO,MAAM,QAAQ,SACb,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,WACrF,CAAC,MAAM,EAAE,UAAU,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,KAAK,KACpD,OAAO,CAAC,IAAI,CAKd,CAAC"}
@@ -12,7 +12,7 @@ import type * as Output from 'alchemy/Output';
12
12
  import * as Effect from 'effect/Effect';
13
13
  import * as Layer from 'effect/Layer';
14
14
  import { BaoAuthRole } from './auth-role.ts';
15
- import type { Seen } from './fake-bao.ts';
15
+ import type { Reply, Seen } from './fake-bao.ts';
16
16
  import { type Estate } from './fake-engines-roles.ts';
17
17
  import { type FakeStack, type StackBody } from './fake-stack.ts';
18
18
  import { BaoJwtAuthConfig } from './jwt-config.ts';
@@ -24,8 +24,11 @@ import { BaoPkiRole } from './pki-role.ts';
24
24
  import { BaoPlugin } from './plugin.ts';
25
25
  import { BaoSshRole } from './ssh-role.ts';
26
26
  export declare const familyProviders: Layer.Layer<import("effect/unstable/http/HttpClient").HttpClient | import("alchemy").Provider<BaoAuthRole> | import("alchemy").Provider<BaoJwtAuthConfig> | import("alchemy").Provider<BaoJwtRole> | import("alchemy").Provider<BaoKubernetesRole> | import("alchemy").Provider<BaoMfaLoginEnforcement> | import("alchemy").Provider<BaoMfaTotpMethod> | import("alchemy").Provider<BaoPkiRole> | import("alchemy").Provider<BaoPlugin> | import("alchemy").Provider<BaoSshRole>, never, import("effect/unstable/http/HttpClient").HttpClient>;
27
- /** One stack over a fresh estate: every family's provider, and every call the fake saw. */
28
- export declare const withEstate: (body: (stack: FakeStack, estate: Estate, seen: Seen[]) => Promise<void>) => Promise<void>;
27
+ /**
28
+ * One stack over a fresh estate: every family's provider, and every call the fake saw — plus
29
+ * `owner`, a SECOND stack over the same fake with its own state: another owner of the same names.
30
+ */
31
+ export declare const withEstate: (body: (stack: FakeStack, estate: Estate, seen: Seen[], owner: FakeStack) => Promise<void>, answer?: (estate: Estate) => (seen: Seen) => Reply) => Promise<void>;
29
32
  /** The row for one family, by name. */
30
33
  export declare const rowOf: (family: string) => Family;
31
34
  type Text = string | Output.Output<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"fake-families.d.ts","sourceRoot":"","sources":["../../src/openbao/fake-families.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,aAAa,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,WAAW,EAAuB,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,KAAK,MAAM,EAAc,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAiB,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAA4B,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAsB,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAA6B,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,sBAAsB,EAAkC,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,gBAAgB,EAA4B,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAsB,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAqB,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAsB,MAAM,eAAe,CAAC;AAE/D,eAAO,MAAM,eAAe,ghBAW3B,CAAC;AAEF,2FAA2F;AAC3F,eAAO,MAAM,UAAU,SACf,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,KACtE,OAAO,CAAC,IAAI,CAGd,CAAC;AAEF,uCAAuC;AACvC,eAAO,MAAM,KAAK,WAAY,MAAM,KAAG,MAItC,CAAC;AAEF,KAAK,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC3C,KAAK,OAAO,GAAG,OAAO,aAAa,CAAC,OAAO,CAAC;AAE5C,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,SAAS,CAAC;IACvF,sDAAsD;IACtD,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACzD;AAQD,eAAO,MAAM,QAAQ,EAAE,SAAS,MAAM,EA6FrC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,MAAM,QACX,MAAM,SACR,MAAM,KAAK,MAAM,KAAG,SAIpB,CAAC;AAEP,kFAAkF;AAClF,eAAO,MAAM,QAAQ,QAAS,MAAM,4FACsC,CAAC"}
1
+ {"version":3,"file":"fake-families.d.ts","sourceRoot":"","sources":["../../src/openbao/fake-families.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,aAAa,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,WAAW,EAAuB,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,KAAK,MAAM,EAAc,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAA4B,MAAM,iBAAiB,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAA4B,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAsB,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAA6B,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,sBAAsB,EAAkC,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,gBAAgB,EAA4B,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAsB,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAqB,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAsB,MAAM,eAAe,CAAC;AAE/D,eAAO,MAAM,eAAe,ghBAW3B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,SACf,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,WACjF,CAAC,MAAM,EAAE,MAAM,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,KAAK,KAChD,OAAO,CAAC,IAAI,CAKd,CAAC;AAEF,uCAAuC;AACvC,eAAO,MAAM,KAAK,WAAY,MAAM,KAAG,MAItC,CAAC;AAEF,KAAK,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC3C,KAAK,OAAO,GAAG,OAAO,aAAa,CAAC,OAAO,CAAC;AAE5C,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,SAAS,CAAC;IACvF,sDAAsD;IACtD,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACzD;AAQD,eAAO,MAAM,QAAQ,EAAE,SAAS,MAAM,EA6FrC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,MAAM,QACX,MAAM,SACR,MAAM,KAAK,MAAM,KAAG,SAIpB,CAAC;AAEP,kFAAkF;AAClF,eAAO,MAAM,QAAQ,QAAS,MAAM,4FACsC,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * A fake mount table for fake-bao — `sys/mounts` (secrets engines) or `sys/auth` (auth methods):
3
+ * enable, tune, read, the listing a 400 is settled against (mount-wire.ts), and `sys/remount`.
4
+ * Split out of mount-move.test.ts so the engine-level ownership tests drive Bao.Mount and
5
+ * Bao.AuthMethod through the same table.
6
+ *
7
+ * ⛔ TEST-ONLY — see fake-bao.ts. No provider imports this file.
8
+ */
9
+ import type { Reply, Seen } from './fake-bao.ts';
10
+ /** The table keyed `<path>/` as the server keys it; `initial` maps a bare path to its type. */
11
+ export declare const liveTable: (prefix: string, initial: Record<string, string>) => {
12
+ answer: (seen: Seen) => Reply;
13
+ /** The live table as `<path>/` → type, the shape the move tests compare. */
14
+ readonly table: Map<string, string>;
15
+ };
16
+ //# sourceMappingURL=fake-mounts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-mounts.d.ts","sourceRoot":"","sources":["../../src/openbao/fake-mounts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAOjD,+FAA+F;AAC/F,eAAO,MAAM,SAAS,WAAY,MAAM,WAAW,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;mBAQjD,IAAI,KAAG,KAAK;IA4ChC,4EAA4E;;CAK/E,CAAC"}
@@ -6,9 +6,13 @@ import { type Fake, type Reply, type Seen } from './fake-bao.ts';
6
6
  export type Planned = Readonly<Record<string, string>>;
7
7
  /** A stack body: resource declarations, as an `alchemy.run.ts` would write them. */
8
8
  export type StackBody = Effect.Effect<unknown, unknown, unknown>;
9
+ /** What the CLI would set for one deploy: `adopt` is `--adopt` (the AdoptPolicy service). */
10
+ export type DeployOptions = {
11
+ readonly adopt?: boolean;
12
+ };
9
13
  export interface FakeStack {
10
14
  /** Plan, then apply, `body`. Resolves to the plan; rejects with the apply's failure. */
11
- readonly deploy: (body: StackBody) => Promise<Planned>;
15
+ readonly deploy: (body: StackBody, options?: DeployOptions) => Promise<Planned>;
12
16
  }
13
17
  /**
14
18
  * One stack over one state store, shared by every `deploy`, so the second deploy plans against what
@@ -1 +1 @@
1
- {"version":3,"file":"fake-stack.d.ts","sourceRoot":"","sources":["../../src/openbao/fake-stack.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,KAAK,EAAE,KAAK,IAAI,EAAW,MAAM,eAAe,CAAC;AAE1E,8EAA8E;AAC9E,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvD,oFAAoF;AACpF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAEjE,MAAM,WAAW,SAAS;IACxB,wFAAwF;IACxF,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACxD;AAiBD;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GAAI,IAAI,EAAE,CAAC,EAAE,GAAG,aACzB,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,OAC/B,cAAc,oBAElB,SA4BF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAU,IAAI,EAAE,CAAC,EAAE,GAAG,aACnC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,UAC5B,CAAC,IAAI,EAAE,IAAI,KAAK,KAAK,QACvB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,KACnD,OAAO,CAAC,IAAI,CAOd,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,QAAQ,SAAU,SAAS,IAAI,EAAE,KAAG,MAAM,EACoC,CAAC"}
1
+ {"version":3,"file":"fake-stack.d.ts","sourceRoot":"","sources":["../../src/openbao/fake-stack.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,KAAK,EAAE,KAAK,IAAI,EAAW,MAAM,eAAe,CAAC;AAE1E,8EAA8E;AAC9E,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvD,oFAAoF;AACpF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAEjE,6FAA6F;AAC7F,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEzD,MAAM,WAAW,SAAS;IACxB,wFAAwF;IACxF,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACjF;AAiBD;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GAAI,IAAI,EAAE,CAAC,EAAE,GAAG,aACzB,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,OAC/B,cAAc,oBAElB,SAoCF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAU,IAAI,EAAE,CAAC,EAAE,GAAG,aACnC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,UAC5B,CAAC,IAAI,EAAE,IAAI,KAAK,KAAK,QACvB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,KACnD,OAAO,CAAC,IAAI,CAOd,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,QAAQ,SAAU,SAAS,IAAI,EAAE,KAAG,MAAM,EACoC,CAAC"}