@ctxpipe/aws-cdk 0.0.0-beta-20260528142254

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 (54) hide show
  1. package/README.md +131 -0
  2. package/lib/ctxpipe.d.ts +20 -0
  3. package/lib/ctxpipe.d.ts.map +1 -0
  4. package/lib/ctxpipe.js +322 -0
  5. package/lib/ctxpipe.js.map +1 -0
  6. package/lib/index.d.ts +3 -0
  7. package/lib/index.d.ts.map +1 -0
  8. package/lib/index.js +6 -0
  9. package/lib/index.js.map +1 -0
  10. package/lib/internal/contracts.d.ts +154 -0
  11. package/lib/internal/contracts.d.ts.map +1 -0
  12. package/lib/internal/contracts.js +3 -0
  13. package/lib/internal/contracts.js.map +1 -0
  14. package/lib/internal/data-plane-construct.d.ts +7 -0
  15. package/lib/internal/data-plane-construct.d.ts.map +1 -0
  16. package/lib/internal/data-plane-construct.js +114 -0
  17. package/lib/internal/data-plane-construct.js.map +1 -0
  18. package/lib/internal/ingress-construct.d.ts +7 -0
  19. package/lib/internal/ingress-construct.d.ts.map +1 -0
  20. package/lib/internal/ingress-construct.js +94 -0
  21. package/lib/internal/ingress-construct.js.map +1 -0
  22. package/lib/internal/migrate-on-deploy-construct.d.ts +7 -0
  23. package/lib/internal/migrate-on-deploy-construct.d.ts.map +1 -0
  24. package/lib/internal/migrate-on-deploy-construct.js +208 -0
  25. package/lib/internal/migrate-on-deploy-construct.js.map +1 -0
  26. package/lib/internal/networking-construct.d.ts +7 -0
  27. package/lib/internal/networking-construct.d.ts.map +1 -0
  28. package/lib/internal/networking-construct.js +112 -0
  29. package/lib/internal/networking-construct.js.map +1 -0
  30. package/lib/internal/outputs-construct.d.ts +6 -0
  31. package/lib/internal/outputs-construct.d.ts.map +1 -0
  32. package/lib/internal/outputs-construct.js +65 -0
  33. package/lib/internal/outputs-construct.js.map +1 -0
  34. package/lib/internal/secrets-construct.d.ts +7 -0
  35. package/lib/internal/secrets-construct.d.ts.map +1 -0
  36. package/lib/internal/secrets-construct.js +211 -0
  37. package/lib/internal/secrets-construct.js.map +1 -0
  38. package/lib/internal/services-construct.d.ts +7 -0
  39. package/lib/internal/services-construct.d.ts.map +1 -0
  40. package/lib/internal/services-construct.js +123 -0
  41. package/lib/internal/services-construct.js.map +1 -0
  42. package/lib/internal/task-definitions-construct.d.ts +8 -0
  43. package/lib/internal/task-definitions-construct.d.ts.map +1 -0
  44. package/lib/internal/task-definitions-construct.js +204 -0
  45. package/lib/internal/task-definitions-construct.js.map +1 -0
  46. package/lib/pinned-service-image-tag.d.ts +7 -0
  47. package/lib/pinned-service-image-tag.d.ts.map +1 -0
  48. package/lib/pinned-service-image-tag.js +11 -0
  49. package/lib/pinned-service-image-tag.js.map +1 -0
  50. package/lib/types.d.ts +57 -0
  51. package/lib/types.d.ts.map +1 -0
  52. package/lib/types.js +3 -0
  53. package/lib/types.js.map +1 -0
  54. package/package.json +41 -0
package/README.md ADDED
@@ -0,0 +1,131 @@
1
+ # @ctxpipe/aws-cdk
2
+
3
+ TypeScript AWS CDK library for deploying ctxpipe self-host infrastructure with one high-level construct: `CtxPipe`.
4
+
5
+ ## Quickstart
6
+
7
+ ```ts
8
+ import * as cdk from "aws-cdk-lib";
9
+ import { CtxPipe } from "@ctxpipe/aws-cdk";
10
+
11
+ const app = new cdk.App();
12
+ const stack = new cdk.Stack(app, "CtxPipeStack");
13
+
14
+ new CtxPipe(stack, "CtxPipe", {
15
+ orgSlug: "acme",
16
+ size: "medium",
17
+ customDomain: {
18
+ domainName: "app.example.com",
19
+ hostedZoneId: "Z0123456789ABCDEF",
20
+ },
21
+ modelProvider: {
22
+ baseUrl: "https://api.openai.com/v1",
23
+ apiKey: cdk.SecretValue.unsafePlainText("replace-model-api-key"),
24
+ defaultModel: "gpt-4.1-mini",
25
+ },
26
+ });
27
+ ```
28
+
29
+ Deploy with your CDK app as usual (`cdk synth`, then `cdk deploy`).
30
+
31
+ ## Required props
32
+
33
+ - `modelProvider`: OpenAI-compatible model endpoint, key, and model ID.
34
+ - `orgSlug`: organization slug used by the deployed instance. Neptune is single-graph per cluster, so this construct configures one org per stack.
35
+ - `customDomain`: provide `domainName` and `hostedZoneId` to set the public URL to `https://<domainName>` and add:
36
+ - ACM certificate for the domain (DNS validated in the provided hosted zone),
37
+ - Route53 DNS validation records required by ACM,
38
+ - Route53 ALB alias records,
39
+ - HTTPS listener on ALB,
40
+ - HTTP -> HTTPS redirect.
41
+ The same hosted zone ID is also used for SES domain identity and DKIM records.
42
+
43
+ ## Optional props
44
+
45
+ - `connectorSecrets`: deployment-wide connector secrets (GitHub/Atlassian). Omit for first boot if connectors are not configured yet.
46
+ - `size`: deployment capacity profile (`small`, `medium`, `large`). Defaults to `small` when omitted.
47
+
48
+ ## Sizing profiles
49
+
50
+ `CtxPipe` is single-tenant by design and ships with three capacity presets:
51
+
52
+ | Size | ECS task sizes (cpu/memory MiB) | ECS desired count | Aurora writer | Neptune instance | Backup retention |
53
+ |---|---|---|---|---|---|
54
+ | `small` (default) | backend `256/512`, worker `512/1024`, ui `256/512`, codesearch `512/1024`, migrate `256/512` | backend `1`, worker `1`, ui `1`, codesearch `1` | `t4g.small` | `db.t4g.medium` | 7 days |
55
+ | `medium` | backend `512/1024`, worker `1024/2048`, ui `256/512`, codesearch `1024/2048`, migrate `512/1024` | backend `1`, worker `1`, ui `1`, codesearch `1` | `t4g.medium` | `db.t4g.large` | 7 days |
56
+ | `large` | backend `1024/2048`, worker `2048/4096`, ui `512/1024`, codesearch `2048/4096`, migrate `1024/2048` | backend `2`, worker `2`, ui `1`, codesearch `1` | `t4g.large` | `db.t4g.xlarge` | 14 days |
57
+
58
+ Sizing guidance:
59
+
60
+ - Use `small` for pilots and cost-sensitive setups with moderate ingestion churn.
61
+ - Use `medium` when ingestion/reindex bursts are frequent and you want more headroom.
62
+ - Use `large` for high-ingestion repositories with stricter latency requirements.
63
+ - Scale worker first when queue pressure grows; codesearch replicas stay conservative.
64
+
65
+ Networking note:
66
+
67
+ - All size presets keep private ECS services with NAT egress. Outbound integrations (model providers, GitHub, Atlassian) require internet access from private subnets.
68
+
69
+ ## What `CtxPipe` provisions
70
+
71
+ - VPC with public + private subnets and NAT egress.
72
+ - ECS cluster and Fargate services for backend, worker, ui, and codesearch.
73
+ - Service deployments use ECS deployment circuit breaker with automatic rollback.
74
+ - Deploy-time database migration as a one-off ECS Fargate task triggered by a CloudFormation custom resource before service deployment.
75
+ - Aurora PostgreSQL (private), Neptune cluster + instance (private), EFS (codesearch `/data`).
76
+ - Secrets Manager secrets for database URL, model provider, and optional connectors.
77
+ - SES domain identity + DKIM records + SMTP credentials in Secrets Manager for backend email delivery.
78
+ - Public ALB routing to backend only (UI/codesearch remain internal-only).
79
+ - Outputs for app URL and key secret ARNs.
80
+ - Backup defaults enabled for Aurora, Neptune, and EFS.
81
+
82
+ Runtime defaults injected by the construct include:
83
+
84
+ - `GRAPH_DB_PROVIDER=neptune`
85
+ - `GRAPH_DB_URI` from Neptune endpoint
86
+ - `GRAPH_DB_URI_<orgSlug>` from the same Neptune endpoint
87
+ - `UI_PROXY_URL=http://ui.ctxpipe.local:3002`
88
+ - `CODESEARCH_URL=http://codesearch.ctxpipe.local:3001`
89
+ - `AUTH_SECRET` generated in Secrets Manager and injected into backend/worker/codesearch/migrate tasks
90
+ - `DATABASE_URL` secret injected into backend/worker/codesearch tasks
91
+ - `SMTP_CONNECTION_URL` and `EMAIL_FROM_ADDRESS` injected into backend from SES SMTP credentials
92
+ - `EMAIL_FROM_ADDRESS` is always `ctxpipe-noreply@<hosted-zone-apex>`
93
+
94
+ ## Deploy-time migrations
95
+
96
+ `CtxPipe` runs Postgres migrations automatically during `cdk deploy` by executing an internal one-off ECS task before the long-running ECS services are deployed or updated.
97
+
98
+ - This migration step is part of the construct internals; consumers do not need to run `ecs run-task` manually.
99
+ - A failed migration fails the CloudFormation deployment, preventing partially-updated services.
100
+ - The migration custom-resource flow is bounded by Lambda/CloudFormation timing limits (up to 15 minutes per deployment operation). If your migrations can exceed that window, run heavy schema/data backfills outside this deploy-time hook (for example with a separate migration workflow).
101
+
102
+ ## Image-tag coupling note
103
+
104
+ `@ctxpipe/aws-cdk` always uses one internal default GHCR tag for backend/worker/ui/codesearch/migrate task definitions. That tag is release-managed and stamped during CI to the same commit SHA used to publish `ghcr.io/ctxpipe-ai/*:<sha>` images on `main`.
105
+
106
+ This keeps the package and service images aligned by default with no extra config in `CtxPipeProps`.
107
+
108
+ ## Environment checklist
109
+
110
+ ### Customer-supplied (required)
111
+
112
+ - `AUTH_BASE_URL` (derived from `customDomain.domainName`)
113
+ - `MODEL_PROVIDER_URL`, `MODEL_PROVIDER_API_KEY`, and `MODEL_FAST_NAME` (provided through `modelProvider`)
114
+
115
+ ### CDK-generated defaults
116
+
117
+ - `AUTH_SECRET` (Secrets Manager generated value)
118
+ - `DATABASE_URL` (Secrets Manager + Aurora endpoint)
119
+ - `GRAPH_DB_PROVIDER=neptune`
120
+ - `GRAPH_DB_URI` (Neptune endpoint)
121
+ - `GRAPH_DB_URI_<orgSlug>` (Neptune endpoint for the configured org slug)
122
+ - `UI_PROXY_URL` and `CODESEARCH_URL` (internal service DNS)
123
+ - `SMTP_CONNECTION_URL` and `EMAIL_FROM_ADDRESS` (SES SMTP + Secrets Manager)
124
+
125
+ Because Neptune is single-graph per cluster, this construct does not support multi-tenant self-hosting in one stack. Deploy separate stacks for separate org slugs.
126
+
127
+ ### Optional second deploy (connector onboarding)
128
+
129
+ - `GITHUB_APP_ID`, `GITHUB_PRIVATE_KEY`, `GITHUB_WEBHOOK_SECRET`
130
+ - `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET`
131
+ - `ATLASSIAN_CLIENT_ID`, `ATLASSIAN_CLIENT_SECRET`
@@ -0,0 +1,20 @@
1
+ import type * as secretsmanager from "aws-cdk-lib/aws-secretsmanager";
2
+ import { Construct } from "constructs";
3
+ import type { CtxPipeProps } from "./types";
4
+ export declare class CtxPipe extends Construct {
5
+ readonly appUrl: string;
6
+ readonly databaseUrlSecret: secretsmanager.ISecret;
7
+ readonly modelProviderSecret: secretsmanager.ISecret;
8
+ readonly smtpSecret: secretsmanager.ISecret;
9
+ readonly connectorSecret?: secretsmanager.ISecret;
10
+ constructor(scope: Construct, id: string, props: CtxPipeProps);
11
+ private validateModelProvider;
12
+ private validateOrgSlug;
13
+ private resolveDefaults;
14
+ private resolveSizeProfile;
15
+ private resolveCustomDomain;
16
+ private resolveHostedZoneName;
17
+ private normalizeHostedZoneId;
18
+ private toHostedZoneApiId;
19
+ }
20
+ //# sourceMappingURL=ctxpipe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ctxpipe.d.ts","sourceRoot":"","sources":["../src/ctxpipe.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,cAAc,MAAM,gCAAgC,CAAC;AAEtE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAevC,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,SAAS,CAAC;AAuFzD,qBAAa,OAAQ,SAAQ,SAAS;IACpC,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,iBAAiB,EAAE,cAAc,CAAC,OAAO,CAAC;IAC1D,SAAgB,mBAAmB,EAAE,cAAc,CAAC,OAAO,CAAC;IAC5D,SAAgB,UAAU,EAAE,cAAc,CAAC,OAAO,CAAC;IACnD,SAAgB,eAAe,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC;gBAEtC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY;IA8EpE,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,qBAAqB;IAiE7B,OAAO,CAAC,qBAAqB;IAM7B,OAAO,CAAC,iBAAiB;CAK1B"}
package/lib/ctxpipe.js ADDED
@@ -0,0 +1,322 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.CtxPipe = void 0;
37
+ const cdk = __importStar(require("aws-cdk-lib"));
38
+ const acm = __importStar(require("aws-cdk-lib/aws-certificatemanager"));
39
+ const ec2 = __importStar(require("aws-cdk-lib/aws-ec2"));
40
+ const lambda = __importStar(require("aws-cdk-lib/aws-lambda"));
41
+ const route53 = __importStar(require("aws-cdk-lib/aws-route53"));
42
+ const cr = __importStar(require("aws-cdk-lib/custom-resources"));
43
+ const constructs_1 = require("constructs");
44
+ const pinned_service_image_tag_1 = require("./pinned-service-image-tag");
45
+ const data_plane_construct_1 = require("./internal/data-plane-construct");
46
+ const ingress_construct_1 = require("./internal/ingress-construct");
47
+ const migrate_on_deploy_construct_1 = require("./internal/migrate-on-deploy-construct");
48
+ const networking_construct_1 = require("./internal/networking-construct");
49
+ const outputs_construct_1 = require("./internal/outputs-construct");
50
+ const secrets_construct_1 = require("./internal/secrets-construct");
51
+ const services_construct_1 = require("./internal/services-construct");
52
+ const task_definitions_construct_1 = require("./internal/task-definitions-construct");
53
+ const DEFAULT_BACKUP_RETENTION_DAYS = 7;
54
+ const ORG_SLUG_PATTERN = /^[a-z0-9-]+$/;
55
+ const DEFAULT_SIZE = "small";
56
+ const SIZE_PROFILES = {
57
+ small: {
58
+ size: "small",
59
+ network: {
60
+ maxAzs: 2,
61
+ natGateways: 1,
62
+ },
63
+ database: {
64
+ auroraInstanceClass: ec2.InstanceClass.T4G,
65
+ auroraInstanceSize: ec2.InstanceSize.SMALL,
66
+ neptuneInstanceClass: "db.t4g.medium",
67
+ },
68
+ tasks: {
69
+ backend: { cpu: 256, memoryLimitMiB: 512 },
70
+ worker: { cpu: 512, memoryLimitMiB: 1024 },
71
+ ui: { cpu: 256, memoryLimitMiB: 512 },
72
+ codesearch: { cpu: 512, memoryLimitMiB: 1024 },
73
+ migrate: { cpu: 256, memoryLimitMiB: 512 },
74
+ },
75
+ services: {
76
+ backendDesiredCount: 1,
77
+ workerDesiredCount: 1,
78
+ uiDesiredCount: 1,
79
+ codesearchDesiredCount: 1,
80
+ },
81
+ backupRetentionDays: DEFAULT_BACKUP_RETENTION_DAYS,
82
+ },
83
+ medium: {
84
+ size: "medium",
85
+ network: {
86
+ maxAzs: 2,
87
+ natGateways: 1,
88
+ },
89
+ database: {
90
+ auroraInstanceClass: ec2.InstanceClass.T4G,
91
+ auroraInstanceSize: ec2.InstanceSize.MEDIUM,
92
+ neptuneInstanceClass: "db.t4g.large",
93
+ },
94
+ tasks: {
95
+ backend: { cpu: 512, memoryLimitMiB: 1024 },
96
+ worker: { cpu: 1024, memoryLimitMiB: 2048 },
97
+ ui: { cpu: 256, memoryLimitMiB: 512 },
98
+ codesearch: { cpu: 1024, memoryLimitMiB: 2048 },
99
+ migrate: { cpu: 512, memoryLimitMiB: 1024 },
100
+ },
101
+ services: {
102
+ backendDesiredCount: 1,
103
+ workerDesiredCount: 1,
104
+ uiDesiredCount: 1,
105
+ codesearchDesiredCount: 1,
106
+ },
107
+ backupRetentionDays: DEFAULT_BACKUP_RETENTION_DAYS,
108
+ },
109
+ large: {
110
+ size: "large",
111
+ network: {
112
+ maxAzs: 2,
113
+ natGateways: 1,
114
+ },
115
+ database: {
116
+ auroraInstanceClass: ec2.InstanceClass.T4G,
117
+ auroraInstanceSize: ec2.InstanceSize.LARGE,
118
+ neptuneInstanceClass: "db.t4g.xlarge",
119
+ },
120
+ tasks: {
121
+ backend: { cpu: 1024, memoryLimitMiB: 2048 },
122
+ worker: { cpu: 2048, memoryLimitMiB: 4096 },
123
+ ui: { cpu: 512, memoryLimitMiB: 1024 },
124
+ codesearch: { cpu: 2048, memoryLimitMiB: 4096 },
125
+ migrate: { cpu: 1024, memoryLimitMiB: 2048 },
126
+ },
127
+ services: {
128
+ backendDesiredCount: 2,
129
+ workerDesiredCount: 2,
130
+ uiDesiredCount: 1,
131
+ codesearchDesiredCount: 1,
132
+ },
133
+ backupRetentionDays: 14,
134
+ },
135
+ };
136
+ class CtxPipe extends constructs_1.Construct {
137
+ appUrl;
138
+ databaseUrlSecret;
139
+ modelProviderSecret;
140
+ smtpSecret;
141
+ connectorSecret;
142
+ constructor(scope, id, props) {
143
+ super(scope, id);
144
+ this.validateOrgSlug(props);
145
+ this.validateModelProvider(props);
146
+ const sizeProfile = this.resolveSizeProfile(props);
147
+ const resolvedCustomDomain = this.resolveCustomDomain(props);
148
+ const defaults = this.resolveDefaults(props, resolvedCustomDomain, sizeProfile);
149
+ const networking = new networking_construct_1.NetworkingConstruct(this, "Networking", {
150
+ maxAzs: sizeProfile.network.maxAzs,
151
+ natGateways: sizeProfile.network.natGateways,
152
+ });
153
+ const dataPlane = new data_plane_construct_1.DataPlaneConstruct(this, "DataPlane", {
154
+ networking: networking.resources,
155
+ defaults,
156
+ sizeProfile,
157
+ });
158
+ const secrets = new secrets_construct_1.SecretsConstruct(this, "Secrets", {
159
+ dataPlane: dataPlane.resources,
160
+ databaseName: defaults.databaseName,
161
+ modelProviderApiKey: props.modelProvider.apiKey,
162
+ hostedZone: resolvedCustomDomain.hostedZone,
163
+ connectorSecrets: props.connectorSecrets,
164
+ emailFromAddress: defaults.emailFromAddress,
165
+ });
166
+ const taskDefinitions = new task_definitions_construct_1.TaskDefinitionsConstruct(this, "TaskDefinitions", {
167
+ orgSlug: props.orgSlug,
168
+ networking: networking.resources,
169
+ dataPlane: dataPlane.resources,
170
+ secrets: secrets.resources,
171
+ customDomain: resolvedCustomDomain,
172
+ modelProviderBaseUrl: props.modelProvider.baseUrl,
173
+ modelProviderDefaultModel: props.modelProvider.defaultModel,
174
+ defaultImageTag: defaults.defaultImageTag,
175
+ sizeProfile,
176
+ });
177
+ const migrateOnDeploy = new migrate_on_deploy_construct_1.MigrateOnDeployConstruct(this, "MigrateOnDeploy", {
178
+ networking: networking.resources,
179
+ dataPlane: dataPlane.resources,
180
+ tasks: taskDefinitions.resources,
181
+ secrets: secrets.resources,
182
+ });
183
+ const services = new services_construct_1.ServicesConstruct(this, "Services", {
184
+ networking: networking.resources,
185
+ tasks: taskDefinitions.resources,
186
+ sizeProfile,
187
+ migrateDependency: migrateOnDeploy.resources.migrateResource,
188
+ });
189
+ const ingress = new ingress_construct_1.IngressConstruct(this, "Ingress", {
190
+ networking: networking.resources,
191
+ backendService: services.resources.backendService,
192
+ customDomain: resolvedCustomDomain,
193
+ });
194
+ this.databaseUrlSecret = secrets.resources.databaseUrlSecret;
195
+ this.modelProviderSecret = secrets.resources.modelProviderSecret;
196
+ this.smtpSecret = secrets.resources.smtpSecret;
197
+ this.connectorSecret = secrets.resources.connectorSecret;
198
+ this.appUrl = ingress.resources.appUrl;
199
+ new outputs_construct_1.OutputsConstruct(this, "Outputs", {
200
+ appUrl: this.appUrl,
201
+ albDnsName: networking.resources.alb.loadBalancerDnsName,
202
+ databaseUrlSecretArn: this.databaseUrlSecret.secretArn,
203
+ modelProviderSecretArn: this.modelProviderSecret.secretArn,
204
+ smtpSecretArn: this.smtpSecret.secretArn,
205
+ connectorSecretArn: this.connectorSecret?.secretArn,
206
+ });
207
+ }
208
+ validateModelProvider(props) {
209
+ if (props.modelProvider.baseUrl.length === 0) {
210
+ throw new Error("modelProvider.baseUrl is required");
211
+ }
212
+ if (props.modelProvider.defaultModel.length === 0) {
213
+ throw new Error("modelProvider.defaultModel is required");
214
+ }
215
+ }
216
+ validateOrgSlug(props) {
217
+ const orgSlug = props.orgSlug.trim();
218
+ if (orgSlug.length === 0) {
219
+ throw new Error("orgSlug is required");
220
+ }
221
+ if (!ORG_SLUG_PATTERN.test(orgSlug)) {
222
+ throw new Error("orgSlug must contain only lowercase letters, numbers, or hyphens");
223
+ }
224
+ }
225
+ resolveDefaults(props, customDomain, sizeProfile) {
226
+ const normalizedZoneName = customDomain.hostedZoneName.replace(/\.$/, "");
227
+ return {
228
+ databaseName: "ctxpipe",
229
+ backupRetentionDays: sizeProfile.backupRetentionDays,
230
+ defaultImageTag: pinned_service_image_tag_1.PINNED_SERVICE_IMAGE_TAG,
231
+ emailFromAddress: `ctxpipe-noreply@${normalizedZoneName}`,
232
+ };
233
+ }
234
+ resolveSizeProfile(props) {
235
+ const size = props.size ?? DEFAULT_SIZE;
236
+ return SIZE_PROFILES[size];
237
+ }
238
+ resolveCustomDomain(props) {
239
+ const hostedZoneName = this.resolveHostedZoneName(props.customDomain.hostedZoneId);
240
+ const hostedZone = route53.HostedZone.fromHostedZoneAttributes(this, "CustomDomainHostedZone", {
241
+ hostedZoneId: this.normalizeHostedZoneId(props.customDomain.hostedZoneId),
242
+ zoneName: hostedZoneName,
243
+ });
244
+ return {
245
+ ...props.customDomain,
246
+ hostedZone,
247
+ hostedZoneName,
248
+ certificate: new acm.Certificate(this, "CustomDomainCertificate", {
249
+ domainName: props.customDomain.domainName,
250
+ validation: acm.CertificateValidation.fromDns(hostedZone),
251
+ }),
252
+ };
253
+ }
254
+ resolveHostedZoneName(hostedZoneId) {
255
+ const lookup = new cr.AwsCustomResource(this, "HostedZoneLookup", {
256
+ onCreate: {
257
+ service: "Route53",
258
+ action: "getHostedZone",
259
+ parameters: {
260
+ Id: this.toHostedZoneApiId(hostedZoneId),
261
+ },
262
+ physicalResourceId: cr.PhysicalResourceId.of(`route53-hosted-zone-${this.normalizeHostedZoneId(hostedZoneId)}`),
263
+ },
264
+ onUpdate: {
265
+ service: "Route53",
266
+ action: "getHostedZone",
267
+ parameters: {
268
+ Id: this.toHostedZoneApiId(hostedZoneId),
269
+ },
270
+ physicalResourceId: cr.PhysicalResourceId.of(`route53-hosted-zone-${this.normalizeHostedZoneId(hostedZoneId)}`),
271
+ },
272
+ policy: cr.AwsCustomResourcePolicy.fromSdkCalls({
273
+ resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE,
274
+ }),
275
+ installLatestAwsSdk: false,
276
+ });
277
+ const normalizeFunction = new lambda.Function(this, "HostedZoneNameNormalizeFunction", {
278
+ runtime: lambda.Runtime.NODEJS_20_X,
279
+ handler: "index.handler",
280
+ timeout: cdk.Duration.seconds(15),
281
+ code: lambda.Code.fromInline(`
282
+ exports.handler = async (event) => {
283
+ const physicalId = event.PhysicalResourceId || "hosted-zone-name-normalized";
284
+ if (event.RequestType === "Delete") {
285
+ return { PhysicalResourceId: physicalId };
286
+ }
287
+
288
+ const rawName = String(event.ResourceProperties.HostedZoneName || "");
289
+ const normalizedName = rawName.replace(/\\.$/, "");
290
+ return {
291
+ PhysicalResourceId: physicalId,
292
+ Data: {
293
+ HostedZoneName: normalizedName
294
+ }
295
+ };
296
+ };
297
+ `),
298
+ });
299
+ const normalizeProvider = new cr.Provider(this, "HostedZoneNameNormalizeProvider", {
300
+ onEventHandler: normalizeFunction,
301
+ });
302
+ const normalizeResource = new cdk.CustomResource(this, "HostedZoneNameNormalize", {
303
+ serviceToken: normalizeProvider.serviceToken,
304
+ properties: {
305
+ HostedZoneName: lookup.getResponseField("HostedZone.Name"),
306
+ },
307
+ });
308
+ return normalizeResource.getAttString("HostedZoneName");
309
+ }
310
+ normalizeHostedZoneId(hostedZoneId) {
311
+ return hostedZoneId.startsWith("/hostedzone/")
312
+ ? hostedZoneId.slice("/hostedzone/".length)
313
+ : hostedZoneId;
314
+ }
315
+ toHostedZoneApiId(hostedZoneId) {
316
+ return hostedZoneId.startsWith("/hostedzone/")
317
+ ? hostedZoneId
318
+ : `/hostedzone/${hostedZoneId}`;
319
+ }
320
+ }
321
+ exports.CtxPipe = CtxPipe;
322
+ //# sourceMappingURL=ctxpipe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ctxpipe.js","sourceRoot":"","sources":["../src/ctxpipe.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export { CtxPipe } from "./ctxpipe";
2
+ export type { CtxPipeConnectorSecretsProps, CtxPipeCustomDomainProps, CtxPipeModelProviderProps, CtxPipeProps, CtxPipeSize, } from "./types";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EACV,4BAA4B,EAC5B,wBAAwB,EACxB,yBAAyB,EACzB,YAAY,EACZ,WAAW,GACZ,MAAM,SAAS,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CtxPipe = void 0;
4
+ var ctxpipe_1 = require("./ctxpipe");
5
+ Object.defineProperty(exports, "CtxPipe", { enumerable: true, get: function () { return ctxpipe_1.CtxPipe; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qCAAoC;AAA3B,kGAAA,OAAO,OAAA"}
@@ -0,0 +1,154 @@
1
+ import type * as cdk from "aws-cdk-lib";
2
+ import type * as acm from "aws-cdk-lib/aws-certificatemanager";
3
+ import type * as ec2 from "aws-cdk-lib/aws-ec2";
4
+ import type * as ecs from "aws-cdk-lib/aws-ecs";
5
+ import type * as efs from "aws-cdk-lib/aws-efs";
6
+ import type * as elbv2 from "aws-cdk-lib/aws-elasticloadbalancingv2";
7
+ import type * as neptune from "aws-cdk-lib/aws-neptune";
8
+ import type * as rds from "aws-cdk-lib/aws-rds";
9
+ import type * as route53 from "aws-cdk-lib/aws-route53";
10
+ import type * as secretsmanager from "aws-cdk-lib/aws-secretsmanager";
11
+ import type { IDependable } from "constructs";
12
+ import type { CtxPipeConnectorSecretsProps, CtxPipeCustomDomainProps } from "../types";
13
+ import type { CtxPipeSize } from "../types";
14
+ export interface ResolvedCtxPipeCustomDomainProps extends CtxPipeCustomDomainProps {
15
+ readonly hostedZone: route53.IHostedZone;
16
+ readonly hostedZoneName: string;
17
+ readonly certificate: acm.ICertificate;
18
+ }
19
+ export interface CtxPipeResolvedDefaults {
20
+ readonly databaseName: string;
21
+ readonly backupRetentionDays: number;
22
+ readonly defaultImageTag: string;
23
+ readonly emailFromAddress: string;
24
+ }
25
+ export interface CtxPipeTaskSize {
26
+ readonly cpu: number;
27
+ readonly memoryLimitMiB: number;
28
+ }
29
+ export interface CtxPipeServiceScaleProfile {
30
+ readonly backendDesiredCount: number;
31
+ readonly workerDesiredCount: number;
32
+ readonly uiDesiredCount: number;
33
+ readonly codesearchDesiredCount: number;
34
+ }
35
+ export interface CtxPipeSizeProfile {
36
+ readonly size: CtxPipeSize;
37
+ readonly network: {
38
+ readonly maxAzs: number;
39
+ readonly natGateways: number;
40
+ };
41
+ readonly database: {
42
+ readonly auroraInstanceClass: ec2.InstanceClass;
43
+ readonly auroraInstanceSize: ec2.InstanceSize;
44
+ readonly neptuneInstanceClass: string;
45
+ };
46
+ readonly tasks: {
47
+ readonly backend: CtxPipeTaskSize;
48
+ readonly worker: CtxPipeTaskSize;
49
+ readonly ui: CtxPipeTaskSize;
50
+ readonly codesearch: CtxPipeTaskSize;
51
+ readonly migrate: CtxPipeTaskSize;
52
+ };
53
+ readonly services: CtxPipeServiceScaleProfile;
54
+ readonly backupRetentionDays: number;
55
+ }
56
+ export interface NetworkingResources {
57
+ readonly vpc: ec2.Vpc;
58
+ readonly appSecurityGroup: ec2.SecurityGroup;
59
+ readonly dbSecurityGroup: ec2.SecurityGroup;
60
+ readonly neptuneSecurityGroup: ec2.SecurityGroup;
61
+ readonly efsSecurityGroup: ec2.SecurityGroup;
62
+ readonly cluster: ecs.Cluster;
63
+ readonly alb: elbv2.ApplicationLoadBalancer;
64
+ readonly httpListener: elbv2.ApplicationListener;
65
+ }
66
+ export interface DataPlaneResources {
67
+ readonly dbCluster: rds.DatabaseCluster;
68
+ readonly dbCredentialsSecret: secretsmanager.Secret;
69
+ readonly neptuneCluster: neptune.CfnDBCluster;
70
+ readonly neptuneInstance: neptune.CfnDBInstance;
71
+ readonly codesearchFileSystem: efs.FileSystem;
72
+ readonly graphDbUri: string;
73
+ }
74
+ export interface SecretsResources {
75
+ readonly authSecret: secretsmanager.Secret;
76
+ readonly databaseUrlSecret: secretsmanager.Secret;
77
+ readonly modelProviderSecret: secretsmanager.Secret;
78
+ readonly smtpSecret: secretsmanager.Secret;
79
+ readonly connectorSecret?: secretsmanager.Secret;
80
+ readonly connectorEnv: Record<string, ecs.Secret>;
81
+ }
82
+ export interface TaskDefinitionsResources {
83
+ readonly backendTask: ecs.FargateTaskDefinition;
84
+ readonly workerTask: ecs.FargateTaskDefinition;
85
+ readonly uiTask: ecs.FargateTaskDefinition;
86
+ readonly codesearchTask: ecs.FargateTaskDefinition;
87
+ readonly migrateTask: ecs.FargateTaskDefinition;
88
+ }
89
+ export interface ServiceResources {
90
+ readonly backendService: ecs.FargateService;
91
+ readonly workerService: ecs.FargateService;
92
+ readonly uiService: ecs.FargateService;
93
+ readonly codesearchService: ecs.FargateService;
94
+ }
95
+ export interface IngressResources {
96
+ readonly appUrl: string;
97
+ }
98
+ export interface MigrateOnDeployResources {
99
+ readonly migrateResource: cdk.CustomResource;
100
+ }
101
+ export interface NetworkingConstructProps {
102
+ readonly maxAzs: number;
103
+ readonly natGateways: number;
104
+ }
105
+ export interface DataPlaneConstructProps {
106
+ readonly networking: NetworkingResources;
107
+ readonly defaults: CtxPipeResolvedDefaults;
108
+ readonly sizeProfile: CtxPipeSizeProfile;
109
+ }
110
+ export interface SecretsConstructProps {
111
+ readonly dataPlane: DataPlaneResources;
112
+ readonly databaseName: string;
113
+ readonly modelProviderApiKey: cdk.SecretValue;
114
+ readonly hostedZone: route53.IHostedZone;
115
+ readonly connectorSecrets?: CtxPipeConnectorSecretsProps;
116
+ readonly emailFromAddress: string;
117
+ }
118
+ export interface TaskDefinitionsConstructProps {
119
+ readonly orgSlug: string;
120
+ readonly networking: NetworkingResources;
121
+ readonly dataPlane: DataPlaneResources;
122
+ readonly secrets: SecretsResources;
123
+ readonly customDomain: ResolvedCtxPipeCustomDomainProps;
124
+ readonly modelProviderBaseUrl: string;
125
+ readonly modelProviderDefaultModel: string;
126
+ readonly defaultImageTag: string;
127
+ readonly sizeProfile: CtxPipeSizeProfile;
128
+ }
129
+ export interface ServicesConstructProps {
130
+ readonly networking: NetworkingResources;
131
+ readonly tasks: TaskDefinitionsResources;
132
+ readonly sizeProfile: CtxPipeSizeProfile;
133
+ readonly migrateDependency?: IDependable;
134
+ }
135
+ export interface IngressConstructProps {
136
+ readonly networking: NetworkingResources;
137
+ readonly backendService: ecs.FargateService;
138
+ readonly customDomain: ResolvedCtxPipeCustomDomainProps;
139
+ }
140
+ export interface MigrateOnDeployConstructProps {
141
+ readonly networking: NetworkingResources;
142
+ readonly dataPlane: DataPlaneResources;
143
+ readonly tasks: TaskDefinitionsResources;
144
+ readonly secrets: SecretsResources;
145
+ }
146
+ export interface OutputsConstructProps {
147
+ readonly appUrl: string;
148
+ readonly albDnsName: string;
149
+ readonly databaseUrlSecretArn: string;
150
+ readonly modelProviderSecretArn: string;
151
+ readonly smtpSecretArn: string;
152
+ readonly connectorSecretArn?: string;
153
+ }
154
+ //# sourceMappingURL=contracts.d.ts.map