@cotal-ai/auth 0.17.0 → 0.18.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.
@@ -1,9 +1,12 @@
1
1
  import { type RetirementDeps } from "./retirement-barrier.js";
2
2
  import { type LifecycleRegistry } from "./lifecycle-registry.js";
3
- /** The LISTENER profile (SPEC 13.9 "Auth control rail" row): serve + bounded replies on the
4
- * auth-admin control subtree, plus the ONE leader-served lease read the holder-check performs.
3
+ /** The LISTENER profile (SPEC 13.9 "Auth endpoint rail" row): serve + bounded replies on the auth
4
+ * endpoint's class rail, plus the ONE leader-served gate read the authz check performs.
5
5
  * No store writes, no consumer authority, no scanner reach. */
6
- export declare function authAdminListenerGrants(space: string, connId: string): {
6
+ export declare function authAdminListenerGrants(space: string, connId: string, responder: {
7
+ instanceId: string;
8
+ epoch: number;
9
+ }): {
7
10
  publish: string[];
8
11
  subscribe: string[];
9
12
  };
@@ -1 +1 @@
1
- {"version":3,"file":"auth-admin.d.ts","sourceRoot":"","sources":["../src/auth-admin.ts"],"names":[],"mappings":"AAmDA,OAAO,EAA6B,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzF,OAAO,EAA8C,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAK7G;;gEAEgE;AAChE,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAmBjH;AAwCD,MAAM,WAAW,iBAAiB;IAChC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,GAAG,EAAE,iBAAiB,CAAC;IACvB,UAAU,EAAE,cAAc,CAAC;IAC3B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAwI7B"}
1
+ {"version":3,"file":"auth-admin.d.ts","sourceRoot":"","sources":["../src/auth-admin.ts"],"names":[],"mappings":"AAuEA,OAAO,EAA6B,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzF,OAAO,EAA8C,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAW7G;;gEAEgE;AAChE,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,SAAS,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAyB5C;AA2DD,MAAM,WAAW,iBAAiB;IAChC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,GAAG,EAAE,iBAAiB,CAAC;IACvB,UAAU,EAAE,cAAc,CAAC;IAC3B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAuL7B"}
@@ -1,50 +1,81 @@
1
1
  import { Kvm } from "@nats-io/kv";
2
- import { CONTROL_AUTH_ADMIN, EpEnvelopeError, assertBoundedOwner, assertLifecycleToken, endpointToken, epAuthBucket, principalKey, retirementFrontierStreams, serveIssuanceGateKv, spacePrefix, } from "@cotal-ai/core";
2
+ import { AUTH_ENDPOINT, EP_CMD_RETIRE_LIFECYCLE, EpEnvelopeError, assertLifecycleToken, deriveReplySubject, endpointToken, epAuthBucket, epClassQueueGroup, epResponderReplyPattern, assertCommandToken, spacePrefix, mintLifecycleUid, parseEpSubject, principalKey, retirementFrontierStreams, serveIssuanceGateKv, } from "@cotal-ai/core";
3
3
  import { openAuthorityClient } from "./authority-client.js";
4
4
  import { runAgentRetirementBarrier } from "./retirement-barrier.js";
5
5
  import { observeGate, readLifecycleHeadForOperation } from "./lifecycle-registry.js";
6
6
  const enc = new TextEncoder();
7
7
  const dec = new TextDecoder();
8
- /** The LISTENER profile (SPEC 13.9 "Auth control rail" row): serve + bounded replies on the
9
- * auth-admin control subtree, plus the ONE leader-served lease read the holder-check performs.
8
+ /** The auth endpoint's one class rail, per-command (never a cross-command `>`): the grant and the
9
+ * runtime subscription are built from THIS, so a widened subscription cannot outrun its grant. */
10
+ function authClassRail(space) {
11
+ return `${spacePrefix(space)}.ep.one.${endpointToken(AUTH_ENDPOINT)}.${assertCommandToken(EP_CMD_RETIRE_LIFECYCLE)}.>`;
12
+ }
13
+ /** The LISTENER profile (SPEC 13.9 "Auth endpoint rail" row): serve + bounded replies on the auth
14
+ * endpoint's class rail, plus the ONE leader-served gate read the authz check performs.
10
15
  * No store writes, no consumer authority, no scanner reach. */
11
- export function authAdminListenerGrants(space, connId) {
16
+ export function authAdminListenerGrants(space, connId, responder) {
12
17
  return {
13
18
  publish: [
14
- // REPLIES ONLY. The handler only ever `msg.respond`s to `<request-subject>.reply.…` (boundReply,
15
- // below), so the listener never needs to publish a bare REQUEST subject. Granting the request
16
- // subtree (`…auth-admin.>`) would let a compromised listener credential self-publish a
17
- // `retireLifecycle` as the lease holder and pass its own subject-derived lease check (self-forge);
18
- // scoping to `*.*.reply.>` closes that. The requester credential (provision.ts) is already
19
- // broker-bound to publish only its OWN `<owner>.<actor>` request subject.
20
- `${spacePrefix(space)}.ctl.${CONTROL_AUTH_ADMIN}.*.*.reply.>`,
19
+ // REPLIES ONLY, and on the REPLY PLANE — which is a stronger statement than the `ctl` rail
20
+ // could make. There, request and reply shared one subtree, so the grant had to carve replies
21
+ // out of it by shape (`*.*.reply.>`) to stop a compromised listener self-publishing a request
22
+ // as the lease holder and passing its own subject-derived check (self-forge). Here the planes
23
+ // are DISJOINT: `ep.reply.…` cannot express a request subject at all, so the self-forge is
24
+ // closed by the grammar rather than by a pattern. The instance triple and epoch are pinned;
25
+ // only the caller suffixes span (addressing is confined by nonce possession, §13.2).
26
+ epResponderReplyPattern(space, AUTH_ENDPOINT, responder.instanceId, responder.epoch),
21
27
  "$JS.API.INFO",
22
- // The ONE leader-served read the holder-check performs: the serve-issuance GATE (P2 item 3
23
- // 3b-3), a point-get of `epgate.<endpoint>.<instanceId>` proving the requesting manager
24
- // instance's serve grant is CURRENT (registration-record-derived, replacing the old
25
- // name-derived manager-lease read). No consumer authority, no store writes.
28
+ // The ONE leader-served read the authz check performs: the serve-issuance GATE, a point-get
29
+ // of `epgate.<endpoint>.<instanceId>` proving the requesting manager instance's serve grant
30
+ // is CURRENT and that the row belongs to the SUBJECT-derived caller principal. No consumer
31
+ // authority, no store writes.
26
32
  `$JS.API.STREAM.MSG.GET.KV_${epAuthBucket(space)}`,
27
33
  ],
28
- subscribe: [`${spacePrefix(space)}.ctl.${CONTROL_AUTH_ADMIN}.*.*`, `_INBOX_${connId}.>`],
34
+ // The class rail, QUEUE-QUALIFIED and per-command (§13.9, `endpoint-grants.ts:293-300`): the
35
+ // NATS `"<subject> <queue>"` grant form. A PLAIN subject row would let this credential
36
+ // plain-subscribe the class rail and observe EVERY request's nonce — the property the queue
37
+ // qualification exists to protect. The runtime's queue subscription is not a substitute: it
38
+ // constrains what this process does, not what the credential permits.
39
+ subscribe: [`${authClassRail(space)} ${epClassQueueGroup(AUTH_ENDPOINT)}`, `_INBOX_${connId}.>`],
29
40
  };
30
41
  }
42
+ const RETIRE_ARG_KEYS = ["opId", "serveEndpoint", "serveInstanceId", "serveEpoch"];
43
+ /** The request id a reply MUST echo. This is the MINIMAL correctness guard from the full
44
+ * `EndpointRequest`/`EndpointReply` envelope, which this rail does NOT yet carry (named residual:
45
+ * the rail moved to `ep` SUBJECTS while still exchanging the ctl-era `{op,args}` / `{ok,data,error}`
46
+ * bodies, and SPEC 1421 states those envelopes are DELETED). Without the echo, a caller binding a
47
+ * reply on (endpoint, nonce) alone can accept a malformed or WRONG-ID `{ok:true}` and clear a
48
+ * retirement hold on it. The full envelope migration is its own cut; this edge is not deferrable. */
49
+ function parseRequestId(raw) {
50
+ if (typeof raw !== "string" || !/^[A-Za-z0-9_-]{1,64}$/.test(raw))
51
+ throw new EpEnvelopeError("failed-precondition", `the request requires an "id" ([A-Za-z0-9_-]{1,64}); the reply echoes it so a caller cannot accept another request's answer`);
52
+ return raw;
53
+ }
31
54
  function parseRetireArgs(raw) {
32
- const shape = "{ owner, actor, lifecycleUid, opId, serveEndpoint, serveInstanceId, serveEpoch }";
55
+ const shape = "{ opId, serveEndpoint, serveInstanceId, serveEpoch }";
33
56
  if (raw === null || typeof raw !== "object")
34
57
  throw new EpEnvelopeError("failed-precondition", `retireLifecycle requires args ${shape}`);
35
58
  const a = raw;
59
+ // The TARGET (owner, actor, lifecycleUid) is no longer an argument: `handle` mode carries it in
60
+ // the subject, broker-enforced and grant-pinned, so the handler reads it from there. Sending it
61
+ // in the body is now a CLOSED-SHAPE violation rather than a redundancy to reconcile — which
62
+ // removes the whole body-vs-subject mismatch class instead of managing it.
36
63
  for (const k of Object.keys(a))
37
- if (!["owner", "actor", "lifecycleUid", "opId", "serveEndpoint", "serveInstanceId", "serveEpoch"].includes(k))
38
- throw new EpEnvelopeError("failed-precondition", `retireLifecycle args carry the unknown field "${k}" (closed shape)`);
39
- if (typeof a.owner !== "string" || typeof a.actor !== "string" || typeof a.lifecycleUid !== "string" || typeof a.opId !== "string" ||
64
+ if (!RETIRE_ARG_KEYS.includes(k))
65
+ throw new EpEnvelopeError("failed-precondition", `retireLifecycle args carry the unknown field "${k}" (closed shape; the target rides the SUBJECT)`);
66
+ if (typeof a.opId !== "string" ||
40
67
  typeof a.serveEndpoint !== "string" || typeof a.serveInstanceId !== "string" ||
41
68
  typeof a.serveEpoch !== "number" || !Number.isInteger(a.serveEpoch) || a.serveEpoch < 0)
42
69
  throw new EpEnvelopeError("failed-precondition", `retireLifecycle requires args ${shape} (serveEpoch a non-negative integer)`);
43
70
  return {
44
- owner: assertBoundedOwner(a.owner, "owner"),
45
- actor: assertBoundedOwner(a.actor, "actor"),
46
- lifecycleUid: assertLifecycleToken(a.lifecycleUid, "lifecycleUid"),
71
+ // opId is OPERATION IDENTITY, not an authz input: it is the stable per-lifecycle id that makes
72
+ // a retry, a same-name-spawn nudge, and a boot resume converge on ONE operation. It has no
73
+ // subject counterpart to be cross-checked against (the subject's nonce varies per request,
74
+ // which is the opposite property), and it authorizes nothing.
47
75
  opId: assertLifecycleToken(a.opId, "opId"),
76
+ // LOOKUP COORDINATES, not authz inputs: they select WHICH gate row to read. The row they
77
+ // select must then survive the principal cross-check below, so naming a foreign row buys a
78
+ // refusal, never an authorization.
48
79
  serveEndpoint: endpointToken(a.serveEndpoint),
49
80
  serveInstanceId: assertLifecycleToken(a.serveInstanceId, "serveInstanceId"),
50
81
  serveEpoch: a.serveEpoch,
@@ -57,10 +88,17 @@ function parseRetireArgs(raw) {
57
88
  */
58
89
  export async function openAuthAdminListener(opts) {
59
90
  const { space, log } = opts;
91
+ // The auth plane's responder identity. The plane is SINGLE per space by construction (§13.13:
92
+ // at most one authority plane holds the sealed scanners, by a broker-visible claim), so the
93
+ // instance id is per-process and the epoch is fixed: there is no successor to fence and no
94
+ // registration whose epoch could advance beneath us. It exists because the reply plane pins the
95
+ // responder triple in the grant; callers read replies through a filter that wildcards these
96
+ // positions (`ep.reply.*.*.*.<cO>.<cA>.<cUid>.*`), so they never need to learn it.
97
+ const responder = { instanceId: mintLifecycleUid(), epoch: 0 };
60
98
  const client = await openAuthorityClient({
61
99
  server: opts.server, space, dataAccount: opts.dataAccount,
62
100
  label: `cotal:auth-admin:${space}`,
63
- grants: (id) => authAdminListenerGrants(space, id),
101
+ grants: (id) => authAdminListenerGrants(space, id, responder),
64
102
  log,
65
103
  });
66
104
  let epAuthKv;
@@ -73,31 +111,52 @@ export async function openAuthAdminListener(opts) {
73
111
  await client.close();
74
112
  throw e;
75
113
  }
76
- const prefix = `${spacePrefix(space)}.ctl.${CONTROL_AUTH_ADMIN}.`;
77
- const sub = client.nc.subscribe(`${prefix}*.*`, {
114
+ const sub = client.nc.subscribe(authClassRail(space), {
115
+ queue: epClassQueueGroup(AUTH_ENDPOINT),
78
116
  callback: (err, msg) => {
79
117
  if (err)
80
118
  return;
81
119
  void (async () => {
82
- // boundReply (the serveControl discipline): the reply target must live under the
83
- // SENDER'S OWN request subject the listener holds a subtree-wide reply grant, so a
84
- // caller-selected foreign reply target is refused here, never published to.
85
- if (msg.reply === undefined || !msg.reply.startsWith(`${msg.subject}.reply.`)) {
86
- log(`auth-admin: dropped a request on ${msg.subject} with an unbound reply target (${msg.reply ?? "none"})`);
120
+ // The reply target is DERIVED from the parsed request, never taken from the wire. On the
121
+ // `ctl` rail this was a guard: the listener held a subtree-wide reply grant, so a
122
+ // caller-selected foreign reply target had to be refused by inspecting `msg.reply`. Here
123
+ // there is no argument through which a payload-supplied reply target could arrive — the
124
+ // guard became structural, so the check it replaced cannot be forgotten.
125
+ const parsed = parseEpSubject(msg.subject);
126
+ if (parsed === null || parsed.plane !== "request") {
127
+ // null = MUST NOT handle (§13.2). Never a reply: an unparseable subject has no
128
+ // derivable reply target, and answering one would be the confused deputy itself.
129
+ log(`auth-admin: dropped an unparseable request subject ${msg.subject}`);
87
130
  return;
88
131
  }
132
+ const request = parsed;
133
+ // The echoed id is stamped HERE, outside the handler, so EVERY reply carries it - including
134
+ // the thrown-error path. A reply the caller cannot bind to its own request is one it must
135
+ // ignore, so an unstamped error reply would silently become a timeout instead of a refusal.
136
+ let echoId;
137
+ try {
138
+ echoId = parseRequestId(JSON.parse(dec.decode(msg.data)).id);
139
+ }
140
+ catch {
141
+ echoId = undefined;
142
+ }
89
143
  let reply;
90
144
  try {
91
- reply = await handle(msg.subject.slice(prefix.length), msg.data);
145
+ reply = await handle(request, msg.data);
92
146
  }
93
147
  catch (e) {
94
148
  reply = { ok: false, error: e instanceof Error ? e.message : String(e) };
95
149
  }
150
+ // A request with no usable id gets an unbindable reply BY CONSTRUCTION: the caller requires
151
+ // the echo, so it will refuse this answer rather than accept an unattributable one.
152
+ if (echoId !== undefined)
153
+ reply.id = echoId;
154
+ const target = deriveReplySubject(space, request, responder);
96
155
  try {
97
- msg.respond(enc.encode(JSON.stringify(reply)));
156
+ client.nc.publish(target, enc.encode(JSON.stringify(reply)));
98
157
  }
99
158
  catch (e) {
100
- log(`auth-admin: reply publish failed on ${msg.subject}: ${e instanceof Error ? e.message : String(e)}`);
159
+ log(`auth-admin: reply publish failed on ${target}: ${e instanceof Error ? e.message : String(e)}`);
101
160
  }
102
161
  })();
103
162
  },
@@ -115,11 +174,17 @@ export async function openAuthAdminListener(opts) {
115
174
  // same-opId join whose coordinates differ is REFUSED as a full no-op; only a coordinate-IDENTICAL
116
175
  // request (the intended nudge/retry) joins the in-flight barrier.
117
176
  const barrierFlight = new Map();
118
- const handle = async (principalTail, body) => {
119
- const tokens = principalTail.split(".");
120
- if (tokens.length !== 2)
121
- return { ok: false, error: `auth-admin: the request subject must carry exactly <owner>.<actor>` };
122
- const requester = principalKey(tokens[0], tokens[1]).key;
177
+ const handle = async (request, body) => {
178
+ if (request.command !== EP_CMD_RETIRE_LIFECYCLE)
179
+ return { ok: false, error: `command "${request.command}" not supported on the auth endpoint` };
180
+ // The TARGET comes from the subject (`handle` mode, arity 3) — broker-enforced and
181
+ // grant-pinned, so it is not a claim the caller can vary independently of what it may publish.
182
+ if (request.target === null || request.target.mode !== "handle")
183
+ return { ok: false, error: `retire-lifecycle requires a handle target (<owner>.<actor>.<lifecycleUid>) in the subject` };
184
+ const target = { owner: request.target.tOwner, actor: request.target.tActor, lifecycleUid: request.target.tUid };
185
+ // The CALLER principal likewise comes from the subject, and is now an AUTHZ INPUT (the
186
+ // cross-check below), not just the audit line it was on the `ctl` rail.
187
+ const requester = principalKey(request.caller.owner, request.caller.actor).key;
123
188
  let req;
124
189
  try {
125
190
  req = JSON.parse(dec.decode(body));
@@ -136,9 +201,14 @@ export async function openAuthAdminListener(opts) {
136
201
  // requester declares its (serveEndpoint, serveInstanceId, serveEpoch); an absent/retired gate means
137
202
  // no registered instance, and a gate whose current processEpoch moved past the declared one means
138
203
  // the requester was SUPERSEDED (a deposed predecessor after a restart) — refused as a full no-op.
139
- // Every instance of one space shares the manager principal (the broker ACL already confines the
140
- // requester to it), so ANY current instance's gate authorizes (accept any registered instance with
141
- // a current serve grant pin 5). The requester principal is still recorded on the audit line below.
204
+ // The row this NAMES must also BELONG to the subject-derived caller principal (the cross-check
205
+ // below). Before #350 it did not have to: every instance of one space shares the manager
206
+ // principal, and the two-token `ctl` subject could not express the caller beyond that alias, so
207
+ // any current instance's gate authorized. That is no longer true, and the coordinates above no
208
+ // longer authorize — they only select which row to read.
209
+ // ALIAS-LEVEL, not incarnation-level: a DIFFERENT INSTANCE OF THE SAME PRINCIPAL still passes
210
+ // (the gate is keyed by the persisted instanceId and its row carries no lifecycle uid). What is
211
+ // refused is a row belonging to a DIFFERENT PRINCIPAL.
142
212
  let serveGate;
143
213
  try {
144
214
  serveGate = await serveIssuanceGateKv(epAuthKv, space, { endpoint: args.serveEndpoint, instanceId: args.serveInstanceId }).observe();
@@ -148,26 +218,38 @@ export async function openAuthAdminListener(opts) {
148
218
  }
149
219
  if (serveGate === null || serveGate.state === "retired")
150
220
  return { ok: false, error: `no manager instance currently holds a serve registration for "${space}" (instance ${args.serveInstanceId} is ${serveGate === null ? "unregistered" : "retired"}), so nothing may retire agents. The despawn was a FULL no-op - the agent is unchanged and still running. NEXT: start or recover the manager (\`cotal supervise\`), then retry the despawn.` };
221
+ // THE PRINCIPAL CROSS-CHECK (#350). The two serve coordinates above only SELECTED this row;
222
+ // they do not authorize. The row must belong to the SUBJECT-derived caller principal — which
223
+ // the broker enforced when it admitted the publish. Without this, naming any currently
224
+ // registered instance's row authorizes the caller, which is what the `ctl` rail did: its
225
+ // two-token subject could not express the caller beyond an alias, so there was nothing to
226
+ // compare the row against.
227
+ // ALIAS-LEVEL, not incarnation-level: the gate is keyed by the PERSISTED instanceId and its
228
+ // schema carries no uid, while the caller triple's uid is per-process. A same-principal zombie
229
+ // predecessor holding the current epoch value still passes. Closing that needs a gate-row
230
+ // schema change; it is deliberately not in this cut.
231
+ if (serveGate.principal !== requester)
232
+ return { ok: false, error: `the retirement request was REFUSED: the serve registration named (${args.serveEndpoint}/${args.serveInstanceId}) belongs to ${serveGate.principal}, not to the requesting principal ${requester}. A caller may only be authorized by its OWN serve registration. The despawn was a FULL no-op - the agent is unchanged and still running. NEXT: name your OWN principal's serve registration (any current instance of ${requester} will do), or call as the principal that owns this one.` };
151
233
  if (serveGate.processEpoch !== args.serveEpoch)
152
234
  return { ok: false, error: `the requesting manager instance ${args.serveInstanceId} was SUPERSEDED (it registered at epoch ${args.serveEpoch}, the current serve grant is epoch ${serveGate.processEpoch}), so this despawn was REFUSED as a FULL no-op - the agent is unchanged and still running, nothing was torn down. NEXT: recover the manager (\`cotal supervise\`), then retry the despawn under the current serving instance.` };
153
235
  // IDEMPOTENCE (the four-outcome table, in operator vocabulary).
154
- const head = await readLifecycleHeadForOperation(opts.reg, args.owner, args.actor);
236
+ const head = await readLifecycleHeadForOperation(opts.reg, target.owner, target.actor);
155
237
  if (head === undefined)
156
- return { ok: false, error: `no lifecycle exists for "${args.owner}/${args.actor}"; there is nothing to retire.` };
157
- if (head.mapping.state === "retired" && head.mapping.lifecycleUid === args.lifecycleUid)
158
- return { ok: true, data: { alreadyRetired: true, lifecycleUid: args.lifecycleUid } };
159
- if (head.mapping.lifecycleUid !== args.lifecycleUid)
160
- return { ok: false, error: `the despawn names a stale incarnation of "${args.owner}/${args.actor}" (current is ${head.mapping.lifecycleUid}); nothing was retired. NEXT: refresh the agent list and retry against the current incarnation.` };
161
- const gate = await observeGate(opts.reg, args.lifecycleUid);
238
+ return { ok: false, error: `no lifecycle exists for "${target.owner}/${target.actor}"; there is nothing to retire.` };
239
+ if (head.mapping.state === "retired" && head.mapping.lifecycleUid === target.lifecycleUid)
240
+ return { ok: true, data: { alreadyRetired: true, lifecycleUid: target.lifecycleUid } };
241
+ if (head.mapping.lifecycleUid !== target.lifecycleUid)
242
+ return { ok: false, error: `the despawn names a stale incarnation of "${target.owner}/${target.actor}" (current is ${head.mapping.lifecycleUid}); nothing was retired. NEXT: refresh the agent list and retry against the current incarnation.` };
243
+ const gate = await observeGate(opts.reg, target.lifecycleUid);
162
244
  if (gate !== undefined && gate.row.state === "frozen" && gate.row.op !== undefined && gate.row.op.opId !== args.opId)
163
- return { ok: false, error: `another operation (${gate.row.op.kind} ${gate.row.op.opId}) already holds "${args.owner}/${args.actor}"; this despawn did not start a second one. NEXT: wait for that operation to finish (or its resume on the next auth-service boot), then retry.` };
245
+ return { ok: false, error: `another operation (${gate.row.op.kind} ${gate.row.op.opId}) already holds "${target.owner}/${target.actor}"; this despawn did not start a second one. NEXT: wait for that operation to finish (or its resume on the next auth-service boot), then retry.` };
164
246
  // EXECUTE (create-or-resume: the barrier's own freeze CAS + durable intent make the same
165
247
  // opId resumable and a re-request idempotent). The drain, cleaner, and repair credentials
166
248
  // all come from the plane's reviewed deps - this listener holds none of those rights.
167
249
  const existing = barrierFlight.get(args.opId);
168
250
  if (existing !== undefined &&
169
- (existing.owner !== args.owner || existing.actor !== args.actor || existing.lifecycleUid !== args.lifecycleUid))
170
- return { ok: false, error: `operation id ${args.opId} is already in flight for a different lifecycle (${existing.owner}/${existing.actor} ${existing.lifecycleUid}); this despawn of "${args.owner}/${args.actor}" (${args.lifecycleUid}) was a FULL no-op - nothing was retired and it is still running. NEXT: retry the despawn (the manager derives a distinct operation id per lifecycle).` };
251
+ (existing.owner !== target.owner || existing.actor !== target.actor || existing.lifecycleUid !== target.lifecycleUid))
252
+ return { ok: false, error: `operation id ${args.opId} is already in flight for a different lifecycle (${existing.owner}/${existing.actor} ${existing.lifecycleUid}); this despawn of "${target.owner}/${target.actor}" (${target.lifecycleUid}) was a FULL no-op - nothing was retired and it is still running. NEXT: retry the despawn (the manager derives a distinct operation id per lifecycle).` };
171
253
  let flight = existing?.promise;
172
254
  if (flight === undefined) {
173
255
  // A despawn cannot know the target's pool work, and the barrier never takes a pool hint: it
@@ -175,17 +257,17 @@ export async function openAuthAdminListener(opts) {
175
257
  // obligations (#F). Discovery is never a gap - the barrier never closes a frontier over
176
258
  // un-cleaned accepted pool work (SPEC 13.1/13.9).
177
259
  flight = runAgentRetirementBarrier(opts.reg, {
178
- owner: args.owner, actor: args.actor, lifecycleUid: args.lifecycleUid, opId: args.opId,
260
+ owner: target.owner, actor: target.actor, lifecycleUid: target.lifecycleUid, opId: args.opId,
179
261
  frontierStreams: retirementFrontierStreams(space),
180
262
  }, opts.retirement);
181
263
  const settle = flight;
182
264
  void settle.catch(() => { }).finally(() => { if (barrierFlight.get(args.opId)?.promise === settle)
183
265
  barrierFlight.delete(args.opId); });
184
- barrierFlight.set(args.opId, { owner: args.owner, actor: args.actor, lifecycleUid: args.lifecycleUid, promise: flight });
266
+ barrierFlight.set(args.opId, { owner: target.owner, actor: target.actor, lifecycleUid: target.lifecycleUid, promise: flight });
185
267
  }
186
268
  const result = await flight;
187
- log(`auth-admin: retired ${args.owner}/${args.actor} (${args.lifecycleUid}) by despawn request from ${requester} (op ${args.opId})`);
188
- return { ok: true, data: { retired: true, lifecycleUid: args.lifecycleUid, opId: result.opId, evictedPrincipals: result.evictedPrincipals } };
269
+ log(`auth-admin: retired ${target.owner}/${target.actor} (${target.lifecycleUid}) by despawn request from ${requester} (op ${args.opId})`);
270
+ return { ok: true, data: { retired: true, lifecycleUid: target.lifecycleUid, opId: result.opId, evictedPrincipals: result.evictedPrincipals } };
189
271
  };
190
272
  return {
191
273
  close: async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"auth-admin.js","sourceRoot":"","sources":["../src/auth-admin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth-admin.js","sourceRoot":"","sources":["../src/auth-admin.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cotal-ai/auth",
3
3
  "description": "Cotal per-user auth bridge: opaque owner-token derivation and strict user-token validation for the NATS auth-callout cutover (Plane 1 ↔ Plane 2).",
4
- "version": "0.17.0",
4
+ "version": "0.18.0",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "type": "git",
@@ -24,8 +24,8 @@
24
24
  "jose": "^6.2.3",
25
25
  "@nats-io/jetstream": "^3.4.0",
26
26
  "@nats-io/kv": "^3.4.0",
27
- "@cotal-ai/core": "0.17.0",
28
- "@cotal-ai/workspace": "0.17.0"
27
+ "@cotal-ai/core": "0.18.0",
28
+ "@cotal-ai/workspace": "0.18.0"
29
29
  },
30
30
  "devDependencies": {
31
31
  "better-auth": "^1.6.23"