awaitly 1.35.0 → 2.0.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 (241) hide show
  1. package/dist/{duration.d.ts → di-BDlT7InM.d.cts} +15 -1
  2. package/dist/{duration.d.cts → di-BbFFfO8y.d.ts} +15 -1
  3. package/dist/errors-DtXvrCiO.d.cts +708 -0
  4. package/dist/errors-DtXvrCiO.d.ts +708 -0
  5. package/dist/index.cjs +4594 -1
  6. package/dist/index.cjs.map +1 -1
  7. package/dist/index.d.cts +1970 -141
  8. package/dist/index.d.ts +1970 -141
  9. package/dist/index.js +4398 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/result.cjs +641 -1
  12. package/dist/result.cjs.map +1 -1
  13. package/dist/result.d.cts +29 -4
  14. package/dist/result.d.ts +29 -4
  15. package/dist/result.js +561 -1
  16. package/dist/result.js.map +1 -1
  17. package/dist/testing.cjs +4202 -8
  18. package/dist/testing.cjs.map +1 -1
  19. package/dist/testing.d.cts +2 -6
  20. package/dist/testing.d.ts +2 -6
  21. package/dist/testing.js +4154 -8
  22. package/dist/testing.js.map +1 -1
  23. package/dist/{run-entry-DGs0tySr.d.cts → types-B8NfNRGX.d.ts} +1078 -1502
  24. package/dist/{run-entry-BOuNyVoO.d.ts → types-BZ2f4MRR.d.cts} +1078 -1502
  25. package/dist/workflow.cjs +7096 -6
  26. package/dist/workflow.cjs.map +1 -1
  27. package/dist/workflow.d.cts +3346 -22
  28. package/dist/workflow.d.ts +3346 -22
  29. package/dist/workflow.js +6929 -6
  30. package/dist/workflow.js.map +1 -1
  31. package/package.json +3 -168
  32. package/dist/adapters.cjs +0 -7
  33. package/dist/adapters.cjs.map +0 -1
  34. package/dist/adapters.d.cts +0 -179
  35. package/dist/adapters.d.ts +0 -179
  36. package/dist/adapters.js +0 -7
  37. package/dist/adapters.js.map +0 -1
  38. package/dist/batch.cjs +0 -7
  39. package/dist/batch.cjs.map +0 -1
  40. package/dist/batch.d.cts +0 -200
  41. package/dist/batch.d.ts +0 -200
  42. package/dist/batch.js +0 -7
  43. package/dist/batch.js.map +0 -1
  44. package/dist/bind-deps.cjs +0 -2
  45. package/dist/bind-deps.cjs.map +0 -1
  46. package/dist/bind-deps.d.cts +0 -28
  47. package/dist/bind-deps.d.ts +0 -28
  48. package/dist/bind-deps.js +0 -2
  49. package/dist/bind-deps.js.map +0 -1
  50. package/dist/cache.cjs +0 -2
  51. package/dist/cache.cjs.map +0 -1
  52. package/dist/cache.d.cts +0 -269
  53. package/dist/cache.d.ts +0 -269
  54. package/dist/cache.js +0 -2
  55. package/dist/cache.js.map +0 -1
  56. package/dist/circuit-breaker.cjs +0 -7
  57. package/dist/circuit-breaker.cjs.map +0 -1
  58. package/dist/circuit-breaker.d.cts +0 -211
  59. package/dist/circuit-breaker.d.ts +0 -211
  60. package/dist/circuit-breaker.js +0 -7
  61. package/dist/circuit-breaker.js.map +0 -1
  62. package/dist/conditional.cjs +0 -2
  63. package/dist/conditional.cjs.map +0 -1
  64. package/dist/conditional.d.cts +0 -252
  65. package/dist/conditional.d.ts +0 -252
  66. package/dist/conditional.js +0 -2
  67. package/dist/conditional.js.map +0 -1
  68. package/dist/core.cjs +0 -7
  69. package/dist/core.cjs.map +0 -1
  70. package/dist/core.d.cts +0 -5
  71. package/dist/core.d.ts +0 -5
  72. package/dist/core.js +0 -7
  73. package/dist/core.js.map +0 -1
  74. package/dist/di-By77n4Fa.d.ts +0 -15
  75. package/dist/di-OJfsohf-.d.cts +0 -15
  76. package/dist/diagnostics.cjs +0 -8
  77. package/dist/diagnostics.cjs.map +0 -1
  78. package/dist/diagnostics.d.cts +0 -68
  79. package/dist/diagnostics.d.ts +0 -68
  80. package/dist/diagnostics.js +0 -8
  81. package/dist/diagnostics.js.map +0 -1
  82. package/dist/durable.cjs +0 -11
  83. package/dist/durable.cjs.map +0 -1
  84. package/dist/durable.d.cts +0 -9
  85. package/dist/durable.d.ts +0 -9
  86. package/dist/durable.js +0 -11
  87. package/dist/durable.js.map +0 -1
  88. package/dist/duration.cjs +0 -2
  89. package/dist/duration.cjs.map +0 -1
  90. package/dist/duration.js +0 -2
  91. package/dist/duration.js.map +0 -1
  92. package/dist/engine.cjs +0 -11
  93. package/dist/engine.cjs.map +0 -1
  94. package/dist/engine.d.cts +0 -115
  95. package/dist/engine.d.ts +0 -115
  96. package/dist/engine.js +0 -11
  97. package/dist/engine.js.map +0 -1
  98. package/dist/errors.cjs +0 -2
  99. package/dist/errors.cjs.map +0 -1
  100. package/dist/errors.d.cts +0 -361
  101. package/dist/errors.d.ts +0 -361
  102. package/dist/errors.js +0 -2
  103. package/dist/errors.js.map +0 -1
  104. package/dist/fetch.cjs +0 -7
  105. package/dist/fetch.cjs.map +0 -1
  106. package/dist/fetch.d.cts +0 -86
  107. package/dist/fetch.d.ts +0 -86
  108. package/dist/fetch.js +0 -7
  109. package/dist/fetch.js.map +0 -1
  110. package/dist/flow.cjs +0 -7
  111. package/dist/flow.cjs.map +0 -1
  112. package/dist/flow.d.cts +0 -163
  113. package/dist/flow.d.ts +0 -163
  114. package/dist/flow.js +0 -7
  115. package/dist/flow.js.map +0 -1
  116. package/dist/functional.cjs +0 -2
  117. package/dist/functional.cjs.map +0 -1
  118. package/dist/functional.d.cts +0 -444
  119. package/dist/functional.d.ts +0 -444
  120. package/dist/functional.js +0 -2
  121. package/dist/functional.js.map +0 -1
  122. package/dist/guards-4sV7mTqj.d.cts +0 -72
  123. package/dist/guards-BIX05ALH.d.ts +0 -72
  124. package/dist/hitl-DFn4Xa_l.d.cts +0 -468
  125. package/dist/hitl-DU5VpKq7.d.ts +0 -468
  126. package/dist/hitl.cjs +0 -7
  127. package/dist/hitl.cjs.map +0 -1
  128. package/dist/hitl.d.cts +0 -442
  129. package/dist/hitl.d.ts +0 -442
  130. package/dist/hitl.js +0 -7
  131. package/dist/hitl.js.map +0 -1
  132. package/dist/index-CnvBryQB.d.ts +0 -417
  133. package/dist/index-DEZEf8Fs.d.cts +0 -417
  134. package/dist/match-entry-DjI2bLpD.d.cts +0 -209
  135. package/dist/match-entry-DjI2bLpD.d.ts +0 -209
  136. package/dist/match.cjs +0 -2
  137. package/dist/match.cjs.map +0 -1
  138. package/dist/match.d.cts +0 -1
  139. package/dist/match.d.ts +0 -1
  140. package/dist/match.js +0 -2
  141. package/dist/match.js.map +0 -1
  142. package/dist/otel.cjs +0 -2
  143. package/dist/otel.cjs.map +0 -1
  144. package/dist/otel.d.cts +0 -188
  145. package/dist/otel.d.ts +0 -188
  146. package/dist/otel.js +0 -2
  147. package/dist/otel.js.map +0 -1
  148. package/dist/persistence-entry-B-8PjnSR.d.cts +0 -831
  149. package/dist/persistence-entry-D8zRkLiT.d.ts +0 -831
  150. package/dist/persistence.cjs +0 -2
  151. package/dist/persistence.cjs.map +0 -1
  152. package/dist/persistence.d.cts +0 -7
  153. package/dist/persistence.d.ts +0 -7
  154. package/dist/persistence.js +0 -2
  155. package/dist/persistence.js.map +0 -1
  156. package/dist/policies.cjs +0 -2
  157. package/dist/policies.cjs.map +0 -1
  158. package/dist/policies.d.cts +0 -379
  159. package/dist/policies.d.ts +0 -379
  160. package/dist/policies.js +0 -2
  161. package/dist/policies.js.map +0 -1
  162. package/dist/ratelimit.cjs +0 -7
  163. package/dist/ratelimit.cjs.map +0 -1
  164. package/dist/ratelimit.d.cts +0 -458
  165. package/dist/ratelimit.d.ts +0 -458
  166. package/dist/ratelimit.js +0 -7
  167. package/dist/ratelimit.js.map +0 -1
  168. package/dist/reliability.cjs +0 -11
  169. package/dist/reliability.cjs.map +0 -1
  170. package/dist/reliability.d.cts +0 -11
  171. package/dist/reliability.d.ts +0 -11
  172. package/dist/reliability.js +0 -11
  173. package/dist/reliability.js.map +0 -1
  174. package/dist/resolver.cjs +0 -7
  175. package/dist/resolver.cjs.map +0 -1
  176. package/dist/resolver.d.cts +0 -68
  177. package/dist/resolver.d.ts +0 -68
  178. package/dist/resolver.js +0 -7
  179. package/dist/resolver.js.map +0 -1
  180. package/dist/resource.cjs +0 -7
  181. package/dist/resource.cjs.map +0 -1
  182. package/dist/resource.d.cts +0 -174
  183. package/dist/resource.d.ts +0 -174
  184. package/dist/resource.js +0 -7
  185. package/dist/resource.js.map +0 -1
  186. package/dist/result/retry.cjs +0 -2
  187. package/dist/result/retry.cjs.map +0 -1
  188. package/dist/result/retry.d.cts +0 -70
  189. package/dist/result/retry.d.ts +0 -70
  190. package/dist/result/retry.js +0 -2
  191. package/dist/result/retry.js.map +0 -1
  192. package/dist/retry.cjs +0 -2
  193. package/dist/retry.cjs.map +0 -1
  194. package/dist/retry.d.cts +0 -388
  195. package/dist/retry.d.ts +0 -388
  196. package/dist/retry.js +0 -2
  197. package/dist/retry.js.map +0 -1
  198. package/dist/run.cjs +0 -7
  199. package/dist/run.cjs.map +0 -1
  200. package/dist/run.d.cts +0 -4
  201. package/dist/run.d.ts +0 -4
  202. package/dist/run.js +0 -7
  203. package/dist/run.js.map +0 -1
  204. package/dist/saga.cjs +0 -11
  205. package/dist/saga.cjs.map +0 -1
  206. package/dist/saga.d.cts +0 -164
  207. package/dist/saga.d.ts +0 -164
  208. package/dist/saga.js +0 -11
  209. package/dist/saga.js.map +0 -1
  210. package/dist/singleflight.cjs +0 -2
  211. package/dist/singleflight.cjs.map +0 -1
  212. package/dist/singleflight.d.cts +0 -145
  213. package/dist/singleflight.d.ts +0 -145
  214. package/dist/singleflight.js +0 -2
  215. package/dist/singleflight.js.map +0 -1
  216. package/dist/slugs.cjs +0 -2
  217. package/dist/slugs.cjs.map +0 -1
  218. package/dist/slugs.d.cts +0 -67
  219. package/dist/slugs.d.ts +0 -67
  220. package/dist/slugs.js +0 -2
  221. package/dist/slugs.js.map +0 -1
  222. package/dist/streaming.cjs +0 -9
  223. package/dist/streaming.cjs.map +0 -1
  224. package/dist/streaming.d.cts +0 -596
  225. package/dist/streaming.d.ts +0 -596
  226. package/dist/streaming.js +0 -9
  227. package/dist/streaming.js.map +0 -1
  228. package/dist/tagged-error.cjs +0 -2
  229. package/dist/tagged-error.cjs.map +0 -1
  230. package/dist/tagged-error.d.cts +0 -275
  231. package/dist/tagged-error.d.ts +0 -275
  232. package/dist/tagged-error.js +0 -2
  233. package/dist/tagged-error.js.map +0 -1
  234. package/dist/types-BziYHFkD.d.ts +0 -323
  235. package/dist/types-C5jLEUqY.d.cts +0 -323
  236. package/dist/webhook.cjs +0 -7
  237. package/dist/webhook.cjs.map +0 -1
  238. package/dist/webhook.d.cts +0 -499
  239. package/dist/webhook.d.ts +0 -499
  240. package/dist/webhook.js +0 -7
  241. package/dist/webhook.js.map +0 -1
package/dist/otel.d.ts DELETED
@@ -1,188 +0,0 @@
1
- import { ae as WorkflowEvent } from './run-entry-BOuNyVoO.js';
2
- import './errors.js';
3
- import './tagged-error.js';
4
- import './slugs.js';
5
-
6
- /**
7
- * Autotel Integration
8
- *
9
- * First-class OpenTelemetry spans and metrics from the workflow event stream
10
- * using the autotel library.
11
- *
12
- * @example
13
- * ```typescript
14
- * import { createAutotelAdapter } from 'awaitly/autotel';
15
- * import { init } from 'autotel';
16
- *
17
- * // Initialize autotel
18
- * init({ service: 'checkout-api' });
19
- *
20
- * // Create adapter
21
- * const otel = createAutotelAdapter({ serviceName: 'checkout' });
22
- *
23
- * // Use with workflow
24
- * const workflow = createWorkflow(deps, { onEvent: otel.handleEvent });
25
- *
26
- * // Automatic spans: workflow > step > retry attempts
27
- * // Automatic metrics: step_duration, retry_count, error_rate
28
- * ```
29
- */
30
-
31
- /**
32
- * Configuration for the autotel adapter.
33
- */
34
- interface AutotelAdapterConfig {
35
- /**
36
- * Service name for spans (used as prefix).
37
- */
38
- serviceName?: string;
39
- /**
40
- * Whether to create spans for each step.
41
- * @default true
42
- */
43
- createStepSpans?: boolean;
44
- /**
45
- * Whether to record metrics for steps.
46
- * @default true
47
- */
48
- recordMetrics?: boolean;
49
- /**
50
- * Custom attributes to add to all spans.
51
- */
52
- defaultAttributes?: Record<string, string | number | boolean>;
53
- /**
54
- * Whether to record retry events as span events.
55
- * @default true
56
- */
57
- recordRetryEvents?: boolean;
58
- /**
59
- * Whether to mark workflow errors as span errors.
60
- * @default true
61
- */
62
- markErrorsOnSpan?: boolean;
63
- }
64
- /**
65
- * Metrics collected by the adapter.
66
- */
67
- interface AutotelMetrics {
68
- stepDurations: Array<{
69
- name: string;
70
- durationMs: number;
71
- success: boolean;
72
- attributes?: Record<string, string | number | boolean>;
73
- }>;
74
- retryCount: number;
75
- errorCount: number;
76
- cacheHits: number;
77
- cacheMisses: number;
78
- /** Default attributes applied to all metrics */
79
- defaultAttributes: Record<string, string | number | boolean>;
80
- }
81
- /**
82
- * Autotel adapter interface.
83
- */
84
- interface AutotelAdapter {
85
- /**
86
- * Handle workflow events (pass to onEvent option).
87
- */
88
- handleEvent: (event: WorkflowEvent<unknown>) => void;
89
- /**
90
- * Get current active spans count (for debugging).
91
- */
92
- getActiveSpansCount: () => {
93
- workflows: number;
94
- steps: number;
95
- };
96
- /**
97
- * Get collected metrics.
98
- */
99
- getMetrics: () => AutotelMetrics;
100
- /**
101
- * Reset adapter state.
102
- */
103
- reset: () => void;
104
- }
105
- /**
106
- * Create an autotel adapter for workflow observability.
107
- *
108
- * This adapter translates workflow events into metrics and tracking data.
109
- * When autotel is installed and initialized, it will also create OpenTelemetry spans.
110
- *
111
- * @param config - Adapter configuration
112
- * @returns An AutotelAdapter instance
113
- *
114
- * @example
115
- * ```typescript
116
- * import { createAutotelAdapter } from 'awaitly/autotel';
117
- *
118
- * const otel = createAutotelAdapter({ serviceName: 'checkout' });
119
- *
120
- * const workflow = createWorkflow(deps, {
121
- * onEvent: otel.handleEvent,
122
- * });
123
- * ```
124
- */
125
- declare function createAutotelAdapter(config?: AutotelAdapterConfig): AutotelAdapter;
126
- /**
127
- * Create an event handler that integrates with autotel's trace() function.
128
- *
129
- * This is a higher-level integration that creates actual OpenTelemetry spans
130
- * for each workflow and step when autotel is initialized.
131
- *
132
- * @param options - Configuration options
133
- * @returns An event handler function
134
- *
135
- * @example
136
- * ```typescript
137
- * import { createAutotelEventHandler } from 'awaitly/autotel';
138
- * import { init } from 'autotel';
139
- *
140
- * init({ service: 'checkout-api' });
141
- *
142
- * const handler = createAutotelEventHandler({ serviceName: 'checkout' });
143
- *
144
- * const workflow = createWorkflow(deps, {
145
- * onEvent: handler,
146
- * });
147
- * ```
148
- */
149
- declare function createAutotelEventHandler(options?: {
150
- serviceName?: string;
151
- includeStepDetails?: boolean;
152
- }): (event: WorkflowEvent<unknown>) => void;
153
- /**
154
- * Wrapper type for autotel trace function.
155
- * Use this when you want to explicitly type the autotel integration.
156
- */
157
- type AutotelTraceFn = <T>(name: string, fn: (ctx: {
158
- setAttribute: (key: string, value: unknown) => void;
159
- }) => T | Promise<T>) => T | Promise<T>;
160
- /**
161
- * Create a workflow wrapper that adds autotel tracing.
162
- *
163
- * This creates a higher-order function that wraps workflow execution
164
- * in an autotel trace span.
165
- *
166
- * @param traceFn - The autotel trace function
167
- * @param options - Wrapper options
168
- * @returns A workflow wrapper function
169
- *
170
- * @example
171
- * ```typescript
172
- * import { trace } from 'autotel';
173
- * import { withAutotelTracing } from 'awaitly/autotel';
174
- *
175
- * const traced = withAutotelTracing(trace, { serviceName: 'checkout' });
176
- *
177
- * const result = await traced('process-order', async () => {
178
- * return workflow(async ({ step }) => {
179
- * // ... workflow logic
180
- * });
181
- * });
182
- * ```
183
- */
184
- declare function withAutotelTracing(traceFn: AutotelTraceFn, options?: {
185
- serviceName?: string;
186
- }): <T>(name: string, fn: () => T | Promise<T>, attributes?: Record<string, string | number | boolean>) => Promise<T>;
187
-
188
- export { type AutotelAdapter, type AutotelAdapterConfig, type AutotelMetrics, type AutotelTraceFn, createAutotelAdapter, createAutotelEventHandler, withAutotelTracing };
package/dist/otel.js DELETED
@@ -1,2 +0,0 @@
1
- function m(l={}){let{serviceName:c="workflow",createStepSpans:i=!0,recordMetrics:e=!0,defaultAttributes:s={},recordRetryEvents:u=!0,markErrorsOnSpan:f=!0}=l,o={workflows:new Map,steps:new Map},r={stepDurations:[],retryCount:0,errorCount:0,cacheHits:0,cacheMisses:0,defaultAttributes:s};function d(t,n){return t?`${c}.${t}`:n?`${c}.step.${n}`:`${c}.step`}function w(t){switch(t.type){case"workflow_start":o.workflows.set(t.workflowId,{workflowId:t.workflowId,startTime:t.ts});break;case"workflow_success":case"workflow_error":o.workflows.get(t.workflowId)&&o.workflows.delete(t.workflowId),t.type==="workflow_error"&&f&&r.errorCount++;break;case"step_start":if(i){let n=t.stepId;o.steps.set(n,{workflowId:t.workflowId,stepId:n,stepKey:t.stepKey,name:t.name,startTime:t.ts,metadata:t.metadata})}break;case"step_success":case"step_error":if(i){let n=t.stepId,a=o.steps.get(n);if(a){if(o.steps.delete(n),e){let p={...Object.keys(s).length>0?s:{}};a.metadata&&(a.metadata.domain&&(p["step.domain"]=a.metadata.domain),a.metadata.owner&&(p["step.owner"]=a.metadata.owner),a.metadata.intent&&a.metadata.intent.length<=100&&(p["step.intent"]=a.metadata.intent)),t.type==="step_error"&&t.diagnostics&&(t.diagnostics.classification?.severity&&(p["error.severity"]=t.diagnostics.classification.severity),t.diagnostics.classification?.retryable!==void 0&&(p["error.retryable"]=t.diagnostics.classification.retryable)),r.stepDurations.push({name:d(a.name,a.stepKey),durationMs:t.durationMs,success:t.type==="step_success",attributes:Object.keys(p).length>0?p:void 0})}t.type==="step_error"&&f&&r.errorCount++}}break;case"step_retry":u&&r.retryCount++;break;case"step_cache_hit":r.cacheHits++;break;case"step_cache_miss":r.cacheMisses++;break;default:break}}return{handleEvent:w,getActiveSpansCount(){return{workflows:o.workflows.size,steps:o.steps.size}},getMetrics(){return{...r,stepDurations:[...r.stepDurations]}},reset(){o.workflows.clear(),o.steps.clear(),r.stepDurations.length=0,r.retryCount=0,r.errorCount=0,r.cacheHits=0,r.cacheMisses=0}}}function k(l){let{serviceName:c="workflow",includeStepDetails:i=!0}=l??{};return e=>{if(process.env.AUTOTEL_DEBUG==="true"){let s=`[${c}]`;switch(e.type){case"workflow_start":console.log(`${s} Workflow started: ${e.workflowId}`);break;case"workflow_success":console.log(`${s} Workflow success: ${e.workflowId} (${e.durationMs}ms)`);break;case"workflow_error":console.log(`${s} Workflow error: ${e.workflowId}`,e.error);break;case"step_start":i&&console.log(`${s} Step started: ${e.name??e.stepKey??e.stepId}`);break;case"step_success":i&&console.log(`${s} Step success: ${e.name??e.stepKey??e.stepId} (${e.durationMs}ms)`);break;case"step_error":i&&console.log(`${s} Step error: ${e.name??e.stepKey??e.stepId}`,e.error);break;case"step_retry":console.log(`${s} Step retry: ${e.name??e.stepKey??e.stepId} (attempt ${e.attempt}/${e.maxAttempts})`);break}}}}function g(l,c){let{serviceName:i="workflow"}=c??{};return async(e,s,u)=>{let f=`${i}.${e}`;return l(f,async o=>{if(u)for(let[r,d]of Object.entries(u))o.setAttribute(r,d);return s()})}}export{m as createAutotelAdapter,k as createAutotelEventHandler,g as withAutotelTracing};
2
- //# sourceMappingURL=otel.js.map
package/dist/otel.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/autotel.ts"],"sourcesContent":["/**\n * Autotel Integration\n *\n * First-class OpenTelemetry spans and metrics from the workflow event stream\n * using the autotel library.\n *\n * @example\n * ```typescript\n * import { createAutotelAdapter } from 'awaitly/autotel';\n * import { init } from 'autotel';\n *\n * // Initialize autotel\n * init({ service: 'checkout-api' });\n *\n * // Create adapter\n * const otel = createAutotelAdapter({ serviceName: 'checkout' });\n *\n * // Use with workflow\n * const workflow = createWorkflow(deps, { onEvent: otel.handleEvent });\n *\n * // Automatic spans: workflow > step > retry attempts\n * // Automatic metrics: step_duration, retry_count, error_rate\n * ```\n */\n\nimport type { WorkflowEvent, StepMetadata } from \"./core\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Configuration for the autotel adapter.\n */\nexport interface AutotelAdapterConfig {\n /**\n * Service name for spans (used as prefix).\n */\n serviceName?: string;\n\n /**\n * Whether to create spans for each step.\n * @default true\n */\n createStepSpans?: boolean;\n\n /**\n * Whether to record metrics for steps.\n * @default true\n */\n recordMetrics?: boolean;\n\n /**\n * Custom attributes to add to all spans.\n */\n defaultAttributes?: Record<string, string | number | boolean>;\n\n /**\n * Whether to record retry events as span events.\n * @default true\n */\n recordRetryEvents?: boolean;\n\n /**\n * Whether to mark workflow errors as span errors.\n * @default true\n */\n markErrorsOnSpan?: boolean;\n}\n\n/**\n * Span tracking info.\n */\ninterface SpanInfo {\n workflowId: string;\n stepId?: string;\n stepKey?: string;\n name?: string;\n startTime: number;\n metadata?: StepMetadata;\n}\n\n/**\n * Active spans tracking.\n */\ninterface ActiveSpans {\n workflows: Map<string, SpanInfo>;\n steps: Map<string, SpanInfo>;\n}\n\n/**\n * Metrics collected by the adapter.\n */\nexport interface AutotelMetrics {\n stepDurations: Array<{ \n name: string; \n durationMs: number; \n success: boolean;\n attributes?: Record<string, string | number | boolean>;\n }>;\n retryCount: number;\n errorCount: number;\n cacheHits: number;\n cacheMisses: number;\n /** Default attributes applied to all metrics */\n defaultAttributes: Record<string, string | number | boolean>;\n}\n\n/**\n * Autotel adapter interface.\n */\nexport interface AutotelAdapter {\n /**\n * Handle workflow events (pass to onEvent option).\n */\n handleEvent: (event: WorkflowEvent<unknown>) => void;\n\n /**\n * Get current active spans count (for debugging).\n */\n getActiveSpansCount: () => { workflows: number; steps: number };\n\n /**\n * Get collected metrics.\n */\n getMetrics: () => AutotelMetrics;\n\n /**\n * Reset adapter state.\n */\n reset: () => void;\n}\n\n// =============================================================================\n// Implementation\n// =============================================================================\n\n/**\n * Create an autotel adapter for workflow observability.\n *\n * This adapter translates workflow events into metrics and tracking data.\n * When autotel is installed and initialized, it will also create OpenTelemetry spans.\n *\n * @param config - Adapter configuration\n * @returns An AutotelAdapter instance\n *\n * @example\n * ```typescript\n * import { createAutotelAdapter } from 'awaitly/autotel';\n *\n * const otel = createAutotelAdapter({ serviceName: 'checkout' });\n *\n * const workflow = createWorkflow(deps, {\n * onEvent: otel.handleEvent,\n * });\n * ```\n */\nexport function createAutotelAdapter(\n config: AutotelAdapterConfig = {}\n): AutotelAdapter {\n const {\n serviceName = \"workflow\",\n createStepSpans = true,\n recordMetrics = true,\n defaultAttributes = {},\n recordRetryEvents = true,\n markErrorsOnSpan = true,\n } = config;\n\n // Track active spans\n const activeSpans: ActiveSpans = {\n workflows: new Map(),\n steps: new Map(),\n };\n\n // Metrics counters\n const metrics: AutotelMetrics = {\n stepDurations: [],\n retryCount: 0,\n errorCount: 0,\n cacheHits: 0,\n cacheMisses: 0,\n defaultAttributes,\n };\n\n /**\n * Get span name for a step.\n */\n function getSpanName(name?: string, stepKey?: string): string {\n if (name) return `${serviceName}.${name}`;\n if (stepKey) return `${serviceName}.step.${stepKey}`;\n return `${serviceName}.step`;\n }\n\n /**\n * Handle workflow event.\n */\n function handleEvent(event: WorkflowEvent<unknown>): void {\n switch (event.type) {\n case \"workflow_start\":\n activeSpans.workflows.set(event.workflowId, {\n workflowId: event.workflowId,\n startTime: event.ts,\n });\n break;\n\n case \"workflow_success\":\n case \"workflow_error\":\n {\n const span = activeSpans.workflows.get(event.workflowId);\n if (span) {\n activeSpans.workflows.delete(event.workflowId);\n }\n\n if (event.type === \"workflow_error\" && markErrorsOnSpan) {\n metrics.errorCount++;\n }\n }\n break;\n\n case \"step_start\":\n if (createStepSpans) {\n const stepId = event.stepId;\n activeSpans.steps.set(stepId, {\n workflowId: event.workflowId,\n stepId,\n stepKey: event.stepKey,\n name: event.name,\n startTime: event.ts,\n metadata: event.metadata,\n });\n }\n break;\n\n case \"step_success\":\n case \"step_error\":\n if (createStepSpans) {\n const stepId = event.stepId;\n const span = activeSpans.steps.get(stepId);\n if (span) {\n activeSpans.steps.delete(stepId);\n\n if (recordMetrics) {\n // Build attributes: default + low-cardinality metadata\n const attrs: Record<string, string | number | boolean> = {\n ...(Object.keys(defaultAttributes).length > 0 ? defaultAttributes : {}),\n };\n\n // Add low-cardinality metadata attributes (cardinality guardrails)\n if (span.metadata) {\n if (span.metadata.domain) attrs[\"step.domain\"] = span.metadata.domain;\n if (span.metadata.owner) attrs[\"step.owner\"] = span.metadata.owner;\n // step.intent only if <= 100 chars (cardinality guard)\n if (span.metadata.intent && span.metadata.intent.length <= 100) {\n attrs[\"step.intent\"] = span.metadata.intent;\n }\n // Omit step.tags and step.calls from span attributes (high cardinality)\n }\n\n // Add error diagnostics attributes\n if (event.type === \"step_error\" && event.diagnostics) {\n if (event.diagnostics.classification?.severity) {\n attrs[\"error.severity\"] = event.diagnostics.classification.severity;\n }\n if (event.diagnostics.classification?.retryable !== undefined) {\n attrs[\"error.retryable\"] = event.diagnostics.classification.retryable;\n }\n }\n\n metrics.stepDurations.push({\n name: getSpanName(span.name, span.stepKey),\n durationMs: event.durationMs,\n success: event.type === \"step_success\",\n attributes: Object.keys(attrs).length > 0 ? attrs : undefined,\n });\n }\n\n if (event.type === \"step_error\" && markErrorsOnSpan) {\n metrics.errorCount++;\n }\n }\n }\n break;\n\n case \"step_retry\":\n if (recordRetryEvents) {\n metrics.retryCount++;\n }\n break;\n\n case \"step_cache_hit\":\n metrics.cacheHits++;\n break;\n\n case \"step_cache_miss\":\n metrics.cacheMisses++;\n break;\n\n default:\n // Other events (timeout, etc.) - can be extended\n break;\n }\n }\n\n return {\n handleEvent,\n\n getActiveSpansCount() {\n return {\n workflows: activeSpans.workflows.size,\n steps: activeSpans.steps.size,\n };\n },\n\n getMetrics() {\n return { ...metrics, stepDurations: [...metrics.stepDurations] };\n },\n\n reset() {\n activeSpans.workflows.clear();\n activeSpans.steps.clear();\n metrics.stepDurations.length = 0;\n metrics.retryCount = 0;\n metrics.errorCount = 0;\n metrics.cacheHits = 0;\n metrics.cacheMisses = 0;\n // Note: defaultAttributes are preserved across resets\n },\n };\n}\n\n/**\n * Create an event handler that integrates with autotel's trace() function.\n *\n * This is a higher-level integration that creates actual OpenTelemetry spans\n * for each workflow and step when autotel is initialized.\n *\n * @param options - Configuration options\n * @returns An event handler function\n *\n * @example\n * ```typescript\n * import { createAutotelEventHandler } from 'awaitly/autotel';\n * import { init } from 'autotel';\n *\n * init({ service: 'checkout-api' });\n *\n * const handler = createAutotelEventHandler({ serviceName: 'checkout' });\n *\n * const workflow = createWorkflow(deps, {\n * onEvent: handler,\n * });\n * ```\n */\nexport function createAutotelEventHandler(options?: {\n serviceName?: string;\n includeStepDetails?: boolean;\n}): (event: WorkflowEvent<unknown>) => void {\n const { serviceName = \"workflow\", includeStepDetails = true } = options ?? {};\n\n // This is a simple pass-through handler\n // The actual autotel integration happens via the trace() wrapper\n return (event: WorkflowEvent<unknown>) => {\n // Log events for debugging when AUTOTEL_DEBUG is set\n if (process.env.AUTOTEL_DEBUG === \"true\") {\n const prefix = `[${serviceName}]`;\n switch (event.type) {\n case \"workflow_start\":\n console.log(`${prefix} Workflow started: ${event.workflowId}`);\n break;\n case \"workflow_success\":\n console.log(`${prefix} Workflow success: ${event.workflowId} (${event.durationMs}ms)`);\n break;\n case \"workflow_error\":\n console.log(`${prefix} Workflow error: ${event.workflowId}`, event.error);\n break;\n case \"step_start\":\n if (includeStepDetails) {\n console.log(`${prefix} Step started: ${event.name ?? event.stepKey ?? event.stepId}`);\n }\n break;\n case \"step_success\":\n if (includeStepDetails) {\n console.log(`${prefix} Step success: ${event.name ?? event.stepKey ?? event.stepId} (${event.durationMs}ms)`);\n }\n break;\n case \"step_error\":\n if (includeStepDetails) {\n console.log(`${prefix} Step error: ${event.name ?? event.stepKey ?? event.stepId}`, event.error);\n }\n break;\n case \"step_retry\":\n console.log(`${prefix} Step retry: ${event.name ?? event.stepKey ?? event.stepId} (attempt ${event.attempt}/${event.maxAttempts})`);\n break;\n }\n }\n };\n}\n\n/**\n * Wrapper type for autotel trace function.\n * Use this when you want to explicitly type the autotel integration.\n */\nexport type AutotelTraceFn = <T>(\n name: string,\n fn: (ctx: { setAttribute: (key: string, value: unknown) => void }) => T | Promise<T>\n) => T | Promise<T>;\n\n/**\n * Create a workflow wrapper that adds autotel tracing.\n *\n * This creates a higher-order function that wraps workflow execution\n * in an autotel trace span.\n *\n * @param traceFn - The autotel trace function\n * @param options - Wrapper options\n * @returns A workflow wrapper function\n *\n * @example\n * ```typescript\n * import { trace } from 'autotel';\n * import { withAutotelTracing } from 'awaitly/autotel';\n *\n * const traced = withAutotelTracing(trace, { serviceName: 'checkout' });\n *\n * const result = await traced('process-order', async () => {\n * return workflow(async ({ step }) => {\n * // ... workflow logic\n * });\n * });\n * ```\n */\nexport function withAutotelTracing(\n traceFn: AutotelTraceFn,\n options?: { serviceName?: string }\n): <T>(\n name: string,\n fn: () => T | Promise<T>,\n attributes?: Record<string, string | number | boolean>\n) => Promise<T> {\n const { serviceName = \"workflow\" } = options ?? {};\n\n return async <T>(\n name: string,\n fn: () => T | Promise<T>,\n attributes?: Record<string, string | number | boolean>\n ): Promise<T> => {\n const spanName = `${serviceName}.${name}`;\n return traceFn(spanName, async (ctx) => {\n if (attributes) {\n for (const [key, value] of Object.entries(attributes)) {\n ctx.setAttribute(key, value);\n }\n }\n return fn();\n }) as Promise<T>;\n };\n}\n"],"mappings":"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","names":["createAutotelAdapter","config","serviceName","createStepSpans","recordMetrics","defaultAttributes","recordRetryEvents","markErrorsOnSpan","activeSpans","metrics","getSpanName","name","stepKey","handleEvent","event","stepId","span","attrs","createAutotelEventHandler","options","includeStepDetails","prefix","withAutotelTracing","traceFn","fn","attributes","spanName","ctx","key","value"]}