@homeflare/alchemy 0.37.7 → 0.38.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 (51) hide show
  1. package/dist/caddy/admin.d.ts +42 -8
  2. package/dist/caddy/admin.d.ts.map +1 -1
  3. package/dist/caddy/config.d.ts +9 -3
  4. package/dist/caddy/config.d.ts.map +1 -1
  5. package/dist/caddy/fake-caddy.d.ts +5 -0
  6. package/dist/caddy/fake-caddy.d.ts.map +1 -1
  7. package/dist/caddy/index.js +10 -6
  8. package/dist/caddy/index.js.map +5 -5
  9. package/dist/caddy/providers.d.ts +19 -12
  10. package/dist/caddy/providers.d.ts.map +1 -1
  11. package/dist/linux/container-form.d.ts +1 -1
  12. package/dist/linux/container-generator.d.ts +28 -0
  13. package/dist/linux/container-generator.d.ts.map +1 -1
  14. package/dist/linux/container-lifecycle.d.ts +18 -1
  15. package/dist/linux/container-lifecycle.d.ts.map +1 -1
  16. package/dist/linux/container-preflight.d.ts +34 -0
  17. package/dist/linux/container-preflight.d.ts.map +1 -1
  18. package/dist/linux/container-settle.d.ts.map +1 -1
  19. package/dist/linux/fake-sudo.d.ts +14 -2
  20. package/dist/linux/fake-sudo.d.ts.map +1 -1
  21. package/dist/linux/index.js +76 -29
  22. package/dist/linux/index.js.map +11 -10
  23. package/dist/linux/sudo-exec.d.ts +16 -0
  24. package/dist/linux/sudo-exec.d.ts.map +1 -1
  25. package/dist/linux/unit-form.d.ts.map +1 -1
  26. package/dist/linux/unit-text.d.ts +35 -0
  27. package/dist/linux/unit-text.d.ts.map +1 -0
  28. package/docs/linux-sudo.md +18 -7
  29. package/package.json +1 -1
  30. package/src/caddy/admin-transport-scope.test.ts +127 -0
  31. package/src/caddy/admin.ts +45 -9
  32. package/src/caddy/config-adopt-provider.test.ts +2 -2
  33. package/src/caddy/config-format-warning.test.ts +9 -3
  34. package/src/caddy/config.ts +20 -4
  35. package/src/caddy/fake-caddy.ts +10 -1
  36. package/src/caddy/providers.test.ts +3 -2
  37. package/src/caddy/providers.ts +18 -11
  38. package/src/linux/container-form.ts +1 -1
  39. package/src/linux/container-generator.test.ts +33 -0
  40. package/src/linux/container-generator.ts +72 -0
  41. package/src/linux/container-lifecycle.test.ts +6 -3
  42. package/src/linux/container-lifecycle.ts +23 -2
  43. package/src/linux/container-preflight.ts +47 -0
  44. package/src/linux/container-settle.ts +12 -1
  45. package/src/linux/container-shadow.test.ts +131 -0
  46. package/src/linux/fake-sudo.ts +21 -5
  47. package/src/linux/sudo-exec.ts +60 -10
  48. package/src/linux/sudo-lifecycle.test.ts +64 -3
  49. package/src/linux/unit-form.ts +4 -18
  50. package/src/linux/unit-text.test.ts +67 -0
  51. package/src/linux/unit-text.ts +58 -0
@@ -10,12 +10,25 @@
10
10
  * caddyconfig/load.go and admin.go, and in the API docs (caddyserver.com/docs/api).
11
11
  * ★ `CaddyAdminService` CARRIES ONLY MESSAGE/GUARD METADATA (endpoint, listener) — never a
12
12
  * credential, and never the transport itself. The transport is `@distilled.cloud/caddy`'s own
13
- * `Credentials` and `HttpClient.HttpClient` services, provided alongside it by `caddyAdminLayer`,
14
- * so admin-calls.ts calls the SDK's operations directly rather than through a house-specific
15
- * `.request()` seam. A consumer plugs in another route to the API (an SSH-forwarded socket today;
16
- * a remote runner later) by providing a different `CaddyTransport` to `caddyAdminLayer`.
13
+ * `Credentials` and `HttpClient.HttpClient` services — admin-calls.ts calls the SDK's operations
14
+ * directly rather than through a house-specific `.request()` seam. A consumer plugs in another
15
+ * route to the API (an SSH-forwarded socket today; a remote runner later) by providing a different
16
+ * `CaddyTransport` to `caddyAdminLayer`.
17
17
  * ⛔ THE ADMIN API HAS NO AUTHENTICATION. Anyone who reaches it can replace every site. It stays on
18
18
  * loopback or a unix socket; localCaddyAdmin() refuses anything else (local-admin.ts).
19
+ * ⛔ `caddyAdminLayer`'s OWN OUTPUT NEVER CARRIES `Credentials`/`HttpClient.HttpClient` DIRECTLY —
20
+ * MEASURED 2026-09-26: it used to (`Layer.mergeAll(CaddyAdminService-layer, transport.layer)`,
21
+ * what `caddyProviders()` then `provideMerge`d into a stack), and a stack that applies its own
22
+ * ambient client OUTSIDE the providers' merge — `Layer.mergeAll(providers…).pipe(Layer.provide
23
+ * (ambient))`, the shape `argocd`/`discord`/`opnsense`/`unifi`'s own `providers.ts` document —
24
+ * never got it back: `Layer.provide(A, B)`'s result outputs only `A`'s own services, so once `A`
25
+ * (the merged providers) already carries `HttpClient.HttpClient` from Caddy, no outer `B` overrides
26
+ * it. Every OTHER fetch-based provider merged alongside `caddyProviders()` (homeflare-mini's
27
+ * Forgejo, LiteLLM) then dialled Caddy's admin API instead of its own target — reproduced in
28
+ * admin-transport-scope.test.ts. `caddyAdminLayer` now stores `transport.layer` itself as a plain
29
+ * VALUE, under `CaddyAdminTransport` — a house-only tag nothing outside caddy/ ever reads — and
30
+ * config.ts is the one place that `Effect.provide`s it, scoped to exactly the effects that call
31
+ * `@distilled.cloud/caddy`'s operations.
19
32
  */
20
33
  import type * as HttpClient from 'effect/unstable/http/HttpClient';
21
34
  import * as Context from 'effect/Context';
@@ -45,19 +58,40 @@ export interface CaddyTarget {
45
58
  }
46
59
  /** What `localCaddyAdmin()` (or a consumer's own transport) hands `caddyAdminLayer`. */
47
60
  export interface CaddyTransport extends CaddyTarget {
48
- /** Provides the SDK's own `Credentials` and `HttpClient.HttpClient` — see local-admin.ts. */
61
+ /**
62
+ * Provides the SDK's own `Credentials` and `HttpClient.HttpClient` — see local-admin.ts.
63
+ * ⚠️ BUILT AND TORN DOWN ON EVERY `read`/`diff`/`reconcile` CALL — config.ts's `Effect.provide
64
+ * (transportLayer)` runs fresh each time, scoped to that one call (the scoping fix this file's
65
+ * own ⛔ documents). `localCaddyAdmin()`'s layer is three plain `Layer.succeed` values, so this
66
+ * costs nothing; a transport that opens something stateful (an SSH forward, a connection pool)
67
+ * would open and close it per call instead of once per stack. No such transport exists in the
68
+ * tray today (2026-09-26) — keep `layer` cheap and stateless, or build once and hand config.ts a
69
+ * pre-built `Context` instead, if that changes.
70
+ */
49
71
  readonly layer: Layer.Layer<Credentials | HttpClient.HttpClient>;
50
72
  }
51
73
  declare const CaddyAdminService_base: Context.ServiceClass<CaddyAdminService, "homeflare/caddy/CaddyAdmin", CaddyTarget>;
52
74
  /** The Effect service the Caddy provider reads its admin target's metadata from. */
53
75
  export declare class CaddyAdminService extends CaddyAdminService_base {
54
76
  }
77
+ declare const CaddyAdminTransport_base: Context.ServiceClass<CaddyAdminTransport, "homeflare/caddy/CaddyAdminTransport", Layer.Layer<Credentials | HttpClient.HttpClient, never, never>>;
78
+ /**
79
+ * `transport.layer` ITSELF, carried as a plain value rather than merged into the ambient context —
80
+ * the scoping fix (see the file header's ⛔). Only config.ts reads this tag, and only to
81
+ * `Effect.provide` it locally around the handful of effects that actually call
82
+ * `@distilled.cloud/caddy`'s operations; nothing else in this directory, and nothing outside it,
83
+ * has a reason to.
84
+ */
85
+ export declare class CaddyAdminTransport extends CaddyAdminTransport_base {
86
+ }
55
87
  /**
56
88
  * Provide a transport to the provider: `CaddyConfigProvider().pipe(Layer.provideMerge(caddyAdminLayer(localCaddyAdmin())))`
57
89
  * — never plain `Layer.provide` here (see providers.ts's own ⚠️): `CaddyConfigProvider()`'s handlers
58
- * keep needing these services every time the engine calls them, not just once while it is built. Merges
59
- * the target metadata with the SDK's `Credentials`/`HttpClient` layers `transport.layer` carries.
90
+ * keep needing `CaddyAdminService`/`CaddyAdminTransport` every time the engine calls them, not just
91
+ * once while it is built. Neither tag is a generic platform service, so merging them into a stack's
92
+ * ambient context (unlike the raw `Credentials`/`HttpClient.HttpClient` this used to carry — the
93
+ * file header's ⛔) is safe: nothing outside this directory looks either up.
60
94
  */
61
- export declare const caddyAdminLayer: (transport: CaddyTransport) => Layer.Layer<CaddyAdminService | Credentials | HttpClient.HttpClient>;
95
+ export declare const caddyAdminLayer: (transport: CaddyTransport) => Layer.Layer<CaddyAdminService | CaddyAdminTransport>;
62
96
  export {};
63
97
  //# sourceMappingURL=admin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/caddy/admin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC5E;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD,qFAAqF;AACrF,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;CACvC;AAED,wFAAwF;AACxF,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,6FAA6F;IAC7F,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;CAClE;;AAED,oFAAoF;AACpF,qBAAa,iBAAkB,SAAQ,sBAEtC;CAAG;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,eAAe,cACf,cAAc,KACxB,KAAK,CAAC,KAAK,CAAC,iBAAiB,GAAG,WAAW,GAAG,UAAU,CAAC,UAAU,CAOnE,CAAC"}
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/caddy/admin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC5E;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD,qFAAqF;AACrF,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;CACvC;AAED,wFAAwF;AACxF,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD;;;;;;;;;OASG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;CAClE;;AAED,oFAAoF;AACpF,qBAAa,iBAAkB,SAAQ,sBAEtC;CAAG;;AAEJ;;;;;;GAMG;AACH,qBAAa,mBAAoB,SAAQ,wBAGC;CAAG;AAE7C;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,cACf,cAAc,KACxB,KAAK,CAAC,KAAK,CAAC,iBAAiB,GAAG,mBAAmB,CAOnD,CAAC"}
@@ -21,15 +21,21 @@
21
21
  * engine skips that probe, reconcile refuses the same takeover (config-lifecycle.ts).
22
22
  * ⛔ `caddyfile` IS NEVER A SECRET — see config-form.ts; refused before anything is sent.
23
23
  * ⚠️ WHICH CADDY is the transport's (providers.ts): `CaddyAdminService` plus the `Credentials`/
24
- * `HttpClient` layers `caddyAdminLayer` merges — one per stack, not a prop.
24
+ * `HttpClient` layer `CaddyAdminTransport` carries — one per stack, not a prop.
25
+ * ⚠️ `transportLayer` IS `Effect.provide`D LOCALLY IN EACH HANDLER BELOW, NEVER MERGED AHEAD OF
26
+ * TIME. `caddyAdminLayer` (admin.ts) stores it under `CaddyAdminTransport` rather than merging its
27
+ * `Credentials`/`HttpClient.HttpClient` into the ambient context precisely so this file is the ONE
28
+ * place that discharges them — scoped to the handful of effects that actually call
29
+ * `@distilled.cloud/caddy`'s operations, never leaking into a sibling fetch-based provider merged
30
+ * into the same stack (admin.ts's own ⛔; MEASURED 2026-09-26, admin-transport-scope.test.ts).
25
31
  */
26
32
  import { Resource } from 'alchemy';
27
33
  import * as Provider from 'alchemy/Provider';
28
- import { CaddyAdminService } from './admin.ts';
34
+ import { CaddyAdminService, CaddyAdminTransport } from './admin.ts';
29
35
  import type { CaddyConfigAttributes, CaddyConfigProps } from './config-form.ts';
30
36
  export type { CaddyConfigAttributes, CaddyConfigProps } from './config-form.ts';
31
37
  export interface CaddyConfig extends Resource<'Caddy.Config', CaddyConfigProps, CaddyConfigAttributes> {
32
38
  }
33
39
  export declare const CaddyConfig: import("alchemy").ResourceClass<CaddyConfig>;
34
- export declare const CaddyConfigProvider: () => import("effect/Layer").Layer<Provider.Provider<CaddyConfig>, never, CaddyAdminService | import("@distilled.cloud/caddy").CaddyOpContext>;
40
+ export declare const CaddyConfigProvider: () => import("effect/Layer").Layer<Provider.Provider<CaddyConfig>, never, CaddyAdminService | CaddyAdminTransport>;
35
41
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/caddy/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAI7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAKhF,YAAY,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEhF,MAAM,WAAW,WAAY,SAAQ,QAAQ,CAC3C,cAAc,EACd,gBAAgB,EAChB,qBAAqB,CACtB;CAAG;AAEJ,eAAO,MAAM,WAAW,8CAEtB,CAAC;AAoBH,eAAO,MAAM,mBAAmB,gJAqF7B,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/caddy/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAI7C,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEpE,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAKhF,YAAY,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEhF,MAAM,WAAW,WAAY,SAAQ,QAAQ,CAC3C,cAAc,EACd,gBAAgB,EAChB,qBAAqB,CACtB;CAAG;AAEJ,eAAO,MAAM,WAAW,8CAEtB,CAAC;AAoBH,eAAO,MAAM,mBAAmB,oHA+F7B,CAAC"}
@@ -57,6 +57,11 @@ export declare const fakeDefaultCaddy: (running?: unknown) => {
57
57
  * Runs an Effect that needs `CaddyAdminService` and `@distilled.cloud/caddy`'s own `Credentials`/
58
58
  * `HttpClient` against one transport — the one line every test in this directory used to spend on
59
59
  * `Effect.provide(caddyAdminLayer(admin))` before this helper existed.
60
+ * ⚠️ TWO LAYERS, NOT ONE: `caddyAdminLayer(admin)` only carries `CaddyAdminService` and the
61
+ * `CaddyAdminTransport`-wrapped VALUE of `admin.layer` (admin.ts's own scoping fix) — the
62
+ * lifecycle functions this helper drives (`probeLive`, `reconcileConfig`, …) still need the raw
63
+ * `Credentials`/`HttpClient.HttpClient` directly in context, so `admin.layer` is provided again,
64
+ * built this time, alongside it.
60
65
  */
61
66
  export declare const runCaddy: <A, E>(effect: Effect.Effect<A, E, CaddyAdminService | Caddy.CaddyOpContext>, admin: CaddyTransport) => Promise<A>;
62
67
  //# sourceMappingURL=fake-caddy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fake-caddy.d.ts","sourceRoot":"","sources":["../../src/caddy/fake-caddy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,KAAK,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAmB,MAAM,YAAY,CAAC;AAG1F,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,MAAM,MAAM,SAAS,GAAG;IACtB,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IACtB,+DAA+D;IAC/D,OAAO,EAAE,OAAO,CAAC;IACjB,+EAA+E;IAC/E,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,IAAI,IAAI,IAAI,CAAC;CACd,CAAC;AAqDF,eAAO,MAAM,SAAS,aACX;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,KACrF,SAwEF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,aACjB,OAAO,KAChB;IAAE,KAAK,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAQ3C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,CAAC,UACnB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,iBAAiB,GAAG,KAAK,CAAC,cAAc,CAAC,SAC9D,cAAc,KACpB,OAAO,CAAC,CAAC,CAA2E,CAAC"}
1
+ {"version":3,"file":"fake-caddy.d.ts","sourceRoot":"","sources":["../../src/caddy/fake-caddy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,KAAK,KAAK,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAmB,MAAM,YAAY,CAAC;AAG1F,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,MAAM,MAAM,SAAS,GAAG;IACtB,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IACtB,+DAA+D;IAC/D,OAAO,EAAE,OAAO,CAAC;IACjB,+EAA+E;IAC/E,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,IAAI,IAAI,IAAI,CAAC;CACd,CAAC;AAqDF,eAAO,MAAM,SAAS,aACX;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,KACrF,SAwEF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,aACjB,OAAO,KAChB;IAAE,KAAK,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAQ3C,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,CAAC,UACnB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,iBAAiB,GAAG,KAAK,CAAC,cAAc,CAAC,SAC9D,cAAc,KACpB,OAAO,CAAC,CAAC,CAGT,CAAC"}
@@ -45,10 +45,13 @@ import * as Layer from "effect/Layer";
45
45
 
46
46
  class CaddyAdminService extends Context.Service()("homeflare/caddy/CaddyAdmin") {
47
47
  }
48
+
49
+ class CaddyAdminTransport extends Context.Service()("homeflare/caddy/CaddyAdminTransport") {
50
+ }
48
51
  var caddyAdminLayer = (transport) => Layer.mergeAll(Layer.succeed(CaddyAdminService, {
49
52
  endpoint: transport.endpoint,
50
53
  listener: transport.listener
51
- }), transport.layer);
54
+ }), Layer.succeed(CaddyAdminTransport, transport.layer));
52
55
  // src/caddy/caddy-http-client.ts
53
56
  import * as http from "node:http";
54
57
  import { Readable } from "node:stream";
@@ -921,6 +924,7 @@ var CaddyConfig = Resource("Caddy.Config", {
921
924
  var planWithoutCaddy = (admin, fallback) => (error) => Effect11.as(Effect11.logWarning(`Caddy.Config: no Caddy at ${admin.endpoint} ` + `(${error instanceof Error ? error.message : String(error)}); planning without it — ` + "the Caddyfile is validated when the deploy reaches Caddy"), fallback);
922
925
  var CaddyConfigProvider = () => Provider.effect(CaddyConfig, Effect11.gen(function* () {
923
926
  const admin = yield* CaddyAdminService;
927
+ const transportLayer = yield* CaddyAdminTransport;
924
928
  const probe = (caddyfile, sourceFile) => Effect11.flatMap(probeLive(caddyfile, sourceFile), (found) => {
925
929
  if (found === undefined)
926
930
  return Effect11.succeed(undefined);
@@ -933,24 +937,24 @@ var CaddyConfigProvider = () => Provider.effect(CaddyConfig, Effect11.gen(functi
933
937
  list: () => Effect11.succeed([]),
934
938
  read: ({ olds, output }) => Effect11.gen(function* () {
935
939
  return output === undefined ? yield* probe(resolvedString(olds, "caddyfile"), resolvedString(olds, "sourceFile")) : yield* readLive(resolvedString(olds, "sourceFile"));
936
- }).pipe(Effect11.catchIf(isUnreachable, planWithoutCaddy(admin, undefined))),
940
+ }).pipe(Effect11.provide(transportLayer), Effect11.catchIf(isUnreachable, planWithoutCaddy(admin, undefined))),
937
941
  diff: ({ news, output }) => {
938
942
  if (output === undefined)
939
943
  return Effect11.succeed(undefined);
940
944
  const update = planWithoutCaddy(admin, { action: "update" });
941
945
  if (isResolved(news)) {
942
- return diffConfig(news, output).pipe(Effect11.catchIf(isUnreachable, update));
946
+ return diffConfig(news, output).pipe(Effect11.provide(transportLayer), Effect11.catchIf(isUnreachable, update));
943
947
  }
944
948
  const caddyfile = resolvedString(news, "caddyfile");
945
949
  if (caddyfile === undefined)
946
950
  return Effect11.succeed(undefined);
947
- return Effect11.as(diffConfig({ caddyfile }, output), { action: "update" }).pipe(Effect11.catchIf(isUnreachable, update));
951
+ return Effect11.as(diffConfig({ caddyfile }, output), { action: "update" }).pipe(Effect11.provide(transportLayer), Effect11.catchIf(isUnreachable, update));
948
952
  },
949
953
  reconcile: ({ fqn, news, output }) => Effect11.gen(function* () {
950
954
  const sameCaddy = output !== undefined && output.endpoint === admin.endpoint;
951
955
  const takeOver = sameCaddy || (yield* adoptEnabled(fqn));
952
956
  const stored = output === undefined ? {} : { stored: output.configSha256 };
953
- const applied = yield* reconcileConfig(news, { takeOver, ...stored });
957
+ const applied = yield* reconcileConfig(news, { takeOver, ...stored }).pipe(Effect11.provide(transportLayer));
954
958
  const { formatting, rest } = splitFormattingWarning(applied.warnings);
955
959
  if (formatting.length > 0) {
956
960
  yield* Effect11.logWarning(formattingFixLine(admin.endpoint));
@@ -1339,5 +1343,5 @@ export {
1339
1343
  verifierProblems
1340
1344
  };
1341
1345
 
1342
- //# debugId=CC0C3E3E18BF8F0664756E2164756E21
1346
+ //# debugId=B368F4E9D50791DC64756E2164756E21
1343
1347
  //# sourceMappingURL=index.js.map