@workglow/task-graph 0.2.37 → 0.3.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.
Files changed (46) hide show
  1. package/README.md +174 -46
  2. package/dist/browser.js +639 -368
  3. package/dist/browser.js.map +19 -15
  4. package/dist/bun.js +639 -368
  5. package/dist/bun.js.map +19 -15
  6. package/dist/cache/CacheJanitor.d.ts +27 -0
  7. package/dist/cache/CacheJanitor.d.ts.map +1 -0
  8. package/dist/cache/CachePolicy.d.ts +16 -0
  9. package/dist/cache/CachePolicy.d.ts.map +1 -0
  10. package/dist/cache/CacheRegistry.d.ts +30 -0
  11. package/dist/cache/CacheRegistry.d.ts.map +1 -0
  12. package/dist/cache/RunPrivateCacheRepo.d.ts +56 -0
  13. package/dist/cache/RunPrivateCacheRepo.d.ts.map +1 -0
  14. package/dist/cache/index.d.ts +10 -0
  15. package/dist/cache/index.d.ts.map +1 -0
  16. package/dist/common.d.ts +1 -0
  17. package/dist/common.d.ts.map +1 -1
  18. package/dist/node.js +639 -368
  19. package/dist/node.js.map +19 -15
  20. package/dist/storage/TaskOutputRepository.d.ts +40 -4
  21. package/dist/storage/TaskOutputRepository.d.ts.map +1 -1
  22. package/dist/storage/TaskOutputTabularRepository.d.ts +27 -0
  23. package/dist/storage/TaskOutputTabularRepository.d.ts.map +1 -1
  24. package/dist/task/CacheCoordinator.d.ts +17 -0
  25. package/dist/task/CacheCoordinator.d.ts.map +1 -1
  26. package/dist/task/FallbackTask.d.ts +0 -1
  27. package/dist/task/FallbackTask.d.ts.map +1 -1
  28. package/dist/task/FallbackTaskRunner.d.ts +8 -0
  29. package/dist/task/FallbackTaskRunner.d.ts.map +1 -1
  30. package/dist/task/ITask.d.ts +21 -1
  31. package/dist/task/ITask.d.ts.map +1 -1
  32. package/dist/task/Task.d.ts +50 -0
  33. package/dist/task/Task.d.ts.map +1 -1
  34. package/dist/task/TaskJSON.d.ts +0 -13
  35. package/dist/task/TaskJSON.d.ts.map +1 -1
  36. package/dist/task/TaskRunner.d.ts +28 -0
  37. package/dist/task/TaskRunner.d.ts.map +1 -1
  38. package/dist/task-graph/Conversions.d.ts.map +1 -1
  39. package/dist/task-graph/StreamPump.d.ts +8 -0
  40. package/dist/task-graph/StreamPump.d.ts.map +1 -1
  41. package/dist/task-graph/TaskGraph.d.ts +7 -0
  42. package/dist/task-graph/TaskGraph.d.ts.map +1 -1
  43. package/dist/task-graph/TaskGraphRunner.d.ts +45 -0
  44. package/dist/task-graph/TaskGraphRunner.d.ts.map +1 -1
  45. package/package.json +7 -7
  46. package/src/EXECUTION_MODEL.md +91 -2
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Steven Roussey <sroussey@gmail.com>
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { TaskOutputRepository } from "../storage/TaskOutputRepository";
7
+ export interface CacheJanitorOptions {
8
+ privateBacking: TaskOutputRepository;
9
+ }
10
+ /**
11
+ * Periodic cleanup helper for run-private cache entries left behind by runs
12
+ * that crashed and were never restarted.
13
+ *
14
+ * Run-private rows are namespaced by `RunPrivateCacheRepo` with the taskType
15
+ * prefix `__run:`. This janitor sweeps those rows when they are older than
16
+ * `olderThanMs`. Entries lacking the prefix (deterministic cache, shared tier)
17
+ * are not touched.
18
+ *
19
+ * Apps schedule the sweep themselves (cron, periodic worker, on startup) —
20
+ * libs does not run it automatically.
21
+ */
22
+ export declare class CacheJanitor {
23
+ private readonly privateBacking;
24
+ constructor({ privateBacking }: CacheJanitorOptions);
25
+ sweepStaleRunPrivate(olderThanMs: number): Promise<void>;
26
+ }
27
+ //# sourceMappingURL=CacheJanitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheJanitor.d.ts","sourceRoot":"","sources":["../../src/cache/CacheJanitor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAE5E,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,oBAAoB,CAAC;CACtC;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuB;IAEtD,YAAY,EAAE,cAAc,EAAE,EAAE,mBAAmB,EAElD;IAEK,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7D;CACF"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Steven Roussey <sroussey@gmail.com>
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export type CachePolicy = {
7
+ kind: "deterministic";
8
+ } | {
9
+ kind: "private";
10
+ } | {
11
+ kind: "none";
12
+ };
13
+ export declare const DEFAULT_CACHE_POLICY: CachePolicy;
14
+ export declare function isPolicyCached(policy: CachePolicy): boolean;
15
+ export declare function isPolicyPrivate(policy: CachePolicy): boolean;
16
+ //# sourceMappingURL=CachePolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CachePolicy.d.ts","sourceRoot":"","sources":["../../src/cache/CachePolicy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7F,eAAO,MAAM,oBAAoB,EAAE,WAAuC,CAAC;AAE3E,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAE3D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAE5D"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Steven Roussey <sroussey@gmail.com>
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { TaskOutputRepository } from "../storage/TaskOutputRepository";
7
+ /**
8
+ * Two-slot registry of task output repositories selected by `CachePolicy.kind`.
9
+ *
10
+ * - `deterministic` — shared cache for tasks whose outputs are determined entirely
11
+ * by their inputs. Same inputs → same outputs, safe to share across runs and
12
+ * (in app deployments like builder) across projects.
13
+ * - `private` — per-run cache for tasks producing non-deterministic outputs worth
14
+ * keeping (e.g., image generation without a seed). Namespaced by `runId` so
15
+ * two runs of the same workflow do not see each other's data.
16
+ *
17
+ * Both slots are optional. When a slot is unset, caching for matching tasks is
18
+ * a silent no-op — the task still runs correctly, just uncached.
19
+ */
20
+ export interface CacheRegistry {
21
+ deterministic?: TaskOutputRepository;
22
+ private?: TaskOutputRepository;
23
+ }
24
+ export declare const CACHE_REGISTRY: import("@workglow/util").ServiceToken<CacheRegistry>;
25
+ export declare class DefaultCacheRegistry implements CacheRegistry {
26
+ deterministic?: TaskOutputRepository;
27
+ private?: TaskOutputRepository;
28
+ constructor(init?: Partial<CacheRegistry>);
29
+ }
30
+ //# sourceMappingURL=CacheRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheRegistry.d.ts","sourceRoot":"","sources":["../../src/cache/CacheRegistry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAE5E;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,aAAa;IAC5B,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC;AAED,eAAO,MAAM,cAAc,sDAA+D,CAAC;AAE3F,qBAAa,oBAAqB,YAAW,aAAa;IACjD,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAEtC,YAAY,IAAI,GAAE,OAAO,CAAC,aAAa,CAAM,EAG5C;CACF"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Steven Roussey <sroussey@gmail.com>
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { TaskOutputRepository } from "../storage/TaskOutputRepository";
7
+ import type { TaskInput, TaskOutput } from "../task/TaskTypes";
8
+ export interface RunPrivateCacheRepoOptions {
9
+ backing: TaskOutputRepository;
10
+ runId: string;
11
+ }
12
+ /**
13
+ * Wraps a TaskOutputRepository so that all entries are namespaced by `runId`.
14
+ *
15
+ * Namespacing happens at the `taskType` axis: rows are stored as
16
+ * `__run:${runId}::${taskType}` in the backing store. The input fingerprint is
17
+ * unchanged, so deterministic-style keying still works.
18
+ *
19
+ * - Two wrappers with the same `runId` (e.g., a restart after a crash) see each
20
+ * other's writes via the backing store — that's the restart-survival contract.
21
+ * - Two wrappers with different `runId`s see only their own entries.
22
+ */
23
+ export declare class RunPrivateCacheRepo extends TaskOutputRepository {
24
+ private readonly backing;
25
+ private readonly runId;
26
+ constructor({ backing, runId }: RunPrivateCacheRepoOptions);
27
+ private ns;
28
+ saveOutput(taskType: string, inputs: TaskInput, output: TaskOutput, createdAt?: Date): Promise<void>;
29
+ getOutput(taskType: string, inputs: TaskInput): Promise<TaskOutput | undefined>;
30
+ /**
31
+ * Override of `TaskOutputRepository.clear()` that only deletes entries
32
+ * namespaced under THIS wrapper's `runId`. Entries from other runs are not
33
+ * touched. Use the backing repository directly if you need a global clear.
34
+ */
35
+ clear(): Promise<void>;
36
+ /**
37
+ * Delete every entry written through this wrapper's `runId`. Called by the
38
+ * graph runner after a successful run, and by the janitor for stale runs.
39
+ * Requires the backing repository to implement `deleteByTaskTypePrefix`.
40
+ */
41
+ clearRun(): Promise<void>;
42
+ /**
43
+ * Returns the count of entries namespaced under THIS wrapper's `runId`.
44
+ * Consistent with `saveOutput`/`getOutput`/`clear()` being run-scoped.
45
+ */
46
+ size(): Promise<number>;
47
+ /**
48
+ * Override of `TaskOutputRepository.clearOlderThan()` scoped to THIS
49
+ * wrapper's `runId`. Without the scope override, the wrapper would
50
+ * accidentally prune the entire backing store (including deterministic
51
+ * cache entries and other runs' private rows).
52
+ */
53
+ clearOlderThan(olderThanInMs: number): Promise<void>;
54
+ isDurable(): boolean;
55
+ }
56
+ //# sourceMappingURL=RunPrivateCacheRepo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunPrivateCacheRepo.d.ts","sourceRoot":"","sources":["../../src/cache/RunPrivateCacheRepo.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/D,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;GAUG;AACH,qBAAa,mBAAoB,SAAQ,oBAAoB;IAC3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,0BAA0B,EAIzD;IAED,OAAO,CAAC,EAAE;IAIG,UAAU,CACrB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,UAAU,EAClB,SAAS,CAAC,EAAE,IAAI,GACf,OAAO,CAAC,IAAI,CAAC,CAEf;IAEY,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAE3F;IAED;;;;OAIG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAElC;IAED;;;;OAIG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAErC;IAED;;;OAGG;IACU,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAEnC;IAED;;;;;OAKG;IACU,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhE;IAEM,SAAS,IAAI,OAAO,CAE1B;CACF"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Steven Roussey <sroussey@gmail.com>
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export * from "./CacheJanitor";
7
+ export * from "./CachePolicy";
8
+ export * from "./CacheRegistry";
9
+ export * from "./RunPrivateCacheRepo";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC"}
package/dist/common.d.ts CHANGED
@@ -31,6 +31,7 @@ export * from "./task-graph/TransformRegistry";
31
31
  export * from "./task-graph/TransformTypes";
32
32
  export * from "./task-graph/transforms";
33
33
  export * from "./task-graph/autoConnect";
34
+ export * from "./cache";
34
35
  export * from "./task/CacheCoordinator";
35
36
  export * from "./task/StreamProcessor";
36
37
  export * from "./task/TaskRunContext";
@@ -1 +1 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAE5C,cAAc,oCAAoC,CAAC;AACnD,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAE7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,wBAAwB,CAAC;AACvC,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAEhD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AAEzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,QAAQ,CAAC;AAEvB,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uCAAuC,CAAC;AACtD,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAE5C,cAAc,oCAAoC,CAAC;AACnD,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAE7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,wBAAwB,CAAC;AACvC,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAEhD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AAEzC,cAAc,SAAS,CAAC;AACxB,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,QAAQ,CAAC;AAEvB,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uCAAuC,CAAC;AACtD,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC"}