@dual-os/sdk 0.0.0-stage → 0.8.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/LICENSE +4 -0
  2. package/README.md +19 -2
  3. package/dist/Action.d.ts +201 -0
  4. package/dist/Action.d.ts.map +1 -0
  5. package/dist/Action.js +172 -0
  6. package/dist/Action.js.map +1 -0
  7. package/dist/AgentChannel.d.ts +1717 -0
  8. package/dist/AgentChannel.d.ts.map +1 -0
  9. package/dist/AgentChannel.js +708 -0
  10. package/dist/AgentChannel.js.map +1 -0
  11. package/dist/AgentChannelConformance.d.ts +1543 -0
  12. package/dist/AgentChannelConformance.d.ts.map +1 -0
  13. package/dist/AgentChannelConformance.js +163 -0
  14. package/dist/AgentChannelConformance.js.map +1 -0
  15. package/dist/AgentChannelRuntime.d.ts +78 -0
  16. package/dist/AgentChannelRuntime.d.ts.map +1 -0
  17. package/dist/AgentChannelRuntime.js +270 -0
  18. package/dist/AgentChannelRuntime.js.map +1 -0
  19. package/dist/AiProvider.d.ts +132 -0
  20. package/dist/AiProvider.d.ts.map +1 -0
  21. package/dist/AiProvider.js +100 -0
  22. package/dist/AiProvider.js.map +1 -0
  23. package/dist/AuthMethod.d.ts +381 -0
  24. package/dist/AuthMethod.d.ts.map +1 -0
  25. package/dist/AuthMethod.js +225 -0
  26. package/dist/AuthMethod.js.map +1 -0
  27. package/dist/AuthMethodBinding.d.ts +77 -0
  28. package/dist/AuthMethodBinding.d.ts.map +1 -0
  29. package/dist/AuthMethodBinding.js +31 -0
  30. package/dist/AuthMethodBinding.js.map +1 -0
  31. package/dist/AuthMethodExecution.d.ts +223 -0
  32. package/dist/AuthMethodExecution.d.ts.map +1 -0
  33. package/dist/AuthMethodExecution.js +277 -0
  34. package/dist/AuthMethodExecution.js.map +1 -0
  35. package/dist/ConnectionResolver.d.ts +219 -0
  36. package/dist/ConnectionResolver.d.ts.map +1 -0
  37. package/dist/ConnectionResolver.js +153 -0
  38. package/dist/ConnectionResolver.js.map +1 -0
  39. package/dist/DefinitionError.d.ts +67 -0
  40. package/dist/DefinitionError.d.ts.map +1 -0
  41. package/dist/DefinitionError.js +82 -0
  42. package/dist/DefinitionError.js.map +1 -0
  43. package/dist/DualRegistry.d.ts +71 -0
  44. package/dist/DualRegistry.d.ts.map +1 -0
  45. package/dist/DualRegistry.js +96 -0
  46. package/dist/DualRegistry.js.map +1 -0
  47. package/dist/DualRuntime.d.ts +279 -0
  48. package/dist/DualRuntime.d.ts.map +1 -0
  49. package/dist/DualRuntime.js +311 -0
  50. package/dist/DualRuntime.js.map +1 -0
  51. package/dist/Files.d.ts +80 -0
  52. package/dist/Files.d.ts.map +1 -0
  53. package/dist/Files.js +66 -0
  54. package/dist/Files.js.map +1 -0
  55. package/dist/Group.d.ts +106 -0
  56. package/dist/Group.d.ts.map +1 -0
  57. package/dist/Group.js +86 -0
  58. package/dist/Group.js.map +1 -0
  59. package/dist/Http.d.ts +342 -0
  60. package/dist/Http.d.ts.map +1 -0
  61. package/dist/Http.js +677 -0
  62. package/dist/Http.js.map +1 -0
  63. package/dist/Mcp.d.ts +109 -0
  64. package/dist/Mcp.d.ts.map +1 -0
  65. package/dist/Mcp.js +176 -0
  66. package/dist/Mcp.js.map +1 -0
  67. package/dist/OAuth2TokenRefresher.d.ts +18 -0
  68. package/dist/OAuth2TokenRefresher.d.ts.map +1 -0
  69. package/dist/OAuth2TokenRefresher.js +19 -0
  70. package/dist/OAuth2TokenRefresher.js.map +1 -0
  71. package/dist/OAuthFlow.d.ts +71 -0
  72. package/dist/OAuthFlow.d.ts.map +1 -0
  73. package/dist/OAuthFlow.js +488 -0
  74. package/dist/OAuthFlow.js.map +1 -0
  75. package/dist/Plugin.d.ts +383 -0
  76. package/dist/Plugin.d.ts.map +1 -0
  77. package/dist/Plugin.js +249 -0
  78. package/dist/Plugin.js.map +1 -0
  79. package/dist/PluginRuntime.d.ts +3186 -0
  80. package/dist/PluginRuntime.d.ts.map +1 -0
  81. package/dist/PluginRuntime.js +331 -0
  82. package/dist/PluginRuntime.js.map +1 -0
  83. package/dist/Runner.d.ts +1 -0
  84. package/dist/Runner.js +124 -0
  85. package/dist/Runner.js.map +1 -0
  86. package/dist/ToolFile.d.ts +23 -0
  87. package/dist/ToolFile.d.ts.map +1 -0
  88. package/dist/ToolFile.js +33 -0
  89. package/dist/ToolFile.js.map +1 -0
  90. package/dist/Trigger.d.ts +358 -0
  91. package/dist/Trigger.d.ts.map +1 -0
  92. package/dist/Trigger.js +287 -0
  93. package/dist/Trigger.js.map +1 -0
  94. package/dist/_virtual/_rolldown/runtime.js +13 -0
  95. package/dist/index.d.ts +24 -0
  96. package/dist/index.js +24 -0
  97. package/dist/internal/auth-context.d.ts +23 -0
  98. package/dist/internal/auth-context.d.ts.map +1 -0
  99. package/dist/internal/auth-context.js +1 -0
  100. package/dist/internal/auth-execution.d.ts +27 -0
  101. package/dist/internal/auth-execution.d.ts.map +1 -0
  102. package/dist/internal/auth-execution.js +66 -0
  103. package/dist/internal/auth-execution.js.map +1 -0
  104. package/dist/internal/auth-runtime.d.ts +5 -0
  105. package/dist/internal/auth-runtime.d.ts.map +1 -0
  106. package/dist/internal/auth-runtime.js +16 -0
  107. package/dist/internal/auth-runtime.js.map +1 -0
  108. package/dist/internal/capabilities.d.ts +24 -0
  109. package/dist/internal/capabilities.d.ts.map +1 -0
  110. package/dist/internal/capabilities.js +22 -0
  111. package/dist/internal/capabilities.js.map +1 -0
  112. package/dist/internal/children.d.ts +34 -0
  113. package/dist/internal/children.d.ts.map +1 -0
  114. package/dist/internal/children.js +53 -0
  115. package/dist/internal/children.js.map +1 -0
  116. package/dist/internal/collection-utils.d.ts +4 -0
  117. package/dist/internal/collection-utils.d.ts.map +1 -0
  118. package/dist/internal/collection-utils.js +6 -0
  119. package/dist/internal/collection-utils.js.map +1 -0
  120. package/dist/internal/dual/actions.d.ts +33 -0
  121. package/dist/internal/dual/actions.d.ts.map +1 -0
  122. package/dist/internal/dual/actions.js +26 -0
  123. package/dist/internal/dual/actions.js.map +1 -0
  124. package/dist/internal/dual/invoke.d.ts +63 -0
  125. package/dist/internal/dual/invoke.d.ts.map +1 -0
  126. package/dist/internal/dual/invoke.js +75 -0
  127. package/dist/internal/dual/invoke.js.map +1 -0
  128. package/dist/internal/dual/registry.d.ts +125 -0
  129. package/dist/internal/dual/registry.d.ts.map +1 -0
  130. package/dist/internal/dual/registry.js +172 -0
  131. package/dist/internal/dual/registry.js.map +1 -0
  132. package/dist/internal/dual/triggers.d.ts +29 -0
  133. package/dist/internal/dual/triggers.d.ts.map +1 -0
  134. package/dist/internal/dual/triggers.js +26 -0
  135. package/dist/internal/dual/triggers.js.map +1 -0
  136. package/dist/internal/handler-context.d.ts +9 -0
  137. package/dist/internal/handler-context.d.ts.map +1 -0
  138. package/dist/internal/handler-context.js +31 -0
  139. package/dist/internal/handler-context.js.map +1 -0
  140. package/dist/internal/identifier.d.ts +6 -0
  141. package/dist/internal/identifier.d.ts.map +1 -0
  142. package/dist/internal/identifier.js +28 -0
  143. package/dist/internal/identifier.js.map +1 -0
  144. package/dist/internal/plugin-handlers.d.ts +38 -0
  145. package/dist/internal/plugin-handlers.d.ts.map +1 -0
  146. package/dist/internal/plugin-handlers.js +52 -0
  147. package/dist/internal/plugin-handlers.js.map +1 -0
  148. package/dist/internal/proto.d.ts +7 -0
  149. package/dist/internal/proto.d.ts.map +1 -0
  150. package/dist/internal/proto.js +10 -0
  151. package/dist/internal/proto.js.map +1 -0
  152. package/dist/internal/schema-runtime.d.ts +6 -0
  153. package/dist/internal/schema-runtime.d.ts.map +1 -0
  154. package/dist/internal/schema-runtime.js +10 -0
  155. package/dist/internal/schema-runtime.js.map +1 -0
  156. package/dist/internal/trigger-runtime-shared.d.ts +41 -0
  157. package/dist/internal/trigger-runtime-shared.d.ts.map +1 -0
  158. package/dist/internal/trigger-runtime-shared.js +132 -0
  159. package/dist/internal/trigger-runtime-shared.js.map +1 -0
  160. package/dist/internal/trigger-runtime.d.ts +12 -0
  161. package/dist/internal/trigger-runtime.d.ts.map +1 -0
  162. package/dist/internal/trigger-runtime.js +95 -0
  163. package/dist/internal/trigger-runtime.js.map +1 -0
  164. package/dist/internal/types.d.ts +7 -0
  165. package/dist/internal/types.d.ts.map +1 -0
  166. package/dist/internal/types.js +1 -0
  167. package/dist/remote-runtime.d.ts +585 -0
  168. package/dist/remote-runtime.d.ts.map +1 -0
  169. package/dist/remote-runtime.js +367 -0
  170. package/dist/remote-runtime.js.map +1 -0
  171. package/package.json +55 -4
  172. package/src/Action.ts +370 -0
  173. package/src/AgentChannel.ts +860 -0
  174. package/src/AgentChannelConformance.ts +124 -0
  175. package/src/AgentChannelRuntime.ts +616 -0
  176. package/src/AiProvider.ts +255 -0
  177. package/src/AuthMethod.ts +954 -0
  178. package/src/AuthMethodBinding.ts +112 -0
  179. package/src/AuthMethodExecution.ts +542 -0
  180. package/src/ConnectionResolver.ts +265 -0
  181. package/src/DefinitionError.ts +115 -0
  182. package/src/DualRegistry.ts +152 -0
  183. package/src/DualRuntime.ts +1081 -0
  184. package/src/Files.ts +89 -0
  185. package/src/Group.ts +292 -0
  186. package/src/Http.ts +1205 -0
  187. package/src/Mcp.ts +299 -0
  188. package/src/OAuth2TokenRefresher.ts +22 -0
  189. package/src/OAuthFlow.ts +874 -0
  190. package/src/Plugin.ts +912 -0
  191. package/src/PluginRuntime.ts +414 -0
  192. package/src/Runner.ts +248 -0
  193. package/src/ToolFile.ts +28 -0
  194. package/src/Trigger.ts +722 -0
  195. package/src/index.ts +158 -0
  196. package/src/internal/auth-context.ts +27 -0
  197. package/src/internal/auth-execution.ts +241 -0
  198. package/src/internal/auth-runtime.ts +20 -0
  199. package/src/internal/capabilities.ts +55 -0
  200. package/src/internal/children.ts +126 -0
  201. package/src/internal/collection-utils.ts +8 -0
  202. package/src/internal/dual/actions.ts +116 -0
  203. package/src/internal/dual/invoke.ts +307 -0
  204. package/src/internal/dual/registry.ts +340 -0
  205. package/src/internal/dual/triggers.ts +128 -0
  206. package/src/internal/handler-context.ts +57 -0
  207. package/src/internal/identifier.ts +27 -0
  208. package/src/internal/plugin-handlers.ts +146 -0
  209. package/src/internal/proto.ts +8 -0
  210. package/src/internal/schema-runtime.ts +15 -0
  211. package/src/internal/trigger-runtime-shared.ts +449 -0
  212. package/src/internal/trigger-runtime.ts +223 -0
  213. package/src/internal/types.ts +12 -0
  214. package/src/remote-runtime.ts +469 -0
@@ -0,0 +1,358 @@
1
+ import { Any as Any$1 } from "./AuthMethod.js";
2
+ import { ContextForMethods } from "./internal/auth-context.js";
3
+ import { ConnectionResolutionContext } from "./ConnectionResolver.js";
4
+ import { RuntimeConnectionErrorsFor } from "./internal/auth-execution.js";
5
+ import { EntryAuthMethods, EntryTrigger, TriggerAppError, TriggerEncodedOutput, TriggerEncodedState, TriggerIdOf, TriggerRuntimeRequirements } from "./internal/trigger-runtime-shared.js";
6
+ import { Context, Effect, Pipeable, Schema } from "effect";
7
+ declare namespace Trigger_d_exports {
8
+ export { ActivateSuccess, ActivationResult, Any, Config, ConfigSchema, Constructor, ContractOptions, DeactivateSuccess, EmitResult, EmittedEventsSuccess, Handler, InvalidTriggerConfigError, InvalidTriggerOutputError, InvalidTriggerStateError, KeyedEvent, LifecycleInput, LifecycleRequest, Output, OutputSchema, PollExecutionRequest, PollingInput, PollingRuntime, RuntimeContext, RuntimeContract, RuntimeMeta, RuntimePhase, RuntimeTriggerEntry, State, StateSchema, StateValue, Trigger, TriggerKind, TriggerOptions, TypeId, UnsupportedTriggerRuntimeError, VerifyResult, VerifySuccess, WebhookActivationInput, WebhookActivationRequest, WebhookExecutionRequest, WebhookLifecycleInput, WebhookRequest, WebhookResponse, WebhookRuntime, activate, bodyDigest, deactivate, handlerKey, isTrigger, parse, poll, polling, verify, verifyEcdsaP256, verifyHmac, verifyHmacSha256, verifyStandardWebhook, verifyToken, webhook };
9
+ }
10
+ /** @since 0.0.0 @category type ids */
11
+ export declare const TypeId: "@dual-os/sdk/Trigger";
12
+ /** @since 0.0.0 @category type ids */
13
+ export type TypeId = typeof TypeId;
14
+ /** @since 0.0.0 @category models */
15
+ export type TriggerKind = "webhook" | "polling";
16
+ /** @since 0.0.0 @category models */
17
+ export type RuntimePhase = "activate" | "deactivate" | "verify" | "parse" | "poll";
18
+ /** @since 0.0.0 @category models */
19
+ export interface WebhookRequest {
20
+ readonly body: unknown;
21
+ /** Header names are lowercase: the runtime lowercases them before `verify` and `parse`. */
22
+ readonly headers?: Readonly<Record<string, string>>;
23
+ readonly rawBody?: string | Uint8Array;
24
+ readonly method?: string;
25
+ readonly url?: string;
26
+ readonly query?: Readonly<Record<string, string | readonly string[]>>;
27
+ }
28
+ /** @since 0.0.0 @category models */
29
+ export interface WebhookResponse {
30
+ readonly status: number;
31
+ readonly headers?: Readonly<Record<string, string>>;
32
+ readonly body?: unknown;
33
+ }
34
+ type MessagePart = string | Uint8Array;
35
+ declare const hmacHashes: {
36
+ readonly sha1: "SHA-1";
37
+ readonly sha256: "SHA-256";
38
+ };
39
+ /**
40
+ * The hex SHA-256 of a delivery's raw body. Use it as the event key when the provider signs the
41
+ * body but not its delivery identifier header, so a replayed delivery keeps one identity.
42
+ *
43
+ * @since 0.0.0
44
+ * @category webhooks
45
+ */
46
+ export declare const bodyDigest: (rawBody: string | Uint8Array<ArrayBufferLike>) => Effect.Effect<string, never, never>;
47
+ /**
48
+ * Whether `signature` is the HMAC-SHA256 of `message` keyed with `secret`, the way most webhook
49
+ * providers sign their deliveries. The comparison runs in constant time.
50
+ *
51
+ * @since 0.0.0
52
+ * @category webhooks
53
+ */
54
+ export declare const verifyHmacSha256: (secret: string, message: string | Uint8Array<ArrayBufferLike>, signature: Uint8Array<ArrayBufferLike>) => Effect.Effect<boolean, never, never>;
55
+ /**
56
+ * Whether `signature`, written in `encoding`, is the HMAC of `message` keyed with `secret`, given
57
+ * as text or as raw key bytes such as a decoded `whsec_` secret. A message given as parts is signed
58
+ * as their concatenation, such as a timestamp followed by the raw body. Given several signatures,
59
+ * such as one per rotated secret, it verifies when any of them matches and hashes the message once.
60
+ * A missing secret, or signatures none of which is valid `encoding`, never verifies. The comparison
61
+ * runs in constant time.
62
+ *
63
+ * @since 0.0.0
64
+ * @category webhooks
65
+ */
66
+ export declare const verifyHmac: (options: {
67
+ readonly algorithm: keyof typeof hmacHashes;
68
+ readonly encoding: "hex" | "base64";
69
+ readonly message: MessagePart | readonly MessagePart[];
70
+ readonly secret: MessagePart;
71
+ readonly signature: string | readonly string[];
72
+ }) => Effect.Effect<boolean, never, never>;
73
+ /**
74
+ * Whether a [Standard Webhooks](https://www.standardwebhooks.com) delivery is signed with `secret`:
75
+ * one `v1,<base64>` entry of its `webhook-signature` header (`svix-signature` from Svix) must be the
76
+ * HMAC-SHA256 of `id.timestamp.body` keyed with the bytes of the `whsec_` secret, and its timestamp
77
+ * must be within five minutes of now. Header names are lowercase, as in `WebhookRequest`. Missing
78
+ * headers or secret never verify.
79
+ *
80
+ * @since 0.0.0
81
+ * @category webhooks
82
+ */
83
+ export declare const verifyStandardWebhook: (options: {
84
+ readonly body: MessagePart;
85
+ readonly headers: Readonly<Record<string, string>>;
86
+ readonly secret: string;
87
+ }) => Effect.Effect<boolean, never, never>;
88
+ /**
89
+ * Whether `actual` equals the shared secret `expected`, for providers that send the secret itself
90
+ * back with each delivery. An empty or missing secret never verifies. The comparison runs in
91
+ * constant time.
92
+ *
93
+ * @since 0.0.0
94
+ * @category webhooks
95
+ */
96
+ export declare const verifyToken: (expected: string, actual: string | undefined) => Effect.Effect<boolean, never, never>;
97
+ /**
98
+ * Whether `signature`, a base64 DER ECDSA signature, signs `message` with the ECDSA P-256 key
99
+ * `publicKey`, a base64 DER SubjectPublicKeyInfo, hashed with SHA-256. A message given as parts is
100
+ * signed as their concatenation, such as a timestamp followed by the raw body. A missing key or a
101
+ * key or signature that is not valid never verifies.
102
+ *
103
+ * @since 0.0.0
104
+ * @category webhooks
105
+ */
106
+ export declare const verifyEcdsaP256: (options: {
107
+ readonly message: MessagePart | readonly MessagePart[];
108
+ readonly publicKey: string;
109
+ readonly signature: string;
110
+ }) => Effect.Effect<boolean, never, never>;
111
+ /** @since 0.0.0 @category models */
112
+ export type RuntimeContext<EffectiveAuthMethods extends readonly Any$1[]> = ContextForMethods<EffectiveAuthMethods> & ConnectionResolutionContext;
113
+ /** @since 0.0.0 @category type-level */
114
+ export type StateValue<State extends Schema.Top | undefined> = [State] extends [Schema.Top] ? Schema.Schema.Type<Exclude<State, undefined>> | undefined : undefined;
115
+ /** @since 0.0.0 @category models */
116
+ export interface RuntimeMeta<TriggerId extends string = string, Phase extends RuntimePhase = RuntimePhase> {
117
+ readonly triggerId: TriggerId;
118
+ readonly phase: Phase;
119
+ }
120
+ /** @since 0.0.0 @category models */
121
+ export interface ActivateSuccess<TriggerId extends string = string, State = unknown> {
122
+ readonly state: State;
123
+ readonly meta: RuntimeMeta<TriggerId, "activate">;
124
+ }
125
+ /** @since 0.0.0 @category models */
126
+ export interface DeactivateSuccess<TriggerId extends string = string> {
127
+ readonly meta: RuntimeMeta<TriggerId, "deactivate">;
128
+ }
129
+ /** @since 0.0.0 @category models */
130
+ export interface VerifySuccess<TriggerId extends string = string, State = unknown> {
131
+ readonly verified: true;
132
+ readonly response?: WebhookResponse;
133
+ readonly state?: State;
134
+ readonly meta: RuntimeMeta<TriggerId, "verify">;
135
+ }
136
+ /**
137
+ * What `verify` returns when the delivery is more than an authenticated event: the `response` the
138
+ * host sends back to the provider, such as a handshake answer, and the new trigger `state`, such as
139
+ * a secret the handshake delivered.
140
+ *
141
+ * @since 0.0.0
142
+ * @category models
143
+ */
144
+ export interface VerifyResult<State> {
145
+ readonly response?: WebhookResponse;
146
+ readonly state?: State;
147
+ }
148
+ /** @since 0.0.0 @category models */
149
+ export interface KeyedEvent<Payload = unknown> {
150
+ readonly key: string;
151
+ readonly payload: Payload;
152
+ }
153
+ /** @since 0.0.0 @category models */
154
+ export interface EmittedEventsSuccess<TriggerId extends string = string, Phase extends "parse" | "poll" = "parse" | "poll", Output = unknown, State = unknown> {
155
+ readonly events: readonly KeyedEvent<Output>[];
156
+ readonly state: State;
157
+ readonly meta: RuntimeMeta<TriggerId, Phase>;
158
+ }
159
+ /** @since 0.0.0 @category models */
160
+ export interface LifecycleInput<Config, State> {
161
+ readonly config: Config;
162
+ readonly state: State;
163
+ }
164
+ /** @since 0.0.0 @category models */
165
+ export interface WebhookActivationInput<Config, State> extends LifecycleInput<Config, State> {
166
+ /** The absolute URL the host serves this trigger's deliveries on. */
167
+ readonly webhookUrl: string;
168
+ }
169
+ /** @since 0.0.0 @category models */
170
+ export interface WebhookLifecycleInput<Config, State> extends WebhookActivationInput<Config, State> {
171
+ readonly request: WebhookRequest;
172
+ }
173
+ /** @since 0.0.0 @category models */
174
+ export interface PollingInput<Config, State> extends LifecycleInput<Config, State> {}
175
+ /** @since 0.0.0 @category models */
176
+ export interface ActivationResult<State> {
177
+ readonly state: State;
178
+ }
179
+ /** @since 0.0.0 @category models */
180
+ export interface EmitResult<Output, State> {
181
+ readonly events: readonly KeyedEvent<Output>[];
182
+ readonly state: State;
183
+ }
184
+ /** @since 0.0.0 @category models */
185
+ export interface WebhookRuntime<Config extends Schema.Top, Output extends Schema.Top, State extends Schema.Top | undefined, AppError = never, Requirements = never, EffectiveAuthMethods extends readonly Any$1[] = readonly Any$1[]> {
186
+ readonly activate?: (input: WebhookActivationInput<Schema.Schema.Type<Config>, StateValue<State>>, context: RuntimeContext<EffectiveAuthMethods>) => Effect.Effect<ActivationResult<StateValue<State>>, AppError, Requirements>;
187
+ readonly deactivate?: (input: WebhookActivationInput<Schema.Schema.Type<Config>, StateValue<State>>, context: RuntimeContext<EffectiveAuthMethods>) => Effect.Effect<void, AppError, Requirements>;
188
+ readonly verify?: (input: WebhookLifecycleInput<Schema.Schema.Type<Config>, StateValue<State>>, context: RuntimeContext<EffectiveAuthMethods>) => Effect.Effect<void | VerifyResult<StateValue<State>>, AppError, Requirements>;
189
+ /**
190
+ * Parses one accepted webhook delivery.
191
+ *
192
+ * The Dual runtime may retry `parse` for the same delivery until the delivery
193
+ * reaches a durable final status. Implementations must be idempotent and
194
+ * tolerate at-least-once calls for the same request/context.
195
+ *
196
+ * @since 0.0.0 @category handlers
197
+ */
198
+ readonly parse?: (input: WebhookLifecycleInput<Schema.Schema.Type<Config>, StateValue<State>>, context: RuntimeContext<EffectiveAuthMethods>) => Effect.Effect<EmitResult<Schema.Schema.Type<Output>, StateValue<State>>, AppError, Requirements>;
199
+ }
200
+ /** @since 0.0.0 @category models */
201
+ export interface PollingRuntime<Config extends Schema.Top, Output extends Schema.Top, State extends Schema.Top | undefined, AppError = never, Requirements = never, EffectiveAuthMethods extends readonly Any$1[] = readonly Any$1[]> {
202
+ /**
203
+ * Polls one scheduled trigger occurrence.
204
+ *
205
+ * The Dual runtime may retry `poll` for the same occurrence until its cursor
206
+ * and emitted events commit. Implementations must be idempotent and tolerate
207
+ * at-least-once calls for the same occurrence metadata.
208
+ *
209
+ * @since 0.0.0 @category handlers
210
+ */
211
+ readonly poll?: (input: PollingInput<Schema.Schema.Type<Config>, StateValue<State>>, context: RuntimeContext<EffectiveAuthMethods>) => Effect.Effect<EmitResult<Schema.Schema.Type<Output>, StateValue<State>>, AppError, Requirements>;
212
+ }
213
+ /** @since 0.0.0 @category models */
214
+ export type RuntimeContract<Kind extends TriggerKind, Config extends Schema.Top, Output extends Schema.Top, State extends Schema.Top | undefined, AppError = never, Requirements = never, EffectiveAuthMethods extends readonly Any$1[] = readonly Any$1[]> = Kind extends "webhook" ? WebhookRuntime<Config, Output, State, AppError, Requirements, EffectiveAuthMethods> : PollingRuntime<Config, Output, State, AppError, Requirements, EffectiveAuthMethods>;
215
+ /** @since 0.0.0 @category models */
216
+ export interface Handler<TriggerId extends string = string> {
217
+ readonly _: unique symbol;
218
+ readonly triggerId: TriggerId;
219
+ readonly context: Context.Context<never>;
220
+ readonly runtime: RuntimeContract<any, any, any, any, any, any, any>;
221
+ }
222
+ /** @since 0.0.0 @category handlers */
223
+ export declare const handlerKey: (triggerId: string) => string;
224
+ /** @since 0.0.0 @category type-level */
225
+ export interface Any extends Pipeable.Pipeable {
226
+ readonly [TypeId]: TypeId;
227
+ readonly identifier: string;
228
+ readonly name: string | undefined;
229
+ readonly description: string | undefined;
230
+ readonly kind: TriggerKind;
231
+ readonly config: Schema.Top;
232
+ readonly output: Schema.Top;
233
+ readonly state: Schema.Top | undefined;
234
+ readonly requireAuth: boolean;
235
+ }
236
+ /** @since 0.0.0 @category models */
237
+ export interface TriggerOptions {
238
+ readonly name?: string | undefined;
239
+ readonly description?: string | undefined;
240
+ }
241
+ /**
242
+ * Options used to declare a trigger contract.
243
+ *
244
+ * @since 0.6.0
245
+ * @category models
246
+ */
247
+ export interface ContractOptions<Config extends Schema.Top, Output extends Schema.Top, State extends Schema.Top | undefined, RequireAuth extends boolean> extends TriggerOptions {
248
+ readonly config: Config;
249
+ readonly output: Output;
250
+ readonly state?: State;
251
+ /** Set to `false` to make a connection optional for this trigger. */
252
+ readonly requireAuth?: RequireAuth;
253
+ }
254
+ /** @since 0.0.0 @category models */
255
+ export interface Trigger<out Identifier extends string = string, out Kind extends TriggerKind = TriggerKind, out Config extends Schema.Top = Schema.Top, out Output extends Schema.Top = Schema.Top, out State extends Schema.Top | undefined = Schema.Top | undefined, out RequireAuth extends boolean = boolean> extends Pipeable.Pipeable {
256
+ readonly [TypeId]: TypeId;
257
+ readonly identifier: Identifier;
258
+ readonly name: string | undefined;
259
+ readonly description: string | undefined;
260
+ readonly kind: Kind;
261
+ readonly config: Config;
262
+ readonly output: Output;
263
+ readonly state: State;
264
+ readonly requireAuth: RequireAuth;
265
+ }
266
+ export type ConfigSchema<TriggerDef extends Any> = TriggerDef["config"];
267
+ export type OutputSchema<TriggerDef extends Any> = TriggerDef["output"];
268
+ export type StateSchema<TriggerDef extends Any> = TriggerDef["state"];
269
+ export type Config<TriggerDef extends Any> = Schema.Schema.Type<ConfigSchema<TriggerDef>>;
270
+ export type Output<TriggerDef extends Any> = Schema.Schema.Type<OutputSchema<TriggerDef>>;
271
+ export type State<TriggerDef extends Any> = StateValue<StateSchema<TriggerDef>>;
272
+ /** @since 0.0.0 @category models */
273
+ export interface RuntimeTriggerEntry<out TriggerDef extends Any = Any, out AllowedMethods extends readonly Any$1[] = readonly Any$1[], out TriggerId extends string = string, out ProviderId extends string = string> {
274
+ readonly providerId: ProviderId;
275
+ readonly triggerId: TriggerId;
276
+ readonly pluginVersion: string | undefined;
277
+ readonly trigger: TriggerDef;
278
+ readonly authMethods: AllowedMethods;
279
+ }
280
+ /**
281
+ * Constructor for one trigger kind.
282
+ *
283
+ * @since 0.6.0
284
+ * @category constructors
285
+ */
286
+ export type Constructor<Kind extends TriggerKind> = <const Identifier extends string, Config extends Schema.Top, Output extends Schema.Top, State extends Schema.Top | undefined = undefined, const RequireAuth extends boolean = true>(identifier: Identifier, options: ContractOptions<Config, Output, State, RequireAuth>) => Trigger<Identifier, Kind, Config, Output, State, RequireAuth>;
287
+ /**
288
+ * Provider webhook triggers must own isolated per-trigger/per-deploy-version
289
+ * ingress/subscription state, or no external provider resource at all.
290
+ * Activating or deactivating one Dual trigger must never mutate provider state
291
+ * that another trigger, deploy version, mailbox, account, or app-level
292
+ * subscription depends on. Shared provider watches must be modeled as polling.
293
+ *
294
+ * @since 0.0.0 @category constructors
295
+ */
296
+ export declare const webhook: Constructor<"webhook">;
297
+ /** @since 0.0.0 @category constructors */
298
+ export declare const polling: Constructor<"polling">;
299
+ /** @since 0.0.0 @category guards */
300
+ export declare const isTrigger: (u: unknown) => u is Any;
301
+ declare const InvalidTriggerConfigError_base: Schema.Class<InvalidTriggerConfigError, Schema.TaggedStruct<"InvalidTriggerConfigError", {
302
+ readonly description: Schema.String;
303
+ readonly triggerId: Schema.String;
304
+ }>, import("effect/Cause").YieldableError>;
305
+ /** @since 0.0.0 @category errors */
306
+ export declare class InvalidTriggerConfigError extends InvalidTriggerConfigError_base {}
307
+ declare const InvalidTriggerStateError_base: Schema.Class<InvalidTriggerStateError, Schema.TaggedStruct<"InvalidTriggerStateError", {
308
+ readonly description: Schema.String;
309
+ readonly location: Schema.Literals<readonly ["input", "result"]>;
310
+ readonly phase: Schema.Literals<readonly ["activate", "deactivate", "verify", "parse", "poll"]>;
311
+ readonly triggerId: Schema.String;
312
+ }>, import("effect/Cause").YieldableError>;
313
+ /** @since 0.0.0 @category errors */
314
+ export declare class InvalidTriggerStateError extends InvalidTriggerStateError_base {}
315
+ declare const InvalidTriggerOutputError_base: Schema.Class<InvalidTriggerOutputError, Schema.TaggedStruct<"InvalidTriggerOutputError", {
316
+ readonly description: Schema.String;
317
+ readonly phase: Schema.Literals<readonly ["parse", "poll"]>;
318
+ readonly triggerId: Schema.String;
319
+ }>, import("effect/Cause").YieldableError>;
320
+ /** @since 0.0.0 @category errors */
321
+ export declare class InvalidTriggerOutputError extends InvalidTriggerOutputError_base {}
322
+ declare const UnsupportedTriggerRuntimeError_base: Schema.Class<UnsupportedTriggerRuntimeError, Schema.TaggedStruct<"UnsupportedTriggerRuntimeError", {
323
+ readonly kind: Schema.Literals<readonly ["webhook", "polling"]>;
324
+ readonly phase: Schema.Literals<readonly ["activate", "deactivate", "verify", "parse", "poll"]>;
325
+ readonly triggerId: Schema.String;
326
+ }>, import("effect/Cause").YieldableError>;
327
+ /** @since 0.0.0 @category errors */
328
+ export declare class UnsupportedTriggerRuntimeError extends UnsupportedTriggerRuntimeError_base {}
329
+ /** @since 0.0.0 @category models */
330
+ export interface LifecycleRequest {
331
+ readonly config: unknown;
332
+ readonly state?: unknown;
333
+ readonly connectionId?: string;
334
+ readonly context?: ConnectionResolutionContext;
335
+ }
336
+ /** @since 0.0.0 @category models */
337
+ export interface WebhookActivationRequest extends LifecycleRequest {
338
+ readonly webhookUrl: string;
339
+ }
340
+ /** @since 0.0.0 @category models */
341
+ export interface WebhookExecutionRequest extends WebhookActivationRequest {
342
+ readonly request: WebhookRequest;
343
+ }
344
+ /** @since 0.0.0 @category models */
345
+ export interface PollExecutionRequest extends LifecycleRequest {}
346
+ /** @since 0.0.0 @category execution */
347
+ export declare const activate: <Entry extends RuntimeTriggerEntry<any, any, any, any>>(entry: Entry, request: WebhookActivationRequest) => Effect.Effect<ActivateSuccess<TriggerIdOf<Entry>, TriggerEncodedState<EntryTrigger<Entry>>>, InvalidTriggerConfigError | InvalidTriggerStateError | UnsupportedTriggerRuntimeError | RuntimeConnectionErrorsFor<EntryAuthMethods<Entry>> | TriggerAppError<EntryTrigger<Entry>>, TriggerRuntimeRequirements<Entry, "activate">>;
348
+ /** @since 0.0.0 @category execution */
349
+ export declare const deactivate: <Entry extends RuntimeTriggerEntry<any, any, any, any>>(entry: Entry, request: WebhookActivationRequest) => Effect.Effect<DeactivateSuccess<TriggerIdOf<Entry>>, InvalidTriggerConfigError | InvalidTriggerStateError | UnsupportedTriggerRuntimeError | RuntimeConnectionErrorsFor<EntryAuthMethods<Entry>> | TriggerAppError<EntryTrigger<Entry>>, TriggerRuntimeRequirements<Entry, "deactivate">>;
350
+ /** @since 0.0.0 @category execution */
351
+ export declare const verify: <Entry extends RuntimeTriggerEntry<any, any, any, any>>(entry: Entry, request: WebhookExecutionRequest) => Effect.Effect<VerifySuccess<TriggerIdOf<Entry>, TriggerEncodedState<EntryTrigger<Entry>>>, InvalidTriggerConfigError | InvalidTriggerStateError | UnsupportedTriggerRuntimeError | RuntimeConnectionErrorsFor<EntryAuthMethods<Entry>> | TriggerAppError<EntryTrigger<Entry>>, TriggerRuntimeRequirements<Entry, "verify">>;
352
+ /** @since 0.0.0 @category execution */
353
+ export declare const parse: <Entry extends RuntimeTriggerEntry<any, any, any, any>>(entry: Entry, request: WebhookExecutionRequest) => Effect.Effect<EmittedEventsSuccess<TriggerIdOf<Entry>, "parse", TriggerEncodedOutput<EntryTrigger<Entry>>, TriggerEncodedState<EntryTrigger<Entry>>>, InvalidTriggerConfigError | InvalidTriggerStateError | InvalidTriggerOutputError | UnsupportedTriggerRuntimeError | RuntimeConnectionErrorsFor<EntryAuthMethods<Entry>> | TriggerAppError<EntryTrigger<Entry>>, TriggerRuntimeRequirements<Entry, "parse">>;
354
+ /** @since 0.0.0 @category execution */
355
+ export declare const poll: <Entry extends RuntimeTriggerEntry<any, any, any, any>>(entry: Entry, request: PollExecutionRequest) => Effect.Effect<EmittedEventsSuccess<TriggerIdOf<Entry>, "poll", TriggerEncodedOutput<EntryTrigger<Entry>>, TriggerEncodedState<EntryTrigger<Entry>>>, InvalidTriggerConfigError | InvalidTriggerStateError | InvalidTriggerOutputError | UnsupportedTriggerRuntimeError | RuntimeConnectionErrorsFor<EntryAuthMethods<Entry>> | TriggerAppError<EntryTrigger<Entry>>, TriggerRuntimeRequirements<Entry, "poll">>;
356
+ //#endregion
357
+ export { Trigger_d_exports };
358
+ //# sourceMappingURL=Trigger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Trigger.d.ts","names":["AuthMethod.Any","_$__internal_trigger_runtime_shared_ts0.TriggerIdOf","_$__internal_trigger_runtime_shared_ts0.EntryTrigger","_$__internal_trigger_runtime_shared_ts0.TriggerEncodedState","_$__internal_trigger_runtime_shared_ts0.EntryAuthMethods","_$__internal_auth_execution_ts0.RuntimeConnectionErrorsFor","_$__internal_trigger_runtime_shared_ts0.TriggerAppError","_$__internal_trigger_runtime_shared_ts0.TriggerRuntimeRequirements","_$__internal_trigger_runtime_shared_ts0.TriggerEncodedOutput"],"sources":["../src/Trigger.ts"],"mappings":";;;;;;;;;;qBAgCa;;YAED,gBAAgB;;YAGhB;;YAEA;;iBAGK;WACN;;WAEA,UAAU,SAAS;WACnB,mBAAmB;WACnB;WACA;WACA,QAAQ,SAAS;;;iBAIX;WACN;WACA,UAAU,SAAS;WACnB;;KAGN,uBAAuB;cA0BtB;WAAe;WAAe;;;;;;;;;qBAoCvB,aAAU,kBAAA,WAAA,qBAAA,OAAA;;;;;;;;qBAYV,mBAAgB,gBAAA,kBAAA,WAAA,kBAAA,WAAA,WAAA,qBAAA,OAAA;;;;;;;;;;;;qBAmBhB,aAAU;WACD,wBAAa;WACd;WACD,SAAA,uBAAuB;WACxB,QAAA;WACG;MAcpB,OAAA;;;;;;;;;;;qBAYW,wBAAqB;WAEf,MAAA;WACG,SAAA,SAAS;WACV;MAsCpB,OAAA;;;;;;;;;qBAUY,cAAW,kBAAA,+BAAA,OAAA;;;;;;;;;;qBAgEX,kBAAe;WACR,SAAA,uBAAuB;WACrB;WACA;MA4BpB,OAAA;;YAGU,eAAe,sCAAsCA,WAC/D,kBAAkB,wBAAwB;;YAGhC,WAAW,cAAc,OAAO,oBAAoB,gBAAgB,OAAO,OACnF,OAAO,OAAO,KAAK,QAAQ;;iBAId,YACf,mCACA,cAAc,eAAe;WAEpB,WAAW;WACX,OAAO;;;iBAID,gBAAgB,mCAAmC;WACzD,OAAO;WACP,MAAM,YAAY;;;iBAGZ,kBAAkB;WACxB,MAAM,YAAY;;;iBAGZ,cAAc,mCAAmC;WACvD;WACA,WAAW;WACX,QAAQ;WACR,MAAM,YAAY;;;;;;;;;;iBAUZ,aAAa;WACnB,WAAW;WACX,QAAQ;;;iBAGF,WAAW;WACjB;WACA,SAAS;;;iBAGH,qBACf,mCACA,mDACA,kBACA;WAES,iBAAiB,WAAW;WAC5B,OAAO;WACP,MAAM,YAAY,WAAW;;;iBAIvB,eAAe,QAAQ;WAC7B,QAAQ;WACR,OAAO;;;iBAGD,uBAAuB,QAAQ,eAAe,eAAe,QAAQ;;WAE3E;;;iBAGM,sBAAsB,QAAQ,eAAe,uBAC5D,QACA;WAES,SAAS;;;iBAGH,aAAa,QAAQ,eAAe,eAAe,QAAQ;;iBAE3D,iBAAiB;WACvB,OAAO;;;iBAGD,WAAW,QAAQ;WACzB,iBAAiB,WAAW;WAC5B,OAAO;;;iBAID,eACf,eAAe,OAAO,KACtB,eAAe,OAAO,KACtB,cAAc,OAAO,iBACrB,kBACA,sBACA,sCAAsCA,mBAA4BA;WAEzD,YACP,OAAO,uBAAuB,OAAO,OAAO,KAAK,SAAS,WAAW,SACrE,SAAS,eAAe,0BACrB,OAAO,OAAO,iBAAiB,WAAW,SAAS,UAAU;WACzD,cACP,OAAO,uBAAuB,OAAO,OAAO,KAAK,SAAS,WAAW,SACrE,SAAS,eAAe,0BACrB,OAAO,aAAa,UAAU;WAC1B,UACP,OAAO,sBAAsB,OAAO,OAAO,KAAK,SAAS,WAAW,SACpE,SAAS,eAAe,0BACrB,OAAO,cAAc,aAAa,WAAW,SAAS,UAAU;;;;;;;;;;WAU5D,SACP,OAAO,sBAAsB,OAAO,OAAO,KAAK,SAAS,WAAW,SACpE,SAAS,eAAe,0BACrB,OAAO,OACV,WAAW,OAAO,OAAO,KAAK,SAAS,WAAW,SAClD,UACA;;;iBAKa,eACf,eAAe,OAAO,KACtB,eAAe,OAAO,KACtB,cAAc,OAAO,iBACrB,kBACA,sBACA,sCAAsCA,mBAA4BA;;;;;;;;;;WAWzD,QACP,OAAO,aAAa,OAAO,OAAO,KAAK,SAAS,WAAW,SAC3D,SAAS,eAAe,0BACrB,OAAO,OACV,WAAW,OAAO,OAAO,KAAK,SAAS,WAAW,SAClD,UACA;;;YAKQ,gBACV,aAAa,aACb,eAAe,OAAO,KACtB,eAAe,OAAO,KACtB,cAAc,OAAO,iBACrB,kBACA,sBACA,sCAAsCA,mBAA4BA,WAChE,yBACA,eAAe,QAAQ,QAAQ,OAAO,UAAU,cAAc,wBAC9D,eAAe,QAAQ,QAAQ,OAAO,UAAU,cAAc;;iBAGjD,QAAQ;WACd;WACA,WAAW;WACX,SAAS,QAAQ;WACjB,SAAS;;;qBAIP,aAAU;;iBAIN,YAAY,SAAS;YAC1B,SAAS;WACV;WACA;WACA;WACA,MAAM;WACN,QAAQ,OAAO;WACf,QAAQ,OAAO;WACf,OAAO,OAAO;WACd;;;iBAIM;WACN;WACA;;;;;;;;iBASM,gBACf,eAAe,OAAO,KACtB,eAAe,OAAO,KACtB,cAAc,OAAO,iBACrB,qCACQ;WACC,QAAQ;WACR,QAAQ;WACR,QAAQ;;WAER,cAAc;;;iBAIR,YACX,wCACA,aAAa,cAAc,iBAC3B,eAAe,OAAO,MAAM,OAAO,SACnC,eAAe,OAAO,MAAM,OAAO,SACnC,cAAc,OAAO,kBAAkB,OAAO,qBAC9C,+CAEI,SAAS;YACP,SAAS;WACV,YAAY;WACZ;WACA;WACA,MAAM;WACN,QAAQ;WACR,QAAQ;WACR,OAAO;WACP,aAAa;;YAGZ,aAAa,mBAAmB,OAAO;YAEvC,aAAa,mBAAmB,OAAO;YAEvC,YAAY,mBAAmB,OAAO;YAEtC,OAAO,mBAAmB,OAAO,OAAO,OAAO,KAAK,aAAa;YAEjE,OAAO,mBAAmB,OAAO,OAAO,OAAO,KAAK,aAAa;YAEjE,MAAM,mBAAmB,OAAO,WAAW,YAAY;;iBAGlD,wBACX,mBAAmB,MAAM,SACzB,gCAAgCA,mBAA4BA,aAC5D,uCACA;WAEK,YAAY;WACZ,WAAW;WACX;WACA,SAAS;WACT,aAAa;;;;;;;;YAWZ,YAAY,aAAa,sBAC7B,2BACN,eAAe,OAAO,KACtB,eAAe,OAAO,KACtB,cAAc,OAAO,mCACf,oCAEN,YAAY,YACZ,SAAS,gBAAgB,QAAQ,QAAQ,OAAO,iBAC7C,QAAQ,YAAY,MAAM,QAAQ,QAAQ,OAAO;;;;;;;;;;qBA2BzC,SAAS;;qBAGT,SAAS;;qBAGT,YAAS,eAAiB,KAAK;;;;;;qBAG/B,kCAAkC;;;;;;;;qBAMlC,iCAAiC;;;;;;;qBAWjC,kCAAkC;;;;;;;qBAUlC,uCAAuC;;iBAUnC;WACN;WACA;WACA;WACA,UAAU;;;iBAIJ,iCAAiC;WACvC;;;iBAIM,gCAAgC;WACtC,SAAS;;;iBAIH,6BAA6B;;qBAGjC,WAAQ,cAAA,yCAAA,OAAA,OAAA,SAAA,6BAAA,OAAA,OAAA,gBAAAC,YAAA,QAAAE,oBAAAD,aAAA,UAAA,4BAAA,2BAAA,iCAAAG,2BAAAD,iBAAA,UAAAE,gBAAAJ,aAAA,SAAAK,2BAAA;;qBAER,aAAU,cAAA,yCAAA,OAAA,OAAA,SAAA,6BAAA,OAAA,OAAA,kBAAAN,YAAA,SAAA,4BAAA,2BAAA,iCAAAI,2BAAAD,iBAAA,UAAAE,gBAAAJ,aAAA,SAAAK,2BAAA;;qBAEV,SAAM,cAAA,yCAAA,OAAA,OAAA,SAAA,4BAAA,OAAA,OAAA,cAAAN,YAAA,QAAAE,oBAAAD,aAAA,UAAA,4BAAA,2BAAA,iCAAAG,2BAAAD,iBAAA,UAAAE,gBAAAJ,aAAA,SAAAK,2BAAA;;qBAEN,QAAK,cAAA,yCAAA,OAAA,OAAA,SAAA,4BAAA,OAAA,OAAA,qBAAAN,YAAA,iBAAAO,qBAAAN,aAAA,SAAAC,oBAAAD,aAAA,UAAA,4BAAA,2BAAA,4BAAA,iCAAAG,2BAAAD,iBAAA,UAAAE,gBAAAJ,aAAA,SAAAK,2BAAA;;qBAEL,OAAI,cAAA,yCAAA,OAAA,OAAA,SAAA,yBAAA,OAAA,OAAA,qBAAAN,YAAA,gBAAAO,qBAAAN,aAAA,SAAAC,oBAAAD,aAAA,UAAA,4BAAA,2BAAA,4BAAA,iCAAAG,2BAAAD,iBAAA,UAAAE,gBAAAJ,aAAA,SAAAK,2BAAA"}
@@ -0,0 +1,287 @@
1
+ import { __exportAll } from "./_virtual/_rolldown/runtime.js";
2
+ import { validateIdentifier } from "./internal/identifier.js";
3
+ import { PipeableProto } from "./internal/proto.js";
4
+ import { activate as activate$1, deactivate as deactivate$1, parse as parse$1, poll as poll$1, verify as verify$1 } from "./internal/trigger-runtime.js";
5
+ import { Array, Clock, Duration, Effect, Match, Number, Option, Predicate, Record, Result, Schema, String, pipe } from "effect";
6
+ import { Base64, Hex } from "effect/encoding";
7
+ //#region src/Trigger.ts
8
+ var Trigger_exports = /* @__PURE__ */ __exportAll({
9
+ InvalidTriggerConfigError: () => InvalidTriggerConfigError,
10
+ InvalidTriggerOutputError: () => InvalidTriggerOutputError,
11
+ InvalidTriggerStateError: () => InvalidTriggerStateError,
12
+ TypeId: () => TypeId,
13
+ UnsupportedTriggerRuntimeError: () => UnsupportedTriggerRuntimeError,
14
+ activate: () => activate,
15
+ bodyDigest: () => bodyDigest,
16
+ deactivate: () => deactivate,
17
+ handlerKey: () => handlerKey,
18
+ isTrigger: () => isTrigger,
19
+ parse: () => parse,
20
+ poll: () => poll,
21
+ polling: () => polling,
22
+ verify: () => verify,
23
+ verifyEcdsaP256: () => verifyEcdsaP256,
24
+ verifyHmac: () => verifyHmac,
25
+ verifyHmacSha256: () => verifyHmacSha256,
26
+ verifyStandardWebhook: () => verifyStandardWebhook,
27
+ verifyToken: () => verifyToken,
28
+ webhook: () => webhook
29
+ });
30
+ /** @since 0.0.0 @category type ids */
31
+ const TypeId = "@dual-os/sdk/Trigger";
32
+ function encoded(part) {
33
+ return Predicate.isString(part) ? new TextEncoder().encode(part) : part;
34
+ }
35
+ function bytes(value) {
36
+ if (Predicate.isString(value)) return new TextEncoder().encode(value);
37
+ if (value instanceof Uint8Array) return new Uint8Array(value);
38
+ const parts = Array.map(value, encoded);
39
+ const joined = new Uint8Array(Number.sumAll(Array.map(parts, (part) => part.length)));
40
+ Array.reduce(parts, 0, (offset, part) => {
41
+ joined.set(part, offset);
42
+ return offset + part.length;
43
+ });
44
+ return joined;
45
+ }
46
+ function sameBytes(left, right) {
47
+ return left.length === right.length && Number.sumAll(Array.zipWith(left, right, (a, b) => a ^ b)) === 0;
48
+ }
49
+ const hmacHashes = {
50
+ sha1: "SHA-1",
51
+ sha256: "SHA-256"
52
+ };
53
+ const matchesAny = Effect.fnUntraced(function* (algorithm, secret, message, signatures) {
54
+ if (secret.length === 0 || signatures.length === 0) return false;
55
+ const key = yield* Effect.promise(() => crypto.subtle.importKey("raw", bytes(secret), {
56
+ hash: hmacHashes[algorithm],
57
+ name: "HMAC"
58
+ }, false, ["sign"]));
59
+ const expected = new Uint8Array(yield* Effect.promise(() => crypto.subtle.sign("HMAC", key, bytes(message))));
60
+ return Array.contains(Array.map(signatures, (signature) => sameBytes(signature, expected)), true);
61
+ });
62
+ /**
63
+ * The hex SHA-256 of a delivery's raw body. Use it as the event key when the provider signs the
64
+ * body but not its delivery identifier header, so a replayed delivery keeps one identity.
65
+ *
66
+ * @since 0.0.0
67
+ * @category webhooks
68
+ */
69
+ const bodyDigest = Effect.fn("Trigger.bodyDigest")(function* (rawBody) {
70
+ const digest = yield* Effect.promise(() => crypto.subtle.digest("SHA-256", bytes(rawBody)));
71
+ return Hex.encode(new Uint8Array(digest));
72
+ });
73
+ /**
74
+ * Whether `signature` is the HMAC-SHA256 of `message` keyed with `secret`, the way most webhook
75
+ * providers sign their deliveries. The comparison runs in constant time.
76
+ *
77
+ * @since 0.0.0
78
+ * @category webhooks
79
+ */
80
+ const verifyHmacSha256 = Effect.fn("Trigger.verifyHmacSha256")(function* (secret, message, signature) {
81
+ return yield* matchesAny("sha256", secret, message, [signature]);
82
+ });
83
+ /**
84
+ * Whether `signature`, written in `encoding`, is the HMAC of `message` keyed with `secret`, given
85
+ * as text or as raw key bytes such as a decoded `whsec_` secret. A message given as parts is signed
86
+ * as their concatenation, such as a timestamp followed by the raw body. Given several signatures,
87
+ * such as one per rotated secret, it verifies when any of them matches and hashes the message once.
88
+ * A missing secret, or signatures none of which is valid `encoding`, never verifies. The comparison
89
+ * runs in constant time.
90
+ *
91
+ * @since 0.0.0
92
+ * @category webhooks
93
+ */
94
+ const verifyHmac = Effect.fn("Trigger.verifyHmac")(function* (options) {
95
+ const decode = pipe(Match.value(options.encoding), Match.when("hex", () => Hex.decode), Match.when("base64", () => Base64.decode), Match.exhaustive);
96
+ return yield* matchesAny(options.algorithm, options.secret, options.message, Array.filterMap(Array.ensure(options.signature), (signature) => decode(signature)));
97
+ });
98
+ /**
99
+ * Whether a [Standard Webhooks](https://www.standardwebhooks.com) delivery is signed with `secret`:
100
+ * one `v1,<base64>` entry of its `webhook-signature` header (`svix-signature` from Svix) must be the
101
+ * HMAC-SHA256 of `id.timestamp.body` keyed with the bytes of the `whsec_` secret, and its timestamp
102
+ * must be within five minutes of now. Header names are lowercase, as in `WebhookRequest`. Missing
103
+ * headers or secret never verify.
104
+ *
105
+ * @since 0.0.0
106
+ * @category webhooks
107
+ */
108
+ const verifyStandardWebhook = Effect.fn("Trigger.verifyStandardWebhook")(function* (options) {
109
+ const now = yield* Clock.currentTimeMillis;
110
+ function header(name) {
111
+ return Option.orElse(Record.get(options.headers, `webhook-${name}`), () => Record.get(options.headers, `svix-${name}`));
112
+ }
113
+ const signed = Option.all({
114
+ id: header("id"),
115
+ key: Result.getSuccess(Base64.decode(pipe(options.secret, String.replace(/^whsec_/u, "")))),
116
+ signature: header("signature"),
117
+ timestamp: Option.filter(header("timestamp"), (timestamp) => Option.exists(Number.parse(timestamp), (seconds) => Number.between(seconds * 1e3, {
118
+ maximum: now + Duration.toMillis(Duration.minutes(5)),
119
+ minimum: now - Duration.toMillis(Duration.minutes(5))
120
+ })))
121
+ });
122
+ return yield* Option.match(signed, {
123
+ onNone: () => Effect.succeed(false),
124
+ onSome: (delivery) => verifyHmac({
125
+ algorithm: "sha256",
126
+ encoding: "base64",
127
+ message: [`${delivery.id}.${delivery.timestamp}.`, options.body],
128
+ secret: delivery.key,
129
+ signature: pipe(delivery.signature, String.split(" "), Array.filter(String.startsWith("v1,")), Array.map(String.slice(3)))
130
+ })
131
+ });
132
+ });
133
+ /**
134
+ * Whether `actual` equals the shared secret `expected`, for providers that send the secret itself
135
+ * back with each delivery. An empty or missing secret never verifies. The comparison runs in
136
+ * constant time.
137
+ *
138
+ * @since 0.0.0
139
+ * @category webhooks
140
+ */
141
+ const verifyToken = Effect.fn("Trigger.verifyToken")(function* (expected, actual) {
142
+ if (expected === "" || actual === void 0) return false;
143
+ const key = yield* Effect.promise(() => crypto.subtle.importKey("raw", crypto.getRandomValues(/* @__PURE__ */ new Uint8Array(32)), {
144
+ hash: "SHA-256",
145
+ name: "HMAC"
146
+ }, false, ["sign", "verify"]));
147
+ const reference = yield* Effect.promise(() => crypto.subtle.sign("HMAC", key, bytes(expected)));
148
+ return yield* Effect.promise(() => crypto.subtle.verify("HMAC", key, reference, bytes(actual)));
149
+ });
150
+ const p256ScalarLength = 32;
151
+ function paddedScalar(integer) {
152
+ const trimmed = Array.dropWhile(integer, (byte) => byte === 0);
153
+ return Option.liftPredicate(Array.appendAll(Array.take(Array.replicate(0, p256ScalarLength), p256ScalarLength - trimmed.length), trimmed), (scalar) => scalar.length === p256ScalarLength);
154
+ }
155
+ function derInteger(der, offset) {
156
+ return Option.gen(function* () {
157
+ yield* Option.liftPredicate(yield* Array.get(der, offset), (tag) => tag === 2);
158
+ const length = yield* Array.get(der, offset + 1);
159
+ const value = Array.take(Array.drop(der, offset + 2), length);
160
+ yield* Option.liftPredicate(value, (taken) => taken.length === length);
161
+ return {
162
+ next: offset + 2 + length,
163
+ value
164
+ };
165
+ });
166
+ }
167
+ function derToP1363(signature) {
168
+ return Option.gen(function* () {
169
+ const der = Array.fromIterable(signature);
170
+ yield* Option.liftPredicate(yield* Array.get(der, 0), (tag) => tag === 48);
171
+ yield* Option.liftPredicate(yield* Array.get(der, 1), (length) => length === der.length - 2);
172
+ const r = yield* derInteger(der, 2);
173
+ const s = yield* derInteger(der, r.next);
174
+ yield* Option.liftPredicate(s.next, (next) => next === der.length);
175
+ return new Uint8Array(Array.appendAll(yield* paddedScalar(r.value), yield* paddedScalar(s.value)));
176
+ });
177
+ }
178
+ /**
179
+ * Whether `signature`, a base64 DER ECDSA signature, signs `message` with the ECDSA P-256 key
180
+ * `publicKey`, a base64 DER SubjectPublicKeyInfo, hashed with SHA-256. A message given as parts is
181
+ * signed as their concatenation, such as a timestamp followed by the raw body. A missing key or a
182
+ * key or signature that is not valid never verifies.
183
+ *
184
+ * @since 0.0.0
185
+ * @category webhooks
186
+ */
187
+ const verifyEcdsaP256 = Effect.fn("Trigger.verifyEcdsaP256")(function* (options) {
188
+ const decoded = Option.all({
189
+ publicKey: Result.getSuccess(Base64.decode(options.publicKey)),
190
+ signature: Option.flatMap(Result.getSuccess(Base64.decode(options.signature)), derToP1363)
191
+ });
192
+ return yield* Option.match(decoded, {
193
+ onNone: () => Effect.succeed(false),
194
+ onSome: Effect.fnUntraced(function* (keys) {
195
+ return yield* pipe(Effect.tryPromise(async () => crypto.subtle.verify({
196
+ hash: "SHA-256",
197
+ name: "ECDSA"
198
+ }, await crypto.subtle.importKey("spki", bytes(keys.publicKey), {
199
+ name: "ECDSA",
200
+ namedCurve: "P-256"
201
+ }, false, ["verify"]), keys.signature, bytes(options.message))), Effect.orElseSucceed(() => false));
202
+ })
203
+ });
204
+ });
205
+ /** @since 0.0.0 @category handlers */
206
+ const handlerKey = (triggerId) => `@dual-os/sdk/Trigger/Handler/${triggerId}`;
207
+ const Proto = {
208
+ ...PipeableProto,
209
+ [TypeId]: TypeId
210
+ };
211
+ const constructor = (kind) => (identifier, options) => {
212
+ validateIdentifier("trigger", identifier);
213
+ return Object.assign(Object.create(Proto), {
214
+ config: options.config,
215
+ description: options.description,
216
+ identifier,
217
+ kind,
218
+ name: options.name,
219
+ output: options.output,
220
+ requireAuth: options.requireAuth ?? true,
221
+ state: options.state
222
+ });
223
+ };
224
+ /**
225
+ * Provider webhook triggers must own isolated per-trigger/per-deploy-version
226
+ * ingress/subscription state, or no external provider resource at all.
227
+ * Activating or deactivating one Dual trigger must never mutate provider state
228
+ * that another trigger, deploy version, mailbox, account, or app-level
229
+ * subscription depends on. Shared provider watches must be modeled as polling.
230
+ *
231
+ * @since 0.0.0 @category constructors
232
+ */
233
+ const webhook = constructor("webhook");
234
+ /** @since 0.0.0 @category constructors */
235
+ const polling = constructor("polling");
236
+ /** @since 0.0.0 @category guards */
237
+ const isTrigger = (u) => Predicate.hasProperty(u, TypeId);
238
+ /** @since 0.0.0 @category errors */
239
+ var InvalidTriggerConfigError = class extends Schema.TaggedError()("InvalidTriggerConfigError", {
240
+ description: Schema.String,
241
+ triggerId: Schema.String
242
+ }) {};
243
+ /** @since 0.0.0 @category errors */
244
+ var InvalidTriggerStateError = class extends Schema.TaggedError()("InvalidTriggerStateError", {
245
+ description: Schema.String,
246
+ location: Schema.Literals(["input", "result"]),
247
+ phase: Schema.Literals([
248
+ "activate",
249
+ "deactivate",
250
+ "verify",
251
+ "parse",
252
+ "poll"
253
+ ]),
254
+ triggerId: Schema.String
255
+ }) {};
256
+ /** @since 0.0.0 @category errors */
257
+ var InvalidTriggerOutputError = class extends Schema.TaggedError()("InvalidTriggerOutputError", {
258
+ description: Schema.String,
259
+ phase: Schema.Literals(["parse", "poll"]),
260
+ triggerId: Schema.String
261
+ }) {};
262
+ /** @since 0.0.0 @category errors */
263
+ var UnsupportedTriggerRuntimeError = class extends Schema.TaggedError()("UnsupportedTriggerRuntimeError", {
264
+ kind: Schema.Literals(["webhook", "polling"]),
265
+ phase: Schema.Literals([
266
+ "activate",
267
+ "deactivate",
268
+ "verify",
269
+ "parse",
270
+ "poll"
271
+ ]),
272
+ triggerId: Schema.String
273
+ }) {};
274
+ /** @since 0.0.0 @category execution */
275
+ const activate = activate$1;
276
+ /** @since 0.0.0 @category execution */
277
+ const deactivate = deactivate$1;
278
+ /** @since 0.0.0 @category execution */
279
+ const verify = verify$1;
280
+ /** @since 0.0.0 @category execution */
281
+ const parse = parse$1;
282
+ /** @since 0.0.0 @category execution */
283
+ const poll = poll$1;
284
+ //#endregion
285
+ export { InvalidTriggerConfigError, InvalidTriggerOutputError, InvalidTriggerStateError, Trigger_exports, TypeId, UnsupportedTriggerRuntimeError, activate, bodyDigest, deactivate, handlerKey, isTrigger, parse, poll, polling, verify, verifyEcdsaP256, verifyHmac, verifyHmacSha256, verifyStandardWebhook, verifyToken, webhook };
286
+
287
+ //# sourceMappingURL=Trigger.js.map