taskflow-mcp-core 0.3.0-beta.1.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTROL_GUIDE.md +113 -0
- package/README.md +34 -25
- package/dist/control/admission-service.d.ts +15 -0
- package/dist/control/admission-service.d.ts.map +1 -0
- package/dist/control/admission-service.js +64 -0
- package/dist/control/admission-service.js.map +1 -0
- package/dist/control/approval-edits.d.ts +12 -0
- package/dist/control/approval-edits.d.ts.map +1 -0
- package/dist/control/approval-edits.js +66 -0
- package/dist/control/approval-edits.js.map +1 -0
- package/dist/control/approval-service.d.ts +173 -0
- package/dist/control/approval-service.d.ts.map +1 -0
- package/dist/control/approval-service.js +342 -0
- package/dist/control/approval-service.js.map +1 -0
- package/dist/control/authorization.d.ts +94 -0
- package/dist/control/authorization.d.ts.map +1 -0
- package/dist/control/authorization.js +302 -0
- package/dist/control/authorization.js.map +1 -0
- package/dist/control/control-cli.d.ts +3 -0
- package/dist/control/control-cli.d.ts.map +1 -0
- package/dist/control/control-cli.js +279 -0
- package/dist/control/control-cli.js.map +1 -0
- package/dist/control/control-console.d.ts +17 -0
- package/dist/control/control-console.d.ts.map +1 -0
- package/dist/control/control-console.js +67 -0
- package/dist/control/control-console.js.map +1 -0
- package/dist/control/control-host.d.ts +98 -0
- package/dist/control/control-host.d.ts.map +1 -0
- package/dist/control/control-host.js +459 -0
- package/dist/control/control-host.js.map +1 -0
- package/dist/control/control-mcp.d.ts +11 -0
- package/dist/control/control-mcp.d.ts.map +1 -0
- package/dist/control/control-mcp.js +78 -0
- package/dist/control/control-mcp.js.map +1 -0
- package/dist/control/errors.d.ts +44 -0
- package/dist/control/errors.d.ts.map +1 -0
- package/dist/control/errors.js +93 -0
- package/dist/control/errors.js.map +1 -0
- package/dist/control/hello.d.ts +39 -0
- package/dist/control/hello.d.ts.map +1 -0
- package/dist/control/hello.js +80 -0
- package/dist/control/hello.js.map +1 -0
- package/dist/control/host-runtime.d.ts +32 -0
- package/dist/control/host-runtime.d.ts.map +1 -0
- package/dist/control/host-runtime.js +542 -0
- package/dist/control/host-runtime.js.map +1 -0
- package/dist/control/index.d.ts +32 -0
- package/dist/control/index.d.ts.map +1 -0
- package/dist/control/index.js +32 -0
- package/dist/control/index.js.map +1 -0
- package/dist/control/legacy-conflict.d.ts +19 -0
- package/dist/control/legacy-conflict.d.ts.map +1 -0
- package/dist/control/legacy-conflict.js +176 -0
- package/dist/control/legacy-conflict.js.map +1 -0
- package/dist/control/local-bootstrap.d.ts +21 -0
- package/dist/control/local-bootstrap.d.ts.map +1 -0
- package/dist/control/local-bootstrap.js +224 -0
- package/dist/control/local-bootstrap.js.map +1 -0
- package/dist/control/modes.d.ts +60 -0
- package/dist/control/modes.d.ts.map +1 -0
- package/dist/control/modes.js +86 -0
- package/dist/control/modes.js.map +1 -0
- package/dist/control/project-admin-cli.d.ts +3 -0
- package/dist/control/project-admin-cli.d.ts.map +1 -0
- package/dist/control/project-admin-cli.js +155 -0
- package/dist/control/project-admin-cli.js.map +1 -0
- package/dist/control/project-registry.d.ts +20 -0
- package/dist/control/project-registry.d.ts.map +1 -0
- package/dist/control/project-registry.js +181 -0
- package/dist/control/project-registry.js.map +1 -0
- package/dist/control/runtime-checkpoint.d.ts +11 -0
- package/dist/control/runtime-checkpoint.d.ts.map +1 -0
- package/dist/control/runtime-checkpoint.js +39 -0
- package/dist/control/runtime-checkpoint.js.map +1 -0
- package/dist/control/runtime-provider.d.ts +100 -0
- package/dist/control/runtime-provider.d.ts.map +1 -0
- package/dist/control/runtime-provider.js +258 -0
- package/dist/control/runtime-provider.js.map +1 -0
- package/dist/control/schema/approval.d.ts +108 -0
- package/dist/control/schema/approval.d.ts.map +1 -0
- package/dist/control/schema/approval.js +65 -0
- package/dist/control/schema/approval.js.map +1 -0
- package/dist/control/schema/commands.d.ts +663 -0
- package/dist/control/schema/commands.d.ts.map +1 -0
- package/dist/control/schema/commands.js +147 -0
- package/dist/control/schema/commands.js.map +1 -0
- package/dist/control/schema/common.d.ts +24 -0
- package/dist/control/schema/common.d.ts.map +1 -0
- package/dist/control/schema/common.js +38 -0
- package/dist/control/schema/common.js.map +1 -0
- package/dist/control/schema/coordinator.d.ts +98 -0
- package/dist/control/schema/coordinator.d.ts.map +1 -0
- package/dist/control/schema/coordinator.js +87 -0
- package/dist/control/schema/coordinator.js.map +1 -0
- package/dist/control/schema/evidence.d.ts +140 -0
- package/dist/control/schema/evidence.d.ts.map +1 -0
- package/dist/control/schema/evidence.js +64 -0
- package/dist/control/schema/evidence.js.map +1 -0
- package/dist/control/schema/header.d.ts +79 -0
- package/dist/control/schema/header.d.ts.map +1 -0
- package/dist/control/schema/header.js +66 -0
- package/dist/control/schema/header.js.map +1 -0
- package/dist/control/schema/index.d.ts +31 -0
- package/dist/control/schema/index.d.ts.map +1 -0
- package/dist/control/schema/index.js +31 -0
- package/dist/control/schema/index.js.map +1 -0
- package/dist/control/schema/plan.d.ts +291 -0
- package/dist/control/schema/plan.d.ts.map +1 -0
- package/dist/control/schema/plan.js +80 -0
- package/dist/control/schema/plan.js.map +1 -0
- package/dist/control/schema/policy.d.ts +96 -0
- package/dist/control/schema/policy.d.ts.map +1 -0
- package/dist/control/schema/policy.js +73 -0
- package/dist/control/schema/policy.js.map +1 -0
- package/dist/control/schema/run.d.ts +61 -0
- package/dist/control/schema/run.d.ts.map +1 -0
- package/dist/control/schema/run.js +56 -0
- package/dist/control/schema/run.js.map +1 -0
- package/dist/control/schema/te-mirrors.d.ts +145 -0
- package/dist/control/schema/te-mirrors.d.ts.map +1 -0
- package/dist/control/schema/te-mirrors.js +145 -0
- package/dist/control/schema/te-mirrors.js.map +1 -0
- package/dist/control/schema/transport.d.ts +479 -0
- package/dist/control/schema/transport.d.ts.map +1 -0
- package/dist/control/schema/transport.js +181 -0
- package/dist/control/schema/transport.js.map +1 -0
- package/dist/control/singleton.d.ts +135 -0
- package/dist/control/singleton.d.ts.map +1 -0
- package/dist/control/singleton.js +607 -0
- package/dist/control/singleton.js.map +1 -0
- package/dist/control/store/coordinator-store.d.ts +143 -0
- package/dist/control/store/coordinator-store.d.ts.map +1 -0
- package/dist/control/store/coordinator-store.js +620 -0
- package/dist/control/store/coordinator-store.js.map +1 -0
- package/dist/control/store/evidence-adapter.d.ts +10 -0
- package/dist/control/store/evidence-adapter.d.ts.map +1 -0
- package/dist/control/store/evidence-adapter.js +114 -0
- package/dist/control/store/evidence-adapter.js.map +1 -0
- package/dist/control/store/evidence-explanation.d.ts +55 -0
- package/dist/control/store/evidence-explanation.d.ts.map +1 -0
- package/dist/control/store/evidence-explanation.js +50 -0
- package/dist/control/store/evidence-explanation.js.map +1 -0
- package/dist/control/store/evidence-store.d.ts +143 -0
- package/dist/control/store/evidence-store.d.ts.map +1 -0
- package/dist/control/store/evidence-store.js +437 -0
- package/dist/control/store/evidence-store.js.map +1 -0
- package/dist/control/store/index.d.ts +3 -0
- package/dist/control/store/index.d.ts.map +1 -0
- package/dist/control/store/index.js +2 -0
- package/dist/control/store/index.js.map +1 -0
- package/dist/control/store/journal.d.ts +270 -0
- package/dist/control/store/journal.d.ts.map +1 -0
- package/dist/control/store/journal.js +50 -0
- package/dist/control/store/journal.js.map +1 -0
- package/dist/control/store/project-lifecycle.d.ts +49 -0
- package/dist/control/store/project-lifecycle.d.ts.map +1 -0
- package/dist/control/store/project-lifecycle.js +288 -0
- package/dist/control/store/project-lifecycle.js.map +1 -0
- package/dist/control/store/store.d.ts +93 -0
- package/dist/control/store/store.d.ts.map +1 -0
- package/dist/control/store/store.js +873 -0
- package/dist/control/store/store.js.map +1 -0
- package/dist/control/te-provider.d.ts +86 -0
- package/dist/control/te-provider.d.ts.map +1 -0
- package/dist/control/te-provider.js +131 -0
- package/dist/control/te-provider.js.map +1 -0
- package/dist/control/uds.d.ts +114 -0
- package/dist/control/uds.d.ts.map +1 -0
- package/dist/control/uds.js +456 -0
- package/dist/control/uds.js.map +1 -0
- package/dist/control/web-console/view.d.ts +5 -0
- package/dist/control/web-console/view.d.ts.map +1 -0
- package/dist/control/web-console/view.js +122 -0
- package/dist/control/web-console/view.js.map +1 -0
- package/dist/control/web-console.d.ts +50 -0
- package/dist/control/web-console.d.ts.map +1 -0
- package/dist/control/web-console.js +317 -0
- package/dist/control/web-console.js.map +1 -0
- package/dist/mcp/jsonrpc.d.ts.map +1 -1
- package/dist/mcp/jsonrpc.js +12 -3
- package/dist/mcp/jsonrpc.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +26 -17
- package/dist/mcp/server.js.map +1 -1
- package/package.json +13 -5
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/** Explicit P3 identity maintenance and P10 forensic export. Registry hints do
|
|
2
|
+
* not participate in identity decisions. All callbacks are trusted host ports. */
|
|
3
|
+
import * as fs from "node:fs";
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
import { createHash } from "node:crypto";
|
|
6
|
+
import { Value } from "typebox/value";
|
|
7
|
+
import { ControlError } from "../errors.js";
|
|
8
|
+
import { ControlStoreHeaderSchema } from "../schema/header.js";
|
|
9
|
+
import {} from "../schema/evidence.js";
|
|
10
|
+
import { isTerminalRunStatus } from "../schema/run.js";
|
|
11
|
+
import { JOURNAL_GENESIS, validJournalBatch, journalHash } from "./journal.js";
|
|
12
|
+
import { acquireWriterLock, openControlStore, writeJsonAtomicHardened } from "./store.js";
|
|
13
|
+
const digest = (bytes) => createHash("sha256").update(bytes).digest("hex");
|
|
14
|
+
function fail(message) { throw new ControlError("TF_DURABILITY_FAILED", message, { recoveryAction: "operator", sideEffects: "none" }); }
|
|
15
|
+
function directory(input) {
|
|
16
|
+
const stat = fs.lstatSync(input);
|
|
17
|
+
if (!stat.isDirectory() || stat.isSymbolicLink())
|
|
18
|
+
fail("project store must be a real directory");
|
|
19
|
+
const canonical = fs.realpathSync(input);
|
|
20
|
+
if (process.getuid && stat.uid !== process.getuid())
|
|
21
|
+
fail("project store must belong to the current host user");
|
|
22
|
+
return canonical;
|
|
23
|
+
}
|
|
24
|
+
function read(file) {
|
|
25
|
+
const fd = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW);
|
|
26
|
+
try {
|
|
27
|
+
const stat = fs.fstatSync(fd), linked = fs.lstatSync(file);
|
|
28
|
+
if (!stat.isFile() || linked.isSymbolicLink() || stat.dev !== linked.dev || stat.ino !== linked.ino)
|
|
29
|
+
fail("forensic evidence is not an unchanged regular file");
|
|
30
|
+
const bytes = fs.readFileSync(fd), after = fs.lstatSync(file);
|
|
31
|
+
if (after.dev !== stat.dev || after.ino !== stat.ino || after.size !== stat.size || after.mtimeMs !== stat.mtimeMs)
|
|
32
|
+
fail("evidence changed during read");
|
|
33
|
+
return bytes;
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
fs.closeSync(fd);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function headerAt(root) {
|
|
40
|
+
let value;
|
|
41
|
+
try {
|
|
42
|
+
value = JSON.parse(read(path.join(root, "header")).toString("utf8"));
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
fail("authoritative header is missing or unreadable; identity cannot be reconstructed");
|
|
46
|
+
}
|
|
47
|
+
if (!Value.Check(ControlStoreHeaderSchema, value))
|
|
48
|
+
fail("authoritative header is invalid");
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
function sameHeader(a, b) { return JSON.stringify(a) === JSON.stringify(b); }
|
|
52
|
+
async function authorize(authority, context, operation, header, destination) {
|
|
53
|
+
const result = await authority.authorize(context, { operation, header: structuredClone(header), ...(destination ? { destination } : {}) });
|
|
54
|
+
if (!result || !result.principal?.trim() || result.operator !== true)
|
|
55
|
+
throw new ControlError("TF_POLICY_DENIED", "verified current operator authority is required");
|
|
56
|
+
return result.principal;
|
|
57
|
+
}
|
|
58
|
+
function collect(root) {
|
|
59
|
+
const result = new Map();
|
|
60
|
+
const walk = (relative) => {
|
|
61
|
+
const file = path.join(root, relative);
|
|
62
|
+
let stat;
|
|
63
|
+
try {
|
|
64
|
+
stat = fs.lstatSync(file);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
if (error.code === "ENOENT")
|
|
68
|
+
return;
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
if (stat.isSymbolicLink())
|
|
72
|
+
fail("forensic export refuses symlink evidence");
|
|
73
|
+
if (stat.isDirectory()) {
|
|
74
|
+
for (const child of fs.readdirSync(file).sort())
|
|
75
|
+
walk(path.join(relative, child));
|
|
76
|
+
}
|
|
77
|
+
else if (stat.isFile())
|
|
78
|
+
result.set(relative.split(path.sep).join("/"), read(file));
|
|
79
|
+
else
|
|
80
|
+
fail("forensic export refuses special evidence files");
|
|
81
|
+
};
|
|
82
|
+
for (const name of ["header", "commit-seq.json", "journal", "receipts", "artifacts"])
|
|
83
|
+
walk(name);
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
function fingerprint(files) { return JSON.stringify([...files].map(([name, bytes]) => [name, bytes.length, digest(bytes)])); }
|
|
87
|
+
function parseEvidence(root, header, files, kind) {
|
|
88
|
+
const diagnostics = [], journal = [], receipts = [];
|
|
89
|
+
let tip = JOURNAL_GENESIS, sequence = 0;
|
|
90
|
+
const commands = new Set(), admissions = new Set(), runVersions = new Map();
|
|
91
|
+
for (const [name, bytes] of files) {
|
|
92
|
+
if (!name.startsWith("journal/"))
|
|
93
|
+
continue;
|
|
94
|
+
if (name !== "journal/000001.jsonl") {
|
|
95
|
+
diagnostics.push(`unsupported journal segment: ${name}`);
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
const lines = bytes.toString("utf8").split("\n");
|
|
99
|
+
if (bytes.length && bytes.at(-1) !== 10)
|
|
100
|
+
diagnostics.push("incomplete journal tail preserved");
|
|
101
|
+
for (const [index, line] of lines.entries()) {
|
|
102
|
+
if (!line)
|
|
103
|
+
continue;
|
|
104
|
+
let value;
|
|
105
|
+
try {
|
|
106
|
+
value = JSON.parse(line);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
diagnostics.push(`unreadable journal line ${index + 1}`);
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (!validJournalBatch(value)) {
|
|
113
|
+
diagnostics.push(`invalid journal line ${index + 1}`);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
const batch = value;
|
|
117
|
+
if (batch.commitSeq !== sequence + 1 || batch.events.some(e => e.projectId !== header.projectId || e.controlDomainId !== header.controlDomainId || e.commitSeq !== batch.commitSeq)
|
|
118
|
+
|| batch.command && (batch.command.projectId !== header.projectId || batch.command.controlDomainId !== header.controlDomainId)
|
|
119
|
+
|| batch.recordKind === "lifecycle-batch" && batch.previousHash !== tip)
|
|
120
|
+
diagnostics.push(`journal binding or continuity mismatch at ${batch.commitSeq}`);
|
|
121
|
+
if (batch.command) {
|
|
122
|
+
if (commands.has(batch.command.commandId) || batch.command.firstCommitSeq !== batch.commitSeq || batch.command.lastCommitSeq !== batch.commitSeq)
|
|
123
|
+
diagnostics.push("duplicate or invalid command sequence");
|
|
124
|
+
commands.add(batch.command.commandId);
|
|
125
|
+
}
|
|
126
|
+
if (batch.events.some((e, index) => batch.command ? e.commandId !== batch.command.commandId || e.commandEventIndex !== index : e.commandId !== undefined))
|
|
127
|
+
diagnostics.push("event command binding mismatch");
|
|
128
|
+
if (batch.recordKind === "lifecycle-batch") {
|
|
129
|
+
if (batch.command && (batch.responseJson === undefined || !batch.projection))
|
|
130
|
+
diagnostics.push("missing immutable command response");
|
|
131
|
+
if (batch.responseJson !== undefined) {
|
|
132
|
+
try {
|
|
133
|
+
JSON.parse(batch.responseJson);
|
|
134
|
+
if (!batch.command)
|
|
135
|
+
diagnostics.push("orphan command response");
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
diagnostics.push("invalid immutable response");
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (batch.projection) {
|
|
142
|
+
const p = batch.projection, run = p.run, prior = runVersions.get(run.runId);
|
|
143
|
+
if (run.projectId !== header.projectId || run.controlDomainId !== header.controlDomainId || p.approvals.some(a => a.runId !== run.runId) || p.outbox.some(o => o.runId !== run.runId) || prior !== undefined && run.runVersion !== prior + 1)
|
|
144
|
+
diagnostics.push("projection binding/version mismatch");
|
|
145
|
+
runVersions.set(run.runId, run.runVersion);
|
|
146
|
+
}
|
|
147
|
+
if (batch.admission) {
|
|
148
|
+
const d = batch.admission;
|
|
149
|
+
if (d.projectId !== header.projectId || d.projectControlDomainId !== header.controlDomainId || d.decisionCommitSeq !== batch.commitSeq || admissions.has(d.reservationId))
|
|
150
|
+
diagnostics.push("admission binding mismatch");
|
|
151
|
+
admissions.add(d.reservationId);
|
|
152
|
+
}
|
|
153
|
+
if (batch.receipt) {
|
|
154
|
+
if (batch.receipt.controlDomainId !== header.controlDomainId)
|
|
155
|
+
diagnostics.push("receipt domain mismatch");
|
|
156
|
+
receipts.push(batch.receipt);
|
|
157
|
+
for (const ref of [batch.receiptRef, batch.manifestProofRef]) {
|
|
158
|
+
if (!ref) {
|
|
159
|
+
diagnostics.push("missing receipt evidence reference");
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
const blob = files.get(`artifacts/sha256/${ref.digest.slice(0, 2)}/${ref.digest}`);
|
|
163
|
+
if (!blob || blob.length !== ref.size || digest(blob) !== ref.digest)
|
|
164
|
+
diagnostics.push("receipt blob missing or corrupt");
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
journal.push(batch);
|
|
169
|
+
sequence = batch.commitSeq;
|
|
170
|
+
tip = batch.recordKind === "lifecycle-batch" ? batch.contentHash : journalHash(batch);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
for (const [name, bytes] of files) {
|
|
174
|
+
if (name.startsWith("artifacts/sha256/") && path.basename(name) !== digest(bytes))
|
|
175
|
+
diagnostics.push(`artifact digest mismatch: ${name}`);
|
|
176
|
+
}
|
|
177
|
+
const onDiskSeq = files.get("commit-seq.json");
|
|
178
|
+
if (onDiskSeq) {
|
|
179
|
+
try {
|
|
180
|
+
const n = JSON.parse(onDiskSeq.toString("utf8")).commitSeq;
|
|
181
|
+
if (!Number.isSafeInteger(n) || n > sequence)
|
|
182
|
+
diagnostics.push("commit sequence projection exceeds valid journal");
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
diagnostics.push("invalid commit sequence projection");
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return { exportKind: kind, executePromise: false, header, sourcePath: root, integrity: diagnostics.length ? "damaged" : "verified", verificationScope: "captured-bytes-and-journal-structure", diagnostics,
|
|
189
|
+
files: [...files].map(([name, bytes]) => ({ path: name, sha256: digest(bytes), size: bytes.length, ...(kind === "readonly" ? { bytesBase64: bytes.toString("base64") } : {}) })), journal, receipts };
|
|
190
|
+
}
|
|
191
|
+
/** Performs no source writes and does not call recovery/openControlStore. Damaged
|
|
192
|
+
* bytes remain available in readonly export; lossy export explicitly omits raw
|
|
193
|
+
* bytes. A concurrent change fails rather than claiming a coherent snapshot. */
|
|
194
|
+
export async function exportProjectEvidence(storePath, kind, context, authority) {
|
|
195
|
+
if (kind !== "readonly" && kind !== "lossy")
|
|
196
|
+
fail("unknown forensic export kind");
|
|
197
|
+
const root = directory(storePath), identity = fs.statSync(root), header = headerAt(root);
|
|
198
|
+
const principal = await authorize(authority, context, "export", header);
|
|
199
|
+
const first = collect(root), result = parseEvidence(root, header, first, kind);
|
|
200
|
+
if (await authorize(authority, context, "export", header) !== principal)
|
|
201
|
+
throw new ControlError("TF_AUTHORITY_REVOKED", "export authority changed");
|
|
202
|
+
const second = collect(root), current = fs.statSync(root);
|
|
203
|
+
if (identity.dev !== current.dev || identity.ino !== current.ino || !sameHeader(header, headerAt(root)) || fingerprint(first) !== fingerprint(second))
|
|
204
|
+
fail("project evidence changed during forensic snapshot");
|
|
205
|
+
return result;
|
|
206
|
+
}
|
|
207
|
+
/** Same inode/device is necessary; a copied directory cannot adopt an identity
|
|
208
|
+
* using a caller's claim that the original is gone. Explicit adoption is only
|
|
209
|
+
* accepted for the same proven moved store until a stronger global fence exists. */
|
|
210
|
+
export async function rebindMovedProject(storePath, context, authority, operation = "move-rebind") {
|
|
211
|
+
const root = directory(storePath), header = headerAt(root);
|
|
212
|
+
const principal = await authorize(authority, context, operation, header, root);
|
|
213
|
+
const release = acquireWriterLock(root);
|
|
214
|
+
try {
|
|
215
|
+
const original = read(path.join(root, "header"));
|
|
216
|
+
if (!sameHeader(header, headerAt(root)))
|
|
217
|
+
fail("header changed during identity maintenance");
|
|
218
|
+
const stat = fs.statSync(root), binding = header.directoryBinding;
|
|
219
|
+
if (binding.device !== String(stat.dev) || binding.inode !== String(stat.ino))
|
|
220
|
+
fail("copy/adopt exclusivity is unproven; create a fresh project and domain");
|
|
221
|
+
if (binding.canonicalPath === root)
|
|
222
|
+
return header;
|
|
223
|
+
try {
|
|
224
|
+
fs.lstatSync(binding.canonicalPath);
|
|
225
|
+
fail("old project binding still exists; identity cannot be rebound");
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
if (error.code !== "ENOENT")
|
|
229
|
+
throw error;
|
|
230
|
+
}
|
|
231
|
+
const beforeFiles = collect(root), evidence = parseEvidence(root, header, beforeFiles, "readonly");
|
|
232
|
+
if (evidence.integrity !== "verified")
|
|
233
|
+
fail("damaged project evidence cannot authorize identity maintenance");
|
|
234
|
+
const runs = new Map(evidence.journal.flatMap(batch => batch.recordKind === "lifecycle-batch" && batch.projection ? [[batch.projection.run.runId, batch.projection.run]] : []));
|
|
235
|
+
for (const run of runs.values())
|
|
236
|
+
if (!isTerminalRunStatus(run.status) && !(run.status === "paused" && run.stage === "parked" && run.slot === "released" && run.requiresReadmission === true))
|
|
237
|
+
fail("active or ambiguous run prevents exclusive project rebind");
|
|
238
|
+
if (await authorize(authority, context, operation, header, root) !== principal)
|
|
239
|
+
throw new ControlError("TF_AUTHORITY_REVOKED", "identity maintenance authority changed");
|
|
240
|
+
const current = fs.statSync(root);
|
|
241
|
+
if (current.dev !== stat.dev || current.ino !== stat.ino || !read(path.join(root, "header")).equals(original) || fingerprint(beforeFiles) !== fingerprint(collect(root)))
|
|
242
|
+
fail("project binding or evidence changed before header publication");
|
|
243
|
+
try {
|
|
244
|
+
fs.lstatSync(binding.canonicalPath);
|
|
245
|
+
fail("old project binding reappeared");
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
if (error.code !== "ENOENT")
|
|
249
|
+
throw error;
|
|
250
|
+
}
|
|
251
|
+
const updated = { ...header, directoryBinding: { ...binding, canonicalPath: root } };
|
|
252
|
+
writeJsonAtomicHardened(path.join(root, "header"), updated);
|
|
253
|
+
return updated;
|
|
254
|
+
}
|
|
255
|
+
finally {
|
|
256
|
+
release();
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/** Copies no authoritative history. A copied ledger stays untouched as evidence;
|
|
260
|
+
* destination must be a separate empty path and receives two fresh UUIDs. */
|
|
261
|
+
export async function createProjectClone(sourcePath, destinationPath, context, authority) {
|
|
262
|
+
const source = directory(sourcePath), header = headerAt(source);
|
|
263
|
+
const parent = directory(path.dirname(path.resolve(destinationPath))), destination = path.join(parent, path.basename(destinationPath));
|
|
264
|
+
if (destination === source || destination.startsWith(source + path.sep))
|
|
265
|
+
fail("clone destination must be outside the source ledger");
|
|
266
|
+
const principal = await authorize(authority, context, "clone", header, destination);
|
|
267
|
+
if (await authorize(authority, context, "clone", header, destination) !== principal)
|
|
268
|
+
throw new ControlError("TF_AUTHORITY_REVOKED", "clone authority changed");
|
|
269
|
+
if (!sameHeader(header, headerAt(source)))
|
|
270
|
+
fail("source identity changed during clone authorization");
|
|
271
|
+
// Exclusive mkdir prevents an existing copied ledger from being overwritten.
|
|
272
|
+
try {
|
|
273
|
+
fs.mkdirSync(destination, { mode: 0o700 });
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
if (error.code === "EEXIST")
|
|
277
|
+
fail("clone destination already exists; preserve it and choose a fresh directory");
|
|
278
|
+
throw error;
|
|
279
|
+
}
|
|
280
|
+
const store = openControlStore(destination);
|
|
281
|
+
try {
|
|
282
|
+
return store.header;
|
|
283
|
+
}
|
|
284
|
+
finally {
|
|
285
|
+
store.close();
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=project-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-lifecycle.js","sourceRoot":"","sources":["../../../../taskflow-control/src/store/project-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { ArtifactRef, Receipt, BuildInfoWire, ReceiptAssurance } from "../schema/evidence.ts";
|
|
2
|
+
import { type CommandRecord, type ControlEvent, type ControlStoreHeader, type ControlStoreStatus } from "../schema/index.ts";
|
|
3
|
+
import { type JournalBatch, type AdmissionBinding, type AdmissionDecision } from "./journal.ts";
|
|
4
|
+
import type { ApprovalRun, ApprovalJournalState, ApprovalMutation, ApprovalCommit, ApprovalJournalEvent, CommandBinding } from "../approval-service.ts";
|
|
5
|
+
export type { AdmissionBinding, AdmissionDecision } from "./journal.ts";
|
|
6
|
+
export declare const CONTROL_CRASH_ENV = "TASKFLOW_CONTROL_CRASH_AT";
|
|
7
|
+
export type ControlCrashPoint = "header-fsynced" | "journal-append" | "projection-rebuild" | "lifecycle-committed";
|
|
8
|
+
export interface OpenControlStoreOptions {
|
|
9
|
+
projectId?: string;
|
|
10
|
+
controlDomainId?: string;
|
|
11
|
+
now?: () => number;
|
|
12
|
+
}
|
|
13
|
+
export interface CommitBatchInput {
|
|
14
|
+
command: CommandRecord;
|
|
15
|
+
events: readonly ControlEvent[];
|
|
16
|
+
}
|
|
17
|
+
export interface ControlStoreSnapshot {
|
|
18
|
+
header: ControlStoreHeader;
|
|
19
|
+
commitSeq: number;
|
|
20
|
+
status: ControlStoreStatus;
|
|
21
|
+
}
|
|
22
|
+
export declare class ControlStore {
|
|
23
|
+
#private;
|
|
24
|
+
readonly storePath: string;
|
|
25
|
+
constructor(storePath: string, header: ControlStoreHeader, commitSeq: number, commands: readonly CommandRecord[], releaseWriter: () => void, batches?: JournalBatch[]);
|
|
26
|
+
get header(): ControlStoreHeader;
|
|
27
|
+
get commitSeq(): number;
|
|
28
|
+
get status(): ControlStoreStatus;
|
|
29
|
+
readCommand(commandId: string): CommandRecord | undefined;
|
|
30
|
+
snapshot(): ControlStoreSnapshot;
|
|
31
|
+
appendBatch(input: CommitBatchInput): {
|
|
32
|
+
commitSeq: number;
|
|
33
|
+
command: CommandRecord;
|
|
34
|
+
};
|
|
35
|
+
/** Trusted in-process storage ports; callers must authorize disclosure. */
|
|
36
|
+
readRun(runId: string): ApprovalRun | undefined;
|
|
37
|
+
listRuns(): ApprovalRun[];
|
|
38
|
+
readRunState(runId: string): ApprovalJournalState | undefined;
|
|
39
|
+
readApproval(id: string): import("../index.ts").ApprovalRequest | undefined;
|
|
40
|
+
listApprovals(): import("../index.ts").ApprovalRequest[];
|
|
41
|
+
readOutbox(runId: string): import("../approval-service.ts").ApprovalOutbox[];
|
|
42
|
+
readCommittedCommand(binding: CommandBinding): {
|
|
43
|
+
record: CommandRecord;
|
|
44
|
+
responseJson: string;
|
|
45
|
+
} | undefined;
|
|
46
|
+
createRun(run: ApprovalRun, events?: readonly ApprovalJournalEvent[], result?: {
|
|
47
|
+
command: CommandRecord;
|
|
48
|
+
responseJson: string;
|
|
49
|
+
}): ApprovalRun;
|
|
50
|
+
mutateRun(runId: string, expectedRunVersion: number, build: (state: ApprovalJournalState, meta: {
|
|
51
|
+
commitSeq: number;
|
|
52
|
+
}) => ApprovalMutation, binding?: CommandBinding): ApprovalCommit;
|
|
53
|
+
readAdmission(binding: AdmissionBinding): AdmissionDecision | undefined;
|
|
54
|
+
admitRun(binding: AdmissionBinding, expectedRunVersion: number): AdmissionDecision;
|
|
55
|
+
abandonAdmissionIfAbsent(binding: AdmissionBinding): AdmissionDecision;
|
|
56
|
+
decideAdmission(binding: AdmissionBinding, status: "admitted" | "abandoned", expectedRunVersion?: number): AdmissionDecision;
|
|
57
|
+
get journalTip(): {
|
|
58
|
+
commitSeq: number;
|
|
59
|
+
hash: string;
|
|
60
|
+
};
|
|
61
|
+
readJournal(): JournalBatch[];
|
|
62
|
+
withWriter<T>(operation: () => Promise<T>): Promise<T>;
|
|
63
|
+
recordRunEvidence(runId: string, metadata: {
|
|
64
|
+
buildInfo: BuildInfoWire;
|
|
65
|
+
assurance: ReceiptAssurance;
|
|
66
|
+
}): void;
|
|
67
|
+
appendReceipt(runId: string, evidence: {
|
|
68
|
+
receipt: Receipt;
|
|
69
|
+
receiptRef: ArtifactRef;
|
|
70
|
+
manifestProofRef: ArtifactRef;
|
|
71
|
+
}, expectedBatchTip: {
|
|
72
|
+
commitSeq: number;
|
|
73
|
+
hash: string;
|
|
74
|
+
}): void;
|
|
75
|
+
appendCheckpoint(throughCommitSeq: number, expectedBatchTip: {
|
|
76
|
+
commitSeq: number;
|
|
77
|
+
hash: string;
|
|
78
|
+
}): void;
|
|
79
|
+
close(): void;
|
|
80
|
+
}
|
|
81
|
+
export declare function openControlStore(storePath: string, options?: OpenControlStoreOptions): ControlStore;
|
|
82
|
+
/** Publish a fully written owner atomically; a visible lock is never half-written. */
|
|
83
|
+
export declare function acquireWriterLock(storePath: string): () => void;
|
|
84
|
+
export declare function maybeCrash(point: ControlCrashPoint): void;
|
|
85
|
+
export declare function writeJsonAtomicHardened(filePath: string, value: unknown): void;
|
|
86
|
+
export declare function controlStorePaths(storePath: string): {
|
|
87
|
+
header: string;
|
|
88
|
+
commitSeq: string;
|
|
89
|
+
journal: string;
|
|
90
|
+
commandIndex: string;
|
|
91
|
+
lock: string;
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../taskflow-control/src/store/store.ts"],"names":[],"mappings":"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"}
|