loopforge 3.9.4 → 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.
- package/README.md +236 -112
- package/dist/audit.d.ts +73 -15
- package/dist/audit.d.ts.map +1 -1
- package/dist/audit.js +131 -61
- package/dist/audit.js.map +1 -1
- package/dist/canonical-state.d.ts +114 -40
- package/dist/canonical-state.d.ts.map +1 -1
- package/dist/canonical-state.js +276 -182
- package/dist/canonical-state.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +41 -12
- package/dist/cli.js.map +1 -1
- package/dist/cognitive-governance.d.ts +0 -2
- package/dist/cognitive-governance.d.ts.map +1 -1
- package/dist/cognitive-governance.js +0 -4
- package/dist/cognitive-governance.js.map +1 -1
- package/dist/committed-round.d.ts +97 -156
- package/dist/committed-round.d.ts.map +1 -1
- package/dist/committed-round.js +223 -419
- package/dist/committed-round.js.map +1 -1
- package/dist/constraint-lifecycle.d.ts +73 -0
- package/dist/constraint-lifecycle.d.ts.map +1 -0
- package/dist/constraint-lifecycle.js +174 -0
- package/dist/constraint-lifecycle.js.map +1 -0
- package/dist/context-boundary.d.ts +83 -0
- package/dist/context-boundary.d.ts.map +1 -0
- package/dist/context-boundary.js +101 -0
- package/dist/context-boundary.js.map +1 -0
- package/dist/contract-items.d.ts +12 -8
- package/dist/contract-items.d.ts.map +1 -1
- package/dist/contract-items.js +31 -26
- package/dist/contract-items.js.map +1 -1
- package/dist/contract-requirement.d.ts +47 -0
- package/dist/contract-requirement.d.ts.map +1 -0
- package/dist/contract-requirement.js +51 -0
- package/dist/contract-requirement.js.map +1 -0
- package/dist/criterion-status.d.ts +35 -0
- package/dist/criterion-status.d.ts.map +1 -0
- package/dist/criterion-status.js +89 -0
- package/dist/criterion-status.js.map +1 -0
- package/dist/enforcement-gate.d.ts +26 -38
- package/dist/enforcement-gate.d.ts.map +1 -1
- package/dist/enforcement-gate.js +196 -319
- package/dist/enforcement-gate.js.map +1 -1
- package/dist/engine.d.ts +9 -103
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +27 -897
- package/dist/engine.js.map +1 -1
- package/dist/errors.d.ts +41 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +69 -0
- package/dist/errors.js.map +1 -0
- package/dist/evidence-claims.d.ts +33 -31
- package/dist/evidence-claims.d.ts.map +1 -1
- package/dist/evidence-claims.js +58 -72
- package/dist/evidence-claims.js.map +1 -1
- package/dist/evidence-posture-view.d.ts +19 -0
- package/dist/evidence-posture-view.d.ts.map +1 -0
- package/dist/evidence-posture-view.js +116 -0
- package/dist/evidence-posture-view.js.map +1 -0
- package/dist/evidence-posture.d.ts +73 -0
- package/dist/evidence-posture.d.ts.map +1 -0
- package/dist/evidence-posture.js +281 -0
- package/dist/evidence-posture.js.map +1 -0
- package/dist/evidence-provider.d.ts +55 -37
- package/dist/evidence-provider.d.ts.map +1 -1
- package/dist/evidence-provider.js +182 -332
- package/dist/evidence-provider.js.map +1 -1
- package/dist/explain.d.ts +166 -27
- package/dist/explain.d.ts.map +1 -1
- package/dist/explain.js +372 -58
- package/dist/explain.js.map +1 -1
- package/dist/field-accounting.d.ts.map +1 -1
- package/dist/field-accounting.js +3 -22
- package/dist/field-accounting.js.map +1 -1
- package/dist/generate-schema.js +13 -8
- package/dist/generate-schema.js.map +1 -1
- package/dist/git-boundary.d.ts +128 -0
- package/dist/git-boundary.d.ts.map +1 -0
- package/dist/git-boundary.js +625 -0
- package/dist/git-boundary.js.map +1 -0
- package/dist/git-facts.d.ts +22 -0
- package/dist/git-facts.d.ts.map +1 -0
- package/dist/git-facts.js +29 -0
- package/dist/git-facts.js.map +1 -0
- package/dist/git-motion.d.ts +37 -0
- package/dist/git-motion.d.ts.map +1 -0
- package/dist/git-motion.js +59 -0
- package/dist/git-motion.js.map +1 -0
- package/dist/history.d.ts +44 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +77 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +19 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -4
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +16 -0
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +80 -14
- package/dist/init.js.map +1 -1
- package/dist/loop-compiler.d.ts +39 -23
- package/dist/loop-compiler.d.ts.map +1 -1
- package/dist/loop-compiler.js +368 -565
- package/dist/loop-compiler.js.map +1 -1
- package/dist/loop-store.d.ts +6 -5
- package/dist/loop-store.d.ts.map +1 -1
- package/dist/loop-store.js +153 -35
- package/dist/loop-store.js.map +1 -1
- package/dist/mcp/round-lifecycle.d.ts +255 -81
- package/dist/mcp/round-lifecycle.d.ts.map +1 -1
- package/dist/mcp/round-lifecycle.js +1552 -539
- package/dist/mcp/round-lifecycle.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +42 -18
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/session.d.ts +81 -39
- package/dist/mcp/session.d.ts.map +1 -1
- package/dist/mcp/session.js +956 -282
- package/dist/mcp/session.js.map +1 -1
- package/dist/mcp/submission-boundary.d.ts +23 -31
- package/dist/mcp/submission-boundary.d.ts.map +1 -1
- package/dist/mcp/submission-boundary.js +242 -92
- package/dist/mcp/submission-boundary.js.map +1 -1
- package/dist/mcp/submission-handle.d.ts +66 -0
- package/dist/mcp/submission-handle.d.ts.map +1 -0
- package/dist/mcp/submission-handle.js +173 -0
- package/dist/mcp/submission-handle.js.map +1 -0
- package/dist/mcp/tools.d.ts +17 -7
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +707 -244
- package/dist/mcp/tools.js.map +1 -1
- package/dist/open-question.d.ts +7 -0
- package/dist/open-question.d.ts.map +1 -0
- package/dist/open-question.js +14 -0
- package/dist/open-question.js.map +1 -0
- package/dist/policy-metrics.d.ts +31 -21
- package/dist/policy-metrics.d.ts.map +1 -1
- package/dist/policy-metrics.js +117 -64
- package/dist/policy-metrics.js.map +1 -1
- package/dist/policy.d.ts +11 -39
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +12 -12
- package/dist/policy.js.map +1 -1
- package/dist/progress.d.ts +45 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +136 -0
- package/dist/progress.js.map +1 -0
- package/dist/prompt-assembler.d.ts +20 -6
- package/dist/prompt-assembler.d.ts.map +1 -1
- package/dist/prompt-assembler.js +475 -479
- package/dist/prompt-assembler.js.map +1 -1
- package/dist/prompt-coverage.d.ts +0 -6
- package/dist/prompt-coverage.d.ts.map +1 -1
- package/dist/prompt-coverage.js +4 -8
- package/dist/prompt-coverage.js.map +1 -1
- package/dist/prompt-freshness.d.ts +6 -17
- package/dist/prompt-freshness.d.ts.map +1 -1
- package/dist/prompt-freshness.js +27 -22
- package/dist/prompt-freshness.js.map +1 -1
- package/dist/prompt-policy.d.ts +14 -7
- package/dist/prompt-policy.d.ts.map +1 -1
- package/dist/prompt-policy.js +21 -5
- package/dist/prompt-policy.js.map +1 -1
- package/dist/protocol.d.ts +843 -424
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +73 -102
- package/dist/protocol.js.map +1 -1
- package/dist/recovery-guidance.d.ts +13 -0
- package/dist/recovery-guidance.d.ts.map +1 -0
- package/dist/recovery-guidance.js +15 -0
- package/dist/recovery-guidance.js.map +1 -0
- package/dist/recovery.d.ts +68 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +234 -0
- package/dist/recovery.js.map +1 -0
- package/dist/replay.d.ts +42 -8
- package/dist/replay.d.ts.map +1 -1
- package/dist/replay.js +311 -84
- package/dist/replay.js.map +1 -1
- package/dist/result-facts.d.ts +45 -0
- package/dist/result-facts.d.ts.map +1 -0
- package/dist/result-facts.js +86 -0
- package/dist/result-facts.js.map +1 -0
- package/dist/round-contract.d.ts +38 -8
- package/dist/round-contract.d.ts.map +1 -1
- package/dist/round-contract.js +71 -31
- package/dist/round-contract.js.map +1 -1
- package/dist/round-coordinator.d.ts +41 -89
- package/dist/round-coordinator.d.ts.map +1 -1
- package/dist/round-coordinator.js +250 -267
- package/dist/round-coordinator.js.map +1 -1
- package/dist/round-driver.d.ts +56 -16
- package/dist/round-driver.d.ts.map +1 -1
- package/dist/round-driver.js +225 -39
- package/dist/round-driver.js.map +1 -1
- package/dist/round-facts.d.ts +33 -52
- package/dist/round-facts.d.ts.map +1 -1
- package/dist/round-facts.js +51 -160
- package/dist/round-facts.js.map +1 -1
- package/dist/round-guidance.d.ts +56 -0
- package/dist/round-guidance.d.ts.map +1 -0
- package/dist/round-guidance.js +161 -0
- package/dist/round-guidance.js.map +1 -0
- package/dist/round-outcome.d.ts +21 -0
- package/dist/round-outcome.d.ts.map +1 -0
- package/dist/round-outcome.js +31 -0
- package/dist/round-outcome.js.map +1 -0
- package/dist/round-transaction.d.ts +168 -21
- package/dist/round-transaction.d.ts.map +1 -1
- package/dist/round-transaction.js +837 -38
- package/dist/round-transaction.js.map +1 -1
- package/dist/self-eval.d.ts +37 -61
- package/dist/self-eval.d.ts.map +1 -1
- package/dist/self-eval.js +413 -392
- package/dist/self-eval.js.map +1 -1
- package/dist/storage.d.ts +16 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +54 -4
- package/dist/storage.js.map +1 -1
- package/dist/subgoal-state.d.ts +2 -3
- package/dist/subgoal-state.d.ts.map +1 -1
- package/dist/subgoal-state.js +2 -3
- package/dist/subgoal-state.js.map +1 -1
- package/dist/submission-guidance.d.ts +29 -21
- package/dist/submission-guidance.d.ts.map +1 -1
- package/dist/submission-guidance.js +308 -260
- package/dist/submission-guidance.js.map +1 -1
- package/dist/submission-receipt.d.ts +16 -8
- package/dist/submission-receipt.d.ts.map +1 -1
- package/dist/submission-receipt.js +145 -51
- package/dist/submission-receipt.js.map +1 -1
- package/dist/token-utils.d.ts +28 -7
- package/dist/token-utils.d.ts.map +1 -1
- package/dist/token-utils.js +27 -11
- package/dist/token-utils.js.map +1 -1
- package/dist/transaction-identity.d.ts +9 -0
- package/dist/transaction-identity.d.ts.map +1 -0
- package/dist/transaction-identity.js +69 -0
- package/dist/transaction-identity.js.map +1 -0
- package/dist/verification-actions.d.ts.map +1 -1
- package/dist/verification-actions.js +10 -11
- package/dist/verification-actions.js.map +1 -1
- package/dist/verification-gate.d.ts +23 -47
- package/dist/verification-gate.d.ts.map +1 -1
- package/dist/verification-gate.js +202 -423
- package/dist/verification-gate.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/working-memory.d.ts +187 -0
- package/dist/working-memory.d.ts.map +1 -0
- package/dist/working-memory.js +767 -0
- package/dist/working-memory.js.map +1 -0
- package/dist/workspace-checkpoint.d.ts +88 -0
- package/dist/workspace-checkpoint.d.ts.map +1 -0
- package/dist/workspace-checkpoint.js +326 -0
- package/dist/workspace-checkpoint.js.map +1 -0
- package/dist/workspace-restore.d.ts +68 -0
- package/dist/workspace-restore.d.ts.map +1 -0
- package/dist/workspace-restore.js +604 -0
- package/dist/workspace-restore.js.map +1 -0
- package/dist/workspace.d.ts +0 -9
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +0 -17
- package/dist/workspace.js.map +1 -1
- package/loop_policy.json +4 -18
- package/package.json +68 -68
- package/skills/forge/SKILL.md +212 -0
- package/skills/forge/references/evidence-and-contracts.md +204 -0
- package/skills/forge/references/recovery-and-views.md +188 -0
- package/dist/cognitive-facts.d.ts +0 -30
- package/dist/cognitive-facts.d.ts.map +0 -1
- package/dist/cognitive-facts.js +0 -113
- package/dist/cognitive-facts.js.map +0 -1
- package/dist/loop-extras-parser.d.ts +0 -81
- package/dist/loop-extras-parser.d.ts.map +0 -1
- package/dist/loop-extras-parser.js +0 -213
- package/dist/loop-extras-parser.js.map +0 -1
- package/dist/loop-projection.d.ts +0 -6
- package/dist/loop-projection.d.ts.map +0 -1
- package/dist/loop-projection.js +0 -28
- package/dist/loop-projection.js.map +0 -1
- package/skills/perception/SKILL.md +0 -389
|
@@ -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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"}
|