@cotal-ai/core 0.48.1 → 0.49.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 (104) hide show
  1. package/dist/agent-file.d.ts +34 -0
  2. package/dist/agent-file.d.ts.map +1 -1
  3. package/dist/agent-file.js +94 -2
  4. package/dist/agent-file.js.map +1 -1
  5. package/dist/auth-provider.d.ts +25 -1
  6. package/dist/auth-provider.d.ts.map +1 -1
  7. package/dist/auth-provider.js.map +1 -1
  8. package/dist/connector.d.ts +4 -0
  9. package/dist/connector.d.ts.map +1 -1
  10. package/dist/connector.js.map +1 -1
  11. package/dist/endpoint-action.d.ts +1 -0
  12. package/dist/endpoint-action.d.ts.map +1 -1
  13. package/dist/endpoint-action.js +1 -1
  14. package/dist/endpoint-action.js.map +1 -1
  15. package/dist/endpoint-binding.d.ts +6 -0
  16. package/dist/endpoint-binding.d.ts.map +1 -1
  17. package/dist/endpoint-binding.js +17 -0
  18. package/dist/endpoint-binding.js.map +1 -1
  19. package/dist/endpoint-grants.d.ts.map +1 -1
  20. package/dist/endpoint-grants.js +34 -12
  21. package/dist/endpoint-grants.js.map +1 -1
  22. package/dist/endpoint-invoke.d.ts.map +1 -1
  23. package/dist/endpoint-invoke.js +9 -49
  24. package/dist/endpoint-invoke.js.map +1 -1
  25. package/dist/endpoint-publish-denial.d.ts +35 -0
  26. package/dist/endpoint-publish-denial.d.ts.map +1 -0
  27. package/dist/endpoint-publish-denial.js +56 -0
  28. package/dist/endpoint-publish-denial.js.map +1 -0
  29. package/dist/endpoint-serve-kv.d.ts +16 -0
  30. package/dist/endpoint-serve-kv.d.ts.map +1 -1
  31. package/dist/endpoint-serve-kv.js +29 -0
  32. package/dist/endpoint-serve-kv.js.map +1 -1
  33. package/dist/endpoint-serve.d.ts.map +1 -1
  34. package/dist/endpoint-serve.js +9 -4
  35. package/dist/endpoint-serve.js.map +1 -1
  36. package/dist/endpoint-service.d.ts +21 -0
  37. package/dist/endpoint-service.d.ts.map +1 -1
  38. package/dist/endpoint-service.js +150 -15
  39. package/dist/endpoint-service.js.map +1 -1
  40. package/dist/endpoint-subjects.d.ts +34 -0
  41. package/dist/endpoint-subjects.d.ts.map +1 -1
  42. package/dist/endpoint-subjects.js +87 -18
  43. package/dist/endpoint-subjects.js.map +1 -1
  44. package/dist/endpoint-verbs.d.ts +4 -2
  45. package/dist/endpoint-verbs.d.ts.map +1 -1
  46. package/dist/endpoint-verbs.js +22 -7
  47. package/dist/endpoint-verbs.js.map +1 -1
  48. package/dist/endpoint.d.ts +155 -5
  49. package/dist/endpoint.d.ts.map +1 -1
  50. package/dist/endpoint.js +528 -48
  51. package/dist/endpoint.js.map +1 -1
  52. package/dist/index.d.ts +4 -1
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +8 -1
  55. package/dist/index.js.map +1 -1
  56. package/dist/issued-authority.d.ts +168 -0
  57. package/dist/issued-authority.d.ts.map +1 -0
  58. package/dist/issued-authority.js +497 -0
  59. package/dist/issued-authority.js.map +1 -0
  60. package/dist/issuer-session.d.ts +30 -0
  61. package/dist/issuer-session.d.ts.map +1 -0
  62. package/dist/issuer-session.js +51 -0
  63. package/dist/issuer-session.js.map +1 -0
  64. package/dist/lifecycle-state.d.ts +9 -2
  65. package/dist/lifecycle-state.d.ts.map +1 -1
  66. package/dist/lifecycle-state.js +11 -2
  67. package/dist/lifecycle-state.js.map +1 -1
  68. package/dist/provision.d.ts +24 -14
  69. package/dist/provision.d.ts.map +1 -1
  70. package/dist/provision.js +137 -14
  71. package/dist/provision.js.map +1 -1
  72. package/dist/remote-manager-authority.d.ts +126 -1
  73. package/dist/remote-manager-authority.d.ts.map +1 -1
  74. package/dist/remote-manager-authority.js +21 -0
  75. package/dist/remote-manager-authority.js.map +1 -1
  76. package/dist/run-admission.d.ts +88 -0
  77. package/dist/run-admission.d.ts.map +1 -0
  78. package/dist/run-admission.js +193 -0
  79. package/dist/run-admission.js.map +1 -0
  80. package/dist/run-driver-grants.d.ts.map +1 -1
  81. package/dist/run-driver-grants.js +7 -0
  82. package/dist/run-driver-grants.js.map +1 -1
  83. package/dist/run-host.d.ts +5 -0
  84. package/dist/run-host.d.ts.map +1 -1
  85. package/dist/run-host.js.map +1 -1
  86. package/dist/runtime.d.ts +31 -3
  87. package/dist/runtime.d.ts.map +1 -1
  88. package/dist/secret-fs.d.ts +25 -0
  89. package/dist/secret-fs.d.ts.map +1 -1
  90. package/dist/secret-fs.js +136 -3
  91. package/dist/secret-fs.js.map +1 -1
  92. package/dist/secret-store.d.ts +38 -0
  93. package/dist/secret-store.d.ts.map +1 -1
  94. package/dist/secret-store.js +53 -1
  95. package/dist/secret-store.js.map +1 -1
  96. package/dist/streams.d.ts +23 -75
  97. package/dist/streams.d.ts.map +1 -1
  98. package/dist/streams.js +65 -85
  99. package/dist/streams.js.map +1 -1
  100. package/dist/subjects.d.ts +3 -1
  101. package/dist/subjects.d.ts.map +1 -1
  102. package/dist/subjects.js +3 -1
  103. package/dist/subjects.js.map +1 -1
  104. package/package.json +1 -1
@@ -0,0 +1,497 @@
1
+ /**
2
+ * Issued authority (SPEC §13.15): binding one invocation to an IMMUTABLE, issuer-accepted
3
+ * permission ceiling, separate from caller identity.
4
+ *
5
+ * `EpCaller` says who is calling. An issued authority says what the credential they are calling
6
+ * with was granted, as the issuer accepted it, and it is what a hosted effect performed on the
7
+ * caller's behalf is confined by. It rides the request subject on a versioned rail
8
+ * (`ep.v1`, the generation second-to-last before the nonce), so the broker pins it with the same
9
+ * grant discipline that pins the caller triple: a credential can publish under exactly the
10
+ * generation its rows name, and a legacy credential cannot publish on the versioned rail at all.
11
+ *
12
+ * Three things live here, in the order an issuance runs them:
13
+ * - the reference and the permission model (what a ceiling IS: explicit `all`/`none`/`patterns`
14
+ * allow plus deny, imported from the native JWT fragment so an omitted list can never read as
15
+ * a narrow one);
16
+ * - the evidence store (`cotal_issued_<space>`): immutable evidence, a one-field attempt row
17
+ * whose state is `prepared | active | aborted | revoked`, and a reverse index from each source
18
+ * gate to the issuances that depend on it. Create-only; a generation is never reused;
19
+ * activation is a CAS at the revision the prepare observed;
20
+ * - the accepted row (`cotal_accepted_<space>`): how a connected client learns which generation
21
+ * the issuer bound, by reading one row keyed by a token it chose, over a per-key `DIRECT.GET`
22
+ * grant its ceiling carries. The client never trusts what it proposed or what a file says.
23
+ *
24
+ * What this does NOT establish: that a request arriving on a generation-pinned subject was
25
+ * published by the grant holder. Origin is a property of the current grant set (no peer-held
26
+ * profile pairs a write with a raw stream read on one stream), guarded by the auth census, and
27
+ * mediated reads stay the remedy.
28
+ */
29
+ import { randomBytes } from "node:crypto";
30
+ import { DiscardPolicy } from "@nats-io/jetstream";
31
+ import { canonicalJson, rawDigest } from "./canonical.js";
32
+ import { EpEnvelopeError } from "./endpoint-envelope.js";
33
+ import { isCasLoss } from "./endpoint-records.js";
34
+ import { assertGeneration, callerTokens, endpointToken } from "./endpoint-subjects.js";
35
+ export { assertGeneration, isIssuedCaller, EP_RAIL_V1 } from "./endpoint-subjects.js";
36
+ import { subjectMatches, token } from "./subjects.js";
37
+ /** A fresh generation: 128 bits, hex. Chosen by the ISSUER, never by the client. */
38
+ export function mintGeneration() {
39
+ return randomBytes(16).toString("hex");
40
+ }
41
+ /** A fresh accepted-row token: same grammar, chosen by the party that will connect. */
42
+ export function mintAcceptedToken() {
43
+ return randomBytes(16).toString("hex");
44
+ }
45
+ function refSnapshot(value) {
46
+ closed(value, ["space", "owner", "actor", "uid", "generation"], "issued reference");
47
+ endpointToken(value.space);
48
+ callerTokens(value);
49
+ assertGeneration(value.generation);
50
+ return Object.freeze({ space: value.space, owner: value.owner, actor: value.actor, uid: value.uid, generation: value.generation });
51
+ }
52
+ function closed(value, keys, label) {
53
+ if (value === null || typeof value !== "object" || Array.isArray(value)
54
+ || (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null))
55
+ throw new Error(`${label} must be a plain record`);
56
+ for (const key of Reflect.ownKeys(value)) {
57
+ if (typeof key !== "string" || !keys.includes(key))
58
+ throw new Error(`${label} carries an unsupported field ${String(key)}`);
59
+ if (!Object.hasOwn(Object.getOwnPropertyDescriptor(value, key), "value"))
60
+ throw new Error(`${label} cannot carry accessors`);
61
+ }
62
+ return value;
63
+ }
64
+ function subjectToken(value, pattern) {
65
+ if (typeof value !== "string" || value.length === 0 || /\s/u.test(value)
66
+ || [...value].some((ch) => ch.charCodeAt(0) < 32 || ch.charCodeAt(0) === 127))
67
+ throw new Error("a subject must be nonempty without whitespace or control characters; queue-qualified forms are not a ceiling entry");
68
+ const parts = value.split(".");
69
+ for (let i = 0; i < parts.length; i++) {
70
+ const part = parts[i];
71
+ if (!part || (part.includes("*") && (!pattern || part !== "*"))
72
+ || (part.includes(">") && (!pattern || part !== ">" || i !== parts.length - 1)))
73
+ throw new Error(`subject "${value}" has an invalid token or wildcard`);
74
+ }
75
+ return value;
76
+ }
77
+ function patterns(value) {
78
+ if (!Array.isArray(value))
79
+ throw new Error("subject patterns must be an explicit array");
80
+ return Object.freeze(value.map((entry) => subjectToken(entry, true)));
81
+ }
82
+ function permission(allow, deny) {
83
+ return Object.freeze({ allow: Object.freeze(allow), deny });
84
+ }
85
+ /** Read a stored permission value back, refusing every shape but the explicit one. */
86
+ export function readIssuedSubjectPermission(value) {
87
+ const raw = closed(value, ["allow", "deny"], "subject permission");
88
+ const allow = closed(raw.allow, ["mode", "patterns"], "subject allow");
89
+ const deny = patterns(raw.deny);
90
+ if (allow.mode === "all" || allow.mode === "none") {
91
+ if (Object.hasOwn(allow, "patterns"))
92
+ throw new Error("only patterns mode carries a patterns field");
93
+ return permission({ mode: allow.mode }, deny);
94
+ }
95
+ if (allow.mode !== "patterns")
96
+ throw new Error("unsupported subject allow mode");
97
+ const listed = patterns(allow.patterns);
98
+ if (listed.length === 0)
99
+ throw new Error("patterns mode requires a nonempty list");
100
+ return permission({ mode: "patterns", patterns: listed }, deny);
101
+ }
102
+ export function readIssuedSubjectPermissions(value) {
103
+ const raw = closed(value, ["publish", "subscribe"], "issued permissions");
104
+ return Object.freeze({ publish: readIssuedSubjectPermission(raw.publish), subscribe: readIssuedSubjectPermission(raw.subscribe) });
105
+ }
106
+ /** The native NATS fragment (`{pub, sub}` with `allow`/`deny` lists) as the JWT carries it: an
107
+ * omitted or empty allow is UNRESTRICTED subject to denies. This is the one importer, and it
108
+ * takes the fragment, never a whole JWT: `resp` and queue-qualified rows need semantics of their
109
+ * own and are refused rather than dropped. */
110
+ export function importNativeSubjectPermissions(value) {
111
+ const raw = closed(value, ["pub", "sub"], "native permissions");
112
+ const direction = (v) => {
113
+ if (v === undefined)
114
+ return permission({ mode: "all" }, Object.freeze([]));
115
+ const r = closed(v, ["allow", "deny"], "native subject permission");
116
+ const allow = Object.hasOwn(r, "allow") ? patterns(r.allow) : Object.freeze([]);
117
+ const deny = Object.hasOwn(r, "deny") ? patterns(r.deny) : Object.freeze([]);
118
+ return permission(allow.length ? { mode: "patterns", patterns: allow } : { mode: "all" }, deny);
119
+ };
120
+ for (const key of ["pub", "sub"])
121
+ if (Object.hasOwn(raw, key) && raw[key] === undefined)
122
+ throw new Error("an explicit native direction must not be undefined");
123
+ return Object.freeze({ publish: direction(raw.pub), subscribe: direction(raw.sub) });
124
+ }
125
+ /** Does the ceiling permit ONE concrete subject? Deny wins; `none` permits nothing. */
126
+ export function issuedPermitsSubject(value, concrete) {
127
+ const parsed = readIssuedSubjectPermission(value);
128
+ subjectToken(concrete, false);
129
+ if (parsed.deny.some((pattern) => subjectMatches(pattern, concrete)))
130
+ return false;
131
+ if (parsed.allow.mode === "none")
132
+ return false;
133
+ return parsed.allow.mode === "all" || parsed.allow.patterns.some((pattern) => subjectMatches(pattern, concrete));
134
+ }
135
+ /** Does policy pattern `cap` cover EVERY subject `pattern` matches? Token-wise, both in the
136
+ * NATS grammar; a non-terminal `>` on either side fails closed. */
137
+ function patternCovers(cap, pattern) {
138
+ const c = cap.split(".");
139
+ const p = pattern.split(".");
140
+ if (c.slice(0, -1).includes(">") || p.slice(0, -1).includes(">"))
141
+ return false;
142
+ for (let i = 0; i < c.length; i++) {
143
+ if (c[i] === ">")
144
+ return p.length > i;
145
+ if (i >= p.length)
146
+ return false;
147
+ if (c[i] === "*") {
148
+ if (p[i] === ">")
149
+ return false;
150
+ continue;
151
+ }
152
+ if (c[i] !== p[i])
153
+ return false;
154
+ }
155
+ return c.length === p.length;
156
+ }
157
+ /** Could patterns `a` and `b` match one common subject? Conservative: a `>` on either side past
158
+ * the common prefix counts as overlap. */
159
+ function patternsOverlap(a, b) {
160
+ const x = a.split(".");
161
+ const y = b.split(".");
162
+ const n = Math.max(x.length, y.length);
163
+ for (let i = 0; i < n; i++) {
164
+ const s = x[i], t = y[i];
165
+ if (s === ">" || t === ">")
166
+ return true;
167
+ if (s === undefined || t === undefined)
168
+ return false;
169
+ if (s === "*" || t === "*")
170
+ continue;
171
+ if (s !== t)
172
+ return false;
173
+ }
174
+ return true;
175
+ }
176
+ /** Does the ceiling permit a SUBSCRIPTION whose filter is `pattern` (which may carry wildcards)?
177
+ * Every subject the filter could deliver must sit inside one allow entry, and no deny entry may
178
+ * overlap it: a subscription is a claim over a set of subjects, so a partial cover is a refusal,
179
+ * never a narrower grant invented on the caller's behalf. */
180
+ export function issuedPermitsPattern(value, pattern) {
181
+ const parsed = readIssuedSubjectPermission(value);
182
+ subjectToken(pattern, true);
183
+ if (parsed.deny.some((d) => patternsOverlap(d, pattern)))
184
+ return false;
185
+ if (parsed.allow.mode === "none")
186
+ return false;
187
+ return parsed.allow.mode === "all" || parsed.allow.patterns.some((a) => patternCovers(a, pattern));
188
+ }
189
+ /** The per-space evidence store. `allow_direct=false`: every read here is a fence (leader-served,
190
+ * revision-pinned), and Direct Get's follower reads would defeat read-your-writes. */
191
+ export function issuedBucket(space) {
192
+ return `cotal_issued_${token(space)}`;
193
+ }
194
+ /** The per-space accepted-row store. Its own bucket, and `allow_direct` ON: per-key scoping is
195
+ * only expressible on a `DIRECT.GET` grant, and a stream-wide `STREAM.MSG.GET` on a shared bucket
196
+ * would let a client read every other client's row. */
197
+ export function acceptedBucket(space) {
198
+ return `cotal_accepted_${token(space)}`;
199
+ }
200
+ export function issuedEvidenceKey(ref) {
201
+ const snap = refSnapshot(ref);
202
+ return `v1.${callerTokens(snap).join(".")}.${snap.generation}`;
203
+ }
204
+ export function issuedAttemptKey(ref) {
205
+ return `attempt.${issuedEvidenceKey(ref)}`;
206
+ }
207
+ function sourceSnapshot(value) {
208
+ closed(value, ["space", "bucket", "key"], "issued source");
209
+ endpointToken(value.space);
210
+ if (typeof value.bucket !== "string" || !/^[a-zA-Z0-9_-]{1,128}$/.test(value.bucket)
211
+ || typeof value.key !== "string" || value.key.length > 1024
212
+ || !/^[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)*$/.test(value.key))
213
+ throw new Error("invalid issued source coordinate");
214
+ return Object.freeze({ space: value.space, bucket: value.bucket, key: value.key });
215
+ }
216
+ /** The reverse index prefix for one source: `bysource.v1.<sha256([1, space, bucket, key])>.`.
217
+ * The digest keeps the key one token; the generation suffix on the full key is load-bearing, since
218
+ * without it a reused root credential id would merge two issuances into one entry. */
219
+ export function issuedSourcePrefix(source) {
220
+ const s = sourceSnapshot(source);
221
+ return `bysource.v1.${rawDigest(JSON.stringify([1, s.space, s.bucket, s.key])).slice("sha256:".length)}.`;
222
+ }
223
+ export function issuedSourceIndexKey(source, ref) {
224
+ if (source.space !== ref.space)
225
+ throw new Error("an issued source names a foreign space");
226
+ return issuedSourcePrefix(source) + issuedEvidenceKey(ref).slice("v1.".length);
227
+ }
228
+ function evidenceSnapshot(value) {
229
+ const raw = closed(value, ["version", "ref", "sources", "permissions", "expiresAt"], "issued evidence");
230
+ if (raw.version !== 1 || !Array.isArray(raw.sources))
231
+ throw new Error("unsupported issued evidence");
232
+ const ref = refSnapshot(raw.ref);
233
+ const sources = Object.freeze(raw.sources.map(sourceSnapshot));
234
+ for (const source of sources)
235
+ if (source.space !== ref.space)
236
+ throw new Error("an issued source names a foreign space");
237
+ if (new Set(sources.map(issuedSourcePrefix)).size !== sources.length)
238
+ throw new Error("duplicate issued source");
239
+ const expiresAt = raw.expiresAt;
240
+ if (expiresAt !== undefined && (typeof expiresAt !== "number" || !Number.isSafeInteger(expiresAt) || expiresAt <= 0))
241
+ throw new Error("issued evidence expiresAt must be a positive integer (unix seconds)");
242
+ if (sources.length === 0 && expiresAt === undefined)
243
+ throw new Error("an issuance bound to no source gate must carry expiresAt; nothing else can end its liveness");
244
+ const permissions = readIssuedSubjectPermissions(raw.permissions);
245
+ return Object.freeze({ version: 1, ref, sources, permissions, ...(expiresAt !== undefined ? { expiresAt } : {}) });
246
+ }
247
+ /** The broker-enforced part of every authority store's immutability (SPEC 13.12): no rollup
248
+ * header, no message delete, no purge. The records store carries the same three. */
249
+ export const AUTHORITY_STORE_IMMUTABLE_FLAGS = Object.freeze({ allow_rollup_hdrs: false, deny_delete: true, deny_purge: true });
250
+ /** Write-once per key: one message per subject and `discard: new` applied per subject, so the
251
+ * broker refuses the SECOND message on a key whatever it carries. Other keys are unaffected. */
252
+ export const WRITE_ONCE_PER_KEY = Object.freeze({ max_msgs_per_subject: 1, discard: DiscardPolicy.New, discard_new_per_subject: true });
253
+ /** Append-only per key: unlimited per-key history, nothing ever removed. A reader that wants the
254
+ * row that was created reads the FIRST message on its key. */
255
+ export const APPEND_ONLY_PER_KEY = Object.freeze({ max_msgs_per_subject: -1 });
256
+ /** Every field of `shape` must read back from the broker as set; the mismatches are named. */
257
+ export function assertStoreShape(cfg, shape, bucket, spec) {
258
+ const drifted = Object.entries(shape).filter(([k, v]) => cfg[k] !== v).map(([k]) => `${k}=${String(cfg[k])}`);
259
+ if (drifted.length > 0)
260
+ throw new Error(`the authority store ${bucket} has a drifted shape (${drifted.join(", ")}); an authority store is never silently adopted - reprovision it (${spec})`);
261
+ }
262
+ /** The two issued-authority streams, for the provisioner's create-or-verify inventory. */
263
+ export function issuedStoreStreamNames(space) {
264
+ return [`KV_${issuedBucket(space)}`, `KV_${acceptedBucket(space)}`];
265
+ }
266
+ const enc = new TextEncoder();
267
+ const dec = new TextDecoder("utf-8", { fatal: true });
268
+ const bytes = (value) => enc.encode(canonicalJson(value));
269
+ export function openIssuedStore(kv, jsm, space) {
270
+ endpointToken(space);
271
+ const bucket = issuedBucket(space);
272
+ const stream = `KV_${bucket}`;
273
+ const staged = new WeakMap();
274
+ const own = (ref) => {
275
+ if (ref.space !== space)
276
+ throw new Error("issued reference names a foreign space");
277
+ return issuedEvidenceKey(ref);
278
+ };
279
+ // LEADER-SERVED point read. `kv.get` on an `allow_direct=false` bucket already rides
280
+ // STREAM.MSG.GET, but the fence is stated here rather than inherited from a client default.
281
+ // `first` reads the FIRST message on the key: the store keeps unlimited per-key history and
282
+ // removes nothing (see ensureIssuedStores), so the first message on an immutable row's key is
283
+ // the row that was created, whatever was published on that key since. The attempt row reads
284
+ // last, because it advances by CAS at the revision the last read observed.
285
+ async function read(key, at = "last") {
286
+ let m;
287
+ try {
288
+ const subject = `$KV.${bucket}.${key}`;
289
+ // `next_by_subj` is the wire's first-on-or-after-sequence read (STREAM.MSG.GET, no `seq`
290
+ // means from the start); the client's request union omits it, the implementation forwards it.
291
+ const query = (at === "first" ? { next_by_subj: subject } : { last_by_subj: subject });
292
+ m = await jsm.streams.getMessage(stream, query);
293
+ }
294
+ catch (e) {
295
+ if (e.code === 10037)
296
+ return undefined;
297
+ throw e;
298
+ }
299
+ if (!m)
300
+ return undefined;
301
+ if (m.header?.get("KV-Operation"))
302
+ throw new EpEnvelopeError("failed-precondition", `issued row ${key} carries a deletion marker; a deletion is never absence (SPEC 13.15)`);
303
+ return { value: JSON.parse(dec.decode(m.data)), revision: m.seq };
304
+ }
305
+ async function readEvidence(ref) {
306
+ const key = own(ref);
307
+ const entry = await read(key, "first");
308
+ if (entry === undefined)
309
+ throw new EpEnvelopeError("permission-denied", `no issued evidence for generation ${ref.generation}; an unrecorded generation authorizes nothing (SPEC 13.15)`);
310
+ const evidence = evidenceSnapshot(entry.value);
311
+ if (canonicalJson(evidence.ref) !== canonicalJson(refSnapshot(ref)))
312
+ throw new EpEnvelopeError("permission-denied", `issued evidence at ${key} names a different reference; garbled trusted state never authorizes`);
313
+ return { evidence, digest: rawDigest(canonicalJson(evidence)) };
314
+ }
315
+ async function readAttempt(ref, digest) {
316
+ const key = issuedAttemptKey(ref);
317
+ const entry = await read(key);
318
+ if (entry === undefined)
319
+ throw new EpEnvelopeError("permission-denied", `no issued attempt row at ${key}; evidence without an attempt was never prepared (SPEC 13.15)`);
320
+ const row = closed(entry.value, ["version", "state", "digest"], "issued attempt");
321
+ if (row.version !== 1 || row.digest !== digest || !["prepared", "active", "aborted", "revoked"].includes(row.state))
322
+ throw new EpEnvelopeError("permission-denied", `issued attempt row ${key} is malformed or pins a different evidence digest`);
323
+ return { state: row.state, revision: entry.revision };
324
+ }
325
+ async function retire(ref) {
326
+ const { digest } = await readEvidence(ref);
327
+ for (let i = 0; i < 4; i++) {
328
+ const row = await readAttempt(ref, digest);
329
+ if (row.state === "aborted" || row.state === "revoked")
330
+ return row.state;
331
+ const state = row.state === "prepared" ? "aborted" : "revoked";
332
+ try {
333
+ await kv.update(issuedAttemptKey(ref), bytes({ version: 1, state, digest }), row.revision);
334
+ return state;
335
+ }
336
+ catch (error) {
337
+ if (!isCasLoss(error))
338
+ throw error;
339
+ }
340
+ }
341
+ throw new Error(`retiring generation ${ref.generation} lost repeated CAS attempts`);
342
+ }
343
+ return Object.freeze({
344
+ async stage(input) {
345
+ const evidence = evidenceSnapshot(input);
346
+ const key = own(evidence.ref);
347
+ // A fresh generation only: an explicit read refuses first, the create-only CAS is the second line.
348
+ if (await read(key, "first") !== undefined)
349
+ throw new EpEnvelopeError("conflict", `generation ${evidence.ref.generation} already has issued evidence; a generation is never reused (SPEC 13.15)`);
350
+ const digest = rawDigest(canonicalJson(evidence));
351
+ await kv.create(key, bytes(evidence));
352
+ const revision = await kv.create(issuedAttemptKey(evidence.ref), bytes({ version: 1, state: "prepared", digest }));
353
+ for (const source of evidence.sources)
354
+ await kv.create(issuedSourceIndexKey(source, evidence.ref), bytes({ source, ref: evidence.ref }));
355
+ const handle = Object.freeze({ key });
356
+ staged.set(handle, { evidence, revision, digest, consumed: false });
357
+ return handle;
358
+ },
359
+ async release(prepared, finalizeExisting) {
360
+ const snap = staged.get(prepared);
361
+ if (snap === undefined || snap.consumed)
362
+ throw new Error("unknown or already released issuance");
363
+ snap.consumed = true;
364
+ try {
365
+ await finalizeExisting();
366
+ // At the revision the PREPARE observed, never a re-read one: a retirement that landed in
367
+ // between wins here, and re-reading would let a released credential ride a revoked attempt.
368
+ await kv.update(`attempt.${prepared.key}`, bytes({ version: 1, state: "active", digest: snap.digest }), snap.revision);
369
+ }
370
+ catch (error) {
371
+ try {
372
+ await retire(snap.evidence.ref);
373
+ }
374
+ catch (cleanup) {
375
+ throw new AggregateError([error, cleanup], "issuance failed and its retirement is unconfirmed; no material may be released");
376
+ }
377
+ throw error;
378
+ }
379
+ },
380
+ retire,
381
+ async resolve(ref, sourceIsLive, now = () => Math.floor(Date.now() / 1000)) {
382
+ const { evidence, digest } = await readEvidence(ref);
383
+ const before = await readAttempt(ref, digest);
384
+ if (before.state !== "active")
385
+ throw new EpEnvelopeError("permission-denied", `generation ${ref.generation} is ${before.state}; only an active issuance authorizes (SPEC 13.15)`);
386
+ if (evidence.expiresAt !== undefined && now() >= evidence.expiresAt)
387
+ throw new EpEnvelopeError("permission-denied", `generation ${ref.generation} expired at ${evidence.expiresAt} (SPEC 13.15)`);
388
+ for (const source of evidence.sources) {
389
+ if (!(await sourceIsLive(source)))
390
+ throw new EpEnvelopeError("permission-denied", `generation ${ref.generation} depends on ${source.bucket}/${source.key}, which is no longer live (SPEC 13.15)`);
391
+ }
392
+ const after = await readAttempt(ref, digest);
393
+ if (after.state !== "active" || after.revision !== before.revision)
394
+ throw new EpEnvelopeError("permission-denied", `generation ${ref.generation} changed during resolution; refused (SPEC 13.15)`);
395
+ return Object.freeze({ evidence, revision: after.revision });
396
+ },
397
+ async confirm(ref, permissions) {
398
+ const { evidence, digest } = await readEvidence(ref);
399
+ const row = await readAttempt(ref, digest);
400
+ if (row.state !== "active")
401
+ throw new EpEnvelopeError("permission-denied", `generation ${ref.generation} is ${row.state}; a renewal rides an active issuance only (SPEC 13.15)`);
402
+ if (canonicalJson(evidence.permissions) !== canonicalJson(readIssuedSubjectPermissions(permissions)))
403
+ throw new EpEnvelopeError("failed-precondition", `generation ${ref.generation} was issued for a different ceiling; a permission change is a fresh generation on a new connection, never a renewal (SPEC 13.15)`);
404
+ },
405
+ async retireSource(source) {
406
+ const s = sourceSnapshot(source);
407
+ if (s.space !== space)
408
+ throw new Error("an issued source names a foreign space");
409
+ let count = 0;
410
+ const keys = await kv.keys(`${issuedSourcePrefix(s)}>`);
411
+ for await (const key of keys) {
412
+ const entry = await read(key, "first");
413
+ if (entry === undefined)
414
+ continue;
415
+ const index = closed(entry.value, ["source", "ref"], "issued source index");
416
+ const ref = refSnapshot(index.ref);
417
+ if (canonicalJson(index.source) !== canonicalJson(s) || key !== issuedSourceIndexKey(s, ref))
418
+ throw new Error(`issued source index ${key} does not agree with its own coordinates`);
419
+ const { evidence } = await readEvidence(ref);
420
+ if (!evidence.sources.some((x) => canonicalJson(x) === canonicalJson(s)))
421
+ throw new Error(`issued source index ${key} names a source absent from its evidence`);
422
+ await retire(ref);
423
+ count++;
424
+ }
425
+ return count;
426
+ },
427
+ });
428
+ }
429
+ /** Create-or-verify the two issued-authority stores. Evidence: `allow_direct=false`, file,
430
+ * no eviction. Accepted: `allow_direct=true`, file, no eviction. A drifted store fails loud. */
431
+ export async function ensureIssuedStores(jsm, kvm, space) {
432
+ // IMMUTABLE AT THE BROKER, not by CAS discipline alone. The `issuer` holds a bucket-wide publish
433
+ // row on the evidence store, and that row carries a plain replacement of a row, a `Nats-Rollup`
434
+ // header, a deletion marker and a per-key purge; none is a CAS write, so the create-only CAS
435
+ // and the deletion-marker read see none of them. The three immutability flags close rollup,
436
+ // message delete and purge on both stores. What closes plain replacement differs by store:
437
+ //
438
+ // - the ACCEPTED store is write-once per key: a row is written once at release and never
439
+ // advanced, so the broker refuses any second message on its key, and the client's
440
+ // `DIRECT.GET` still serves the one row there is;
441
+ // - the EVIDENCE store is append-only: the attempt row advances by CAS (`prepared` to `active`
442
+ // to a terminal state), so a one-message cap is not an option there. Instead nothing on a key
443
+ // is ever removed, and every immutable row (the evidence, the source index) is read as the
444
+ // FIRST message on its key, so a later write on the same key is inert to every reader. The
445
+ // attempt row is read last-by-key, as its CAS requires.
446
+ for (const [bucket, direct] of [[issuedBucket(space), false], [acceptedBucket(space), true]]) {
447
+ const stream = `KV_${bucket}`;
448
+ const shape = { ...AUTHORITY_STORE_IMMUTABLE_FLAGS, ...(direct ? WRITE_ONCE_PER_KEY : APPEND_ONLY_PER_KEY) };
449
+ if (await jsm.streams.info(stream).catch(() => undefined) === undefined) {
450
+ await kvm.create(bucket, { allow_direct: direct });
451
+ const created = (await jsm.streams.info(stream)).config;
452
+ await jsm.streams.update(stream, { ...created, ...shape });
453
+ }
454
+ const cfg = (await jsm.streams.info(stream)).config;
455
+ if (cfg.allow_direct !== direct || cfg.storage !== "file" || (cfg.max_age ?? 0) !== 0 || (cfg.max_msgs ?? -1) > 0 || (cfg.max_bytes ?? -1) > 0
456
+ || !Array.isArray(cfg.subjects) || cfg.subjects.length !== 1 || cfg.subjects[0] !== `$KV.${bucket}.>`)
457
+ throw new Error(`the issued-authority store ${bucket} has a drifted shape (allow_direct=${String(cfg.allow_direct)}); an authority store is never silently adopted - reprovision it (SPEC 13.15)`);
458
+ assertStoreShape(cfg, shape, bucket, "SPEC 13.15");
459
+ }
460
+ }
461
+ // ---- the accepted row ----------------------------------------------------------------------------
462
+ export function acceptedKey(acceptedToken) {
463
+ return `accepted.v1.${assertGeneration(acceptedToken, "accepted token")}`;
464
+ }
465
+ /** The read grant an issued ceiling carries for exactly its own accepted row and nothing else. */
466
+ export function acceptedReadGrant(space, acceptedToken) {
467
+ const bucket = acceptedBucket(space);
468
+ return `$JS.API.DIRECT.GET.KV_${bucket}.$KV.${bucket}.${acceptedKey(acceptedToken)}`;
469
+ }
470
+ /** Written by the issuer at release, create-only: a token is redeemed once. */
471
+ export async function writeAcceptedRow(kv, acceptedToken, ref) {
472
+ await kv.create(acceptedKey(acceptedToken), bytes({ version: 1, ref: refSnapshot(ref) }));
473
+ }
474
+ /** Read by the CLIENT over its own connection: the reference the ISSUER wrote, so a client that
475
+ * proposed or was told a different generation learns the accepted one here. The broker admits
476
+ * the read only under the ceiling's per-key grant, which is what binds the answer to the
477
+ * credential this connection presented. */
478
+ export async function readAcceptedRow(nc, space, acceptedToken, timeoutMs = 3000) {
479
+ const bucket = acceptedBucket(space);
480
+ const response = await nc.request(`$JS.API.DIRECT.GET.KV_${bucket}.$KV.${bucket}.${acceptedKey(acceptedToken)}`, new Uint8Array(0), { timeout: timeoutMs });
481
+ const status = response.headers?.get("Status");
482
+ if (status)
483
+ throw new EpEnvelopeError("permission-denied", `no accepted row for this token (${status}); the connection holds no issued authority (SPEC 13.15)`);
484
+ const row = closed(JSON.parse(dec.decode(response.data)), ["version", "ref"], "accepted row");
485
+ if (row.version !== 1)
486
+ throw new Error("unsupported accepted-row version");
487
+ const ref = refSnapshot(row.ref);
488
+ if (ref.space !== space)
489
+ throw new EpEnvelopeError("permission-denied", "the accepted row names a foreign space");
490
+ return ref;
491
+ }
492
+ /** The named refusal an endpoint returns for a legacy (unversioned) invocation of a command
493
+ * that requires issued authority (SPEC §13.15 compatibility). */
494
+ /** `details[].kind` of the refusal a command requiring issued caller authority returns to a
495
+ * LEGACY arrival: the request rode the unversioned rail, so no generation binds it (SPEC 13.15). */
496
+ export const EP_UNBOUND_CALLER_AUTHORITY = "ai.cotal.ep.unbound-caller-authority";
497
+ //# sourceMappingURL=issued-authority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issued-authority.js","sourceRoot":"","sources":["../src/issued-authority.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * One issuance window (SPEC 13.15): an ephemeral `issuer` connection over which a mint stages
3
+ * and releases its evidence and writes the accepted row, a lifecycle terminal retires the
4
+ * issuances bound to its ledger family, and a host resolves the evidence a caller's request
5
+ * rides. The connection lives for the callback only; no standing credential holds a grant on
6
+ * either issued-authority store.
7
+ */
8
+ import { type JetStreamManager } from "@nats-io/jetstream";
9
+ import { type KV } from "@nats-io/kv";
10
+ import type { NatsConnection } from "@nats-io/transport-node";
11
+ import { type IssuedSourceRef, type IssuedStore } from "./issued-authority.js";
12
+ import { type SpaceAuth } from "./provision.js";
13
+ export interface IssuerSession {
14
+ readonly nc: NatsConnection;
15
+ readonly jsm: JetStreamManager;
16
+ readonly store: IssuedStore;
17
+ readonly accepted: KV;
18
+ /** Is a recorded source gate still live? The one source shape this repo issues against is a
19
+ * static incarnation's credential ledger family (`cred.<uid>` on the auth store), whose
20
+ * liveness is its issuance gate: a `retired` gate, or no gate, is a dead source. Any other
21
+ * coordinate is refused rather than guessed live. */
22
+ sourceIsLive(source: IssuedSourceRef): Promise<boolean>;
23
+ }
24
+ export declare function withIssuerSession<T>(args: {
25
+ servers: string;
26
+ space: string;
27
+ auth: SpaceAuth;
28
+ tls: boolean;
29
+ }, fn: (session: IssuerSession) => Promise<T>): Promise<T>;
30
+ //# sourceMappingURL=issuer-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issuer-session.d.ts","sourceRoot":"","sources":["../src/issuer-session.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAO,KAAK,EAAE,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAK9D,OAAO,EAAiD,KAAK,eAAe,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAE9H,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;IACtB;;;0DAGsD;IACtD,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzD;AAED,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,EACvE,EAAE,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC,CA4BZ"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * One issuance window (SPEC 13.15): an ephemeral `issuer` connection over which a mint stages
3
+ * and releases its evidence and writes the accepted row, a lifecycle terminal retires the
4
+ * issuances bound to its ledger family, and a host resolves the evidence a caller's request
5
+ * rides. The connection lives for the callback only; no standing credential holds a grant on
6
+ * either issued-authority store.
7
+ */
8
+ import { jetstreamManager } from "@nats-io/jetstream";
9
+ import { Kvm } from "@nats-io/kv";
10
+ import { dialerFor } from "./endpoint.js";
11
+ import { epAuthBucket } from "./endpoint-binding.js";
12
+ import { EpEnvelopeError } from "./endpoint-envelope.js";
13
+ import { issuanceGateKey, parseIssuanceGate } from "./lifecycle-state.js";
14
+ import { acceptedBucket, issuedBucket, openIssuedStore } from "./issued-authority.js";
15
+ import { newIdentity } from "./identity.js";
16
+ import { mintCreds } from "./provision.js";
17
+ import { standaloneConnectOpts } from "./streams.js";
18
+ export async function withIssuerSession(args, fn) {
19
+ const creds = await mintCreds(args.auth, newIdentity(), "issuer");
20
+ const nc = await dialerFor(args.servers)({ servers: args.servers, ...standaloneConnectOpts({ creds, tls: args.tls }), maxReconnectAttempts: 0 });
21
+ try {
22
+ const kvm = new Kvm(nc);
23
+ const jsm = await jetstreamManager(nc);
24
+ const store = openIssuedStore(await kvm.open(issuedBucket(args.space)), jsm, args.space);
25
+ const accepted = await kvm.open(acceptedBucket(args.space));
26
+ const auth = epAuthBucket(args.space);
27
+ const sourceIsLive = async (source) => {
28
+ const m = /^cred\.([a-z0-9]{26,32})$/.exec(source.key);
29
+ if (source.space !== args.space || source.bucket !== auth || m === null)
30
+ throw new EpEnvelopeError("permission-denied", `issued source ${source.bucket}/${source.key} is not a coordinate this host can attest; refused (SPEC 13.15)`);
31
+ const key = issuanceGateKey(m[1]);
32
+ let entry;
33
+ try {
34
+ entry = await jsm.streams.getMessage(`KV_${auth}`, { last_by_subj: `$KV.${auth}.${key}` });
35
+ }
36
+ catch (e) {
37
+ if (e.code === 10037)
38
+ return false;
39
+ throw e;
40
+ }
41
+ if (!entry || entry.header?.get("KV-Operation"))
42
+ return false;
43
+ return parseIssuanceGate(entry.data, key, m[1]).state !== "retired";
44
+ };
45
+ return await fn({ nc, jsm, store, accepted, sourceIsLive });
46
+ }
47
+ finally {
48
+ await nc.drain().catch(() => nc.close());
49
+ }
50
+ }
51
+ //# sourceMappingURL=issuer-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issuer-session.js","sourceRoot":"","sources":["../src/issuer-session.ts"],"names":[],"mappings":"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"}