@wildo-ai/platform-infra-providers 1.1.2
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/LICENSE +34 -0
- package/dist/esm/aws-s3/aws-s3.infra.module.d.ts +63 -0
- package/dist/esm/aws-s3/aws-s3.infra.module.d.ts.map +1 -0
- package/dist/esm/aws-s3/aws-s3.infra.module.js +110 -0
- package/dist/esm/aws-s3/aws-s3.infra.module.js.map +1 -0
- package/dist/esm/clamav-self/clamav-self.infra.module.d.ts +30 -0
- package/dist/esm/clamav-self/clamav-self.infra.module.d.ts.map +1 -0
- package/dist/esm/clamav-self/clamav-self.infra.module.js +61 -0
- package/dist/esm/clamav-self/clamav-self.infra.module.js.map +1 -0
- package/dist/esm/gotenberg-self/gotenberg-self.infra.module.d.ts +26 -0
- package/dist/esm/gotenberg-self/gotenberg-self.infra.module.d.ts.map +1 -0
- package/dist/esm/gotenberg-self/gotenberg-self.infra.module.js +54 -0
- package/dist/esm/gotenberg-self/gotenberg-self.infra.module.js.map +1 -0
- package/dist/esm/index.d.ts +88 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +125 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/minio-self/minio-self.infra.module.d.ts +64 -0
- package/dist/esm/minio-self/minio-self.infra.module.d.ts.map +1 -0
- package/dist/esm/minio-self/minio-self.infra.module.js +105 -0
- package/dist/esm/minio-self/minio-self.infra.module.js.map +1 -0
- package/dist/esm/mongodb-atlas/mongodb-atlas.infra.module.d.ts +52 -0
- package/dist/esm/mongodb-atlas/mongodb-atlas.infra.module.d.ts.map +1 -0
- package/dist/esm/mongodb-atlas/mongodb-atlas.infra.module.js +201 -0
- package/dist/esm/mongodb-atlas/mongodb-atlas.infra.module.js.map +1 -0
- package/dist/esm/mongodb-self/mongodb-self.infra.module.d.ts +81 -0
- package/dist/esm/mongodb-self/mongodb-self.infra.module.d.ts.map +1 -0
- package/dist/esm/mongodb-self/mongodb-self.infra.module.js +311 -0
- package/dist/esm/mongodb-self/mongodb-self.infra.module.js.map +1 -0
- package/dist/esm/postgres-self/postgres-self.infra.module.d.ts +70 -0
- package/dist/esm/postgres-self/postgres-self.infra.module.d.ts.map +1 -0
- package/dist/esm/postgres-self/postgres-self.infra.module.js +328 -0
- package/dist/esm/postgres-self/postgres-self.infra.module.js.map +1 -0
- package/dist/esm/rabbitmq-self/rabbitmq-self.infra.module.d.ts +88 -0
- package/dist/esm/rabbitmq-self/rabbitmq-self.infra.module.d.ts.map +1 -0
- package/dist/esm/rabbitmq-self/rabbitmq-self.infra.module.js +473 -0
- package/dist/esm/rabbitmq-self/rabbitmq-self.infra.module.js.map +1 -0
- package/dist/esm/redis-self/redis-self.infra.module.d.ts +89 -0
- package/dist/esm/redis-self/redis-self.infra.module.d.ts.map +1 -0
- package/dist/esm/redis-self/redis-self.infra.module.js +331 -0
- package/dist/esm/redis-self/redis-self.infra.module.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +52 -0
- package/src/aws-s3/__tests__/aws-s3.infra.module.test.ts +67 -0
- package/src/aws-s3/aws-s3.infra.module.ts +120 -0
- package/src/clamav-self/__tests__/clamav-self.infra.module.test.ts +65 -0
- package/src/clamav-self/clamav-self.infra.module.ts +72 -0
- package/src/gotenberg-self/__tests__/gotenberg-self.infra.module.test.ts +65 -0
- package/src/gotenberg-self/gotenberg-self.infra.module.ts +65 -0
- package/src/index.ts +133 -0
- package/src/minio-self/__tests__/minio-self.infra.module.test.ts +70 -0
- package/src/minio-self/minio-self.infra.module.ts +116 -0
- package/src/mongodb-atlas/__tests__/mongodb-atlas.infra.module.test.ts +198 -0
- package/src/mongodb-atlas/mongodb-atlas.infra.module.ts +236 -0
- package/src/mongodb-self/__tests__/mongodb-self.infra.module.test.ts +419 -0
- package/src/mongodb-self/mongodb-self.infra.module.ts +384 -0
- package/src/postgres-self/__tests__/postgres-self.infra.module.test.ts +344 -0
- package/src/postgres-self/postgres-self.infra.module.ts +377 -0
- package/src/rabbitmq-self/__tests__/rabbitmq-self.infra.module.test.ts +499 -0
- package/src/rabbitmq-self/rabbitmq-self.infra.module.ts +531 -0
- package/src/redis-self/__tests__/redis-self.infra.module.test.ts +341 -0
- package/src/redis-self/redis-self.infra.module.ts +372 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
Copyright (c) 2026 P2C Consulting, s.à r.l.-S
|
|
2
|
+
RCS Luxembourg B307591
|
|
3
|
+
6C, Porte de France, L-4360 Esch-sur-Alzette, Luxembourg
|
|
4
|
+
|
|
5
|
+
All rights reserved.
|
|
6
|
+
|
|
7
|
+
This software and its accompanying materials (the "Software") are the
|
|
8
|
+
confidential and proprietary property of P2C Consulting, s.à r.l.-S (the
|
|
9
|
+
"Licensor"). The Software is made available for viewing only. No licence,
|
|
10
|
+
right, or permission of any kind is granted by its publication or by its
|
|
11
|
+
availability on any package registry or source repository.
|
|
12
|
+
|
|
13
|
+
Without the Licensor's prior written permission, you may not use, copy,
|
|
14
|
+
reproduce, modify, adapt, translate, merge, publish, distribute, sublicense,
|
|
15
|
+
sell, host, or create derivative works of the Software, in whole or in part,
|
|
16
|
+
nor use it to provide a service to any third party.
|
|
17
|
+
|
|
18
|
+
Publication of the Software in any public registry is for distribution to
|
|
19
|
+
authorised recipients and for technical evaluation of its packaging only. It
|
|
20
|
+
does not place the Software in the public domain, does not constitute an open
|
|
21
|
+
source release, and does not waive any right of the Licensor.
|
|
22
|
+
|
|
23
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
24
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
25
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
26
|
+
LICENSOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
27
|
+
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
28
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
29
|
+
|
|
30
|
+
Third-party components distributed with the Software remain governed by their
|
|
31
|
+
own licences.
|
|
32
|
+
|
|
33
|
+
Contact: P2C Consulting, s.à r.l.-S, 6C, Porte de France, L-4360
|
|
34
|
+
Esch-sur-Alzette, Luxembourg.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `AwsS3InfraProviderModule` — seventh concrete `InfraProviderModule`
|
|
3
|
+
* (Slice 5.1 of `infra-provider-planner.md`).
|
|
4
|
+
*
|
|
5
|
+
* Implements the `AWS_S3` `InfraProvider`. Shares the one-bucket,
|
|
6
|
+
* prefix-namespaced object layout of `MinioSelfInfraProviderModule` —
|
|
7
|
+
* the only differences are (a) no compose / K8s contribution (S3 is
|
|
8
|
+
* managed), and (b) the bucket endpoint is the regional AWS hostname
|
|
9
|
+
* instead of the in-cluster `minio` service.
|
|
10
|
+
*
|
|
11
|
+
* ## ⚠️ NOT USABLE TODAY — selecting this provider leaves apps with no
|
|
12
|
+
* storage credential (2026-08-10)
|
|
13
|
+
*
|
|
14
|
+
* The application-tier `STORAGE_ACCESS_KEY` / `STORAGE_SECRET_KEY` env
|
|
15
|
+
* vars were removed **for every provider**: they were the object store's
|
|
16
|
+
* ROOT pair, handed to every app, minion and worker. Applications now
|
|
17
|
+
* obtain short-lived, prefix-confined credentials from apps-manager.
|
|
18
|
+
*
|
|
19
|
+
* That replacement is implemented for **MinIO only**. apps-manager's
|
|
20
|
+
* `ObjectStorageStsBrokerService` speaks MinIO's STS `AssumeRole` with an
|
|
21
|
+
* inline session policy; AWS STS requires a role ARN the broker does not
|
|
22
|
+
* supply, so an `AWS_S3` deployment would fail at storage initialisation
|
|
23
|
+
* with no credential and no path to one.
|
|
24
|
+
*
|
|
25
|
+
* No environment selects this provider today (every example uses
|
|
26
|
+
* `BackingServiceSource.SELF` → MinIO), which is why this is recorded as
|
|
27
|
+
* a gap rather than an outage. But it IS reachable — `s3: { source:
|
|
28
|
+
* MANAGED }` or `provider: 'aws'` resolves here — so **do not select
|
|
29
|
+
* `AWS_S3` until the AWS STS path exists.** Tracked in
|
|
30
|
+
* `.claude/plans/object-storage-root-credential-distribution.md`.
|
|
31
|
+
*
|
|
32
|
+
* The module still reuses the `STORAGE_*` env contract for the
|
|
33
|
+
* NON-secret values (endpoint, region, bucket, provider); it is only the
|
|
34
|
+
* credential half that is gone.
|
|
35
|
+
*
|
|
36
|
+
* **Why this module exists despite "no compose / no mint"**: it
|
|
37
|
+
* gives the lockfile a stable digest entry (so a switch from
|
|
38
|
+
* `minio-self` to `aws-s3` shows up as a `wildo lock check` drift)
|
|
39
|
+
* AND it formalizes which env vars the operator must set for AWS
|
|
40
|
+
* (`STORAGE_REGION` is mandatory; `STORAGE_ENDPOINT` is optional —
|
|
41
|
+
* defaults to the AWS regional endpoint when unset).
|
|
42
|
+
*
|
|
43
|
+
* **No mint methods here** — and the reason is no longer the one this
|
|
44
|
+
* block used to give. It said per-app credentials were out of scope
|
|
45
|
+
* "because the engine adapter uses a single shared SDK client", which
|
|
46
|
+
* stopped being true when the adapter moved to a credential provider that
|
|
47
|
+
* rebuilds its client whenever the credential changes. Per-application
|
|
48
|
+
* isolation exists; what is missing for AWS is only the broker's ability
|
|
49
|
+
* to speak AWS STS.
|
|
50
|
+
*
|
|
51
|
+
* Nor should the missing piece be per-app IAM users or roles, which is
|
|
52
|
+
* what this block previously anticipated. The MinIO path deliberately
|
|
53
|
+
* rejected long-lived per-principal accounts in favour of `AssumeRole`
|
|
54
|
+
* with an inline session policy — nothing long-lived exists to leak, and
|
|
55
|
+
* credential-rotation safety dissolves instead of needing a design. The
|
|
56
|
+
* AWS equivalent is the same shape: `AssumeRole` against a role ARN the
|
|
57
|
+
* operator supplies, with a session policy confining the principal to
|
|
58
|
+
* `applications/<applicationId>/`. That role ARN is the one input the
|
|
59
|
+
* broker does not have today, and is the whole of the gap.
|
|
60
|
+
*/
|
|
61
|
+
import { InfraProviderModule } from '@wildo-ai/platform-config-lib';
|
|
62
|
+
export declare const AwsS3InfraProviderModule: InfraProviderModule;
|
|
63
|
+
//# sourceMappingURL=aws-s3.infra.module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-s3.infra.module.d.ts","sourceRoot":"","sources":["../../../../src/aws-s3/aws-s3.infra.module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AAEH,OAAO,EAIL,mBAAmB,EAEpB,MAAM,+BAA+B,CAAC;AAEvC,eAAO,MAAM,wBAAwB,EAAE,mBAkDtC,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `AwsS3InfraProviderModule` — seventh concrete `InfraProviderModule`
|
|
3
|
+
* (Slice 5.1 of `infra-provider-planner.md`).
|
|
4
|
+
*
|
|
5
|
+
* Implements the `AWS_S3` `InfraProvider`. Shares the one-bucket,
|
|
6
|
+
* prefix-namespaced object layout of `MinioSelfInfraProviderModule` —
|
|
7
|
+
* the only differences are (a) no compose / K8s contribution (S3 is
|
|
8
|
+
* managed), and (b) the bucket endpoint is the regional AWS hostname
|
|
9
|
+
* instead of the in-cluster `minio` service.
|
|
10
|
+
*
|
|
11
|
+
* ## ⚠️ NOT USABLE TODAY — selecting this provider leaves apps with no
|
|
12
|
+
* storage credential (2026-08-10)
|
|
13
|
+
*
|
|
14
|
+
* The application-tier `STORAGE_ACCESS_KEY` / `STORAGE_SECRET_KEY` env
|
|
15
|
+
* vars were removed **for every provider**: they were the object store's
|
|
16
|
+
* ROOT pair, handed to every app, minion and worker. Applications now
|
|
17
|
+
* obtain short-lived, prefix-confined credentials from apps-manager.
|
|
18
|
+
*
|
|
19
|
+
* That replacement is implemented for **MinIO only**. apps-manager's
|
|
20
|
+
* `ObjectStorageStsBrokerService` speaks MinIO's STS `AssumeRole` with an
|
|
21
|
+
* inline session policy; AWS STS requires a role ARN the broker does not
|
|
22
|
+
* supply, so an `AWS_S3` deployment would fail at storage initialisation
|
|
23
|
+
* with no credential and no path to one.
|
|
24
|
+
*
|
|
25
|
+
* No environment selects this provider today (every example uses
|
|
26
|
+
* `BackingServiceSource.SELF` → MinIO), which is why this is recorded as
|
|
27
|
+
* a gap rather than an outage. But it IS reachable — `s3: { source:
|
|
28
|
+
* MANAGED }` or `provider: 'aws'` resolves here — so **do not select
|
|
29
|
+
* `AWS_S3` until the AWS STS path exists.** Tracked in
|
|
30
|
+
* `.claude/plans/object-storage-root-credential-distribution.md`.
|
|
31
|
+
*
|
|
32
|
+
* The module still reuses the `STORAGE_*` env contract for the
|
|
33
|
+
* NON-secret values (endpoint, region, bucket, provider); it is only the
|
|
34
|
+
* credential half that is gone.
|
|
35
|
+
*
|
|
36
|
+
* **Why this module exists despite "no compose / no mint"**: it
|
|
37
|
+
* gives the lockfile a stable digest entry (so a switch from
|
|
38
|
+
* `minio-self` to `aws-s3` shows up as a `wildo lock check` drift)
|
|
39
|
+
* AND it formalizes which env vars the operator must set for AWS
|
|
40
|
+
* (`STORAGE_REGION` is mandatory; `STORAGE_ENDPOINT` is optional —
|
|
41
|
+
* defaults to the AWS regional endpoint when unset).
|
|
42
|
+
*
|
|
43
|
+
* **No mint methods here** — and the reason is no longer the one this
|
|
44
|
+
* block used to give. It said per-app credentials were out of scope
|
|
45
|
+
* "because the engine adapter uses a single shared SDK client", which
|
|
46
|
+
* stopped being true when the adapter moved to a credential provider that
|
|
47
|
+
* rebuilds its client whenever the credential changes. Per-application
|
|
48
|
+
* isolation exists; what is missing for AWS is only the broker's ability
|
|
49
|
+
* to speak AWS STS.
|
|
50
|
+
*
|
|
51
|
+
* Nor should the missing piece be per-app IAM users or roles, which is
|
|
52
|
+
* what this block previously anticipated. The MinIO path deliberately
|
|
53
|
+
* rejected long-lived per-principal accounts in favour of `AssumeRole`
|
|
54
|
+
* with an inline session policy — nothing long-lived exists to leak, and
|
|
55
|
+
* credential-rotation safety dissolves instead of needing a design. The
|
|
56
|
+
* AWS equivalent is the same shape: `AssumeRole` against a role ARN the
|
|
57
|
+
* operator supplies, with a session policy confining the principal to
|
|
58
|
+
* `applications/<applicationId>/`. That role ARN is the one input the
|
|
59
|
+
* broker does not have today, and is the whole of the gap.
|
|
60
|
+
*/
|
|
61
|
+
import { InfraCapability, InfraPlatformAdminConsumer, InfraProvider, } from '@wildo-ai/platform-config-lib';
|
|
62
|
+
export const AwsS3InfraProviderModule = {
|
|
63
|
+
provider: InfraProvider.AWS_S3,
|
|
64
|
+
supportedCapabilities: [InfraCapability.OBJECT_STORAGE],
|
|
65
|
+
/**
|
|
66
|
+
* Shared bucket, shared access key — no per-app credential is minted, so there is nothing
|
|
67
|
+
* per-principal to confine. Confinement for object storage is done by STS session policy at
|
|
68
|
+
* request time, not by a secret in the application blob.
|
|
69
|
+
*/
|
|
70
|
+
perPrincipalSecretBlobPaths: [],
|
|
71
|
+
plan() {
|
|
72
|
+
return {
|
|
73
|
+
// No compose service — S3 is fully managed.
|
|
74
|
+
// No K8s manifest — same reason.
|
|
75
|
+
platformAdmin: {
|
|
76
|
+
envVars: {
|
|
77
|
+
STORAGE_PROVIDER: 's3',
|
|
78
|
+
// Endpoint and port have AWS defaults; operator may override
|
|
79
|
+
// for region-specific or VPC-endpoint topologies via the
|
|
80
|
+
// env's authored `backingServices.s3` config.
|
|
81
|
+
STORAGE_USE_SSL: 'true',
|
|
82
|
+
},
|
|
83
|
+
secretEnvVars: [
|
|
84
|
+
'STORAGE_ACCESS_KEY',
|
|
85
|
+
'STORAGE_SECRET_KEY',
|
|
86
|
+
// Region is sensitive-ish (deployment topology) and is
|
|
87
|
+
// delivered via the secret env channel for symmetry with
|
|
88
|
+
// the access keys, even though it's not strictly secret.
|
|
89
|
+
// The legacy treatment was env-var, not secret-env-var; if
|
|
90
|
+
// operators object, this can flip to `envVars` later
|
|
91
|
+
// without breaking the contract.
|
|
92
|
+
'STORAGE_REGION',
|
|
93
|
+
],
|
|
94
|
+
consumers: [
|
|
95
|
+
InfraPlatformAdminConsumer.APPS_MANAGER,
|
|
96
|
+
InfraPlatformAdminConsumer.COMPANION,
|
|
97
|
+
],
|
|
98
|
+
},
|
|
99
|
+
// Same shared bucket as MinIO_Self. Apps receive the NON-secret
|
|
100
|
+
// `STORAGE_*` values via the bootstrap env contract; the credential
|
|
101
|
+
// half is no longer emitted for any provider — see the ⚠️ block in
|
|
102
|
+
// this module's JSDoc for why that makes AWS_S3 currently unusable.
|
|
103
|
+
};
|
|
104
|
+
},
|
|
105
|
+
// No `mintAppCredentials` / `revokeAppCredentials` — not because the model
|
|
106
|
+
// is shared-bucket (it is, but that is not the reason), but because
|
|
107
|
+
// per-application isolation is delivered by BROKERED STS SESSIONS rather than
|
|
108
|
+
// by minted long-lived accounts. See this module's JSDoc.
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=aws-s3.infra.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-s3.infra.module.js","sourceRoot":"","sources":["../../../../src/aws-s3/aws-s3.infra.module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AAEH,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,aAAa,GAGd,MAAM,+BAA+B,CAAC;AAEvC,MAAM,CAAC,MAAM,wBAAwB,GAAwB;IAC3D,QAAQ,EAAE,aAAa,CAAC,MAAM;IAC9B,qBAAqB,EAAE,CAAC,eAAe,CAAC,cAAc,CAAC;IAEvD;;;;OAIG;IACH,2BAA2B,EAAE,EAAE;IAE/B,IAAI;QACF,OAAO;YACL,4CAA4C;YAC5C,iCAAiC;YACjC,aAAa,EAAE;gBACb,OAAO,EAAE;oBACP,gBAAgB,EAAE,IAAI;oBACtB,6DAA6D;oBAC7D,yDAAyD;oBACzD,8CAA8C;oBAC9C,eAAe,EAAE,MAAM;iBACxB;gBACD,aAAa,EAAE;oBACb,oBAAoB;oBACpB,oBAAoB;oBACpB,uDAAuD;oBACvD,yDAAyD;oBACzD,yDAAyD;oBACzD,2DAA2D;oBAC3D,qDAAqD;oBACrD,iCAAiC;oBACjC,gBAAgB;iBACjB;gBACD,SAAS,EAAE;oBACT,0BAA0B,CAAC,YAAY;oBACvC,0BAA0B,CAAC,SAAS;iBACrC;aACF;YACD,gEAAgE;YAChE,oEAAoE;YACpE,mEAAmE;YACnE,oEAAoE;SACrE,CAAC;IACJ,CAAC;IAED,2EAA2E;IAC3E,oEAAoE;IACpE,8EAA8E;IAC9E,0DAA0D;CAC3D,CAAC","sourcesContent":["/**\n * `AwsS3InfraProviderModule` — seventh concrete `InfraProviderModule`\n * (Slice 5.1 of `infra-provider-planner.md`).\n *\n * Implements the `AWS_S3` `InfraProvider`. Shares the one-bucket,\n * prefix-namespaced object layout of `MinioSelfInfraProviderModule` —\n * the only differences are (a) no compose / K8s contribution (S3 is\n * managed), and (b) the bucket endpoint is the regional AWS hostname\n * instead of the in-cluster `minio` service.\n *\n * ## ⚠️ NOT USABLE TODAY — selecting this provider leaves apps with no\n * storage credential (2026-08-10)\n *\n * The application-tier `STORAGE_ACCESS_KEY` / `STORAGE_SECRET_KEY` env\n * vars were removed **for every provider**: they were the object store's\n * ROOT pair, handed to every app, minion and worker. Applications now\n * obtain short-lived, prefix-confined credentials from apps-manager.\n *\n * That replacement is implemented for **MinIO only**. apps-manager's\n * `ObjectStorageStsBrokerService` speaks MinIO's STS `AssumeRole` with an\n * inline session policy; AWS STS requires a role ARN the broker does not\n * supply, so an `AWS_S3` deployment would fail at storage initialisation\n * with no credential and no path to one.\n *\n * No environment selects this provider today (every example uses\n * `BackingServiceSource.SELF` → MinIO), which is why this is recorded as\n * a gap rather than an outage. But it IS reachable — `s3: { source:\n * MANAGED }` or `provider: 'aws'` resolves here — so **do not select\n * `AWS_S3` until the AWS STS path exists.** Tracked in\n * `.claude/plans/object-storage-root-credential-distribution.md`.\n *\n * The module still reuses the `STORAGE_*` env contract for the\n * NON-secret values (endpoint, region, bucket, provider); it is only the\n * credential half that is gone.\n *\n * **Why this module exists despite \"no compose / no mint\"**: it\n * gives the lockfile a stable digest entry (so a switch from\n * `minio-self` to `aws-s3` shows up as a `wildo lock check` drift)\n * AND it formalizes which env vars the operator must set for AWS\n * (`STORAGE_REGION` is mandatory; `STORAGE_ENDPOINT` is optional —\n * defaults to the AWS regional endpoint when unset).\n *\n * **No mint methods here** — and the reason is no longer the one this\n * block used to give. It said per-app credentials were out of scope\n * \"because the engine adapter uses a single shared SDK client\", which\n * stopped being true when the adapter moved to a credential provider that\n * rebuilds its client whenever the credential changes. Per-application\n * isolation exists; what is missing for AWS is only the broker's ability\n * to speak AWS STS.\n *\n * Nor should the missing piece be per-app IAM users or roles, which is\n * what this block previously anticipated. The MinIO path deliberately\n * rejected long-lived per-principal accounts in favour of `AssumeRole`\n * with an inline session policy — nothing long-lived exists to leak, and\n * credential-rotation safety dissolves instead of needing a design. The\n * AWS equivalent is the same shape: `AssumeRole` against a role ARN the\n * operator supplies, with a session policy confining the principal to\n * `applications/<applicationId>/`. That role ARN is the one input the\n * broker does not have today, and is the whole of the gap.\n */\n\nimport {\n InfraCapability,\n InfraPlatformAdminConsumer,\n InfraProvider,\n InfraProviderModule,\n InfraProviderPlanContribution,\n} from '@wildo-ai/platform-config-lib';\n\nexport const AwsS3InfraProviderModule: InfraProviderModule = {\n provider: InfraProvider.AWS_S3,\n supportedCapabilities: [InfraCapability.OBJECT_STORAGE],\n\n /**\n * Shared bucket, shared access key — no per-app credential is minted, so there is nothing\n * per-principal to confine. Confinement for object storage is done by STS session policy at\n * request time, not by a secret in the application blob.\n */\n perPrincipalSecretBlobPaths: [],\n\n plan(): InfraProviderPlanContribution {\n return {\n // No compose service — S3 is fully managed.\n // No K8s manifest — same reason.\n platformAdmin: {\n envVars: {\n STORAGE_PROVIDER: 's3',\n // Endpoint and port have AWS defaults; operator may override\n // for region-specific or VPC-endpoint topologies via the\n // env's authored `backingServices.s3` config.\n STORAGE_USE_SSL: 'true',\n },\n secretEnvVars: [\n 'STORAGE_ACCESS_KEY',\n 'STORAGE_SECRET_KEY',\n // Region is sensitive-ish (deployment topology) and is\n // delivered via the secret env channel for symmetry with\n // the access keys, even though it's not strictly secret.\n // The legacy treatment was env-var, not secret-env-var; if\n // operators object, this can flip to `envVars` later\n // without breaking the contract.\n 'STORAGE_REGION',\n ],\n consumers: [\n InfraPlatformAdminConsumer.APPS_MANAGER,\n InfraPlatformAdminConsumer.COMPANION,\n ],\n },\n // Same shared bucket as MinIO_Self. Apps receive the NON-secret\n // `STORAGE_*` values via the bootstrap env contract; the credential\n // half is no longer emitted for any provider — see the ⚠️ block in\n // this module's JSDoc for why that makes AWS_S3 currently unusable.\n };\n },\n\n // No `mintAppCredentials` / `revokeAppCredentials` — not because the model\n // is shared-bucket (it is, but that is not the reason), but because\n // per-application isolation is delivered by BROKERED STS SESSIONS rather than\n // by minted long-lived accounts. See this module's JSDoc.\n};\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ClamavSelfInfraProviderModule` — eighth concrete `InfraProviderModule`
|
|
3
|
+
* (Slice 5.2 of `infra-provider-planner.md`).
|
|
4
|
+
*
|
|
5
|
+
* Implements the `CLAMAV_SELF` `InfraProvider`. **Stateless**: ClamAV
|
|
6
|
+
* is a network virus-scanning service with no auth and no per-tenant
|
|
7
|
+
* state. Apps connect to the shared host:port and submit files for
|
|
8
|
+
* scanning over the ClamAV protocol; nothing is persisted, nothing
|
|
9
|
+
* is per-app. The module's only job is to declare the resource +
|
|
10
|
+
* env vars in `plan()`; there are no `mintAppCredentials`,
|
|
11
|
+
* `revokeAppCredentials`, or `mintPlatformServiceCredentials`
|
|
12
|
+
* methods because there are no credentials.
|
|
13
|
+
*
|
|
14
|
+
* **Apps consume**: `CLAMAV_HOST`, `CLAMAV_PORT` env vars (delivered
|
|
15
|
+
* via the bootstrap env contract). The engine's antivirus-scanning
|
|
16
|
+
* adapter (`saas-backend-lib/.../antivirus/...`) opens a TCP
|
|
17
|
+
* connection per scan request.
|
|
18
|
+
*
|
|
19
|
+
* **Why declare it as a module at all (vs. inline compose service)?**
|
|
20
|
+
* The module gives the lockfile a stable `planContributionDigest`
|
|
21
|
+
* for `ANTIVIRUS_SCANNING` so `wildo lock check` catches drift in
|
|
22
|
+
* the ClamAV resource shape (port change, env-var rename, K8s
|
|
23
|
+
* manifest move). Without a module, the digest would be the
|
|
24
|
+
* authored-entry digest (which is empty — ClamAV has no configurable
|
|
25
|
+
* `BackingService` shape today, just the `BackingServiceKind`
|
|
26
|
+
* enum value).
|
|
27
|
+
*/
|
|
28
|
+
import { InfraProviderModule } from '@wildo-ai/platform-config-lib';
|
|
29
|
+
export declare const ClamavSelfInfraProviderModule: InfraProviderModule;
|
|
30
|
+
//# sourceMappingURL=clamav-self.infra.module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clamav-self.infra.module.d.ts","sourceRoot":"","sources":["../../../../src/clamav-self/clamav-self.infra.module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAIL,mBAAmB,EAEpB,MAAM,+BAA+B,CAAC;AAIvC,eAAO,MAAM,6BAA6B,EAAE,mBAiC3C,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ClamavSelfInfraProviderModule` — eighth concrete `InfraProviderModule`
|
|
3
|
+
* (Slice 5.2 of `infra-provider-planner.md`).
|
|
4
|
+
*
|
|
5
|
+
* Implements the `CLAMAV_SELF` `InfraProvider`. **Stateless**: ClamAV
|
|
6
|
+
* is a network virus-scanning service with no auth and no per-tenant
|
|
7
|
+
* state. Apps connect to the shared host:port and submit files for
|
|
8
|
+
* scanning over the ClamAV protocol; nothing is persisted, nothing
|
|
9
|
+
* is per-app. The module's only job is to declare the resource +
|
|
10
|
+
* env vars in `plan()`; there are no `mintAppCredentials`,
|
|
11
|
+
* `revokeAppCredentials`, or `mintPlatformServiceCredentials`
|
|
12
|
+
* methods because there are no credentials.
|
|
13
|
+
*
|
|
14
|
+
* **Apps consume**: `CLAMAV_HOST`, `CLAMAV_PORT` env vars (delivered
|
|
15
|
+
* via the bootstrap env contract). The engine's antivirus-scanning
|
|
16
|
+
* adapter (`saas-backend-lib/.../antivirus/...`) opens a TCP
|
|
17
|
+
* connection per scan request.
|
|
18
|
+
*
|
|
19
|
+
* **Why declare it as a module at all (vs. inline compose service)?**
|
|
20
|
+
* The module gives the lockfile a stable `planContributionDigest`
|
|
21
|
+
* for `ANTIVIRUS_SCANNING` so `wildo lock check` catches drift in
|
|
22
|
+
* the ClamAV resource shape (port change, env-var rename, K8s
|
|
23
|
+
* manifest move). Without a module, the digest would be the
|
|
24
|
+
* authored-entry digest (which is empty — ClamAV has no configurable
|
|
25
|
+
* `BackingService` shape today, just the `BackingServiceKind`
|
|
26
|
+
* enum value).
|
|
27
|
+
*/
|
|
28
|
+
import { InfraCapability, InfraPlatformAdminConsumer, InfraProvider, } from '@wildo-ai/platform-config-lib';
|
|
29
|
+
const DEFAULT_CLAMAV_PORT = 3310;
|
|
30
|
+
export const ClamavSelfInfraProviderModule = {
|
|
31
|
+
provider: InfraProvider.CLAMAV_SELF,
|
|
32
|
+
supportedCapabilities: [InfraCapability.ANTIVIRUS_SCANNING],
|
|
33
|
+
/**
|
|
34
|
+
* Stateless infra with no authentication and no per-app state — `plan()` only.
|
|
35
|
+
*/
|
|
36
|
+
perPrincipalSecretBlobPaths: [],
|
|
37
|
+
plan() {
|
|
38
|
+
return {
|
|
39
|
+
dockerComposeServices: ['clamav'],
|
|
40
|
+
k8sResources: ['templates/infra/k8s/internal/clamav/deployment.yaml.hbs'],
|
|
41
|
+
platformAdmin: {
|
|
42
|
+
envVars: {
|
|
43
|
+
CLAMAV_HOST: 'clamav',
|
|
44
|
+
CLAMAV_PORT: String(DEFAULT_CLAMAV_PORT),
|
|
45
|
+
},
|
|
46
|
+
// No secret env vars — ClamAV has no auth.
|
|
47
|
+
// Audience-1 declared so the planner emits the env vars to
|
|
48
|
+
// both apps-manager and companion (companion runs scans
|
|
49
|
+
// locally during dev for parity with prod behavior).
|
|
50
|
+
consumers: [
|
|
51
|
+
InfraPlatformAdminConsumer.APPS_MANAGER,
|
|
52
|
+
InfraPlatformAdminConsumer.COMPANION,
|
|
53
|
+
],
|
|
54
|
+
},
|
|
55
|
+
// No `appRuntime` blob paths — apps connect via the same
|
|
56
|
+
// `CLAMAV_HOST:CLAMAV_PORT` regardless of app identity.
|
|
57
|
+
};
|
|
58
|
+
},
|
|
59
|
+
// No mint methods — ClamAV is stateless.
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=clamav-self.infra.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clamav-self.infra.module.js","sourceRoot":"","sources":["../../../../src/clamav-self/clamav-self.infra.module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,aAAa,GAGd,MAAM,+BAA+B,CAAC;AAEvC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,MAAM,CAAC,MAAM,6BAA6B,GAAwB;IAChE,QAAQ,EAAE,aAAa,CAAC,WAAW;IACnC,qBAAqB,EAAE,CAAC,eAAe,CAAC,kBAAkB,CAAC;IAE3D;;OAEG;IACH,2BAA2B,EAAE,EAAE;IAE/B,IAAI;QACF,OAAO;YACL,qBAAqB,EAAE,CAAC,QAAQ,CAAC;YACjC,YAAY,EAAE,CAAC,yDAAyD,CAAC;YACzE,aAAa,EAAE;gBACb,OAAO,EAAE;oBACP,WAAW,EAAE,QAAQ;oBACrB,WAAW,EAAE,MAAM,CAAC,mBAAmB,CAAC;iBACzC;gBACD,2CAA2C;gBAC3C,2DAA2D;gBAC3D,wDAAwD;gBACxD,qDAAqD;gBACrD,SAAS,EAAE;oBACT,0BAA0B,CAAC,YAAY;oBACvC,0BAA0B,CAAC,SAAS;iBACrC;aACF;YACD,yDAAyD;YACzD,wDAAwD;SACzD,CAAC;IACJ,CAAC;IAED,yCAAyC;CAC1C,CAAC","sourcesContent":["/**\n * `ClamavSelfInfraProviderModule` — eighth concrete `InfraProviderModule`\n * (Slice 5.2 of `infra-provider-planner.md`).\n *\n * Implements the `CLAMAV_SELF` `InfraProvider`. **Stateless**: ClamAV\n * is a network virus-scanning service with no auth and no per-tenant\n * state. Apps connect to the shared host:port and submit files for\n * scanning over the ClamAV protocol; nothing is persisted, nothing\n * is per-app. The module's only job is to declare the resource +\n * env vars in `plan()`; there are no `mintAppCredentials`,\n * `revokeAppCredentials`, or `mintPlatformServiceCredentials`\n * methods because there are no credentials.\n *\n * **Apps consume**: `CLAMAV_HOST`, `CLAMAV_PORT` env vars (delivered\n * via the bootstrap env contract). The engine's antivirus-scanning\n * adapter (`saas-backend-lib/.../antivirus/...`) opens a TCP\n * connection per scan request.\n *\n * **Why declare it as a module at all (vs. inline compose service)?**\n * The module gives the lockfile a stable `planContributionDigest`\n * for `ANTIVIRUS_SCANNING` so `wildo lock check` catches drift in\n * the ClamAV resource shape (port change, env-var rename, K8s\n * manifest move). Without a module, the digest would be the\n * authored-entry digest (which is empty — ClamAV has no configurable\n * `BackingService` shape today, just the `BackingServiceKind`\n * enum value).\n */\n\nimport {\n InfraCapability,\n InfraPlatformAdminConsumer,\n InfraProvider,\n InfraProviderModule,\n InfraProviderPlanContribution,\n} from '@wildo-ai/platform-config-lib';\n\nconst DEFAULT_CLAMAV_PORT = 3310;\n\nexport const ClamavSelfInfraProviderModule: InfraProviderModule = {\n provider: InfraProvider.CLAMAV_SELF,\n supportedCapabilities: [InfraCapability.ANTIVIRUS_SCANNING],\n\n /**\n * Stateless infra with no authentication and no per-app state — `plan()` only.\n */\n perPrincipalSecretBlobPaths: [],\n\n plan(): InfraProviderPlanContribution {\n return {\n dockerComposeServices: ['clamav'],\n k8sResources: ['templates/infra/k8s/internal/clamav/deployment.yaml.hbs'],\n platformAdmin: {\n envVars: {\n CLAMAV_HOST: 'clamav',\n CLAMAV_PORT: String(DEFAULT_CLAMAV_PORT),\n },\n // No secret env vars — ClamAV has no auth.\n // Audience-1 declared so the planner emits the env vars to\n // both apps-manager and companion (companion runs scans\n // locally during dev for parity with prod behavior).\n consumers: [\n InfraPlatformAdminConsumer.APPS_MANAGER,\n InfraPlatformAdminConsumer.COMPANION,\n ],\n },\n // No `appRuntime` blob paths — apps connect via the same\n // `CLAMAV_HOST:CLAMAV_PORT` regardless of app identity.\n };\n },\n\n // No mint methods — ClamAV is stateless.\n};\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `GotenbergSelfInfraProviderModule` — ninth concrete
|
|
3
|
+
* `InfraProviderModule` (Slice 5.3 of `infra-provider-planner.md`).
|
|
4
|
+
*
|
|
5
|
+
* Implements the `GOTENBERG_SELF` `InfraProvider`. **Stateless**:
|
|
6
|
+
* Gotenberg is a network HTML-to-PDF rendering service with no auth
|
|
7
|
+
* and no per-tenant state. Apps POST HTML/Office docs and receive
|
|
8
|
+
* rendered PDFs; nothing is persisted server-side. Same shape as
|
|
9
|
+
* `ClamavSelfInfraProviderModule` — `plan()` only, no mint methods.
|
|
10
|
+
*
|
|
11
|
+
* **Apps consume**: `GOTENBERG_HOST`, `GOTENBERG_PORT` env vars (TBD
|
|
12
|
+
* naming — current engine adapter reads these from
|
|
13
|
+
* `BackingServicesEnvConfig` via the catalog at
|
|
14
|
+
* `wildo-cli/.../service-catalog.schemas.ts:78`). The plan emits
|
|
15
|
+
* the env vars under those names.
|
|
16
|
+
*
|
|
17
|
+
* **Two ports** (Slice 5.3 design note): Gotenberg exposes both a
|
|
18
|
+
* public port (3000 by default) for HTTP API access and an internal
|
|
19
|
+
* port (3001) for health-check/metrics. The CLI's docker-compose
|
|
20
|
+
* generator already wires both. The module's `plan()` only emits
|
|
21
|
+
* the public port — the internal port is a docker-compose-only
|
|
22
|
+
* concern and isn't part of the customer-app env-var surface.
|
|
23
|
+
*/
|
|
24
|
+
import { InfraProviderModule } from '@wildo-ai/platform-config-lib';
|
|
25
|
+
export declare const GotenbergSelfInfraProviderModule: InfraProviderModule;
|
|
26
|
+
//# sourceMappingURL=gotenberg-self.infra.module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gotenberg-self.infra.module.d.ts","sourceRoot":"","sources":["../../../../src/gotenberg-self/gotenberg-self.infra.module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAIL,mBAAmB,EAEpB,MAAM,+BAA+B,CAAC;AAIvC,eAAO,MAAM,gCAAgC,EAAE,mBA8B9C,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `GotenbergSelfInfraProviderModule` — ninth concrete
|
|
3
|
+
* `InfraProviderModule` (Slice 5.3 of `infra-provider-planner.md`).
|
|
4
|
+
*
|
|
5
|
+
* Implements the `GOTENBERG_SELF` `InfraProvider`. **Stateless**:
|
|
6
|
+
* Gotenberg is a network HTML-to-PDF rendering service with no auth
|
|
7
|
+
* and no per-tenant state. Apps POST HTML/Office docs and receive
|
|
8
|
+
* rendered PDFs; nothing is persisted server-side. Same shape as
|
|
9
|
+
* `ClamavSelfInfraProviderModule` — `plan()` only, no mint methods.
|
|
10
|
+
*
|
|
11
|
+
* **Apps consume**: `GOTENBERG_HOST`, `GOTENBERG_PORT` env vars (TBD
|
|
12
|
+
* naming — current engine adapter reads these from
|
|
13
|
+
* `BackingServicesEnvConfig` via the catalog at
|
|
14
|
+
* `wildo-cli/.../service-catalog.schemas.ts:78`). The plan emits
|
|
15
|
+
* the env vars under those names.
|
|
16
|
+
*
|
|
17
|
+
* **Two ports** (Slice 5.3 design note): Gotenberg exposes both a
|
|
18
|
+
* public port (3000 by default) for HTTP API access and an internal
|
|
19
|
+
* port (3001) for health-check/metrics. The CLI's docker-compose
|
|
20
|
+
* generator already wires both. The module's `plan()` only emits
|
|
21
|
+
* the public port — the internal port is a docker-compose-only
|
|
22
|
+
* concern and isn't part of the customer-app env-var surface.
|
|
23
|
+
*/
|
|
24
|
+
import { InfraCapability, InfraPlatformAdminConsumer, InfraProvider, } from '@wildo-ai/platform-config-lib';
|
|
25
|
+
const DEFAULT_GOTENBERG_PORT = 3000;
|
|
26
|
+
export const GotenbergSelfInfraProviderModule = {
|
|
27
|
+
provider: InfraProvider.GOTENBERG_SELF,
|
|
28
|
+
supportedCapabilities: [InfraCapability.DOCUMENT_RENDERING],
|
|
29
|
+
/**
|
|
30
|
+
* Stateless infra with no authentication and no per-app state — `plan()` only.
|
|
31
|
+
*/
|
|
32
|
+
perPrincipalSecretBlobPaths: [],
|
|
33
|
+
plan() {
|
|
34
|
+
return {
|
|
35
|
+
dockerComposeServices: ['gotenberg'],
|
|
36
|
+
k8sResources: ['templates/infra/k8s/internal/gotenberg/deployment.yaml.hbs'],
|
|
37
|
+
platformAdmin: {
|
|
38
|
+
envVars: {
|
|
39
|
+
GOTENBERG_HOST: 'gotenberg',
|
|
40
|
+
GOTENBERG_PORT: String(DEFAULT_GOTENBERG_PORT),
|
|
41
|
+
},
|
|
42
|
+
// No secret env vars — Gotenberg has no auth.
|
|
43
|
+
consumers: [
|
|
44
|
+
InfraPlatformAdminConsumer.APPS_MANAGER,
|
|
45
|
+
InfraPlatformAdminConsumer.COMPANION,
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
// No `appRuntime` blob paths — apps connect via the same
|
|
49
|
+
// `GOTENBERG_HOST:GOTENBERG_PORT` regardless of app identity.
|
|
50
|
+
};
|
|
51
|
+
},
|
|
52
|
+
// No mint methods — Gotenberg is stateless.
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=gotenberg-self.infra.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gotenberg-self.infra.module.js","sourceRoot":"","sources":["../../../../src/gotenberg-self/gotenberg-self.infra.module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,aAAa,GAGd,MAAM,+BAA+B,CAAC;AAEvC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAEpC,MAAM,CAAC,MAAM,gCAAgC,GAAwB;IACnE,QAAQ,EAAE,aAAa,CAAC,cAAc;IACtC,qBAAqB,EAAE,CAAC,eAAe,CAAC,kBAAkB,CAAC;IAE3D;;OAEG;IACH,2BAA2B,EAAE,EAAE;IAE/B,IAAI;QACF,OAAO;YACL,qBAAqB,EAAE,CAAC,WAAW,CAAC;YACpC,YAAY,EAAE,CAAC,4DAA4D,CAAC;YAC5E,aAAa,EAAE;gBACb,OAAO,EAAE;oBACP,cAAc,EAAE,WAAW;oBAC3B,cAAc,EAAE,MAAM,CAAC,sBAAsB,CAAC;iBAC/C;gBACD,8CAA8C;gBAC9C,SAAS,EAAE;oBACT,0BAA0B,CAAC,YAAY;oBACvC,0BAA0B,CAAC,SAAS;iBACrC;aACF;YACD,yDAAyD;YACzD,8DAA8D;SAC/D,CAAC;IACJ,CAAC;IAED,4CAA4C;CAC7C,CAAC","sourcesContent":["/**\n * `GotenbergSelfInfraProviderModule` — ninth concrete\n * `InfraProviderModule` (Slice 5.3 of `infra-provider-planner.md`).\n *\n * Implements the `GOTENBERG_SELF` `InfraProvider`. **Stateless**:\n * Gotenberg is a network HTML-to-PDF rendering service with no auth\n * and no per-tenant state. Apps POST HTML/Office docs and receive\n * rendered PDFs; nothing is persisted server-side. Same shape as\n * `ClamavSelfInfraProviderModule` — `plan()` only, no mint methods.\n *\n * **Apps consume**: `GOTENBERG_HOST`, `GOTENBERG_PORT` env vars (TBD\n * naming — current engine adapter reads these from\n * `BackingServicesEnvConfig` via the catalog at\n * `wildo-cli/.../service-catalog.schemas.ts:78`). The plan emits\n * the env vars under those names.\n *\n * **Two ports** (Slice 5.3 design note): Gotenberg exposes both a\n * public port (3000 by default) for HTTP API access and an internal\n * port (3001) for health-check/metrics. The CLI's docker-compose\n * generator already wires both. The module's `plan()` only emits\n * the public port — the internal port is a docker-compose-only\n * concern and isn't part of the customer-app env-var surface.\n */\n\nimport {\n InfraCapability,\n InfraPlatformAdminConsumer,\n InfraProvider,\n InfraProviderModule,\n InfraProviderPlanContribution,\n} from '@wildo-ai/platform-config-lib';\n\nconst DEFAULT_GOTENBERG_PORT = 3000;\n\nexport const GotenbergSelfInfraProviderModule: InfraProviderModule = {\n provider: InfraProvider.GOTENBERG_SELF,\n supportedCapabilities: [InfraCapability.DOCUMENT_RENDERING],\n\n /**\n * Stateless infra with no authentication and no per-app state — `plan()` only.\n */\n perPrincipalSecretBlobPaths: [],\n\n plan(): InfraProviderPlanContribution {\n return {\n dockerComposeServices: ['gotenberg'],\n k8sResources: ['templates/infra/k8s/internal/gotenberg/deployment.yaml.hbs'],\n platformAdmin: {\n envVars: {\n GOTENBERG_HOST: 'gotenberg',\n GOTENBERG_PORT: String(DEFAULT_GOTENBERG_PORT),\n },\n // No secret env vars — Gotenberg has no auth.\n consumers: [\n InfraPlatformAdminConsumer.APPS_MANAGER,\n InfraPlatformAdminConsumer.COMPANION,\n ],\n },\n // No `appRuntime` blob paths — apps connect via the same\n // `GOTENBERG_HOST:GOTENBERG_PORT` regardless of app identity.\n };\n },\n\n // No mint methods — Gotenberg is stateless.\n};\n"]}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@wildo-ai/platform-infra-providers` — concrete `InfraProviderModule`
|
|
3
|
+
* catalog (Slice 2.5c-1 of `infra-provider-planner.md`).
|
|
4
|
+
*
|
|
5
|
+
* Tier-portable: the modules import only `@wildo-ai/platform-config-lib`
|
|
6
|
+
* (contracts) and have no DI / mongoose / axios runtime dependencies.
|
|
7
|
+
* This lets both `platform-apps-manager` (orchestrator) and
|
|
8
|
+
* `wildo-cli` (lockfile materializer) consume the same module
|
|
9
|
+
* objects — apps-manager passes a real admin-client implementation
|
|
10
|
+
* via `AppCredentialMintingContext.adminClient`; wildo-cli only
|
|
11
|
+
* needs `module.plan()` for the lockfile digest.
|
|
12
|
+
*
|
|
13
|
+
* Each module is exported by name (no intermediary barrels per
|
|
14
|
+
* platform/CLAUDE.md "no intermediary index.ts barrels"). The
|
|
15
|
+
* `INFRA_PROVIDER_MODULES` map below is the canonical catalog —
|
|
16
|
+
* consumers iterate it (or look up by `InfraProvider` value) instead
|
|
17
|
+
* of importing modules one by one.
|
|
18
|
+
*/
|
|
19
|
+
import type { InfraProvider, InfraProviderModule } from '@wildo-ai/platform-config-lib';
|
|
20
|
+
export { RabbitmqSelfInfraProviderModule } from './rabbitmq-self/rabbitmq-self.infra.module';
|
|
21
|
+
export { RedisSelfInfraProviderModule } from './redis-self/redis-self.infra.module';
|
|
22
|
+
export { PostgresSelfInfraProviderModule } from './postgres-self/postgres-self.infra.module';
|
|
23
|
+
export { MongodbAtlasInfraProviderModule } from './mongodb-atlas/mongodb-atlas.infra.module';
|
|
24
|
+
export { MongodbSelfInfraProviderModule } from './mongodb-self/mongodb-self.infra.module';
|
|
25
|
+
export { MinioSelfInfraProviderModule } from './minio-self/minio-self.infra.module';
|
|
26
|
+
export { AwsS3InfraProviderModule } from './aws-s3/aws-s3.infra.module';
|
|
27
|
+
export { ClamavSelfInfraProviderModule } from './clamav-self/clamav-self.infra.module';
|
|
28
|
+
export { GotenbergSelfInfraProviderModule } from './gotenberg-self/gotenberg-self.infra.module';
|
|
29
|
+
/**
|
|
30
|
+
* Canonical `InfraProvider` → `InfraProviderModule` catalog. Caller
|
|
31
|
+
* (CLI, apps-manager) builds a `Map<InfraProvider, InfraProviderModule>`
|
|
32
|
+
* from this constant when threading modules into
|
|
33
|
+
* `materializeInfraSection`.
|
|
34
|
+
*
|
|
35
|
+
* **Why a const array instead of a `Map` literal**: arrays serialize
|
|
36
|
+
* stably under tsc and roll up to a deterministic order. The
|
|
37
|
+
* downstream `Map` is built once at program start; the catalog
|
|
38
|
+
* itself is a value-level fixture.
|
|
39
|
+
*
|
|
40
|
+
* **Coverage** (Slice 5 baseline, 2026-05-10):
|
|
41
|
+
* - `RABBITMQ_SELF`, `REDIS_SELF`, `POSTGRES_SELF`, `MONGODB_SELF`,
|
|
42
|
+
* `MONGODB_ATLAS` — five stateful modules with mint/revoke
|
|
43
|
+
* methods.
|
|
44
|
+
* - `MINIO_SELF`, `AWS_S3` — object storage (shared-bucket model;
|
|
45
|
+
* no per-app credentials).
|
|
46
|
+
* - `CLAMAV_SELF`, `GOTENBERG_SELF` — stateless infra (no auth, no
|
|
47
|
+
* per-app state; `plan()` only).
|
|
48
|
+
*
|
|
49
|
+
* **NOT covered** (catalog entries without modules):
|
|
50
|
+
* - `POSTGRES_MANAGED`, `POSTGRES_AWS_RDS`, `POSTGRES_GCP_CLOUD_SQL`,
|
|
51
|
+
* `POSTGRES_AZURE_DATABASE`, `POSTGRES_SUPABASE`, `POSTGRES_NEON`,
|
|
52
|
+
* `POSTGRES_RENDER` — managed-Postgres brand catalog entries
|
|
53
|
+
* (Slice 4.B.0). No module yet; trigger = real customer.
|
|
54
|
+
*
|
|
55
|
+
* `materializeInfraSection` falls back to the authored-entry digest
|
|
56
|
+
* when a selected `InfraProvider` is not in the map (preserves the
|
|
57
|
+
* Slice 2.5b behavior for uncovered providers).
|
|
58
|
+
*/
|
|
59
|
+
export declare const INFRA_PROVIDER_MODULES: ReadonlyArray<InfraProviderModule>;
|
|
60
|
+
/**
|
|
61
|
+
* Every `Wildo_Application_Secrets` JSON path that ANY provider module can mint per runtime
|
|
62
|
+
* principal — the union of the catalog's own static declarations.
|
|
63
|
+
*
|
|
64
|
+
* ## Why this is derived rather than written down
|
|
65
|
+
*
|
|
66
|
+
* The consumer is the secret-DELIVERY path in apps-manager: it strips exactly this set from the
|
|
67
|
+
* application blob before overlaying a principal's own material, so a principal receives a
|
|
68
|
+
* credential only where one was minted FOR IT. A hand-maintained copy at that consumer would be a
|
|
69
|
+
* second source — add a provider that mints a new credential path and delivery keeps shipping the
|
|
70
|
+
* APPLICATION's value for it, silently. That is the defect class this repo has paid for twice: the
|
|
71
|
+
* party that CONSTRAINS is not the party that DECLARES.
|
|
72
|
+
*
|
|
73
|
+
* Derived from `INFRA_PROVIDER_MODULES`, so a new module is covered the day it enters the catalog.
|
|
74
|
+
*
|
|
75
|
+
* Deliberately the union across ALL modules, not the ones a given application selected: a principal
|
|
76
|
+
* must not receive an application-wide credential for a provider it does not use either, and the
|
|
77
|
+
* selected set is not knowable at the delivery call site without threading app config through it.
|
|
78
|
+
* Stripping a path no module minted for this app is harmless — it is absent from the blob anyway.
|
|
79
|
+
*/
|
|
80
|
+
export declare function collectPerPrincipalSecretBlobPaths(): ReadonlySet<string>;
|
|
81
|
+
/**
|
|
82
|
+
* Build a `Map<InfraProvider, InfraProviderModule>` for the
|
|
83
|
+
* canonical catalog. Callers store the result once at startup and
|
|
84
|
+
* pass it to `materializeInfraSection` (digest derivation) or to
|
|
85
|
+
* orchestrator paths that look up modules by `InfraProvider`.
|
|
86
|
+
*/
|
|
87
|
+
export declare function buildInfraProviderModuleMap(): ReadonlyMap<InfraProvider, InfraProviderModule>;
|
|
88
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAaxF,OAAO,EAAE,+BAA+B,EAAE,MAAM,4CAA4C,CAAC;AAC7F,OAAO,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AACpF,OAAO,EAAE,+BAA+B,EAAE,MAAM,4CAA4C,CAAC;AAC7F,OAAO,EAAE,+BAA+B,EAAE,MAAM,4CAA4C,CAAC;AAC7F,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAC1F,OAAO,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AACpF,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,gCAAgC,EAAE,MAAM,8CAA8C,CAAC;AAEhG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,sBAAsB,EAAE,aAAa,CAAC,mBAAmB,CAUrE,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kCAAkC,IAAI,WAAW,CAAC,MAAM,CAAC,CAQxE;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,IAAI,WAAW,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAY7F"}
|