@lostgradient/weft 0.20.0 → 0.22.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 (144) hide show
  1. package/README.md +2 -2
  2. package/dist/cli/generated/operation-catalog.snapshot.json +207 -80
  3. package/dist/cli/generated/operation-client.generated.d.ts +120 -43
  4. package/dist/client/http-client-storage.js +1 -1
  5. package/dist/core/engine/activity-reconciliation.d.ts +2 -2
  6. package/dist/core/engine/activity-reconciliation.js +12 -8
  7. package/dist/core/engine/async-activity-completion.js +12 -4
  8. package/dist/core/engine/async-activity-records.d.ts +11 -1
  9. package/dist/core/engine/async-activity-records.js +4 -3
  10. package/dist/core/engine/attributes-tags.d.ts +11 -1
  11. package/dist/core/engine/attributes-tags.js +4 -3
  12. package/dist/core/engine/bulk-operations-purge.js +5 -2
  13. package/dist/core/engine/bulk-operations.js +17 -5
  14. package/dist/core/engine/callback-creators-bundles.js +1 -1
  15. package/dist/core/engine/callback-creators-core.js +4 -2
  16. package/dist/core/engine/checkpoint-io.js +1 -1
  17. package/dist/core/engine/child-workflow.js +2 -1
  18. package/dist/core/engine/completed-review-storage.js +1 -1
  19. package/dist/core/engine/condition-waiters.d.ts +45 -3
  20. package/dist/core/engine/condition-waiters.js +12 -3
  21. package/dist/core/engine/disposal.js +6 -0
  22. package/dist/core/engine/engine-internal-types.d.ts +12 -4
  23. package/dist/core/engine/fenced-write.d.ts +46 -15
  24. package/dist/core/engine/fenced-write.js +39 -6
  25. package/dist/core/engine/finalizer-state.d.ts +3 -1
  26. package/dist/core/engine/handle-result.d.ts +49 -1
  27. package/dist/core/engine/handle-result.js +95 -20
  28. package/dist/core/engine/index.d.ts +13 -5
  29. package/dist/core/engine/index.js +155 -5
  30. package/dist/core/engine/inline-launch-queue.js +9 -0
  31. package/dist/core/engine/internals.d.ts +73 -0
  32. package/dist/core/engine/invoke-update-handler.d.ts +19 -0
  33. package/dist/core/engine/invoke-update-handler.js +7 -0
  34. package/dist/core/engine/lease-deposition.d.ts +132 -0
  35. package/dist/core/engine/lease-deposition.js +31 -0
  36. package/dist/core/engine/lease-errors.d.ts +80 -9
  37. package/dist/core/engine/lease-errors.js +28 -2
  38. package/dist/core/engine/lifecycle/resume.js +3 -1
  39. package/dist/core/engine/lifecycle/standalone-claim-acquire.d.ts +33 -0
  40. package/dist/core/engine/lifecycle/standalone-claim-acquire.js +25 -0
  41. package/dist/core/engine/lifecycle/start-commit.js +20 -6
  42. package/dist/core/engine/lifecycle/transition.d.ts +15 -1
  43. package/dist/core/engine/lifecycle/transition.js +6 -3
  44. package/dist/core/engine/operations-activity.js +1 -1
  45. package/dist/core/engine/operations-time.js +21 -7
  46. package/dist/core/engine/owner-side-signal-poll.d.ts +132 -0
  47. package/dist/core/engine/owner-side-signal-poll.js +22 -0
  48. package/dist/core/engine/owner-side-update-poll.d.ts +116 -0
  49. package/dist/core/engine/owner-side-update-poll.js +22 -0
  50. package/dist/core/engine/ownership-bootstrap.d.ts +280 -0
  51. package/dist/core/engine/ownership-bootstrap.js +89 -0
  52. package/dist/core/engine/ownership-mode-marker.d.ts +82 -0
  53. package/dist/core/engine/ownership-mode-marker.js +52 -0
  54. package/dist/core/engine/ownership-options.d.ts +22 -6
  55. package/dist/core/engine/ownership-options.js +42 -12
  56. package/dist/core/engine/pending-updates.js +35 -24
  57. package/dist/core/engine/queries.d.ts +70 -0
  58. package/dist/core/engine/queries.js +58 -4
  59. package/dist/core/engine/schedules.js +1 -1
  60. package/dist/core/engine/signals.d.ts +11 -1
  61. package/dist/core/engine/signals.js +11 -7
  62. package/dist/core/engine/sleep-timer-acknowledgements.d.ts +68 -0
  63. package/dist/core/engine/sleep-timer-acknowledgements.js +19 -0
  64. package/dist/core/engine/storage-io.d.ts +58 -10
  65. package/dist/core/engine/storage-io.js +27 -9
  66. package/dist/core/engine/termination/cleanup.d.ts +5 -4
  67. package/dist/core/engine/termination/complete.js +23 -4
  68. package/dist/core/engine/termination/finalizer-claim.js +4 -4
  69. package/dist/core/engine/termination/state-commit-callbacks.d.ts +15 -0
  70. package/dist/core/engine/termination/state-commit-callbacks.js +0 -0
  71. package/dist/core/engine/termination/suspend.js +1 -1
  72. package/dist/core/engine/update-validation.d.ts +28 -0
  73. package/dist/core/engine/update-validation.js +37 -0
  74. package/dist/core/engine/updates.d.ts +17 -16
  75. package/dist/core/engine/updates.js +24 -47
  76. package/dist/core/engine/wake-ownership-check.d.ts +86 -0
  77. package/dist/core/engine/wake-ownership-check.js +19 -0
  78. package/dist/core/engine/wake-ownership-guard.d.ts +46 -0
  79. package/dist/core/engine/wake-ownership-guard.js +23 -0
  80. package/dist/core/engine/workflow-claim-codec.d.ts +64 -0
  81. package/dist/core/engine/workflow-claim-codec.js +44 -0
  82. package/dist/core/engine/workflow-claim-cooldown.d.ts +60 -0
  83. package/dist/core/engine/workflow-claim-cooldown.js +17 -0
  84. package/dist/core/engine/workflow-claim-fold.d.ts +82 -0
  85. package/dist/core/engine/workflow-claim-fold.js +53 -0
  86. package/dist/core/engine/workflow-claim-metrics.d.ts +131 -0
  87. package/dist/core/engine/workflow-claim-metrics.js +62 -0
  88. package/dist/core/engine/workflow-claim-reclaim-scan.d.ts +96 -0
  89. package/dist/core/engine/workflow-claim-reclaim-scan.js +66 -0
  90. package/dist/core/engine/workflow-claim-reclaim-target.d.ts +107 -0
  91. package/dist/core/engine/workflow-claim-reclaim-target.js +155 -0
  92. package/dist/core/engine/workflow-claim-registry.d.ts +227 -0
  93. package/dist/core/engine/workflow-claim-registry.js +198 -0
  94. package/dist/core/engine/workflow-claim-renewal-interval.d.ts +50 -0
  95. package/dist/core/engine/workflow-claim-renewal-interval.js +132 -0
  96. package/dist/core/engine/workflow-claim-renewal-subpasses.d.ts +265 -0
  97. package/dist/core/engine/workflow-claim-renewal-subpasses.js +104 -0
  98. package/dist/core/engine/workflow-claim-renewal-task.d.ts +159 -0
  99. package/dist/core/engine/workflow-claim-renewal-task.js +65 -0
  100. package/dist/core/engine/workflow-claim-transitions.d.ts +186 -0
  101. package/dist/core/engine/workflow-claim-transitions.js +120 -0
  102. package/dist/core/inline-execution-strategy.d.ts +20 -0
  103. package/dist/core/inline-execution-strategy.js +15 -4
  104. package/dist/core/scheduler/scheduler-class.js +3 -3
  105. package/dist/core/scheduler/timer-sources.d.ts +13 -0
  106. package/dist/core/scheduler/timer-sources.js +1 -1
  107. package/dist/core/types/options.d.ts +17 -1
  108. package/dist/core/weft-error.d.ts +1 -1
  109. package/dist/core/weft-error.js +2 -1
  110. package/dist/http.js +2 -2
  111. package/dist/index.d.ts +2 -1
  112. package/dist/index.js +8 -0
  113. package/dist/indexeddb.js +1 -1
  114. package/dist/json-schema.js +3 -3
  115. package/dist/observability/index.js +2 -2
  116. package/dist/server/operations/get-task-diagnostics.d.ts +115 -25
  117. package/dist/server/operations/get-task-diagnostics.js +93 -7
  118. package/dist/storage/auto.js +1 -1
  119. package/dist/storage/bun-sql.js +115 -2
  120. package/dist/storage/compressed-storage.js +1 -1
  121. package/dist/storage/http.js +1 -1
  122. package/dist/storage/index.d.ts +38 -35
  123. package/dist/storage/interface.d.ts +87 -125
  124. package/dist/storage/interface.js +1 -1
  125. package/dist/storage/key-encoding.d.ts +51 -0
  126. package/dist/storage/key-encoding.js +13 -0
  127. package/dist/storage/key-prefixes.d.ts +1 -1
  128. package/dist/storage/key-prefixes.js +3 -0
  129. package/dist/storage/lmdb.js +1 -1
  130. package/dist/storage/memory.js +1 -1
  131. package/dist/storage/neon.js +4 -4
  132. package/dist/storage/node-sqlite.js +115 -2
  133. package/dist/storage/ownership-keys.d.ts +55 -0
  134. package/dist/storage/ownership-keys.js +6 -0
  135. package/dist/storage/postgres.js +4 -4
  136. package/dist/storage/resolve.js +1 -1
  137. package/dist/storage/scoped-storage.js +1 -1
  138. package/dist/storage/testing.js +1 -1
  139. package/dist/storage/turso.js +2 -2
  140. package/dist/version.d.ts +1 -1
  141. package/dist/version.js +1 -1
  142. package/dist/web-extension.js +1 -1
  143. package/dist/worker/protocol.js +1 -1
  144. package/package.json +3 -2
@@ -1,4 +1,4 @@
1
1
  // @bun
2
- var O=import.meta.require,T=(j,q,z)=>{if(q!=null){if(typeof q!=="object"&&typeof q!=="function")throw TypeError('Object expected to be assigned to "using" declaration');let A;if(z)A=q[Symbol.asyncDispose];if(A===void 0)A=q[Symbol.dispose];if(typeof A!=="function")throw TypeError("Object not disposable");j.push([z,A,q])}else if(z)j.push([z]);return q},y=(j,q,z)=>{let A=(G)=>q=z?new SuppressedError(G,q,"An error was suppressed during disposal"):(z=!0,G),H=(G)=>{while(G=j.pop())try{var $=G[1]&&G[1].call(G[2]);if(G[0])return Promise.resolve($).then(H,(Q)=>(A(Q),H()))}catch(Q){A(Q)}if(z)throw q};return H()};class X extends Error{code;constructor(j,q,z){super(q,z);this.code=j,this.name=j}}var B={WorkflowAlreadyExistsError:!0,BulkDeleteRequiresTerminalWorkflowsError:!0,BulkOperationConfirmationError:!0,WorkflowTypeNotRegisteredForRecoveryError:!0,EngineCreateNameMismatchError:!0,EngineDisposedError:!0,EngineDisposalError:!0,WorkflowNotFoundError:!0,WorkflowNotRegisteredError:!0,WorkflowConcurrencyLimitExceededError:!0,WorkflowSuspendNotSupportedError:!0,ActivityResolutionError:!0,BranchTopologyChangedError:!0,PersistedDataIncompatibleError:!0,WorkflowTimeoutError:!0,HttpClientError:!0,WorkerProtocolIncompatibleError:!0,UpdateTimeoutError:!0,UpdateValidationError:!0,WorkflowTerminalError:!0,WorkflowBuilderError:!0,VersionMismatchError:!0,EffectReplayConflictError:!0,ReviewTimeoutError:!0,AtomicStateConflictError:!0,StandardSchemaValidationError:!0,ActivityReconciliationCapabilityError:!0,ActivityReconciliationConflictError:!0,ActivityReconciliationIndeterminateError:!0,DurableActivityScopeError:!0,DurableActivityUnsupportedError:!0,AsyncActivityTokenNotFoundError:!0,ActivityScheduleToCloseTimeoutError:!0,ActivityPerAttemptTimeoutError:!0,PayloadSizeExceededError:!0,StartOrSignalConflictError:!0,WorkflowTeardownPendingError:!0,IdempotencyKeyPurgedError:!0,WorkerManifestBuildError:!0},R=new Set(Object.keys(B));class K extends X{fieldName;operation;issues;constructor(j){super("StandardSchemaValidationError",M(j.fieldName,j.operation,j.issues));this.fieldName=j.fieldName,this.operation=j.operation,this.issues=j.issues}}async function Z(j,q,z){let A=j["~standard"];if(!D(A))throw TypeError(`Schema for ${z.fieldName} does not provide runtime validation. Attach a Standard Schema validator (Zod, Valibot, or another vendor) or supply a runtime-validating schema at this boundary.`);let H=await A.validate(q);if(H.issues===void 0)return H.value;throw new K({fieldName:z.fieldName,operation:z.operation,issues:H.issues.map(U)})}function Y(j){return j.map((q)=>q.path===""?q.message:`${q.path}: ${q.message}`).join(`
3
- `)}function D(j){return typeof j.validate==="function"}function U(j){return{message:j.message,path:b(j.path)}}function b(j){if(j===void 0||j.length===0)return"";let q="";for(let z of j)q+="/",q+=w(z);return q}function w(j){let q=F(j)?j.key:j;return J(String(q))}function F(j){return j!==null&&typeof j==="object"&&"key"in j}function J(j){return j.replace(/~/g,"~0").replace(/\//g,"~1")}function M(j,q,z){return`Validation failed for ${q===void 0?j:`${q} ${j}`}:
4
- ${Y(z)}`}var V=Y,k=K,P=Z;export{P as validateStandardSchema,V as formatStandardSchemaIssues,k as StandardSchemaValidationError};
2
+ var h=import.meta.require;class i extends Error{code;constructor(r,e,t){super(e,t);this.code=r,this.name=r}}var c={WorkflowAlreadyExistsError:!0,BulkDeleteRequiresTerminalWorkflowsError:!0,BulkOperationConfirmationError:!0,WorkflowTypeNotRegisteredForRecoveryError:!0,EngineCreateNameMismatchError:!0,EngineDisposedError:!0,EngineDisposalError:!0,WorkflowNotFoundError:!0,WorkflowNotRegisteredError:!0,WorkflowConcurrencyLimitExceededError:!0,WorkflowSuspendNotSupportedError:!0,ActivityResolutionError:!0,BranchTopologyChangedError:!0,PersistedDataIncompatibleError:!0,WorkflowTimeoutError:!0,HttpClientError:!0,WorkerProtocolIncompatibleError:!0,UpdateTimeoutError:!0,UpdateValidationError:!0,WorkflowTerminalError:!0,WorkflowBuilderError:!0,VersionMismatchError:!0,EffectReplayConflictError:!0,ReviewTimeoutError:!0,AtomicStateConflictError:!0,StandardSchemaValidationError:!0,ActivityReconciliationCapabilityError:!0,ActivityReconciliationConflictError:!0,ActivityReconciliationIndeterminateError:!0,DurableActivityScopeError:!0,DurableActivityUnsupportedError:!0,AsyncActivityTokenNotFoundError:!0,ActivityScheduleToCloseTimeoutError:!0,ActivityPerAttemptTimeoutError:!0,PayloadSizeExceededError:!0,StartOrSignalConflictError:!0,WorkflowTeardownPendingError:!0,IdempotencyKeyPurgedError:!0,WorkerManifestBuildError:!0,OwnershipModeMismatchError:!0},g=new Set(Object.keys(c));class o extends i{fieldName;operation;issues;constructor(r){super("StandardSchemaValidationError",p(r.fieldName,r.operation,r.issues));this.fieldName=r.fieldName,this.operation=r.operation,this.issues=r.issues}}async function s(r,e,t){let n=r["~standard"];if(!u(n))throw TypeError(`Schema for ${t.fieldName} does not provide runtime validation. Attach a Standard Schema validator (Zod, Valibot, or another vendor) or supply a runtime-validating schema at this boundary.`);let a=await n.validate(e);if(a.issues===void 0)return a.value;throw new o({fieldName:t.fieldName,operation:t.operation,issues:a.issues.map(l)})}function d(r){return r.map((e)=>e.path===""?e.message:`${e.path}: ${e.message}`).join(`
3
+ `)}function u(r){return typeof r.validate==="function"}function l(r){return{message:r.message,path:f(r.path)}}function f(r){if(r===void 0||r.length===0)return"";let e="";for(let t of r)e+="/",e+=m(t);return e}function m(r){let e=S(r)?r.key:r;return E(String(e))}function S(r){return r!==null&&typeof r==="object"&&"key"in r}function E(r){return r.replace(/~/g,"~0").replace(/\//g,"~1")}function p(r,e,t){return`Validation failed for ${e===void 0?r:`${e} ${r}`}:
4
+ ${d(t)}`}var W=d,T=o,R=s;export{T as StandardSchemaValidationError,W as formatStandardSchemaIssues,R as validateStandardSchema};
@@ -1,4 +1,4 @@
1
1
  // @bun
2
- var Jn=import.meta.require,Qn=(n,w,i)=>{if(w!=null){if(typeof w!=="object"&&typeof w!=="function")throw TypeError('Object expected to be assigned to "using" declaration');let S;if(i)S=w[Symbol.asyncDispose];if(S===void 0)S=w[Symbol.dispose];if(typeof S!=="function")throw TypeError("Object not disposable");n.push([i,S,w])}else if(i)n.push([i]);return w},jn=(n,w,i)=>{let S=(f)=>w=i?new SuppressedError(f,w,"An error was suppressed during disposal"):(i=!0,f),k=(f)=>{while(f=n.pop())try{var y=f[1]&&f[1].call(f[2]);if(f[0])return Promise.resolve(y).then(k,(p)=>(S(p),k()))}catch(p){S(p)}if(i)throw w};return k()};var h={traceId:"0".repeat(32),spanId:"0".repeat(16),traceFlags:0},T={setAttribute(){},setStatus(){},recordException(){},end(){},spanContext(){return h}},q={setAttribute:(...n)=>T.setAttribute(...n),setStatus:(...n)=>T.setStatus(...n),recordException:(...n)=>T.recordException(...n),end:(...n)=>T.end(...n)},l={startSpan(){return T}},P={record(){},add(){}},t={createHistogram(){return P},createCounter(){return P},createUpDownCounter(){return P}},r=Symbol("ROOT_CONTEXT"),a={trace:{getTracer(){return l},setSpan(n){return n}},metrics:{getMeter(){return t}},context:{ROOT_CONTEXT:r,with(n,w){return w()}},SpanStatusCode:{OK:1,ERROR:2,UNSET:0}},o;function s(){let n=globalThis.require;if(typeof n==="function")return(w)=>n(w);return()=>{return}}function e(n){return n?.trace?.getTracer!=null&&n.SpanStatusCode!=null}function nn(n=s()){try{let w=n("@opentelemetry/api");if(e(w))return w}catch{}return}function K(n){if(o)return o;let w=nn(n);if(w)return o=w,o;return o=a,o}function H(n){let w=new Uint8Array(n);return crypto.getRandomValues(w),Array.from(w,(i)=>i.toString(16).padStart(2,"0")).join("")}var Y="traceparent",wn=/^([0-9a-f]{2})-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/,Sn="00000000000000000000000000000000",kn="0000000000000000";function Z(n){let w=wn.exec(n);if(!w)return null;let[,i,S,k,f]=w;if(S===Sn)return null;if(k===kn)return null;return{version:i,traceId:S,spanId:k,traceFlags:parseInt(f,16)}}function M(n){let w=n.traceFlags.toString(16).padStart(2,"0");return`${n.version}-${n.traceId}-${n.spanId}-${w}`}function J(n){let w=n.get(Y);if(!w)return null;return Z(w)}function U(n,w){n.set(Y,M(w))}function fn(){return H(16)}function vn(){return H(8)}var O=1024;function C(n,w){let i;try{i=JSON.stringify(n)}catch{i=String(n)}if(i.length>w)return i.slice(0,w)+"...";return i}function yn(n){return n instanceof Error?n.message:String(n)}function Wn(n){return n instanceof Error?n:Error(String(n))}function Q(n,w){let i=n.spanContext();U(w,{version:"00",traceId:i.traceId,spanId:i.spanId,traceFlags:i.traceFlags})}function A(n,w,i){let S=n.attributeExtractor;if(!S)return;let k=S(i);for(let[f,y]of Object.entries(k))w.setAttribute(f,y)}function j(n,w){let i=n.workflowSpans.get(w);return i?n.trace.setSpan(n.api.context.ROOT_CONTEXT,i.span):n.api.context.ROOT_CONTEXT}function V(n,w,i){w.setStatus({code:n.SpanStatusCode.ERROR,message:yn(i)}),w.recordException(Wn(i))}function _(n,w,i,S){try{let k=i();return w.setStatus({code:n.SpanStatusCode.OK}),S?.(k),k}catch(k){throw V(n,w,k),k}finally{w.end()}}async function x(n,w,i,S){try{let k=await i();return w.setStatus({code:n.SpanStatusCode.OK}),S?.(k),k}catch(k){throw V(n,w,k),k}finally{w.end()}}function*B(n,w,i,S){try{let k=yield*i();return w.setStatus({code:n.SpanStatusCode.OK}),S?.(k),k}catch(k){throw V(n,w,k),k}finally{w.end()}}function g(n){return{async execute(w,i){let S=J(w.headers),k=n.api.context.ROOT_CONTEXT;if(S){let y={...q,spanContext(){return{traceId:S.traceId,spanId:S.spanId,traceFlags:S.traceFlags}}};k=n.trace.setSpan(n.api.context.ROOT_CONTEXT,y)}let f=n.tracer.startSpan(`activity:execute:${w.activityName}`,{attributes:{"weft.activity.name":w.activityName,"weft.activity.attempt":w.attempt,...S?{"weft.parent.trace_id":S.traceId}:{}}},k);if(n.recordPayloads&&w.input!==void 0)f.setAttribute("weft.payload.input",C(w.input,n.maxPayloadSize));return x(n,f,()=>i(w))}}}var X={workflowDuration:{name:"weft.workflow.duration",description:"Duration of workflow execution in milliseconds",unit:"ms",type:"histogram"},activityDuration:{name:"weft.activity.duration",description:"Duration of activity execution in milliseconds",unit:"ms",type:"histogram"},activityAttempts:{name:"weft.activity.attempts",description:"Total activity execution attempts",unit:"attempts",type:"counter"},workflowActive:{name:"weft.workflow.active",description:"Number of currently active workflows",unit:"workflows",type:"gauge"},workflowStarted:{name:"weft.workflow.started",description:"Total workflows started",unit:"workflows",type:"counter"},workflowCompleted:{name:"weft.workflow.completed",description:"Total workflows completed",unit:"workflows",type:"counter"},workflowFailed:{name:"weft.workflow.failed",description:"Total workflows failed",unit:"workflows",type:"counter"},promptCacheHits:{name:"weft.prompt_cache.hits",description:"Total prompt prefix cache hits",unit:"hits",type:"counter"},promptCacheMisses:{name:"weft.prompt_cache.misses",description:"Total prompt prefix cache misses",unit:"misses",type:"counter"},dpmoDefects:{name:"weft.dpmo.defects",description:"Total failed workflows (DPMO numerator)",unit:"workflows",type:"counter"},dpmoOperations:{name:"weft.dpmo.operations",description:"Total started workflows (DPMO denominator)",unit:"workflows",type:"counter"},taskBacklog:{name:"weft.task.backlog",description:"Number of queued tasks waiting for workers",unit:"tasks",type:"gauge"},taskQueueLatency:{name:"weft.task.queue_latency",description:"Time tasks spend queued before dispatch in milliseconds",unit:"ms",type:"histogram"},taskExecutionLatency:{name:"weft.task.execution_latency",description:"Time tasks spend executing after worker start in milliseconds",unit:"ms",type:"histogram"},taskRetries:{name:"weft.task.retries",description:"Total task retry attempts after the first dispatch attempt",unit:"retries",type:"counter"},taskRequeues:{name:"weft.task.requeues",description:"Total visibility-timeout or disconnect task requeues",unit:"requeues",type:"counter"},taskStaleHeartbeats:{name:"weft.task.stale_heartbeats",description:"Number of in-flight tasks whose heartbeat age exceeds the diagnostic threshold",unit:"tasks",type:"gauge"},workerCapacitySaturation:{name:"weft.worker.capacity_saturation",description:"Ratio of in-flight worker slots to total worker concurrency",unit:"ratio",type:"gauge"}};var dn=1e4;class z{#n;#i=0;#w=0;constructor(n){this.#n=new Float64Array(n)}push(n){if(this.#n[this.#i]=n,this.#i=(this.#i+1)%this.#n.length,this.#w<this.#n.length)this.#w++}toArray(){if(this.#w<this.#n.length)return Array.from(this.#n.subarray(0,this.#w));let n=Array.from({length:this.#w});for(let w=0;w<this.#w;w++)n[w]=this.#n[(this.#i+w)%this.#n.length];return n}}class D{#n;#i;#w;constructor(){this.#n=new Map,this.#i=new Map,this.#w=new Map}increment(n,w=1){this.#n.set(n,(this.#n.get(n)??0)+w)}record(n,w){let i=this.#i.get(n);if(!i)i=new z(dn),this.#i.set(n,i);i.push(w)}gauge(n,w){this.#w.set(n,w)}snapshot(){let n={};for(let[w,i]of this.#n)n[w]={type:"counter",value:i};for(let[w,i]of this.#i){let S=i.toArray(),k=In(S);n[w]={type:"histogram",count:S.length,sum:Fn(S),p50:k[Math.floor(k.length*0.5)]??0,p99:k[Math.floor(k.length*0.99)]??0,min:k[0]??0,max:k[k.length-1]??0}}for(let[w,i]of this.#w)n[w]={type:"gauge",value:i};return n}reset(){this.#n.clear(),this.#i.clear(),this.#w.clear()}}function pn(n){let w;if(typeof n==="string")w=K().metrics.getMeter(n);else if(n)w=n;else w=K().metrics.getMeter("weft");return{workflowDuration:w.createHistogram("weft.workflow.duration",{unit:"ms"}),activityDuration:w.createHistogram("weft.activity.duration",{unit:"ms"}),activityAttempts:w.createCounter("weft.activity.attempts"),activeWorkflows:w.createUpDownCounter("weft.workflow.active")}}function In(n){let w=[...n];return w.sort((i,S)=>i-S),w}function Fn(n){let w=0;for(let i of n)w+=i;return w}function Ln(n,w){let i=w?.type==="histogram"?w.count:0,S=w?.type==="histogram"?w.sum:0;return[`# TYPE ${n} histogram`,`${n}_count ${i}`,`${n}_sum ${S}`]}function $n(n,w){let i=w?.type==="counter"?w.value:0;return[`# TYPE ${n} counter`,`${n}_total ${i}`]}function Gn(n,w){let i=w?.type==="gauge"?w.value:0;return[`# TYPE ${n} gauge`,`${n} ${i}`]}var on={histogram:Ln,counter:$n,gauge:Gn};function Kn(n,w){let i=n.name.replace(/\./g,"_"),S=w[n.name];return[`# HELP ${i} ${n.description}`,...on[n.type](i,S)]}function Cn(n){let w=n[X.dpmoDefects.name],i=n[X.dpmoOperations.name],S=w?.type==="counter"?w.value:0,k=i?.type==="counter"?i.value:0,f=k===0?0:S*1e6/k,y="weft_dpmo";return["# HELP weft_dpmo Defects per million operations (failed workflows / started workflows * 1e6)","# TYPE weft_dpmo gauge",`weft_dpmo ${f}`]}function b(n){let w=[];for(let i of Object.values(X))w.push(...Kn(i,n));return w.push(...Cn(n)),w.join(`
2
+ var be=import.meta.require;var q={traceId:"0".repeat(32),spanId:"0".repeat(16),traceFlags:0},v={setAttribute(){},setStatus(){},recordException(){},end(){},spanContext(){return q}},_={setAttribute:(...e)=>v.setAttribute(...e),setStatus:(...e)=>v.setStatus(...e),recordException:(...e)=>v.recordException(...e),end:(...e)=>v.end(...e)},Z={startSpan(){return v}},M={record(){},add(){}},V={createHistogram(){return M},createCounter(){return M},createUpDownCounter(){return M}},B=Symbol("ROOT_CONTEXT"),J={trace:{getTracer(){return Z},setSpan(e){return e}},metrics:{getMeter(){return V}},context:{ROOT_CONTEXT:B,with(e,t){return t()}},SpanStatusCode:{OK:1,ERROR:2,UNSET:0}},w;function Q(){let e=globalThis.require;if(typeof e==="function")return(t)=>e(t);return()=>{return}}function ee(e){return e?.trace?.getTracer!=null&&e.SpanStatusCode!=null}function te(e=Q()){try{let t=e("@opentelemetry/api");if(ee(t))return t}catch{}return}function y(e){if(w)return w;let t=te(e);if(t)return w=t,w;return w=J,w}function P(e){let t=new Uint8Array(e);return crypto.getRandomValues(t),Array.from(t,(r)=>r.toString(16).padStart(2,"0")).join("")}var W="traceparent",re=/^([0-9a-f]{2})-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/,ne="00000000000000000000000000000000",oe="0000000000000000";function L(e){let t=re.exec(e);if(!t)return null;let[,r,n,o,s]=t;if(n===ne)return null;if(o===oe)return null;return{version:r,traceId:n,spanId:o,traceFlags:parseInt(s,16)}}function D(e){let t=e.traceFlags.toString(16).padStart(2,"0");return`${e.version}-${e.traceId}-${e.spanId}-${t}`}function h(e){let t=e.get(W);if(!t)return null;return L(t)}function C(e,t){e.set(W,D(t))}function ie(){return P(16)}function se(){return P(8)}var N=1024;function g(e,t){let r;try{r=JSON.stringify(e)}catch{r=String(e)}if(r.length>t)return r.slice(0,t)+"...";return r}function ae(e){return e instanceof Error?e.message:String(e)}function pe(e){return e instanceof Error?e:Error(String(e))}function b(e,t){let r=e.spanContext();C(t,{version:"00",traceId:r.traceId,spanId:r.spanId,traceFlags:r.traceFlags})}function S(e,t,r){let n=e.attributeExtractor;if(!n)return;let o=n(r);for(let[s,a]of Object.entries(o))t.setAttribute(s,a)}function O(e,t){let r=e.workflowSpans.get(t);return r?e.trace.setSpan(e.api.context.ROOT_CONTEXT,r.span):e.api.context.ROOT_CONTEXT}function R(e,t,r){t.setStatus({code:e.SpanStatusCode.ERROR,message:ae(r)}),t.recordException(pe(r))}function F(e,t,r,n){try{let o=r();return t.setStatus({code:e.SpanStatusCode.OK}),n?.(o),o}catch(o){throw R(e,t,o),o}finally{t.end()}}async function x(e,t,r,n){try{let o=await r();return t.setStatus({code:e.SpanStatusCode.OK}),n?.(o),o}catch(o){throw R(e,t,o),o}finally{t.end()}}function*I(e,t,r,n){try{let o=yield*r();return t.setStatus({code:e.SpanStatusCode.OK}),n?.(o),o}catch(o){throw R(e,t,o),o}finally{t.end()}}function H(e){return{async execute(t,r){let n=h(t.headers),o=e.api.context.ROOT_CONTEXT;if(n){let a={..._,spanContext(){return{traceId:n.traceId,spanId:n.spanId,traceFlags:n.traceFlags}}};o=e.trace.setSpan(e.api.context.ROOT_CONTEXT,a)}let s=e.tracer.startSpan(`activity:execute:${t.activityName}`,{attributes:{"weft.activity.name":t.activityName,"weft.activity.attempt":t.attempt,...n?{"weft.parent.trace_id":n.traceId}:{}}},o);if(e.recordPayloads&&t.input!==void 0)s.setAttribute("weft.payload.input",g(t.input,e.maxPayloadSize));return x(e,s,()=>r(t))}}}var k={workflowDuration:{name:"weft.workflow.duration",description:"Duration of workflow execution in milliseconds",unit:"ms",type:"histogram"},activityDuration:{name:"weft.activity.duration",description:"Duration of activity execution in milliseconds",unit:"ms",type:"histogram"},activityAttempts:{name:"weft.activity.attempts",description:"Total activity execution attempts",unit:"attempts",type:"counter"},workflowActive:{name:"weft.workflow.active",description:"Number of currently active workflows",unit:"workflows",type:"gauge"},workflowStarted:{name:"weft.workflow.started",description:"Total workflows started",unit:"workflows",type:"counter"},workflowCompleted:{name:"weft.workflow.completed",description:"Total workflows completed",unit:"workflows",type:"counter"},workflowFailed:{name:"weft.workflow.failed",description:"Total workflows failed",unit:"workflows",type:"counter"},promptCacheHits:{name:"weft.prompt_cache.hits",description:"Total prompt prefix cache hits",unit:"hits",type:"counter"},promptCacheMisses:{name:"weft.prompt_cache.misses",description:"Total prompt prefix cache misses",unit:"misses",type:"counter"},dpmoDefects:{name:"weft.dpmo.defects",description:"Total failed workflows (DPMO numerator)",unit:"workflows",type:"counter"},dpmoOperations:{name:"weft.dpmo.operations",description:"Total started workflows (DPMO denominator)",unit:"workflows",type:"counter"},taskBacklog:{name:"weft.task.backlog",description:"Number of queued tasks waiting for workers",unit:"tasks",type:"gauge"},taskQueueLatency:{name:"weft.task.queue_latency",description:"Time tasks spend queued before dispatch in milliseconds",unit:"ms",type:"histogram"},taskExecutionLatency:{name:"weft.task.execution_latency",description:"Time tasks spend executing after worker start in milliseconds",unit:"ms",type:"histogram"},taskRetries:{name:"weft.task.retries",description:"Total task retry attempts after the first dispatch attempt",unit:"retries",type:"counter"},taskRequeues:{name:"weft.task.requeues",description:"Total visibility-timeout or disconnect task requeues",unit:"requeues",type:"counter"},taskStaleHeartbeats:{name:"weft.task.stale_heartbeats",description:"Number of in-flight tasks whose heartbeat age exceeds the diagnostic threshold",unit:"tasks",type:"gauge"},workerCapacitySaturation:{name:"weft.worker.capacity_saturation",description:"Ratio of in-flight worker slots to total worker concurrency",unit:"ratio",type:"gauge"}};var ce=1e4;class G{#e;#r=0;#t=0;constructor(e){this.#e=new Float64Array(e)}push(e){if(this.#e[this.#r]=e,this.#r=(this.#r+1)%this.#e.length,this.#t<this.#e.length)this.#t++}toArray(){if(this.#t<this.#e.length)return Array.from(this.#e.subarray(0,this.#t));let e=Array.from({length:this.#t});for(let t=0;t<this.#t;t++)e[t]=this.#e[(this.#r+t)%this.#e.length];return e}}class E{#e;#r;#t;constructor(){this.#e=new Map,this.#r=new Map,this.#t=new Map}increment(e,t=1){this.#e.set(e,(this.#e.get(e)??0)+t)}record(e,t){let r=this.#r.get(e);if(!r)r=new G(ce),this.#r.set(e,r);r.push(t)}gauge(e,t){this.#t.set(e,t)}snapshot(){let e={};for(let[t,r]of this.#e)e[t]={type:"counter",value:r};for(let[t,r]of this.#r){let n=r.toArray(),o=ue(n);e[t]={type:"histogram",count:n.length,sum:de(n),p50:o[Math.floor(o.length*0.5)]??0,p99:o[Math.floor(o.length*0.99)]??0,min:o[0]??0,max:o[o.length-1]??0}}for(let[t,r]of this.#t)e[t]={type:"gauge",value:r};return e}reset(){this.#e.clear(),this.#r.clear(),this.#t.clear()}}function le(e){let t;if(typeof e==="string")t=y().metrics.getMeter(e);else if(e)t=e;else t=y().metrics.getMeter("weft");return{workflowDuration:t.createHistogram("weft.workflow.duration",{unit:"ms"}),activityDuration:t.createHistogram("weft.activity.duration",{unit:"ms"}),activityAttempts:t.createCounter("weft.activity.attempts"),activeWorkflows:t.createUpDownCounter("weft.workflow.active")}}function ue(e){let t=[...e];return t.sort((r,n)=>r-n),t}function de(e){let t=0;for(let r of e)t+=r;return t}function fe(e,t){let r=t?.type==="histogram"?t.count:0,n=t?.type==="histogram"?t.sum:0;return[`# TYPE ${e} histogram`,`${e}_count ${r}`,`${e}_sum ${n}`]}function me(e,t){let r=t?.type==="counter"?t.value:0;return[`# TYPE ${e} counter`,`${e}_total ${r}`]}function we(e,t){let r=t?.type==="gauge"?t.value:0;return[`# TYPE ${e} gauge`,`${e} ${r}`]}var ye={histogram:fe,counter:me,gauge:we};function ge(e,t){let r=e.name.replace(/\./g,"_"),n=t[e.name];return[`# HELP ${r} ${e.description}`,...ye[e.type](r,n)]}function Se(e){let t=e[k.dpmoDefects.name],r=e[k.dpmoOperations.name],n=t?.type==="counter"?t.value:0,o=r?.type==="counter"?r.value:0,s=o===0?0:n*1e6/o,a="weft_dpmo";return["# HELP weft_dpmo Defects per million operations (failed workflows / started workflows * 1e6)","# TYPE weft_dpmo gauge",`weft_dpmo ${s}`]}function z(e){let t=[];for(let r of Object.values(k))t.push(...ge(r,e));return t.push(...Se(e)),t.join(`
3
3
  `)+`
4
- `}function An(n){return{serialize(){let w=n?.snapshot()??{};return b(w)}}}class I extends Event{static type="workflow:completed";workflowId;result;duration;constructor(n,w,i){super(I.type);this.workflowId=n,this.result=w,this.duration=i}}class F extends Event{static type="workflow:failed";workflowId;error;constructor(n,w){super(F.type);this.workflowId=n,this.error=w}}class L extends Event{static type="workflow:cancelled";workflowId;constructor(n){super(L.type);this.workflowId=n}}class $ extends Event{static type="workflow:timed-out";workflowId;timeoutType;elapsed;reason;constructor(n,w,i,S){super($.type);if(this.workflowId=n,this.timeoutType=w,this.elapsed=i,S!==void 0)this.reason=S}}var zn=new Set([I.type,F.type,L.type,$.type]);var Xn=3600000,E=1e4,Rn=3600000;function c(n){let w=Date.now();for(let[i,S]of n.workflowSpans)if(w-S.createdAt>Xn)S.span.end(),n.workflowSpans.delete(i);if(n.workflowSpans.size>E){let i=n.workflowSpans.size-E,S=0;for(let[k,f]of n.workflowSpans){if(S>=i)break;f.span.end(),n.workflowSpans.delete(k),S++}}}function N(n,w){let i=n.workflowSpans.get(w);if(i)i.span.end(),n.workflowSpans.delete(w)}function u(n){function w(v,G,W){let d=n.workflowSpans.get(v);if(!d)return;if(G==="error")d.span.setStatus({code:n.SpanStatusCode.ERROR,...W?{message:W}:{}});else d.span.setStatus({code:n.SpanStatusCode.OK});d.span.end(),n.workflowSpans.delete(v)}let i=(v)=>{if(!(v instanceof I))return;w(v.workflowId,"ok")},S=(v)=>{if(!(v instanceof F))return;w(v.workflowId,"error",v.error.message),n.metrics.increment("weft.dpmo.defects")},k=(v)=>{if(!(v instanceof L))return;w(v.workflowId,"error","Workflow cancelled")},f=(v)=>{if(!(v instanceof $))return;w(v.workflowId,"error",`Workflow timed out (${v.timeoutType}) after ${v.elapsed}ms`),n.metrics.increment("weft.dpmo.defects")};if(n.eventTarget)n.eventTarget.addEventListener(I.type,i),n.eventTarget.addEventListener(F.type,S),n.eventTarget.addEventListener(L.type,k),n.eventTarget.addEventListener($.type,f);function y(v=Rn){let G=Date.now()-v,W=0;for(let[d,R]of n.workflowSpans)if(R.createdAt<=G)R.span.setStatus({code:n.SpanStatusCode.ERROR,message:"span evicted (stale)"}),R.span.end(),n.workflowSpans.delete(d),W++;return W}function p(){if(n.eventTarget)n.eventTarget.removeEventListener(I.type,i),n.eventTarget.removeEventListener(F.type,S),n.eventTarget.removeEventListener(L.type,k),n.eventTarget.removeEventListener($.type,f);for(let v of n.workflowSpans.values())v.span.setStatus({code:n.SpanStatusCode.ERROR,message:"Observability disposed"}),v.span.end();n.workflowSpans.clear()}return{endWorkflowSpan:w,evictStaleSpans:y,dispose:p}}function m(n){return{workflowStart(w,i){c(n);let S=n.workflowSpans.get(w.workflowId);if(S)S.span.setStatus({code:n.SpanStatusCode.OK}),N(n,w.workflowId);let k=n.tracer.startSpan(`workflow:${w.workflowType}`,{attributes:{"weft.workflow.id":w.workflowId,"weft.workflow.type":w.workflowType}});if(n.workflowSpans.set(w.workflowId,{span:k,createdAt:Date.now()}),Q(k,w.headers),n.recordPayloads&&w.input!==void 0)k.setAttribute("weft.payload.input",C(w.input,n.maxPayloadSize));A(n,k,w),n.metrics.increment("weft.workflow.started"),n.metrics.increment("weft.dpmo.operations"),i(w)},*activity(w,i){let S=n.tracer.startSpan(`activity:${w.activityName}`,{attributes:{"weft.activity.name":w.activityName,"weft.activity.attempt":w.attempt}},j(n,w.workflowId));if(Q(S,w.headers),n.recordPayloads&&w.input!==void 0)S.setAttribute("weft.payload.input",C(w.input,n.maxPayloadSize));A(n,S,w);let k=Date.now();return yield*B(n,S,()=>i(w),()=>{n.metrics.record("weft.activity.duration",Date.now()-k),n.metrics.increment("weft.activity.attempts")})},*sleep(w,i){let S=n.tracer.startSpan("sleep",{attributes:{"weft.sleep.duration":w.duration}},j(n,w.workflowId));A(n,S,w),yield*B(n,S,()=>i(w))},*waitForSignal(w,i){let S=n.tracer.startSpan("waitForSignal",{attributes:{"weft.signal.name":w.signalName}},j(n,w.workflowId));return A(n,S,w),yield*B(n,S,()=>i(w))},async childWorkflow(w,i){let S=[],k=J(w.parentHeaders);if(k)S.push({context:{traceId:k.traceId,spanId:k.spanId,traceFlags:k.traceFlags}});let f=n.tracer.startSpan(`childWorkflow:${w.workflowType}`,{attributes:{"weft.child_workflow.type":w.workflowType,"weft.child_workflow.id":w.childWorkflowId,"weft.child_workflow.parent_id":w.workflowId},links:S},n.api.context.ROOT_CONTEXT);if(Q(f,w.headers),n.recordPayloads&&w.input!==void 0)f.setAttribute("weft.payload.input",C(w.input,n.maxPayloadSize));return n.metrics.increment("weft.child_workflow.started"),x(n,f,()=>i(w))},signalReceived(w,i){let S=n.tracer.startSpan(`signal:received:${w.signalName}`,{attributes:{"weft.signal.name":w.signalName,"weft.signal.workflow_id":w.workflowId}});A(n,S,w),_(n,S,()=>i(w))}}}function Tn(n){let{attributeExtractor:w,eventTarget:i,maxPayloadSize:S=O,metrics:k=new D,openTelemetryApi:f=K(),recordPayloads:y=!1,tracerName:p="weft",tracerVersion:v}=n??{},G=f,{trace:W,SpanStatusCode:d}=G,R=W.getTracer(p,v);return{api:G,trace:W,SpanStatusCode:d,tracer:R,recordPayloads:y,maxPayloadSize:S,attributeExtractor:w,eventTarget:i,metrics:k,workflowSpans:new Map}}function nw(n){let w=Tn(n),i=m(w),S=g(w),k={...i,...S},f=u(w);return{interceptor:k,metrics:w.metrics,...f}}export{b as serializeMetricsSnapshotForPrometheus,Z as parseTraceParent,U as injectTraceParent,K as getOpenTelemetryApi,fn as generateTraceId,vn as generateSpanId,M as formatTraceParent,J as extractTraceParent,pn as createOpenTelemetryMetrics,nw as createObservabilityInterceptors,An as createMetricsCollectorExporter,D as MetricsCollector,X as METRICS};
4
+ `}function ke(e){return{serialize(){let t=e?.snapshot()??{};return z(t)}}}class l extends Event{static type="workflow:completed";workflowId;result;duration;constructor(e,t,r){super(l.type);this.workflowId=e,this.result=t,this.duration=r}}class u extends Event{static type="workflow:failed";workflowId;error;constructor(e,t){super(u.type);this.workflowId=e,this.error=t}}class d extends Event{static type="workflow:cancelled";workflowId;constructor(e){super(d.type);this.workflowId=e}}class f extends Event{static type="workflow:timed-out";workflowId;timeoutType;elapsed;reason;constructor(e,t,r,n){super(f.type);if(this.workflowId=e,this.timeoutType=t,this.elapsed=r,n!==void 0)this.reason=n}}var Fe=new Set([l.type,u.type,d.type,f.type]);var Te=3600000,X=1e4,ve=3600000;function U(e){let t=Date.now();for(let[r,n]of e.workflowSpans)if(t-n.createdAt>Te)n.span.end(),e.workflowSpans.delete(r);if(e.workflowSpans.size>X){let r=e.workflowSpans.size-X,n=0;for(let[o,s]of e.workflowSpans){if(n>=r)break;s.span.end(),e.workflowSpans.delete(o),n++}}}function K(e,t){let r=e.workflowSpans.get(t);if(r)r.span.end(),e.workflowSpans.delete(t)}function Y(e){function t(i,m,p){let c=e.workflowSpans.get(i);if(!c)return;if(m==="error")c.span.setStatus({code:e.SpanStatusCode.ERROR,...p?{message:p}:{}});else c.span.setStatus({code:e.SpanStatusCode.OK});c.span.end(),e.workflowSpans.delete(i)}let r=(i)=>{if(!(i instanceof l))return;t(i.workflowId,"ok")},n=(i)=>{if(!(i instanceof u))return;t(i.workflowId,"error",i.error.message),e.metrics.increment("weft.dpmo.defects")},o=(i)=>{if(!(i instanceof d))return;t(i.workflowId,"error","Workflow cancelled")},s=(i)=>{if(!(i instanceof f))return;t(i.workflowId,"error",`Workflow timed out (${i.timeoutType}) after ${i.elapsed}ms`),e.metrics.increment("weft.dpmo.defects")};if(e.eventTarget)e.eventTarget.addEventListener(l.type,r),e.eventTarget.addEventListener(u.type,n),e.eventTarget.addEventListener(d.type,o),e.eventTarget.addEventListener(f.type,s);function a(i=ve){let m=Date.now()-i,p=0;for(let[c,T]of e.workflowSpans)if(T.createdAt<=m)T.span.setStatus({code:e.SpanStatusCode.ERROR,message:"span evicted (stale)"}),T.span.end(),e.workflowSpans.delete(c),p++;return p}function A(){if(e.eventTarget)e.eventTarget.removeEventListener(l.type,r),e.eventTarget.removeEventListener(u.type,n),e.eventTarget.removeEventListener(d.type,o),e.eventTarget.removeEventListener(f.type,s);for(let i of e.workflowSpans.values())i.span.setStatus({code:e.SpanStatusCode.ERROR,message:"Observability disposed"}),i.span.end();e.workflowSpans.clear()}return{endWorkflowSpan:t,evictStaleSpans:a,dispose:A}}function j(e){return{workflowStart(t,r){U(e);let n=e.workflowSpans.get(t.workflowId);if(n)n.span.setStatus({code:e.SpanStatusCode.OK}),K(e,t.workflowId);let o=e.tracer.startSpan(`workflow:${t.workflowType}`,{attributes:{"weft.workflow.id":t.workflowId,"weft.workflow.type":t.workflowType}});if(e.workflowSpans.set(t.workflowId,{span:o,createdAt:Date.now()}),b(o,t.headers),e.recordPayloads&&t.input!==void 0)o.setAttribute("weft.payload.input",g(t.input,e.maxPayloadSize));S(e,o,t),e.metrics.increment("weft.workflow.started"),e.metrics.increment("weft.dpmo.operations"),r(t)},*activity(t,r){let n=e.tracer.startSpan(`activity:${t.activityName}`,{attributes:{"weft.activity.name":t.activityName,"weft.activity.attempt":t.attempt}},O(e,t.workflowId));if(b(n,t.headers),e.recordPayloads&&t.input!==void 0)n.setAttribute("weft.payload.input",g(t.input,e.maxPayloadSize));S(e,n,t);let o=Date.now();return yield*I(e,n,()=>r(t),()=>{e.metrics.record("weft.activity.duration",Date.now()-o),e.metrics.increment("weft.activity.attempts")})},*sleep(t,r){let n=e.tracer.startSpan("sleep",{attributes:{"weft.sleep.duration":t.duration}},O(e,t.workflowId));S(e,n,t),yield*I(e,n,()=>r(t))},*waitForSignal(t,r){let n=e.tracer.startSpan("waitForSignal",{attributes:{"weft.signal.name":t.signalName}},O(e,t.workflowId));return S(e,n,t),yield*I(e,n,()=>r(t))},async childWorkflow(t,r){let n=[],o=h(t.parentHeaders);if(o)n.push({context:{traceId:o.traceId,spanId:o.spanId,traceFlags:o.traceFlags}});let s=e.tracer.startSpan(`childWorkflow:${t.workflowType}`,{attributes:{"weft.child_workflow.type":t.workflowType,"weft.child_workflow.id":t.childWorkflowId,"weft.child_workflow.parent_id":t.workflowId},links:n},e.api.context.ROOT_CONTEXT);if(b(s,t.headers),e.recordPayloads&&t.input!==void 0)s.setAttribute("weft.payload.input",g(t.input,e.maxPayloadSize));return e.metrics.increment("weft.child_workflow.started"),x(e,s,()=>r(t))},signalReceived(t,r){let n=e.tracer.startSpan(`signal:received:${t.signalName}`,{attributes:{"weft.signal.name":t.signalName,"weft.signal.workflow_id":t.workflowId}});S(e,n,t),F(e,n,()=>r(t))}}}function he(e){let{attributeExtractor:t,eventTarget:r,maxPayloadSize:n=N,metrics:o=new E,openTelemetryApi:s=y(),recordPayloads:a=!1,tracerName:A="weft",tracerVersion:i}=e??{},m=s,{trace:p,SpanStatusCode:c}=m,T=p.getTracer(A,i);return{api:m,trace:p,SpanStatusCode:c,tracer:T,recordPayloads:a,maxPayloadSize:n,attributeExtractor:t,eventTarget:r,metrics:o,workflowSpans:new Map}}function Je(e){let t=he(e),r=j(t),n=H(t),o={...r,...n},s=Y(t);return{interceptor:o,metrics:t.metrics,...s}}export{k as METRICS,E as MetricsCollector,ke as createMetricsCollectorExporter,Je as createObservabilityInterceptors,le as createOpenTelemetryMetrics,h as extractTraceParent,D as formatTraceParent,se as generateSpanId,ie as generateTraceId,y as getOpenTelemetryApi,C as injectTraceParent,L as parseTraceParent,z as serializeMetricsSnapshotForPrometheus};
@@ -4,29 +4,27 @@
4
4
  * Scans the durable task ledger (WFT-24 — previously the retired
5
5
  * `op:queued:`/`op:inflight:`/`op:resolved:`/`op:dead-letter:` keys, which
6
6
  * nothing has written since the WFT-22 ledger cutover) and live worker state
7
- * to identify queue pressure, stale in-flight work, retry storms, dead
8
- * letters, and worker capacity saturation. Results are intentionally bounded
9
- * and low-cardinality so operators can use them in a dashboard without
10
- * turning workflow or worker identifiers into metrics labels.
7
+ * to identify queue pressure, expected delayed attempts, stale in-flight
8
+ * work, retry storms, elapsed terminal non-adoption, dead letters, and worker
9
+ * capacity saturation. Results are intentionally bounded and low-cardinality
10
+ * so operators can use them in a dashboard without turning workflow or worker
11
+ * identifiers into metrics labels.
11
12
  *
12
- * The output schema's field names and `kind`/`state` vocabulary are
13
- * unchanged from the pre-ledger version — only the internal scan and
14
- * classification logic changed so existing dashboards built against this
15
- * endpoint's shape keep working. `leased`, `completing`, and `cancelling`
16
- * ledger states are all reported as diagnostic `state: 'inflight'`: they
17
- * share the same lease-holder/heartbeat shape and the same operator
18
- * question ("is a worker still making progress on this attempt?"), so
19
- * exposing the ledger's more granular internal states here would add
20
- * distinctions operators cannot act on differently.
13
+ * `leased`, `completing`, and `cancelling` ledger states are all reported as
14
+ * diagnostic `state: 'inflight'`: they share the same lease-holder/heartbeat
15
+ * shape and the same operator question ("is a worker still making progress on
16
+ * this attempt?"), so exposing the ledger's more granular internal states
17
+ * here would add distinctions operators cannot act on differently. Terminal
18
+ * records reported as `unadopted-terminal` use the coarse `resolved` state and
19
+ * expose no attempt-count history.
21
20
  *
22
21
  * Retry-storm detection (`kind: 'retry-storm'`) no longer covers `terminal`
23
22
  * records: `RemoteTaskTerminal` carries no `retryCount`/`requeueCount` (WFT-25
24
23
  * deliberately dropped attempt-count history once a task resolves), so
25
24
  * there is nothing left to detect a storm from once an attempt reaches a
26
- * disposition. The `resolved` value in the `state` enum is kept in the
27
- * output schema for backward compatibility but nothing produces it anymore.
28
- * `dead-lettered` diagnostics are unaffected that is a distinct, separate
29
- * `kind`.
25
+ * disposition. Terminal records are classified only by elapsed non-adoption;
26
+ * that diagnostic does not claim an adoption attempt failed. `dead-lettered`
27
+ * diagnostics remain a distinct kind for result-persistence exhaustion.
30
28
  *
31
29
  * Unlike the pre-ledger scan, the full ledger scan this operation performs
32
30
  * is one combined keyspace across every state (queued through terminal),
@@ -49,8 +47,10 @@ declare const taskDiagnosticKindSchema: z.ZodEnum<{
49
47
  "stale-inflight": "stale-inflight";
50
48
  "retry-storm": "retry-storm";
51
49
  "all-workers-at-capacity": "all-workers-at-capacity";
50
+ delayed: "delayed";
51
+ "unadopted-terminal": "unadopted-terminal";
52
52
  }>;
53
- declare const taskDiagnosticItemSchema: z.ZodObject<{
53
+ declare const taskDiagnosticItemSchema: z.ZodUnion<readonly [z.ZodObject<{
54
54
  kind: z.ZodEnum<{
55
55
  "dead-lettered": "dead-lettered";
56
56
  "stuck-queued": "stuck-queued";
@@ -82,16 +82,37 @@ declare const taskDiagnosticItemSchema: z.ZodObject<{
82
82
  storageError: z.ZodOptional<z.ZodString>;
83
83
  retryAttempts: z.ZodOptional<z.ZodNumber>;
84
84
  evidence: z.ZodArray<z.ZodString>;
85
- }, z.core.$strict>;
85
+ }, z.core.$strict>, z.ZodObject<{
86
+ kind: z.ZodLiteral<"delayed">;
87
+ state: z.ZodLiteral<"queued">;
88
+ operationId: z.ZodString;
89
+ workflowId: z.ZodOptional<z.ZodString>;
90
+ queue: z.ZodString;
91
+ retryCount: z.ZodNumber;
92
+ requeueCount: z.ZodNumber;
93
+ availableAt: z.ZodNumber;
94
+ evidence: z.ZodArray<z.ZodString>;
95
+ }, z.core.$strict>, z.ZodObject<{
96
+ kind: z.ZodLiteral<"unadopted-terminal">;
97
+ state: z.ZodLiteral<"resolved">;
98
+ operationId: z.ZodString;
99
+ workflowId: z.ZodOptional<z.ZodString>;
100
+ queue: z.ZodString;
101
+ terminalAt: z.ZodNumber;
102
+ adopted: z.ZodLiteral<false>;
103
+ evidence: z.ZodArray<z.ZodString>;
104
+ }, z.core.$strict>]>;
86
105
  declare const taskDiagnosticsSummarySchema: z.ZodObject<{
87
106
  stuckQueued: z.ZodNumber;
88
107
  staleInflight: z.ZodNumber;
89
108
  retryStorms: z.ZodNumber;
90
109
  allWorkersAtCapacity: z.ZodNumber;
91
110
  deadLettered: z.ZodNumber;
111
+ delayed: z.ZodNumber;
112
+ unadoptedTerminal: z.ZodNumber;
92
113
  }, z.core.$strict>;
93
114
  declare const getTaskDiagnosticsOutput: z.ZodObject<{
94
- items: z.ZodArray<z.ZodObject<{
115
+ items: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
95
116
  kind: z.ZodEnum<{
96
117
  "dead-lettered": "dead-lettered";
97
118
  "stuck-queued": "stuck-queued";
@@ -123,13 +144,34 @@ declare const getTaskDiagnosticsOutput: z.ZodObject<{
123
144
  storageError: z.ZodOptional<z.ZodString>;
124
145
  retryAttempts: z.ZodOptional<z.ZodNumber>;
125
146
  evidence: z.ZodArray<z.ZodString>;
126
- }, z.core.$strict>>;
147
+ }, z.core.$strict>, z.ZodObject<{
148
+ kind: z.ZodLiteral<"delayed">;
149
+ state: z.ZodLiteral<"queued">;
150
+ operationId: z.ZodString;
151
+ workflowId: z.ZodOptional<z.ZodString>;
152
+ queue: z.ZodString;
153
+ retryCount: z.ZodNumber;
154
+ requeueCount: z.ZodNumber;
155
+ availableAt: z.ZodNumber;
156
+ evidence: z.ZodArray<z.ZodString>;
157
+ }, z.core.$strict>, z.ZodObject<{
158
+ kind: z.ZodLiteral<"unadopted-terminal">;
159
+ state: z.ZodLiteral<"resolved">;
160
+ operationId: z.ZodString;
161
+ workflowId: z.ZodOptional<z.ZodString>;
162
+ queue: z.ZodString;
163
+ terminalAt: z.ZodNumber;
164
+ adopted: z.ZodLiteral<false>;
165
+ evidence: z.ZodArray<z.ZodString>;
166
+ }, z.core.$strict>]>>;
127
167
  summary: z.ZodObject<{
128
168
  stuckQueued: z.ZodNumber;
129
169
  staleInflight: z.ZodNumber;
130
170
  retryStorms: z.ZodNumber;
131
171
  allWorkersAtCapacity: z.ZodNumber;
132
172
  deadLettered: z.ZodNumber;
173
+ delayed: z.ZodNumber;
174
+ unadoptedTerminal: z.ZodNumber;
133
175
  }, z.core.$strict>;
134
176
  limit: z.ZodNumber;
135
177
  }, z.core.$strict>;
@@ -140,6 +182,8 @@ declare const getTaskDiagnosticsInput: z.ZodObject<{
140
182
  staleQueuedAfterMs: z.ZodDefault<z.ZodNumber>;
141
183
  staleHeartbeatAfterMs: z.ZodDefault<z.ZodNumber>;
142
184
  retryStormMinimumAttempts: z.ZodDefault<z.ZodNumber>;
185
+ includeExpectedDelayed: z.ZodDefault<z.ZodBoolean>;
186
+ unadoptedAfterMs: z.ZodDefault<z.ZodNumber>;
143
187
  limit: z.ZodDefault<z.ZodNumber>;
144
188
  }, z.core.$strip>;
145
189
  declare const clearTaskDeadLetterInput: z.ZodObject<{
@@ -164,12 +208,14 @@ export declare function createGetTaskDiagnosticsOperation(options?: GetTaskDiagn
164
208
  staleQueuedAfterMs: number;
165
209
  staleHeartbeatAfterMs: number;
166
210
  retryStormMinimumAttempts: number;
211
+ includeExpectedDelayed: boolean;
212
+ unadoptedAfterMs: number;
167
213
  limit: number;
168
214
  operationId?: string | undefined;
169
215
  workflowId?: string | undefined;
170
216
  queue?: string | undefined;
171
217
  }, {
172
- items: {
218
+ items: ({
173
219
  kind: "dead-lettered" | "stuck-queued" | "stale-inflight" | "retry-storm" | "all-workers-at-capacity";
174
220
  state: "dead-lettered" | "queued" | "resolved" | "inflight" | "capacity";
175
221
  retryCount: number;
@@ -189,13 +235,34 @@ export declare function createGetTaskDiagnosticsOperation(options?: GetTaskDiagn
189
235
  deadLetterReason?: "result-resolution-storage-exhausted" | undefined;
190
236
  storageError?: string | undefined;
191
237
  retryAttempts?: number | undefined;
192
- }[];
238
+ } | {
239
+ kind: "delayed";
240
+ state: "queued";
241
+ operationId: string;
242
+ queue: string;
243
+ retryCount: number;
244
+ requeueCount: number;
245
+ availableAt: number;
246
+ evidence: string[];
247
+ workflowId?: string | undefined;
248
+ } | {
249
+ kind: "unadopted-terminal";
250
+ state: "resolved";
251
+ operationId: string;
252
+ queue: string;
253
+ terminalAt: number;
254
+ adopted: false;
255
+ evidence: string[];
256
+ workflowId?: string | undefined;
257
+ })[];
193
258
  summary: {
194
259
  stuckQueued: number;
195
260
  staleInflight: number;
196
261
  retryStorms: number;
197
262
  allWorkersAtCapacity: number;
198
263
  deadLettered: number;
264
+ delayed: number;
265
+ unadoptedTerminal: number;
199
266
  };
200
267
  limit: number;
201
268
  }, unknown>;
@@ -203,12 +270,14 @@ export declare const getTaskDiagnosticsOperation: import("../operation-catalog.t
203
270
  staleQueuedAfterMs: number;
204
271
  staleHeartbeatAfterMs: number;
205
272
  retryStormMinimumAttempts: number;
273
+ includeExpectedDelayed: boolean;
274
+ unadoptedAfterMs: number;
206
275
  limit: number;
207
276
  operationId?: string | undefined;
208
277
  workflowId?: string | undefined;
209
278
  queue?: string | undefined;
210
279
  }, {
211
- items: {
280
+ items: ({
212
281
  kind: "dead-lettered" | "stuck-queued" | "stale-inflight" | "retry-storm" | "all-workers-at-capacity";
213
282
  state: "dead-lettered" | "queued" | "resolved" | "inflight" | "capacity";
214
283
  retryCount: number;
@@ -228,13 +297,34 @@ export declare const getTaskDiagnosticsOperation: import("../operation-catalog.t
228
297
  deadLetterReason?: "result-resolution-storage-exhausted" | undefined;
229
298
  storageError?: string | undefined;
230
299
  retryAttempts?: number | undefined;
231
- }[];
300
+ } | {
301
+ kind: "delayed";
302
+ state: "queued";
303
+ operationId: string;
304
+ queue: string;
305
+ retryCount: number;
306
+ requeueCount: number;
307
+ availableAt: number;
308
+ evidence: string[];
309
+ workflowId?: string | undefined;
310
+ } | {
311
+ kind: "unadopted-terminal";
312
+ state: "resolved";
313
+ operationId: string;
314
+ queue: string;
315
+ terminalAt: number;
316
+ adopted: false;
317
+ evidence: string[];
318
+ workflowId?: string | undefined;
319
+ })[];
232
320
  summary: {
233
321
  stuckQueued: number;
234
322
  staleInflight: number;
235
323
  retryStorms: number;
236
324
  allWorkersAtCapacity: number;
237
325
  deadLettered: number;
326
+ delayed: number;
327
+ unadoptedTerminal: number;
238
328
  };
239
329
  limit: number;
240
330
  }, unknown>;
@@ -9,14 +9,22 @@ import {
9
9
  calculateHeartbeatAgeMs,
10
10
  calculateQueueLatencyMs
11
11
  } from "../task-state.js";
12
- const DEFAULT_STALE_QUEUED_AFTER_MS = 60000, DEFAULT_STALE_HEARTBEAT_AFTER_MS = 60000, DEFAULT_RETRY_STORM_MINIMUM_ATTEMPTS = 3, DEFAULT_LIMIT = 50, MAX_LIMIT = 200, taskDiagnosticKindSchema = z.enum([
12
+ const DEFAULT_STALE_QUEUED_AFTER_MS = 60000, DEFAULT_STALE_HEARTBEAT_AFTER_MS = 60000, DEFAULT_RETRY_STORM_MINIMUM_ATTEMPTS = 3, DEFAULT_UNADOPTED_AFTER_MS = 60000, DEFAULT_LIMIT = 50, MAX_LIMIT = 200, taskDiagnosticKindSchema = z.enum([
13
13
  "stuck-queued",
14
14
  "stale-inflight",
15
15
  "retry-storm",
16
16
  "all-workers-at-capacity",
17
- "dead-lettered"
18
- ]), taskDiagnosticItemSchema = z.object({
19
- kind: taskDiagnosticKindSchema,
17
+ "dead-lettered",
18
+ "delayed",
19
+ "unadopted-terminal"
20
+ ]), existingTaskDiagnosticItemSchema = z.object({
21
+ kind: z.enum([
22
+ "stuck-queued",
23
+ "stale-inflight",
24
+ "retry-storm",
25
+ "all-workers-at-capacity",
26
+ "dead-lettered"
27
+ ]),
20
28
  state: z.enum(["queued", "inflight", "resolved", "capacity", "dead-lettered"]),
21
29
  operationId: z.string().optional(),
22
30
  workflowId: z.string().optional(),
@@ -35,12 +43,37 @@ const DEFAULT_STALE_QUEUED_AFTER_MS = 60000, DEFAULT_STALE_HEARTBEAT_AFTER_MS =
35
43
  storageError: z.string().optional(),
36
44
  retryAttempts: z.number().int().nonnegative().optional(),
37
45
  evidence: z.array(z.string())
38
- }).strict(), taskDiagnosticsSummarySchema = z.object({
46
+ }).strict(), delayedTaskDiagnosticItemSchema = z.object({
47
+ kind: z.literal("delayed"),
48
+ state: z.literal("queued"),
49
+ operationId: z.string(),
50
+ workflowId: z.string().optional(),
51
+ queue: z.string(),
52
+ retryCount: z.number().int().nonnegative(),
53
+ requeueCount: z.number().int().nonnegative(),
54
+ availableAt: z.number().nonnegative(),
55
+ evidence: z.array(z.string())
56
+ }).strict(), unadoptedTerminalTaskDiagnosticItemSchema = z.object({
57
+ kind: z.literal("unadopted-terminal"),
58
+ state: z.literal("resolved"),
59
+ operationId: z.string(),
60
+ workflowId: z.string().optional(),
61
+ queue: z.string(),
62
+ terminalAt: z.number().nonnegative(),
63
+ adopted: z.literal(!1),
64
+ evidence: z.array(z.string())
65
+ }).strict(), taskDiagnosticItemSchema = z.union([
66
+ existingTaskDiagnosticItemSchema,
67
+ delayedTaskDiagnosticItemSchema,
68
+ unadoptedTerminalTaskDiagnosticItemSchema
69
+ ]), taskDiagnosticsSummarySchema = z.object({
39
70
  stuckQueued: z.number().int().nonnegative(),
40
71
  staleInflight: z.number().int().nonnegative(),
41
72
  retryStorms: z.number().int().nonnegative(),
42
73
  allWorkersAtCapacity: z.number().int().nonnegative(),
43
- deadLettered: z.number().int().nonnegative()
74
+ deadLettered: z.number().int().nonnegative(),
75
+ delayed: z.number().int().nonnegative(),
76
+ unadoptedTerminal: z.number().int().nonnegative()
44
77
  }).strict(), getTaskDiagnosticsOutput = z.object({
45
78
  items: z.array(taskDiagnosticItemSchema),
46
79
  summary: taskDiagnosticsSummarySchema,
@@ -52,6 +85,8 @@ const DEFAULT_STALE_QUEUED_AFTER_MS = 60000, DEFAULT_STALE_HEARTBEAT_AFTER_MS =
52
85
  staleQueuedAfterMs: z.number().int().nonnegative().default(DEFAULT_STALE_QUEUED_AFTER_MS),
53
86
  staleHeartbeatAfterMs: z.number().int().nonnegative().default(DEFAULT_STALE_HEARTBEAT_AFTER_MS),
54
87
  retryStormMinimumAttempts: z.number().int().min(1).default(DEFAULT_RETRY_STORM_MINIMUM_ATTEMPTS),
88
+ includeExpectedDelayed: z.boolean().default(!1),
89
+ unadoptedAfterMs: z.number().int().nonnegative().default(DEFAULT_UNADOPTED_AFTER_MS),
55
90
  limit: z.number().int().min(1).max(MAX_LIMIT).default(DEFAULT_LIMIT)
56
91
  }), clearTaskDeadLetterInput = z.object({
57
92
  operationId: z.string().min(1)
@@ -128,7 +163,9 @@ async function collectTaskDiagnostics({
128
163
  staleInflight: 0,
129
164
  retryStorms: 0,
130
165
  allWorkersAtCapacity: 0,
131
- deadLettered: 0
166
+ deadLettered: 0,
167
+ delayed: 0,
168
+ unadoptedTerminal: 0
132
169
  }, relevantQueues = new Set, addItem = (item) => {
133
170
  incrementSummary(summary, item.kind);
134
171
  if (items.length < input.limit)
@@ -155,6 +192,8 @@ async function collectTaskDiagnostics({
155
192
  function addRecordDiagnostics(decoded, input, currentTime, addItem) {
156
193
  switch (decoded.state) {
157
194
  case "queued":
195
+ if (input.includeExpectedDelayed && decoded.availableAt > currentTime)
196
+ addDelayedDiagnostic(decoded, addItem);
158
197
  if (decoded.availableAt <= currentTime)
159
198
  addQueuedDiagnostics(decoded, input, currentTime, addItem);
160
199
  addRetryStormDiagnostic(decoded, "queued", input, addItem);
@@ -166,6 +205,7 @@ function addRecordDiagnostics(decoded, input, currentTime, addItem) {
166
205
  addRetryStormDiagnostic(decoded, "inflight", input, addItem);
167
206
  return;
168
207
  case "terminal":
208
+ addUnadoptedTerminalDiagnostic(decoded, input, currentTime, addItem);
169
209
  return;
170
210
  case "deadLettered":
171
211
  addDeadLetterDiagnostics(decoded, addItem);
@@ -175,6 +215,33 @@ function addRecordDiagnostics(decoded, input, currentTime, addItem) {
175
215
  }
176
216
  }
177
217
  }
218
+ function addDelayedDiagnostic(record, addItem) {
219
+ addItem({
220
+ kind: "delayed",
221
+ state: "queued",
222
+ operationId: record.operationId,
223
+ workflowId: record.workflowId,
224
+ queue: record.queue,
225
+ retryCount: record.retryCount,
226
+ requeueCount: record.requeueCount,
227
+ availableAt: record.availableAt,
228
+ evidence: [`Task is delayed until ${record.availableAt} on queue "${record.queue}"`]
229
+ });
230
+ }
231
+ function addUnadoptedTerminalDiagnostic(record, input, currentTime, addItem) {
232
+ if (record.adopted || record.terminalAt > currentTime - input.unadoptedAfterMs)
233
+ return;
234
+ addItem({
235
+ kind: "unadopted-terminal",
236
+ state: "resolved",
237
+ operationId: record.operationId,
238
+ workflowId: record.workflowId,
239
+ queue: record.queue,
240
+ terminalAt: record.terminalAt,
241
+ adopted: !1,
242
+ evidence: [`Terminal task has remained unadopted for ${currentTime - record.terminalAt}ms`]
243
+ });
244
+ }
178
245
  function addQueuedDiagnostics(record, input, currentTime, addItem) {
179
246
  const queueLatencyMs = Math.max(0, currentTime - record.lastQueuedAt);
180
247
  if (queueLatencyMs < input.staleQueuedAfterMs)
@@ -337,11 +404,26 @@ function incrementSummary(summary, kind) {
337
404
  case "dead-lettered":
338
405
  summary.deadLettered += 1;
339
406
  return;
407
+ case "delayed":
408
+ summary.delayed += 1;
409
+ return;
410
+ case "unadopted-terminal":
411
+ summary.unadoptedTerminal += 1;
412
+ return;
340
413
  }
341
414
  }
342
415
  function parseOptionalNumber(value) {
343
416
  return value === null || value.length === 0 ? void 0 : Number(value);
344
417
  }
418
+ function parseOptionalBoolean(value) {
419
+ if (value === null || value.length === 0)
420
+ return;
421
+ if (value === "true")
422
+ return !0;
423
+ if (value === "false")
424
+ return !1;
425
+ return value;
426
+ }
345
427
  export const getTaskDiagnosticsRestBinding = {
346
428
  method: "GET",
347
429
  path: "/v1/tasks/diagnostics",
@@ -354,6 +436,8 @@ export const getTaskDiagnosticsRestBinding = {
354
436
  staleQueuedAfterMs: { kind: "query", queryParam: "staleQueuedAfterMs" },
355
437
  staleHeartbeatAfterMs: { kind: "query", queryParam: "staleHeartbeatAfterMs" },
356
438
  retryStormMinimumAttempts: { kind: "query", queryParam: "retryStormMinimumAttempts" },
439
+ includeExpectedDelayed: { kind: "query", queryParam: "includeExpectedDelayed" },
440
+ unadoptedAfterMs: { kind: "query", queryParam: "unadoptedAfterMs" },
357
441
  limit: { kind: "query", queryParam: "limit" }
358
442
  },
359
443
  extractInput: async (request) => {
@@ -365,6 +449,8 @@ export const getTaskDiagnosticsRestBinding = {
365
449
  staleQueuedAfterMs: parseOptionalNumber(url.searchParams.get("staleQueuedAfterMs")),
366
450
  staleHeartbeatAfterMs: parseOptionalNumber(url.searchParams.get("staleHeartbeatAfterMs")),
367
451
  retryStormMinimumAttempts: parseOptionalNumber(url.searchParams.get("retryStormMinimumAttempts")),
452
+ includeExpectedDelayed: parseOptionalBoolean(url.searchParams.get("includeExpectedDelayed")),
453
+ unadoptedAfterMs: parseOptionalNumber(url.searchParams.get("unadoptedAfterMs")),
368
454
  limit: parseOptionalNumber(url.searchParams.get("limit"))
369
455
  };
370
456
  },
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- var Z=import.meta.require,I=(z,C,J)=>{if(C!=null){if(typeof C!=="object"&&typeof C!=="function")throw TypeError('Object expected to be assigned to "using" declaration');let K;if(J)K=C[Symbol.asyncDispose];if(K===void 0)K=C[Symbol.dispose];if(typeof K!=="function")throw TypeError("Object not disposable");z.push([J,K,C])}else if(J)z.push([J]);return C},L=(z,C,J)=>{let K=(V)=>C=J?new SuppressedError(V,C,"An error was suppressed during disposal"):(J=!0,V),Y=(V)=>{while(V=z.pop())try{var A=V[1]&&V[1].call(V[2]);if(V[0])return Promise.resolve(A).then(Y,(q)=>(K(q),Y()))}catch(q){K(q)}if(J)throw C};return Y()};function F(z){return{hasBun:typeof z.Bun<"u",hasIndexedDB:typeof z.indexedDB<"u",hasNode:z.process!==void 0&&typeof z.process.versions?.node==="string",hasWebExtensionStorage:z.browser?.storage!==void 0||z.chrome?.storage!==void 0}}async function P(z){let{createHash:C}=await import("crypto"),J=z.process?.cwd?.()??"weft-default";return C("sha256").update(J).digest("hex").slice(0,16)}async function X(z){let[{mkdirSync:C},{tmpdir:J},K]=await Promise.all([import("fs"),import("os"),import("path")]),Y=z.process?.env?.WEFT_DEFAULT_STORAGE_PATH,V=Y!==void 0&&Y.length>0?Y:K.join(J(),"weft-default",`${await P(z)}.db`);return C(K.dirname(V),{recursive:!0}),V}function H(z,C){if(C==="Bun")return typeof z.Bun;if(C==="browser.storage")return typeof(z.browser?.storage??z.chrome?.storage);return typeof z.process}function j(z,C){return import.meta.url.endsWith(".ts")?z:C}async function $(z){return await import(z)}function k(z){if(z.browser?.storage!==void 0)return z.browser;if(z.chrome?.storage!==void 0)return z.chrome;return{}}function Q(z){let{indexedDB:C,IDBKeyRange:J}=z;if(C===void 0||J===void 0)throw Error("resolveDefaultStorage: IndexedDB resolution requires both indexedDB and IDBKeyRange.");return{indexedDB:C,IDBKeyRange:J}}function U(z){let C=typeof z.indexedDB,J=typeof z.IDBKeyRange;return`typeof indexedDB=${C}, typeof IDBKeyRange=${J}`}var W=j("./bun-sql.ts","./bun-sql.js"),B=j("./node-sqlite.ts","./node-sqlite.js"),N=j("./indexeddb.ts","./indexeddb.js"),w=j("./web-extension.ts","./web-extension.js");async function T(z=globalThis){let C=F(z);if(C.hasBun){let{BunSQLiteStorage:J}=await $(W);return new J(await X(z))}if(C.hasNode){let{NodeSQLiteStorage:J}=await $(B);return new J(await X(z))}if(C.hasWebExtensionStorage){let{WebExtensionStorage:J}=await $(w);return new J({},k(z))}if(C.hasIndexedDB){let{IndexedDBStorage:J}=await $(N);return new J("weft",Q(z))}throw Error(`resolveDefaultStorage: requires Bun, Node, WebExtension storage, or IndexedDB. Detected: typeof Bun=${H(z,"Bun")}, typeof process=${H(z,"process")}, typeof browser.storage=${H(z,"browser.storage")}, ${U(z)}.`)}export{T as resolveDefaultStorage};
2
+ var o=import.meta.require;function f(e){return{hasBun:typeof e.Bun<"u",hasIndexedDB:typeof e.indexedDB<"u",hasNode:e.process!==void 0&&typeof e.process.versions?.node==="string",hasWebExtensionStorage:e.browser?.storage!==void 0||e.chrome?.storage!==void 0}}async function g(e){let{createHash:n}=await import("crypto"),t=e.process?.cwd?.()??"weft-default";return n("sha256").update(t).digest("hex").slice(0,16)}async function u(e){let[{mkdirSync:n},{tmpdir:t},a]=await Promise.all([import("fs"),import("os"),import("path")]),i=e.process?.env?.WEFT_DEFAULT_STORAGE_PATH,c=i!==void 0&&i.length>0?i:a.join(t(),"weft-default",`${await g(e)}.db`);return n(a.dirname(c),{recursive:!0}),c}function d(e,n){if(n==="Bun")return typeof e.Bun;if(n==="browser.storage")return typeof(e.browser?.storage??e.chrome?.storage);return typeof e.process}function s(e,n){return import.meta.url.endsWith(".ts")?e:n}async function r(e){return await import(e)}function p(e){if(e.browser?.storage!==void 0)return e.browser;if(e.chrome?.storage!==void 0)return e.chrome;return{}}function y(e){let{indexedDB:n,IDBKeyRange:t}=e;if(n===void 0||t===void 0)throw Error("resolveDefaultStorage: IndexedDB resolution requires both indexedDB and IDBKeyRange.");return{indexedDB:n,IDBKeyRange:t}}function D(e){let n=typeof e.indexedDB,t=typeof e.IDBKeyRange;return`typeof indexedDB=${n}, typeof IDBKeyRange=${t}`}var w=s("./bun-sql.ts","./bun-sql.js"),B=s("./node-sqlite.ts","./node-sqlite.js"),x=s("./indexeddb.ts","./indexeddb.js"),b=s("./web-extension.ts","./web-extension.js");async function S(e=globalThis){let n=f(e);if(n.hasBun){let{BunSQLiteStorage:t}=await r(w);return new t(await u(e))}if(n.hasNode){let{NodeSQLiteStorage:t}=await r(B);return new t(await u(e))}if(n.hasWebExtensionStorage){let{WebExtensionStorage:t}=await r(b);return new t({},p(e))}if(n.hasIndexedDB){let{IndexedDBStorage:t}=await r(x);return new t("weft",y(e))}throw Error(`resolveDefaultStorage: requires Bun, Node, WebExtension storage, or IndexedDB. Detected: typeof Bun=${d(e,"Bun")}, typeof process=${d(e,"process")}, typeof browser.storage=${d(e,"browser.storage")}, ${D(e)}.`)}export{S as resolveDefaultStorage};