@cascade-flow/client 0.2.8 → 0.2.17

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/index.d.ts CHANGED
@@ -72,9 +72,12 @@ export declare class WorkflowClient {
72
72
  * List runs matching filters
73
73
  *
74
74
  * @param options - Filter options
75
- * @returns Array of run states
75
+ * @returns Object with runs array and total count
76
76
  */
77
- listRuns(options?: ListRunsOptions): Promise<RunState[]>;
77
+ listRuns(options?: ListRunsOptions): Promise<{
78
+ runs: RunState[];
79
+ total: number;
80
+ }>;
78
81
  /**
79
82
  * Cancel a run
80
83
  *
@@ -516,7 +519,7 @@ export declare class WorkflowClient {
516
519
  durationUs: number;
517
520
  attemptNumber: number;
518
521
  terminal: boolean;
519
- failureReason: "timeout" | "cancelled" | "worker-crash" | "exhausted-retries" | "execution-error";
522
+ failureReason: "timeout" | "cancelled" | "worker-crash" | "exhausted-retries" | "execution-error" | "step-removed";
520
523
  nextRetryAtUs?: number | undefined;
521
524
  policyIndex?: number | undefined;
522
525
  attemptInPolicy?: number | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -87,7 +87,7 @@ class WorkflowClient {
87
87
  }
88
88
  }
89
89
  async listRuns(options = {}) {
90
- const { workflowSlug, status, tags, limit } = options;
90
+ const { workflowSlug, status, tags, limit, offset } = options;
91
91
  let statuses;
92
92
  if (status) {
93
93
  statuses = Array.isArray(status) ? status : [status];
@@ -96,7 +96,8 @@ class WorkflowClient {
96
96
  workflowSlug,
97
97
  status: statuses,
98
98
  tags,
99
- limit
99
+ limit,
100
+ offset
100
101
  });
101
102
  }
102
103
  async cancel(runId, reason) {
@@ -260,4 +261,4 @@ export {
260
261
  WorkflowClient
261
262
  };
262
263
 
263
- //# debugId=628D808957162DFD64756E2164756E21
264
+ //# debugId=D46F5515640C50DE64756E2164756E21
package/dist/index.js.map CHANGED
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
4
  "sourcesContent": [
5
- "import type {\n Backend,\n RunSubmission,\n RunState,\n WorkflowMetadata,\n WorkflowVersion,\n AnalyticsOptions,\n ErrorAnalysis,\n RetryAnalysis,\n SchedulingLatency,\n StepDuration,\n WorkflowDuration,\n WorkerStability,\n Throughput,\n QueueDepth,\n QueueDepthByWorkflow,\n SuccessRate,\n AnalyticsSummary,\n StepEvent,\n StepState,\n LogEntry,\n} from \"@cascade-flow/backend-interface\";\nimport {\n projectStepState,\n extractLogsFromEvents,\n extractAttemptMetadata,\n ensureErrorMessage,\n type AttemptMetadata,\n} from \"@cascade-flow/backend-interface\";\nimport type { PollOptions, ListRunsOptions, RunInfo } from \"./types.ts\";\n\n/**\n * WorkflowClient - submit and manage workflow runs via queue\n *\n * Features:\n * - Type-safe submission with generic input types\n * - Status checking and polling\n * - Wait for completion with timeout\n * - List and filter runs\n * - Cancellation support\n */\nexport class WorkflowClient {\n constructor(private backend: Backend) {}\n\n /**\n * Submit a workflow run to the queue\n *\n * Generic type TInput provides type safety for workflow input\n *\n * @example\n * ```typescript\n * import type { WorkflowInput } from './workflows/my-workflow/input-schema';\n *\n * const { runId } = await client.submit<WorkflowInput>({\n * workflow: 'my-workflow',\n * input: { userId: \"123\", count: 42 } // Fully typed!\n * });\n * ```\n */\n async submit<TInput = unknown>(params: {\n workflow: string;\n input?: TInput;\n runId?: string;\n availableAt?: number;\n priority?: number;\n timeout?: number;\n idempotencyKey?: string;\n metadata?: Record<string, unknown>;\n tags?: string[];\n }): Promise<{ runId: string; isNew: boolean }> {\n const submission: RunSubmission = {\n workflowSlug: params.workflow,\n input: params.input,\n runId: params.runId,\n availableAt: params.availableAt,\n priority: params.priority,\n timeout: params.timeout,\n idempotencyKey: params.idempotencyKey,\n metadata: params.metadata,\n tags: params.tags,\n };\n\n return this.backend.submitRun(submission);\n }\n\n /**\n * Get the current status of a run\n *\n * @param runId - The run ID to query\n * @returns Run state or null if not found\n */\n async getStatus(runId: string): Promise<RunState | null> {\n return this.backend.getRun(runId);\n }\n\n /**\n * Get detailed run information including output/error\n *\n * @param runId - The run ID to query\n * @returns Extended run info or null if not found\n */\n async getRun(runId: string): Promise<RunInfo | null> {\n const runState = await this.backend.getRun(runId);\n if (!runState) return null;\n\n const info: RunInfo = { ...runState };\n\n // Load output or error if run is completed/failed\n if (runState.status === \"completed\" || runState.status === \"failed\") {\n try {\n // Load workflow events to get output/error\n const events = await this.backend.loadEvents(runState.workflowSlug, runId, {\n category: \"workflow\",\n });\n\n // Find WorkflowCompleted or WorkflowFailed event\n for (const event of events) {\n if (event.category === \"workflow\") {\n if (event.type === \"WorkflowCompleted\") {\n info.output = JSON.parse(event.output);\n } else if (event.type === \"WorkflowFailed\") {\n info.error = event.error;\n }\n }\n }\n } catch (err) {\n // Failed to load output/error, return state only\n }\n }\n\n return info;\n }\n\n /**\n * Wait for a run to complete\n *\n * Polls the backend until the run reaches a terminal state (completed/failed/cancelled)\n *\n * @param runId - The run ID to wait for\n * @param options - Polling options\n * @returns Run info when complete\n * @throws Error if timeout or run fails\n */\n async waitForCompletion<TOutput = unknown>(\n runId: string,\n options: PollOptions = {}\n ): Promise<TOutput> {\n const {\n interval = 1000,\n maxAttempts = 60,\n timeout,\n exponentialBackoff = false,\n maxBackoff = 10000,\n } = options;\n\n const startTime = Date.now();\n const effectiveTimeout = timeout || maxAttempts * interval;\n\n let currentInterval = interval;\n let attempts = 0;\n\n while (true) {\n attempts++;\n\n // Check timeout\n if (Date.now() - startTime > effectiveTimeout) {\n throw new Error(`Timeout waiting for run ${runId} after ${effectiveTimeout}ms`);\n }\n\n // Get run status\n const run = await this.getRun(runId);\n\n if (!run) {\n throw new Error(`Run ${runId} not found`);\n }\n\n // Check if run reached terminal state\n if (run.status === \"completed\") {\n return run.output as TOutput;\n } else if (run.status === \"failed\") {\n // Ensure error message is a string (handle cases where it might be an object)\n const errorMsg = run.error?.message ? ensureErrorMessage(run.error.message) : \"Run failed\";\n throw new Error(`Run ${runId} failed: ${errorMsg}`);\n } else if (run.status === \"cancelled\") {\n throw new Error(`Run ${runId} was cancelled`);\n }\n\n // Sleep before next poll\n await this.sleep(currentInterval);\n\n // Apply exponential backoff if enabled\n if (exponentialBackoff) {\n currentInterval = Math.min(currentInterval * 2, maxBackoff);\n }\n }\n }\n\n /**\n * List runs matching filters\n *\n * @param options - Filter options\n * @returns Array of run states\n */\n async listRuns(options: ListRunsOptions = {}): Promise<RunState[]> {\n const { workflowSlug, status, tags, limit } = options;\n\n // Convert status to array for backend (if provided)\n let statuses: RunState[\"status\"][] | undefined;\n if (status) {\n statuses = Array.isArray(status) ? status : [status];\n }\n\n return this.backend.listRuns({\n workflowSlug,\n status: statuses,\n tags,\n limit,\n });\n }\n\n /**\n * Cancel a run\n *\n * Can cancel runs in pending, claimed, or running status\n *\n * @param runId - The run to cancel\n * @param reason - Optional cancellation reason\n */\n async cancel(runId: string, reason?: string): Promise<void> {\n await this.backend.cancelRun(runId, reason);\n }\n\n /**\n * Check if the backend is ready to handle requests\n *\n * @returns true if healthy, false otherwise\n */\n async backendReady(): Promise<boolean> {\n return this.backend.backendReady();\n }\n\n /**\n * Rerun a workflow from a specific step\n *\n * Creates a new run that copies events from the parent run and re-executes\n * the specified step and all steps that depend on it.\n *\n * Uses queue-based execution: the new run is submitted to the queue with\n * copied events, and a worker will pick it up and continue execution.\n *\n * @param parentRunId - The run ID to rerun from\n * @param fromStepId - The step ID to rerun from\n * @param options - Optional rerun configuration\n * @returns New run ID. Use getRun() or waitForCompletion() to track progress.\n * @throws Error if parent run or step not found, or version mismatch\n *\n * @example\n * ```typescript\n * // Rerun from a specific step\n * const { runId } = await client.rerunFrom({\n * parentRunId: '1234567890',\n * fromStepId: 'process-data'\n * });\n *\n * // Wait for completion if needed\n * const output = await client.waitForCompletion(runId);\n * console.log(`Completed: ${runId}`, output);\n * ```\n */\n async rerunFrom(params: {\n parentRunId: string;\n fromStepId: string;\n input?: unknown;\n }): Promise<{\n runId: string;\n }> {\n // Delegate to backend implementation\n return await this.backend.rerunFrom(params);\n }\n\n /**\n * Retry a failed workflow\n *\n * Retries all failed steps in the workflow, keeping successful steps from the original run.\n * Step attempt numbers are reset to 1 for each retried step.\n *\n * @param runId - The run ID to retry\n * @param reason - Optional reason for retry\n * @returns Retry information including new workflow attempt number\n * @throws Error if run is not in failed status\n */\n async retry(\n runId: string,\n reason?: string\n ): Promise<{\n runId: string;\n workflowAttemptNumber: number;\n retriedSteps: string[];\n }> {\n // Get run state\n const runState = await this.backend.getRun(runId);\n if (!runState) {\n throw new Error(`Run ${runId} not found`);\n }\n\n // Verify run is failed\n if (runState.status !== \"failed\") {\n throw new Error(`Cannot retry run ${runId} - status is ${runState.status}, expected 'failed'`);\n }\n\n const workflowSlug = runState.workflowSlug;\n\n // Get failed steps\n const failedSteps = await this.backend.getFailedSteps(workflowSlug, runId);\n if (failedSteps.length === 0) {\n throw new Error(`No failed steps found in run ${runId}`);\n }\n\n // Calculate new workflow attempt number\n const previousAttemptNumber = runState.workflowAttemptNumber || 1;\n const workflowAttemptNumber = previousAttemptNumber + 1;\n\n const retriedStepIds = failedSteps.map((s) => s.stepId);\n\n // Emit WorkflowRetryStarted event\n await this.backend.saveWorkflowRetryStarted(workflowSlug, runId, {\n workflowAttemptNumber,\n previousAttemptNumber,\n retriedSteps: retriedStepIds,\n reason,\n });\n\n // Schedule each failed step for retry with fresh attempt number\n const now = Date.now() * 1000; // Convert to microseconds\n for (const step of failedSteps) {\n await this.backend.saveStepScheduled(workflowSlug, runId, step.stepId, {\n availableAt: now,\n reason: \"retry\",\n attemptNumber: 1, // Reset to 1 for workflow retry\n retryDelayMs: 0,\n });\n }\n\n return {\n runId,\n workflowAttemptNumber,\n retriedSteps: retriedStepIds,\n };\n }\n\n /**\n * List all available workflows\n *\n * @returns Array of workflow metadata\n */\n async listWorkflows(): Promise<WorkflowMetadata[]> {\n return this.backend.listWorkflowMetadata();\n }\n\n /**\n * Get metadata for a specific workflow\n *\n * @param workflowSlug - Workflow identifier (directory name)\n * @returns Workflow metadata or null if not found\n */\n async getWorkflowMetadata(workflowSlug: string): Promise<WorkflowMetadata | null> {\n return this.backend.getWorkflowMetadata(workflowSlug);\n }\n\n /**\n * Get step definitions for a specific workflow\n *\n * @param workflowSlug - Workflow identifier (directory name)\n * @returns Array of step definitions or empty array if workflow not found\n */\n async getWorkflowSteps(workflowSlug: string): Promise<any[]> {\n return this.backend.getWorkflowSteps(workflowSlug);\n }\n\n /**\n * Get the JSON Schema for a workflow's input\n *\n * @param workflowSlug - Workflow identifier (directory name)\n * @returns JSON Schema object or null if workflow has no input schema\n */\n async getWorkflowSchema(workflowSlug: string): Promise<any | null> {\n const metadata = await this.backend.getWorkflowMetadata(workflowSlug);\n return metadata?.inputSchemaJSON ?? null;\n }\n\n // ============================================================================\n // Version Management Methods\n // ============================================================================\n\n /**\n * Get a specific version of a workflow\n *\n * Workflow versions are immutable snapshots that include:\n * - Content hash (versionId)\n * - Step manifest (list of step IDs)\n * - Git information (if available)\n * - Creation timestamp\n *\n * @param workflowSlug - Workflow identifier (directory name)\n * @param versionId - Version identifier (content hash like \"sha256:abc123...\")\n * @returns Workflow version or null if not found\n *\n * @example\n * ```typescript\n * const version = await client.getWorkflowVersion('my-workflow', 'sha256:abc123...');\n * console.log(`Version has ${version.totalSteps} steps`);\n * console.log(`Git commit: ${version.git?.commit}`);\n * ```\n */\n async getWorkflowVersion(\n workflowSlug: string,\n versionId: string\n ): Promise<WorkflowVersion | null> {\n return this.backend.getWorkflowVersion(workflowSlug, versionId);\n }\n\n /**\n * Get the current (most recent) version of a workflow\n *\n * Returns the latest version that was captured when a workflow was executed.\n * Use this to compare against a specific run's version to detect if the\n * workflow has changed.\n *\n * @param workflowSlug - Workflow identifier (directory name)\n * @returns Current workflow version or null if no versions exist\n *\n * @example\n * ```typescript\n * const currentVersion = await client.getCurrentWorkflowVersion('my-workflow');\n * if (run.versionId !== currentVersion.versionId) {\n * console.log('Run used an outdated version');\n * }\n * ```\n */\n async getCurrentWorkflowVersion(workflowSlug: string): Promise<WorkflowVersion | null> {\n return this.backend.getCurrentWorkflowVersion(workflowSlug);\n }\n\n /**\n * List all versions for a workflow\n *\n * Returns versions in reverse chronological order (newest first).\n * Useful for version history views and analytics.\n *\n * @param workflowSlug - Workflow identifier (directory name)\n * @param options - Optional pagination (limit)\n * @returns Array of workflow versions\n *\n * @example\n * ```typescript\n * // Get all versions\n * const versions = await client.listWorkflowVersions('my-workflow');\n *\n * // Get last 10 versions\n * const recent = await client.listWorkflowVersions('my-workflow', { limit: 10 });\n * ```\n */\n async listWorkflowVersions(\n workflowSlug: string,\n options?: { limit?: number }\n ): Promise<WorkflowVersion[]> {\n return this.backend.listWorkflowVersions(workflowSlug, options);\n }\n\n /**\n * Helper to sleep\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n // ============================================================================\n // Analytics Methods\n // ============================================================================\n\n /**\n * Get error analysis for workflows and steps\n *\n * Analyzes failure patterns, error types, and common error messages.\n *\n * @param options - Optional filters for time range, workflow, or step\n * @returns Error analysis data\n *\n * @example\n * ```typescript\n * // Get errors for last 24 hours (default)\n * const errors = await client.getErrorAnalysis();\n *\n * // Get errors for specific workflow\n * const errors = await client.getErrorAnalysis({\n * workflowSlug: 'my-workflow',\n * startUs: Date.now() * 1000 - 7 * 24 * 60 * 60 * 1000 * 1000 // Last 7 days\n * });\n * ```\n */\n async getErrorAnalysis(options?: AnalyticsOptions): Promise<ErrorAnalysis> {\n return this.backend.getErrorAnalysis(options);\n }\n\n /**\n * Get retry analysis metrics\n *\n * Analyzes retry patterns, success rates after retries, and retry effectiveness.\n *\n * @param options - Optional filters for time range, workflow, or step\n * @returns Retry analysis data\n */\n async getRetryAnalysis(options?: AnalyticsOptions): Promise<RetryAnalysis> {\n return this.backend.getRetryAnalysis(options);\n }\n\n /**\n * Get scheduling latency metrics\n *\n * Measures time between step being scheduled and actually starting execution.\n * High latency indicates worker starvation or queue congestion.\n *\n * @param options - Optional filters for time range, workflow, or step\n * @returns Scheduling latency statistics\n *\n * @example\n * ```typescript\n * const latency = await client.getSchedulingLatency({ workflowSlug: 'my-workflow' });\n * console.log(`Average wait time: ${latency.averageUs / 1000}ms`);\n * console.log(`P95 wait time: ${latency.p95Us / 1000}ms`);\n * ```\n */\n async getSchedulingLatency(options?: AnalyticsOptions): Promise<SchedulingLatency> {\n return this.backend.getSchedulingLatency(options);\n }\n\n /**\n * Get step duration metrics\n *\n * Analyzes how long steps take to execute.\n *\n * @param options - Optional filters for time range, workflow, or step\n * @returns Step duration statistics\n */\n async getStepDuration(options?: AnalyticsOptions): Promise<StepDuration> {\n return this.backend.getStepDuration(options);\n }\n\n /**\n * Get workflow duration metrics\n *\n * Analyzes end-to-end workflow execution time (from submission to completion).\n *\n * @param options - Optional filters for time range or workflow\n * @returns Workflow duration statistics\n */\n async getWorkflowDuration(options?: AnalyticsOptions): Promise<WorkflowDuration> {\n return this.backend.getWorkflowDuration(options);\n }\n\n /**\n * Get worker stability metrics\n *\n * Analyzes worker crashes, reclamations, and stale heartbeats.\n *\n * @param options - Optional filters for time range\n * @returns Worker stability data\n */\n async getWorkerStability(options?: AnalyticsOptions): Promise<WorkerStability> {\n return this.backend.getWorkerStability(options);\n }\n\n /**\n * Get throughput metrics\n *\n * Analyzes how many runs/steps are being completed per unit time.\n *\n * @param options - Optional filters for time range or workflow\n * @returns Throughput data\n */\n async getThroughput(options?: AnalyticsOptions): Promise<Throughput> {\n return this.backend.getThroughput(options);\n }\n\n /**\n * Get current queue depth\n *\n * Real-time snapshot of pending/running runs and steps.\n *\n * @param options - Optional filter for workflow\n * @returns Queue depth data\n *\n * @example\n * ```typescript\n * const depth = await client.getQueueDepth();\n * console.log(`Pending runs: ${depth.pendingRuns}`);\n * console.log(`Scheduled steps: ${depth.scheduledSteps}`);\n * ```\n */\n async getQueueDepth(options?: Pick<AnalyticsOptions, \"workflowSlug\">): Promise<QueueDepth> {\n return this.backend.getQueueDepth(options);\n }\n\n /**\n * Get queue depth broken down by workflow\n *\n * Real-time snapshot showing per-workflow queue statistics.\n * Useful for identifying which workflows have pending work.\n *\n * @returns Array of per-workflow queue depth data\n *\n * @example\n * ```typescript\n * const breakdown = await client.getQueueDepthByWorkflow();\n * for (const workflow of breakdown) {\n * console.log(`${workflow.workflowName}: ${workflow.pendingRuns} pending, ${workflow.scheduledSteps} scheduled`);\n * }\n * ```\n */\n async getQueueDepthByWorkflow(): Promise<QueueDepthByWorkflow> {\n return this.backend.getQueueDepthByWorkflow();\n }\n\n /**\n * Get success/failure rate metrics\n *\n * Analyzes overall health of workflows and steps.\n *\n * @param options - Optional filters for time range, workflow, or step\n * @returns Success rate data\n */\n async getSuccessRate(options?: AnalyticsOptions): Promise<SuccessRate> {\n return this.backend.getSuccessRate(options);\n }\n\n /**\n * Get comprehensive analytics summary\n *\n * Combines all analytics metrics into a single response.\n * Useful for dashboard views.\n *\n * @param options - Optional filters for time range or workflow\n * @returns Complete analytics summary\n *\n * @example\n * ```typescript\n * // Get full analytics for last 24 hours\n * const summary = await client.getAnalyticsSummary();\n *\n * // Get analytics for specific workflow over last week\n * const summary = await client.getAnalyticsSummary({\n * workflowSlug: 'my-workflow',\n * startUs: Date.now() * 1000 - 7 * 24 * 60 * 60 * 1000 * 1000\n * });\n * ```\n */\n async getAnalyticsSummary(options?: AnalyticsOptions): Promise<AnalyticsSummary> {\n return this.backend.getAnalyticsSummary(options);\n }\n\n /**\n * Get paginated list of errors grouped by fingerprint\n *\n * @param options - Filtering and pagination options\n * @returns Paginated list of error groups\n *\n * @example\n * ```typescript\n * // Get errors for last 24h\n * const { errors, total } = await client.getErrorsList({\n * timeRange: { start: Date.now() * 1000 - 86400000000, end: Date.now() * 1000 },\n * groupingStrategy: 'exact',\n * limit: 50,\n * offset: 0\n * });\n * ```\n */\n async getErrorsList(options?: {\n timeRange?: { start: number; end: number };\n workflowSlug?: string;\n groupingStrategy?: 'exact' | 'normalized' | 'portable';\n limit?: number;\n offset?: number;\n }): Promise<{\n errors: Array<{\n fingerprint: string;\n errorMessage: string;\n errorName: string;\n sampleStack: string;\n count: number;\n affectedRuns: number;\n firstSeen: number;\n lastSeen: number;\n }>;\n total: number;\n }> {\n return this.backend.getErrorsList(options);\n }\n\n /**\n * Get detailed information about a specific error by fingerprint\n *\n * @param fingerprint - Composite fingerprint (nameHash:messageHash:stackHash)\n * @param groupingStrategy - Which stack hash variant to use\n * @param options - Filtering and pagination options\n * @returns Error details with all occurrences\n *\n * @example\n * ```typescript\n * const detail = await client.getErrorDetail(\n * 'abc123:def456:ghi789',\n * 'exact',\n * { limit: 100, offset: 0 }\n * );\n * ```\n */\n async getErrorDetail(\n fingerprint: string,\n groupingStrategy: 'exact' | 'normalized' | 'portable',\n options?: {\n timeRange?: { start: number; end: number };\n limit?: number;\n offset?: number;\n }\n ): Promise<{\n fingerprint: string;\n errorMessage: string;\n errorName: string;\n sampleStack: string;\n totalCount: number;\n affectedRuns: number;\n firstSeen: number;\n lastSeen: number;\n occurrences: Array<{\n workflowSlug: string;\n runId: string;\n stepId: string;\n attemptNumber: number;\n timestampUs: number;\n }>;\n total: number;\n }> {\n return this.backend.getErrorDetail(fingerprint, groupingStrategy, options);\n }\n\n /**\n * Get the state of all steps for a run\n * Projects step events to compute current state\n */\n async getStepStates(workflowSlug: string, runId: string): Promise<StepState[]> {\n const events = await this.backend.loadEvents(workflowSlug, runId, {\n category: 'step',\n });\n\n // Group events by step ID\n const stepGroups = new Map<string, StepEvent[]>();\n for (const event of events) {\n if (event.category === 'step') {\n if (!stepGroups.has(event.stepId)) {\n stepGroups.set(event.stepId, []);\n }\n stepGroups.get(event.stepId)!.push(event as StepEvent);\n }\n }\n\n // Project each step's state\n const states: StepState[] = [];\n for (const [stepId, stepEvents] of stepGroups) {\n try {\n const state = projectStepState(stepEvents, workflowSlug);\n states.push(state);\n } catch (err) {\n console.error(`Failed to project state for step ${stepId}:`, err);\n }\n }\n\n return states;\n }\n\n /**\n * Get all events for a specific run (both workflow and step events)\n */\n async getRunEvents(workflowSlug: string, runId: string) {\n return this.backend.loadEvents(workflowSlug, runId);\n }\n\n /**\n * Get detailed information for a specific step\n * Includes state, events, and logs\n */\n async getStepDetail(\n workflowSlug: string,\n runId: string,\n stepName: string\n ): Promise<{\n state: StepState;\n events: StepEvent[];\n logs: LogEntry[];\n attempts: AttemptMetadata[];\n } | null> {\n // Load all events for this specific step\n const events = await this.backend.loadEvents(workflowSlug, runId, {\n category: 'step',\n stepId: stepName,\n });\n\n // Filter to only step events\n const stepEvents = events.filter((e): e is StepEvent => e.category === 'step');\n\n if (stepEvents.length === 0) {\n return null;\n }\n\n // Project events to current state\n const state = projectStepState(stepEvents, workflowSlug);\n\n // Extract logs from events\n const logs = extractLogsFromEvents(stepEvents);\n\n // Extract attempt metadata\n const attempts = extractAttemptMetadata(stepEvents);\n\n return {\n state,\n events: stepEvents,\n logs,\n attempts,\n };\n }\n}\n\n// Export types\nexport type { PollOptions, ListRunsOptions, RunInfo } from \"./types.ts\";\nexport type {\n WorkflowVersion,\n AnalyticsOptions,\n ErrorAnalysis,\n RetryAnalysis,\n SchedulingLatency,\n StepDuration,\n WorkflowDuration,\n WorkerStability,\n Throughput,\n QueueDepth,\n QueueDepthByWorkflow,\n SuccessRate,\n AnalyticsSummary,\n} from \"@cascade-flow/backend-interface\";\n"
5
+ "import type {\n Backend,\n RunSubmission,\n RunState,\n WorkflowMetadata,\n WorkflowVersion,\n AnalyticsOptions,\n ErrorAnalysis,\n RetryAnalysis,\n SchedulingLatency,\n StepDuration,\n WorkflowDuration,\n WorkerStability,\n Throughput,\n QueueDepth,\n QueueDepthByWorkflow,\n SuccessRate,\n AnalyticsSummary,\n StepEvent,\n StepState,\n LogEntry,\n} from \"@cascade-flow/backend-interface\";\nimport {\n projectStepState,\n extractLogsFromEvents,\n extractAttemptMetadata,\n ensureErrorMessage,\n type AttemptMetadata,\n} from \"@cascade-flow/backend-interface\";\nimport type { PollOptions, ListRunsOptions, RunInfo } from \"./types.ts\";\n\n/**\n * WorkflowClient - submit and manage workflow runs via queue\n *\n * Features:\n * - Type-safe submission with generic input types\n * - Status checking and polling\n * - Wait for completion with timeout\n * - List and filter runs\n * - Cancellation support\n */\nexport class WorkflowClient {\n constructor(private backend: Backend) {}\n\n /**\n * Submit a workflow run to the queue\n *\n * Generic type TInput provides type safety for workflow input\n *\n * @example\n * ```typescript\n * import type { WorkflowInput } from './workflows/my-workflow/input-schema';\n *\n * const { runId } = await client.submit<WorkflowInput>({\n * workflow: 'my-workflow',\n * input: { userId: \"123\", count: 42 } // Fully typed!\n * });\n * ```\n */\n async submit<TInput = unknown>(params: {\n workflow: string;\n input?: TInput;\n runId?: string;\n availableAt?: number;\n priority?: number;\n timeout?: number;\n idempotencyKey?: string;\n metadata?: Record<string, unknown>;\n tags?: string[];\n }): Promise<{ runId: string; isNew: boolean }> {\n const submission: RunSubmission = {\n workflowSlug: params.workflow,\n input: params.input,\n runId: params.runId,\n availableAt: params.availableAt,\n priority: params.priority,\n timeout: params.timeout,\n idempotencyKey: params.idempotencyKey,\n metadata: params.metadata,\n tags: params.tags,\n };\n\n return this.backend.submitRun(submission);\n }\n\n /**\n * Get the current status of a run\n *\n * @param runId - The run ID to query\n * @returns Run state or null if not found\n */\n async getStatus(runId: string): Promise<RunState | null> {\n return this.backend.getRun(runId);\n }\n\n /**\n * Get detailed run information including output/error\n *\n * @param runId - The run ID to query\n * @returns Extended run info or null if not found\n */\n async getRun(runId: string): Promise<RunInfo | null> {\n const runState = await this.backend.getRun(runId);\n if (!runState) return null;\n\n const info: RunInfo = { ...runState };\n\n // Load output or error if run is completed/failed\n if (runState.status === \"completed\" || runState.status === \"failed\") {\n try {\n // Load workflow events to get output/error\n const events = await this.backend.loadEvents(runState.workflowSlug, runId, {\n category: \"workflow\",\n });\n\n // Find WorkflowCompleted or WorkflowFailed event\n for (const event of events) {\n if (event.category === \"workflow\") {\n if (event.type === \"WorkflowCompleted\") {\n info.output = JSON.parse(event.output);\n } else if (event.type === \"WorkflowFailed\") {\n info.error = event.error;\n }\n }\n }\n } catch (err) {\n // Failed to load output/error, return state only\n }\n }\n\n return info;\n }\n\n /**\n * Wait for a run to complete\n *\n * Polls the backend until the run reaches a terminal state (completed/failed/cancelled)\n *\n * @param runId - The run ID to wait for\n * @param options - Polling options\n * @returns Run info when complete\n * @throws Error if timeout or run fails\n */\n async waitForCompletion<TOutput = unknown>(\n runId: string,\n options: PollOptions = {}\n ): Promise<TOutput> {\n const {\n interval = 1000,\n maxAttempts = 60,\n timeout,\n exponentialBackoff = false,\n maxBackoff = 10000,\n } = options;\n\n const startTime = Date.now();\n const effectiveTimeout = timeout || maxAttempts * interval;\n\n let currentInterval = interval;\n let attempts = 0;\n\n while (true) {\n attempts++;\n\n // Check timeout\n if (Date.now() - startTime > effectiveTimeout) {\n throw new Error(`Timeout waiting for run ${runId} after ${effectiveTimeout}ms`);\n }\n\n // Get run status\n const run = await this.getRun(runId);\n\n if (!run) {\n throw new Error(`Run ${runId} not found`);\n }\n\n // Check if run reached terminal state\n if (run.status === \"completed\") {\n return run.output as TOutput;\n } else if (run.status === \"failed\") {\n // Ensure error message is a string (handle cases where it might be an object)\n const errorMsg = run.error?.message ? ensureErrorMessage(run.error.message) : \"Run failed\";\n throw new Error(`Run ${runId} failed: ${errorMsg}`);\n } else if (run.status === \"cancelled\") {\n throw new Error(`Run ${runId} was cancelled`);\n }\n\n // Sleep before next poll\n await this.sleep(currentInterval);\n\n // Apply exponential backoff if enabled\n if (exponentialBackoff) {\n currentInterval = Math.min(currentInterval * 2, maxBackoff);\n }\n }\n }\n\n /**\n * List runs matching filters\n *\n * @param options - Filter options\n * @returns Object with runs array and total count\n */\n async listRuns(options: ListRunsOptions = {}): Promise<{ runs: RunState[]; total: number }> {\n const { workflowSlug, status, tags, limit, offset } = options;\n\n // Convert status to array for backend (if provided)\n let statuses: RunState[\"status\"][] | undefined;\n if (status) {\n statuses = Array.isArray(status) ? status : [status];\n }\n\n return this.backend.listRuns({\n workflowSlug,\n status: statuses,\n tags,\n limit,\n offset,\n });\n }\n\n /**\n * Cancel a run\n *\n * Can cancel runs in pending, claimed, or running status\n *\n * @param runId - The run to cancel\n * @param reason - Optional cancellation reason\n */\n async cancel(runId: string, reason?: string): Promise<void> {\n await this.backend.cancelRun(runId, reason);\n }\n\n /**\n * Check if the backend is ready to handle requests\n *\n * @returns true if healthy, false otherwise\n */\n async backendReady(): Promise<boolean> {\n return this.backend.backendReady();\n }\n\n /**\n * Rerun a workflow from a specific step\n *\n * Creates a new run that copies events from the parent run and re-executes\n * the specified step and all steps that depend on it.\n *\n * Uses queue-based execution: the new run is submitted to the queue with\n * copied events, and a worker will pick it up and continue execution.\n *\n * @param parentRunId - The run ID to rerun from\n * @param fromStepId - The step ID to rerun from\n * @param options - Optional rerun configuration\n * @returns New run ID. Use getRun() or waitForCompletion() to track progress.\n * @throws Error if parent run or step not found, or version mismatch\n *\n * @example\n * ```typescript\n * // Rerun from a specific step\n * const { runId } = await client.rerunFrom({\n * parentRunId: '1234567890',\n * fromStepId: 'process-data'\n * });\n *\n * // Wait for completion if needed\n * const output = await client.waitForCompletion(runId);\n * console.log(`Completed: ${runId}`, output);\n * ```\n */\n async rerunFrom(params: {\n parentRunId: string;\n fromStepId: string;\n input?: unknown;\n }): Promise<{\n runId: string;\n }> {\n // Delegate to backend implementation\n return await this.backend.rerunFrom(params);\n }\n\n /**\n * Retry a failed workflow\n *\n * Retries all failed steps in the workflow, keeping successful steps from the original run.\n * Step attempt numbers are reset to 1 for each retried step.\n *\n * @param runId - The run ID to retry\n * @param reason - Optional reason for retry\n * @returns Retry information including new workflow attempt number\n * @throws Error if run is not in failed status\n */\n async retry(\n runId: string,\n reason?: string\n ): Promise<{\n runId: string;\n workflowAttemptNumber: number;\n retriedSteps: string[];\n }> {\n // Get run state\n const runState = await this.backend.getRun(runId);\n if (!runState) {\n throw new Error(`Run ${runId} not found`);\n }\n\n // Verify run is failed\n if (runState.status !== \"failed\") {\n throw new Error(`Cannot retry run ${runId} - status is ${runState.status}, expected 'failed'`);\n }\n\n const workflowSlug = runState.workflowSlug;\n\n // Get failed steps\n const failedSteps = await this.backend.getFailedSteps(workflowSlug, runId);\n if (failedSteps.length === 0) {\n throw new Error(`No failed steps found in run ${runId}`);\n }\n\n // Calculate new workflow attempt number\n const previousAttemptNumber = runState.workflowAttemptNumber || 1;\n const workflowAttemptNumber = previousAttemptNumber + 1;\n\n const retriedStepIds = failedSteps.map((s) => s.stepId);\n\n // Emit WorkflowRetryStarted event\n await this.backend.saveWorkflowRetryStarted(workflowSlug, runId, {\n workflowAttemptNumber,\n previousAttemptNumber,\n retriedSteps: retriedStepIds,\n reason,\n });\n\n // Schedule each failed step for retry with fresh attempt number\n const now = Date.now() * 1000; // Convert to microseconds\n for (const step of failedSteps) {\n await this.backend.saveStepScheduled(workflowSlug, runId, step.stepId, {\n availableAt: now,\n reason: \"retry\",\n attemptNumber: 1, // Reset to 1 for workflow retry\n retryDelayMs: 0,\n });\n }\n\n return {\n runId,\n workflowAttemptNumber,\n retriedSteps: retriedStepIds,\n };\n }\n\n /**\n * List all available workflows\n *\n * @returns Array of workflow metadata\n */\n async listWorkflows(): Promise<WorkflowMetadata[]> {\n return this.backend.listWorkflowMetadata();\n }\n\n /**\n * Get metadata for a specific workflow\n *\n * @param workflowSlug - Workflow identifier (directory name)\n * @returns Workflow metadata or null if not found\n */\n async getWorkflowMetadata(workflowSlug: string): Promise<WorkflowMetadata | null> {\n return this.backend.getWorkflowMetadata(workflowSlug);\n }\n\n /**\n * Get step definitions for a specific workflow\n *\n * @param workflowSlug - Workflow identifier (directory name)\n * @returns Array of step definitions or empty array if workflow not found\n */\n async getWorkflowSteps(workflowSlug: string): Promise<any[]> {\n return this.backend.getWorkflowSteps(workflowSlug);\n }\n\n /**\n * Get the JSON Schema for a workflow's input\n *\n * @param workflowSlug - Workflow identifier (directory name)\n * @returns JSON Schema object or null if workflow has no input schema\n */\n async getWorkflowSchema(workflowSlug: string): Promise<any | null> {\n const metadata = await this.backend.getWorkflowMetadata(workflowSlug);\n return metadata?.inputSchemaJSON ?? null;\n }\n\n // ============================================================================\n // Version Management Methods\n // ============================================================================\n\n /**\n * Get a specific version of a workflow\n *\n * Workflow versions are immutable snapshots that include:\n * - Content hash (versionId)\n * - Step manifest (list of step IDs)\n * - Git information (if available)\n * - Creation timestamp\n *\n * @param workflowSlug - Workflow identifier (directory name)\n * @param versionId - Version identifier (content hash like \"sha256:abc123...\")\n * @returns Workflow version or null if not found\n *\n * @example\n * ```typescript\n * const version = await client.getWorkflowVersion('my-workflow', 'sha256:abc123...');\n * console.log(`Version has ${version.totalSteps} steps`);\n * console.log(`Git commit: ${version.git?.commit}`);\n * ```\n */\n async getWorkflowVersion(\n workflowSlug: string,\n versionId: string\n ): Promise<WorkflowVersion | null> {\n return this.backend.getWorkflowVersion(workflowSlug, versionId);\n }\n\n /**\n * Get the current (most recent) version of a workflow\n *\n * Returns the latest version that was captured when a workflow was executed.\n * Use this to compare against a specific run's version to detect if the\n * workflow has changed.\n *\n * @param workflowSlug - Workflow identifier (directory name)\n * @returns Current workflow version or null if no versions exist\n *\n * @example\n * ```typescript\n * const currentVersion = await client.getCurrentWorkflowVersion('my-workflow');\n * if (run.versionId !== currentVersion.versionId) {\n * console.log('Run used an outdated version');\n * }\n * ```\n */\n async getCurrentWorkflowVersion(workflowSlug: string): Promise<WorkflowVersion | null> {\n return this.backend.getCurrentWorkflowVersion(workflowSlug);\n }\n\n /**\n * List all versions for a workflow\n *\n * Returns versions in reverse chronological order (newest first).\n * Useful for version history views and analytics.\n *\n * @param workflowSlug - Workflow identifier (directory name)\n * @param options - Optional pagination (limit)\n * @returns Array of workflow versions\n *\n * @example\n * ```typescript\n * // Get all versions\n * const versions = await client.listWorkflowVersions('my-workflow');\n *\n * // Get last 10 versions\n * const recent = await client.listWorkflowVersions('my-workflow', { limit: 10 });\n * ```\n */\n async listWorkflowVersions(\n workflowSlug: string,\n options?: { limit?: number }\n ): Promise<WorkflowVersion[]> {\n return this.backend.listWorkflowVersions(workflowSlug, options);\n }\n\n /**\n * Helper to sleep\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n // ============================================================================\n // Analytics Methods\n // ============================================================================\n\n /**\n * Get error analysis for workflows and steps\n *\n * Analyzes failure patterns, error types, and common error messages.\n *\n * @param options - Optional filters for time range, workflow, or step\n * @returns Error analysis data\n *\n * @example\n * ```typescript\n * // Get errors for last 24 hours (default)\n * const errors = await client.getErrorAnalysis();\n *\n * // Get errors for specific workflow\n * const errors = await client.getErrorAnalysis({\n * workflowSlug: 'my-workflow',\n * startUs: Date.now() * 1000 - 7 * 24 * 60 * 60 * 1000 * 1000 // Last 7 days\n * });\n * ```\n */\n async getErrorAnalysis(options?: AnalyticsOptions): Promise<ErrorAnalysis> {\n return this.backend.getErrorAnalysis(options);\n }\n\n /**\n * Get retry analysis metrics\n *\n * Analyzes retry patterns, success rates after retries, and retry effectiveness.\n *\n * @param options - Optional filters for time range, workflow, or step\n * @returns Retry analysis data\n */\n async getRetryAnalysis(options?: AnalyticsOptions): Promise<RetryAnalysis> {\n return this.backend.getRetryAnalysis(options);\n }\n\n /**\n * Get scheduling latency metrics\n *\n * Measures time between step being scheduled and actually starting execution.\n * High latency indicates worker starvation or queue congestion.\n *\n * @param options - Optional filters for time range, workflow, or step\n * @returns Scheduling latency statistics\n *\n * @example\n * ```typescript\n * const latency = await client.getSchedulingLatency({ workflowSlug: 'my-workflow' });\n * console.log(`Average wait time: ${latency.averageUs / 1000}ms`);\n * console.log(`P95 wait time: ${latency.p95Us / 1000}ms`);\n * ```\n */\n async getSchedulingLatency(options?: AnalyticsOptions): Promise<SchedulingLatency> {\n return this.backend.getSchedulingLatency(options);\n }\n\n /**\n * Get step duration metrics\n *\n * Analyzes how long steps take to execute.\n *\n * @param options - Optional filters for time range, workflow, or step\n * @returns Step duration statistics\n */\n async getStepDuration(options?: AnalyticsOptions): Promise<StepDuration> {\n return this.backend.getStepDuration(options);\n }\n\n /**\n * Get workflow duration metrics\n *\n * Analyzes end-to-end workflow execution time (from submission to completion).\n *\n * @param options - Optional filters for time range or workflow\n * @returns Workflow duration statistics\n */\n async getWorkflowDuration(options?: AnalyticsOptions): Promise<WorkflowDuration> {\n return this.backend.getWorkflowDuration(options);\n }\n\n /**\n * Get worker stability metrics\n *\n * Analyzes worker crashes, reclamations, and stale heartbeats.\n *\n * @param options - Optional filters for time range\n * @returns Worker stability data\n */\n async getWorkerStability(options?: AnalyticsOptions): Promise<WorkerStability> {\n return this.backend.getWorkerStability(options);\n }\n\n /**\n * Get throughput metrics\n *\n * Analyzes how many runs/steps are being completed per unit time.\n *\n * @param options - Optional filters for time range or workflow\n * @returns Throughput data\n */\n async getThroughput(options?: AnalyticsOptions): Promise<Throughput> {\n return this.backend.getThroughput(options);\n }\n\n /**\n * Get current queue depth\n *\n * Real-time snapshot of pending/running runs and steps.\n *\n * @param options - Optional filter for workflow\n * @returns Queue depth data\n *\n * @example\n * ```typescript\n * const depth = await client.getQueueDepth();\n * console.log(`Pending runs: ${depth.pendingRuns}`);\n * console.log(`Scheduled steps: ${depth.scheduledSteps}`);\n * ```\n */\n async getQueueDepth(options?: Pick<AnalyticsOptions, \"workflowSlug\">): Promise<QueueDepth> {\n return this.backend.getQueueDepth(options);\n }\n\n /**\n * Get queue depth broken down by workflow\n *\n * Real-time snapshot showing per-workflow queue statistics.\n * Useful for identifying which workflows have pending work.\n *\n * @returns Array of per-workflow queue depth data\n *\n * @example\n * ```typescript\n * const breakdown = await client.getQueueDepthByWorkflow();\n * for (const workflow of breakdown) {\n * console.log(`${workflow.workflowName}: ${workflow.pendingRuns} pending, ${workflow.scheduledSteps} scheduled`);\n * }\n * ```\n */\n async getQueueDepthByWorkflow(): Promise<QueueDepthByWorkflow> {\n return this.backend.getQueueDepthByWorkflow();\n }\n\n /**\n * Get success/failure rate metrics\n *\n * Analyzes overall health of workflows and steps.\n *\n * @param options - Optional filters for time range, workflow, or step\n * @returns Success rate data\n */\n async getSuccessRate(options?: AnalyticsOptions): Promise<SuccessRate> {\n return this.backend.getSuccessRate(options);\n }\n\n /**\n * Get comprehensive analytics summary\n *\n * Combines all analytics metrics into a single response.\n * Useful for dashboard views.\n *\n * @param options - Optional filters for time range or workflow\n * @returns Complete analytics summary\n *\n * @example\n * ```typescript\n * // Get full analytics for last 24 hours\n * const summary = await client.getAnalyticsSummary();\n *\n * // Get analytics for specific workflow over last week\n * const summary = await client.getAnalyticsSummary({\n * workflowSlug: 'my-workflow',\n * startUs: Date.now() * 1000 - 7 * 24 * 60 * 60 * 1000 * 1000\n * });\n * ```\n */\n async getAnalyticsSummary(options?: AnalyticsOptions): Promise<AnalyticsSummary> {\n return this.backend.getAnalyticsSummary(options);\n }\n\n /**\n * Get paginated list of errors grouped by fingerprint\n *\n * @param options - Filtering and pagination options\n * @returns Paginated list of error groups\n *\n * @example\n * ```typescript\n * // Get errors for last 24h\n * const { errors, total } = await client.getErrorsList({\n * timeRange: { start: Date.now() * 1000 - 86400000000, end: Date.now() * 1000 },\n * groupingStrategy: 'exact',\n * limit: 50,\n * offset: 0\n * });\n * ```\n */\n async getErrorsList(options?: {\n timeRange?: { start: number; end: number };\n workflowSlug?: string;\n groupingStrategy?: 'exact' | 'normalized' | 'portable';\n limit?: number;\n offset?: number;\n }): Promise<{\n errors: Array<{\n fingerprint: string;\n errorMessage: string;\n errorName: string;\n sampleStack: string;\n count: number;\n affectedRuns: number;\n firstSeen: number;\n lastSeen: number;\n }>;\n total: number;\n }> {\n return this.backend.getErrorsList(options);\n }\n\n /**\n * Get detailed information about a specific error by fingerprint\n *\n * @param fingerprint - Composite fingerprint (nameHash:messageHash:stackHash)\n * @param groupingStrategy - Which stack hash variant to use\n * @param options - Filtering and pagination options\n * @returns Error details with all occurrences\n *\n * @example\n * ```typescript\n * const detail = await client.getErrorDetail(\n * 'abc123:def456:ghi789',\n * 'exact',\n * { limit: 100, offset: 0 }\n * );\n * ```\n */\n async getErrorDetail(\n fingerprint: string,\n groupingStrategy: 'exact' | 'normalized' | 'portable',\n options?: {\n timeRange?: { start: number; end: number };\n limit?: number;\n offset?: number;\n }\n ): Promise<{\n fingerprint: string;\n errorMessage: string;\n errorName: string;\n sampleStack: string;\n totalCount: number;\n affectedRuns: number;\n firstSeen: number;\n lastSeen: number;\n occurrences: Array<{\n workflowSlug: string;\n runId: string;\n stepId: string;\n attemptNumber: number;\n timestampUs: number;\n }>;\n total: number;\n }> {\n return this.backend.getErrorDetail(fingerprint, groupingStrategy, options);\n }\n\n /**\n * Get the state of all steps for a run\n * Projects step events to compute current state\n */\n async getStepStates(workflowSlug: string, runId: string): Promise<StepState[]> {\n const events = await this.backend.loadEvents(workflowSlug, runId, {\n category: 'step',\n });\n\n // Group events by step ID\n const stepGroups = new Map<string, StepEvent[]>();\n for (const event of events) {\n if (event.category === 'step') {\n if (!stepGroups.has(event.stepId)) {\n stepGroups.set(event.stepId, []);\n }\n stepGroups.get(event.stepId)!.push(event as StepEvent);\n }\n }\n\n // Project each step's state\n const states: StepState[] = [];\n for (const [stepId, stepEvents] of stepGroups) {\n try {\n const state = projectStepState(stepEvents, workflowSlug);\n states.push(state);\n } catch (err) {\n console.error(`Failed to project state for step ${stepId}:`, err);\n }\n }\n\n return states;\n }\n\n /**\n * Get all events for a specific run (both workflow and step events)\n */\n async getRunEvents(workflowSlug: string, runId: string) {\n return this.backend.loadEvents(workflowSlug, runId);\n }\n\n /**\n * Get detailed information for a specific step\n * Includes state, events, and logs\n */\n async getStepDetail(\n workflowSlug: string,\n runId: string,\n stepName: string\n ): Promise<{\n state: StepState;\n events: StepEvent[];\n logs: LogEntry[];\n attempts: AttemptMetadata[];\n } | null> {\n // Load all events for this specific step\n const events = await this.backend.loadEvents(workflowSlug, runId, {\n category: 'step',\n stepId: stepName,\n });\n\n // Filter to only step events\n const stepEvents = events.filter((e): e is StepEvent => e.category === 'step');\n\n if (stepEvents.length === 0) {\n return null;\n }\n\n // Project events to current state\n const state = projectStepState(stepEvents, workflowSlug);\n\n // Extract logs from events\n const logs = extractLogsFromEvents(stepEvents);\n\n // Extract attempt metadata\n const attempts = extractAttemptMetadata(stepEvents);\n\n return {\n state,\n events: stepEvents,\n logs,\n attempts,\n };\n }\n}\n\n// Export types\nexport type { PollOptions, ListRunsOptions, RunInfo } from \"./types.ts\";\nexport type {\n WorkflowVersion,\n AnalyticsOptions,\n ErrorAnalysis,\n RetryAnalysis,\n SchedulingLatency,\n StepDuration,\n WorkflowDuration,\n WorkerStability,\n Throughput,\n QueueDepth,\n QueueDepthByWorkflow,\n SuccessRate,\n AnalyticsSummary,\n} from \"@cascade-flow/backend-interface\";\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "628D808957162DFD64756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "D46F5515640C50DE64756E2164756E21",
9
9
  "names": []
10
10
  }
package/dist/types.d.ts CHANGED
@@ -26,6 +26,8 @@ export type ListRunsOptions = {
26
26
  tags?: string[];
27
27
  /** Limit results */
28
28
  limit?: number;
29
+ /** Number of runs to skip for pagination */
30
+ offset?: number;
29
31
  };
30
32
  /**
31
33
  * Extended run information with output and version
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,iCAAiC,CAAC;AAE/E;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,+CAA+C;IAC/C,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IAEnD,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG;IAC/B,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,iCAAiC,CAAC;AAE/E;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,+CAA+C;IAC/C,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IAEnD,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG;IAC/B,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cascade-flow/client",
3
- "version": "0.2.8",
3
+ "version": "0.2.17",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -18,7 +18,7 @@
18
18
  "test": "bun test"
19
19
  },
20
20
  "dependencies": {
21
- "@cascade-flow/backend-interface": "0.2.6",
21
+ "@cascade-flow/backend-interface": "0.2.8",
22
22
  "zod": "^4.1.12"
23
23
  },
24
24
  "devDependencies": {