@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.
Files changed (95) hide show
  1. package/dist/admission-mediator.d.ts +319 -0
  2. package/dist/admission-mediator.d.ts.map +1 -0
  3. package/dist/admission-mediator.js +1033 -0
  4. package/dist/admission-mediator.js.map +1 -0
  5. package/dist/auth-admin.d.ts +29 -0
  6. package/dist/auth-admin.d.ts.map +1 -0
  7. package/dist/auth-admin.js +224 -0
  8. package/dist/auth-admin.js.map +1 -0
  9. package/dist/authority-client.d.ts +215 -0
  10. package/dist/authority-client.d.ts.map +1 -0
  11. package/dist/authority-client.js +346 -0
  12. package/dist/authority-client.js.map +1 -0
  13. package/dist/barrier-evict.d.ts +16 -0
  14. package/dist/barrier-evict.d.ts.map +1 -0
  15. package/dist/barrier-evict.js +100 -0
  16. package/dist/barrier-evict.js.map +1 -0
  17. package/dist/connect-reader.d.ts +72 -0
  18. package/dist/connect-reader.d.ts.map +1 -0
  19. package/dist/connect-reader.js +154 -0
  20. package/dist/connect-reader.js.map +1 -0
  21. package/dist/continuity.d.ts.map +1 -1
  22. package/dist/continuity.js +3 -0
  23. package/dist/continuity.js.map +1 -1
  24. package/dist/credential-ledger.d.ts +343 -0
  25. package/dist/credential-ledger.d.ts.map +1 -0
  26. package/dist/credential-ledger.js +732 -0
  27. package/dist/credential-ledger.js.map +1 -0
  28. package/dist/drain-repair.d.ts +95 -0
  29. package/dist/drain-repair.d.ts.map +1 -0
  30. package/dist/drain-repair.js +305 -0
  31. package/dist/drain-repair.js.map +1 -0
  32. package/dist/idp.d.ts +19 -0
  33. package/dist/idp.d.ts.map +1 -1
  34. package/dist/idp.js +17 -0
  35. package/dist/idp.js.map +1 -1
  36. package/dist/index.d.ts +5 -2
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +29 -2
  39. package/dist/index.js.map +1 -1
  40. package/dist/issuer.d.ts +8 -0
  41. package/dist/issuer.d.ts.map +1 -1
  42. package/dist/issuer.js +4 -2
  43. package/dist/issuer.js.map +1 -1
  44. package/dist/ledger-scanner.d.ts +98 -0
  45. package/dist/ledger-scanner.d.ts.map +1 -0
  46. package/dist/ledger-scanner.js +352 -0
  47. package/dist/ledger-scanner.js.map +1 -0
  48. package/dist/ledger.d.ts +7 -0
  49. package/dist/ledger.d.ts.map +1 -1
  50. package/dist/ledger.js +53 -5
  51. package/dist/ledger.js.map +1 -1
  52. package/dist/lifecycle-registry.d.ts +397 -0
  53. package/dist/lifecycle-registry.d.ts.map +1 -0
  54. package/dist/lifecycle-registry.js +819 -0
  55. package/dist/lifecycle-registry.js.map +1 -0
  56. package/dist/permissions.d.ts +5 -1
  57. package/dist/permissions.d.ts.map +1 -1
  58. package/dist/permissions.js +29 -6
  59. package/dist/permissions.js.map +1 -1
  60. package/dist/plane-claim.d.ts +83 -0
  61. package/dist/plane-claim.d.ts.map +1 -0
  62. package/dist/plane-claim.js +290 -0
  63. package/dist/plane-claim.js.map +1 -0
  64. package/dist/provider.d.ts.map +1 -1
  65. package/dist/provider.js +2 -1
  66. package/dist/provider.js.map +1 -1
  67. package/dist/records-scanner.d.ts +78 -0
  68. package/dist/records-scanner.d.ts.map +1 -0
  69. package/dist/records-scanner.js +320 -0
  70. package/dist/records-scanner.js.map +1 -0
  71. package/dist/retirement-barrier.d.ts +217 -0
  72. package/dist/retirement-barrier.d.ts.map +1 -0
  73. package/dist/retirement-barrier.js +624 -0
  74. package/dist/retirement-barrier.js.map +1 -0
  75. package/dist/retirement-cleaner.d.ts +54 -0
  76. package/dist/retirement-cleaner.d.ts.map +1 -0
  77. package/dist/retirement-cleaner.js +158 -0
  78. package/dist/retirement-cleaner.js.map +1 -0
  79. package/dist/root-credential.d.ts +26 -0
  80. package/dist/root-credential.d.ts.map +1 -0
  81. package/dist/root-credential.js +116 -0
  82. package/dist/root-credential.js.map +1 -0
  83. package/dist/service.d.ts +60 -0
  84. package/dist/service.d.ts.map +1 -1
  85. package/dist/service.js +317 -10
  86. package/dist/service.js.map +1 -1
  87. package/dist/session-ledger.d.ts +224 -0
  88. package/dist/session-ledger.d.ts.map +1 -0
  89. package/dist/session-ledger.js +713 -0
  90. package/dist/session-ledger.js.map +1 -0
  91. package/dist/token.d.ts +17 -0
  92. package/dist/token.d.ts.map +1 -1
  93. package/dist/token.js +30 -2
  94. package/dist/token.js.map +1 -1
  95. 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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"}