yaml-flow 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +380 -0
- package/dist/core/index.cjs +557 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +102 -0
- package/dist/core/index.d.ts +102 -0
- package/dist/core/index.js +549 -0
- package/dist/core/index.js.map +1 -0
- package/dist/index.cjs +742 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +731 -0
- package/dist/index.js.map +1 -0
- package/dist/stores/file.cjs +115 -0
- package/dist/stores/file.cjs.map +1 -0
- package/dist/stores/file.d.cts +36 -0
- package/dist/stores/file.d.ts +36 -0
- package/dist/stores/file.js +113 -0
- package/dist/stores/file.js.map +1 -0
- package/dist/stores/localStorage.cjs +77 -0
- package/dist/stores/localStorage.cjs.map +1 -0
- package/dist/stores/localStorage.d.cts +34 -0
- package/dist/stores/localStorage.d.ts +34 -0
- package/dist/stores/localStorage.js +75 -0
- package/dist/stores/localStorage.js.map +1 -0
- package/dist/stores/memory.cjs +48 -0
- package/dist/stores/memory.cjs.map +1 -0
- package/dist/stores/memory.d.cts +27 -0
- package/dist/stores/memory.d.ts +27 -0
- package/dist/stores/memory.js +46 -0
- package/dist/stores/memory.js.map +1 -0
- package/dist/types-BoWndaAJ.d.cts +237 -0
- package/dist/types-BoWndaAJ.d.ts +237 -0
- package/package.json +83 -0
- package/schema/flow.schema.json +159 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/stores/memory.ts","../src/core/engine.ts","../src/core/loader.ts","../src/stores/localStorage.ts","../src/stores/file.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * yaml-flow - Memory Store\n * \n * In-memory store implementation. Works in both browser and Node.js.\n * Data is lost when the process exits - use for testing or short-lived flows.\n */\n\nimport type { FlowStore, RunState } from '../core/types.js';\n\nexport class MemoryStore implements FlowStore {\n private runs: Map<string, RunState> = new Map();\n private data: Map<string, Record<string, unknown>> = new Map();\n\n async saveRunState(runId: string, state: RunState): Promise<void> {\n this.runs.set(runId, { ...state });\n }\n\n async loadRunState(runId: string): Promise<RunState | null> {\n const state = this.runs.get(runId);\n return state ? { ...state } : null;\n }\n\n async deleteRunState(runId: string): Promise<void> {\n this.runs.delete(runId);\n this.data.delete(runId);\n }\n\n async setData(runId: string, key: string, value: unknown): Promise<void> {\n if (!this.data.has(runId)) {\n this.data.set(runId, {});\n }\n const runData = this.data.get(runId)!;\n runData[key] = value;\n }\n\n async getData(runId: string, key: string): Promise<unknown> {\n return this.data.get(runId)?.[key];\n }\n\n async getAllData(runId: string): Promise<Record<string, unknown>> {\n return { ...(this.data.get(runId) ?? {}) };\n }\n\n async clearData(runId: string): Promise<void> {\n this.data.delete(runId);\n }\n\n async listRuns(): Promise<string[]> {\n return Array.from(this.runs.keys());\n }\n\n /**\n * Clear all data (useful for testing)\n */\n clear(): void {\n this.runs.clear();\n this.data.clear();\n }\n}\n","/**\n * yaml-flow - Core Flow Engine\n * \n * Isomorphic workflow engine that executes declarative flows.\n * Works in both browser and Node.js environments.\n */\n\nimport type {\n FlowConfig,\n FlowStore,\n FlowResult,\n StepHandler,\n StepContext,\n StepResult,\n EngineOptions,\n RunState,\n FlowEvent,\n FlowEventListener,\n FlowEventType,\n} from './types.js';\nimport { MemoryStore } from '../stores/memory.js';\n\n/**\n * Generate a unique run ID\n */\nfunction generateRunId(): string {\n // Use crypto.randomUUID if available (modern browsers + Node 19+)\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n // Fallback for older environments\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * FlowEngine - The main workflow execution engine\n */\nexport class FlowEngine {\n private flow: FlowConfig;\n private handlers: Map<string, StepHandler>;\n private store: FlowStore;\n private components: Record<string, unknown>;\n private options: EngineOptions;\n private listeners: Map<FlowEventType, Set<FlowEventListener>> = new Map();\n private aborted: boolean = false;\n\n constructor(\n flow: FlowConfig,\n handlers: Record<string, StepHandler>,\n options: EngineOptions = {}\n ) {\n this.flow = flow;\n this.handlers = new Map(Object.entries(handlers));\n this.store = options.store ?? new MemoryStore();\n this.components = options.components ?? {};\n this.options = options;\n\n // Wire up abort signal\n if (options.signal) {\n options.signal.addEventListener('abort', () => {\n this.aborted = true;\n });\n }\n\n // Validate flow configuration\n this.validateFlow();\n }\n\n /**\n * Validate the flow configuration\n */\n private validateFlow(): void {\n const { settings, steps, terminal_states } = this.flow;\n\n if (!settings?.start_step) {\n throw new Error('Flow must have settings.start_step defined');\n }\n\n if (!steps || Object.keys(steps).length === 0) {\n throw new Error('Flow must have at least one step defined');\n }\n\n if (!terminal_states || Object.keys(terminal_states).length === 0) {\n throw new Error('Flow must have at least one terminal_state defined');\n }\n\n // Check start step exists\n if (!steps[settings.start_step] && !terminal_states[settings.start_step]) {\n throw new Error(`Start step \"${settings.start_step}\" not found in steps or terminal_states`);\n }\n\n // Validate all transitions point to valid steps\n for (const [stepName, stepConfig] of Object.entries(steps)) {\n for (const [result, target] of Object.entries(stepConfig.transitions)) {\n if (!steps[target] && !terminal_states[target]) {\n throw new Error(\n `Step \"${stepName}\" transition \"${result}\" points to unknown step \"${target}\"`\n );\n }\n }\n }\n }\n\n /**\n * Run the flow from the start\n */\n async run(initialData?: Record<string, unknown>): Promise<FlowResult> {\n const runId = generateRunId();\n const startedAt = Date.now();\n\n // Initialize run state\n const runState: RunState = {\n runId,\n flowId: this.flow.id ?? 'unnamed',\n currentStep: this.flow.settings.start_step,\n status: 'running',\n stepHistory: [],\n iterationCounts: {},\n retryCounts: {},\n startedAt,\n updatedAt: startedAt,\n };\n\n await this.store.saveRunState(runId, runState);\n\n // Store initial data\n if (initialData) {\n for (const [key, value] of Object.entries(initialData)) {\n await this.store.setData(runId, key, value);\n }\n }\n\n this.emit({\n type: 'flow:start',\n runId,\n timestamp: startedAt,\n data: { initialData },\n });\n\n try {\n return await this.executeLoop(runId, runState, startedAt);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n \n this.emit({\n type: 'flow:error',\n runId,\n timestamp: Date.now(),\n data: { error: err.message },\n });\n\n this.options.onError?.(err);\n\n // Update state to failed\n runState.status = 'failed';\n runState.updatedAt = Date.now();\n await this.store.saveRunState(runId, runState);\n\n return {\n runId,\n status: 'failed',\n data: await this.store.getAllData(runId),\n finalStep: runState.currentStep,\n stepHistory: runState.stepHistory,\n durationMs: Date.now() - startedAt,\n error: err,\n };\n }\n }\n\n /**\n * Resume a paused or interrupted flow\n */\n async resume(runId: string): Promise<FlowResult> {\n const runState = await this.store.loadRunState(runId);\n \n if (!runState) {\n throw new Error(`No run found with ID: ${runId}`);\n }\n\n if (runState.status === 'completed' || runState.status === 'failed') {\n throw new Error(`Cannot resume a ${runState.status} run`);\n }\n\n const startedAt = runState.startedAt;\n runState.status = 'running';\n runState.pausedAt = undefined;\n runState.updatedAt = Date.now();\n await this.store.saveRunState(runId, runState);\n\n this.emit({\n type: 'flow:resumed',\n runId,\n timestamp: Date.now(),\n data: { currentStep: runState.currentStep },\n });\n\n return this.executeLoop(runId, runState, startedAt);\n }\n\n /**\n * Pause a running flow\n */\n async pause(runId: string): Promise<void> {\n const runState = await this.store.loadRunState(runId);\n \n if (!runState) {\n throw new Error(`No run found with ID: ${runId}`);\n }\n\n runState.status = 'paused';\n runState.pausedAt = Date.now();\n runState.updatedAt = Date.now();\n await this.store.saveRunState(runId, runState);\n\n this.emit({\n type: 'flow:paused',\n runId,\n timestamp: Date.now(),\n data: { currentStep: runState.currentStep },\n });\n }\n\n /**\n * Main execution loop\n */\n private async executeLoop(\n runId: string,\n runState: RunState,\n startedAt: number\n ): Promise<FlowResult> {\n const maxSteps = this.flow.settings.max_total_steps ?? 100;\n const timeoutMs = this.flow.settings.timeout_ms;\n let iterations = 0;\n\n while (iterations < maxSteps) {\n // Check for abort\n if (this.aborted) {\n runState.status = 'cancelled';\n runState.updatedAt = Date.now();\n await this.store.saveRunState(runId, runState);\n\n return {\n runId,\n status: 'cancelled',\n data: await this.store.getAllData(runId),\n finalStep: runState.currentStep,\n stepHistory: runState.stepHistory,\n durationMs: Date.now() - startedAt,\n };\n }\n\n // Check for timeout\n if (timeoutMs && Date.now() - startedAt > timeoutMs) {\n runState.status = 'completed';\n runState.updatedAt = Date.now();\n await this.store.saveRunState(runId, runState);\n\n return {\n runId,\n status: 'timeout',\n intent: 'timeout',\n data: await this.store.getAllData(runId),\n finalStep: runState.currentStep,\n stepHistory: runState.stepHistory,\n durationMs: Date.now() - startedAt,\n };\n }\n\n const currentStep = runState.currentStep;\n\n // Check if we're at a terminal state\n const terminalState = this.flow.terminal_states[currentStep];\n if (terminalState) {\n runState.status = 'completed';\n runState.updatedAt = Date.now();\n await this.store.saveRunState(runId, runState);\n\n const allData = await this.store.getAllData(runId);\n const returnData = this.extractReturnData(terminalState.return_artifacts, allData);\n\n const result: FlowResult = {\n runId,\n status: 'completed',\n intent: terminalState.return_intent,\n data: returnData,\n finalStep: currentStep,\n stepHistory: runState.stepHistory,\n durationMs: Date.now() - startedAt,\n };\n\n this.emit({\n type: 'flow:complete',\n runId,\n timestamp: Date.now(),\n data: { ...result },\n });\n\n this.options.onComplete?.(result);\n\n return result;\n }\n\n // Get step configuration\n const stepConfig = this.flow.steps[currentStep];\n if (!stepConfig) {\n throw new Error(`Step \"${currentStep}\" not found in flow configuration`);\n }\n\n // Check circuit breaker\n if (stepConfig.circuit_breaker) {\n const count = runState.iterationCounts[currentStep] ?? 0;\n if (count >= stepConfig.circuit_breaker.max_iterations) {\n runState.currentStep = stepConfig.circuit_breaker.on_open;\n runState.updatedAt = Date.now();\n await this.store.saveRunState(runId, runState);\n iterations++;\n continue;\n }\n }\n\n // Update iteration count\n runState.iterationCounts[currentStep] = (runState.iterationCounts[currentStep] ?? 0) + 1;\n\n // Execute the step\n const stepResult = await this.executeStep(runId, currentStep, stepConfig);\n\n // Handle retry logic\n if (stepResult.result === 'failure' && stepConfig.retry) {\n const retryCount = runState.retryCounts[currentStep] ?? 0;\n if (retryCount < stepConfig.retry.max_attempts) {\n runState.retryCounts[currentStep] = retryCount + 1;\n \n // Apply delay if configured\n if (stepConfig.retry.delay_ms) {\n const delay = stepConfig.retry.backoff_multiplier\n ? stepConfig.retry.delay_ms * Math.pow(stepConfig.retry.backoff_multiplier, retryCount)\n : stepConfig.retry.delay_ms;\n await this.sleep(delay);\n }\n \n // Retry same step\n iterations++;\n continue;\n }\n }\n\n // Find transition\n const nextStep = stepConfig.transitions[stepResult.result];\n if (!nextStep) {\n throw new Error(\n `No transition defined for result \"${stepResult.result}\" in step \"${currentStep}\"`\n );\n }\n\n // Update state\n runState.stepHistory.push(currentStep);\n runState.currentStep = nextStep;\n runState.updatedAt = Date.now();\n // Reset retry count when moving to new step\n runState.retryCounts[currentStep] = 0;\n await this.store.saveRunState(runId, runState);\n\n this.emit({\n type: 'transition',\n runId,\n timestamp: Date.now(),\n data: { from: currentStep, to: nextStep, result: stepResult.result },\n });\n\n this.options.onTransition?.(currentStep, nextStep);\n\n iterations++;\n }\n\n // Max iterations reached\n runState.status = 'completed';\n runState.updatedAt = Date.now();\n await this.store.saveRunState(runId, runState);\n\n return {\n runId,\n status: 'max_iterations',\n intent: 'max_iterations',\n data: await this.store.getAllData(runId),\n finalStep: runState.currentStep,\n stepHistory: runState.stepHistory,\n durationMs: Date.now() - startedAt,\n };\n }\n\n /**\n * Execute a single step\n */\n private async executeStep(\n runId: string,\n stepName: string,\n stepConfig: FlowConfig['steps'][string]\n ): Promise<StepResult> {\n // Find handler\n const handler = this.handlers.get(stepName);\n if (!handler) {\n throw new Error(`No handler registered for step \"${stepName}\"`);\n }\n\n // Build input from expected data\n const allData = await this.store.getAllData(runId);\n const input: Record<string, unknown> = {};\n \n if (stepConfig.expects_data) {\n for (const key of stepConfig.expects_data) {\n input[key] = allData[key];\n }\n } else {\n // If no expects_data, pass all data\n Object.assign(input, allData);\n }\n\n // Build context\n const context: StepContext = {\n runId,\n stepName,\n components: this.components,\n store: this.store,\n signal: this.options.signal,\n emit: (event: string, data: unknown) => {\n this.emit({\n type: 'step:complete' as FlowEventType, // Custom events map to step:complete\n runId,\n timestamp: Date.now(),\n data: { event, payload: data },\n });\n },\n };\n\n this.emit({\n type: 'step:start',\n runId,\n timestamp: Date.now(),\n data: { step: stepName, input },\n });\n\n try {\n // Execute handler\n const result = await handler(input, context);\n\n // Store produced data\n if (result.data) {\n for (const [key, value] of Object.entries(result.data)) {\n await this.store.setData(runId, key, value);\n }\n }\n\n this.emit({\n type: 'step:complete',\n runId,\n timestamp: Date.now(),\n data: { step: stepName, result: result.result, outputKeys: Object.keys(result.data ?? {}) },\n });\n\n this.options.onStep?.(stepName, result);\n\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n \n this.emit({\n type: 'step:error',\n runId,\n timestamp: Date.now(),\n data: { step: stepName, error: err.message },\n });\n\n // Return failure result for retry handling\n return { result: 'failure', data: { error: err.message } };\n }\n }\n\n /**\n * Extract data to return based on return_artifacts configuration\n */\n private extractReturnData(\n returnArtifacts: string | string[] | false | undefined,\n allData: Record<string, unknown>\n ): Record<string, unknown> {\n if (returnArtifacts === false || returnArtifacts === undefined) {\n return {};\n }\n\n if (typeof returnArtifacts === 'string') {\n return { [returnArtifacts]: allData[returnArtifacts] };\n }\n\n if (Array.isArray(returnArtifacts)) {\n const result: Record<string, unknown> = {};\n for (const key of returnArtifacts) {\n result[key] = allData[key];\n }\n return result;\n }\n\n return allData;\n }\n\n /**\n * Sleep helper\n */\n private sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n /**\n * Subscribe to flow events\n */\n on(type: FlowEventType, listener: FlowEventListener): () => void {\n if (!this.listeners.has(type)) {\n this.listeners.set(type, new Set());\n }\n this.listeners.get(type)!.add(listener);\n\n // Return unsubscribe function\n return () => {\n this.listeners.get(type)?.delete(listener);\n };\n }\n\n /**\n * Emit an event\n */\n private emit(event: FlowEvent): void {\n const typeListeners = this.listeners.get(event.type);\n if (typeListeners) {\n for (const listener of typeListeners) {\n try {\n listener(event);\n } catch {\n // Ignore listener errors\n }\n }\n }\n }\n\n /**\n * Get the current store instance\n */\n getStore(): FlowStore {\n return this.store;\n }\n}\n\n/**\n * Create a flow engine instance\n */\nexport function createEngine(\n flow: FlowConfig,\n handlers: Record<string, StepHandler>,\n options?: EngineOptions\n): FlowEngine {\n return new FlowEngine(flow, handlers, options);\n}\n","/**\n * yaml-flow - Flow Loader\n * \n * Utilities for loading and validating flow configurations.\n */\n\nimport type { FlowConfig } from './types.js';\n\n/**\n * Parse YAML string to FlowConfig\n * Requires 'yaml' package to be installed\n */\nexport async function parseYaml(yamlString: string): Promise<FlowConfig> {\n const yaml = await import('yaml');\n return yaml.parse(yamlString) as FlowConfig;\n}\n\n/**\n * Load flow from a URL (browser-friendly)\n */\nexport async function loadFlowFromUrl(url: string): Promise<FlowConfig> {\n const response = await fetch(url);\n \n if (!response.ok) {\n throw new Error(`Failed to load flow from ${url}: ${response.statusText}`);\n }\n\n const contentType = response.headers.get('content-type') ?? '';\n const text = await response.text();\n\n if (contentType.includes('json') || url.endsWith('.json')) {\n return JSON.parse(text) as FlowConfig;\n }\n\n // Assume YAML\n return parseYaml(text);\n}\n\n/**\n * Load flow from file path (Node.js only)\n */\nexport async function loadFlowFromFile(filePath: string): Promise<FlowConfig> {\n const fs = await import('fs/promises');\n const text = await fs.readFile(filePath, 'utf-8');\n\n if (filePath.endsWith('.json')) {\n return JSON.parse(text) as FlowConfig;\n }\n\n // Assume YAML\n return parseYaml(text);\n}\n\n/**\n * Validate a flow configuration\n * Returns array of validation errors (empty if valid)\n */\nexport function validateFlowConfig(flow: unknown): string[] {\n const errors: string[] = [];\n\n if (!flow || typeof flow !== 'object') {\n return ['Flow must be an object'];\n }\n\n const f = flow as Record<string, unknown>;\n\n // Check settings\n if (!f.settings || typeof f.settings !== 'object') {\n errors.push('Flow must have a \"settings\" object');\n } else {\n const settings = f.settings as Record<string, unknown>;\n if (typeof settings.start_step !== 'string') {\n errors.push('settings.start_step must be a string');\n }\n if (settings.max_total_steps !== undefined && typeof settings.max_total_steps !== 'number') {\n errors.push('settings.max_total_steps must be a number');\n }\n if (settings.timeout_ms !== undefined && typeof settings.timeout_ms !== 'number') {\n errors.push('settings.timeout_ms must be a number');\n }\n }\n\n // Check steps\n if (!f.steps || typeof f.steps !== 'object') {\n errors.push('Flow must have a \"steps\" object');\n } else {\n const steps = f.steps as Record<string, unknown>;\n for (const [stepName, stepConfig] of Object.entries(steps)) {\n if (!stepConfig || typeof stepConfig !== 'object') {\n errors.push(`Step \"${stepName}\" must be an object`);\n continue;\n }\n const step = stepConfig as Record<string, unknown>;\n if (!step.transitions || typeof step.transitions !== 'object') {\n errors.push(`Step \"${stepName}\" must have a \"transitions\" object`);\n }\n }\n }\n\n // Check terminal_states\n if (!f.terminal_states || typeof f.terminal_states !== 'object') {\n errors.push('Flow must have a \"terminal_states\" object');\n } else {\n const terminals = f.terminal_states as Record<string, unknown>;\n for (const [name, config] of Object.entries(terminals)) {\n if (!config || typeof config !== 'object') {\n errors.push(`Terminal state \"${name}\" must be an object`);\n continue;\n }\n const terminal = config as Record<string, unknown>;\n if (typeof terminal.return_intent !== 'string') {\n errors.push(`Terminal state \"${name}\" must have a \"return_intent\" string`);\n }\n }\n }\n\n return errors;\n}\n\n/**\n * Load and validate flow, throwing if invalid\n */\nexport async function loadFlow(source: string | FlowConfig): Promise<FlowConfig> {\n let flow: FlowConfig;\n\n if (typeof source === 'string') {\n // Check if it's a URL or file path\n if (source.startsWith('http://') || source.startsWith('https://')) {\n flow = await loadFlowFromUrl(source);\n } else if (source.includes('{')) {\n // Looks like JSON string\n flow = JSON.parse(source);\n } else {\n // Assume file path (Node.js)\n flow = await loadFlowFromFile(source);\n }\n } else {\n flow = source;\n }\n\n const errors = validateFlowConfig(flow);\n if (errors.length > 0) {\n throw new Error(`Invalid flow configuration:\\n- ${errors.join('\\n- ')}`);\n }\n\n return flow;\n}\n","/**\n * yaml-flow - LocalStorage Store\n * \n * Browser localStorage-based store implementation.\n * Data persists across page reloads but is limited to ~5MB per origin.\n */\n\nimport type { FlowStore, RunState } from '../core/types.js';\n\nexport interface LocalStorageStoreOptions {\n /** Key prefix for namespacing (default: 'yamlflow') */\n prefix?: string;\n}\n\nexport class LocalStorageStore implements FlowStore {\n private prefix: string;\n\n constructor(options: LocalStorageStoreOptions = {}) {\n this.prefix = options.prefix ?? 'yamlflow';\n \n // Ensure localStorage is available\n if (typeof localStorage === 'undefined') {\n throw new Error('LocalStorageStore requires localStorage (browser environment)');\n }\n }\n\n private runKey(runId: string): string {\n return `${this.prefix}:run:${runId}`;\n }\n\n private dataKey(runId: string): string {\n return `${this.prefix}:data:${runId}`;\n }\n\n private indexKey(): string {\n return `${this.prefix}:runs`;\n }\n\n async saveRunState(runId: string, state: RunState): Promise<void> {\n localStorage.setItem(this.runKey(runId), JSON.stringify(state));\n \n // Update run index\n const runs = await this.listRuns();\n if (!runs.includes(runId)) {\n runs.push(runId);\n localStorage.setItem(this.indexKey(), JSON.stringify(runs));\n }\n }\n\n async loadRunState(runId: string): Promise<RunState | null> {\n const raw = localStorage.getItem(this.runKey(runId));\n return raw ? JSON.parse(raw) : null;\n }\n\n async deleteRunState(runId: string): Promise<void> {\n localStorage.removeItem(this.runKey(runId));\n localStorage.removeItem(this.dataKey(runId));\n \n // Update run index\n const runs = await this.listRuns();\n const filtered = runs.filter(id => id !== runId);\n localStorage.setItem(this.indexKey(), JSON.stringify(filtered));\n }\n\n async setData(runId: string, key: string, value: unknown): Promise<void> {\n const allData = await this.getAllData(runId);\n allData[key] = value;\n localStorage.setItem(this.dataKey(runId), JSON.stringify(allData));\n }\n\n async getData(runId: string, key: string): Promise<unknown> {\n const allData = await this.getAllData(runId);\n return allData[key];\n }\n\n async getAllData(runId: string): Promise<Record<string, unknown>> {\n const raw = localStorage.getItem(this.dataKey(runId));\n return raw ? JSON.parse(raw) : {};\n }\n\n async clearData(runId: string): Promise<void> {\n localStorage.removeItem(this.dataKey(runId));\n }\n\n async listRuns(): Promise<string[]> {\n const raw = localStorage.getItem(this.indexKey());\n return raw ? JSON.parse(raw) : [];\n }\n\n /**\n * Clear all flow data from localStorage\n */\n clearAll(): void {\n const keysToRemove: string[] = [];\n \n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.prefix + ':')) {\n keysToRemove.push(key);\n }\n }\n \n keysToRemove.forEach(key => localStorage.removeItem(key));\n }\n}\n","/**\n * yaml-flow - File Store\n * \n * File-system based store for Node.js environments.\n * Stores each run as a JSON file in the specified directory.\n */\n\nimport type { FlowStore, RunState } from '../core/types.js';\n\nexport interface FileStoreOptions {\n /** Directory path for storing flow data */\n directory: string;\n}\n\nexport class FileStore implements FlowStore {\n private directory: string;\n private fs: typeof import('fs/promises') | null = null;\n private path: typeof import('path') | null = null;\n\n constructor(options: FileStoreOptions) {\n this.directory = options.directory;\n }\n\n private async ensureModules(): Promise<void> {\n if (!this.fs || !this.path) {\n // Dynamic import for Node.js modules\n this.fs = await import('fs/promises');\n this.path = await import('path');\n \n // Ensure directory exists\n await this.fs.mkdir(this.directory, { recursive: true });\n }\n }\n\n private runPath(runId: string): string {\n return this.path!.join(this.directory, `${runId}.run.json`);\n }\n\n private dataPath(runId: string): string {\n return this.path!.join(this.directory, `${runId}.data.json`);\n }\n\n async saveRunState(runId: string, state: RunState): Promise<void> {\n await this.ensureModules();\n await this.fs!.writeFile(\n this.runPath(runId),\n JSON.stringify(state, null, 2),\n 'utf-8'\n );\n }\n\n async loadRunState(runId: string): Promise<RunState | null> {\n await this.ensureModules();\n try {\n const raw = await this.fs!.readFile(this.runPath(runId), 'utf-8');\n return JSON.parse(raw);\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n throw err;\n }\n }\n\n async deleteRunState(runId: string): Promise<void> {\n await this.ensureModules();\n try {\n await this.fs!.unlink(this.runPath(runId));\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n try {\n await this.fs!.unlink(this.dataPath(runId));\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n }\n\n async setData(runId: string, key: string, value: unknown): Promise<void> {\n await this.ensureModules();\n const allData = await this.getAllData(runId);\n allData[key] = value;\n await this.fs!.writeFile(\n this.dataPath(runId),\n JSON.stringify(allData, null, 2),\n 'utf-8'\n );\n }\n\n async getData(runId: string, key: string): Promise<unknown> {\n const allData = await this.getAllData(runId);\n return allData[key];\n }\n\n async getAllData(runId: string): Promise<Record<string, unknown>> {\n await this.ensureModules();\n try {\n const raw = await this.fs!.readFile(this.dataPath(runId), 'utf-8');\n return JSON.parse(raw);\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return {};\n }\n throw err;\n }\n }\n\n async clearData(runId: string): Promise<void> {\n await this.ensureModules();\n try {\n await this.fs!.unlink(this.dataPath(runId));\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n }\n\n async listRuns(): Promise<string[]> {\n await this.ensureModules();\n try {\n const files = await this.fs!.readdir(this.directory);\n return files\n .filter(f => f.endsWith('.run.json'))\n .map(f => f.replace('.run.json', ''));\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return [];\n }\n throw err;\n }\n }\n\n /**\n * Clear all flow data from directory\n */\n async clearAll(): Promise<void> {\n await this.ensureModules();\n const runs = await this.listRuns();\n await Promise.all(runs.map(runId => this.deleteRunState(runId)));\n }\n}\n"]}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/stores/file.ts
|
|
4
|
+
var FileStore = class {
|
|
5
|
+
directory;
|
|
6
|
+
fs = null;
|
|
7
|
+
path = null;
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.directory = options.directory;
|
|
10
|
+
}
|
|
11
|
+
async ensureModules() {
|
|
12
|
+
if (!this.fs || !this.path) {
|
|
13
|
+
this.fs = await import('fs/promises');
|
|
14
|
+
this.path = await import('path');
|
|
15
|
+
await this.fs.mkdir(this.directory, { recursive: true });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
runPath(runId) {
|
|
19
|
+
return this.path.join(this.directory, `${runId}.run.json`);
|
|
20
|
+
}
|
|
21
|
+
dataPath(runId) {
|
|
22
|
+
return this.path.join(this.directory, `${runId}.data.json`);
|
|
23
|
+
}
|
|
24
|
+
async saveRunState(runId, state) {
|
|
25
|
+
await this.ensureModules();
|
|
26
|
+
await this.fs.writeFile(
|
|
27
|
+
this.runPath(runId),
|
|
28
|
+
JSON.stringify(state, null, 2),
|
|
29
|
+
"utf-8"
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
async loadRunState(runId) {
|
|
33
|
+
await this.ensureModules();
|
|
34
|
+
try {
|
|
35
|
+
const raw = await this.fs.readFile(this.runPath(runId), "utf-8");
|
|
36
|
+
return JSON.parse(raw);
|
|
37
|
+
} catch (err) {
|
|
38
|
+
if (err.code === "ENOENT") {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
throw err;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async deleteRunState(runId) {
|
|
45
|
+
await this.ensureModules();
|
|
46
|
+
try {
|
|
47
|
+
await this.fs.unlink(this.runPath(runId));
|
|
48
|
+
} catch (err) {
|
|
49
|
+
if (err.code !== "ENOENT") throw err;
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
await this.fs.unlink(this.dataPath(runId));
|
|
53
|
+
} catch (err) {
|
|
54
|
+
if (err.code !== "ENOENT") throw err;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async setData(runId, key, value) {
|
|
58
|
+
await this.ensureModules();
|
|
59
|
+
const allData = await this.getAllData(runId);
|
|
60
|
+
allData[key] = value;
|
|
61
|
+
await this.fs.writeFile(
|
|
62
|
+
this.dataPath(runId),
|
|
63
|
+
JSON.stringify(allData, null, 2),
|
|
64
|
+
"utf-8"
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
async getData(runId, key) {
|
|
68
|
+
const allData = await this.getAllData(runId);
|
|
69
|
+
return allData[key];
|
|
70
|
+
}
|
|
71
|
+
async getAllData(runId) {
|
|
72
|
+
await this.ensureModules();
|
|
73
|
+
try {
|
|
74
|
+
const raw = await this.fs.readFile(this.dataPath(runId), "utf-8");
|
|
75
|
+
return JSON.parse(raw);
|
|
76
|
+
} catch (err) {
|
|
77
|
+
if (err.code === "ENOENT") {
|
|
78
|
+
return {};
|
|
79
|
+
}
|
|
80
|
+
throw err;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async clearData(runId) {
|
|
84
|
+
await this.ensureModules();
|
|
85
|
+
try {
|
|
86
|
+
await this.fs.unlink(this.dataPath(runId));
|
|
87
|
+
} catch (err) {
|
|
88
|
+
if (err.code !== "ENOENT") throw err;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async listRuns() {
|
|
92
|
+
await this.ensureModules();
|
|
93
|
+
try {
|
|
94
|
+
const files = await this.fs.readdir(this.directory);
|
|
95
|
+
return files.filter((f) => f.endsWith(".run.json")).map((f) => f.replace(".run.json", ""));
|
|
96
|
+
} catch (err) {
|
|
97
|
+
if (err.code === "ENOENT") {
|
|
98
|
+
return [];
|
|
99
|
+
}
|
|
100
|
+
throw err;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Clear all flow data from directory
|
|
105
|
+
*/
|
|
106
|
+
async clearAll() {
|
|
107
|
+
await this.ensureModules();
|
|
108
|
+
const runs = await this.listRuns();
|
|
109
|
+
await Promise.all(runs.map((runId) => this.deleteRunState(runId)));
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
exports.FileStore = FileStore;
|
|
114
|
+
//# sourceMappingURL=file.cjs.map
|
|
115
|
+
//# sourceMappingURL=file.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/stores/file.ts"],"names":[],"mappings":"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","file":"file.cjs","sourcesContent":["/**\n * yaml-flow - File Store\n * \n * File-system based store for Node.js environments.\n * Stores each run as a JSON file in the specified directory.\n */\n\nimport type { FlowStore, RunState } from '../core/types.js';\n\nexport interface FileStoreOptions {\n /** Directory path for storing flow data */\n directory: string;\n}\n\nexport class FileStore implements FlowStore {\n private directory: string;\n private fs: typeof import('fs/promises') | null = null;\n private path: typeof import('path') | null = null;\n\n constructor(options: FileStoreOptions) {\n this.directory = options.directory;\n }\n\n private async ensureModules(): Promise<void> {\n if (!this.fs || !this.path) {\n // Dynamic import for Node.js modules\n this.fs = await import('fs/promises');\n this.path = await import('path');\n \n // Ensure directory exists\n await this.fs.mkdir(this.directory, { recursive: true });\n }\n }\n\n private runPath(runId: string): string {\n return this.path!.join(this.directory, `${runId}.run.json`);\n }\n\n private dataPath(runId: string): string {\n return this.path!.join(this.directory, `${runId}.data.json`);\n }\n\n async saveRunState(runId: string, state: RunState): Promise<void> {\n await this.ensureModules();\n await this.fs!.writeFile(\n this.runPath(runId),\n JSON.stringify(state, null, 2),\n 'utf-8'\n );\n }\n\n async loadRunState(runId: string): Promise<RunState | null> {\n await this.ensureModules();\n try {\n const raw = await this.fs!.readFile(this.runPath(runId), 'utf-8');\n return JSON.parse(raw);\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n throw err;\n }\n }\n\n async deleteRunState(runId: string): Promise<void> {\n await this.ensureModules();\n try {\n await this.fs!.unlink(this.runPath(runId));\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n try {\n await this.fs!.unlink(this.dataPath(runId));\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n }\n\n async setData(runId: string, key: string, value: unknown): Promise<void> {\n await this.ensureModules();\n const allData = await this.getAllData(runId);\n allData[key] = value;\n await this.fs!.writeFile(\n this.dataPath(runId),\n JSON.stringify(allData, null, 2),\n 'utf-8'\n );\n }\n\n async getData(runId: string, key: string): Promise<unknown> {\n const allData = await this.getAllData(runId);\n return allData[key];\n }\n\n async getAllData(runId: string): Promise<Record<string, unknown>> {\n await this.ensureModules();\n try {\n const raw = await this.fs!.readFile(this.dataPath(runId), 'utf-8');\n return JSON.parse(raw);\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return {};\n }\n throw err;\n }\n }\n\n async clearData(runId: string): Promise<void> {\n await this.ensureModules();\n try {\n await this.fs!.unlink(this.dataPath(runId));\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n }\n\n async listRuns(): Promise<string[]> {\n await this.ensureModules();\n try {\n const files = await this.fs!.readdir(this.directory);\n return files\n .filter(f => f.endsWith('.run.json'))\n .map(f => f.replace('.run.json', ''));\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return [];\n }\n throw err;\n }\n }\n\n /**\n * Clear all flow data from directory\n */\n async clearAll(): Promise<void> {\n await this.ensureModules();\n const runs = await this.listRuns();\n await Promise.all(runs.map(runId => this.deleteRunState(runId)));\n }\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { f as FlowStore, g as RunState } from '../types-BoWndaAJ.cjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* yaml-flow - File Store
|
|
5
|
+
*
|
|
6
|
+
* File-system based store for Node.js environments.
|
|
7
|
+
* Stores each run as a JSON file in the specified directory.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
interface FileStoreOptions {
|
|
11
|
+
/** Directory path for storing flow data */
|
|
12
|
+
directory: string;
|
|
13
|
+
}
|
|
14
|
+
declare class FileStore implements FlowStore {
|
|
15
|
+
private directory;
|
|
16
|
+
private fs;
|
|
17
|
+
private path;
|
|
18
|
+
constructor(options: FileStoreOptions);
|
|
19
|
+
private ensureModules;
|
|
20
|
+
private runPath;
|
|
21
|
+
private dataPath;
|
|
22
|
+
saveRunState(runId: string, state: RunState): Promise<void>;
|
|
23
|
+
loadRunState(runId: string): Promise<RunState | null>;
|
|
24
|
+
deleteRunState(runId: string): Promise<void>;
|
|
25
|
+
setData(runId: string, key: string, value: unknown): Promise<void>;
|
|
26
|
+
getData(runId: string, key: string): Promise<unknown>;
|
|
27
|
+
getAllData(runId: string): Promise<Record<string, unknown>>;
|
|
28
|
+
clearData(runId: string): Promise<void>;
|
|
29
|
+
listRuns(): Promise<string[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Clear all flow data from directory
|
|
32
|
+
*/
|
|
33
|
+
clearAll(): Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { FileStore, type FileStoreOptions };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { f as FlowStore, g as RunState } from '../types-BoWndaAJ.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* yaml-flow - File Store
|
|
5
|
+
*
|
|
6
|
+
* File-system based store for Node.js environments.
|
|
7
|
+
* Stores each run as a JSON file in the specified directory.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
interface FileStoreOptions {
|
|
11
|
+
/** Directory path for storing flow data */
|
|
12
|
+
directory: string;
|
|
13
|
+
}
|
|
14
|
+
declare class FileStore implements FlowStore {
|
|
15
|
+
private directory;
|
|
16
|
+
private fs;
|
|
17
|
+
private path;
|
|
18
|
+
constructor(options: FileStoreOptions);
|
|
19
|
+
private ensureModules;
|
|
20
|
+
private runPath;
|
|
21
|
+
private dataPath;
|
|
22
|
+
saveRunState(runId: string, state: RunState): Promise<void>;
|
|
23
|
+
loadRunState(runId: string): Promise<RunState | null>;
|
|
24
|
+
deleteRunState(runId: string): Promise<void>;
|
|
25
|
+
setData(runId: string, key: string, value: unknown): Promise<void>;
|
|
26
|
+
getData(runId: string, key: string): Promise<unknown>;
|
|
27
|
+
getAllData(runId: string): Promise<Record<string, unknown>>;
|
|
28
|
+
clearData(runId: string): Promise<void>;
|
|
29
|
+
listRuns(): Promise<string[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Clear all flow data from directory
|
|
32
|
+
*/
|
|
33
|
+
clearAll(): Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { FileStore, type FileStoreOptions };
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// src/stores/file.ts
|
|
2
|
+
var FileStore = class {
|
|
3
|
+
directory;
|
|
4
|
+
fs = null;
|
|
5
|
+
path = null;
|
|
6
|
+
constructor(options) {
|
|
7
|
+
this.directory = options.directory;
|
|
8
|
+
}
|
|
9
|
+
async ensureModules() {
|
|
10
|
+
if (!this.fs || !this.path) {
|
|
11
|
+
this.fs = await import('fs/promises');
|
|
12
|
+
this.path = await import('path');
|
|
13
|
+
await this.fs.mkdir(this.directory, { recursive: true });
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
runPath(runId) {
|
|
17
|
+
return this.path.join(this.directory, `${runId}.run.json`);
|
|
18
|
+
}
|
|
19
|
+
dataPath(runId) {
|
|
20
|
+
return this.path.join(this.directory, `${runId}.data.json`);
|
|
21
|
+
}
|
|
22
|
+
async saveRunState(runId, state) {
|
|
23
|
+
await this.ensureModules();
|
|
24
|
+
await this.fs.writeFile(
|
|
25
|
+
this.runPath(runId),
|
|
26
|
+
JSON.stringify(state, null, 2),
|
|
27
|
+
"utf-8"
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
async loadRunState(runId) {
|
|
31
|
+
await this.ensureModules();
|
|
32
|
+
try {
|
|
33
|
+
const raw = await this.fs.readFile(this.runPath(runId), "utf-8");
|
|
34
|
+
return JSON.parse(raw);
|
|
35
|
+
} catch (err) {
|
|
36
|
+
if (err.code === "ENOENT") {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
throw err;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async deleteRunState(runId) {
|
|
43
|
+
await this.ensureModules();
|
|
44
|
+
try {
|
|
45
|
+
await this.fs.unlink(this.runPath(runId));
|
|
46
|
+
} catch (err) {
|
|
47
|
+
if (err.code !== "ENOENT") throw err;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
await this.fs.unlink(this.dataPath(runId));
|
|
51
|
+
} catch (err) {
|
|
52
|
+
if (err.code !== "ENOENT") throw err;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async setData(runId, key, value) {
|
|
56
|
+
await this.ensureModules();
|
|
57
|
+
const allData = await this.getAllData(runId);
|
|
58
|
+
allData[key] = value;
|
|
59
|
+
await this.fs.writeFile(
|
|
60
|
+
this.dataPath(runId),
|
|
61
|
+
JSON.stringify(allData, null, 2),
|
|
62
|
+
"utf-8"
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
async getData(runId, key) {
|
|
66
|
+
const allData = await this.getAllData(runId);
|
|
67
|
+
return allData[key];
|
|
68
|
+
}
|
|
69
|
+
async getAllData(runId) {
|
|
70
|
+
await this.ensureModules();
|
|
71
|
+
try {
|
|
72
|
+
const raw = await this.fs.readFile(this.dataPath(runId), "utf-8");
|
|
73
|
+
return JSON.parse(raw);
|
|
74
|
+
} catch (err) {
|
|
75
|
+
if (err.code === "ENOENT") {
|
|
76
|
+
return {};
|
|
77
|
+
}
|
|
78
|
+
throw err;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async clearData(runId) {
|
|
82
|
+
await this.ensureModules();
|
|
83
|
+
try {
|
|
84
|
+
await this.fs.unlink(this.dataPath(runId));
|
|
85
|
+
} catch (err) {
|
|
86
|
+
if (err.code !== "ENOENT") throw err;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async listRuns() {
|
|
90
|
+
await this.ensureModules();
|
|
91
|
+
try {
|
|
92
|
+
const files = await this.fs.readdir(this.directory);
|
|
93
|
+
return files.filter((f) => f.endsWith(".run.json")).map((f) => f.replace(".run.json", ""));
|
|
94
|
+
} catch (err) {
|
|
95
|
+
if (err.code === "ENOENT") {
|
|
96
|
+
return [];
|
|
97
|
+
}
|
|
98
|
+
throw err;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Clear all flow data from directory
|
|
103
|
+
*/
|
|
104
|
+
async clearAll() {
|
|
105
|
+
await this.ensureModules();
|
|
106
|
+
const runs = await this.listRuns();
|
|
107
|
+
await Promise.all(runs.map((runId) => this.deleteRunState(runId)));
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
export { FileStore };
|
|
112
|
+
//# sourceMappingURL=file.js.map
|
|
113
|
+
//# sourceMappingURL=file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/stores/file.ts"],"names":[],"mappings":"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","file":"file.js","sourcesContent":["/**\n * yaml-flow - File Store\n * \n * File-system based store for Node.js environments.\n * Stores each run as a JSON file in the specified directory.\n */\n\nimport type { FlowStore, RunState } from '../core/types.js';\n\nexport interface FileStoreOptions {\n /** Directory path for storing flow data */\n directory: string;\n}\n\nexport class FileStore implements FlowStore {\n private directory: string;\n private fs: typeof import('fs/promises') | null = null;\n private path: typeof import('path') | null = null;\n\n constructor(options: FileStoreOptions) {\n this.directory = options.directory;\n }\n\n private async ensureModules(): Promise<void> {\n if (!this.fs || !this.path) {\n // Dynamic import for Node.js modules\n this.fs = await import('fs/promises');\n this.path = await import('path');\n \n // Ensure directory exists\n await this.fs.mkdir(this.directory, { recursive: true });\n }\n }\n\n private runPath(runId: string): string {\n return this.path!.join(this.directory, `${runId}.run.json`);\n }\n\n private dataPath(runId: string): string {\n return this.path!.join(this.directory, `${runId}.data.json`);\n }\n\n async saveRunState(runId: string, state: RunState): Promise<void> {\n await this.ensureModules();\n await this.fs!.writeFile(\n this.runPath(runId),\n JSON.stringify(state, null, 2),\n 'utf-8'\n );\n }\n\n async loadRunState(runId: string): Promise<RunState | null> {\n await this.ensureModules();\n try {\n const raw = await this.fs!.readFile(this.runPath(runId), 'utf-8');\n return JSON.parse(raw);\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n throw err;\n }\n }\n\n async deleteRunState(runId: string): Promise<void> {\n await this.ensureModules();\n try {\n await this.fs!.unlink(this.runPath(runId));\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n try {\n await this.fs!.unlink(this.dataPath(runId));\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n }\n\n async setData(runId: string, key: string, value: unknown): Promise<void> {\n await this.ensureModules();\n const allData = await this.getAllData(runId);\n allData[key] = value;\n await this.fs!.writeFile(\n this.dataPath(runId),\n JSON.stringify(allData, null, 2),\n 'utf-8'\n );\n }\n\n async getData(runId: string, key: string): Promise<unknown> {\n const allData = await this.getAllData(runId);\n return allData[key];\n }\n\n async getAllData(runId: string): Promise<Record<string, unknown>> {\n await this.ensureModules();\n try {\n const raw = await this.fs!.readFile(this.dataPath(runId), 'utf-8');\n return JSON.parse(raw);\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return {};\n }\n throw err;\n }\n }\n\n async clearData(runId: string): Promise<void> {\n await this.ensureModules();\n try {\n await this.fs!.unlink(this.dataPath(runId));\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n }\n\n async listRuns(): Promise<string[]> {\n await this.ensureModules();\n try {\n const files = await this.fs!.readdir(this.directory);\n return files\n .filter(f => f.endsWith('.run.json'))\n .map(f => f.replace('.run.json', ''));\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return [];\n }\n throw err;\n }\n }\n\n /**\n * Clear all flow data from directory\n */\n async clearAll(): Promise<void> {\n await this.ensureModules();\n const runs = await this.listRuns();\n await Promise.all(runs.map(runId => this.deleteRunState(runId)));\n }\n}\n"]}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/stores/localStorage.ts
|
|
4
|
+
var LocalStorageStore = class {
|
|
5
|
+
prefix;
|
|
6
|
+
constructor(options = {}) {
|
|
7
|
+
this.prefix = options.prefix ?? "yamlflow";
|
|
8
|
+
if (typeof localStorage === "undefined") {
|
|
9
|
+
throw new Error("LocalStorageStore requires localStorage (browser environment)");
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
runKey(runId) {
|
|
13
|
+
return `${this.prefix}:run:${runId}`;
|
|
14
|
+
}
|
|
15
|
+
dataKey(runId) {
|
|
16
|
+
return `${this.prefix}:data:${runId}`;
|
|
17
|
+
}
|
|
18
|
+
indexKey() {
|
|
19
|
+
return `${this.prefix}:runs`;
|
|
20
|
+
}
|
|
21
|
+
async saveRunState(runId, state) {
|
|
22
|
+
localStorage.setItem(this.runKey(runId), JSON.stringify(state));
|
|
23
|
+
const runs = await this.listRuns();
|
|
24
|
+
if (!runs.includes(runId)) {
|
|
25
|
+
runs.push(runId);
|
|
26
|
+
localStorage.setItem(this.indexKey(), JSON.stringify(runs));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async loadRunState(runId) {
|
|
30
|
+
const raw = localStorage.getItem(this.runKey(runId));
|
|
31
|
+
return raw ? JSON.parse(raw) : null;
|
|
32
|
+
}
|
|
33
|
+
async deleteRunState(runId) {
|
|
34
|
+
localStorage.removeItem(this.runKey(runId));
|
|
35
|
+
localStorage.removeItem(this.dataKey(runId));
|
|
36
|
+
const runs = await this.listRuns();
|
|
37
|
+
const filtered = runs.filter((id) => id !== runId);
|
|
38
|
+
localStorage.setItem(this.indexKey(), JSON.stringify(filtered));
|
|
39
|
+
}
|
|
40
|
+
async setData(runId, key, value) {
|
|
41
|
+
const allData = await this.getAllData(runId);
|
|
42
|
+
allData[key] = value;
|
|
43
|
+
localStorage.setItem(this.dataKey(runId), JSON.stringify(allData));
|
|
44
|
+
}
|
|
45
|
+
async getData(runId, key) {
|
|
46
|
+
const allData = await this.getAllData(runId);
|
|
47
|
+
return allData[key];
|
|
48
|
+
}
|
|
49
|
+
async getAllData(runId) {
|
|
50
|
+
const raw = localStorage.getItem(this.dataKey(runId));
|
|
51
|
+
return raw ? JSON.parse(raw) : {};
|
|
52
|
+
}
|
|
53
|
+
async clearData(runId) {
|
|
54
|
+
localStorage.removeItem(this.dataKey(runId));
|
|
55
|
+
}
|
|
56
|
+
async listRuns() {
|
|
57
|
+
const raw = localStorage.getItem(this.indexKey());
|
|
58
|
+
return raw ? JSON.parse(raw) : [];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Clear all flow data from localStorage
|
|
62
|
+
*/
|
|
63
|
+
clearAll() {
|
|
64
|
+
const keysToRemove = [];
|
|
65
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
66
|
+
const key = localStorage.key(i);
|
|
67
|
+
if (key?.startsWith(this.prefix + ":")) {
|
|
68
|
+
keysToRemove.push(key);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
keysToRemove.forEach((key) => localStorage.removeItem(key));
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
exports.LocalStorageStore = LocalStorageStore;
|
|
76
|
+
//# sourceMappingURL=localStorage.cjs.map
|
|
77
|
+
//# sourceMappingURL=localStorage.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/stores/localStorage.ts"],"names":[],"mappings":"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","file":"localStorage.cjs","sourcesContent":["/**\n * yaml-flow - LocalStorage Store\n * \n * Browser localStorage-based store implementation.\n * Data persists across page reloads but is limited to ~5MB per origin.\n */\n\nimport type { FlowStore, RunState } from '../core/types.js';\n\nexport interface LocalStorageStoreOptions {\n /** Key prefix for namespacing (default: 'yamlflow') */\n prefix?: string;\n}\n\nexport class LocalStorageStore implements FlowStore {\n private prefix: string;\n\n constructor(options: LocalStorageStoreOptions = {}) {\n this.prefix = options.prefix ?? 'yamlflow';\n \n // Ensure localStorage is available\n if (typeof localStorage === 'undefined') {\n throw new Error('LocalStorageStore requires localStorage (browser environment)');\n }\n }\n\n private runKey(runId: string): string {\n return `${this.prefix}:run:${runId}`;\n }\n\n private dataKey(runId: string): string {\n return `${this.prefix}:data:${runId}`;\n }\n\n private indexKey(): string {\n return `${this.prefix}:runs`;\n }\n\n async saveRunState(runId: string, state: RunState): Promise<void> {\n localStorage.setItem(this.runKey(runId), JSON.stringify(state));\n \n // Update run index\n const runs = await this.listRuns();\n if (!runs.includes(runId)) {\n runs.push(runId);\n localStorage.setItem(this.indexKey(), JSON.stringify(runs));\n }\n }\n\n async loadRunState(runId: string): Promise<RunState | null> {\n const raw = localStorage.getItem(this.runKey(runId));\n return raw ? JSON.parse(raw) : null;\n }\n\n async deleteRunState(runId: string): Promise<void> {\n localStorage.removeItem(this.runKey(runId));\n localStorage.removeItem(this.dataKey(runId));\n \n // Update run index\n const runs = await this.listRuns();\n const filtered = runs.filter(id => id !== runId);\n localStorage.setItem(this.indexKey(), JSON.stringify(filtered));\n }\n\n async setData(runId: string, key: string, value: unknown): Promise<void> {\n const allData = await this.getAllData(runId);\n allData[key] = value;\n localStorage.setItem(this.dataKey(runId), JSON.stringify(allData));\n }\n\n async getData(runId: string, key: string): Promise<unknown> {\n const allData = await this.getAllData(runId);\n return allData[key];\n }\n\n async getAllData(runId: string): Promise<Record<string, unknown>> {\n const raw = localStorage.getItem(this.dataKey(runId));\n return raw ? JSON.parse(raw) : {};\n }\n\n async clearData(runId: string): Promise<void> {\n localStorage.removeItem(this.dataKey(runId));\n }\n\n async listRuns(): Promise<string[]> {\n const raw = localStorage.getItem(this.indexKey());\n return raw ? JSON.parse(raw) : [];\n }\n\n /**\n * Clear all flow data from localStorage\n */\n clearAll(): void {\n const keysToRemove: string[] = [];\n \n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.prefix + ':')) {\n keysToRemove.push(key);\n }\n }\n \n keysToRemove.forEach(key => localStorage.removeItem(key));\n }\n}\n"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { f as FlowStore, g as RunState } from '../types-BoWndaAJ.cjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* yaml-flow - LocalStorage Store
|
|
5
|
+
*
|
|
6
|
+
* Browser localStorage-based store implementation.
|
|
7
|
+
* Data persists across page reloads but is limited to ~5MB per origin.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
interface LocalStorageStoreOptions {
|
|
11
|
+
/** Key prefix for namespacing (default: 'yamlflow') */
|
|
12
|
+
prefix?: string;
|
|
13
|
+
}
|
|
14
|
+
declare class LocalStorageStore implements FlowStore {
|
|
15
|
+
private prefix;
|
|
16
|
+
constructor(options?: LocalStorageStoreOptions);
|
|
17
|
+
private runKey;
|
|
18
|
+
private dataKey;
|
|
19
|
+
private indexKey;
|
|
20
|
+
saveRunState(runId: string, state: RunState): Promise<void>;
|
|
21
|
+
loadRunState(runId: string): Promise<RunState | null>;
|
|
22
|
+
deleteRunState(runId: string): Promise<void>;
|
|
23
|
+
setData(runId: string, key: string, value: unknown): Promise<void>;
|
|
24
|
+
getData(runId: string, key: string): Promise<unknown>;
|
|
25
|
+
getAllData(runId: string): Promise<Record<string, unknown>>;
|
|
26
|
+
clearData(runId: string): Promise<void>;
|
|
27
|
+
listRuns(): Promise<string[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Clear all flow data from localStorage
|
|
30
|
+
*/
|
|
31
|
+
clearAll(): void;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export { LocalStorageStore, type LocalStorageStoreOptions };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { f as FlowStore, g as RunState } from '../types-BoWndaAJ.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* yaml-flow - LocalStorage Store
|
|
5
|
+
*
|
|
6
|
+
* Browser localStorage-based store implementation.
|
|
7
|
+
* Data persists across page reloads but is limited to ~5MB per origin.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
interface LocalStorageStoreOptions {
|
|
11
|
+
/** Key prefix for namespacing (default: 'yamlflow') */
|
|
12
|
+
prefix?: string;
|
|
13
|
+
}
|
|
14
|
+
declare class LocalStorageStore implements FlowStore {
|
|
15
|
+
private prefix;
|
|
16
|
+
constructor(options?: LocalStorageStoreOptions);
|
|
17
|
+
private runKey;
|
|
18
|
+
private dataKey;
|
|
19
|
+
private indexKey;
|
|
20
|
+
saveRunState(runId: string, state: RunState): Promise<void>;
|
|
21
|
+
loadRunState(runId: string): Promise<RunState | null>;
|
|
22
|
+
deleteRunState(runId: string): Promise<void>;
|
|
23
|
+
setData(runId: string, key: string, value: unknown): Promise<void>;
|
|
24
|
+
getData(runId: string, key: string): Promise<unknown>;
|
|
25
|
+
getAllData(runId: string): Promise<Record<string, unknown>>;
|
|
26
|
+
clearData(runId: string): Promise<void>;
|
|
27
|
+
listRuns(): Promise<string[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Clear all flow data from localStorage
|
|
30
|
+
*/
|
|
31
|
+
clearAll(): void;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export { LocalStorageStore, type LocalStorageStoreOptions };
|