@cotal-ai/auth 0.12.0 → 0.13.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/dist/admission-mediator.d.ts +319 -0
- package/dist/admission-mediator.d.ts.map +1 -0
- package/dist/admission-mediator.js +1033 -0
- package/dist/admission-mediator.js.map +1 -0
- package/dist/auth-admin.d.ts +29 -0
- package/dist/auth-admin.d.ts.map +1 -0
- package/dist/auth-admin.js +224 -0
- package/dist/auth-admin.js.map +1 -0
- package/dist/authority-client.d.ts +215 -0
- package/dist/authority-client.d.ts.map +1 -0
- package/dist/authority-client.js +346 -0
- package/dist/authority-client.js.map +1 -0
- package/dist/barrier-evict.d.ts +16 -0
- package/dist/barrier-evict.d.ts.map +1 -0
- package/dist/barrier-evict.js +100 -0
- package/dist/barrier-evict.js.map +1 -0
- package/dist/connect-reader.d.ts +72 -0
- package/dist/connect-reader.d.ts.map +1 -0
- package/dist/connect-reader.js +154 -0
- package/dist/connect-reader.js.map +1 -0
- package/dist/continuity.d.ts.map +1 -1
- package/dist/continuity.js +3 -0
- package/dist/continuity.js.map +1 -1
- package/dist/credential-ledger.d.ts +343 -0
- package/dist/credential-ledger.d.ts.map +1 -0
- package/dist/credential-ledger.js +732 -0
- package/dist/credential-ledger.js.map +1 -0
- package/dist/drain-repair.d.ts +95 -0
- package/dist/drain-repair.d.ts.map +1 -0
- package/dist/drain-repair.js +305 -0
- package/dist/drain-repair.js.map +1 -0
- package/dist/idp.d.ts +19 -0
- package/dist/idp.d.ts.map +1 -1
- package/dist/idp.js +17 -0
- package/dist/idp.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -2
- package/dist/index.js.map +1 -1
- package/dist/issuer.d.ts +8 -0
- package/dist/issuer.d.ts.map +1 -1
- package/dist/issuer.js +4 -2
- package/dist/issuer.js.map +1 -1
- package/dist/ledger-scanner.d.ts +98 -0
- package/dist/ledger-scanner.d.ts.map +1 -0
- package/dist/ledger-scanner.js +352 -0
- package/dist/ledger-scanner.js.map +1 -0
- package/dist/ledger.d.ts +7 -0
- package/dist/ledger.d.ts.map +1 -1
- package/dist/ledger.js +53 -5
- package/dist/ledger.js.map +1 -1
- package/dist/lifecycle-registry.d.ts +397 -0
- package/dist/lifecycle-registry.d.ts.map +1 -0
- package/dist/lifecycle-registry.js +819 -0
- package/dist/lifecycle-registry.js.map +1 -0
- package/dist/permissions.d.ts +5 -1
- package/dist/permissions.d.ts.map +1 -1
- package/dist/permissions.js +29 -6
- package/dist/permissions.js.map +1 -1
- package/dist/plane-claim.d.ts +83 -0
- package/dist/plane-claim.d.ts.map +1 -0
- package/dist/plane-claim.js +290 -0
- package/dist/plane-claim.js.map +1 -0
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +2 -1
- package/dist/provider.js.map +1 -1
- package/dist/records-scanner.d.ts +78 -0
- package/dist/records-scanner.d.ts.map +1 -0
- package/dist/records-scanner.js +320 -0
- package/dist/records-scanner.js.map +1 -0
- package/dist/retirement-barrier.d.ts +217 -0
- package/dist/retirement-barrier.d.ts.map +1 -0
- package/dist/retirement-barrier.js +624 -0
- package/dist/retirement-barrier.js.map +1 -0
- package/dist/retirement-cleaner.d.ts +54 -0
- package/dist/retirement-cleaner.d.ts.map +1 -0
- package/dist/retirement-cleaner.js +158 -0
- package/dist/retirement-cleaner.js.map +1 -0
- package/dist/root-credential.d.ts +26 -0
- package/dist/root-credential.d.ts.map +1 -0
- package/dist/root-credential.js +116 -0
- package/dist/root-credential.js.map +1 -0
- package/dist/service.d.ts +60 -0
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +317 -10
- package/dist/service.js.map +1 -1
- package/dist/session-ledger.d.ts +224 -0
- package/dist/session-ledger.d.ts.map +1 -0
- package/dist/session-ledger.js +713 -0
- package/dist/session-ledger.js.map +1 -0
- package/dist/token.d.ts +17 -0
- package/dist/token.d.ts.map +1 -1
- package/dist/token.js +30 -2
- package/dist/token.js.map +1 -1
- package/package.json +5 -3
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The D7 SESSION production auth adapter (SPEC §13.6/§13.12): the first REAL-KV implementation
|
|
3
|
+
* of core's session seams — the {@link SessionLedger} over `session.<sessionId>` rows in the
|
|
4
|
+
* per-space auth store (`cotal_auth_<space>`, `allow_direct=false`, so every read here is
|
|
5
|
+
* leader-served by construction), and the {@link SessionRedemptionHooks} the redemption seam
|
|
6
|
+
* drives: leader-served lifecycle-gate observation, the REVISION-PINNED two-gate stage (the
|
|
7
|
+
* §13.1 fence, the same touch-CAS discipline as the D4 issuance gate: the gate write IS the
|
|
8
|
+
* fence, a moved gate makes the pinned write LOSE), deterministic per-party credential release
|
|
9
|
+
* (Ed25519 JWTs are deterministic, so the idempotent lost-response retry returns the SAME
|
|
10
|
+
* bytes with no secret stored), idempotent revocation marks, the authenticated close op, and
|
|
11
|
+
* the expiry sweep driver.
|
|
12
|
+
*
|
|
13
|
+
* Authority boundaries this module PINS (core enforces the ordering; this adapter makes it
|
|
14
|
+
* durable):
|
|
15
|
+
* - the `issuing` create IS the one-use; a credential is authority ONLY once its row is
|
|
16
|
+
* `active` (the connect-time session-credential arm — a named follow-up — checks the row,
|
|
17
|
+
* and {@link retrieveServingCredential} in core already refuses non-active rows);
|
|
18
|
+
* - the HOLDER side consumes the REAL D13 registry (SPEC §13.1): the issuance gate
|
|
19
|
+
* `gate.<lifecycleUid>` is observed through the sealed registry, and the holder's current
|
|
20
|
+
* process epoch is the ALIAS HEAD read (leader-served, `active`-only currency, and the
|
|
21
|
+
* head must name the presented holder's OWN lifecycleUid — a superseded or replaced
|
|
22
|
+
* incarnation yields no epoch);
|
|
23
|
+
* - the SERVING side consumes the disjoint ENDPOINT gate family `epgate.<endpoint>.<instanceId>`
|
|
24
|
+
* (SPEC §13.1: explicit prefix, never arity; the endpoint fence coordinates of §13.5/§13.7).
|
|
25
|
+
* {@link writeEndpointGate} is the D14 endpoint-registration stand-in for provisioning and
|
|
26
|
+
* smokes, not a public authority surface;
|
|
27
|
+
* - the gate TOUCH preserves the value and bumps only the revision: it exists so a barrier
|
|
28
|
+
* that moved a gate between observation and stage LOSES the race durably (§13.1: a read
|
|
29
|
+
* is never a fence). Concurrent redemptions of the SAME lifecycle serialize on it — the
|
|
30
|
+
* loser's grant dies (one-use, already burned), which is the fail-loud contract;
|
|
31
|
+
* - the per-session credentials are NORMATIVE LEDGER ROWS (§13.1 closed schema, monotonic
|
|
32
|
+
* `active → revoked`): the caller's under its holder lifecycle
|
|
33
|
+
* (`cred.<lifecycleUid>.<sessionId>.c` — the takeover barrier enumerates and revokes it),
|
|
34
|
+
* the serving side's under its endpoint instance
|
|
35
|
+
* (`epcred.<endpoint>.<instanceId>.<sessionId>.s`), both with
|
|
36
|
+
* `sourceChain: ["session.<sessionId>"]`. The IMPLEMENTATION pins the release needs (the
|
|
37
|
+
* signing kid, its thumbprint, the party) live in `stage.session.<sessionId>.<c|s>` rows —
|
|
38
|
+
* the `stage.` family, never under a ledger prefix a barrier enumerates (§13.1). All ids
|
|
39
|
+
* stay DETERMINISTIC (uid/instance + sessionId + party), so a crashed redemption leaves
|
|
40
|
+
* nothing unnameable.
|
|
41
|
+
*/
|
|
42
|
+
import type { KV } from "@nats-io/kv";
|
|
43
|
+
import type { NatsConnection } from "@nats-io/transport-node";
|
|
44
|
+
import { type CryptoKey } from "jose";
|
|
45
|
+
import { type SessionLedger, type SessionRedemptionHooks, type SessionTerminalState, type EpIssuanceGate } from "@cotal-ai/core";
|
|
46
|
+
import { type LifecycleRegistry, type LifecycleMappingReader } from "./lifecycle-registry.js";
|
|
47
|
+
import { type AuthLedgerScanner } from "./ledger-scanner.js";
|
|
48
|
+
/** The trusted per-space auth store: the KV BONDED to its space, constructed ONLY by
|
|
49
|
+
* {@link openSessionAuthStore} (so a caller can never hand-assemble a KV with a mismatched
|
|
50
|
+
* space, mixing space-A authority rows with space-B rails). Branded — every seam that takes a
|
|
51
|
+
* store rejects a structural look-alike. */
|
|
52
|
+
export interface SessionAuthStore {
|
|
53
|
+
kv: KV;
|
|
54
|
+
space: string;
|
|
55
|
+
}
|
|
56
|
+
/** Open the per-space auth store and PROVE its security-critical shape, not merely that some
|
|
57
|
+
* bucket exists. `Kvm.open` binds lazily, so this forces the bind AND inspects the backing
|
|
58
|
+
* stream config: the store MUST be `allow_direct=false` (every read here is an authority read
|
|
59
|
+
* treated as leader-served by construction; a Direct-Get-capable bucket would let
|
|
60
|
+
* release/close/connect decisions read follower-stale, §13.1), MUST carry NO age eviction
|
|
61
|
+
* (bucket-wide OR per-message TTL — an age-evicted `session.`/gate authority key silently drops
|
|
62
|
+
* a fence, §13.12), and MUST NOT be a mirror/sourced stream (a mirror is a follower copy). A
|
|
63
|
+
* config-drifted bucket fails loud HERE, never at the first authority read. Returns the BRANDED
|
|
64
|
+
* store the hooks/close/sweep seams consume. */
|
|
65
|
+
export declare function openSessionAuthStore(nc: NatsConnection, space: string): Promise<SessionAuthStore>;
|
|
66
|
+
/** The real-KV {@link SessionLedger}: create-only CAS for the one-use `issuing` row,
|
|
67
|
+
* revision-pinned CAS for every transition, monotonic states enforced on the write path. */
|
|
68
|
+
export declare function kvSessionLedger(kv: KV): SessionLedger;
|
|
69
|
+
/** The ENDPOINT-instance issuance gate (SPEC §13.1: a DISJOINT family from the agent
|
|
70
|
+
* `gate.<lifecycleUid>`, distinguished by explicit prefix and never token arity; carries the
|
|
71
|
+
* endpoint fence coordinates of §13.5/§13.7). Closed schema; `frozen`/`retired` are op-bound
|
|
72
|
+
* exactly like the agent family. */
|
|
73
|
+
export interface EndpointGateRow {
|
|
74
|
+
state: "open" | "frozen" | "retired";
|
|
75
|
+
generation: number;
|
|
76
|
+
processEpoch: number;
|
|
77
|
+
registrationRevision: number;
|
|
78
|
+
nameAuthorityRevision: number;
|
|
79
|
+
/** The serving instance's CONNZ-attributable connection principal (`<owner>.<actor>`
|
|
80
|
+
* dot-form) — the eviction target when the endpoint is taken over or a serving credential is
|
|
81
|
+
* revoked (§13.1: eviction is BY PRINCIPAL). Recorded at endpoint registration; the serving
|
|
82
|
+
* ledger rows (`epcred.`) copy it as their `holderPrincipal`, so the endpoint KEY identity
|
|
83
|
+
* (`endpoint`) and the evictable principal stay disjoint. */
|
|
84
|
+
principal: string;
|
|
85
|
+
op?: {
|
|
86
|
+
opId: string;
|
|
87
|
+
kind: "activation" | "takeover" | "registration" | "retirement";
|
|
88
|
+
successor?: string;
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/** The endpoint gate key `epgate.<endpoint>.<instanceId>` (an instanceId is unique ONLY within
|
|
92
|
+
* `(space, endpoint)`, so the key is endpoint-qualified — equal instanceIds under two
|
|
93
|
+
* endpoints never collide on the gate or the credential family, §13.1/§13.6). */
|
|
94
|
+
export declare const epgateKey: (endpoint: string, instanceId: string) => string;
|
|
95
|
+
/** Write an endpoint gate. This is the D14 endpoint-registration stand-in for provisioning and
|
|
96
|
+
* smokes, NOT a production authority surface (production endpoint gates are written only by
|
|
97
|
+
* the registration/takeover machinery with revision-pinned CAS, never an unpinned `put`). It
|
|
98
|
+
* is deliberately NOT re-exported from the package index. */
|
|
99
|
+
export declare function writeEndpointGate(kv: KV, endpoint: string, instanceId: string, gate: EndpointGateRow): Promise<void>;
|
|
100
|
+
/** The durable serve-issuance gate (§13.1) over the durable endpoint families — the real-KV
|
|
101
|
+
* implementation of core's `EpIssuanceGate` seam: core's serve mint (`mintCreds`, profile
|
|
102
|
+
* `endpoint-serve`) fences its release on the `epgate.<endpoint>.<instanceId>` key and stages
|
|
103
|
+
* its per-JWT row under `epcred.<endpoint>.<instanceId>.<credentialId>` — the SAME
|
|
104
|
+
* observe/stage/commit/revoke protocol the in-memory smoke seam models, over the real KV.
|
|
105
|
+
*
|
|
106
|
+
* NOT YET WIRED to a production mint path (fact H3): today its only caller is the session-ledger
|
|
107
|
+
* smoke. Wiring the endpoint-family authority connection that mints serve credentials — with the
|
|
108
|
+
* matching `epgate.>`/`epcred.>` grants, the freeze/enumerate/revoke barrier half, and
|
|
109
|
+
* stale-credential reconnect denial — is the post-D14 daemon-composition slice; the standing
|
|
110
|
+
* writer/barrier connections carry neither `epgate.>` nor `epcred.>` today. This module provides
|
|
111
|
+
* the durable seam so that wiring is a composition, not a rewrite. It closes the recorded
|
|
112
|
+
* D13/D14 durable-KEY gate (the endpoint-qualified families are normative, SPEC 13.9/13.12).
|
|
113
|
+
*
|
|
114
|
+
* Mapping to the NORMATIVE closed row schema (§13.1): the staged row's
|
|
115
|
+
* identity/lineage/state/exp become the CredentialLedgerRow (`lifecycleUid` is the endpoint
|
|
116
|
+
* instance's instanceId). Its gate-coordinate fields
|
|
117
|
+
* (generation/processEpoch/registrationRevision/nameAuthorityRevision) and the holder nkey
|
|
118
|
+
* (`credentialKey`) are NOT persisted on the row: the closed schema refuses unknown fields,
|
|
119
|
+
* the coordinates are pinned by the GATE key the commit CASes (one key, §13.1), and
|
|
120
|
+
* revocation/eviction route by credentialId/holderPrincipal, never nkey. `commit` is the
|
|
121
|
+
* pinned identical-bytes TOUCH at the observed revision — a barrier that moved the gate since
|
|
122
|
+
* observation makes the mint LOSE, the session adapter's exact discipline.
|
|
123
|
+
*
|
|
124
|
+
* Consumes the BRANDED {@link SessionAuthStore} ({@link openSessionAuthStore}), never a raw
|
|
125
|
+
* `{kv, space}` pair: the space bond is constructed, not asserted, so a caller can never pair
|
|
126
|
+
* another bucket's KV with a desired space label and fence/stage against the wrong store. */
|
|
127
|
+
export declare function kvServeIssuanceGate(store: SessionAuthStore, args: {
|
|
128
|
+
endpoint: string;
|
|
129
|
+
instanceId: string;
|
|
130
|
+
}): EpIssuanceGate;
|
|
131
|
+
/** The adapter's signing identity for released session credentials (EdDSA/Ed25519). Determinism
|
|
132
|
+
* is the point: Ed25519 signatures are deterministic and the payload is constructed identically
|
|
133
|
+
* per (session, party), so the idempotent re-release returns byte-identical creds. New stages
|
|
134
|
+
* pin `current.kid`; release resolves the PINNED kid via `resolve` (rotation-safe: a rotated
|
|
135
|
+
* signer still reproduces the row's original bytes), returning undefined for an unknown/retired
|
|
136
|
+
* key so a release whose signing key is gone fails loud rather than re-minting under a new key. */
|
|
137
|
+
export interface SessionSigner {
|
|
138
|
+
current: {
|
|
139
|
+
kid: string;
|
|
140
|
+
key: CryptoKey;
|
|
141
|
+
};
|
|
142
|
+
resolve(kid: string): CryptoKey | undefined;
|
|
143
|
+
/** The stable public-key THUMBPRINT for a kid (RFC 7638 JWK thumbprint). Pinned in the
|
|
144
|
+
* credential row at stage and re-checked at release, so a signer that rebinds a `kid` label
|
|
145
|
+
* to a DIFFERENT key cannot silently re-sign a session's credential under new key material. */
|
|
146
|
+
thumbprint(kid: string): string | undefined;
|
|
147
|
+
}
|
|
148
|
+
export interface SessionHookDeps {
|
|
149
|
+
/** The BRANDED per-space auth store ({@link openSessionAuthStore}) — the KV bonded to its
|
|
150
|
+
* space, so a caller cannot mix space-A authority rows with space-B rails, and the eps rails
|
|
151
|
+
* are RE-DERIVED from the bonded space at release. */
|
|
152
|
+
store: SessionAuthStore;
|
|
153
|
+
/** The sealed D13 lifecycle registry (the SAME trusted authority; the holder-gate observe
|
|
154
|
+
* goes through it, so the session path consumes the registry's own marker/parse discipline). */
|
|
155
|
+
registry: LifecycleRegistry;
|
|
156
|
+
/** The sealed leader-served mapping reader (the holder's current-epoch seam: the alias HEAD,
|
|
157
|
+
* `active`-only currency, bound to the presented holder's own lifecycleUid). */
|
|
158
|
+
reader: LifecycleMappingReader;
|
|
159
|
+
signer: SessionSigner;
|
|
160
|
+
now?: () => number;
|
|
161
|
+
}
|
|
162
|
+
/** Build the production {@link SessionRedemptionHooks} over the branded auth store + the
|
|
163
|
+
* sealed D13 registry/reader (both brands enforced — a hand-assembled context never
|
|
164
|
+
* authorizes, at construction for the store/registry and at first use for the reader). */
|
|
165
|
+
export declare function sessionRedemptionHooks(deps: SessionHookDeps): SessionRedemptionHooks;
|
|
166
|
+
/** The authenticated presenter of a close: one of the session's two parties (their identity
|
|
167
|
+
* established by the auth path's own context, §9/§10) or the operator. */
|
|
168
|
+
export type SessionCloser = {
|
|
169
|
+
kind: "holder";
|
|
170
|
+
id: string;
|
|
171
|
+
lifecycleUid: string;
|
|
172
|
+
} | {
|
|
173
|
+
kind: "serving";
|
|
174
|
+
endpoint: string;
|
|
175
|
+
instanceId: string;
|
|
176
|
+
epoch: number;
|
|
177
|
+
} | {
|
|
178
|
+
kind: "operator";
|
|
179
|
+
};
|
|
180
|
+
/**
|
|
181
|
+
* The §13.6 authoritative close: verify party membership against the AUTHORITATIVE row (never
|
|
182
|
+
* a caller projection), transition the row terminal, and revoke BOTH credentials by name, each
|
|
183
|
+
* marked on success (the sweep's terminal-row retry backstops any failure). Idempotent for an
|
|
184
|
+
* already-terminal row (`transitioned: false`, the marks still retried).
|
|
185
|
+
*/
|
|
186
|
+
export declare function closeSession(store: SessionAuthStore, hooks: Pick<SessionRedemptionHooks, "ledger" | "revokeCredential">, args: {
|
|
187
|
+
sessionId: string;
|
|
188
|
+
closer: SessionCloser;
|
|
189
|
+
to?: SessionTerminalState;
|
|
190
|
+
}): Promise<{
|
|
191
|
+
transitioned: boolean;
|
|
192
|
+
fullyRevoked: boolean;
|
|
193
|
+
}>;
|
|
194
|
+
/**
|
|
195
|
+
* The SESSION-PAIR reconciler a §13.1 lifecycle barrier injects (as
|
|
196
|
+
* `credential-ledger`'s `TakeoverDeps.reconcileSessionPair`): when a takeover or handle
|
|
197
|
+
* revocation revokes a `cred.` row whose lineage names `session.<sessionId>`, this tears down
|
|
198
|
+
* BOTH halves of that session so the SERVING half cannot outlive the barrier. It terminalizes
|
|
199
|
+
* `session.<sessionId>` as `superseded` (the barrier's own terminal reason), revokes both
|
|
200
|
+
* ledger rows (the caller `cred.` and the serving `epcred.`), and RETURNS the serving row's
|
|
201
|
+
* CONNZ-attributable holder principal so the barrier can UNION it into its verified-eviction
|
|
202
|
+
* set (SPEC 13.6: both credentials revoked WITH eviction — the row alone leaves an
|
|
203
|
+
* already-connected serving session live). Idempotent: an already-reconciled session still
|
|
204
|
+
* returns its principals (a resumed barrier must still evict); fail-closed if it cannot fully
|
|
205
|
+
* revoke both halves. The barrier only ever names a session it read from a NEVER-DELETED
|
|
206
|
+
* credential row's lineage, and session rows are never deleted either, so TRUE ABSENCE here is
|
|
207
|
+
* corruption, never "nothing to reconcile".
|
|
208
|
+
*/
|
|
209
|
+
export declare function reconcileSessionForTakeover(store: SessionAuthStore, hooks: Pick<SessionRedemptionHooks, "ledger" | "revokeCredential">, sessionId: string): Promise<{
|
|
210
|
+
servingPrincipals: readonly string[];
|
|
211
|
+
}>;
|
|
212
|
+
/** Enumerate `session.>` and run core's per-row sweep decision: expiry transitions + the
|
|
213
|
+
* terminal-row unmarked-id revoke retry. Corruption is LOUD but LOCAL: a single malformed row
|
|
214
|
+
* is collected and reported, never allowed to abort containment of the other valid rows (else
|
|
215
|
+
* one poison row would block the whole bucket's expiry/revocation backstop). Returns how many
|
|
216
|
+
* rows this pass acted on plus the keys that failed. */
|
|
217
|
+
export declare function sweepSessions(store: SessionAuthStore, hooks: Pick<SessionRedemptionHooks, "ledger" | "revokeCredential">, opts: {
|
|
218
|
+
now: number;
|
|
219
|
+
marginMs?: number;
|
|
220
|
+
}, scanner: AuthLedgerScanner): Promise<{
|
|
221
|
+
acted: number;
|
|
222
|
+
failed: string[];
|
|
223
|
+
}>;
|
|
224
|
+
//# sourceMappingURL=session-ledger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-ledger.d.ts","sourceRoot":"","sources":["../src/session-ledger.ts"],"names":[],"mappings":"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"}
|