@microagi/alchemy-gcp 0.2.1 → 0.5.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 (107) hide show
  1. package/CHANGELOG.md +165 -0
  2. package/README.md +54 -2
  3. package/lib/ArtifactRegistry/Operations.d.ts +47 -0
  4. package/lib/ArtifactRegistry/Operations.d.ts.map +1 -0
  5. package/lib/ArtifactRegistry/Operations.js +47 -0
  6. package/lib/ArtifactRegistry/Operations.js.map +1 -0
  7. package/lib/ArtifactRegistry/Repository.d.ts +263 -0
  8. package/lib/ArtifactRegistry/Repository.d.ts.map +1 -0
  9. package/lib/ArtifactRegistry/Repository.js +257 -0
  10. package/lib/ArtifactRegistry/Repository.js.map +1 -0
  11. package/lib/ArtifactRegistry/Types.d.ts +32 -0
  12. package/lib/ArtifactRegistry/Types.d.ts.map +1 -0
  13. package/lib/ArtifactRegistry/Types.js +12 -0
  14. package/lib/ArtifactRegistry/Types.js.map +1 -0
  15. package/lib/ArtifactRegistry/Validation.d.ts +43 -0
  16. package/lib/ArtifactRegistry/Validation.d.ts.map +1 -0
  17. package/lib/ArtifactRegistry/Validation.js +95 -0
  18. package/lib/ArtifactRegistry/Validation.js.map +1 -0
  19. package/lib/ArtifactRegistry/index.d.ts +4 -0
  20. package/lib/ArtifactRegistry/index.d.ts.map +1 -0
  21. package/lib/ArtifactRegistry/index.js +2 -0
  22. package/lib/ArtifactRegistry/index.js.map +1 -0
  23. package/lib/Providers.d.ts.map +1 -1
  24. package/lib/Providers.js +13 -1
  25. package/lib/Providers.js.map +1 -1
  26. package/lib/Run/IamMember.d.ts +70 -0
  27. package/lib/Run/IamMember.d.ts.map +1 -0
  28. package/lib/Run/IamMember.js +65 -0
  29. package/lib/Run/IamMember.js.map +1 -0
  30. package/lib/Run/IamSync.d.ts +80 -0
  31. package/lib/Run/IamSync.d.ts.map +1 -0
  32. package/lib/Run/IamSync.js +73 -0
  33. package/lib/Run/IamSync.js.map +1 -0
  34. package/lib/Run/Job.d.ts +167 -0
  35. package/lib/Run/Job.d.ts.map +1 -0
  36. package/lib/Run/Job.js +199 -0
  37. package/lib/Run/Job.js.map +1 -0
  38. package/lib/Run/Operations.d.ts +47 -0
  39. package/lib/Run/Operations.d.ts.map +1 -0
  40. package/lib/Run/Operations.js +46 -0
  41. package/lib/Run/Operations.js.map +1 -0
  42. package/lib/Run/Service.d.ts +193 -0
  43. package/lib/Run/Service.d.ts.map +1 -0
  44. package/lib/Run/Service.js +247 -0
  45. package/lib/Run/Service.js.map +1 -0
  46. package/lib/Run/Validation.d.ts +54 -0
  47. package/lib/Run/Validation.d.ts.map +1 -0
  48. package/lib/Run/Validation.js +129 -0
  49. package/lib/Run/Validation.js.map +1 -0
  50. package/lib/Run/index.d.ts +51 -0
  51. package/lib/Run/index.d.ts.map +1 -0
  52. package/lib/Run/index.js +4 -0
  53. package/lib/Run/index.js.map +1 -0
  54. package/lib/Sqladmin/Database.d.ts +82 -0
  55. package/lib/Sqladmin/Database.d.ts.map +1 -0
  56. package/lib/Sqladmin/Database.js +87 -0
  57. package/lib/Sqladmin/Database.js.map +1 -0
  58. package/lib/Sqladmin/Instance.d.ts +234 -0
  59. package/lib/Sqladmin/Instance.d.ts.map +1 -0
  60. package/lib/Sqladmin/Instance.js +251 -0
  61. package/lib/Sqladmin/Instance.js.map +1 -0
  62. package/lib/Sqladmin/Operations.d.ts +41 -0
  63. package/lib/Sqladmin/Operations.d.ts.map +1 -0
  64. package/lib/Sqladmin/Operations.js +42 -0
  65. package/lib/Sqladmin/Operations.js.map +1 -0
  66. package/lib/Sqladmin/Types.d.ts +82 -0
  67. package/lib/Sqladmin/Types.d.ts.map +1 -0
  68. package/lib/Sqladmin/Types.js +28 -0
  69. package/lib/Sqladmin/Types.js.map +1 -0
  70. package/lib/Sqladmin/User.d.ts +110 -0
  71. package/lib/Sqladmin/User.d.ts.map +1 -0
  72. package/lib/Sqladmin/User.js +156 -0
  73. package/lib/Sqladmin/User.js.map +1 -0
  74. package/lib/Sqladmin/Validation.d.ts +60 -0
  75. package/lib/Sqladmin/Validation.d.ts.map +1 -0
  76. package/lib/Sqladmin/Validation.js +125 -0
  77. package/lib/Sqladmin/Validation.js.map +1 -0
  78. package/lib/Sqladmin/index.d.ts +9 -0
  79. package/lib/Sqladmin/index.d.ts.map +1 -0
  80. package/lib/Sqladmin/index.js +5 -0
  81. package/lib/Sqladmin/index.js.map +1 -0
  82. package/lib/index.d.ts +3 -0
  83. package/lib/index.d.ts.map +1 -1
  84. package/lib/index.js +3 -0
  85. package/lib/index.js.map +1 -1
  86. package/package.json +5 -4
  87. package/src/ArtifactRegistry/Operations.ts +79 -0
  88. package/src/ArtifactRegistry/Repository.ts +624 -0
  89. package/src/ArtifactRegistry/Types.ts +49 -0
  90. package/src/ArtifactRegistry/Validation.ts +112 -0
  91. package/src/ArtifactRegistry/index.ts +10 -0
  92. package/src/Providers.ts +21 -0
  93. package/src/Run/IamMember.ts +79 -0
  94. package/src/Run/IamSync.ts +134 -0
  95. package/src/Run/Job.ts +453 -0
  96. package/src/Run/Operations.ts +77 -0
  97. package/src/Run/Service.ts +541 -0
  98. package/src/Run/Validation.ts +153 -0
  99. package/src/Run/index.ts +52 -0
  100. package/src/Sqladmin/Database.ts +209 -0
  101. package/src/Sqladmin/Instance.ts +620 -0
  102. package/src/Sqladmin/Operations.ts +73 -0
  103. package/src/Sqladmin/Types.ts +101 -0
  104. package/src/Sqladmin/User.ts +333 -0
  105. package/src/Sqladmin/Validation.ts +148 -0
  106. package/src/Sqladmin/index.ts +19 -0
  107. package/src/index.ts +3 -0
@@ -0,0 +1,251 @@
1
+ import * as sql from "@distilled.cloud/gcp/sqladmin-v1";
2
+ import { Resource } from "alchemy";
3
+ import { Unowned } from "alchemy/AdoptPolicy";
4
+ import { deepEqual, isResolved, somePropsAreDifferent } from "alchemy/Diff";
5
+ import { createPhysicalName } from "alchemy/PhysicalName";
6
+ import * as Provider from "alchemy/Provider";
7
+ import { diffTags } from "alchemy/Tags";
8
+ import * as Duration from "effect/Duration";
9
+ import * as Effect from "effect/Effect";
10
+ import * as Redacted from "effect/Redacted";
11
+ import * as Schedule from "effect/Schedule";
12
+ import { gcpInternalLabels, hasAlchemyLabels } from "../Tags.js";
13
+ import { makeAwaitOperation } from "./Operations.js";
14
+ import { reshapeBadRequest, validateInstanceName } from "./Validation.js";
15
+ export const SqlInstance = Resource("GCP.SqlInstance");
16
+ const toAddress = (m) => ({
17
+ type: m.type,
18
+ ipAddress: m.ipAddress,
19
+ });
20
+ const toAttributes = (i, parent) => {
21
+ const ipAddresses = (i.ipAddresses ?? []).map(toAddress);
22
+ return {
23
+ name: parent.name,
24
+ selfLink: i.selfLink ?? "",
25
+ project: parent.project,
26
+ region: parent.region,
27
+ connectionName: i.connectionName ?? `${parent.project}:${parent.region}:${parent.name}`,
28
+ databaseVersion: i.databaseVersion ?? "",
29
+ state: i.state ?? "",
30
+ ipAddresses,
31
+ privateIpAddress: ipAddresses.find((a) => a.type === "PRIVATE")?.ipAddress,
32
+ publicIpAddress: ipAddresses.find((a) => a.type === "PRIMARY")?.ipAddress,
33
+ serverCaCert: i.serverCaCert
34
+ ? {
35
+ cert: i.serverCaCert.cert,
36
+ commonName: i.serverCaCert.commonName,
37
+ expirationTime: i.serverCaCert.expirationTime,
38
+ sha1Fingerprint: i.serverCaCert.sha1Fingerprint,
39
+ }
40
+ : undefined,
41
+ settingsVersion: i.settings?.settingsVersion,
42
+ labels: { ...(i.settings?.userLabels ?? {}) },
43
+ };
44
+ };
45
+ /**
46
+ * Build the `Settings` body sent to the API.
47
+ *
48
+ * Only sets fields the user has populated, so distinct from a settings
49
+ * stanza diff: server-injected defaults aren't overwritten by an
50
+ * `undefined` from us.
51
+ */
52
+ const toSettingsBody = (s, userLabels, settingsVersion) => ({
53
+ tier: s.tier,
54
+ userLabels,
55
+ ...(s.edition ? { edition: s.edition } : {}),
56
+ ...(s.dataDiskSizeGb !== undefined
57
+ ? { dataDiskSizeGb: String(s.dataDiskSizeGb) }
58
+ : {}),
59
+ ...(s.dataDiskType ? { dataDiskType: s.dataDiskType } : {}),
60
+ ...(s.diskAutoresize !== undefined
61
+ ? { storageAutoResize: s.diskAutoresize }
62
+ : {}),
63
+ ...(s.diskAutoresizeLimit !== undefined
64
+ ? { storageAutoResizeLimit: String(s.diskAutoresizeLimit) }
65
+ : {}),
66
+ ...(s.ipConfiguration
67
+ ? {
68
+ ipConfiguration: {
69
+ ...(s.ipConfiguration.ipv4Enabled !== undefined
70
+ ? { ipv4Enabled: s.ipConfiguration.ipv4Enabled }
71
+ : {}),
72
+ ...(s.ipConfiguration.privateNetwork
73
+ ? { privateNetwork: s.ipConfiguration.privateNetwork }
74
+ : {}),
75
+ ...(s.ipConfiguration.enablePrivatePathForGoogleCloudServices !==
76
+ undefined
77
+ ? {
78
+ enablePrivatePathForGoogleCloudServices: s.ipConfiguration.enablePrivatePathForGoogleCloudServices,
79
+ }
80
+ : {}),
81
+ ...(s.ipConfiguration.requireSsl !== undefined
82
+ ? { requireSsl: s.ipConfiguration.requireSsl }
83
+ : {}),
84
+ },
85
+ }
86
+ : {}),
87
+ ...(s.backupConfiguration ? { backupConfiguration: s.backupConfiguration } : {}),
88
+ ...(s.databaseFlags ? { databaseFlags: s.databaseFlags } : {}),
89
+ ...(s.deletionProtectionEnabled !== undefined
90
+ ? { deletionProtectionEnabled: s.deletionProtectionEnabled }
91
+ : {}),
92
+ ...(s.activationPolicy ? { activationPolicy: s.activationPolicy } : {}),
93
+ ...(s.availabilityType ? { availabilityType: s.availabilityType } : {}),
94
+ ...(settingsVersion !== undefined ? { settingsVersion } : {}),
95
+ });
96
+ export const SqlInstanceProvider = () => Provider.effect(SqlInstance, Effect.gen(function* () {
97
+ const getInstances = yield* sql.getInstances;
98
+ const insertInstances = yield* sql.insertInstances;
99
+ const patchInstances = yield* sql.patchInstances;
100
+ const deleteInstances = yield* sql.deleteInstances;
101
+ const getOperations = yield* sql.getOperations;
102
+ const awaitOperation = makeAwaitOperation(getOperations);
103
+ const observe = (project, name) => getInstances({ project, instance: name }).pipe(Effect.catchTag("NotFound", () => Effect.succeed(undefined)), Effect.catchTag("Forbidden", () => Effect.succeed(undefined)));
104
+ const syncMutable = Effect.fn(function* (args) {
105
+ const obsSettings = args.observed.settings ?? {};
106
+ const desiredSettingsForCompare = toSettingsBody(args.news.settings, args.desiredLabels);
107
+ // Per-field diff — settingsVersion is added below only if we
108
+ // actually need to patch, so it's not part of the no-op check.
109
+ let needPatch = false;
110
+ const reasons = [];
111
+ const compare = (key, a, b) => {
112
+ if (!deepEqual(a, b)) {
113
+ needPatch = true;
114
+ reasons.push(key);
115
+ }
116
+ };
117
+ compare("tier", obsSettings.tier, desiredSettingsForCompare.tier);
118
+ compare("edition", obsSettings.edition, desiredSettingsForCompare.edition);
119
+ compare("dataDiskSizeGb", obsSettings.dataDiskSizeGb, desiredSettingsForCompare.dataDiskSizeGb);
120
+ compare("dataDiskType", obsSettings.dataDiskType, desiredSettingsForCompare.dataDiskType);
121
+ compare("storageAutoResize", obsSettings.storageAutoResize, desiredSettingsForCompare.storageAutoResize);
122
+ compare("storageAutoResizeLimit", obsSettings.storageAutoResizeLimit, desiredSettingsForCompare.storageAutoResizeLimit);
123
+ compare("ipConfiguration", obsSettings.ipConfiguration, desiredSettingsForCompare.ipConfiguration);
124
+ compare("backupConfiguration", obsSettings.backupConfiguration, desiredSettingsForCompare.backupConfiguration);
125
+ compare("databaseFlags", obsSettings.databaseFlags ?? [], desiredSettingsForCompare.databaseFlags ?? []);
126
+ compare("deletionProtectionEnabled", obsSettings.deletionProtectionEnabled, desiredSettingsForCompare.deletionProtectionEnabled);
127
+ compare("activationPolicy", obsSettings.activationPolicy, desiredSettingsForCompare.activationPolicy);
128
+ compare("availabilityType", obsSettings.availabilityType, desiredSettingsForCompare.availabilityType);
129
+ const labelDiff = diffTags({ ...(obsSettings.userLabels ?? {}) }, args.desiredLabels);
130
+ if (labelDiff.removed.length > 0 || labelDiff.upsert.length > 0) {
131
+ needPatch = true;
132
+ reasons.push("userLabels");
133
+ }
134
+ if (!needPatch)
135
+ return;
136
+ // Thread the observed settingsVersion through the patch body
137
+ // — Cloud SQL uses it as the optimistic-concurrency token
138
+ // (etag is deprecated on this resource).
139
+ const body = {
140
+ settings: toSettingsBody(args.news.settings, args.desiredLabels, obsSettings.settingsVersion),
141
+ };
142
+ const op = yield* patchInstances({
143
+ project: args.project,
144
+ instance: args.name,
145
+ body,
146
+ }).pipe(Effect.catchTag("BadRequest", reshapeBadRequest("Instance", "patch")));
147
+ if (op.name)
148
+ yield* awaitOperation(args.project, op.name, args.session);
149
+ });
150
+ return {
151
+ stables: ["name", "selfLink", "project", "region", "connectionName"],
152
+ diff: Effect.fn(function* ({ news, olds = {} }) {
153
+ if (!isResolved(news))
154
+ return undefined;
155
+ if (somePropsAreDifferent(olds, news, [
156
+ "project",
157
+ "region",
158
+ "name",
159
+ "databaseVersion",
160
+ ])) {
161
+ return { action: "replace" };
162
+ }
163
+ return undefined;
164
+ }),
165
+ reconcile: Effect.fn(function* ({ id, news, session }) {
166
+ const internalLabels = yield* gcpInternalLabels(id);
167
+ const desiredName = news.name ??
168
+ (yield* createPhysicalName({ id, maxLength: 98 })).toLowerCase();
169
+ yield* validateInstanceName(desiredName);
170
+ const desiredLabels = {
171
+ ...(news.labels ?? {}),
172
+ ...internalLabels,
173
+ };
174
+ // 1. Observe — collapse 403 to "missing" alongside 404.
175
+ let observed = yield* observe(news.project, desiredName);
176
+ // 2. Ensure — insert. Like Cloud Run / GKE, sqladmin can 403
177
+ // with "Cloud SQL Admin API has not been used in project
178
+ // ... If you enabled this API recently, wait …" for ~1–2
179
+ // minutes after ApiEnable lands. Retry the insert on that
180
+ // specific 403; other Forbidden cases propagate.
181
+ if (!observed) {
182
+ const op = yield* insertInstances({
183
+ project: news.project,
184
+ body: {
185
+ name: desiredName,
186
+ region: news.region,
187
+ databaseVersion: news.databaseVersion,
188
+ ...(news.rootPassword
189
+ ? { rootPassword: Redacted.value(news.rootPassword) }
190
+ : {}),
191
+ settings: toSettingsBody(news.settings, desiredLabels),
192
+ },
193
+ }).pipe(Effect.retry({
194
+ while: (e) => e?._tag === "Forbidden" &&
195
+ /enabled this API recently|has not been used/i.test(e.message ?? ""),
196
+ schedule: Schedule.spaced(Duration.seconds(15)).pipe(Schedule.both(Schedule.recurs(20)), Schedule.tapOutput(() => session.note("Waiting for Cloud SQL Admin API enablement to propagate…"))),
197
+ }), Effect.catchTag("Conflict", () => Effect.succeed(undefined)), Effect.catchTag("BadRequest", reshapeBadRequest("Instance", "insert")));
198
+ if (op?.name)
199
+ yield* awaitOperation(news.project, op.name, session);
200
+ observed = yield* getInstances({
201
+ project: news.project,
202
+ instance: desiredName,
203
+ });
204
+ }
205
+ // 3. Sync — single patch with the full settings body when any
206
+ // field drifts. settingsVersion threaded through for OCC.
207
+ yield* syncMutable({
208
+ project: news.project,
209
+ name: desiredName,
210
+ observed,
211
+ news,
212
+ desiredLabels,
213
+ session,
214
+ });
215
+ const final = yield* getInstances({
216
+ project: news.project,
217
+ instance: desiredName,
218
+ });
219
+ return toAttributes(final, {
220
+ project: news.project,
221
+ region: news.region,
222
+ name: desiredName,
223
+ });
224
+ }),
225
+ delete: Effect.fn(function* ({ output, session }) {
226
+ yield* deleteInstances({
227
+ project: output.project,
228
+ instance: output.name,
229
+ }).pipe(Effect.flatMap((op) => op.name
230
+ ? awaitOperation(output.project, op.name, session)
231
+ : Effect.succeed(op)), Effect.catchTag("NotFound", () => Effect.void), Effect.catchTag("BadRequest", reshapeBadRequest("Instance", "delete")));
232
+ }),
233
+ read: Effect.fn(function* ({ id, output, olds }) {
234
+ const project = output?.project ?? olds?.project;
235
+ const region = output?.region ?? olds?.region;
236
+ if (!project || !region)
237
+ return undefined;
238
+ const name = output?.name ??
239
+ olds?.name ??
240
+ (yield* createPhysicalName({ id, maxLength: 98 })).toLowerCase();
241
+ const observed = yield* observe(project, name);
242
+ if (!observed)
243
+ return undefined;
244
+ const attrs = toAttributes(observed, { project, region, name });
245
+ return (yield* hasAlchemyLabels(id, observed.settings?.userLabels))
246
+ ? attrs
247
+ : Unowned(attrs);
248
+ }),
249
+ };
250
+ }));
251
+ //# sourceMappingURL=Instance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Instance.js","sourceRoot":"","sources":["../../src/Sqladmin/Instance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { ConfigError } from "@distilled.cloud/gcp";
2
+ import * as sql from "@distilled.cloud/gcp/sqladmin-v1";
3
+ import type { ScopedPlanStatusSession } from "alchemy/Cli/Cli";
4
+ import * as Effect from "effect/Effect";
5
+ /**
6
+ * Resolved callable signature of `sql.getOperations`.
7
+ *
8
+ * `sql.getOperations` is itself an `Effect<callable, never, Credentials |
9
+ * HttpClient>`, so `Effect.Success` extracts the callable. Using a
10
+ * derived alias keeps the helper aligned with the SDK without us
11
+ * hand-writing the input/output/error union, which would drift if the
12
+ * patch set changes.
13
+ */
14
+ type GetOperations = Effect.Success<typeof sql.getOperations>;
15
+ /**
16
+ * Build the Cloud SQL Admin long-running-operation polling helper.
17
+ *
18
+ * Sqladmin `Operation`s carry `.status: "PENDING" | "RUNNING" | "DONE"`
19
+ * (NOT `.done: boolean` like Cloud Resource Manager / Cloud Run, and
20
+ * NOT `.status === "DONE"` against a different enum). Verified at
21
+ * `vendor/distilled/packages/gcp/src/services/sqladmin-v1.ts:606–612`.
22
+ *
23
+ * Unlike Cloud Run, Sqladmin operations are NOT fully-qualified path
24
+ * names — the API returns a bare operation id (e.g. `e9e88dca-...`),
25
+ * and `getOperations` takes `{ project, operation }`. Callers therefore
26
+ * pass the bare id alongside the parent project context.
27
+ *
28
+ * Schedule: exponential 1s → 1.5× growth, capped via the count cap of
29
+ * 60 retries → roughly a few minutes wall ceiling. Most Cloud SQL
30
+ * operations (CREATE_USER, CREATE_DATABASE, UPDATE settings) finish
31
+ * in 1–30 s; instance CREATE / patch involving a restart are the long
32
+ * pole at 4–10 min, so callers running those should be aware that
33
+ * recurs(60) may bottom out and surface as a retry budget exhaustion.
34
+ *
35
+ * @see https://cloud.google.com/sql/docs/postgres/admin-api/rest/v1/operations
36
+ */
37
+ export declare const makeAwaitOperation: (getOperations: GetOperations) => (project: string, operationName: string, session: ScopedPlanStatusSession) => Effect.Effect<sql.Operation, ConfigError | sql.GetOperationsError | {
38
+ _tag: "OperationPending";
39
+ }, never>;
40
+ export {};
41
+ //# sourceMappingURL=Operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Operations.d.ts","sourceRoot":"","sources":["../../src/Sqladmin/Operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,GAAG,MAAM,kCAAkC,CAAC;AACxD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE/D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC;;;;;;;;GAQG;AACH,KAAK,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,aAAa,CAAC,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,kBAAkB,GAAI,eAAe,aAAa;;SAgC3D,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { ConfigError } from "@distilled.cloud/gcp";
2
+ import * as Duration from "effect/Duration";
3
+ import * as Effect from "effect/Effect";
4
+ import * as Schedule from "effect/Schedule";
5
+ /**
6
+ * Build the Cloud SQL Admin long-running-operation polling helper.
7
+ *
8
+ * Sqladmin `Operation`s carry `.status: "PENDING" | "RUNNING" | "DONE"`
9
+ * (NOT `.done: boolean` like Cloud Resource Manager / Cloud Run, and
10
+ * NOT `.status === "DONE"` against a different enum). Verified at
11
+ * `vendor/distilled/packages/gcp/src/services/sqladmin-v1.ts:606–612`.
12
+ *
13
+ * Unlike Cloud Run, Sqladmin operations are NOT fully-qualified path
14
+ * names — the API returns a bare operation id (e.g. `e9e88dca-...`),
15
+ * and `getOperations` takes `{ project, operation }`. Callers therefore
16
+ * pass the bare id alongside the parent project context.
17
+ *
18
+ * Schedule: exponential 1s → 1.5× growth, capped via the count cap of
19
+ * 60 retries → roughly a few minutes wall ceiling. Most Cloud SQL
20
+ * operations (CREATE_USER, CREATE_DATABASE, UPDATE settings) finish
21
+ * in 1–30 s; instance CREATE / patch involving a restart are the long
22
+ * pole at 4–10 min, so callers running those should be aware that
23
+ * recurs(60) may bottom out and surface as a retry budget exhaustion.
24
+ *
25
+ * @see https://cloud.google.com/sql/docs/postgres/admin-api/rest/v1/operations
26
+ */
27
+ export const makeAwaitOperation = (getOperations) => Effect.fn(function* (project, operationName, session) {
28
+ const op = yield* getOperations({ project, operation: operationName }).pipe(Effect.flatMap((current) => current.status === "DONE"
29
+ ? Effect.succeed(current)
30
+ : Effect.fail({ _tag: "OperationPending" })), Effect.retry({
31
+ while: (e) => e?._tag === "OperationPending",
32
+ schedule: Schedule.exponential(Duration.seconds(1), 1.5).pipe(Schedule.either(Schedule.spaced(Duration.seconds(10))), Schedule.both(Schedule.recurs(60)), Schedule.tapOutput(() => session.note(`Waiting for Cloud SQL operation ${operationName}…`))),
33
+ }));
34
+ if (op.error) {
35
+ const firstErr = op.error.errors?.[0];
36
+ return yield* new ConfigError({
37
+ message: `Cloud SQL operation ${operationName} failed: ${firstErr?.message ?? JSON.stringify(op.error)}`,
38
+ });
39
+ }
40
+ return op;
41
+ });
42
+ //# sourceMappingURL=Operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Operations.js","sourceRoot":"","sources":["../../src/Sqladmin/Operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAa5C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,aAA4B,EAAE,EAAE,CACjE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EACjB,OAAe,EACf,aAAqB,EACrB,OAAgC;IAEhC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC,IAAI,CACzE,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CACzB,OAAO,CAAC,MAAM,KAAK,MAAM;QACvB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;QACzB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAA2B,EAAE,CAAC,CACvD,EACD,MAAM,CAAC,KAAK,CAAC;QACX,KAAK,EAAE,CAAC,CAAoB,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,kBAAkB;QAC/D,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAC3D,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EACtD,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAClC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,CACtB,OAAO,CAAC,IAAI,CAAC,mCAAmC,aAAa,GAAG,CAAC,CAClE,CACF;KACF,CAAC,CACH,CAAC;IACF,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QACtC,OAAO,KAAK,CAAC,CAAC,IAAI,WAAW,CAAC;YAC5B,OAAO,EAAE,uBAAuB,aAAa,YAC3C,QAAQ,EAAE,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,CAC9C,EAAE;SACH,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Branded literal-union types for Cloud SQL props.
3
+ *
4
+ * Distilled's generated `databaseVersion` field is an open-tailed union
5
+ * (`"POSTGRES_15" | … | (string & {})`) so the GCP server can ship new
6
+ * versions without breaking SDK consumers. For our props we narrow to
7
+ * the subset we actually support — at the moment, the supported
8
+ * Postgres versions for greenfield instances. This gives consumers
9
+ * compile-time autocomplete and rejects typos like `"POSTGES_15"`.
10
+ *
11
+ * MySQL / SQL Server enum members are intentionally omitted — we only
12
+ * provision Postgres. Add a sibling `MySqlVersion` / `SqlServerVersion`
13
+ * type if/when those land as targets.
14
+ */
15
+ /**
16
+ * Supported Postgres major versions for new Cloud SQL instances.
17
+ *
18
+ * Cloud SQL only allows creating instances on currently-supported
19
+ * majors. As of 2026-06, that's 13–17 for greenfield; we expose 15+
20
+ * since that's what new MicroAGI stacks target. Older versions can be
21
+ * read/managed but should be migrated.
22
+ *
23
+ * @see https://cloud.google.com/sql/docs/postgres/db-versions
24
+ */
25
+ export type PostgresVersion = "POSTGRES_15" | "POSTGRES_16" | "POSTGRES_17";
26
+ /**
27
+ * Cloud SQL edition. `ENTERPRISE_PLUS` unlocks Data Cache, near-zero
28
+ * downtime planned maintenance, and longer log retention; `ENTERPRISE`
29
+ * is the standard tier.
30
+ *
31
+ * @see https://cloud.google.com/sql/docs/postgres/editions-intro
32
+ */
33
+ export type SqlEdition = "ENTERPRISE" | "ENTERPRISE_PLUS";
34
+ /**
35
+ * Data-disk type. PD_SSD is the default and what any new workload
36
+ * should pick. PD_HDD is legacy and slower; only useful for archival
37
+ * read replicas.
38
+ *
39
+ * @see https://cloud.google.com/sql/docs/postgres/instance-settings#storage-type-2ndgen
40
+ */
41
+ export type SqlDataDiskType = "PD_SSD" | "PD_HDD";
42
+ /**
43
+ * Availability type. `ZONAL` runs in one zone; `REGIONAL` runs a
44
+ * standby in a second zone for HA at ~2× the cost.
45
+ *
46
+ * @see https://cloud.google.com/sql/docs/postgres/high-availability
47
+ */
48
+ export type SqlAvailabilityType = "ZONAL" | "REGIONAL";
49
+ /**
50
+ * Activation policy. `ALWAYS` keeps the instance on; `NEVER` parks
51
+ * it (useful for occasional dev databases).
52
+ *
53
+ * @see https://cloud.google.com/sql/docs/postgres/start-stop-restart-instance
54
+ */
55
+ export type SqlActivationPolicy = "ALWAYS" | "NEVER";
56
+ /**
57
+ * Cloud SQL user auth type.
58
+ *
59
+ * - `BUILT_IN` — classic username + password Postgres role. The
60
+ * provider requires a `password` Redacted for this type.
61
+ * - `CLOUD_IAM_USER` — a human IAM principal authenticated via the
62
+ * Cloud SQL Auth Proxy / IAM database authn token exchange.
63
+ * - `CLOUD_IAM_SERVICE_ACCOUNT` — a GCP service-account principal,
64
+ * same auth mechanism as `CLOUD_IAM_USER`. The Postgres role name
65
+ * is the SA email **with the trailing `.gserviceaccount.com`
66
+ * stripped** (Cloud SQL caps role names at 63 chars; SA emails are
67
+ * longer than that).
68
+ * - Open tail `(string & {})` keeps forward compatibility for
69
+ * `CLOUD_IAM_GROUP`, `CLOUD_IAM_GROUP_SERVICE_ACCOUNT`, etc.
70
+ *
71
+ * @see https://cloud.google.com/sql/docs/postgres/iam-authentication
72
+ */
73
+ export type SqlUserType = "BUILT_IN" | "CLOUD_IAM_USER" | "CLOUD_IAM_SERVICE_ACCOUNT" | "CLOUD_IAM_GROUP" | (string & {});
74
+ /**
75
+ * Convenience predicate: `true` for any IAM-backed user type, where
76
+ * passwords are forbidden and the principal is a GCP identity.
77
+ *
78
+ * Used by `Validation.ts` and `User.ts` to fan out between the
79
+ * built-in password path and the IAM token-exchange path.
80
+ */
81
+ export declare const isIamUserType: (type: SqlUserType | undefined) => boolean;
82
+ //# sourceMappingURL=Types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Types.d.ts","sourceRoot":"","sources":["../../src/Sqladmin/Types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;;;;;;GASG;AACH,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG,aAAa,GAAG,aAAa,CAAC;AAE5E;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,iBAAiB,CAAC;AAE1D;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAElD;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,UAAU,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,OAAO,CAAC;AAErD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,WAAW,GACnB,UAAU,GACV,gBAAgB,GAChB,2BAA2B,GAC3B,iBAAiB,GACjB,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GACxB,MAAM,WAAW,GAAG,SAAS,KAC5B,OAMsB,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Branded literal-union types for Cloud SQL props.
3
+ *
4
+ * Distilled's generated `databaseVersion` field is an open-tailed union
5
+ * (`"POSTGRES_15" | … | (string & {})`) so the GCP server can ship new
6
+ * versions without breaking SDK consumers. For our props we narrow to
7
+ * the subset we actually support — at the moment, the supported
8
+ * Postgres versions for greenfield instances. This gives consumers
9
+ * compile-time autocomplete and rejects typos like `"POSTGES_15"`.
10
+ *
11
+ * MySQL / SQL Server enum members are intentionally omitted — we only
12
+ * provision Postgres. Add a sibling `MySqlVersion` / `SqlServerVersion`
13
+ * type if/when those land as targets.
14
+ */
15
+ /**
16
+ * Convenience predicate: `true` for any IAM-backed user type, where
17
+ * passwords are forbidden and the principal is a GCP identity.
18
+ *
19
+ * Used by `Validation.ts` and `User.ts` to fan out between the
20
+ * built-in password path and the IAM token-exchange path.
21
+ */
22
+ export const isIamUserType = (type) => type === "CLOUD_IAM_USER" ||
23
+ type === "CLOUD_IAM_SERVICE_ACCOUNT" ||
24
+ type === "CLOUD_IAM_GROUP" ||
25
+ type === "CLOUD_IAM_GROUP_USER" ||
26
+ type === "CLOUD_IAM_GROUP_SERVICE_ACCOUNT" ||
27
+ type === "ENTRAID_USER";
28
+ //# sourceMappingURL=Types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Types.js","sourceRoot":"","sources":["../../src/Sqladmin/Types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAwEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,IAA6B,EACpB,EAAE,CACX,IAAI,KAAK,gBAAgB;IACzB,IAAI,KAAK,2BAA2B;IACpC,IAAI,KAAK,iBAAiB;IAC1B,IAAI,KAAK,sBAAsB;IAC/B,IAAI,KAAK,iCAAiC;IAC1C,IAAI,KAAK,cAAc,CAAC"}
@@ -0,0 +1,110 @@
1
+ import { Resource } from "alchemy";
2
+ import * as Provider from "alchemy/Provider";
3
+ import * as Redacted from "effect/Redacted";
4
+ import type * as GCP from "../Providers.ts";
5
+ import { type SqlUserType } from "./Types.ts";
6
+ /**
7
+ * A Cloud SQL user (database role + auth binding).
8
+ *
9
+ * **Three auth modes:**
10
+ *
11
+ * - `BUILT_IN` — classic Postgres username/password. Requires
12
+ * `password`. The role exists only inside Postgres.
13
+ * - `CLOUD_IAM_USER` — a human IAM principal. `name` is the user's
14
+ * email. Authenticates via the Cloud SQL Auth Proxy / IAM token
15
+ * exchange; no password.
16
+ * - `CLOUD_IAM_SERVICE_ACCOUNT` — a GCP service account principal.
17
+ * `name` is the SA email with the trailing `.gserviceaccount.com`
18
+ * stripped (Postgres role names cap at 63 chars; full SA emails
19
+ * often exceed that). No password.
20
+ *
21
+ * The Postgres role itself is granted no privileges by default — wire
22
+ * up grants via SQL (psql / migrations) once the user exists. Cloud
23
+ * SQL IAM authn is independent of grant management.
24
+ *
25
+ * **Adoption.** Users carry no labels and no useful comparable shape
26
+ * beyond `(name, host, type)`. `read` returns the observed user if it
27
+ * exists at this address, `undefined` otherwise. No `Unowned` wrapper
28
+ * — adoption is implicit; the worst case is alchemy issuing a no-op
29
+ * patch / a delete on what it thinks is its own.
30
+ *
31
+ * **Replace triggers.** `project`, `instance`, `name`, `host`, `type`.
32
+ * Type changes need a drop/recreate because Cloud SQL stores the auth
33
+ * shape immutably; we surface that via replace.
34
+ *
35
+ * @example IAM service-account user (workload identity → DB role)
36
+ * ```typescript
37
+ * yield* GCP.SqlUser("AppSaUser", {
38
+ * project: instance.project,
39
+ * instance: instance.name,
40
+ * // App SA email is `app@my-project.iam.gserviceaccount.com` — strip
41
+ * // `.gserviceaccount.com` so the Postgres role name fits in 63 chars.
42
+ * name: "app@my-project.iam",
43
+ * type: "CLOUD_IAM_SERVICE_ACCOUNT",
44
+ * });
45
+ * ```
46
+ *
47
+ * @example Built-in user with a Redacted password
48
+ * ```typescript
49
+ * yield* GCP.SqlUser("MigratorUser", {
50
+ * project: instance.project,
51
+ * instance: instance.name,
52
+ * name: "migrator",
53
+ * password: Redacted.make(process.env.MIGRATOR_PASSWORD!),
54
+ * });
55
+ * ```
56
+ *
57
+ * @see https://cloud.google.com/sql/docs/postgres/admin-api/rest/v1/users
58
+ * @see https://cloud.google.com/sql/docs/postgres/iam-authentication
59
+ */
60
+ export type SqlUserProps = {
61
+ /**
62
+ * GCP project ID hosting the parent instance. Immutable — replace.
63
+ * @see https://cloud.google.com/sql/docs/postgres/admin-api/rest/v1/users#User
64
+ */
65
+ project: string;
66
+ /**
67
+ * Parent Cloud SQL instance name. Immutable — replace.
68
+ */
69
+ instance: string;
70
+ /**
71
+ * User/role name. For `BUILT_IN`, any valid Postgres identifier.
72
+ * For `CLOUD_IAM_USER`, the principal's email. For
73
+ * `CLOUD_IAM_SERVICE_ACCOUNT`, the SA email **with the trailing
74
+ * `.gserviceaccount.com` stripped** — Postgres role names cap at
75
+ * 63 chars; full SA emails are typically 70+. Immutable — replace.
76
+ */
77
+ name: string;
78
+ /**
79
+ * Host the user can connect from. PostgreSQL ignores this and
80
+ * defaults to `%` (any host). For MySQL it's load-bearing.
81
+ * Immutable — replace.
82
+ */
83
+ host?: string;
84
+ /**
85
+ * Auth backend. Defaults to `BUILT_IN` if unset.
86
+ * @see https://cloud.google.com/sql/docs/postgres/iam-authentication
87
+ */
88
+ type?: SqlUserType;
89
+ /**
90
+ * Password for `BUILT_IN` users. Required for that type; forbidden
91
+ * for any IAM type (validated at plan time).
92
+ */
93
+ password?: Redacted.Redacted<string>;
94
+ };
95
+ export type SqlUserAttributes = {
96
+ /** User name. */
97
+ name: string;
98
+ /** Parent instance name. */
99
+ instance: string;
100
+ /** Project ID. */
101
+ project: string;
102
+ /** Connecting host (defaults to `%` for Postgres). */
103
+ host: string;
104
+ /** Auth backend in effect. */
105
+ type: string;
106
+ };
107
+ export type SqlUser = Resource<"GCP.SqlUser", SqlUserProps, SqlUserAttributes, never, GCP.Providers>;
108
+ export declare const SqlUser: import("alchemy").ResourceClass<SqlUser>;
109
+ export declare const SqlUserProvider: () => import("effect/Layer").Layer<Provider.Provider<SqlUser>, never, import("effect/unstable/http/HttpClient").HttpClient | import("@distilled.cloud/gcp").Credentials>;
110
+ //# sourceMappingURL=User.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"User.d.ts","sourceRoot":"","sources":["../../src/Sqladmin/User.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAG7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,QAAQ,CAC5B,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,KAAK,EACL,GAAG,CAAC,SAAS,CACd,CAAC;AACF,eAAO,MAAM,OAAO,0CAAmC,CAAC;AAaxD,eAAO,MAAM,eAAe,0KAsMzB,CAAC"}