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,625 @@
1
+ /** The ONE Git boundary capture.
2
+ *
3
+ * Evidence and workspace checkpoints must see exactly the same boundary:
4
+ * every tracked path plus every non-ignored untracked path, with the same
5
+ * fingerprint encoding. This module owns the read-only Git commands, the
6
+ * fingerprint algorithm, and the optional content materializer used by
7
+ * checkpoints. `evidence-provider.ts` consumes it for observations; the
8
+ * checkpoint store consumes it for before-images/savepoints.
9
+ *
10
+ * It deliberately has no dependency on policy, the loop store, or the
11
+ * evidence provider so both callers can share one implementation without a
12
+ * cycle.
13
+ */
14
+ import { createHash } from "node:crypto";
15
+ import { createReadStream, createWriteStream, lstatSync, readlinkSync, writeFileSync, } from "node:fs";
16
+ import { execFile } from "node:child_process";
17
+ import { resolve } from "node:path";
18
+ import { containInWorkspace } from "./workspace.js";
19
+ export class GitCaptureFailure extends Error {
20
+ status;
21
+ constructor(status, message) {
22
+ super(message);
23
+ this.status = status;
24
+ this.name = "GitCaptureFailure";
25
+ }
26
+ }
27
+ export const GIT_MAX_BUFFER = 64 * 1024 * 1024;
28
+ /** Bounded file-hash concurrency. A module constant, not a policy knob. */
29
+ export const BOUNDARY_HASH_CONCURRENCY = 16;
30
+ function splitNul(text) {
31
+ return text.split("\0").filter((entry) => entry.length > 0);
32
+ }
33
+ function uniqueSorted(values) {
34
+ return [...new Set(values)].sort();
35
+ }
36
+ /** Parse `git ls-files --stage -z`. A conflicted path can have several
37
+ * stages; stage 0 wins when present, otherwise the first entry is kept. The
38
+ * worktree fingerprint is what matters, so this is only used to recognise
39
+ * gitlinks and to carry the index object id. */
40
+ function parseStageEntries(text) {
41
+ const byPath = new Map();
42
+ for (const record of splitNul(text)) {
43
+ const tab = record.indexOf("\t");
44
+ if (tab < 0)
45
+ continue;
46
+ const [mode, object, stage] = record.slice(0, tab).split(" ");
47
+ if (!mode || !object || !stage)
48
+ continue;
49
+ const path = record.slice(tab + 1);
50
+ if (!path)
51
+ continue;
52
+ const existing = byPath.get(path);
53
+ if (!existing || stage === "0") {
54
+ byPath.set(path, { entry: { path, mode, object }, stage });
55
+ }
56
+ }
57
+ return [...byPath.values()]
58
+ .map((item) => item.entry)
59
+ .sort((a, b) => a.path.localeCompare(b.path));
60
+ }
61
+ /** Run one fixed-argument, shell-free Git command. Callers must never pass
62
+ * user-controlled path/ref text through a shell; arguments stay an array. */
63
+ export function runGitCommand(args, options) {
64
+ const timeout = options.timeoutMs ?? 15_000;
65
+ return new Promise((resolveGit, reject) => {
66
+ let settled = false;
67
+ const succeed = (stdout) => {
68
+ if (settled)
69
+ return;
70
+ settled = true;
71
+ resolveGit(stdout);
72
+ };
73
+ const fail = (error) => {
74
+ if (settled)
75
+ return;
76
+ settled = true;
77
+ reject(error);
78
+ };
79
+ const child = execFile("git", ["-c", "core.quotePath=false", ...args], {
80
+ cwd: options.cwd,
81
+ encoding: "utf-8",
82
+ timeout,
83
+ signal: options.signal,
84
+ maxBuffer: options.maxBuffer ?? GIT_MAX_BUFFER,
85
+ windowsHide: true,
86
+ });
87
+ let stdout = "";
88
+ let stderr = "";
89
+ child.stdout?.on("data", (chunk) => {
90
+ stdout += chunk;
91
+ });
92
+ child.stderr?.on("data", (chunk) => {
93
+ stderr += chunk;
94
+ });
95
+ child.on("close", (code) => {
96
+ if (code === 0)
97
+ succeed(stdout);
98
+ else if (code === null) {
99
+ fail(new GitCaptureFailure("timeout", `git ${args[0]} was killed`));
100
+ }
101
+ else if (/not a git repository|not a repository/i.test(stderr)) {
102
+ fail(new GitCaptureFailure("unavailable", stderr.trim() || "not a git repository"));
103
+ }
104
+ else {
105
+ fail(new GitCaptureFailure("error", `git ${args[0]} exited ${code}${stderr ? `: ${stderr.trim().slice(0, 300)}` : ""}`));
106
+ }
107
+ });
108
+ child.on("error", (error) => {
109
+ if (options.signal?.aborted) {
110
+ fail(new GitCaptureFailure("aborted", `git ${args[0]} aborted`));
111
+ }
112
+ else if (error.code === "ENOENT") {
113
+ fail(new GitCaptureFailure("unavailable", "git executable was not found"));
114
+ }
115
+ else if (error.killed || error.signal) {
116
+ fail(new GitCaptureFailure("timeout", `git ${args[0]} timed out after ${timeout}ms`));
117
+ }
118
+ else if (/not a git repository/i.test(error.message)) {
119
+ fail(new GitCaptureFailure("unavailable", error.message));
120
+ }
121
+ else {
122
+ fail(new GitCaptureFailure("error", error.message));
123
+ }
124
+ });
125
+ });
126
+ }
127
+ /** Run a fixed-argument Git command and preserve its exit status. Used by the
128
+ * restore executor for commands whose non-zero exit is a meaningful answer
129
+ * (`merge-base --is-ancestor`). */
130
+ export function runGitCommandStatus(args, options) {
131
+ const timeout = options.timeoutMs ?? 15_000;
132
+ return new Promise((resolveStatus) => {
133
+ execFile("git", ["-c", "core.quotePath=false", ...args], {
134
+ cwd: options.cwd,
135
+ encoding: "utf-8",
136
+ timeout,
137
+ signal: options.signal,
138
+ maxBuffer: options.maxBuffer ?? GIT_MAX_BUFFER,
139
+ windowsHide: true,
140
+ }, (error, stdout, stderr) => {
141
+ const code = error && typeof error.code === "number"
142
+ ? error.code
143
+ : error
144
+ ? null
145
+ : 0;
146
+ resolveStatus({
147
+ code,
148
+ stdout: String(stdout ?? ""),
149
+ stderr: String(stderr ?? ""),
150
+ ...(error ? { error: error.message } : {}),
151
+ });
152
+ });
153
+ });
154
+ }
155
+ /** Capture the complete boundary state. All required git commands run in one
156
+ * parallel batch; HEAD is best-effort (a repository with no commit is a
157
+ * valid boundary with no head). Any required-command failure returns an
158
+ * explicit status — never an empty-but-observed boundary. */
159
+ export async function captureGitFileStateAsync(signal, timeoutMs,
160
+ /** Workspace root; injectable so tests can capture against a temp repo.
161
+ * Defaults to the process cwd, matching the evidence providers. */
162
+ cwd = process.cwd()) {
163
+ const runGit = (args) => runGitCommand(args, { cwd, signal, timeoutMs });
164
+ try {
165
+ // allSettled, not all: on failure the other children must still finish
166
+ // before this capture returns, or Windows keeps the workspace directory
167
+ // locked (and every caller would leak child-process handles).
168
+ const settled = await Promise.allSettled([
169
+ runGit(["ls-files", "--stage", "-z"]),
170
+ runGit(["ls-files", "--others", "--exclude-standard", "-z"]),
171
+ runGit(["diff", "--name-only", "-z"]),
172
+ runGit(["diff", "--cached", "--name-only", "-z"]),
173
+ ]);
174
+ const failures = settled
175
+ .filter((item) => item.status === "rejected")
176
+ .map((item) => item.reason)
177
+ .filter((error) => error instanceof GitCaptureFailure);
178
+ if (failures.length > 0) {
179
+ const failure = failures.find((item) => item.status === "aborted" || item.status === "timeout") ?? failures[0];
180
+ throw failure;
181
+ }
182
+ const rejected = settled.find((item) => item.status === "rejected");
183
+ if (rejected) {
184
+ throw new GitCaptureFailure("error", String(rejected.reason));
185
+ }
186
+ const [stageOut, untrackedOut, unstagedOut, stagedOut] = settled.map((item) => item.value);
187
+ let head;
188
+ try {
189
+ head = (await runGit(["rev-parse", "--verify", "HEAD"])).trim() || undefined;
190
+ }
191
+ catch (error) {
192
+ // A repository with no commit has no HEAD. Abort still propagates.
193
+ if (error instanceof GitCaptureFailure && error.status === "aborted")
194
+ throw error;
195
+ }
196
+ const untracked = uniqueSorted(splitNul(untrackedOut));
197
+ return {
198
+ ok: true,
199
+ state: {
200
+ tracked: parseStageEntries(stageOut),
201
+ untracked,
202
+ dirty: uniqueSorted([
203
+ ...splitNul(unstagedOut),
204
+ ...splitNul(stagedOut),
205
+ ...untracked,
206
+ ]),
207
+ head,
208
+ },
209
+ };
210
+ }
211
+ catch (error) {
212
+ if (error instanceof GitCaptureFailure) {
213
+ return { ok: false, status: error.status, detail: error.message };
214
+ }
215
+ return { ok: false, status: "error", detail: String(error) };
216
+ }
217
+ }
218
+ function hashText(text) {
219
+ return createHash("sha256").update(text).digest("hex");
220
+ }
221
+ /** Stream a regular file through SHA-256 without loading it into memory. */
222
+ function hashFileStream(abs, signal) {
223
+ return new Promise((resolveHash, reject) => {
224
+ const hash = createHash("sha256");
225
+ const stream = createReadStream(abs, { highWaterMark: 64 * 1024 });
226
+ let settled = false;
227
+ const cleanup = () => {
228
+ if (signal)
229
+ signal.removeEventListener("abort", onAbort);
230
+ };
231
+ const finish = (error) => {
232
+ if (settled)
233
+ return;
234
+ settled = true;
235
+ cleanup();
236
+ if (error)
237
+ reject(error);
238
+ else
239
+ resolveHash(hash.digest("hex"));
240
+ };
241
+ const onAbort = () => {
242
+ stream.destroy();
243
+ finish(new GitCaptureFailure("aborted", "boundary hashing aborted"));
244
+ };
245
+ if (signal?.aborted) {
246
+ onAbort();
247
+ return;
248
+ }
249
+ signal?.addEventListener("abort", onAbort, { once: true });
250
+ stream.on("data", (chunk) => hash.update(chunk));
251
+ stream.on("error", (error) => finish(error));
252
+ stream.on("end", () => finish());
253
+ });
254
+ }
255
+ /** Hash a regular file while optionally copying it to a temp blob. The hash
256
+ * and the copied bytes come from the SAME stream, so a checkpoint can never
257
+ * reference content it did not fingerprint. */
258
+ function hashAndMaybeMaterialize(abs, materializer, signal) {
259
+ if (!materializer) {
260
+ return hashFileStream(abs, signal).then((hash) => ({ hash }));
261
+ }
262
+ return new Promise((resolveResult, reject) => {
263
+ const hash = createHash("sha256");
264
+ const temp = materializer.tempPath();
265
+ const source = createReadStream(abs, { highWaterMark: 64 * 1024 });
266
+ const sink = createWriteStream(temp, { mode: 0o600 });
267
+ let settled = false;
268
+ let sourceEnded = false;
269
+ const cleanup = () => {
270
+ if (signal)
271
+ signal.removeEventListener("abort", onAbort);
272
+ };
273
+ const fail = (error) => {
274
+ if (settled)
275
+ return;
276
+ settled = true;
277
+ cleanup();
278
+ source.destroy();
279
+ sink.destroy();
280
+ try {
281
+ materializer.discardTemp(temp);
282
+ }
283
+ catch { /* best effort */ }
284
+ reject(error);
285
+ };
286
+ const succeed = () => {
287
+ if (settled)
288
+ return;
289
+ settled = true;
290
+ cleanup();
291
+ resolveResult({ hash: hash.digest("hex"), temp });
292
+ };
293
+ const onAbort = () => {
294
+ fail(new GitCaptureFailure("aborted", "boundary content capture aborted"));
295
+ };
296
+ if (signal?.aborted) {
297
+ onAbort();
298
+ return;
299
+ }
300
+ signal?.addEventListener("abort", onAbort, { once: true });
301
+ source.on("data", (chunk) => {
302
+ const bytes = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
303
+ hash.update(bytes);
304
+ if (!sink.write(bytes))
305
+ source.pause();
306
+ });
307
+ sink.on("drain", () => source.resume());
308
+ source.on("error", (error) => fail(error));
309
+ sink.on("error", (error) => fail(error));
310
+ source.on("end", () => {
311
+ sourceEnded = true;
312
+ sink.end();
313
+ });
314
+ sink.on("finish", () => {
315
+ if (sourceEnded)
316
+ succeed();
317
+ });
318
+ });
319
+ }
320
+ /** Fingerprint one boundary path.
321
+ * - symlinks hash their LINK TEXT; the target is never read
322
+ * - regular files stream their content
323
+ * - gitlinks record the index commit (submodule contents are not covered)
324
+ * A per-file read/containment failure is an explicit `unreadable:<mode>`
325
+ * sentinel, not an omitted path. */
326
+ async function boundaryFingerprint(workspace, path, tracked, signal) {
327
+ const abs = resolve(workspace, path);
328
+ let stat;
329
+ try {
330
+ stat = lstatSync(abs);
331
+ }
332
+ catch (error) {
333
+ return error.code === "ENOENT" ? "missing" : "unreadable";
334
+ }
335
+ const mode = stat.mode;
336
+ if (stat.isSymbolicLink()) {
337
+ try {
338
+ // The parent must be contained; the final link target is NOT followed.
339
+ const parent = path.includes("/")
340
+ ? path.slice(0, path.lastIndexOf("/")) || "."
341
+ : ".";
342
+ containInWorkspace(workspace, parent);
343
+ return `link:${hashText(readlinkSync(abs))}`;
344
+ }
345
+ catch {
346
+ return `unreadable:${mode}`;
347
+ }
348
+ }
349
+ if (stat.isDirectory()) {
350
+ if (tracked?.mode === "160000")
351
+ return `gitlink:${tracked.object}`;
352
+ return `dir:${mode}`;
353
+ }
354
+ if (!stat.isFile())
355
+ return `other:${mode}`;
356
+ try {
357
+ containInWorkspace(workspace, path);
358
+ const digest = await hashFileStream(abs, signal);
359
+ return `${mode}:${digest}`;
360
+ }
361
+ catch (error) {
362
+ if (error instanceof GitCaptureFailure)
363
+ throw error;
364
+ return `unreadable:${mode}`;
365
+ }
366
+ }
367
+ /** Hash the complete boundary with bounded concurrency. When a materializer
368
+ * and a dirty-path set are supplied, dirty regular files/symlink texts are
369
+ * copied into the content store while they are hashed. */
370
+ async function fingerprintBoundary(workspace, entries, dirty, materializer, signal) {
371
+ const paths = [...entries.keys()].sort();
372
+ const fingerprints = {};
373
+ const contents = [];
374
+ let materializationError;
375
+ let next = 0;
376
+ const worker = async () => {
377
+ for (;;) {
378
+ if (signal?.aborted) {
379
+ throw new GitCaptureFailure("aborted", "boundary hashing aborted");
380
+ }
381
+ const index = next++;
382
+ if (index >= paths.length)
383
+ return;
384
+ const path = paths[index];
385
+ const tracked = entries.get(path);
386
+ const shouldMaterialize = Boolean(materializer) && dirty.has(path);
387
+ if (!shouldMaterialize) {
388
+ const fingerprint = await boundaryFingerprint(workspace, path, tracked, signal);
389
+ fingerprints[path] = fingerprint;
390
+ // A checkpoint cannot be complete when a boundary path is unreadable
391
+ // or is not a file/symlink/gitlink/dir. Evidence itself stays
392
+ // observed, but the materializer records why recovery is unavailable.
393
+ if (materializer && fingerprint.startsWith("unreadable")) {
394
+ materializationError ??= {
395
+ code: "unreadable_path",
396
+ detail: `cannot read ${path}`,
397
+ };
398
+ }
399
+ else if (materializer && fingerprint.startsWith("other:")) {
400
+ materializationError ??= {
401
+ code: "unsupported_file_type",
402
+ detail: `${path} is not a regular file`,
403
+ };
404
+ }
405
+ continue;
406
+ }
407
+ const abs = resolve(workspace, path);
408
+ let stat;
409
+ try {
410
+ stat = lstatSync(abs);
411
+ }
412
+ catch (error) {
413
+ fingerprints[path] = error.code === "ENOENT"
414
+ ? "missing"
415
+ : "unreadable";
416
+ if (fingerprints[path] === "unreadable") {
417
+ materializationError ??= {
418
+ code: "unreadable_path",
419
+ detail: `cannot read ${path}`,
420
+ };
421
+ }
422
+ continue;
423
+ }
424
+ if (stat.isSymbolicLink()) {
425
+ try {
426
+ const parent = path.includes("/")
427
+ ? path.slice(0, path.lastIndexOf("/")) || "."
428
+ : ".";
429
+ containInWorkspace(workspace, parent);
430
+ const text = readlinkSync(abs);
431
+ const hash = hashText(text);
432
+ fingerprints[path] = `link:${hash}`;
433
+ if (materializer.hasBlob(hash)) {
434
+ contents.push(path);
435
+ continue;
436
+ }
437
+ const temp = materializer.tempPath();
438
+ try {
439
+ writeFileSync(temp, text, { mode: 0o600 });
440
+ materializer.commitBlob(hash, temp);
441
+ contents.push(path);
442
+ }
443
+ catch (error) {
444
+ try {
445
+ materializer.discardTemp(temp);
446
+ }
447
+ catch { /* best effort */ }
448
+ materializationError ??= {
449
+ code: "content_write_failed",
450
+ detail: `symlink ${path}: ${String(error)}`,
451
+ };
452
+ }
453
+ }
454
+ catch {
455
+ fingerprints[path] = `unreadable:${stat.mode}`;
456
+ materializationError ??= {
457
+ code: "unreadable_path",
458
+ detail: `cannot read symlink ${path}`,
459
+ };
460
+ }
461
+ continue;
462
+ }
463
+ if (stat.isDirectory()) {
464
+ fingerprints[path] = tracked?.mode === "160000"
465
+ ? `gitlink:${tracked.object}`
466
+ : `dir:${stat.mode}`;
467
+ continue;
468
+ }
469
+ if (!stat.isFile()) {
470
+ fingerprints[path] = `other:${stat.mode}`;
471
+ materializationError ??= {
472
+ code: "unsupported_file_type",
473
+ detail: `${path} is not a regular file`,
474
+ };
475
+ continue;
476
+ }
477
+ try {
478
+ containInWorkspace(workspace, path);
479
+ const result = await hashAndMaybeMaterialize(abs, materializer, signal);
480
+ fingerprints[path] = `${stat.mode}:${result.hash}`;
481
+ if (result.temp) {
482
+ try {
483
+ if (materializer.hasBlob(result.hash))
484
+ materializer.discardTemp(result.temp);
485
+ else
486
+ materializer.commitBlob(result.hash, result.temp);
487
+ contents.push(path);
488
+ }
489
+ catch (error) {
490
+ try {
491
+ materializer.discardTemp(result.temp);
492
+ }
493
+ catch { /* best effort */ }
494
+ materializationError ??= {
495
+ code: "content_write_failed",
496
+ detail: `file ${path}: ${String(error)}`,
497
+ };
498
+ }
499
+ }
500
+ }
501
+ catch (error) {
502
+ if (error instanceof GitCaptureFailure)
503
+ throw error;
504
+ // The combined hash+copy stream can fail on the STORE side (disk
505
+ // full, permission) while the file itself is readable. Never let a
506
+ // materialization failure downgrade the evidence fingerprint: retry
507
+ // the hash without the content sink.
508
+ try {
509
+ fingerprints[path] = `${stat.mode}:${await hashFileStream(abs, signal)}`;
510
+ }
511
+ catch {
512
+ fingerprints[path] = `unreadable:${stat.mode}`;
513
+ materializationError ??= {
514
+ code: "unreadable_path",
515
+ detail: `cannot read ${path}`,
516
+ };
517
+ continue;
518
+ }
519
+ materializationError ??= {
520
+ code: "content_write_failed",
521
+ detail: `file ${path}: ${String(error)}`,
522
+ };
523
+ }
524
+ }
525
+ };
526
+ const workers = Math.min(BOUNDARY_HASH_CONCURRENCY, Math.max(1, paths.length));
527
+ await Promise.all(Array.from({ length: workers }, () => worker()));
528
+ return { fingerprints, contents: contents.sort(), materializationError };
529
+ }
530
+ // ── The shared capture ─────────────────────────────────────────────────────
531
+ /** Refresh the index stat cache and reject index states a delta checkpoint
532
+ * cannot represent. Non-zero from `update-index --refresh` is normal for a
533
+ * modified worktree; only a real Git failure is an error. */
534
+ async function prepareIndexForCheckpoint(cwd, signal, timeoutMs) {
535
+ try {
536
+ await runGitCommand(["update-index", "--refresh", "-q"], { cwd, signal, timeoutMs });
537
+ }
538
+ catch (error) {
539
+ if (error instanceof GitCaptureFailure &&
540
+ (error.status === "aborted" || error.status === "timeout" ||
541
+ error.status === "unavailable")) {
542
+ throw error;
543
+ }
544
+ // exit 1 means "files need refresh"; the index was still refreshed.
545
+ }
546
+ const unmerged = await runGitCommand(["ls-files", "-u", "-z"], { cwd, signal, timeoutMs });
547
+ if (unmerged.length > 0) {
548
+ throw new GitCaptureFailure("error", "unmerged index entries cannot be represented by a checkpoint");
549
+ }
550
+ // Sparse checkout / skip-worktree (`S`) and assume-unchanged (lowercase
551
+ // tags) make the worktree an incomplete view of the index. A checkpoint
552
+ // cannot represent that boundary; fail before writing recovery material.
553
+ const flagged = await runGitCommand(["ls-files", "-v", "-z"], { cwd, signal, timeoutMs });
554
+ for (const record of flagged.split("\0").filter(Boolean)) {
555
+ const tag = record[0] ?? "";
556
+ if (tag === "S" || (tag >= "a" && tag <= "z")) {
557
+ throw new GitCaptureFailure("error", "skip-worktree/assume-unchanged index entries cannot be represented by a checkpoint");
558
+ }
559
+ }
560
+ }
561
+ /** Capture the full boundary, optionally materializing dirty content.
562
+ *
563
+ * The fingerprint map is always complete. Materialization failures are
564
+ * reported on the boundary as `materializationError` and never downgrade the
565
+ * evidence: the caller can still use the fingerprints/head. */
566
+ export async function captureBoundary(options) {
567
+ const { cwd, signal, timeoutMs, exclude } = options;
568
+ let materializer = options.materializer;
569
+ let materializationError;
570
+ if (materializer && options.refreshIndex !== false) {
571
+ try {
572
+ await prepareIndexForCheckpoint(cwd, signal, timeoutMs);
573
+ }
574
+ catch (error) {
575
+ if (error instanceof GitCaptureFailure &&
576
+ (error.status === "aborted" || error.status === "timeout" ||
577
+ error.status === "unavailable")) {
578
+ return { ok: false, status: error.status, detail: error.message };
579
+ }
580
+ // Index state is unsupported for a delta checkpoint. Evidence can still
581
+ // be captured in full; content materialization is disabled.
582
+ materializationError = {
583
+ code: "unsupported_index",
584
+ detail: String(error instanceof Error ? error.message : error),
585
+ };
586
+ materializer = undefined;
587
+ }
588
+ }
589
+ const result = await captureGitFileStateAsync(signal, timeoutMs, cwd);
590
+ if (!result.ok)
591
+ return result;
592
+ const state = result.state;
593
+ const isExcluded = exclude ?? (() => false);
594
+ const tracked = state.tracked.filter((entry) => !isExcluded(entry.path));
595
+ const untracked = state.untracked.filter((file) => !isExcluded(file));
596
+ const dirty = state.dirty.filter((file) => !isExcluded(file));
597
+ const boundary = new Map();
598
+ for (const entry of tracked)
599
+ boundary.set(entry.path, entry);
600
+ for (const file of untracked) {
601
+ if (!boundary.has(file)) {
602
+ boundary.set(file, { path: file, mode: "", object: "" });
603
+ }
604
+ }
605
+ if (options.maxPaths !== undefined && boundary.size > options.maxPaths) {
606
+ materializationError = {
607
+ code: "too_many_paths",
608
+ detail: `boundary has ${boundary.size} paths (max ${options.maxPaths})`,
609
+ };
610
+ materializer = undefined;
611
+ }
612
+ const fingerprints = await fingerprintBoundary(cwd, boundary, new Set(dirty), materializer, signal);
613
+ materializationError ??= fingerprints.materializationError;
614
+ return {
615
+ ok: true,
616
+ boundary: {
617
+ ...(state.head ? { head: state.head } : {}),
618
+ dirty,
619
+ fingerprints: fingerprints.fingerprints,
620
+ contents: fingerprints.contents,
621
+ ...(materializationError ? { materializationError } : {}),
622
+ },
623
+ };
624
+ }
625
+ //# sourceMappingURL=git-boundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-boundary.js","sourceRoot":"","sources":["../src/git-boundary.ts"],"names":[],"mappings":"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"}