@pellux/goodvibes-sdk 0.25.7 → 0.25.10

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 (130) hide show
  1. package/README.md +4 -0
  2. package/dist/_internal/contracts/artifacts/operator-contract.json +100 -4
  3. package/dist/_internal/contracts/generated/foundation-metadata.d.ts +2 -2
  4. package/dist/_internal/contracts/generated/foundation-metadata.js +2 -2
  5. package/dist/_internal/contracts/generated/operator-contract.d.ts.map +1 -1
  6. package/dist/_internal/contracts/generated/operator-contract.js +100 -4
  7. package/dist/_internal/contracts/generated/operator-method-ids.d.ts +1 -1
  8. package/dist/_internal/contracts/generated/operator-method-ids.d.ts.map +1 -1
  9. package/dist/_internal/contracts/generated/operator-method-ids.js +1 -0
  10. package/dist/_internal/daemon/context.d.ts +1 -0
  11. package/dist/_internal/daemon/context.d.ts.map +1 -1
  12. package/dist/_internal/daemon/media-route-types.d.ts +10 -0
  13. package/dist/_internal/daemon/media-route-types.d.ts.map +1 -1
  14. package/dist/_internal/daemon/media-routes.d.ts +1 -1
  15. package/dist/_internal/daemon/media-routes.d.ts.map +1 -1
  16. package/dist/_internal/daemon/media-routes.js +91 -10
  17. package/dist/_internal/daemon/operator.d.ts +1 -1
  18. package/dist/_internal/daemon/operator.d.ts.map +1 -1
  19. package/dist/_internal/daemon/operator.js +2 -0
  20. package/dist/_internal/platform/adapters/ntfy/index.js +13 -2
  21. package/dist/_internal/platform/adapters/types.d.ts +2 -0
  22. package/dist/_internal/platform/adapters/types.d.ts.map +1 -1
  23. package/dist/_internal/platform/batch/index.d.ts +4 -0
  24. package/dist/_internal/platform/batch/index.d.ts.map +1 -0
  25. package/dist/_internal/platform/batch/index.js +2 -0
  26. package/dist/_internal/platform/batch/manager.d.ts +41 -0
  27. package/dist/_internal/platform/batch/manager.d.ts.map +1 -0
  28. package/dist/_internal/platform/batch/manager.js +404 -0
  29. package/dist/_internal/platform/batch/types.d.ts +89 -0
  30. package/dist/_internal/platform/batch/types.d.ts.map +1 -0
  31. package/dist/_internal/platform/batch/types.js +10 -0
  32. package/dist/_internal/platform/channels/builtin/plugins.d.ts.map +1 -1
  33. package/dist/_internal/platform/channels/builtin/plugins.js +1 -0
  34. package/dist/_internal/platform/channels/reply-pipeline.d.ts +9 -1
  35. package/dist/_internal/platform/channels/reply-pipeline.d.ts.map +1 -1
  36. package/dist/_internal/platform/channels/reply-pipeline.js +156 -6
  37. package/dist/_internal/platform/cloudflare/client.d.ts +3 -0
  38. package/dist/_internal/platform/cloudflare/client.d.ts.map +1 -0
  39. package/dist/_internal/platform/cloudflare/client.js +9 -0
  40. package/dist/_internal/platform/cloudflare/config.d.ts +8 -0
  41. package/dist/_internal/platform/cloudflare/config.d.ts.map +1 -0
  42. package/dist/_internal/platform/cloudflare/config.js +48 -0
  43. package/dist/_internal/platform/cloudflare/constants.d.ts +18 -0
  44. package/dist/_internal/platform/cloudflare/constants.d.ts.map +1 -0
  45. package/dist/_internal/platform/cloudflare/constants.js +36 -0
  46. package/dist/_internal/platform/cloudflare/discovery.d.ts +23 -0
  47. package/dist/_internal/platform/cloudflare/discovery.d.ts.map +1 -0
  48. package/dist/_internal/platform/cloudflare/discovery.js +57 -0
  49. package/dist/_internal/platform/cloudflare/index.d.ts +6 -0
  50. package/dist/_internal/platform/cloudflare/index.d.ts.map +1 -0
  51. package/dist/_internal/platform/cloudflare/index.js +4 -0
  52. package/dist/_internal/platform/cloudflare/manager.d.ts +30 -0
  53. package/dist/_internal/platform/cloudflare/manager.d.ts.map +1 -0
  54. package/dist/_internal/platform/cloudflare/manager.js +671 -0
  55. package/dist/_internal/platform/cloudflare/resources.d.ts +79 -0
  56. package/dist/_internal/platform/cloudflare/resources.d.ts.map +1 -0
  57. package/dist/_internal/platform/cloudflare/resources.js +353 -0
  58. package/dist/_internal/platform/cloudflare/types.d.ts +689 -0
  59. package/dist/_internal/platform/cloudflare/types.d.ts.map +1 -0
  60. package/dist/_internal/platform/cloudflare/types.js +10 -0
  61. package/dist/_internal/platform/cloudflare/utils.d.ts +14 -0
  62. package/dist/_internal/platform/cloudflare/utils.d.ts.map +1 -0
  63. package/dist/_internal/platform/cloudflare/utils.js +222 -0
  64. package/dist/_internal/platform/cloudflare/worker-source.d.ts +2 -0
  65. package/dist/_internal/platform/cloudflare/worker-source.d.ts.map +1 -0
  66. package/dist/_internal/platform/cloudflare/worker-source.js +165 -0
  67. package/dist/_internal/platform/config/schema-domain-core.d.ts +6 -0
  68. package/dist/_internal/platform/config/schema-domain-core.d.ts.map +1 -1
  69. package/dist/_internal/platform/config/schema-domain-core.js +30 -0
  70. package/dist/_internal/platform/config/schema-domain-runtime.d.ts +43 -0
  71. package/dist/_internal/platform/config/schema-domain-runtime.d.ts.map +1 -1
  72. package/dist/_internal/platform/config/schema-domain-runtime.js +287 -0
  73. package/dist/_internal/platform/config/schema-types.d.ts +57 -2
  74. package/dist/_internal/platform/config/schema-types.d.ts.map +1 -1
  75. package/dist/_internal/platform/config/schema.d.ts.map +1 -1
  76. package/dist/_internal/platform/config/schema.js +3 -0
  77. package/dist/_internal/platform/control-plane/method-catalog-media.d.ts.map +1 -1
  78. package/dist/_internal/platform/control-plane/method-catalog-media.js +17 -0
  79. package/dist/_internal/platform/control-plane/routes/operator.d.ts +1 -1
  80. package/dist/_internal/platform/control-plane/routes/operator.d.ts.map +1 -1
  81. package/dist/_internal/platform/control-plane/routes/operator.js +2 -0
  82. package/dist/_internal/platform/daemon/facade-composition.d.ts +2 -0
  83. package/dist/_internal/platform/daemon/facade-composition.d.ts.map +1 -1
  84. package/dist/_internal/platform/daemon/facade-composition.js +10 -0
  85. package/dist/_internal/platform/daemon/http/batch-routes.d.ts +8 -0
  86. package/dist/_internal/platform/daemon/http/batch-routes.d.ts.map +1 -0
  87. package/dist/_internal/platform/daemon/http/batch-routes.js +113 -0
  88. package/dist/_internal/platform/daemon/http/cloudflare-routes.d.ts +7 -0
  89. package/dist/_internal/platform/daemon/http/cloudflare-routes.d.ts.map +1 -0
  90. package/dist/_internal/platform/daemon/http/cloudflare-routes.js +201 -0
  91. package/dist/_internal/platform/daemon/http/router-route-contexts.d.ts.map +1 -1
  92. package/dist/_internal/platform/daemon/http/router-route-contexts.js +1 -0
  93. package/dist/_internal/platform/daemon/http/router.d.ts +5 -1
  94. package/dist/_internal/platform/daemon/http/router.d.ts.map +1 -1
  95. package/dist/_internal/platform/daemon/http/router.js +30 -0
  96. package/dist/_internal/platform/daemon/http/runtime-route-types.d.ts +2 -0
  97. package/dist/_internal/platform/daemon/http/runtime-route-types.d.ts.map +1 -1
  98. package/dist/_internal/platform/daemon/surface-actions.d.ts +6 -0
  99. package/dist/_internal/platform/daemon/surface-actions.d.ts.map +1 -1
  100. package/dist/_internal/platform/daemon/surface-actions.js +13 -0
  101. package/dist/_internal/platform/daemon/surface-delivery.d.ts +3 -0
  102. package/dist/_internal/platform/daemon/surface-delivery.d.ts.map +1 -1
  103. package/dist/_internal/platform/daemon/surface-delivery.js +42 -6
  104. package/dist/_internal/platform/daemon/types.d.ts +2 -0
  105. package/dist/_internal/platform/daemon/types.d.ts.map +1 -1
  106. package/dist/_internal/platform/providers/anthropic.d.ts +13 -1
  107. package/dist/_internal/platform/providers/anthropic.d.ts.map +1 -1
  108. package/dist/_internal/platform/providers/anthropic.js +219 -1
  109. package/dist/_internal/platform/providers/interface.d.ts +48 -0
  110. package/dist/_internal/platform/providers/interface.d.ts.map +1 -1
  111. package/dist/_internal/platform/providers/openai.d.ts +13 -1
  112. package/dist/_internal/platform/providers/openai.d.ts.map +1 -1
  113. package/dist/_internal/platform/providers/openai.js +189 -1
  114. package/dist/_internal/platform/version.js +1 -1
  115. package/dist/_internal/platform/voice/index.d.ts +1 -1
  116. package/dist/_internal/platform/voice/index.d.ts.map +1 -1
  117. package/dist/_internal/platform/voice/providers/elevenlabs.d.ts.map +1 -1
  118. package/dist/_internal/platform/voice/providers/elevenlabs.js +150 -4
  119. package/dist/_internal/platform/voice/service.d.ts +2 -1
  120. package/dist/_internal/platform/voice/service.d.ts.map +1 -1
  121. package/dist/_internal/platform/voice/service.js +7 -0
  122. package/dist/_internal/platform/voice/types.d.ts +18 -1
  123. package/dist/_internal/platform/voice/types.d.ts.map +1 -1
  124. package/dist/index.d.ts +2 -0
  125. package/dist/index.d.ts.map +1 -1
  126. package/dist/index.js +1 -0
  127. package/dist/workers.d.ts +43 -0
  128. package/dist/workers.d.ts.map +1 -0
  129. package/dist/workers.js +156 -0
  130. package/package.json +6 -1
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/channels/builtin/plugins.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/channels/builtin/plugins.ts"],"names":[],"mappings":"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"}
@@ -126,6 +126,7 @@ export function registerBuiltinChannelPlugins(context) {
126
126
  webhookPath: '/webhook/ntfy',
127
127
  handleInbound: (req) => handleNtfySurfaceWebhook(req, context.deps.buildSurfaceAdapterContext()),
128
128
  deliverReply: (pending, message) => context.deps.deliverNtfyAgentReply(pending, message),
129
+ deliverProgress: (pending, progress) => context.deps.deliverSurfaceProgress(pending, progress),
129
130
  notifyApproval: (approval, binding) => context.deps.deliverNtfyApprovalUpdate(approval, binding),
130
131
  getStatus: async () => ({
131
132
  id: 'surface:ntfy',
@@ -6,6 +6,8 @@ export interface TrackedChannelReply {
6
6
  readonly agentId: string;
7
7
  readonly surfaceKind: ChannelSurface;
8
8
  readonly task: string;
9
+ readonly agentTask?: string;
10
+ readonly workflowChainId?: string;
9
11
  readonly createdAt: number;
10
12
  readonly sessionId?: string;
11
13
  readonly routeId?: string;
@@ -23,6 +25,7 @@ export declare class ChannelReplyPipeline {
23
25
  private readonly routeBindings;
24
26
  private readonly now;
25
27
  private readonly buffers;
28
+ private readonly workflowChains;
26
29
  private readonly unsubscribers;
27
30
  constructor(deps: ReplyPipelineDeps);
28
31
  attachRuntimeBus(runtimeBus: RuntimeEventBus | null): void;
@@ -32,9 +35,14 @@ export declare class ChannelReplyPipeline {
32
35
  has(agentId: string): boolean;
33
36
  getPending(agentId: string): TrackedChannelReply | null;
34
37
  deliverProgress(agentId: string, explicitText?: string, force?: boolean): Promise<ChannelRenderResult | null>;
35
- deliverFinal(agentId: string, explicitText: string): Promise<ChannelRenderResult | null>;
38
+ deliverFinal(agentId: string, explicitText: string, options?: {
39
+ readonly keepTracking?: boolean;
40
+ }): Promise<ChannelRenderResult | null>;
36
41
  private handleEnvelope;
42
+ private handleWorkflowEnvelope;
37
43
  private trackChildPendingReply;
44
+ private findPendingForWorkflowTask;
45
+ private associateWorkflowChain;
38
46
  private resolvePolicy;
39
47
  private dispatch;
40
48
  private disposeSubscriptions;
@@ -1 +1 @@
1
- {"version":3,"file":"reply-pipeline.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/channels/reply-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AACzG,OAAO,KAAK,EACV,kBAAkB,EAIlB,mBAAmB,EAEnB,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAK9D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED,UAAU,iBAAiB;IACzB,QAAQ,CAAC,cAAc,EAAE,qBAAqB,CAAC;IAC/C,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC;IAC5C,QAAQ,CAAC,UAAU,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAC7C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B;AA+OD,wBAAgB,sCAAsC,CACpD,QAAQ,EAAE,oBAAoB,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,GACvE,kBAAkB,EAAE,CAyFtB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;IACvD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsB;IACpD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAC/D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;gBAE3C,IAAI,EAAE,iBAAiB;IAOnC,gBAAgB,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IAmB1D,OAAO,IAAI,IAAI;IAKf,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAOhD,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7B,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI;IAIjD,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAe3G,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAwBhF,cAAc;IAsC5B,OAAO,CAAC,sBAAsB;YAmBhB,aAAa;YAIb,QAAQ;IAgCtB,OAAO,CAAC,oBAAoB;CAK7B"}
1
+ {"version":3,"file":"reply-pipeline.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/channels/reply-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,eAAe,EAAiB,MAAM,4BAA4B,CAAC;AACxH,OAAO,KAAK,EACV,kBAAkB,EAIlB,mBAAmB,EAEnB,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAK9D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED,UAAU,iBAAiB;IACzB,QAAQ,CAAC,cAAc,EAAE,qBAAqB,CAAC;IAC/C,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC;IAC5C,QAAQ,CAAC,UAAU,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAC7C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B;AA+PD,wBAAgB,sCAAsC,CACpD,QAAQ,EAAE,oBAAoB,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,GACvE,kBAAkB,EAAE,CAqItB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;IACvD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsB;IACpD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAC/D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;IAC5D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;gBAE3C,IAAI,EAAE,iBAAiB;IAOnC,gBAAgB,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IAoB1D,OAAO,IAAI,IAAI;IAMf,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAUhD,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAS9B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7B,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI;IAIjD,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAe3G,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE;QAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAO,GAChD,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;YA0BxB,cAAc;YAiDd,sBAAsB;IAsCpC,OAAO,CAAC,sBAAsB;IAmB9B,OAAO,CAAC,0BAA0B;IAgBlC,OAAO,CAAC,sBAAsB;YAahB,aAAa;YAIb,QAAQ;IAgCtB,OAAO,CAAC,oBAAoB;CAK7B"}
@@ -194,7 +194,10 @@ function buildRenderedText(explicitText, events, policy, phase) {
194
194
  if (phase === 'final' && explicitText.trim().length > 0) {
195
195
  return trimText(explicitText, policy.maxChunkChars);
196
196
  }
197
- const lines = events
197
+ const renderableEvents = policy.surface === 'ntfy'
198
+ ? events.filter((event) => event.kind !== 'assistant_text' && event.kind !== 'reasoning')
199
+ : events;
200
+ const lines = renderableEvents
198
201
  .slice(-policy.maxEventsPerUpdate)
199
202
  .map((event) => eventLine(event, policy.reasoningVisibility))
200
203
  .filter((line) => Boolean(line && line.trim().length > 0));
@@ -217,6 +220,16 @@ function resolveEnvelopeAgentId(envelope) {
217
220
  const payload = envelope.payload;
218
221
  return typeof payload.agentId === 'string' ? payload.agentId : null;
219
222
  }
223
+ function isWorkflowEventPayload(payload) {
224
+ return payload.type.startsWith('WORKFLOW_');
225
+ }
226
+ function resolveEnvelopeWorkflowChainId(envelope) {
227
+ const payload = envelope.payload;
228
+ return typeof payload.chainId === 'string' && payload.chainId.length > 0 ? payload.chainId : null;
229
+ }
230
+ function isAgentFinalEvent(type) {
231
+ return type === 'AGENT_COMPLETED' || type === 'AGENT_FAILED' || type === 'AGENT_CANCELLED';
232
+ }
220
233
  export function normalizeChannelRenderEventFromRuntime(envelope) {
221
234
  const payload = envelope.payload;
222
235
  switch (payload.type) {
@@ -297,6 +310,50 @@ export function normalizeChannelRenderEventFromRuntime(envelope) {
297
310
  return [renderEvent(payload.type === 'COMPACTION_FAILED' ? 'error' : 'compaction', 'progress', envelope, {
298
311
  text: payload.type.replace(/^COMPACTION_/, '').toLowerCase().replace(/_/g, ' '),
299
312
  })];
313
+ case 'WORKFLOW_CHAIN_CREATED':
314
+ return [renderEvent('status', 'progress', envelope, {
315
+ text: `WRFC chain ${payload.chainId.slice(0, 12)} started: ${trimText(payload.task, 180)}`,
316
+ })];
317
+ case 'WORKFLOW_STATE_CHANGED':
318
+ return [renderEvent('status', 'progress', envelope, {
319
+ text: `WRFC chain ${payload.chainId.slice(0, 12)} moved from ${payload.from} to ${payload.to}`,
320
+ })];
321
+ case 'WORKFLOW_REVIEW_COMPLETED': {
322
+ const constraintSummary = typeof payload.constraintsSatisfied === 'number' && typeof payload.constraintsTotal === 'number'
323
+ ? `, constraints ${payload.constraintsSatisfied}/${payload.constraintsTotal}`
324
+ : '';
325
+ return [renderEvent(payload.passed ? 'status' : 'error', 'progress', envelope, {
326
+ text: `WRFC review ${payload.passed ? 'passed' : 'needs fixes'}: score ${payload.score}/10${constraintSummary}`,
327
+ })];
328
+ }
329
+ case 'WORKFLOW_FIX_ATTEMPTED':
330
+ return [renderEvent('status', 'progress', envelope, {
331
+ text: `WRFC fix attempt ${payload.attempt}/${payload.maxAttempts} started`,
332
+ })];
333
+ case 'WORKFLOW_GATE_RESULT':
334
+ return [renderEvent(payload.passed ? 'status' : 'error', 'progress', envelope, {
335
+ text: `WRFC gate ${payload.gate} ${payload.passed ? 'passed' : 'failed'}`,
336
+ })];
337
+ case 'WORKFLOW_AUTO_COMMITTED':
338
+ return [renderEvent('status', 'progress', envelope, {
339
+ text: `WRFC changes committed${payload.commitHash ? `: ${payload.commitHash}` : ''}`,
340
+ })];
341
+ case 'WORKFLOW_CASCADE_ABORTED':
342
+ return [renderEvent('error', 'progress', envelope, {
343
+ text: `WRFC cascade warning: ${payload.reason}`,
344
+ })];
345
+ case 'WORKFLOW_CONSTRAINTS_ENUMERATED':
346
+ return [renderEvent('status', 'progress', envelope, {
347
+ text: `WRFC constraints enumerated: ${payload.constraints.length}`,
348
+ })];
349
+ case 'WORKFLOW_CHAIN_PASSED':
350
+ return [renderEvent('status', 'final', envelope, {
351
+ text: `WRFC chain ${payload.chainId.slice(0, 12)} passed`,
352
+ })];
353
+ case 'WORKFLOW_CHAIN_FAILED':
354
+ return [renderEvent('error', 'final', envelope, {
355
+ text: `WRFC chain ${payload.chainId.slice(0, 12)} failed: ${payload.reason}`,
356
+ })];
300
357
  case 'TURN_COMPLETED':
301
358
  return payload.response.trim().length > 0
302
359
  ? [renderEvent('assistant_text', 'final', envelope, { text: payload.response })]
@@ -312,6 +369,7 @@ export class ChannelReplyPipeline {
312
369
  routeBindings;
313
370
  now;
314
371
  buffers = new Map();
372
+ workflowChains = new Map();
315
373
  unsubscribers = [];
316
374
  constructor(deps) {
317
375
  this.channelPlugins = deps.channelPlugins;
@@ -331,6 +389,7 @@ export class ChannelReplyPipeline {
331
389
  'permissions',
332
390
  'providers',
333
391
  'compaction',
392
+ 'workflows',
334
393
  ];
335
394
  for (const domain of domains) {
336
395
  this.unsubscribers.push(runtimeBus.onDomain(domain, (envelope) => {
@@ -341,15 +400,24 @@ export class ChannelReplyPipeline {
341
400
  dispose() {
342
401
  this.disposeSubscriptions();
343
402
  this.buffers.clear();
403
+ this.workflowChains.clear();
344
404
  }
345
405
  trackPending(pending) {
346
406
  this.buffers.set(pending.agentId, {
347
407
  pending,
348
408
  events: [],
349
409
  });
410
+ if (typeof pending.workflowChainId === 'string' && pending.workflowChainId.length > 0) {
411
+ this.workflowChains.set(pending.workflowChainId, pending.agentId);
412
+ }
350
413
  }
351
414
  untrack(agentId) {
352
415
  this.buffers.delete(agentId);
416
+ for (const [chainId, mappedAgentId] of this.workflowChains.entries()) {
417
+ if (mappedAgentId === agentId) {
418
+ this.workflowChains.delete(chainId);
419
+ }
420
+ }
353
421
  }
354
422
  has(agentId) {
355
423
  return this.buffers.has(agentId);
@@ -362,7 +430,7 @@ export class ChannelReplyPipeline {
362
430
  if (!state)
363
431
  return null;
364
432
  const policy = await this.resolvePolicy(state.pending.surfaceKind);
365
- const text = buildRenderedText(explicitText ?? '', state.events, policy, 'progress');
433
+ const text = buildRenderedText(policy.surface === 'ntfy' ? '' : explicitText ?? '', state.events, policy, 'progress');
366
434
  if (!text)
367
435
  return null;
368
436
  if (!force && state.lastDeliveredText === text && (this.now() - (state.lastDeliveredAt ?? 0)) < DEFAULT_PROGRESS_INTERVAL_MS) {
@@ -373,7 +441,7 @@ export class ChannelReplyPipeline {
373
441
  state.lastDeliveredAt = this.now();
374
442
  return result;
375
443
  }
376
- async deliverFinal(agentId, explicitText) {
444
+ async deliverFinal(agentId, explicitText, options = {}) {
377
445
  const state = this.buffers.get(agentId);
378
446
  if (!state)
379
447
  return null;
@@ -388,10 +456,16 @@ export class ChannelReplyPipeline {
388
456
  metadata: {},
389
457
  };
390
458
  const result = await this.dispatch(state, policy, 'final', buildRenderedText(explicitText, finalEvents.length > 0 ? finalEvents : [...state.events, statusEvent], policy, 'final'), finalEvents.length > 0 ? finalEvents : [...state.events.slice(-policy.maxEventsPerUpdate + 1), statusEvent]);
391
- this.untrack(agentId);
459
+ if (!options.keepTracking) {
460
+ this.untrack(agentId);
461
+ }
392
462
  return result;
393
463
  }
394
464
  async handleEnvelope(envelope) {
465
+ if (isWorkflowEventPayload(envelope.payload)) {
466
+ await this.handleWorkflowEnvelope(envelope);
467
+ return;
468
+ }
395
469
  if (envelope.payload.type === 'AGENT_SPAWNING'
396
470
  && typeof envelope.payload.parentAgentId === 'string'
397
471
  && envelope.payload.parentAgentId.length > 0) {
@@ -412,17 +486,62 @@ export class ChannelReplyPipeline {
412
486
  }
413
487
  const hasFinal = events.some((event) => event.phase === 'final');
414
488
  if (hasFinal) {
489
+ const finalKinds = state.pending.surfaceKind === 'ntfy'
490
+ ? new Set(['error', 'status'])
491
+ : new Set(['assistant_text', 'error', 'status']);
415
492
  const text = events
416
- .filter((event) => event.kind === 'assistant_text' || event.kind === 'error' || event.kind === 'status')
493
+ .filter((event) => finalKinds.has(event.kind))
417
494
  .map((event) => event.text ?? '')
418
495
  .filter(Boolean)
419
496
  .join('\n')
420
497
  .trim();
421
- await this.deliverFinal(agentId, text);
498
+ await this.deliverFinal(agentId, text, {
499
+ keepTracking: state.pending.surfaceKind === 'ntfy'
500
+ && typeof state.pending.workflowChainId === 'string'
501
+ && isAgentFinalEvent(envelope.payload.type),
502
+ });
422
503
  return;
423
504
  }
424
505
  await this.deliverProgress(agentId);
425
506
  }
507
+ async handleWorkflowEnvelope(envelope) {
508
+ if (envelope.payload.type === 'WORKFLOW_CHAIN_CREATED') {
509
+ const matched = this.findPendingForWorkflowTask(envelope.payload.task);
510
+ if (matched) {
511
+ this.associateWorkflowChain(matched.pending.agentId, envelope.payload.chainId);
512
+ }
513
+ }
514
+ const chainId = resolveEnvelopeWorkflowChainId(envelope);
515
+ if (!chainId)
516
+ return;
517
+ const agentId = this.workflowChains.get(chainId);
518
+ if (!agentId)
519
+ return;
520
+ const state = this.buffers.get(agentId);
521
+ if (!state) {
522
+ this.workflowChains.delete(chainId);
523
+ return;
524
+ }
525
+ const events = normalizeChannelRenderEventFromRuntime(envelope);
526
+ if (events.length === 0)
527
+ return;
528
+ state.events.push(...events);
529
+ if (state.events.length > MAX_BUFFERED_EVENTS) {
530
+ state.events.splice(0, state.events.length - MAX_BUFFERED_EVENTS);
531
+ }
532
+ const hasFinal = events.some((event) => event.phase === 'final');
533
+ if (hasFinal) {
534
+ const text = events
535
+ .filter((event) => event.kind === 'error' || event.kind === 'status')
536
+ .map((event) => event.text ?? '')
537
+ .filter(Boolean)
538
+ .join('\n')
539
+ .trim();
540
+ await this.deliverFinal(agentId, text);
541
+ return;
542
+ }
543
+ await this.deliverProgress(agentId, undefined, true);
544
+ }
426
545
  trackChildPendingReply(agentId, parentAgentId, task) {
427
546
  if (this.buffers.has(agentId))
428
547
  return;
@@ -443,6 +562,37 @@ export class ChannelReplyPipeline {
443
562
  events: [],
444
563
  });
445
564
  }
565
+ findPendingForWorkflowTask(task) {
566
+ const normalizedTask = task.trim();
567
+ if (!normalizedTask)
568
+ return null;
569
+ let fallback = null;
570
+ for (const state of this.buffers.values()) {
571
+ if (typeof state.pending.workflowChainId === 'string')
572
+ continue;
573
+ const agentTask = typeof state.pending.agentTask === 'string' ? state.pending.agentTask.trim() : '';
574
+ const pendingTask = state.pending.task.trim();
575
+ if (agentTask === normalizedTask)
576
+ return state;
577
+ if (!fallback && pendingTask === normalizedTask) {
578
+ fallback = state;
579
+ }
580
+ }
581
+ return fallback;
582
+ }
583
+ associateWorkflowChain(agentId, chainId) {
584
+ const state = this.buffers.get(agentId);
585
+ if (!state)
586
+ return;
587
+ this.workflowChains.set(chainId, agentId);
588
+ this.buffers.set(agentId, {
589
+ ...state,
590
+ pending: {
591
+ ...state.pending,
592
+ workflowChainId: chainId,
593
+ },
594
+ });
595
+ }
446
596
  async resolvePolicy(surface) {
447
597
  return await this.channelPlugins.getRenderPolicy(surface) ?? DEFAULT_POLICY[surface];
448
598
  }
@@ -0,0 +1,3 @@
1
+ import type { CloudflareApiClient } from './types.js';
2
+ export declare function createCloudflareApiClient(apiToken: string): Promise<CloudflareApiClient>;
3
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/cloudflare/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,wBAAsB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAQ9F"}
@@ -0,0 +1,9 @@
1
+ export async function createCloudflareApiClient(apiToken) {
2
+ const mod = await import('cloudflare');
3
+ const Cloudflare = mod.default;
4
+ return new Cloudflare({
5
+ apiToken,
6
+ maxRetries: 2,
7
+ timeout: 30_000,
8
+ });
9
+ }
@@ -0,0 +1,8 @@
1
+ import type { ConfigKey } from '../config/schema.js';
2
+ import type { CloudflareControlPlaneConfig } from './types.js';
3
+ interface CloudflareConfigReader {
4
+ get(key: ConfigKey): unknown;
5
+ }
6
+ export declare function readCloudflareConfig(configManager: CloudflareConfigReader): CloudflareControlPlaneConfig;
7
+ export {};
8
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/cloudflare/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAYrD,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAE/D,UAAU,sBAAsB;IAC9B,GAAG,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC;CAC9B;AAED,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,sBAAsB,GAAG,4BAA4B,CAkCxG"}
@@ -0,0 +1,48 @@
1
+ import { DEFAULT_DLQ_NAME, DEFAULT_DO_NAMESPACE_NAME, DEFAULT_KV_NAMESPACE_NAME, DEFAULT_QUEUE_NAME, DEFAULT_R2_BUCKET_NAME, DEFAULT_SECRETS_STORE_NAME, DEFAULT_TUNNEL_NAME, DEFAULT_WORKER_CRON, DEFAULT_WORKER_NAME, } from './constants.js';
2
+ export function readCloudflareConfig(configManager) {
3
+ return {
4
+ enabled: getBooleanConfig(configManager, 'cloudflare.enabled', false),
5
+ freeTierMode: getBooleanConfig(configManager, 'cloudflare.freeTierMode', true),
6
+ accountId: getStringConfig(configManager, 'cloudflare.accountId', ''),
7
+ apiTokenRef: getStringConfig(configManager, 'cloudflare.apiTokenRef', ''),
8
+ zoneId: getStringConfig(configManager, 'cloudflare.zoneId', ''),
9
+ zoneName: getStringConfig(configManager, 'cloudflare.zoneName', ''),
10
+ workerName: getStringConfig(configManager, 'cloudflare.workerName', DEFAULT_WORKER_NAME),
11
+ workerSubdomain: getStringConfig(configManager, 'cloudflare.workerSubdomain', ''),
12
+ workerHostname: getStringConfig(configManager, 'cloudflare.workerHostname', ''),
13
+ workerBaseUrl: getStringConfig(configManager, 'cloudflare.workerBaseUrl', ''),
14
+ daemonBaseUrl: getStringConfig(configManager, 'cloudflare.daemonBaseUrl', ''),
15
+ daemonHostname: getStringConfig(configManager, 'cloudflare.daemonHostname', ''),
16
+ workerTokenRef: getStringConfig(configManager, 'cloudflare.workerTokenRef', ''),
17
+ workerClientTokenRef: getStringConfig(configManager, 'cloudflare.workerClientTokenRef', ''),
18
+ workerCron: getStringConfig(configManager, 'cloudflare.workerCron', DEFAULT_WORKER_CRON),
19
+ queueName: getStringConfig(configManager, 'cloudflare.queueName', DEFAULT_QUEUE_NAME),
20
+ deadLetterQueueName: getStringConfig(configManager, 'cloudflare.deadLetterQueueName', DEFAULT_DLQ_NAME),
21
+ tunnelName: getStringConfig(configManager, 'cloudflare.tunnelName', DEFAULT_TUNNEL_NAME),
22
+ tunnelId: getStringConfig(configManager, 'cloudflare.tunnelId', ''),
23
+ tunnelTokenRef: getStringConfig(configManager, 'cloudflare.tunnelTokenRef', ''),
24
+ accessAppId: getStringConfig(configManager, 'cloudflare.accessAppId', ''),
25
+ accessServiceTokenId: getStringConfig(configManager, 'cloudflare.accessServiceTokenId', ''),
26
+ accessServiceTokenRef: getStringConfig(configManager, 'cloudflare.accessServiceTokenRef', ''),
27
+ kvNamespaceName: getStringConfig(configManager, 'cloudflare.kvNamespaceName', DEFAULT_KV_NAMESPACE_NAME),
28
+ kvNamespaceId: getStringConfig(configManager, 'cloudflare.kvNamespaceId', ''),
29
+ durableObjectNamespaceName: getStringConfig(configManager, 'cloudflare.durableObjectNamespaceName', DEFAULT_DO_NAMESPACE_NAME),
30
+ durableObjectNamespaceId: getStringConfig(configManager, 'cloudflare.durableObjectNamespaceId', ''),
31
+ r2BucketName: getStringConfig(configManager, 'cloudflare.r2BucketName', DEFAULT_R2_BUCKET_NAME),
32
+ secretsStoreName: getStringConfig(configManager, 'cloudflare.secretsStoreName', DEFAULT_SECRETS_STORE_NAME),
33
+ secretsStoreId: getStringConfig(configManager, 'cloudflare.secretsStoreId', ''),
34
+ maxQueueOpsPerDay: getNumberConfig(configManager, 'cloudflare.maxQueueOpsPerDay', 10_000),
35
+ };
36
+ }
37
+ function getStringConfig(configManager, key, fallback) {
38
+ const value = configManager.get(key);
39
+ return typeof value === 'string' ? value : fallback;
40
+ }
41
+ function getBooleanConfig(configManager, key, fallback) {
42
+ const value = configManager.get(key);
43
+ return typeof value === 'boolean' ? value : fallback;
44
+ }
45
+ function getNumberConfig(configManager, key, fallback) {
46
+ const value = configManager.get(key);
47
+ return typeof value === 'number' && Number.isFinite(value) ? value : fallback;
48
+ }
@@ -0,0 +1,18 @@
1
+ import type { CloudflareComponent } from './types.js';
2
+ export declare const DEFAULT_WORKER_NAME = "goodvibes-batch-worker";
3
+ export declare const DEFAULT_QUEUE_NAME = "goodvibes-batch";
4
+ export declare const DEFAULT_DLQ_NAME = "goodvibes-batch-dlq";
5
+ export declare const DEFAULT_WORKER_CRON = "*/5 * * * *";
6
+ export declare const DEFAULT_TUNNEL_NAME = "goodvibes-daemon";
7
+ export declare const DEFAULT_KV_NAMESPACE_NAME = "goodvibes-runtime";
8
+ export declare const DEFAULT_DO_NAMESPACE_NAME = "GoodVibesCoordinator";
9
+ export declare const DEFAULT_R2_BUCKET_NAME = "goodvibes-artifacts";
10
+ export declare const DEFAULT_SECRETS_STORE_NAME = "goodvibes";
11
+ export declare const CLOUDFLARE_API_TOKEN_KEY = "CLOUDFLARE_API_TOKEN";
12
+ export declare const CLOUDFLARE_TUNNEL_TOKEN_KEY = "GOODVIBES_CLOUDFLARE_TUNNEL_TOKEN";
13
+ export declare const CLOUDFLARE_ACCESS_SERVICE_TOKEN_KEY = "GOODVIBES_CLOUDFLARE_ACCESS_SERVICE_TOKEN";
14
+ export declare const CLOUDFLARE_WORKER_CLIENT_TOKEN_KEY = "GOODVIBES_CLOUDFLARE_WORKER_TOKEN";
15
+ export declare const CLOUDFLARE_WORKER_OPERATOR_TOKEN_KEY = "GOODVIBES_CLOUDFLARE_OPERATOR_TOKEN";
16
+ export declare const COMPONENT_ORDER: readonly CloudflareComponent[];
17
+ export declare const DEFAULT_COMPONENTS: Readonly<Record<CloudflareComponent, boolean>>;
18
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/cloudflare/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAC5D,eAAO,MAAM,kBAAkB,oBAAoB,CAAC;AACpD,eAAO,MAAM,gBAAgB,wBAAwB,CAAC;AACtD,eAAO,MAAM,mBAAmB,gBAAgB,CAAC;AACjD,eAAO,MAAM,mBAAmB,qBAAqB,CAAC;AACtD,eAAO,MAAM,yBAAyB,sBAAsB,CAAC;AAC7D,eAAO,MAAM,yBAAyB,yBAAyB,CAAC;AAChE,eAAO,MAAM,sBAAsB,wBAAwB,CAAC;AAC5D,eAAO,MAAM,0BAA0B,cAAc,CAAC;AACtD,eAAO,MAAM,wBAAwB,yBAAyB,CAAC;AAC/D,eAAO,MAAM,2BAA2B,sCAAsC,CAAC;AAC/E,eAAO,MAAM,mCAAmC,8CAA8C,CAAC;AAC/F,eAAO,MAAM,kCAAkC,sCAAsC,CAAC;AACtF,eAAO,MAAM,oCAAoC,wCAAwC,CAAC;AAE1F,eAAO,MAAM,eAAe,EAAE,SAAS,mBAAmB,EAUzD,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAU7E,CAAC"}
@@ -0,0 +1,36 @@
1
+ export const DEFAULT_WORKER_NAME = 'goodvibes-batch-worker';
2
+ export const DEFAULT_QUEUE_NAME = 'goodvibes-batch';
3
+ export const DEFAULT_DLQ_NAME = 'goodvibes-batch-dlq';
4
+ export const DEFAULT_WORKER_CRON = '*/5 * * * *';
5
+ export const DEFAULT_TUNNEL_NAME = 'goodvibes-daemon';
6
+ export const DEFAULT_KV_NAMESPACE_NAME = 'goodvibes-runtime';
7
+ export const DEFAULT_DO_NAMESPACE_NAME = 'GoodVibesCoordinator';
8
+ export const DEFAULT_R2_BUCKET_NAME = 'goodvibes-artifacts';
9
+ export const DEFAULT_SECRETS_STORE_NAME = 'goodvibes';
10
+ export const CLOUDFLARE_API_TOKEN_KEY = 'CLOUDFLARE_API_TOKEN';
11
+ export const CLOUDFLARE_TUNNEL_TOKEN_KEY = 'GOODVIBES_CLOUDFLARE_TUNNEL_TOKEN';
12
+ export const CLOUDFLARE_ACCESS_SERVICE_TOKEN_KEY = 'GOODVIBES_CLOUDFLARE_ACCESS_SERVICE_TOKEN';
13
+ export const CLOUDFLARE_WORKER_CLIENT_TOKEN_KEY = 'GOODVIBES_CLOUDFLARE_WORKER_TOKEN';
14
+ export const CLOUDFLARE_WORKER_OPERATOR_TOKEN_KEY = 'GOODVIBES_CLOUDFLARE_OPERATOR_TOKEN';
15
+ export const COMPONENT_ORDER = [
16
+ 'workers',
17
+ 'queues',
18
+ 'zeroTrustTunnel',
19
+ 'zeroTrustAccess',
20
+ 'dns',
21
+ 'kv',
22
+ 'durableObjects',
23
+ 'secretsStore',
24
+ 'r2',
25
+ ];
26
+ export const DEFAULT_COMPONENTS = {
27
+ workers: true,
28
+ queues: true,
29
+ zeroTrustTunnel: false,
30
+ zeroTrustAccess: false,
31
+ dns: false,
32
+ kv: false,
33
+ durableObjects: false,
34
+ secretsStore: false,
35
+ r2: false,
36
+ };
@@ -0,0 +1,23 @@
1
+ import type { CloudflareApiClient, CloudflareZoneLike } from './types.js';
2
+ export declare function discoverZones(client: CloudflareApiClient, input: {
3
+ readonly accountId: string;
4
+ readonly zoneName?: string;
5
+ readonly warnings: string[];
6
+ }): Promise<readonly CloudflareZoneLike[]>;
7
+ export declare function selectDiscoveredZone(client: CloudflareApiClient, zones: readonly CloudflareZoneLike[], input: {
8
+ readonly zoneId?: string;
9
+ readonly zoneName?: string;
10
+ readonly configuredZoneId: string;
11
+ readonly configuredZoneName: string;
12
+ readonly warnings: string[];
13
+ }): Promise<CloudflareZoneLike | undefined>;
14
+ export declare function resolveZone(client: CloudflareApiClient, input: {
15
+ readonly accountId: string;
16
+ readonly zoneId?: string;
17
+ readonly zoneName?: string;
18
+ readonly configuredZoneId: string;
19
+ readonly configuredZoneName: string;
20
+ readonly required: boolean;
21
+ }): Promise<CloudflareZoneLike | undefined>;
22
+ export declare function tryDiscover<T>(label: string, warnings: string[], run: () => Promise<T>): Promise<T | undefined>;
23
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/cloudflare/discovery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAIpB,wBAAsB,aAAa,CACjC,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GAC7F,OAAO,CAAC,SAAS,kBAAkB,EAAE,CAAC,CASxC;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,SAAS,kBAAkB,EAAE,EACpC,KAAK,EAAE;IACL,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;CAC7B,GACA,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAYzC;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE;IACL,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B,GACA,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAgBzC;AAED,wBAAsB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAOrH"}
@@ -0,0 +1,57 @@
1
+ import { summarizeError } from '../utils/error-display.js';
2
+ import { CloudflareControlPlaneError } from './types.js';
3
+ import { clean, collectAsync } from './utils.js';
4
+ export async function discoverZones(client, input) {
5
+ if (!client.zones)
6
+ return [];
7
+ return await tryDiscover('zones', input.warnings, async () => {
8
+ const query = {
9
+ ...(input.accountId ? { account: { id: input.accountId } } : {}),
10
+ ...(clean(input.zoneName) ? { name: clean(input.zoneName) } : {}),
11
+ };
12
+ return await collectAsync(client.zones.list(query));
13
+ }) ?? [];
14
+ }
15
+ export async function selectDiscoveredZone(client, zones, input) {
16
+ const zoneId = clean(input.zoneId) || input.configuredZoneId;
17
+ if (zoneId && client.zones) {
18
+ try {
19
+ return await client.zones.get({ zone_id: zoneId });
20
+ }
21
+ catch (error) {
22
+ input.warnings.push(`Could not load Cloudflare zone ${zoneId}: ${summarizeError(error)}`);
23
+ }
24
+ }
25
+ const zoneName = clean(input.zoneName) || input.configuredZoneName;
26
+ if (zoneName)
27
+ return zones.find((zone) => zone.name === zoneName);
28
+ return zones.length === 1 ? zones[0] : undefined;
29
+ }
30
+ export async function resolveZone(client, input) {
31
+ if (!client.zones) {
32
+ if (input.required) {
33
+ throw new CloudflareControlPlaneError('The Cloudflare client does not expose Zones APIs required for the requested operation.', 'CLOUDFLARE_ZONES_API_UNAVAILABLE', 500);
34
+ }
35
+ return undefined;
36
+ }
37
+ const zoneId = clean(input.zoneId) || input.configuredZoneId;
38
+ if (zoneId)
39
+ return await client.zones.get({ zone_id: zoneId });
40
+ const zoneName = clean(input.zoneName) || input.configuredZoneName;
41
+ const zones = await collectAsync(client.zones.list({
42
+ ...(input.accountId ? { account: { id: input.accountId } } : {}),
43
+ ...(zoneName ? { name: zoneName } : {}),
44
+ }));
45
+ if (zoneName)
46
+ return zones.find((zone) => zone.name === zoneName);
47
+ return zones.length === 1 ? zones[0] : undefined;
48
+ }
49
+ export async function tryDiscover(label, warnings, run) {
50
+ try {
51
+ return await run();
52
+ }
53
+ catch (error) {
54
+ warnings.push(`Could not discover Cloudflare ${label}: ${summarizeError(error)}`);
55
+ return undefined;
56
+ }
57
+ }
@@ -0,0 +1,6 @@
1
+ export { CloudflareControlPlaneManager } from './manager.js';
2
+ export { createCloudflareApiClient } from './client.js';
3
+ export { GOODVIBES_CLOUDFLARE_WORKER_MODULE } from './worker-source.js';
4
+ export type { CloudflareApiClient, CloudflareComponent, CloudflareComponentSelection, CloudflareControlPlaneConfig, CloudflareControlPlaneOptions, CloudflareControlPlaneStatus, CloudflareDiscoverInput, CloudflareDiscoverResult, CloudflareDisableInput, CloudflareDisableResult, CloudflareOperationalTokenInput, CloudflareOperationalTokenResult, CloudflareProvisionInput, CloudflareProvisionResult, CloudflareProvisionStep, CloudflareTokenPermissionRequirement, CloudflareTokenRequirementsInput, CloudflareTokenRequirementsResult, CloudflareValidateInput, CloudflareValidateResult, CloudflareVerifyInput, CloudflareVerifyResult, } from './types.js';
5
+ export { CloudflareControlPlaneError } from './types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/cloudflare/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,kCAAkC,EAAE,MAAM,oBAAoB,CAAC;AACxE,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,4BAA4B,EAC5B,4BAA4B,EAC5B,6BAA6B,EAC7B,4BAA4B,EAC5B,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,EACvB,+BAA+B,EAC/B,gCAAgC,EAChC,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,oCAAoC,EACpC,gCAAgC,EAChC,iCAAiC,EACjC,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { CloudflareControlPlaneManager } from './manager.js';
2
+ export { createCloudflareApiClient } from './client.js';
3
+ export { GOODVIBES_CLOUDFLARE_WORKER_MODULE } from './worker-source.js';
4
+ export { CloudflareControlPlaneError } from './types.js';
@@ -0,0 +1,30 @@
1
+ import type { CloudflareControlPlaneOptions, CloudflareControlPlaneStatus, CloudflareDiscoverInput, CloudflareDiscoverResult, CloudflareDisableInput, CloudflareDisableResult, CloudflareOperationalTokenInput, CloudflareOperationalTokenResult, CloudflareProvisionInput, CloudflareProvisionResult, CloudflareTokenRequirementsInput, CloudflareTokenRequirementsResult, CloudflareValidateInput, CloudflareValidateResult, CloudflareVerifyInput, CloudflareVerifyResult } from './types.js';
2
+ export declare class CloudflareControlPlaneManager {
3
+ private readonly options;
4
+ private readonly createClient;
5
+ private readonly fetchImpl;
6
+ constructor(options: CloudflareControlPlaneOptions);
7
+ describeStatus(): Promise<CloudflareControlPlaneStatus>;
8
+ tokenRequirements(input?: CloudflareTokenRequirementsInput): CloudflareTokenRequirementsResult;
9
+ createOperationalToken(input: CloudflareOperationalTokenInput): Promise<CloudflareOperationalTokenResult>;
10
+ discover(input?: CloudflareDiscoverInput): Promise<CloudflareDiscoverResult>;
11
+ validate(input: CloudflareValidateInput): Promise<CloudflareValidateResult>;
12
+ provision(input: CloudflareProvisionInput): Promise<CloudflareProvisionResult>;
13
+ verify(input?: CloudflareVerifyInput): Promise<CloudflareVerifyResult>;
14
+ disable(input?: CloudflareDisableInput): Promise<CloudflareDisableResult>;
15
+ private readConfig;
16
+ private resolveAccountId;
17
+ private resolveWorkerName;
18
+ private resolveApiToken;
19
+ private resolveOperatorToken;
20
+ private resolveWorkerClientToken;
21
+ private resolveSecretRef;
22
+ private storeSecret;
23
+ private requireAccountTokens;
24
+ private collectPermissionGroups;
25
+ private createProvisioningContext;
26
+ private fetchWorker;
27
+ private generateToken;
28
+ private setConfig;
29
+ }
30
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/cloudflare/manager.ts"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAIV,6BAA6B,EAC7B,4BAA4B,EAC5B,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,EAGvB,+BAA+B,EAC/B,gCAAgC,EAEhC,wBAAwB,EACxB,yBAAyB,EAMzB,gCAAgC,EAChC,iCAAiC,EAEjC,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAiBpB,qBAAa,6BAA6B;IAI5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqD;IAClF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAEZ,OAAO,EAAE,6BAA6B;IAK7D,cAAc,IAAI,OAAO,CAAC,4BAA4B,CAAC;IA0C7D,iBAAiB,CAAC,KAAK,GAAE,gCAAqC,GAAG,iCAAiC;IAkB5F,sBAAsB,CAAC,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAAC,gCAAgC,CAAC;IAqEzG,QAAQ,CAAC,KAAK,GAAE,uBAA4B,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAuEhF,QAAQ,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAuB3E,SAAS,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IA2S9E,MAAM,CAAC,KAAK,GAAE,qBAA0B,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAe1E,OAAO,CAAC,KAAK,GAAE,sBAA2B,GAAG,OAAO,CAAC,uBAAuB,CAAC;IA0BnF,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,iBAAiB;YAYX,eAAe;YAaf,oBAAoB;YAapB,wBAAwB;YAaxB,gBAAgB;YAahB,WAAW;IAOzB,OAAO,CAAC,oBAAoB;YAOd,uBAAuB;IAQrC,OAAO,CAAC,yBAAyB;YAQnB,WAAW;IAazB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,SAAS;CAMlB"}