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,211 @@
1
+ /**
2
+ * gitvault — push-gated deploy (protocol rev 40 §6.5; task 5.6).
3
+ *
4
+ * Every deploy has a commit, and artifacts build from it:
5
+ * 1. snapshot (§6.6) → the `gitvault_commit`, printed ALWAYS, never sent;
6
+ * 2. a fresh `capture_id` before BOTH lanes;
7
+ * 3. the deploy lane builds from an ISOLATED materialization of the snapshot
8
+ * commit and produces the canonical plan digest (`apply_plan_sha256`,
9
+ * null when the build fails before a plan exists) — concurrently, the
10
+ * push lane prepares the publication;
11
+ * 4. the push's head carries `capture_binding {capture_id, apply_plan_sha256|null,
12
+ * snapshot_oid_hmac}` — capture-the-attempt survives a failed build; no
13
+ * token is mintable from a null digest;
14
+ * 5. with a digest and an admitted head, the capture receipt is exchanged
15
+ * for an activation token, and the apply commit is submitted ONLY with it;
16
+ * 6. the outcome is one of the CLOSED five: `DEPLOYED_AND_VAULTED`,
17
+ * `DEPLOY_BLOCKED_PUSH_FAILED`, `DEPLOY_FAILED_VAULTED`,
18
+ * `DEPLOY_FAILED_UNVAULTED`, `DEPLOYED_UNVAULTED_OVERRIDE`.
19
+ *
20
+ * The push is never gated on deploy success. The unvaulted override
21
+ * (`allow_unvaulted`) is journaled crash-safely BEFORE the commit with the
22
+ * full §6.5 contents; any later invocation drains the journal by pushing the
23
+ * journaled snapshot and presenting the capture receipt to the
24
+ * override-completion route — equality on EVERY field or no clear.
25
+ */
26
+ import type { GitvaultActivationToken, GitvaultCaptureReceipt, GitvaultHeadTarget } from "../namespaces/gitvault.types.js";
27
+ import { GitvaultKeystore } from "./gitvault-keystore.js";
28
+ import { GitvaultVault } from "./gitvault-publication.js";
29
+ import { type GitvaultSnapshot, type GitvaultSnapshotOptions } from "./gitvault-snapshot.js";
30
+ export declare const GITVAULT_DEPLOY_OUTCOMES: readonly ["DEPLOYED_AND_VAULTED", "DEPLOY_BLOCKED_PUSH_FAILED", "DEPLOY_FAILED_VAULTED", "DEPLOY_FAILED_UNVAULTED", "DEPLOYED_UNVAULTED_OVERRIDE"];
31
+ export type GitvaultDeployOutcome = (typeof GITVAULT_DEPLOY_OUTCOMES)[number];
32
+ /** A serializable error summary (never plaintext, never presigned URLs). */
33
+ export interface GitvaultDeployError {
34
+ code: string;
35
+ message: string;
36
+ retryable: boolean;
37
+ details?: unknown;
38
+ }
39
+ export interface GitvaultDeployNextAction {
40
+ action: string;
41
+ /** Present when the action needs a capability the caller may lack. */
42
+ requires?: string;
43
+ }
44
+ interface GitvaultDeployResultBase {
45
+ outcome: GitvaultDeployOutcome;
46
+ /** The snapshot commit — ALWAYS present; the `gitvault_commit` line is derived from it. */
47
+ gitvault_commit: string;
48
+ gitvault_commit_line: string;
49
+ snapshot: GitvaultSnapshot;
50
+ capture_id: string;
51
+ snapshot_oid_hmac: string;
52
+ /** The canonical plan digest — null when the build failed before a plan existed. */
53
+ apply_plan_sha256: string | null;
54
+ operation_id: string | null;
55
+ next_actions: GitvaultDeployNextAction[];
56
+ }
57
+ export type GitvaultDeployResult = (GitvaultDeployResultBase & {
58
+ outcome: "DEPLOYED_AND_VAULTED";
59
+ generation: string;
60
+ head_sha256: string;
61
+ capture_receipt: GitvaultCaptureReceipt;
62
+ activation_token: GitvaultActivationToken;
63
+ commit: unknown;
64
+ }) | (GitvaultDeployResultBase & {
65
+ outcome: "DEPLOY_BLOCKED_PUSH_FAILED";
66
+ push_error: GitvaultDeployError;
67
+ previous_release_keeps_serving: true;
68
+ }) | (GitvaultDeployResultBase & {
69
+ outcome: "DEPLOY_FAILED_VAULTED";
70
+ generation: string;
71
+ head_sha256: string;
72
+ capture_receipt: GitvaultCaptureReceipt | null;
73
+ deploy_error: GitvaultDeployError;
74
+ }) | (GitvaultDeployResultBase & {
75
+ outcome: "DEPLOY_FAILED_UNVAULTED";
76
+ push_error: GitvaultDeployError;
77
+ deploy_error: GitvaultDeployError;
78
+ }) | (GitvaultDeployResultBase & {
79
+ outcome: "DEPLOYED_UNVAULTED_OVERRIDE";
80
+ push_error: GitvaultDeployError;
81
+ override_journal: GitvaultOverrideJournal;
82
+ commit: unknown;
83
+ });
84
+ export interface GitvaultDeployLanePlanInput {
85
+ /** The isolated materialization of the snapshot commit — build from THIS. */
86
+ materialized_dir: string;
87
+ capture_id: string;
88
+ snapshot_oid_hmac: string;
89
+ }
90
+ export interface GitvaultDeployLanePlan {
91
+ plan_id: string;
92
+ /** The apply operation the token is minted for (the gateway creates it at plan time under the vault gate). */
93
+ operation_id: string;
94
+ /** The canonical `apply_plan_canonical/v1` digest (opaque 32-byte commitment, hex). */
95
+ apply_plan_sha256: string;
96
+ }
97
+ export interface GitvaultDeployLaneCommitInput {
98
+ plan_id: string;
99
+ operation_id: string;
100
+ /** Present on the vaulted path. */
101
+ activation_token?: GitvaultActivationToken;
102
+ /** Present on the override path — requires `gitvault.override_unvaulted` server-side. */
103
+ allow_unvaulted?: {
104
+ reason: string;
105
+ };
106
+ }
107
+ /** The apply-v1 plan → commit pair, abstracted so the deploy logic is testable without a gateway. */
108
+ export interface GitvaultDeployLane {
109
+ plan(input: GitvaultDeployLanePlanInput): Promise<GitvaultDeployLanePlan>;
110
+ commit(input: GitvaultDeployLaneCommitInput): Promise<unknown>;
111
+ }
112
+ export interface GitvaultOverrideJournal {
113
+ version: 1;
114
+ repo_id: string;
115
+ operation_id: string;
116
+ capture_id: string;
117
+ apply_plan_sha256: string;
118
+ snapshot: {
119
+ ref: string;
120
+ oid: string;
121
+ head_target: GitvaultHeadTarget;
122
+ };
123
+ snapshot_oid_hmac: string;
124
+ /** `pending` → committed unvaulted, not yet pushed; `published` → pushed, completion not yet accepted; `completed` → advisory cleared server-side. */
125
+ publication_state: "pending" | "published" | "completed";
126
+ generation: string | null;
127
+ head_sha256: string | null;
128
+ capture_receipt: GitvaultCaptureReceipt | null;
129
+ reason: string;
130
+ created_at: string;
131
+ updated_at: string;
132
+ }
133
+ export declare function overrideJournalDir(keystore: GitvaultKeystore): string;
134
+ export declare function overrideJournalPath(keystore: GitvaultKeystore, operationId: string): string;
135
+ export declare function writeOverrideJournal(keystore: GitvaultKeystore, journal: GitvaultOverrideJournal): void;
136
+ export declare function readOverrideJournal(keystore: GitvaultKeystore, operationId: string): GitvaultOverrideJournal | null;
137
+ /** Every override journal not yet `completed` — the doctor-visible advisory list. */
138
+ export declare function listPendingOverrideJournals(keystore: GitvaultKeystore, repoId?: string): GitvaultOverrideJournal[];
139
+ export interface GitvaultCaptureReceiptMatch {
140
+ equal: boolean;
141
+ mismatched_fields: string[];
142
+ }
143
+ /** Compare a capture receipt against an operation's journaled binding on EVERY field: repo, capture_id, plan digest, snapshot commitment, head hash. */
144
+ export declare function matchCaptureReceipt(receipt: GitvaultCaptureReceipt, expected: {
145
+ repo_id: string;
146
+ capture_id: string;
147
+ apply_plan_sha256: string | null;
148
+ snapshot_oid_hmac: string;
149
+ head_sha256: string;
150
+ }): GitvaultCaptureReceiptMatch;
151
+ /**
152
+ * `authorization_epoch` is compared BYTEWISE against the epoch the client last
153
+ * saw installed (a DR gate mints a fresh one). Any difference — one nibble is
154
+ * enough — is `AUTHORIZATION_EPOCH_STALE`, never a retry under the old epoch.
155
+ */
156
+ export declare function checkAuthorizationEpoch(tokenEpoch: string, installedEpoch: string): void;
157
+ /** Verify a minted activation token binds exactly this deploy (before it is ever presented to a commit). */
158
+ export declare function checkActivationTokenBinding(token: GitvaultActivationToken, expected: {
159
+ repo_id: string;
160
+ operation_id: string;
161
+ generation: string;
162
+ head_sha256: string;
163
+ capture_id: string;
164
+ apply_plan_sha256: string;
165
+ snapshot_oid_hmac: string;
166
+ }): string[];
167
+ export interface GitvaultDeployOptions {
168
+ vault: GitvaultVault;
169
+ lane: GitvaultDeployLane;
170
+ /** The work tree to snapshot. */
171
+ repo_dir: string;
172
+ snapshot?: Omit<GitvaultSnapshotOptions, "dir">;
173
+ /** The unvaulted override — requires `gitvault.override_unvaulted` server-side; refused otherwise. */
174
+ allow_unvaulted?: {
175
+ reason: string;
176
+ };
177
+ /** Test/replay hook: pin the capture id. */
178
+ capture_id?: string;
179
+ /** Where the isolated build dir is created (temp when omitted); always removed unless `keep_materialized`. */
180
+ materialize_dir?: string;
181
+ keep_materialized?: boolean;
182
+ now?: () => Date;
183
+ /** Called with the `gitvault_commit` line as soon as the snapshot exists — the CLI prints it. */
184
+ onCommitLine?: (line: string) => void;
185
+ }
186
+ /**
187
+ * Run the push-gated deploy. Throws ONLY for refusals that precede any lane
188
+ * (snapshot refusals such as `SNAPSHOT_CONFLICTED_INDEX`, unsupported
189
+ * repositories) and for `OVERRIDE_NOT_AUTHORIZED`; every other path resolves
190
+ * to one of the five outcomes.
191
+ */
192
+ export declare function runGitvaultDeploy(options: GitvaultDeployOptions): Promise<GitvaultDeployResult>;
193
+ export interface GitvaultOverrideDrainReport {
194
+ completed: GitvaultOverrideJournal[];
195
+ /** Still pending, with the reason the drain could not complete them this time. */
196
+ remaining: Array<{
197
+ journal: GitvaultOverrideJournal;
198
+ error: GitvaultDeployError;
199
+ }>;
200
+ }
201
+ /**
202
+ * Drain every pending override journal for this vault: push the journaled
203
+ * snapshot (same capture binding), verify the receipt against EVERY journaled
204
+ * field + the read-back head hash, present it for completion. Partial matches
205
+ * never clear; the advisory persists until equality.
206
+ */
207
+ export declare function drainOverrideJournals(vault: GitvaultVault, options?: {
208
+ now?: () => Date;
209
+ }): Promise<GitvaultOverrideDrainReport>;
210
+ export {};
211
+ //# sourceMappingURL=gitvault-deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitvault-deploy.d.ts","sourceRoot":"","sources":["../../src/node/gitvault-deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,292 @@
1
+ /**
2
+ * gitvault — push-gated deploy (protocol rev 40 §6.5; task 5.6).
3
+ *
4
+ * Every deploy has a commit, and artifacts build from it:
5
+ * 1. snapshot (§6.6) → the `gitvault_commit`, printed ALWAYS, never sent;
6
+ * 2. a fresh `capture_id` before BOTH lanes;
7
+ * 3. the deploy lane builds from an ISOLATED materialization of the snapshot
8
+ * commit and produces the canonical plan digest (`apply_plan_sha256`,
9
+ * null when the build fails before a plan exists) — concurrently, the
10
+ * push lane prepares the publication;
11
+ * 4. the push's head carries `capture_binding {capture_id, apply_plan_sha256|null,
12
+ * snapshot_oid_hmac}` — capture-the-attempt survives a failed build; no
13
+ * token is mintable from a null digest;
14
+ * 5. with a digest and an admitted head, the capture receipt is exchanged
15
+ * for an activation token, and the apply commit is submitted ONLY with it;
16
+ * 6. the outcome is one of the CLOSED five: `DEPLOYED_AND_VAULTED`,
17
+ * `DEPLOY_BLOCKED_PUSH_FAILED`, `DEPLOY_FAILED_VAULTED`,
18
+ * `DEPLOY_FAILED_UNVAULTED`, `DEPLOYED_UNVAULTED_OVERRIDE`.
19
+ *
20
+ * The push is never gated on deploy success. The unvaulted override
21
+ * (`allow_unvaulted`) is journaled crash-safely BEFORE the commit with the
22
+ * full §6.5 contents; any later invocation drains the journal by pushing the
23
+ * journaled snapshot and presenting the capture receipt to the
24
+ * override-completion route — equality on EVERY field or no clear.
25
+ */
26
+ import { existsSync, readdirSync, rmSync } from "node:fs";
27
+ import { join } from "node:path";
28
+ import { LocalError, isRun402Error } from "../errors.js";
29
+ import { formatGitvaultTimestamp, hexToBytes, newHex32 } from "../namespaces/gitvault.crypto.js";
30
+ import { readFileNoFollow, writeFileAtomic0600 } from "./gitvault-keystore.js";
31
+ import { captureBinding, deployRefTransaction } from "./gitvault-publication.js";
32
+ import { GITVAULT_DEPLOY_REF, captureSnapshot, gitvaultCommitLine, materializeSnapshot, snapshotCommitment } from "./gitvault-snapshot.js";
33
+ // ─── Outcomes ────────────────────────────────────────────────────────────────
34
+ export const GITVAULT_DEPLOY_OUTCOMES = [
35
+ "DEPLOYED_AND_VAULTED",
36
+ "DEPLOY_BLOCKED_PUSH_FAILED",
37
+ "DEPLOY_FAILED_VAULTED",
38
+ "DEPLOY_FAILED_UNVAULTED",
39
+ "DEPLOYED_UNVAULTED_OVERRIDE",
40
+ ];
41
+ export function overrideJournalDir(keystore) {
42
+ return join(keystore.journalDir, "overrides");
43
+ }
44
+ export function overrideJournalPath(keystore, operationId) {
45
+ if (!/^[A-Za-z0-9_.-]{1,128}$/.test(operationId))
46
+ throw new LocalError("operation_id is not a safe file name", "resolving override journal path", { code: "GITVAULT_BAD_ID" });
47
+ return join(overrideJournalDir(keystore), `${operationId}.json`);
48
+ }
49
+ export function writeOverrideJournal(keystore, journal) {
50
+ writeFileAtomic0600(overrideJournalPath(keystore, journal.operation_id), JSON.stringify(journal, null, 2));
51
+ keystore.audit("journal_stage", journal.repo_id, { override_operation_id: journal.operation_id, publication_state: journal.publication_state });
52
+ }
53
+ export function readOverrideJournal(keystore, operationId) {
54
+ const text = readFileNoFollow(overrideJournalPath(keystore, operationId));
55
+ return text ? JSON.parse(text) : null;
56
+ }
57
+ /** Every override journal not yet `completed` — the doctor-visible advisory list. */
58
+ export function listPendingOverrideJournals(keystore, repoId) {
59
+ const dir = overrideJournalDir(keystore);
60
+ if (!existsSync(dir))
61
+ return [];
62
+ const out = [];
63
+ for (const f of readdirSync(dir)) {
64
+ if (!f.endsWith(".json"))
65
+ continue;
66
+ const text = readFileNoFollow(join(dir, f));
67
+ if (!text)
68
+ continue;
69
+ const j = JSON.parse(text);
70
+ if (j.version !== 1 || j.publication_state === "completed")
71
+ continue;
72
+ if (repoId && j.repo_id !== repoId)
73
+ continue;
74
+ out.push(j);
75
+ }
76
+ return out;
77
+ }
78
+ /** Compare a capture receipt against an operation's journaled binding on EVERY field: repo, capture_id, plan digest, snapshot commitment, head hash. */
79
+ export function matchCaptureReceipt(receipt, expected) {
80
+ const mismatched = [];
81
+ if (receipt.repo_id !== expected.repo_id)
82
+ mismatched.push("repo_id");
83
+ if (receipt.capture_id !== expected.capture_id)
84
+ mismatched.push("capture_id");
85
+ if (receipt.apply_plan_sha256 !== expected.apply_plan_sha256)
86
+ mismatched.push("apply_plan_sha256");
87
+ if (receipt.snapshot_oid_hmac !== expected.snapshot_oid_hmac)
88
+ mismatched.push("snapshot_oid_hmac");
89
+ if (receipt.head_sha256 !== expected.head_sha256)
90
+ mismatched.push("head_sha256");
91
+ return { equal: mismatched.length === 0, mismatched_fields: mismatched };
92
+ }
93
+ /**
94
+ * `authorization_epoch` is compared BYTEWISE against the epoch the client last
95
+ * saw installed (a DR gate mints a fresh one). Any difference — one nibble is
96
+ * enough — is `AUTHORIZATION_EPOCH_STALE`, never a retry under the old epoch.
97
+ */
98
+ export function checkAuthorizationEpoch(tokenEpoch, installedEpoch) {
99
+ if (tokenEpoch === installedEpoch)
100
+ return;
101
+ throw new LocalError(`authorization_epoch ${tokenEpoch} is not the installed epoch ${installedEpoch}; the authorization was issued under a superseded epoch`, "checking authorization epoch", { code: "AUTHORIZATION_EPOCH_STALE", details: { token_authorization_epoch: tokenEpoch, installed_authorization_epoch: installedEpoch }, next_actions: [{ action: "re-request authorization under the current epoch (redeploy)" }] });
102
+ }
103
+ /** Verify a minted activation token binds exactly this deploy (before it is ever presented to a commit). */
104
+ export function checkActivationTokenBinding(token, expected) {
105
+ const problems = [];
106
+ if (token.object_kind !== "activation_token" || !/^ct_[0-9a-f]{32}$/.test(token.object_id))
107
+ problems.push("object_id");
108
+ for (const k of ["repo_id", "operation_id", "generation", "head_sha256", "capture_id", "apply_plan_sha256", "snapshot_oid_hmac"]) {
109
+ if (token[k] !== expected[k])
110
+ problems.push(k);
111
+ }
112
+ if (!/^[0-9a-f]{32}$/.test(token.authorization_epoch))
113
+ problems.push("authorization_epoch");
114
+ return problems;
115
+ }
116
+ function summarize(e) {
117
+ if (isRun402Error(e)) {
118
+ const err = e;
119
+ return { code: err.code ?? "UNKNOWN", message: err.message, retryable: Boolean(err.retryable), ...(err.details !== undefined ? { details: err.details } : {}) };
120
+ }
121
+ return { code: "UNKNOWN", message: e instanceof Error ? e.message : String(e), retryable: false };
122
+ }
123
+ function code(e) {
124
+ return isRun402Error(e) ? e.code : undefined;
125
+ }
126
+ /**
127
+ * Run the push-gated deploy. Throws ONLY for refusals that precede any lane
128
+ * (snapshot refusals such as `SNAPSHOT_CONFLICTED_INDEX`, unsupported
129
+ * repositories) and for `OVERRIDE_NOT_AUTHORIZED`; every other path resolves
130
+ * to one of the five outcomes.
131
+ */
132
+ export async function runGitvaultDeploy(options) {
133
+ const { vault, lane } = options;
134
+ const now = options.now ?? (() => new Date());
135
+ const repo = vault.repoFile();
136
+ const kRepo = hexToBytes(repo.k_repo_hex);
137
+ // 1. snapshot — refusals propagate; nothing has been sent anywhere.
138
+ const snapshot = await captureSnapshot({ dir: options.repo_dir, ...(options.snapshot ?? {}) });
139
+ const commitLine = gitvaultCommitLine(snapshot);
140
+ options.onCommitLine?.(commitLine);
141
+ // 2. fresh capture id before both lanes; the keyed snapshot commitment (the platform never sees the oid).
142
+ const captureId = options.capture_id ?? newHex32();
143
+ const snapshotOidHmac = snapshotCommitment(kRepo, vault.repoId, repo.epoch, snapshot.oid);
144
+ const base = (fields) => ({
145
+ outcome: "DEPLOY_FAILED_UNVAULTED", gitvault_commit: snapshot.oid, gitvault_commit_line: commitLine, snapshot, capture_id: captureId, snapshot_oid_hmac: snapshotOidHmac,
146
+ apply_plan_sha256: null, operation_id: null, next_actions: [], ...fields,
147
+ });
148
+ // 3. isolated materialization — the deploy lane builds from the commit, never the work tree.
149
+ const materialized = await materializeSnapshot(options.repo_dir, snapshot.oid, options.materialize_dir);
150
+ let plan = null;
151
+ let planError = null;
152
+ const planPromise = (async () => {
153
+ try {
154
+ plan = await lane.plan({ materialized_dir: materialized, capture_id: captureId, snapshot_oid_hmac: snapshotOidHmac });
155
+ }
156
+ catch (e) {
157
+ planError = e;
158
+ }
159
+ })();
160
+ // 4. push lane — concurrently; the head's binding is resolved at sign time from whatever the plan lane produced.
161
+ let published = null;
162
+ let pushError = null;
163
+ const pushPromise = (async () => {
164
+ try {
165
+ const current = await vault.materialize();
166
+ published = await vault.push({
167
+ transaction: deployRefTransaction(current.refs, snapshot.oid),
168
+ head_target: snapshot.head,
169
+ protocol_refs: "allow",
170
+ capture_binding: async () => {
171
+ await planPromise; // the digest (or its absence) must be known before the head is signed
172
+ return captureBinding(captureId, plan ? plan.apply_plan_sha256 : null, snapshotOidHmac);
173
+ },
174
+ });
175
+ }
176
+ catch (e) {
177
+ pushError = e;
178
+ }
179
+ })();
180
+ await Promise.all([planPromise, pushPromise]);
181
+ if (!options.keep_materialized)
182
+ rmSync(materialized, { recursive: true, force: true });
183
+ const planned = plan;
184
+ const pub = published;
185
+ const common = base({ apply_plan_sha256: planned?.apply_plan_sha256 ?? null, operation_id: planned?.operation_id ?? null });
186
+ // 5. outcomes
187
+ if (!pub) {
188
+ const push_error = summarize(pushError);
189
+ if (!planned) {
190
+ return { ...common, outcome: "DEPLOY_FAILED_UNVAULTED", push_error, deploy_error: summarize(planError), next_actions: [{ action: "fix the build, then redeploy" }, { action: "retry the push (run402 gitvault push)" }] };
191
+ }
192
+ if (options.allow_unvaulted) {
193
+ // journal BEFORE the commit so a crash leaves the advisory + the exact snapshot to resume
194
+ const journal = {
195
+ version: 1, repo_id: vault.repoId, operation_id: planned.operation_id, capture_id: captureId, apply_plan_sha256: planned.apply_plan_sha256,
196
+ snapshot: { ref: GITVAULT_DEPLOY_REF, oid: snapshot.oid, head_target: snapshot.head }, snapshot_oid_hmac: snapshotOidHmac,
197
+ publication_state: "pending", generation: null, head_sha256: null, capture_receipt: null, reason: options.allow_unvaulted.reason,
198
+ created_at: formatGitvaultTimestamp(now()), updated_at: formatGitvaultTimestamp(now()),
199
+ };
200
+ writeOverrideJournal(vault.keystore, journal);
201
+ let commit;
202
+ try {
203
+ commit = await lane.commit({ plan_id: planned.plan_id, operation_id: planned.operation_id, allow_unvaulted: options.allow_unvaulted });
204
+ }
205
+ catch (e) {
206
+ if (code(e) === "OVERRIDE_NOT_AUTHORIZED") {
207
+ rmSync(overrideJournalPath(vault.keystore, planned.operation_id), { force: true }); // nothing activated; no advisory to drain
208
+ throw e;
209
+ }
210
+ return { ...common, outcome: "DEPLOY_FAILED_UNVAULTED", push_error, deploy_error: summarize(e), next_actions: [{ action: "retry the push (run402 gitvault push) — the override journal is kept and will drain" }, { action: "retry the deploy" }] };
211
+ }
212
+ return { ...common, outcome: "DEPLOYED_UNVAULTED_OVERRIDE", push_error, override_journal: journal, commit, next_actions: [{ action: "run any run402 CLI command later: the override journal drains by pushing this exact snapshot and presenting its capture receipt for completion" }] };
213
+ }
214
+ return {
215
+ ...common, outcome: "DEPLOY_BLOCKED_PUSH_FAILED", push_error, previous_release_keeps_serving: true,
216
+ next_actions: [
217
+ { action: "retry the deploy (the vault push is retried; the previous release keeps serving)" },
218
+ { action: "deploy with allow_unvaulted to activate without a vaulted capture (journaled, completed later)", requires: "gitvault.override_unvaulted" },
219
+ ],
220
+ };
221
+ }
222
+ const vaulted = { generation: pub.generation, head_sha256: pub.head_sha256, capture_receipt: pub.capture_receipt };
223
+ if (!planned) {
224
+ return { ...common, outcome: "DEPLOY_FAILED_VAULTED", ...vaulted, deploy_error: summarize(planError), next_actions: [{ action: "fix the build, then redeploy (the attempted tree is in the vault at generation " + pub.generation + ")" }] };
225
+ }
226
+ if (!pub.capture_receipt) {
227
+ return { ...common, outcome: "DEPLOY_FAILED_VAULTED", ...vaulted, deploy_error: { code: "GITVAULT_CAPTURE_RECEIPT_MISSING", message: "admission returned no capture receipt for a head carrying a capture binding; no activation token can be exchanged", retryable: true }, next_actions: [{ action: "retry the deploy" }] };
228
+ }
229
+ let token;
230
+ try {
231
+ token = await vault.transport.exchangeActivationToken({ repo_id: vault.repoId, operation_id: planned.operation_id, capture_receipt: pub.capture_receipt });
232
+ const problems = checkActivationTokenBinding(token, { repo_id: vault.repoId, operation_id: planned.operation_id, generation: pub.generation, head_sha256: pub.head_sha256, capture_id: captureId, apply_plan_sha256: planned.apply_plan_sha256, snapshot_oid_hmac: snapshotOidHmac });
233
+ if (problems.length > 0)
234
+ throw new LocalError(`the minted activation token does not bind this deploy (${problems.join(", ")}); refusing to present it`, "checking activation token", { code: "GITVAULT_TOKEN_BINDING_MISMATCH", details: { problems } });
235
+ // the mint validates the receipt's epoch against the installed one, so a minted token's epoch
236
+ // must equal the receipt's — a difference means the epoch moved under us.
237
+ checkAuthorizationEpoch(token.authorization_epoch, pub.capture_receipt.authorization_epoch);
238
+ }
239
+ catch (e) {
240
+ return { ...common, outcome: "DEPLOY_FAILED_VAULTED", ...vaulted, deploy_error: summarize(e), next_actions: [{ action: code(e) === "AUTHORIZATION_EPOCH_STALE" ? "re-request authorization under the current epoch (redeploy)" : "retry the deploy" }] };
241
+ }
242
+ let commit;
243
+ try {
244
+ commit = await lane.commit({ plan_id: planned.plan_id, operation_id: planned.operation_id, activation_token: token });
245
+ }
246
+ catch (e) {
247
+ return { ...common, outcome: "DEPLOY_FAILED_VAULTED", ...vaulted, deploy_error: summarize(e), next_actions: [{ action: "inspect the apply operation, fix, redeploy (the attempted tree is vaulted)" }] };
248
+ }
249
+ return { ...common, outcome: "DEPLOYED_AND_VAULTED", ...vaulted, capture_receipt: pub.capture_receipt, activation_token: token, commit, next_actions: [] };
250
+ }
251
+ /**
252
+ * Drain every pending override journal for this vault: push the journaled
253
+ * snapshot (same capture binding), verify the receipt against EVERY journaled
254
+ * field + the read-back head hash, present it for completion. Partial matches
255
+ * never clear; the advisory persists until equality.
256
+ */
257
+ export async function drainOverrideJournals(vault, options = {}) {
258
+ const now = options.now ?? (() => new Date());
259
+ const report = { completed: [], remaining: [] };
260
+ for (const journal of listPendingOverrideJournals(vault.keystore, vault.repoId)) {
261
+ try {
262
+ let j = journal;
263
+ if (j.publication_state === "pending") {
264
+ const current = await vault.materialize();
265
+ const pub = await vault.push({
266
+ transaction: deployRefTransaction(current.refs, j.snapshot.oid),
267
+ head_target: j.snapshot.head_target,
268
+ protocol_refs: "allow",
269
+ capture_binding: captureBinding(j.capture_id, j.apply_plan_sha256, j.snapshot_oid_hmac),
270
+ });
271
+ j = { ...j, publication_state: "published", generation: pub.generation, head_sha256: pub.head_sha256, capture_receipt: pub.capture_receipt, updated_at: formatGitvaultTimestamp(now()) };
272
+ writeOverrideJournal(vault.keystore, j);
273
+ }
274
+ if (!j.capture_receipt || !j.head_sha256)
275
+ throw new LocalError("the journaled publication has no capture receipt to present", "draining override journal", { code: "GITVAULT_CAPTURE_RECEIPT_MISSING" });
276
+ const match = matchCaptureReceipt(j.capture_receipt, { repo_id: j.repo_id, capture_id: j.capture_id, apply_plan_sha256: j.apply_plan_sha256, snapshot_oid_hmac: j.snapshot_oid_hmac, head_sha256: j.head_sha256 });
277
+ if (!match.equal)
278
+ throw new LocalError(`the capture receipt does not match the journaled operation on ${match.mismatched_fields.join(", ")}; the advisory persists`, "draining override journal", { code: "GITVAULT_OVERRIDE_COMPLETION_MISMATCH", details: match });
279
+ const res = await vault.transport.submitOverrideCompletion({ repo_id: j.repo_id, operation_id: j.operation_id, capture_receipt: j.capture_receipt });
280
+ if (!res.cleared)
281
+ throw new LocalError("the platform did not clear the override advisory", "draining override journal", { code: "GITVAULT_OVERRIDE_COMPLETION_REFUSED" });
282
+ j = { ...j, publication_state: "completed", updated_at: formatGitvaultTimestamp(now()) };
283
+ writeOverrideJournal(vault.keystore, j);
284
+ report.completed.push(j);
285
+ }
286
+ catch (e) {
287
+ report.remaining.push({ journal, error: summarize(e) });
288
+ }
289
+ }
290
+ return report;
291
+ }
292
+ //# sourceMappingURL=gitvault-deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitvault-deploy.js","sourceRoot":"","sources":["../../src/node/gitvault-deploy.ts"],"names":[],"mappings":"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"}