taskflow-core 0.2.0 → 0.2.1

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 (121) hide show
  1. package/README.md +247 -862
  2. package/dist/agents.d.ts +12 -0
  3. package/dist/agents.d.ts.map +1 -1
  4. package/dist/agents.js +29 -1
  5. package/dist/agents.js.map +1 -1
  6. package/dist/cwd-bridge.d.ts +61 -0
  7. package/dist/cwd-bridge.d.ts.map +1 -0
  8. package/dist/cwd-bridge.js +136 -0
  9. package/dist/cwd-bridge.js.map +1 -0
  10. package/dist/detached-runner.js +31 -5
  11. package/dist/detached-runner.js.map +1 -1
  12. package/dist/exec/driver.d.ts +1 -0
  13. package/dist/exec/driver.d.ts.map +1 -1
  14. package/dist/exec/driver.js +15 -2
  15. package/dist/exec/driver.js.map +1 -1
  16. package/dist/exec/step-kinds.d.ts.map +1 -1
  17. package/dist/exec/step-kinds.js +28 -3
  18. package/dist/exec/step-kinds.js.map +1 -1
  19. package/dist/exec/step.d.ts +1 -0
  20. package/dist/exec/step.d.ts.map +1 -1
  21. package/dist/exec/step.js +18 -0
  22. package/dist/exec/step.js.map +1 -1
  23. package/dist/flowir/compile.d.ts.map +1 -1
  24. package/dist/flowir/compile.js +13 -0
  25. package/dist/flowir/compile.js.map +1 -1
  26. package/dist/host/runner-types.d.ts +16 -0
  27. package/dist/host/runner-types.d.ts.map +1 -1
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +6 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/interpolate.d.ts +4 -0
  33. package/dist/interpolate.d.ts.map +1 -1
  34. package/dist/interpolate.js +14 -0
  35. package/dist/interpolate.js.map +1 -1
  36. package/dist/resources/authority.d.ts +35 -0
  37. package/dist/resources/authority.d.ts.map +1 -0
  38. package/dist/resources/authority.js +67 -0
  39. package/dist/resources/authority.js.map +1 -0
  40. package/dist/resources/backend.d.ts +302 -0
  41. package/dist/resources/backend.d.ts.map +1 -0
  42. package/dist/resources/backend.js +16 -0
  43. package/dist/resources/backend.js.map +1 -0
  44. package/dist/resources/baseline.d.ts +116 -0
  45. package/dist/resources/baseline.d.ts.map +1 -0
  46. package/dist/resources/baseline.js +447 -0
  47. package/dist/resources/baseline.js.map +1 -0
  48. package/dist/resources/canonical-json.d.ts +7 -0
  49. package/dist/resources/canonical-json.d.ts.map +1 -0
  50. package/dist/resources/canonical-json.js +75 -0
  51. package/dist/resources/canonical-json.js.map +1 -0
  52. package/dist/resources/errors.d.ts +23 -0
  53. package/dist/resources/errors.d.ts.map +1 -0
  54. package/dist/resources/errors.js +89 -0
  55. package/dist/resources/errors.js.map +1 -0
  56. package/dist/resources/execution.d.ts +90 -0
  57. package/dist/resources/execution.d.ts.map +1 -0
  58. package/dist/resources/execution.js +581 -0
  59. package/dist/resources/execution.js.map +1 -0
  60. package/dist/resources/index.d.ts +15 -0
  61. package/dist/resources/index.d.ts.map +1 -0
  62. package/dist/resources/index.js +15 -0
  63. package/dist/resources/index.js.map +1 -0
  64. package/dist/resources/journal.d.ts +138 -0
  65. package/dist/resources/journal.d.ts.map +1 -0
  66. package/dist/resources/journal.js +438 -0
  67. package/dist/resources/journal.js.map +1 -0
  68. package/dist/resources/leases.d.ts +51 -0
  69. package/dist/resources/leases.d.ts.map +1 -0
  70. package/dist/resources/leases.js +354 -0
  71. package/dist/resources/leases.js.map +1 -0
  72. package/dist/resources/permits.d.ts +52 -0
  73. package/dist/resources/permits.d.ts.map +1 -0
  74. package/dist/resources/permits.js +240 -0
  75. package/dist/resources/permits.js.map +1 -0
  76. package/dist/resources/persistence.d.ts +63 -0
  77. package/dist/resources/persistence.d.ts.map +1 -0
  78. package/dist/resources/persistence.js +522 -0
  79. package/dist/resources/persistence.js.map +1 -0
  80. package/dist/resources/registry.d.ts +56 -0
  81. package/dist/resources/registry.d.ts.map +1 -0
  82. package/dist/resources/registry.js +139 -0
  83. package/dist/resources/registry.js.map +1 -0
  84. package/dist/resources/resolve.d.ts +49 -0
  85. package/dist/resources/resolve.d.ts.map +1 -0
  86. package/dist/resources/resolve.js +309 -0
  87. package/dist/resources/resolve.js.map +1 -0
  88. package/dist/resources/sandbox.d.ts +72 -0
  89. package/dist/resources/sandbox.d.ts.map +1 -0
  90. package/dist/resources/sandbox.js +952 -0
  91. package/dist/resources/sandbox.js.map +1 -0
  92. package/dist/resources/schema.d.ts +195 -0
  93. package/dist/resources/schema.d.ts.map +1 -0
  94. package/dist/resources/schema.js +231 -0
  95. package/dist/resources/schema.js.map +1 -0
  96. package/dist/resources/types.d.ts +36 -0
  97. package/dist/resources/types.d.ts.map +1 -0
  98. package/dist/resources/types.js +75 -0
  99. package/dist/resources/types.js.map +1 -0
  100. package/dist/runner-core.d.ts +29 -0
  101. package/dist/runner-core.d.ts.map +1 -1
  102. package/dist/runner-core.js +311 -36
  103. package/dist/runner-core.js.map +1 -1
  104. package/dist/runtime/phases/script.d.ts.map +1 -1
  105. package/dist/runtime/phases/script.js +47 -9
  106. package/dist/runtime/phases/script.js.map +1 -1
  107. package/dist/runtime.d.ts +39 -0
  108. package/dist/runtime.d.ts.map +1 -1
  109. package/dist/runtime.js +542 -50
  110. package/dist/runtime.js.map +1 -1
  111. package/dist/schema.d.ts +68 -5
  112. package/dist/schema.d.ts.map +1 -1
  113. package/dist/schema.js +163 -22
  114. package/dist/schema.js.map +1 -1
  115. package/dist/store.d.ts +7 -0
  116. package/dist/store.d.ts.map +1 -1
  117. package/dist/store.js.map +1 -1
  118. package/dist/trace.d.ts +3 -0
  119. package/dist/trace.d.ts.map +1 -1
  120. package/dist/trace.js.map +1 -1
  121. package/package.json +3 -2
@@ -0,0 +1,240 @@
1
+ import * as crypto from "node:crypto";
2
+ import * as path from "node:path";
3
+ import { PersistentFileMutex, readJsonFile, writeJsonAtomicDurable, } from "./persistence.js";
4
+ import { cloneExecutionOwner, minimalCanonicalScopeCover, sameCanonicalScopes, sameExecutionOwner, } from "./types.js";
5
+ export class PermitValidationError extends Error {
6
+ code = "TFWS_PERMIT_INVALID";
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = "PermitValidationError";
10
+ }
11
+ }
12
+ const BRANDED_PERMITS = new WeakSet();
13
+ /** Runtime-only brand check for SandboxPlan sealing. Serialized/reconstructed
14
+ * lookalikes deliberately fail even when every public field is identical. */
15
+ export function isIssuedMutationPermit(value) {
16
+ return typeof value === "object" && value !== null && BRANDED_PERMITS.has(value);
17
+ }
18
+ function freezeOwner(owner) {
19
+ const cloned = cloneExecutionOwner(owner);
20
+ Object.freeze(cloned.ancestry);
21
+ return Object.freeze(cloned);
22
+ }
23
+ function freezeScopes(scopes) {
24
+ return Object.freeze(minimalCanonicalScopeCover(scopes).map((scope) => Object.freeze({ ...scope })));
25
+ }
26
+ function mintPermit(record) {
27
+ const permit = Object.freeze({
28
+ permitId: record.permitId,
29
+ intentId: record.intentId,
30
+ journalEpoch: record.journalEpoch,
31
+ owner: freezeOwner(record.owner),
32
+ issuedAt: record.issuedAt,
33
+ expiresAt: record.expiresAt,
34
+ nonce: record.nonce,
35
+ scopes: freezeScopes(record.scopes),
36
+ });
37
+ BRANDED_PERMITS.add(permit);
38
+ return permit;
39
+ }
40
+ function samePendingIntent(a, b) {
41
+ return a.intentId === b.intentId &&
42
+ a.intentSequence === b.intentSequence &&
43
+ a.journalEpoch === b.journalEpoch &&
44
+ sameExecutionOwner(a.owner, b.owner) &&
45
+ sameCanonicalScopes(a.scopes, b.scopes);
46
+ }
47
+ function samePermitRecord(permit, record) {
48
+ return permit.permitId === record.permitId &&
49
+ permit.intentId === record.intentId &&
50
+ permit.journalEpoch === record.journalEpoch &&
51
+ permit.nonce === record.nonce &&
52
+ permit.issuedAt === record.issuedAt &&
53
+ permit.expiresAt === record.expiresAt &&
54
+ sameExecutionOwner(permit.owner, record.owner) &&
55
+ sameCanonicalScopes(permit.scopes, record.scopes);
56
+ }
57
+ export class MutationPermitRegistry {
58
+ statePath;
59
+ journalEpoch;
60
+ now;
61
+ #mutex;
62
+ constructor(options) {
63
+ if (!Number.isSafeInteger(options.journalEpoch) || options.journalEpoch < 1) {
64
+ throw new Error("journalEpoch must be a positive safe integer");
65
+ }
66
+ this.journalEpoch = options.journalEpoch;
67
+ this.statePath = path.join(options.directory, "mutation-permits.json");
68
+ this.now = options.now ?? Date.now;
69
+ this.#mutex = new PersistentFileMutex(path.join(options.directory, "mutation-permits.lock"), options);
70
+ }
71
+ #read() {
72
+ const state = readJsonFile(this.statePath, { version: 1, records: [] });
73
+ if (state.version !== 1 || !Array.isArray(state.records))
74
+ throw new Error(`Invalid permit registry: ${this.statePath}`);
75
+ return state;
76
+ }
77
+ #expire(state) {
78
+ let changed = false;
79
+ const now = this.now();
80
+ for (const record of state.records) {
81
+ // expiresAt bounds the prepare-to-activate replay window. Once activated,
82
+ // an execution may legitimately outlive that window; its live lease and
83
+ // the journal's crash recovery own termination from that point forward.
84
+ // Expiring an active permit here would turn every long-running successful
85
+ // agent into dirty-unknown when it attempts to commit.
86
+ if (record.state === "issued" && Date.parse(record.expiresAt) <= now) {
87
+ record.state = "expired";
88
+ record.settledAt = new Date(now).toISOString();
89
+ changed = true;
90
+ }
91
+ }
92
+ return changed;
93
+ }
94
+ /** Internal durability-plane hook. Call only after the matching intent WAL
95
+ * record has been appended and fsynced. JournalManager is the public issuer. */
96
+ async issueForDurableIntent(intent, ttlMs) {
97
+ if (intent.journalEpoch !== this.journalEpoch)
98
+ throw new PermitValidationError("Journal epoch does not match permit registry epoch");
99
+ if (!Number.isFinite(ttlMs) || ttlMs <= 0)
100
+ throw new Error("Permit ttlMs must be positive");
101
+ const scopes = minimalCanonicalScopeCover(intent.scopes);
102
+ if (scopes.length === 0)
103
+ throw new PermitValidationError("A mutation permit requires at least one scope");
104
+ return this.#mutex.runExclusive(() => {
105
+ const state = this.#read();
106
+ const changed = this.#expire(state);
107
+ if (state.records.some((record) => record.intentId === intent.intentId && (record.state === "issued" || record.state === "active"))) {
108
+ throw new PermitValidationError(`Intent ${intent.intentId} already has a live permit`);
109
+ }
110
+ const issuedAtMs = this.now();
111
+ const record = {
112
+ intentId: intent.intentId,
113
+ intentSequence: intent.intentSequence,
114
+ journalEpoch: intent.journalEpoch,
115
+ owner: cloneExecutionOwner(intent.owner),
116
+ scopes,
117
+ permitId: crypto.randomUUID(),
118
+ nonce: crypto.randomBytes(24).toString("base64url"),
119
+ issuedAt: new Date(issuedAtMs).toISOString(),
120
+ expiresAt: new Date(issuedAtMs + ttlMs).toISOString(),
121
+ state: "issued",
122
+ };
123
+ state.records.push(record);
124
+ writeJsonAtomicDurable(this.statePath, state);
125
+ void changed;
126
+ return mintPermit(record);
127
+ });
128
+ }
129
+ /** Atomically activate every permit in a sealed execution plan exactly once. */
130
+ async activateMany(permits, activation) {
131
+ if (permits.length === 0)
132
+ throw new PermitValidationError("No permits supplied for activation");
133
+ await this.#mutex.runExclusive(() => {
134
+ const state = this.#read();
135
+ const expired = this.#expire(state);
136
+ if (expired)
137
+ writeJsonAtomicDurable(this.statePath, state);
138
+ const seen = new Set();
139
+ const records = [];
140
+ for (const permit of permits) {
141
+ if (!isIssuedMutationPermit(permit)) {
142
+ throw new PermitValidationError("Unbranded or reconstructed mutation permit");
143
+ }
144
+ if (seen.has(permit.permitId))
145
+ throw new PermitValidationError(`Duplicate permit ${permit.permitId}`);
146
+ seen.add(permit.permitId);
147
+ const record = state.records.find((candidate) => candidate.permitId === permit.permitId);
148
+ if (!record || !samePermitRecord(permit, record))
149
+ throw new PermitValidationError(`Permit ${permit.permitId} does not match its registry record`);
150
+ if (record.state !== "issued")
151
+ throw new PermitValidationError(`Permit ${permit.permitId} is ${record.state}; activation replay rejected`);
152
+ if (record.journalEpoch !== this.journalEpoch)
153
+ throw new PermitValidationError(`Permit ${permit.permitId} belongs to an obsolete journal epoch`);
154
+ if (!sameExecutionOwner(record.owner, activation.owner))
155
+ throw new PermitValidationError(`Permit ${permit.permitId} owner mismatch`);
156
+ const pending = activation.pendingIntents.find((candidate) => candidate.intentId === record.intentId);
157
+ if (!pending || !samePendingIntent(record, pending))
158
+ throw new PermitValidationError(`Permit ${permit.permitId} has no identical pending journal intent`);
159
+ records.push(record);
160
+ }
161
+ const activatedAt = new Date(this.now()).toISOString();
162
+ for (const record of records) {
163
+ record.state = "active";
164
+ record.activatedAt = activatedAt;
165
+ }
166
+ if (records.length > 0)
167
+ writeJsonAtomicDurable(this.statePath, state);
168
+ });
169
+ }
170
+ async assertIntentActive(intentId, owner) {
171
+ await this.#mutex.runExclusive(() => {
172
+ const state = this.#read();
173
+ if (this.#expire(state))
174
+ writeJsonAtomicDurable(this.statePath, state);
175
+ const active = state.records.find((record) => record.intentId === intentId && record.state === "active");
176
+ if (!active)
177
+ throw new PermitValidationError(`Intent ${intentId} has no active mutation permit`);
178
+ if (!sameExecutionOwner(active.owner, owner))
179
+ throw new PermitValidationError(`Intent ${intentId} active permit owner mismatch`);
180
+ });
181
+ }
182
+ async assertActive(permit, owner) {
183
+ await this.#mutex.runExclusive(() => {
184
+ const state = this.#read();
185
+ const expired = this.#expire(state);
186
+ if (expired)
187
+ writeJsonAtomicDurable(this.statePath, state);
188
+ if (!isIssuedMutationPermit(permit))
189
+ throw new PermitValidationError("Unbranded mutation permit");
190
+ const record = state.records.find((candidate) => candidate.permitId === permit.permitId);
191
+ if (!record || !samePermitRecord(permit, record) || record.state !== "active") {
192
+ throw new PermitValidationError(`Permit ${permit.permitId} is not active`);
193
+ }
194
+ if (!sameExecutionOwner(record.owner, owner))
195
+ throw new PermitValidationError(`Permit ${permit.permitId} owner mismatch`);
196
+ });
197
+ }
198
+ async settleIntent(intentId) {
199
+ await this.#mutex.runExclusive(() => {
200
+ const state = this.#read();
201
+ let changed = this.#expire(state);
202
+ const settledAt = new Date(this.now()).toISOString();
203
+ for (const record of state.records) {
204
+ if (record.intentId !== intentId || (record.state !== "issued" && record.state !== "active"))
205
+ continue;
206
+ record.state = "settled";
207
+ record.settledAt = settledAt;
208
+ changed = true;
209
+ }
210
+ if (changed)
211
+ writeJsonAtomicDurable(this.statePath, state);
212
+ });
213
+ }
214
+ async stateOf(permitId) {
215
+ return this.#mutex.runExclusive(() => {
216
+ const state = this.#read();
217
+ if (this.#expire(state))
218
+ writeJsonAtomicDurable(this.statePath, state);
219
+ return state.records.find((record) => record.permitId === permitId)?.state;
220
+ });
221
+ }
222
+ async invalidateOlderEpochs() {
223
+ return this.#mutex.runExclusive(() => {
224
+ const state = this.#read();
225
+ let count = 0;
226
+ const settledAt = new Date(this.now()).toISOString();
227
+ for (const record of state.records) {
228
+ if (record.journalEpoch === this.journalEpoch || (record.state !== "issued" && record.state !== "active"))
229
+ continue;
230
+ record.state = "expired";
231
+ record.settledAt = settledAt;
232
+ count++;
233
+ }
234
+ if (count > 0)
235
+ writeJsonAtomicDurable(this.statePath, state);
236
+ return count;
237
+ });
238
+ }
239
+ }
240
+ //# sourceMappingURL=permits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permits.js","sourceRoot":"","sources":["../../src/resources/permits.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /** Exact, platform-native process-birth identity when the platform exposes one.
2
+ * Never return an uptime estimate or a lower-precision timestamp: incomparable
3
+ * identities could falsely reclaim a live owner's lock. */
4
+ export declare function readProcessBirthToken(pid: number): string | undefined;
5
+ export type ProcessBirthTokenKind = "native" | "opaque";
6
+ export interface ProcessIdentity {
7
+ pid: number;
8
+ birthToken: string;
9
+ birthTokenKind: ProcessBirthTokenKind;
10
+ }
11
+ export interface ObservedProcess {
12
+ alive: boolean;
13
+ /** Omitted when exact cross-process birth identity is unavailable. Alive but
14
+ * unidentifiable owners are never reclaimed. */
15
+ birthToken?: string;
16
+ birthTokenKind?: ProcessBirthTokenKind;
17
+ }
18
+ export type ProcessInspector = (pid: number) => ObservedProcess;
19
+ export interface PersistentCoordinatorOptions {
20
+ directory: string;
21
+ namespace?: string;
22
+ pollMs?: number;
23
+ /** A malformed mutex file is recoverable only after this grace period. */
24
+ corruptLockStaleMs?: number;
25
+ processIdentity?: ProcessIdentity;
26
+ inspectProcess?: ProcessInspector;
27
+ now?: () => number;
28
+ }
29
+ export declare class CoordinatorTimeoutError extends Error {
30
+ readonly code = "TFWS_LEASE_TIMEOUT";
31
+ constructor(message: string);
32
+ }
33
+ export declare class CoordinatorAbortError extends Error {
34
+ readonly code = "ABORT_ERR";
35
+ constructor(message?: string);
36
+ }
37
+ export declare function defaultProcessIdentity(): ProcessIdentity;
38
+ export declare function defaultProcessInspector(pid: number): ObservedProcess;
39
+ export declare function namespaceToken(namespace: string): string;
40
+ export declare function ensureDirectory(directory: string): void;
41
+ export declare function fsyncDirectory(directory: string): void;
42
+ export declare function writeJsonAtomicDurable(filePath: string, value: unknown): void;
43
+ export declare function readJsonFile<T>(filePath: string, fallback: T): T;
44
+ export declare function appendJsonLinesDurable(filePath: string, records: readonly unknown[]): void;
45
+ export declare function readJsonLines<T>(filePath: string): T[];
46
+ export interface MutexAcquireOptions {
47
+ timeoutMs?: number;
48
+ signal?: AbortSignal;
49
+ }
50
+ export declare class PersistentFileMutex {
51
+ #private;
52
+ readonly lockPath: string;
53
+ readonly identity: ProcessIdentity;
54
+ readonly inspectProcess: ProcessInspector;
55
+ readonly pollMs: number;
56
+ readonly corruptLockStaleMs: number;
57
+ readonly now: () => number;
58
+ constructor(lockPath: string, options?: Omit<PersistentCoordinatorOptions, "directory">);
59
+ acquire(options?: MutexAcquireOptions): Promise<() => void>;
60
+ runExclusive<T>(fn: () => T | Promise<T>, options?: MutexAcquireOptions): Promise<T>;
61
+ }
62
+ export declare function isPersistedOwnerStale(record: ProcessIdentity, identity: ProcessIdentity, inspect: ProcessInspector): boolean;
63
+ //# sourceMappingURL=persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/resources/persistence.ts"],"names":[],"mappings":"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"}