@vibesdotdev/infra-doks 0.0.1

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 (113) hide show
  1. package/README.md +107 -0
  2. package/SPEC.md +285 -0
  3. package/dist/client/digitalocean-app-deploy.client.d.ts +46 -0
  4. package/dist/client/digitalocean-app-deploy.client.d.ts.map +1 -0
  5. package/dist/client/digitalocean-app-deploy.client.js +135 -0
  6. package/dist/client/digitalocean-app-deploy.client.js.map +1 -0
  7. package/dist/client/index.d.ts +15 -0
  8. package/dist/client/index.d.ts.map +1 -0
  9. package/dist/client/index.js +18 -0
  10. package/dist/client/index.js.map +1 -0
  11. package/dist/cloud/base.d.ts +33 -0
  12. package/dist/cloud/base.d.ts.map +1 -0
  13. package/dist/cloud/base.js +86 -0
  14. package/dist/cloud/base.js.map +1 -0
  15. package/dist/cloud/digitalocean.d.ts +33 -0
  16. package/dist/cloud/digitalocean.d.ts.map +1 -0
  17. package/dist/cloud/digitalocean.js +258 -0
  18. package/dist/cloud/digitalocean.js.map +1 -0
  19. package/dist/cloud/factory.d.ts +28 -0
  20. package/dist/cloud/factory.d.ts.map +1 -0
  21. package/dist/cloud/factory.js +151 -0
  22. package/dist/cloud/factory.js.map +1 -0
  23. package/dist/cloud/index.d.ts +12 -0
  24. package/dist/cloud/index.d.ts.map +1 -0
  25. package/dist/cloud/index.js +11 -0
  26. package/dist/cloud/index.js.map +1 -0
  27. package/dist/doks.plugin.d.ts +41 -0
  28. package/dist/doks.plugin.d.ts.map +1 -0
  29. package/dist/doks.plugin.js +287 -0
  30. package/dist/doks.plugin.js.map +1 -0
  31. package/dist/implementations/deployment.impl.d.ts +34 -0
  32. package/dist/implementations/deployment.impl.d.ts.map +1 -0
  33. package/dist/implementations/deployment.impl.js +86 -0
  34. package/dist/implementations/deployment.impl.js.map +1 -0
  35. package/dist/implementations/droplet.impl.d.ts +85 -0
  36. package/dist/implementations/droplet.impl.d.ts.map +1 -0
  37. package/dist/implementations/droplet.impl.js +113 -0
  38. package/dist/implementations/droplet.impl.js.map +1 -0
  39. package/dist/implementations/gitea.impl.d.ts +68 -0
  40. package/dist/implementations/gitea.impl.d.ts.map +1 -0
  41. package/dist/implementations/gitea.impl.js +295 -0
  42. package/dist/implementations/gitea.impl.js.map +1 -0
  43. package/dist/implementations/managed-db.impl.d.ts +25 -0
  44. package/dist/implementations/managed-db.impl.d.ts.map +1 -0
  45. package/dist/implementations/managed-db.impl.js +31 -0
  46. package/dist/implementations/managed-db.impl.js.map +1 -0
  47. package/dist/implementations/managed-redis.impl.d.ts +37 -0
  48. package/dist/implementations/managed-redis.impl.d.ts.map +1 -0
  49. package/dist/implementations/managed-redis.impl.js +40 -0
  50. package/dist/implementations/managed-redis.impl.js.map +1 -0
  51. package/dist/implementations/spaces.impl.d.ts +36 -0
  52. package/dist/implementations/spaces.impl.d.ts.map +1 -0
  53. package/dist/implementations/spaces.impl.js +40 -0
  54. package/dist/implementations/spaces.impl.js.map +1 -0
  55. package/dist/implementations/statefulset.impl.d.ts +65 -0
  56. package/dist/implementations/statefulset.impl.d.ts.map +1 -0
  57. package/dist/implementations/statefulset.impl.js +165 -0
  58. package/dist/implementations/statefulset.impl.js.map +1 -0
  59. package/dist/implementations/verdaccio.impl.d.ts +65 -0
  60. package/dist/implementations/verdaccio.impl.d.ts.map +1 -0
  61. package/dist/implementations/verdaccio.impl.js +259 -0
  62. package/dist/implementations/verdaccio.impl.js.map +1 -0
  63. package/dist/index.d.ts +15 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +19 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/kubernetes/index.d.ts +95 -0
  68. package/dist/kubernetes/index.d.ts.map +1 -0
  69. package/dist/kubernetes/index.js +625 -0
  70. package/dist/kubernetes/index.js.map +1 -0
  71. package/dist/secrets/index.d.ts +4 -0
  72. package/dist/secrets/index.d.ts.map +1 -0
  73. package/dist/secrets/index.js +4 -0
  74. package/dist/secrets/index.js.map +1 -0
  75. package/dist/secrets/vault.descriptor.d.ts +10 -0
  76. package/dist/secrets/vault.descriptor.d.ts.map +1 -0
  77. package/dist/secrets/vault.descriptor.js +25 -0
  78. package/dist/secrets/vault.descriptor.js.map +1 -0
  79. package/dist/secrets/vault.impl.cloud.d.ts +40 -0
  80. package/dist/secrets/vault.impl.cloud.d.ts.map +1 -0
  81. package/dist/secrets/vault.impl.cloud.js +178 -0
  82. package/dist/secrets/vault.impl.cloud.js.map +1 -0
  83. package/dist/secrets/vault.impl.d.ts +29 -0
  84. package/dist/secrets/vault.impl.d.ts.map +1 -0
  85. package/dist/secrets/vault.impl.js +137 -0
  86. package/dist/secrets/vault.impl.js.map +1 -0
  87. package/dist/types.d.ts +509 -0
  88. package/dist/types.d.ts.map +1 -0
  89. package/dist/types.js +47 -0
  90. package/dist/types.js.map +1 -0
  91. package/package.json +145 -0
  92. package/src/client/digitalocean-app-deploy.client.ts +226 -0
  93. package/src/client/index.ts +24 -0
  94. package/src/cloud/base.ts +149 -0
  95. package/src/cloud/digitalocean.ts +363 -0
  96. package/src/cloud/factory.ts +190 -0
  97. package/src/cloud/index.ts +81 -0
  98. package/src/doks.plugin.ts +401 -0
  99. package/src/implementations/deployment.impl.ts +93 -0
  100. package/src/implementations/droplet.impl.ts +157 -0
  101. package/src/implementations/gitea.impl.ts +319 -0
  102. package/src/implementations/managed-db.impl.ts +37 -0
  103. package/src/implementations/managed-redis.impl.ts +49 -0
  104. package/src/implementations/spaces.impl.ts +52 -0
  105. package/src/implementations/statefulset.impl.ts +186 -0
  106. package/src/implementations/verdaccio.impl.ts +300 -0
  107. package/src/index.ts +136 -0
  108. package/src/kubernetes/index.ts +754 -0
  109. package/src/secrets/index.ts +9 -0
  110. package/src/secrets/vault.descriptor.ts +28 -0
  111. package/src/secrets/vault.impl.cloud.ts +278 -0
  112. package/src/secrets/vault.impl.ts +149 -0
  113. package/src/types.ts +563 -0
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Base Cloud Provider Implementation
3
+ *
4
+ * Abstract base class that provides common functionality for all cloud providers.
5
+ */
6
+ import type { CloudProvider, CloudInstance, InstanceConfig, InstanceFilters, CloudVolume, VolumeConfig, VolumeFilters, SSHKey } from '../types.ts';
7
+ import { CloudProviderError } from '../types.ts';
8
+ export declare abstract class BaseCloudProvider implements CloudProvider {
9
+ protected credentials: string;
10
+ protected defaultRegion?: string | undefined;
11
+ abstract name: string;
12
+ constructor(credentials: string, defaultRegion?: string | undefined);
13
+ abstract createInstance(config: InstanceConfig): Promise<CloudInstance>;
14
+ abstract deleteInstance(instanceId: string): Promise<void>;
15
+ abstract getInstance(instanceId: string): Promise<CloudInstance | null>;
16
+ abstract listInstances(filters?: InstanceFilters): Promise<CloudInstance[]>;
17
+ abstract createVolume(config: VolumeConfig): Promise<CloudVolume>;
18
+ abstract attachVolume(volumeId: string, instanceId: string): Promise<void>;
19
+ abstract detachVolume(volumeId: string): Promise<void>;
20
+ abstract deleteVolume(volumeId: string): Promise<void>;
21
+ abstract listVolumes(filters?: VolumeFilters): Promise<CloudVolume[]>;
22
+ abstract getOrCreateVPC(name: string): Promise<string>;
23
+ abstract addSSHKey(name: string, publicKey: string): Promise<string>;
24
+ abstract listSSHKeys(): Promise<SSHKey[]>;
25
+ protected generateInstanceName(prefix?: string): string;
26
+ protected generateVolumeName(prefix?: string): string;
27
+ protected waitForInstanceStatus(instanceId: string, targetStatus: string, timeoutMs?: number, pollIntervalMs?: number): Promise<CloudInstance>;
28
+ protected waitForVolumeStatus(volumeId: string, targetStatus: string, timeoutMs?: number, pollIntervalMs?: number): Promise<CloudVolume>;
29
+ protected createError(message: string, code: string, details?: unknown): CloudProviderError;
30
+ protected sleep(ms: number): Promise<void>;
31
+ protected buildTags(tags: Record<string, string>, additionalTags?: Record<string, string>): Record<string, string>;
32
+ }
33
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/cloud/base.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,EACf,WAAW,EACX,YAAY,EACZ,aAAa,EACb,MAAM,EACN,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,8BAAsB,iBAAkB,YAAW,aAAa;IAI9D,SAAS,CAAC,WAAW,EAAE,MAAM;IAC7B,SAAS,CAAC,aAAa,CAAC,EAAE,MAAM;IAJjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAGX,WAAW,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,MAAM,YAAA;IAIjC,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IACvE,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1D,QAAQ,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IACvE,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAE3E,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IACjE,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1E,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACtD,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACtD,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAErE,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACtD,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACpE,QAAQ,CAAC,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAGzC,SAAS,CAAC,oBAAoB,CAAC,MAAM,GAAE,MAAuB,GAAG,MAAM;IAMvE,SAAS,CAAC,kBAAkB,CAAC,MAAM,GAAE,MAAqB,GAAG,MAAM;cAMnD,qBAAqB,CACpC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,SAAS,GAAE,MAAe,EAC1B,cAAc,GAAE,MAAa,GAC3B,OAAO,CAAC,aAAa,CAAC;cAgCT,mBAAmB,CAClC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,SAAS,GAAE,MAAe,EAC1B,cAAc,GAAE,MAAa,GAC3B,OAAO,CAAC,WAAW,CAAC;IAgCvB,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,kBAAkB;IAI3F,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,SAAS,CAAC,SAAS,CAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACrC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAQzB"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Base Cloud Provider Implementation
3
+ *
4
+ * Abstract base class that provides common functionality for all cloud providers.
5
+ */
6
+ import { CloudProviderError } from "../types.js";
7
+ export class BaseCloudProvider {
8
+ credentials;
9
+ defaultRegion;
10
+ constructor(credentials, defaultRegion) {
11
+ this.credentials = credentials;
12
+ this.defaultRegion = defaultRegion;
13
+ }
14
+ // Common helper methods
15
+ generateInstanceName(prefix = 'gpu-instance') {
16
+ const timestamp = Date.now();
17
+ const random = Math.random().toString(36).substring(2, 8);
18
+ return `${prefix}-${timestamp}-${random}`;
19
+ }
20
+ generateVolumeName(prefix = 'gpu-volume') {
21
+ const timestamp = Date.now();
22
+ const random = Math.random().toString(36).substring(2, 8);
23
+ return `${prefix}-${timestamp}-${random}`;
24
+ }
25
+ async waitForInstanceStatus(instanceId, targetStatus, timeoutMs = 300000, pollIntervalMs = 5000) {
26
+ const startTime = Date.now();
27
+ while (Date.now() - startTime < timeoutMs) {
28
+ const instance = await this.getInstance(instanceId);
29
+ if (!instance) {
30
+ throw this.createError('Instance not found', 'INSTANCE_NOT_FOUND', { instanceId });
31
+ }
32
+ if (instance.status === targetStatus) {
33
+ return instance;
34
+ }
35
+ if (instance.status === 'error' || instance.status === 'terminated') {
36
+ throw this.createError(`Instance entered error state: ${instance.status}`, 'INSTANCE_ERROR', { instanceId, status: instance.status });
37
+ }
38
+ await this.sleep(pollIntervalMs);
39
+ }
40
+ throw this.createError(`Timeout waiting for instance status: ${targetStatus}`, 'TIMEOUT', {
41
+ instanceId,
42
+ targetStatus,
43
+ timeoutMs
44
+ });
45
+ }
46
+ async waitForVolumeStatus(volumeId, targetStatus, timeoutMs = 120000, pollIntervalMs = 3000) {
47
+ const startTime = Date.now();
48
+ while (Date.now() - startTime < timeoutMs) {
49
+ const volumes = await this.listVolumes();
50
+ const volume = volumes.find((v) => v.id === volumeId);
51
+ if (!volume) {
52
+ throw this.createError('Volume not found', 'VOLUME_NOT_FOUND', { volumeId });
53
+ }
54
+ if (volume.status === targetStatus) {
55
+ return volume;
56
+ }
57
+ if (volume.status === 'error' || volume.status === 'deleted') {
58
+ throw this.createError(`Volume entered error state: ${volume.status}`, 'VOLUME_ERROR', {
59
+ volumeId,
60
+ status: volume.status
61
+ });
62
+ }
63
+ await this.sleep(pollIntervalMs);
64
+ }
65
+ throw this.createError(`Timeout waiting for volume status: ${targetStatus}`, 'TIMEOUT', {
66
+ volumeId,
67
+ targetStatus,
68
+ timeoutMs
69
+ });
70
+ }
71
+ createError(message, code, details) {
72
+ return new CloudProviderError(message, code, this.name, details);
73
+ }
74
+ sleep(ms) {
75
+ return new Promise((resolve) => setTimeout(resolve, ms));
76
+ }
77
+ buildTags(tags, additionalTags) {
78
+ return {
79
+ 'managed-by': 'vibes',
80
+ provider: this.name,
81
+ ...tags,
82
+ ...additionalTags
83
+ };
84
+ }
85
+ }
86
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/cloud/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * DigitalOcean Cloud Provider Implementation
3
+ *
4
+ * Implements the CloudProvider interface for DigitalOcean.
5
+ */
6
+ import { BaseCloudProvider } from './base.ts';
7
+ import type { CloudInstance, InstanceConfig, InstanceFilters, CloudVolume, VolumeConfig, VolumeFilters, SSHKey } from '../types.ts';
8
+ export declare class DigitalOceanProvider extends BaseCloudProvider {
9
+ name: string;
10
+ private readonly apiBase;
11
+ constructor(apiToken: string, defaultRegion?: string);
12
+ private doRequest;
13
+ createInstance(config: InstanceConfig): Promise<CloudInstance>;
14
+ deleteInstance(instanceId: string): Promise<void>;
15
+ getInstance(instanceId: string): Promise<CloudInstance | null>;
16
+ listInstances(filters?: InstanceFilters): Promise<CloudInstance[]>;
17
+ createVolume(config: VolumeConfig): Promise<CloudVolume>;
18
+ attachVolume(volumeId: string, instanceId: string): Promise<void>;
19
+ detachVolume(volumeId: string): Promise<void>;
20
+ deleteVolume(volumeId: string): Promise<void>;
21
+ listVolumes(filters?: VolumeFilters): Promise<CloudVolume[]>;
22
+ getOrCreateVPC(name: string): Promise<string>;
23
+ addSSHKey(name: string, publicKey: string): Promise<string>;
24
+ listSSHKeys(): Promise<SSHKey[]>;
25
+ private waitForDropletReady;
26
+ private mapDropletToInstance;
27
+ private mapDropletStatus;
28
+ private mapVolumeToCloudVolume;
29
+ private extractDropletId;
30
+ private formatTags;
31
+ private parseTags;
32
+ }
33
+ //# sourceMappingURL=digitalocean.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digitalocean.d.ts","sourceRoot":"","sources":["../../src/cloud/digitalocean.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EACX,aAAa,EACb,cAAc,EACd,eAAe,EACf,WAAW,EACX,YAAY,EACZ,aAAa,EACb,MAAM,EAEN,MAAM,aAAa,CAAC;AA0CrB,qBAAa,oBAAqB,SAAQ,iBAAiB;IAC1D,IAAI,SAAkB;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;gBAEjD,QAAQ,EAAE,MAAM,EAAE,aAAa,GAAE,MAAe;YAI9C,SAAS;IAqBjB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAyB9D,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAa9D,aAAa,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAuBlE,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAgBxD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAejE,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY7C,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7C,WAAW,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAY5D,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0B7C,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAY3D,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAaxB,mBAAmB;IA6BjC,OAAO,CAAC,oBAAoB;IAiB5B,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,sBAAsB;IAa9B,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,SAAS;CAYjB"}
@@ -0,0 +1,258 @@
1
+ /**
2
+ * DigitalOcean Cloud Provider Implementation
3
+ *
4
+ * Implements the CloudProvider interface for DigitalOcean.
5
+ */
6
+ import { BaseCloudProvider } from "./base.js";
7
+ export class DigitalOceanProvider extends BaseCloudProvider {
8
+ name = 'digitalocean';
9
+ apiBase = 'https://api.digitalocean.com/v2';
10
+ constructor(apiToken, defaultRegion = 'nyc3') {
11
+ super(apiToken, defaultRegion);
12
+ }
13
+ async doRequest(path, options = {}) {
14
+ const response = await fetch(`${this.apiBase}${path}`, {
15
+ ...options,
16
+ headers: {
17
+ Authorization: `Bearer ${this.credentials}`,
18
+ 'Content-Type': 'application/json',
19
+ ...options.headers
20
+ }
21
+ });
22
+ if (!response.ok) {
23
+ const error = await response.text();
24
+ throw this.createError(`DigitalOcean API error: ${response.status}`, 'API_ERROR', {
25
+ status: response.status,
26
+ error
27
+ });
28
+ }
29
+ return response.json();
30
+ }
31
+ async createInstance(config) {
32
+ const dropletData = {
33
+ name: config.name,
34
+ region: config.region || this.defaultRegion,
35
+ size: config.type,
36
+ image: config.image,
37
+ ssh_keys: config.sshKeys || [],
38
+ vpc_uuid: config.vpcId,
39
+ tags: this.formatTags(this.buildTags(config.tags)),
40
+ user_data: config.userData
41
+ };
42
+ const response = await this.doRequest('/droplets', {
43
+ method: 'POST',
44
+ body: JSON.stringify(dropletData)
45
+ });
46
+ const droplet = response.droplet;
47
+ // Wait for droplet to be ready
48
+ const readyDroplet = await this.waitForDropletReady(droplet.id);
49
+ return this.mapDropletToInstance(readyDroplet);
50
+ }
51
+ async deleteInstance(instanceId) {
52
+ const numericId = this.extractDropletId(instanceId);
53
+ await this.doRequest(`/droplets/${numericId}`, {
54
+ method: 'DELETE'
55
+ });
56
+ }
57
+ async getInstance(instanceId) {
58
+ try {
59
+ const numericId = this.extractDropletId(instanceId);
60
+ const response = await this.doRequest(`/droplets/${numericId}`);
61
+ return this.mapDropletToInstance(response.droplet);
62
+ }
63
+ catch (error) {
64
+ if (error.details?.status === 404) {
65
+ return null;
66
+ }
67
+ throw error;
68
+ }
69
+ }
70
+ async listInstances(filters) {
71
+ const params = new URLSearchParams();
72
+ if (filters?.tags) {
73
+ params.append('tag_name', this.formatTags(filters.tags).join(','));
74
+ }
75
+ const response = await this.doRequest(`/droplets?${params.toString()}`);
76
+ const droplets = response.droplets;
77
+ let instances = droplets.map((d) => this.mapDropletToInstance(d));
78
+ // Apply additional filters
79
+ if (filters?.status) {
80
+ instances = instances.filter((i) => filters.status.includes(i.status));
81
+ }
82
+ if (filters?.region) {
83
+ instances = instances.filter((i) => i.region === filters.region);
84
+ }
85
+ return instances;
86
+ }
87
+ async createVolume(config) {
88
+ const volumeData = {
89
+ name: config.name,
90
+ size_gigabytes: config.size,
91
+ region: config.region || this.defaultRegion,
92
+ tags: config.tags ? this.formatTags(config.tags) : []
93
+ };
94
+ const response = await this.doRequest('/volumes', {
95
+ method: 'POST',
96
+ body: JSON.stringify(volumeData)
97
+ });
98
+ return this.mapVolumeToCloudVolume(response.volume);
99
+ }
100
+ async attachVolume(volumeId, instanceId) {
101
+ const numericId = this.extractDropletId(instanceId);
102
+ await this.doRequest(`/volumes/${volumeId}/actions`, {
103
+ method: 'POST',
104
+ body: JSON.stringify({
105
+ type: 'attach',
106
+ droplet_id: numericId
107
+ })
108
+ });
109
+ // Wait for volume to be attached
110
+ await this.waitForVolumeStatus(volumeId, 'in-use');
111
+ }
112
+ async detachVolume(volumeId) {
113
+ await this.doRequest(`/volumes/${volumeId}/actions`, {
114
+ method: 'POST',
115
+ body: JSON.stringify({
116
+ type: 'detach'
117
+ })
118
+ });
119
+ // Wait for volume to be available
120
+ await this.waitForVolumeStatus(volumeId, 'available');
121
+ }
122
+ async deleteVolume(volumeId) {
123
+ await this.doRequest(`/volumes/${volumeId}`, {
124
+ method: 'DELETE'
125
+ });
126
+ }
127
+ async listVolumes(filters) {
128
+ const params = new URLSearchParams();
129
+ if (filters?.region) {
130
+ params.append('region', filters.region);
131
+ }
132
+ const response = await this.doRequest(`/volumes?${params.toString()}`);
133
+ const volumes = response.volumes;
134
+ return volumes.map((v) => this.mapVolumeToCloudVolume(v));
135
+ }
136
+ async getOrCreateVPC(name) {
137
+ // List existing VPCs
138
+ const response = await this.doRequest('/vpcs');
139
+ const vpcs = response.vpcs || [];
140
+ // Check if VPC with this name exists
141
+ const existingVpc = vpcs.find((vpc) => vpc.name === name);
142
+ if (existingVpc) {
143
+ return existingVpc.id;
144
+ }
145
+ // Create new VPC
146
+ const vpcData = {
147
+ name,
148
+ region: this.defaultRegion,
149
+ ip_range: '10.0.0.0/16'
150
+ };
151
+ const createResponse = await this.doRequest('/vpcs', {
152
+ method: 'POST',
153
+ body: JSON.stringify(vpcData)
154
+ });
155
+ return createResponse.vpc.id;
156
+ }
157
+ async addSSHKey(name, publicKey) {
158
+ const response = await this.doRequest('/account/keys', {
159
+ method: 'POST',
160
+ body: JSON.stringify({
161
+ name,
162
+ public_key: publicKey
163
+ })
164
+ });
165
+ return response.ssh_key.fingerprint;
166
+ }
167
+ async listSSHKeys() {
168
+ const response = await this.doRequest('/account/keys');
169
+ const keys = response.ssh_keys;
170
+ return keys.map((key) => ({
171
+ id: key.fingerprint,
172
+ name: key.name,
173
+ fingerprint: key.fingerprint,
174
+ publicKey: key.public_key
175
+ }));
176
+ }
177
+ // Helper methods
178
+ async waitForDropletReady(dropletId) {
179
+ const startTime = Date.now();
180
+ const timeout = 300000;
181
+ const pollInterval = 5000;
182
+ while (Date.now() - startTime < timeout) {
183
+ const response = await this.doRequest(`/droplets/${dropletId}`);
184
+ const droplet = response.droplet;
185
+ if (droplet.status === 'active') {
186
+ return droplet;
187
+ }
188
+ if (droplet.status === 'error' || droplet.status === 'archive') {
189
+ throw this.createError(`Droplet entered error state: ${droplet.status}`, 'DROPLET_ERROR', {
190
+ dropletId,
191
+ status: droplet.status
192
+ });
193
+ }
194
+ await this.sleep(pollInterval);
195
+ }
196
+ throw this.createError('Timeout waiting for droplet to be ready', 'TIMEOUT', {
197
+ dropletId,
198
+ timeout
199
+ });
200
+ }
201
+ mapDropletToInstance(droplet) {
202
+ const publicIp = droplet.networks.v4.find((n) => n.type === 'public')?.ip_address;
203
+ const privateIp = droplet.networks.v4.find((n) => n.type === 'private')?.ip_address;
204
+ return {
205
+ id: `do-${droplet.id}`,
206
+ name: droplet.name,
207
+ type: droplet.size.slug,
208
+ region: droplet.region.slug,
209
+ status: this.mapDropletStatus(droplet.status),
210
+ publicIp,
211
+ privateIp,
212
+ createdAt: new Date(droplet.created_at),
213
+ tags: this.parseTags(droplet.tags)
214
+ };
215
+ }
216
+ mapDropletStatus(doStatus) {
217
+ const statusMap = {
218
+ new: 'pending',
219
+ active: 'running',
220
+ off: 'stopped',
221
+ archive: 'terminated',
222
+ error: 'error'
223
+ };
224
+ return statusMap[doStatus] || 'pending';
225
+ }
226
+ mapVolumeToCloudVolume(volume) {
227
+ return {
228
+ id: volume.id,
229
+ name: volume.name,
230
+ size: volume.size_gigabytes,
231
+ region: volume.region.slug,
232
+ status: volume.droplet_ids.length > 0 ? 'in-use' : 'available',
233
+ attachedTo: volume.droplet_ids.length > 0 ? `do-${volume.droplet_ids[0]}` : undefined,
234
+ createdAt: new Date(volume.created_at),
235
+ tags: this.parseTags(volume.tags)
236
+ };
237
+ }
238
+ extractDropletId(instanceId) {
239
+ if (instanceId.startsWith('do-')) {
240
+ return parseInt(instanceId.substring(3), 10);
241
+ }
242
+ return parseInt(instanceId, 10);
243
+ }
244
+ formatTags(tags) {
245
+ return Object.entries(tags).map(([key, value]) => `${key}:${value}`);
246
+ }
247
+ parseTags(tags) {
248
+ const result = {};
249
+ for (const tag of tags) {
250
+ const [key, value] = tag.split(':');
251
+ if (key && value) {
252
+ result[key] = value;
253
+ }
254
+ }
255
+ return result;
256
+ }
257
+ }
258
+ //# sourceMappingURL=digitalocean.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digitalocean.js","sourceRoot":"","sources":["../../src/cloud/digitalocean.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Cloud Provider Factory
3
+ *
4
+ * Creates cloud provider instances based on configuration.
5
+ * Unsupported providers return a stub that throws {@link CloudProviderError}
6
+ * on every operation instead of crashing at construction time.
7
+ */
8
+ import type { CloudProvider, CloudProviderConfig } from '../types.ts';
9
+ /**
10
+ * Create a cloud provider instance.
11
+ *
12
+ * For known-but-unimplemented providers (aws, gcp, azure) the returned
13
+ * instance is valid but every method call throws a structured
14
+ * {@link CloudProviderError} with code `PROVIDER_NOT_IMPLEMENTED`.
15
+ *
16
+ * For completely unknown provider types a raw {@link Error} is still thrown
17
+ * at construction time because the caller has passed an invalid configuration.
18
+ */
19
+ export declare function createCloudProvider(config: CloudProviderConfig): CloudProvider;
20
+ /**
21
+ * Get cloud provider from environment configuration
22
+ */
23
+ export declare function getCloudProviderFromEnv(): CloudProvider | null;
24
+ /**
25
+ * Validate cloud provider configuration
26
+ */
27
+ export declare function validateCloudProviderConfig(config: CloudProviderConfig): string[];
28
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/cloud/factory.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACX,aAAa,EACb,mBAAmB,EAQnB,MAAM,aAAa,CAAC;AAqErB;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,aAAa,CAqB9E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,aAAa,GAAG,IAAI,CA6B9D;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,EAAE,CA8BjF"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Cloud Provider Factory
3
+ *
4
+ * Creates cloud provider instances based on configuration.
5
+ * Unsupported providers return a stub that throws {@link CloudProviderError}
6
+ * on every operation instead of crashing at construction time.
7
+ */
8
+ import { getRuntimeEnv } from '@vibesdotdev/runtime';
9
+ import { getLogger } from '@vibesdotdev/logging';
10
+ import { CloudProviderError } from "../types.js";
11
+ import { DigitalOceanProvider } from "./digitalocean.js";
12
+ const logger = getLogger('infra-doks:cloud');
13
+ /**
14
+ * Stub returned for providers that are recognised but not yet implemented.
15
+ *
16
+ * Logs a warning once at construction and throws a structured
17
+ * {@link CloudProviderError} on every method call so callers can distinguish
18
+ * "provider not available" from "unknown provider" without catching raw Errors.
19
+ */
20
+ class UnsupportedCloudProvider {
21
+ name;
22
+ constructor(providerType) {
23
+ this.name = providerType;
24
+ logger.warn(`${providerType} cloud provider requested but is not yet implemented`);
25
+ }
26
+ unsupported() {
27
+ throw new CloudProviderError(`${this.name} provider is not yet implemented`, 'PROVIDER_NOT_IMPLEMENTED', this.name);
28
+ }
29
+ createInstance(_config) {
30
+ return this.unsupported();
31
+ }
32
+ deleteInstance(_instanceId) {
33
+ return this.unsupported();
34
+ }
35
+ getInstance(_instanceId) {
36
+ return this.unsupported();
37
+ }
38
+ listInstances(_filters) {
39
+ return this.unsupported();
40
+ }
41
+ createVolume(_config) {
42
+ return this.unsupported();
43
+ }
44
+ attachVolume(_volumeId, _instanceId) {
45
+ return this.unsupported();
46
+ }
47
+ detachVolume(_volumeId) {
48
+ return this.unsupported();
49
+ }
50
+ deleteVolume(_volumeId) {
51
+ return this.unsupported();
52
+ }
53
+ listVolumes(_filters) {
54
+ return this.unsupported();
55
+ }
56
+ getOrCreateVPC(_name) {
57
+ return this.unsupported();
58
+ }
59
+ addSSHKey(_name, _publicKey) {
60
+ return this.unsupported();
61
+ }
62
+ listSSHKeys() {
63
+ return this.unsupported();
64
+ }
65
+ }
66
+ /**
67
+ * Create a cloud provider instance.
68
+ *
69
+ * For known-but-unimplemented providers (aws, gcp, azure) the returned
70
+ * instance is valid but every method call throws a structured
71
+ * {@link CloudProviderError} with code `PROVIDER_NOT_IMPLEMENTED`.
72
+ *
73
+ * For completely unknown provider types a raw {@link Error} is still thrown
74
+ * at construction time because the caller has passed an invalid configuration.
75
+ */
76
+ export function createCloudProvider(config) {
77
+ switch (config.type) {
78
+ case 'digitalocean':
79
+ return new DigitalOceanProvider(config.credentials, config.region);
80
+ case 'aws':
81
+ return new UnsupportedCloudProvider(config.type);
82
+ case 'gcp':
83
+ return new UnsupportedCloudProvider(config.type);
84
+ case 'azure':
85
+ return new UnsupportedCloudProvider(config.type);
86
+ default: {
87
+ // Exhaustiveness check: this should never be reached if config.type
88
+ // is one of the known providers. TypeScript should narrow config to
89
+ // never here, but we use a type assertion to handle edge cases.
90
+ throw new Error(`Unknown cloud provider type: ${config.type}`);
91
+ }
92
+ }
93
+ }
94
+ /**
95
+ * Get cloud provider from environment configuration
96
+ */
97
+ export function getCloudProviderFromEnv() {
98
+ // Check for DigitalOcean
99
+ const doToken = getRuntimeEnv('DIGITALOCEAN_TOKEN');
100
+ if (doToken) {
101
+ return createCloudProvider({
102
+ type: 'digitalocean',
103
+ credentials: doToken,
104
+ region: getRuntimeEnv('GPU_REGION') || 'nyc3'
105
+ });
106
+ }
107
+ // Check for AWS
108
+ const awsAccessKey = getRuntimeEnv('AWS_ACCESS_KEY_ID');
109
+ const awsSecretKey = getRuntimeEnv('AWS_SECRET_ACCESS_KEY');
110
+ if (awsAccessKey && awsSecretKey) {
111
+ logger.warn('AWS credentials detected but AWS provider is not yet implemented');
112
+ }
113
+ const gcpCredentials = getRuntimeEnv('GOOGLE_APPLICATION_CREDENTIALS');
114
+ if (gcpCredentials) {
115
+ logger.warn('GCP provider detected but not yet implemented');
116
+ }
117
+ const azureClientId = getRuntimeEnv('AZURE_CLIENT_ID');
118
+ if (azureClientId) {
119
+ logger.warn('Azure provider detected but not yet implemented');
120
+ }
121
+ return null;
122
+ }
123
+ /**
124
+ * Validate cloud provider configuration
125
+ */
126
+ export function validateCloudProviderConfig(config) {
127
+ const errors = [];
128
+ if (!config.type) {
129
+ errors.push('Cloud provider type is required');
130
+ }
131
+ if (!config.credentials) {
132
+ errors.push('Cloud provider credentials are required');
133
+ }
134
+ // Provider-specific validation
135
+ switch (config.type) {
136
+ case 'digitalocean':
137
+ if (!config.credentials || config.credentials.length < 20) {
138
+ errors.push('Invalid DigitalOcean API token');
139
+ }
140
+ break;
141
+ case 'aws':
142
+ case 'gcp':
143
+ case 'azure':
144
+ errors.push(`${config.type} provider not yet implemented`);
145
+ break;
146
+ default:
147
+ errors.push(`Unknown cloud provider type: ${config.type}`);
148
+ }
149
+ return errors;
150
+ }
151
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/cloud/factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Cloud Provider Abstraction Layer
3
+ *
4
+ * Provides a unified interface for managing cloud resources across
5
+ * different providers (DigitalOcean, AWS, GCP, Azure).
6
+ */
7
+ export type { K8sMetadata, K8sLabelSelector, K8sResourceQuantity, K8sResourceRequirements, K8sEnvFromSource, K8sEnvVar, K8sProbe, K8sContainerPort, K8sVolumeMount, K8sContainer, K8sConfigMapKeyToPath, K8sVolume, K8sPodSpec, K8sPodTemplateSpec, K8sDeployment, K8sPersistentVolumeClaimSpec, K8sVolumeClaimTemplate, K8sStatefulSet, K8sServicePort, K8sService, K8sConfigMap, K8sSecret, DOManagedDBSpec, DOManagedRedisSpec, DOSpacesSpec, CloudProvider, InstanceConfig, CloudInstance, InstanceFilters, VolumeConfig, CloudVolume, VolumeFilters, SSHKey, CloudProviderConfig, InstanceStatus, VolumeStatus, K8sConfig, K8sEnvironment, PodSelector, PodStatus, LogOptions, LogEntry, LogStream, DeploymentStatus, ServiceInfo, PodMetrics, ResourceMetrics, K8sEvent, ExecOptions, ExecResult, PortForwardOptions, PortForward, PodPhase, ConditionStatus, DeploymentConditionType, ServiceType, ServiceProtocol, EventType, ContainerState, } from '../types.ts';
8
+ export { CloudProviderError, K8sError, K8sAuthError, K8sNotFoundError, } from '../types.ts';
9
+ export { BaseCloudProvider } from './base.ts';
10
+ export { DigitalOceanProvider } from './digitalocean.ts';
11
+ export { createCloudProvider, getCloudProviderFromEnv, validateCloudProviderConfig } from './factory.ts';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cloud/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EACX,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,qBAAqB,EACrB,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,4BAA4B,EAC5B,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,UAAU,EACV,YAAY,EACZ,SAAS,EACT,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,aAAa,EACb,eAAe,EACf,YAAY,EACZ,WAAW,EACX,aAAa,EACb,MAAM,EACN,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,SAAS,EACT,cAAc,EACd,WAAW,EACX,SAAS,EACT,UAAU,EACV,QAAQ,EACR,SAAS,EACT,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,eAAe,EACf,QAAQ,EACR,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,WAAW,EACX,QAAQ,EACR,eAAe,EACf,uBAAuB,EACvB,WAAW,EACX,eAAe,EACf,SAAS,EACT,cAAc,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,kBAAkB,EAClB,QAAQ,EACR,YAAY,EACZ,gBAAgB,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EACN,mBAAmB,EACnB,uBAAuB,EACvB,2BAA2B,EAC3B,MAAM,cAAc,CAAC"}