run402 4.24.0 → 4.25.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.
- package/cli.mjs +6 -6
- package/git-remote-run402.mjs +270 -0
- package/lib/command-manifest.mjs +11 -1
- package/lib/credentials.mjs +4 -0
- package/lib/domains.mjs +0 -14
- package/lib/gitvault.mjs +370 -0
- package/lib/init.mjs +143 -1
- package/lib/pay.test.mjs +0 -4
- package/package.json +8 -2
- package/sdk/dist/index.d.ts +20 -3
- package/sdk/dist/index.d.ts.map +1 -1
- package/sdk/dist/index.js +22 -3
- package/sdk/dist/index.js.map +1 -1
- package/sdk/dist/namespaces/admin.d.ts +0 -5
- package/sdk/dist/namespaces/admin.d.ts.map +1 -1
- package/sdk/dist/namespaces/admin.js +0 -9
- package/sdk/dist/namespaces/admin.js.map +1 -1
- package/sdk/dist/namespaces/assets.d.ts +1 -20
- package/sdk/dist/namespaces/assets.d.ts.map +1 -1
- package/sdk/dist/namespaces/assets.js +0 -27
- package/sdk/dist/namespaces/assets.js.map +1 -1
- package/sdk/dist/namespaces/auth.js +1 -1
- package/sdk/dist/namespaces/auth.js.map +1 -1
- package/sdk/dist/namespaces/domains.d.ts +0 -19
- package/sdk/dist/namespaces/domains.d.ts.map +1 -1
- package/sdk/dist/namespaces/domains.js +0 -19
- package/sdk/dist/namespaces/domains.js.map +1 -1
- package/sdk/dist/namespaces/gitvault.crypto.d.ts +319 -0
- package/sdk/dist/namespaces/gitvault.crypto.d.ts.map +1 -0
- package/sdk/dist/namespaces/gitvault.crypto.js +690 -0
- package/sdk/dist/namespaces/gitvault.crypto.js.map +1 -0
- package/sdk/dist/namespaces/gitvault.d.ts +473 -0
- package/sdk/dist/namespaces/gitvault.d.ts.map +1 -0
- package/sdk/dist/namespaces/gitvault.js +714 -0
- package/sdk/dist/namespaces/gitvault.js.map +1 -0
- package/sdk/dist/namespaces/gitvault.types.d.ts +481 -0
- package/sdk/dist/namespaces/gitvault.types.d.ts.map +1 -0
- package/sdk/dist/namespaces/gitvault.types.js +19 -0
- package/sdk/dist/namespaces/gitvault.types.js.map +1 -0
- package/sdk/dist/namespaces/org.d.ts +1 -3
- package/sdk/dist/namespaces/org.d.ts.map +1 -1
- package/sdk/dist/namespaces/org.js +6 -10
- package/sdk/dist/namespaces/org.js.map +1 -1
- package/sdk/dist/namespaces/pay.d.ts +0 -8
- package/sdk/dist/namespaces/pay.d.ts.map +1 -1
- package/sdk/dist/namespaces/pay.js.map +1 -1
- package/sdk/dist/namespaces/projects.d.ts +2 -2
- package/sdk/dist/namespaces/projects.d.ts.map +1 -1
- package/sdk/dist/namespaces/projects.js +4 -12
- package/sdk/dist/namespaces/projects.js.map +1 -1
- package/sdk/dist/namespaces/secrets.d.ts +0 -2
- package/sdk/dist/namespaces/secrets.d.ts.map +1 -1
- package/sdk/dist/namespaces/secrets.js +3 -10
- package/sdk/dist/namespaces/secrets.js.map +1 -1
- package/sdk/dist/namespaces/subdomains.d.ts +0 -2
- package/sdk/dist/namespaces/subdomains.d.ts.map +1 -1
- package/sdk/dist/namespaces/subdomains.js +5 -16
- package/sdk/dist/namespaces/subdomains.js.map +1 -1
- package/sdk/dist/namespaces/transfers.d.ts +0 -2
- package/sdk/dist/namespaces/transfers.d.ts.map +1 -1
- package/sdk/dist/namespaces/transfers.js +8 -10
- package/sdk/dist/namespaces/transfers.js.map +1 -1
- package/sdk/dist/namespaces/wallets.d.ts +0 -12
- package/sdk/dist/namespaces/wallets.d.ts.map +1 -1
- package/sdk/dist/namespaces/wallets.js +0 -14
- package/sdk/dist/namespaces/wallets.js.map +1 -1
- package/sdk/dist/node/gitvault-creation-journal.d.ts +222 -0
- package/sdk/dist/node/gitvault-creation-journal.d.ts.map +1 -0
- package/sdk/dist/node/gitvault-creation-journal.js +365 -0
- package/sdk/dist/node/gitvault-creation-journal.js.map +1 -0
- package/sdk/dist/node/gitvault-deploy.d.ts +211 -0
- package/sdk/dist/node/gitvault-deploy.d.ts.map +1 -0
- package/sdk/dist/node/gitvault-deploy.js +292 -0
- package/sdk/dist/node/gitvault-deploy.js.map +1 -0
- package/sdk/dist/node/gitvault-keystore.d.ts +207 -0
- package/sdk/dist/node/gitvault-keystore.d.ts.map +1 -0
- package/sdk/dist/node/gitvault-keystore.js +529 -0
- package/sdk/dist/node/gitvault-keystore.js.map +1 -0
- package/sdk/dist/node/gitvault-prune.d.ts +341 -0
- package/sdk/dist/node/gitvault-prune.d.ts.map +1 -0
- package/sdk/dist/node/gitvault-prune.js +410 -0
- package/sdk/dist/node/gitvault-prune.js.map +1 -0
- package/sdk/dist/node/gitvault-publication.d.ts +730 -0
- package/sdk/dist/node/gitvault-publication.d.ts.map +1 -0
- package/sdk/dist/node/gitvault-publication.js +1475 -0
- package/sdk/dist/node/gitvault-publication.js.map +1 -0
- package/sdk/dist/node/gitvault-snapshot.d.ts +190 -0
- package/sdk/dist/node/gitvault-snapshot.d.ts.map +1 -0
- package/sdk/dist/node/gitvault-snapshot.js +505 -0
- package/sdk/dist/node/gitvault-snapshot.js.map +1 -0
- package/sdk/dist/node/index.d.ts +11 -0
- package/sdk/dist/node/index.d.ts.map +1 -1
- package/sdk/dist/node/index.js +9 -0
- package/sdk/dist/node/index.js.map +1 -1
- package/sdk/dist/node/paid-fetch.d.ts.map +1 -1
- package/sdk/dist/node/paid-fetch.js +0 -4
- package/sdk/dist/node/paid-fetch.js.map +1 -1
- package/sdk/dist/node/sites-node.d.ts +1 -8
- package/sdk/dist/node/sites-node.d.ts.map +1 -1
- package/sdk/dist/node/sites-node.js +1 -7
- package/sdk/dist/node/sites-node.js.map +1 -1
- package/sdk/dist/scoped.d.ts +4 -35
- package/sdk/dist/scoped.d.ts.map +1 -1
- package/sdk/dist/scoped.js +9 -74
- package/sdk/dist/scoped.js.map +1 -1
- package/lib/sender-domain.mjs +0 -36
- package/sdk/dist/deprecate.d.ts +0 -23
- package/sdk/dist/deprecate.d.ts.map +0 -1
- package/sdk/dist/deprecate.js +0 -42
- package/sdk/dist/deprecate.js.map +0 -1
- package/sdk/dist/namespaces/sender-domain.d.ts +0 -47
- package/sdk/dist/namespaces/sender-domain.d.ts.map +0 -1
- package/sdk/dist/namespaces/sender-domain.js +0 -45
- package/sdk/dist/namespaces/sender-domain.js.map +0 -1
|
@@ -0,0 +1,341 @@
|
|
|
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 { GITVAULT_FORMAT, GITVAULT_SUITE } from "../namespaces/gitvault.crypto.js";
|
|
37
|
+
import type { GitvaultCheckpointClaimSet, GitvaultCheckpointManifestReceipt, GitvaultCheckpointPackReceipt, GitvaultCheckpointClaimSetReceipt, GitvaultHead, GitvaultRefStateReceipt, GitvaultRetentionRootsReceipt, GitvaultWalPackReceipt } from "../namespaces/gitvault.types.js";
|
|
38
|
+
/** §7.3: at most 10 000 candidates per intent; larger prunes chunk into successive intents. */
|
|
39
|
+
export declare const GITVAULT_MAX_PRUNE_CANDIDATES = 10000;
|
|
40
|
+
/** The CLOSED V0 verifier identity set (`common.json#/$defs/implementation_id`). */
|
|
41
|
+
export declare const GITVAULT_VERIFIER_IMPLEMENTATIONS: readonly ["run402-cli", "r402s-verify"];
|
|
42
|
+
export type GitvaultVerifierImplementation = (typeof GITVAULT_VERIFIER_IMPLEMENTATIONS)[number];
|
|
43
|
+
/** This SDK's identity when it attests. The other half of the pair is never ours to produce. */
|
|
44
|
+
export declare const GITVAULT_SDK_VERIFIER_IMPLEMENTATION: GitvaultVerifierImplementation;
|
|
45
|
+
/**
|
|
46
|
+
* What this lineage calls itself in a receipt's `implementation_version`.
|
|
47
|
+
*
|
|
48
|
+
* The LINEAGE and the PROTOCOL REVISION, not the npm version: a receipt records
|
|
49
|
+
* which verifier produced it against which frozen wire, and the npm number
|
|
50
|
+
* moves for reasons that have nothing to do with either. Bump this when the
|
|
51
|
+
* verification logic or the revision it verifies changes.
|
|
52
|
+
*/
|
|
53
|
+
export declare const GITVAULT_SDK_VERIFIER_VERSION = "run402-sdk/r402s-v0-rev40";
|
|
54
|
+
/** `common.json#/$defs/receipt_pruneable` — the CLOSED union a delete set may name. */
|
|
55
|
+
export type GitvaultPruneableReceipt = GitvaultWalPackReceipt | GitvaultRefStateReceipt | GitvaultRetentionRootsReceipt | GitvaultCheckpointManifestReceipt | GitvaultCheckpointPackReceipt | GitvaultCheckpointClaimSetReceipt;
|
|
56
|
+
/** One verified chain link plus its resolved checkpoint claim set (null when the head bears no checkpoint). */
|
|
57
|
+
export interface GitvaultChainEntry {
|
|
58
|
+
head: GitvaultHead;
|
|
59
|
+
head_sha256: string;
|
|
60
|
+
claim_set: GitvaultCheckpointClaimSet | null;
|
|
61
|
+
}
|
|
62
|
+
/** `common.json#/$defs/verifier_receipt_ref` — what the intent carries, not the receipt itself. */
|
|
63
|
+
export interface GitvaultVerifierReceiptRef {
|
|
64
|
+
object_id: string;
|
|
65
|
+
object_kind: "verifier_receipt";
|
|
66
|
+
stored_bytes_sha256: string;
|
|
67
|
+
size_bytes: string;
|
|
68
|
+
implementation_id: GitvaultVerifierImplementation;
|
|
69
|
+
}
|
|
70
|
+
/** `verifier_receipt.json` — owner-signed, uploaded, then claimed at the intent's fence. */
|
|
71
|
+
export interface GitvaultVerifierReceipt {
|
|
72
|
+
format: typeof GITVAULT_FORMAT;
|
|
73
|
+
object_kind: "verifier_receipt";
|
|
74
|
+
suite: typeof GITVAULT_SUITE;
|
|
75
|
+
repo_id: string;
|
|
76
|
+
object_id: string;
|
|
77
|
+
intent_core_sha256: string;
|
|
78
|
+
checkpoint_head_sha256: string;
|
|
79
|
+
cutoff_ticket_sha256: string | null;
|
|
80
|
+
restored_object_set_hmac: string;
|
|
81
|
+
retention_evolution_ok: boolean;
|
|
82
|
+
candidates_outside_roots_ok: boolean;
|
|
83
|
+
implementation_id: GitvaultVerifierImplementation;
|
|
84
|
+
implementation_version: string;
|
|
85
|
+
result: "restored_and_verified" | "failed";
|
|
86
|
+
signature: string;
|
|
87
|
+
}
|
|
88
|
+
/** `prune_intent_core.json` — owner-signed; the acyclic base BOTH receipts sign. */
|
|
89
|
+
export interface GitvaultPruneIntentCore {
|
|
90
|
+
format: typeof GITVAULT_FORMAT;
|
|
91
|
+
object_kind: "prune_intent_core";
|
|
92
|
+
suite: typeof GITVAULT_SUITE;
|
|
93
|
+
repo_id: string;
|
|
94
|
+
object_id: string;
|
|
95
|
+
gc_epoch: string;
|
|
96
|
+
maintenance_cycle_id: string | null;
|
|
97
|
+
maintenance_prune_role: "intermediate" | "final" | null;
|
|
98
|
+
stage_claim_set_sha256: string | null;
|
|
99
|
+
batch_index: string | null;
|
|
100
|
+
batch_count: string | null;
|
|
101
|
+
authorizing_head_sha256: string;
|
|
102
|
+
checkpoint_claim_set_sha256: string;
|
|
103
|
+
gc_root_set_hmac: string;
|
|
104
|
+
retention_state_hmac: string;
|
|
105
|
+
delete_set: GitvaultPruneableReceipt[];
|
|
106
|
+
nonce: string;
|
|
107
|
+
signature: string;
|
|
108
|
+
}
|
|
109
|
+
/** `prune_intent.json` — the wrapper the gateway publishes create-only under `prune/`. */
|
|
110
|
+
export interface GitvaultPruneIntent {
|
|
111
|
+
format: typeof GITVAULT_FORMAT;
|
|
112
|
+
object_kind: "prune_intent";
|
|
113
|
+
suite: typeof GITVAULT_SUITE;
|
|
114
|
+
repo_id: string;
|
|
115
|
+
object_id: string;
|
|
116
|
+
core: GitvaultPruneIntentCore;
|
|
117
|
+
intent_core_sha256: string;
|
|
118
|
+
verifier_receipts: GitvaultVerifierReceiptRef[];
|
|
119
|
+
signature: string;
|
|
120
|
+
}
|
|
121
|
+
/** One entry of the completion's three-valued vector. */
|
|
122
|
+
export interface GitvaultPruneOutcome {
|
|
123
|
+
object_id: string;
|
|
124
|
+
result: "deleted" | "present_not_attempted" | "present_after_attempt";
|
|
125
|
+
}
|
|
126
|
+
/** `GET …/prune-intents/:id` — the gateway's secret-free public view (`toPublicIntent`). */
|
|
127
|
+
export interface GitvaultPruneIntentRecord {
|
|
128
|
+
object_id: string;
|
|
129
|
+
repo_id: string;
|
|
130
|
+
state: string;
|
|
131
|
+
gc_epoch: string;
|
|
132
|
+
intent_sha256: string | null;
|
|
133
|
+
intent_core_sha256: string | null;
|
|
134
|
+
candidate_count: number;
|
|
135
|
+
next_candidate_index: number;
|
|
136
|
+
maintenance_cycle_id: string | null;
|
|
137
|
+
maintenance_prune_role: string | null;
|
|
138
|
+
stage_claim_set_sha256: string | null;
|
|
139
|
+
batch_index: number | null;
|
|
140
|
+
batch_count: number | null;
|
|
141
|
+
completion: {
|
|
142
|
+
object_id: string | null;
|
|
143
|
+
sha256: string | null;
|
|
144
|
+
per_object: GitvaultPruneOutcome[] | null;
|
|
145
|
+
deleted_count: number;
|
|
146
|
+
present_after_attempt_count: number;
|
|
147
|
+
present_not_attempted_count: number;
|
|
148
|
+
gc_epoch_at_completion: string;
|
|
149
|
+
cycle_event_seq: string | null;
|
|
150
|
+
completed_at: string | null;
|
|
151
|
+
} | null;
|
|
152
|
+
prepared_at: string | null;
|
|
153
|
+
intent_put_issued_at: string | null;
|
|
154
|
+
intent_stored_at: string | null;
|
|
155
|
+
deleting_started_at: string | null;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* A checkpoint's FULL RECOVERY BUNDLE: the claim set, the manifest, every pack,
|
|
159
|
+
* AND its `covers_through` head's `ref_state` + `retention_roots` carriers.
|
|
160
|
+
* A bundle missing its carriers is not a recovery path, so the carriers are
|
|
161
|
+
* part of the protection, not adjacent to it.
|
|
162
|
+
*/
|
|
163
|
+
export declare function checkpointRecoveryBundle(entry: GitvaultChainEntry): GitvaultPruneableReceipt[];
|
|
164
|
+
/** Every pruneable object the chain has ever named, sorted by `object_id`, deduplicated. */
|
|
165
|
+
export declare function collectPruneUniverse(entries: readonly GitvaultChainEntry[]): GitvaultPruneableReceipt[];
|
|
166
|
+
/** Pairwise-distinct, sorted by `object_id` — the schema's canonical order, not an incidental one. */
|
|
167
|
+
export declare function sortPruneReceipts(receipts: readonly GitvaultPruneableReceipt[]): GitvaultPruneableReceipt[];
|
|
168
|
+
export interface GitvaultGcRootSet {
|
|
169
|
+
/** The protected receipts, sorted — the `gcrootset` commitment's preimage content. */
|
|
170
|
+
receipts: GitvaultPruneableReceipt[];
|
|
171
|
+
/** The newest checkpoint-bearing entry, or `null` when the chain has none. */
|
|
172
|
+
latest_checkpoint: GitvaultChainEntry | null;
|
|
173
|
+
/** The one before it, or `null`. */
|
|
174
|
+
prior_checkpoint: GitvaultChainEntry | null;
|
|
175
|
+
/**
|
|
176
|
+
* Why nothing may be pruned yet, or `null` when a prune is structurally
|
|
177
|
+
* possible. Stated rather than left to be inferred from an empty candidate
|
|
178
|
+
* list, which would read as "already clean".
|
|
179
|
+
*/
|
|
180
|
+
blocked_reason: string | null;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* The GC root set: the latest checkpoint's recovery bundle + its WAL suffix +
|
|
184
|
+
* the immediately-prior checkpoint's recovery bundle + every carrier at or
|
|
185
|
+
* after the prior checkpoint.
|
|
186
|
+
*
|
|
187
|
+
* DELIBERATELY conservative in two places, because under-protecting deletes
|
|
188
|
+
* history and over-protecting only costs storage:
|
|
189
|
+
*
|
|
190
|
+
* - with FEWER THAN TWO checkpoints nothing is prunable at all. The
|
|
191
|
+
* protection rule exists so a bad latest checkpoint still has a second
|
|
192
|
+
* recovery path; with a single checkpoint that second path IS the
|
|
193
|
+
* pre-checkpoint WAL chain, so pruning it would leave exactly one.
|
|
194
|
+
* - every `ref_state` / `retention_roots` carrier at or after the PRIOR
|
|
195
|
+
* checkpoint is protected, not just the unexpired-root carriers. Root
|
|
196
|
+
* expiry is measured against a server-signed ticket this client cannot
|
|
197
|
+
* evaluate, so it never guesses a carrier is dead.
|
|
198
|
+
*/
|
|
199
|
+
export declare function computeGcRootSet(entries: readonly GitvaultChainEntry[]): GitvaultGcRootSet;
|
|
200
|
+
export interface GitvaultPrunePlan {
|
|
201
|
+
/** Candidates in canonical order, capped at {@link GITVAULT_MAX_PRUNE_CANDIDATES}. */
|
|
202
|
+
candidates: GitvaultPruneableReceipt[];
|
|
203
|
+
/** How many pruneable objects were left out by the per-intent cap (chunk into a later intent). */
|
|
204
|
+
deferred_count: number;
|
|
205
|
+
root_set: GitvaultGcRootSet;
|
|
206
|
+
universe_count: number;
|
|
207
|
+
}
|
|
208
|
+
/** universe − GC root set, canonical order, capped. Never mutates its inputs. */
|
|
209
|
+
export declare function planPruneCandidates(entries: readonly GitvaultChainEntry[]): GitvaultPrunePlan;
|
|
210
|
+
export interface GitvaultRetentionEvolutionCheck {
|
|
211
|
+
ok: boolean;
|
|
212
|
+
/** Every departure this client could not justify from the chain alone. */
|
|
213
|
+
unproven: Array<{
|
|
214
|
+
generation: string;
|
|
215
|
+
ref: string;
|
|
216
|
+
oid: string;
|
|
217
|
+
reason: string;
|
|
218
|
+
}>;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Verify that every retention root which LEFT the map left legally: only at a
|
|
222
|
+
* checkpoint-bearing generation carrying a cutoff ticket, and only when its
|
|
223
|
+
* `effective_admitted_at + retentionDays < cutoff_at` strictly.
|
|
224
|
+
*
|
|
225
|
+
* `effectiveAdmittedAt` returning `null` is not a failure of the vault — it is
|
|
226
|
+
* a failure of THIS CLIENT to prove the departure, and the check reports `ok:
|
|
227
|
+
* false` so the receipt attests `false` rather than a convenient `true`.
|
|
228
|
+
*/
|
|
229
|
+
export declare function checkRetentionEvolution(entries: readonly GitvaultChainEntry[], roots: (entry: GitvaultChainEntry) => Array<{
|
|
230
|
+
ref: string;
|
|
231
|
+
oid: string;
|
|
232
|
+
dropped_at_generation: string;
|
|
233
|
+
}>, effectiveAdmittedAt: (droppedAtGeneration: string) => string | null, isEligible: (effectiveAdmittedAtIso: string, cutoffAtIso: string) => boolean): GitvaultRetentionEvolutionCheck;
|
|
234
|
+
export interface GitvaultBuildPruneCoreInput {
|
|
235
|
+
repo_id: string;
|
|
236
|
+
gc_epoch: string;
|
|
237
|
+
authorizing_head_sha256: string;
|
|
238
|
+
checkpoint_claim_set_sha256: string;
|
|
239
|
+
gc_root_set_hmac: string;
|
|
240
|
+
retention_state_hmac: string;
|
|
241
|
+
delete_set: readonly GitvaultPruneableReceipt[];
|
|
242
|
+
/** All five cycle fields are non-null together iff the prune advances a maintenance cycle (§7.2). */
|
|
243
|
+
cycle?: {
|
|
244
|
+
maintenance_cycle_id: string;
|
|
245
|
+
maintenance_prune_role: "intermediate" | "final";
|
|
246
|
+
stage_claim_set_sha256: string;
|
|
247
|
+
batch_index: string;
|
|
248
|
+
batch_count: string;
|
|
249
|
+
} | null;
|
|
250
|
+
object_id?: string;
|
|
251
|
+
nonce?: string;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Build + sign `prune_intent_core`. The core is signed on its own AND embedded
|
|
255
|
+
* in a signed wrapper (the double signature of §7.3) — `intent_core_sha256` is
|
|
256
|
+
* the stored-bytes hash of the COMPLETE signed core, which is why the core must
|
|
257
|
+
* be finished before either verifier can attest anything about it.
|
|
258
|
+
*/
|
|
259
|
+
export declare function buildPruneIntentCore(input: GitvaultBuildPruneCoreInput, signingSeed: Uint8Array): GitvaultPruneIntentCore;
|
|
260
|
+
/** The stored-bytes hash of the complete signed core — what BOTH verifier receipts sign. */
|
|
261
|
+
export declare function pruneIntentCoreSha256(core: GitvaultPruneIntentCore): string;
|
|
262
|
+
export interface GitvaultBuildVerifierReceiptInput {
|
|
263
|
+
repo_id: string;
|
|
264
|
+
intent_core_sha256: string;
|
|
265
|
+
checkpoint_head_sha256: string;
|
|
266
|
+
cutoff_ticket_sha256: string | null;
|
|
267
|
+
restored_object_set_hmac: string;
|
|
268
|
+
retention_evolution_ok: boolean;
|
|
269
|
+
candidates_outside_roots_ok: boolean;
|
|
270
|
+
implementation_id: GitvaultVerifierImplementation;
|
|
271
|
+
implementation_version: string;
|
|
272
|
+
object_id?: string;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Build + sign a `verifier_receipt`.
|
|
276
|
+
*
|
|
277
|
+
* `result` is DERIVED, never passed in: a receipt is `restored_and_verified`
|
|
278
|
+
* exactly when both attestation booleans are true, and `failed` otherwise. A
|
|
279
|
+
* caller cannot hand this function `failed` booleans and a passing result.
|
|
280
|
+
*/
|
|
281
|
+
export declare function buildVerifierReceipt(input: GitvaultBuildVerifierReceiptInput, signingSeed: Uint8Array): GitvaultVerifierReceipt;
|
|
282
|
+
/** The `verifier_receipt_ref` an intent carries for an uploaded receipt. */
|
|
283
|
+
export declare function verifierReceiptRef(receipt: GitvaultVerifierReceipt): GitvaultVerifierReceiptRef;
|
|
284
|
+
/**
|
|
285
|
+
* Wrap + sign the intent.
|
|
286
|
+
*
|
|
287
|
+
* Every gate the gateway applies to the pair is applied here first, so a
|
|
288
|
+
* malformed pair never reaches the wire as a wasted round trip: exactly two
|
|
289
|
+
* refs, one per CLOSED implementation identity, distinct ids AND distinct
|
|
290
|
+
* hashes, each attesting `restored_and_verified` with both booleans true, and
|
|
291
|
+
* each signing THIS core.
|
|
292
|
+
*/
|
|
293
|
+
export declare function buildPruneIntent(core: GitvaultPruneIntentCore, receipts: readonly GitvaultVerifierReceipt[], signingSeed: Uint8Array): GitvaultPruneIntent;
|
|
294
|
+
/**
|
|
295
|
+
* Refuse a supplied core that the chain has moved past — BEFORE the receipts
|
|
296
|
+
* are uploaded.
|
|
297
|
+
*
|
|
298
|
+
* A prune is planned, verified out-of-band by a second implementation, and only
|
|
299
|
+
* then submitted, so there is a real window in which a push or a compaction
|
|
300
|
+
* lands underneath it. The gateway would refuse such an intent at its fence,
|
|
301
|
+
* but by then both receipts are stored objects the fence CLAIMS, so a stale
|
|
302
|
+
* submission burns evidence for nothing. Same registry codes the gateway uses,
|
|
303
|
+
* raised one step earlier.
|
|
304
|
+
*/
|
|
305
|
+
export declare function assertPruneCoreStillCurrent(core: GitvaultPruneIntentCore, current: {
|
|
306
|
+
repo_id: string;
|
|
307
|
+
gc_epoch: string;
|
|
308
|
+
checkpoint_claim_set_sha256: string;
|
|
309
|
+
}): void;
|
|
310
|
+
/**
|
|
311
|
+
* THE serializer for the submit route.
|
|
312
|
+
*
|
|
313
|
+
* `POST …/prune-intents` is parsed with `express.raw`: the service strict-parses
|
|
314
|
+
* these bytes and verifies the owner signature over them. Anything that
|
|
315
|
+
* re-serializes the object between here and the socket — a JSON body helper, a
|
|
316
|
+
* proxy that reformats — changes what was signed. Send exactly this.
|
|
317
|
+
*/
|
|
318
|
+
export declare function pruneIntentBytes(intent: GitvaultPruneIntent): Uint8Array;
|
|
319
|
+
export interface GitvaultPruneConfirmation {
|
|
320
|
+
/** `null` until the control-plane-signed completion exists. */
|
|
321
|
+
outcome: "completed" | "superseded_no_delete" | "superseded_partial_delete" | null;
|
|
322
|
+
/** Object ids the completion confirms are GONE. Only `deleted` qualifies. */
|
|
323
|
+
deleted: string[];
|
|
324
|
+
/** Still present — attempted or not. Never reported as removed. */
|
|
325
|
+
present: GitvaultPruneOutcome[];
|
|
326
|
+
/** Candidates the completion did not adjudicate at all (a defect; reported, never assumed deleted). */
|
|
327
|
+
unadjudicated: string[];
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Read the completion's three-valued vector against the intent's canonical
|
|
331
|
+
* candidate order.
|
|
332
|
+
*
|
|
333
|
+
* The one rule this function exists to enforce: **only `deleted` means gone.**
|
|
334
|
+
* `present_after_attempt` looks like a deletion in the logs and is not one —
|
|
335
|
+
* treating it as one is how a client reports history removed that is still
|
|
336
|
+
* there. A candidate with no entry is `unadjudicated`, never inferred.
|
|
337
|
+
*/
|
|
338
|
+
export declare function summarizePruneCompletion(candidateIds: readonly string[], record: GitvaultPruneIntentRecord | null): GitvaultPruneConfirmation;
|
|
339
|
+
/** Run `fn` in a fresh temp directory and always remove it, even on refusal. */
|
|
340
|
+
export declare function withScratchDir<T>(prefix: string, fn: (dir: string) => Promise<T>): Promise<T>;
|
|
341
|
+
//# sourceMappingURL=gitvault-prune.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitvault-prune.d.ts","sourceRoot":"","sources":["../../src/node/gitvault-prune.ts"],"names":[],"mappings":"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"}
|