UNPKG

@mastra/core

Version:
1 lines 31.6 kB
{"version":3,"file":"worker-D6tELOAF.cjs","names":["MastraWorker","#config","#running","#handleEvent","#pushCb","#transport","PullTransport","#dispatch","#recordTrigger","RequestContext"],"sources":["../src/schedules/worker.ts"],"sourcesContent":["import type { AgentSignal, AgentSignalIfIdleOptions } from '../agent/types';\nimport type { Event, EventCallback } from '../events/types';\nimport type { Mastra } from '../mastra';\nimport { RequestContext } from '../request-context';\nimport type { ScheduleTarget } from '../storage/domains/schedules/base';\nimport { PullTransport } from '../worker/transport/pull-transport';\nimport type { WorkerTransport } from '../worker/transport/transport';\nimport { MastraWorker } from '../worker/worker';\nimport type { WorkerDeps } from '../worker/worker';\nimport type {\n ScheduleEffective,\n ScheduleHooks,\n ScheduleIfIdle,\n SchedulePrepareContext,\n SchedulePrepareResult,\n ScheduleRunStatus,\n ScheduleTriggerInfo,\n} from './types';\n\n/** PubSub topic on which the scheduler publishes `agent-schedule.fire` events. */\nexport const TOPIC_AGENT_SCHEDULES = 'agent-schedules';\n\nconst DEFAULT_GROUP = 'mastra-agent-schedules';\n\nexport interface AgentScheduleWorkerConfig {\n group?: string;\n}\n\nexport interface AgentScheduleFireEventData {\n scheduleId: string;\n claimId: string;\n scheduledFireAt: number;\n target: Extract<ScheduleTarget, { type: 'agent' }>;\n /** Defaults to `'schedule-fire'`. `'manual'` for fire-now invocations. */\n triggerKind?: 'schedule-fire' | 'manual';\n}\n\n/**\n * Consumes `agent-schedule.fire` events published by the scheduler and runs\n * the configured agent — either by `sendSignal` (threaded) or\n * `agent.generate` (threadless). Mirrors `OrchestrationWorker`'s\n * subscribe-on-start / unsubscribe-on-stop lifecycle.\n *\n * Records the schedule trigger after dispatching so the trigger row\n * carries the agent's runId (not just the scheduler's claim id),\n * letting the UI link triggers to real agent runs.\n */\nexport class AgentScheduleWorker extends MastraWorker {\n readonly name = 'agent-schedule';\n\n #config: AgentScheduleWorkerConfig;\n #transport?: WorkerTransport;\n #pushCb?: EventCallback;\n #running = false;\n\n constructor(config: AgentScheduleWorkerConfig = {}) {\n super();\n this.#config = config;\n }\n\n async init(deps: WorkerDeps): Promise<void> {\n await super.init(deps);\n\n if (!deps.mastra) {\n throw new Error('AgentScheduleWorker requires Mastra instance');\n }\n }\n\n async start(): Promise<void> {\n if (this.#running) return;\n if (!this.deps) throw new Error('AgentScheduleWorker: call init() before start()');\n\n // Push-only pubsubs (EventEmitter, UnixSocketPubSub) don't support the\n // grouped pull subscription a PullTransport requires. They deliver every\n // event to every in-process subscriber, so subscribe directly without a\n // group — mirroring how Mastra.startWorkers handles workflow events for\n // push-only transports instead of running the pull-based worker.\n const modes = this.deps.pubsub.supportedModes ?? ['pull'];\n if (!modes.includes('pull')) {\n const cb: EventCallback = (event, ack, nack) => {\n void this.#handleEvent(event, ack, nack);\n };\n this.#pushCb = cb;\n await this.deps.pubsub.subscribe(TOPIC_AGENT_SCHEDULES, cb);\n this.#running = true;\n return;\n }\n\n const group = this.#config.group ?? DEFAULT_GROUP;\n this.#transport = new PullTransport({\n pubsub: this.deps.pubsub,\n group,\n topic: TOPIC_AGENT_SCHEDULES,\n logger: this.deps.logger,\n });\n\n await this.#transport.start({\n route: (event, ack, nack) => this.#handleEvent(event, ack, nack),\n });\n\n this.#running = true;\n }\n\n async stop(): Promise<void> {\n if (!this.#running) return;\n try {\n if (this.#transport) {\n await this.#transport.stop();\n this.#transport = undefined;\n }\n if (this.#pushCb && this.deps) {\n await this.deps.pubsub.unsubscribe(TOPIC_AGENT_SCHEDULES, this.#pushCb);\n this.#pushCb = undefined;\n }\n } finally {\n this.#running = false;\n }\n }\n\n get isRunning(): boolean {\n return this.#running;\n }\n\n async #handleEvent(event: Event, ack?: () => Promise<void>, nack?: () => Promise<void>): Promise<void> {\n if (event.type !== 'agent-schedule.fire') {\n // Not ours — ack and ignore.\n await ack?.();\n return;\n }\n\n const mastra = this.mastra!;\n const payload = event.data as AgentScheduleFireEventData;\n try {\n await this.#dispatch(mastra, payload);\n await ack?.();\n } catch (err) {\n this.deps?.logger?.error('AgentScheduleWorker: error processing agent-schedule.fire', {\n scheduleId: payload?.scheduleId,\n claimId: payload?.claimId,\n error: err,\n });\n await nack?.();\n }\n }\n\n async #dispatch(mastra: Mastra, data: AgentScheduleFireEventData): Promise<void> {\n const { scheduleId, claimId, scheduledFireAt, target } = data;\n const actualFireAt = Date.now();\n\n const result = await executeAgentSchedule(mastra, scheduleId, target, {\n triggerKind: data.triggerKind ?? 'schedule-fire',\n firedAt: new Date(actualFireAt),\n logger: this.deps?.logger,\n });\n\n await this.#recordTrigger({\n scheduleId,\n claimId,\n scheduledFireAt,\n actualFireAt,\n outcome: result.outcome,\n runId: result.runId,\n error: result.reason,\n triggerKind: data.triggerKind ?? 'schedule-fire',\n });\n }\n\n async #recordTrigger(args: {\n scheduleId: string;\n claimId: string;\n scheduledFireAt: number;\n actualFireAt: number;\n outcome: ScheduleTriggerOutcome;\n runId?: string;\n error?: string;\n triggerKind: 'schedule-fire' | 'manual';\n }): Promise<void> {\n const store = await this.deps?.storage.getStore('schedules');\n if (!store) return;\n try {\n await store.recordTrigger({\n scheduleId: args.scheduleId,\n runId: args.runId ?? args.claimId,\n scheduledFireAt: args.scheduledFireAt,\n actualFireAt: args.actualFireAt,\n outcome: args.outcome,\n error: args.error,\n triggerKind: args.triggerKind,\n });\n } catch (err) {\n this.deps?.logger?.error('AgentScheduleWorker: failed to record trigger', {\n scheduleId: args.scheduleId,\n claimId: args.claimId,\n error: err,\n });\n }\n }\n}\n\n/** Outcome union written to the schedule trigger row for an agent-schedule fire. */\nexport type ScheduleTriggerOutcome =\n | 'succeeded'\n | 'delivered'\n | 'persisted'\n | 'discarded'\n | 'skipped'\n | 'aborted'\n | 'failed';\n\n/**\n * Best-effort delete of the schedule row. Self-clean is best-effort —\n * an explicit `schedules.delete()` may have raced us. Swallow errors.\n */\nasync function selfClean(mastra: Mastra, scheduleId: string): Promise<void> {\n try {\n const store = await mastra.getStorage()?.getStore('schedules');\n if (!store) return;\n await store.deleteSchedule(scheduleId);\n } catch (error) {\n mastra.getLogger?.()?.debug?.('agent-schedule self-clean failed', { scheduleId, error });\n }\n}\n\ntype LooseLogger = {\n error?: (message: string, ...args: any[]) => void;\n debug?: (message: string, ...args: any[]) => void;\n};\n\n/** Optional context the `AgentScheduleWorker` passes to `executeAgentSchedule`. */\nexport interface ExecuteAgentScheduleContext {\n triggerKind?: 'schedule-fire' | 'manual';\n firedAt?: Date;\n logger?: LooseLogger;\n}\n\n/**\n * Resolves the agent, runs the user `prepare` hook (if any), applies\n * idle filters, and either `sendSignal`s into the target\n * thread or runs `agent.generate`. The returned `runId` is the agent\n * run id from the SDK call (when a run was actually started), suitable\n * for trigger-row linkability.\n *\n * `outcome` is the final outcome for the schedule trigger row and is\n * also the one that drove the `onFinish`/`onError`/`onAbort` hook\n * selection. `status` is retained for back-compat with existing tests.\n */\nexport async function executeAgentSchedule(\n mastra: Mastra,\n scheduleId: string,\n target: Extract<ScheduleTarget, { type: 'agent' }>,\n ctx: ExecuteAgentScheduleContext = {},\n): Promise<{ status: ScheduleRunStatus; outcome: ScheduleTriggerOutcome; reason?: string; runId?: string }> {\n const { agentId } = target;\n const trigger: ScheduleTriggerInfo = {\n kind: ctx.triggerKind === 'manual' ? 'manual' : 'cron',\n firedAt: ctx.firedAt ?? new Date(),\n };\n const log = ctx.logger ?? mastra.getLogger?.();\n\n const agent = (() => {\n try {\n return mastra.getAgentById(agentId);\n } catch {\n return null;\n }\n })();\n if (!agent) {\n await selfClean(mastra, scheduleId);\n return {\n status: 'agent-missing',\n outcome: 'failed',\n reason: `agent \"${agentId}\" no longer registered`,\n };\n }\n\n const hooks =\n (\n mastra as unknown as {\n __getScheduleHooks?: () => ScheduleHooks | null | undefined;\n }\n ).__getScheduleHooks?.() ?? undefined;\n\n // Build a partial `AgentSchedule` view for hook contexts. Best-effort —\n // pulls from the live schedule row when hooks are configured (so they see\n // fresh fields), otherwise a cheap projection from the event target. The\n // ref is only ever passed to hooks, so hookless fires skip the extra\n // storage round-trip entirely.\n const scheduleRef = hooks\n ? await loadScheduleRef(mastra, scheduleId, target, log)\n : scheduleRefFromTarget(scheduleId, target);\n\n const rowDefaults: ScheduleEffective = buildEffectiveFromTarget(target);\n\n // 1. prepare hook\n let prepared: SchedulePrepareResult | null | undefined;\n if (hooks?.prepare) {\n try {\n const prepareCtx: SchedulePrepareContext = {\n mastra,\n agentId,\n schedule: scheduleRef,\n trigger,\n };\n prepared = await hooks.prepare(prepareCtx);\n } catch (err) {\n await safeHookCall(log, () =>\n hooks.onError?.({\n mastra,\n agentId,\n schedule: scheduleRef,\n trigger,\n phase: 'prepare',\n error: err instanceof Error ? err : new Error(String(err)),\n effective: rowDefaults,\n }),\n );\n return {\n status: 'invalid-input',\n outcome: 'failed',\n reason: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n if (prepared === null) {\n // Hook explicitly asked to skip this fire.\n await safeHookCall(log, () =>\n hooks?.onFinish?.({\n mastra,\n agentId,\n schedule: scheduleRef,\n trigger,\n outcome: 'skipped',\n effective: rowDefaults,\n }),\n );\n return { status: 'fired', outcome: 'skipped' };\n }\n\n const effective: ScheduleEffective = mergeEffective(rowDefaults, prepared);\n\n // Run-level marker carried on the signal / agent run so consumers\n // (typing status, UI badges) can detect that this run was\n // schedule-driven.\n const scheduleRunMeta = {\n scheduleId,\n ...(effective.threadId ? { threadId: effective.threadId } : {}),\n };\n\n // 2. threaded vs threadless\n if (effective.threadId) {\n if (!effective.resourceId) {\n const reason = 'resourceId required when threadId is set';\n await safeHookCall(log, () =>\n hooks?.onError?.({\n mastra,\n agentId,\n schedule: scheduleRef,\n trigger,\n phase: 'run',\n error: new Error(reason),\n effective,\n }),\n );\n return { status: 'invalid-input', outcome: 'failed', reason };\n }\n\n const memory = await agent.getMemory();\n if (memory) {\n const thread = await memory.getThreadById({ threadId: effective.threadId });\n if (!thread) {\n await selfClean(mastra, scheduleId);\n const reason = `thread \"${effective.threadId}\" not found`;\n await safeHookCall(log, () =>\n hooks?.onError?.({\n mastra,\n agentId,\n schedule: scheduleRef,\n trigger,\n phase: 'run',\n error: new Error(reason),\n effective,\n }),\n );\n return { status: 'thread-missing', outcome: 'failed', reason };\n }\n }\n\n let signalResult;\n try {\n const signalType = effective.signalType ?? 'notification';\n const signalBase = {\n tagName: effective.tagName ?? 'schedule',\n contents: effective.prompt,\n ...(effective.attributes ? { attributes: effective.attributes } : {}),\n providerOptions: mergeProviderOptions(effective.providerOptions, scheduleRunMeta),\n };\n const signal: AgentSignal =\n signalType === 'state' ? { ...signalBase, type: 'state' } : { ...signalBase, type: signalType };\n signalResult = agent.sendSignal(signal, {\n resourceId: effective.resourceId,\n threadId: effective.threadId,\n ...(effective.ifActive ? { ifActive: effective.ifActive } : {}),\n ...(effective.ifIdle ? { ifIdle: buildIfIdleOptions(effective.ifIdle) } : {}),\n });\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n await safeHookCall(log, () =>\n hooks?.onError?.({\n mastra,\n agentId,\n schedule: scheduleRef,\n trigger,\n phase: 'run',\n error,\n effective,\n }),\n );\n return { status: 'invalid-input', outcome: 'failed', reason: error.message };\n }\n\n // The signal runtime resolves `accepted` at routing-decision time with the\n // concrete action it took. It only *rejects* when the signal could not be\n // routed at all (e.g. a misconfigured agent) — generation errors on a woken\n // run surface through the run's own stream, never by rejecting here.\n let settled;\n try {\n settled = await signalResult.accepted;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n await safeHookCall(log, () =>\n hooks?.onError?.({\n mastra,\n agentId,\n schedule: scheduleRef,\n trigger,\n phase: 'run',\n error,\n effective,\n }),\n );\n return { status: 'invalid-input', outcome: 'failed', reason: error.message };\n }\n\n const action = settled.action;\n // `runId` is present on `wake`/`deliver`/`blocked` — the actions that reference a\n // concrete agent run. `persist`/`discard` never produce a run id.\n const runId = 'runId' in settled ? settled.runId : undefined;\n\n if (action === 'deliver') {\n await safeHookCall(log, () =>\n hooks?.onFinish?.({\n mastra,\n agentId,\n schedule: scheduleRef,\n trigger,\n outcome: 'delivered',\n runId,\n joinedExistingRun: true,\n effective,\n }),\n );\n return { status: 'signal-accepted', outcome: 'delivered', runId };\n }\n if (action === 'persist') {\n // Wait briefly for persist write so the trigger row reflects the truth.\n if (signalResult.persisted) {\n try {\n await signalResult.persisted;\n } catch {\n // Persist write failure is surfaced via the signal's own machinery.\n }\n }\n await safeHookCall(log, () =>\n hooks?.onFinish?.({\n mastra,\n agentId,\n schedule: scheduleRef,\n trigger,\n outcome: 'persisted',\n runId,\n effective,\n }),\n );\n return { status: 'signal-accepted', outcome: 'persisted', runId };\n }\n if (action === 'discard') {\n await safeHookCall(log, () =>\n hooks?.onFinish?.({\n mastra,\n agentId,\n schedule: scheduleRef,\n trigger,\n outcome: 'discarded',\n runId,\n effective,\n }),\n );\n return { status: 'signal-accepted', outcome: 'discarded', runId };\n }\n\n if (action === 'blocked') {\n // The thread was suspended and could not accept an idle wake. Nothing ran\n // and nothing was stored; report as skipped so the trigger row is truthful.\n await safeHookCall(log, () =>\n hooks?.onFinish?.({\n mastra,\n agentId,\n schedule: scheduleRef,\n trigger,\n outcome: 'skipped',\n runId,\n effective,\n }),\n );\n return { status: 'skipped-thread-blocked', outcome: 'skipped', runId };\n }\n\n // action === 'wake' — a new run was started for this signal. The thread-stream\n // runtime drives the run's stream to completion on its own (so the active-run\n // record and thread lease release without requiring a consumer here); the\n // schedule fire is fire-and-forget for trigger-row purposes.\n await safeHookCall(log, () =>\n hooks?.onFinish?.({\n mastra,\n agentId,\n schedule: scheduleRef,\n trigger,\n outcome: 'succeeded',\n runId,\n effective,\n }),\n );\n return { status: 'signal-accepted', outcome: 'succeeded', runId };\n }\n\n // 4. threadless path: agent.generate\n try {\n const result = await agent.generate(effective.prompt, {\n providerOptions: mergeProviderOptions(effective.providerOptions, scheduleRunMeta),\n });\n const runId = extractRunId(result);\n await safeHookCall(log, () =>\n hooks?.onFinish?.({\n mastra,\n agentId,\n schedule: scheduleRef,\n trigger,\n outcome: 'succeeded',\n runId,\n result: extractRunSnapshot(result),\n effective,\n }),\n );\n return { status: 'fired', outcome: 'succeeded', runId };\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n if (isAbortError(error)) {\n await safeHookCall(log, () =>\n hooks?.onAbort?.({\n mastra,\n agentId,\n schedule: scheduleRef,\n trigger,\n runId: extractRunId(error) ?? scheduleId,\n effective,\n }),\n );\n return { status: 'fired', outcome: 'aborted' };\n }\n await safeHookCall(log, () =>\n hooks?.onError?.({\n mastra,\n agentId,\n schedule: scheduleRef,\n trigger,\n phase: 'run',\n error,\n effective,\n }),\n );\n return { status: 'invalid-input', outcome: 'failed', reason: error.message };\n }\n}\n\nfunction buildEffectiveFromTarget(target: Extract<ScheduleTarget, { type: 'agent' }>): ScheduleEffective {\n return {\n threadId: target.threadId,\n resourceId: target.resourceId,\n prompt: target.prompt,\n signalType: target.signalType,\n tagName: target.tagName,\n attributes: target.attributes,\n providerOptions: target.providerOptions,\n ifActive: target.ifActive,\n ifIdle: target.ifIdle,\n };\n}\n\n/**\n * Maps the stored, JSON-safe `ifIdle` config onto the signal API's\n * `AgentSignalIfIdleOptions`, rehydrating the plain `streamOptions.requestContext`\n * object into a live `RequestContext` before the wake signal runs.\n */\nfunction buildIfIdleOptions(ifIdle: ScheduleIfIdle): AgentSignalIfIdleOptions {\n const requestContext = ifIdle.streamOptions?.requestContext;\n return {\n ...(ifIdle.behavior ? { behavior: ifIdle.behavior } : {}),\n ...(ifIdle.attributes ? { attributes: ifIdle.attributes } : {}),\n ...(requestContext\n ? { streamOptions: { requestContext: new RequestContext(Object.entries(requestContext)) } }\n : {}),\n };\n}\n\nfunction mergeEffective(base: ScheduleEffective, overrides: SchedulePrepareResult | undefined): ScheduleEffective {\n if (!overrides) return base;\n return {\n ...base,\n ...overrides,\n };\n}\n\nfunction mergeProviderOptions(\n fromHook: Record<string, unknown> | undefined,\n scheduleRunMeta: Record<string, unknown>,\n): Record<string, any> {\n const base = (fromHook ?? {}) as Record<string, any>;\n const baseMastra = (base.mastra ?? {}) as Record<string, unknown>;\n return {\n ...base,\n mastra: {\n ...baseMastra,\n schedule: scheduleRunMeta,\n },\n };\n}\n\nasync function loadScheduleRef(\n mastra: Mastra,\n scheduleId: string,\n target: Extract<ScheduleTarget, { type: 'agent' }>,\n logger?: LooseLogger,\n): Promise<{ id: string; agentId: string; name?: string; [key: string]: unknown }> {\n try {\n const schedule = await mastra.schedules.get(scheduleId);\n if (schedule && schedule.agentId !== undefined) return { ...schedule, agentId: schedule.agentId };\n } catch (err) {\n // Fall back to a minimal projection from the event target, but surface\n // the failure so a persistently-broken schedules store isn't invisible.\n logger?.debug?.('AgentScheduleWorker: failed to load schedule row for hook context', { scheduleId, error: err });\n }\n return scheduleRefFromTarget(scheduleId, target);\n}\n\n/** Minimal hook-context projection built from the fire event's target. */\nfunction scheduleRefFromTarget(\n scheduleId: string,\n target: Extract<ScheduleTarget, { type: 'agent' }>,\n): { id: string; agentId: string; name?: string } {\n return {\n id: scheduleId,\n agentId: target.agentId,\n ...(target.name !== undefined ? { name: target.name } : {}),\n };\n}\n\nasync function safeHookCall(logger: LooseLogger | undefined, fn: () => unknown): Promise<void> {\n try {\n await fn();\n } catch (err) {\n logger?.error?.('AgentScheduleWorker: hook threw, ignoring', { error: err });\n }\n}\n\nfunction isAbortError(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false;\n const name = (err as { name?: unknown }).name;\n return name === 'AbortError';\n}\n\nfunction extractRunId(value: unknown): string | undefined {\n if (value && typeof value === 'object' && 'runId' in value) {\n const runId = (value as { runId?: unknown }).runId;\n if (typeof runId === 'string') return runId;\n }\n return undefined;\n}\n\nfunction extractRunSnapshot(\n value: unknown,\n): { text?: string; usage?: Record<string, unknown>; finishReason?: string } | undefined {\n if (!value || typeof value !== 'object') return undefined;\n const v = value as { text?: unknown; usage?: unknown; finishReason?: unknown };\n const snapshot: { text?: string; usage?: Record<string, unknown>; finishReason?: string } = {};\n if (typeof v.text === 'string') snapshot.text = v.text;\n if (v.usage && typeof v.usage === 'object') snapshot.usage = v.usage as Record<string, unknown>;\n if (typeof v.finishReason === 'string') snapshot.finishReason = v.finishReason;\n return Object.keys(snapshot).length > 0 ? snapshot : undefined;\n}\n"],"mappings":";;;;AAoBA,MAAa,wBAAwB;AAErC,MAAM,gBAAgB;;;;;;;;;;;AAyBtB,IAAa,sBAAb,cAAyCA,uBAAAA,aAAa;CACpD,OAAgB;CAEhB;CACA;CACA;CACA,WAAW;CAEX,YAAY,SAAoC,CAAC,GAAG;EAClD,MAAM;EACN,KAAKC,UAAU;CACjB;CAEA,MAAM,KAAK,MAAiC;EAC1C,MAAM,MAAM,KAAK,IAAI;EAErB,IAAI,CAAC,KAAK,QACR,MAAM,IAAI,MAAM,8CAA8C;CAElE;CAEA,MAAM,QAAuB;EAC3B,IAAI,KAAKC,UAAU;EACnB,IAAI,CAAC,KAAK,MAAM,MAAM,IAAI,MAAM,iDAAiD;EAQjF,IAAI,EADU,KAAK,KAAK,OAAO,kBAAkB,CAAC,MAAM,EAAA,CAC7C,SAAS,MAAM,GAAG;GAC3B,MAAM,MAAqB,OAAO,KAAK,SAAS;IAC9C,KAAUC,aAAa,OAAO,KAAK,IAAI;GACzC;GACA,KAAKC,UAAU;GACf,MAAM,KAAK,KAAK,OAAO,UAAU,uBAAuB,EAAE;GAC1D,KAAKF,WAAW;GAChB;EACF;EAEA,MAAM,QAAQ,KAAKD,QAAQ,SAAS;EACpC,KAAKI,aAAa,IAAIC,uBAAAA,cAAc;GAClC,QAAQ,KAAK,KAAK;GAClB;GACA,OAAO;GACP,QAAQ,KAAK,KAAK;EACpB,CAAC;EAED,MAAM,KAAKD,WAAW,MAAM,EAC1B,QAAQ,OAAO,KAAK,SAAS,KAAKF,aAAa,OAAO,KAAK,IAAI,EACjE,CAAC;EAED,KAAKD,WAAW;CAClB;CAEA,MAAM,OAAsB;EAC1B,IAAI,CAAC,KAAKA,UAAU;EACpB,IAAI;GACF,IAAI,KAAKG,YAAY;IACnB,MAAM,KAAKA,WAAW,KAAK;IAC3B,KAAKA,aAAa,KAAA;GACpB;GACA,IAAI,KAAKD,WAAW,KAAK,MAAM;IAC7B,MAAM,KAAK,KAAK,OAAO,YAAY,uBAAuB,KAAKA,OAAO;IACtE,KAAKA,UAAU,KAAA;GACjB;EACF,UAAU;GACR,KAAKF,WAAW;EAClB;CACF;CAEA,IAAI,YAAqB;EACvB,OAAO,KAAKA;CACd;CAEA,MAAMC,aAAa,OAAc,KAA2B,MAA2C;EACrG,IAAI,MAAM,SAAS,uBAAuB;GAExC,MAAM,MAAM;GACZ;EACF;EAEA,MAAM,SAAS,KAAK;EACpB,MAAM,UAAU,MAAM;EACtB,IAAI;GACF,MAAM,KAAKI,UAAU,QAAQ,OAAO;GACpC,MAAM,MAAM;EACd,SAAS,KAAK;GACZ,KAAK,MAAM,QAAQ,MAAM,6DAA6D;IACpF,YAAY,SAAS;IACrB,SAAS,SAAS;IAClB,OAAO;GACT,CAAC;GACD,MAAM,OAAO;EACf;CACF;CAEA,MAAMA,UAAU,QAAgB,MAAiD;EAC/E,MAAM,EAAE,YAAY,SAAS,iBAAiB,WAAW;EACzD,MAAM,eAAe,KAAK,IAAI;EAE9B,MAAM,SAAS,MAAM,qBAAqB,QAAQ,YAAY,QAAQ;GACpE,aAAa,KAAK,eAAe;GACjC,SAAS,IAAI,KAAK,YAAY;GAC9B,QAAQ,KAAK,MAAM;EACrB,CAAC;EAED,MAAM,KAAKC,eAAe;GACxB;GACA;GACA;GACA;GACA,SAAS,OAAO;GAChB,OAAO,OAAO;GACd,OAAO,OAAO;GACd,aAAa,KAAK,eAAe;EACnC,CAAC;CACH;CAEA,MAAMA,eAAe,MASH;EAChB,MAAM,QAAQ,MAAM,KAAK,MAAM,QAAQ,SAAS,WAAW;EAC3D,IAAI,CAAC,OAAO;EACZ,IAAI;GACF,MAAM,MAAM,cAAc;IACxB,YAAY,KAAK;IACjB,OAAO,KAAK,SAAS,KAAK;IAC1B,iBAAiB,KAAK;IACtB,cAAc,KAAK;IACnB,SAAS,KAAK;IACd,OAAO,KAAK;IACZ,aAAa,KAAK;GACpB,CAAC;EACH,SAAS,KAAK;GACZ,KAAK,MAAM,QAAQ,MAAM,iDAAiD;IACxE,YAAY,KAAK;IACjB,SAAS,KAAK;IACd,OAAO;GACT,CAAC;EACH;CACF;AACF;;;;;AAgBA,eAAe,UAAU,QAAgB,YAAmC;CAC1E,IAAI;EACF,MAAM,QAAQ,MAAM,OAAO,WAAW,CAAC,EAAE,SAAS,WAAW;EAC7D,IAAI,CAAC,OAAO;EACZ,MAAM,MAAM,eAAe,UAAU;CACvC,SAAS,OAAO;EACd,OAAO,YAAY,CAAC,EAAE,QAAQ,oCAAoC;GAAE;GAAY;EAAM,CAAC;CACzF;AACF;;;;;;;;;;;;AAyBA,eAAsB,qBACpB,QACA,YACA,QACA,MAAmC,CAAC,GACsE;CAC1G,MAAM,EAAE,YAAY;CACpB,MAAM,UAA+B;EACnC,MAAM,IAAI,gBAAgB,WAAW,WAAW;EAChD,SAAS,IAAI,2BAAW,IAAI,KAAK;CACnC;CACA,MAAM,MAAM,IAAI,UAAU,OAAO,YAAY;CAE7C,MAAM,eAAe;EACnB,IAAI;GACF,OAAO,OAAO,aAAa,OAAO;EACpC,QAAQ;GACN,OAAO;EACT;CACF,EAAA,CAAG;CACH,IAAI,CAAC,OAAO;EACV,MAAM,UAAU,QAAQ,UAAU;EAClC,OAAO;GACL,QAAQ;GACR,SAAS;GACT,QAAQ,UAAU,QAAQ;EAC5B;CACF;CAEA,MAAM,QAEF,OAGA,qBAAqB,KAAK,KAAA;CAO9B,MAAM,cAAc,QAChB,MAAM,gBAAgB,QAAQ,YAAY,QAAQ,GAAG,IACrD,sBAAsB,YAAY,MAAM;CAE5C,MAAM,cAAiC,yBAAyB,MAAM;CAGtE,IAAI;CACJ,IAAI,OAAO,SACT,IAAI;EACF,MAAM,aAAqC;GACzC;GACA;GACA,UAAU;GACV;EACF;EACA,WAAW,MAAM,MAAM,QAAQ,UAAU;CAC3C,SAAS,KAAK;EACZ,MAAM,aAAa,WACjB,MAAM,UAAU;GACd;GACA;GACA,UAAU;GACV;GACA,OAAO;GACP,OAAO,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;GACzD,WAAW;EACb,CAAC,CACH;EACA,OAAO;GACL,QAAQ;GACR,SAAS;GACT,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;EACzD;CACF;CAGF,IAAI,aAAa,MAAM;EAErB,MAAM,aAAa,WACjB,OAAO,WAAW;GAChB;GACA;GACA,UAAU;GACV;GACA,SAAS;GACT,WAAW;EACb,CAAC,CACH;EACA,OAAO;GAAE,QAAQ;GAAS,SAAS;EAAU;CAC/C;CAEA,MAAM,YAA+B,eAAe,aAAa,QAAQ;CAKzE,MAAM,kBAAkB;EACtB;EACA,GAAI,UAAU,WAAW,EAAE,UAAU,UAAU,SAAS,IAAI,CAAC;CAC/D;CAGA,IAAI,UAAU,UAAU;EACtB,IAAI,CAAC,UAAU,YAAY;GACzB,MAAM,SAAS;GACf,MAAM,aAAa,WACjB,OAAO,UAAU;IACf;IACA;IACA,UAAU;IACV;IACA,OAAO;IACP,uBAAO,IAAI,MAAM,MAAM;IACvB;GACF,CAAC,CACH;GACA,OAAO;IAAE,QAAQ;IAAiB,SAAS;IAAU;GAAO;EAC9D;EAEA,MAAM,SAAS,MAAM,MAAM,UAAU;EACrC,IAAI,QAEE;OAAA,CAAC,MADgB,OAAO,cAAc,EAAE,UAAU,UAAU,SAAS,CAAC,GAC7D;IACX,MAAM,UAAU,QAAQ,UAAU;IAClC,MAAM,SAAS,WAAW,UAAU,SAAS;IAC7C,MAAM,aAAa,WACjB,OAAO,UAAU;KACf;KACA;KACA,UAAU;KACV;KACA,OAAO;KACP,OAAO,IAAI,MAAM,MAAM;KACvB;IACF,CAAC,CACH;IACA,OAAO;KAAE,QAAQ;KAAkB,SAAS;KAAU;IAAO;GAC/D;;EAGF,IAAI;EACJ,IAAI;GACF,MAAM,aAAa,UAAU,cAAc;GAC3C,MAAM,aAAa;IACjB,SAAS,UAAU,WAAW;IAC9B,UAAU,UAAU;IACpB,GAAI,UAAU,aAAa,EAAE,YAAY,UAAU,WAAW,IAAI,CAAC;IACnE,iBAAiB,qBAAqB,UAAU,iBAAiB,eAAe;GAClF;GACA,MAAM,SACJ,eAAe,UAAU;IAAE,GAAG;IAAY,MAAM;GAAQ,IAAI;IAAE,GAAG;IAAY,MAAM;GAAW;GAChG,eAAe,MAAM,WAAW,QAAQ;IACtC,YAAY,UAAU;IACtB,UAAU,UAAU;IACpB,GAAI,UAAU,WAAW,EAAE,UAAU,UAAU,SAAS,IAAI,CAAC;IAC7D,GAAI,UAAU,SAAS,EAAE,QAAQ,mBAAmB,UAAU,MAAM,EAAE,IAAI,CAAC;GAC7E,CAAC;EACH,SAAS,KAAK;GACZ,MAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;GAChE,MAAM,aAAa,WACjB,OAAO,UAAU;IACf;IACA;IACA,UAAU;IACV;IACA,OAAO;IACP;IACA;GACF,CAAC,CACH;GACA,OAAO;IAAE,QAAQ;IAAiB,SAAS;IAAU,QAAQ,MAAM;GAAQ;EAC7E;EAMA,IAAI;EACJ,IAAI;GACF,UAAU,MAAM,aAAa;EAC/B,SAAS,KAAK;GACZ,MAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;GAChE,MAAM,aAAa,WACjB,OAAO,UAAU;IACf;IACA;IACA,UAAU;IACV;IACA,OAAO;IACP;IACA;GACF,CAAC,CACH;GACA,OAAO;IAAE,QAAQ;IAAiB,SAAS;IAAU,QAAQ,MAAM;GAAQ;EAC7E;EAEA,MAAM,SAAS,QAAQ;EAGvB,MAAM,QAAQ,WAAW,UAAU,QAAQ,QAAQ,KAAA;EAEnD,IAAI,WAAW,WAAW;GACxB,MAAM,aAAa,WACjB,OAAO,WAAW;IAChB;IACA;IACA,UAAU;IACV;IACA,SAAS;IACT;IACA,mBAAmB;IACnB;GACF,CAAC,CACH;GACA,OAAO;IAAE,QAAQ;IAAmB,SAAS;IAAa;GAAM;EAClE;EACA,IAAI,WAAW,WAAW;GAExB,IAAI,aAAa,WACf,IAAI;IACF,MAAM,aAAa;GACrB,QAAQ,CAER;GAEF,MAAM,aAAa,WACjB,OAAO,WAAW;IAChB;IACA;IACA,UAAU;IACV;IACA,SAAS;IACT;IACA;GACF,CAAC,CACH;GACA,OAAO;IAAE,QAAQ;IAAmB,SAAS;IAAa;GAAM;EAClE;EACA,IAAI,WAAW,WAAW;GACxB,MAAM,aAAa,WACjB,OAAO,WAAW;IAChB;IACA;IACA,UAAU;IACV;IACA,SAAS;IACT;IACA;GACF,CAAC,CACH;GACA,OAAO;IAAE,QAAQ;IAAmB,SAAS;IAAa;GAAM;EAClE;EAEA,IAAI,WAAW,WAAW;GAGxB,MAAM,aAAa,WACjB,OAAO,WAAW;IAChB;IACA;IACA,UAAU;IACV;IACA,SAAS;IACT;IACA;GACF,CAAC,CACH;GACA,OAAO;IAAE,QAAQ;IAA0B,SAAS;IAAW;GAAM;EACvE;EAMA,MAAM,aAAa,WACjB,OAAO,WAAW;GAChB;GACA;GACA,UAAU;GACV;GACA,SAAS;GACT;GACA;EACF,CAAC,CACH;EACA,OAAO;GAAE,QAAQ;GAAmB,SAAS;GAAa;EAAM;CAClE;CAGA,IAAI;EACF,MAAM,SAAS,MAAM,MAAM,SAAS,UAAU,QAAQ,EACpD,iBAAiB,qBAAqB,UAAU,iBAAiB,eAAe,EAClF,CAAC;EACD,MAAM,QAAQ,aAAa,MAAM;EACjC,MAAM,aAAa,WACjB,OAAO,WAAW;GAChB;GACA;GACA,UAAU;GACV;GACA,SAAS;GACT;GACA,QAAQ,mBAAmB,MAAM;GACjC;EACF,CAAC,CACH;EACA,OAAO;GAAE,QAAQ;GAAS,SAAS;GAAa;EAAM;CACxD,SAAS,KAAK;EACZ,MAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;EAChE,IAAI,aAAa,KAAK,GAAG;GACvB,MAAM,aAAa,WACjB,OAAO,UAAU;IACf;IACA;IACA,UAAU;IACV;IACA,OAAO,aAAa,KAAK,KAAK;IAC9B;GACF,CAAC,CACH;GACA,OAAO;IAAE,QAAQ;IAAS,SAAS;GAAU;EAC/C;EACA,MAAM,aAAa,WACjB,OAAO,UAAU;GACf;GACA;GACA,UAAU;GACV;GACA,OAAO;GACP;GACA;EACF,CAAC,CACH;EACA,OAAO;GAAE,QAAQ;GAAiB,SAAS;GAAU,QAAQ,MAAM;EAAQ;CAC7E;AACF;AAEA,SAAS,yBAAyB,QAAuE;CACvG,OAAO;EACL,UAAU,OAAO;EACjB,YAAY,OAAO;EACnB,QAAQ,OAAO;EACf,YAAY,OAAO;EACnB,SAAS,OAAO;EAChB,YAAY,OAAO;EACnB,iBAAiB,OAAO;EACxB,UAAU,OAAO;EACjB,QAAQ,OAAO;CACjB;AACF;;;;;;AAOA,SAAS,mBAAmB,QAAkD;CAC5E,MAAM,iBAAiB,OAAO,eAAe;CAC7C,OAAO;EACL,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;EACvD,GAAI,OAAO,aAAa,EAAE,YAAY,OAAO,WAAW,IAAI,CAAC;EAC7D,GAAI,iBACA,EAAE,eAAe,EAAE,gBAAgB,IAAIC,wBAAAA,eAAe,OAAO,QAAQ,cAAc,CAAC,EAAE,EAAE,IACxF,CAAC;CACP;AACF;AAEA,SAAS,eAAe,MAAyB,WAAiE;CAChH,IAAI,CAAC,WAAW,OAAO;CACvB,OAAO;EACL,GAAG;EACH,GAAG;CACL;AACF;AAEA,SAAS,qBACP,UACA,iBACqB;CACrB,MAAM,OAAQ,YAAY,CAAC;CAC3B,MAAM,aAAc,KAAK,UAAU,CAAC;CACpC,OAAO;EACL,GAAG;EACH,QAAQ;GACN,GAAG;GACH,UAAU;EACZ;CACF;AACF;AAEA,eAAe,gBACb,QACA,YACA,QACA,QACiF;CACjF,IAAI;EACF,MAAM,WAAW,MAAM,OAAO,UAAU,IAAI,UAAU;EACtD,IAAI,YAAY,SAAS,YAAY,KAAA,GAAW,OAAO;GAAE,GAAG;GAAU,SAAS,SAAS;EAAQ;CAClG,SAAS,KAAK;EAGZ,QAAQ,QAAQ,qEAAqE;GAAE;GAAY,OAAO;EAAI,CAAC;CACjH;CACA,OAAO,sBAAsB,YAAY,MAAM;AACjD;;AAGA,SAAS,sBACP,YACA,QACgD;CAChD,OAAO;EACL,IAAI;EACJ,SAAS,OAAO;EAChB,GAAI,OAAO,SAAS,KAAA,IAAY,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC;CAC3D;AACF;AAEA,eAAe,aAAa,QAAiC,IAAkC;CAC7F,IAAI;EACF,MAAM,GAAG;CACX,SAAS,KAAK;EACZ,QAAQ,QAAQ,6CAA6C,EAAE,OAAO,IAAI,CAAC;CAC7E;AACF;AAEA,SAAS,aAAa,KAAuB;CAC3C,IAAI,CAAC,OAAO,OAAO,QAAQ,UAAU,OAAO;CAE5C,OADc,IAA2B,SACzB;AAClB;AAEA,SAAS,aAAa,OAAoC;CACxD,IAAI,SAAS,OAAO,UAAU,YAAY,WAAW,OAAO;EAC1D,MAAM,QAAS,MAA8B;EAC7C,IAAI,OAAO,UAAU,UAAU,OAAO;CACxC;AAEF;AAEA,SAAS,mBACP,OACuF;CACvF,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU,OAAO,KAAA;CAChD,MAAM,IAAI;CACV,MAAM,WAAsF,CAAC;CAC7F,IAAI,OAAO,EAAE,SAAS,UAAU,SAAS,OAAO,EAAE;CAClD,IAAI,EAAE,SAAS,OAAO,EAAE,UAAU,UAAU,SAAS,QAAQ,EAAE;CAC/D,IAAI,OAAO,EAAE,iBAAiB,UAAU,SAAS,eAAe,EAAE;CAClE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,SAAS,IAAI,WAAW,KAAA;AACvD"}