@cotal-ai/core 0.12.0 → 0.13.1

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 (152) hide show
  1. package/dist/acls.d.ts +31 -7
  2. package/dist/acls.d.ts.map +1 -1
  3. package/dist/acls.js +105 -17
  4. package/dist/acls.js.map +1 -1
  5. package/dist/agent-file.js +1 -1
  6. package/dist/agent-file.js.map +1 -1
  7. package/dist/auth-provider.d.ts +8 -0
  8. package/dist/auth-provider.d.ts.map +1 -1
  9. package/dist/auth-provider.js.map +1 -1
  10. package/dist/backup.d.ts.map +1 -1
  11. package/dist/backup.js +6 -4
  12. package/dist/backup.js.map +1 -1
  13. package/dist/broker-floor.d.ts +34 -0
  14. package/dist/broker-floor.d.ts.map +1 -0
  15. package/dist/broker-floor.js +39 -0
  16. package/dist/broker-floor.js.map +1 -0
  17. package/dist/canonical.d.ts +24 -0
  18. package/dist/canonical.d.ts.map +1 -0
  19. package/dist/canonical.js +159 -0
  20. package/dist/canonical.js.map +1 -0
  21. package/dist/connector.d.ts +4 -0
  22. package/dist/connector.d.ts.map +1 -1
  23. package/dist/endpoint-action.d.ts +424 -0
  24. package/dist/endpoint-action.d.ts.map +1 -0
  25. package/dist/endpoint-action.js +910 -0
  26. package/dist/endpoint-action.js.map +1 -0
  27. package/dist/endpoint-binding.d.ts +344 -0
  28. package/dist/endpoint-binding.d.ts.map +1 -0
  29. package/dist/endpoint-binding.js +753 -0
  30. package/dist/endpoint-binding.js.map +1 -0
  31. package/dist/endpoint-checkpoint.d.ts +292 -0
  32. package/dist/endpoint-checkpoint.d.ts.map +1 -0
  33. package/dist/endpoint-checkpoint.js +818 -0
  34. package/dist/endpoint-checkpoint.js.map +1 -0
  35. package/dist/endpoint-cluster.d.ts +95 -0
  36. package/dist/endpoint-cluster.d.ts.map +1 -0
  37. package/dist/endpoint-cluster.js +194 -0
  38. package/dist/endpoint-cluster.js.map +1 -0
  39. package/dist/endpoint-contract-store.d.ts +90 -0
  40. package/dist/endpoint-contract-store.d.ts.map +1 -0
  41. package/dist/endpoint-contract-store.js +348 -0
  42. package/dist/endpoint-contract-store.js.map +1 -0
  43. package/dist/endpoint-envelope.d.ts +165 -0
  44. package/dist/endpoint-envelope.d.ts.map +1 -0
  45. package/dist/endpoint-envelope.js +346 -0
  46. package/dist/endpoint-envelope.js.map +1 -0
  47. package/dist/endpoint-grants.d.ts +123 -0
  48. package/dist/endpoint-grants.d.ts.map +1 -0
  49. package/dist/endpoint-grants.js +215 -0
  50. package/dist/endpoint-grants.js.map +1 -0
  51. package/dist/endpoint-guard.d.ts +222 -0
  52. package/dist/endpoint-guard.d.ts.map +1 -0
  53. package/dist/endpoint-guard.js +468 -0
  54. package/dist/endpoint-guard.js.map +1 -0
  55. package/dist/endpoint-handle.d.ts +176 -0
  56. package/dist/endpoint-handle.d.ts.map +1 -0
  57. package/dist/endpoint-handle.js +608 -0
  58. package/dist/endpoint-handle.js.map +1 -0
  59. package/dist/endpoint-journal.d.ts +225 -0
  60. package/dist/endpoint-journal.d.ts.map +1 -0
  61. package/dist/endpoint-journal.js +431 -0
  62. package/dist/endpoint-journal.js.map +1 -0
  63. package/dist/endpoint-receipt.d.ts +225 -0
  64. package/dist/endpoint-receipt.d.ts.map +1 -0
  65. package/dist/endpoint-receipt.js +417 -0
  66. package/dist/endpoint-receipt.js.map +1 -0
  67. package/dist/endpoint-records.d.ts +243 -0
  68. package/dist/endpoint-records.d.ts.map +1 -0
  69. package/dist/endpoint-records.js +591 -0
  70. package/dist/endpoint-records.js.map +1 -0
  71. package/dist/endpoint-serve.d.ts +176 -0
  72. package/dist/endpoint-serve.d.ts.map +1 -0
  73. package/dist/endpoint-serve.js +446 -0
  74. package/dist/endpoint-serve.js.map +1 -0
  75. package/dist/endpoint-service.d.ts +518 -0
  76. package/dist/endpoint-service.d.ts.map +1 -0
  77. package/dist/endpoint-service.js +973 -0
  78. package/dist/endpoint-service.js.map +1 -0
  79. package/dist/endpoint-session.d.ts +398 -0
  80. package/dist/endpoint-session.d.ts.map +1 -0
  81. package/dist/endpoint-session.js +834 -0
  82. package/dist/endpoint-session.js.map +1 -0
  83. package/dist/endpoint-signing.d.ts +105 -0
  84. package/dist/endpoint-signing.d.ts.map +1 -0
  85. package/dist/endpoint-signing.js +190 -0
  86. package/dist/endpoint-signing.js.map +1 -0
  87. package/dist/endpoint-subjects.d.ts +222 -0
  88. package/dist/endpoint-subjects.d.ts.map +1 -0
  89. package/dist/endpoint-subjects.js +381 -0
  90. package/dist/endpoint-subjects.js.map +1 -0
  91. package/dist/endpoint-supervisor.d.ts +19 -0
  92. package/dist/endpoint-supervisor.d.ts.map +1 -0
  93. package/dist/endpoint-supervisor.js +12 -0
  94. package/dist/endpoint-supervisor.js.map +1 -0
  95. package/dist/endpoint-traits.d.ts +225 -0
  96. package/dist/endpoint-traits.d.ts.map +1 -0
  97. package/dist/endpoint-traits.js +469 -0
  98. package/dist/endpoint-traits.js.map +1 -0
  99. package/dist/endpoint-verbs.d.ts +277 -0
  100. package/dist/endpoint-verbs.d.ts.map +1 -0
  101. package/dist/endpoint-verbs.js +576 -0
  102. package/dist/endpoint-verbs.js.map +1 -0
  103. package/dist/endpoint-virtual.d.ts +308 -0
  104. package/dist/endpoint-virtual.d.ts.map +1 -0
  105. package/dist/endpoint-virtual.js +440 -0
  106. package/dist/endpoint-virtual.js.map +1 -0
  107. package/dist/endpoint-work.d.ts +304 -0
  108. package/dist/endpoint-work.d.ts.map +1 -0
  109. package/dist/endpoint-work.js +728 -0
  110. package/dist/endpoint-work.js.map +1 -0
  111. package/dist/endpoint.d.ts +66 -22
  112. package/dist/endpoint.d.ts.map +1 -1
  113. package/dist/endpoint.js +289 -89
  114. package/dist/endpoint.js.map +1 -1
  115. package/dist/evict.d.ts +95 -32
  116. package/dist/evict.d.ts.map +1 -1
  117. package/dist/evict.js +193 -3
  118. package/dist/evict.js.map +1 -1
  119. package/dist/index.d.ts +25 -0
  120. package/dist/index.d.ts.map +1 -1
  121. package/dist/index.js +25 -0
  122. package/dist/index.js.map +1 -1
  123. package/dist/lease.d.ts +4 -0
  124. package/dist/lease.d.ts.map +1 -1
  125. package/dist/lease.js.map +1 -1
  126. package/dist/members.d.ts +4 -4
  127. package/dist/members.d.ts.map +1 -1
  128. package/dist/members.js +12 -12
  129. package/dist/members.js.map +1 -1
  130. package/dist/provision.d.ts +70 -18
  131. package/dist/provision.d.ts.map +1 -1
  132. package/dist/provision.js +194 -33
  133. package/dist/provision.js.map +1 -1
  134. package/dist/safe-pattern.d.ts +33 -0
  135. package/dist/safe-pattern.d.ts.map +1 -0
  136. package/dist/safe-pattern.js +486 -0
  137. package/dist/safe-pattern.js.map +1 -0
  138. package/dist/schema-profile.d.ts +93 -0
  139. package/dist/schema-profile.d.ts.map +1 -0
  140. package/dist/schema-profile.js +284 -0
  141. package/dist/schema-profile.js.map +1 -0
  142. package/dist/streams.d.ts +13 -8
  143. package/dist/streams.d.ts.map +1 -1
  144. package/dist/streams.js +35 -18
  145. package/dist/streams.js.map +1 -1
  146. package/dist/subjects.d.ts +100 -40
  147. package/dist/subjects.d.ts.map +1 -1
  148. package/dist/subjects.js +136 -60
  149. package/dist/subjects.js.map +1 -1
  150. package/dist/types.d.ts +9 -0
  151. package/dist/types.d.ts.map +1 -1
  152. package/package.json +3 -1
@@ -0,0 +1,381 @@
1
+ /**
2
+ * v0.4 endpoint control-surface subject grammar (SPEC §13.2) — builders, parsers, and token
3
+ * validators for the `ep` request/reply rails and the endpoint-published planes
4
+ * (`epe`/`epf`/`epj`/`ept`/`epr`/`epc`/`epw`/`eps`).
5
+ *
6
+ * Builders validate FAIL-LOUD (the spec's build-time boundary: bad token or an over-1024-byte
7
+ * subject throws, never truncates). The parser mirrors {@link parseSubject}'s trust model: it
8
+ * SPLITS AND DISPATCHES only — the broker already forge-locked the identity slots via the minted
9
+ * grant, so a reader recovers tokens, it does not re-prove their grammar. What the parser DOES
10
+ * enforce is SHAPE: prefix, plane, exact arity, and the §13.2 explicit-discrimination rule (the
11
+ * token after `<command>` is either one of the six reserved authorization-mode tokens or the
12
+ * caller's owner token). §2's owner grammar (`local` or `u_`+base32) keeps those sets disjoint
13
+ * for every spec-conformant mint; this module's owner validator is deliberately wider (it admits
14
+ * legacy principal tokens), so the dispatch additionally rests on each mode's pinned arity — a
15
+ * colliding token parses to `null`, never to a confused identity. A subject matching no defined
16
+ * shape returns `null` and MUST NOT be handled.
17
+ */
18
+ import { ROOT, spacePrefix, assertValidOwnerToken, assertLifecycleToken } from "./subjects.js";
19
+ // One grammar bounds both `lifecycleUid` and `instanceId` (§13.1) — the definition lives in
20
+ // subjects.ts (the messaging plane lifecycle-keys resource names with it); re-exported here so the
21
+ // endpoint rails keep their import surface.
22
+ export { assertLifecycleToken, mintLifecycleUid } from "./subjects.js";
23
+ /** The v0.4 wire version this surface targets. Advertised (§6 `protocolVersion`) only at the
24
+ * §13.11 cutover — a change signal, not negotiation; nothing pre-cut should flip the card. */
25
+ export const PROTOCOL_VERSION_V04 = "0.4";
26
+ /** Reserved command names (§13.2): every endpoint serves `describe` (§13.7); `cancel` is the
27
+ * action-composite control command (§13.6). */
28
+ export const RESERVED_COMMANDS = Object.freeze(["describe", "cancel"]);
29
+ // ---- token grammars (§13.2 "Token bounds", §13.1) -----------------------------------------
30
+ const ENDPOINT_LABEL = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/;
31
+ const COMMAND = /^[a-z0-9-]{1,32}$/;
32
+ const NONCE = /^[A-Za-z0-9_-]{22,64}$/;
33
+ const ID = /^[A-Za-z0-9_-]{1,64}$/; // <id>, <goalId>, <timerId>, <token>, <sessionId>
34
+ const GRANT_ID = /^[a-z0-9]{1,32}$/; // <gid>: separator-free, so multi-soft-component durable names stay injective (§13.9)
35
+ const DIGEST_HEX = /^[a-f0-9]{64}$/;
36
+ const EPOCH = /^(0|[1-9][0-9]*)$/;
37
+ /** Maximum total subject size (bytes) on the endpoint rails; builders throw above it. */
38
+ export const MAX_EP_SUBJECT_BYTES = 1024;
39
+ /** Validate a dotted endpoint NAME (one or more DNS-shaped labels; `_` never appears in a label)
40
+ * and return its wire TOKEN (`.` → `_`, bijective because labels cannot contain `_`). Single-label
41
+ * names are reserved for reference-implementation endpoints; a third-party name MUST be
42
+ * reverse-DNS — that is an AUTHORITY rule enforced at mint (§13.9), not a shape difference, so
43
+ * both build here. */
44
+ export function endpointToken(name) {
45
+ const labels = name.split(".");
46
+ for (const l of labels) {
47
+ if (!ENDPOINT_LABEL.test(l))
48
+ throw new Error(`endpoint name label "${l}" in "${name}" is not DNS-shaped ([a-z0-9]([a-z0-9-]*[a-z0-9])?)`);
49
+ }
50
+ const tok = labels.join("_");
51
+ if (tok.length > 64)
52
+ throw new Error(`endpoint name token "${tok}" exceeds 64 characters`);
53
+ return tok;
54
+ }
55
+ /** Inverse of {@link endpointToken}: recover the dotted endpoint name from its wire token. */
56
+ export function endpointNameOf(token) {
57
+ return token.split("_").join(".");
58
+ }
59
+ export function assertCommandToken(command) {
60
+ if (!COMMAND.test(command))
61
+ throw new Error(`command "${command}" is not a valid command token ([a-z0-9-]{1,32})`);
62
+ return command;
63
+ }
64
+ export function assertNonce(nonce) {
65
+ if (!NONCE.test(nonce))
66
+ throw new Error(`nonce is not a valid nonce token ([A-Za-z0-9_-]{22,64}; >=128 bits of CSPRNG entropy)`);
67
+ return nonce;
68
+ }
69
+ export function assertIdToken(v, what = "id") {
70
+ if (!ID.test(v))
71
+ throw new Error(`${what} "${v}" is not a valid id token ([A-Za-z0-9_-]{1,64})`);
72
+ return v;
73
+ }
74
+ /** The provisioner-assigned grant id `<gid>` (§13.9). Deliberately SEPARATOR-FREE ([a-z0-9]):
75
+ * the `eve_<uid>-<e>-<gid>-<n>` and `rec_<uid>-<gid>-<n>` reader-durable names carry it adjacent
76
+ * to other soft components across `-`, so a `-` (or `_`) inside `<gid>` would make the name
77
+ * non-injective (`eve_<uid>-a-b-c-0` could be endpoint `a-b`/gid `c` OR endpoint `a`/gid `b-c`).
78
+ * Constraining `<gid>` to a separator-free grammar keeps the tuple encoding unambiguous while
79
+ * `<uid>` is `-`-free (leading) and `<n>` is digits (trailing). */
80
+ export function assertGrantId(v, what = "grantId") {
81
+ if (!GRANT_ID.test(v))
82
+ throw new Error(`${what} "${v}" is not a valid grant id ([a-z0-9]{1,32}; separator-free so reader-durable names stay injective)`);
83
+ return v;
84
+ }
85
+ /** `<pool>` uses the command-token grammar (§13.2). */
86
+ export function assertPoolToken(pool) {
87
+ if (!COMMAND.test(pool))
88
+ throw new Error(`pool "${pool}" is not a valid pool token ([a-z0-9-]{1,32})`);
89
+ return pool;
90
+ }
91
+ function assertEpoch(epoch) {
92
+ if (!Number.isSafeInteger(epoch) || epoch < 0)
93
+ throw new Error(`epoch ${epoch} is not an unsigned integer`);
94
+ return String(epoch);
95
+ }
96
+ /** The shared owner/actor token validator for this grammar (§13.2 token bounds): the base
97
+ * owner-token grammar plus the 64-character rail bound. Grant builders MUST route through the
98
+ * same validator as subject builders, so the two can never diverge on what they admit. */
99
+ export function assertBoundedOwner(v, what) {
100
+ assertValidOwnerToken(v);
101
+ if (v.length > 64)
102
+ throw new Error(`${what} "${v}" exceeds 64 characters`);
103
+ return v;
104
+ }
105
+ function assertSized(subject) {
106
+ if (new TextEncoder().encode(subject).length > MAX_EP_SUBJECT_BYTES)
107
+ throw new Error(`subject exceeds ${MAX_EP_SUBJECT_BYTES} bytes: ${subject.slice(0, 80)}…`);
108
+ return subject;
109
+ }
110
+ /** The six reserved authorization-mode tokens. Disjoint from every spec-conformant owner token
111
+ * (`local` or `u_`+base32 per §2, never a bare mode word); the implementation's owner validator
112
+ * also admits legacy principal tokens, so the parser's discrimination rests on membership in
113
+ * this set PLUS each mode's pinned arity, not on the owner grammar alone. */
114
+ export const EP_AUTHZ_MODES = Object.freeze(["self", "owner", "any", "child", "ledger", "handle"]);
115
+ const AUTHZ_SET = new Set(EP_AUTHZ_MODES);
116
+ /** Is `m` a registered targeted-command authorization mode? Consults the PRIVATE module-load set,
117
+ * never the live export, so a post-import mutation of {@link EP_AUTHZ_MODES} cannot widen the
118
+ * modes a cluster document may declare (the afa715b integrity class). */
119
+ export function isEpAuthzMode(m) { return AUTHZ_SET.has(m); }
120
+ const TARGET_ARITY = { self: 0, owner: 1, any: 1, child: 1, ledger: 1, handle: 3 };
121
+ function targetTokens(target) {
122
+ if (target.mode === "self")
123
+ return ["self"];
124
+ if (target.mode === "handle")
125
+ return ["handle", assertBoundedOwner(target.tOwner, "target owner"), assertBoundedOwner(target.tActor, "target actor"), assertLifecycleToken(target.tUid, "target lifecycleUid")];
126
+ return [target.mode, assertBoundedOwner(target.tOwner, "target owner")];
127
+ }
128
+ /** The caller triple as validated subject tokens — the ONE validation every caller-scoped
129
+ * subject and filter goes through. */
130
+ export function callerTokens(caller) {
131
+ return [
132
+ assertBoundedOwner(caller.owner, "caller owner"),
133
+ assertBoundedOwner(caller.actor, "caller actor"),
134
+ assertLifecycleToken(caller.uid, "caller lifecycleUid"),
135
+ ];
136
+ }
137
+ /** Build a request subject (class, scatter, or instance form; targeted iff `target` is given). */
138
+ export function epRequestSubject(space, req) {
139
+ const parts = [spacePrefix(space), "ep", req.route.mode, endpointToken(req.endpoint)];
140
+ if (req.route.mode === "inst")
141
+ parts.push(assertLifecycleToken(req.route.instanceId, "instanceId"));
142
+ parts.push(assertCommandToken(req.command));
143
+ if (req.target)
144
+ parts.push(...targetTokens(req.target));
145
+ parts.push(...callerTokens(req.caller), assertNonce(req.nonce));
146
+ return assertSized(parts.join("."));
147
+ }
148
+ /** Build a reply subject: the responder's own endpoint/instance/epoch prefix plus the caller
149
+ * triple and nonce. Use {@link deriveReplySubject} to answer a request — replies MUST derive
150
+ * from the authenticated request subject, never from a transport- or payload-supplied target. */
151
+ export function epReplySubject(space, r) {
152
+ return assertSized([
153
+ spacePrefix(space), "ep", "reply", endpointToken(r.endpoint), assertLifecycleToken(r.instanceId, "instanceId"),
154
+ assertEpoch(r.epoch), ...callerTokens(r.caller), assertNonce(r.nonce),
155
+ ].join("."));
156
+ }
157
+ /** Deterministic reply derivation (§13.2 "Replies"): copy the caller triple + nonce off the
158
+ * broker-authenticated PARSED request and prefix the responder's own instance identity. Taking
159
+ * a {@link ParsedEpRequest} (not a raw string) makes the confused-deputy boundary structural:
160
+ * there is no argument through which a payload-supplied reply target could arrive. */
161
+ export function deriveReplySubject(space, request, responder) {
162
+ return epReplySubject(space, {
163
+ endpoint: request.endpoint,
164
+ instanceId: responder.instanceId,
165
+ epoch: responder.epoch,
166
+ caller: request.caller,
167
+ nonce: request.nonce,
168
+ });
169
+ }
170
+ // ---- serve / read filters (§13.2, §13.9) ----------------------------------------------------
171
+ /** The class rail's canonical queue group: the endpoint-name token. Serve subscriptions to the
172
+ * `one` rail are queue-qualified ONLY (§13.9) — no credential may plain-subscribe it, which is
173
+ * what keeps per-request nonces visible only to the queue-selected instance. */
174
+ export function epClassQueueGroup(endpoint) {
175
+ return endpointToken(endpoint);
176
+ }
177
+ /** Subscription filter for a class (`one`) or scatter (`all`) serve. */
178
+ export function epServeFilter(space, mode, endpoint) {
179
+ return `${spacePrefix(space)}.ep.${mode}.${endpointToken(endpoint)}.>`;
180
+ }
181
+ /** Subscription filter for one instance's own request rail. */
182
+ export function epInstanceServeFilter(space, endpoint, instanceId) {
183
+ return `${spacePrefix(space)}.ep.inst.${endpointToken(endpoint)}.${assertLifecycleToken(instanceId, "instanceId")}.>`;
184
+ }
185
+ /** A caller's reply-read filter — its OWN rail only, exact arity (no `>` tail admits subjects
186
+ * outside the grammar): `ep.reply.*.*.*.<owner>.<actor>.<uid>.*`. */
187
+ export function epCallerReplyFilter(space, caller) {
188
+ return `${spacePrefix(space)}.ep.reply.*.*.*.${callerTokens(caller).join(".")}.*`;
189
+ }
190
+ /** A responder's reply-publish pattern — its own instance triple and epoch pinned, all caller
191
+ * suffixes spanned (addressing is confined by nonce possession, §13.2): exact arity. */
192
+ export function epResponderReplyPattern(space, endpoint, instanceId, epoch) {
193
+ return `${spacePrefix(space)}.ep.reply.${endpointToken(endpoint)}.${assertLifecycleToken(instanceId, "instanceId")}.${assertEpoch(epoch)}.*.*.*.*`;
194
+ }
195
+ function topicPath(topic, what) {
196
+ if (topic.length === 0)
197
+ throw new Error(`${what} topic must have at least one token`);
198
+ for (const t of topic)
199
+ if (t.length === 0 || t.includes("."))
200
+ throw new Error(`${what} topic token "${t}" is empty or dotted`);
201
+ return topic.join(".");
202
+ }
203
+ /** Events: `epe.<endpoint>.<instanceId>.<epoch>.<topic…>` — the publishing instance's identity
204
+ * and epoch are forge-locked subject tokens (stale-epoch events are attributably stale). */
205
+ export function epeSubject(space, endpoint, instanceId, epoch, topic) {
206
+ return assertSized(`${spacePrefix(space)}.epe.${endpointToken(endpoint)}.${assertLifecycleToken(instanceId, "instanceId")}.${assertEpoch(epoch)}.${topicPath(topic, "event")}`);
207
+ }
208
+ /** Canonical facts: `epf.<endpoint>.<topic…>` — publishable only by the mediated writer (§13.9). */
209
+ export function epfSubject(space, endpoint, topic) {
210
+ return assertSized(`${spacePrefix(space)}.epf.${endpointToken(endpoint)}.${topicPath(topic, "fact")}`);
211
+ }
212
+ /** Journal submissions: `epj.<endpoint>.<command>[.<authz>[.<target…>]].<owner>.<actor>.<uid>` —
213
+ * directly publishable by capability holders and explicitly UNTRUSTED (§13.4); a targeted
214
+ * command carries the same authz/target block as its request forms, no nonce. */
215
+ export function epjSubject(space, j) {
216
+ const parts = [spacePrefix(space), "epj", endpointToken(j.endpoint), assertCommandToken(j.command)];
217
+ if (j.target)
218
+ parts.push(...targetTokens(j.target));
219
+ parts.push(...callerTokens(j.caller));
220
+ return assertSized(parts.join("."));
221
+ }
222
+ /** Timers: `ept.<endpoint>.<instanceId>.<epoch>.<timerId>.<schedule|armed|fire>` (§13.2). */
223
+ export function eptSubject(space, endpoint, instanceId, epoch, timerId, phase) {
224
+ return assertSized(`${spacePrefix(space)}.ept.${endpointToken(endpoint)}.${assertLifecycleToken(instanceId, "instanceId")}.${assertEpoch(epoch)}.${assertIdToken(timerId, "timerId")}.${phase}`);
225
+ }
226
+ /** Record writes: `epr.<endpoint>.<instanceId>.<epoch>.<kind>.<qualifier…>` — the instance's
227
+ * epoch-pinned mediated record-writer ingress (§13.9 reads the epoch off this subject). */
228
+ export function eprSubject(space, endpoint, instanceId, epoch, kind, qualifier = []) {
229
+ const tail = qualifier.length ? `.${topicPath(qualifier, "record qualifier")}` : "";
230
+ return assertSized(`${spacePrefix(space)}.epr.${endpointToken(endpoint)}.${assertLifecycleToken(instanceId, "instanceId")}.${assertEpoch(epoch)}.${assertIdToken(kind, "record kind")}${tail}`);
231
+ }
232
+ /** Contract artifacts: `epc.<digest-hex>` — one immutable artifact per subject; the token is the
233
+ * SHA-256 hex (the `sha256:` prefix is not a subject token, §13.7). */
234
+ export function epcSubject(space, digestHex) {
235
+ if (!DIGEST_HEX.test(digestHex))
236
+ throw new Error(`contract digest "${digestHex}" is not 64 lowercase hex chars`);
237
+ return `${spacePrefix(space)}.epc.${digestHex}`;
238
+ }
239
+ /** Work pools: `epw.<endpoint>.<pool>.<cOwner>.<cActor>.<cUid>.<id>` — the trailing four tokens
240
+ * are the item's ACCEPTANCE IDENTITY (the accepted submission's caller triple + request id). */
241
+ export function epwSubject(space, endpoint, pool, acceptance) {
242
+ return assertSized(`${spacePrefix(space)}.epw.${endpointToken(endpoint)}.${assertPoolToken(pool)}.${callerTokens(acceptance).join(".")}.${assertIdToken(acceptance.id)}`);
243
+ }
244
+ /** Sessions: `eps.<endpoint>.<sessionId>.<epoch>.<in|out>` (§13.6). */
245
+ export function epsSubject(space, endpoint, sessionId, epoch, dir) {
246
+ return assertSized(`${spacePrefix(space)}.eps.${endpointToken(endpoint)}.${assertIdToken(sessionId, "sessionId")}.${assertEpoch(epoch)}.${dir}`);
247
+ }
248
+ /** Read the `[.<authz>[.<target…>]].<owner>.<actor>.<uid>` tail (plus `withNonce` trailing
249
+ * token) starting at `i`. Dispatches on the token at `i`: a reserved mode token opens a
250
+ * target block of that mode's pinned arity; anything else is the caller's owner token (the
251
+ * two sets are disjoint by construction — never arity counting). Exact arity: returns null
252
+ * unless the tokens run out exactly at the end. */
253
+ function parseTail(parts, i, withNonce) {
254
+ let target = null;
255
+ const disc = parts[i];
256
+ if (disc !== undefined && AUTHZ_SET.has(disc)) {
257
+ const mode = disc;
258
+ const arity = TARGET_ARITY[mode];
259
+ const t = parts.slice(i + 1, i + 1 + arity);
260
+ if (t.length !== arity)
261
+ return null;
262
+ target =
263
+ mode === "self" ? { mode }
264
+ : mode === "handle" ? { mode, tOwner: t[0], tActor: t[1], tUid: t[2] }
265
+ : { mode, tOwner: t[0] };
266
+ i += 1 + arity;
267
+ }
268
+ const want = i + 3 + (withNonce ? 1 : 0);
269
+ if (parts.length !== want)
270
+ return null;
271
+ const caller = { owner: parts[i], actor: parts[i + 1], uid: parts[i + 2] };
272
+ return withNonce ? { target, caller, nonce: parts[i + 3] } : { target, caller };
273
+ }
274
+ function parseEpoch(tok) {
275
+ if (!EPOCH.test(tok))
276
+ return null;
277
+ const n = Number(tok);
278
+ // Mirror assertEpoch's build-side bound: past 2^53 distinct tokens would Number()-collapse
279
+ // into one value, and epoch is the fence on every plane that carries it.
280
+ return Number.isSafeInteger(n) ? n : null;
281
+ }
282
+ /**
283
+ * Parse a v0.4 endpoint-surface subject into its typed shape, or `null` for anything that is not
284
+ * one — including the retired v0 `ctl.>`/`control.>` planes, which this parser deliberately does
285
+ * not know. `null` means the subject has no sender and MUST NOT be handled (§13.2).
286
+ */
287
+ export function parseEpSubject(subject) {
288
+ if (new TextEncoder().encode(subject).length > MAX_EP_SUBJECT_BYTES)
289
+ return null;
290
+ const parts = subject.split(".");
291
+ if (parts[0] !== ROOT || parts.length < 4)
292
+ return null; // cotal.<space>.<plane>.…
293
+ const plane = parts[2];
294
+ if (plane === "ep") {
295
+ const route = parts[3];
296
+ if (route === "one" || route === "all") {
297
+ if (parts.length < 10)
298
+ return null;
299
+ const tail = parseTail(parts, 6, true);
300
+ if (!tail)
301
+ return null;
302
+ return { plane: "request", route, endpoint: endpointNameOf(parts[4]), command: parts[5], target: tail.target, caller: tail.caller, nonce: tail.nonce };
303
+ }
304
+ if (route === "inst") {
305
+ if (parts.length < 11)
306
+ return null;
307
+ const tail = parseTail(parts, 7, true);
308
+ if (!tail)
309
+ return null;
310
+ return { plane: "request", route, endpoint: endpointNameOf(parts[4]), instanceId: parts[5], command: parts[6], target: tail.target, caller: tail.caller, nonce: tail.nonce };
311
+ }
312
+ if (route === "reply") {
313
+ if (parts.length !== 11)
314
+ return null;
315
+ const epoch = parseEpoch(parts[6]);
316
+ if (epoch === null)
317
+ return null;
318
+ return { plane: "reply", endpoint: endpointNameOf(parts[4]), instanceId: parts[5], epoch, caller: { owner: parts[7], actor: parts[8], uid: parts[9] }, nonce: parts[10] };
319
+ }
320
+ return null;
321
+ }
322
+ if (plane === "epe") {
323
+ if (parts.length < 7)
324
+ return null;
325
+ const epoch = parseEpoch(parts[5]);
326
+ if (epoch === null)
327
+ return null;
328
+ return { plane: "event", endpoint: endpointNameOf(parts[3]), instanceId: parts[4], epoch, topic: parts.slice(6) };
329
+ }
330
+ if (plane === "epf") {
331
+ if (parts.length < 5)
332
+ return null;
333
+ return { plane: "fact", endpoint: endpointNameOf(parts[3]), topic: parts.slice(4) };
334
+ }
335
+ if (plane === "epj") {
336
+ if (parts.length < 8)
337
+ return null;
338
+ const tail = parseTail(parts, 5, false);
339
+ if (!tail)
340
+ return null;
341
+ return { plane: "journal", endpoint: endpointNameOf(parts[3]), command: parts[4], target: tail.target, caller: tail.caller };
342
+ }
343
+ if (plane === "ept") {
344
+ if (parts.length !== 8)
345
+ return null;
346
+ const epoch = parseEpoch(parts[5]);
347
+ const phase = parts[7];
348
+ if (epoch === null || (phase !== "schedule" && phase !== "armed" && phase !== "fire"))
349
+ return null;
350
+ return { plane: "timer", endpoint: endpointNameOf(parts[3]), instanceId: parts[4], epoch, timerId: parts[6], phase };
351
+ }
352
+ if (plane === "epr") {
353
+ if (parts.length < 7)
354
+ return null;
355
+ const epoch = parseEpoch(parts[5]);
356
+ if (epoch === null)
357
+ return null;
358
+ return { plane: "record", endpoint: endpointNameOf(parts[3]), instanceId: parts[4], epoch, kind: parts[6], qualifier: parts.slice(7) };
359
+ }
360
+ if (plane === "epc") {
361
+ if (parts.length !== 4 || !DIGEST_HEX.test(parts[3]))
362
+ return null;
363
+ return { plane: "contract", digestHex: parts[3] };
364
+ }
365
+ if (plane === "epw") {
366
+ if (parts.length !== 9)
367
+ return null;
368
+ return { plane: "work", endpoint: endpointNameOf(parts[3]), pool: parts[4], acceptance: { owner: parts[5], actor: parts[6], uid: parts[7], id: parts[8] } };
369
+ }
370
+ if (plane === "eps") {
371
+ if (parts.length !== 7)
372
+ return null;
373
+ const epoch = parseEpoch(parts[5]);
374
+ const dir = parts[6];
375
+ if (epoch === null || (dir !== "in" && dir !== "out"))
376
+ return null;
377
+ return { plane: "session", endpoint: endpointNameOf(parts[3]), sessionId: parts[4], epoch, dir };
378
+ }
379
+ return null;
380
+ }
381
+ //# sourceMappingURL=endpoint-subjects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-subjects.js","sourceRoot":"","sources":["../src/endpoint-subjects.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAE/F,4FAA4F;AAC5F,mGAAmG;AACnG,4CAA4C;AAC5C,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEvE;+FAC+F;AAC/F,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAE1C;gDACgD;AAChD,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAU,CAAC,CAAC;AAEhF,8FAA8F;AAE9F,MAAM,cAAc,GAAG,iCAAiC,CAAC;AACzD,MAAM,OAAO,GAAG,mBAAmB,CAAC;AACpC,MAAM,KAAK,GAAG,wBAAwB,CAAC;AACvC,MAAM,EAAE,GAAG,uBAAuB,CAAC,CAAC,kDAAkD;AACtF,MAAM,QAAQ,GAAG,kBAAkB,CAAC,CAAC,sFAAsF;AAC3H,MAAM,UAAU,GAAG,gBAAgB,CAAC;AACpC,MAAM,KAAK,GAAG,mBAAmB,CAAC;AAElC,yFAAyF;AACzF,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAEzC;;;;uBAIuB;AACvB,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,SAAS,IAAI,qDAAqD,CAAC,CAAC;IAC5I,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,yBAAyB,CAAC,CAAC;IAC3F,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,OAAO,kDAAkD,CAAC,CAAC;IACnH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uFAAuF,CAAC,CAAC;IACjI,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAS,EAAE,IAAI,GAAG,IAAI;IAClD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACjG,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;oEAKoE;AACpE,MAAM,UAAU,aAAa,CAAC,CAAS,EAAE,IAAI,GAAG,SAAS;IACvD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,mGAAmG,CAAC,CAAC;IACzJ,OAAO,CAAC,CAAC;AACX,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,+CAA+C,CAAC,CAAC;IACvG,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,6BAA6B,CAAC,CAAC;IAC5G,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED;;2FAE2F;AAC3F,MAAM,UAAU,kBAAkB,CAAC,CAAS,EAAE,IAAY;IACxD,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC3E,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,IAAI,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,oBAAoB;QACjE,MAAM,IAAI,KAAK,CAAC,mBAAmB,oBAAoB,WAAW,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAC7F,OAAO,OAAO,CAAC;AACjB,CAAC;AAYD;;;8EAG8E;AAC9E,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAC,CAAC;AAE5G,MAAM,SAAS,GAAG,IAAI,GAAG,CAAS,cAAc,CAAC,CAAC;AAClD;;0EAE0E;AAC1E,MAAM,UAAU,aAAa,CAAC,CAAS,IAAa,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAU9E,MAAM,YAAY,GAAgC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AAEhH,SAAS,YAAY,CAAC,MAAgB;IACpC,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;QAC1B,OAAO,CAAC,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,oBAAoB,CAAC,MAAM,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACpL,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED;uCACuC;AACvC,MAAM,UAAU,YAAY,CAAC,MAAgB;IAC3C,OAAO;QACL,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC;QAChD,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC;QAChD,oBAAoB,CAAC,MAAM,CAAC,GAAG,EAAE,qBAAqB,CAAC;KACxD,CAAC;AACJ,CAAC;AAUD,kGAAkG;AAClG,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,GAA8G;IAE9G,MAAM,KAAK,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtF,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;IACpG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5C,IAAI,GAAG,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACxD,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACtC,CAAC;AAED;;kGAEkG;AAClG,MAAM,UAAU,cAAc,CAC5B,KAAa,EACb,CAA2F;IAE3F,OAAO,WAAW,CAAC;QACjB,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC,UAAU,EAAE,YAAY,CAAC;QAC9G,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;KACtE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACf,CAAC;AAED;;;uFAGuF;AACvF,MAAM,UAAU,kBAAkB,CAChC,KAAa,EACb,OAAwB,EACxB,SAAgD;IAEhD,OAAO,cAAc,CAAC,KAAK,EAAE;QAC3B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;AACL,CAAC;AAED,gGAAgG;AAEhG;;iFAEiF;AACjF,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,IAAmB,EAAE,QAAgB;IAChF,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;AACzE,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,qBAAqB,CAAC,KAAa,EAAE,QAAgB,EAAE,UAAkB;IACvF,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,YAAY,aAAa,CAAC,QAAQ,CAAC,IAAI,oBAAoB,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,CAAC;AACxH,CAAC;AAED;sEACsE;AACtE,MAAM,UAAU,mBAAmB,CAAC,KAAa,EAAE,MAAgB;IACjE,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,mBAAmB,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACpF,CAAC;AAED;yFACyF;AACzF,MAAM,UAAU,uBAAuB,CAAC,KAAa,EAAE,QAAgB,EAAE,UAAkB,EAAE,KAAa;IACxG,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,aAAa,aAAa,CAAC,QAAQ,CAAC,IAAI,oBAAoB,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC;AACrJ,CAAC;AAOD,SAAS,SAAS,CAAC,KAAe,EAAE,IAAY;IAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,qCAAqC,CAAC,CAAC;IACtF,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;IAC/H,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;6FAC6F;AAC7F,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,QAAgB,EAAE,UAAkB,EAAE,KAAa,EAAE,KAAe;IAC5G,OAAO,WAAW,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,aAAa,CAAC,QAAQ,CAAC,IAAI,oBAAoB,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;AAClL,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,QAAgB,EAAE,KAAe;IACzE,OAAO,WAAW,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,aAAa,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AACzG,CAAC;AAED;;kFAEkF;AAClF,MAAM,UAAU,UAAU,CACxB,KAAa,EACb,CAA6E;IAE7E,MAAM,KAAK,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACpG,IAAI,CAAC,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACtC,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,QAAgB,EAAE,UAAkB,EAAE,KAAa,EAAE,OAAe,EAAE,KAAmB;IACjI,OAAO,WAAW,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,aAAa,CAAC,QAAQ,CAAC,IAAI,oBAAoB,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;AACnM,CAAC;AAED;4FAC4F;AAC5F,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,QAAgB,EAAE,UAAkB,EAAE,KAAa,EAAE,IAAY,EAAE,YAAsB,EAAE;IACnI,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,SAAS,EAAE,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpF,OAAO,WAAW,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,aAAa,CAAC,QAAQ,CAAC,IAAI,oBAAoB,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;AAClM,CAAC;AAED;wEACwE;AACxE,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,SAAiB;IACzD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,SAAS,iCAAiC,CAAC,CAAC;IACjH,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,SAAS,EAAE,CAAC;AAClD,CAAC;AAED;iGACiG;AACjG,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,QAAgB,EAAE,IAAY,EAAE,UAAqC;IAC7G,OAAO,WAAW,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,aAAa,CAAC,QAAQ,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAC5K,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,QAAgB,EAAE,SAAiB,EAAE,KAAa,EAAE,GAAiB;IAC7G,OAAO,WAAW,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,aAAa,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;AACnJ,CAAC;AA6BD;;;;oDAIoD;AACpD,SAAS,SAAS,CAAC,KAAe,EAAE,CAAS,EAAE,SAAkB;IAC/D,IAAI,MAAM,GAAoB,IAAI,CAAC;IACnC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,IAAI,KAAK,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAmB,CAAC;QACjC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QACpC,MAAM;YACJ,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;gBAC1B,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;oBACtE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACjB,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,MAAM,GAAa,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;IACrF,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAClF,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,2FAA2F;IAC3F,yEAAyE;IACzE,OAAO,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,IAAI,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,oBAAoB;QAAE,OAAO,IAAI,CAAC;IACjF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,0BAA0B;IAClF,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAEvB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YACvC,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;gBAAE,OAAO,IAAI,CAAC;YACnC,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC;YACvB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAM,EAAE,CAAC;QAC1J,CAAC;QACD,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;gBAAE,OAAO,IAAI,CAAC;YACnC,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC;YACvB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAM,EAAE,CAAC;QAChL,CAAC;QACD,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACtB,IAAI,KAAK,CAAC,MAAM,KAAK,EAAE;gBAAE,OAAO,IAAI,CAAC;YACrC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAChC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5K,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAClC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAChC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACpH,CAAC;IACD,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAClC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACtF,CAAC;IACD,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAClC,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAC/H,CAAC;IACD,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACnG,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;IACvH,CAAC;IACD,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAClC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAChC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACzI,CAAC;IACD,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAClE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,CAAC;IACD,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC9J,CAAC;IACD,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACnE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IACnG,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * The §13.6 SUPERVISOR-WRITE authority — the capability to ORIGINATE supervisor-owned service
3
+ * status (the restart history, the retirement mark, the `escalated` state) through
4
+ * {@link writeServiceStatus}. This module is DELIBERATELY NOT re-exported from the package
5
+ * index: only the in-package §13.6 supervisor seams (`noteInstanceRestart`, the escalation
6
+ * reconciler in endpoint-virtual, and the writer check in endpoint-service) import it, so the
7
+ * mint is NOT ambiently obtainable by an arbitrary `@cotal-ai/core` consumer. A brand that any
8
+ * caller can mint is not an authority boundary (that was the flaw a public zero-argument
9
+ * factory had); keeping the mint package-private makes possession of the grant proof that the
10
+ * write came from a supervisor seam.
11
+ */
12
+ export interface SupervisorWriteGrant {
13
+ readonly __supervisorWrite: true;
14
+ }
15
+ /** Mint the supervisor-write authority. INTERNAL: import only from the §13.6 supervisor seams. */
16
+ export declare function mintSupervisorWrite(): SupervisorWriteGrant;
17
+ /** True iff `g` is a genuine mint (WeakSet membership; a structural look-alike is not). */
18
+ export declare function isSupervisorWrite(g: unknown): boolean;
19
+ //# sourceMappingURL=endpoint-supervisor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-supervisor.d.ts","sourceRoot":"","sources":["../src/endpoint-supervisor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC;CAClC;AAID,kGAAkG;AAClG,wBAAgB,mBAAmB,IAAI,oBAAoB,CAI1D;AAED,2FAA2F;AAC3F,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAErD"}
@@ -0,0 +1,12 @@
1
+ const SUPERVISOR_WRITE_GRANTS = new WeakSet();
2
+ /** Mint the supervisor-write authority. INTERNAL: import only from the §13.6 supervisor seams. */
3
+ export function mintSupervisorWrite() {
4
+ const g = Object.freeze({ __supervisorWrite: true });
5
+ SUPERVISOR_WRITE_GRANTS.add(g);
6
+ return g;
7
+ }
8
+ /** True iff `g` is a genuine mint (WeakSet membership; a structural look-alike is not). */
9
+ export function isSupervisorWrite(g) {
10
+ return typeof g === "object" && g !== null && SUPERVISOR_WRITE_GRANTS.has(g);
11
+ }
12
+ //# sourceMappingURL=endpoint-supervisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-supervisor.js","sourceRoot":"","sources":["../src/endpoint-supervisor.ts"],"names":[],"mappings":"AAeA,MAAM,uBAAuB,GAAG,IAAI,OAAO,EAAU,CAAC;AAEtD,kGAAkG;AAClG,MAAM,UAAU,mBAAmB;IACjC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,iBAAiB,EAAE,IAAa,EAAE,CAAC,CAAC;IAC9D,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/B,OAAO,CAAC,CAAC;AACX,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,iBAAiB,CAAC,CAAU;IAC1C,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,uBAAuB,CAAC,GAAG,CAAC,CAAW,CAAC,CAAC;AACzF,CAAC"}