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.
- package/README.md +247 -862
- package/dist/agents.d.ts +12 -0
- package/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +29 -1
- package/dist/agents.js.map +1 -1
- package/dist/cwd-bridge.d.ts +61 -0
- package/dist/cwd-bridge.d.ts.map +1 -0
- package/dist/cwd-bridge.js +136 -0
- package/dist/cwd-bridge.js.map +1 -0
- package/dist/detached-runner.js +31 -5
- package/dist/detached-runner.js.map +1 -1
- package/dist/exec/driver.d.ts +1 -0
- package/dist/exec/driver.d.ts.map +1 -1
- package/dist/exec/driver.js +15 -2
- package/dist/exec/driver.js.map +1 -1
- package/dist/exec/step-kinds.d.ts.map +1 -1
- package/dist/exec/step-kinds.js +28 -3
- package/dist/exec/step-kinds.js.map +1 -1
- package/dist/exec/step.d.ts +1 -0
- package/dist/exec/step.d.ts.map +1 -1
- package/dist/exec/step.js +18 -0
- package/dist/exec/step.js.map +1 -1
- package/dist/flowir/compile.d.ts.map +1 -1
- package/dist/flowir/compile.js +13 -0
- package/dist/flowir/compile.js.map +1 -1
- package/dist/host/runner-types.d.ts +16 -0
- package/dist/host/runner-types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/interpolate.d.ts +4 -0
- package/dist/interpolate.d.ts.map +1 -1
- package/dist/interpolate.js +14 -0
- package/dist/interpolate.js.map +1 -1
- package/dist/resources/authority.d.ts +35 -0
- package/dist/resources/authority.d.ts.map +1 -0
- package/dist/resources/authority.js +67 -0
- package/dist/resources/authority.js.map +1 -0
- package/dist/resources/backend.d.ts +302 -0
- package/dist/resources/backend.d.ts.map +1 -0
- package/dist/resources/backend.js +16 -0
- package/dist/resources/backend.js.map +1 -0
- package/dist/resources/baseline.d.ts +116 -0
- package/dist/resources/baseline.d.ts.map +1 -0
- package/dist/resources/baseline.js +447 -0
- package/dist/resources/baseline.js.map +1 -0
- package/dist/resources/canonical-json.d.ts +7 -0
- package/dist/resources/canonical-json.d.ts.map +1 -0
- package/dist/resources/canonical-json.js +75 -0
- package/dist/resources/canonical-json.js.map +1 -0
- package/dist/resources/errors.d.ts +23 -0
- package/dist/resources/errors.d.ts.map +1 -0
- package/dist/resources/errors.js +89 -0
- package/dist/resources/errors.js.map +1 -0
- package/dist/resources/execution.d.ts +90 -0
- package/dist/resources/execution.d.ts.map +1 -0
- package/dist/resources/execution.js +581 -0
- package/dist/resources/execution.js.map +1 -0
- package/dist/resources/index.d.ts +15 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +15 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/journal.d.ts +138 -0
- package/dist/resources/journal.d.ts.map +1 -0
- package/dist/resources/journal.js +438 -0
- package/dist/resources/journal.js.map +1 -0
- package/dist/resources/leases.d.ts +51 -0
- package/dist/resources/leases.d.ts.map +1 -0
- package/dist/resources/leases.js +354 -0
- package/dist/resources/leases.js.map +1 -0
- package/dist/resources/permits.d.ts +52 -0
- package/dist/resources/permits.d.ts.map +1 -0
- package/dist/resources/permits.js +240 -0
- package/dist/resources/permits.js.map +1 -0
- package/dist/resources/persistence.d.ts +63 -0
- package/dist/resources/persistence.d.ts.map +1 -0
- package/dist/resources/persistence.js +522 -0
- package/dist/resources/persistence.js.map +1 -0
- package/dist/resources/registry.d.ts +56 -0
- package/dist/resources/registry.d.ts.map +1 -0
- package/dist/resources/registry.js +139 -0
- package/dist/resources/registry.js.map +1 -0
- package/dist/resources/resolve.d.ts +49 -0
- package/dist/resources/resolve.d.ts.map +1 -0
- package/dist/resources/resolve.js +309 -0
- package/dist/resources/resolve.js.map +1 -0
- package/dist/resources/sandbox.d.ts +72 -0
- package/dist/resources/sandbox.d.ts.map +1 -0
- package/dist/resources/sandbox.js +952 -0
- package/dist/resources/sandbox.js.map +1 -0
- package/dist/resources/schema.d.ts +195 -0
- package/dist/resources/schema.d.ts.map +1 -0
- package/dist/resources/schema.js +231 -0
- package/dist/resources/schema.js.map +1 -0
- package/dist/resources/types.d.ts +36 -0
- package/dist/resources/types.d.ts.map +1 -0
- package/dist/resources/types.js +75 -0
- package/dist/resources/types.js.map +1 -0
- package/dist/runner-core.d.ts +29 -0
- package/dist/runner-core.d.ts.map +1 -1
- package/dist/runner-core.js +311 -36
- package/dist/runner-core.js.map +1 -1
- package/dist/runtime/phases/script.d.ts.map +1 -1
- package/dist/runtime/phases/script.js +47 -9
- package/dist/runtime/phases/script.js.map +1 -1
- package/dist/runtime.d.ts +39 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +542 -50
- package/dist/runtime.js.map +1 -1
- package/dist/schema.d.ts +68 -5
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +163 -22
- package/dist/schema.js.map +1 -1
- package/dist/store.d.ts +7 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js.map +1 -1
- package/dist/trace.d.ts +3 -0
- package/dist/trace.d.ts.map +1 -1
- package/dist/trace.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type PersistentCoordinatorOptions, type ProcessIdentity } from "./persistence.ts";
|
|
2
|
+
import { type ExecutionOwner, type LeaseRequest, type ResourceAccess } from "./types.ts";
|
|
3
|
+
export type { CanonicalLeaseKey, ExecutionOwner, LeaseRequest, ResourceAccess } from "./types.ts";
|
|
4
|
+
export { canonicalLeaseKeysOverlap } from "./types.ts";
|
|
5
|
+
export { CoordinatorAbortError, CoordinatorTimeoutError } from "./persistence.ts";
|
|
6
|
+
interface PersistedLeaseRequest {
|
|
7
|
+
key: {
|
|
8
|
+
resourceDomainId: string;
|
|
9
|
+
canonicalPrefix: string;
|
|
10
|
+
};
|
|
11
|
+
access: ResourceAccess;
|
|
12
|
+
}
|
|
13
|
+
interface PersistedLeaseRecord extends ProcessIdentity {
|
|
14
|
+
leaseId: string;
|
|
15
|
+
leaseToken: string;
|
|
16
|
+
releaseMarkerToken: string;
|
|
17
|
+
owner: ExecutionOwner;
|
|
18
|
+
requests: PersistedLeaseRequest[];
|
|
19
|
+
acquiredAt: number;
|
|
20
|
+
expiresAt?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface LeaseAcquireOptions {
|
|
23
|
+
timeoutMs?: number;
|
|
24
|
+
signal?: AbortSignal;
|
|
25
|
+
/** Optional renewable deadline. Omit for process-lifetime ownership. */
|
|
26
|
+
leaseTtlMs?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface LeaseHandle {
|
|
29
|
+
readonly leaseId: string;
|
|
30
|
+
readonly owner: ExecutionOwner;
|
|
31
|
+
readonly requests: readonly LeaseRequest[];
|
|
32
|
+
readonly acquiredAt: number;
|
|
33
|
+
readonly expiresAt?: number;
|
|
34
|
+
release(): Promise<void>;
|
|
35
|
+
renew(ttlMs: number): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
export interface LeaseCoordinatorOptions extends PersistentCoordinatorOptions {
|
|
38
|
+
registryId: string;
|
|
39
|
+
}
|
|
40
|
+
export declare class PersistentLeaseCoordinator {
|
|
41
|
+
#private;
|
|
42
|
+
readonly statePath: string;
|
|
43
|
+
readonly identity: ProcessIdentity;
|
|
44
|
+
readonly now: () => number;
|
|
45
|
+
readonly pollMs: number;
|
|
46
|
+
constructor(options: LeaseCoordinatorOptions);
|
|
47
|
+
acquire(requests: readonly LeaseRequest[], options?: LeaseAcquireOptions): Promise<LeaseHandle>;
|
|
48
|
+
recoverStale(): Promise<string[]>;
|
|
49
|
+
list(): Promise<Array<Omit<PersistedLeaseRecord, "leaseToken" | "releaseMarkerToken">>>;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=leases.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leases.d.ts","sourceRoot":"","sources":["../../src/resources/leases.ts"],"names":[],"mappings":"AAGA,OAAO,EAUN,KAAK,4BAA4B,EACjC,KAAK,eAAe,EACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAON,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAClG,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAElF,UAAU,qBAAqB;IAC9B,GAAG,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,MAAM,EAAE,cAAc,CAAC;CACvB;AAED,UAAU,oBAAqB,SAAQ,eAAe;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,cAAc,CAAC;IACtB,QAAQ,EAAE,qBAAqB,EAAE,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAeD,MAAM,WAAW,mBAAmB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,uBAAwB,SAAQ,4BAA4B;IAC5E,UAAU,EAAE,MAAM,CAAC;CACnB;AAsDD,qBAAa,0BAA0B;;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAIxB,YAAY,OAAO,EAAE,uBAAuB,EAS3C;IAyHK,OAAO,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,WAAW,CAAC,CAyGxG;IAeK,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAQtC;IAEK,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,YAAY,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAQ5F;CACD"}
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
import * as crypto from "node:crypto";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import { CoordinatorAbortError, CoordinatorTimeoutError, PersistentFileMutex, defaultProcessIdentity, defaultProcessInspector, isPersistedOwnerStale, namespaceToken, readJsonFile, writeJsonAtomicDurable, } from "./persistence.js";
|
|
5
|
+
import { canonicalLeaseKeysOverlap, canonicalPrefixContains, cloneExecutionOwner, compareLeaseKeys, normalizeLeaseKey, sameExecutionOwner, } from "./types.js";
|
|
6
|
+
export { canonicalLeaseKeysOverlap } from "./types.js";
|
|
7
|
+
export { CoordinatorAbortError, CoordinatorTimeoutError } from "./persistence.js";
|
|
8
|
+
function accessRank(access) {
|
|
9
|
+
return access === "read-write" ? 1 : 0;
|
|
10
|
+
}
|
|
11
|
+
function normalizeRequests(requests) {
|
|
12
|
+
if (requests.length === 0)
|
|
13
|
+
throw new Error("At least one lease request is required");
|
|
14
|
+
const normalized = requests.map((request) => ({
|
|
15
|
+
key: normalizeLeaseKey(request.key),
|
|
16
|
+
access: request.access,
|
|
17
|
+
owner: cloneExecutionOwner(request.owner),
|
|
18
|
+
}));
|
|
19
|
+
const owner = normalized[0].owner;
|
|
20
|
+
if (!normalized.every((request) => sameExecutionOwner(request.owner, owner))) {
|
|
21
|
+
throw new Error("Atomic multi-key acquisition requires one identical execution owner");
|
|
22
|
+
}
|
|
23
|
+
for (const request of normalized) {
|
|
24
|
+
if (request.access !== "read-only" && request.access !== "read-write") {
|
|
25
|
+
throw new Error(`Unsupported lease access: ${String(request.access)}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const deduped = new Map();
|
|
29
|
+
for (const request of normalized) {
|
|
30
|
+
const id = `${request.key.resourceDomainId}\0${request.key.canonicalPrefix}`;
|
|
31
|
+
const prior = deduped.get(id);
|
|
32
|
+
if (!prior || accessRank(request.access) > accessRank(prior.access))
|
|
33
|
+
deduped.set(id, request);
|
|
34
|
+
}
|
|
35
|
+
return [...deduped.values()].sort((a, b) => compareLeaseKeys(a.key, b.key) || accessRank(a.access) - accessRank(b.access));
|
|
36
|
+
}
|
|
37
|
+
function canReenter(existing, requested) {
|
|
38
|
+
const lineage = sameExecutionOwner(existing.owner, requested.owner) ||
|
|
39
|
+
(requested.owner.runId === existing.owner.runId && requested.owner.ancestry.includes(existing.owner.attemptId));
|
|
40
|
+
if (!lineage)
|
|
41
|
+
return false;
|
|
42
|
+
return existing.requests.some((held) => held.key.resourceDomainId === requested.key.resourceDomainId &&
|
|
43
|
+
canonicalPrefixContains(held.key.canonicalPrefix, requested.key.canonicalPrefix) &&
|
|
44
|
+
accessRank(requested.access) <= accessRank(held.access));
|
|
45
|
+
}
|
|
46
|
+
function requestsConflict(existing, requested) {
|
|
47
|
+
for (const next of requested) {
|
|
48
|
+
for (const held of existing.requests) {
|
|
49
|
+
if (!canonicalLeaseKeysOverlap(held.key, next.key))
|
|
50
|
+
continue;
|
|
51
|
+
if (held.access === "read-only" && next.access === "read-only")
|
|
52
|
+
continue;
|
|
53
|
+
if (canReenter(existing, next))
|
|
54
|
+
continue;
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
export class PersistentLeaseCoordinator {
|
|
61
|
+
statePath;
|
|
62
|
+
identity;
|
|
63
|
+
now;
|
|
64
|
+
pollMs;
|
|
65
|
+
#mutex;
|
|
66
|
+
#inspectProcess;
|
|
67
|
+
constructor(options) {
|
|
68
|
+
if (!options.registryId)
|
|
69
|
+
throw new Error("registryId is required for the persistent lease namespace");
|
|
70
|
+
const token = namespaceToken(options.registryId);
|
|
71
|
+
this.statePath = path.join(options.directory, `leases-${token}.json`);
|
|
72
|
+
this.identity = options.processIdentity ?? defaultProcessIdentity();
|
|
73
|
+
this.#inspectProcess = options.inspectProcess ?? defaultProcessInspector;
|
|
74
|
+
this.now = options.now ?? Date.now;
|
|
75
|
+
this.pollMs = options.pollMs ?? 20;
|
|
76
|
+
this.#mutex = new PersistentFileMutex(path.join(options.directory, `leases-${token}.lock`), options);
|
|
77
|
+
}
|
|
78
|
+
#read() {
|
|
79
|
+
const state = readJsonFile(this.statePath, { version: 1, leases: [] });
|
|
80
|
+
if (state.version !== 1 || !Array.isArray(state.leases))
|
|
81
|
+
throw new Error(`Invalid lease state: ${this.statePath}`);
|
|
82
|
+
return state;
|
|
83
|
+
}
|
|
84
|
+
#releaseMarkerPath(record) {
|
|
85
|
+
if (!/^[0-9a-f-]{36}$/i.test(record.leaseId) || !/^[0-9a-f]{48}$/.test(record.releaseMarkerToken)) {
|
|
86
|
+
throw new Error("Invalid persisted lease release marker identity");
|
|
87
|
+
}
|
|
88
|
+
return path.join(path.dirname(this.statePath), `lease-release-${record.leaseId}-${record.releaseMarkerToken}.json`);
|
|
89
|
+
}
|
|
90
|
+
#releaseMarkerBody(record, state) {
|
|
91
|
+
return {
|
|
92
|
+
version: 1,
|
|
93
|
+
leaseId: record.leaseId,
|
|
94
|
+
releaseMarkerToken: record.releaseMarkerToken,
|
|
95
|
+
leaseTokenSha256: crypto.createHash("sha256").update(record.leaseToken).digest("hex"),
|
|
96
|
+
state,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
#validateReleaseMarker(value, record) {
|
|
100
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
101
|
+
throw new Error("Invalid lease release marker");
|
|
102
|
+
const marker = value;
|
|
103
|
+
const expected = this.#releaseMarkerBody(record, marker.state);
|
|
104
|
+
if (marker.version !== 1 || (marker.state !== "held" && marker.state !== "done") ||
|
|
105
|
+
marker.leaseId !== expected.leaseId || marker.releaseMarkerToken !== expected.releaseMarkerToken ||
|
|
106
|
+
marker.leaseTokenSha256 !== expected.leaseTokenSha256 ||
|
|
107
|
+
Object.keys(marker).length !== 5) {
|
|
108
|
+
throw new Error("Invalid lease release marker");
|
|
109
|
+
}
|
|
110
|
+
return marker;
|
|
111
|
+
}
|
|
112
|
+
#readReleaseMarker(record) {
|
|
113
|
+
const markerPath = this.#releaseMarkerPath(record);
|
|
114
|
+
const noFollow = typeof fs.constants.O_NOFOLLOW === "number" ? fs.constants.O_NOFOLLOW : 0;
|
|
115
|
+
let fd;
|
|
116
|
+
try {
|
|
117
|
+
fd = fs.openSync(markerPath, fs.constants.O_RDONLY | noFollow);
|
|
118
|
+
const stat = fs.fstatSync(fd);
|
|
119
|
+
if (!stat.isFile() || stat.size > 4096)
|
|
120
|
+
throw new Error("Invalid lease release marker file");
|
|
121
|
+
return this.#validateReleaseMarker(JSON.parse(fs.readFileSync(fd, "utf8")), record);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
if (error.code === "ENOENT")
|
|
125
|
+
return undefined;
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
if (fd !== undefined)
|
|
130
|
+
fs.closeSync(fd);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
#createReleaseMarker(record) {
|
|
134
|
+
writeJsonAtomicDurable(this.#releaseMarkerPath(record), this.#releaseMarkerBody(record, "held"));
|
|
135
|
+
}
|
|
136
|
+
#markReleaseMarkerDone(record) {
|
|
137
|
+
const markerPath = this.#releaseMarkerPath(record);
|
|
138
|
+
const noFollow = typeof fs.constants.O_NOFOLLOW === "number" ? fs.constants.O_NOFOLLOW : 0;
|
|
139
|
+
let fd;
|
|
140
|
+
try {
|
|
141
|
+
fd = fs.openSync(markerPath, fs.constants.O_RDWR | noFollow);
|
|
142
|
+
const currentRaw = fs.readFileSync(fd, "utf8");
|
|
143
|
+
const current = this.#validateReleaseMarker(JSON.parse(currentRaw), record);
|
|
144
|
+
if (current.state === "done")
|
|
145
|
+
return true;
|
|
146
|
+
const terminal = Buffer.from(JSON.stringify({ ...current, state: "done" }));
|
|
147
|
+
if (terminal.byteLength !== Buffer.byteLength(currentRaw))
|
|
148
|
+
throw new Error("Lease release marker size changed");
|
|
149
|
+
let offset = 0;
|
|
150
|
+
while (offset < terminal.byteLength) {
|
|
151
|
+
offset += fs.writeSync(fd, terminal, offset, terminal.byteLength - offset, offset);
|
|
152
|
+
}
|
|
153
|
+
fs.fsyncSync(fd);
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
if (error.code === "ENOENT")
|
|
158
|
+
return false;
|
|
159
|
+
throw error;
|
|
160
|
+
}
|
|
161
|
+
finally {
|
|
162
|
+
if (fd !== undefined)
|
|
163
|
+
fs.closeSync(fd);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
#cleanupReleaseMarkers(records) {
|
|
167
|
+
for (const record of records) {
|
|
168
|
+
try {
|
|
169
|
+
fs.unlinkSync(this.#releaseMarkerPath(record));
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
if (error.code !== "ENOENT") {
|
|
173
|
+
// The state no longer references the marker. An orphan is inert and
|
|
174
|
+
// can be removed by ordinary control-directory maintenance.
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
#isStale(record) {
|
|
180
|
+
const expiredOrDead = () => (record.expiresAt !== undefined && record.expiresAt <= this.now()) ||
|
|
181
|
+
isPersistedOwnerStale(record, this.identity, this.#inspectProcess);
|
|
182
|
+
try {
|
|
183
|
+
return this.#readReleaseMarker(record)?.state === "done" || expiredOrDead();
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// Marker corruption cannot authorize recovery while the owner may still be
|
|
187
|
+
// active. Once independently expired or dead, the immutable lease identity
|
|
188
|
+
// is sufficient to prune this record and its exact marker path.
|
|
189
|
+
if (expiredOrDead())
|
|
190
|
+
return true;
|
|
191
|
+
// Preserve a possibly-live lease as active. Conflict checks will still block
|
|
192
|
+
// overlapping access, while unrelated resource scopes remain available.
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
#prune(state) {
|
|
197
|
+
const stale = state.leases.filter((record) => this.#isStale(record));
|
|
198
|
+
if (stale.length > 0) {
|
|
199
|
+
const ids = new Set(stale.map((record) => record.leaseId));
|
|
200
|
+
state.leases = state.leases.filter((record) => !ids.has(record.leaseId));
|
|
201
|
+
}
|
|
202
|
+
return stale;
|
|
203
|
+
}
|
|
204
|
+
async acquire(requests, options = {}) {
|
|
205
|
+
const normalized = normalizeRequests(requests);
|
|
206
|
+
if (options.leaseTtlMs !== undefined && (!Number.isFinite(options.leaseTtlMs) || options.leaseTtlMs <= 0)) {
|
|
207
|
+
throw new Error("leaseTtlMs must be positive");
|
|
208
|
+
}
|
|
209
|
+
const timeoutMs = options.timeoutMs ?? 10_000;
|
|
210
|
+
const deadline = this.now() + timeoutMs;
|
|
211
|
+
while (true) {
|
|
212
|
+
if (options.signal?.aborted)
|
|
213
|
+
throw new CoordinatorAbortError();
|
|
214
|
+
let created;
|
|
215
|
+
await this.#mutex.runExclusive(() => {
|
|
216
|
+
const state = this.#read();
|
|
217
|
+
const stale = this.#prune(state);
|
|
218
|
+
if (!state.leases.some((record) => requestsConflict(record, normalized))) {
|
|
219
|
+
created = {
|
|
220
|
+
...this.identity,
|
|
221
|
+
leaseId: crypto.randomUUID(),
|
|
222
|
+
leaseToken: crypto.randomBytes(24).toString("hex"),
|
|
223
|
+
releaseMarkerToken: crypto.randomBytes(24).toString("hex"),
|
|
224
|
+
owner: cloneExecutionOwner(normalized[0].owner),
|
|
225
|
+
requests: normalized.map(({ key, access }) => ({ key, access })),
|
|
226
|
+
acquiredAt: this.now(),
|
|
227
|
+
...(options.leaseTtlMs === undefined ? {} : { expiresAt: this.now() + options.leaseTtlMs }),
|
|
228
|
+
};
|
|
229
|
+
this.#createReleaseMarker(created);
|
|
230
|
+
state.leases.push(created);
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
if (stale.length > 0 || created)
|
|
234
|
+
writeJsonAtomicDurable(this.statePath, state);
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
if (created)
|
|
238
|
+
this.#cleanupReleaseMarkers([created]);
|
|
239
|
+
throw error;
|
|
240
|
+
}
|
|
241
|
+
this.#cleanupReleaseMarkers(stale);
|
|
242
|
+
}, { timeoutMs: Math.max(1, deadline - this.now()), signal: options.signal });
|
|
243
|
+
if (created) {
|
|
244
|
+
const record = created;
|
|
245
|
+
let released = false;
|
|
246
|
+
let releasePromise;
|
|
247
|
+
const release = async () => {
|
|
248
|
+
if (released)
|
|
249
|
+
return;
|
|
250
|
+
if (releasePromise)
|
|
251
|
+
return releasePromise;
|
|
252
|
+
let terminal = false;
|
|
253
|
+
try {
|
|
254
|
+
terminal = this.#markReleaseMarkerDone(record);
|
|
255
|
+
}
|
|
256
|
+
catch { /* exact state removal may still succeed */ }
|
|
257
|
+
releasePromise = this.#remove(record)
|
|
258
|
+
.then(() => {
|
|
259
|
+
released = true;
|
|
260
|
+
})
|
|
261
|
+
.catch((error) => {
|
|
262
|
+
if (terminal) {
|
|
263
|
+
released = true;
|
|
264
|
+
console.warn(`[taskflow] lease cleanup deferred for ${record.leaseId} (critical section durably released)`);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
throw error;
|
|
268
|
+
})
|
|
269
|
+
.finally(() => {
|
|
270
|
+
if (!released)
|
|
271
|
+
releasePromise = undefined;
|
|
272
|
+
});
|
|
273
|
+
return releasePromise;
|
|
274
|
+
};
|
|
275
|
+
const renew = async (ttlMs) => {
|
|
276
|
+
if (released)
|
|
277
|
+
throw new Error(`Lease ${record.leaseId} is already released`);
|
|
278
|
+
if (!Number.isFinite(ttlMs) || ttlMs <= 0)
|
|
279
|
+
throw new Error("ttlMs must be positive");
|
|
280
|
+
await this.#mutex.runExclusive(() => {
|
|
281
|
+
const state = this.#read();
|
|
282
|
+
const current = state.leases.find((lease) => lease.leaseId === record.leaseId && lease.leaseToken === record.leaseToken);
|
|
283
|
+
if (!current || this.#isStale(current))
|
|
284
|
+
throw new Error(`Lease ${record.leaseId} is no longer active`);
|
|
285
|
+
current.expiresAt = this.now() + ttlMs;
|
|
286
|
+
record.expiresAt = current.expiresAt;
|
|
287
|
+
writeJsonAtomicDurable(this.statePath, state);
|
|
288
|
+
});
|
|
289
|
+
};
|
|
290
|
+
// The acquisition signal cancels only a waiter. Once granted, the lease
|
|
291
|
+
// protects the actual writer until its invoke promise settles or the owner
|
|
292
|
+
// process dies; abort alone is not proof that mutation has stopped.
|
|
293
|
+
if (options.signal?.aborted) {
|
|
294
|
+
await release();
|
|
295
|
+
throw new CoordinatorAbortError();
|
|
296
|
+
}
|
|
297
|
+
return {
|
|
298
|
+
leaseId: record.leaseId,
|
|
299
|
+
owner: cloneExecutionOwner(record.owner),
|
|
300
|
+
requests: normalized,
|
|
301
|
+
acquiredAt: record.acquiredAt,
|
|
302
|
+
get expiresAt() { return record.expiresAt; },
|
|
303
|
+
release,
|
|
304
|
+
renew,
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
if (this.now() >= deadline) {
|
|
308
|
+
throw new CoordinatorTimeoutError(`Lease timeout after ${timeoutMs}ms for ${normalized.length} resource scope(s)`);
|
|
309
|
+
}
|
|
310
|
+
await new Promise((resolve, reject) => {
|
|
311
|
+
const timer = setTimeout(resolve, Math.min(this.pollMs, Math.max(1, deadline - this.now())));
|
|
312
|
+
const onAbort = () => {
|
|
313
|
+
clearTimeout(timer);
|
|
314
|
+
reject(new CoordinatorAbortError());
|
|
315
|
+
};
|
|
316
|
+
options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
317
|
+
if (options.signal)
|
|
318
|
+
setTimeout(() => options.signal?.removeEventListener("abort", onAbort), this.pollMs + 1).unref?.();
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
async #remove(record) {
|
|
323
|
+
await this.#mutex.runExclusive(() => {
|
|
324
|
+
const state = this.#read();
|
|
325
|
+
const next = state.leases.filter((lease) => lease.leaseId !== record.leaseId || lease.leaseToken !== record.leaseToken);
|
|
326
|
+
if (next.length !== state.leases.length) {
|
|
327
|
+
state.leases = next;
|
|
328
|
+
writeJsonAtomicDurable(this.statePath, state);
|
|
329
|
+
}
|
|
330
|
+
this.#cleanupReleaseMarkers([record]);
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
async recoverStale() {
|
|
334
|
+
return this.#mutex.runExclusive(() => {
|
|
335
|
+
const state = this.#read();
|
|
336
|
+
const stale = this.#prune(state);
|
|
337
|
+
if (stale.length > 0)
|
|
338
|
+
writeJsonAtomicDurable(this.statePath, state);
|
|
339
|
+
this.#cleanupReleaseMarkers(stale);
|
|
340
|
+
return stale.map((record) => record.leaseId);
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
async list() {
|
|
344
|
+
return this.#mutex.runExclusive(() => {
|
|
345
|
+
const state = this.#read();
|
|
346
|
+
const stale = this.#prune(state);
|
|
347
|
+
if (stale.length > 0)
|
|
348
|
+
writeJsonAtomicDurable(this.statePath, state);
|
|
349
|
+
this.#cleanupReleaseMarkers(stale);
|
|
350
|
+
return state.leases.map(({ leaseToken: _secret, releaseMarkerToken: _marker, ...record }) => structuredClone(record));
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=leases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leases.js","sourceRoot":"","sources":["../../src/resources/leases.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type PersistentCoordinatorOptions } from "./persistence.ts";
|
|
2
|
+
import { type CanonicalLeaseKey, type ExecutionOwner } from "./types.ts";
|
|
3
|
+
export type PermitState = "issued" | "active" | "settled" | "expired";
|
|
4
|
+
export interface MutationPermit {
|
|
5
|
+
readonly permitId: string;
|
|
6
|
+
readonly intentId: string;
|
|
7
|
+
readonly journalEpoch: number;
|
|
8
|
+
readonly owner: ExecutionOwner;
|
|
9
|
+
readonly issuedAt: string;
|
|
10
|
+
readonly expiresAt: string;
|
|
11
|
+
readonly nonce: string;
|
|
12
|
+
readonly scopes: readonly CanonicalLeaseKey[];
|
|
13
|
+
}
|
|
14
|
+
export interface DurablePendingIntent {
|
|
15
|
+
intentId: string;
|
|
16
|
+
intentSequence: number;
|
|
17
|
+
journalEpoch: number;
|
|
18
|
+
owner: ExecutionOwner;
|
|
19
|
+
scopes: readonly CanonicalLeaseKey[];
|
|
20
|
+
}
|
|
21
|
+
export interface PermitRegistryOptions extends PersistentCoordinatorOptions {
|
|
22
|
+
journalEpoch: number;
|
|
23
|
+
}
|
|
24
|
+
export interface PermitActivation {
|
|
25
|
+
owner: ExecutionOwner;
|
|
26
|
+
pendingIntents: readonly DurablePendingIntent[];
|
|
27
|
+
}
|
|
28
|
+
export declare class PermitValidationError extends Error {
|
|
29
|
+
readonly code = "TFWS_PERMIT_INVALID";
|
|
30
|
+
constructor(message: string);
|
|
31
|
+
}
|
|
32
|
+
/** Runtime-only brand check for SandboxPlan sealing. Serialized/reconstructed
|
|
33
|
+
* lookalikes deliberately fail even when every public field is identical. */
|
|
34
|
+
export declare function isIssuedMutationPermit(value: unknown): value is MutationPermit;
|
|
35
|
+
export declare class MutationPermitRegistry {
|
|
36
|
+
#private;
|
|
37
|
+
readonly statePath: string;
|
|
38
|
+
readonly journalEpoch: number;
|
|
39
|
+
readonly now: () => number;
|
|
40
|
+
constructor(options: PermitRegistryOptions);
|
|
41
|
+
/** Internal durability-plane hook. Call only after the matching intent WAL
|
|
42
|
+
* record has been appended and fsynced. JournalManager is the public issuer. */
|
|
43
|
+
issueForDurableIntent(intent: DurablePendingIntent, ttlMs: number): Promise<MutationPermit>;
|
|
44
|
+
/** Atomically activate every permit in a sealed execution plan exactly once. */
|
|
45
|
+
activateMany(permits: readonly MutationPermit[], activation: PermitActivation): Promise<void>;
|
|
46
|
+
assertIntentActive(intentId: string, owner: ExecutionOwner): Promise<void>;
|
|
47
|
+
assertActive(permit: MutationPermit, owner: ExecutionOwner): Promise<void>;
|
|
48
|
+
settleIntent(intentId: string): Promise<void>;
|
|
49
|
+
stateOf(permitId: string): Promise<PermitState | undefined>;
|
|
50
|
+
invalidateOlderEpochs(): Promise<number>;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=permits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permits.d.ts","sourceRoot":"","sources":["../../src/resources/permits.ts"],"names":[],"mappings":"AAEA,OAAO,EAIN,KAAK,4BAA4B,EACjC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAKN,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAEtE,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAC9C;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACrC;AAiBD,MAAM,WAAW,qBAAsB,SAAQ,4BAA4B;IAC1E,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,cAAc,CAAC;IACtB,cAAc,EAAE,SAAS,oBAAoB,EAAE,CAAC;CAChD;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,IAAI,yBAAyB;IACtC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACD;AAID;6EAC6E;AAC7E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAE9E;AA8CD,qBAAa,sBAAsB;;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC;IAG3B,YAAY,OAAO,EAAE,qBAAqB,EAQzC;IA0BD;oFACgF;IAC1E,qBAAqB,CAAC,MAAM,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA6BhG;IAED,gFAAgF;IAC1E,YAAY,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,EAAE,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BlG;IAEK,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/E;IAEK,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAY/E;IAEK,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAalD;IAEK,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAMhE;IAEK,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAc7C;CACD"}
|