@xioflow/kernel 0.3.0 → 0.5.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/README.md +174 -15
- package/dist/capability/check.d.ts +32 -0
- package/dist/capability/check.d.ts.map +1 -0
- package/dist/capability/check.js +136 -0
- package/dist/capability/check.js.map +1 -0
- package/dist/capability/index.d.ts +3 -0
- package/dist/capability/index.d.ts.map +1 -0
- package/dist/capability/index.js +3 -0
- package/dist/capability/index.js.map +1 -0
- package/dist/capability/path-utils.d.ts +11 -0
- package/dist/capability/path-utils.d.ts.map +1 -0
- package/dist/capability/path-utils.js +46 -0
- package/dist/capability/path-utils.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +94 -0
- package/dist/cli.js.map +1 -0
- package/dist/confinement/bubblewrap.d.ts +8 -0
- package/dist/confinement/bubblewrap.d.ts.map +1 -0
- package/dist/confinement/bubblewrap.js +45 -0
- package/dist/confinement/bubblewrap.js.map +1 -0
- package/dist/confinement/detector.d.ts +4 -0
- package/dist/confinement/detector.d.ts.map +1 -0
- package/dist/confinement/detector.js +35 -0
- package/dist/confinement/detector.js.map +1 -0
- package/dist/confinement/index.d.ts +5 -0
- package/dist/confinement/index.d.ts.map +1 -0
- package/dist/confinement/index.js +5 -0
- package/dist/confinement/index.js.map +1 -0
- package/dist/confinement/sandbox-exec.d.ts +8 -0
- package/dist/confinement/sandbox-exec.d.ts.map +1 -0
- package/dist/confinement/sandbox-exec.js +30 -0
- package/dist/confinement/sandbox-exec.js.map +1 -0
- package/dist/confinement/srt.d.ts +8 -0
- package/dist/confinement/srt.d.ts.map +1 -0
- package/dist/confinement/srt.js +41 -0
- package/dist/confinement/srt.js.map +1 -0
- package/dist/domain.d.ts +26 -2
- package/dist/domain.d.ts.map +1 -1
- package/dist/domain.js +192 -18
- package/dist/domain.js.map +1 -1
- package/dist/driver/node-driver.d.ts.map +1 -1
- package/dist/driver/node-driver.js +42 -61
- package/dist/driver/node-driver.js.map +1 -1
- package/dist/driver/reaper-driver.d.ts +62 -0
- package/dist/driver/reaper-driver.d.ts.map +1 -0
- package/dist/driver/reaper-driver.js +371 -0
- package/dist/driver/reaper-driver.js.map +1 -0
- package/dist/driver/spawn-support.d.ts +4 -0
- package/dist/driver/spawn-support.d.ts.map +1 -0
- package/dist/driver/spawn-support.js +31 -0
- package/dist/driver/spawn-support.js.map +1 -0
- package/dist/driver/types.d.ts +19 -2
- package/dist/driver/types.d.ts.map +1 -1
- package/dist/fault/crashpoint.d.ts +8 -0
- package/dist/fault/crashpoint.d.ts.map +1 -0
- package/dist/fault/crashpoint.js +37 -0
- package/dist/fault/crashpoint.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +49 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +233 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +32 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +255 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/native/darwin-arm64/xioflow-reaper +0 -0
- package/dist/native/darwin-x64/xioflow-reaper +0 -0
- package/dist/native/linux-arm64/xioflow-reaper +0 -0
- package/dist/native/linux-x64/xioflow-reaper +0 -0
- package/dist/otel/otlp.d.ts +37 -0
- package/dist/otel/otlp.d.ts.map +1 -0
- package/dist/otel/otlp.js +224 -0
- package/dist/otel/otlp.js.map +1 -0
- package/dist/quick-run.d.ts.map +1 -1
- package/dist/quick-run.js +5 -12
- package/dist/quick-run.js.map +1 -1
- package/dist/recovery/engine.d.ts +7 -0
- package/dist/recovery/engine.d.ts.map +1 -1
- package/dist/recovery/engine.js +176 -4
- package/dist/recovery/engine.js.map +1 -1
- package/dist/snapshot/git-shadow.d.ts +57 -0
- package/dist/snapshot/git-shadow.d.ts.map +1 -0
- package/dist/snapshot/git-shadow.js +364 -0
- package/dist/snapshot/git-shadow.js.map +1 -0
- package/dist/store/schema.d.ts +1 -1
- package/dist/store/schema.d.ts.map +1 -1
- package/dist/store/schema.js +31 -0
- package/dist/store/schema.js.map +1 -1
- package/dist/store/sqlite.d.ts +14 -1
- package/dist/store/sqlite.d.ts.map +1 -1
- package/dist/store/sqlite.js +150 -58
- package/dist/store/sqlite.js.map +1 -1
- package/dist/supervisor/admission.d.ts +26 -0
- package/dist/supervisor/admission.d.ts.map +1 -0
- package/dist/supervisor/admission.js +98 -0
- package/dist/supervisor/admission.js.map +1 -0
- package/dist/supervisor/drainer.d.ts +17 -0
- package/dist/supervisor/drainer.d.ts.map +1 -0
- package/dist/supervisor/drainer.js +200 -0
- package/dist/supervisor/drainer.js.map +1 -0
- package/dist/supervisor/finalize.d.ts +21 -0
- package/dist/supervisor/finalize.d.ts.map +1 -0
- package/dist/supervisor/finalize.js +66 -0
- package/dist/supervisor/finalize.js.map +1 -0
- package/dist/supervisor/fingerprint.d.ts +8 -0
- package/dist/supervisor/fingerprint.d.ts.map +1 -0
- package/dist/supervisor/fingerprint.js +54 -0
- package/dist/supervisor/fingerprint.js.map +1 -0
- package/dist/supervisor/process-monitor.d.ts +9 -0
- package/dist/supervisor/process-monitor.d.ts.map +1 -0
- package/dist/supervisor/process-monitor.js +230 -0
- package/dist/supervisor/process-monitor.js.map +1 -0
- package/dist/supervisor/process-output.d.ts +27 -0
- package/dist/supervisor/process-output.d.ts.map +1 -0
- package/dist/supervisor/process-output.js +102 -0
- package/dist/supervisor/process-output.js.map +1 -0
- package/dist/supervisor/process-run.d.ts +30 -0
- package/dist/supervisor/process-run.d.ts.map +1 -0
- package/dist/supervisor/process-run.js +191 -0
- package/dist/supervisor/process-run.js.map +1 -0
- package/dist/supervisor/replay.d.ts +14 -0
- package/dist/supervisor/replay.d.ts.map +1 -0
- package/dist/supervisor/replay.js +70 -0
- package/dist/supervisor/replay.js.map +1 -0
- package/dist/supervisor/rollback.d.ts +8 -0
- package/dist/supervisor/rollback.d.ts.map +1 -0
- package/dist/supervisor/rollback.js +153 -0
- package/dist/supervisor/rollback.js.map +1 -0
- package/dist/supervisor/service.d.ts +24 -0
- package/dist/supervisor/service.d.ts.map +1 -0
- package/dist/supervisor/service.js +588 -0
- package/dist/supervisor/service.js.map +1 -0
- package/dist/supervisor/snapshot-ops.d.ts +36 -0
- package/dist/supervisor/snapshot-ops.d.ts.map +1 -0
- package/dist/supervisor/snapshot-ops.js +243 -0
- package/dist/supervisor/snapshot-ops.js.map +1 -0
- package/dist/supervisor/supervisor.d.ts +62 -30
- package/dist/supervisor/supervisor.d.ts.map +1 -1
- package/dist/supervisor/supervisor.js +164 -842
- package/dist/supervisor/supervisor.js.map +1 -1
- package/dist/supervisor/types.d.ts +64 -0
- package/dist/supervisor/types.d.ts.map +1 -0
- package/dist/supervisor/types.js +2 -0
- package/dist/supervisor/types.js.map +1 -0
- package/dist/testing/contract-suite.d.ts.map +1 -1
- package/dist/testing/contract-suite.js +619 -12
- package/dist/testing/contract-suite.js.map +1 -1
- package/dist/types.d.ts +161 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -1
- package/dist/workspace/read-tracking.d.ts +23 -0
- package/dist/workspace/read-tracking.d.ts.map +1 -0
- package/dist/workspace/read-tracking.js +66 -0
- package/dist/workspace/read-tracking.js.map +1 -0
- package/dist/workspace/transactions.d.ts +89 -0
- package/dist/workspace/transactions.d.ts.map +1 -0
- package/dist/workspace/transactions.js +277 -0
- package/dist/workspace/transactions.js.map +1 -0
- package/package.json +8 -2
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
const SKIP = new Set(['.git']);
|
|
4
|
+
const ATIME_MARGIN_S = 2;
|
|
5
|
+
function resetAccessTime(abs, st) {
|
|
6
|
+
const mtime = st.mtimeMs / 1000;
|
|
7
|
+
fs.utimesSync(abs, mtime - ATIME_MARGIN_S, mtime);
|
|
8
|
+
}
|
|
9
|
+
function walk(dir, visit, rel = '') {
|
|
10
|
+
const st = fs.lstatSync(dir);
|
|
11
|
+
visit(dir, rel, st);
|
|
12
|
+
for (const name of fs.readdirSync(dir)) {
|
|
13
|
+
if (!rel && SKIP.has(name))
|
|
14
|
+
continue;
|
|
15
|
+
const abs = path.join(dir, name);
|
|
16
|
+
const childRel = rel ? `${rel}/${name}` : name;
|
|
17
|
+
const childStat = fs.lstatSync(abs);
|
|
18
|
+
if (childStat.isDirectory())
|
|
19
|
+
walk(abs, visit, childRel);
|
|
20
|
+
else
|
|
21
|
+
visit(abs, childRel, childStat);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** 把 root 下每个条目(跳过顶层 .git)的 atime 设到其 mtime 之前。目录在列举之后再归一。 */
|
|
25
|
+
export function normalizeAccessTimes(root) {
|
|
26
|
+
const dirs = [];
|
|
27
|
+
walk(root, (abs, _rel, st) => {
|
|
28
|
+
if (st.isSymbolicLink())
|
|
29
|
+
return; // utimes 会跟随链接,改到链接目标上
|
|
30
|
+
if (st.isDirectory())
|
|
31
|
+
dirs.push([abs, st]);
|
|
32
|
+
else
|
|
33
|
+
resetAccessTime(abs, st);
|
|
34
|
+
});
|
|
35
|
+
// 深的目录先归一:父目录的 mtime 不受子目录 atime 变化影响
|
|
36
|
+
for (const [abs, st] of dirs.reverse())
|
|
37
|
+
resetAccessTime(abs, st);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 读过的条目(相对 root,目录以 `/` 结尾,root 本身为 `./`):atime 严格晚于 mtime。
|
|
41
|
+
*/
|
|
42
|
+
export function collectReadSet(root) {
|
|
43
|
+
const reads = [];
|
|
44
|
+
walk(root, (_abs, rel, st) => {
|
|
45
|
+
if (st.isSymbolicLink())
|
|
46
|
+
return;
|
|
47
|
+
if (st.atimeMs > st.mtimeMs)
|
|
48
|
+
reads.push(st.isDirectory() ? `${rel || '.'}/` : rel);
|
|
49
|
+
});
|
|
50
|
+
return reads.sort();
|
|
51
|
+
}
|
|
52
|
+
/** 在 dir 所在文件系统上实测一次「读取会推进 atime」。探针文件放在 dir 下并立即删除。 */
|
|
53
|
+
export function probeReadTracking(dir) {
|
|
54
|
+
const probe = path.join(dir, `.xioflow-atime-probe-${process.pid}-${Date.now()}`);
|
|
55
|
+
try {
|
|
56
|
+
fs.writeFileSync(probe, 'probe');
|
|
57
|
+
resetAccessTime(probe, fs.statSync(probe));
|
|
58
|
+
fs.readFileSync(probe);
|
|
59
|
+
const st = fs.statSync(probe);
|
|
60
|
+
return st.atimeMs > st.mtimeMs ? 'atime' : 'unobserved';
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
fs.rmSync(probe, { force: true });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=read-tracking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-tracking.js","sourceRoot":"","sources":["../../src/workspace/read-tracking.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { ExecutionDomain } from '../domain.js';
|
|
2
|
+
import { SnapshotRef } from '../types.js';
|
|
3
|
+
import { GitShadowSnapshotDriver } from '../snapshot/git-shadow.js';
|
|
4
|
+
import { ReadTracking } from './read-tracking.js';
|
|
5
|
+
/**
|
|
6
|
+
* 工作区事务:并行 agent 的乐观并发控制(ARCHITECTURE §3.9)。
|
|
7
|
+
*
|
|
8
|
+
* begin:对主工作区拍基线快照,materialize 出独立 fork,归一 atime 以观测读集。
|
|
9
|
+
* agent 在 fork 里执行任意操作(cwd = forkRoot)。
|
|
10
|
+
* commit:读集(atime)+ 写集(基线树 → fork 当前树的逐文件差异),对「本事务开始之后
|
|
11
|
+
* 已提交的事务」与「绕过事务直接写主工作区的改动」做后向校验;无冲突才把写集应用到主工作区。
|
|
12
|
+
* 应用前先写 TX_COMMITTING(带写集):崩溃后再次 commit 只重放应用,fork 即重做日志。
|
|
13
|
+
*/
|
|
14
|
+
export interface WriteEntry {
|
|
15
|
+
status: 'A' | 'D' | 'M' | 'T';
|
|
16
|
+
/** 相对事务根目录 */
|
|
17
|
+
path: string;
|
|
18
|
+
}
|
|
19
|
+
export interface TransactionConflict {
|
|
20
|
+
path: string;
|
|
21
|
+
kind: 'write_write' | 'read_write' | 'external_write';
|
|
22
|
+
/** 与之冲突的已提交事务;external_write 为空(改动不经事务直接写入了主工作区)。 */
|
|
23
|
+
otherTxId?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface WorkspaceTransaction {
|
|
26
|
+
txId: string;
|
|
27
|
+
runId: string;
|
|
28
|
+
/** 主工作区中的事务根目录 */
|
|
29
|
+
root: string;
|
|
30
|
+
/** agent 应在其中工作的目录(fork 内与 root 对应的位置) */
|
|
31
|
+
forkRoot: string;
|
|
32
|
+
baseSnapshotId: string;
|
|
33
|
+
/** TX_BEGUN 的 journal seq:校验只看它之后提交的事务 */
|
|
34
|
+
beginSeq: number;
|
|
35
|
+
readTracking: ReadTracking;
|
|
36
|
+
status: 'open' | 'committing' | 'committed' | 'conflicted' | 'aborted';
|
|
37
|
+
}
|
|
38
|
+
export interface TransactionEffects {
|
|
39
|
+
readTracking: ReadTracking;
|
|
40
|
+
/** readTracking 为 'unobserved' 时为 null:不知道就不假装知道 */
|
|
41
|
+
readSet: string[] | null;
|
|
42
|
+
writeSet: WriteEntry[];
|
|
43
|
+
}
|
|
44
|
+
export type CommitResult = ({
|
|
45
|
+
status: 'committed';
|
|
46
|
+
txId: string;
|
|
47
|
+
} & TransactionEffects) | ({
|
|
48
|
+
status: 'conflict';
|
|
49
|
+
txId: string;
|
|
50
|
+
conflicts: TransactionConflict[];
|
|
51
|
+
} & TransactionEffects);
|
|
52
|
+
export interface TransactionHost {
|
|
53
|
+
domain: ExecutionDomain;
|
|
54
|
+
snapshotDriver: GitShadowSnapshotDriver;
|
|
55
|
+
captureSnapshot(runId: string, opId: string, root: string): Promise<SnapshotRef>;
|
|
56
|
+
materialize(snapshotId: string, forkPath: string): Promise<void>;
|
|
57
|
+
dematerialize(forkPath: string): Promise<void>;
|
|
58
|
+
}
|
|
59
|
+
export declare class WorkspaceTransactions {
|
|
60
|
+
private readonly host;
|
|
61
|
+
private readonly open;
|
|
62
|
+
private commitQueue;
|
|
63
|
+
constructor(host: TransactionHost);
|
|
64
|
+
begin(options: {
|
|
65
|
+
txId: string;
|
|
66
|
+
runId: string;
|
|
67
|
+
root: string;
|
|
68
|
+
forkPath: string;
|
|
69
|
+
}): Promise<WorkspaceTransaction>;
|
|
70
|
+
/** 当前读集与写集(不提交)。读集证据在计算写集前取出并落 journal,随后重新归一 atime。 */
|
|
71
|
+
inspect(txId: string): Promise<TransactionEffects>;
|
|
72
|
+
commit(txId: string): Promise<CommitResult>;
|
|
73
|
+
abort(txId: string, reason?: string): Promise<void>;
|
|
74
|
+
/** 本进程内打开过的事务(崩溃后重建的事务在首次 inspect / commit / abort 时载入)。 */
|
|
75
|
+
get(txId: string): WorkspaceTransaction | undefined;
|
|
76
|
+
private commitSerialized;
|
|
77
|
+
private effects;
|
|
78
|
+
/** 后向校验:本事务开始后提交的事务,以及绕过事务直接写入主工作区的改动。 */
|
|
79
|
+
private validate;
|
|
80
|
+
private mainChangesSinceBase;
|
|
81
|
+
/** 把 fork 中的写集原样落到主工作区;可重复执行(崩溃后重放)。 */
|
|
82
|
+
private apply;
|
|
83
|
+
private record;
|
|
84
|
+
private journal;
|
|
85
|
+
/** 内存里没有时从 journal 重建(例如 TX_COMMITTING 之后监督进程崩溃重启),已结束的事务不可再用。 */
|
|
86
|
+
private require;
|
|
87
|
+
private view;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=transactions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactions.d.ts","sourceRoot":"","sources":["../../src/workspace/transactions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { isPathContained } from '../capability/index.js';
|
|
4
|
+
import { collectReadSet, normalizeAccessTimes, probeReadTracking } from './read-tracking.js';
|
|
5
|
+
export class WorkspaceTransactions {
|
|
6
|
+
host;
|
|
7
|
+
open = new Map();
|
|
8
|
+
commitQueue = Promise.resolve();
|
|
9
|
+
constructor(host) {
|
|
10
|
+
this.host = host;
|
|
11
|
+
}
|
|
12
|
+
async begin(options) {
|
|
13
|
+
const { snapshotDriver } = this.host;
|
|
14
|
+
// txId 会成为快照 id 与 git ref 名的一部分
|
|
15
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(options.txId)) {
|
|
16
|
+
throw new Error(`Invalid workspace transaction id "${options.txId}": use letters, digits, ".", "_" or "-"`);
|
|
17
|
+
}
|
|
18
|
+
if (this.open.has(options.txId) || this.journal(options.txId).length > 0) {
|
|
19
|
+
throw new Error(`Workspace transaction "${options.txId}" already exists`);
|
|
20
|
+
}
|
|
21
|
+
const root = fs.realpathSync(options.root);
|
|
22
|
+
const { repoRoot } = await snapshotDriver.assertGitRepo(root);
|
|
23
|
+
const base = await this.host.captureSnapshot(options.runId, `${options.txId}-base`, root);
|
|
24
|
+
const forkPath = path.resolve(options.forkPath);
|
|
25
|
+
await this.host.materialize(base.id, forkPath);
|
|
26
|
+
const forkRoot = path.join(fs.realpathSync(forkPath), path.relative(repoRoot, root));
|
|
27
|
+
const readTracking = probeReadTracking(path.dirname(forkPath));
|
|
28
|
+
if (readTracking === 'atime')
|
|
29
|
+
normalizeAccessTimes(forkRoot);
|
|
30
|
+
const beginSeq = this.record(options.runId, 'TX_BEGUN', {
|
|
31
|
+
txId: options.txId,
|
|
32
|
+
root,
|
|
33
|
+
forkPath,
|
|
34
|
+
forkRoot,
|
|
35
|
+
baseSnapshotId: base.id,
|
|
36
|
+
readTracking,
|
|
37
|
+
});
|
|
38
|
+
const tx = {
|
|
39
|
+
txId: options.txId,
|
|
40
|
+
runId: options.runId,
|
|
41
|
+
root,
|
|
42
|
+
forkRoot,
|
|
43
|
+
forkPath,
|
|
44
|
+
repoRoot,
|
|
45
|
+
baseSnapshotId: base.id,
|
|
46
|
+
beginSeq,
|
|
47
|
+
readTracking,
|
|
48
|
+
status: 'open',
|
|
49
|
+
};
|
|
50
|
+
this.open.set(tx.txId, tx);
|
|
51
|
+
return this.view(tx);
|
|
52
|
+
}
|
|
53
|
+
/** 当前读集与写集(不提交)。读集证据在计算写集前取出并落 journal,随后重新归一 atime。 */
|
|
54
|
+
async inspect(txId) {
|
|
55
|
+
return this.effects(await this.require(txId));
|
|
56
|
+
}
|
|
57
|
+
commit(txId) {
|
|
58
|
+
// 同一域只有一个 owner:进程内串行化即可保证「校验 + 应用」相对其他提交是原子的
|
|
59
|
+
const run = this.commitQueue.then(() => this.commitSerialized(txId));
|
|
60
|
+
this.commitQueue = run.catch(() => { });
|
|
61
|
+
return run;
|
|
62
|
+
}
|
|
63
|
+
async abort(txId, reason = 'aborted by host') {
|
|
64
|
+
const tx = await this.require(txId);
|
|
65
|
+
if (tx.status === 'committing') {
|
|
66
|
+
throw new Error(`Workspace transaction "${txId}" is committing; call commit() again to finish applying it`);
|
|
67
|
+
}
|
|
68
|
+
await this.host.dematerialize(tx.forkPath);
|
|
69
|
+
this.record(tx.runId, 'TX_ABORTED', { txId, reason });
|
|
70
|
+
this.open.delete(txId);
|
|
71
|
+
}
|
|
72
|
+
/** 本进程内打开过的事务(崩溃后重建的事务在首次 inspect / commit / abort 时载入)。 */
|
|
73
|
+
get(txId) {
|
|
74
|
+
const tx = this.open.get(txId);
|
|
75
|
+
return tx ? this.view(tx) : undefined;
|
|
76
|
+
}
|
|
77
|
+
async commitSerialized(txId) {
|
|
78
|
+
const tx = await this.require(txId);
|
|
79
|
+
if (tx.status === 'conflicted') {
|
|
80
|
+
throw new Error(`Workspace transaction "${txId}" has conflicts; abort it and start again from the current workspace`);
|
|
81
|
+
}
|
|
82
|
+
const committing = this.journal(txId).find((e) => e.type === 'TX_COMMITTING');
|
|
83
|
+
const effects = committing ? committing.payload.effects : await this.effects(tx);
|
|
84
|
+
if (!committing) {
|
|
85
|
+
const conflicts = await this.validate(tx, effects);
|
|
86
|
+
if (conflicts.length > 0) {
|
|
87
|
+
tx.status = 'conflicted';
|
|
88
|
+
this.record(tx.runId, 'TX_CONFLICTED', { txId, conflicts });
|
|
89
|
+
return { status: 'conflict', txId, conflicts, ...effects };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const leaseOwner = `${txId}:apply`;
|
|
93
|
+
this.host.domain.allocateResources(leaseOwner, [`workspace:write:${tx.root}`]);
|
|
94
|
+
try {
|
|
95
|
+
if (!committing) {
|
|
96
|
+
tx.status = 'committing';
|
|
97
|
+
this.record(tx.runId, 'TX_COMMITTING', { txId, effects });
|
|
98
|
+
}
|
|
99
|
+
this.apply(tx, effects.writeSet);
|
|
100
|
+
this.record(tx.runId, 'TX_COMMITTED', { txId, root: tx.root, writeSet: effects.writeSet, readSet: effects.readSet });
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
this.host.domain.internalReleaseResources(leaseOwner);
|
|
104
|
+
}
|
|
105
|
+
tx.status = 'committed';
|
|
106
|
+
await this.host.dematerialize(tx.forkPath);
|
|
107
|
+
this.open.delete(txId);
|
|
108
|
+
return { status: 'committed', txId, ...effects };
|
|
109
|
+
}
|
|
110
|
+
async effects(tx) {
|
|
111
|
+
let readSet = null;
|
|
112
|
+
if (tx.readTracking === 'atime') {
|
|
113
|
+
// 必须在任何 git 读取之前取证;之前 inspect 落盘的读集一并计入
|
|
114
|
+
const earlier = this.journal(tx.txId)
|
|
115
|
+
.filter((e) => e.type === 'TX_READS')
|
|
116
|
+
.flatMap((e) => e.payload.readSet);
|
|
117
|
+
readSet = [...new Set([...earlier, ...collectReadSet(tx.forkRoot)])].sort();
|
|
118
|
+
this.record(tx.runId, 'TX_READS', { txId: tx.txId, readSet });
|
|
119
|
+
}
|
|
120
|
+
const { snapshotDriver } = this.host;
|
|
121
|
+
const base = this.host.domain.getStore().getSnapshot(tx.baseSnapshotId);
|
|
122
|
+
if (!base)
|
|
123
|
+
throw new Error(`Base snapshot ${tx.baseSnapshotId} of transaction "${tx.txId}" is missing`);
|
|
124
|
+
const current = await snapshotDriver.fingerprint([tx.forkRoot], { against: base });
|
|
125
|
+
const forkRepo = (await snapshotDriver.assertGitRepo(tx.forkRoot)).repoRoot;
|
|
126
|
+
const prefix = path.relative(forkRepo, tx.forkRoot);
|
|
127
|
+
const writeSet = (await snapshotDriver.diffTrees(forkRepo, base.treeFingerprint, current, [prefix || '.'])).map((c) => ({ status: c.status, path: prefix ? path.relative(prefix, c.path) : c.path }));
|
|
128
|
+
if (tx.readTracking === 'atime')
|
|
129
|
+
normalizeAccessTimes(tx.forkRoot); // git 读过所有文件,重新归零证据
|
|
130
|
+
return { readTracking: tx.readTracking, readSet, writeSet };
|
|
131
|
+
}
|
|
132
|
+
/** 后向校验:本事务开始后提交的事务,以及绕过事务直接写入主工作区的改动。 */
|
|
133
|
+
async validate(tx, effects) {
|
|
134
|
+
const conflicts = [];
|
|
135
|
+
const committedAfter = this.host.domain
|
|
136
|
+
.getStore()
|
|
137
|
+
.getJournalEvents(this.host.domain.domainId, tx.beginSeq)
|
|
138
|
+
.filter((e) => e.type === 'TX_COMMITTED' && e.payload.root === tx.root && e.payload.txId !== tx.txId);
|
|
139
|
+
const explained = new Set();
|
|
140
|
+
for (const other of committedAfter) {
|
|
141
|
+
const otherWrites = other.payload.writeSet;
|
|
142
|
+
for (const w of otherWrites)
|
|
143
|
+
explained.add(w.path);
|
|
144
|
+
conflicts.push(...intersect(effects, otherWrites, 'write_write', 'read_write', other.payload.txId));
|
|
145
|
+
}
|
|
146
|
+
const external = (await this.mainChangesSinceBase(tx)).filter((w) => !explained.has(w.path));
|
|
147
|
+
conflicts.push(...intersect(effects, external, 'external_write', 'external_write'));
|
|
148
|
+
return conflicts;
|
|
149
|
+
}
|
|
150
|
+
async mainChangesSinceBase(tx) {
|
|
151
|
+
const { snapshotDriver } = this.host;
|
|
152
|
+
const base = this.host.domain.getStore().getSnapshot(tx.baseSnapshotId);
|
|
153
|
+
const current = await snapshotDriver.fingerprint([tx.root], { against: base });
|
|
154
|
+
const prefix = path.relative(tx.repoRoot, tx.root);
|
|
155
|
+
return (await snapshotDriver.diffTrees(tx.repoRoot, base.treeFingerprint, current, [prefix || '.'])).map((c) => ({
|
|
156
|
+
status: c.status,
|
|
157
|
+
path: prefix ? path.relative(prefix, c.path) : c.path,
|
|
158
|
+
}));
|
|
159
|
+
}
|
|
160
|
+
/** 把 fork 中的写集原样落到主工作区;可重复执行(崩溃后重放)。 */
|
|
161
|
+
apply(tx, writeSet) {
|
|
162
|
+
for (const entry of writeSet) {
|
|
163
|
+
const dst = path.resolve(tx.root, entry.path);
|
|
164
|
+
const src = path.resolve(tx.forkRoot, entry.path);
|
|
165
|
+
if (!isPathContained(tx.root, dst) || !isPathContained(tx.forkRoot, src)) {
|
|
166
|
+
throw new Error(`Refusing to apply ${entry.path}: it resolves outside the transaction root`);
|
|
167
|
+
}
|
|
168
|
+
assertNoSymlinkedParent(tx.root, dst);
|
|
169
|
+
if (entry.status === 'D') {
|
|
170
|
+
fs.rmSync(dst, { force: true });
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
fs.mkdirSync(path.dirname(dst), { recursive: true });
|
|
174
|
+
const st = fs.lstatSync(src);
|
|
175
|
+
fs.rmSync(dst, { force: true });
|
|
176
|
+
if (st.isSymbolicLink()) {
|
|
177
|
+
fs.symlinkSync(fs.readlinkSync(src), dst);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
fs.copyFileSync(src, dst);
|
|
181
|
+
fs.chmodSync(dst, st.mode & 0o777);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
record(runId, type, payload) {
|
|
186
|
+
const { domain } = this.host;
|
|
187
|
+
return domain.getStore().recordJournalEvent({
|
|
188
|
+
domainId: domain.domainId,
|
|
189
|
+
runId,
|
|
190
|
+
type,
|
|
191
|
+
payload,
|
|
192
|
+
timestamp: new Date().toISOString(),
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
journal(txId) {
|
|
196
|
+
const { domain } = this.host;
|
|
197
|
+
return domain
|
|
198
|
+
.getStore()
|
|
199
|
+
.getJournalEvents(domain.domainId)
|
|
200
|
+
.filter((e) => e.type.startsWith('TX_') && e.payload.txId === txId);
|
|
201
|
+
}
|
|
202
|
+
/** 内存里没有时从 journal 重建(例如 TX_COMMITTING 之后监督进程崩溃重启),已结束的事务不可再用。 */
|
|
203
|
+
async require(txId) {
|
|
204
|
+
const cached = this.open.get(txId);
|
|
205
|
+
if (cached)
|
|
206
|
+
return cached;
|
|
207
|
+
const events = this.journal(txId);
|
|
208
|
+
const begun = events.find((e) => e.type === 'TX_BEGUN');
|
|
209
|
+
if (!begun)
|
|
210
|
+
throw new Error(`Workspace transaction "${txId}" does not exist`);
|
|
211
|
+
const closed = events.find((e) => e.type === 'TX_COMMITTED' || e.type === 'TX_ABORTED');
|
|
212
|
+
if (closed)
|
|
213
|
+
throw new Error(`Workspace transaction "${txId}" is already closed (${closed.type})`);
|
|
214
|
+
const p = begun.payload;
|
|
215
|
+
if (!fs.existsSync(p.forkRoot)) {
|
|
216
|
+
throw new Error(`Workspace transaction "${txId}" cannot resume: its fork ${p.forkRoot} is gone`);
|
|
217
|
+
}
|
|
218
|
+
const status = events.some((e) => e.type === 'TX_COMMITTING')
|
|
219
|
+
? 'committing'
|
|
220
|
+
: events.some((e) => e.type === 'TX_CONFLICTED')
|
|
221
|
+
? 'conflicted'
|
|
222
|
+
: 'open';
|
|
223
|
+
const tx = {
|
|
224
|
+
txId,
|
|
225
|
+
runId: begun.runId ?? '',
|
|
226
|
+
root: p.root,
|
|
227
|
+
forkRoot: p.forkRoot,
|
|
228
|
+
forkPath: p.forkPath,
|
|
229
|
+
repoRoot: (await this.host.snapshotDriver.assertGitRepo(p.root)).repoRoot,
|
|
230
|
+
baseSnapshotId: p.baseSnapshotId,
|
|
231
|
+
beginSeq: begun.seq,
|
|
232
|
+
readTracking: p.readTracking,
|
|
233
|
+
status,
|
|
234
|
+
};
|
|
235
|
+
this.open.set(txId, tx);
|
|
236
|
+
return tx;
|
|
237
|
+
}
|
|
238
|
+
view(tx) {
|
|
239
|
+
const { txId, runId, root, forkRoot, baseSnapshotId, beginSeq, readTracking, status } = tx;
|
|
240
|
+
return { txId, runId, root, forkRoot, baseSnapshotId, beginSeq, readTracking, status };
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* 与 others 的交集。读集里的目录(`dir/`)只和「在该目录下直接新增或删除条目」冲突:
|
|
245
|
+
* 列目录看到的是条目集合,内容修改不改变它。
|
|
246
|
+
*/
|
|
247
|
+
function intersect(mine, others, writeKind, readKind, otherTxId) {
|
|
248
|
+
const conflicts = [];
|
|
249
|
+
const myWrites = new Set(mine.writeSet.map((w) => w.path));
|
|
250
|
+
const myReads = new Set(mine.readSet ?? []);
|
|
251
|
+
for (const other of others) {
|
|
252
|
+
if (myWrites.has(other.path)) {
|
|
253
|
+
conflicts.push({ path: other.path, kind: writeKind, otherTxId });
|
|
254
|
+
}
|
|
255
|
+
else if (myReads.has(other.path)) {
|
|
256
|
+
conflicts.push({ path: other.path, kind: readKind, otherTxId });
|
|
257
|
+
}
|
|
258
|
+
else if (other.status === 'A' || other.status === 'D') {
|
|
259
|
+
const parent = path.posix.dirname(other.path);
|
|
260
|
+
const dirKey = `${parent}/`;
|
|
261
|
+
if (myReads.has(dirKey))
|
|
262
|
+
conflicts.push({ path: dirKey, kind: readKind, otherTxId });
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return conflicts;
|
|
266
|
+
}
|
|
267
|
+
/** 目标路径上的每一级父目录都必须是真实目录:主工作区里的符号链接不能把写入带出事务根。 */
|
|
268
|
+
function assertNoSymlinkedParent(root, target) {
|
|
269
|
+
let dir = path.dirname(target);
|
|
270
|
+
while (dir !== root && isPathContained(root, dir)) {
|
|
271
|
+
if (fs.existsSync(dir) && fs.lstatSync(dir).isSymbolicLink()) {
|
|
272
|
+
throw new Error(`Refusing to apply into ${target}: ${dir} is a symbolic link`);
|
|
273
|
+
}
|
|
274
|
+
dir = path.dirname(dir);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=transactions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactions.js","sourceRoot":"","sources":["../../src/workspace/transactions.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xioflow/kernel",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Supervised execution kernel for AI agents: intent-first spawn, confirmed stop pipeline, honest crash recovery",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -9,6 +9,9 @@
|
|
|
9
9
|
},
|
|
10
10
|
"main": "./dist/index.js",
|
|
11
11
|
"types": "./dist/index.d.ts",
|
|
12
|
+
"bin": {
|
|
13
|
+
"xioflow": "./dist/cli.js"
|
|
14
|
+
},
|
|
12
15
|
"exports": {
|
|
13
16
|
".": {
|
|
14
17
|
"types": "./dist/index.d.ts",
|
|
@@ -47,12 +50,15 @@
|
|
|
47
50
|
],
|
|
48
51
|
"scripts": {
|
|
49
52
|
"build": "tsc -p tsconfig.build.json",
|
|
53
|
+
"build:native": "node scripts/build-native.mjs",
|
|
50
54
|
"typecheck": "tsc --noEmit",
|
|
51
55
|
"test": "vitest run",
|
|
56
|
+
"check:tla": "node scripts/check-tla.mjs",
|
|
52
57
|
"verify:package": "node scripts/verify-package.mjs",
|
|
53
|
-
"prepack": "npm run build"
|
|
58
|
+
"prepack": "npm run build && npm run build:native"
|
|
54
59
|
},
|
|
55
60
|
"devDependencies": {
|
|
61
|
+
"@modelcontextprotocol/sdk": "1.30.1",
|
|
56
62
|
"@types/node": "^26.6.1",
|
|
57
63
|
"typescript": "^7.0.2",
|
|
58
64
|
"vitest": "^5.0.1"
|