@pellux/goodvibes-sdk 0.25.8 → 0.25.11

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 (245) hide show
  1. package/README.md +4 -0
  2. package/dist/_internal/contracts/artifacts/operator-contract.json +178 -6
  3. package/dist/_internal/contracts/generated/foundation-client-types.d.ts +16 -1
  4. package/dist/_internal/contracts/generated/foundation-client-types.d.ts.map +1 -1
  5. package/dist/_internal/contracts/generated/foundation-metadata.d.ts +2 -2
  6. package/dist/_internal/contracts/generated/foundation-metadata.js +2 -2
  7. package/dist/_internal/contracts/generated/operator-contract.d.ts.map +1 -1
  8. package/dist/_internal/contracts/generated/operator-contract.js +178 -6
  9. package/dist/_internal/contracts/generated/operator-method-ids.d.ts +1 -1
  10. package/dist/_internal/contracts/generated/operator-method-ids.d.ts.map +1 -1
  11. package/dist/_internal/contracts/generated/operator-method-ids.js +1 -0
  12. package/dist/_internal/daemon/context.d.ts +1 -0
  13. package/dist/_internal/daemon/context.d.ts.map +1 -1
  14. package/dist/_internal/daemon/integration-route-types.d.ts +1 -0
  15. package/dist/_internal/daemon/integration-route-types.d.ts.map +1 -1
  16. package/dist/_internal/daemon/integration-routes.d.ts +1 -1
  17. package/dist/_internal/daemon/integration-routes.d.ts.map +1 -1
  18. package/dist/_internal/daemon/integration-routes.js +3 -0
  19. package/dist/_internal/daemon/operator.d.ts +1 -1
  20. package/dist/_internal/daemon/operator.d.ts.map +1 -1
  21. package/dist/_internal/daemon/operator.js +2 -0
  22. package/dist/_internal/daemon/runtime-route-types.d.ts +1 -1
  23. package/dist/_internal/daemon/runtime-route-types.d.ts.map +1 -1
  24. package/dist/_internal/platform/adapters/discord/index.d.ts.map +1 -1
  25. package/dist/_internal/platform/adapters/discord/index.js +4 -5
  26. package/dist/_internal/platform/adapters/github/index.d.ts.map +1 -1
  27. package/dist/_internal/platform/adapters/github/index.js +4 -5
  28. package/dist/_internal/platform/adapters/google-chat/index.d.ts.map +1 -1
  29. package/dist/_internal/platform/adapters/google-chat/index.js +7 -5
  30. package/dist/_internal/platform/adapters/helpers.d.ts +2 -1
  31. package/dist/_internal/platform/adapters/helpers.d.ts.map +1 -1
  32. package/dist/_internal/platform/adapters/helpers.js +3 -34
  33. package/dist/_internal/platform/adapters/homeassistant/index.d.ts +3 -0
  34. package/dist/_internal/platform/adapters/homeassistant/index.d.ts.map +1 -0
  35. package/dist/_internal/platform/adapters/homeassistant/index.js +177 -0
  36. package/dist/_internal/platform/adapters/index.d.ts +1 -0
  37. package/dist/_internal/platform/adapters/index.d.ts.map +1 -1
  38. package/dist/_internal/platform/adapters/index.js +1 -0
  39. package/dist/_internal/platform/adapters/mattermost/index.d.ts.map +1 -1
  40. package/dist/_internal/platform/adapters/mattermost/index.js +6 -2
  41. package/dist/_internal/platform/adapters/slack/index.d.ts.map +1 -1
  42. package/dist/_internal/platform/adapters/slack/index.js +4 -5
  43. package/dist/_internal/platform/adapters/telegram/index.d.ts.map +1 -1
  44. package/dist/_internal/platform/adapters/telegram/index.js +7 -5
  45. package/dist/_internal/platform/adapters/types.d.ts +1 -1
  46. package/dist/_internal/platform/adapters/types.d.ts.map +1 -1
  47. package/dist/_internal/platform/adapters/webhook/index.d.ts.map +1 -1
  48. package/dist/_internal/platform/adapters/webhook/index.js +4 -1
  49. package/dist/_internal/platform/automation/types.d.ts +1 -1
  50. package/dist/_internal/platform/automation/types.d.ts.map +1 -1
  51. package/dist/_internal/platform/batch/manager.d.ts.map +1 -1
  52. package/dist/_internal/platform/batch/manager.js +4 -0
  53. package/dist/_internal/platform/batch/types.d.ts +4 -0
  54. package/dist/_internal/platform/batch/types.d.ts.map +1 -1
  55. package/dist/_internal/platform/channels/builtin/accounts.d.ts.map +1 -1
  56. package/dist/_internal/platform/channels/builtin/accounts.js +22 -0
  57. package/dist/_internal/platform/channels/builtin/contracts.d.ts.map +1 -1
  58. package/dist/_internal/platform/channels/builtin/contracts.js +9 -0
  59. package/dist/_internal/platform/channels/builtin/descriptors.d.ts.map +1 -1
  60. package/dist/_internal/platform/channels/builtin/descriptors.js +9 -2
  61. package/dist/_internal/platform/channels/builtin/homeassistant.d.ts +64 -0
  62. package/dist/_internal/platform/channels/builtin/homeassistant.d.ts.map +1 -0
  63. package/dist/_internal/platform/channels/builtin/homeassistant.js +380 -0
  64. package/dist/_internal/platform/channels/builtin/plugins.d.ts.map +1 -1
  65. package/dist/_internal/platform/channels/builtin/plugins.js +2 -1
  66. package/dist/_internal/platform/channels/builtin/presentation.d.ts.map +1 -1
  67. package/dist/_internal/platform/channels/builtin/presentation.js +4 -0
  68. package/dist/_internal/platform/channels/builtin/setup-schema.d.ts.map +1 -1
  69. package/dist/_internal/platform/channels/builtin/setup-schema.js +46 -0
  70. package/dist/_internal/platform/channels/builtin/shared.d.ts +1 -1
  71. package/dist/_internal/platform/channels/builtin/shared.d.ts.map +1 -1
  72. package/dist/_internal/platform/channels/builtin/shared.js +2 -0
  73. package/dist/_internal/platform/channels/builtin/surfaces.d.ts.map +1 -1
  74. package/dist/_internal/platform/channels/builtin/surfaces.js +1 -0
  75. package/dist/_internal/platform/channels/builtin/targets.d.ts.map +1 -1
  76. package/dist/_internal/platform/channels/builtin/targets.js +24 -0
  77. package/dist/_internal/platform/channels/builtin-runtime.d.ts.map +1 -1
  78. package/dist/_internal/platform/channels/builtin-runtime.js +6 -0
  79. package/dist/_internal/platform/channels/delivery/strategies-core.d.ts +1 -0
  80. package/dist/_internal/platform/channels/delivery/strategies-core.d.ts.map +1 -1
  81. package/dist/_internal/platform/channels/delivery/strategies-core.js +41 -1
  82. package/dist/_internal/platform/channels/delivery-router.d.ts.map +1 -1
  83. package/dist/_internal/platform/channels/delivery-router.js +2 -1
  84. package/dist/_internal/platform/channels/reply-pipeline.d.ts.map +1 -1
  85. package/dist/_internal/platform/channels/reply-pipeline.js +9 -0
  86. package/dist/_internal/platform/channels/route-manager.d.ts.map +1 -1
  87. package/dist/_internal/platform/channels/route-manager.js +1 -0
  88. package/dist/_internal/platform/channels/surface-registry.d.ts.map +1 -1
  89. package/dist/_internal/platform/channels/surface-registry.js +4 -0
  90. package/dist/_internal/platform/channels/types.d.ts +1 -1
  91. package/dist/_internal/platform/channels/types.d.ts.map +1 -1
  92. package/dist/_internal/platform/cloudflare/client.d.ts +3 -0
  93. package/dist/_internal/platform/cloudflare/client.d.ts.map +1 -0
  94. package/dist/_internal/platform/cloudflare/client.js +9 -0
  95. package/dist/_internal/platform/cloudflare/config.d.ts +8 -0
  96. package/dist/_internal/platform/cloudflare/config.d.ts.map +1 -0
  97. package/dist/_internal/platform/cloudflare/config.js +48 -0
  98. package/dist/_internal/platform/cloudflare/constants.d.ts +18 -0
  99. package/dist/_internal/platform/cloudflare/constants.d.ts.map +1 -0
  100. package/dist/_internal/platform/cloudflare/constants.js +36 -0
  101. package/dist/_internal/platform/cloudflare/discovery.d.ts +23 -0
  102. package/dist/_internal/platform/cloudflare/discovery.d.ts.map +1 -0
  103. package/dist/_internal/platform/cloudflare/discovery.js +57 -0
  104. package/dist/_internal/platform/cloudflare/index.d.ts +6 -0
  105. package/dist/_internal/platform/cloudflare/index.d.ts.map +1 -0
  106. package/dist/_internal/platform/cloudflare/index.js +4 -0
  107. package/dist/_internal/platform/cloudflare/manager.d.ts +30 -0
  108. package/dist/_internal/platform/cloudflare/manager.d.ts.map +1 -0
  109. package/dist/_internal/platform/cloudflare/manager.js +674 -0
  110. package/dist/_internal/platform/cloudflare/resources.d.ts +79 -0
  111. package/dist/_internal/platform/cloudflare/resources.d.ts.map +1 -0
  112. package/dist/_internal/platform/cloudflare/resources.js +353 -0
  113. package/dist/_internal/platform/cloudflare/types.d.ts +694 -0
  114. package/dist/_internal/platform/cloudflare/types.d.ts.map +1 -0
  115. package/dist/_internal/platform/cloudflare/types.js +10 -0
  116. package/dist/_internal/platform/cloudflare/utils.d.ts +14 -0
  117. package/dist/_internal/platform/cloudflare/utils.d.ts.map +1 -0
  118. package/dist/_internal/platform/cloudflare/utils.js +216 -0
  119. package/dist/_internal/platform/cloudflare/worker-source.d.ts +2 -0
  120. package/dist/_internal/platform/cloudflare/worker-source.d.ts.map +1 -0
  121. package/dist/_internal/platform/cloudflare/worker-source.js +165 -0
  122. package/dist/_internal/platform/companion/companion-chat-manager.d.ts +24 -4
  123. package/dist/_internal/platform/companion/companion-chat-manager.d.ts.map +1 -1
  124. package/dist/_internal/platform/companion/companion-chat-manager.js +128 -78
  125. package/dist/_internal/platform/config/schema-domain-runtime.d.ts +24 -0
  126. package/dist/_internal/platform/config/schema-domain-runtime.d.ts.map +1 -1
  127. package/dist/_internal/platform/config/schema-domain-runtime.js +169 -0
  128. package/dist/_internal/platform/config/schema-domain-surfaces.d.ts +11 -0
  129. package/dist/_internal/platform/config/schema-domain-surfaces.d.ts.map +1 -1
  130. package/dist/_internal/platform/config/schema-domain-surfaces.js +59 -0
  131. package/dist/_internal/platform/config/schema-types.d.ts +38 -2
  132. package/dist/_internal/platform/config/schema-types.d.ts.map +1 -1
  133. package/dist/_internal/platform/control-plane/gateway-utils.d.ts +37 -0
  134. package/dist/_internal/platform/control-plane/gateway-utils.d.ts.map +1 -0
  135. package/dist/_internal/platform/control-plane/gateway-utils.js +97 -0
  136. package/dist/_internal/platform/control-plane/gateway.d.ts +4 -9
  137. package/dist/_internal/platform/control-plane/gateway.d.ts.map +1 -1
  138. package/dist/_internal/platform/control-plane/gateway.js +26 -61
  139. package/dist/_internal/platform/control-plane/method-catalog-runtime.d.ts.map +1 -1
  140. package/dist/_internal/platform/control-plane/method-catalog-runtime.js +11 -1
  141. package/dist/_internal/platform/control-plane/operator-contract-schemas-admin.d.ts.map +1 -1
  142. package/dist/_internal/platform/control-plane/operator-contract-schemas-admin.js +3 -2
  143. package/dist/_internal/platform/control-plane/operator-contract-schemas-control.d.ts +1 -0
  144. package/dist/_internal/platform/control-plane/operator-contract-schemas-control.d.ts.map +1 -1
  145. package/dist/_internal/platform/control-plane/operator-contract-schemas-control.js +26 -0
  146. package/dist/_internal/platform/control-plane/routes/operator.d.ts +1 -1
  147. package/dist/_internal/platform/control-plane/routes/operator.d.ts.map +1 -1
  148. package/dist/_internal/platform/control-plane/routes/operator.js +2 -0
  149. package/dist/_internal/platform/control-plane/types.d.ts +1 -1
  150. package/dist/_internal/platform/control-plane/types.d.ts.map +1 -1
  151. package/dist/_internal/platform/daemon/control-plane.d.ts.map +1 -1
  152. package/dist/_internal/platform/daemon/control-plane.js +50 -6
  153. package/dist/_internal/platform/daemon/facade-composition.d.ts.map +1 -1
  154. package/dist/_internal/platform/daemon/facade-composition.js +30 -2
  155. package/dist/_internal/platform/daemon/facade-types.d.ts +1 -1
  156. package/dist/_internal/platform/daemon/facade-types.d.ts.map +1 -1
  157. package/dist/_internal/platform/daemon/http/cloudflare-routes.d.ts +7 -0
  158. package/dist/_internal/platform/daemon/http/cloudflare-routes.d.ts.map +1 -0
  159. package/dist/_internal/platform/daemon/http/cloudflare-routes.js +201 -0
  160. package/dist/_internal/platform/daemon/http/router.d.ts +3 -3
  161. package/dist/_internal/platform/daemon/http/router.d.ts.map +1 -1
  162. package/dist/_internal/platform/daemon/http/router.js +22 -16
  163. package/dist/_internal/platform/daemon/http/runtime-route-types.d.ts +1 -1
  164. package/dist/_internal/platform/daemon/http/runtime-route-types.d.ts.map +1 -1
  165. package/dist/_internal/platform/daemon/http-listener.d.ts.map +1 -1
  166. package/dist/_internal/platform/daemon/http-listener.js +4 -8
  167. package/dist/_internal/platform/daemon/surface-actions.d.ts +1 -1
  168. package/dist/_internal/platform/daemon/surface-actions.d.ts.map +1 -1
  169. package/dist/_internal/platform/daemon/surface-delivery.d.ts +1 -1
  170. package/dist/_internal/platform/daemon/surface-delivery.d.ts.map +1 -1
  171. package/dist/_internal/platform/daemon/surface-delivery.js +1 -0
  172. package/dist/_internal/platform/daemon/surface-policy.d.ts +1 -1
  173. package/dist/_internal/platform/daemon/surface-policy.d.ts.map +1 -1
  174. package/dist/_internal/platform/daemon/surface-policy.js +8 -0
  175. package/dist/_internal/platform/daemon/types.d.ts +2 -2
  176. package/dist/_internal/platform/daemon/types.d.ts.map +1 -1
  177. package/dist/_internal/platform/integrations/homeassistant.d.ts +58 -0
  178. package/dist/_internal/platform/integrations/homeassistant.d.ts.map +1 -0
  179. package/dist/_internal/platform/integrations/homeassistant.js +174 -0
  180. package/dist/_internal/platform/integrations/index.d.ts +2 -0
  181. package/dist/_internal/platform/integrations/index.d.ts.map +1 -1
  182. package/dist/_internal/platform/integrations/index.js +1 -0
  183. package/dist/_internal/platform/runtime/events/control-plane.d.ts +1 -1
  184. package/dist/_internal/platform/runtime/events/control-plane.d.ts.map +1 -1
  185. package/dist/_internal/platform/runtime/events/control-plane.js +1 -0
  186. package/dist/_internal/platform/runtime/events/routes.d.ts +1 -1
  187. package/dist/_internal/platform/runtime/events/routes.d.ts.map +1 -1
  188. package/dist/_internal/platform/runtime/events/routes.js +1 -0
  189. package/dist/_internal/platform/runtime/feature-flags/flags.d.ts.map +1 -1
  190. package/dist/_internal/platform/runtime/feature-flags/flags.js +9 -0
  191. package/dist/_internal/platform/runtime/feature-flags/gates.d.ts.map +1 -1
  192. package/dist/_internal/platform/runtime/feature-flags/gates.js +2 -0
  193. package/dist/_internal/platform/runtime/index.d.ts +2 -0
  194. package/dist/_internal/platform/runtime/index.d.ts.map +1 -1
  195. package/dist/_internal/platform/runtime/index.js +1 -0
  196. package/dist/_internal/platform/runtime/integration/helpers.d.ts +4 -0
  197. package/dist/_internal/platform/runtime/integration/helpers.d.ts.map +1 -1
  198. package/dist/_internal/platform/runtime/integration/helpers.js +4 -0
  199. package/dist/_internal/platform/runtime/security-settings.d.ts +19 -0
  200. package/dist/_internal/platform/runtime/security-settings.d.ts.map +1 -0
  201. package/dist/_internal/platform/runtime/security-settings.js +187 -0
  202. package/dist/_internal/platform/runtime/services.d.ts.map +1 -1
  203. package/dist/_internal/platform/runtime/services.js +1 -0
  204. package/dist/_internal/platform/security/user-auth.d.ts +1 -1
  205. package/dist/_internal/platform/security/user-auth.d.ts.map +1 -1
  206. package/dist/_internal/platform/security/user-auth.js +18 -3
  207. package/dist/_internal/platform/tools/edit/core.d.ts.map +1 -1
  208. package/dist/_internal/platform/tools/edit/core.js +4 -47
  209. package/dist/_internal/platform/tools/exec/runtime.d.ts.map +1 -1
  210. package/dist/_internal/platform/tools/exec/runtime.js +7 -1
  211. package/dist/_internal/platform/tools/exec/schema.d.ts +1 -0
  212. package/dist/_internal/platform/tools/exec/schema.d.ts.map +1 -1
  213. package/dist/_internal/platform/tools/exec/schema.js +1 -0
  214. package/dist/_internal/platform/tools/fetch/runtime.d.ts.map +1 -1
  215. package/dist/_internal/platform/tools/fetch/runtime.js +140 -19
  216. package/dist/_internal/platform/tools/fetch/schema.d.ts +1 -0
  217. package/dist/_internal/platform/tools/fetch/schema.d.ts.map +1 -1
  218. package/dist/_internal/platform/tools/fetch/schema.js +1 -0
  219. package/dist/_internal/platform/tools/find/executor.d.ts.map +1 -1
  220. package/dist/_internal/platform/tools/find/executor.js +7 -1
  221. package/dist/_internal/platform/tools/find/schema.d.ts.map +1 -1
  222. package/dist/_internal/platform/tools/find/schema.js +2 -0
  223. package/dist/_internal/platform/tools/read/index.d.ts.map +1 -1
  224. package/dist/_internal/platform/tools/read/index.js +7 -1
  225. package/dist/_internal/platform/tools/read/schema.d.ts +1 -0
  226. package/dist/_internal/platform/tools/read/schema.d.ts.map +1 -1
  227. package/dist/_internal/platform/tools/read/schema.js +1 -0
  228. package/dist/_internal/platform/tools/shared/process-manager.d.ts +2 -0
  229. package/dist/_internal/platform/tools/shared/process-manager.d.ts.map +1 -1
  230. package/dist/_internal/platform/tools/shared/process-manager.js +67 -5
  231. package/dist/_internal/platform/tools/write/index.d.ts.map +1 -1
  232. package/dist/_internal/platform/tools/write/index.js +3 -36
  233. package/dist/_internal/platform/utils/concurrency.d.ts +3 -0
  234. package/dist/_internal/platform/utils/concurrency.d.ts.map +1 -0
  235. package/dist/_internal/platform/utils/concurrency.js +17 -0
  236. package/dist/_internal/platform/utils/logger.d.ts.map +1 -1
  237. package/dist/_internal/platform/utils/logger.js +19 -1
  238. package/dist/_internal/platform/utils/request-body.d.ts +4 -0
  239. package/dist/_internal/platform/utils/request-body.d.ts.map +1 -0
  240. package/dist/_internal/platform/utils/request-body.js +45 -0
  241. package/dist/_internal/platform/version.js +1 -1
  242. package/dist/workers.d.ts +9 -0
  243. package/dist/workers.d.ts.map +1 -1
  244. package/dist/workers.js +67 -3
  245. package/package.json +2 -1
@@ -0,0 +1,79 @@
1
+ import type { ConfigKey } from '../config/schema.js';
2
+ import type { CloudflareApiClient, CloudflareConsumerLike, CloudflareControlPlaneConfig, CloudflareDnsRecordLike, CloudflareDurableObjectNamespaceLike, CloudflareKvNamespaceLike, CloudflareProvisionStep, CloudflareQueueLike, CloudflareR2BucketLike, CloudflareSecretsStoreLike, CloudflareZoneLike } from './types.js';
3
+ export interface CloudflareProvisioningContext {
4
+ readonly readConfig: () => CloudflareControlPlaneConfig;
5
+ readonly setConfig: (key: ConfigKey, value: unknown, persist: boolean) => void;
6
+ readonly storeSecret: (key: string, value: string) => Promise<void>;
7
+ }
8
+ export declare function ensureQueue(client: CloudflareApiClient, accountId: string, queueName: string, steps: CloudflareProvisionStep[], stepName: string): Promise<CloudflareQueueLike>;
9
+ export declare function ensureKvNamespace(context: CloudflareProvisioningContext, client: CloudflareApiClient, accountId: string, namespaceName: string, persist: boolean, steps: CloudflareProvisionStep[]): Promise<CloudflareKvNamespaceLike>;
10
+ export declare function ensureR2Bucket(context: CloudflareProvisioningContext, client: CloudflareApiClient, accountId: string, bucketName: string, persist: boolean, steps: CloudflareProvisionStep[]): Promise<CloudflareR2BucketLike>;
11
+ export declare function ensureSecretsStore(context: CloudflareProvisioningContext, client: CloudflareApiClient, accountId: string, storeName: string, persist: boolean, steps: CloudflareProvisionStep[]): Promise<CloudflareSecretsStoreLike>;
12
+ export declare function ensureTunnel(context: CloudflareProvisioningContext, client: CloudflareApiClient, input: {
13
+ readonly accountId: string;
14
+ readonly tunnelName: string;
15
+ readonly tunnelId: string;
16
+ readonly daemonHostname: string;
17
+ readonly tunnelServiceUrl: string;
18
+ readonly persist: boolean;
19
+ readonly returnGeneratedSecrets: boolean;
20
+ readonly steps: CloudflareProvisionStep[];
21
+ }): Promise<{
22
+ readonly id: string;
23
+ readonly name: string;
24
+ readonly token?: string;
25
+ readonly tokenRef?: string;
26
+ }>;
27
+ export declare function ensureAccess(context: CloudflareProvisioningContext, client: CloudflareApiClient, input: {
28
+ readonly accountId: string;
29
+ readonly zone?: CloudflareZoneLike;
30
+ readonly daemonHostname: string;
31
+ readonly accessAppId: string;
32
+ readonly accessServiceTokenId: string;
33
+ readonly accessServiceTokenRef: string;
34
+ readonly persist: boolean;
35
+ readonly returnGeneratedSecrets: boolean;
36
+ readonly steps: CloudflareProvisionStep[];
37
+ }): Promise<{
38
+ readonly appId?: string;
39
+ readonly serviceTokenId?: string;
40
+ readonly serviceTokenRef?: string;
41
+ readonly clientId?: string;
42
+ readonly clientSecret?: string;
43
+ }>;
44
+ export declare function configureDns(client: CloudflareApiClient, input: {
45
+ readonly enabled: boolean;
46
+ readonly zone?: CloudflareZoneLike;
47
+ readonly daemonHostname: string;
48
+ readonly tunnelId: string;
49
+ readonly workerHostname: string;
50
+ readonly workerBaseUrl: string;
51
+ readonly steps: CloudflareProvisionStep[];
52
+ }): Promise<readonly CloudflareDnsRecordLike[]>;
53
+ export declare function findDurableObjectNamespace(context: CloudflareProvisioningContext, client: CloudflareApiClient, accountId: string, namespaceName: string, persist: boolean, steps: CloudflareProvisionStep[]): Promise<CloudflareDurableObjectNamespaceLike | undefined>;
54
+ export declare function uploadWorker(client: CloudflareApiClient, input: {
55
+ readonly accountId: string;
56
+ readonly workerName: string;
57
+ readonly queueName: string;
58
+ readonly daemonBaseUrl: string;
59
+ readonly queueJobPayloads: boolean;
60
+ readonly kvNamespaceId: string;
61
+ readonly r2BucketName: string;
62
+ readonly durableObject: boolean;
63
+ }): Promise<void>;
64
+ export declare function configureWorkerSubdomain(context: CloudflareProvisioningContext, client: CloudflareApiClient, input: {
65
+ readonly accountId: string;
66
+ readonly workerName: string;
67
+ readonly requestedSubdomain?: string;
68
+ readonly enableWorkersDev: boolean;
69
+ readonly steps: CloudflareProvisionStep[];
70
+ readonly persist: boolean;
71
+ }): Promise<string>;
72
+ export declare function ensureQueueConsumer(client: CloudflareApiClient, input: {
73
+ readonly accountId: string;
74
+ readonly queueId: string;
75
+ readonly workerName: string;
76
+ readonly deadLetterQueueName: string;
77
+ readonly steps: CloudflareProvisionStep[];
78
+ }): Promise<CloudflareConsumerLike>;
79
+ //# sourceMappingURL=resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/cloudflare/resources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,353 @@
1
+ import { summarizeError } from '../utils/error-display.js';
2
+ import { CLOUDFLARE_ACCESS_SERVICE_TOKEN_KEY, CLOUDFLARE_TUNNEL_TOKEN_KEY, DEFAULT_DO_NAMESPACE_NAME, } from './constants.js';
3
+ import { CloudflareControlPlaneError } from './types.js';
4
+ import { clean, collectAsync, hostnameFromUrl } from './utils.js';
5
+ import { GOODVIBES_CLOUDFLARE_WORKER_MODULE } from './worker-source.js';
6
+ export async function ensureQueue(client, accountId, queueName, steps, stepName) {
7
+ for await (const queue of client.queues.list({ account_id: accountId })) {
8
+ if (queue.queue_name === queueName) {
9
+ steps.push({ name: stepName, status: 'ok', message: `Using existing Cloudflare Queue ${queueName}.`, resourceId: queue.queue_id });
10
+ return queue;
11
+ }
12
+ }
13
+ const created = await client.queues.create({ account_id: accountId, queue_name: queueName });
14
+ steps.push({ name: stepName, status: 'ok', message: `Created Cloudflare Queue ${queueName}.`, resourceId: created.queue_id });
15
+ return created;
16
+ }
17
+ export async function ensureKvNamespace(context, client, accountId, namespaceName, persist, steps) {
18
+ if (!client.kv) {
19
+ throw new CloudflareControlPlaneError('The Cloudflare client does not expose KV namespace APIs.', 'CLOUDFLARE_KV_API_UNAVAILABLE', 500);
20
+ }
21
+ for await (const namespace of client.kv.namespaces.list({ account_id: accountId })) {
22
+ if (namespace.title === namespaceName) {
23
+ context.setConfig('cloudflare.kvNamespaceName', namespaceName, persist);
24
+ if (namespace.id)
25
+ context.setConfig('cloudflare.kvNamespaceId', namespace.id, persist);
26
+ steps.push({ name: 'kv-namespace', status: 'ok', message: `Using existing KV namespace ${namespaceName}.`, resourceId: namespace.id });
27
+ return namespace;
28
+ }
29
+ }
30
+ const created = await client.kv.namespaces.create({ account_id: accountId, title: namespaceName });
31
+ context.setConfig('cloudflare.kvNamespaceName', namespaceName, persist);
32
+ if (created.id)
33
+ context.setConfig('cloudflare.kvNamespaceId', created.id, persist);
34
+ steps.push({ name: 'kv-namespace', status: 'ok', message: `Created KV namespace ${namespaceName}.`, resourceId: created.id });
35
+ return created;
36
+ }
37
+ export async function ensureR2Bucket(context, client, accountId, bucketName, persist, steps) {
38
+ if (!client.r2) {
39
+ throw new CloudflareControlPlaneError('The Cloudflare client does not expose R2 bucket APIs.', 'CLOUDFLARE_R2_API_UNAVAILABLE', 500);
40
+ }
41
+ const existing = (await client.r2.buckets.list({ account_id: accountId })).buckets?.find((bucket) => bucket.name === bucketName);
42
+ if (existing) {
43
+ context.setConfig('cloudflare.r2BucketName', bucketName, persist);
44
+ steps.push({ name: 'r2-bucket', status: 'ok', message: `Using existing R2 Standard bucket ${bucketName}.`, resourceId: bucketName });
45
+ return existing;
46
+ }
47
+ const created = await client.r2.buckets.create({ account_id: accountId, name: bucketName, storageClass: 'Standard' });
48
+ context.setConfig('cloudflare.r2BucketName', bucketName, persist);
49
+ steps.push({ name: 'r2-bucket', status: 'ok', message: `Created R2 Standard bucket ${bucketName}.`, resourceId: bucketName });
50
+ return created.name ? created : { ...created, name: bucketName, storage_class: 'Standard' };
51
+ }
52
+ export async function ensureSecretsStore(context, client, accountId, storeName, persist, steps) {
53
+ if (!client.secretsStore) {
54
+ throw new CloudflareControlPlaneError('The Cloudflare client does not expose Secrets Store APIs.', 'CLOUDFLARE_SECRETS_STORE_API_UNAVAILABLE', 500);
55
+ }
56
+ for await (const store of client.secretsStore.stores.list({ account_id: accountId })) {
57
+ if (store.name === storeName) {
58
+ context.setConfig('cloudflare.secretsStoreName', storeName, persist);
59
+ context.setConfig('cloudflare.secretsStoreId', store.id, persist);
60
+ steps.push({ name: 'secrets-store', status: 'ok', message: `Using existing Cloudflare Secrets Store ${storeName}.`, resourceId: store.id });
61
+ return store;
62
+ }
63
+ }
64
+ for await (const created of client.secretsStore.stores.create({ account_id: accountId, body: [{ name: storeName }] })) {
65
+ context.setConfig('cloudflare.secretsStoreName', storeName, persist);
66
+ context.setConfig('cloudflare.secretsStoreId', created.id, persist);
67
+ steps.push({ name: 'secrets-store', status: 'ok', message: `Created Cloudflare Secrets Store ${storeName}.`, resourceId: created.id });
68
+ return created;
69
+ }
70
+ throw new CloudflareControlPlaneError(`Cloudflare Secrets Store '${storeName}' did not return a created store.`, 'CLOUDFLARE_SECRETS_STORE_CREATE_FAILED', 502);
71
+ }
72
+ export async function ensureTunnel(context, client, input) {
73
+ const api = client.zeroTrust?.tunnels?.cloudflared;
74
+ if (!api) {
75
+ throw new CloudflareControlPlaneError('The Cloudflare client does not expose Zero Trust Tunnel APIs.', 'CLOUDFLARE_TUNNEL_API_UNAVAILABLE', 500);
76
+ }
77
+ let tunnel;
78
+ if (input.tunnelId) {
79
+ tunnel = { id: input.tunnelId, name: input.tunnelName };
80
+ }
81
+ else {
82
+ for await (const existing of api.list({ account_id: input.accountId, name: input.tunnelName, is_deleted: false })) {
83
+ if (existing.name === input.tunnelName) {
84
+ tunnel = existing;
85
+ break;
86
+ }
87
+ }
88
+ if (!tunnel) {
89
+ tunnel = await api.create({ account_id: input.accountId, name: input.tunnelName, config_src: 'cloudflare' });
90
+ input.steps.push({ name: 'zero-trust-tunnel', status: 'ok', message: `Created Zero Trust Tunnel ${input.tunnelName}.`, resourceId: tunnel.id });
91
+ }
92
+ else {
93
+ input.steps.push({ name: 'zero-trust-tunnel', status: 'ok', message: `Using existing Zero Trust Tunnel ${input.tunnelName}.`, resourceId: tunnel.id });
94
+ }
95
+ }
96
+ if (!tunnel.id) {
97
+ throw new CloudflareControlPlaneError(`Zero Trust Tunnel '${input.tunnelName}' did not include an id.`, 'CLOUDFLARE_TUNNEL_ID_MISSING', 502);
98
+ }
99
+ if (input.daemonHostname && input.tunnelServiceUrl) {
100
+ await api.configurations.update(tunnel.id, {
101
+ account_id: input.accountId,
102
+ config: {
103
+ ingress: [
104
+ { hostname: input.daemonHostname, service: input.tunnelServiceUrl },
105
+ { service: 'http_status:404' },
106
+ ],
107
+ },
108
+ });
109
+ input.steps.push({ name: 'zero-trust-tunnel-config', status: 'ok', message: `Configured Tunnel ingress for ${input.daemonHostname}.` });
110
+ }
111
+ else {
112
+ input.steps.push({ name: 'zero-trust-tunnel-config', status: 'warning', message: 'Tunnel was created but no daemonHostname/tunnelServiceUrl was available for ingress configuration.' });
113
+ }
114
+ const token = await api.token.get(tunnel.id, { account_id: input.accountId });
115
+ await context.storeSecret(CLOUDFLARE_TUNNEL_TOKEN_KEY, token);
116
+ const tokenRef = `goodvibes://secrets/goodvibes/${CLOUDFLARE_TUNNEL_TOKEN_KEY}`;
117
+ context.setConfig('cloudflare.tunnelName', input.tunnelName, input.persist);
118
+ context.setConfig('cloudflare.tunnelId', tunnel.id, input.persist);
119
+ context.setConfig('cloudflare.tunnelTokenRef', tokenRef, input.persist);
120
+ input.steps.push({ name: 'zero-trust-tunnel-token', status: 'ok', message: 'Stored Tunnel token in the GoodVibes secret store.' });
121
+ return { id: tunnel.id, name: tunnel.name ?? input.tunnelName, ...(input.returnGeneratedSecrets ? { token } : {}), tokenRef };
122
+ }
123
+ export async function ensureAccess(context, client, input) {
124
+ const api = client.zeroTrust?.access;
125
+ if (!api) {
126
+ throw new CloudflareControlPlaneError('The Cloudflare client does not expose Zero Trust Access APIs.', 'CLOUDFLARE_ACCESS_API_UNAVAILABLE', 500);
127
+ }
128
+ let serviceToken = input.accessServiceTokenId ? { id: input.accessServiceTokenId } : undefined;
129
+ if (!serviceToken) {
130
+ for await (const existing of api.serviceTokens.list({ account_id: input.accountId, name: 'GoodVibes Daemon' })) {
131
+ if (existing.name === 'GoodVibes Daemon') {
132
+ serviceToken = existing;
133
+ break;
134
+ }
135
+ }
136
+ }
137
+ if (!serviceToken) {
138
+ serviceToken = await api.serviceTokens.create({ account_id: input.accountId, name: 'GoodVibes Daemon', duration: '8760h' });
139
+ input.steps.push({ name: 'zero-trust-access-service-token', status: 'ok', message: 'Created Zero Trust Access service token.', resourceId: serviceToken.id });
140
+ }
141
+ else {
142
+ input.steps.push({ name: 'zero-trust-access-service-token', status: 'ok', message: 'Using existing Zero Trust Access service token.', resourceId: serviceToken.id });
143
+ }
144
+ let serviceTokenRef = input.accessServiceTokenRef || undefined;
145
+ if (serviceToken.client_id && serviceToken.client_secret) {
146
+ await context.storeSecret(CLOUDFLARE_ACCESS_SERVICE_TOKEN_KEY, JSON.stringify({
147
+ clientId: serviceToken.client_id,
148
+ clientSecret: serviceToken.client_secret,
149
+ }));
150
+ serviceTokenRef = `goodvibes://secrets/goodvibes/${CLOUDFLARE_ACCESS_SERVICE_TOKEN_KEY}`;
151
+ context.setConfig('cloudflare.accessServiceTokenRef', serviceTokenRef, input.persist);
152
+ input.steps.push({ name: 'zero-trust-access-service-token-secret', status: 'ok', message: 'Stored Access service token credentials in the GoodVibes secret store.' });
153
+ }
154
+ else if (serviceTokenRef) {
155
+ context.setConfig('cloudflare.accessServiceTokenRef', serviceTokenRef, input.persist);
156
+ input.steps.push({ name: 'zero-trust-access-service-token-secret', status: 'ok', message: 'Using configured Access service token secret reference.' });
157
+ }
158
+ if (serviceToken.id)
159
+ context.setConfig('cloudflare.accessServiceTokenId', serviceToken.id, input.persist);
160
+ if (!input.daemonHostname || !serviceToken.id) {
161
+ input.steps.push({ name: 'zero-trust-access-app', status: 'warning', message: 'Access application was skipped because daemonHostname or service token id is missing.' });
162
+ return {
163
+ ...(serviceToken.id ? { serviceTokenId: serviceToken.id } : {}),
164
+ ...(serviceTokenRef ? { serviceTokenRef } : {}),
165
+ ...(serviceToken.client_id && input.returnGeneratedSecrets ? { clientId: serviceToken.client_id } : {}),
166
+ ...(serviceToken.client_secret && input.returnGeneratedSecrets ? { clientSecret: serviceToken.client_secret } : {}),
167
+ };
168
+ }
169
+ let app = input.accessAppId ? { id: input.accessAppId } : undefined;
170
+ if (!app) {
171
+ for await (const existing of api.applications.list({ account_id: input.accountId, domain: input.daemonHostname, exact: true })) {
172
+ if (existing.domain === input.daemonHostname) {
173
+ app = existing;
174
+ break;
175
+ }
176
+ }
177
+ }
178
+ const accessAppParams = {
179
+ account_id: input.accountId,
180
+ domain: input.daemonHostname,
181
+ type: 'self_hosted',
182
+ name: 'GoodVibes Daemon',
183
+ session_duration: '24h',
184
+ service_auth_401_redirect: true,
185
+ policies: [
186
+ {
187
+ name: 'GoodVibes service token',
188
+ decision: 'non_identity',
189
+ include: [{ service_token: { token_id: serviceToken.id } }],
190
+ },
191
+ ],
192
+ };
193
+ app = app?.id
194
+ ? await api.applications.update(app.id, accessAppParams)
195
+ : await api.applications.create(accessAppParams);
196
+ if (app.id)
197
+ context.setConfig('cloudflare.accessAppId', app.id, input.persist);
198
+ input.steps.push({ name: 'zero-trust-access-app', status: 'ok', message: `Configured Zero Trust Access application for ${input.daemonHostname}.`, resourceId: app.id });
199
+ return {
200
+ ...(app.id ? { appId: app.id } : {}),
201
+ ...(serviceToken.id ? { serviceTokenId: serviceToken.id } : {}),
202
+ ...(serviceTokenRef ? { serviceTokenRef } : {}),
203
+ ...(serviceToken.client_id && input.returnGeneratedSecrets ? { clientId: serviceToken.client_id } : {}),
204
+ ...(serviceToken.client_secret && input.returnGeneratedSecrets ? { clientSecret: serviceToken.client_secret } : {}),
205
+ };
206
+ }
207
+ export async function configureDns(client, input) {
208
+ if (!input.enabled)
209
+ return [];
210
+ if (!client.dns) {
211
+ throw new CloudflareControlPlaneError('The Cloudflare client does not expose DNS record APIs.', 'CLOUDFLARE_DNS_API_UNAVAILABLE', 500);
212
+ }
213
+ if (!input.zone) {
214
+ input.steps.push({ name: 'dns', status: 'warning', message: 'DNS automation skipped because no Cloudflare zone was selected.' });
215
+ return [];
216
+ }
217
+ const records = [];
218
+ if (input.daemonHostname && input.tunnelId) {
219
+ records.push(await ensureCnameRecord(client, input.zone.id, input.daemonHostname, `${input.tunnelId}.cfargotunnel.com`, input.steps, 'dns-daemon-hostname'));
220
+ }
221
+ const workerTarget = hostnameFromUrl(input.workerBaseUrl);
222
+ if (input.workerHostname && workerTarget) {
223
+ records.push(await ensureCnameRecord(client, input.zone.id, input.workerHostname, workerTarget, input.steps, 'dns-worker-hostname'));
224
+ }
225
+ if (records.length === 0)
226
+ input.steps.push({ name: 'dns', status: 'skipped', message: 'No daemonHostname/tunnelId or workerHostname/workerBaseUrl pair was available for DNS automation.' });
227
+ return records;
228
+ }
229
+ export async function findDurableObjectNamespace(context, client, accountId, namespaceName, persist, steps) {
230
+ if (!client.durableObjects) {
231
+ steps.push({ name: 'durable-object-namespace', status: 'warning', message: 'Durable Object namespace binding was installed on the Worker, but the client cannot list namespaces for confirmation.' });
232
+ return { name: namespaceName };
233
+ }
234
+ for await (const namespace of client.durableObjects.namespaces.list({ account_id: accountId })) {
235
+ if (namespace.name === namespaceName || namespace.class === namespaceName) {
236
+ context.setConfig('cloudflare.durableObjectNamespaceName', namespaceName, persist);
237
+ if (namespace.id)
238
+ context.setConfig('cloudflare.durableObjectNamespaceId', namespace.id, persist);
239
+ steps.push({ name: 'durable-object-namespace', status: 'ok', message: `Confirmed Durable Object namespace ${namespaceName}.`, resourceId: namespace.id });
240
+ return namespace;
241
+ }
242
+ }
243
+ steps.push({ name: 'durable-object-namespace', status: 'warning', message: 'Durable Object migration was included, but the namespace was not visible yet during confirmation.' });
244
+ return { name: namespaceName };
245
+ }
246
+ export async function uploadWorker(client, input) {
247
+ const file = new File([GOODVIBES_CLOUDFLARE_WORKER_MODULE], 'goodvibes-cloudflare-worker.mjs', { type: 'application/javascript+module' });
248
+ const bindings = [
249
+ ...(input.queueName ? [{ type: 'queue', name: 'GOODVIBES_BATCH_QUEUE', queue_name: input.queueName }] : []),
250
+ { type: 'plain_text', name: 'GOODVIBES_DAEMON_URL', text: input.daemonBaseUrl },
251
+ { type: 'plain_text', name: 'GOODVIBES_QUEUE_JOB_PAYLOADS', text: input.queueJobPayloads ? 'true' : 'false' },
252
+ ...(input.kvNamespaceId ? [{ type: 'kv_namespace', name: 'GOODVIBES_KV', namespace_id: input.kvNamespaceId }] : []),
253
+ ...(input.r2BucketName ? [{ type: 'r2_bucket', name: 'GOODVIBES_ARTIFACTS', bucket_name: input.r2BucketName }] : []),
254
+ ...(input.durableObject ? [{ type: 'durable_object_namespace', name: 'GOODVIBES_COORDINATOR', class_name: DEFAULT_DO_NAMESPACE_NAME }] : []),
255
+ ];
256
+ await client.workers.scripts.update(input.workerName, {
257
+ account_id: input.accountId,
258
+ metadata: {
259
+ main_module: 'goodvibes-cloudflare-worker.mjs',
260
+ compatibility_date: '2026-04-25',
261
+ bindings,
262
+ ...(input.durableObject ? { migrations: { tag: 'goodvibes-coordinator-v1', new_sqlite_classes: [DEFAULT_DO_NAMESPACE_NAME] } } : {}),
263
+ keep_bindings: ['secret_text'],
264
+ },
265
+ files: [file],
266
+ });
267
+ }
268
+ export async function configureWorkerSubdomain(context, client, input) {
269
+ if (!input.enableWorkersDev) {
270
+ input.steps.push({ name: 'worker-subdomain', status: 'skipped', message: 'workers.dev subdomain enablement was skipped.' });
271
+ return clean(input.requestedSubdomain) || context.readConfig().workerSubdomain;
272
+ }
273
+ let accountSubdomain = clean(input.requestedSubdomain) || context.readConfig().workerSubdomain;
274
+ if (accountSubdomain) {
275
+ const updated = await client.workers.subdomains.update({ account_id: input.accountId, subdomain: accountSubdomain });
276
+ accountSubdomain = updated.subdomain;
277
+ context.setConfig('cloudflare.workerSubdomain', accountSubdomain, input.persist);
278
+ input.steps.push({ name: 'account-worker-subdomain', status: 'ok', message: `Configured account workers.dev subdomain ${accountSubdomain}.` });
279
+ }
280
+ else {
281
+ try {
282
+ const existing = await client.workers.subdomains.get({ account_id: input.accountId });
283
+ accountSubdomain = existing.subdomain;
284
+ context.setConfig('cloudflare.workerSubdomain', accountSubdomain, input.persist);
285
+ input.steps.push({ name: 'account-worker-subdomain', status: 'ok', message: `Using account workers.dev subdomain ${accountSubdomain}.` });
286
+ }
287
+ catch (error) {
288
+ input.steps.push({
289
+ name: 'account-worker-subdomain',
290
+ status: 'warning',
291
+ message: `Could not read account workers.dev subdomain: ${summarizeError(error)}`,
292
+ });
293
+ }
294
+ }
295
+ await client.workers.scripts.subdomain.create(input.workerName, {
296
+ account_id: input.accountId,
297
+ enabled: true,
298
+ previews_enabled: false,
299
+ });
300
+ input.steps.push({ name: 'worker-subdomain', status: 'ok', message: `Enabled workers.dev route for ${input.workerName}.` });
301
+ return accountSubdomain;
302
+ }
303
+ export async function ensureQueueConsumer(client, input) {
304
+ const settings = {
305
+ batch_size: 10,
306
+ max_retries: 3,
307
+ max_wait_time_ms: 5000,
308
+ retry_delay: 60,
309
+ };
310
+ for await (const consumer of client.queues.consumers.list(input.queueId, { account_id: input.accountId })) {
311
+ if (consumer.type === 'worker' && consumer.script === input.workerName && consumer.consumer_id) {
312
+ const updated = await client.queues.consumers.update(input.queueId, consumer.consumer_id, {
313
+ account_id: input.accountId,
314
+ type: 'worker',
315
+ script_name: input.workerName,
316
+ dead_letter_queue: input.deadLetterQueueName,
317
+ settings,
318
+ });
319
+ input.steps.push({ name: 'queue-consumer', status: 'ok', message: `Updated Queue consumer for ${input.workerName}.`, resourceId: updated.consumer_id });
320
+ return updated;
321
+ }
322
+ }
323
+ const created = await client.queues.consumers.create(input.queueId, {
324
+ account_id: input.accountId,
325
+ type: 'worker',
326
+ script_name: input.workerName,
327
+ dead_letter_queue: input.deadLetterQueueName,
328
+ settings,
329
+ });
330
+ input.steps.push({ name: 'queue-consumer', status: 'ok', message: `Created Queue consumer for ${input.workerName}.`, resourceId: created.consumer_id });
331
+ return created;
332
+ }
333
+ async function ensureCnameRecord(client, zoneId, hostname, target, steps, stepName) {
334
+ const existing = await collectAsync(client.dns.records.list({ zone_id: zoneId, type: 'CNAME', name: { exact: hostname } }));
335
+ const match = existing.find((record) => record.name === hostname && record.type === 'CNAME');
336
+ const params = {
337
+ zone_id: zoneId,
338
+ type: 'CNAME',
339
+ name: hostname,
340
+ content: target,
341
+ proxied: true,
342
+ ttl: 1,
343
+ comment: 'Managed by GoodVibes SDK Cloudflare provisioning',
344
+ };
345
+ if (match?.id) {
346
+ const updated = await client.dns.records.update(match.id, params);
347
+ steps.push({ name: stepName, status: 'ok', message: `Updated CNAME ${hostname} -> ${target}.`, resourceId: updated.id });
348
+ return updated;
349
+ }
350
+ const created = await client.dns.records.create(params);
351
+ steps.push({ name: stepName, status: 'ok', message: `Created CNAME ${hostname} -> ${target}.`, resourceId: created.id });
352
+ return created;
353
+ }