@homeflare/alchemy 0.37.8 → 0.39.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.
- package/README.md +22 -0
- package/dist/caddy/admin.d.ts +42 -8
- package/dist/caddy/admin.d.ts.map +1 -1
- package/dist/caddy/config.d.ts +9 -3
- package/dist/caddy/config.d.ts.map +1 -1
- package/dist/caddy/fake-caddy.d.ts +5 -0
- package/dist/caddy/fake-caddy.d.ts.map +1 -1
- package/dist/caddy/index.js +10 -6
- package/dist/caddy/index.js.map +5 -5
- package/dist/caddy/providers.d.ts +19 -12
- package/dist/caddy/providers.d.ts.map +1 -1
- package/dist/forgejo/index.js +4 -2
- package/dist/forgejo/index.js.map +3 -3
- package/dist/forgejo/team-member.d.ts +25 -0
- package/dist/forgejo/team-member.d.ts.map +1 -1
- package/dist/proxmox/generated/constraints/index.d.ts +1 -1
- package/dist/proxmox/generated/constraints/index.d.ts.map +1 -1
- package/dist/proxmox/generated/constraints/pve-access.d.ts +1 -1
- package/dist/proxmox/generated/constraints/pve-cluster-backup.d.ts +1 -1
- package/dist/proxmox/generated/constraints/pve-cluster-ceph.d.ts +1 -1
- package/dist/proxmox/generated/constraints/pve-cluster-firewall.d.ts +1 -1
- package/dist/proxmox/generated/constraints/pve-cluster-ha.d.ts +1 -1
- package/dist/proxmox/generated/constraints/pve-cluster-metrics.d.ts +1 -1
- package/dist/proxmox/generated/constraints/pve-cluster-notifications.d.ts +1 -1
- package/dist/proxmox/generated/constraints/pve-cluster-replication.d.ts +1 -1
- package/dist/proxmox/generated/constraints/pve-cluster-sdn.d.ts +1 -1
- package/dist/proxmox/generated/constraints/pve-nodes-ceph.d.ts +1 -1
- package/dist/proxmox/generated/constraints/pve-nodes-disks.d.ts +1 -1
- package/dist/proxmox/generated/constraints/pve-nodes-lxc.d.ts +1 -1
- package/dist/proxmox/generated/constraints/pve-nodes-network.d.ts +1 -1
- package/dist/proxmox/generated/constraints/pve-nodes-qemu.d.ts +1 -1
- package/dist/proxmox/generated/constraints/pve-nodes-storage.d.ts +23 -0
- package/dist/proxmox/generated/constraints/pve-nodes-storage.d.ts.map +1 -0
- package/dist/proxmox/generated/constraints/pve-pools.d.ts +1 -1
- package/dist/proxmox/generated/constraints/pve-storage.d.ts +1 -1
- package/dist/proxmox/index.d.ts +14 -3
- package/dist/proxmox/index.d.ts.map +1 -1
- package/dist/proxmox/index.js +565 -133
- package/dist/proxmox/index.js.map +33 -23
- package/dist/proxmox/qemu-form.d.ts +27 -18
- package/dist/proxmox/qemu-form.d.ts.map +1 -1
- package/dist/proxmox/qemu-judge.d.ts +30 -0
- package/dist/proxmox/qemu-judge.d.ts.map +1 -0
- package/dist/proxmox/qemu-lifecycle.d.ts +16 -2
- package/dist/proxmox/qemu-lifecycle.d.ts.map +1 -1
- package/dist/proxmox/qemu-net.d.ts +9 -0
- package/dist/proxmox/qemu-net.d.ts.map +1 -0
- package/dist/proxmox/qemu-props.d.ts +112 -0
- package/dist/proxmox/qemu-props.d.ts.map +1 -0
- package/dist/proxmox/qemu-volume.d.ts +17 -0
- package/dist/proxmox/qemu-volume.d.ts.map +1 -0
- package/dist/proxmox/qemu.d.ts +14 -27
- package/dist/proxmox/qemu.d.ts.map +1 -1
- package/dist/proxmox/storage-download-errors.d.ts +5 -0
- package/dist/proxmox/storage-download-errors.d.ts.map +1 -0
- package/dist/proxmox/storage-download-identity.d.ts +27 -0
- package/dist/proxmox/storage-download-identity.d.ts.map +1 -0
- package/dist/proxmox/storage-download-lifecycle.d.ts +97 -0
- package/dist/proxmox/storage-download-lifecycle.d.ts.map +1 -0
- package/dist/proxmox/storage-download-props.d.ts +36 -0
- package/dist/proxmox/storage-download-props.d.ts.map +1 -0
- package/dist/proxmox/storage-download-task.d.ts +17 -0
- package/dist/proxmox/storage-download-task.d.ts.map +1 -0
- package/dist/proxmox/storage-download.d.ts +44 -0
- package/dist/proxmox/storage-download.d.ts.map +1 -0
- package/dist/telemetry/fake-collector.d.ts +36 -0
- package/dist/telemetry/fake-collector.d.ts.map +1 -0
- package/dist/telemetry/index.d.ts +11 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +223 -0
- package/dist/telemetry/index.js.map +12 -0
- package/dist/telemetry/layer.d.ts +86 -0
- package/dist/telemetry/layer.d.ts.map +1 -0
- package/dist/telemetry/redact-serialization.d.ts +21 -0
- package/dist/telemetry/redact-serialization.d.ts.map +1 -0
- package/dist/telemetry/redact.d.ts +46 -0
- package/dist/telemetry/redact.d.ts.map +1 -0
- package/dist/unifi/drift.d.ts +27 -0
- package/dist/unifi/drift.d.ts.map +1 -0
- package/dist/unifi/fake-unifi.d.ts +5 -1
- package/dist/unifi/fake-unifi.d.ts.map +1 -1
- package/dist/unifi/firewall-zone-form.d.ts +6 -0
- package/dist/unifi/firewall-zone-form.d.ts.map +1 -1
- package/dist/unifi/firewall-zone.d.ts +1 -1
- package/dist/unifi/firewall-zone.d.ts.map +1 -1
- package/dist/unifi/index.d.ts +4 -3
- package/dist/unifi/index.d.ts.map +1 -1
- package/dist/unifi/index.js +138 -58
- package/dist/unifi/index.js.map +10 -8
- package/dist/unifi/network-drift.d.ts +26 -0
- package/dist/unifi/network-drift.d.ts.map +1 -0
- package/dist/unifi/network-form.d.ts +40 -7
- package/dist/unifi/network-form.d.ts.map +1 -1
- package/dist/unifi/network.d.ts +1 -0
- package/dist/unifi/network.d.ts.map +1 -1
- package/dist/unifi/paginate.d.ts +36 -0
- package/dist/unifi/paginate.d.ts.map +1 -0
- package/dist/unifi/resource.d.ts +36 -1
- package/dist/unifi/resource.d.ts.map +1 -1
- package/docs/telemetry-spike.md +94 -0
- package/docs/telemetry.md +109 -0
- package/docs/unifi.md +56 -0
- package/package.json +6 -2
- package/src/caddy/admin-transport-scope.test.ts +127 -0
- package/src/caddy/admin.ts +45 -9
- package/src/caddy/config-adopt-provider.test.ts +2 -2
- package/src/caddy/config-format-warning.test.ts +9 -3
- package/src/caddy/config.ts +20 -4
- package/src/caddy/fake-caddy.ts +10 -1
- package/src/caddy/providers.test.ts +3 -2
- package/src/caddy/providers.ts +18 -11
- package/src/forgejo/team-member.test.ts +14 -0
- package/src/forgejo/team-member.ts +28 -1
- package/src/proxmox/constraints-required.test.ts +1 -0
- package/src/proxmox/generated/constraints/index.ts +3 -1
- package/src/proxmox/generated/constraints/pve-access.ts +1 -1
- package/src/proxmox/generated/constraints/pve-cluster-backup.ts +1 -1
- package/src/proxmox/generated/constraints/pve-cluster-ceph.ts +1 -1
- package/src/proxmox/generated/constraints/pve-cluster-firewall.ts +1 -1
- package/src/proxmox/generated/constraints/pve-cluster-ha.ts +1 -1
- package/src/proxmox/generated/constraints/pve-cluster-metrics.ts +1 -1
- package/src/proxmox/generated/constraints/pve-cluster-notifications.ts +1 -1
- package/src/proxmox/generated/constraints/pve-cluster-replication.ts +1 -1
- package/src/proxmox/generated/constraints/pve-cluster-sdn.ts +1 -1
- package/src/proxmox/generated/constraints/pve-nodes-ceph.ts +1 -1
- package/src/proxmox/generated/constraints/pve-nodes-disks.ts +1 -1
- package/src/proxmox/generated/constraints/pve-nodes-lxc.ts +1 -1
- package/src/proxmox/generated/constraints/pve-nodes-network.ts +1 -1
- package/src/proxmox/generated/constraints/pve-nodes-qemu.ts +1 -1
- package/src/proxmox/generated/constraints/pve-nodes-storage.ts +30 -0
- package/src/proxmox/generated/constraints/pve-pools.ts +1 -1
- package/src/proxmox/generated/constraints/pve-storage.ts +1 -1
- package/src/proxmox/index.test.ts +11 -6
- package/src/proxmox/index.ts +19 -3
- package/src/proxmox/qemu-form.ts +49 -13
- package/src/proxmox/qemu-identity.test.ts +30 -0
- package/src/proxmox/qemu-judge.test.ts +65 -0
- package/src/proxmox/qemu-judge.ts +84 -0
- package/src/proxmox/qemu-lifecycle.test.ts +78 -19
- package/src/proxmox/qemu-lifecycle.ts +131 -32
- package/src/proxmox/qemu-net.test.ts +48 -0
- package/src/proxmox/qemu-net.ts +78 -0
- package/src/proxmox/qemu-ownership.test.ts +44 -0
- package/src/proxmox/qemu-props.test.ts +87 -0
- package/src/proxmox/qemu-props.ts +157 -0
- package/src/proxmox/qemu-volume.test.ts +80 -0
- package/src/proxmox/qemu-volume.ts +121 -0
- package/src/proxmox/qemu.ts +15 -29
- package/src/proxmox/storage-download-errors.ts +7 -0
- package/src/proxmox/storage-download-identity.test.ts +54 -0
- package/src/proxmox/storage-download-identity.ts +50 -0
- package/src/proxmox/storage-download-lifecycle.ts +226 -0
- package/src/proxmox/storage-download-ownership.test.ts +50 -0
- package/src/proxmox/storage-download-props.ts +38 -0
- package/src/proxmox/storage-download-task.ts +72 -0
- package/src/proxmox/storage-download.test.ts +216 -0
- package/src/proxmox/storage-download.ts +58 -0
- package/src/telemetry/fake-collector.ts +59 -0
- package/src/telemetry/http-client-sealing.test.ts +82 -0
- package/src/telemetry/index.ts +10 -0
- package/src/telemetry/layer.test.ts +204 -0
- package/src/telemetry/layer.ts +152 -0
- package/src/telemetry/redact-serialization.ts +178 -0
- package/src/telemetry/redact.test.ts +124 -0
- package/src/telemetry/redact.ts +147 -0
- package/src/unifi/drift.test.ts +78 -0
- package/src/unifi/drift.ts +56 -0
- package/src/unifi/errors-and-secrets.test.ts +127 -0
- package/src/unifi/fake-unifi.ts +5 -1
- package/src/unifi/firewall-zone-form.ts +31 -2
- package/src/unifi/firewall-zone.test.ts +21 -1
- package/src/unifi/firewall-zone.ts +1 -1
- package/src/unifi/get-only-guard.test.ts +165 -0
- package/src/unifi/index.ts +15 -1
- package/src/unifi/network-drift.test.ts +207 -0
- package/src/unifi/network-drift.ts +80 -0
- package/src/unifi/network-form.ts +11 -39
- package/src/unifi/network.test.ts +7 -82
- package/src/unifi/network.ts +6 -6
- package/src/unifi/paginate.test.ts +228 -0
- package/src/unifi/paginate.ts +129 -0
- package/src/unifi/resource.ts +73 -3
- package/src/unifi/write-op-reference.test.ts +236 -0
package/README.md
CHANGED
|
@@ -351,6 +351,28 @@ checks you name required. ⛔ Auto-merge with nothing required merges **immediat
|
|
|
351
351
|
`bunx --bun hf-adopt-verify --config alchemy.run.ts --stage live`: Alchemy's planner, no writes,
|
|
352
352
|
each row's own diff, exit 0 only when all are no-ops. [docs/adopt-verify.md](./docs/adopt-verify.md)
|
|
353
353
|
|
|
354
|
+
## Telemetry — `@homeflare/alchemy/telemetry`
|
|
355
|
+
|
|
356
|
+
`telemetryLayer` builds an OTLP tracing/logging/metrics `Layer` for a stack's own `providers` —
|
|
357
|
+
off unless you give it real endpoints, no default collector anywhere in it.
|
|
358
|
+
|
|
359
|
+
```ts
|
|
360
|
+
import { telemetryLayer } from '@homeflare/alchemy/telemetry';
|
|
361
|
+
|
|
362
|
+
export const providers = Layer.mergeAll(
|
|
363
|
+
myProviders(),
|
|
364
|
+
telemetryLayer({
|
|
365
|
+
endpoints: { traces: 'http://<your-collector>/v1/traces' },
|
|
366
|
+
serviceName: 'my-stack',
|
|
367
|
+
}),
|
|
368
|
+
);
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
Every span — a provider's own, `HttpClient`'s, and alchemy's own plan/apply engine — is redacted
|
|
372
|
+
before export: every header dropped, every query string stripped, a denylisted host or path segment
|
|
373
|
+
blanked. Options, the redaction policy and what a spike measured actually arriving at a collector:
|
|
374
|
+
[docs/telemetry.md](./docs/telemetry.md) · [docs/telemetry-spike.md](./docs/telemetry-spike.md).
|
|
375
|
+
|
|
354
376
|
## Credentials
|
|
355
377
|
|
|
356
378
|
⛔ **Mint a short-lived, scoped token** — never a long-lived one, never a Global API Key. How each
|
package/dist/caddy/admin.d.ts
CHANGED
|
@@ -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
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
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
|
-
/**
|
|
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
|
|
59
|
-
*
|
|
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 |
|
|
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
|
|
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"}
|
package/dist/caddy/config.d.ts
CHANGED
|
@@ -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`
|
|
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 |
|
|
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
|
|
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;
|
|
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"}
|
package/dist/caddy/index.js
CHANGED
|
@@ -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=
|
|
1346
|
+
//# debugId=B368F4E9D50791DC64756E2164756E21
|
|
1343
1347
|
//# sourceMappingURL=index.js.map
|