@xioflow/kernel 0.4.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.
Files changed (111) hide show
  1. package/README.md +95 -3
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +94 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/driver/node-driver.d.ts.map +1 -1
  7. package/dist/driver/node-driver.js +1 -30
  8. package/dist/driver/node-driver.js.map +1 -1
  9. package/dist/driver/reaper-driver.d.ts +62 -0
  10. package/dist/driver/reaper-driver.d.ts.map +1 -0
  11. package/dist/driver/reaper-driver.js +371 -0
  12. package/dist/driver/reaper-driver.js.map +1 -0
  13. package/dist/driver/spawn-support.d.ts +4 -0
  14. package/dist/driver/spawn-support.d.ts.map +1 -0
  15. package/dist/driver/spawn-support.js +31 -0
  16. package/dist/driver/spawn-support.js.map +1 -0
  17. package/dist/driver/types.d.ts +6 -2
  18. package/dist/driver/types.d.ts.map +1 -1
  19. package/dist/fault/crashpoint.d.ts +8 -0
  20. package/dist/fault/crashpoint.d.ts.map +1 -0
  21. package/dist/fault/crashpoint.js +37 -0
  22. package/dist/fault/crashpoint.js.map +1 -0
  23. package/dist/index.d.ts +6 -0
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +3 -0
  26. package/dist/index.js.map +1 -1
  27. package/dist/mcp/server.d.ts +49 -0
  28. package/dist/mcp/server.d.ts.map +1 -0
  29. package/dist/mcp/server.js +233 -0
  30. package/dist/mcp/server.js.map +1 -0
  31. package/dist/mcp/tools.d.ts +32 -0
  32. package/dist/mcp/tools.d.ts.map +1 -0
  33. package/dist/mcp/tools.js +255 -0
  34. package/dist/mcp/tools.js.map +1 -0
  35. package/dist/native/darwin-arm64/xioflow-reaper +0 -0
  36. package/dist/native/darwin-x64/xioflow-reaper +0 -0
  37. package/dist/native/linux-arm64/xioflow-reaper +0 -0
  38. package/dist/native/linux-x64/xioflow-reaper +0 -0
  39. package/dist/otel/otlp.d.ts +37 -0
  40. package/dist/otel/otlp.d.ts.map +1 -0
  41. package/dist/otel/otlp.js +224 -0
  42. package/dist/otel/otlp.js.map +1 -0
  43. package/dist/recovery/engine.d.ts.map +1 -1
  44. package/dist/recovery/engine.js +2 -0
  45. package/dist/recovery/engine.js.map +1 -1
  46. package/dist/snapshot/git-shadow.d.ts +8 -0
  47. package/dist/snapshot/git-shadow.d.ts.map +1 -1
  48. package/dist/snapshot/git-shadow.js +24 -19
  49. package/dist/snapshot/git-shadow.js.map +1 -1
  50. package/dist/store/sqlite.d.ts.map +1 -1
  51. package/dist/store/sqlite.js +5 -0
  52. package/dist/store/sqlite.js.map +1 -1
  53. package/dist/supervisor/admission.d.ts +26 -0
  54. package/dist/supervisor/admission.d.ts.map +1 -0
  55. package/dist/supervisor/admission.js +98 -0
  56. package/dist/supervisor/admission.js.map +1 -0
  57. package/dist/supervisor/finalize.d.ts +21 -0
  58. package/dist/supervisor/finalize.d.ts.map +1 -0
  59. package/dist/supervisor/finalize.js +66 -0
  60. package/dist/supervisor/finalize.js.map +1 -0
  61. package/dist/supervisor/fingerprint.d.ts +8 -0
  62. package/dist/supervisor/fingerprint.d.ts.map +1 -0
  63. package/dist/supervisor/fingerprint.js +54 -0
  64. package/dist/supervisor/fingerprint.js.map +1 -0
  65. package/dist/supervisor/process-monitor.d.ts +9 -0
  66. package/dist/supervisor/process-monitor.d.ts.map +1 -0
  67. package/dist/supervisor/process-monitor.js +230 -0
  68. package/dist/supervisor/process-monitor.js.map +1 -0
  69. package/dist/supervisor/process-output.d.ts +27 -0
  70. package/dist/supervisor/process-output.d.ts.map +1 -0
  71. package/dist/supervisor/process-output.js +102 -0
  72. package/dist/supervisor/process-output.js.map +1 -0
  73. package/dist/supervisor/process-run.d.ts +30 -0
  74. package/dist/supervisor/process-run.d.ts.map +1 -0
  75. package/dist/supervisor/process-run.js +191 -0
  76. package/dist/supervisor/process-run.js.map +1 -0
  77. package/dist/supervisor/replay.d.ts +14 -0
  78. package/dist/supervisor/replay.d.ts.map +1 -0
  79. package/dist/supervisor/replay.js +70 -0
  80. package/dist/supervisor/replay.js.map +1 -0
  81. package/dist/supervisor/rollback.d.ts +8 -0
  82. package/dist/supervisor/rollback.d.ts.map +1 -0
  83. package/dist/supervisor/rollback.js +153 -0
  84. package/dist/supervisor/rollback.js.map +1 -0
  85. package/dist/supervisor/snapshot-ops.d.ts +36 -0
  86. package/dist/supervisor/snapshot-ops.d.ts.map +1 -0
  87. package/dist/supervisor/snapshot-ops.js +243 -0
  88. package/dist/supervisor/snapshot-ops.js.map +1 -0
  89. package/dist/supervisor/supervisor.d.ts +26 -51
  90. package/dist/supervisor/supervisor.d.ts.map +1 -1
  91. package/dist/supervisor/supervisor.js +112 -1158
  92. package/dist/supervisor/supervisor.js.map +1 -1
  93. package/dist/supervisor/types.d.ts +64 -0
  94. package/dist/supervisor/types.d.ts.map +1 -0
  95. package/dist/supervisor/types.js +2 -0
  96. package/dist/supervisor/types.js.map +1 -0
  97. package/dist/testing/contract-suite.d.ts.map +1 -1
  98. package/dist/testing/contract-suite.js +49 -10
  99. package/dist/testing/contract-suite.js.map +1 -1
  100. package/dist/types.d.ts +6 -1
  101. package/dist/types.d.ts.map +1 -1
  102. package/dist/types.js.map +1 -1
  103. package/dist/workspace/read-tracking.d.ts +23 -0
  104. package/dist/workspace/read-tracking.d.ts.map +1 -0
  105. package/dist/workspace/read-tracking.js +66 -0
  106. package/dist/workspace/read-tracking.js.map +1 -0
  107. package/dist/workspace/transactions.d.ts +89 -0
  108. package/dist/workspace/transactions.d.ts.map +1 -0
  109. package/dist/workspace/transactions.js +277 -0
  110. package/dist/workspace/transactions.js.map +1 -0
  111. package/package.json +8 -2
@@ -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.4.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"