@vibesdotdev/infra-cloudflare 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 (128) hide show
  1. package/README.md +107 -0
  2. package/SPEC.md +166 -0
  3. package/dist/cloudflare.plugin.d.ts +73 -0
  4. package/dist/cloudflare.plugin.d.ts.map +1 -0
  5. package/dist/cloudflare.plugin.js +334 -0
  6. package/dist/cloudflare.plugin.js.map +1 -0
  7. package/dist/implementations/alerts.descriptor.d.ts +13 -0
  8. package/dist/implementations/alerts.descriptor.d.ts.map +1 -0
  9. package/dist/implementations/alerts.descriptor.js +30 -0
  10. package/dist/implementations/alerts.descriptor.js.map +1 -0
  11. package/dist/implementations/alerts.impl.d.ts +35 -0
  12. package/dist/implementations/alerts.impl.d.ts.map +1 -0
  13. package/dist/implementations/alerts.impl.js +283 -0
  14. package/dist/implementations/alerts.impl.js.map +1 -0
  15. package/dist/implementations/kv.impl.d.ts +29 -0
  16. package/dist/implementations/kv.impl.d.ts.map +1 -0
  17. package/dist/implementations/kv.impl.js +36 -0
  18. package/dist/implementations/kv.impl.js.map +1 -0
  19. package/dist/implementations/logs.descriptor.d.ts +15 -0
  20. package/dist/implementations/logs.descriptor.d.ts.map +1 -0
  21. package/dist/implementations/logs.descriptor.js +26 -0
  22. package/dist/implementations/logs.descriptor.js.map +1 -0
  23. package/dist/implementations/logs.impl.d.ts +108 -0
  24. package/dist/implementations/logs.impl.d.ts.map +1 -0
  25. package/dist/implementations/logs.impl.js +154 -0
  26. package/dist/implementations/logs.impl.js.map +1 -0
  27. package/dist/implementations/observability.descriptor.d.ts +9 -0
  28. package/dist/implementations/observability.descriptor.d.ts.map +1 -0
  29. package/dist/implementations/observability.descriptor.js +22 -0
  30. package/dist/implementations/observability.descriptor.js.map +1 -0
  31. package/dist/implementations/observability.impl.d.ts +35 -0
  32. package/dist/implementations/observability.impl.d.ts.map +1 -0
  33. package/dist/implementations/observability.impl.js +229 -0
  34. package/dist/implementations/observability.impl.js.map +1 -0
  35. package/dist/implementations/pages.impl.d.ts +98 -0
  36. package/dist/implementations/pages.impl.d.ts.map +1 -0
  37. package/dist/implementations/pages.impl.js +132 -0
  38. package/dist/implementations/pages.impl.js.map +1 -0
  39. package/dist/implementations/queues.impl.d.ts +29 -0
  40. package/dist/implementations/queues.impl.d.ts.map +1 -0
  41. package/dist/implementations/queues.impl.js +34 -0
  42. package/dist/implementations/queues.impl.js.map +1 -0
  43. package/dist/implementations/r2.impl.d.ts +31 -0
  44. package/dist/implementations/r2.impl.d.ts.map +1 -0
  45. package/dist/implementations/r2.impl.js +41 -0
  46. package/dist/implementations/r2.impl.js.map +1 -0
  47. package/dist/implementations/rum.descriptor.d.ts +13 -0
  48. package/dist/implementations/rum.descriptor.d.ts.map +1 -0
  49. package/dist/implementations/rum.descriptor.js +32 -0
  50. package/dist/implementations/rum.descriptor.js.map +1 -0
  51. package/dist/implementations/rum.impl.d.ts +34 -0
  52. package/dist/implementations/rum.impl.d.ts.map +1 -0
  53. package/dist/implementations/rum.impl.js +153 -0
  54. package/dist/implementations/rum.impl.js.map +1 -0
  55. package/dist/implementations/web-app.impl.d.ts +294 -0
  56. package/dist/implementations/web-app.impl.d.ts.map +1 -0
  57. package/dist/implementations/web-app.impl.js +208 -0
  58. package/dist/implementations/web-app.impl.js.map +1 -0
  59. package/dist/implementations/workers.impl.d.ts +157 -0
  60. package/dist/implementations/workers.impl.d.ts.map +1 -0
  61. package/dist/implementations/workers.impl.js +247 -0
  62. package/dist/implementations/workers.impl.js.map +1 -0
  63. package/dist/index.d.ts +17 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +12 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/pages.d.ts +9 -0
  68. package/dist/pages.d.ts.map +1 -0
  69. package/dist/pages.js +9 -0
  70. package/dist/pages.js.map +1 -0
  71. package/dist/regen.d.ts +58 -0
  72. package/dist/regen.d.ts.map +1 -0
  73. package/dist/regen.js +69 -0
  74. package/dist/regen.js.map +1 -0
  75. package/dist/secrets/cloudflare-api.descriptor.d.ts +18 -0
  76. package/dist/secrets/cloudflare-api.descriptor.d.ts.map +1 -0
  77. package/dist/secrets/cloudflare-api.descriptor.js +32 -0
  78. package/dist/secrets/cloudflare-api.descriptor.js.map +1 -0
  79. package/dist/secrets/cloudflare-api.impl.d.ts +30 -0
  80. package/dist/secrets/cloudflare-api.impl.d.ts.map +1 -0
  81. package/dist/secrets/cloudflare-api.impl.js +111 -0
  82. package/dist/secrets/cloudflare-api.impl.js.map +1 -0
  83. package/dist/secrets/cloudflare-secrets-store.descriptor.d.ts +10 -0
  84. package/dist/secrets/cloudflare-secrets-store.descriptor.d.ts.map +1 -0
  85. package/dist/secrets/cloudflare-secrets-store.descriptor.js +24 -0
  86. package/dist/secrets/cloudflare-secrets-store.descriptor.js.map +1 -0
  87. package/dist/secrets/cloudflare-secrets-store.impl.d.ts +27 -0
  88. package/dist/secrets/cloudflare-secrets-store.impl.d.ts.map +1 -0
  89. package/dist/secrets/cloudflare-secrets-store.impl.js +72 -0
  90. package/dist/secrets/cloudflare-secrets-store.impl.js.map +1 -0
  91. package/dist/secrets/index.d.ts +6 -0
  92. package/dist/secrets/index.d.ts.map +1 -0
  93. package/dist/secrets/index.js +6 -0
  94. package/dist/secrets/index.js.map +1 -0
  95. package/dist/secrets/resolve-cf-credentials.d.ts +18 -0
  96. package/dist/secrets/resolve-cf-credentials.d.ts.map +1 -0
  97. package/dist/secrets/resolve-cf-credentials.js +57 -0
  98. package/dist/secrets/resolve-cf-credentials.js.map +1 -0
  99. package/dist/web-app.d.ts +11 -0
  100. package/dist/web-app.d.ts.map +1 -0
  101. package/dist/web-app.js +11 -0
  102. package/dist/web-app.js.map +1 -0
  103. package/package.json +153 -0
  104. package/src/cloudflare.plugin.ts +477 -0
  105. package/src/implementations/alerts.descriptor.ts +33 -0
  106. package/src/implementations/alerts.impl.ts +332 -0
  107. package/src/implementations/kv.impl.ts +51 -0
  108. package/src/implementations/logs.descriptor.ts +29 -0
  109. package/src/implementations/logs.impl.ts +201 -0
  110. package/src/implementations/observability.descriptor.ts +25 -0
  111. package/src/implementations/observability.impl.ts +307 -0
  112. package/src/implementations/pages.impl.ts +189 -0
  113. package/src/implementations/queues.impl.ts +48 -0
  114. package/src/implementations/r2.impl.ts +58 -0
  115. package/src/implementations/rum.descriptor.ts +35 -0
  116. package/src/implementations/rum.impl.ts +192 -0
  117. package/src/implementations/web-app.impl.ts +494 -0
  118. package/src/implementations/workers.impl.ts +336 -0
  119. package/src/index.ts +60 -0
  120. package/src/pages.ts +18 -0
  121. package/src/regen.ts +87 -0
  122. package/src/secrets/cloudflare-api.descriptor.ts +35 -0
  123. package/src/secrets/cloudflare-api.impl.ts +131 -0
  124. package/src/secrets/cloudflare-secrets-store.descriptor.ts +27 -0
  125. package/src/secrets/cloudflare-secrets-store.impl.ts +87 -0
  126. package/src/secrets/index.ts +13 -0
  127. package/src/secrets/resolve-cf-credentials.ts +63 -0
  128. package/src/web-app.ts +32 -0
@@ -0,0 +1,283 @@
1
+ /**
2
+ * Cloudflare Alerts Implementation
3
+ *
4
+ * Maps the provider-agnostic `infra/alerts` kind onto Cloudflare's
5
+ * Notifications API (`/accounts/:account/alerting/v3/policies`).
6
+ *
7
+ * Native type translation:
8
+ * budget → billing_budget_alert
9
+ * usage → billing_usage_alert
10
+ * error-rate → workers_alert (filter: outcome=exception)
11
+ * latency → (not supported by CF — adapter throws on create)
12
+ * custom → adapter passes through the `native_alert_type` filter
13
+ *
14
+ * Credentials: prefers a scoped CLOUDFLARE_NOTIFICATIONS_API_TOKEN (with
15
+ * notifications:edit), falls back to CLOUDFLARE_API_TOKEN for read-only
16
+ * operations. Account id from CLOUDFLARE_ACCOUNT_ID. Both resolve via
17
+ * the standard runtime secrets chain (encrypted-local + env file +
18
+ * CF Secrets Store).
19
+ */
20
+ import * as z from 'zod/v4';
21
+ import { resolveAdapterCredential } from '@vibesdotdev/infra-core';
22
+ export const CloudflareAlertsDescriptorSchema = z.object({
23
+ kind: z.literal('infra/alerts'),
24
+ id: z.string().min(1),
25
+ name: z.string().min(1),
26
+ description: z.string().optional(),
27
+ adapter: z.literal('cloudflare-alerts'),
28
+ adapterConfig: z.record(z.string(), z.unknown()).optional(),
29
+ // Default to 'local' to match the infra-core kind schema. CLI ops
30
+ // resolve credentials from the local vibes secrets vault; Workers
31
+ // in production receive credentials via CF Secrets Store bindings
32
+ // without going through this adapter.
33
+ environment: z.string().default('local'),
34
+ policies: z.array(z.unknown()).default([])
35
+ });
36
+ /** Map provider-agnostic AlertType → CF native alert_type. */
37
+ function nativeAlertType(policy) {
38
+ switch (policy.type) {
39
+ case 'budget':
40
+ return 'billing_budget_alert';
41
+ case 'usage':
42
+ return 'billing_usage_alert';
43
+ case 'error-rate':
44
+ // CF exposes Worker error alerts under a single type. The filters
45
+ // narrow scope (worker_name, etc.).
46
+ return 'workers_alert';
47
+ case 'latency':
48
+ throw new Error('cloudflare-alerts: latency alerts are not supported by CF Notifications. ' +
49
+ 'Use traces / Workers Observability dashboards instead.');
50
+ case 'custom': {
51
+ const explicit = policy.filters['native_alert_type'];
52
+ if (!explicit) {
53
+ throw new Error('cloudflare-alerts: type=custom requires filters.native_alert_type to be set');
54
+ }
55
+ return explicit;
56
+ }
57
+ }
58
+ }
59
+ /** Map provider-agnostic policy → CF body shape. */
60
+ function toCfPayload(policy) {
61
+ const alertType = nativeAlertType(policy);
62
+ const filters = {};
63
+ // Translate the threshold + filters into CF's filters shape.
64
+ switch (policy.type) {
65
+ case 'budget':
66
+ filters.total_spend_dollars = [String(policy.threshold)];
67
+ break;
68
+ case 'usage':
69
+ if (!policy.filters.product) {
70
+ throw new Error("cloudflare-alerts: type=usage requires filters.product. Confirmed valid slugs (probed against /alerting/v3/policies, 2026-05): " +
71
+ 'worker_requests, worker_kv_storage, worker_kv_reads, worker_kv_writes, ' +
72
+ 'd1_storage, d1_rows_read, d1_rows_written, r2_storage. ' +
73
+ 'Workers Observability is not exposed as a billing_usage_alert product.');
74
+ }
75
+ filters.product = [policy.filters.product];
76
+ filters.limit = [String(policy.threshold)];
77
+ break;
78
+ case 'error-rate':
79
+ if (policy.filters.worker)
80
+ filters.scriptName = [policy.filters.worker];
81
+ filters.error_rate_percentage = [String(policy.threshold)];
82
+ break;
83
+ case 'custom': {
84
+ // Pass remaining filters verbatim; drop the meta key.
85
+ for (const [k, v] of Object.entries(policy.filters)) {
86
+ if (k === 'native_alert_type')
87
+ continue;
88
+ filters[k] = [v];
89
+ }
90
+ break;
91
+ }
92
+ }
93
+ const mechanisms = {};
94
+ for (const m of policy.mechanisms) {
95
+ switch (m.kind) {
96
+ case 'email':
97
+ (mechanisms.email ??= []).push({ id: m.target });
98
+ break;
99
+ case 'webhook':
100
+ (mechanisms.webhooks ??= []).push({ id: m.target });
101
+ break;
102
+ case 'pagerduty':
103
+ (mechanisms.pagerduty ??= []).push({ id: m.target });
104
+ break;
105
+ case 'slack':
106
+ // CF treats Slack as a webhook destination
107
+ (mechanisms.webhooks ??= []).push({ id: m.target });
108
+ break;
109
+ }
110
+ }
111
+ return {
112
+ name: policy.name,
113
+ description: policy.description,
114
+ enabled: policy.enabled,
115
+ alert_type: alertType,
116
+ filters,
117
+ mechanisms
118
+ };
119
+ }
120
+ /** Reverse-map a CF policy → AlertPolicy (best-effort; filters are lossy). */
121
+ function fromCfPolicy(cf) {
122
+ let type = 'custom';
123
+ let threshold = 0;
124
+ const filters = {};
125
+ switch (cf.alert_type) {
126
+ case 'billing_budget_alert':
127
+ type = 'budget';
128
+ threshold = Number(cf.filters?.total_spend_dollars?.[0] ?? 0);
129
+ break;
130
+ case 'billing_usage_alert':
131
+ type = 'usage';
132
+ threshold = Number(cf.filters?.limit?.[0] ?? 0);
133
+ if (cf.filters?.product?.[0])
134
+ filters.product = cf.filters.product[0];
135
+ break;
136
+ case 'workers_alert':
137
+ type = 'error-rate';
138
+ threshold = Number(cf.filters?.error_rate_percentage?.[0] ?? 0);
139
+ if (cf.filters?.scriptName?.[0])
140
+ filters.worker = cf.filters.scriptName[0];
141
+ break;
142
+ default:
143
+ type = 'custom';
144
+ filters.native_alert_type = cf.alert_type;
145
+ for (const [k, v] of Object.entries(cf.filters ?? {})) {
146
+ if (Array.isArray(v) && v[0] != null)
147
+ filters[k] = String(v[0]);
148
+ }
149
+ }
150
+ const mechanisms = [];
151
+ for (const e of cf.mechanisms?.email ?? [])
152
+ mechanisms.push({ kind: 'email', target: e.id });
153
+ for (const w of cf.mechanisms?.webhooks ?? []) {
154
+ // Heuristic: hooks.slack.com → Slack; otherwise generic webhook
155
+ const target = w.id;
156
+ if (target.includes('hooks.slack.com'))
157
+ mechanisms.push({ kind: 'slack', target });
158
+ else if (target.startsWith('http'))
159
+ mechanisms.push({ kind: 'webhook', target });
160
+ else
161
+ mechanisms.push({ kind: 'pagerduty', target });
162
+ }
163
+ for (const p of cf.mechanisms?.pagerduty ?? [])
164
+ mechanisms.push({ kind: 'pagerduty', target: p.id });
165
+ return {
166
+ providerId: cf.id,
167
+ id: cf.id,
168
+ name: cf.name,
169
+ type,
170
+ threshold,
171
+ filters,
172
+ mechanisms,
173
+ enabled: cf.enabled,
174
+ description: cf.description
175
+ };
176
+ }
177
+ class CloudflareAlertsImplementation {
178
+ id = 'cloudflare-alerts';
179
+ descriptor;
180
+ creds = null;
181
+ constructor(descriptor) {
182
+ this.descriptor = CloudflareAlertsDescriptorSchema.parse(descriptor);
183
+ }
184
+ async getCreds() {
185
+ if (this.creds)
186
+ return this.creds;
187
+ // Both credentials route through the `secrets/store` runtime kind
188
+ // (vibes secrets). Adapters declare key NAMES; the runtime picks
189
+ // the right backend by tier (encrypted-local for local, the CF
190
+ // secrets store for staging/production). process.env can override
191
+ // for CI / explicit shell sessions.
192
+ const env = this.descriptor.environment || 'local';
193
+ const ac = (this.descriptor.adapterConfig ?? {});
194
+ const accountKey = (typeof ac.accountIdEnvVar === 'string' ? ac.accountIdEnvVar : 'CLOUDFLARE_ACCOUNT_ID');
195
+ const primaryToken = (typeof ac.apiTokenEnvVar === 'string' ? ac.apiTokenEnvVar : 'CLOUDFLARE_NOTIFICATIONS_API_TOKEN');
196
+ const fallbackToken = (typeof ac.apiTokenFallbackEnvVar === 'string' ? ac.apiTokenFallbackEnvVar : 'CLOUDFLARE_API_TOKEN');
197
+ const accountRes = await resolveAdapterCredential({
198
+ keyCandidates: [accountKey],
199
+ environment: env,
200
+ humanName: 'Cloudflare account id'
201
+ });
202
+ const tokenRes = await resolveAdapterCredential({
203
+ keyCandidates: [primaryToken, fallbackToken],
204
+ environment: env,
205
+ humanName: 'Cloudflare API token (notifications scope preferred)'
206
+ });
207
+ this.creds = { accountId: accountRes.value, apiToken: tokenRes.value };
208
+ return this.creds;
209
+ }
210
+ async call(path, init) {
211
+ const { apiToken } = await this.getCreds();
212
+ const res = await fetch(`https://api.cloudflare.com/client/v4${path}`, {
213
+ ...init,
214
+ headers: {
215
+ Authorization: `Bearer ${apiToken}`,
216
+ 'Content-Type': 'application/json',
217
+ ...(init?.headers ?? {})
218
+ }
219
+ });
220
+ const text = await res.text();
221
+ let body;
222
+ try {
223
+ body = JSON.parse(text);
224
+ }
225
+ catch {
226
+ throw new Error(`cloudflare-alerts: non-JSON response from ${path}: ${text.slice(0, 200)}`);
227
+ }
228
+ if (!res.ok || body.success === false) {
229
+ const errSummary = body.errors?.map((e) => `${e.code}: ${e.message}`).join('; ') ?? text.slice(0, 200);
230
+ throw new Error(`cloudflare-alerts: ${path} → ${res.status} ${errSummary}`);
231
+ }
232
+ return body;
233
+ }
234
+ async listPolicies() {
235
+ const { accountId } = await this.getCreds();
236
+ const body = await this.call(`/accounts/${accountId}/alerting/v3/policies`);
237
+ return (body.result ?? []).map(fromCfPolicy);
238
+ }
239
+ async createPolicy(policy) {
240
+ const { accountId } = await this.getCreds();
241
+ const payload = toCfPayload(policy);
242
+ const body = await this.call(`/accounts/${accountId}/alerting/v3/policies`, { method: 'POST', body: JSON.stringify(payload) });
243
+ return { providerId: body.result.id };
244
+ }
245
+ async deletePolicy(providerId) {
246
+ const { accountId } = await this.getCreds();
247
+ await this.call(`/accounts/${accountId}/alerting/v3/policies/${providerId}`, {
248
+ method: 'DELETE'
249
+ });
250
+ }
251
+ async diff(desired) {
252
+ const live = await this.listPolicies();
253
+ const liveByName = new Map(live.map((p) => [p.name, p]));
254
+ const create = [];
255
+ const update = [];
256
+ for (const policy of desired) {
257
+ const match = liveByName.get(policy.name);
258
+ if (!match) {
259
+ create.push(policy);
260
+ continue;
261
+ }
262
+ liveByName.delete(policy.name);
263
+ // Coarse-grained diff: re-create if threshold or mechanisms changed.
264
+ const changed = match.threshold !== policy.threshold ||
265
+ match.type !== policy.type ||
266
+ match.enabled !== policy.enabled ||
267
+ JSON.stringify(match.mechanisms) !== JSON.stringify(policy.mechanisms) ||
268
+ JSON.stringify(match.filters) !== JSON.stringify(policy.filters);
269
+ if (changed) {
270
+ update.push({ providerId: match.providerId, policy });
271
+ }
272
+ }
273
+ const deleteList = Array.from(liveByName.values()).map((p) => ({
274
+ providerId: p.providerId,
275
+ name: p.name
276
+ }));
277
+ return { create, update, delete: deleteList };
278
+ }
279
+ }
280
+ export function createCloudflareAlertsImplementation(input) {
281
+ return new CloudflareAlertsImplementation(CloudflareAlertsDescriptorSchema.parse(input));
282
+ }
283
+ //# sourceMappingURL=alerts.impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alerts.impl.js","sourceRoot":"","sources":["../../src/implementations/alerts.impl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Cloudflare KV Implementation
3
+ *
4
+ * Config generator for `infra/cache` kind when engine is `cloudflare-kv`.
5
+ * Produces KV namespace binding config to merge into a wrangler config.
6
+ */
7
+ import * as z from 'zod/v4';
8
+ export declare const CloudflareKVDescriptorSchema: z.ZodObject<{
9
+ kind: z.ZodLiteral<"infra/cache">;
10
+ id: z.ZodString;
11
+ name: z.ZodString;
12
+ engine: z.ZodLiteral<"cloudflare-kv">;
13
+ binding: z.ZodString;
14
+ namespaceId: z.ZodString;
15
+ previewNamespaceId: z.ZodOptional<z.ZodString>;
16
+ }, z.core.$strip>;
17
+ export type CloudflareKVDescriptor = z.infer<typeof CloudflareKVDescriptorSchema>;
18
+ export interface WranglerKVConfig {
19
+ kv_namespaces: Array<{
20
+ binding: string;
21
+ id: string;
22
+ preview_id?: string;
23
+ }>;
24
+ }
25
+ /**
26
+ * Generate KV namespace binding config to merge into a wrangler config.
27
+ */
28
+ export declare function generateCloudflareKVConfig(descriptor: CloudflareKVDescriptor): WranglerKVConfig;
29
+ //# sourceMappingURL=kv.impl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kv.impl.d.ts","sourceRoot":"","sources":["../../src/implementations/kv.impl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAE5B,eAAO,MAAM,4BAA4B;;;;;;;;iBAWvC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF,MAAM,WAAW,gBAAgB;IAChC,aAAa,EAAE,KAAK,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,EAAE,EAAE,MAAM,CAAC;QACX,UAAU,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,sBAAsB,GAAG,gBAAgB,CAe/F"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Cloudflare KV Implementation
3
+ *
4
+ * Config generator for `infra/cache` kind when engine is `cloudflare-kv`.
5
+ * Produces KV namespace binding config to merge into a wrangler config.
6
+ */
7
+ import * as z from 'zod/v4';
8
+ export const CloudflareKVDescriptorSchema = z.object({
9
+ kind: z.literal('infra/cache'),
10
+ id: z.string().min(1),
11
+ name: z.string().min(1),
12
+ engine: z.literal('cloudflare-kv'),
13
+ /** Binding name (e.g. "SESSION_CACHE") */
14
+ binding: z.string().regex(/^[_A-Z0-9]+$/),
15
+ /** KV namespace ID (from Cloudflare dashboard or wrangler) */
16
+ namespaceId: z.string().min(1),
17
+ /** Optional preview namespace ID for non-production */
18
+ previewNamespaceId: z.string().optional()
19
+ });
20
+ /**
21
+ * Generate KV namespace binding config to merge into a wrangler config.
22
+ */
23
+ export function generateCloudflareKVConfig(descriptor) {
24
+ const parsed = CloudflareKVDescriptorSchema.parse(descriptor);
25
+ const namespace = {
26
+ binding: parsed.binding,
27
+ id: parsed.namespaceId
28
+ };
29
+ if (parsed.previewNamespaceId) {
30
+ namespace.preview_id = parsed.previewNamespaceId;
31
+ }
32
+ return {
33
+ kv_namespaces: [namespace]
34
+ };
35
+ }
36
+ //# sourceMappingURL=kv.impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kv.impl.js","sourceRoot":"","sources":["../../src/implementations/kv.impl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAE5B,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IACpD,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;IAC9B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;IAClC,0CAA0C;IAC1C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC;IACzC,8DAA8D;IAC9D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,uDAAuD;IACvD,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACzC,CAAC,CAAC;AAYH;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,UAAkC;IAC5E,MAAM,MAAM,GAAG,4BAA4B,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAE9D,MAAM,SAAS,GAA8C;QAC5D,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,EAAE,EAAE,MAAM,CAAC,WAAW;KACtB,CAAC;IAEF,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC/B,SAAS,CAAC,UAAU,GAAG,MAAM,CAAC,kBAAkB,CAAC;IAClD,CAAC;IAED,OAAO;QACN,aAAa,EAAE,CAAC,SAAS,CAAC;KAC1B,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Default Cloudflare Logs descriptor — registered at plugin load time so
3
+ * `runtime.assets('infra/logs').descriptors()` returns at least one entry
4
+ * the moment the infra-cloudflare plugin is loaded.
5
+ *
6
+ * The descriptor only carries adapter identity + credential pointers. The
7
+ * concrete `sources` list (which workers to observe) is *not* declared
8
+ * here — that's app inventory, owned by each consumer's
9
+ * `deployment.config.ts`. CLI surfaces (e.g. `vibes infra logs`) discover
10
+ * sources from the workspace and merge them at display time.
11
+ */
12
+ import type { InfraLogsDescriptor } from '@vibesdotdev/infra-core/kinds';
13
+ declare const descriptor: InfraLogsDescriptor;
14
+ export default descriptor;
15
+ //# sourceMappingURL=logs.descriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.descriptor.d.ts","sourceRoot":"","sources":["../../src/implementations/logs.descriptor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,QAAA,MAAM,UAAU,EAAE,mBAYjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Default Cloudflare Logs descriptor — registered at plugin load time so
3
+ * `runtime.assets('infra/logs').descriptors()` returns at least one entry
4
+ * the moment the infra-cloudflare plugin is loaded.
5
+ *
6
+ * The descriptor only carries adapter identity + credential pointers. The
7
+ * concrete `sources` list (which workers to observe) is *not* declared
8
+ * here — that's app inventory, owned by each consumer's
9
+ * `deployment.config.ts`. CLI surfaces (e.g. `vibes infra logs`) discover
10
+ * sources from the workspace and merge them at display time.
11
+ */
12
+ const descriptor = {
13
+ kind: 'infra/logs',
14
+ id: 'cloudflare-logs',
15
+ name: 'Cloudflare Logs',
16
+ description: 'Cloudflare Workers, Pages, D1, R2, and KV logs',
17
+ adapter: 'cloudflare-logs',
18
+ adapterConfig: {
19
+ accountId: { source: 'secret', key: 'CLOUDFLARE_ACCOUNT_ID' },
20
+ apiToken: { source: 'secret', key: 'CLOUDFLARE_API_TOKEN' }
21
+ },
22
+ sources: [],
23
+ alerts: []
24
+ };
25
+ export default descriptor;
26
+ //# sourceMappingURL=logs.descriptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.descriptor.js","sourceRoot":"","sources":["../../src/implementations/logs.descriptor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,MAAM,UAAU,GAAwB;IACvC,IAAI,EAAE,YAAY;IAClB,EAAE,EAAE,iBAAiB;IACrB,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,gDAAgD;IAC7D,OAAO,EAAE,iBAAiB;IAC1B,aAAa,EAAE;QACd,SAAS,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,uBAAuB,EAAE;QAC7D,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,sBAAsB,EAAE;KAC3D;IACD,OAAO,EAAE,EAAE;IACX,MAAM,EAAE,EAAE;CACV,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Cloudflare Logs Implementation
3
+ *
4
+ * Implements the `infra/logs` kind for Cloudflare Workers.
5
+ * Provides programmatic log tailing, queries, and analytics.
6
+ */
7
+ import * as z from 'zod/v4';
8
+ export declare const CloudflareLogsDescriptorSchema: z.ZodObject<{
9
+ kind: z.ZodLiteral<"infra/logs">;
10
+ id: z.ZodString;
11
+ name: z.ZodString;
12
+ description: z.ZodOptional<z.ZodString>;
13
+ adapter: z.ZodLiteral<"cloudflare-logs">;
14
+ adapterConfig: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
15
+ accountId: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
16
+ source: z.ZodLiteral<"secret">;
17
+ key: z.ZodString;
18
+ }, z.core.$strip>, z.ZodObject<{
19
+ source: z.ZodLiteral<"env">;
20
+ key: z.ZodString;
21
+ }, z.core.$strip>]>>;
22
+ apiToken: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
23
+ source: z.ZodLiteral<"env">;
24
+ key: z.ZodString;
25
+ }, z.core.$strip>, z.ZodObject<{
26
+ source: z.ZodLiteral<"secret">;
27
+ key: z.ZodString;
28
+ }, z.core.$strip>]>>;
29
+ apiKey: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
30
+ source: z.ZodLiteral<"env">;
31
+ key: z.ZodString;
32
+ }, z.core.$strip>, z.ZodObject<{
33
+ source: z.ZodLiteral<"secret">;
34
+ key: z.ZodString;
35
+ }, z.core.$strip>]>>;
36
+ email: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
37
+ source: z.ZodLiteral<"env">;
38
+ key: z.ZodString;
39
+ }, z.core.$strip>, z.ZodObject<{
40
+ source: z.ZodLiteral<"secret">;
41
+ key: z.ZodString;
42
+ }, z.core.$strip>]>>;
43
+ environment: z.ZodOptional<z.ZodString>;
44
+ sources: z.ZodDefault<z.ZodArray<z.ZodObject<{
45
+ type: z.ZodEnum<{
46
+ worker: "worker";
47
+ pages: "pages";
48
+ d1: "d1";
49
+ r2: "r2";
50
+ kv: "kv";
51
+ }>;
52
+ name: z.ZodString;
53
+ environment: z.ZodOptional<z.ZodString>;
54
+ }, z.core.$strip>>>;
55
+ retention: z.ZodOptional<z.ZodObject<{
56
+ hotDays: z.ZodDefault<z.ZodNumber>;
57
+ coldDays: z.ZodDefault<z.ZodNumber>;
58
+ }, z.core.$strip>>;
59
+ alerts: z.ZodDefault<z.ZodArray<z.ZodObject<{
60
+ name: z.ZodString;
61
+ condition: z.ZodEnum<{
62
+ errorRate: "errorRate";
63
+ duration: "duration";
64
+ invocationCount: "invocationCount";
65
+ }>;
66
+ threshold: z.ZodNumber;
67
+ window: z.ZodString;
68
+ channels: z.ZodDefault<z.ZodArray<z.ZodString>>;
69
+ }, z.core.$strip>>>;
70
+ }, z.core.$strip>;
71
+ export type CloudflareLogsDescriptorInput = z.input<typeof CloudflareLogsDescriptorSchema>;
72
+ export type CloudflareLogsDescriptor = z.infer<typeof CloudflareLogsDescriptorSchema>;
73
+ export interface LogsImplementation {
74
+ /** Stream logs in real-time (returns WebSocket URL) */
75
+ tailLogs(sourceName: string, options?: {
76
+ status?: 'ok' | 'error' | 'canceled';
77
+ limit?: number;
78
+ }): Promise<{
79
+ tailId: string;
80
+ websocketUrl: string;
81
+ }>;
82
+ /** Stop a log tail session */
83
+ stopTail(sourceName: string, tailId: string): Promise<void>;
84
+ /** List active tail sessions */
85
+ listTails(sourceName: string): Promise<Array<{
86
+ id: string;
87
+ createdAt: string;
88
+ }>>;
89
+ /** Get analytics summary */
90
+ getAnalytics(sourceName: string, timeRange?: {
91
+ timeStart: string;
92
+ timeEnd?: string;
93
+ }): Promise<{
94
+ totalInvocations: number;
95
+ errorCount: number;
96
+ errorRate: number;
97
+ avgDurationMs: number;
98
+ p99DurationMs: number;
99
+ totalCpuTimeMs: number;
100
+ }>;
101
+ /** Get error rate */
102
+ getErrorRate(sourceName: string, timeRange?: {
103
+ timeStart: string;
104
+ timeEnd?: string;
105
+ }): Promise<number>;
106
+ }
107
+ export declare function createCloudflareLogsImplementation(input: CloudflareLogsDescriptorInput): LogsImplementation;
108
+ //# sourceMappingURL=logs.impl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.impl.d.ts","sourceRoot":"","sources":["../../src/implementations/logs.impl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAE5B,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+DzC,CAAC;AAEH,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAC3F,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAEtF,MAAM,WAAW,kBAAkB;IAClC,uDAAuD;IACvD,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,IAAI,GAAG,OAAO,GAAG,UAAU,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpJ,8BAA8B;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,gCAAgC;IAChC,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IACjF,4BAA4B;IAC5B,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1O,qBAAqB;IACrB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACvG;AAsGD,wBAAgB,kCAAkC,CACjD,KAAK,EAAE,6BAA6B,GAClC,kBAAkB,CAGpB"}