@cotal-ai/auth 0.90.0 → 0.91.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 (80) hide show
  1. package/dist/authority-client.d.ts.map +1 -1
  2. package/dist/authority-client.js +4 -1
  3. package/dist/authority-client.js.map +1 -1
  4. package/dist/chat-parent-pin.d.ts +43 -0
  5. package/dist/chat-parent-pin.d.ts.map +1 -0
  6. package/dist/chat-parent-pin.js +115 -0
  7. package/dist/chat-parent-pin.js.map +1 -0
  8. package/dist/chat-session-authority.d.ts +120 -0
  9. package/dist/chat-session-authority.d.ts.map +1 -0
  10. package/dist/chat-session-authority.js +924 -0
  11. package/dist/chat-session-authority.js.map +1 -0
  12. package/dist/chat-session-row.d.ts +117 -0
  13. package/dist/chat-session-row.d.ts.map +1 -0
  14. package/dist/chat-session-row.js +358 -0
  15. package/dist/chat-session-row.js.map +1 -0
  16. package/dist/chat-session-store.d.ts +126 -0
  17. package/dist/chat-session-store.d.ts.map +1 -0
  18. package/dist/chat-session-store.js +392 -0
  19. package/dist/chat-session-store.js.map +1 -0
  20. package/dist/commands.d.ts +3 -1
  21. package/dist/commands.d.ts.map +1 -1
  22. package/dist/commands.js +497 -122
  23. package/dist/commands.js.map +1 -1
  24. package/dist/continuity.js +1 -1
  25. package/dist/continuity.js.map +1 -1
  26. package/dist/daemon-flags.d.ts +42 -0
  27. package/dist/daemon-flags.d.ts.map +1 -0
  28. package/dist/daemon-flags.js +12 -0
  29. package/dist/daemon-flags.js.map +1 -0
  30. package/dist/handle-inspect.d.ts +101 -0
  31. package/dist/handle-inspect.d.ts.map +1 -0
  32. package/dist/handle-inspect.js +50 -0
  33. package/dist/handle-inspect.js.map +1 -0
  34. package/dist/handle-verification.d.ts +75 -0
  35. package/dist/handle-verification.d.ts.map +1 -0
  36. package/dist/handle-verification.js +135 -0
  37. package/dist/handle-verification.js.map +1 -0
  38. package/dist/idp.d.ts +23 -1
  39. package/dist/idp.d.ts.map +1 -1
  40. package/dist/idp.js +54 -8
  41. package/dist/idp.js.map +1 -1
  42. package/dist/index.d.ts +3 -2
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +3 -2
  45. package/dist/index.js.map +1 -1
  46. package/dist/ledger.d.ts +58 -5
  47. package/dist/ledger.d.ts.map +1 -1
  48. package/dist/ledger.js +126 -6
  49. package/dist/ledger.js.map +1 -1
  50. package/dist/lifecycle-registry.d.ts +1 -70
  51. package/dist/lifecycle-registry.d.ts.map +1 -1
  52. package/dist/lifecycle-registry.js +4 -35
  53. package/dist/lifecycle-registry.js.map +1 -1
  54. package/dist/login.d.ts +9 -0
  55. package/dist/login.d.ts.map +1 -1
  56. package/dist/login.js +53 -8
  57. package/dist/login.js.map +1 -1
  58. package/dist/permissions.js +4 -0
  59. package/dist/permissions.js.map +1 -1
  60. package/dist/provider.d.ts +23 -0
  61. package/dist/provider.d.ts.map +1 -1
  62. package/dist/provider.js +244 -44
  63. package/dist/provider.js.map +1 -1
  64. package/dist/service-adapter.d.ts +6 -0
  65. package/dist/service-adapter.d.ts.map +1 -0
  66. package/dist/service-adapter.js +120 -0
  67. package/dist/service-adapter.js.map +1 -0
  68. package/dist/service.d.ts +61 -2
  69. package/dist/service.d.ts.map +1 -1
  70. package/dist/service.js +399 -84
  71. package/dist/service.js.map +1 -1
  72. package/dist/store.d.ts +10 -0
  73. package/dist/store.d.ts.map +1 -1
  74. package/dist/store.js +25 -8
  75. package/dist/store.js.map +1 -1
  76. package/dist/token.d.ts +1 -1
  77. package/dist/token.d.ts.map +1 -1
  78. package/dist/token.js +4 -1
  79. package/dist/token.js.map +1 -1
  80. package/package.json +11 -7
@@ -0,0 +1,126 @@
1
+ import type { KV } from "@nats-io/kv";
2
+ import type { JetStreamManager } from "@nats-io/jetstream";
3
+ import { EpEnvelopeError } from "@cotal-ai/core";
4
+ export declare const CHAT_HOLDER_PREFIX = "chatholder";
5
+ export declare const CHAT_OWNER_PREFIX = "chatowner";
6
+ export declare const CHAT_SWEEP_CURSOR_KEY = "chatsweep.cursor";
7
+ /** At most 16 non-retired sessions per owner. */
8
+ export declare const CHAT_LIVE_MAX = 16;
9
+ /** At most 10 admissions per fixed 60 s window, never refunded. */
10
+ export declare const CHAT_WINDOW_MS = 60000;
11
+ export declare const CHAT_WINDOW_MAX = 10;
12
+ /** Bounded reservation attempts, each from a fresh leader read. */
13
+ export declare const CHAT_QUOTA_ATTEMPTS = 3;
14
+ /** Draw a fresh server-side chat actor `chat_<26 base32>` (130 bits). The caller never chooses it. */
15
+ export declare function drawChatActor(): string;
16
+ export declare function chatHolderKey(owner: string, holderHash: string): string;
17
+ export declare function chatOwnerKey(owner: string): string;
18
+ /** The closed set of KV publish subjects the chat writer needs (for the trusted writer's grant
19
+ * builder). Exact-arity wildcards only: never `.>` on a family that could later gain children. */
20
+ export declare function chatAuthorityWriteSubjects(space: string): string[];
21
+ export type ChatHolderState = "reserved" | "provisioning" | "active" | "retired";
22
+ export type ChatRetiredBy = "sweep" | "close" | "rollback";
23
+ export interface ChatCeiling {
24
+ read: string[];
25
+ post: string[];
26
+ }
27
+ /** The closed `IDX` value. `parentPinDigest` is null ONLY on the sweep's S1 fence of an
28
+ * absent index, which is born `retired` with a null UID. */
29
+ export interface ChatHolderIndex {
30
+ v: 1;
31
+ state: ChatHolderState;
32
+ actor: string;
33
+ lifecycleUid: string | null;
34
+ reservedAt: number;
35
+ expiresAt: number;
36
+ ceiling: ChatCeiling;
37
+ parentPinDigest: string | null;
38
+ retiredBy?: ChatRetiredBy;
39
+ }
40
+ export interface Versioned<T> {
41
+ value: T;
42
+ revision: number;
43
+ }
44
+ export declare function parseChatHolderIndex(raw: unknown, key: string): ChatHolderIndex;
45
+ export interface ChatQuotaEntry {
46
+ holderHash: string;
47
+ actor: string;
48
+ reservedAt: number;
49
+ }
50
+ export interface ChatOwnerQuota {
51
+ v: 1;
52
+ live: ChatQuotaEntry[];
53
+ window: {
54
+ startMs: number;
55
+ count: number;
56
+ };
57
+ }
58
+ export declare function parseChatOwnerQuota(raw: unknown, key: string): ChatOwnerQuota;
59
+ export interface ChatSweepCursor {
60
+ v: 1;
61
+ /** The last fully classified chat-session row file name ("" = start). */
62
+ rowName: string;
63
+ /** The auth-stream sequence of the last fully classified holder index (0 = start). */
64
+ holderSeq: number;
65
+ }
66
+ export declare function parseChatSweepCursor(raw: unknown): ChatSweepCursor;
67
+ /** An outcome the caller must resolve by re-reading: the write may or may not have landed. */
68
+ export declare function unknownOutcome(what: string, cause: unknown): EpEnvelopeError;
69
+ export interface QuotaReservation {
70
+ actor: string;
71
+ reservedAt: number;
72
+ /** True when an existing entry for this holderHash was found and reused. */
73
+ reused: boolean;
74
+ }
75
+ /** One scanned record from a bounded leader-served discovery page. */
76
+ export interface ScannedChatRecord {
77
+ key: string;
78
+ seq: number;
79
+ }
80
+ /**
81
+ * The sealed chat authority store. Constructed only over the trusted auth path's own auth-store KV
82
+ * (`registryStores(reg).authKv`) and its JetStream manager; it adds no connection or grant.
83
+ */
84
+ export interface ChatAuthorityStore {
85
+ readHolder(owner: string, holderHash: string): Promise<Versioned<ChatHolderIndex> | undefined>;
86
+ /** a2: create-only `reserved`. `lost` = another writer's index exists (the retry path). */
87
+ createHolderReserved(owner: string, holderHash: string, value: ChatHolderIndex): Promise<{
88
+ created: true;
89
+ revision: number;
90
+ } | {
91
+ created: false;
92
+ }>;
93
+ /** S1 for an absent index: create-only `retired`, null UID. `lost` = an admission created it first. */
94
+ createHolderFence(owner: string, holderHash: string, entry: ChatQuotaEntry): Promise<{
95
+ created: true;
96
+ revision: number;
97
+ } | {
98
+ created: false;
99
+ }>;
100
+ /** Pinned CAS on an existing index; checks the transition table first. `conflict` on a
101
+ * moved revision; an unknown broker outcome throws `unknownOutcome`. */
102
+ casHolder(owner: string, holderHash: string, from: Versioned<ChatHolderIndex>, to: ChatHolderIndex): Promise<Versioned<ChatHolderIndex>>;
103
+ readQuota(owner: string): Promise<Versioned<ChatOwnerQuota> | undefined>;
104
+ /** a1: reserve or reuse this holder's live entry. Refuses `conflict` (16 live) or
105
+ * `resource-exhausted` (window); exhausted attempts are UNKNOWN, never a refusal. */
106
+ reserveQuota(owner: string, holderHash: string, now: number): Promise<QuotaReservation>;
107
+ /** S3: remove this holder's entry, pinned on the revision whose entry the caller classified. */
108
+ releaseQuotaEntry(owner: string, holderHash: string, observed: Versioned<ChatOwnerQuota>): Promise<"released" | "absent">;
109
+ /** Reconcile: rewrite this holder's entry actor to the index actor; the slot stays counted. */
110
+ rewriteQuotaEntryActor(owner: string, holderHash: string, actor: string, observed: Versioned<ChatOwnerQuota>): Promise<"rewritten" | "absent">;
111
+ readCursor(): Promise<Versioned<ChatSweepCursor> | undefined>;
112
+ /** Pinned CAS (create-only when `observed` is undefined). `conflict` = a peer advanced it. */
113
+ casCursor(observed: Versioned<ChatSweepCursor> | undefined, next: ChatSweepCursor): Promise<number>;
114
+ /** A bounded leader-served discovery page (`STREAM.MSG.GET next_by_subj`, no consumer: none may
115
+ * be created on the auth stream). Returns at most `limit` live keys after `afterSeq`. */
116
+ scanPage(family: "holder" | "owner", afterSeq: number, limit: number): Promise<ScannedChatRecord[]>;
117
+ }
118
+ export declare function openChatAuthorityStore(kv: KV, jsm: JetStreamManager, space: string): ChatAuthorityStore;
119
+ /** Parse a scanned holder key back to its coordinates; anything else refuses. */
120
+ export declare function parseChatHolderKey(key: string): {
121
+ owner: string;
122
+ holderHash: string;
123
+ };
124
+ /** Parse a scanned owner-quota key back to its owner; anything else refuses. */
125
+ export declare function parseChatOwnerKey(key: string): string;
126
+ //# sourceMappingURL=chat-session-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-session-store.d.ts","sourceRoot":"","sources":["../src/chat-session-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,392 @@
1
+ /**
2
+ * The chat-session AUTHORITY RECORDS in the ep-auth KV (`KV_cotal_auth_<space>`, `allow_direct=false`,
3
+ * so every `kv.get` here is the leader-served `STREAM.MSG.GET last_by_subj` read): the holder index, owner quota and sweep cursor.
4
+ *
5
+ * - holder index `IDX` = `chatholder.<owner>.<holderHash>`: create-only, then revision-pinned CAS for
6
+ * every state change, NEVER deleted (one holderHash admits at most once for the life of the
7
+ * space);
8
+ * - owner quota `Q` = `chatowner.<owner>`: create-only when absent, then revision-pinned CAS; at
9
+ * most one `live` entry per holderHash; a fixed 60 s rate window that is never refunded;
10
+ * - sweep cursor = `chatsweep.cursor`: discovery position only, revision-pinned CAS.
11
+ *
12
+ * Writers: chat admission and the sweep, both inside the trusted auth process. No leaf, agent,
13
+ * endpoint or operator credential holds any grant on these keys.
14
+ *
15
+ * Every value is a CLOSED schema: unknown fields, a DEL/PURGE marker or a key/value mismatch refuse
16
+ * loudly (garbled trusted-path state never authorizes, SPEC 13.1). Every write uses core's
17
+ * `createRecordEntry`/`updateRecordEntry` (the §13.8 create-only/pinned-CAS discipline), so a CAS
18
+ * loss is a typed `conflict`, and every other broker failure is an UNKNOWN outcome that the caller
19
+ * resolves by re-reading, never by assuming.
20
+ */
21
+ import { randomBytes } from "node:crypto";
22
+ import { EpEnvelopeError, assertDerivedOwnerToken, assertLifecycleToken, createRecordEntry, epAuthBucket, updateRecordEntry, } from "@cotal-ai/core";
23
+ import { assertChatActor, assertChatList, assertHolderHash, CHAT_SESSION_MAX_TTL_MS } from "./chat-session-row.js";
24
+ export const CHAT_HOLDER_PREFIX = "chatholder";
25
+ export const CHAT_OWNER_PREFIX = "chatowner";
26
+ export const CHAT_SWEEP_CURSOR_KEY = "chatsweep.cursor";
27
+ /** At most 16 non-retired sessions per owner. */
28
+ export const CHAT_LIVE_MAX = 16;
29
+ /** At most 10 admissions per fixed 60 s window, never refunded. */
30
+ export const CHAT_WINDOW_MS = 60_000;
31
+ export const CHAT_WINDOW_MAX = 10;
32
+ /** Bounded reservation attempts, each from a fresh leader read. */
33
+ export const CHAT_QUOTA_ATTEMPTS = 3;
34
+ const HEX64 = /^[0-9a-f]{64}$/;
35
+ const B32 = "abcdefghijklmnopqrstuvwxyz234567";
36
+ const isRec = (v) => v !== null && typeof v === "object" && !Array.isArray(v);
37
+ const epochMs = (v) => typeof v === "number" && Number.isSafeInteger(v) && v > 0;
38
+ const uint = (v) => typeof v === "number" && Number.isSafeInteger(v) && v >= 0;
39
+ const closedKeys = (o, required, optional = []) => required.every((k) => k in o) && Object.keys(o).every((k) => required.includes(k) || optional.includes(k));
40
+ /** Draw a fresh server-side chat actor `chat_<26 base32>` (130 bits). The caller never chooses it. */
41
+ export function drawChatActor() {
42
+ const bytes = randomBytes(17);
43
+ let bits = 0, acc = 0, out = "";
44
+ for (const b of bytes) {
45
+ acc = (acc << 8) | b;
46
+ bits += 8;
47
+ while (bits >= 5 && out.length < 26) {
48
+ out += B32[(acc >>> (bits - 5)) & 31];
49
+ bits -= 5;
50
+ }
51
+ acc &= (1 << bits) - 1;
52
+ }
53
+ return assertChatActor(`chat_${out}`);
54
+ }
55
+ // ---- keys ----------------------------------------------------------------------------------
56
+ export function chatHolderKey(owner, holderHash) {
57
+ return `${CHAT_HOLDER_PREFIX}.${assertDerivedOwnerToken(owner)}.${assertHolderHash(holderHash)}`;
58
+ }
59
+ export function chatOwnerKey(owner) {
60
+ return `${CHAT_OWNER_PREFIX}.${assertDerivedOwnerToken(owner)}`;
61
+ }
62
+ /** The closed set of KV publish subjects the chat writer needs (for the trusted writer's grant
63
+ * builder). Exact-arity wildcards only: never `.>` on a family that could later gain children. */
64
+ export function chatAuthorityWriteSubjects(space) {
65
+ const b = epAuthBucket(space);
66
+ return [`$KV.${b}.${CHAT_HOLDER_PREFIX}.*.*`, `$KV.${b}.${CHAT_OWNER_PREFIX}.*`, `$KV.${b}.${CHAT_SWEEP_CURSOR_KEY}`];
67
+ }
68
+ const HOLDER_STATES = new Set(["reserved", "provisioning", "active", "retired"]);
69
+ const RETIRED_BY = new Set(["sweep", "close", "rollback"]);
70
+ export function parseChatHolderIndex(raw, key) {
71
+ const bad = (why) => {
72
+ throw new EpEnvelopeError("internal", `the chat holder index ${key} ${why}; garbled trusted-path state never authorizes`);
73
+ };
74
+ if (!isRec(raw))
75
+ bad("is not an object");
76
+ const o = raw;
77
+ if (!closedKeys(o, ["v", "state", "actor", "lifecycleUid", "reservedAt", "expiresAt", "ceiling", "parentPinDigest"], ["retiredBy"]))
78
+ bad(`carries fields ${JSON.stringify(Object.keys(o).sort())} outside the closed set`);
79
+ if (o.v !== 1)
80
+ bad("has an unknown version");
81
+ if (typeof o.state !== "string" || !HOLDER_STATES.has(o.state))
82
+ bad("has an unknown state");
83
+ try {
84
+ assertChatActor(o.actor);
85
+ }
86
+ catch {
87
+ bad("names a malformed actor");
88
+ }
89
+ if (o.lifecycleUid !== null) {
90
+ if (typeof o.lifecycleUid !== "string")
91
+ bad("has a malformed lifecycleUid");
92
+ try {
93
+ assertLifecycleToken(o.lifecycleUid);
94
+ }
95
+ catch {
96
+ bad("has a malformed lifecycleUid");
97
+ }
98
+ }
99
+ if (!epochMs(o.reservedAt) || !epochMs(o.expiresAt) || o.expiresAt < o.reservedAt ||
100
+ o.expiresAt - o.reservedAt > CHAT_SESSION_MAX_TTL_MS)
101
+ bad("has malformed reservedAt/expiresAt");
102
+ if (!isRec(o.ceiling) || !closedKeys(o.ceiling, ["read", "post"]))
103
+ bad("has a malformed ceiling");
104
+ try {
105
+ assertChatList(o.ceiling.read, "ceiling.read");
106
+ assertChatList(o.ceiling.post, "ceiling.post");
107
+ }
108
+ catch {
109
+ bad("has a malformed ceiling list");
110
+ }
111
+ if (o.state === "retired") {
112
+ if (typeof o.retiredBy !== "string" || !RETIRED_BY.has(o.retiredBy))
113
+ bad("is retired without retiredBy");
114
+ }
115
+ else if (o.retiredBy !== undefined)
116
+ bad(`is ${String(o.state)} but carries retiredBy`);
117
+ if (o.state === "provisioning" || o.state === "active") {
118
+ if (o.lifecycleUid === null)
119
+ bad(`is ${String(o.state)} without a lifecycleUid`);
120
+ }
121
+ if (o.parentPinDigest === null) {
122
+ if (!(o.state === "retired" && o.retiredBy === "sweep" && o.lifecycleUid === null))
123
+ bad("has a null parentPinDigest outside the sweep fence");
124
+ }
125
+ else if (typeof o.parentPinDigest !== "string" || !HEX64.test(o.parentPinDigest))
126
+ bad("has a malformed parentPinDigest");
127
+ return o;
128
+ }
129
+ /** The holder-index transition table, plus the immutables every CAS preserves. */
130
+ function assertHolderTransition(from, to, key) {
131
+ const refuse = (why) => {
132
+ throw new EpEnvelopeError("failed-precondition", `chat holder index ${key}: ${from.state} -> ${to.state} refused (${why})`);
133
+ };
134
+ if (from.actor !== to.actor || from.reservedAt !== to.reservedAt || from.expiresAt !== to.expiresAt ||
135
+ from.parentPinDigest !== to.parentPinDigest || JSON.stringify(from.ceiling) !== JSON.stringify(to.ceiling))
136
+ refuse("an immutable field changed");
137
+ if (from.state === "retired")
138
+ refuse("retired is terminal");
139
+ if (to.state === "retired") {
140
+ if (to.lifecycleUid !== from.lifecycleUid)
141
+ refuse("retirement keeps the bound UID");
142
+ return;
143
+ }
144
+ if (from.state === "reserved" && to.state === "reserved") {
145
+ if (from.lifecycleUid !== null || to.lifecycleUid === null)
146
+ refuse("lifecycleUid is set once, from null");
147
+ return;
148
+ }
149
+ if (to.lifecycleUid !== from.lifecycleUid)
150
+ refuse("the UID never changes after it is bound");
151
+ if (from.state === "reserved" && to.state === "provisioning")
152
+ return;
153
+ if (from.state === "provisioning" && to.state === "active")
154
+ return;
155
+ refuse("not an allowed transition");
156
+ }
157
+ export function parseChatOwnerQuota(raw, key) {
158
+ const bad = (why) => {
159
+ throw new EpEnvelopeError("internal", `the chat owner quota ${key} ${why}; garbled trusted-path state never authorizes`);
160
+ };
161
+ if (!isRec(raw) || !closedKeys(raw, ["v", "live", "window"]) || raw.v !== 1)
162
+ bad("is not the closed v1 record");
163
+ const o = raw;
164
+ if (!Array.isArray(o.live) || o.live.length > CHAT_LIVE_MAX)
165
+ bad(`live must hold at most ${CHAT_LIVE_MAX} entries`);
166
+ const seen = new Set();
167
+ for (const e of o.live) {
168
+ if (!isRec(e) || !closedKeys(e, ["holderHash", "actor", "reservedAt"]) || typeof e.holderHash !== "string" || !HEX64.test(e.holderHash) || !epochMs(e.reservedAt))
169
+ bad("carries a malformed live entry");
170
+ try {
171
+ assertChatActor(e.actor);
172
+ }
173
+ catch {
174
+ bad("carries a live entry with a malformed actor");
175
+ }
176
+ const h = e.holderHash;
177
+ if (seen.has(h))
178
+ bad("carries two live entries for one holderHash");
179
+ seen.add(h);
180
+ }
181
+ if (!isRec(o.window) || !closedKeys(o.window, ["startMs", "count"]) || !uint(o.window.startMs) || !uint(o.window.count) || o.window.count > CHAT_WINDOW_MAX)
182
+ bad("has a malformed window");
183
+ return o;
184
+ }
185
+ export function parseChatSweepCursor(raw) {
186
+ if (!isRec(raw) || !closedKeys(raw, ["v", "rowName", "holderSeq"]) || raw.v !== 1 || typeof raw.rowName !== "string" || raw.rowName.length > 256 || !uint(raw.holderSeq))
187
+ throw new EpEnvelopeError("internal", `the chat sweep cursor ${CHAT_SWEEP_CURSOR_KEY} is not the closed v1 record`);
188
+ return raw;
189
+ }
190
+ // ---- the store ------------------------------------------------------------------------------
191
+ /** An outcome the caller must resolve by re-reading: the write may or may not have landed. */
192
+ export function unknownOutcome(what, cause) {
193
+ const err = new EpEnvelopeError("unavailable", `${what}: the write's outcome is unknown (${cause?.message ?? String(cause)}); retry with the same holder to resolve it`, undefined, "unknown");
194
+ err.cause = cause;
195
+ return err;
196
+ }
197
+ const isConflict = (e) => e instanceof EpEnvelopeError && e.code === "conflict";
198
+ function decode(entry, key, parse) {
199
+ if (entry === null)
200
+ return undefined;
201
+ if (entry.operation !== "PUT")
202
+ throw new EpEnvelopeError("failed-precondition", `${key} carries a ${entry.operation} marker; a chat authority record is never deleted, so this is corruption (SPEC 13.12)`);
203
+ let raw;
204
+ try {
205
+ raw = JSON.parse(new TextDecoder().decode(entry.value));
206
+ }
207
+ catch {
208
+ throw new EpEnvelopeError("internal", `${key} is not JSON`);
209
+ }
210
+ return { value: parse(raw, key), revision: entry.revision };
211
+ }
212
+ export function openChatAuthorityStore(kv, jsm, space) {
213
+ const readHolder = async (owner, h) => {
214
+ const key = chatHolderKey(owner, h);
215
+ return decode(await kv.get(key), key, parseChatHolderIndex);
216
+ };
217
+ const readQuota = async (owner) => {
218
+ const key = chatOwnerKey(owner);
219
+ return decode(await kv.get(key), key, parseChatOwnerQuota);
220
+ };
221
+ const createOnly = async (key, value) => {
222
+ try {
223
+ return { created: true, revision: await createRecordEntry(kv, key, value) };
224
+ }
225
+ catch (e) {
226
+ if (isConflict(e))
227
+ return { created: false };
228
+ throw unknownOutcome(`create of ${key}`, e);
229
+ }
230
+ };
231
+ const writeQuota = async (owner, observed, next) => {
232
+ const key = chatOwnerKey(owner);
233
+ parseChatOwnerQuota(next, key);
234
+ try {
235
+ return observed === undefined ? await createRecordEntry(kv, key, next) : await updateRecordEntry(kv, key, next, observed.revision);
236
+ }
237
+ catch (e) {
238
+ if (isConflict(e))
239
+ throw e;
240
+ throw unknownOutcome(`write of ${key}`, e);
241
+ }
242
+ };
243
+ return {
244
+ readHolder,
245
+ readQuota,
246
+ async createHolderReserved(owner, h, value) {
247
+ const key = chatHolderKey(owner, h);
248
+ if (value.state !== "reserved" || value.lifecycleUid !== null || value.retiredBy !== undefined)
249
+ throw new EpEnvelopeError("internal", `${key}: an admission index is born reserved with a null UID`);
250
+ parseChatHolderIndex(value, key);
251
+ return createOnly(key, value);
252
+ },
253
+ async createHolderFence(owner, h, entry) {
254
+ const key = chatHolderKey(owner, h);
255
+ if (entry.holderHash !== h)
256
+ throw new EpEnvelopeError("internal", `${key}: the fence names another holder`);
257
+ const fence = {
258
+ v: 1, state: "retired", actor: entry.actor, lifecycleUid: null, reservedAt: entry.reservedAt, expiresAt: entry.reservedAt,
259
+ ceiling: { read: [], post: [] }, parentPinDigest: null, retiredBy: "sweep",
260
+ };
261
+ parseChatHolderIndex(fence, key);
262
+ return createOnly(key, fence);
263
+ },
264
+ async casHolder(owner, h, from, to) {
265
+ const key = chatHolderKey(owner, h);
266
+ parseChatHolderIndex(to, key);
267
+ assertHolderTransition(from.value, to, key);
268
+ try {
269
+ return { value: to, revision: await updateRecordEntry(kv, key, to, from.revision) };
270
+ }
271
+ catch (e) {
272
+ if (isConflict(e))
273
+ throw e;
274
+ throw unknownOutcome(`CAS of ${key}`, e);
275
+ }
276
+ },
277
+ async reserveQuota(owner, h, now) {
278
+ assertHolderHash(h);
279
+ if (!epochMs(now))
280
+ throw new EpEnvelopeError("internal", "reserveQuota needs the authority clock");
281
+ let lastUnknown;
282
+ for (let attempt = 0; attempt < CHAT_QUOTA_ATTEMPTS; attempt++) {
283
+ const observed = await readQuota(owner);
284
+ const q = observed?.value ?? { v: 1, live: [], window: { startMs: 0, count: 0 } };
285
+ const mine = q.live.find((e) => e.holderHash === h);
286
+ // The reservation landed (this attempt's predecessor, an unknown ack, or a concurrent same-
287
+ // holder admission): reuse it, never add a second entry, never count it twice.
288
+ if (mine)
289
+ return { actor: mine.actor, reservedAt: mine.reservedAt, reused: true };
290
+ if (q.live.length >= CHAT_LIVE_MAX) {
291
+ const oldest = [...q.live].sort((a, b) => a.reservedAt - b.reservedAt)[0];
292
+ throw new EpEnvelopeError("conflict", `owner ${owner} already holds ${CHAT_LIVE_MAX} chat sessions; the oldest is ${oldest.actor} (reserved ${new Date(oldest.reservedAt).toISOString()}). Close one, or wait for it to expire, then open again`);
293
+ }
294
+ const current = now - q.window.startMs < CHAT_WINDOW_MS && q.window.startMs <= now;
295
+ if (current && q.window.count >= CHAT_WINDOW_MAX)
296
+ throw new EpEnvelopeError("resource-exhausted", `owner ${owner} opened ${CHAT_WINDOW_MAX} chat sessions in this minute; retry after ${new Date(q.window.startMs + CHAT_WINDOW_MS).toISOString()}`);
297
+ const entry = { holderHash: h, actor: drawChatActor(), reservedAt: now };
298
+ const next = {
299
+ v: 1,
300
+ live: [...q.live, entry],
301
+ window: current ? { startMs: q.window.startMs, count: q.window.count + 1 } : { startMs: now, count: 1 },
302
+ };
303
+ try {
304
+ await writeQuota(owner, observed, next);
305
+ return { actor: entry.actor, reservedAt: entry.reservedAt, reused: false };
306
+ }
307
+ catch (e) {
308
+ if (isConflict(e))
309
+ continue; // a peer moved Q: re-read and re-decide
310
+ lastUnknown = e; // unknown ack: the next leader read decides whether it landed
311
+ }
312
+ }
313
+ // Exhausted. Never a refusal that could hide a landed reservation.
314
+ throw unknownOutcome(`chat quota reservation for owner ${owner}`, lastUnknown ?? new Error("the quota record kept moving"));
315
+ },
316
+ async releaseQuotaEntry(owner, h, observed) {
317
+ const live = observed.value.live.filter((e) => e.holderHash !== h);
318
+ if (live.length === observed.value.live.length)
319
+ return "absent";
320
+ await writeQuota(owner, observed, { ...observed.value, live });
321
+ return "released";
322
+ },
323
+ async rewriteQuotaEntryActor(owner, h, actor, observed) {
324
+ assertChatActor(actor);
325
+ const at = observed.value.live.findIndex((e) => e.holderHash === h);
326
+ if (at < 0)
327
+ return "absent";
328
+ const live = observed.value.live.map((e, i) => (i === at ? { ...e, actor } : e));
329
+ await writeQuota(owner, observed, { ...observed.value, live });
330
+ return "rewritten";
331
+ },
332
+ async readCursor() {
333
+ return decode(await kv.get(CHAT_SWEEP_CURSOR_KEY), CHAT_SWEEP_CURSOR_KEY, (raw) => parseChatSweepCursor(raw));
334
+ },
335
+ async casCursor(observed, next) {
336
+ parseChatSweepCursor(next);
337
+ try {
338
+ return observed === undefined
339
+ ? await createRecordEntry(kv, CHAT_SWEEP_CURSOR_KEY, next)
340
+ : await updateRecordEntry(kv, CHAT_SWEEP_CURSOR_KEY, next, observed.revision);
341
+ }
342
+ catch (e) {
343
+ if (isConflict(e))
344
+ throw e;
345
+ throw unknownOutcome(`CAS of ${CHAT_SWEEP_CURSOR_KEY}`, e);
346
+ }
347
+ },
348
+ async scanPage(family, afterSeq, limit) {
349
+ if (!uint(afterSeq) || !Number.isSafeInteger(limit) || limit < 1)
350
+ throw new EpEnvelopeError("bad-request", "scanPage needs a sequence and a positive limit");
351
+ const bucket = epAuthBucket(space);
352
+ const prefix = `$KV.${bucket}.`;
353
+ const filter = family === "holder" ? `${prefix}${CHAT_HOLDER_PREFIX}.*.*` : `${prefix}${CHAT_OWNER_PREFIX}.*`;
354
+ const out = [];
355
+ let seq = afterSeq + 1;
356
+ while (out.length < limit) {
357
+ let m;
358
+ try {
359
+ m = await jsm.streams.getMessage(`KV_${bucket}`, { seq, next_by_subj: filter });
360
+ }
361
+ catch (e) {
362
+ if (e.code === 10037)
363
+ break; // no further message on the filter
364
+ throw e;
365
+ }
366
+ if (!m)
367
+ break;
368
+ seq = m.seq + 1;
369
+ const op = m.header?.get("KV-Operation");
370
+ if (op)
371
+ throw new EpEnvelopeError("failed-precondition", `${m.subject} carries a ${op} marker; chat authority records are never deleted (SPEC 13.12)`);
372
+ out.push({ key: m.subject.slice(prefix.length), seq: m.seq });
373
+ }
374
+ return out;
375
+ },
376
+ };
377
+ }
378
+ /** Parse a scanned holder key back to its coordinates; anything else refuses. */
379
+ export function parseChatHolderKey(key) {
380
+ const parts = key.split(".");
381
+ if (parts.length !== 3 || parts[0] !== CHAT_HOLDER_PREFIX)
382
+ throw new EpEnvelopeError("internal", `${key} is not a chat holder key`);
383
+ return { owner: assertDerivedOwnerToken(parts[1]), holderHash: assertHolderHash(parts[2]) };
384
+ }
385
+ /** Parse a scanned owner-quota key back to its owner; anything else refuses. */
386
+ export function parseChatOwnerKey(key) {
387
+ const parts = key.split(".");
388
+ if (parts.length !== 2 || parts[0] !== CHAT_OWNER_PREFIX)
389
+ throw new EpEnvelopeError("internal", `${key} is not a chat owner key`);
390
+ return assertDerivedOwnerToken(parts[1]);
391
+ }
392
+ //# sourceMappingURL=chat-session-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-session-store.js","sourceRoot":"","sources":["../src/chat-session-store.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,4 @@
1
- export {};
1
+ /** Record one `agent-bearer` attempt in the manager-composed health file, 0o600 and never through a
2
+ * symlink ({@link writePrivateRecord}). */
3
+ export declare function writeAgentAuthHealth(path: string, state: "ok" | "failed", reason?: string): void;
2
4
  //# sourceMappingURL=commands.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AA0ZA;4CAC4C;AAC5C,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAEhG"}