@run402/sdk 4.94.0 → 4.96.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/README.md +44 -44
- package/core-dist/keystore.d.ts +1 -1
- package/core-dist/keystore.js +1 -1
- package/dist/actions.d.ts +3 -3
- package/dist/actions.d.ts.map +1 -1
- package/dist/app-up.d.ts +2 -2
- package/dist/app-up.d.ts.map +1 -1
- package/dist/config.d.ts +1 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/credentials.d.ts +1 -1
- package/dist/errors.d.ts +6 -6
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +9 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/namespaces/admin.d.ts +1 -1
- package/dist/namespaces/admin.d.ts.map +1 -1
- package/dist/namespaces/ai.d.ts +1 -1
- package/dist/namespaces/ai.js +2 -2
- package/dist/namespaces/ai.js.map +1 -1
- package/dist/namespaces/assets.js +1 -1
- package/dist/namespaces/assets.js.map +1 -1
- package/dist/namespaces/ci.js +3 -3
- package/dist/namespaces/ci.js.map +1 -1
- package/dist/namespaces/deploy.d.ts +5 -5
- package/dist/namespaces/deploy.d.ts.map +1 -1
- package/dist/namespaces/deploy.js +45 -46
- package/dist/namespaces/deploy.js.map +1 -1
- package/dist/namespaces/deploy.types.d.ts +19 -19
- package/dist/namespaces/deploy.types.d.ts.map +1 -1
- package/dist/namespaces/domains.d.ts +10 -2
- package/dist/namespaces/domains.d.ts.map +1 -1
- package/dist/namespaces/domains.js +10 -5
- package/dist/namespaces/domains.js.map +1 -1
- package/dist/namespaces/errors.js +1 -1
- package/dist/namespaces/functions.js +1 -1
- package/dist/namespaces/functions.js.map +1 -1
- package/dist/namespaces/org.d.ts +2 -2
- package/dist/namespaces/org.js +2 -2
- package/dist/namespaces/org.types.d.ts +3 -3
- package/dist/namespaces/pay.js +1 -1
- package/dist/namespaces/{gitvault.d.ts → repos.d.ts} +438 -451
- package/dist/namespaces/repos.d.ts.map +1 -0
- package/dist/namespaces/{gitvault.js → repos.js} +454 -462
- package/dist/namespaces/repos.js.map +1 -0
- package/dist/namespaces/rooms.js +2 -2
- package/dist/namespaces/rooms.js.map +1 -1
- package/dist/namespaces/session.d.ts +2 -2
- package/dist/namespaces/session.d.ts.map +1 -1
- package/dist/namespaces/session.js +2 -2
- package/dist/namespaces/session.js.map +1 -1
- package/dist/namespaces/tier.d.ts +4 -4
- package/dist/namespaces/tier.d.ts.map +1 -1
- package/dist/namespaces/transfers.d.ts +46 -15
- package/dist/namespaces/transfers.d.ts.map +1 -1
- package/dist/namespaces/transfers.js.map +1 -1
- package/dist/namespaces/{gitvault.crypto.d.ts → vault.crypto.d.ts} +141 -141
- package/dist/namespaces/vault.crypto.d.ts.map +1 -0
- package/dist/namespaces/{gitvault.crypto.js → vault.crypto.js} +173 -173
- package/dist/namespaces/vault.crypto.js.map +1 -0
- package/dist/namespaces/{gitvault.types.d.ts → vault.types.d.ts} +136 -136
- package/dist/namespaces/vault.types.d.ts.map +1 -0
- package/dist/namespaces/{gitvault.types.js → vault.types.js} +4 -4
- package/dist/namespaces/vault.types.js.map +1 -0
- package/dist/node/actions-node.js +8 -8
- package/dist/node/actions-node.js.map +1 -1
- package/dist/node/assets-node.js +6 -6
- package/dist/node/assets-node.js.map +1 -1
- package/dist/node/bearer-redeem-key.d.ts +1 -1
- package/dist/node/bearer-redeem-key.js +5 -5
- package/dist/node/bearer-redeem-key.js.map +1 -1
- package/dist/node/ci.js +1 -1
- package/dist/node/ci.js.map +1 -1
- package/dist/node/credentials.d.ts +1 -1
- package/dist/node/credentials.js +1 -1
- package/dist/node/deploy-manifest.d.ts +3 -5
- package/dist/node/deploy-manifest.d.ts.map +1 -1
- package/dist/node/deploy-manifest.js +3 -12
- package/dist/node/deploy-manifest.js.map +1 -1
- package/dist/node/http-dispatcher.js +5 -5
- package/dist/node/http-dispatcher.js.map +1 -1
- package/dist/node/index.d.ts +29 -29
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +39 -39
- package/dist/node/index.js.map +1 -1
- package/dist/node/manifest-export.js +2 -2
- package/dist/node/manifest-export.js.map +1 -1
- package/dist/node/org-adopt.js +1 -1
- package/dist/node/org-adopt.js.map +1 -1
- package/dist/node/sites-node.js +1 -1
- package/dist/node/sites-node.js.map +1 -1
- package/dist/node/{gitvault-address.d.ts → vault-address.d.ts} +42 -42
- package/dist/node/vault-address.d.ts.map +1 -0
- package/dist/node/{gitvault-address.js → vault-address.js} +43 -43
- package/dist/node/vault-address.js.map +1 -0
- package/dist/node/{gitvault-apply.d.ts → vault-apply.d.ts} +27 -27
- package/dist/node/vault-apply.d.ts.map +1 -0
- package/dist/node/{gitvault-apply.js → vault-apply.js} +38 -38
- package/dist/node/vault-apply.js.map +1 -0
- package/dist/node/vault-byo-config.d.ts +29 -0
- package/dist/node/vault-byo-config.d.ts.map +1 -0
- package/dist/node/{gitvault-byo-config.js → vault-byo-config.js} +18 -18
- package/dist/node/vault-byo-config.js.map +1 -0
- package/dist/node/vault-byo-probe.d.ts +20 -0
- package/dist/node/vault-byo-probe.d.ts.map +1 -0
- package/dist/node/vault-byo-probe.js +57 -0
- package/dist/node/vault-byo-probe.js.map +1 -0
- package/dist/node/{gitvault-creation-journal.d.ts → vault-creation-journal.d.ts} +69 -69
- package/dist/node/vault-creation-journal.d.ts.map +1 -0
- package/dist/node/{gitvault-creation-journal.js → vault-creation-journal.js} +54 -54
- package/dist/node/vault-creation-journal.js.map +1 -0
- package/dist/node/{gitvault-degraded-read.d.ts → vault-degraded-read.d.ts} +34 -34
- package/dist/node/vault-degraded-read.d.ts.map +1 -0
- package/dist/node/{gitvault-degraded-read.js → vault-degraded-read.js} +24 -24
- package/dist/node/vault-degraded-read.js.map +1 -0
- package/dist/node/{gitvault-deploy.d.ts → vault-deploy.d.ts} +67 -67
- package/dist/node/vault-deploy.d.ts.map +1 -0
- package/dist/node/{gitvault-deploy.js → vault-deploy.js} +27 -27
- package/dist/node/vault-deploy.js.map +1 -0
- package/dist/node/{gitvault-edge-fetch.d.ts → vault-edge-fetch.d.ts} +9 -9
- package/dist/node/vault-edge-fetch.d.ts.map +1 -0
- package/dist/node/{gitvault-edge-fetch.js → vault-edge-fetch.js} +11 -11
- package/dist/node/vault-edge-fetch.js.map +1 -0
- package/dist/node/{gitvault-handoff.d.ts → vault-handoff.d.ts} +9 -9
- package/dist/node/vault-handoff.d.ts.map +1 -0
- package/dist/node/{gitvault-handoff.js → vault-handoff.js} +24 -24
- package/dist/node/vault-handoff.js.map +1 -0
- package/dist/node/{gitvault-keystore.d.ts → vault-keystore.d.ts} +87 -77
- package/dist/node/vault-keystore.d.ts.map +1 -0
- package/dist/node/{gitvault-keystore.js → vault-keystore.js} +105 -68
- package/dist/node/vault-keystore.js.map +1 -0
- package/dist/node/{gitvault-member-bundle.d.ts → vault-member-bundle.d.ts} +17 -17
- package/dist/node/vault-member-bundle.d.ts.map +1 -0
- package/dist/node/{gitvault-member-bundle.js → vault-member-bundle.js} +11 -11
- package/dist/node/vault-member-bundle.js.map +1 -0
- package/dist/node/{gitvault-mirror-backend.d.ts → vault-mirror-backend.d.ts} +26 -26
- package/dist/node/vault-mirror-backend.d.ts.map +1 -0
- package/dist/node/{gitvault-mirror-backend.js → vault-mirror-backend.js} +25 -25
- package/dist/node/vault-mirror-backend.js.map +1 -0
- package/dist/node/{gitvault-mirror-config.d.ts → vault-mirror-config.d.ts} +23 -23
- package/dist/node/vault-mirror-config.d.ts.map +1 -0
- package/dist/node/{gitvault-mirror-config.js → vault-mirror-config.js} +16 -16
- package/dist/node/vault-mirror-config.js.map +1 -0
- package/dist/node/{gitvault-mirror.d.ts → vault-mirror.d.ts} +36 -36
- package/dist/node/vault-mirror.d.ts.map +1 -0
- package/dist/node/{gitvault-mirror.js → vault-mirror.js} +75 -75
- package/dist/node/vault-mirror.js.map +1 -0
- package/dist/node/{gitvault-native-crypto.d.ts → vault-native-crypto.d.ts} +10 -10
- package/dist/node/vault-native-crypto.d.ts.map +1 -0
- package/dist/node/{gitvault-native-crypto.js → vault-native-crypto.js} +16 -16
- package/dist/node/vault-native-crypto.js.map +1 -0
- package/dist/node/{gitvault-open-or-create.d.ts → vault-open-or-create.d.ts} +16 -16
- package/dist/node/vault-open-or-create.d.ts.map +1 -0
- package/dist/node/{gitvault-open-or-create.js → vault-open-or-create.js} +10 -10
- package/dist/node/vault-open-or-create.js.map +1 -0
- package/dist/node/{gitvault-prewarm.d.ts → vault-prewarm.d.ts} +13 -13
- package/dist/node/vault-prewarm.d.ts.map +1 -0
- package/dist/node/{gitvault-prewarm.js → vault-prewarm.js} +25 -25
- package/dist/node/vault-prewarm.js.map +1 -0
- package/dist/node/{gitvault-profile-scan.d.ts → vault-profile-scan.d.ts} +3 -3
- package/dist/node/vault-profile-scan.d.ts.map +1 -0
- package/dist/node/{gitvault-profile-scan.js → vault-profile-scan.js} +12 -12
- package/dist/node/vault-profile-scan.js.map +1 -0
- package/dist/node/{gitvault-prune.d.ts → vault-prune.d.ts} +61 -61
- package/dist/node/vault-prune.d.ts.map +1 -0
- package/dist/node/{gitvault-prune.js → vault-prune.js} +34 -34
- package/dist/node/vault-prune.js.map +1 -0
- package/dist/node/{gitvault-publication.d.ts → vault-publication.d.ts} +399 -399
- package/dist/node/vault-publication.d.ts.map +1 -0
- package/dist/node/{gitvault-publication.js → vault-publication.js} +584 -584
- package/dist/node/vault-publication.js.map +1 -0
- package/dist/node/{gitvault-push-to-create.d.ts → vault-push-to-create.d.ts} +16 -16
- package/dist/node/vault-push-to-create.d.ts.map +1 -0
- package/dist/node/{gitvault-push-to-create.js → vault-push-to-create.js} +9 -9
- package/dist/node/vault-push-to-create.js.map +1 -0
- package/dist/node/{gitvault-recover.d.ts → vault-recover.d.ts} +50 -50
- package/dist/node/vault-recover.d.ts.map +1 -0
- package/dist/node/{gitvault-recover.js → vault-recover.js} +84 -84
- package/dist/node/vault-recover.js.map +1 -0
- package/dist/node/{gitvault-restore.d.ts → vault-restore.d.ts} +8 -8
- package/dist/node/vault-restore.d.ts.map +1 -0
- package/dist/node/{gitvault-restore.js → vault-restore.js} +11 -11
- package/dist/node/vault-restore.js.map +1 -0
- package/dist/node/{gitvault-snapshot.d.ts → vault-snapshot.d.ts} +48 -48
- package/dist/node/vault-snapshot.d.ts.map +1 -0
- package/dist/node/{gitvault-snapshot.js → vault-snapshot.js} +61 -61
- package/dist/node/vault-snapshot.js.map +1 -0
- package/dist/node/{gitvault-writer-state.d.ts → vault-writer-state.d.ts} +8 -8
- package/dist/node/vault-writer-state.d.ts.map +1 -0
- package/dist/node/{gitvault-writer-state.js → vault-writer-state.js} +15 -15
- package/dist/node/vault-writer-state.js.map +1 -0
- package/dist/node/workflow-output.js +4 -4
- package/dist/node/workflow-output.js.map +1 -1
- package/dist/scoped.d.ts +8 -8
- package/dist/scoped.d.ts.map +1 -1
- package/dist/scoped.js +3 -3
- package/dist/scoped.js.map +1 -1
- package/package.json +1 -1
- package/dist/namespaces/gitvault.crypto.d.ts.map +0 -1
- package/dist/namespaces/gitvault.crypto.js.map +0 -1
- package/dist/namespaces/gitvault.d.ts.map +0 -1
- package/dist/namespaces/gitvault.js.map +0 -1
- package/dist/namespaces/gitvault.types.d.ts.map +0 -1
- package/dist/namespaces/gitvault.types.js.map +0 -1
- package/dist/node/gitvault-address.d.ts.map +0 -1
- package/dist/node/gitvault-address.js.map +0 -1
- package/dist/node/gitvault-apply.d.ts.map +0 -1
- package/dist/node/gitvault-apply.js.map +0 -1
- package/dist/node/gitvault-byo-config.d.ts +0 -29
- package/dist/node/gitvault-byo-config.d.ts.map +0 -1
- package/dist/node/gitvault-byo-config.js.map +0 -1
- package/dist/node/gitvault-byo-probe.d.ts +0 -20
- package/dist/node/gitvault-byo-probe.d.ts.map +0 -1
- package/dist/node/gitvault-byo-probe.js +0 -57
- package/dist/node/gitvault-byo-probe.js.map +0 -1
- package/dist/node/gitvault-creation-journal.d.ts.map +0 -1
- package/dist/node/gitvault-creation-journal.js.map +0 -1
- package/dist/node/gitvault-degraded-read.d.ts.map +0 -1
- package/dist/node/gitvault-degraded-read.js.map +0 -1
- package/dist/node/gitvault-deploy.d.ts.map +0 -1
- package/dist/node/gitvault-deploy.js.map +0 -1
- package/dist/node/gitvault-edge-fetch.d.ts.map +0 -1
- package/dist/node/gitvault-edge-fetch.js.map +0 -1
- package/dist/node/gitvault-handoff.d.ts.map +0 -1
- package/dist/node/gitvault-handoff.js.map +0 -1
- package/dist/node/gitvault-keystore.d.ts.map +0 -1
- package/dist/node/gitvault-keystore.js.map +0 -1
- package/dist/node/gitvault-member-bundle.d.ts.map +0 -1
- package/dist/node/gitvault-member-bundle.js.map +0 -1
- package/dist/node/gitvault-mirror-backend.d.ts.map +0 -1
- package/dist/node/gitvault-mirror-backend.js.map +0 -1
- package/dist/node/gitvault-mirror-config.d.ts.map +0 -1
- package/dist/node/gitvault-mirror-config.js.map +0 -1
- package/dist/node/gitvault-mirror.d.ts.map +0 -1
- package/dist/node/gitvault-mirror.js.map +0 -1
- package/dist/node/gitvault-native-crypto.d.ts.map +0 -1
- package/dist/node/gitvault-native-crypto.js.map +0 -1
- package/dist/node/gitvault-open-or-create.d.ts.map +0 -1
- package/dist/node/gitvault-open-or-create.js.map +0 -1
- package/dist/node/gitvault-prewarm.d.ts.map +0 -1
- package/dist/node/gitvault-prewarm.js.map +0 -1
- package/dist/node/gitvault-profile-scan.d.ts.map +0 -1
- package/dist/node/gitvault-profile-scan.js.map +0 -1
- package/dist/node/gitvault-prune.d.ts.map +0 -1
- package/dist/node/gitvault-prune.js.map +0 -1
- package/dist/node/gitvault-publication.d.ts.map +0 -1
- package/dist/node/gitvault-publication.js.map +0 -1
- package/dist/node/gitvault-push-to-create.d.ts.map +0 -1
- package/dist/node/gitvault-push-to-create.js.map +0 -1
- package/dist/node/gitvault-recover.d.ts.map +0 -1
- package/dist/node/gitvault-recover.js.map +0 -1
- package/dist/node/gitvault-restore.d.ts.map +0 -1
- package/dist/node/gitvault-restore.js.map +0 -1
- package/dist/node/gitvault-snapshot.d.ts.map +0 -1
- package/dist/node/gitvault-snapshot.js.map +0 -1
- package/dist/node/gitvault-writer-state.d.ts.map +0 -1
- package/dist/node/gitvault-writer-state.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* vault D6 — named addressing resolution + id-pinning (repo-first-onramp
|
|
3
3
|
* task 4.5).
|
|
4
4
|
*
|
|
5
5
|
* Two things live here, both Node-only (local git state):
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
* was resolved from) in the repository's LOCAL git config
|
|
9
9
|
* (`git config --local` — this checkout's own `.git/config`, never
|
|
10
10
|
* global). "Local git state" per design D6's id-pinning paragraph.
|
|
11
|
-
* - `
|
|
12
|
-
* `
|
|
13
|
-
* address's form (id vs slug — {@link
|
|
11
|
+
* - `resolveVaultAddress`: the orchestrator the remote helper and
|
|
12
|
+
* `vault snapshot` drive — pinned id first, then dispatch on the
|
|
13
|
+
* address's form (id vs slug — {@link vaultRemoteAddressForm}), then
|
|
14
14
|
* (slug-form only, opt-in via `allow_create`) push-to-create on a miss.
|
|
15
15
|
*
|
|
16
16
|
* ID-PINNING RATIONALE (design D6, "resolved"): "on first contact the helper
|
|
@@ -27,11 +27,11 @@
|
|
|
27
27
|
* and no exposure to a later rename at all) — structurally better than a
|
|
28
28
|
* redirect, per the design's own framing.
|
|
29
29
|
*/
|
|
30
|
-
import { type
|
|
31
|
-
import type {
|
|
32
|
-
import type {
|
|
33
|
-
import type {
|
|
34
|
-
export interface
|
|
30
|
+
import { type VaultRemoteAddress } from "../namespaces/repos.js";
|
|
31
|
+
import type { VaultTransport } from "./vault-publication.js";
|
|
32
|
+
import type { VaultCreationResult } from "./vault-creation-journal.js";
|
|
33
|
+
import type { VaultKeystore } from "./vault-keystore.js";
|
|
34
|
+
export interface VaultPinnedRepo {
|
|
35
35
|
repo_id: string;
|
|
36
36
|
/** `null` if the pin predates this field, or was written by hand. */
|
|
37
37
|
resolved_from: {
|
|
@@ -46,18 +46,18 @@ export interface GitvaultPinnedRepo {
|
|
|
46
46
|
room: string | null;
|
|
47
47
|
}
|
|
48
48
|
/** Read this checkout's pinned `repo_id`, or `null` when nothing is pinned. */
|
|
49
|
-
export declare function
|
|
49
|
+
export declare function readPinnedVaultRepo(repoDir: string): Promise<VaultPinnedRepo | null>;
|
|
50
50
|
/**
|
|
51
51
|
* Pin `repo_id` into this checkout's LOCAL git config — and, when resolved
|
|
52
52
|
* from a slug-form address, the address it was resolved from (diagnostic
|
|
53
|
-
* only). `resolvedFrom` is omitted for an id-form pin (
|
|
53
|
+
* only). `resolvedFrom` is omitted for an id-form pin (vault-client-
|
|
54
54
|
* round-trips design D4): an id-form address has no org-slug/name pair to
|
|
55
|
-
* record, and — per {@link
|
|
55
|
+
* record, and — per {@link resolveVaultAddress}'s own doc comment — the
|
|
56
56
|
* design's instruction is that pinning "only resolves names"; id-form is
|
|
57
57
|
* already rename-proof, so this pin exists purely to skip the resolution
|
|
58
58
|
* ROUND TRIP, not to survive a rename.
|
|
59
59
|
*/
|
|
60
|
-
export declare function
|
|
60
|
+
export declare function pinVaultRepo(repoDir: string, repoId: string, resolvedFrom?: {
|
|
61
61
|
org_slug: string;
|
|
62
62
|
repo_name: string;
|
|
63
63
|
}, ids?: {
|
|
@@ -68,10 +68,10 @@ export declare function pinGitvaultRepo(repoDir: string, repoId: string, resolve
|
|
|
68
68
|
/**
|
|
69
69
|
* add-room-invite design D10: a bare `rooms join <key>` arrival standing
|
|
70
70
|
* inside a git repository pins `r402.orgId`/`r402.room` in this checkout's
|
|
71
|
-
* LOCAL git config — the SAME two keys {@link
|
|
71
|
+
* LOCAL git config — the SAME two keys {@link pinVaultRepo} writes
|
|
72
72
|
* alongside a vault's `r402.repoId` — but WITHOUT one, since a room-only
|
|
73
73
|
* join has no vault to pin. Read back by {@link readPinnedRoomBinding},
|
|
74
|
-
* independent of {@link
|
|
74
|
+
* independent of {@link readPinnedVaultRepo}'s own gate on `r402.repoId`
|
|
75
75
|
* being present (a room-only checkout never sets it, so that reader would
|
|
76
76
|
* otherwise see this pin as absent).
|
|
77
77
|
*/
|
|
@@ -84,19 +84,19 @@ export declare function readPinnedRoomBinding(repoDir: string): Promise<{
|
|
|
84
84
|
org_id: string | null;
|
|
85
85
|
room: string | null;
|
|
86
86
|
}>;
|
|
87
|
-
export interface
|
|
87
|
+
export interface VaultAddressResolution {
|
|
88
88
|
repo_id: string;
|
|
89
89
|
project_id: string;
|
|
90
90
|
org_id: string;
|
|
91
91
|
form: "id" | "slug";
|
|
92
92
|
/**
|
|
93
93
|
* How this resolution happened: a local git-config pin, the local
|
|
94
|
-
* keystore's own project→repo file (
|
|
95
|
-
* id-form only — {@link
|
|
94
|
+
* keystore's own project→repo file (vault-offline-clone-resolve,
|
|
95
|
+
* id-form only — {@link VaultKeystore.findRepoByProject}), a live
|
|
96
96
|
* network resolution, or a fresh push-to-create. `"pin"` and `"keystore"`
|
|
97
97
|
* are BOTH zero-transport-operation answers (see {@link offline}); they
|
|
98
98
|
* are kept distinct only so a caller that cares about provenance can tell
|
|
99
|
-
* them apart — {@link
|
|
99
|
+
* them apart — {@link recoverStaleVaultPin}'s generic `offline` check
|
|
100
100
|
* treats them identically.
|
|
101
101
|
*/
|
|
102
102
|
via: "pin" | "keystore" | "resolved" | "created";
|
|
@@ -108,34 +108,34 @@ export interface GitvaultAddressResolution {
|
|
|
108
108
|
/** Set only when THIS call push-to-created the vault (`via === "created"`); `null` otherwise. */
|
|
109
109
|
created: {
|
|
110
110
|
deduplicated: boolean;
|
|
111
|
-
recovery_receipt:
|
|
111
|
+
recovery_receipt: VaultCreationResult["recovery_receipt"];
|
|
112
112
|
genesis_sha256: string;
|
|
113
113
|
} | null;
|
|
114
114
|
/**
|
|
115
115
|
* `true` iff this resolution performed ZERO transport operations (an
|
|
116
116
|
* id-carrying pin). Stale-pin recovery is then the caller's to arm on the
|
|
117
|
-
* verb's first repo-scoped read — see {@link
|
|
117
|
+
* verb's first repo-scoped read — see {@link recoverStaleVaultPin}.
|
|
118
118
|
*/
|
|
119
119
|
offline: boolean;
|
|
120
120
|
}
|
|
121
|
-
export interface
|
|
122
|
-
keystore:
|
|
123
|
-
transport:
|
|
124
|
-
/** The parsed remote address (`
|
|
125
|
-
address:
|
|
121
|
+
export interface ResolveVaultAddressOptions {
|
|
122
|
+
keystore: VaultKeystore;
|
|
123
|
+
transport: VaultTransport;
|
|
124
|
+
/** The parsed remote address (`parseVaultRemoteUrl`'s output) — id-form or slug-form, undiscriminated. */
|
|
125
|
+
address: VaultRemoteAddress;
|
|
126
126
|
/** The local working tree, for reading/writing the pin. Omit for a repository-free read (e.g. `git ls-remote`) — pinning is then skipped, never a failure. */
|
|
127
127
|
repo_dir?: string;
|
|
128
|
-
/** Push-to-create on a slug-form miss (D6). `false` (the default) makes a miss an ordinary not-found refusal — the read-only path (`list`/`fetch`, `
|
|
128
|
+
/** Push-to-create on a slug-form miss (D6). `false` (the default) makes a miss an ordinary not-found refusal — the read-only path (`list`/`fetch`, `vault status`). */
|
|
129
129
|
allow_create?: boolean;
|
|
130
130
|
client_creation_id?: string;
|
|
131
131
|
service_public_key?: Uint8Array | string;
|
|
132
|
-
/** Fires once, only when THIS call allocated the vault (mirrors `
|
|
133
|
-
onVaultCreated?: (created: NonNullable<
|
|
132
|
+
/** Fires once, only when THIS call allocated the vault (mirrors `Repos.capture`'s `onVaultCreated`). */
|
|
133
|
+
onVaultCreated?: (created: NonNullable<VaultAddressResolution["created"]>) => void | Promise<void>;
|
|
134
134
|
/**
|
|
135
|
-
*
|
|
135
|
+
* vault-offline-clone-resolve (design D3): recovery-only. Skips BOTH
|
|
136
136
|
* local answers — the git-config pin AND the id-form keystore consult —
|
|
137
137
|
* forcing a genuine network resolution. Set exclusively by {@link
|
|
138
|
-
*
|
|
138
|
+
* recoverStaleVaultPin}'s internal re-resolve call: a stale local
|
|
139
139
|
* answer (a pin or a keystore file naming a repo that no longer resolves
|
|
140
140
|
* or is no longer ours) must never be allowed to answer the SAME stale
|
|
141
141
|
* fact back to itself, which is what would happen if recovery re-ran the
|
|
@@ -146,18 +146,18 @@ export interface ResolveGitvaultAddressOptions {
|
|
|
146
146
|
/**
|
|
147
147
|
* Resolve a parsed remote address to `{repo_id, project_id, org_id}`,
|
|
148
148
|
* pinning `repo_id` in local git state on the first successful resolution —
|
|
149
|
-
* of EITHER form (
|
|
149
|
+
* of EITHER form (vault-client-round-trips design D4 widens the
|
|
150
150
|
* pre-existing slug-form pin, task 4.5, to id-form too) — and, when
|
|
151
151
|
* `allow_create` is set and resolution misses, push-to-create it (task
|
|
152
152
|
* 4.4/4.5, design D6). A pinned id that no longer resolves (404) clears the
|
|
153
153
|
* pin and re-resolves ONCE through the ordinary form-dispatch path below,
|
|
154
154
|
* rather than failing on a stale local pointer.
|
|
155
155
|
*/
|
|
156
|
-
export declare function
|
|
156
|
+
export declare function resolveVaultAddress(options: ResolveVaultAddressOptions): Promise<VaultAddressResolution>;
|
|
157
157
|
/**
|
|
158
158
|
* Stale-pin recovery for OFFLINE resolutions (client-surface spec,
|
|
159
159
|
* "Id-form remotes pin repo_id like slug-form remotes"; widened by
|
|
160
|
-
*
|
|
160
|
+
* vault-offline-clone-resolve design D3 to the keystore-sourced offline
|
|
161
161
|
* answer too): a pin or a keystore hit resolves with no network read, so the
|
|
162
162
|
* once-in-a-lifetime stale case (a vault deleted and re-allocated out from
|
|
163
163
|
* under this checkout, or a keystore file left behind by an old allocation)
|
|
@@ -168,7 +168,7 @@ export declare function resolveGitvaultAddress(options: ResolveGitvaultAddressOp
|
|
|
168
168
|
* or `null` when there is nothing to recover:
|
|
169
169
|
*
|
|
170
170
|
* - a non-vault-absent error (anything outside the not-found family and the
|
|
171
|
-
* gateway's authorize-before-reveal `
|
|
171
|
+
* gateway's authorize-before-reveal `VAULT_ACCESS_DENIED` fold, which
|
|
172
172
|
* deliberately makes "gone" and "not yours" one envelope) → `null`,
|
|
173
173
|
* rethrow yours;
|
|
174
174
|
* - re-resolution yielding the SAME `repo_id` → the local answer was fine
|
|
@@ -189,14 +189,14 @@ export declare function resolveGitvaultAddress(options: ResolveGitvaultAddressOp
|
|
|
189
189
|
* Re-resolution failures are swallowed in favor of `null` (the caller's
|
|
190
190
|
* original error is the truthful one to surface).
|
|
191
191
|
*/
|
|
192
|
-
export declare function
|
|
193
|
-
keystore:
|
|
194
|
-
transport:
|
|
195
|
-
address:
|
|
192
|
+
export declare function recoverStaleVaultPin(options: {
|
|
193
|
+
keystore: VaultKeystore;
|
|
194
|
+
transport: VaultTransport;
|
|
195
|
+
address: VaultRemoteAddress;
|
|
196
196
|
repo_dir: string;
|
|
197
197
|
/** The offline resolution the failing verb ran under. */
|
|
198
|
-
resolution:
|
|
198
|
+
resolution: VaultAddressResolution;
|
|
199
199
|
/** The verb's failure. */
|
|
200
200
|
error: unknown;
|
|
201
|
-
}): Promise<
|
|
202
|
-
//# sourceMappingURL=
|
|
201
|
+
}): Promise<VaultAddressResolution | null>;
|
|
202
|
+
//# sourceMappingURL=vault-address.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-address.d.ts","sourceRoot":"","sources":["../../src/node/vault-address.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* vault D6 — named addressing resolution + id-pinning (repo-first-onramp
|
|
3
3
|
* task 4.5).
|
|
4
4
|
*
|
|
5
5
|
* Two things live here, both Node-only (local git state):
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
* was resolved from) in the repository's LOCAL git config
|
|
9
9
|
* (`git config --local` — this checkout's own `.git/config`, never
|
|
10
10
|
* global). "Local git state" per design D6's id-pinning paragraph.
|
|
11
|
-
* - `
|
|
12
|
-
* `
|
|
13
|
-
* address's form (id vs slug — {@link
|
|
11
|
+
* - `resolveVaultAddress`: the orchestrator the remote helper and
|
|
12
|
+
* `vault snapshot` drive — pinned id first, then dispatch on the
|
|
13
|
+
* address's form (id vs slug — {@link vaultRemoteAddressForm}), then
|
|
14
14
|
* (slug-form only, opt-in via `allow_create`) push-to-create on a miss.
|
|
15
15
|
*
|
|
16
16
|
* ID-PINNING RATIONALE (design D6, "resolved"): "on first contact the helper
|
|
@@ -27,14 +27,14 @@
|
|
|
27
27
|
* and no exposure to a later rename at all) — structurally better than a
|
|
28
28
|
* redirect, per the design's own framing.
|
|
29
29
|
*/
|
|
30
|
-
import { hardenedGit } from "./
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
30
|
+
import { hardenedGit } from "./vault-snapshot.js";
|
|
31
|
+
import { vaultRemoteAddressForm } from "../namespaces/repos.js";
|
|
32
|
+
import { pushToCreateVault } from "./vault-push-to-create.js";
|
|
33
33
|
const CONFIG_KEY_REPO_ID = "r402.repoId";
|
|
34
34
|
/** The `org-slug/name` text the pin was resolved from — diagnostic only; resolution never reads it back. */
|
|
35
35
|
const CONFIG_KEY_ADDRESS = "r402.repoAddress";
|
|
36
36
|
/**
|
|
37
|
-
* The resolved ids beside the pin (
|
|
37
|
+
* The resolved ids beside the pin (vault-force-spelling-and-pin-fold).
|
|
38
38
|
* A pin carrying BOTH resolves fully OFFLINE — zero transport operations —
|
|
39
39
|
* which is what removes the standing per-invocation validation read; a
|
|
40
40
|
* legacy pin without them self-upgrades through one validation read.
|
|
@@ -45,9 +45,9 @@ const CONFIG_KEY_ORG_ID = "r402.orgId";
|
|
|
45
45
|
* kygit-handoff design D10: the coordination-room key, written ALONGSIDE
|
|
46
46
|
* `r402.projectId` (same value — a project's DEFAULT room is keyed by its
|
|
47
47
|
* project id, p0016) so `cli/lib/org-context.mjs`'s room resolution has a
|
|
48
|
-
* dedicated config key to read rather than special-casing
|
|
48
|
+
* dedicated config key to read rather than special-casing vault's own
|
|
49
49
|
* `r402.projectId` name. Every existing pin site gets this for free, not
|
|
50
|
-
* just `resume` — one write, every
|
|
50
|
+
* just `resume` — one write, every vault checkout benefits.
|
|
51
51
|
*/
|
|
52
52
|
const CONFIG_KEY_ROOM = "r402.room";
|
|
53
53
|
async function readLocalGitConfig(repoDir, key) {
|
|
@@ -63,7 +63,7 @@ async function readLocalGitConfig(repoDir, key) {
|
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
/** Read this checkout's pinned `repo_id`, or `null` when nothing is pinned. */
|
|
66
|
-
export async function
|
|
66
|
+
export async function readPinnedVaultRepo(repoDir) {
|
|
67
67
|
const repoId = await readLocalGitConfig(repoDir, CONFIG_KEY_REPO_ID);
|
|
68
68
|
if (!repoId)
|
|
69
69
|
return null;
|
|
@@ -78,14 +78,14 @@ export async function readPinnedGitvaultRepo(repoDir) {
|
|
|
78
78
|
/**
|
|
79
79
|
* Pin `repo_id` into this checkout's LOCAL git config — and, when resolved
|
|
80
80
|
* from a slug-form address, the address it was resolved from (diagnostic
|
|
81
|
-
* only). `resolvedFrom` is omitted for an id-form pin (
|
|
81
|
+
* only). `resolvedFrom` is omitted for an id-form pin (vault-client-
|
|
82
82
|
* round-trips design D4): an id-form address has no org-slug/name pair to
|
|
83
|
-
* record, and — per {@link
|
|
83
|
+
* record, and — per {@link resolveVaultAddress}'s own doc comment — the
|
|
84
84
|
* design's instruction is that pinning "only resolves names"; id-form is
|
|
85
85
|
* already rename-proof, so this pin exists purely to skip the resolution
|
|
86
86
|
* ROUND TRIP, not to survive a rename.
|
|
87
87
|
*/
|
|
88
|
-
export async function
|
|
88
|
+
export async function pinVaultRepo(repoDir, repoId, resolvedFrom, ids) {
|
|
89
89
|
await hardenedGit(repoDir, ["config", "--local", CONFIG_KEY_REPO_ID, repoId]);
|
|
90
90
|
if (resolvedFrom)
|
|
91
91
|
await hardenedGit(repoDir, ["config", "--local", CONFIG_KEY_ADDRESS, `${resolvedFrom.org_slug}/${resolvedFrom.repo_name}`]);
|
|
@@ -102,10 +102,10 @@ export async function pinGitvaultRepo(repoDir, repoId, resolvedFrom, ids) {
|
|
|
102
102
|
/**
|
|
103
103
|
* add-room-invite design D10: a bare `rooms join <key>` arrival standing
|
|
104
104
|
* inside a git repository pins `r402.orgId`/`r402.room` in this checkout's
|
|
105
|
-
* LOCAL git config — the SAME two keys {@link
|
|
105
|
+
* LOCAL git config — the SAME two keys {@link pinVaultRepo} writes
|
|
106
106
|
* alongside a vault's `r402.repoId` — but WITHOUT one, since a room-only
|
|
107
107
|
* join has no vault to pin. Read back by {@link readPinnedRoomBinding},
|
|
108
|
-
* independent of {@link
|
|
108
|
+
* independent of {@link readPinnedVaultRepo}'s own gate on `r402.repoId`
|
|
109
109
|
* being present (a room-only checkout never sets it, so that reader would
|
|
110
110
|
* otherwise see this pin as absent).
|
|
111
111
|
*/
|
|
@@ -120,7 +120,7 @@ export async function readPinnedRoomBinding(repoDir) {
|
|
|
120
120
|
return { org_id, room };
|
|
121
121
|
}
|
|
122
122
|
/** Clear a pin this checkout no longer trusts (design D4: a pinned id that 404s). Tolerates an absent key — `git config --unset` on a key that was never set is not a failure here. */
|
|
123
|
-
async function
|
|
123
|
+
async function clearPinnedVaultRepo(repoDir) {
|
|
124
124
|
for (const key of [CONFIG_KEY_REPO_ID, CONFIG_KEY_ADDRESS, CONFIG_KEY_PROJECT_ID, CONFIG_KEY_ORG_ID, CONFIG_KEY_ROOM]) {
|
|
125
125
|
try {
|
|
126
126
|
await hardenedGit(repoDir, ["config", "--local", "--unset", key]);
|
|
@@ -138,16 +138,16 @@ function isPinStale(e) {
|
|
|
138
138
|
/**
|
|
139
139
|
* Resolve a parsed remote address to `{repo_id, project_id, org_id}`,
|
|
140
140
|
* pinning `repo_id` in local git state on the first successful resolution —
|
|
141
|
-
* of EITHER form (
|
|
141
|
+
* of EITHER form (vault-client-round-trips design D4 widens the
|
|
142
142
|
* pre-existing slug-form pin, task 4.5, to id-form too) — and, when
|
|
143
143
|
* `allow_create` is set and resolution misses, push-to-create it (task
|
|
144
144
|
* 4.4/4.5, design D6). A pinned id that no longer resolves (404) clears the
|
|
145
145
|
* pin and re-resolves ONCE through the ordinary form-dispatch path below,
|
|
146
146
|
* rather than failing on a stale local pointer.
|
|
147
147
|
*/
|
|
148
|
-
export async function
|
|
148
|
+
export async function resolveVaultAddress(options) {
|
|
149
149
|
if (options.repo_dir && !options.bypass_local_answers) {
|
|
150
|
-
const pinned = await
|
|
150
|
+
const pinned = await readPinnedVaultRepo(options.repo_dir);
|
|
151
151
|
if (pinned) {
|
|
152
152
|
// `form` below describes what THIS call was asked to resolve, not how
|
|
153
153
|
// the pin originally came to exist (`resolved_from` alone can't tell —
|
|
@@ -157,39 +157,39 @@ export async function resolveGitvaultAddress(options) {
|
|
|
157
157
|
// Id-carrying pin: fully OFFLINE — zero transport operations. The
|
|
158
158
|
// stale-pin case (the vault deleted out from under this checkout)
|
|
159
159
|
// surfaces on the verb's first repo-scoped read instead; the caller
|
|
160
|
-
// arms {@link
|
|
160
|
+
// arms {@link recoverStaleVaultPin} for that (client-surface
|
|
161
161
|
// spec, "Id-form remotes pin repo_id like slug-form remotes").
|
|
162
|
-
return { repo_id: pinned.repo_id, project_id: pinned.project_id, org_id: pinned.org_id, form:
|
|
162
|
+
return { repo_id: pinned.repo_id, project_id: pinned.project_id, org_id: pinned.org_id, form: vaultRemoteAddressForm(options.address), via: "pin", address: pinned.resolved_from, created: null, offline: true };
|
|
163
163
|
}
|
|
164
164
|
try {
|
|
165
165
|
// Legacy id-less pin: one validation read, then REWRITE the pin with
|
|
166
166
|
// the ids so every later invocation on this checkout is offline —
|
|
167
167
|
// self-upgrading, no migration step.
|
|
168
168
|
const record = await options.transport.getVaultRecord({ repo_id: pinned.repo_id });
|
|
169
|
-
await
|
|
170
|
-
return { repo_id: record.repo_id, project_id: record.project_id, org_id: record.org_id, form:
|
|
169
|
+
await pinVaultRepo(options.repo_dir, record.repo_id, pinned.resolved_from ?? undefined, { project_id: record.project_id, org_id: record.org_id });
|
|
170
|
+
return { repo_id: record.repo_id, project_id: record.project_id, org_id: record.org_id, form: vaultRemoteAddressForm(options.address), via: "pin", address: pinned.resolved_from, created: null, offline: false };
|
|
171
171
|
}
|
|
172
172
|
catch (e) {
|
|
173
173
|
if (!isPinStale(e))
|
|
174
174
|
throw e;
|
|
175
|
-
await
|
|
175
|
+
await clearPinnedVaultRepo(options.repo_dir);
|
|
176
176
|
// fall through to an ordinary (non-pinned) resolution, below
|
|
177
177
|
}
|
|
178
178
|
}
|
|
179
179
|
}
|
|
180
|
-
const form =
|
|
180
|
+
const form = vaultRemoteAddressForm(options.address);
|
|
181
181
|
if (form === "id") {
|
|
182
182
|
if (!options.bypass_local_answers) {
|
|
183
|
-
//
|
|
183
|
+
// vault-offline-clone-resolve (design D1/D2): consult the LOCAL
|
|
184
184
|
// keystore before the network. D2's completeness argument: decrypting
|
|
185
185
|
// anything from this vault requires exactly the keystore's repo file
|
|
186
186
|
// (`k_repo_hex`), so a machine without one fails the clone at
|
|
187
|
-
// `
|
|
187
|
+
// `VAULT_REPO_STATE_MISSING` no matter how resolution went —
|
|
188
188
|
// "keystore-known" is therefore exactly the set of clones that can
|
|
189
189
|
// actually complete, and the network read was only ever confirming a
|
|
190
190
|
// fact this machine already held (110-530ms of RTT for 13-22ms of
|
|
191
191
|
// server work). An id-form address always
|
|
192
|
-
// carries a real `org_id` (see `
|
|
192
|
+
// carries a real `org_id` (see `vaultRemoteAddressForm`), so the
|
|
193
193
|
// lookup is always org-scoped — a project-id match under a different
|
|
194
194
|
// org is a miss, never a guess. Deliberately runs even with NO
|
|
195
195
|
// `repo_dir` (a repo-free `git ls-remote`): the keystore is
|
|
@@ -198,14 +198,14 @@ export async function resolveGitvaultAddress(options) {
|
|
|
198
198
|
if (keystoreMatch) {
|
|
199
199
|
// Same offline handle shape the git-config pin branch above builds;
|
|
200
200
|
// `via: "keystore"` is the only distinguishing mark, so {@link
|
|
201
|
-
//
|
|
201
|
+
// recoverStaleVaultPin}'s generic `resolution.offline` check
|
|
202
202
|
// covers this source unchanged. The git-config pin is written
|
|
203
203
|
// immediately — "on first successful use" of this answer, exactly
|
|
204
204
|
// where the network-resolved branch below writes it — so every
|
|
205
205
|
// LATER invocation on this checkout short-circuits through the pin
|
|
206
206
|
// check above instead of this keystore scan.
|
|
207
207
|
if (options.repo_dir)
|
|
208
|
-
await
|
|
208
|
+
await pinVaultRepo(options.repo_dir, keystoreMatch.repo_id, undefined, { project_id: keystoreMatch.project_id, org_id: keystoreMatch.org_id });
|
|
209
209
|
return { repo_id: keystoreMatch.repo_id, project_id: keystoreMatch.project_id, org_id: keystoreMatch.org_id, form: "id", via: "keystore", address: null, created: null, offline: true };
|
|
210
210
|
}
|
|
211
211
|
}
|
|
@@ -217,17 +217,17 @@ export async function resolveGitvaultAddress(options) {
|
|
|
217
217
|
// needed at all; id-form gets one anyway because the round trip itself
|
|
218
218
|
// is the cost this change removes.
|
|
219
219
|
if (options.repo_dir)
|
|
220
|
-
await
|
|
220
|
+
await pinVaultRepo(options.repo_dir, record.repo_id, undefined, { project_id: record.project_id, org_id: record.org_id });
|
|
221
221
|
return { repo_id: record.repo_id, project_id: record.project_id, org_id: record.org_id, form: "id", via: "resolved", address: null, created: null, offline: false };
|
|
222
222
|
}
|
|
223
223
|
const orgSlug = options.address.org_id;
|
|
224
224
|
const repoName = options.address.project_id;
|
|
225
|
-
// `allow_create` delegates straight to `
|
|
225
|
+
// `allow_create` delegates straight to `pushToCreateVault`, which
|
|
226
226
|
// already opens with its OWN fast-path `findVaultByRepo` read (step 1 of
|
|
227
227
|
// its own doc comment) — probing here first too would just double the
|
|
228
228
|
// network read on every ordinary (non-creating) push.
|
|
229
229
|
if (options.allow_create) {
|
|
230
|
-
const result = await
|
|
230
|
+
const result = await pushToCreateVault({
|
|
231
231
|
keystore: options.keystore,
|
|
232
232
|
transport: options.transport,
|
|
233
233
|
org_slug: orgSlug,
|
|
@@ -236,7 +236,7 @@ export async function resolveGitvaultAddress(options) {
|
|
|
236
236
|
...(options.service_public_key !== undefined ? { service_public_key: options.service_public_key } : {}),
|
|
237
237
|
});
|
|
238
238
|
if (options.repo_dir)
|
|
239
|
-
await
|
|
239
|
+
await pinVaultRepo(options.repo_dir, result.repo_id, { org_slug: orgSlug, repo_name: repoName }, { project_id: result.project_id, org_id: result.org_id });
|
|
240
240
|
if (!result.found && result.created)
|
|
241
241
|
await options.onVaultCreated?.(result.created);
|
|
242
242
|
return { repo_id: result.repo_id, project_id: result.project_id, org_id: result.org_id, form: "slug", via: result.found ? "resolved" : "created", address: { org_slug: orgSlug, repo_name: repoName }, created: result.created, offline: false };
|
|
@@ -246,13 +246,13 @@ export async function resolveGitvaultAddress(options) {
|
|
|
246
246
|
// auto-followed and rethrows unchanged either way.
|
|
247
247
|
const record = await options.transport.findVaultByRepo({ org_slug: orgSlug, repo_name: repoName });
|
|
248
248
|
if (options.repo_dir)
|
|
249
|
-
await
|
|
249
|
+
await pinVaultRepo(options.repo_dir, record.repo_id, { org_slug: orgSlug, repo_name: repoName }, { project_id: record.project_id, org_id: record.org_id });
|
|
250
250
|
return { repo_id: record.repo_id, project_id: record.project_id, org_id: record.org_id, form: "slug", via: "resolved", address: { org_slug: orgSlug, repo_name: repoName }, created: null, offline: false };
|
|
251
251
|
}
|
|
252
252
|
/**
|
|
253
253
|
* Stale-pin recovery for OFFLINE resolutions (client-surface spec,
|
|
254
254
|
* "Id-form remotes pin repo_id like slug-form remotes"; widened by
|
|
255
|
-
*
|
|
255
|
+
* vault-offline-clone-resolve design D3 to the keystore-sourced offline
|
|
256
256
|
* answer too): a pin or a keystore hit resolves with no network read, so the
|
|
257
257
|
* once-in-a-lifetime stale case (a vault deleted and re-allocated out from
|
|
258
258
|
* under this checkout, or a keystore file left behind by an old allocation)
|
|
@@ -263,7 +263,7 @@ export async function resolveGitvaultAddress(options) {
|
|
|
263
263
|
* or `null` when there is nothing to recover:
|
|
264
264
|
*
|
|
265
265
|
* - a non-vault-absent error (anything outside the not-found family and the
|
|
266
|
-
* gateway's authorize-before-reveal `
|
|
266
|
+
* gateway's authorize-before-reveal `VAULT_ACCESS_DENIED` fold, which
|
|
267
267
|
* deliberately makes "gone" and "not yours" one envelope) → `null`,
|
|
268
268
|
* rethrow yours;
|
|
269
269
|
* - re-resolution yielding the SAME `repo_id` → the local answer was fine
|
|
@@ -284,20 +284,20 @@ export async function resolveGitvaultAddress(options) {
|
|
|
284
284
|
* Re-resolution failures are swallowed in favor of `null` (the caller's
|
|
285
285
|
* original error is the truthful one to surface).
|
|
286
286
|
*/
|
|
287
|
-
export async function
|
|
287
|
+
export async function recoverStaleVaultPin(options) {
|
|
288
288
|
if (!options.resolution.offline)
|
|
289
289
|
return null;
|
|
290
290
|
const err = options.error;
|
|
291
|
-
const vaultAbsentSignal = Boolean(err && (isPinStale(err) || err.code === "
|
|
291
|
+
const vaultAbsentSignal = Boolean(err && (isPinStale(err) || err.code === "VAULT_ACCESS_DENIED" || err.status === 403));
|
|
292
292
|
if (!vaultAbsentSignal)
|
|
293
293
|
return null;
|
|
294
294
|
try {
|
|
295
|
-
await
|
|
296
|
-
const fresh = await
|
|
295
|
+
await clearPinnedVaultRepo(options.repo_dir);
|
|
296
|
+
const fresh = await resolveVaultAddress({ keystore: options.keystore, transport: options.transport, address: options.address, repo_dir: options.repo_dir, bypass_local_answers: true });
|
|
297
297
|
return fresh.repo_id === options.resolution.repo_id ? null : fresh;
|
|
298
298
|
}
|
|
299
299
|
catch {
|
|
300
300
|
return null;
|
|
301
301
|
}
|
|
302
302
|
}
|
|
303
|
-
//# sourceMappingURL=
|
|
303
|
+
//# sourceMappingURL=vault-address.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-address.js","sourceRoot":"","sources":["../../src/node/vault-address.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The
|
|
2
|
+
* The vault deploy lane, supplied at last (change `vault-deploy-lane`).
|
|
3
3
|
*
|
|
4
|
-
* `add-
|
|
5
|
-
* supplied one, so a project whose `
|
|
4
|
+
* `add-vault` 5.6 built `runVaultDeploy` with the lane INJECTED and never
|
|
5
|
+
* supplied one, so a project whose `vault_policy` is `required` could not be
|
|
6
6
|
* deployed by any published client. This module is that supplier, plus the
|
|
7
7
|
* entry point the CLI calls in place of a bare `apply()`:
|
|
8
8
|
*
|
|
@@ -12,11 +12,11 @@
|
|
|
12
12
|
* than reassembling it. Warning gating, CAS dedup, event emission, asset
|
|
13
13
|
* re-plan, and terminal polling are the same code every other deploy runs;
|
|
14
14
|
* the only difference is two extra wire fields.
|
|
15
|
-
* - {@link
|
|
15
|
+
* - {@link applyWithVault} decides whether any of that happens at all. A
|
|
16
16
|
* project that is not `required` takes the untouched path: no capture, no
|
|
17
17
|
* token, no extra refusal, one policy read.
|
|
18
18
|
*
|
|
19
|
-
* THE COROUTINE, because it is the non-obvious part. `
|
|
19
|
+
* THE COROUTINE, because it is the non-obvious part. `runVaultDeploy` wants
|
|
20
20
|
* two separable steps (plan, then commit) with the vault push running between
|
|
21
21
|
* them; `Deploy.apply()` is one call. The lane bridges them with a pair of
|
|
22
22
|
* deferreds: `apply()`'s `authorize` hook fires once the plan exists and its
|
|
@@ -27,18 +27,18 @@
|
|
|
27
27
|
*/
|
|
28
28
|
import { type NextAction } from "../errors.js";
|
|
29
29
|
import type { Deploy } from "../namespaces/deploy.js";
|
|
30
|
-
import type {
|
|
30
|
+
import type { Repos } from "../namespaces/repos.js";
|
|
31
31
|
import type { ApplyOptions, DeployResult, LegacyWarningEntry, ReleaseSpec } from "../namespaces/deploy.types.js";
|
|
32
|
-
import type {
|
|
32
|
+
import type { VaultDeployLane, VaultDeployResult } from "./vault-deploy.js";
|
|
33
33
|
export interface ApplyDeployLaneOptions {
|
|
34
34
|
/** The apply engine (`r._applyEngine`). */
|
|
35
35
|
engine: Deploy;
|
|
36
36
|
spec: ReleaseSpec;
|
|
37
37
|
/** Everything a normal `apply()` takes: events, idempotency key, warning wallets. */
|
|
38
|
-
apply?: Omit<ApplyOptions, "
|
|
38
|
+
apply?: Omit<ApplyOptions, "vault">;
|
|
39
39
|
}
|
|
40
|
-
/** A lane that is also cancellable, because `
|
|
41
|
-
export interface ApplyDeployLane extends
|
|
40
|
+
/** A lane that is also cancellable, because `runVaultDeploy` may never commit. */
|
|
41
|
+
export interface ApplyDeployLane extends VaultDeployLane {
|
|
42
42
|
/**
|
|
43
43
|
* Tell the in-flight apply that no commit is coming. Safe to call always —
|
|
44
44
|
* a no-op once the apply has settled — and safe to call twice.
|
|
@@ -48,8 +48,8 @@ export interface ApplyDeployLane extends GitvaultDeployLane {
|
|
|
48
48
|
result(): DeployResult | null;
|
|
49
49
|
}
|
|
50
50
|
export declare function createApplyDeployLane(options: ApplyDeployLaneOptions): ApplyDeployLane;
|
|
51
|
-
/** What the deploy did about
|
|
52
|
-
export type
|
|
51
|
+
/** What the deploy did about vault, and why. */
|
|
52
|
+
export type VaultApplyMode =
|
|
53
53
|
/** No vault, or the policy read did not resolve — the plain path ran. */
|
|
54
54
|
{
|
|
55
55
|
kind: "none";
|
|
@@ -61,9 +61,9 @@ export type GitvaultApplyMode =
|
|
|
61
61
|
repo_id: string;
|
|
62
62
|
}
|
|
63
63
|
/**
|
|
64
|
-
* A vault exists but `
|
|
64
|
+
* A vault exists but `vault_policy` was never set either way — D3:
|
|
65
65
|
* allocating a vault no longer flips the policy, so this is the ordinary
|
|
66
|
-
* shape for a project whose vault came from `run402
|
|
66
|
+
* shape for a project whose vault came from `run402 repos create` (or a
|
|
67
67
|
* lazy first push) and nobody has opted into gating deploys yet. The plain
|
|
68
68
|
* path ran, and the DeployResult carries the offer/warning (see
|
|
69
69
|
* {@link decorateUngatedResult}).
|
|
@@ -78,23 +78,23 @@ export type GitvaultApplyMode =
|
|
|
78
78
|
repo_id: string;
|
|
79
79
|
};
|
|
80
80
|
/** `run402 repos policy required` — the offer D3 attaches to every ungated deploy. */
|
|
81
|
-
export declare function
|
|
81
|
+
export declare function vaultPolicyRequiredNextAction(repoId: string): NextAction;
|
|
82
82
|
/** The standing `warnings[]` entry D3 attaches to every ungated deploy, until the policy is set either way. */
|
|
83
|
-
export declare function
|
|
84
|
-
export interface
|
|
85
|
-
mode:
|
|
83
|
+
export declare function vaultUngatedWarning(repoId: string): LegacyWarningEntry;
|
|
84
|
+
export interface ApplyWithVaultResult {
|
|
85
|
+
mode: VaultApplyMode;
|
|
86
86
|
/** The deploy result. `null` when a vaulted deploy did not reach a commit. */
|
|
87
87
|
deploy: DeployResult | null;
|
|
88
88
|
/** The five-outcome envelope. `null` on every non-`required` path. */
|
|
89
|
-
|
|
89
|
+
vault: VaultDeployResult | null;
|
|
90
90
|
}
|
|
91
|
-
export interface
|
|
91
|
+
export interface ApplyWithVaultOptions {
|
|
92
92
|
sdk: {
|
|
93
93
|
_applyEngine: Deploy;
|
|
94
|
-
|
|
94
|
+
repos: Repos;
|
|
95
95
|
};
|
|
96
96
|
spec: ReleaseSpec;
|
|
97
|
-
apply?: Omit<ApplyOptions, "
|
|
97
|
+
apply?: Omit<ApplyOptions, "vault">;
|
|
98
98
|
/** The work tree to capture. Defaults to the process cwd. */
|
|
99
99
|
repo_dir?: string;
|
|
100
100
|
/** Override the keystore root (tests, non-default profiles). */
|
|
@@ -106,18 +106,18 @@ export interface ApplyWithGitvaultOptions {
|
|
|
106
106
|
/**
|
|
107
107
|
* Capture a dirty tree anyway. Default `false` — a dirty work tree refuses
|
|
108
108
|
* `SNAPSHOT_DIRTY_TREE` before this deploy's capture runs at all (same
|
|
109
|
-
* default as the manual `repos
|
|
109
|
+
* default as the manual `repos capture` lane; see `vault-snapshot.ts`).
|
|
110
110
|
* Has no effect on a `none`/`grandfathered`/`ungated` deploy, which never
|
|
111
111
|
* captures.
|
|
112
112
|
*/
|
|
113
113
|
allowDirty?: boolean;
|
|
114
|
-
/** Receives the `
|
|
114
|
+
/** Receives the `vault_commit` line the moment the snapshot exists. */
|
|
115
115
|
onCommitLine?: (line: string) => void;
|
|
116
116
|
/** Target passthrough; a Core target never engages the vault lane. */
|
|
117
117
|
target?: "cloud" | "core";
|
|
118
118
|
}
|
|
119
119
|
/**
|
|
120
|
-
* Deploy, taking the project's `
|
|
120
|
+
* Deploy, taking the project's `vault_policy` into account.
|
|
121
121
|
*
|
|
122
122
|
* NOT `required` — no vault, an unreadable policy, a Core target, or an
|
|
123
123
|
* explicit `grandfathered` — runs `apply()` with the caller's own options and
|
|
@@ -125,5 +125,5 @@ export interface ApplyWithGitvaultOptions {
|
|
|
125
125
|
* user's deploy, and the only cost this function may add to it is the single
|
|
126
126
|
* policy read that determines the project is not `required`.
|
|
127
127
|
*/
|
|
128
|
-
export declare function
|
|
129
|
-
//# sourceMappingURL=
|
|
128
|
+
export declare function applyWithVault(options: ApplyWithVaultOptions): Promise<ApplyWithVaultResult>;
|
|
129
|
+
//# sourceMappingURL=vault-apply.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-apply.d.ts","sourceRoot":"","sources":["../../src/node/vault-apply.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EAEZ,kBAAkB,EAClB,WAAW,EACZ,MAAM,+BAA+B,CAAC;AAEvC,OAAO,KAAK,EACV,eAAe,EAGf,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAsB3B,MAAM,WAAW,sBAAsB;IACrC,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,WAAW,CAAC;IAClB,qFAAqF;IACrF,KAAK,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,kFAAkF;AAClF,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD;;;OAGG;IACH,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,4EAA4E;IAC5E,MAAM,IAAI,YAAY,GAAG,IAAI,CAAC;CAC/B;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CA2DtF;AAiBD,gDAAgD;AAChD,MAAM,MAAM,cAAc;AACxB,yEAAyE;AACvE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,GAAG,mBAAmB,CAAA;CAAE;AAC5D,6EAA6E;GAC3E;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAC5C;;;;;;;GAOG;GACD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACtC,iEAAiE;GAC/D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,sFAAsF;AACtF,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAMxE;AAED,+GAA+G;AAC/G,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAQtE;AAWD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,cAAc,CAAC;IACrB,8EAA8E;IAC9E,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,sEAAsE;IACtE,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC;IAC5C,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACpC,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,eAAe,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uEAAuE;IACvE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,sEAAsE;IACtE,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAuDlG"}
|