loopforge 3.9.2 → 4.0.7

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 (285) hide show
  1. package/README.md +236 -112
  2. package/dist/audit.d.ts +73 -15
  3. package/dist/audit.d.ts.map +1 -1
  4. package/dist/audit.js +131 -61
  5. package/dist/audit.js.map +1 -1
  6. package/dist/canonical-state.d.ts +152 -40
  7. package/dist/canonical-state.d.ts.map +1 -1
  8. package/dist/canonical-state.js +382 -206
  9. package/dist/canonical-state.js.map +1 -1
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +41 -12
  12. package/dist/cli.js.map +1 -1
  13. package/dist/cognitive-governance.d.ts +0 -2
  14. package/dist/cognitive-governance.d.ts.map +1 -1
  15. package/dist/cognitive-governance.js +0 -4
  16. package/dist/cognitive-governance.js.map +1 -1
  17. package/dist/committed-round.d.ts +105 -141
  18. package/dist/committed-round.d.ts.map +1 -1
  19. package/dist/committed-round.js +249 -372
  20. package/dist/committed-round.js.map +1 -1
  21. package/dist/constraint-lifecycle.d.ts +73 -0
  22. package/dist/constraint-lifecycle.d.ts.map +1 -0
  23. package/dist/constraint-lifecycle.js +174 -0
  24. package/dist/constraint-lifecycle.js.map +1 -0
  25. package/dist/context-boundary.d.ts +83 -0
  26. package/dist/context-boundary.d.ts.map +1 -0
  27. package/dist/context-boundary.js +101 -0
  28. package/dist/context-boundary.js.map +1 -0
  29. package/dist/contract-items.d.ts +12 -8
  30. package/dist/contract-items.d.ts.map +1 -1
  31. package/dist/contract-items.js +31 -26
  32. package/dist/contract-items.js.map +1 -1
  33. package/dist/contract-requirement.d.ts +47 -0
  34. package/dist/contract-requirement.d.ts.map +1 -0
  35. package/dist/contract-requirement.js +51 -0
  36. package/dist/contract-requirement.js.map +1 -0
  37. package/dist/criterion-status.d.ts +35 -0
  38. package/dist/criterion-status.d.ts.map +1 -0
  39. package/dist/criterion-status.js +89 -0
  40. package/dist/criterion-status.js.map +1 -0
  41. package/dist/enforcement-gate.d.ts +32 -67
  42. package/dist/enforcement-gate.d.ts.map +1 -1
  43. package/dist/enforcement-gate.js +203 -439
  44. package/dist/enforcement-gate.js.map +1 -1
  45. package/dist/engine.d.ts +9 -103
  46. package/dist/engine.d.ts.map +1 -1
  47. package/dist/engine.js +28 -887
  48. package/dist/engine.js.map +1 -1
  49. package/dist/errors.d.ts +41 -0
  50. package/dist/errors.d.ts.map +1 -0
  51. package/dist/errors.js +69 -0
  52. package/dist/errors.js.map +1 -0
  53. package/dist/evidence-claims.d.ts +33 -31
  54. package/dist/evidence-claims.d.ts.map +1 -1
  55. package/dist/evidence-claims.js +58 -72
  56. package/dist/evidence-claims.js.map +1 -1
  57. package/dist/evidence-posture-view.d.ts +19 -0
  58. package/dist/evidence-posture-view.d.ts.map +1 -0
  59. package/dist/evidence-posture-view.js +116 -0
  60. package/dist/evidence-posture-view.js.map +1 -0
  61. package/dist/evidence-posture.d.ts +73 -0
  62. package/dist/evidence-posture.d.ts.map +1 -0
  63. package/dist/evidence-posture.js +281 -0
  64. package/dist/evidence-posture.js.map +1 -0
  65. package/dist/evidence-provider.d.ts +55 -37
  66. package/dist/evidence-provider.d.ts.map +1 -1
  67. package/dist/evidence-provider.js +182 -332
  68. package/dist/evidence-provider.js.map +1 -1
  69. package/dist/explain.d.ts +167 -27
  70. package/dist/explain.d.ts.map +1 -1
  71. package/dist/explain.js +373 -58
  72. package/dist/explain.js.map +1 -1
  73. package/dist/field-accounting.d.ts.map +1 -1
  74. package/dist/field-accounting.js +3 -22
  75. package/dist/field-accounting.js.map +1 -1
  76. package/dist/generate-schema.js +13 -8
  77. package/dist/generate-schema.js.map +1 -1
  78. package/dist/git-boundary.d.ts +128 -0
  79. package/dist/git-boundary.d.ts.map +1 -0
  80. package/dist/git-boundary.js +625 -0
  81. package/dist/git-boundary.js.map +1 -0
  82. package/dist/git-facts.d.ts +22 -0
  83. package/dist/git-facts.d.ts.map +1 -0
  84. package/dist/git-facts.js +29 -0
  85. package/dist/git-facts.js.map +1 -0
  86. package/dist/git-motion.d.ts +37 -0
  87. package/dist/git-motion.d.ts.map +1 -0
  88. package/dist/git-motion.js +59 -0
  89. package/dist/git-motion.js.map +1 -0
  90. package/dist/history.d.ts +44 -0
  91. package/dist/history.d.ts.map +1 -0
  92. package/dist/history.js +77 -0
  93. package/dist/history.js.map +1 -0
  94. package/dist/index.d.ts +19 -9
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +12 -4
  97. package/dist/index.js.map +1 -1
  98. package/dist/init.d.ts +16 -0
  99. package/dist/init.d.ts.map +1 -1
  100. package/dist/init.js +80 -14
  101. package/dist/init.js.map +1 -1
  102. package/dist/loop-compiler.d.ts +51 -19
  103. package/dist/loop-compiler.d.ts.map +1 -1
  104. package/dist/loop-compiler.js +423 -507
  105. package/dist/loop-compiler.js.map +1 -1
  106. package/dist/loop-store.d.ts +6 -5
  107. package/dist/loop-store.d.ts.map +1 -1
  108. package/dist/loop-store.js +153 -35
  109. package/dist/loop-store.js.map +1 -1
  110. package/dist/mcp/round-lifecycle.d.ts +285 -81
  111. package/dist/mcp/round-lifecycle.d.ts.map +1 -1
  112. package/dist/mcp/round-lifecycle.js +1629 -574
  113. package/dist/mcp/round-lifecycle.js.map +1 -1
  114. package/dist/mcp/server.d.ts +5 -0
  115. package/dist/mcp/server.d.ts.map +1 -1
  116. package/dist/mcp/server.js +61 -19
  117. package/dist/mcp/server.js.map +1 -1
  118. package/dist/mcp/session.d.ts +81 -39
  119. package/dist/mcp/session.d.ts.map +1 -1
  120. package/dist/mcp/session.js +963 -271
  121. package/dist/mcp/session.js.map +1 -1
  122. package/dist/mcp/submission-boundary.d.ts +23 -31
  123. package/dist/mcp/submission-boundary.d.ts.map +1 -1
  124. package/dist/mcp/submission-boundary.js +242 -82
  125. package/dist/mcp/submission-boundary.js.map +1 -1
  126. package/dist/mcp/submission-handle.d.ts +66 -0
  127. package/dist/mcp/submission-handle.d.ts.map +1 -0
  128. package/dist/mcp/submission-handle.js +173 -0
  129. package/dist/mcp/submission-handle.js.map +1 -0
  130. package/dist/mcp/tools.d.ts +17 -7
  131. package/dist/mcp/tools.d.ts.map +1 -1
  132. package/dist/mcp/tools.js +763 -244
  133. package/dist/mcp/tools.js.map +1 -1
  134. package/dist/open-question.d.ts +7 -0
  135. package/dist/open-question.d.ts.map +1 -0
  136. package/dist/open-question.js +14 -0
  137. package/dist/open-question.js.map +1 -0
  138. package/dist/policy-metrics.d.ts +31 -21
  139. package/dist/policy-metrics.d.ts.map +1 -1
  140. package/dist/policy-metrics.js +117 -64
  141. package/dist/policy-metrics.js.map +1 -1
  142. package/dist/policy.d.ts +15 -40
  143. package/dist/policy.d.ts.map +1 -1
  144. package/dist/policy.js +13 -13
  145. package/dist/policy.js.map +1 -1
  146. package/dist/progress.d.ts +45 -0
  147. package/dist/progress.d.ts.map +1 -0
  148. package/dist/progress.js +136 -0
  149. package/dist/progress.js.map +1 -0
  150. package/dist/prompt-assembler.d.ts +28 -9
  151. package/dist/prompt-assembler.d.ts.map +1 -1
  152. package/dist/prompt-assembler.js +592 -603
  153. package/dist/prompt-assembler.js.map +1 -1
  154. package/dist/prompt-coverage.d.ts +39 -0
  155. package/dist/prompt-coverage.d.ts.map +1 -0
  156. package/dist/prompt-coverage.js +80 -0
  157. package/dist/prompt-coverage.js.map +1 -0
  158. package/dist/prompt-freshness.d.ts +25 -0
  159. package/dist/prompt-freshness.d.ts.map +1 -0
  160. package/dist/prompt-freshness.js +88 -0
  161. package/dist/prompt-freshness.js.map +1 -0
  162. package/dist/prompt-policy.d.ts +14 -4
  163. package/dist/prompt-policy.d.ts.map +1 -1
  164. package/dist/prompt-policy.js +29 -10
  165. package/dist/prompt-policy.js.map +1 -1
  166. package/dist/protocol.d.ts +875 -419
  167. package/dist/protocol.d.ts.map +1 -1
  168. package/dist/protocol.js +73 -99
  169. package/dist/protocol.js.map +1 -1
  170. package/dist/recovery-guidance.d.ts +13 -0
  171. package/dist/recovery-guidance.d.ts.map +1 -0
  172. package/dist/recovery-guidance.js +15 -0
  173. package/dist/recovery-guidance.js.map +1 -0
  174. package/dist/recovery.d.ts +68 -0
  175. package/dist/recovery.d.ts.map +1 -0
  176. package/dist/recovery.js +234 -0
  177. package/dist/recovery.js.map +1 -0
  178. package/dist/replay.d.ts +42 -8
  179. package/dist/replay.d.ts.map +1 -1
  180. package/dist/replay.js +311 -84
  181. package/dist/replay.js.map +1 -1
  182. package/dist/result-facts.d.ts +45 -0
  183. package/dist/result-facts.d.ts.map +1 -0
  184. package/dist/result-facts.js +86 -0
  185. package/dist/result-facts.js.map +1 -0
  186. package/dist/round-contract.d.ts +38 -8
  187. package/dist/round-contract.d.ts.map +1 -1
  188. package/dist/round-contract.js +71 -31
  189. package/dist/round-contract.js.map +1 -1
  190. package/dist/round-coordinator.d.ts +45 -91
  191. package/dist/round-coordinator.d.ts.map +1 -1
  192. package/dist/round-coordinator.js +254 -271
  193. package/dist/round-coordinator.js.map +1 -1
  194. package/dist/round-driver.d.ts +56 -16
  195. package/dist/round-driver.d.ts.map +1 -1
  196. package/dist/round-driver.js +225 -39
  197. package/dist/round-driver.js.map +1 -1
  198. package/dist/round-facts.d.ts +33 -52
  199. package/dist/round-facts.d.ts.map +1 -1
  200. package/dist/round-facts.js +54 -157
  201. package/dist/round-facts.js.map +1 -1
  202. package/dist/round-guidance.d.ts +56 -0
  203. package/dist/round-guidance.d.ts.map +1 -0
  204. package/dist/round-guidance.js +161 -0
  205. package/dist/round-guidance.js.map +1 -0
  206. package/dist/round-outcome.d.ts +21 -0
  207. package/dist/round-outcome.d.ts.map +1 -0
  208. package/dist/round-outcome.js +31 -0
  209. package/dist/round-outcome.js.map +1 -0
  210. package/dist/round-transaction.d.ts +168 -21
  211. package/dist/round-transaction.d.ts.map +1 -1
  212. package/dist/round-transaction.js +856 -39
  213. package/dist/round-transaction.js.map +1 -1
  214. package/dist/self-eval.d.ts +40 -60
  215. package/dist/self-eval.d.ts.map +1 -1
  216. package/dist/self-eval.js +455 -384
  217. package/dist/self-eval.js.map +1 -1
  218. package/dist/storage.d.ts +16 -0
  219. package/dist/storage.d.ts.map +1 -1
  220. package/dist/storage.js +54 -4
  221. package/dist/storage.js.map +1 -1
  222. package/dist/subgoal-state.d.ts +2 -3
  223. package/dist/subgoal-state.d.ts.map +1 -1
  224. package/dist/subgoal-state.js +2 -3
  225. package/dist/subgoal-state.js.map +1 -1
  226. package/dist/submission-guidance.d.ts +43 -21
  227. package/dist/submission-guidance.d.ts.map +1 -1
  228. package/dist/submission-guidance.js +368 -262
  229. package/dist/submission-guidance.js.map +1 -1
  230. package/dist/submission-receipt.d.ts +16 -8
  231. package/dist/submission-receipt.d.ts.map +1 -1
  232. package/dist/submission-receipt.js +146 -51
  233. package/dist/submission-receipt.js.map +1 -1
  234. package/dist/token-utils.d.ts +47 -7
  235. package/dist/token-utils.d.ts.map +1 -1
  236. package/dist/token-utils.js +66 -15
  237. package/dist/token-utils.js.map +1 -1
  238. package/dist/transaction-identity.d.ts +9 -0
  239. package/dist/transaction-identity.d.ts.map +1 -0
  240. package/dist/transaction-identity.js +69 -0
  241. package/dist/transaction-identity.js.map +1 -0
  242. package/dist/verification-actions.d.ts +13 -0
  243. package/dist/verification-actions.d.ts.map +1 -0
  244. package/dist/verification-actions.js +44 -0
  245. package/dist/verification-actions.js.map +1 -0
  246. package/dist/verification-gate.d.ts +26 -46
  247. package/dist/verification-gate.d.ts.map +1 -1
  248. package/dist/verification-gate.js +218 -427
  249. package/dist/verification-gate.js.map +1 -1
  250. package/dist/version.d.ts +1 -1
  251. package/dist/version.js +1 -1
  252. package/dist/working-memory.d.ts +187 -0
  253. package/dist/working-memory.d.ts.map +1 -0
  254. package/dist/working-memory.js +767 -0
  255. package/dist/working-memory.js.map +1 -0
  256. package/dist/workspace-checkpoint.d.ts +88 -0
  257. package/dist/workspace-checkpoint.d.ts.map +1 -0
  258. package/dist/workspace-checkpoint.js +326 -0
  259. package/dist/workspace-checkpoint.js.map +1 -0
  260. package/dist/workspace-restore.d.ts +68 -0
  261. package/dist/workspace-restore.d.ts.map +1 -0
  262. package/dist/workspace-restore.js +604 -0
  263. package/dist/workspace-restore.js.map +1 -0
  264. package/dist/workspace.d.ts +0 -9
  265. package/dist/workspace.d.ts.map +1 -1
  266. package/dist/workspace.js +0 -17
  267. package/dist/workspace.js.map +1 -1
  268. package/loop_policy.json +5 -19
  269. package/package.json +2 -2
  270. package/skills/forge/SKILL.md +212 -0
  271. package/skills/forge/references/evidence-and-contracts.md +204 -0
  272. package/skills/forge/references/recovery-and-views.md +188 -0
  273. package/dist/cognitive-facts.d.ts +0 -30
  274. package/dist/cognitive-facts.d.ts.map +0 -1
  275. package/dist/cognitive-facts.js +0 -113
  276. package/dist/cognitive-facts.js.map +0 -1
  277. package/dist/loop-extras-parser.d.ts +0 -81
  278. package/dist/loop-extras-parser.d.ts.map +0 -1
  279. package/dist/loop-extras-parser.js +0 -213
  280. package/dist/loop-extras-parser.js.map +0 -1
  281. package/dist/loop-projection.d.ts +0 -6
  282. package/dist/loop-projection.d.ts.map +0 -1
  283. package/dist/loop-projection.js +0 -28
  284. package/dist/loop-projection.js.map +0 -1
  285. package/skills/perception/SKILL.md +0 -370
@@ -0,0 +1,604 @@
1
+ /** v3.9.8: deterministic workspace restore.
2
+ *
3
+ * This module is the ONLY place LoopForge mutates the working tree. It runs
4
+ * only after a typed rollback directive has been committed, restores the
5
+ * declared Git boundary (content + HEAD), and verifies the result exactly.
6
+ * It never chooses a target and never interprets the Agent's reason.
7
+ *
8
+ * Preconditions are checked before the destructive part: manifest/content
9
+ * hashes, path containment, index state, target HEAD reachability, and
10
+ * directory/type conflicts. File-by-file restore is not atomic; every retry
11
+ * re-plans from the directive + manifest and is idempotent.
12
+ */
13
+ import { createHash } from "node:crypto";
14
+ import { chmodSync, closeSync, copyFileSync, createReadStream, existsSync, fsyncSync, lstatSync, mkdirSync, openSync, readFileSync, readdirSync, renameSync, rmSync, rmdirSync, symlinkSync, unlinkSync, } from "node:fs";
15
+ import { isAbsolute, relative, resolve, sep } from "node:path";
16
+ import { CHECKPOINT_SCHEMA_VERSION } from "./protocol.js";
17
+ import { captureBoundary, runGitCommandStatus } from "./git-boundary.js";
18
+ import { containInWorkspace } from "./workspace.js";
19
+ import { checkpointContentHash, deriveCheckpointId, } from "./workspace-checkpoint.js";
20
+ import { EvidenceCollector } from "./evidence-provider.js";
21
+ export class RestoreFailure extends Error {
22
+ reasonCode;
23
+ details;
24
+ constructor(reasonCode, message, details) {
25
+ super(message);
26
+ this.reasonCode = reasonCode;
27
+ this.details = details;
28
+ this.name = "RestoreFailure";
29
+ }
30
+ }
31
+ function sha256File(path) {
32
+ return new Promise((resolveHash, reject) => {
33
+ const hash = createHash("sha256");
34
+ const stream = createReadStream(path, { highWaterMark: 64 * 1024 });
35
+ stream.on("data", (chunk) => hash.update(chunk));
36
+ stream.on("error", reject);
37
+ stream.on("end", () => resolveHash(hash.digest("hex")));
38
+ });
39
+ }
40
+ function isRuntimePath(abs, workspace, stateDir, exclude) {
41
+ if (exclude?.(abs))
42
+ return true;
43
+ if (!stateDir)
44
+ return false;
45
+ const stateAbs = resolve(workspace, stateDir);
46
+ const rel = relative(stateAbs, abs);
47
+ return rel === "" || (!rel.startsWith(`..${sep}`) && rel !== "..");
48
+ }
49
+ function safeTargetPath(path, context) {
50
+ if (!path || path.includes("\0")) {
51
+ throw new RestoreFailure("unsafe_path", "path is empty or contains NUL");
52
+ }
53
+ // Git paths are workspace-relative and use forward slashes. Reject the
54
+ // Windows separator and drive-relative/absolute forms instead of letting
55
+ // path.resolve reinterpret them after the parent check.
56
+ if (path.includes("\\") || isAbsolute(path) || /^[A-Za-z]:/.test(path)) {
57
+ throw new RestoreFailure("unsafe_path", `path ${path} is not a workspace-relative Git path`);
58
+ }
59
+ if (path.split("/").some((part) => part === "..")) {
60
+ throw new RestoreFailure("unsafe_path", `path ${path} contains a parent traversal`);
61
+ }
62
+ if (path === ".git" || path.startsWith(".git/") || path === ".git\\" ||
63
+ path.startsWith(".git\\")) {
64
+ throw new RestoreFailure("unsafe_path", `refusing to restore .git path ${path}`);
65
+ }
66
+ // Validate the lexical parent and its realpath ancestors, but return the
67
+ // LEXICAL path: the final component may be a symlink that must be replaced,
68
+ // not followed. A symlink whose link text points outside is a valid target
69
+ // state; writing THROUGH a symlinked parent is what must be refused.
70
+ const parent = path.includes("/")
71
+ ? path.slice(0, path.lastIndexOf("/")) || "."
72
+ : ".";
73
+ try {
74
+ containInWorkspace(context.workspace, parent);
75
+ }
76
+ catch (error) {
77
+ throw new RestoreFailure("unsafe_path", `path ${path} leaves the workspace: ${String(error)}`);
78
+ }
79
+ const abs = resolve(context.workspace, path);
80
+ if (isRuntimePath(abs, context.workspace, context.stateDir, context.exclude)) {
81
+ throw new RestoreFailure("unsafe_path", `refusing to restore runtime path ${path}`);
82
+ }
83
+ return abs;
84
+ }
85
+ function fingerprintKind(fingerprint) {
86
+ if (fingerprint === "missing")
87
+ return { kind: "missing" };
88
+ if (fingerprint.startsWith("link:")) {
89
+ return { kind: "symlink", hash: fingerprint.slice(5) };
90
+ }
91
+ if (fingerprint.startsWith("gitlink:"))
92
+ return { kind: "gitlink" };
93
+ if (fingerprint.startsWith("dir:"))
94
+ return { kind: "dir" };
95
+ const match = /^(\d+):([a-f0-9]{64})$/.exec(fingerprint);
96
+ if (match) {
97
+ return { kind: "file", mode: Number(match[1]), hash: match[2] };
98
+ }
99
+ return { kind: "unsupported" };
100
+ }
101
+ async function verifyBlobs(manifest, store) {
102
+ for (const path of manifest.contents) {
103
+ const fingerprint = manifest.fingerprints[path];
104
+ const parsed = fingerprintKind(fingerprint);
105
+ if (parsed.kind !== "file" && parsed.kind !== "symlink") {
106
+ throw new RestoreFailure("manifest_invalid", `content path ${path} has unsupported fingerprint ${fingerprint}`);
107
+ }
108
+ const blob = store.blobPath(parsed.hash);
109
+ if (!existsSync(blob)) {
110
+ throw new RestoreFailure("blob_missing", `content blob for ${path} is missing`);
111
+ }
112
+ const actual = await sha256File(blob);
113
+ if (actual !== parsed.hash) {
114
+ throw new RestoreFailure("blob_corrupt", `content blob for ${path} failed its hash check`);
115
+ }
116
+ }
117
+ }
118
+ function assertSafeAncestors(abs, context) {
119
+ const rel = relative(context.workspace, abs);
120
+ const parts = rel.split(sep);
121
+ let current = context.workspace;
122
+ for (let i = 0; i < parts.length - 1; i++) {
123
+ current = resolve(current, parts[i]);
124
+ try {
125
+ const stat = lstatSync(current);
126
+ if (stat.isSymbolicLink()) {
127
+ throw new RestoreFailure("unsafe_path", `refusing to write through symlink parent ${current}`);
128
+ }
129
+ if (!stat.isDirectory()) {
130
+ throw new RestoreFailure("path_conflict", `parent ${current} is not a directory`);
131
+ }
132
+ }
133
+ catch (error) {
134
+ if (error.code === "ENOENT") {
135
+ mkdirSync(current);
136
+ continue;
137
+ }
138
+ throw error;
139
+ }
140
+ }
141
+ }
142
+ function removePath(abs, context, allowDir = false) {
143
+ let stat;
144
+ try {
145
+ stat = lstatSync(abs);
146
+ }
147
+ catch (error) {
148
+ if (error.code === "ENOENT")
149
+ return false;
150
+ throw new RestoreFailure("restore_io_error", `cannot stat ${abs}: ${String(error)}`);
151
+ }
152
+ if (stat.isDirectory()) {
153
+ if (!allowDir) {
154
+ throw new RestoreFailure("path_conflict", `refusing to delete non-empty directory ${abs}`);
155
+ }
156
+ try {
157
+ if (readdirSync(abs).length > 0) {
158
+ throw new RestoreFailure("path_conflict", `directory ${abs} contains out-of-boundary content`);
159
+ }
160
+ rmdirSync(abs);
161
+ return true;
162
+ }
163
+ catch (error) {
164
+ if (error instanceof RestoreFailure)
165
+ throw error;
166
+ throw new RestoreFailure("restore_io_error", `cannot remove ${abs}: ${String(error)}`);
167
+ }
168
+ }
169
+ try {
170
+ if (stat.isFile() || stat.isSymbolicLink()) {
171
+ try {
172
+ unlinkSync(abs);
173
+ }
174
+ catch (error) {
175
+ if (error.code === "EPERM" ||
176
+ error.code === "EACCES") {
177
+ chmodSync(abs, 0o666);
178
+ unlinkSync(abs);
179
+ }
180
+ else {
181
+ throw error;
182
+ }
183
+ }
184
+ return true;
185
+ }
186
+ throw new RestoreFailure("restore_io_error", `unsupported file type at ${abs}`);
187
+ }
188
+ catch (error) {
189
+ if (error instanceof RestoreFailure)
190
+ throw error;
191
+ throw new RestoreFailure("restore_io_error", `cannot remove ${abs}: ${String(error)}`);
192
+ }
193
+ }
194
+ function planDeletions(target, current, context) {
195
+ const targetPaths = new Set(Object.keys(target.fingerprints));
196
+ const deletions = Object.keys(current.fingerprints)
197
+ .filter((path) => !targetPaths.has(path))
198
+ .sort((a, b) => b.length - a.length);
199
+ // Preflight type conflicts before any mutation: a target file/missing path
200
+ // that is currently a directory may only be removed when every entry in it
201
+ // is also scheduled for deletion.
202
+ const deletionSet = new Set(deletions);
203
+ for (const path of Object.keys(target.fingerprints)) {
204
+ const kind = fingerprintKind(target.fingerprints[path]);
205
+ if (kind.kind === "dir" || kind.kind === "gitlink")
206
+ continue;
207
+ const abs = safeTargetPath(path, context);
208
+ let stat;
209
+ try {
210
+ stat = lstatSync(abs);
211
+ }
212
+ catch {
213
+ continue;
214
+ }
215
+ if (!stat.isDirectory() || stat.isSymbolicLink())
216
+ continue;
217
+ for (const entry of readdirSync(abs)) {
218
+ const childRel = `${path}/${entry}`;
219
+ if (!deletionSet.has(childRel) && !targetPaths.has(childRel)) {
220
+ throw new RestoreFailure("path_conflict", `target ${path} is a directory containing ${childRel}, which is outside the restore boundary`);
221
+ }
222
+ }
223
+ }
224
+ return deletions;
225
+ }
226
+ function shortHead(head) {
227
+ return head ? head.slice(0, 12) : null;
228
+ }
229
+ async function gitStatus(args, context) {
230
+ return runGitCommandStatus(args, {
231
+ cwd: context.workspace,
232
+ ...(context.signal ? { signal: context.signal } : {}),
233
+ ...(context.timeoutMs !== undefined ? { timeoutMs: context.timeoutMs } : {}),
234
+ });
235
+ }
236
+ async function headRelation(targetHead, currentHead, context) {
237
+ if (targetHead === currentHead)
238
+ return "equal";
239
+ const backward = await gitStatus(["merge-base", "--is-ancestor", targetHead, currentHead], context);
240
+ if (backward.code === 0)
241
+ return "backward";
242
+ const forward = await gitStatus(["merge-base", "--is-ancestor", currentHead, targetHead], context);
243
+ if (forward.code === 0)
244
+ return "forward";
245
+ return "diverged";
246
+ }
247
+ /** Read-only restore preflight. Throws RestoreFailure with a stable reason. */
248
+ export async function preflightRestore(input) {
249
+ if (input.manifest.schemaVersion !== CHECKPOINT_SCHEMA_VERSION ||
250
+ input.manifest.coverage !== "tracked_and_non_ignored_untracked") {
251
+ throw new RestoreFailure("manifest_invalid", "unsupported checkpoint manifest schema");
252
+ }
253
+ // Recompute the content identity from the restore-relevant fields. A
254
+ // caller-supplied or tampered manifest must never be trusted merely because
255
+ // its stored hash/id look well-formed.
256
+ const recomputedHash = checkpointContentHash({
257
+ ...(input.manifest.head ? { head: input.manifest.head } : {}),
258
+ fingerprints: input.manifest.fingerprints,
259
+ contents: input.manifest.contents,
260
+ coverage: input.manifest.coverage,
261
+ });
262
+ const recomputedId = deriveCheckpointId({
263
+ loopId: input.manifest.loopId,
264
+ round: input.manifest.round,
265
+ role: input.manifest.role,
266
+ contentHash: recomputedHash,
267
+ });
268
+ if (recomputedHash !== input.manifest.contentHash ||
269
+ recomputedId !== input.manifest.checkpointId) {
270
+ throw new RestoreFailure("manifest_invalid", "checkpoint manifest id/content hash does not match its boundary");
271
+ }
272
+ const context = {
273
+ workspace: input.workspace,
274
+ store: input.store,
275
+ ...(input.stateDir ? { stateDir: input.stateDir } : {}),
276
+ ...(input.exclude ? { exclude: input.exclude } : {}),
277
+ ...(input.signal ? { signal: input.signal } : {}),
278
+ ...(input.timeoutMs !== undefined ? { timeoutMs: input.timeoutMs } : {}),
279
+ };
280
+ // Paths first: never hash content for a target that could escape.
281
+ const resolved = new Map();
282
+ const caseInsensitive = process.platform === "win32";
283
+ for (const path of Object.keys(input.manifest.fingerprints)) {
284
+ const abs = safeTargetPath(path, context);
285
+ const key = caseInsensitive ? abs.toLowerCase() : abs;
286
+ if (resolved.has(key) && resolved.get(key) !== abs) {
287
+ throw new RestoreFailure("path_conflict", `duplicate path after normalization: ${path}`);
288
+ }
289
+ resolved.set(key, abs);
290
+ const kind = fingerprintKind(input.manifest.fingerprints[path]);
291
+ if (kind.kind === "unsupported") {
292
+ throw new RestoreFailure("unsupported_boundary", `path ${path} has an unrestorable fingerprint`);
293
+ }
294
+ }
295
+ if (input.manifest.head !== undefined &&
296
+ !/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(input.manifest.head)) {
297
+ throw new RestoreFailure("target_head_invalid", "checkpoint HEAD is not a Git hash");
298
+ }
299
+ await verifyBlobs(input.manifest, input.store);
300
+ const unmerged = await gitStatus(["ls-files", "-u", "-z"], context);
301
+ if (unmerged.code !== 0) {
302
+ throw new RestoreFailure("git_unavailable", "cannot read the Git index");
303
+ }
304
+ if (unmerged.stdout.length > 0) {
305
+ throw new RestoreFailure("index_unmerged", "the Git index has unmerged entries");
306
+ }
307
+ const verbose = await gitStatus(["ls-files", "-v", "-z"], context);
308
+ if (verbose.code !== 0) {
309
+ throw new RestoreFailure("git_unavailable", "cannot read Git index flags");
310
+ }
311
+ for (const record of verbose.stdout.split("\0").filter(Boolean)) {
312
+ const tag = record[0] ?? "";
313
+ const path = record.slice(2);
314
+ if (tag === "S" || (tag >= "a" && tag <= "z")) {
315
+ throw new RestoreFailure("index_unsupported", `path ${path} has skip-worktree/assume-unchanged state a checkpoint cannot represent`);
316
+ }
317
+ }
318
+ if (input.manifest.head) {
319
+ const exists = await gitStatus(["rev-parse", "--verify", `${input.manifest.head}^{commit}`], context);
320
+ if (exists.code !== 0) {
321
+ throw new RestoreFailure("target_head_missing", `checkpoint HEAD ${input.manifest.head} is not present in this repository`);
322
+ }
323
+ }
324
+ if (input.stateDir) {
325
+ const rel = relative(input.workspace, resolve(input.workspace, input.stateDir));
326
+ if (rel && !rel.startsWith("..") && !resolve(rel).startsWith("..")) {
327
+ const tracked = await gitStatus(["ls-files", "-z", "--", rel], context);
328
+ if (tracked.code === 0 && tracked.stdout.length > 0) {
329
+ throw new RestoreFailure("state_dir_tracked", "the runtime state directory is tracked by Git; refusing a destructive restore");
330
+ }
331
+ }
332
+ }
333
+ const current = await captureBoundary({
334
+ cwd: input.workspace,
335
+ ...(input.signal ? { signal: input.signal } : {}),
336
+ ...(input.timeoutMs !== undefined ? { timeoutMs: input.timeoutMs } : {}),
337
+ ...(input.exclude ? { exclude: input.exclude } : {}),
338
+ });
339
+ if (!current.ok) {
340
+ throw new RestoreFailure("git_unavailable", `cannot observe the current workspace: ${current.detail}`);
341
+ }
342
+ if (current.boundary.materializationError) {
343
+ // No materializer was requested; a leftover error means an index/model
344
+ // problem that makes the current boundary unsafe to mutate.
345
+ throw new RestoreFailure("current_boundary_unsupported", current.boundary.materializationError.detail);
346
+ }
347
+ const currentHead = current.boundary.head;
348
+ if (input.manifest.head === undefined && currentHead !== undefined) {
349
+ throw new RestoreFailure("target_head_invalid", "the checkpoint has no HEAD but the workspace has commits");
350
+ }
351
+ let backward = false;
352
+ if (input.manifest.head && currentHead) {
353
+ const relation = await headRelation(input.manifest.head, currentHead, context);
354
+ if (relation === "diverged") {
355
+ throw new RestoreFailure("head_diverged", `checkpoint HEAD ${shortHead(input.manifest.head)} is not an ancestor/descendant of current HEAD ${shortHead(currentHead)}`);
356
+ }
357
+ backward = relation === "backward";
358
+ }
359
+ // Type-conflict planning is part of the preflight: no mutation yet.
360
+ planDeletions(input.manifest, current.boundary, context);
361
+ return {
362
+ manifest: input.manifest,
363
+ currentBoundary: current.boundary,
364
+ ...(input.manifest.head ? { targetHead: input.manifest.head } : {}),
365
+ ...(currentHead ? { currentHead } : {}),
366
+ backward,
367
+ };
368
+ }
369
+ function sameBoundary(manifest, actual) {
370
+ const expectedHead = manifest.head ?? null;
371
+ const actualHead = actual.head ?? null;
372
+ if (expectedHead !== actualHead) {
373
+ return {
374
+ ok: false,
375
+ detail: `HEAD mismatch: expected ${expectedHead ?? "<none>"}, got ${actualHead ?? "<none>"}`,
376
+ };
377
+ }
378
+ const expectedKeys = Object.keys(manifest.fingerprints).sort();
379
+ const actualKeys = Object.keys(actual.fingerprints).sort();
380
+ if (expectedKeys.length !== actualKeys.length ||
381
+ expectedKeys.some((key, index) => key !== actualKeys[index])) {
382
+ const missing = expectedKeys.filter((key) => !(key in actual.fingerprints)).slice(0, 10);
383
+ const extra = actualKeys.filter((key) => !(key in manifest.fingerprints)).slice(0, 10);
384
+ return {
385
+ ok: false,
386
+ detail: `boundary key mismatch; missing=[${missing.join(", ")}] extra=[${extra.join(", ")}]`,
387
+ };
388
+ }
389
+ const mismatched = expectedKeys.filter((key) => manifest.fingerprints[key] !== actual.fingerprints[key]);
390
+ if (mismatched.length > 0) {
391
+ return {
392
+ ok: false,
393
+ detail: `fingerprint mismatch at ${mismatched.slice(0, 10).join(", ")}`,
394
+ };
395
+ }
396
+ return { ok: true };
397
+ }
398
+ function writeTarget(path, fingerprint, abs, context) {
399
+ const parsed = fingerprintKind(fingerprint);
400
+ if (parsed.kind === "unsupported") {
401
+ throw new RestoreFailure("unsupported_boundary", `cannot restore ${path}`);
402
+ }
403
+ assertSafeAncestors(abs, context);
404
+ if (parsed.kind === "missing") {
405
+ removePath(abs, context, true);
406
+ return "written";
407
+ }
408
+ if (parsed.kind === "gitlink" || parsed.kind === "dir") {
409
+ try {
410
+ const stat = lstatSync(abs);
411
+ if (stat.isSymbolicLink() || stat.isFile())
412
+ removePath(abs, context);
413
+ else if (!stat.isDirectory()) {
414
+ throw new RestoreFailure("path_conflict", `${path} has an unsupported type`);
415
+ }
416
+ }
417
+ catch (error) {
418
+ if (error.code !== "ENOENT") {
419
+ if (error instanceof RestoreFailure)
420
+ throw error;
421
+ throw new RestoreFailure("restore_io_error", `cannot inspect ${path}: ${String(error)}`);
422
+ }
423
+ }
424
+ mkdirSync(abs, { recursive: true });
425
+ return "written";
426
+ }
427
+ // A regular file or symlink replaces any existing non-directory entry.
428
+ try {
429
+ const stat = lstatSync(abs);
430
+ if (stat.isDirectory() && !stat.isSymbolicLink()) {
431
+ // An empty directory may be replaced by a file/symlink; a non-empty one
432
+ // was rejected by planDeletions.
433
+ removePath(abs, context, true);
434
+ }
435
+ }
436
+ catch (error) {
437
+ if (error.code !== "ENOENT") {
438
+ if (error instanceof RestoreFailure)
439
+ throw error;
440
+ }
441
+ }
442
+ if (parsed.kind === "symlink") {
443
+ removePath(abs, context);
444
+ const text = readFileSync(context.store.blobPath(parsed.hash), "utf8");
445
+ try {
446
+ symlinkSync(text, abs);
447
+ }
448
+ catch (error) {
449
+ throw new RestoreFailure("symlink_failed", `cannot create symlink ${path}: ${String(error)}`);
450
+ }
451
+ return "written";
452
+ }
453
+ // Regular file: copy the verified blob to a temp sibling, then rename.
454
+ removePath(abs, context);
455
+ const temp = `${abs}.lf-restore-${process.pid}-${Date.now()}`;
456
+ try {
457
+ copyFileSync(context.store.blobPath(parsed.hash), temp);
458
+ const fd = openSync(temp, "r+");
459
+ try {
460
+ fsyncSync(fd);
461
+ }
462
+ finally {
463
+ closeSync(fd);
464
+ }
465
+ chmodSync(temp, parsed.mode & 0o7777);
466
+ renameSync(temp, abs);
467
+ }
468
+ catch (error) {
469
+ try {
470
+ rmSync(temp, { force: true });
471
+ }
472
+ catch { /* best effort */ }
473
+ throw new RestoreFailure("restore_io_error", `cannot write ${path}: ${String(error)}`);
474
+ }
475
+ return "written";
476
+ }
477
+ /** Execute the restore. The caller must have committed the directive first. */
478
+ export async function executeRestore(input) {
479
+ const context = {
480
+ workspace: input.workspace,
481
+ store: input.store,
482
+ ...(input.stateDir ? { stateDir: input.stateDir } : {}),
483
+ ...(input.exclude ? { exclude: input.exclude } : {}),
484
+ ...(input.signal ? { signal: input.signal } : {}),
485
+ ...(input.timeoutMs !== undefined ? { timeoutMs: input.timeoutMs } : {}),
486
+ };
487
+ const preflight = input.preflight ?? await preflightRestore({
488
+ manifest: input.manifest,
489
+ workspace: input.workspace,
490
+ store: input.store,
491
+ ...(input.stateDir ? { stateDir: input.stateDir } : {}),
492
+ ...(input.exclude ? { exclude: input.exclude } : {}),
493
+ ...(input.signal ? { signal: input.signal } : {}),
494
+ ...(input.timeoutMs !== undefined ? { timeoutMs: input.timeoutMs } : {}),
495
+ });
496
+ const { manifest, currentBoundary } = preflight;
497
+ const targetHead = manifest.head;
498
+ const currentHead = currentBoundary.head;
499
+ let safetyRef;
500
+ if (preflight.backward && currentHead) {
501
+ safetyRef = `refs/loopforge/restore-backup/${input.directiveTransactionId}`;
502
+ const created = await gitStatus(["update-ref", safetyRef, currentHead], context);
503
+ if (created.code !== 0) {
504
+ throw new RestoreFailure("safety_ref_failed", `cannot preserve the pre-restore HEAD: ${created.stderr || created.error || "git update-ref failed"}`);
505
+ }
506
+ }
507
+ if (targetHead) {
508
+ const reset = await gitStatus(["reset", "--hard", targetHead], context);
509
+ if (reset.code !== 0) {
510
+ throw new RestoreFailure("reset_failed", `git reset --hard ${shortHead(targetHead)} failed: ${reset.stderr || reset.error || "unknown error"}`);
511
+ }
512
+ }
513
+ else {
514
+ const empty = await gitStatus(["read-tree", "--empty"], context);
515
+ if (empty.code !== 0) {
516
+ throw new RestoreFailure("reset_failed", "cannot normalize the index to an unborn HEAD");
517
+ }
518
+ }
519
+ const deletions = planDeletions(manifest, currentBoundary, context);
520
+ let filesDeleted = 0;
521
+ for (const path of deletions) {
522
+ const abs = safeTargetPath(path, context);
523
+ // Only boundary file/symlink paths are deleted here; a directory path
524
+ // (gitlink) is out-of-boundary content and fails rather than recursing.
525
+ if (removePath(abs, context, fingerprintKind(currentBoundary.fingerprints[path]).kind === "gitlink" || fingerprintKind(currentBoundary.fingerprints[path]).kind === "dir")) {
526
+ filesDeleted++;
527
+ }
528
+ }
529
+ let filesWritten = 0;
530
+ const materialized = new Set(manifest.contents);
531
+ for (const path of Object.keys(manifest.fingerprints).sort()) {
532
+ const kind = fingerprintKind(manifest.fingerprints[path]);
533
+ // Clean tracked regular files/symlinks were restored by `reset --hard`;
534
+ // only dirty content (stored blobs), missing paths and directory/gitlink
535
+ // entries need explicit handling. Writing a clean file would need a blob
536
+ // we deliberately never stored.
537
+ if (kind.kind !== "missing" && kind.kind !== "dir" && kind.kind !== "gitlink" &&
538
+ !materialized.has(path)) {
539
+ continue;
540
+ }
541
+ const abs = safeTargetPath(path, context);
542
+ if (writeTarget(path, manifest.fingerprints[path], abs, context) === "written") {
543
+ filesWritten++;
544
+ }
545
+ }
546
+ // Post-restore evidence is the verification AND the redo's before baseline.
547
+ // One pass; the boundary sink receives the same boundary for the redo's own
548
+ // before checkpoint.
549
+ let baselineBoundary;
550
+ const baseline = await EvidenceCollector.fromPolicy().collectAsync({
551
+ phase: "before",
552
+ cwd: input.workspace,
553
+ materializer: input.store,
554
+ boundarySink: (boundary) => { baselineBoundary = boundary; },
555
+ });
556
+ const gitObservation = baseline.find((observation) => observation.kind === "git");
557
+ let verificationBoundary;
558
+ if (gitObservation && gitObservation.kind === "git" && gitObservation.status === "observed") {
559
+ verificationBoundary = {
560
+ ...(gitObservation.data.head ? { head: gitObservation.data.head } : {}),
561
+ dirty: [...gitObservation.data.dirty],
562
+ fingerprints: gitObservation.data.fingerprints,
563
+ contents: baselineBoundary?.contents ?? [],
564
+ ...(baselineBoundary?.materializationError
565
+ ? { materializationError: baselineBoundary.materializationError }
566
+ : {}),
567
+ };
568
+ }
569
+ else {
570
+ const direct = await captureBoundary({
571
+ cwd: input.workspace,
572
+ ...(input.signal ? { signal: input.signal } : {}),
573
+ ...(input.timeoutMs !== undefined ? { timeoutMs: input.timeoutMs } : {}),
574
+ ...(input.exclude ? { exclude: input.exclude } : {}),
575
+ materializer: input.store,
576
+ });
577
+ if (!direct.ok) {
578
+ throw new RestoreFailure("restore_unobservable", `post-restore Git boundary is unavailable: ${direct.detail}`);
579
+ }
580
+ verificationBoundary = direct.boundary;
581
+ // Even with the Git evidence provider disabled, the internal boundary is
582
+ // the same pass that verified HEAD/content; let the redo carry its own
583
+ // before-image from it.
584
+ baselineBoundary = direct.boundary;
585
+ }
586
+ const same = sameBoundary(manifest, verificationBoundary);
587
+ if (!same.ok) {
588
+ throw new RestoreFailure("restore_verification_failed", same.detail);
589
+ }
590
+ return {
591
+ status: "verified",
592
+ checkpointId: manifest.checkpointId,
593
+ redoRound: manifest.round,
594
+ ...(manifest.head ? { head: manifest.head } : {}),
595
+ ...(currentHead ? { previousHead: currentHead } : {}),
596
+ ...(safetyRef ? { safetyRef } : {}),
597
+ filesWritten,
598
+ filesDeleted,
599
+ verifiedAt: Date.now(),
600
+ baseline,
601
+ ...(baselineBoundary ? { baselineBoundary } : {}),
602
+ };
603
+ }
604
+ //# sourceMappingURL=workspace-restore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-restore.js","sourceRoot":"","sources":["../src/workspace-restore.ts"],"names":[],"mappings":"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"}
@@ -26,13 +26,4 @@
26
26
  * the process cwd without pre-resolving it.
27
27
  */
28
28
  export declare function containInWorkspace(workspace: string, target: string): string;
29
- /** v3.8.1: the Contract scope-entry check, in the module that owns workspace
30
- * containment.
31
- *
32
- * It lives here rather than in the MCP transport because it is a filesystem
33
- * fact about the running process, not a property of the payload: the strict
34
- * contract boundary injects it so a declared scope entry that escapes the
35
- * workspace is rejected pre-advance. Returns the reason when the entry
36
- * escapes, null when it is contained. */
37
- export declare function scopeEntryDetail(entry: string): string | null;
38
29
  //# sourceMappingURL=workspace.d.ts.map