run402 4.24.1 → 4.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/cli.mjs +6 -6
  2. package/git-remote-run402.mjs +328 -0
  3. package/lib/command-manifest.mjs +13 -1
  4. package/lib/credentials.mjs +4 -0
  5. package/lib/deploy-v2.mjs +78 -1
  6. package/lib/doctor.mjs +80 -1
  7. package/lib/domains.mjs +0 -14
  8. package/lib/gitvault.mjs +582 -0
  9. package/lib/init.mjs +153 -5
  10. package/lib/org-context.mjs +44 -1
  11. package/lib/pay.test.mjs +0 -4
  12. package/package.json +8 -2
  13. package/sdk/dist/index.d.ts +20 -3
  14. package/sdk/dist/index.d.ts.map +1 -1
  15. package/sdk/dist/index.js +22 -3
  16. package/sdk/dist/index.js.map +1 -1
  17. package/sdk/dist/namespaces/admin.d.ts +0 -5
  18. package/sdk/dist/namespaces/admin.d.ts.map +1 -1
  19. package/sdk/dist/namespaces/admin.js +0 -9
  20. package/sdk/dist/namespaces/admin.js.map +1 -1
  21. package/sdk/dist/namespaces/assets.d.ts +1 -20
  22. package/sdk/dist/namespaces/assets.d.ts.map +1 -1
  23. package/sdk/dist/namespaces/assets.js +0 -27
  24. package/sdk/dist/namespaces/assets.js.map +1 -1
  25. package/sdk/dist/namespaces/domains.d.ts +0 -19
  26. package/sdk/dist/namespaces/domains.d.ts.map +1 -1
  27. package/sdk/dist/namespaces/domains.js +0 -19
  28. package/sdk/dist/namespaces/domains.js.map +1 -1
  29. package/sdk/dist/namespaces/gitvault.crypto.d.ts +319 -0
  30. package/sdk/dist/namespaces/gitvault.crypto.d.ts.map +1 -0
  31. package/sdk/dist/namespaces/gitvault.crypto.js +690 -0
  32. package/sdk/dist/namespaces/gitvault.crypto.js.map +1 -0
  33. package/sdk/dist/namespaces/gitvault.d.ts +521 -0
  34. package/sdk/dist/namespaces/gitvault.d.ts.map +1 -0
  35. package/sdk/dist/namespaces/gitvault.js +786 -0
  36. package/sdk/dist/namespaces/gitvault.js.map +1 -0
  37. package/sdk/dist/namespaces/gitvault.types.d.ts +481 -0
  38. package/sdk/dist/namespaces/gitvault.types.d.ts.map +1 -0
  39. package/sdk/dist/namespaces/gitvault.types.js +19 -0
  40. package/sdk/dist/namespaces/gitvault.types.js.map +1 -0
  41. package/sdk/dist/namespaces/org.d.ts +1 -3
  42. package/sdk/dist/namespaces/org.d.ts.map +1 -1
  43. package/sdk/dist/namespaces/org.js +6 -10
  44. package/sdk/dist/namespaces/org.js.map +1 -1
  45. package/sdk/dist/namespaces/pay.d.ts +0 -8
  46. package/sdk/dist/namespaces/pay.d.ts.map +1 -1
  47. package/sdk/dist/namespaces/pay.js.map +1 -1
  48. package/sdk/dist/namespaces/projects.d.ts +2 -2
  49. package/sdk/dist/namespaces/projects.d.ts.map +1 -1
  50. package/sdk/dist/namespaces/projects.js +4 -12
  51. package/sdk/dist/namespaces/projects.js.map +1 -1
  52. package/sdk/dist/namespaces/secrets.d.ts +0 -2
  53. package/sdk/dist/namespaces/secrets.d.ts.map +1 -1
  54. package/sdk/dist/namespaces/secrets.js +3 -10
  55. package/sdk/dist/namespaces/secrets.js.map +1 -1
  56. package/sdk/dist/namespaces/subdomains.d.ts +0 -2
  57. package/sdk/dist/namespaces/subdomains.d.ts.map +1 -1
  58. package/sdk/dist/namespaces/subdomains.js +5 -16
  59. package/sdk/dist/namespaces/subdomains.js.map +1 -1
  60. package/sdk/dist/namespaces/transfers.d.ts +0 -2
  61. package/sdk/dist/namespaces/transfers.d.ts.map +1 -1
  62. package/sdk/dist/namespaces/transfers.js +8 -10
  63. package/sdk/dist/namespaces/transfers.js.map +1 -1
  64. package/sdk/dist/namespaces/wallets.d.ts +0 -12
  65. package/sdk/dist/namespaces/wallets.d.ts.map +1 -1
  66. package/sdk/dist/namespaces/wallets.js +0 -14
  67. package/sdk/dist/namespaces/wallets.js.map +1 -1
  68. package/sdk/dist/node/gitvault-creation-journal.d.ts +222 -0
  69. package/sdk/dist/node/gitvault-creation-journal.d.ts.map +1 -0
  70. package/sdk/dist/node/gitvault-creation-journal.js +365 -0
  71. package/sdk/dist/node/gitvault-creation-journal.js.map +1 -0
  72. package/sdk/dist/node/gitvault-deploy.d.ts +211 -0
  73. package/sdk/dist/node/gitvault-deploy.d.ts.map +1 -0
  74. package/sdk/dist/node/gitvault-deploy.js +292 -0
  75. package/sdk/dist/node/gitvault-deploy.js.map +1 -0
  76. package/sdk/dist/node/gitvault-keystore.d.ts +207 -0
  77. package/sdk/dist/node/gitvault-keystore.d.ts.map +1 -0
  78. package/sdk/dist/node/gitvault-keystore.js +529 -0
  79. package/sdk/dist/node/gitvault-keystore.js.map +1 -0
  80. package/sdk/dist/node/gitvault-prune.d.ts +341 -0
  81. package/sdk/dist/node/gitvault-prune.d.ts.map +1 -0
  82. package/sdk/dist/node/gitvault-prune.js +410 -0
  83. package/sdk/dist/node/gitvault-prune.js.map +1 -0
  84. package/sdk/dist/node/gitvault-publication.d.ts +730 -0
  85. package/sdk/dist/node/gitvault-publication.d.ts.map +1 -0
  86. package/sdk/dist/node/gitvault-publication.js +1475 -0
  87. package/sdk/dist/node/gitvault-publication.js.map +1 -0
  88. package/sdk/dist/node/gitvault-snapshot.d.ts +227 -0
  89. package/sdk/dist/node/gitvault-snapshot.d.ts.map +1 -0
  90. package/sdk/dist/node/gitvault-snapshot.js +556 -0
  91. package/sdk/dist/node/gitvault-snapshot.js.map +1 -0
  92. package/sdk/dist/node/index.d.ts +11 -0
  93. package/sdk/dist/node/index.d.ts.map +1 -1
  94. package/sdk/dist/node/index.js +9 -0
  95. package/sdk/dist/node/index.js.map +1 -1
  96. package/sdk/dist/node/paid-fetch.d.ts.map +1 -1
  97. package/sdk/dist/node/paid-fetch.js +0 -4
  98. package/sdk/dist/node/paid-fetch.js.map +1 -1
  99. package/sdk/dist/node/sites-node.d.ts +1 -8
  100. package/sdk/dist/node/sites-node.d.ts.map +1 -1
  101. package/sdk/dist/node/sites-node.js +1 -7
  102. package/sdk/dist/node/sites-node.js.map +1 -1
  103. package/sdk/dist/scoped.d.ts +4 -35
  104. package/sdk/dist/scoped.d.ts.map +1 -1
  105. package/sdk/dist/scoped.js +9 -74
  106. package/sdk/dist/scoped.js.map +1 -1
  107. package/lib/sender-domain.mjs +0 -36
  108. package/sdk/dist/deprecate.d.ts +0 -23
  109. package/sdk/dist/deprecate.d.ts.map +0 -1
  110. package/sdk/dist/deprecate.js +0 -42
  111. package/sdk/dist/deprecate.js.map +0 -1
  112. package/sdk/dist/namespaces/sender-domain.d.ts +0 -47
  113. package/sdk/dist/namespaces/sender-domain.d.ts.map +0 -1
  114. package/sdk/dist/namespaces/sender-domain.js +0 -45
  115. package/sdk/dist/namespaces/sender-domain.js.map +0 -1
@@ -0,0 +1,410 @@
1
+ /**
2
+ * gitvault — prune (protocol rev 40 §7.3; task 5.12a).
3
+ *
4
+ * The two-phase, ACYCLIC prune the client half owns:
5
+ *
6
+ * 1. plan — walk the verified chain, compute the GC ROOT SET (what must
7
+ * never be deleted) and the pruneable universe, and subtract.
8
+ * 2. attest — TWO `verifier_receipt`s over the SAME `intent_core_sha256`,
9
+ * one per CLOSED implementation identity
10
+ * (`run402-cli` | `r402s-verify`). This SDK is `run402-cli`
11
+ * and produces exactly ONE of them; the other MUST come from
12
+ * `r402s-verify`, which by spec shares no implementation code
13
+ * with the SDK — differential verification is the whole point,
14
+ * so this module will never synthesize the second receipt.
15
+ * 3. submit — sign the core, wrap it, sign the wrapper, and POST the
16
+ * EXACT BYTES. The gateway reads this route through
17
+ * `express.raw` and verifies the owner signature over the
18
+ * bytes as sent, so a re-serialized object is a different
19
+ * object. {@link pruneIntentBytes} is the one serializer.
20
+ * 4. confirm — poll the intent until its control-plane-signed
21
+ * `prune_completion` appears, then believe ONLY that: per-object
22
+ * outcomes are THREE-VALUED (`deleted` | `present_not_attempted`
23
+ * | `present_after_attempt`) and only `deleted` means the bytes
24
+ * are gone. `present_after_attempt` is NOT a deletion.
25
+ *
26
+ * What this module deliberately does NOT do:
27
+ * - decide retention eligibility. The ≥90-day schedule is measured against a
28
+ * control-plane-signed `retention_cutoff` ticket and the server's own
29
+ * admission times; a client cannot prove either. The plan is a PROPOSAL and
30
+ * the gateway is the authority — it refuses any candidate that is not
31
+ * retention-eligible against the bound ticket.
32
+ * - attest anything it did not check. A receipt this module builds carries
33
+ * `result: "failed"` (and both booleans as observed) whenever the chain
34
+ * cannot prove the property, rather than a convenient `true`.
35
+ */
36
+ import { mkdtempSync, rmSync } from "node:fs";
37
+ import { tmpdir } from "node:os";
38
+ import { join } from "node:path";
39
+ import { LocalError } from "../errors.js";
40
+ import { GITVAULT_FORMAT, GITVAULT_SUITE, newGitvaultId, newHex32, signGitvaultObject, storedBytes, storedBytesSha256, } from "../namespaces/gitvault.crypto.js";
41
+ function fail(code, message, context, details, nextActions) {
42
+ throw new LocalError(message, context, { code, details, ...(nextActions ? { next_actions: nextActions } : {}) });
43
+ }
44
+ /** §7.3: at most 10 000 candidates per intent; larger prunes chunk into successive intents. */
45
+ export const GITVAULT_MAX_PRUNE_CANDIDATES = 10_000;
46
+ /** The CLOSED V0 verifier identity set (`common.json#/$defs/implementation_id`). */
47
+ export const GITVAULT_VERIFIER_IMPLEMENTATIONS = ["run402-cli", "r402s-verify"];
48
+ /** This SDK's identity when it attests. The other half of the pair is never ours to produce. */
49
+ export const GITVAULT_SDK_VERIFIER_IMPLEMENTATION = "run402-cli";
50
+ /**
51
+ * What this lineage calls itself in a receipt's `implementation_version`.
52
+ *
53
+ * The LINEAGE and the PROTOCOL REVISION, not the npm version: a receipt records
54
+ * which verifier produced it against which frozen wire, and the npm number
55
+ * moves for reasons that have nothing to do with either. Bump this when the
56
+ * verification logic or the revision it verifies changes.
57
+ */
58
+ export const GITVAULT_SDK_VERIFIER_VERSION = "run402-sdk/r402s-v0-rev40";
59
+ // ─── The GC root set + the pruneable universe (§7.3 step 1) ──────────────────
60
+ function receiptsOfHead(head) {
61
+ return [...head.wal_entries, head.ref_state, head.retention_roots];
62
+ }
63
+ /**
64
+ * A checkpoint's FULL RECOVERY BUNDLE: the claim set, the manifest, every pack,
65
+ * AND its `covers_through` head's `ref_state` + `retention_roots` carriers.
66
+ * A bundle missing its carriers is not a recovery path, so the carriers are
67
+ * part of the protection, not adjacent to it.
68
+ */
69
+ export function checkpointRecoveryBundle(entry) {
70
+ const block = entry.head.checkpoint;
71
+ if (!block)
72
+ return [];
73
+ const out = [block.claim_set, entry.head.ref_state, entry.head.retention_roots];
74
+ if (entry.claim_set)
75
+ out.push(entry.claim_set.manifest_receipt, ...entry.claim_set.ordered_pack_receipts);
76
+ return out;
77
+ }
78
+ /** Every pruneable object the chain has ever named, sorted by `object_id`, deduplicated. */
79
+ export function collectPruneUniverse(entries) {
80
+ const seen = new Map();
81
+ for (const e of entries) {
82
+ for (const r of receiptsOfHead(e.head))
83
+ seen.set(r.object_id, r);
84
+ for (const r of checkpointRecoveryBundle(e))
85
+ seen.set(r.object_id, r);
86
+ }
87
+ return sortPruneReceipts([...seen.values()]);
88
+ }
89
+ /** Pairwise-distinct, sorted by `object_id` — the schema's canonical order, not an incidental one. */
90
+ export function sortPruneReceipts(receipts) {
91
+ return [...receipts].sort((a, b) => (a.object_id < b.object_id ? -1 : a.object_id > b.object_id ? 1 : 0));
92
+ }
93
+ /**
94
+ * The GC root set: the latest checkpoint's recovery bundle + its WAL suffix +
95
+ * the immediately-prior checkpoint's recovery bundle + every carrier at or
96
+ * after the prior checkpoint.
97
+ *
98
+ * DELIBERATELY conservative in two places, because under-protecting deletes
99
+ * history and over-protecting only costs storage:
100
+ *
101
+ * - with FEWER THAN TWO checkpoints nothing is prunable at all. The
102
+ * protection rule exists so a bad latest checkpoint still has a second
103
+ * recovery path; with a single checkpoint that second path IS the
104
+ * pre-checkpoint WAL chain, so pruning it would leave exactly one.
105
+ * - every `ref_state` / `retention_roots` carrier at or after the PRIOR
106
+ * checkpoint is protected, not just the unexpired-root carriers. Root
107
+ * expiry is measured against a server-signed ticket this client cannot
108
+ * evaluate, so it never guesses a carrier is dead.
109
+ */
110
+ export function computeGcRootSet(entries) {
111
+ const ordered = [...entries].sort((a, b) => (a.head.generation < b.head.generation ? -1 : a.head.generation > b.head.generation ? 1 : 0));
112
+ const checkpoints = ordered.filter((e) => e.head.checkpoint !== null);
113
+ const latest = checkpoints.length > 0 ? checkpoints[checkpoints.length - 1] : null;
114
+ const prior = checkpoints.length > 1 ? checkpoints[checkpoints.length - 2] : null;
115
+ const seen = new Map();
116
+ const protect = (rs) => {
117
+ for (const r of rs)
118
+ seen.set(r.object_id, r);
119
+ };
120
+ if (!latest || !prior) {
121
+ // Everything is a root. Protect the whole universe so the commitment is
122
+ // still computable and honest, and say why.
123
+ protect(collectPruneUniverse(ordered));
124
+ return {
125
+ receipts: sortPruneReceipts([...seen.values()]),
126
+ latest_checkpoint: latest,
127
+ prior_checkpoint: prior,
128
+ blocked_reason: checkpoints.length === 0
129
+ ? "the chain carries no checkpoint, so the WAL history is the only recovery path — compact first"
130
+ : "the chain carries only one checkpoint; the pre-checkpoint WAL chain is the second recovery path and stays protected until a second compaction exists",
131
+ };
132
+ }
133
+ protect(checkpointRecoveryBundle(latest));
134
+ protect(checkpointRecoveryBundle(prior));
135
+ for (const e of ordered) {
136
+ if (e.head.generation >= prior.head.generation)
137
+ protect(receiptsOfHead(e.head));
138
+ }
139
+ return { receipts: sortPruneReceipts([...seen.values()]), latest_checkpoint: latest, prior_checkpoint: prior, blocked_reason: null };
140
+ }
141
+ /** universe − GC root set, canonical order, capped. Never mutates its inputs. */
142
+ export function planPruneCandidates(entries) {
143
+ const rootSet = computeGcRootSet(entries);
144
+ const protectedIds = new Set(rootSet.receipts.map((r) => r.object_id));
145
+ const universe = collectPruneUniverse(entries);
146
+ const eligible = universe.filter((r) => !protectedIds.has(r.object_id));
147
+ return {
148
+ candidates: eligible.slice(0, GITVAULT_MAX_PRUNE_CANDIDATES),
149
+ deferred_count: Math.max(0, eligible.length - GITVAULT_MAX_PRUNE_CANDIDATES),
150
+ root_set: rootSet,
151
+ universe_count: universe.length,
152
+ };
153
+ }
154
+ /**
155
+ * Verify that every retention root which LEFT the map left legally: only at a
156
+ * checkpoint-bearing generation carrying a cutoff ticket, and only when its
157
+ * `effective_admitted_at + retentionDays < cutoff_at` strictly.
158
+ *
159
+ * `effectiveAdmittedAt` returning `null` is not a failure of the vault — it is
160
+ * a failure of THIS CLIENT to prove the departure, and the check reports `ok:
161
+ * false` so the receipt attests `false` rather than a convenient `true`.
162
+ */
163
+ export function checkRetentionEvolution(entries, roots, effectiveAdmittedAt, isEligible) {
164
+ const ordered = [...entries].sort((a, b) => (a.head.generation < b.head.generation ? -1 : a.head.generation > b.head.generation ? 1 : 0));
165
+ const unproven = [];
166
+ for (let i = 1; i < ordered.length; i++) {
167
+ const before = ordered[i - 1];
168
+ const after = ordered[i];
169
+ const key = (r) => `${r.ref}${r.oid}`;
170
+ const stillThere = new Set(roots(after).map(key));
171
+ for (const root of roots(before)) {
172
+ if (stillThere.has(key(root)))
173
+ continue;
174
+ const block = after.head.checkpoint;
175
+ if (!block) {
176
+ unproven.push({ generation: after.head.generation, ref: root.ref, oid: root.oid, reason: "a root left the map at a generation that carries no checkpoint" });
177
+ continue;
178
+ }
179
+ if (!block.cutoff) {
180
+ unproven.push({ generation: after.head.generation, ref: root.ref, oid: root.oid, reason: "a root left the map at a checkpoint bound to no retention_cutoff ticket" });
181
+ continue;
182
+ }
183
+ const admitted = effectiveAdmittedAt(root.dropped_at_generation);
184
+ if (admitted === null) {
185
+ unproven.push({ generation: after.head.generation, ref: root.ref, oid: root.oid, reason: "this client cannot resolve the drop's effective_admitted_at, so the departure is unproven" });
186
+ continue;
187
+ }
188
+ if (!isEligible(admitted, block.cutoff.cutoff_at)) {
189
+ unproven.push({ generation: after.head.generation, ref: root.ref, oid: root.oid, reason: "the root left the map before its retention window closed against the bound cutoff" });
190
+ }
191
+ }
192
+ }
193
+ return { ok: unproven.length === 0, unproven };
194
+ }
195
+ /**
196
+ * Build + sign `prune_intent_core`. The core is signed on its own AND embedded
197
+ * in a signed wrapper (the double signature of §7.3) — `intent_core_sha256` is
198
+ * the stored-bytes hash of the COMPLETE signed core, which is why the core must
199
+ * be finished before either verifier can attest anything about it.
200
+ */
201
+ export function buildPruneIntentCore(input, signingSeed) {
202
+ const deleteSet = sortPruneReceipts(input.delete_set);
203
+ if (deleteSet.length === 0)
204
+ fail("UPGRADE_REQUIRED", "a prune intent must name at least one candidate", "building the gitvault prune intent");
205
+ if (deleteSet.length > GITVAULT_MAX_PRUNE_CANDIDATES) {
206
+ fail("UPGRADE_REQUIRED", `${deleteSet.length} candidates exceed the ${GITVAULT_MAX_PRUNE_CANDIDATES} per-intent maximum; chunk into successive intents`, "building the gitvault prune intent", { candidates: deleteSet.length });
207
+ }
208
+ for (let i = 1; i < deleteSet.length; i++) {
209
+ if (!(deleteSet[i - 1].object_id < deleteSet[i].object_id)) {
210
+ fail("UPGRADE_REQUIRED", `delete_set is not sorted and pairwise-distinct at index ${i}`, "building the gitvault prune intent", { object_id: deleteSet[i].object_id });
211
+ }
212
+ }
213
+ const cycle = input.cycle ?? null;
214
+ const unsigned = {
215
+ format: GITVAULT_FORMAT,
216
+ object_kind: "prune_intent_core",
217
+ suite: GITVAULT_SUITE,
218
+ repo_id: input.repo_id,
219
+ object_id: input.object_id ?? newGitvaultId("pi"),
220
+ gc_epoch: input.gc_epoch,
221
+ maintenance_cycle_id: cycle ? cycle.maintenance_cycle_id : null,
222
+ maintenance_prune_role: cycle ? cycle.maintenance_prune_role : null,
223
+ stage_claim_set_sha256: cycle ? cycle.stage_claim_set_sha256 : null,
224
+ batch_index: cycle ? cycle.batch_index : null,
225
+ batch_count: cycle ? cycle.batch_count : null,
226
+ authorizing_head_sha256: input.authorizing_head_sha256,
227
+ checkpoint_claim_set_sha256: input.checkpoint_claim_set_sha256,
228
+ gc_root_set_hmac: input.gc_root_set_hmac,
229
+ retention_state_hmac: input.retention_state_hmac,
230
+ delete_set: deleteSet,
231
+ nonce: input.nonce ?? newHex32(),
232
+ };
233
+ return signGitvaultObject(unsigned, signingSeed);
234
+ }
235
+ /** The stored-bytes hash of the complete signed core — what BOTH verifier receipts sign. */
236
+ export function pruneIntentCoreSha256(core) {
237
+ return storedBytesSha256(core);
238
+ }
239
+ /**
240
+ * Build + sign a `verifier_receipt`.
241
+ *
242
+ * `result` is DERIVED, never passed in: a receipt is `restored_and_verified`
243
+ * exactly when both attestation booleans are true, and `failed` otherwise. A
244
+ * caller cannot hand this function `failed` booleans and a passing result.
245
+ */
246
+ export function buildVerifierReceipt(input, signingSeed) {
247
+ const unsigned = {
248
+ format: GITVAULT_FORMAT,
249
+ object_kind: "verifier_receipt",
250
+ suite: GITVAULT_SUITE,
251
+ repo_id: input.repo_id,
252
+ object_id: input.object_id ?? newGitvaultId("vr"),
253
+ intent_core_sha256: input.intent_core_sha256,
254
+ checkpoint_head_sha256: input.checkpoint_head_sha256,
255
+ cutoff_ticket_sha256: input.cutoff_ticket_sha256,
256
+ restored_object_set_hmac: input.restored_object_set_hmac,
257
+ retention_evolution_ok: input.retention_evolution_ok,
258
+ candidates_outside_roots_ok: input.candidates_outside_roots_ok,
259
+ implementation_id: input.implementation_id,
260
+ implementation_version: input.implementation_version,
261
+ result: (input.retention_evolution_ok && input.candidates_outside_roots_ok ? "restored_and_verified" : "failed"),
262
+ };
263
+ return signGitvaultObject(unsigned, signingSeed);
264
+ }
265
+ /** The `verifier_receipt_ref` an intent carries for an uploaded receipt. */
266
+ export function verifierReceiptRef(receipt) {
267
+ const bytes = storedBytes(receipt);
268
+ return {
269
+ object_id: receipt.object_id,
270
+ object_kind: "verifier_receipt",
271
+ stored_bytes_sha256: storedBytesSha256(receipt),
272
+ size_bytes: String(bytes.length),
273
+ implementation_id: receipt.implementation_id,
274
+ };
275
+ }
276
+ /**
277
+ * Wrap + sign the intent.
278
+ *
279
+ * Every gate the gateway applies to the pair is applied here first, so a
280
+ * malformed pair never reaches the wire as a wasted round trip: exactly two
281
+ * refs, one per CLOSED implementation identity, distinct ids AND distinct
282
+ * hashes, each attesting `restored_and_verified` with both booleans true, and
283
+ * each signing THIS core.
284
+ */
285
+ export function buildPruneIntent(core, receipts, signingSeed) {
286
+ const coreSha = pruneIntentCoreSha256(core);
287
+ if (receipts.length !== 2) {
288
+ fail("UPGRADE_REQUIRED", `a prune intent carries exactly two verifier receipts, one per implementation (${GITVAULT_VERIFIER_IMPLEMENTATIONS.join(", ")}); got ${receipts.length}`, "building the gitvault prune intent", { supplied: receipts.map((r) => r.implementation_id) }, [{ action: "run r402s-verify against this intent core and pass its receipt alongside the SDK's own" }]);
289
+ }
290
+ for (const id of GITVAULT_VERIFIER_IMPLEMENTATIONS) {
291
+ const matching = receipts.filter((r) => r.implementation_id === id);
292
+ if (matching.length !== 1) {
293
+ fail("UPGRADE_REQUIRED", `exactly one verifier receipt per implementation is required; ${id} has ${matching.length}`, "building the gitvault prune intent", { implementation_id: id });
294
+ }
295
+ }
296
+ const [a, b] = receipts;
297
+ const refs = receipts.map(verifierReceiptRef);
298
+ if (a.object_id === b.object_id || refs[0].stored_bytes_sha256 === refs[1].stored_bytes_sha256) {
299
+ fail("UPGRADE_REQUIRED", "the two verifier receipts must be distinct objects with distinct hashes", "building the gitvault prune intent");
300
+ }
301
+ for (const r of receipts) {
302
+ if (r.repo_id !== core.repo_id)
303
+ fail("GITVAULT_ACCESS_DENIED", `verifier receipt ${r.object_id} attests a different vault`, "building the gitvault prune intent", { repo_id: r.repo_id });
304
+ if (r.intent_core_sha256 !== coreSha) {
305
+ fail("UPGRADE_REQUIRED", `verifier receipt ${r.object_id} signs a different intent core (${r.intent_core_sha256} ≠ ${coreSha})`, "building the gitvault prune intent", { object_id: r.object_id });
306
+ }
307
+ if (r.result !== "restored_and_verified" || r.retention_evolution_ok !== true || r.candidates_outside_roots_ok !== true) {
308
+ fail("UPGRADE_REQUIRED", `verifier receipt ${r.object_id} does not attest restored_and_verified with both attestations true`, "building the gitvault prune intent", {
309
+ object_id: r.object_id,
310
+ result: r.result,
311
+ retention_evolution_ok: r.retention_evolution_ok,
312
+ candidates_outside_roots_ok: r.candidates_outside_roots_ok,
313
+ });
314
+ }
315
+ }
316
+ // The two refs ride in the receipts' given order; the schema's `uniqueItems`
317
+ // is satisfied by the distinctness gate above, not by sorting.
318
+ const unsigned = {
319
+ format: GITVAULT_FORMAT,
320
+ object_kind: "prune_intent",
321
+ suite: GITVAULT_SUITE,
322
+ repo_id: core.repo_id,
323
+ object_id: core.object_id,
324
+ core,
325
+ intent_core_sha256: coreSha,
326
+ verifier_receipts: refs,
327
+ };
328
+ return signGitvaultObject(unsigned, signingSeed);
329
+ }
330
+ /**
331
+ * Refuse a supplied core that the chain has moved past — BEFORE the receipts
332
+ * are uploaded.
333
+ *
334
+ * A prune is planned, verified out-of-band by a second implementation, and only
335
+ * then submitted, so there is a real window in which a push or a compaction
336
+ * lands underneath it. The gateway would refuse such an intent at its fence,
337
+ * but by then both receipts are stored objects the fence CLAIMS, so a stale
338
+ * submission burns evidence for nothing. Same registry codes the gateway uses,
339
+ * raised one step earlier.
340
+ */
341
+ export function assertPruneCoreStillCurrent(core, current) {
342
+ if (core.repo_id !== current.repo_id) {
343
+ fail("GITVAULT_ACCESS_DENIED", `the supplied intent core belongs to ${core.repo_id}, not ${current.repo_id}`, "submitting the gitvault prune intent", { repo_id: core.repo_id });
344
+ }
345
+ if (core.gc_epoch !== current.gc_epoch) {
346
+ fail("GC_EPOCH_STALE", `the supplied intent core was planned at gc_epoch ${core.gc_epoch}; the vault is at ${current.gc_epoch}`, "submitting the gitvault prune intent", { planned: core.gc_epoch, current: current.gc_epoch }, [{ action: "refetch the vault state and rebuild the intent at the current epoch" }]);
347
+ }
348
+ if (core.checkpoint_claim_set_sha256 !== current.checkpoint_claim_set_sha256) {
349
+ fail("GC_EPOCH_STALE", "the supplied intent core names a checkpoint that is no longer the latest; a fresh checkpoint landed after the plan", "submitting the gitvault prune intent", { planned: core.checkpoint_claim_set_sha256, current: current.checkpoint_claim_set_sha256 }, [{ action: "refetch the vault state and rebuild the intent at the current epoch" }]);
350
+ }
351
+ }
352
+ /**
353
+ * THE serializer for the submit route.
354
+ *
355
+ * `POST …/prune-intents` is parsed with `express.raw`: the service strict-parses
356
+ * these bytes and verifies the owner signature over them. Anything that
357
+ * re-serializes the object between here and the socket — a JSON body helper, a
358
+ * proxy that reformats — changes what was signed. Send exactly this.
359
+ */
360
+ export function pruneIntentBytes(intent) {
361
+ return storedBytes(intent);
362
+ }
363
+ /**
364
+ * Read the completion's three-valued vector against the intent's canonical
365
+ * candidate order.
366
+ *
367
+ * The one rule this function exists to enforce: **only `deleted` means gone.**
368
+ * `present_after_attempt` looks like a deletion in the logs and is not one —
369
+ * treating it as one is how a client reports history removed that is still
370
+ * there. A candidate with no entry is `unadjudicated`, never inferred.
371
+ */
372
+ export function summarizePruneCompletion(candidateIds, record) {
373
+ const completion = record?.completion ?? null;
374
+ const perObject = completion?.per_object ?? null;
375
+ if (!completion || !perObject)
376
+ return { outcome: null, deleted: [], present: [], unadjudicated: [...candidateIds] };
377
+ const byId = new Map(perObject.map((o) => [o.object_id, o]));
378
+ const deleted = [];
379
+ const present = [];
380
+ const unadjudicated = [];
381
+ for (const id of candidateIds) {
382
+ const o = byId.get(id);
383
+ if (!o) {
384
+ unadjudicated.push(id);
385
+ continue;
386
+ }
387
+ if (o.result === "deleted")
388
+ deleted.push(id);
389
+ else
390
+ present.push(o);
391
+ }
392
+ const outcome = deleted.length === candidateIds.length && unadjudicated.length === 0
393
+ ? "completed"
394
+ : present.some((o) => o.result === "present_after_attempt") || deleted.length > 0
395
+ ? "superseded_partial_delete"
396
+ : "superseded_no_delete";
397
+ return { outcome, deleted, present, unadjudicated };
398
+ }
399
+ // ─── A scratch directory for the restore-and-verify pass ─────────────────────
400
+ /** Run `fn` in a fresh temp directory and always remove it, even on refusal. */
401
+ export async function withScratchDir(prefix, fn) {
402
+ const dir = mkdtempSync(join(tmpdir(), prefix));
403
+ try {
404
+ return await fn(dir);
405
+ }
406
+ finally {
407
+ rmSync(dir, { recursive: true, force: true });
408
+ }
409
+ }
410
+ //# sourceMappingURL=gitvault-prune.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitvault-prune.js","sourceRoot":"","sources":["../../src/node/gitvault-prune.ts"],"names":[],"mappings":"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"}