@cogitator-ai/deploy 0.1.9 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +84 -47
  2. package/dist/analyzer.d.ts +17 -3
  3. package/dist/analyzer.d.ts.map +1 -1
  4. package/dist/analyzer.js +118 -34
  5. package/dist/analyzer.js.map +1 -1
  6. package/dist/deployer.d.ts +12 -4
  7. package/dist/deployer.d.ts.map +1 -1
  8. package/dist/deployer.js +26 -13
  9. package/dist/deployer.js.map +1 -1
  10. package/dist/generator.d.ts +7 -0
  11. package/dist/generator.d.ts.map +1 -1
  12. package/dist/generator.js +6 -7
  13. package/dist/generator.js.map +1 -1
  14. package/dist/index.d.ts +2 -2
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/providers/artifacts.d.ts +9 -0
  17. package/dist/providers/artifacts.d.ts.map +1 -0
  18. package/dist/providers/artifacts.js +32 -0
  19. package/dist/providers/artifacts.js.map +1 -0
  20. package/dist/providers/docker.d.ts +5 -4
  21. package/dist/providers/docker.d.ts.map +1 -1
  22. package/dist/providers/docker.js +82 -48
  23. package/dist/providers/docker.js.map +1 -1
  24. package/dist/providers/fly.d.ts +9 -2
  25. package/dist/providers/fly.d.ts.map +1 -1
  26. package/dist/providers/fly.js +120 -59
  27. package/dist/providers/fly.js.map +1 -1
  28. package/dist/templates/docker-compose.d.ts +3 -0
  29. package/dist/templates/docker-compose.d.ts.map +1 -1
  30. package/dist/templates/docker-compose.js +38 -10
  31. package/dist/templates/docker-compose.js.map +1 -1
  32. package/dist/templates/dockerfile.d.ts +8 -3
  33. package/dist/templates/dockerfile.d.ts.map +1 -1
  34. package/dist/templates/dockerfile.js +59 -17
  35. package/dist/templates/dockerfile.js.map +1 -1
  36. package/dist/templates/fly-toml.d.ts +1 -0
  37. package/dist/templates/fly-toml.d.ts.map +1 -1
  38. package/dist/templates/fly-toml.js +21 -12
  39. package/dist/templates/fly-toml.js.map +1 -1
  40. package/dist/utils/env.d.ts +7 -0
  41. package/dist/utils/env.d.ts.map +1 -0
  42. package/dist/utils/env.js +21 -0
  43. package/dist/utils/env.js.map +1 -0
  44. package/dist/utils/exec.d.ts +15 -3
  45. package/dist/utils/exec.d.ts.map +1 -1
  46. package/dist/utils/exec.js +50 -14
  47. package/dist/utils/exec.js.map +1 -1
  48. package/dist/utils/registry-auth.d.ts +7 -0
  49. package/dist/utils/registry-auth.d.ts.map +1 -0
  50. package/dist/utils/registry-auth.js +71 -0
  51. package/dist/utils/registry-auth.js.map +1 -0
  52. package/package.json +4 -4
@@ -1,28 +1,64 @@
1
- import { exec, isCommandAvailable } from '../utils/exec.js';
2
- import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
1
+ import { run, isCommandAvailable } from '../utils/exec.js';
2
+ import { resolveDeployEnv } from '../utils/env.js';
3
+ import { ArtifactGenerator } from '../generator.js';
4
+ import { secretChecks, writeArtifacts } from './artifacts.js';
5
+ import { existsSync } from 'node:fs';
3
6
  import { join } from 'node:path';
4
- const PREFLIGHT_TIMEOUT_MS = 3_000;
7
+ const PREFLIGHT_TIMEOUT_MS = 15_000;
8
+ function isRecord(value) {
9
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
10
+ }
11
+ export function resolveFlyBinary() {
12
+ if (isCommandAvailable('flyctl'))
13
+ return 'flyctl';
14
+ if (isCommandAvailable('fly'))
15
+ return 'fly';
16
+ return null;
17
+ }
18
+ export function formatSecretsForImport(secrets, env) {
19
+ const lines = [];
20
+ const skipped = [];
21
+ for (const secret of secrets) {
22
+ const value = env[secret];
23
+ if (!value)
24
+ continue;
25
+ if (/[\r\n]/.test(value)) {
26
+ skipped.push(secret);
27
+ continue;
28
+ }
29
+ lines.push(`${secret}=${value}`);
30
+ }
31
+ return { payload: lines.join('\n'), skipped };
32
+ }
5
33
  export class FlyProvider {
6
34
  name = 'fly';
7
- async preflight(config, _projectDir) {
35
+ fly(args, options = {}) {
36
+ const binary = resolveFlyBinary();
37
+ if (!binary)
38
+ return { success: false, output: '', error: 'flyctl is not installed' };
39
+ return run(binary, args, options);
40
+ }
41
+ appName(config) {
42
+ return config.image ?? 'cogitator-app';
43
+ }
44
+ async preflight(config, projectDir) {
8
45
  const checks = [];
9
- const flyAvailable = isCommandAvailable('flyctl', PREFLIGHT_TIMEOUT_MS) ||
10
- isCommandAvailable('fly', PREFLIGHT_TIMEOUT_MS);
46
+ const binary = resolveFlyBinary();
11
47
  checks.push({
12
48
  name: 'flyctl installed',
13
- passed: flyAvailable,
14
- message: flyAvailable ? 'flyctl is available' : 'flyctl is not installed',
15
- fix: flyAvailable ? undefined : 'Install flyctl: curl -L https://fly.io/install.sh | sh',
49
+ passed: binary !== null,
50
+ message: binary ? `${binary} is available` : 'flyctl is not installed',
51
+ fix: binary ? undefined : 'Install flyctl: curl -L https://fly.io/install.sh | sh',
16
52
  });
17
- if (flyAvailable) {
18
- const authResult = exec('flyctl auth whoami', { timeout: PREFLIGHT_TIMEOUT_MS });
53
+ if (binary) {
54
+ const authResult = run(binary, ['auth', 'whoami'], { timeout: PREFLIGHT_TIMEOUT_MS });
19
55
  checks.push({
20
56
  name: 'Fly.io authenticated',
21
57
  passed: authResult.success,
22
58
  message: authResult.success
23
59
  ? `Logged in as ${authResult.output}`
24
60
  : 'Not authenticated with Fly.io',
25
- fix: authResult.success ? undefined : 'Run: flyctl auth login',
61
+ fix: authResult.success ? undefined : `Run: ${binary} auth login`,
26
62
  });
27
63
  }
28
64
  else {
@@ -33,88 +69,113 @@ export class FlyProvider {
33
69
  fix: 'Install flyctl first',
34
70
  });
35
71
  }
36
- for (const secret of config.secrets ?? []) {
37
- const isSet = !!process.env[secret];
38
- checks.push({
39
- name: `Secret: ${secret}`,
40
- passed: isSet,
41
- message: isSet ? `${secret} is set` : `${secret} is not set`,
42
- fix: isSet ? undefined : `Set environment variable: export ${secret}=<value>`,
43
- });
44
- }
72
+ checks.push(...secretChecks(config.secrets ?? [], resolveDeployEnv(projectDir)));
45
73
  return {
46
74
  checks,
47
75
  passed: checks.every((c) => c.passed),
48
76
  };
49
77
  }
50
- async generate(config, _projectDir) {
51
- const { ArtifactGenerator } = await import('../generator.js');
52
- const generator = new ArtifactGenerator();
53
- return generator.generate(config, { hasTypeScript: true });
78
+ async generate(config, projectDir) {
79
+ return new ArtifactGenerator().generate(config, {
80
+ hasTypeScript: existsSync(join(projectDir, 'tsconfig.json')),
81
+ });
54
82
  }
55
83
  async deploy(config, artifacts, projectDir) {
56
- const outputDir = join(projectDir, artifacts.outputDir);
57
- if (!existsSync(outputDir)) {
58
- mkdirSync(outputDir, { recursive: true });
59
- }
60
- for (const file of artifacts.files) {
61
- const filePath = file.path === 'fly.toml' ? join(projectDir, file.path) : join(outputDir, file.path);
62
- writeFileSync(filePath, file.content);
63
- }
64
- const app = config.image ?? 'cogitator-app';
65
- const launchCheck = exec('flyctl apps list --json', { cwd: projectDir });
66
- let appExists = false;
67
- if (launchCheck.success) {
68
- try {
69
- const apps = JSON.parse(launchCheck.output);
70
- appExists = apps.some((a) => a.Name === app);
71
- }
72
- catch { }
73
- }
84
+ const outputDir = writeArtifacts(projectDir, artifacts);
85
+ const app = this.appName(config);
86
+ const env = resolveDeployEnv(projectDir);
87
+ const appExists = this.fly(['status', '--app', app, '--json'], { cwd: projectDir }).success;
74
88
  if (!appExists) {
75
- const createResult = exec(`flyctl apps create ${app} --json`, { cwd: projectDir });
89
+ const createResult = this.fly(['apps', 'create', app], { cwd: projectDir });
76
90
  if (!createResult.success) {
77
- return { success: false, error: `Failed to create Fly app: ${createResult.error}` };
91
+ return {
92
+ success: false,
93
+ error: `Failed to create Fly app "${app}": ${createResult.error}`,
94
+ };
78
95
  }
79
96
  }
80
- const secretPairs = (config.secrets ?? [])
81
- .filter((secret) => !!process.env[secret])
82
- .map((secret) => `${secret}=${process.env[secret]}`)
83
- .join('\n');
84
- if (secretPairs) {
85
- exec(`flyctl secrets import --app ${app}`, { cwd: projectDir, input: secretPairs });
97
+ const { payload, skipped } = formatSecretsForImport(config.secrets ?? [], env);
98
+ if (skipped.length > 0) {
99
+ return {
100
+ success: false,
101
+ error: `Multi-line secret values are not supported by "fly secrets import": ${skipped.join(', ')}`,
102
+ };
86
103
  }
87
- const deployResult = exec(`flyctl deploy --app ${app} --dockerfile ${join(outputDir, 'Dockerfile')} --now`, { cwd: projectDir });
104
+ if (payload) {
105
+ const secretsResult = this.fly(['secrets', 'import', '--app', app, '--stage'], {
106
+ cwd: projectDir,
107
+ input: payload,
108
+ });
109
+ if (!secretsResult.success) {
110
+ return { success: false, error: `Failed to import Fly secrets: ${secretsResult.error}` };
111
+ }
112
+ }
113
+ const deployResult = this.fly([
114
+ 'deploy',
115
+ projectDir,
116
+ '--app',
117
+ app,
118
+ '--config',
119
+ join(outputDir, 'fly.toml'),
120
+ '--dockerfile',
121
+ join(outputDir, 'Dockerfile'),
122
+ '--now',
123
+ ], { cwd: projectDir });
88
124
  if (!deployResult.success) {
89
125
  return { success: false, error: `Fly deploy failed: ${deployResult.error}` };
90
126
  }
127
+ const instances = config.instances ?? 1;
128
+ if (instances > 1) {
129
+ const scaleResult = this.fly(['scale', 'count', String(instances), '--app', app, '--yes'], {
130
+ cwd: projectDir,
131
+ });
132
+ if (!scaleResult.success) {
133
+ return { success: false, error: `Fly scale failed: ${scaleResult.error}` };
134
+ }
135
+ }
91
136
  const url = `https://${app}.fly.dev`;
137
+ const healthPath = config.health?.path ?? '/health';
92
138
  return {
93
139
  success: true,
94
140
  url,
95
141
  endpoints: {
96
142
  api: url,
97
143
  a2a: `${url}/.well-known/agent.json`,
98
- health: `${url}/health`,
144
+ health: `${url}${healthPath.startsWith('/') ? healthPath : `/${healthPath}`}`,
99
145
  },
100
146
  };
101
147
  }
102
148
  async status(config, projectDir) {
103
- const app = config.image ?? 'cogitator-app';
104
- const result = exec(`flyctl status --app ${app} --json`, { cwd: projectDir });
149
+ const result = this.fly(['status', '--app', this.appName(config), '--json'], {
150
+ cwd: projectDir,
151
+ });
105
152
  if (!result.success)
106
153
  return { running: false };
154
+ let status;
107
155
  try {
108
- const status = JSON.parse(result.output);
109
- return { running: status.Deployed, url: `https://${status.Hostname}` };
156
+ status = JSON.parse(result.output);
110
157
  }
111
158
  catch {
112
159
  return { running: false };
113
160
  }
161
+ if (!isRecord(status))
162
+ return { running: false };
163
+ const machines = Array.isArray(status.Machines) ? status.Machines : [];
164
+ const started = machines.filter((m) => isRecord(m) && m.state === 'started').length;
165
+ const hostname = typeof status.Hostname === 'string' ? status.Hostname : undefined;
166
+ const deployed = status.Deployed === true || started > 0;
167
+ return {
168
+ running: deployed,
169
+ url: hostname ? `https://${hostname}` : undefined,
170
+ instances: machines.length > 0 ? started : undefined,
171
+ };
114
172
  }
115
173
  async destroy(config, projectDir) {
116
- const app = config.image ?? 'cogitator-app';
117
- exec(`flyctl apps destroy ${app} --yes`, { cwd: projectDir });
174
+ const app = this.appName(config);
175
+ const result = this.fly(['apps', 'destroy', app, '--yes'], { cwd: projectDir });
176
+ if (!result.success) {
177
+ throw new Error(`Failed to destroy Fly app "${app}": ${result.error}`);
178
+ }
118
179
  }
119
180
  }
120
181
  //# sourceMappingURL=fly.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fly.js","sourceRoot":"","sources":["../../src/providers/fly.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fly.js","sourceRoot":"","sources":["../../src/providers/fly.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,6 @@
1
1
  import type { DeployConfig } from '@cogitator-ai/types';
2
+ export declare const COMPOSE_DATABASE_URL = "postgresql://cogitator:cogitator@postgres:5432/cogitator";
3
+ export declare const COMPOSE_REDIS_URL = "redis://redis:6379";
4
+ export declare function imageTag(config: DeployConfig): string;
2
5
  export declare function generateDockerCompose(config: DeployConfig): string;
3
6
  //# sourceMappingURL=docker-compose.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"docker-compose.d.ts","sourceRoot":"","sources":["../../src/templates/docker-compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAoElE"}
1
+ {"version":3,"file":"docker-compose.d.ts","sourceRoot":"","sources":["../../src/templates/docker-compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,eAAO,MAAM,oBAAoB,6DAA6D,CAAC;AAC/F,eAAO,MAAM,iBAAiB,uBAAuB,CAAC;AAMtD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAKrD;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAqFlE"}
@@ -1,23 +1,49 @@
1
+ export const COMPOSE_DATABASE_URL = 'postgresql://cogitator:cogitator@postgres:5432/cogitator';
2
+ export const COMPOSE_REDIS_URL = 'redis://redis:6379';
3
+ function yamlString(value) {
4
+ return JSON.stringify(value);
5
+ }
6
+ export function imageTag(config) {
7
+ const image = config.image ?? 'cogitator-app';
8
+ return config.registry
9
+ ? `${config.registry.replace(/\/+$/, '')}/${image}:latest`
10
+ : `${image}:latest`;
11
+ }
1
12
  export function generateDockerCompose(config) {
2
13
  const port = config.port ?? 3000;
3
- const image = config.image ?? 'cogitator-app';
4
14
  const lines = ['services:'];
5
- const appEnv = [' environment:', ` - NODE_ENV=production`, ` - PORT=${port}`];
15
+ const environment = [
16
+ ` NODE_ENV: ${yamlString('production')}`,
17
+ ` PORT: ${yamlString(String(port))}`,
18
+ ];
6
19
  if (config.services?.redis)
7
- appEnv.push(' - REDIS_URL=redis://redis:6379');
8
- if (config.services?.postgres)
9
- appEnv.push(' - DATABASE_URL=postgresql://cogitator:cogitator@postgres:5432/cogitator');
20
+ environment.push(` REDIS_URL: ${yamlString(COMPOSE_REDIS_URL)}`);
21
+ if (config.services?.postgres) {
22
+ environment.push(` DATABASE_URL: ${yamlString(COMPOSE_DATABASE_URL)}`);
23
+ }
24
+ for (const [key, value] of Object.entries(config.env ?? {})) {
25
+ environment.push(` ${key}: ${yamlString(value.replace(/\$/g, '$$$$'))}`);
26
+ }
27
+ for (const secret of config.secrets ?? []) {
28
+ if (!(secret in (config.env ?? {}))) {
29
+ environment.push(` ${secret}: \${${secret}:-}`);
30
+ }
31
+ }
10
32
  const dependsOn = [];
11
33
  if (config.services?.redis)
12
34
  dependsOn.push(' redis:', ' condition: service_healthy');
13
- if (config.services?.postgres)
35
+ if (config.services?.postgres) {
14
36
  dependsOn.push(' postgres:', ' condition: service_healthy');
37
+ }
15
38
  lines.push(' app:');
16
- lines.push(' build: .');
17
- lines.push(` image: ${config.registry ? `${config.registry}/${image}` : image}`);
18
- lines.push(` ports:`);
39
+ lines.push(' build:');
40
+ lines.push(' context: ..');
41
+ lines.push(' dockerfile: .cogitator/Dockerfile');
42
+ lines.push(` image: ${yamlString(imageTag(config))}`);
43
+ lines.push(' ports:');
19
44
  lines.push(` - "${port}:${port}"`);
20
- lines.push(...appEnv);
45
+ lines.push(' environment:');
46
+ lines.push(...environment);
21
47
  lines.push(' restart: unless-stopped');
22
48
  if (dependsOn.length > 0) {
23
49
  lines.push(' depends_on:');
@@ -27,6 +53,7 @@ export function generateDockerCompose(config) {
27
53
  lines.push('');
28
54
  lines.push(' redis:');
29
55
  lines.push(' image: redis:7-alpine');
56
+ lines.push(' restart: unless-stopped');
30
57
  lines.push(' volumes:');
31
58
  lines.push(' - redis-data:/data');
32
59
  lines.push(' healthcheck:');
@@ -39,6 +66,7 @@ export function generateDockerCompose(config) {
39
66
  lines.push('');
40
67
  lines.push(' postgres:');
41
68
  lines.push(' image: pgvector/pgvector:pg16');
69
+ lines.push(' restart: unless-stopped');
42
70
  lines.push(' environment:');
43
71
  lines.push(' POSTGRES_USER: cogitator');
44
72
  lines.push(' POSTGRES_PASSWORD: cogitator');
@@ -1 +1 @@
1
- {"version":3,"file":"docker-compose.js","sourceRoot":"","sources":["../../src/templates/docker-compose.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"docker-compose.js","sourceRoot":"","sources":["../../src/templates/docker-compose.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,13 @@
1
1
  import type { DeployConfig } from '@cogitator-ai/types';
2
- interface DockerfileOptions {
2
+ export type DockerfilePackageManager = 'pnpm' | 'npm' | 'yarn';
3
+ export interface DockerfileOptions {
3
4
  config: DeployConfig;
4
5
  hasTypeScript: boolean;
6
+ packageManager?: DockerfilePackageManager;
7
+ hasLockfile?: boolean;
8
+ hasBuildScript?: boolean;
9
+ startCommand?: string[];
5
10
  }
6
- export declare function generateDockerfile({ config, hasTypeScript }: DockerfileOptions): string;
7
- export {};
11
+ export declare const NODE_IMAGE = "node:22-alpine";
12
+ export declare function generateDockerfile(options: DockerfileOptions): string;
8
13
  //# sourceMappingURL=dockerfile.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dockerfile.d.ts","sourceRoot":"","sources":["../../src/templates/dockerfile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,UAAU,iBAAiB;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,iBAAiB,GAAG,MAAM,CA+BvF"}
1
+ {"version":3,"file":"dockerfile.d.ts","sourceRoot":"","sources":["../../src/templates/dockerfile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAE/D,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,YAAY,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,eAAO,MAAM,UAAU,mBAAmB,CAAC;AA2C3C,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAyCrE"}
@@ -1,31 +1,73 @@
1
- export function generateDockerfile({ config, hasTypeScript }) {
1
+ export const NODE_IMAGE = 'node:22-alpine';
2
+ function installSteps(pm, hasLockfile) {
3
+ switch (pm) {
4
+ case 'pnpm':
5
+ return {
6
+ copy: 'COPY package.json pnpm-lock.yaml* ./',
7
+ install: `RUN corepack enable && pnpm install${hasLockfile ? ' --frozen-lockfile' : ''}`,
8
+ installProd: `RUN corepack enable && pnpm install${hasLockfile ? ' --frozen-lockfile' : ''} --prod`,
9
+ build: 'RUN pnpm run build',
10
+ };
11
+ case 'yarn':
12
+ return {
13
+ copy: 'COPY package.json yarn.lock* .yarnrc.yml* ./',
14
+ install: `RUN corepack enable && yarn install${hasLockfile ? ' --frozen-lockfile' : ''}`,
15
+ installProd: `RUN corepack enable && yarn install${hasLockfile ? ' --frozen-lockfile' : ''} --production`,
16
+ build: 'RUN yarn run build',
17
+ };
18
+ case 'npm':
19
+ return {
20
+ copy: 'COPY package.json package-lock.json* ./',
21
+ install: hasLockfile ? 'RUN npm ci' : 'RUN npm install',
22
+ installProd: hasLockfile ? 'RUN npm ci --omit=dev' : 'RUN npm install --omit=dev',
23
+ build: 'RUN npm run build',
24
+ };
25
+ }
26
+ }
27
+ function healthcheck(config, port) {
28
+ const path = config.health?.path ?? '/health';
29
+ const interval = config.health?.interval ?? '30s';
30
+ const timeout = config.health?.timeout ?? '5s';
31
+ const normalizedPath = path.startsWith('/') ? path : `/${path}`;
32
+ return `HEALTHCHECK --interval=${interval} --timeout=${timeout} CMD wget -q --spider http://localhost:${port}${normalizedPath} || exit 1`;
33
+ }
34
+ export function generateDockerfile(options) {
35
+ const { config, hasTypeScript } = options;
2
36
  const port = config.port ?? 3000;
37
+ const pm = options.packageManager ?? 'pnpm';
38
+ const steps = installSteps(pm, options.hasLockfile ?? true);
39
+ const startCommand = options.startCommand ?? [
40
+ 'node',
41
+ hasTypeScript ? 'dist/server.js' : 'src/server.js',
42
+ ];
43
+ const cmd = `CMD ${JSON.stringify(startCommand)}`;
44
+ const env = `ENV NODE_ENV=production PORT=${port}`;
3
45
  if (!hasTypeScript) {
4
- return `FROM node:20-alpine
46
+ return `FROM ${NODE_IMAGE}
5
47
  WORKDIR /app
6
- COPY package.json pnpm-lock.yaml* ./
7
- RUN corepack enable && pnpm install --frozen-lockfile --prod
48
+ ${steps.copy}
49
+ ${steps.installProd}
8
50
  COPY . .
51
+ ${env}
9
52
  EXPOSE ${port}
10
- HEALTHCHECK --interval=30s --timeout=5s CMD wget -q --spider http://localhost:${port}/health || exit 1
11
- CMD ["node", "src/server.js"]
53
+ ${healthcheck(config, port)}
54
+ ${cmd}
12
55
  `;
13
56
  }
14
- return `FROM node:20-alpine AS builder
57
+ const build = options.hasBuildScript === false ? '' : `${steps.build}\n`;
58
+ return `FROM ${NODE_IMAGE} AS builder
15
59
  WORKDIR /app
16
- COPY package.json pnpm-lock.yaml* ./
17
- RUN corepack enable && pnpm install --frozen-lockfile
60
+ ${steps.copy}
61
+ ${steps.install}
18
62
  COPY . .
19
- RUN pnpm build
20
-
21
- FROM node:20-alpine AS runtime
63
+ ${build}
64
+ FROM ${NODE_IMAGE} AS runtime
22
65
  WORKDIR /app
23
- COPY --from=builder /app/dist ./dist
24
- COPY --from=builder /app/node_modules ./node_modules
25
- COPY --from=builder /app/package.json ./
66
+ COPY --from=builder /app ./
67
+ ${env}
26
68
  EXPOSE ${port}
27
- HEALTHCHECK --interval=30s --timeout=5s CMD wget -q --spider http://localhost:${port}/health || exit 1
28
- CMD ["node", "dist/server.js"]
69
+ ${healthcheck(config, port)}
70
+ ${cmd}
29
71
  `;
30
72
  }
31
73
  //# sourceMappingURL=dockerfile.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dockerfile.js","sourceRoot":"","sources":["../../src/templates/dockerfile.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,kBAAkB,CAAC,EAAE,MAAM,EAAE,aAAa,EAAqB;IAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;IAEjC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;;;;;SAKF,IAAI;gFACmE,IAAI;;CAEnF,CAAC;IACA,CAAC;IAED,OAAO;;;;;;;;;;;;SAYA,IAAI;gFACmE,IAAI;;CAEnF,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"dockerfile.js","sourceRoot":"","sources":["../../src/templates/dockerfile.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  import type { DeployConfig } from '@cogitator-ai/types';
2
+ export declare function parseMemoryMb(memory: string): number;
2
3
  export declare function generateFlyToml(config: DeployConfig): string;
3
4
  //# sourceMappingURL=fly-toml.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fly-toml.d.ts","sourceRoot":"","sources":["../../src/templates/fly-toml.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAUxD,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAgC5D"}
1
+ {"version":3,"file":"fly-toml.d.ts","sourceRoot":"","sources":["../../src/templates/fly-toml.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMpD;AAMD,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAuC5D"}
@@ -1,37 +1,46 @@
1
- function parseMemoryMb(memory) {
2
- const gb = /^(\d+(?:\.\d+)?)\s*gb$/i.exec(memory);
1
+ export function parseMemoryMb(memory) {
2
+ const gb = /^(\d+(?:\.\d+)?)\s*gb?$/i.exec(memory.trim());
3
3
  if (gb)
4
4
  return Math.round(parseFloat(gb[1]) * 1024);
5
- const mb = /^(\d+(?:\.\d+)?)\s*mb?$/i.exec(memory);
5
+ const mb = /^(\d+(?:\.\d+)?)\s*mb?$/i.exec(memory.trim());
6
6
  if (mb)
7
7
  return Math.round(parseFloat(mb[1]));
8
- return parseInt(memory) || 256;
8
+ return 256;
9
+ }
10
+ function tomlString(value) {
11
+ return JSON.stringify(value);
9
12
  }
10
13
  export function generateFlyToml(config) {
11
14
  const port = config.port ?? 3000;
12
15
  const region = config.region ?? 'iad';
13
16
  const app = config.image ?? 'cogitator-app';
14
- const memory = config.resources?.memory ?? '256mb';
15
- const memoryMb = parseMemoryMb(memory);
16
- return `app = "${app}"
17
- primary_region = "${region}"
17
+ const memoryMb = parseMemoryMb(config.resources?.memory ?? '256mb');
18
+ const instances = Math.max(config.instances ?? 1, 0);
19
+ const healthPath = config.health?.path ?? '/health';
20
+ const envEntries = Object.entries({ NODE_ENV: 'production', PORT: String(port), ...config.env });
21
+ const envSection = envEntries.map(([key, value]) => ` ${key} = ${tomlString(value)}`).join('\n');
22
+ return `app = ${tomlString(app)}
23
+ primary_region = ${tomlString(region)}
18
24
 
19
25
  [build]
20
26
 
27
+ [env]
28
+ ${envSection}
29
+
21
30
  [http_service]
22
31
  internal_port = ${port}
23
32
  force_https = true
24
33
  auto_stop_machines = "stop"
25
34
  auto_start_machines = true
26
- min_machines_running = 0
35
+ min_machines_running = ${instances > 1 ? instances : 0}
27
36
 
28
37
  [checks]
29
38
  [checks.health]
30
39
  port = ${port}
31
40
  type = "http"
32
- interval = "30s"
33
- timeout = "5s"
34
- path = "/health"
41
+ interval = ${tomlString(config.health?.interval ?? '30s')}
42
+ timeout = ${tomlString(config.health?.timeout ?? '5s')}
43
+ path = ${tomlString(healthPath.startsWith('/') ? healthPath : `/${healthPath}`)}
35
44
 
36
45
  [[vm]]
37
46
  memory = "${memoryMb}mb"
@@ -1 +1 @@
1
- {"version":3,"file":"fly-toml.js","sourceRoot":"","sources":["../../src/templates/fly-toml.ts"],"names":[],"mappings":"AAEA,SAAS,aAAa,CAAC,MAAc;IACnC,MAAM,EAAE,GAAG,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACpD,MAAM,EAAE,GAAG,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC;IACtC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,eAAe,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,IAAI,OAAO,CAAC;IACnD,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAEvC,OAAO,UAAU,GAAG;oBACF,MAAM;;;;;oBAKN,IAAI;;;;;;;;aAQX,IAAI;;;;;;;cAOH,QAAQ;;WAEX,MAAM,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC;CACpC,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"fly-toml.js","sourceRoot":"","sources":["../../src/templates/fly-toml.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,EAAE,GAAG,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACpD,MAAM,EAAE,GAAG,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC;IACtC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,eAAe,CAAC;IAC5C,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,IAAI,OAAO,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,SAAS,CAAC;IAEpD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IACjG,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAElG,OAAO,SAAS,UAAU,CAAC,GAAG,CAAC;mBACd,UAAU,CAAC,MAAM,CAAC;;;;;EAKnC,UAAU;;;oBAGQ,IAAI;;;;2BAIG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;;;;aAI3C,IAAI;;iBAEA,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,KAAK,CAAC;gBAC7C,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,IAAI,IAAI,CAAC;aAC7C,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC;;;cAGrE,QAAQ;;WAEX,MAAM,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC;CACpC,CAAC;AACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Environment visible to a deployment: the project's `.env` file, overridden by
3
+ * variables already present in the current process.
4
+ */
5
+ export declare function resolveDeployEnv(projectDir: string): NodeJS.ProcessEnv;
6
+ export declare function sanitizeName(value: string, fallback?: string): string;
7
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,UAAU,CAEtE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAkB,GAAG,MAAM,CAU9E"}
@@ -0,0 +1,21 @@
1
+ import { join } from 'node:path';
2
+ import { loadDotenvFile } from '@cogitator-ai/config';
3
+ /**
4
+ * Environment visible to a deployment: the project's `.env` file, overridden by
5
+ * variables already present in the current process.
6
+ */
7
+ export function resolveDeployEnv(projectDir) {
8
+ return { ...loadDotenvFile(join(projectDir, '.env')), ...process.env };
9
+ }
10
+ export function sanitizeName(value, fallback = 'cogitator-app') {
11
+ const cleaned = value
12
+ .toLowerCase()
13
+ .replace(/^@[^/]+\//, '')
14
+ .replace(/[^a-z0-9-]+/g, '-')
15
+ .replace(/-+/g, '-')
16
+ .replace(/^-+|-+$/g, '')
17
+ .slice(0, 63)
18
+ .replace(/-+$/g, '');
19
+ return /^[a-z0-9]/.test(cleaned) ? cleaned : fallback;
20
+ }
21
+ //# sourceMappingURL=env.js.map