@brandboostinggmbh/observable-workflows 0.22.0 → 0.23.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/CHANGELOG.md ADDED
@@ -0,0 +1,839 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## NPM Changelog Conventions
9
+
10
+ For NPM packages, changelogs are conventionally stored in a `CHANGELOG.md` file at the root of the repository. When publishing to NPM:
11
+
12
+ - The changelog is included in the package if the file is not excluded in `.npmignore` or `package.json` files
13
+ - Many tools and package registries (including npm's website) will display the changelog from this file
14
+ - Users can view the changelog with `npm view @brandboostinggmbh/observable-workflows`
15
+ - The changelog file is also visible in the GitHub repository for easy reference
16
+
17
+ ## [Unreleased]
18
+
19
+ ### 🚧 Work in Progress
20
+
21
+ Changes that will be included in the next release will be documented here.
22
+
23
+ ---
24
+
25
+ ## [v0.23.0] - 2026-03-16
26
+
27
+ ### ✨ Features
28
+
29
+ - `call()` and `retry()` now return a `WorkflowCallResult<O>` instead of `void`, containing `instanceId`, `workflowType`, `tenantId`, `result`, `workflowStatus`, `startTime`, `endTime`, `parentInstanceId`, and `triggerId`
30
+ - New exported type `WorkflowCallResult<O, TYPE>` built via `Pick` from `TypedWorkflowRun` with narrowed `workflowStatus: 'completed'` and non-null `result: O` / `endTime: number`
31
+
32
+ ---
33
+
34
+ ## [v0.22.1] - 2026-02-19
35
+
36
+ ### 📚 Documentation
37
+
38
+ - Add comprehensive CHANGELOG.md with full project history from v0.1.0 to v0.22.0
39
+ - Include CHANGELOG.md in published NPM package
40
+ - Add changelog reference section to README.md
41
+
42
+ ---
43
+
44
+ ## [v0.22.0] - 2026-02-19
45
+
46
+ ### ✨ Features
47
+
48
+ - **Delayed Workflow Scheduling**: Workflows can now be scheduled with a delay before execution
49
+ - New `delaySeconds` parameter in `enqueueWorkflow()` and `enqueueWorkflowBatch()` for specifying execution delays (0-2592000 seconds / 30 days)
50
+ - New `scheduledFor` timestamp field in `WorkflowQueueMessage` and `WorkflowRun` tracking when delayed workflows should execute
51
+ - Database schema V8 adds `delaySeconds` (INTEGER) and `scheduledFor` (INTEGER) columns to WorkflowTable
52
+ - Automatic migration from V6/V7 to V8 preserves existing data while adding new columns
53
+ - Queue consumer honors delay by using `delaySeconds` in Cloudflare Queue's batch send API
54
+ - Workflows remain in 'scheduled' status until delay expires and execution begins
55
+ - New `getWorkflowsScheduledBefore()` function for querying workflows scheduled to execute before a specific timestamp
56
+ - Enhanced `listWorkflows()` with `scheduledBefore` and `scheduledAfter` filter options for time-based scheduled workflow queries
57
+
58
+ ### 🔧 Improvements
59
+
60
+ - Database schema improvements with new columns for delayed execution tracking
61
+ - Migration system enhanced to support V6→V8 and V7→V8 upgrade paths
62
+ - Queue message validation ensures delaySeconds is within valid range (0-2592000)
63
+
64
+ ## [v0.21.1] - 2026-02-11
65
+
66
+ *Production release with no additional changes from v0.21.1-beta.2*
67
+
68
+ ## [v0.21.1-beta.2] - 2026-02-11
69
+
70
+ ### 💥 Breaking Changes
71
+
72
+ - `enqueueWorkflowBatch()` now enforces a maximum batch size limit of 100 workflows and throws an error if exceeded, preventing potential performance issues and queue system overload
73
+
74
+ ### 🔧 Improvements
75
+
76
+ - Batch size validation added before processing to fail fast with clear error message
77
+ - Improved error messaging for batch size violations
78
+
79
+ ## [v0.21.1-beta.1] - 2026-02-11
80
+
81
+ *Version bump with no user-facing changes*
82
+
83
+ ## [v0.21.0-beta.1] - 2026-02-05
84
+
85
+ ### ✨ Features
86
+
87
+ - **Workflow Trigger Identification**: Support for tracking the origin or cause of workflow execution via `triggerId`
88
+ - New `triggerId` parameter in `enqueueWorkflow()` and `enqueueWorkflowBatch()` for identifying what triggered the workflow execution
89
+ - New `getWorkflowByTriggerId()` function in log accessor for retrieving workflows by their trigger identifier
90
+ - `WorkflowQueueMessage` includes `triggerId` field for queue-based workflow execution tracking
91
+ - `WorkflowRun` type includes `triggerId: string | null` field for trigger correlation in workflow records
92
+
93
+ ### 💥 Breaking Changes
94
+
95
+ - **Function Signature Change**: `enqueueRetryWorkflow()` now accepts an object parameter instead of positional parameters
96
+ - Before: `enqueueRetryWorkflow(instanceId, retryConfig)`
97
+ - After: `enqueueRetryWorkflow({ instanceId, retryConfig, triggerId })`
98
+ - Migration: Wrap existing calls in object syntax, e.g., `enqueueRetryWorkflow({ instanceId, retryConfig })`
99
+
100
+ ### 🔧 Improvements
101
+
102
+ - Database schema V6 adds `triggerId` (TEXT, UNIQUE, nullable) column to WorkflowTable for trigger identification
103
+ - Automatic migration from V5 to V6 preserves existing data while adding trigger tracking capability
104
+ - Enhanced workflow enqueue operations to propagate `triggerId` through the execution pipeline
105
+
106
+ ## [v0.20.3-beta.1] - 2026-01-26
107
+
108
+ ### 🔧 Improvements
109
+
110
+ - **Query Optimization**: `getPropertiesKeys()` split into two separate optimized queries instead of using `(? IS NULL OR instanceId = ?)` pattern
111
+ - When `instanceId` provided: Uses `instanceId` index directly for targeted query
112
+ - When `instanceId` omitted: Uses `tenant_key` composite index for tenant-wide query
113
+ - Eliminates OR pattern that prevented SQLite from using indexes effectively
114
+ - Improves query performance by allowing index usage in both code paths
115
+
116
+ ## [v0.20.2-beta.1] - 2026-01-26
117
+
118
+ ### 🔧 Improvements
119
+
120
+ - **Query Optimization**: `listWorkflows()` now only uses `DISTINCT` when JOIN operations are present (property filters)
121
+ - Removes unnecessary `DISTINCT` overhead when querying workflows without property filters
122
+ - Significantly improves query performance for simple workflow listings by avoiding full result set processing
123
+ - Maintains `DISTINCT` when needed (with JOINs) to prevent duplicate results
124
+ - Added performance tracking with D1 metadata logging for query analysis
125
+
126
+ ## [v0.20.1-beta.1] - 2026-01-20
127
+
128
+ ### ✨ Features
129
+
130
+ - **Cleanup Manager Enhancement**: Add optional support for cleaning up scheduled and waiting workflows
131
+ - New `scheduledWorkflows` option (defaults to `false`) in `DeleteConfig` for including workflows in 'scheduled' status
132
+ - New `waitingWorkflows` option (defaults to `false`) in `DeleteConfig` for including workflows in 'waiting' status
133
+ - Enables selective cleanup of workflows in pre-execution states when explicitly opted in
134
+ - Maintains backward compatibility by keeping these statuses excluded by default
135
+
136
+ ### 🔧 Improvements
137
+
138
+ - Comprehensive test coverage for scheduled and waiting workflow cleanup scenarios
139
+ - Test coverage for multi-status cleanup operations with all flags enabled
140
+
141
+ ## [v0.20.0-beta.6] - 2026-01-19
142
+
143
+ ### 🔧 Improvements
144
+
145
+ - **Batch Performance Optimization**: `enqueueWorkflowBatch()` now uses `prepareWorkflowInsertStatements()` helper for efficient batch workflow insertion
146
+ - Pre-prepares all workflow insert statements before executing batch operation
147
+ - Reduces code duplication between single and batch workflow insertion logic
148
+ - Maintains consistent workflow record creation across enqueue operations
149
+
150
+ ## [v0.20.0-beta.5] - 2026-01-19
151
+
152
+ ### ✨ Features
153
+
154
+ - **Customizable D1 Retry Configuration**: Users can now override the default D1 retry behavior
155
+ - New `retryConfig` optional parameter in `createWorkflowContext()`, `createQueueWorkflowContext()`, and `createLogAccessor()`
156
+ - Allows customizing `maxRetries`, `initialDelayMs`, and `maxDelayMs` for D1 operations
157
+ - Configuration is propagated to all internal operations that use D1 retry logic
158
+ - Defaults to existing behavior when not specified (5 retries, 100ms initial delay, 5000ms max delay)
159
+
160
+ ### 🔧 Improvements
161
+
162
+ - Export `RetryConfig` type from library for users to define custom retry configurations
163
+ - Retry configuration is now threaded through all context creation functions for consistent retry behavior
164
+
165
+ ## [v0.20.0-beta.4] - 2026-01-19
166
+
167
+ *Version bump with no user-facing changes*
168
+
169
+ ## [v0.20.0-beta.3] - 2026-01-19
170
+
171
+ *Version bump with no user-facing changes*
172
+
173
+ ## [v0.20.0-beta.2] - 2026-01-19
174
+
175
+ *Version bump with no user-facing changes*
176
+
177
+ ## [v0.20.0-beta.1] - 2026-01-19
178
+
179
+ ### ✨ Features
180
+
181
+ - **Comprehensive D1 Retry Logic**: All D1 database operations now include automatic retry with exponential backoff and jitter
182
+ - New `retryD1Operation()` helper function wraps all D1 queries with configurable retry logic
183
+ - Handles transient network errors (SQLITE_BUSY, connection timeouts, network failures)
184
+ - Default configuration: 5 max retries, 100ms initial delay, 5s max delay, exponential backoff with jitter
185
+ - Applied to all database operations: workflow CRUD, step CRUD, property CRUD, cleanup operations, statistics queries
186
+ - `RetryConfig` type allows customization of retry behavior (maxRetries, initialDelayMs, maxDelayMs)
187
+
188
+ ### 🔧 Improvements
189
+
190
+ - Improved resilience for all database operations across workflow lifecycle (creation, execution, logging, cleanup)
191
+ - Retry logic added to workflow insertion, step insertion, log insertion, property operations, and query operations
192
+ - Enhanced error handling for transient D1 failures with automatic recovery
193
+ - Consistent retry behavior across all database interaction points in the library
194
+
195
+ ## [v0.19.0-beta.4] - 2025-11-04
196
+
197
+ ### 🔧 Improvements
198
+
199
+ - Add composite database index on WorkflowTable (parentInstanceId, tenantId) to optimize queries filtering by parent workflows within a tenant, improving performance for hierarchical workflow queries
200
+
201
+ ## [v0.19.0-beta.3] - 2025-11-04
202
+
203
+ ### 🔧 Improvements
204
+
205
+ - Add database indexes on WorkflowTable for improved query performance:
206
+ - Index on `tenantId` column for tenant-scoped queries
207
+ - Index on `workflowStatus` column for status-based filtering
208
+ - Index on `parentInstanceId` column for parent-child workflow relationship queries
209
+ - Add `release:beta` npm script for publishing beta releases to NPM
210
+
211
+ ## [v0.19.0-beta.2] - 2025-10-23
212
+
213
+ *Version bump with no user-facing changes*
214
+
215
+ ## [v0.19.0-beta.1] - 2025-10-20
216
+
217
+ ### ✨ Features
218
+
219
+ - **Workflow Dependencies System**: Workflows can now depend on other workflows with full dependency management support
220
+ - New `createWorkflowDependency()` function to create a single dependency relationship between workflows
221
+ - New `createWorkflowDependencies()` function to create multiple dependency relationships atomically with workflow creation
222
+ - New `deleteWorkflowDependency()` function to remove dependency relationships between workflows
223
+ - New `WorkflowDependencies` database table with composite primary key and tenant-scoped queries
224
+ - Workflows in 'waiting' status hold execution until all dependencies complete
225
+ - New `populateDependencies` and `populateDependents` options in `getWorkflow()` and `listWorkflows()` for fetching dependency relationships
226
+ - **Scheduled Workflow Support**: Workflows can now be pre-created and scheduled for later execution
227
+ - New `scheduledInstanceId` parameter in `WorkflowQueueMessage` for pre-creating workflow records before execution
228
+ - Workflows created in 'scheduled' status when pre-defined, or 'waiting' status when dependencies exist
229
+ - `enqueueWorkflow()` and `enqueueWorkflowBatch()` now return `ScheduledWorkflowExecutionStub` with `instanceId` and `workflowType`
230
+ - Enables workflow scheduling patterns where workflow records are created ahead of time
231
+ - **Workflow Dependency Polling**: New `handlePollWaitingWorkflows()` function for automatic dependency resolution
232
+ - Polls waiting workflows from the database
233
+ - Automatically enqueues workflows when all their dependencies complete
234
+ - Transitions 'waiting' → 'scheduled' status when dependencies are satisfied
235
+ - Supports cross-tenant waiting workflow discovery with `ignoreTenant` option
236
+ - **Enhanced listWorkflows Options**:
237
+ - New `populateResult` option to include workflow results in responses
238
+ - New `populateDependencies` option to fetch and attach all dependency relationships
239
+ - New `populateDependents` option to fetch and attach all dependent relationships
240
+ - New `ignoreTenant` option for cross-tenant workflow queries (useful for dependency polling)
241
+ - **New WorkflowStatus Types**: Added 'scheduled' and 'waiting' workflow status values to support pre-execution workflow states
242
+ - **New Exports**:
243
+ - `createCleanupManager` function for workflow data retention management
244
+ - `WorkflowStatus` type for type-safe status usage
245
+ - `WorkflowDependency` and `WorkflowDependencyRelation` types for dependency handling
246
+ - `updateWorkflow()` function for updating workflow records after creation
247
+ - `workflowTableRowToWorkflowRun()` helper for converting database rows to workflow objects
248
+ - Workflow dependency helper functions: `prepareWorkflowDependencyStatement()`, `createWorkflowDependency()`, `createWorkflowDependencies()`, `deleteWorkflowDependency()`
249
+
250
+ ### 🔧 Improvements
251
+
252
+ - **Database Schema Enhancement**: New WorkflowDependencies table (V7) with efficient many-to-many relationship tracking
253
+ - Composite primary key on (dependencyWorkflowId, dependentWorkflowId) ensures unique relationships
254
+ - Foreign key constraints with CASCADE DELETE for referential integrity
255
+ - Optimized indexes on dependencyWorkflowId, dependentWorkflowId, and tenantId for fast queries
256
+ - createdAt timestamp for audit trail and relationship history
257
+ - **Enhanced insertWorkflowRecord()**: Now supports atomic creation of workflows with their dependencies
258
+ - Accepts optional dependencies array
259
+ - Automatically creates appropriate status based on dependency presence
260
+ - Returns success metadata for both workflow and dependency inserts
261
+ - **Improved getWorkflow()**: Enhanced with dependency fetching capabilities
262
+ - New `populateDependencies` option to fetch all workflows this workflow depends on
263
+ - New `populateDependents` option to fetch all workflows that depend on this workflow
264
+ - Maintains clean separation between data fetching and population options
265
+ - **TypeScript Type Improvements**: Enhanced type system for workflow dependencies
266
+ - New `ExtractDependencyResult<W>` type for typed dependency extraction
267
+ - New `WorkflowDependencyRun<I, O, TYPE>` type for typed dependency relationships
268
+ - Typed `getDependencies()` in workflow context for strong type safety across dependency workflows
269
+ - **Batch Enqueue Performance**: `enqueueWorkflowBatch()` maintains order while efficiently handling dependencies and scheduling
270
+
271
+ ## [v0.18.2] - 2025-10-07
272
+
273
+ ### 🐛 Bug Fixes
274
+
275
+ - Fix `getPropertiesKeys()` function to use `deserializeWorkflowPropertyValue()` instead of `tryDeserializeObj()` for consistent property value deserialization across workflow properties
276
+
277
+ ## [v0.18.1] - 2025-10-07
278
+
279
+ ### ✨ Features
280
+
281
+ - Export new helper functions `serializeWorkflowPropertyValue()` and `deserializeWorkflowPropertyValue()` for handling workflow property serialization and deserialization
282
+
283
+ ### 🔧 Improvements
284
+
285
+ - Improve property deserialization in `listWorkflows()` by using `deserializeWorkflowPropertyValue()` instead of `tryDeserializeObj()` for proper type-specific deserialization
286
+ - Enhance property value deserialization to handle different value types (string, number, boolean, object) with appropriate type conversion and JSON parsing with fallback error handling
287
+
288
+ ## [v0.18.0] - 2025-10-06
289
+
290
+ ### 🔧 Improvements
291
+
292
+ - Index creation is now idempotent - checks for existing indexes before attempting to create them, eliminating redundant creation attempts and preventing potential conflicts when re-running migrations
293
+ - Optimized index creation performance by batching index creation statements together for execution, reducing the number of database round-trips
294
+ - Fine-tuned query batch size for stability by reducing property loading batch size from 100 to 80 to provide additional safety margin below SQLite's variable limit
295
+
296
+ ## [v0.17.7] - 2025-10-05
297
+
298
+ *Version bump with no user-facing changes*
299
+
300
+ ## [v0.17.6] - 2025-10-05
301
+
302
+ ### 🔧 Improvements
303
+
304
+ - Property loading in `listWorkflows` now processes in batches of 100 instanceIds at a time to avoid hitting SQLite's 999 variable limit when populating properties for large result sets
305
+
306
+ ## [v0.17.5] - 2025-10-05
307
+
308
+ *Version bump with no user-facing changes*
309
+
310
+ ## [v0.17.4] - 2025-10-04
311
+
312
+ ### ✨ Features
313
+
314
+ - Add `populateProperties` option to `listWorkflows()` method for efficient workflow property fetching - when enabled, properties are fetched and attached to each workflow in a single additional query
315
+
316
+ ### 🔧 Improvements
317
+
318
+ - Efficient property fetching using IN clause with all instanceIds in one query, then grouped by instanceId and attached to workflows, improving performance for bulk workflow retrieval with properties
319
+
320
+ ## [v0.17.3] - 2025-09-16
321
+
322
+ ### 🔧 Improvements
323
+
324
+ - Add composite database index `idx_workflows_tenant_starttime` on WorkflowTable (tenantId, startTime DESC) to optimize tenant and time-based workflow queries
325
+
326
+ ## [v0.17.2] - 2025-09-15
327
+
328
+ ### 🔧 Improvements
329
+
330
+ - Add `debugLogs` option to `listWorkflows()` function for SQL query debugging - when enabled, logs the SQL query being executed, the bindings used, and a message when the query completes
331
+
332
+ ## [v0.17.1] - 2025-09-14
333
+
334
+ ### 🔧 Improvements
335
+
336
+ - Add console logging to cleanup manager for better visibility during deletion operations, including workflow deletion progress, associated steps deletion, external storage key deletion, database deletion phase, and messages when no workflows match deletion criteria
337
+
338
+ ## [v0.17.0] - 2025-09-10
339
+
340
+ ### 💥 Breaking Changes
341
+
342
+ - `queueIdentifier` is now a required field in `QueueWorkflowContextOptions` - must be provided when creating queue workflow contexts
343
+
344
+ ### ✨ Features
345
+
346
+ - Queue handlers now validate and track workflow queue routing with `queueIdentifier` support in `WorkflowQueueMessage` - a warning is logged if a workflow message is processed by the incorrect queue handler
347
+
348
+ ## [v0.16.4] - 2025-09-09
349
+
350
+ ### 🔧 Improvements
351
+
352
+ - Optimize `listSteps` query performance by refactoring SQL query construction to use dynamic WHERE clause building instead of null-checking pattern
353
+ - Add composite database indexes for improved query performance: `idx_steps_instance_starttime` on StepTable (instanceId, startTime) and `idx_workflow_properties_tenant_key` on WorkflowProperties (tenantId, key, valueType)
354
+
355
+ ## [v0.16.3] - 2025-09-06
356
+
357
+ ### ✨ Features
358
+
359
+ - Add `workflowAverageWallTimeMilis` property to workflow statistics for tracking average workflow execution time in aggregated results
360
+
361
+ ## [v0.16.2] - 2025-09-05
362
+
363
+ *Version bump with no user-facing changes*
364
+
365
+ ## [v0.16.1] - 2025-09-05
366
+
367
+ ### ✨ Features
368
+
369
+ - Add `successfulWorkflowCount` and `failedWorkflowCount` fields to workflow statistics query results for better insights into workflow completion status
370
+
371
+ ## [v0.16.0] - 2025-09-04
372
+
373
+ ### ✨ Features
374
+
375
+ - Add `getWorkflowTypesStatistics()` function to retrieve aggregated statistics for workflow types including counts, wall time totals, and incomplete workflow counts with optional filtering by tenant ID and time range
376
+
377
+ ## [v0.15.6] - 2025-09-01
378
+
379
+ ### 🔧 Improvements
380
+
381
+ - Add database index on StepTable startTime column for improved query performance when filtering or sorting steps by start time
382
+
383
+ ## [v0.15.5] - 2025-09-01
384
+
385
+ ### 🔧 Improvements
386
+
387
+ - Optimize SQL query for orphaned log deletion by querying StepTable directly instead of using NOT EXISTS subquery with WorkflowTable, improving performance for cleanup operations
388
+
389
+ ## [v0.15.4] - 2025-08-31
390
+
391
+ ### ✨ Features
392
+
393
+ - Add `deleteOrphanedSteps()` function to cleanup manager for removing steps that reference non-existent workflows
394
+ - Add `deleteOrphanedLogs()` function to cleanup manager for removing logs that reference non-existent steps or workflows
395
+
396
+ ## [v0.15.3] - 2025-08-29
397
+
398
+ ### 🔧 Improvements
399
+
400
+ - Add database indexes on foreign key columns (StepTable.instanceId and LogTable.instanceId) for improved query performance, particularly for cascade deletion and JOIN operations
401
+
402
+ ## [v0.15.1] - 2025-08-28
403
+
404
+ ### 🔧 Improvements
405
+
406
+ - Add specific index on WorkflowTable for status and time-based filtering to improve query performance when filtering by workflow status with time ranges
407
+ - Optimize workflow deletion SQL query in cleanup manager to use explicit filter predicate instead of subquery for better performance
408
+
409
+ ## [v0.15.0] - 2025-08-28
410
+
411
+ ### ✨ Features
412
+
413
+ - Add `deleteRefsFromExternalStorage` configuration option to cleanup manager for selective external storage cleanup during workflow deletion
414
+ - Add `delete()` method to `ExternalBlobStorage` interface for batch deletion of external storage keys
415
+ - Implement bulk delete capability in R2 external blob storage with fallback to individual deletes for resilience
416
+
417
+ ### 🔧 Improvements
418
+
419
+ - Enhance `countAffectedWorkflows()` to return detailed information including affected steps array and count of external storage keys to be deleted
420
+ - Enhance `deleteOldWorkflows()` to return deleted steps array and count of external storage keys actually deleted, enabling better tracking of cleanup operations
421
+ - Improve error handling in external storage deletion - errors are logged but do not fail the entire cleanup operation, allowing partial deletions to succeed
422
+ - Refactor cleanup manager with new helper functions `getAffectedWorkflows()`, `getAffectedSteps()`, and `collectExternalStorageKeys()` for better code organization and maintainability
423
+ - Add `limit` parameter to cleanup functions to prevent out-of-memory errors when processing large numbers of workflows
424
+
425
+ ### 💥 Breaking Changes
426
+
427
+ - `ExternalBlobStorage` interface now requires implementing the `delete(...keys: string[]): Promise<number>` method. Existing implementations must add this method.
428
+ - `countAffectedWorkflows()` now accepts a `limit` parameter as the second argument
429
+ - `deleteOldWorkflows()` now accepts a `limit` parameter as the second argument
430
+
431
+ ---
432
+
433
+ ## [v0.14.0] - 2025-08-27
434
+
435
+ ### ✨ Features
436
+
437
+ - Add Cleanup Manager system with `createCleanupManager()` for automated workflow data retention management
438
+ - Add `countAffectedWorkflows()` function to preview workflows matching cleanup criteria before deletion
439
+ - Add `deleteOldWorkflows()` function to delete workflows matching time-based, count-based, or type-based criteria
440
+ - Add database schema V5 with CASCADE DELETE constraints to automatically remove related steps and logs when workflows are deleted
441
+
442
+ ### 🔧 Improvements
443
+
444
+ - Improve data consistency with foreign key constraints ensuring referential integrity between workflows, steps, and logs
445
+ - Add migration system supporting upgrade from schema V2 and V3 to V5
446
+
447
+ ## [v0.13.3] - 2025-08-23
448
+
449
+ *Internal debugging release with temporary diagnostic logging*
450
+
451
+ ## [v0.13.2] - 2025-08-23
452
+
453
+ ### 🐛 Bug Fixes
454
+
455
+ - Fix incorrect table name 'WorkflowProperties' to correct table name 'WorkflowProperty' in deleteWorkflowProperties query
456
+
457
+ ## [v0.13.1] - 2025-08-22
458
+
459
+ ### 💥 Breaking Changes
460
+
461
+ - Move `populateInput` parameter from function signature to filter options object in `listWorkflows()` for consistent parameter structure
462
+
463
+ ## [v0.13.0] - 2025-08-22
464
+
465
+ ### ✨ Features
466
+
467
+ - Add `populateInput` parameter to `listWorkflows()` to control whether workflow inputs are deserialized and loaded (defaults to `false` to reduce memory usage when listing many workflows)
468
+
469
+ ## [v0.12.2] - 2025-08-20
470
+
471
+ ### 💥 Breaking Changes
472
+
473
+ - Remove `WorkflowBatchItem` type alias export - users should directly type workflow parameters with required `workflow`, `input`, `workflowName`, and optional `triggerId` fields
474
+
475
+ ## [v0.12.1] - 2025-08-20
476
+
477
+ ### 🔧 Improvements
478
+
479
+ - Export `WorkflowBatchItem` type alias for improved type safety when using `enqueueWorkflowBatch`
480
+
481
+ ## [v0.12.0] - 2025-08-19
482
+
483
+ ### ✨ Features
484
+
485
+ - Add `reuseSuccessfulSteps` option to `enqueueRetryWorkflow()` for controlling whether retry operations reuse successful step results from the parent workflow instance (defaults to `true`)
486
+
487
+ ---
488
+
489
+ ## [v0.15.2] - 2026-02-19
490
+
491
+ ### 🐛 Bug Fixes
492
+
493
+ - Fix workflow batch deletion to process deletes in batches of 100 to prevent hitting D1's variable binding limit when deleting large numbers of workflows
494
+
495
+ ## [v0.11.5] - 2026-02-19
496
+
497
+ ### 🐛 Bug Fixes
498
+
499
+ - Remove debug console.log statements from listWorkflows method to reduce noise in logs
500
+
501
+ ## [v0.11.4] - 2025-08-06
502
+
503
+ ### 🔧 Improvements
504
+
505
+ - Add database index on WorkflowTable startTime column for improved query performance
506
+
507
+ ## [v0.11.3] - 2026-02-19
508
+
509
+ ### 🔧 Improvements
510
+
511
+ - Enhanced debug logging in `listWorkflows` to include the SQL query being executed
512
+
513
+ ## [v0.11.2] - 2025-08-06
514
+
515
+ ### 🔧 Improvements
516
+
517
+ - Added debug logging to `listWorkflows` function to help track query execution and result processing
518
+
519
+ ## [v0.11.1] - 2026-02-19
520
+
521
+ ### ✨ Features
522
+
523
+ - Export `HandleWorkflowQueueMessageParams` type for better type safety when handling queue messages
524
+ - Add support for `triggerId` parameter in workflow retry operations to improve workflow traceability
525
+
526
+ ### 🔧 Improvements
527
+
528
+ - Refactor `handleWorkflowQueueMessage` function to use object destructuring for cleaner API
529
+ - Refactor `retry` function to use object parameters for better maintainability
530
+ - Improve error handling to check for existing workflows before throwing error messages
531
+ - Add `triggerId` generation for workflow runs and retries to enable better request tracking
532
+
533
+ ## [v0.11.0] - 2025-07-25
534
+
535
+ ### ✨ Features
536
+
537
+ - Add workflow trigger identification support via new `triggerId` parameter in `WorkflowCallParams`
538
+ - Add `getWorkflowByTriggerId()` function to log accessor for retrieving workflows by trigger ID
539
+
540
+ ### 💥 Breaking Changes
541
+
542
+ - `WorkflowRun` type now includes `triggerId: string | null` field for trigger correlation
543
+
544
+ ### 🔧 Improvements
545
+
546
+ - Add duplicate workflow prevention by checking for existing workflows with same `triggerId` before execution
547
+ - Enhance database schema with V4 migration to support `triggerId` with UNIQUE constraint on WorkflowTable
548
+ - Add comprehensive migration documentation explaining versioning system and table evolution strategy
549
+ - Improve database migration system with specific migration functions `migrateWorkflowTableV1ToV2()` and `migrateWorkflowTableV2V3ToV4()`
550
+
551
+ ## [v0.10.1] - 2026-02-19
552
+
553
+ ### 🐛 Bug Fixes
554
+
555
+ - Add log message truncation to prevent database storage errors for oversized logs. Messages exceeding 64KB are truncated with a UTF-8 safe truncation point and an indicator appended.
556
+
557
+ ## [v0.10.0] - 2026-02-19
558
+
559
+ ### ✨ Features
560
+
561
+ - Add `enqueueWorkflowBatch` function to batch-enqueue multiple workflows at once, improving efficiency when processing multiple workflow requests
562
+
563
+ ## [v0.9.0] - 2025-02-19
564
+
565
+ ### ✨ Features
566
+
567
+ - Added `LogBatcher` class for efficient batch processing of log entries with automatic periodic flushing and size-based triggers
568
+ - Added `populateData` parameter to `listSteps()` function to control whether result/error fields are populated from external storage
569
+
570
+ ### 🔧 Improvements
571
+
572
+ - Improved performance of log operations by batching database writes using D1's batch API instead of individual pushes
573
+ - Optimized memory usage by defaulting to not populating result/error fields in `listSteps()` - can be enabled via `populateData` option when needed
574
+ - Updated `getWorkflow()` to support `populateData` parameter for consistent data retrieval behavior
575
+
576
+ ## [v0.8.6] - 2025-07-04
577
+
578
+ ### 🔧 Improvements
579
+
580
+ - `listSteps()` now returns `null` for result and error fields to optimize memory usage. Results and errors are not populated in this function and should be retrieved separately using `getStep()` if needed.
581
+
582
+ ### 🐛 Bug Fixes
583
+
584
+ - Fixed workflow retry functionality to properly deserialize workflow input from external blob storage when retrying with `reuseSuccessfulSteps` option
585
+
586
+ ## [v0.8.5] - 2025-07-04
587
+
588
+ ### 🐛 Bug Fixes
589
+
590
+ - Removed debug logging from deserializeWithExternalStorage that was cluttering console output
591
+
592
+ ## [v0.8.4] - 2025-07-04
593
+
594
+ ### 🐛 Bug Fixes
595
+
596
+ - Added debug logging to external storage deserialization to help diagnose data loading issues
597
+
598
+ ## [v0.8.3] - 2025-07-04
599
+
600
+ ### 🐛 Bug Fixes
601
+
602
+ - Fixed step result retrieval to properly check external blob storage when accessing step data through `getStep()` method
603
+
604
+ ## [v0.8.2] - 2025-07-04
605
+
606
+ ### 🐛 Bug Fixes
607
+
608
+ - Simplified error logging to improve clarity and reduce noise in error reports
609
+
610
+ ## [v0.8.1] - 2025-07-04
611
+
612
+ ### 🐛 Bug Fixes
613
+
614
+ - Improved error logging for serialization/deserialization failures with structured error details including message, cause, and stack trace
615
+
616
+ ## [v0.8.0] - 2025-07-03
617
+
618
+ ### ✨ Features
619
+
620
+ - Enhanced `listSteps()` function with flexible API - now supports both object-based parameters (`listSteps({ limit, offset, instanceId })`) and maintains backward compatibility with the original positional parameter signature. The new API allows omitting limit/offset parameters to retrieve all steps without pagination
621
+
622
+ ## [v0.7.3] - 2025-07-03
623
+
624
+ ### ✨ Features
625
+
626
+ - Added comprehensive database schema migration system with automatic version detection and idempotent migrations that preserve existing data
627
+
628
+ ## [v0.7.2] - 2025-07-02
629
+
630
+ *Internal refactoring release with no user-facing changes*
631
+
632
+ ## [v0.7.1] - 2025-07-02
633
+
634
+ ### 🐛 Bug Fixes
635
+
636
+ - Remove console output during database table initialization to reduce unnecessary logging noise
637
+
638
+ ## [v0.7.0] - 2025-07-02
639
+
640
+ ### ✨ Features
641
+
642
+ - **External Blob Storage Support**: Added external storage capability for large workflow data (step results, errors, and inputs) that exceeds D1 database size limits
643
+ - New `ExternalBlobStorage` interface for pluggable storage backends
644
+ - New `createR2ExternalBlobStorage()` function for Cloudflare R2 integration with configurable threshold, key prefix, and custom ID generation
645
+ - New helper functions `serializeWithExternalStorage()` and `deserializeWithExternalStorage()` for transparent external storage handling
646
+ - Automatic fallback to direct database storage when external storage fails
647
+ - Optional `externalBlobStorage` parameter in `createWorkflowContext()` and `createLogAccessor()`
648
+ - **Comprehensive Documentation**: Complete README.md rewrite with extensive usage examples, API reference, best practices, and quick start guide
649
+
650
+ ### 🔧 Improvements
651
+
652
+ - **Database Schema Migration**: Enhanced `ensureTables()` function with automatic schema migration support to add external blob storage columns (`inputRef`, `resultRef`, `errorRef`) to existing tables
653
+ - **Data Retrieval**: Updated `createLogAccessor()` to automatically handle external blob storage references when retrieving workflow data, steps, and logs
654
+
655
+ ### 📚 Exports
656
+
657
+ - `ExternalBlobStorage` (type)
658
+ - `R2ExternalBlobStorageOptions` (type)
659
+ - `createR2ExternalBlobStorage()` (function)
660
+ - `serializeWithExternalStorage()` (function)
661
+ - `deserializeWithExternalStorage()` (function)
662
+
663
+ ## [v0.6.0] - 2025-06-05
664
+
665
+ ### ✨ Features
666
+
667
+ - Add comprehensive filtering capabilities to `listWorkflows()` function with support for:
668
+ - Text search across workflow names and types
669
+ - Status and type filtering with single or multiple values
670
+ - Date range filtering for start and end times (with `gte`, `lte`, `gt`, `lt` operators)
671
+ - Custom property filtering with comparison operators (`equals`, `contains`, `gt`, `gte`, `lt`, `lte`, `in`)
672
+ - Combined multi-criteria filtering
673
+ - Export new filter types: `WorkflowFilter`, `DateRangeFilter`, `StringFilter`, and `PropertyFilter`
674
+
675
+ ### 🔧 Development
676
+
677
+ - Add Cloudflare Workers testing environment with `@cloudflare/vitest-pool-workers` and `wrangler` for realistic D1 database testing
678
+ - Add comprehensive test coverage for filtering functionality and logging behavior
679
+ - Temporarily disable lint job in CI workflow
680
+
681
+ ## [v0.5.0] - 2025-06-04
682
+
683
+ ### ✨ Features
684
+
685
+ - Console methods (log, info, error, warn) now accept multiple arguments of any type, matching the standard JavaScript console API
686
+ - Console methods automatically serialize objects, arrays, and other non-string values to strings for logging
687
+ - Added support for circular reference detection in logged objects to prevent serialization errors
688
+
689
+ ## [v0.4.8] - 2025-05-22
690
+
691
+ ### 🐛 Bug Fixes
692
+
693
+ - Removed temporary debug logging from error handler that was cluttering console output
694
+
695
+ ## [v0.4.7] - 2025-05-22
696
+
697
+ ### 🐛 Bug Fixes
698
+
699
+ - Added temporary debug logging to error handler in step context to diagnose error serialization issues
700
+
701
+ ## [v0.4.6] - 2025-05-21
702
+
703
+ ### 🐛 Bug Fixes
704
+
705
+ - Fixed step result retrieval to return raw cached results without unnecessary deserialization
706
+
707
+ ## [v0.4.5] - 2025-05-21
708
+
709
+ ### 🐛 Bug Fixes
710
+
711
+ - Fixed serialization of step execution results and errors in workflow history to ensure consistent data format when persisting to storage
712
+
713
+ ## [v0.4.4] - 2025-05-21
714
+
715
+ ### 🐛 Bug Fixes
716
+
717
+ - Fixed step reuse feature to correctly deserialize metadata and results when reusing successful steps from previous workflow runs
718
+
719
+ ## [v0.4.3] - 2025-05-21
720
+
721
+ ### 🐛 Bug Fixes
722
+
723
+ - Added debug logging to step context creation to help diagnose workflow step reuse behavior
724
+
725
+ ## [v0.4.2] - 2025-05-21
726
+
727
+ ### 🐛 Bug Fixes
728
+
729
+ - Added temporary debug logging to step reuse mechanism to help diagnose issues with workflow step caching
730
+
731
+ ## [v0.4.1] - 2025-05-21
732
+
733
+ ### ✨ Features
734
+
735
+ - Added `reuseSuccessfulSteps` option to control whether workflow retries reuse results from successful steps in the parent instance (defaults to `true`)
736
+ - Added `RetryWorkflowOptions` parameter to the `retry()` method, allowing granular control over retry behavior per workflow
737
+
738
+ ### 🐛 Bug Fixes
739
+
740
+ - Fixed missing `parentInstanceId` being passed to step context during workflow execution
741
+
742
+ ## [v0.4.0] - 2025-05-20
743
+
744
+ ### 🐛 Bug Fixes
745
+
746
+ - Fix input deserialization in workflow retry to use configured serializer instead of JSON.parse
747
+
748
+ ## [v0.3.8] - 2025-05-20
749
+
750
+ ### ✨ Features
751
+
752
+ - Add `WorkflowContextInstance` type export for typed workflow context references
753
+ - Update `createWorkflowContext()` to return `WorkflowContextInstance` for improved type safety
754
+
755
+ ### 💥 Breaking Changes
756
+
757
+ - **QueueWorkflowContextOptions:** Replace `serializer` and `idFactory` options with `workflowContext` instance parameter - queue contexts now require a pre-configured workflow context instead of individual configuration options
758
+
759
+ ## [v0.3.7] - 2025-05-20
760
+
761
+ *Version bump with no functional changes*
762
+
763
+ ## [v0.3.6] - 2025-05-20
764
+
765
+ ### ⚠️ BREAKING CHANGES
766
+
767
+ - Remove `valueType` parameter from `setWorkflowProperty()` - type is now auto-detected from value
768
+
769
+ ## [v0.3.5] - 2025-05-19
770
+
771
+ ### 🐛 Bug Fixes
772
+
773
+ - Remove unnecessary generic type parameter from `handleWorkflowQueueMessage` to fix type inference issues with workflow resolver
774
+
775
+ ## [v0.3.4] - 2025-05-19
776
+
777
+ *Maintenance release with no user-facing changes*
778
+
779
+ ## [v0.3.3] - 2025-05-19
780
+
781
+ ### ✨ Features
782
+
783
+ - Add `tenantId` to workflow context for multi-tenant support
784
+
785
+ ## [v0.3.2] - 2025-05-19
786
+
787
+ ### ✨ Features
788
+
789
+ - Add simplified step syntax: `step('stepName', callback)` in addition to `step({ name, metadata }, callback)`
790
+
791
+ ## [v0.3.1] - 2025-05-19
792
+
793
+ ### ⚠️ BREAKING CHANGES
794
+
795
+ - Change `createWorkflowContext()` from async to sync function (tables now created lazily on first execution)
796
+
797
+ ## [v0.3.0] - 2025-05-19
798
+
799
+ ### ✨ Features
800
+
801
+ - Add default serializer and ID factory implementations
802
+ - Make serializer parameter optional in `createLogAccessor()` with automatic fallback to defaults
803
+
804
+ ## [v0.2.2] - 2025-05-19
805
+
806
+ *Minor release with internal improvements*
807
+
808
+ ## [v0.2.1] - 2025-05-19
809
+
810
+ *Minor release with internal improvements*
811
+
812
+ ## [v0.2.0] - 2025-05-16
813
+
814
+ ### ✨ Features
815
+
816
+ - Add parent-child workflow relationship support with `parentInstanceId` parameter
817
+
818
+ ## [v0.1.0] - 2025-05-16
819
+
820
+ ### ✨ Features
821
+
822
+ - Add `defineWorkflow()` to define typed workflow functions with metadata
823
+ - Add `createWorkflowContext()` for direct workflow execution with step tracking, logging, and retry capabilities
824
+ - Add `createQueueWorkflowContext()` for queue-based workflow execution with batch enqueueing and dependency management
825
+ - Add `createStepContext()` for granular step-level execution, logging, and result reuse
826
+ - Add `createLogAccessor()` with comprehensive query methods: `listWorkflows()`, `getWorkflow()`, `listSteps()`, `getStep()`, and `getWorkflowTypesStatistics()`
827
+ - Add workflow filtering with advanced query capabilities including property filters, date ranges, and text search
828
+ - Add workflow dependency system for coordinating workflows that must complete before others start
829
+ - Add workflow retry functionality with optional step result reuse
830
+ - Add workflow properties system for attaching custom metadata to workflows
831
+ - Add external blob storage support for large data that exceeds D1 size limits
832
+ - Add retry configuration for D1 operations with exponential backoff and jitter
833
+ - Add batch workflow enqueueing for efficient bulk operations (up to 100 workflows per batch)
834
+ - Add `handleWorkflowQueueMessage()` for processing queued workflow execution messages
835
+ - Add `handlePollWaitingWorkflows()` to transition waiting workflows to scheduled state when dependencies complete
836
+
837
+ ## [v0.0.2] - 2025-05-15
838
+
839
+ *Minor release with internal improvements*
package/README.md CHANGED
@@ -429,6 +429,10 @@ const typedWorkflow = defineWorkflow<MyInput>(
429
429
  )
430
430
  ```
431
431
 
432
+ ## Changelog
433
+
434
+ See [CHANGELOG.md](./CHANGELOG.md) for a detailed history of changes to this project.
435
+
432
436
  ## Contributing
433
437
 
434
438
  We welcome contributions! Please see our [Contributing Guidelines](CONTRIBUTING.md) for details.
package/dist/index.d.ts CHANGED
@@ -671,8 +671,8 @@ type WorkflowContextOptions = {
671
671
  };
672
672
  type InternalWorkflowContextOptions = WorkflowContextOptions & Required<Pick<WorkflowContextOptions, 'serializer' | 'idFactory'>>;
673
673
  type WorkflowContextInstance = {
674
- call: <I, O>(args: WorkflowCallParams<I, O>) => Promise<void>;
675
- retry: <I, O>(params: RetryWorkflowParams<I, O>) => Promise<void>;
674
+ call: <I, O>(args: WorkflowCallParams<I, O>) => Promise<WorkflowCallResult<O>>;
675
+ retry: <I, O>(params: RetryWorkflowParams<I, O>) => Promise<WorkflowCallResult<O>>;
676
676
  };
677
677
  type QueueWorkflowContextOptions = {
678
678
  QUEUE: Queue<WorkflowQueueMessage>;
@@ -778,6 +778,11 @@ type WorkflowCallParams<I, O> = {
778
778
  /** Optional: Provide an existing workflow instance ID. When provided, this workflow will update the existing instance. This is used when you have an workflow that is marked as waiting or scheduled and want to execute it. */
779
779
  scheduledInstanceId?: string | undefined;
780
780
  };
781
+ type WorkflowCallResult<O, TYPE extends string = string> = Pick<TypedWorkflowRun<never, O, TYPE>, 'instanceId' | 'workflowType' | 'tenantId' | 'parentInstanceId' | 'triggerId' | 'startTime'> & {
782
+ result: O;
783
+ workflowStatus: 'completed';
784
+ endTime: number;
785
+ };
781
786
  type ScheduledWorkflowExecutionStub<O, TYPE extends string = string> = {
782
787
  instanceId: string;
783
788
  workflowType: TYPE;
@@ -983,4 +988,4 @@ type R2ExternalBlobStorageOptions = {
983
988
  */
984
989
  declare function createR2ExternalBlobStorage(options: R2ExternalBlobStorageOptions): ExternalBlobStorage;
985
990
  //#endregion
986
- export { ConsoleWrapper, DateRangeFilter, ExternalBlobStorage, HandleWorkflowQueueMessageParams, InternalWorkflowContextOptions, Log, PossibleValueTypeNames, PossibleValueTypes, PropertyFilter, QueueWorkflowContextOptions, R2ExternalBlobStorageOptions, RetryConfig, Serializer, Step, StepContextOptions, StepCtx, StepWorkflowStatus, StringFilter, ValueTypeMap, WorkflowContext, WorkflowContextInstance, WorkflowContextOptions, WorkflowEnqueueBatchItem, WorkflowFilter, WorkflowFunction, WorkflowProperty, WorkflowPropertyDefinition, WorkflowQueueMessage, WorkflowRun, WorkflowStatus, createCleanupManager, createLogAccessor, createQueueWorkflowContext, createR2ExternalBlobStorage, createStepContext, createWorkflowContext, createWorkflowDependencies, createWorkflowDependency, defaultIdFactory, defaultSerializer, defineWorkflow, deleteWorkflowDependency, deserializeWithExternalStorage, ensureTables, finalizeWorkflowRecord, insertStepRecordFull, insertWorkflowRecord, pushLogToDB, retryD1Operation, serializeWithExternalStorage, tryDeserializeObj, updateWorkflow, updateWorkflowName, upsertWorkflowProperty, workflowTableRowToWorkflowRun };
991
+ export { ConsoleWrapper, DateRangeFilter, ExternalBlobStorage, HandleWorkflowQueueMessageParams, InternalWorkflowContextOptions, Log, PossibleValueTypeNames, PossibleValueTypes, PropertyFilter, QueueWorkflowContextOptions, R2ExternalBlobStorageOptions, RetryConfig, Serializer, Step, StepContextOptions, StepCtx, StepWorkflowStatus, StringFilter, ValueTypeMap, WorkflowCallResult, WorkflowContext, WorkflowContextInstance, WorkflowContextOptions, WorkflowEnqueueBatchItem, WorkflowFilter, WorkflowFunction, WorkflowProperty, WorkflowPropertyDefinition, WorkflowQueueMessage, WorkflowRun, WorkflowStatus, createCleanupManager, createLogAccessor, createQueueWorkflowContext, createR2ExternalBlobStorage, createStepContext, createWorkflowContext, createWorkflowDependencies, createWorkflowDependency, defaultIdFactory, defaultSerializer, defineWorkflow, deleteWorkflowDependency, deserializeWithExternalStorage, ensureTables, finalizeWorkflowRecord, insertStepRecordFull, insertWorkflowRecord, pushLogToDB, retryD1Operation, serializeWithExternalStorage, tryDeserializeObj, updateWorkflow, updateWorkflowName, upsertWorkflowProperty, workflowTableRowToWorkflowRun };
package/dist/index.js CHANGED
@@ -2320,6 +2320,17 @@ function createWorkflowContext(options) {
2320
2320
  result
2321
2321
  });
2322
2322
  await logBatcher.destroy();
2323
+ return {
2324
+ instanceId,
2325
+ workflowType: workflow.workflowType,
2326
+ tenantId,
2327
+ parentInstanceId: parentInstanceId ?? null,
2328
+ triggerId: triggerId ?? null,
2329
+ startTime,
2330
+ result,
2331
+ workflowStatus,
2332
+ endTime
2333
+ };
2323
2334
  } catch (error) {
2324
2335
  const endTime = Date.now();
2325
2336
  const workflowStatus = "failed";
@@ -2345,7 +2356,7 @@ function createWorkflowContext(options) {
2345
2356
  const encodedInput = oldRun?.input;
2346
2357
  if (inputRef === void 0 || encodedInput === void 0) throw new Error(`No input found for instanceId ${retryInstanceId}`);
2347
2358
  const input = await deserializeWithExternalStorage(encodedInput, inputRef, internalContext.serializer, options.externalBlobStorage);
2348
- await call({
2359
+ return await call({
2349
2360
  workflow,
2350
2361
  input,
2351
2362
  workflowName: oldWorkflowName ?? "unknown",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brandboostinggmbh/observable-workflows",
3
- "version": "0.22.0",
3
+ "version": "0.23.0",
4
4
  "description": "My awesome typescript library",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -14,7 +14,8 @@
14
14
  },
15
15
  "author": "Tim <tim.stepanov@brand-boosting.de>",
16
16
  "files": [
17
- "dist"
17
+ "dist",
18
+ "CHANGELOG.md"
18
19
  ],
19
20
  "main": "./dist/index.js",
20
21
  "module": "./dist/index.js",