@uploadista/core 0.0.18-beta.13 → 0.0.18-beta.14
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.
- package/dist/flow/index.cjs +1 -1
- package/dist/flow/index.d.cts +1 -1
- package/dist/flow/index.d.mts +1 -1
- package/dist/flow/index.mjs +1 -1
- package/dist/{flow-Bjk5BTAR.cjs → flow-BlPuKP60.cjs} +1 -1
- package/dist/flow-DdtnF71W.mjs +2 -0
- package/dist/flow-DdtnF71W.mjs.map +1 -0
- package/dist/index-B9V5SSxl.d.mts.map +1 -1
- package/dist/{index-CsiJ8gqH.d.mts → index-B_LjgPOx.d.mts} +5 -5
- package/dist/{index-CsiJ8gqH.d.mts.map → index-B_LjgPOx.d.mts.map} +1 -1
- package/dist/{index-C1neVwxb.d.cts → index-BtwZT2P7.d.cts} +5 -5
- package/dist/{index-C1neVwxb.d.cts.map → index-BtwZT2P7.d.cts.map} +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +1 -1
- package/dist/testing/index.cjs +1 -1
- package/dist/testing/index.d.cts +1 -1
- package/dist/testing/index.d.mts +1 -1
- package/dist/testing/index.mjs +1 -1
- package/dist/types/index.d.cts +1 -1
- package/dist/types/index.d.mts +1 -1
- package/dist/upload/index.d.cts +1 -1
- package/dist/upload/index.d.mts +1 -1
- package/package.json +2 -2
- package/src/flow/flow-server.ts +49 -4
- package/dist/flow-CUW8k-Ni.mjs +0 -2
- package/dist/flow-CUW8k-Ni.mjs.map +0 -1
package/dist/types/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import "../uploadista-error-DR0XimpE.mjs";
|
|
2
2
|
import "../index-C-svZlpj.mjs";
|
|
3
|
-
import { $a as FlowJobKVStore, Ai as UploadStrategy, Ar as HealthComponents, Br as TypedEventEmitter, Ci as DataStore, Cr as InputFile, Di as UploadFileDataStore, Dr as DEFAULT_HEALTH_CHECK_CONFIG, Ei as DataStoreWriteOptions, Er as ComponentHealth, Fr as getHealthResponseFormat, Ga as CircuitBreakerStateValue, Gr as WebSocketConnection, Hr as eventToMessageSerializer, Ir as BaseEventEmitter, Ja as CircuitBreakerStoreService, Jr as UploadEvent, Ka as CircuitBreakerStats, Kr as WebSocketMessage, Lr as BaseEventEmitterService, Mi as isDataStore, Mr as HealthResponseFormat, Nr as HealthStatus, Oi as UploadFileDataStores, Or as DlqHealthSummary, Pr as formatHealthAsText, Qa as DeadLetterQueueKVStore, Qr as EventBroadcasterService, Rr as EventEmitter, Si as BufferedUploadFileDataStore, Sr as MiddlewareServiceLive, Ti as DataStoreConfig, Tr as CircuitBreakerHealthSummary, Ur as flowEventEmitter, Vr as UploadEventEmitter, Wa as CircuitBreakerStateData, Wr as uploadEventEmitter, Xa as BaseKvStore, Xr as uploadEventSchema, Ya as createInitialCircuitBreakerState, Yr as UploadEventType, Za as BaseKvStoreService, Zr as EventBroadcaster, ao as jsonSerializer, br as MiddlewareNext, co as UploadFileTraceContext, eo as KvStore, io as flowJobKvStore, ji as createDataStoreLayer, jr as HealthResponse, ki as UploadFileDataStoresShape, kr as HealthCheckConfig, lo as traceContextSchema, no as UploadFileKVStore, oo as uploadFileKvStore, qa as CircuitBreakerStore, qr as webSocketMessageSchema, ro as deadLetterQueueKvStore, so as UploadFile, to as TypedKvStore, uo as uploadFileSchema, vr as Middleware, wi as DataStoreCapabilities, wr as inputFileSchema, xr as MiddlewareService, yr as MiddlewareContext, zr as FlowEventEmitter } from "../index-
|
|
3
|
+
import { $a as FlowJobKVStore, Ai as UploadStrategy, Ar as HealthComponents, Br as TypedEventEmitter, Ci as DataStore, Cr as InputFile, Di as UploadFileDataStore, Dr as DEFAULT_HEALTH_CHECK_CONFIG, Ei as DataStoreWriteOptions, Er as ComponentHealth, Fr as getHealthResponseFormat, Ga as CircuitBreakerStateValue, Gr as WebSocketConnection, Hr as eventToMessageSerializer, Ir as BaseEventEmitter, Ja as CircuitBreakerStoreService, Jr as UploadEvent, Ka as CircuitBreakerStats, Kr as WebSocketMessage, Lr as BaseEventEmitterService, Mi as isDataStore, Mr as HealthResponseFormat, Nr as HealthStatus, Oi as UploadFileDataStores, Or as DlqHealthSummary, Pr as formatHealthAsText, Qa as DeadLetterQueueKVStore, Qr as EventBroadcasterService, Rr as EventEmitter, Si as BufferedUploadFileDataStore, Sr as MiddlewareServiceLive, Ti as DataStoreConfig, Tr as CircuitBreakerHealthSummary, Ur as flowEventEmitter, Vr as UploadEventEmitter, Wa as CircuitBreakerStateData, Wr as uploadEventEmitter, Xa as BaseKvStore, Xr as uploadEventSchema, Ya as createInitialCircuitBreakerState, Yr as UploadEventType, Za as BaseKvStoreService, Zr as EventBroadcaster, ao as jsonSerializer, br as MiddlewareNext, co as UploadFileTraceContext, eo as KvStore, io as flowJobKvStore, ji as createDataStoreLayer, jr as HealthResponse, ki as UploadFileDataStoresShape, kr as HealthCheckConfig, lo as traceContextSchema, no as UploadFileKVStore, oo as uploadFileKvStore, qa as CircuitBreakerStore, qr as webSocketMessageSchema, ro as deadLetterQueueKvStore, so as UploadFile, to as TypedKvStore, uo as uploadFileSchema, vr as Middleware, wi as DataStoreCapabilities, wr as inputFileSchema, xr as MiddlewareService, yr as MiddlewareContext, zr as FlowEventEmitter } from "../index-B_LjgPOx.mjs";
|
|
4
4
|
import "../index-B9V5SSxl.mjs";
|
|
5
5
|
import "../index-BFSHumky.mjs";
|
|
6
6
|
export { BaseEventEmitter, BaseEventEmitterService, BaseKvStore, BaseKvStoreService, BufferedUploadFileDataStore, CircuitBreakerHealthSummary, CircuitBreakerStateData, CircuitBreakerStateValue, CircuitBreakerStats, CircuitBreakerStore, CircuitBreakerStoreService, ComponentHealth, DEFAULT_HEALTH_CHECK_CONFIG, DataStore, DataStoreCapabilities, DataStoreConfig, DataStoreWriteOptions, DeadLetterQueueKVStore, DlqHealthSummary, EventBroadcaster, EventBroadcasterService, EventEmitter, FlowEventEmitter, FlowJobKVStore, HealthCheckConfig, HealthComponents, HealthResponse, HealthResponseFormat, HealthStatus, InputFile, KvStore, Middleware, MiddlewareContext, MiddlewareNext, MiddlewareService, MiddlewareServiceLive, TypedEventEmitter, TypedKvStore, UploadEvent, UploadEventEmitter, UploadEventType, UploadFile, UploadFileDataStore, UploadFileDataStores, UploadFileDataStoresShape, UploadFileKVStore, UploadFileTraceContext, UploadStrategy, WebSocketConnection, WebSocketMessage, createDataStoreLayer, createInitialCircuitBreakerState, deadLetterQueueKvStore, eventToMessageSerializer, flowEventEmitter, flowJobKvStore, formatHealthAsText, getHealthResponseFormat, inputFileSchema, isDataStore, jsonSerializer, traceContextSchema, uploadEventEmitter, uploadEventSchema, uploadFileKvStore, uploadFileSchema, webSocketMessageSchema };
|
package/dist/upload/index.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import "../uploadista-error-CYCmAtkZ.cjs";
|
|
2
2
|
import "../index-_wQ5ClJU.cjs";
|
|
3
|
-
import { _r as detectMimeType, cr as NegotiatedStrategy, dr as UploadServer, fr as UploadServerOptions, gr as compareMimeTypes, hr as uploadServer, lr as UploadStrategyNegotiator, mr as createUploadServer, pr as UploadServerShape, ur as UploadStrategyOptions } from "../index-
|
|
3
|
+
import { _r as detectMimeType, cr as NegotiatedStrategy, dr as UploadServer, fr as UploadServerOptions, gr as compareMimeTypes, hr as uploadServer, lr as UploadStrategyNegotiator, mr as createUploadServer, pr as UploadServerShape, ur as UploadStrategyOptions } from "../index-BtwZT2P7.cjs";
|
|
4
4
|
import "../index-9gyMMEIB.cjs";
|
|
5
5
|
import "../index-DFbu_-zn.cjs";
|
|
6
6
|
export { NegotiatedStrategy, UploadServer, UploadServerOptions, UploadServerShape, UploadStrategyNegotiator, UploadStrategyOptions, compareMimeTypes, createUploadServer, detectMimeType, uploadServer };
|
package/dist/upload/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import "../uploadista-error-DR0XimpE.mjs";
|
|
2
2
|
import "../index-C-svZlpj.mjs";
|
|
3
|
-
import { _r as detectMimeType, cr as NegotiatedStrategy, dr as UploadServer, fr as UploadServerOptions, gr as compareMimeTypes, hr as uploadServer, lr as UploadStrategyNegotiator, mr as createUploadServer, pr as UploadServerShape, ur as UploadStrategyOptions } from "../index-
|
|
3
|
+
import { _r as detectMimeType, cr as NegotiatedStrategy, dr as UploadServer, fr as UploadServerOptions, gr as compareMimeTypes, hr as uploadServer, lr as UploadStrategyNegotiator, mr as createUploadServer, pr as UploadServerShape, ur as UploadStrategyOptions } from "../index-B_LjgPOx.mjs";
|
|
4
4
|
import "../index-B9V5SSxl.mjs";
|
|
5
5
|
import "../index-BFSHumky.mjs";
|
|
6
6
|
export { NegotiatedStrategy, UploadServer, UploadServerOptions, UploadServerShape, UploadStrategyNegotiator, UploadStrategyOptions, compareMimeTypes, createUploadServer, detectMimeType, uploadServer };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uploadista/core",
|
|
3
|
-
"version": "0.0.18-beta.
|
|
3
|
+
"version": "0.0.18-beta.14",
|
|
4
4
|
"description": "Core package of Uploadista",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Uploadista",
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
"tsdown": "0.16.8",
|
|
78
78
|
"vitest": "4.0.15",
|
|
79
79
|
"zod": "4.1.13",
|
|
80
|
-
"@uploadista/typescript-config": "0.0.18-beta.
|
|
80
|
+
"@uploadista/typescript-config": "0.0.18-beta.14"
|
|
81
81
|
},
|
|
82
82
|
"publishConfig": {
|
|
83
83
|
"access": "public",
|
package/src/flow/flow-server.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
context as otelContext,
|
|
3
|
+
trace,
|
|
4
|
+
type SpanContext,
|
|
5
|
+
} from "@opentelemetry/api";
|
|
2
6
|
import { Context, Effect, Layer, Option, Runtime } from "effect";
|
|
3
7
|
import type { z } from "zod";
|
|
4
8
|
import { UploadistaError } from "../errors";
|
|
@@ -828,6 +832,28 @@ export function createFlowServer() {
|
|
|
828
832
|
};
|
|
829
833
|
};
|
|
830
834
|
|
|
835
|
+
// Helper function to restore parent trace context for resumed flows
|
|
836
|
+
// This ensures the resumed flow execution continues under the same trace
|
|
837
|
+
const withParentTraceContext = (traceContext: FlowJobTraceContext) => {
|
|
838
|
+
return <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> => {
|
|
839
|
+
const spanContext: SpanContext = {
|
|
840
|
+
traceId: traceContext.traceId,
|
|
841
|
+
spanId: traceContext.spanId,
|
|
842
|
+
traceFlags: traceContext.traceFlags,
|
|
843
|
+
isRemote: true,
|
|
844
|
+
};
|
|
845
|
+
|
|
846
|
+
const parentContext = trace.setSpanContext(
|
|
847
|
+
otelContext.active(),
|
|
848
|
+
spanContext,
|
|
849
|
+
);
|
|
850
|
+
|
|
851
|
+
return Effect.suspend(() => {
|
|
852
|
+
return otelContext.with(parentContext, () => effect);
|
|
853
|
+
});
|
|
854
|
+
};
|
|
855
|
+
};
|
|
856
|
+
|
|
831
857
|
// Helper function to execute flow in background
|
|
832
858
|
const executeFlowInBackground = ({
|
|
833
859
|
jobId,
|
|
@@ -1190,7 +1216,7 @@ export function createFlowServer() {
|
|
|
1190
1216
|
const flow = yield* flowProvider.getFlow(job.flowId, job.clientId);
|
|
1191
1217
|
|
|
1192
1218
|
// Helper to resume flow in background
|
|
1193
|
-
const
|
|
1219
|
+
const resumeFlowInBackgroundCore = Effect.gen(function* () {
|
|
1194
1220
|
const flowWithEvents = withFlowEvents(flow, eventEmitter, kvStore);
|
|
1195
1221
|
|
|
1196
1222
|
if (!job.executionState) {
|
|
@@ -1239,6 +1265,25 @@ export function createFlowServer() {
|
|
|
1239
1265
|
|
|
1240
1266
|
return result;
|
|
1241
1267
|
}).pipe(
|
|
1268
|
+
// Wrap resumed flow execution in a span for distributed tracing
|
|
1269
|
+
Effect.withSpan("flow-execution-resume", {
|
|
1270
|
+
attributes: {
|
|
1271
|
+
"flow.id": flow.id,
|
|
1272
|
+
"flow.name": flow.name,
|
|
1273
|
+
"flow.job_id": jobId,
|
|
1274
|
+
"flow.storage_id": job.storageId,
|
|
1275
|
+
"flow.resumed_from_node": nodeId,
|
|
1276
|
+
},
|
|
1277
|
+
}),
|
|
1278
|
+
);
|
|
1279
|
+
|
|
1280
|
+
// Restore parent trace context if available from the original flow execution
|
|
1281
|
+
// This ensures the resumed flow continues under the same trace as the initial execution
|
|
1282
|
+
const resumeFlowInBackground = job.traceContext
|
|
1283
|
+
? withParentTraceContext(job.traceContext)(resumeFlowInBackgroundCore)
|
|
1284
|
+
: resumeFlowInBackgroundCore;
|
|
1285
|
+
|
|
1286
|
+
const resumeFlowInBackgroundWithErrorHandling = resumeFlowInBackground.pipe(
|
|
1242
1287
|
Effect.catchAll((error) =>
|
|
1243
1288
|
Effect.gen(function* () {
|
|
1244
1289
|
yield* Effect.logError("Flow resume failed", error);
|
|
@@ -1323,12 +1368,12 @@ export function createFlowServer() {
|
|
|
1323
1368
|
|
|
1324
1369
|
// Fork the resume execution to run in background
|
|
1325
1370
|
// Use waitUntil if available (Cloudflare Workers), otherwise fork normally
|
|
1326
|
-
const resumeEffect =
|
|
1371
|
+
const resumeEffect = resumeFlowInBackgroundWithErrorHandling.pipe(
|
|
1327
1372
|
Effect.tapErrorCause((cause) =>
|
|
1328
1373
|
Effect.logError("Flow resume failed", cause),
|
|
1329
1374
|
),
|
|
1330
1375
|
) as Effect.Effect<
|
|
1331
|
-
FlowExecutionResult<Record<string,
|
|
1376
|
+
FlowExecutionResult<Record<string, unknown>>,
|
|
1332
1377
|
UploadistaError,
|
|
1333
1378
|
never
|
|
1334
1379
|
>;
|
package/dist/flow-CUW8k-Ni.mjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./uploadista-error-CkSxSyNo.mjs";import{D as t,E as n,O as r,P as i,T as a,b as o,d as s,k as c,w as l}from"./types-CHbyV8e6.mjs";import{a as u,n as d,o as f}from"./upload-Ht9qitT7.mjs";import{Context as p,Effect as m,Layer as h,Option as g,Runtime as _,Stream as v}from"effect";import{z as y}from"zod";import{trace as b}from"@opentelemetry/api";import{render as x}from"micromustache";const S={enabled:!1,failureThreshold:5,resetTimeout:3e4,halfOpenRequests:3,windowDuration:6e4,fallback:{type:`fail`}},C=`uploadista:circuit-breaker:`;function w(e){let t=e=>`${C}${e}`,r=n=>m.gen(function*(){let r=t(n),a=yield*e.get(r);if(a===null)return null;try{return i.deserialize(a)}catch{return yield*e.delete(r),null}}),a=(n,r)=>{let a=t(n),o=i.serialize(r);return e.set(a,o)};return{getState:r,setState:a,incrementFailures:(e,t)=>m.gen(function*(){let i=Date.now(),o=yield*r(e);return o===null&&(o=n({failureThreshold:5,resetTimeout:3e4,halfOpenRequests:3,windowDuration:t})),o=i-o.windowStart>t?{...o,failureCount:1,windowStart:i}:{...o,failureCount:o.failureCount+1},yield*a(e,o),o.failureCount}),resetFailures:e=>m.gen(function*(){let t=yield*r(e);t!==null&&(yield*a(e,{...t,failureCount:0,windowStart:Date.now()}))}),incrementHalfOpenSuccesses:e=>m.gen(function*(){let t=yield*r(e);if(t===null)return 1;let n={...t,halfOpenSuccesses:t.halfOpenSuccesses+1};return yield*a(e,n),n.halfOpenSuccesses}),getAllStats:()=>m.gen(function*(){let t=new Map;if(!e.list)return t;let n=yield*e.list(C),i=Date.now();for(let e of n){let n=e,a=yield*r(n);if(a!==null){let e=i-a.lastStateChange;t.set(n,{nodeType:n,state:a.state,failureCount:a.failureCount,halfOpenSuccesses:a.halfOpenSuccesses,timeSinceLastStateChange:e,timeUntilHalfOpen:a.state===`open`?Math.max(0,a.config.resetTimeout-e):void 0})}}return t}),delete:n=>e.delete(t(n))}}function T(){let e=new Map;return{getState:t=>m.succeed(e.get(t)??null),setState:(t,n)=>m.sync(()=>{e.set(t,n)}),incrementFailures:(t,r)=>m.sync(()=>{let i=Date.now(),a=e.get(t);return a===void 0&&(a=n({failureThreshold:5,resetTimeout:3e4,halfOpenRequests:3,windowDuration:r})),a=i-a.windowStart>r?{...a,failureCount:1,windowStart:i}:{...a,failureCount:a.failureCount+1},e.set(t,a),a.failureCount}),resetFailures:t=>m.sync(()=>{let n=e.get(t);n!==void 0&&e.set(t,{...n,failureCount:0,windowStart:Date.now()})}),incrementHalfOpenSuccesses:t=>m.sync(()=>{let n=e.get(t);if(n===void 0)return 1;let r={...n,halfOpenSuccesses:n.halfOpenSuccesses+1};return e.set(t,r),r.halfOpenSuccesses}),getAllStats:()=>m.sync(()=>{let t=new Map,n=Date.now();for(let[r,i]of e){let e=n-i.lastStateChange;t.set(r,{nodeType:r,state:i.state,failureCount:i.failureCount,halfOpenSuccesses:i.halfOpenSuccesses,timeSinceLastStateChange:e,timeUntilHalfOpen:i.state===`open`?Math.max(0,i.config.resetTimeout-e):void 0})}return t}),delete:t=>m.sync(()=>{e.delete(t)})}}const E=h.effect(a,m.gen(function*(){return w(yield*t)})),D=h.succeed(a,T());var O=class{eventHandler;nodeType;config;store;constructor(e,t,n){this.nodeType=e,this.config={enabled:t.enabled??S.enabled,failureThreshold:t.failureThreshold??S.failureThreshold,resetTimeout:t.resetTimeout??S.resetTimeout,halfOpenRequests:t.halfOpenRequests??S.halfOpenRequests,windowDuration:t.windowDuration??S.windowDuration,fallback:t.fallback??S.fallback},this.store=n}setEventHandler(e){this.eventHandler=e}allowRequest(){let e=this;return m.gen(function*(){if(!e.config.enabled)return{allowed:!0,state:`closed`,failureCount:0};let t=yield*e.store.getState(e.nodeType),r=Date.now();if(t===null&&(t=n({failureThreshold:e.config.failureThreshold,resetTimeout:e.config.resetTimeout,halfOpenRequests:e.config.halfOpenRequests,windowDuration:e.config.windowDuration}),yield*e.store.setState(e.nodeType,t)),t.state===`open`&&r-t.lastStateChange>=e.config.resetTimeout){let n=t.state;t={...t,state:`half-open`,halfOpenSuccesses:0,lastStateChange:r},yield*e.store.setState(e.nodeType,t),yield*e.emitEvent(n,`half-open`,t.failureCount)}return{allowed:t.state!==`open`,state:t.state,failureCount:t.failureCount}})}getState(){let e=this;return m.gen(function*(){return(yield*e.store.getState(e.nodeType))?.state??`closed`})}getFailureCount(){let e=this;return m.gen(function*(){return(yield*e.store.getState(e.nodeType))?.failureCount??0})}recordSuccess(){let e=this;return m.gen(function*(){if(!e.config.enabled)return;let t=yield*e.store.getState(e.nodeType);t!==null&&(t.state===`half-open`?(yield*e.store.incrementHalfOpenSuccesses(e.nodeType))>=e.config.halfOpenRequests&&(yield*e.transitionTo(`closed`,t.failureCount)):t.state===`closed`&&(yield*e.store.resetFailures(e.nodeType)))})}recordFailure(e){let t=this;return m.gen(function*(){if(!t.config.enabled)return;let e=yield*t.store.getState(t.nodeType);if(e===null||e.state===`closed`){let e=yield*t.store.incrementFailures(t.nodeType,t.config.windowDuration);e>=t.config.failureThreshold&&(yield*t.transitionTo(`open`,e))}else e.state===`half-open`&&(yield*t.transitionTo(`open`,e.failureCount))})}getFallback(){return this.config.fallback}reset(){let e=this;return m.gen(function*(){let t=(yield*e.store.getState(e.nodeType))?.state??`closed`;yield*e.store.setState(e.nodeType,n({failureThreshold:e.config.failureThreshold,resetTimeout:e.config.resetTimeout,halfOpenRequests:e.config.halfOpenRequests,windowDuration:e.config.windowDuration})),t!==`closed`&&(yield*e.emitEvent(t,`closed`,0))})}transitionTo(e,t){let n=this;return m.gen(function*(){let r=yield*n.store.getState(n.nodeType),i=r?.state??`closed`;if(i===e)return;let a=Date.now(),o={state:e,failureCount:e===`closed`?0:t,lastStateChange:a,halfOpenSuccesses:0,windowStart:e===`closed`?a:r?.windowStart??a,config:{failureThreshold:n.config.failureThreshold,resetTimeout:n.config.resetTimeout,halfOpenRequests:n.config.halfOpenRequests,windowDuration:n.config.windowDuration}};yield*n.store.setState(n.nodeType,o),yield*n.emitEvent(i,e,t)})}emitEvent(e,t,n){let r=this;return m.gen(function*(){r.eventHandler&&(yield*r.eventHandler({nodeType:r.nodeType,previousState:e,newState:t,timestamp:Date.now(),failureCount:n}))})}},ee=class{breakers=new Map;eventHandler;constructor(e){this.store=e}setEventHandler(e){this.eventHandler=e;for(let t of this.breakers.values())t.setEventHandler(e)}getOrCreate(e,t){let n=this.breakers.get(e);return n||(n=new O(e,t,this.store),this.eventHandler&&n.setEventHandler(this.eventHandler),this.breakers.set(e,n)),n}get(e){return this.breakers.get(e)}getAllStats(){return this.store.getAllStats()}resetAll(){let e=this;return m.gen(function*(){for(let t of e.breakers.values())yield*t.reset()})}clear(){this.breakers.clear()}};function k({source:e,target:t,sourcePort:n,targetPort:r}){return{source:e,target:t,sourcePort:n,targetPort:r}}let A=function(e){return e.JobStart=`job-start`,e.JobEnd=`job-end`,e.FlowStart=`flow-start`,e.FlowEnd=`flow-end`,e.FlowError=`flow-error`,e.FlowPause=`flow-pause`,e.FlowCancel=`flow-cancel`,e.NodeStart=`node-start`,e.NodeEnd=`node-end`,e.NodePause=`node-pause`,e.NodeResume=`node-resume`,e.NodeError=`node-error`,e.NodeStream=`node-stream`,e.NodeResponse=`node-response`,e.DlqItemAdded=`dlq-item-added`,e.DlqRetryStart=`dlq-retry-start`,e.DlqRetrySuccess=`dlq-retry-success`,e.DlqRetryFailed=`dlq-retry-failed`,e.DlqItemExhausted=`dlq-item-exhausted`,e.DlqItemResolved=`dlq-item-resolved`,e}({});var j=class{types;constructor(){this.types=new Map}register(t){if(this.types.has(t.id))throw e.fromCode(`VALIDATION_ERROR`,{body:`Input type "${t.id}" is already registered. Types cannot be modified or re-registered.`,details:{typeId:t.id}});this.types.set(t.id,t)}get(e){return this.types.get(e)}list(){return Array.from(this.types.values())}validate(t,n){let r=this.types.get(t);if(!r)return{success:!1,error:e.fromCode(`VALIDATION_ERROR`,{body:`Input type "${t}" is not registered`,details:{typeId:t}})};try{return{success:!0,data:r.schema.parse(n)}}catch(n){return{success:!1,error:e.fromCode(`VALIDATION_ERROR`,{body:`Data validation failed for input type "${t}"`,cause:n,details:{typeId:t,validationErrors:n}})}}}has(e){return this.types.has(e)}size(){return this.types.size}};const M=new j;function N(e,t){return M.validate(e,t)}var te=class{types;constructor(){this.types=new Map}register(t){if(this.types.has(t.id))throw e.fromCode(`VALIDATION_ERROR`,{body:`Output type "${t.id}" is already registered. Types cannot be modified or re-registered.`,details:{typeId:t.id}});this.types.set(t.id,t)}get(e){return this.types.get(e)}list(){return Array.from(this.types.values())}validate(t,n){let r=this.types.get(t);if(!r)return{success:!1,error:e.fromCode(`VALIDATION_ERROR`,{body:`Output type "${t}" is not registered`,details:{typeId:t}})};try{return{success:!0,data:r.schema.parse(n)}}catch(n){return{success:!1,error:e.fromCode(`VALIDATION_ERROR`,{body:`Data validation failed for output type "${t}"`,cause:n,details:{typeId:t,validationErrors:n}})}}}has(e){return this.types.has(e)}size(){return this.types.size}};const P=new te;function ne(e,t){return P.validate(e,t)}let F=function(e){return e.input=`input`,e.process=`process`,e.conditional=`conditional`,e.multiplex=`multiplex`,e.merge=`merge`,e}({});function I({id:t,name:n,description:r,type:i,inputSchema:a,outputSchema:o,run:s,condition:c,multiInput:l=!1,multiOutput:u=!1,pausable:d=!1,retry:f,inputTypeId:p,outputTypeId:h,keepOutput:g=!1,circuitBreaker:_,nodeTypeId:v}){return m.gen(function*(){return p&&!M.get(p)?yield*e.fromCode(`INVALID_INPUT_TYPE`,{body:`Input type "${p}" is not registered in inputTypeRegistry`,details:{inputTypeId:p,nodeId:t}}).toEffect():h&&!P.get(h)?yield*e.fromCode(`INVALID_OUTPUT_TYPE`,{body:`Output type "${h}" is not registered in outputTypeRegistry`,details:{outputTypeId:h,nodeId:t}}).toEffect():{id:t,name:n,description:r,type:i,inputTypeId:p,outputTypeId:h,keepOutput:g,inputSchema:a,outputSchema:o,pausable:d,run:({data:r,jobId:i,flowId:c,storageId:l,clientId:u})=>m.gen(function*(){let d=yield*s({data:yield*m.try({try:()=>a.parse(r),catch:r=>{let i=r instanceof Error?r.message:String(r);return e.fromCode(`FLOW_INPUT_VALIDATION_ERROR`,{body:`Node '${n}' (${t}) input validation failed: ${i}`,cause:r})}}),jobId:i,storageId:l,flowId:c,clientId:u});return d.type===`waiting`?{type:`waiting`,partialData:d.partialData,nodeType:h,nodeId:t}:{type:`complete`,data:yield*m.try({try:()=>o.parse(d.data),catch:r=>{let i=r instanceof Error?r.message:String(r);return e.fromCode(`FLOW_OUTPUT_VALIDATION_ERROR`,{body:`Node '${n}' (${t}) output validation failed: ${i}`,cause:r})}}),nodeType:h,nodeId:t}}),condition:c,multiInput:l,multiOutput:u,retry:f,circuitBreaker:_,nodeTypeId:v}})}const re=e=>({id:e.id,name:e.name,description:e.description,type:e.type,inputTypeId:e.inputTypeId,outputTypeId:e.outputTypeId,nodeTypeId:e.nodeTypeId}),L=e=>({type:`complete`,data:e}),R=e=>({type:`waiting`,partialData:e}),ie=(e,t)=>{if(e===t)return!0;try{return!!(e&&t&&typeof e==`object`&&typeof t==`object`)}catch{return!0}};var ae=class{typeChecker;constructor(e=ie){this.typeChecker=e}validateConnection(e,t,n){return this.getCompatibleTypes(e.outputSchema,t.inputSchema)}getCompatibleTypes(e,t){return this.typeChecker(e,t)}validateFlow(e,t){let n=[],r=new Map(e.map(e=>[e.id,e]));for(let e of t){let t=r.get(e.source),i=r.get(e.target);if(!t){n.push(`Source node ${e.source} not found`);continue}if(!i){n.push(`Target node ${e.target} not found`);continue}this.validateConnection(t,i,e)||n.push(`Schema mismatch: ${t.id} output schema incompatible with ${i.id} input schema`)}return{isValid:n.length===0,errors:n}}getExpectedInputSchemas(e,t,n){let r=new Map(t.map(e=>[e.id,e])),i={};for(let t of n)if(t.target===e){let e=r.get(t.source);if(e){let n=t.sourcePort||t.source;i[n]=e.outputSchema}}return i}getActualOutputSchemas(e,t,n){let r=new Map(t.map(e=>[e.id,e])),i={};for(let t of n)if(t.source===e){let e=r.get(t.target);if(e){let n=t.targetPort||t.target;i[n]=e.inputSchema}}return i}validateData(e,t){try{return t.parse(e),{isValid:!0,errors:[]}}catch(e){return e instanceof Error&&`errors`in e?{isValid:!1,errors:e.errors.map(e=>`${e.path.join(`.`)}: ${e.message}`)}:{isValid:!1,errors:[e instanceof Error?e.message:`Validation failed`]}}}};function z(e){if(!e)return{type:``,fileName:``,metadata:void 0,metadataJson:void 0};let t={...e},n=String(t.type||t.mimeType||t[`content-type`]||``);n&&(t.type||=n,t.mimeType||=n);let r=String(t.fileName||t.originalName||t.name||``);return r&&(t.fileName||=r,t.originalName||=r,t.name||=r),{type:n,fileName:r,metadata:t,metadataJson:JSON.stringify(t)}}const oe=y.object({operation:y.literal(`init`),storageId:y.string(),metadata:y.record(y.string(),y.any()).optional()}),se=y.object({operation:y.literal(`finalize`),uploadId:y.string()}),ce=y.object({operation:y.literal(`url`),url:y.string(),storageId:y.string().optional(),metadata:y.record(y.string(),y.any()).optional()}),B=y.union([oe,se,ce]),le=y.object({allowedMimeTypes:y.array(y.string()).optional(),minSize:y.number().positive().optional(),maxSize:y.number().positive().optional()});function ue(t,n){return m.gen(function*(){if(n){if(n.allowedMimeTypes&&n.allowedMimeTypes.length>0&&!n.allowedMimeTypes.some(e=>{if(e.endsWith(`/*`)){let n=e.slice(0,-2);return t.type.startsWith(n)}return t.type===e}))throw yield*e.fromCode(`VALIDATION_ERROR`,{cause:Error(`File type "${t.type}" is not allowed. Allowed types: ${n.allowedMimeTypes.join(`, `)}`)}).toEffect();if(n.minSize!==void 0&&t.size<n.minSize)throw yield*e.fromCode(`VALIDATION_ERROR`,{cause:Error(`File size (${t.size} bytes) is below minimum (${n.minSize} bytes)`)}).toEffect();if(n.maxSize!==void 0&&t.size>n.maxSize)throw yield*e.fromCode(`VALIDATION_ERROR`,{cause:Error(`File size (${t.size} bytes) exceeds maximum (${n.maxSize} bytes)`)}).toEffect()}})}function de(t,n,r){let i=r?.keepOutput??!1;return m.gen(function*(){let r=yield*d;return yield*I({id:t,name:`Input`,description:`Handles file input through multiple methods - streaming upload (init/finalize) or direct URL fetch`,type:F.input,nodeTypeId:`input`,inputSchema:B,outputSchema:l,keepOutput:i,inputTypeId:W,outputTypeId:V,run:({data:i,flowId:a,jobId:o,clientId:s})=>m.gen(function*(){switch(i.operation){case`init`:{let e={storageId:i.storageId,size:i.metadata?.size||0,type:i.metadata?.mimeType||`application/octet-stream`,fileName:i.metadata?.originalName,lastModified:i.metadata?.size?Date.now():void 0,metadata:i.metadata?JSON.stringify(i.metadata):void 0,flow:{flowId:a,nodeId:t,jobId:o}};return R(yield*r.createUpload(e,s))}case`finalize`:{let e=yield*r.getUpload(i.uploadId),{type:t}=z(e.metadata);return yield*ue({type:t,size:e.size||0},n),L(e)}case`url`:{let e=yield*f(i.url),c=yield*u(e),l=i.metadata?.mimeType||e.headers.get(`content-type`)||`application/octet-stream`,d=i.metadata?.size||Number(e.headers.get(`content-length`)||0),p=i.metadata?.originalName||i.url.split(`/`).pop()||`file`;yield*ue({type:l,size:d},n);let m=new ReadableStream({start(e){e.enqueue(new Uint8Array(c)),e.close()}}),h={storageId:i.storageId||`buffer`,size:d,type:l,fileName:p,lastModified:Date.now(),metadata:i.metadata?JSON.stringify(i.metadata):void 0};return L({...yield*r.upload(h,s,m),flow:{flowId:a,nodeId:t,jobId:o}})}default:throw yield*e.fromCode(`VALIDATION_ERROR`,{cause:Error(`Invalid operation`)}).toEffect()}})})})}const V=`storage-output-v1`,H=`ocr-output-v1`,U=`image-description-output-v1`,W=`streaming-input-v1`,G=y.object({extractedText:y.string(),format:y.enum([`markdown`,`plain`,`structured`]),taskType:y.enum([`convertToMarkdown`,`freeOcr`,`parseFigure`,`locateObject`]),confidence:y.number().min(0).max(1).optional()}),fe=y.object({description:y.string(),confidence:y.number().min(0).max(1).optional(),metadata:y.record(y.string(),y.unknown()).optional()});M.register({id:W,schema:B,version:`1.0.0`,description:`Streaming file input with init/finalize/url operations for flexible file ingestion`}),P.register({id:V,schema:l,version:`1.0.0`,description:`Storage output node that saves files to configured storage backend`}),P.register({id:H,schema:G,version:`1.0.0`,description:`OCR output node that extracts structured text from documents using AI`}),P.register({id:U,schema:fe,version:`1.0.0`,description:`Image description output node that generates AI-powered descriptions of images`});var pe=class{maxConcurrency;constructor(e={}){this.maxConcurrency=e.maxConcurrency??4}groupNodesByExecutionLevel(e,t){let n={},r={};e.forEach(e=>{n[e.id]=[],r[e.id]=0}),t.forEach(e=>{n[e.source]?.push(e.target),r[e.target]=(r[e.target]||0)+1});let i=[],a=new Set,o=0;for(;a.size<e.length;){let e=Object.keys(r).filter(e=>r[e]===0&&!a.has(e));if(e.length===0)throw Error(`Cycle detected in flow graph - cannot execute in parallel`);i.push({level:o++,nodes:e}),e.forEach(e=>{a.add(e),delete r[e],n[e]?.forEach(e=>{r[e]!==void 0&&r[e]--})})}return i}executeNodesInParallel(e){return m.all(e.map(e=>e()),{concurrency:this.maxConcurrency})}canExecuteInParallel(e,t,n){return e.every(e=>(n[e]||[]).every(e=>t.has(e)))}getStats(){return{maxConcurrency:this.maxConcurrency}}};function K(e){return t=>{if(t.nodeType!==e)return!1;let n=P.get(e);return n?n.schema.safeParse(t.data).success:!1}}function me(e){return!e||typeof e!=`object`?!1:l.safeParse(e).success}const he=K(`storage-output-v1`),ge=K(H),_e=K(U);function q(e,t){return e.filter(t)}function ve(t,n){return m.gen(function*(){let r=q(t,n);return r.length===0?yield*e.fromCode(`OUTPUT_NOT_FOUND`,{body:`No output of the specified type was found in the flow results`}).toEffect():r.length>1?yield*e.fromCode(`MULTIPLE_OUTPUTS_FOUND`,{body:`Found ${r.length} outputs of the specified type, expected exactly one`,details:{foundCount:r.length,nodeIds:r.map(e=>e.nodeId)}}).toEffect():r[0]})}function ye(e,t){return q(e,t)[0]}function be(e,t){return e.find(e=>e.nodeId===t)}function xe(e,t){return e.some(t)}function Se(e){return e.operation===`init`}function Ce(e){return e.operation===`finalize`}function we(e){return e.operation===`url`}function Te(e){return e.operation===`init`||e.operation===`url`}const Ee=e=>({id:e.id,name:e.name,nodes:e.nodes.map(re),edges:e.edges});function J(t){return m.gen(function*(){let n=yield*m.all(t.nodes.map(e=>m.isEffect(e)?e:m.succeed(e))),{flowId:r,name:i,onEvent:s,checkJobStatus:c,edges:l,inputSchema:u,outputSchema:d,typeChecker:f,circuitBreaker:p}=t,h=n,g=new ae(f),_=e=>{let t=e.circuitBreaker,n=e.nodeTypeId?p?.nodeTypeOverrides?.[e.nodeTypeId]:void 0,r=p?.defaults;if(!(!t&&!n&&!r))return{...r,...n,...t}},b=()=>{let e={},t={},n={};return h.forEach(r=>{e[r.id]=[],n[r.id]=[],t[r.id]=0}),l.forEach(r=>{e[r.source]?.push(r.target),n[r.target]?.push(r.source),t[r.target]=(t[r.target]||0)+1}),{graph:e,reverseGraph:n,inDegree:t}},x=()=>{let{graph:e,inDegree:t}=b(),n=[],r=[];for(Object.keys(t).forEach(e=>{t[e]===0&&n.push(e)});n.length>0;){let i=n.shift();if(!i)throw Error(`No current node found`);r.push(i),e[i]?.forEach(e=>{t[e]=(t[e]||0)-1,t[e]===0&&n.push(e)})}return r},S=(e,t)=>{if(!e.condition)return m.succeed(!0);let{field:n,operator:r,value:i}=e.condition,a=t,o=a?.metadata?.[n]||a?.[n],s=(()=>{switch(r){case`equals`:return o===i;case`notEquals`:return o!==i;case`greaterThan`:return Number(o)>Number(i);case`lessThan`:return Number(o)<Number(i);case`contains`:return String(o).includes(String(i));case`startsWith`:return String(o).startsWith(String(i));default:return!0}})();return m.succeed(s)},C=(e,t)=>{let{reverseGraph:n}=b(),r=n[e]||[],i={};return r.forEach(e=>{let n=t.get(e);n!==void 0&&(i[e]=n)}),i},w=e=>{let t=h.filter(e=>e.type===`input`),n={};return t.forEach(t=>{e&&typeof e==`object`&&t.id in e&&(n[t.id]=u.parse(e[t.id]))}),n},T=e=>!l.some(t=>t.source===e),E=e=>{let t=h.find(t=>t.id===e);return T(e)||t?.keepOutput===!0},D=e=>{let t=h.filter(e=>E(e.id)),n={};return t.forEach(t=>{let r=e.get(t.id);r!==void 0&&(n[t.id]=r)}),n},O=(e,t)=>{let n=h.filter(e=>E(e.id)),r=[];return n.forEach(n=>{let i=e.get(n.id);if(i!==void 0){let e=t.get(n.id);r.push({nodeId:n.id,nodeType:e,data:i,timestamp:new Date().toISOString()})}}),r},k=(e,t,n)=>m.gen(function*(){if(e.storage.id===t)return e;let r=yield*o,i=yield*r.getDataStore(e.storage.id,n),a=yield*r.getDataStore(t,n),s=yield*i.read(e.id),c=v.make(s),l={...e,storage:{id:t,type:e.storage.type}},u=yield*a.create(l);return yield*a.write({file_id:u.id,stream:c,offset:0},{}),u}),j=(n,i,a,o,l,u,d,f)=>m.gen(function*(){let p=l.get(n);if(!p)return yield*e.fromCode(`FLOW_NODE_NOT_FOUND`).toEffect();if(c){let t=yield*c(u);if(t===`paused`)return yield*e.fromCode(`FLOW_PAUSED`,{cause:`Flow ${r} was paused by user at job ${u}`}).toEffect();if(t===`cancelled`)return yield*e.fromCode(`FLOW_CANCELLED`,{cause:`Flow ${r} was cancelled by user at job ${u}`}).toEffect()}s&&(yield*s({jobId:u,flowId:r,nodeId:n,eventType:A.NodeStart,nodeName:p.name,nodeType:p.type}));let h=p.retry?.maxRetries??0,g=p.retry?.retryDelay??1e3,v=p.retry?.exponentialBackoff??!0,y=_(p),b=y?.enabled&&p.nodeTypeId&&f?f.getOrCreate(p.nodeTypeId,y):null;if(b){let{allowed:t,state:i,failureCount:o}=yield*b.allowRequest();if(!t){let t=b.getFallback();return yield*m.logWarning(`Circuit breaker OPEN for node type "${p.nodeTypeId}" - applying fallback`),t.type===`skip`?(s&&(yield*s({jobId:u,flowId:r,nodeId:n,eventType:A.NodeEnd,nodeName:p.name})),{nodeId:n,result:a[n],success:!0,waiting:!1}):t.type===`default`?(s&&(yield*s({jobId:u,flowId:r,nodeId:n,eventType:A.NodeEnd,nodeName:p.name,result:t.value})),{nodeId:n,result:t.value,success:!0,waiting:!1}):yield*e.fromCode(`CIRCUIT_BREAKER_OPEN`,{body:`Circuit breaker is open for node type "${p.name}"`,details:{nodeType:p.name,nodeId:n,state:i,failureCount:o}}).toEffect()}}let x=0,w=null;for(;x<=h;)try{let c,l={};if(p.type===`input`){if(c=a[n],c===void 0)return yield*m.logError(`Input node ${n} has no input data`),yield*e.fromCode(`FLOW_NODE_ERROR`,{cause:Error(`Input node ${n} has no input data`)}).toEffect()}else{if(l=C(n,o),Object.keys(l).length===0)return yield*m.logError(`Node ${n} has no input data`),yield*e.fromCode(`FLOW_NODE_ERROR`,{cause:Error(`Node ${n} has no input data`)}).toEffect();if(p.multiInput)c=l;else{let t=Object.keys(l)[0];if(!t)return yield*e.fromCode(`FLOW_NODE_ERROR`,{cause:Error(`Node ${n} has no input data`)}).toEffect();c=l[t]}}if(p.type===`conditional`&&!(yield*S(p,c)))return s&&(yield*s({jobId:u,flowId:r,nodeId:n,eventType:A.NodeEnd,nodeName:p.name})),{nodeId:n,result:c,success:!0,waiting:!1};let f=yield*p.run({data:c,inputs:l,jobId:u,flowId:r,storageId:i,clientId:d});if(f.type===`waiting`){let e=f.partialData;return s&&(yield*s({jobId:u,flowId:r,nodeId:n,eventType:A.NodePause,nodeName:p.name,partialData:e})),{nodeId:n,result:e,success:!0,waiting:!0,nodeType:f.nodeType}}let h=f.data;if(E(n)&&(me(h)&&h.storage.id!==i&&(yield*m.logDebug(`Auto-persisting output node ${n} output from ${h.storage.id} to ${i}`),h=yield*k(h,i,d)),t.hooks?.onNodeOutput)){yield*m.logDebug(`Calling onNodeOutput hook for sink node ${n}`);let e=t.hooks.onNodeOutput({output:h,nodeId:n,flowId:r,jobId:u,storageId:i,clientId:d});h=yield*m.isEffect(e)?e:m.promise(()=>e)}return b&&(yield*b.recordSuccess()),s&&(yield*s({jobId:u,flowId:r,nodeId:n,eventType:A.NodeEnd,nodeName:p.name,result:h})),{nodeId:n,result:h,success:!0,waiting:!1,nodeType:f.nodeType}}catch(t){if(w=t instanceof e?t:e.fromCode(`FLOW_NODE_ERROR`,{cause:t}),b&&(yield*b.recordFailure(w.body)),x<h){x++;let e=v?g*2**(x-1):g;yield*m.logWarning(`Node ${n} (${p.name}) failed, retrying (${x}/${h}) after ${e}ms`),yield*m.sleep(e);continue}return s&&(yield*s({jobId:u,flowId:r,nodeId:n,eventType:A.NodeError,nodeName:p.name,error:w.body,retryCount:x})),yield*w.toEffect()}return w?yield*w.toEffect():yield*e.fromCode(`FLOW_NODE_ERROR`,{cause:Error(`Unexpected error in retry loop`)}).toEffect()}).pipe((()=>{let e=l.get(n);return m.withSpan(`node-${e?.type??`unknown`}`,{attributes:{"node.id":n,"node.type":e?.type??`unknown`,"node.name":e?.name??`unknown`,"flow.id":r,"flow.job_id":u}})})()),M=({inputs:n,storageId:i,jobId:o,resumeFrom:c,clientId:u})=>m.gen(function*(){let f=yield*m.serviceOption(a),p=f._tag===`Some`?new ee(f.value):null;!c&&s&&(yield*s({jobId:o,eventType:A.FlowStart,flowId:r}));let g=w(n||{}),_,v,b;c?(_=c.executionOrder,v=c.nodeResults,b=c.currentIndex):(_=x(),v=new Map,b=0);let S=new Map;if(_.length!==h.length)return yield*e.fromCode(`FLOW_CYCLE_ERROR`).toEffect();let C=new Map(h.map(e=>[e.id,e]));if(t.parallelExecution?.enabled??!1){yield*m.logDebug(`Flow ${r}: Executing in parallel mode (maxConcurrency: ${t.parallelExecution?.maxConcurrency??4})`);let e=new pe({maxConcurrency:t.parallelExecution?.maxConcurrency??4}),n=e.groupNodesByExecutionLevel(h,l);yield*m.logDebug(`Flow ${r}: Grouped nodes into ${n.length} execution levels`);let a={};h.forEach(e=>{a[e.id]=[]}),l.forEach(e=>{a[e.target]?.push(e.source)});for(let t of n){yield*m.logDebug(`Flow ${r}: Executing level ${t.level} with nodes: ${t.nodes.join(`, `)}`);let n=t.nodes.map(e=>()=>m.gen(function*(){if(c&&e===c.executionOrder[b]&&s){let t=C.get(e);t&&(yield*s({jobId:o,flowId:r,nodeId:e,eventType:A.NodeResume,nodeName:t.name,nodeType:t.type}))}return{nodeId:e,nodeResult:yield*j(e,i,g,v,C,o,u,p)}})),a=yield*e.executeNodesInParallel(n);for(let{nodeId:e,nodeResult:t}of a){if(t.waiting)return t.result!==void 0&&(v.set(e,t.result),t.nodeType&&S.set(e,t.nodeType)),{type:`paused`,nodeId:e,executionState:{executionOrder:_,currentIndex:_.indexOf(e),inputs:g}};t.success&&(v.set(e,t.result),t.nodeType&&S.set(e,t.nodeType))}}}else{yield*m.logDebug(`Flow ${r}: Executing in sequential mode`);for(let t=b;t<_.length;t++){let n=_[t];if(!n)return yield*e.fromCode(`FLOW_NODE_NOT_FOUND`).toEffect();if(c&&t===b&&s){let e=C.get(n);e&&(yield*s({jobId:o,flowId:r,nodeId:n,eventType:A.NodeResume,nodeName:e.name,nodeType:e.type}))}let a=yield*j(n,i,g,v,C,o,u,p);if(a.waiting)return a.result!==void 0&&(v.set(a.nodeId,a.result),a.nodeType&&S.set(a.nodeId,a.nodeType)),{type:`paused`,nodeId:a.nodeId,executionState:{executionOrder:_,currentIndex:t,inputs:g}};a.success&&(v.set(a.nodeId,a.result),a.nodeType&&S.set(a.nodeId,a.nodeType))}}let T=D(v),k=O(v,S),M=y.record(y.string(),d).safeParse(T);if(!M.success){let t=`Flow output validation failed: ${M.error.message}. Expected outputs: ${JSON.stringify(Object.keys(D(v)))}. Output nodes (sinks + keepOutput): ${h.filter(e=>E(e.id)).map(e=>e.id).join(`, `)}`;return s&&(yield*s({jobId:o,eventType:A.FlowError,flowId:r,error:t})),yield*e.fromCode(`FLOW_OUTPUT_VALIDATION_ERROR`,{body:t,cause:M.error}).toEffect()}let N=M.data;return s&&(yield*s({jobId:o,eventType:A.FlowEnd,flowId:r,outputs:k,result:N})),{type:`completed`,result:N,outputs:k}});return{id:r,name:i,nodes:h,edges:l,inputSchema:u,outputSchema:d,onEvent:s,checkJobStatus:c,hooks:t.hooks,run:({inputs:e,storageId:t,jobId:n,clientId:r})=>M({inputs:e,storageId:t,jobId:n,clientId:r}),resume:({jobId:e,storageId:t,nodeResults:n,executionState:r,clientId:i})=>M({inputs:r.inputs,storageId:t,jobId:e,resumeFrom:{executionOrder:r.executionOrder,nodeResults:new Map(Object.entries(n)),currentIndex:r.currentIndex},clientId:i}),validateTypes:()=>{let e=h;return g.validateFlow(e,l)},validateInputs:e=>g.validateData(e,u),validateOutputs:e=>g.validateData(e,d)}})}const Y={enabled:!0,maxRetries:3,backoff:{type:`exponential`,initialDelayMs:1e3,maxDelayMs:3e5,multiplier:2,jitter:!0},ttlMs:6048e5};function X(e,t){switch(e.type){case`immediate`:return 0;case`fixed`:return e.delayMs;case`exponential`:{let n=e.initialDelayMs*e.multiplier**+t,r=Math.min(n,e.maxDelayMs);if(e.jitter){let e=.5+Math.random();return Math.floor(r*e)}return r}default:return 0}}function De(e,t){return!t.enabled||t.nonRetryableErrors?.includes(e)?!1:t.retryableErrors&&t.retryableErrors.length>0?t.retryableErrors.includes(e):!0}function Oe(e,t){if(!(t===void 0||t<=0))return new Date(e.getTime()+t)}var Z=class e extends p.Tag(`DeadLetterQueueService`)(){static optional=m.serviceOption(e)};function ke(){return m.gen(function*(){let e=yield*r,t=()=>`dlq_${crypto.randomUUID()}`,n=e=>({...e,createdAt:new Date(e.createdAt),updatedAt:new Date(e.updatedAt),expiresAt:e.expiresAt?new Date(e.expiresAt):void 0,nextRetryAt:e.nextRetryAt?new Date(e.nextRetryAt):void 0,retryHistory:e.retryHistory.map(e=>({...e,attemptedAt:new Date(e.attemptedAt)}))}),i=()=>m.gen(function*(){if(!e.list)return[];let t=yield*e.list(),r=[];for(let i of t){let t=yield*m.catchAll(e.get(i),()=>m.succeed(null));t&&r.push(n(t))}return r});return{add:(n,r,i=Y)=>m.gen(function*(){let a=t(),o=new Date,s={code:r.code||`UNKNOWN_ERROR`,message:r.body||r.message||`Unknown error`,nodeId:void 0,stack:r.stack},c=n.tasks.find(e=>e.status===`failed`);c&&(s.nodeId=c.nodeId);let l={};for(let e of n.tasks)e.result!==void 0&&(l[e.nodeId]=e.result);let u=De(s.code,i),d;if(i.enabled&&u&&i.maxRetries>0){let e=X(i.backoff,0);d=new Date(o.getTime()+e)}let f={id:a,jobId:n.id,flowId:n.flowId,storageId:n.storageId,clientId:n.clientId,error:s,inputs:n.executionState?.inputs||{},nodeResults:l,failedAtNodeId:s.nodeId,retryCount:0,maxRetries:i.maxRetries,nextRetryAt:d,retryHistory:[],createdAt:o,updatedAt:o,expiresAt:Oe(o,i.ttlMs),status:u&&i.enabled?`pending`:`exhausted`};return yield*e.set(a,f),f}),get:t=>m.gen(function*(){return n(yield*e.get(t))}),getOption:t=>m.gen(function*(){let r=yield*m.either(e.get(t));return r._tag===`Left`?r.left.code===`FILE_NOT_FOUND`?g.none():yield*m.fail(r.left):g.some(n(r.right))}),delete:t=>e.delete(t),list:(e={})=>m.gen(function*(){let t=yield*i(),{status:n,flowId:r,clientId:a,limit:o=50,offset:s=0}=e,c=t;n&&(c=c.filter(e=>e.status===n)),r&&(c=c.filter(e=>e.flowId===r)),a&&(c=c.filter(e=>e.clientId===a)),c.sort((e,t)=>t.createdAt.getTime()-e.createdAt.getTime());let l=c.length;return{items:c.slice(s,s+o),total:l}}),update:(t,r)=>m.gen(function*(){let i={...n(yield*e.get(t)),...r,updatedAt:new Date};return yield*e.set(t,i),i}),markRetrying:t=>m.gen(function*(){let r={...n(yield*e.get(t)),status:`retrying`,updatedAt:new Date};return yield*e.set(t,r),r}),recordRetryFailure:(t,r,i)=>m.gen(function*(){let a=n(yield*e.get(t)),o=new Date,s=a.retryCount+1,c=[...a.retryHistory,{attemptedAt:o,error:r,durationMs:i}],l=`pending`,u;if(s>=a.maxRetries)l=`exhausted`,u=void 0;else{let e=X(Y.backoff,s);u=new Date(o.getTime()+e)}let d={...a,retryCount:s,retryHistory:c,status:l,nextRetryAt:u,updatedAt:o};return yield*e.set(t,d),d}),markResolved:t=>m.gen(function*(){let r={...n(yield*e.get(t)),status:`resolved`,nextRetryAt:void 0,updatedAt:new Date};return yield*e.set(t,r),r}),getScheduledRetries:(e=100)=>m.gen(function*(){let t=yield*i(),n=new Date;return t.filter(e=>e.status===`pending`&&e.nextRetryAt&&e.nextRetryAt<=n).sort((e,t)=>(e.nextRetryAt?.getTime()||0)-(t.nextRetryAt?.getTime()||0)).slice(0,e)}),cleanup:(t={})=>m.gen(function*(){let n=yield*i(),{olderThan:r,status:a}=t,o=new Date,s=0;for(let t of n){let n=!1;t.expiresAt&&t.expiresAt<=o&&(n=!0),r&&t.createdAt<=r&&(a?n=t.status===a:(t.status===`exhausted`||t.status===`resolved`)&&(n=!0)),n&&(yield*m.catchAll(e.delete(t.id),()=>m.succeed(void 0)),s++)}return{deleted:s}}),getStats:()=>m.gen(function*(){let e=yield*i(),t={pending:0,retrying:0,exhausted:0,resolved:0},n={},r,a=0;for(let i of e)t[i.status]++,n[i.flowId]=(n[i.flowId]||0)+1,(!r||i.createdAt<r)&&(r=i.createdAt),a+=i.retryCount;let o=e.length>0?a/e.length:0;return{totalItems:e.length,byStatus:t,byFlow:n,oldestItem:r,averageRetryCount:o}})}})}const Ae=h.effect(Z,ke());var Q=class e extends p.Tag(`FlowWaitUntil`)(){static optional=m.serviceOption(e)},je=class extends p.Tag(`FlowProvider`)(){},Me=class extends p.Tag(`FlowServer`)(){};const Ne=e=>typeof e==`object`&&!!e&&`id`in e,Pe=e=>typeof e==`object`&&e&&`nodeId`in e&&`data`in e&&`timestamp`in e?e.data:e;function Fe(t,n,r){let i=e=>{let i=t=>m.gen(function*(){let n=yield*r.get(e);n&&(yield*r.set(e,{...n,...t,updatedAt:new Date}))});return a=>m.gen(function*(){switch(t.onEvent&&(yield*m.catchAll(t.onEvent(a),e=>(m.logError(`Original onEvent failed`,e),m.succeed({eventId:null})))),yield*n.emit(e,a),m.logInfo(`Updating job ${e} with event ${a.eventType}`),a.eventType){case A.FlowStart:yield*i({status:`running`});break;case A.FlowEnd:yield*m.gen(function*(){let t=yield*r.get(e);t&&a.outputs&&(yield*r.set(e,{...t,result:a.outputs,updatedAt:new Date}))});break;case A.FlowError:yield*i({status:`failed`,error:a.error});break;case A.NodeStart:yield*m.gen(function*(){let t=yield*r.get(e);if(t){let n=t.tasks.find(e=>e.nodeId===a.nodeId)?t.tasks.map(e=>e.nodeId===a.nodeId?{...e,status:`running`,updatedAt:new Date}:e):[...t.tasks,{nodeId:a.nodeId,status:`running`,createdAt:new Date,updatedAt:new Date}];yield*r.set(e,{...t,tasks:n,updatedAt:new Date})}});break;case A.NodePause:yield*m.gen(function*(){let t=yield*r.get(e);if(t){let n=t.tasks.find(e=>e.nodeId===a.nodeId)?t.tasks.map(e=>e.nodeId===a.nodeId?{...e,status:`paused`,result:a.partialData,updatedAt:new Date}:e):[...t.tasks,{nodeId:a.nodeId,status:`paused`,result:a.partialData,createdAt:new Date,updatedAt:new Date}];yield*r.set(e,{...t,tasks:n,updatedAt:new Date})}});break;case A.NodeResume:yield*m.gen(function*(){let t=yield*r.get(e);if(t){let n=t.tasks.map(e=>e.nodeId===a.nodeId?{...e,status:`running`,updatedAt:new Date}:e);yield*r.set(e,{...t,tasks:n,updatedAt:new Date})}});break;case A.NodeEnd:yield*m.gen(function*(){let n=yield*r.get(e);if(n){let i=n.tasks.map(e=>e.nodeId===a.nodeId?{...e,status:`completed`,result:a.result,updatedAt:new Date}:e),o=!t.edges.some(e=>e.source===a.nodeId),s=t.nodes.find(e=>e.id===a.nodeId)?.keepOutput===!0,c=a.result,l=Pe(c),u=n.intermediateFiles||[],d=o||s;d&&Ne(l)&&l.id?(u=u.filter(e=>e!==l.id),s&&!o&&m.logInfo(`Preserving output from node ${a.nodeId} due to keepOutput flag`)):!d&&Ne(l)&&l.id&&(u.includes(l.id)||u.push(l.id)),yield*r.set(e,{...n,tasks:i,intermediateFiles:u,updatedAt:new Date})}});break;case A.NodeError:yield*m.gen(function*(){let t=yield*r.get(e);if(t){let n=t.tasks.map(e=>e.nodeId===a.nodeId?{...e,status:`failed`,error:a.error,retryCount:a.retryCount,updatedAt:new Date}:e);yield*r.set(e,{...t,tasks:n,error:a.error,updatedAt:new Date})}});break}return{eventId:e}})},a=t=>t=>m.gen(function*(){let n=yield*r.get(t);return n?n.status===`paused`?`paused`:n.status===`cancelled`?`cancelled`:`running`:yield*m.fail(e.fromCode(`FLOW_JOB_NOT_FOUND`,{cause:`Job ${t} not found`}))});return{...t,run:e=>m.gen(function*(){let n=e.jobId||crypto.randomUUID(),r=i(n),o=a(n);return yield*(yield*J({flowId:t.id,name:t.name,nodes:t.nodes,edges:t.edges,inputSchema:t.inputSchema,outputSchema:t.outputSchema,onEvent:r,checkJobStatus:o})).run({...e,jobId:n,clientId:e.clientId})}),resume:e=>m.gen(function*(){let n=e.jobId,r=i(n),o=a(n);return yield*(yield*J({flowId:t.id,name:t.name,nodes:t.nodes,edges:t.edges,inputSchema:t.inputSchema,outputSchema:t.outputSchema,onEvent:r,checkJobStatus:o})).resume(e)})}}function Ie(){return m.gen(function*(){let t=yield*je,n=yield*s,r=yield*c,i=yield*d,a=yield*Z.optional,o=(t,n)=>m.gen(function*(){let i=yield*r.get(t);return i?yield*r.set(t,{...i,...n}):yield*m.fail(e.fromCode(`FLOW_JOB_NOT_FOUND`,{cause:`Job ${t} not found`}))}),l=(e,t)=>m.gen(function*(){let n=yield*r.get(e);!n||!n.intermediateFiles||n.intermediateFiles.length===0||(yield*m.logInfo(`Cleaning up ${n.intermediateFiles.length} intermediate files for job ${e}`),yield*m.all(n.intermediateFiles.map(e=>m.gen(function*(){yield*i.delete(e,t),yield*m.logDebug(`Deleted intermediate file ${e}`)}).pipe(m.catchAll(t=>m.gen(function*(){return yield*m.logWarning(`Failed to delete intermediate file ${e}: ${t}`),m.succeed(void 0)})))),{concurrency:5}),yield*o(e,{intermediateFiles:[]}))}),u=(e,t)=>m.gen(function*(){if(g.isNone(a)){yield*m.logDebug(`[FlowServer] DLQ not configured, skipping for job: ${e}`);return}let n=a.value,i=yield*m.catchAll(r.get(e),()=>m.succeed(null));if(!i){yield*m.logWarning(`[FlowServer] Job ${e} not found when adding to DLQ`);return}yield*m.catchAll(n.add(i,t),t=>m.gen(function*(){return yield*m.logError(`[FlowServer] Failed to add job ${e} to DLQ`,t),m.succeed(void 0)})),yield*m.logInfo(`[FlowServer] Added job ${e} to Dead Letter Queue`)}),f=()=>{let e=b.getActiveSpan();if(!e)return;let t=e.spanContext();return{traceId:t.traceId,spanId:t.spanId,traceFlags:t.traceFlags}},p=({jobId:t,flow:i,storageId:a,clientId:s,inputs:c})=>m.gen(function*(){console.log(`[FlowServer] executeFlowInBackground started for job: ${t}`),yield*o(t,{status:`running`,traceContext:f()}),console.log(`[FlowServer] Creating flowWithEvents for job: ${t}`);let e=Fe(i,n,r);console.log(`[FlowServer] Running flow for job: ${t}`);let u=yield*e.run({inputs:c,storageId:a,jobId:t,clientId:s});return console.log(`[FlowServer] Flow completed for job: ${t}, result type: ${u.type}`),u.type===`paused`?yield*o(t,{status:`paused`,pausedAt:u.nodeId,executionState:u.executionState,updatedAt:new Date}):(yield*o(t,{status:`completed`,updatedAt:new Date,endedAt:new Date}),yield*l(t,s)),u}).pipe(m.withSpan(`flow-execution`,{attributes:{"flow.id":i.id,"flow.name":i.name,"flow.job_id":t,"flow.storage_id":a,"flow.node_count":i.nodes.length}}),m.catchAll(i=>m.gen(function*(){yield*m.logError(`Flow execution failed`,i);let a=i instanceof e?i.body:String(i);yield*m.logInfo(`Updating job ${t} to failed status with error: ${a}`),yield*o(t,{status:`failed`,error:a,updatedAt:new Date}).pipe(m.catchAll(e=>m.gen(function*(){return yield*m.logError(`Failed to update job ${t}`,e),m.succeed(void 0)})));let c=yield*r.get(t);throw c&&(yield*n.emit(t,{jobId:t,eventType:A.FlowError,flowId:c.flowId,error:a}).pipe(m.catchAll(e=>m.gen(function*(){return yield*m.logError(`Failed to emit FlowError event for job ${t}`,e),m.succeed(void 0)})))),yield*l(t,s).pipe(m.catchAll(e=>m.gen(function*(){return yield*m.logWarning(`Failed to cleanup intermediate files for job ${t}`,e),m.succeed(void 0)}))),yield*u(t,i instanceof e?i:new e({code:`UNKNOWN_ERROR`,status:500,body:String(i),cause:i})),i})));return{getFlow:(e,n)=>m.gen(function*(){return yield*t.getFlow(e,n)}),getFlowData:(e,n)=>m.gen(function*(){return Ee(yield*t.getFlow(e,n))}),runFlow:({flowId:n,storageId:i,clientId:a,inputs:o})=>m.gen(function*(){let s=yield*Q.optional,c=yield*m.try({try:()=>wt.parse({inputs:o}),catch:t=>e.fromCode(`FLOW_INPUT_VALIDATION_ERROR`,{cause:t})}),l=crypto.randomUUID(),u=new Date,d={id:l,flowId:n,storageId:i,clientId:a,status:`started`,createdAt:u,updatedAt:u,tasks:[]};yield*r.set(l,d);let f=yield*t.getFlow(n,a);console.log(`[FlowServer] About to fork flow execution for job: ${l}`);let h=p({jobId:l,flow:f,storageId:i,clientId:a,inputs:c.inputs}).pipe(m.tapErrorCause(e=>m.logError(`Flow execution failed`,e)));if(g.isSome(s)){console.log(`[FlowServer] Using waitUntil for job: ${l}`);let e=yield*m.runtime(),t=_.runPromise(e)(h);s.value(t)}else console.log(`[FlowServer] Using Effect.forkDaemon for job: ${l}`),yield*m.forkDaemon(h);return console.log(`[FlowServer] Flow execution started for job: ${l}`),d}),getJobStatus:t=>m.gen(function*(){return(yield*r.get(t))||(yield*m.fail(e.fromCode(`FLOW_JOB_NOT_FOUND`,{cause:`Job ${t} not found`})))}),resumeFlow:({jobId:i,nodeId:a,newData:s,clientId:c})=>m.gen(function*(){let d=yield*Q.optional,f=yield*r.get(i);if(!f)return console.error(`Job not found`),yield*m.fail(e.fromCode(`FLOW_JOB_NOT_FOUND`,{cause:`Job ${i} not found`}));if(f.status!==`paused`)return console.error(`Job is not paused`),yield*m.fail(e.fromCode(`FLOW_JOB_ERROR`,{cause:`Job ${i} is not paused (status: ${f.status})`}));if(f.pausedAt!==a)return console.error(`Job is not paused at the expected node`),yield*m.fail(e.fromCode(`FLOW_JOB_ERROR`,{cause:`Job ${i} is paused at node ${f.pausedAt}, not ${a}`}));if(!f.executionState)return console.error(`Job has no execution state`),yield*m.fail(e.fromCode(`FLOW_JOB_ERROR`,{cause:`Job ${i} has no execution state`}));let p={...f.tasks.reduce((e,t)=>(t.result!==void 0&&(e[t.nodeId]=t.result),e),{}),[a]:s},h={...f.executionState.inputs,[a]:s};yield*o(i,{status:`running`});let v=yield*t.getFlow(f.flowId,f.clientId),y=m.gen(function*(){let t=Fe(v,n,r);if(!f.executionState)return yield*m.fail(e.fromCode(`FLOW_JOB_ERROR`,{cause:`Job ${i} has no execution state`}));let a=yield*t.resume({jobId:i,storageId:f.storageId,nodeResults:p,executionState:{...f.executionState,inputs:h},clientId:f.clientId});return a.type===`paused`?yield*o(i,{status:`paused`,pausedAt:a.nodeId,executionState:a.executionState,updatedAt:new Date}):(yield*o(i,{status:`completed`,pausedAt:void 0,executionState:void 0,updatedAt:new Date,endedAt:new Date}),yield*l(i,c)),a}).pipe(m.catchAll(t=>m.gen(function*(){yield*m.logError(`Flow resume failed`,t);let a=t instanceof e?t.body:String(t);yield*m.logInfo(`Updating job ${i} to failed status with error: ${a}`),yield*o(i,{status:`failed`,error:a,updatedAt:new Date}).pipe(m.catchAll(e=>m.gen(function*(){return yield*m.logError(`Failed to update job ${i}`,e),m.succeed(void 0)})));let s=yield*r.get(i);throw s&&(yield*n.emit(i,{jobId:i,eventType:A.FlowError,flowId:s.flowId,error:a}).pipe(m.catchAll(e=>m.gen(function*(){return yield*m.logError(`Failed to emit FlowError event for job ${i}`,e),m.succeed(void 0)})))),yield*l(i,c).pipe(m.catchAll(e=>m.gen(function*(){return yield*m.logWarning(`Failed to cleanup intermediate files for job ${i}`,e),m.succeed(void 0)}))),yield*u(i,t instanceof e?t:new e({code:`UNKNOWN_ERROR`,status:500,body:String(t),cause:t})),t}))).pipe(m.tapErrorCause(e=>m.logError(`Flow resume failed`,e)));if(g.isSome(d)){console.log(`[FlowServer] Using waitUntil for resume job: ${i}`);let e=yield*m.runtime(),t=_.runPromise(e)(y);d.value(t)}else console.log(`[FlowServer] Using Effect.forkDaemon for resume job: ${i}`),yield*m.forkDaemon(y);return(yield*r.get(i))||(yield*m.fail(e.fromCode(`FLOW_JOB_NOT_FOUND`,{cause:`Job ${i} not found after update`})))}),pauseFlow:(t,i)=>m.gen(function*(){let a=yield*r.get(t);if(!a)return yield*m.fail(e.fromCode(`FLOW_JOB_NOT_FOUND`,{cause:`Job ${t} not found`}));if(i!==null&&a.clientId!==i)return yield*m.fail(e.fromCode(`FLOW_NOT_AUTHORIZED`,{cause:`Client ${i} is not authorized to pause job ${t}`}));if(a.status!==`running`)return yield*m.fail(e.fromCode(`FLOW_JOB_ERROR`,{cause:`Job ${t} cannot be paused (current status: ${a.status})`}));let s=a.tasks.find(e=>e.status===`running`)?.nodeId;return yield*o(t,{status:`paused`,pausedAt:s,updatedAt:new Date}),yield*n.emit(t,{jobId:t,flowId:a.flowId,eventType:A.FlowPause,pausedAt:s}),(yield*r.get(t))||(yield*m.fail(e.fromCode(`FLOW_JOB_NOT_FOUND`,{cause:`Job ${t} not found after pause`})))}),cancelFlow:(t,i)=>m.gen(function*(){let a=yield*r.get(t);return a?i!==null&&a.clientId!==i?yield*m.fail(e.fromCode(`FLOW_NOT_AUTHORIZED`,{cause:`Client ${i} is not authorized to cancel job ${t}`})):a.status!==`running`&&a.status!==`paused`&&a.status!==`started`?yield*m.fail(e.fromCode(`FLOW_JOB_ERROR`,{cause:`Job ${t} cannot be cancelled (current status: ${a.status})`})):(yield*o(t,{status:`cancelled`,updatedAt:new Date,endedAt:new Date}),yield*n.emit(t,{jobId:t,flowId:a.flowId,eventType:A.FlowCancel}),yield*l(t,i),(yield*r.get(t))||(yield*m.fail(e.fromCode(`FLOW_JOB_NOT_FOUND`,{cause:`Job ${t} not found after cancellation`})))):yield*m.fail(e.fromCode(`FLOW_JOB_NOT_FOUND`,{cause:`Job ${t} not found`}))}),subscribeToFlowEvents:(e,t)=>m.gen(function*(){yield*n.subscribe(e,t)}),unsubscribeFromFlowEvents:e=>m.gen(function*(){yield*n.unsubscribe(e)})}})}const Le=h.effect(Me,Ie());function Re(e){let t=e.lastIndexOf(`.`);return t===-1||t===0?e:e.substring(0,t)}function ze(e){let t=e.lastIndexOf(`.`);return t===-1||t===0?``:e.substring(t+1)}function Be(e,t,n){let r=e.metadata??{},i=r.fileName??r.originalName??r.name??`unnamed`;return{baseName:Re(i),extension:ze(i),fileName:i,nodeType:t.nodeType,nodeId:t.nodeId,flowId:t.flowId,jobId:t.jobId,timestamp:new Date().toISOString(),...n}}function Ve(e,t){try{let n={};for(let[e,r]of Object.entries(t))r!==void 0&&(n[e]=String(r));return x(e,n)}catch{return e}}function He(e,t,n){let r=t.fileName;if(!n)return r;try{if(n.mode===`auto`){if(n.autoSuffix){let e=n.autoSuffix(t);if(e){let{baseName:n,extension:r}=t;return r?`${n}-${e}.${r}`:`${n}-${e}`}}return r}if(n.mode===`custom`){if(n.rename)return n.rename(e,t)||r;if(n.pattern)return Ve(n.pattern,t)||r}return r}catch{return r}}function Ue(e){if(!e||e.trim()===``)return{isValid:!1,error:`Pattern cannot be empty`};let t=(e.match(/\{\{/g)||[]).length,n=(e.match(/\}\}/g)||[]).length;if(t!==n)return{isValid:!1,error:`Unbalanced braces: ${t} opening, ${n} closing`};let r=e.match(/\{\{[^}]*[^a-zA-Z0-9_}][^}]*\}\}/g);return r?{isValid:!1,error:`Invalid variable syntax: ${r[0]}`}:{isValid:!0}}const We=[{name:`baseName`,description:`Filename without extension`,example:`photo`},{name:`extension`,description:`File extension without dot`,example:`jpg`},{name:`fileName`,description:`Full original filename`,example:`photo.jpg`},{name:`nodeType`,description:`Type of processing node`,example:`resize`},{name:`nodeId`,description:`Specific node instance ID`,example:`resize-1`},{name:`flowId`,description:`Flow identifier`,example:`flow-abc`},{name:`jobId`,description:`Execution job ID`,example:`job-123`},{name:`timestamp`,description:`ISO 8601 processing time`,example:`2024-01-15T10:30:00Z`},{name:`width`,description:`Output width (image/video)`,example:`800`},{name:`height`,description:`Output height (image/video)`,example:`600`},{name:`format`,description:`Output format`,example:`webp`},{name:`quality`,description:`Quality setting`,example:`80`},{name:`pageNumber`,description:`Page number (documents)`,example:`1`}];function Ge({id:e,name:t,description:n,outputTypeId:r,keepOutput:i,naming:a,nodeType:o=`transform`,nodeTypeId:s,namingVars:c,circuitBreaker:u,transform:f}){return m.gen(function*(){let p=yield*d;return yield*I({id:e,name:t,description:n,type:F.process,outputTypeId:r,keepOutput:i,nodeTypeId:s,circuitBreaker:u,inputSchema:l,outputSchema:l,run:({data:t,storageId:n,flowId:r,jobId:i,clientId:s})=>m.gen(function*(){let l={flowId:r,nodeId:e,jobId:i},u=yield*f(yield*p.read(t.id,s),t),d=u instanceof Uint8Array?u:u.bytes,m=u instanceof Uint8Array?void 0:u.type,h=u instanceof Uint8Array?void 0:u.fileName;!h&&a&&(h=He(t,Be(t,{flowId:r,jobId:i,nodeId:e,nodeType:o},c),a));let g=new ReadableStream({start(e){e.enqueue(d),e.close()}}),{type:_,fileName:v,metadata:y,metadataJson:b}=z(t.metadata),x=yield*p.upload({storageId:n,size:d.byteLength,type:m??_,fileName:h??v,lastModified:0,metadata:b,flow:l},s,g),S=y?{...y,...m&&{mimeType:m,type:m,"content-type":m},...h&&{fileName:h,originalName:h,name:h,extension:h.split(`.`).pop()||y.extension}}:x.metadata;return L(S?{...x,metadata:S}:x)})})})}var Ke=class extends p.Tag(`CredentialProvider`)(){},qe=class extends p.Tag(`DocumentAiPlugin`)(){},Je=class extends p.Tag(`DocumentPlugin`)(){},Ye=class extends p.Tag(`ImageAiPlugin`)(){},Xe=class extends p.Tag(`ImagePlugin`)(){};const Ze=y.object({serviceType:y.enum([`replicate`]).optional()}),Qe=y.object({duration:y.number().nonnegative(),width:y.number().positive(),height:y.number().positive(),codec:y.string(),format:y.string(),bitrate:y.number().nonnegative(),frameRate:y.number().positive(),aspectRatio:y.string(),hasAudio:y.boolean(),audioCodec:y.string().optional(),audioBitrate:y.number().nonnegative().optional(),size:y.number().nonnegative()}),$e=y.object({timestamp:y.number().nonnegative(),format:y.enum([`png`,`jpeg`]).optional(),quality:y.number().min(1).max(100).optional()}),et=y.object({quality:y.number().min(0).max(100),format:y.enum([`jpeg`,`webp`,`png`,`avif`])}),tt=y.object({serviceType:y.enum([`replicate`]).optional()}),nt=y.object({width:y.number().positive().optional(),height:y.number().positive().optional(),fit:y.enum([`contain`,`cover`,`fill`])}).refine(e=>e.width||e.height,`Either width or height must be specified for resize`),rt=y.object({width:y.number().positive().optional(),height:y.number().positive().optional(),aspectRatio:y.enum([`keep`,`ignore`]).optional(),scaling:y.enum([`bicubic`,`bilinear`,`lanczos`]).optional()}).refine(e=>e.width||e.height,`Either width or height must be specified for video resize`),it=y.object({format:y.enum([`mp4`,`webm`,`mov`,`avi`]),codec:y.enum([`h264`,`h265`,`vp9`,`av1`]).optional(),videoBitrate:y.string().optional(),audioBitrate:y.string().optional(),audioCodec:y.enum([`aac`,`mp3`,`opus`,`vorbis`]).optional()}),$=y.object({type:y.literal(`resize`),width:y.number().positive().optional(),height:y.number().positive().optional(),fit:y.enum([`contain`,`cover`,`fill`])}),at=y.object({type:y.literal(`blur`),sigma:y.number().min(.3).max(1e3)}),ot=y.object({type:y.literal(`rotate`),angle:y.number(),background:y.string().optional()}),st=y.object({type:y.literal(`flip`),direction:y.enum([`horizontal`,`vertical`])}),ct=y.object({type:y.literal(`grayscale`)}),lt=y.object({type:y.literal(`sepia`)}),ut=y.object({type:y.literal(`brightness`),value:y.number().min(-100).max(100)}),dt=y.object({type:y.literal(`contrast`),value:y.number().min(-100).max(100)}),ft=y.object({type:y.literal(`sharpen`),sigma:y.number().positive().optional()}),pt=y.object({type:y.literal(`watermark`),imagePath:y.string().min(1).url(),position:y.enum([`top-left`,`top-right`,`bottom-left`,`bottom-right`,`center`]),opacity:y.number().min(0).max(1),offsetX:y.number().optional(),offsetY:y.number().optional()}),mt=y.object({type:y.literal(`logo`),imagePath:y.string().min(1).url(),position:y.enum([`top-left`,`top-right`,`bottom-left`,`bottom-right`,`center`]),scale:y.number().min(.1).max(2),offsetX:y.number().optional(),offsetY:y.number().optional()}),ht=y.object({type:y.literal(`text`),text:y.string().min(1),position:y.enum([`top-left`,`top-right`,`bottom-left`,`bottom-right`,`center`]),fontSize:y.number().positive(),color:y.string().min(1),fontFamily:y.string().optional(),offsetX:y.number().optional(),offsetY:y.number().optional()}),gt=y.discriminatedUnion(`type`,[$,at,ot,st,ct,lt,ut,dt,ft,pt,mt,ht]),_t=y.object({transformations:y.array(gt).min(1)}),vt=y.object({startTime:y.number().nonnegative(),endTime:y.number().positive().optional(),duration:y.number().positive().optional()}).refine(e=>!e.endTime||!e.duration,`Cannot specify both endTime and duration`).refine(e=>!e.endTime||e.endTime>e.startTime,`endTime must be greater than startTime`);var yt=class extends p.Tag(`VideoPlugin`)(){},bt=class extends p.Tag(`VirusScanPlugin`)(){},xt=class extends p.Tag(`ZipPlugin`)(){};const St=(e,t)=>{if(e.length===0)return t;let[n,...r]=e;return r.reduce((e,t)=>y.union([e,t]),n)};function Ct(t){return m.gen(function*(){let n=Object.entries(t.nodes),r=e=>m.isEffect(e)?e:m.succeed(e),i=yield*m.forEach(n,([t,n])=>m.flatMap(r(n),n=>n.id===t?m.succeed([t,n]):m.fail(e.fromCode(`FLOW_NODE_ERROR`,{cause:Error(`Node key ${t} does not match node id ${n.id}`)})))),a=Object.fromEntries(i),o=i.map(([,e])=>e),s=i.filter(([,e])=>e.type===F.input).map(([,e])=>e.inputSchema),c=t.edges.map(e=>({source:a[e.source]?.id??e.source,target:a[e.target]?.id??e.target,sourcePort:e.sourcePort,targetPort:e.targetPort})),l=new Set(i.map(([e])=>a[e]?.id).filter(e=>e&&!c.some(t=>t.source===e))),u=i.filter(([,e])=>l.has(e.id)).map(([,e])=>e.outputSchema),d=t.inputSchema??St(s,y.unknown()),f=t.outputSchema??St(u,y.unknown());return yield*J({flowId:t.flowId,name:t.name,nodes:o,edges:c,inputSchema:d,outputSchema:f,typeChecker:t.typeChecker,onEvent:t.onEvent,parallelExecution:t.parallelExecution,hooks:t.hooks,circuitBreaker:t.circuitBreaker})})}const wt=y.object({inputs:y.record(y.string(),y.any())});export{De as $,Ye as A,I as At,Ve as B,O as Bt,nt as C,de as Ct,Qe as D,L as Dt,$e as E,z as Et,We as F,j as Ft,Ie as G,D as Gt,je as H,E as Ht,He as I,M as It,ke as J,Le as K,S as Kt,Be as L,N as Lt,qe as M,te as Mt,Ke as N,P as Nt,Ze as O,R as Ot,Ge as P,ne as Pt,Oe as Q,Re as R,A as Rt,rt as S,G as St,et as T,le as Tt,Me as U,w as Ut,Ue as V,ee as Vt,Q as W,T as Wt,Y as X,Ae as Y,X as Z,ht as _,U as _t,yt as a,be as at,pt as b,W as bt,ut as c,Ce as ct,ct as d,ge as dt,J as et,mt as f,he as ft,ft as g,pe as gt,lt as h,we as ht,bt as i,ye as it,Je as j,re as jt,Xe as k,F as kt,dt as l,_e as lt,ot as m,Te as mt,Ct as n,K as nt,vt as o,ve as ot,$ as p,me as pt,Z as q,xt as r,q as rt,at as s,xe as st,wt as t,Ee as tt,st as u,Se as ut,_t as v,H as vt,tt as w,B as wt,it as x,fe as xt,gt as y,V as yt,ze as z,k as zt};
|
|
2
|
-
//# sourceMappingURL=flow-CUW8k-Ni.mjs.map
|