@cotal-ai/connector-core 0.54.0 → 0.56.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.
package/dist/agent.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { EventEmitter } from "node:events";
2
- import { CotalEndpoint, type ControlReply, type Presence, type PresenceCondition, type PresenceStatus, type AttentionMode, type ChannelMode, type CotalMessage } from "@cotal-ai/core";
2
+ import { CotalEndpoint, type ControlReply, type Presence, type PresenceCondition, type PresenceStatus, type PresenceView, type AttentionMode, type ChannelMode, type CotalMessage } from "@cotal-ai/core";
3
3
  import type { AgentConfig } from "./config.js";
4
4
  export type { AttentionMode, ChannelMode };
5
5
  /** Client-side floor for a spawn action's submit + follow. The manager acceptance carries the exact
@@ -191,6 +191,14 @@ export declare class MeshAgent extends EventEmitter {
191
191
  private focusExcludedIds;
192
192
  private focusRecallUnsafeChannels;
193
193
  private _stopping;
194
+ /** Presence writes go out IN CALL ORDER (#636, #2055). setStatus is two awaited puts and every
195
+ * connector fires it without awaiting, so two overlapping calls interleave their puts and the
196
+ * record that lands last is whichever call's second put finished last, not the call made last;
197
+ * at a driven turn's end the measured order was working, idle, working, and the seat then read
198
+ * working forever. Every write below runs its whole body through this chain, so the later
199
+ * call's puts start only after the earlier call's have settled. A rejected write must not
200
+ * poison the chain: the tail is swallowed and the next write still runs. */
201
+ private presenceChain;
194
202
  constructor(config: AgentConfig);
195
203
  get id(): string;
196
204
  get connected(): boolean;
@@ -212,6 +220,8 @@ export declare class MeshAgent extends EventEmitter {
212
220
  forMs: number;
213
221
  error?: string;
214
222
  bucket: string;
223
+ consecutiveFailures: number;
224
+ stuck: boolean;
215
225
  } | undefined;
216
226
  /** The latest successful, non-empty inbox drain in this session. */
217
227
  get lastInboxDrainedAt(): number | undefined;
@@ -494,7 +504,14 @@ export declare class MeshAgent extends EventEmitter {
494
504
  * wrongly reject it), case-insensitively. Send is all-or-nothing: one unknown @name aborts
495
505
  * the whole broadcast (fail-loud on typos). Caveat: only catches peers THIS client has seen
496
506
  * — an offline peer lingers in the roster, but one never observed (or not yet filled in
497
- * after connect) throws. See docs/architecture.md. */
507
+ * after connect) throws. See docs/architecture.md.
508
+ *
509
+ * #1229: the roster can only support an ABSENCE verdict while `presenceView()` is `current`.
510
+ * `clearConnectionScoped()` empties it on every reconnect and the watch refills entry by
511
+ * entry, so a refusal under an unsafe view would reject a mention of a live peer. A name
512
+ * already in the roster is accepted in every state; an absent name under `unpopulated`
513
+ * waits once for the initial snapshot and re-reads; a still-unverifiable name refuses with
514
+ * the observer's own condition (never "no such peer") and the send does not go out. */
498
515
  private assertKnownMentions;
499
516
  anycast(role: string, text: string): Promise<CotalMessage>;
500
517
  /** Resolve a peer by instance id (exact) or display name. Deterministic and fail-loud: returns
@@ -525,10 +542,11 @@ export declare class MeshAgent extends EventEmitter {
525
542
  cwd?: string;
526
543
  prompt?: string;
527
544
  events?: boolean;
545
+ instance?: string;
528
546
  }): Promise<ControlReply>;
529
547
  /** The manager's recorded model pin for a managed seat (`inspect.model`). Absence is a real
530
548
  * state: a launch may pin none. Distinct from a failed inspect, which cannot attest. */
531
- inspectModel(name: string): Promise<{
549
+ inspectModel(name: string, instance?: string): Promise<{
532
550
  ok: true;
533
551
  model?: string;
534
552
  } | {
@@ -654,8 +672,23 @@ export declare class MeshAgent extends EventEmitter {
654
672
  showPersona(name: string): Promise<ControlReply>;
655
673
  /** The full roster, including ourselves. */
656
674
  roster(): Presence[];
675
+ /** Trust state of this observer's presence watch (`CotalEndpoint.presenceView()`): the roster
676
+ * above can only support an absence verdict while this is `current` (#1229). */
677
+ presenceView(): PresenceView;
657
678
  /** Our last self-reported presence status. */
658
679
  get status(): PresenceStatus;
680
+ /** Run one presence write through the chain (#636): the write starts only after every earlier
681
+ * admitted write has settled, and a rejection is swallowed at the TAIL only, so it propagates
682
+ * to this write's own caller while the next admitted write still runs.
683
+ *
684
+ * The straggler rule: departure is the last write, later writes are refused, not reordered.
685
+ * Once `stop()` has begun, any write admitted here rejects AT ONCE (no put queued, no wait on
686
+ * the chain) with a fixed error, instead of running after — or, for a write that calls
687
+ * `requireConnected` (e.g. `setStatus`), sitting out the ten-second connect grace before
688
+ * rejecting anyway. `stop()` itself submits departure's own put through this same method (the
689
+ * `forDeparture` escape) so departure keeps landing after every write already admitted, even
690
+ * though `_stopping` is already true by the time it does. */
691
+ private inOrder;
659
692
  setStatus(status: PresenceStatus, activity?: string): Promise<void>;
660
693
  /**
661
694
  * Publish presence for something that is NOT a turn ending.
@@ -706,7 +739,7 @@ export declare class MeshAgent extends EventEmitter {
706
739
  replay: boolean;
707
740
  joined: boolean;
708
741
  durableUnclosed: boolean;
709
- deliveryHealth?: "active" | "degraded";
742
+ deliveryHealth?: "active" | "degraded" | "unknown";
710
743
  messages: number;
711
744
  mode: ChannelMode | "normal";
712
745
  }[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/agent.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { execFile } from "node:child_process";
2
2
  import { EventEmitter } from "node:events";
3
3
  import { hostname } from "node:os";
4
- import { normalizeMentions, RUN_LAUNCH_DEADLINE_MS, subjectMatches, isConcreteChannel, assertValidChannel, channelInAllow, resolvePeer as resolvePeerInRoster, CotalEndpoint, BASELINE_LIFECYCLE_ENDPOINT, EpEnvelopeError, isPublishPermissionDenied, unansweredRequest, renderLifecycleBlocked, partsToText, } from "@cotal-ai/core";
4
+ import { normalizeMentions, RUN_LAUNCH_DEADLINE_MS, subjectMatches, isConcreteChannel, assertValidChannel, channelInAllow, resolvePeer as resolvePeerInRoster, CotalEndpoint, BASELINE_LIFECYCLE_ENDPOINT, assertLifecycleToken, EpEnvelopeError, isPublishPermissionDenied, unansweredRequest, renderLifecycleBlocked, partsToText, } from "@cotal-ai/core";
5
5
  import { invokeUserManager } from "./manager-call.js";
6
6
  /** Client-side floor for a spawn action's submit + follow. The manager acceptance carries the exact
7
7
  * connector-selected readiness budget, and core extends the follow through that budget plus
@@ -240,6 +240,14 @@ export class MeshAgent extends EventEmitter {
240
240
  focusExcludedIds = new Map();
241
241
  focusRecallUnsafeChannels = new Set();
242
242
  _stopping = false;
243
+ /** Presence writes go out IN CALL ORDER (#636, #2055). setStatus is two awaited puts and every
244
+ * connector fires it without awaiting, so two overlapping calls interleave their puts and the
245
+ * record that lands last is whichever call's second put finished last, not the call made last;
246
+ * at a driven turn's end the measured order was working, idle, working, and the seat then read
247
+ * working forever. Every write below runs its whole body through this chain, so the later
248
+ * call's puts start only after the earlier call's have settled. A rejected write must not
249
+ * poison the chain: the tail is swallowed and the next write still runs. */
250
+ presenceChain = Promise.resolve();
243
251
  constructor(config) {
244
252
  super();
245
253
  this.config = config;
@@ -535,6 +543,14 @@ export class MeshAgent extends EventEmitter {
535
543
  // Unconditional: a background self-heal can flip _connected without us, so a `_connected`
536
544
  // guard could skip the stop and leak the live connection/heartbeat/supervisor. ep.stop() is
537
545
  // idempotent (early-returns once stopped), so calling it when already-down is a noop.
546
+ // #636: departure is the last write. Running it THROUGH the chain (as its own inOrder entry,
547
+ // not merely awaited alongside it) orders offline behind every write already admitted,
548
+ // whichever method admitted it — setStatus's requireConnected included. The race is bounded so
549
+ // a wedged write cannot hang shutdown; on the timeout path the chain is abandoned but the
550
+ // endpoint must still stop, so ep.stop() runs directly once there. Every write admitted AFTER
551
+ // this point is refused at once by inOrder() (see there) rather than queued behind departure,
552
+ // so a straggler cannot land after offline and does not sit out setStatus's connect grace.
553
+ await Promise.race([this.inOrder(() => this.ep.stop(), true), sleep(3_000)]);
538
554
  await this.ep.stop();
539
555
  }
540
556
  /** Manual reconnect: tear down the mesh connection and rebuild it in-process, WITHOUT
@@ -1145,11 +1161,13 @@ export class MeshAgent extends EventEmitter {
1145
1161
  throw new Error(`"${channel}" must be a concrete channel (no wildcard) to set its attention`);
1146
1162
  if (!channelInAllow(this.config.allowSubscribe, channel))
1147
1163
  throw new Error(`"${channel}" is not within your read ACL (allowSubscribe) [${this.config.allowSubscribe.join(", ")}]`);
1148
- if (mode === "normal")
1149
- this.channelModes.delete(channel);
1150
- else
1151
- this.channelModes.set(channel, mode);
1152
- await this.ep.setChannelModes(this.channelModeEntries());
1164
+ await this.inOrder(() => {
1165
+ if (mode === "normal")
1166
+ this.channelModes.delete(channel);
1167
+ else
1168
+ this.channelModes.set(channel, mode);
1169
+ return this.ep.setChannelModes(this.channelModeEntries());
1170
+ });
1153
1171
  }
1154
1172
  /** Set the attention mode. Entering `focus` captures the chat frontier as the focus-watermark
1155
1173
  * (recall surfaces ambient published after it); leaving focus clears it. Requires a live
@@ -1159,34 +1177,36 @@ export class MeshAgent extends EventEmitter {
1159
1177
  * it landed just before or after the captured frontier. Only ambient arriving after the local
1160
1178
  * switch is ack-dropped. */
1161
1179
  async setAttention(mode) {
1162
- if (mode === "focus") {
1163
- await this.requireConnected();
1164
- this.focusExcludedIds.clear();
1165
- this.focusRecallUnsafeChannels.clear();
1166
- this.enteringFocus = this._attention !== "focus";
1167
- try {
1168
- this.focusSince = await this.ep.chatFrontier();
1180
+ await this.inOrder(async () => {
1181
+ if (mode === "focus") {
1182
+ await this.requireConnected();
1183
+ this.focusExcludedIds.clear();
1184
+ this.focusRecallUnsafeChannels.clear();
1185
+ this.enteringFocus = this._attention !== "focus";
1186
+ try {
1187
+ this.focusSince = await this.ep.chatFrontier();
1188
+ }
1189
+ catch (error) {
1190
+ this.enteringFocus = false;
1191
+ this.focusExcludedIds.clear();
1192
+ this.focusRecallUnsafeChannels.clear();
1193
+ throw error;
1194
+ }
1195
+ this.enteringFocus = false;
1196
+ this.resetRecallWalk();
1169
1197
  }
1170
- catch (error) {
1198
+ else {
1171
1199
  this.enteringFocus = false;
1200
+ this.focusSince = undefined;
1172
1201
  this.focusExcludedIds.clear();
1173
1202
  this.focusRecallUnsafeChannels.clear();
1174
- throw error;
1203
+ this.resetRecallWalk();
1175
1204
  }
1176
- this.enteringFocus = false;
1177
- this.resetRecallWalk();
1178
- }
1179
- else {
1180
- this.enteringFocus = false;
1181
- this.focusSince = undefined;
1182
- this.focusExcludedIds.clear();
1183
- this.focusRecallUnsafeChannels.clear();
1184
- this.resetRecallWalk();
1185
- }
1186
- this._attention = mode;
1187
- // Mirror to presence (advisory observability — peers can see "they're in focus"). Best-effort:
1188
- // a no-op until the KV is bound, and never read back into delivery.
1189
- await this.ep.setAttention(mode);
1205
+ this._attention = mode;
1206
+ // Mirror to presence (advisory observability — peers can see "they're in focus"). Best-effort:
1207
+ // a no-op until the KV is bound, and never read back into delivery.
1208
+ await this.ep.setAttention(mode);
1209
+ });
1190
1210
  }
1191
1211
  /** Focus recall: the channel ambient + @mentions ack-dropped since this agent entered focus,
1192
1212
  * read back from the chat stream on demand and **replay-gated per channel** (a `replay=off`
@@ -1228,7 +1248,7 @@ export class MeshAgent extends EventEmitter {
1228
1248
  await this.requireConnected();
1229
1249
  const clean = normalizeMentions(mentions);
1230
1250
  if (clean)
1231
- this.assertKnownMentions(clean);
1251
+ await this.assertKnownMentions(clean);
1232
1252
  return this.ep.multicast(text, { channel, mentions: clean, contextId: this._contextId });
1233
1253
  }
1234
1254
  /**
@@ -1260,12 +1280,32 @@ export class MeshAgent extends EventEmitter {
1260
1280
  * wrongly reject it), case-insensitively. Send is all-or-nothing: one unknown @name aborts
1261
1281
  * the whole broadcast (fail-loud on typos). Caveat: only catches peers THIS client has seen
1262
1282
  * — an offline peer lingers in the roster, but one never observed (or not yet filled in
1263
- * after connect) throws. See docs/architecture.md. */
1264
- assertKnownMentions(mentions) {
1265
- const names = new Set(this.ep.getRoster().map((p) => p.card.name.toLowerCase()));
1266
- const unknown = mentions.filter((m) => !names.has(m));
1267
- if (unknown.length)
1283
+ * after connect) throws. See docs/architecture.md.
1284
+ *
1285
+ * #1229: the roster can only support an ABSENCE verdict while `presenceView()` is `current`.
1286
+ * `clearConnectionScoped()` empties it on every reconnect and the watch refills entry by
1287
+ * entry, so a refusal under an unsafe view would reject a mention of a live peer. A name
1288
+ * already in the roster is accepted in every state; an absent name under `unpopulated`
1289
+ * waits once for the initial snapshot and re-reads; a still-unverifiable name refuses with
1290
+ * the observer's own condition (never "no such peer") and the send does not go out. */
1291
+ async assertKnownMentions(mentions) {
1292
+ const names = () => new Set(this.ep.getRoster().map((p) => p.card.name.toLowerCase()));
1293
+ const view = this.ep.presenceView();
1294
+ if (view.state === "unpopulated") {
1295
+ const unknown = mentions.filter((m) => !names().has(m));
1296
+ if (unknown.length)
1297
+ await this.ep.waitForPresenceSnapshot();
1298
+ }
1299
+ const after = this.ep.presenceView();
1300
+ const unknown = mentions.filter((m) => !names().has(m));
1301
+ if (!unknown.length)
1302
+ return;
1303
+ if (after.state === "current")
1268
1304
  throw new Error(`unknown mention${unknown.length > 1 ? "s" : ""}: ${unknown.map((u) => `@${u}`).join(", ")} — no such peer observed in space "${this.config.space}"`);
1305
+ const condition = after.state === "stale"
1306
+ ? `the presence view is stale since ${new Date(after.staleSince).toISOString()} (${Math.max(0, Date.now() - after.staleSince)}ms silent)`
1307
+ : "the presence view is unpopulated — the watch has not completed its initial snapshot";
1308
+ throw new Error(`cannot verify mention${unknown.length > 1 ? "s" : ""} ${unknown.map((u) => `@${u}`).join(", ")} in space "${this.config.space}": ${condition}, so absence is not a verdict — the peer may be present but unobserved. The send was not published.`);
1269
1309
  }
1270
1310
  async anycast(role, text) {
1271
1311
  await this.requireConnected();
@@ -1279,9 +1319,25 @@ export class MeshAgent extends EventEmitter {
1279
1319
  }
1280
1320
  async dm(target, text) {
1281
1321
  await this.requireConnected();
1282
- const peer = this.resolvePeer(target);
1283
- if (!peer)
1284
- throw new Error(`no peer "${target}" in space "${this.config.space}"`);
1322
+ // #1229: a miss is only a real "no peer" while the view is current. Under `unpopulated`
1323
+ // the roster may be a reconnect refill in progress, so wait once for the snapshot and
1324
+ // re-resolve; a still-unverifiable target refuses naming the observer's condition (never
1325
+ // "no peer"), and the DM does not go out.
1326
+ const view = this.ep.presenceView();
1327
+ let peer = this.resolvePeer(target);
1328
+ if (!peer && view.state === "unpopulated") {
1329
+ await this.ep.waitForPresenceSnapshot();
1330
+ peer = this.resolvePeer(target);
1331
+ }
1332
+ if (!peer) {
1333
+ const after = this.ep.presenceView();
1334
+ if (after.state === "current")
1335
+ throw new Error(`no peer "${target}" in space "${this.config.space}"`);
1336
+ const condition = after.state === "stale"
1337
+ ? `the presence view is stale since ${new Date(after.staleSince).toISOString()} (${Math.max(0, Date.now() - after.staleSince)}ms silent)`
1338
+ : "the presence view is unpopulated — the watch has not completed its initial snapshot";
1339
+ throw new Error(`cannot verify peer "${target}" in space "${this.config.space}": ${condition}, so absence is not a verdict — the peer may be present but unobserved. The DM was not sent.`);
1340
+ }
1285
1341
  const msg = await this.ep.unicast(peer.card.id, text, { contextId: this._contextId });
1286
1342
  return { msg, peer };
1287
1343
  }
@@ -1304,10 +1360,19 @@ export class MeshAgent extends EventEmitter {
1304
1360
  if (raw !== undefined && !raw.trim())
1305
1361
  return { ok: false, error: "model: must not be empty" };
1306
1362
  const requested = raw?.trim();
1363
+ let instance;
1364
+ try {
1365
+ instance = opts?.instance === undefined ? undefined : assertLifecycleToken(opts.instance, "instance");
1366
+ }
1367
+ catch (e) {
1368
+ return { ok: false, error: e.message };
1369
+ }
1370
+ if (this.config.userAuth && instance !== undefined && this.config.managerInstanceId !== undefined && instance !== this.config.managerInstanceId)
1371
+ return { ok: false, error: "the requested manager instance differs from this credential's instance authority" };
1307
1372
  const args = { name, role, agent: opts?.agent, model: requested || undefined, variant: opts?.variant, launchOptions: opts?.launchOptions, cwd: opts?.cwd, prompt: opts?.prompt, events: opts?.events };
1308
1373
  // P2 item 2 (2b): spawn is an ACTION — follow the acceptance to the terminal so cotal_spawn
1309
1374
  // stays synchronous (the MCP reply carries the live outcome, not the pre-launch acceptance).
1310
- const reply = await this.managerInvoke("spawn", args, { deadlineMs: SPAWN_TIMEOUT_MS, follow: true });
1375
+ const reply = await this.managerInvoke("spawn", args, { deadlineMs: SPAWN_TIMEOUT_MS, follow: true, ...(instance !== undefined ? { instanceId: instance } : {}) });
1311
1376
  if (!requested)
1312
1377
  return reply;
1313
1378
  // A requested pin that the manager did not record is the silent-drop failure (#972): the spawn
@@ -1316,7 +1381,7 @@ export class MeshAgent extends EventEmitter {
1316
1381
  // A wait-timeout is still a timeout, not evidence the pin landed — annotate it, never upgrade it.
1317
1382
  const actual = reply.data;
1318
1383
  const seat = actual?.name ?? name;
1319
- const recorded = await this.inspectModel(seat);
1384
+ const recorded = await this.inspectModel(seat, instance);
1320
1385
  const recordedLabel = !recorded.ok
1321
1386
  ? `could not inspect the recorded pin: ${recorded.error}`
1322
1387
  : recorded.model === undefined
@@ -1347,8 +1412,8 @@ export class MeshAgent extends EventEmitter {
1347
1412
  }
1348
1413
  /** The manager's recorded model pin for a managed seat (`inspect.model`). Absence is a real
1349
1414
  * state: a launch may pin none. Distinct from a failed inspect, which cannot attest. */
1350
- async inspectModel(name) {
1351
- const info = await this.managerInvoke("inspect", { name });
1415
+ async inspectModel(name, instance) {
1416
+ const info = await this.managerInvoke("inspect", { name }, instance === undefined ? undefined : { instanceId: instance });
1352
1417
  if (!info.ok)
1353
1418
  return { ok: false, error: info.error ?? "inspect refused" };
1354
1419
  const model = info.data?.model;
@@ -1371,13 +1436,15 @@ export class MeshAgent extends EventEmitter {
1371
1436
  try {
1372
1437
  const input = clean && Object.keys(clean).length ? clean : undefined;
1373
1438
  if (this.config.userAuth) {
1439
+ const managerInstanceId = opts.instanceId ?? this.config.managerInstanceId;
1440
+ const { instanceId: _instanceId, ...invokeOpts } = opts;
1374
1441
  const submit = async (signal) => {
1375
1442
  const bearer = await execBearerCmd([
1376
1443
  ...this.config.userAuth.bearerCmd,
1377
1444
  "--manager-call",
1378
- ...(this.config.managerInstanceId ? ["--manager-instance", this.config.managerInstanceId] : []),
1445
+ ...(managerInstanceId ? ["--manager-instance", managerInstanceId] : []),
1379
1446
  ], signal);
1380
- return invokeUserManager(this.config, bearer, command, input, { ...opts, signal });
1447
+ return invokeUserManager({ ...this.config, managerInstanceId }, bearer, command, input, { ...invokeOpts, signal });
1381
1448
  };
1382
1449
  // Subscribe before submission on the renewing main connection. A long accepted launch
1383
1450
  // must not inherit the short-lived control credential's expiry.
@@ -1397,7 +1464,7 @@ export class MeshAgent extends EventEmitter {
1397
1464
  userAuth: { ...this.config.userAuth, owner: context.caller.owner, actor: context.caller.actor },
1398
1465
  };
1399
1466
  const queryRes = await invokeUserManager(config, bearer, "goal-result", { goalId }, {
1400
- signal: context.signal, deadlineMs: Math.min(opts.deadlineMs ?? 10_000, context.deadlineMs),
1467
+ signal: context.signal, deadlineMs: Math.min(invokeOpts.deadlineMs ?? 10_000, context.deadlineMs),
1401
1468
  });
1402
1469
  if (queryRes.reply.ok !== true)
1403
1470
  throw new Error(queryRes.reply.error?.message ?? "goal-result query refused");
@@ -1726,30 +1793,55 @@ export class MeshAgent extends EventEmitter {
1726
1793
  roster() {
1727
1794
  return this.ep.getRoster();
1728
1795
  }
1796
+ /** Trust state of this observer's presence watch (`CotalEndpoint.presenceView()`): the roster
1797
+ * above can only support an absence verdict while this is `current` (#1229). */
1798
+ presenceView() {
1799
+ return this.ep.presenceView();
1800
+ }
1729
1801
  /** Our last self-reported presence status. */
1730
1802
  get status() {
1731
1803
  return this._status;
1732
1804
  }
1805
+ /** Run one presence write through the chain (#636): the write starts only after every earlier
1806
+ * admitted write has settled, and a rejection is swallowed at the TAIL only, so it propagates
1807
+ * to this write's own caller while the next admitted write still runs.
1808
+ *
1809
+ * The straggler rule: departure is the last write, later writes are refused, not reordered.
1810
+ * Once `stop()` has begun, any write admitted here rejects AT ONCE (no put queued, no wait on
1811
+ * the chain) with a fixed error, instead of running after — or, for a write that calls
1812
+ * `requireConnected` (e.g. `setStatus`), sitting out the ten-second connect grace before
1813
+ * rejecting anyway. `stop()` itself submits departure's own put through this same method (the
1814
+ * `forDeparture` escape) so departure keeps landing after every write already admitted, even
1815
+ * though `_stopping` is already true by the time it does. */
1816
+ inOrder(write, forDeparture = false) {
1817
+ if (this._stopping && !forDeparture)
1818
+ return Promise.reject(new Error("agent is stopping; presence writes are refused"));
1819
+ const next = this.presenceChain.then(write, write);
1820
+ this.presenceChain = next.catch(() => { });
1821
+ return next;
1822
+ }
1733
1823
  async setStatus(status, activity) {
1734
- await this.requireConnected();
1735
- const prev = this._status;
1736
- try {
1737
- if (prev !== "working" && status === "working")
1738
- await this.ep.setCondition(null);
1739
- await this.publishStatus(status, activity);
1740
- }
1741
- finally {
1742
- // The transition is a fact about the SEAT, not about whether its presence row was written:
1743
- // assigning before the writes meant one failed publish (which every adapter swallows) left
1744
- // `_status` idle with no boundary run, and the next real turn end saw no transition at all.
1745
- this._status = status;
1746
- // The turn relay's boundary: an adapter funnels its turn-end through this transition (Stop
1747
- // hooks set idle), so the automatic `done` yield and the immediate re-poll live here once
1748
- // instead of per connector. `waiting` is not a boundary — a seat blocked on a permission has
1749
- // not finished, and its deadline is what bounds a stuck one.
1750
- if (prev === "working" && status === "idle")
1751
- this.onTurnBoundary();
1752
- }
1824
+ await this.inOrder(async () => {
1825
+ await this.requireConnected();
1826
+ const prev = this._status;
1827
+ try {
1828
+ if (prev !== "working" && status === "working")
1829
+ await this.ep.setCondition(null);
1830
+ await this.publishStatus(status, activity);
1831
+ }
1832
+ finally {
1833
+ // The transition is a fact about the SEAT, not about whether its presence row was written:
1834
+ // assigning before the writes meant one failed publish (which every adapter swallows) left
1835
+ // `_status` idle with no boundary run, and the next real turn end saw no transition at all.
1836
+ this._status = status;
1837
+ // The turn relay's boundary: an adapter funnels its turn-end through this transition (Stop
1838
+ // hooks set idle), so the automatic `done` yield and the immediate re-poll live here once
1839
+ // instead of per connector. `waiting` is not a boundary — a seat blocked on a permission has
1840
+ // not finished, and its deadline is what bounds a stuck one.
1841
+ if (prev === "working" && status === "idle")
1842
+ this.onTurnBoundary();
1843
+ }
1844
+ });
1753
1845
  }
1754
1846
  /**
1755
1847
  * Publish presence for something that is NOT a turn ending.
@@ -1762,13 +1854,15 @@ export class MeshAgent extends EventEmitter {
1762
1854
  * than an ending.
1763
1855
  */
1764
1856
  async resetStatus(status, activity) {
1765
- await this.requireConnected();
1766
- try {
1767
- await this.publishStatus(status, activity);
1768
- }
1769
- finally {
1770
- this._status = status;
1771
- }
1857
+ await this.inOrder(async () => {
1858
+ await this.requireConnected();
1859
+ try {
1860
+ await this.publishStatus(status, activity);
1861
+ }
1862
+ finally {
1863
+ this._status = status;
1864
+ }
1865
+ });
1772
1866
  }
1773
1867
  async publishStatus(status, activity) {
1774
1868
  if (activity !== undefined)
@@ -1777,7 +1871,7 @@ export class MeshAgent extends EventEmitter {
1777
1871
  }
1778
1872
  /** Relay a harness-reported condition into presence, or clear it. */
1779
1873
  async setCondition(condition) {
1780
- await this.ep.setCondition(condition);
1874
+ await this.inOrder(() => this.ep.setCondition(condition));
1781
1875
  }
1782
1876
  /** The working→idle boundary: yield `done` for every SURFACED turn (its payload was in the
1783
1877
  * context of the turn that just ended; ending without an explicit yield IS the done signal),
@@ -1801,7 +1895,7 @@ export class MeshAgent extends EventEmitter {
1801
1895
  async setModel(model, variant) {
1802
1896
  if (this.config.model)
1803
1897
  return; // operator pin is authoritative — never override it with the runtime value
1804
- await this.ep.setCardModel(model, this.config.variant ?? variant);
1898
+ await this.inOrder(() => this.ep.setCardModel(model, this.config.variant ?? variant));
1805
1899
  }
1806
1900
  // ---- channel registry ----------------------------------------------------
1807
1901
  /** The boot-time "push" half of channel onboarding: a fenced, one-line description per
@@ -1841,25 +1935,52 @@ export class MeshAgent extends EventEmitter {
1841
1935
  const mine = this.ep.joinedChannels();
1842
1936
  const pending = this.ep.pendingDurableLeaves();
1843
1937
  const unclosed = new Set(pending);
1844
- // Non-gating delivery-health signal: read the server-side daemon's lease ONCE (a durable-joined
1845
- // channel must not render as ordinary "subscribed, replay on" when the daemon is down). A read that
1846
- // throws = open mode / no delivery bucket / no grant → no health surface (left undefined).
1938
+ // Non-gating delivery-health signal (#445): "active" requires an AFFIRMATIVE bounded round-trip
1939
+ // to the delivery daemon's ctl.delivery responder — the one signal a killed daemon cannot leave
1940
+ // behind. The lease read alone was residue (a SIGKILLed daemon's KV row stays `ready: true` for
1941
+ // the bucket TTL) and the session-local membership map never notices daemon death at all, so
1942
+ // together they certified a corpse. Two separable facts, read separately:
1943
+ // `leaseReadable` — the reader may read the delivery plane (an under-granted read throws);
1944
+ // `daemonMemberships` — the daemon's OWN answer (undefined ⇒ no responder answered, so no
1945
+ // daemon is serving this plane; a throw ⇒ responder-present error, fail closed below).
1847
1946
  let leaseLive = false;
1848
- let daemonKnown = false;
1947
+ let leaseReadable = false;
1948
+ let daemonMemberships;
1849
1949
  try {
1850
1950
  // "ready" (responder bound), not mere lease existence (single-flight slot claimed mid-startup).
1851
1951
  leaseLive = (await this.ep.readDeliveryLease(0))?.ready === true;
1852
- daemonKnown = true;
1952
+ leaseReadable = true;
1853
1953
  }
1854
1954
  catch {
1855
1955
  /* open dev mode or no delivery plane here — health surface does not apply */
1856
1956
  }
1857
- // Membership-aware: "active" requires BOTH a live daemon lease AND an established owner membership.
1858
- // A joined durable channel whose boot self-join hasn't landed yet (daemon was down at connect, now
1859
- // reconciling) has no backstop for this owner even if the lease is live — render it degraded, never
1860
- // a false "active" off the lease alone (ux honesty blocker).
1861
- const health = (channel, joined) => daemonKnown && joined && this.ep.channelDeliveryClass(channel) === "durable"
1862
- ? (leaseLive && this.ep.hasDurableMembership(channel) ? "active" : "degraded")
1957
+ if (leaseReadable) {
1958
+ try {
1959
+ daemonMemberships = await this.ep.fetchMemberships();
1960
+ }
1961
+ catch {
1962
+ /* responder present but errored — health cannot be established, never "active" */
1963
+ daemonMemberships = undefined;
1964
+ leaseReadable = false;
1965
+ }
1966
+ }
1967
+ // Membership-aware: "active" requires a daemon that ANSWERED and lists this channel for this
1968
+ // lifecycle (the round-trip is scoped to it), plus a live lease (the lease still carries
1969
+ // information the round-trip does not: it distinguishes a serving daemon from one whose loops
1970
+ // are still binding). A SIGKILLed daemon leaves the lease row behind with ready:true and the
1971
+ // local map set, but answers nothing — degraded. A joined durable channel whose health cannot
1972
+ // be established (the reader lacks the grant, or the responder errored) renders "unknown",
1973
+ // distinct from the degraded of a daemon that answered but holds no membership for this owner —
1974
+ // and from the undefined of a channel where health does not apply (not durable-class, not
1975
+ // joined, open mode).
1976
+ const health = (channel, joined) => joined && this.ep.channelDeliveryClass(channel) === "durable"
1977
+ ? !leaseReadable
1978
+ ? "unknown"
1979
+ : daemonMemberships === undefined
1980
+ ? "degraded"
1981
+ : daemonMemberships.some((m) => m.channel === channel) && leaseLive
1982
+ ? "active"
1983
+ : "degraded"
1863
1984
  : undefined;
1864
1985
  const rows = (await this.ep.listChannels()).map((c) => {
1865
1986
  const joined = mine.some((p) => subjectMatches(p, c.channel));