@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,154 @@
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 { getVibesRuntime } from '@vibesdotdev/runtime';
8
+ import { CloudflareLogsConnector } from '@vibesdotdev/connector-cloudflare';
9
+ import { resolveCurrentEnvironmentConfig } from '@vibesdotdev/config/environment/current';
10
+ import * as z from 'zod/v4';
11
+ export const CloudflareLogsDescriptorSchema = z.object({
12
+ kind: z.literal('infra/logs'),
13
+ id: z.string().min(1),
14
+ name: z.string().min(1),
15
+ description: z.string().optional(),
16
+ adapter: z.literal('cloudflare-logs'),
17
+ adapterConfig: z.record(z.string(), z.unknown()).optional(),
18
+ // Support top-level for backward compat with old descriptors; prefer adapterConfig
19
+ accountId: z.union([
20
+ z.string().min(1),
21
+ z.object({ source: z.literal('secret'), key: z.string().min(1) }),
22
+ z.object({ source: z.literal('env'), key: z.string().min(1) })
23
+ ]).optional(),
24
+ apiToken: z.union([
25
+ z.object({ source: z.literal('env'), key: z.string().min(1) }),
26
+ z.object({ source: z.literal('secret'), key: z.string().min(1) })
27
+ ]).optional(),
28
+ /**
29
+ * Optional legacy Global API Key + email pair. Provide both to fall back
30
+ * to `X-Auth-Key` + `X-Auth-Email` for endpoints that 405 on Bearer auth.
31
+ */
32
+ apiKey: z.union([
33
+ z.object({ source: z.literal('env'), key: z.string().min(1) }),
34
+ z.object({ source: z.literal('secret'), key: z.string().min(1) })
35
+ ]).optional(),
36
+ email: z.union([
37
+ z.object({ source: z.literal('env'), key: z.string().min(1) }),
38
+ z.object({ source: z.literal('secret'), key: z.string().min(1) })
39
+ ]).optional(),
40
+ /**
41
+ * Optional override for the secrets-resolution environment scope. When
42
+ * unset, the impl resolves the current active environment from the
43
+ * config manifest (the same selection `vibes secrets list` honors),
44
+ * falling back to `'local'`.
45
+ */
46
+ environment: z.string().optional(),
47
+ /** Log sources to monitor - matches infra/logs kind schema */
48
+ sources: z
49
+ .array(z.object({
50
+ type: z.enum(['worker', 'pages', 'd1', 'r2', 'kv']),
51
+ name: z.string().min(1),
52
+ environment: z.string().optional()
53
+ }))
54
+ .default([]),
55
+ retention: z
56
+ .object({
57
+ hotDays: z.number().int().positive().default(7),
58
+ coldDays: z.number().int().positive().default(30)
59
+ })
60
+ .optional(),
61
+ alerts: z
62
+ .array(z.object({
63
+ name: z.string().min(1),
64
+ condition: z.enum(['errorRate', 'duration', 'invocationCount']),
65
+ threshold: z.number(),
66
+ window: z.string(),
67
+ channels: z.array(z.string()).default([])
68
+ }))
69
+ .default([])
70
+ });
71
+ class CloudflareLogsImplementation {
72
+ id = 'cloudflare-logs';
73
+ descriptor;
74
+ connector = null;
75
+ constructor(descriptor) {
76
+ this.descriptor = CloudflareLogsDescriptorSchema.parse(descriptor);
77
+ }
78
+ async getConnector() {
79
+ if (this.connector)
80
+ return this.connector;
81
+ const runtime = getVibesRuntime();
82
+ const secretsStore = await runtime.query('secrets/store').resolve();
83
+ // Prefer adapterConfig for constitution-aligned config (adapter-specific under adapterConfig)
84
+ const ac = (this.descriptor.adapterConfig || {});
85
+ const accountId = (this.descriptor.accountId ?? ac.accountId ?? { source: 'secret', key: 'CLOUDFLARE_ACCOUNT_ID' });
86
+ const apiToken = (this.descriptor.apiToken ?? ac.apiToken ?? { source: 'secret', key: 'CLOUDFLARE_API_TOKEN' });
87
+ // Legacy auth pair is optional — only used by endpoints that 405 on Bearer.
88
+ const apiKey = (this.descriptor.apiKey ?? ac.apiKey);
89
+ const email = (this.descriptor.email ?? ac.email);
90
+ // Resolve which environment scope to read secrets from. Descriptor
91
+ // override wins; otherwise follow the user's active environment
92
+ // selection (same source `vibes secrets list` reads). Final fallback
93
+ // is `'local'` so the CLI stays usable when the config manifest
94
+ // hasn't been initialized.
95
+ let environment = this.descriptor.environment;
96
+ if (!environment) {
97
+ try {
98
+ const current = await resolveCurrentEnvironmentConfig();
99
+ environment = current.name;
100
+ }
101
+ catch {
102
+ environment = 'local';
103
+ }
104
+ }
105
+ this.connector = await CloudflareLogsConnector.create({
106
+ accountId,
107
+ apiToken,
108
+ ...(apiKey ? { apiKey } : {}),
109
+ ...(email ? { email } : {})
110
+ }, {
111
+ environment,
112
+ secretsStore
113
+ });
114
+ return this.connector;
115
+ }
116
+ async tailLogs(workerName, options = {}) {
117
+ const connector = await this.getConnector();
118
+ try {
119
+ return await connector.tailLogs(workerName, options);
120
+ }
121
+ catch (error) {
122
+ const msg = error instanceof Error ? error.message : String(error);
123
+ if (msg.includes('Method not allowed for this authentication scheme')) {
124
+ throw new Error('Cloudflare rejected log tail with "method not allowed for this authentication scheme". ' +
125
+ 'Your API token likely lacks the "Workers Scripts:Edit" (or equivalent Tail) permission. ' +
126
+ 'Either grant that permission to CLOUDFLARE_API_TOKEN, or configure ' +
127
+ 'CLOUDFLARE_API_KEY + CLOUDFLARE_EMAIL in the secrets store for legacy auth fallback.');
128
+ }
129
+ throw error;
130
+ }
131
+ }
132
+ async stopTail(sourceName, tailId) {
133
+ const connector = await this.getConnector();
134
+ await connector.stopTail(sourceName, tailId);
135
+ }
136
+ async listTails(sourceName) {
137
+ const connector = await this.getConnector();
138
+ const sessions = await connector.listTails(sourceName);
139
+ return sessions.map((s) => ({ id: s.tailId, createdAt: s.createdAt.toISOString() }));
140
+ }
141
+ async getAnalytics(sourceName, timeRange) {
142
+ const connector = await this.getConnector();
143
+ return connector.getAnalytics(sourceName, timeRange ?? {});
144
+ }
145
+ async getErrorRate(sourceName, timeRange) {
146
+ const connector = await this.getConnector();
147
+ return connector.getErrorRate(sourceName, timeRange ?? {});
148
+ }
149
+ }
150
+ export function createCloudflareLogsImplementation(input) {
151
+ const descriptor = CloudflareLogsDescriptorSchema.parse(input);
152
+ return new CloudflareLogsImplementation(descriptor);
153
+ }
154
+ //# sourceMappingURL=logs.impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.impl.js","sourceRoot":"","sources":["../../src/implementations/logs.impl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Default Cloudflare Workers Observability descriptor — auto-registered
3
+ * at plugin load so `runtime.assets('infra/observability').descriptors()`
4
+ * surfaces it without each consumer declaring one in their config.
5
+ */
6
+ import type { InfraObservabilityDescriptor } from '@vibesdotdev/infra-core';
7
+ declare const descriptor: InfraObservabilityDescriptor;
8
+ export default descriptor;
9
+ //# sourceMappingURL=observability.descriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.descriptor.d.ts","sourceRoot":"","sources":["../../src/implementations/observability.descriptor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAE5E,QAAA,MAAM,UAAU,EAAE,4BAcjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Default Cloudflare Workers Observability descriptor — auto-registered
3
+ * at plugin load so `runtime.assets('infra/observability').descriptors()`
4
+ * surfaces it without each consumer declaring one in their config.
5
+ */
6
+ const descriptor = {
7
+ kind: 'infra/observability',
8
+ id: 'cloudflare-workers-observability',
9
+ name: 'Cloudflare Workers Observability',
10
+ description: 'Per-Worker observability config (logs/traces sampling, exports) via CF Workers Settings API',
11
+ adapter: 'cloudflare-workers-observability',
12
+ adapterConfig: {
13
+ apiTokenEnvVar: 'CLOUDFLARE_API_TOKEN',
14
+ accountIdEnvVar: 'CLOUDFLARE_ACCOUNT_ID'
15
+ },
16
+ environment: 'local',
17
+ // Default scope: every Worker in the account. CLI commands can
18
+ // narrow with --worker.
19
+ defaultScope: { kind: 'account-wide' }
20
+ };
21
+ export default descriptor;
22
+ //# sourceMappingURL=observability.descriptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.descriptor.js","sourceRoot":"","sources":["../../src/implementations/observability.descriptor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,UAAU,GAAiC;IAChD,IAAI,EAAE,qBAAqB;IAC3B,EAAE,EAAE,kCAAkC;IACtC,IAAI,EAAE,kCAAkC;IACxC,WAAW,EAAE,6FAA6F;IAC1G,OAAO,EAAE,kCAAkC;IAC3C,aAAa,EAAE;QACd,cAAc,EAAE,sBAAsB;QACtC,eAAe,EAAE,uBAAuB;KACxC;IACD,WAAW,EAAE,OAAO;IACpB,+DAA+D;IAC/D,wBAAwB;IACxB,YAAY,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;CACtC,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Cloudflare Workers Observability Implementation
3
+ *
4
+ * Reads/writes per-Worker observability via the CF Workers Settings API:
5
+ *
6
+ * GET /accounts/:account/workers/scripts/:script/settings
7
+ * PATCH /accounts/:account/workers/scripts/:script/settings
8
+ *
9
+ * The PATCH body shape is the same as the GET response — supply only
10
+ * the keys you want to change. We translate the kind's
11
+ * `ObservabilitySettings` shape onto CF's nested observability.{logs,
12
+ * traces} fields.
13
+ *
14
+ * Credentials resolve through the standard `secrets/store` runtime
15
+ * chain via `resolveAdapterCredential`; no CF-specific helpers. Token
16
+ * candidates default to CLOUDFLARE_API_TOKEN (Workers Scripts: Edit
17
+ * scope required for write).
18
+ */
19
+ import * as z from 'zod/v4';
20
+ import { type ObservabilityImplementation } from '@vibesdotdev/infra-core';
21
+ export declare const CloudflareObservabilityDescriptorSchema: z.ZodObject<{
22
+ kind: z.ZodLiteral<"infra/observability">;
23
+ id: z.ZodString;
24
+ name: z.ZodString;
25
+ description: z.ZodOptional<z.ZodString>;
26
+ adapter: z.ZodLiteral<"cloudflare-workers-observability">;
27
+ adapterConfig: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
28
+ environment: z.ZodDefault<z.ZodString>;
29
+ defaultScope: z.ZodOptional<z.ZodUnknown>;
30
+ settings: z.ZodOptional<z.ZodUnknown>;
31
+ }, z.core.$strip>;
32
+ export type CloudflareObservabilityDescriptorInput = z.input<typeof CloudflareObservabilityDescriptorSchema>;
33
+ export type CloudflareObservabilityDescriptor = z.infer<typeof CloudflareObservabilityDescriptorSchema>;
34
+ export declare function createCloudflareObservabilityImplementation(input: CloudflareObservabilityDescriptorInput): ObservabilityImplementation;
35
+ //# sourceMappingURL=observability.impl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.impl.d.ts","sourceRoot":"","sources":["../../src/implementations/observability.impl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAEN,KAAK,2BAA2B,EAMhC,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,uCAAuC;;;;;;;;;;iBAUlD,CAAC;AAEH,MAAM,MAAM,sCAAsC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uCAAuC,CAAC,CAAC;AAC7G,MAAM,MAAM,iCAAiC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uCAAuC,CAAC,CAAC;AAiQxG,wBAAgB,2CAA2C,CAC1D,KAAK,EAAE,sCAAsC,GAC3C,2BAA2B,CAI7B"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * Cloudflare Workers Observability Implementation
3
+ *
4
+ * Reads/writes per-Worker observability via the CF Workers Settings API:
5
+ *
6
+ * GET /accounts/:account/workers/scripts/:script/settings
7
+ * PATCH /accounts/:account/workers/scripts/:script/settings
8
+ *
9
+ * The PATCH body shape is the same as the GET response — supply only
10
+ * the keys you want to change. We translate the kind's
11
+ * `ObservabilitySettings` shape onto CF's nested observability.{logs,
12
+ * traces} fields.
13
+ *
14
+ * Credentials resolve through the standard `secrets/store` runtime
15
+ * chain via `resolveAdapterCredential`; no CF-specific helpers. Token
16
+ * candidates default to CLOUDFLARE_API_TOKEN (Workers Scripts: Edit
17
+ * scope required for write).
18
+ */
19
+ import * as z from 'zod/v4';
20
+ import { resolveAdapterCredential } from '@vibesdotdev/infra-core';
21
+ export const CloudflareObservabilityDescriptorSchema = z.object({
22
+ kind: z.literal('infra/observability'),
23
+ id: z.string().min(1),
24
+ name: z.string().min(1),
25
+ description: z.string().optional(),
26
+ adapter: z.literal('cloudflare-workers-observability'),
27
+ adapterConfig: z.record(z.string(), z.unknown()).optional(),
28
+ environment: z.string().default('local'),
29
+ defaultScope: z.unknown().optional(),
30
+ settings: z.unknown().optional()
31
+ });
32
+ /** Map CF native observability → provider-agnostic ObservabilitySettings. */
33
+ function fromCfObservability(cf) {
34
+ const out = {};
35
+ if (cf?.logs) {
36
+ out.logs = {
37
+ enabled: cf.logs.enabled ?? cf.enabled ?? false,
38
+ headSamplingRate: cf.logs.head_sampling_rate ?? cf.head_sampling_rate,
39
+ persist: cf.logs.persist,
40
+ invocationLogs: cf.logs.invocation_logs
41
+ };
42
+ }
43
+ if (cf?.traces) {
44
+ out.traces = {
45
+ enabled: cf.traces.enabled ?? false,
46
+ headSamplingRate: cf.traces.head_sampling_rate,
47
+ persist: cf.traces.persist
48
+ };
49
+ }
50
+ return out;
51
+ }
52
+ /** Map ObservabilitySettings → CF PATCH body (only includes provided keys). */
53
+ function toCfObservability(settings) {
54
+ const body = {};
55
+ if (settings.logs) {
56
+ // CF gates everything under `enabled` at the top-level; mirror the
57
+ // logs.enabled value so single-toggle clients work as expected.
58
+ body.enabled = settings.logs.enabled;
59
+ body.head_sampling_rate = settings.logs.headSamplingRate;
60
+ body.logs = {
61
+ enabled: settings.logs.enabled,
62
+ head_sampling_rate: settings.logs.headSamplingRate,
63
+ persist: settings.logs.persist,
64
+ invocation_logs: settings.logs.invocationLogs
65
+ };
66
+ }
67
+ if (settings.traces) {
68
+ body.traces = {
69
+ enabled: settings.traces.enabled,
70
+ head_sampling_rate: settings.traces.headSamplingRate,
71
+ persist: settings.traces.persist
72
+ };
73
+ }
74
+ return body;
75
+ }
76
+ function settingsEqual(a, b) {
77
+ return JSON.stringify(a) === JSON.stringify(b);
78
+ }
79
+ class CloudflareObservabilityImplementation {
80
+ id = 'cloudflare-workers-observability';
81
+ descriptor;
82
+ creds = null;
83
+ constructor(descriptor) {
84
+ this.descriptor = CloudflareObservabilityDescriptorSchema.parse(descriptor);
85
+ }
86
+ async getCreds() {
87
+ if (this.creds)
88
+ return this.creds;
89
+ const env = this.descriptor.environment || 'local';
90
+ const ac = (this.descriptor.adapterConfig ?? {});
91
+ const accountKey = typeof ac.accountIdEnvVar === 'string' ? ac.accountIdEnvVar : 'CLOUDFLARE_ACCOUNT_ID';
92
+ const primaryToken = typeof ac.apiTokenEnvVar === 'string' ? ac.apiTokenEnvVar : 'CLOUDFLARE_API_TOKEN';
93
+ const fallbackToken = typeof ac.apiTokenFallbackEnvVar === 'string' ? ac.apiTokenFallbackEnvVar : null;
94
+ const tokenCandidates = fallbackToken ? [primaryToken, fallbackToken] : [primaryToken];
95
+ const accountRes = await resolveAdapterCredential({
96
+ keyCandidates: [accountKey],
97
+ environment: env,
98
+ humanName: 'Cloudflare account id'
99
+ });
100
+ const tokenRes = await resolveAdapterCredential({
101
+ keyCandidates: tokenCandidates,
102
+ environment: env,
103
+ humanName: 'Cloudflare API token (Workers Scripts: Edit scope for write ops)'
104
+ });
105
+ this.creds = { accountId: accountRes.value, apiToken: tokenRes.value };
106
+ return this.creds;
107
+ }
108
+ async call(path, init) {
109
+ const { apiToken } = await this.getCreds();
110
+ // Note: callers that need the multipart/form-data shape (the
111
+ // script settings PATCH endpoint) must set their own Content-Type
112
+ // via the init.headers override — otherwise we apply JSON by default.
113
+ const callerHeaders = (init?.headers ?? {});
114
+ const explicitContentType = Object.keys(callerHeaders).some((k) => k.toLowerCase() === 'content-type');
115
+ const defaultHeaders = {
116
+ Authorization: `Bearer ${apiToken}`
117
+ };
118
+ if (!explicitContentType && !(init?.body instanceof FormData)) {
119
+ defaultHeaders['Content-Type'] = 'application/json';
120
+ }
121
+ const res = await fetch(`https://api.cloudflare.com/client/v4${path}`, {
122
+ ...init,
123
+ headers: {
124
+ ...defaultHeaders,
125
+ ...callerHeaders
126
+ }
127
+ });
128
+ const text = await res.text();
129
+ let body;
130
+ try {
131
+ body = JSON.parse(text);
132
+ }
133
+ catch {
134
+ throw new Error(`cloudflare-observability: non-JSON response from ${path}: ${text.slice(0, 200)}`);
135
+ }
136
+ if (!res.ok || body.success === false) {
137
+ const errSummary = body.errors?.map((e) => `${e.code}: ${e.message}`).join('; ') ?? text.slice(0, 200);
138
+ throw new Error(`cloudflare-observability: ${path} → ${res.status} ${errSummary}`);
139
+ }
140
+ return body;
141
+ }
142
+ async listWorkerNames(filter) {
143
+ const { accountId } = await this.getCreds();
144
+ const body = await this.call(`/accounts/${accountId}/workers/scripts?per_page=200`);
145
+ const all = (body.result ?? []).map((s) => s.id);
146
+ if (!filter)
147
+ return all;
148
+ // Simple glob: support * as a wildcard.
149
+ const pattern = filter.replace(/[.+?^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*');
150
+ const re = new RegExp(`^${pattern}$`);
151
+ return all.filter((name) => re.test(name));
152
+ }
153
+ async resolveScopeToWorkers(scope) {
154
+ if (scope.kind === 'worker')
155
+ return [scope.workerName];
156
+ return this.listWorkerNames(scope.filter);
157
+ }
158
+ async getStatus(scope) {
159
+ const { accountId } = await this.getCreds();
160
+ const workers = await this.resolveScopeToWorkers(scope);
161
+ const snapshots = [];
162
+ for (const workerName of workers) {
163
+ try {
164
+ const body = await this.call(`/accounts/${accountId}/workers/scripts/${workerName}/settings`);
165
+ snapshots.push({
166
+ workerName,
167
+ settings: fromCfObservability(body.result.observability),
168
+ modifiedAt: body.result.modified_on
169
+ });
170
+ }
171
+ catch (err) {
172
+ // Skip workers that don't exist or aren't readable, but
173
+ // surface as snapshots with empty settings so the CLI can
174
+ // distinguish "not present" from "100% sampling".
175
+ snapshots.push({
176
+ workerName,
177
+ settings: {},
178
+ modifiedAt: undefined
179
+ });
180
+ if (process.env.VIBES_DEBUG_OBSERVABILITY === '1') {
181
+ console.error(`[observability-debug] ${workerName}: ${err.message}`);
182
+ }
183
+ }
184
+ }
185
+ return snapshots;
186
+ }
187
+ async set(input) {
188
+ const { accountId } = await this.getCreds();
189
+ const skipUnchanged = input.skipUnchanged ?? true;
190
+ const workers = await this.resolveScopeToWorkers(input.scope);
191
+ const result = { changed: [], unchanged: [], failed: [] };
192
+ for (const workerName of workers) {
193
+ try {
194
+ const current = await this.call(`/accounts/${accountId}/workers/scripts/${workerName}/settings`);
195
+ const before = fromCfObservability(current.result.observability);
196
+ // Merge requested settings into existing, then check for change.
197
+ const desired = {
198
+ logs: { ...(before.logs ?? { enabled: false }), ...(input.settings.logs ?? {}) },
199
+ traces: { ...(before.traces ?? { enabled: false }), ...(input.settings.traces ?? {}) }
200
+ };
201
+ if (skipUnchanged && settingsEqual(before, desired)) {
202
+ result.unchanged.push(workerName);
203
+ continue;
204
+ }
205
+ // CF's script-settings PATCH requires multipart/form-data with
206
+ // a `settings` field carrying the JSON metadata. Bare JSON
207
+ // returns 415 ("Content-Type must be one of: multipart/form-data").
208
+ const form = new FormData();
209
+ form.append('settings', JSON.stringify({ observability: toCfObservability(desired) }));
210
+ await this.call(`/accounts/${accountId}/workers/scripts/${workerName}/settings`, {
211
+ method: 'PATCH',
212
+ body: form
213
+ });
214
+ result.changed.push({ workerName, before, after: desired });
215
+ }
216
+ catch (err) {
217
+ result.failed.push({
218
+ workerName,
219
+ error: err instanceof Error ? err.message : String(err)
220
+ });
221
+ }
222
+ }
223
+ return result;
224
+ }
225
+ }
226
+ export function createCloudflareObservabilityImplementation(input) {
227
+ return new CloudflareObservabilityImplementation(CloudflareObservabilityDescriptorSchema.parse(input));
228
+ }
229
+ //# sourceMappingURL=observability.impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.impl.js","sourceRoot":"","sources":["../../src/implementations/observability.impl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Cloudflare Pages Implementation
3
+ *
4
+ * Config generator and deployment helpers for Cloudflare Pages projects.
5
+ * Wraps an infra-core AppDeployment into a Cloudflare Pages-compatible
6
+ * wrangler.jsonc fragment and provides rendering utilities.
7
+ *
8
+ * Retained for ecosystem/SDK consumers that target Cloudflare Pages.
9
+ * Vibes monorepo apps deploy as Workers + Static Assets — see web-app.impl.ts.
10
+ */
11
+ import * as z from 'zod/v4';
12
+ import type { AppDeployment } from '@vibesdotdev/infra-core/deployment';
13
+ export declare const CloudflarePagesDescriptorSchema: z.ZodObject<{
14
+ kind: z.ZodLiteral<"infra/web-app">;
15
+ id: z.ZodString;
16
+ name: z.ZodString;
17
+ adapter: z.ZodEnum<{
18
+ "cloudflare-pages": "cloudflare-pages";
19
+ "cloudflare-workers": "cloudflare-workers";
20
+ }>;
21
+ cfProjectName: z.ZodString;
22
+ outputDir: z.ZodString;
23
+ compatibilityDate: z.ZodOptional<z.ZodString>;
24
+ compatibilityFlags: z.ZodDefault<z.ZodArray<z.ZodString>>;
25
+ env: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
26
+ secretsStoreId: z.ZodOptional<z.ZodString>;
27
+ }, z.core.$strip>;
28
+ export type CloudflarePagesDescriptor = z.infer<typeof CloudflarePagesDescriptorSchema>;
29
+ export type CloudflarePagesDescriptorInput = z.input<typeof CloudflarePagesDescriptorSchema>;
30
+ export interface CloudflarePagesDeployment {
31
+ projectName: string;
32
+ deployment: AppDeployment;
33
+ compatibilityDate: string;
34
+ /** Generate wrangler.jsonc fragment for this Pages deployment */
35
+ generateWranglerConfig(): WranglerPagesConfig;
36
+ }
37
+ export interface WranglerSecretsStoreBinding {
38
+ binding: string;
39
+ store_id: string;
40
+ secret_name: string;
41
+ }
42
+ export interface WranglerPagesConfig {
43
+ $schema?: string;
44
+ name: string;
45
+ compatibility_date: string;
46
+ compatibility_flags: string[];
47
+ /** Pages build output directory */
48
+ pages_build_output_dir: string;
49
+ /** Environment variables for production */
50
+ vars?: Record<string, string>;
51
+ /** Account-level Secrets Store bindings (one per secret env var) */
52
+ secrets_store_secrets?: WranglerSecretsStoreBinding[];
53
+ /** Per-Pages-project required secret names (deploy-time validation only) */
54
+ secrets?: {
55
+ required: string[];
56
+ };
57
+ }
58
+ /**
59
+ * Create a Cloudflare Pages deployment wrapper around an AppDeployment.
60
+ *
61
+ * @param options - Deployment options including projectName and the base deployment
62
+ * @returns A CloudflarePagesDeployment with wrangler config generation
63
+ */
64
+ export declare function createCloudflarePagesDeployment(options: {
65
+ projectName: string;
66
+ deployment: AppDeployment;
67
+ compatibilityDate?: string;
68
+ /**
69
+ * Account-level Secrets Store ID. When set, secret env vars are emitted
70
+ * as `secrets_store_secrets[]` bindings instead of being silently dropped.
71
+ */
72
+ secretsStoreId?: string;
73
+ }): CloudflarePagesDeployment;
74
+ /**
75
+ * Render a wrangler.jsonc string from a wrangler config object.
76
+ *
77
+ * Canonical output: tab-indented JSON with a leading JSONC header and a
78
+ * trailing newline. The same renderer is used for Pages and Workers
79
+ * (`infra-cloudflare/web-app`) — pass `headerLines` to customize the
80
+ * leading comment block.
81
+ *
82
+ * @param config - The wrangler config object to render
83
+ * @param options - Optional header override
84
+ * @returns JSONC-formatted string (JSON with comments)
85
+ */
86
+ export declare function renderWranglerJson(config: WranglerPagesConfig | Record<string, unknown>, options?: {
87
+ headerLines?: string[];
88
+ }): string;
89
+ /**
90
+ * Generate a Pages deployment descriptor from an existing AppDeployment.
91
+ * This creates a descriptor that can be used for runtime discovery.
92
+ *
93
+ * @param deployment - The base AppDeployment
94
+ * @param cfProjectName - Explicit Cloudflare project name (required, no hardcoded conventions)
95
+ * @returns A validated Pages descriptor
96
+ */
97
+ export declare function generateCloudflarePagesDescriptor(deployment: AppDeployment, cfProjectName: string): CloudflarePagesDescriptor;
98
+ //# sourceMappingURL=pages.impl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.impl.d.ts","sourceRoot":"","sources":["../../src/implementations/pages.impl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAExE,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;iBAqB1C,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AACxF,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAE7F,MAAM,WAAW,yBAAyB;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,aAAa,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iEAAiE;IACjE,sBAAsB,IAAI,mBAAmB,CAAC;CAC9C;AAED,MAAM,WAAW,2BAA2B;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,mCAAmC;IACnC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,oEAAoE;IACpE,qBAAqB,CAAC,EAAE,2BAA2B,EAAE,CAAC;IACtD,4EAA4E;IAC5E,OAAO,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,EAAE;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,aAAa,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,yBAAyB,CAqD5B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CACjC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrD,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAClC,MAAM,CAQR;AAED;;;;;;;GAOG;AACH,wBAAgB,iCAAiC,CAChD,UAAU,EAAE,aAAa,EACzB,aAAa,EAAE,MAAM,GACnB,yBAAyB,CAa3B"}