@cotal-ai/connector-core 0.3.2 → 0.5.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.js CHANGED
@@ -1,5 +1,15 @@
1
1
  import { EventEmitter } from "node:events";
2
- import { normalizeMentions, subjectMatches, isConcreteChannel, CotalEndpoint, } from "@cotal-ai/core";
2
+ import { normalizeMentions, subjectMatches, isConcreteChannel, channelInAllow, resolvePeer as resolvePeerInRoster, CotalEndpoint, CONTROL_PRIVILEGED, CONTROL_SELF_SERVICE, } from "@cotal-ai/core";
3
+ /** The display-only `AgentCard.meta` for a session. Agent-file metadata is preserved, then
4
+ * connector-owned fields are overlaid so files cannot spoof the hosting harness. */
5
+ function buildMeta(config) {
6
+ const meta = { ...(config.meta ?? {}) };
7
+ if (config.model)
8
+ meta.model = config.model;
9
+ if (config.connector)
10
+ meta.connector = config.connector;
11
+ return Object.keys(meta).length ? meta : undefined;
12
+ }
3
13
  const MAX_INBOX = 200;
4
14
  function sleep(ms) {
5
15
  return new Promise((r) => setTimeout(r, ms));
@@ -23,9 +33,24 @@ export class MeshAgent extends EventEmitter {
23
33
  ep;
24
34
  config;
25
35
  inbox = [];
36
+ /** Ids already SURFACED to the model (handled) — bounded, commit-aware dedup ACROSS a drain. The
37
+ * live↔durable transition window can deliver the two copies of one message far enough apart that the
38
+ * first is already drained (removed from {@link inbox}) when the second arrives; the pending-inbox
39
+ * check alone would then re-buffer and double-surface it. Recorded at HANDLE time ({@link drainInbox}),
40
+ * never at receive time — so a later durable duplicate of an already-handled id is safe to ack (the
41
+ * logical message was delivered), which is exactly what the removed endpoint-level `firstSeenChat`
42
+ * got wrong (it acked at receive time, before handling). Two rotating windows bound memory. */
43
+ handledIds = new Set();
44
+ handledIdsPrev = new Set();
26
45
  _connected = false;
27
46
  _status = "idle";
28
47
  _attention = "open"; // F3: fail-open default; reset to open on SessionStart
48
+ /** Per-channel attention overrides — the AUTHORITATIVE runtime state (read by {@link ingest} on
49
+ * every message). Seeded from the agent-file default; mutated by {@link setChannelMode}; mirrored
50
+ * to presence for peers. An absent key ⇒ that channel follows the global {@link _attention}. Reset
51
+ * on restart (rebuilt from config; presence sweep clears the mirror). */
52
+ channelModes = new Map();
53
+ _contextId;
29
54
  /** Chat-stream frontier captured when this agent entered `focus` — recall surfaces ambient
30
55
  * published after it ("since you entered focus"). Undefined unless in focus. */
31
56
  focusSince;
@@ -33,6 +58,12 @@ export class MeshAgent extends EventEmitter {
33
58
  constructor(config) {
34
59
  super();
35
60
  this.config = config;
61
+ // Seed per-channel attention from the operator's file default (one-way: the runtime never writes
62
+ // back — the persona file is a shared template). muted/quiet are validated disjoint at file load.
63
+ for (const c of config.quiet ?? [])
64
+ this.channelModes.set(c, "quiet");
65
+ for (const c of config.muted ?? [])
66
+ this.channelModes.set(c, "muted");
36
67
  this.ep = new CotalEndpoint({
37
68
  space: config.space,
38
69
  servers: config.servers,
@@ -41,7 +72,9 @@ export class MeshAgent extends EventEmitter {
41
72
  pass: config.pass,
42
73
  creds: config.creds,
43
74
  tls: config.tls,
44
- channels: config.channels,
75
+ ackWaitMs: config.ackWaitMs, // undefined → endpoint default (60s); shortened in tests to observe redelivery
76
+ channels: config.subscribe, // the endpoint's live filter = the active read set
77
+ channelModes: Object.fromEntries(this.channelModes), // seed presence so file defaults are visible at boot
45
78
  card: {
46
79
  id: config.id,
47
80
  name: config.name,
@@ -49,10 +82,17 @@ export class MeshAgent extends EventEmitter {
49
82
  kind: config.kind,
50
83
  description: config.description,
51
84
  tags: config.tags,
85
+ // Display-only discovery metadata so observers can show which harness an agent runs on
86
+ // and (when pinned) which model. Each is omitted when unset rather than faked.
87
+ meta: buildMeta(config),
52
88
  },
53
89
  });
54
90
  this.ep.on("message", (m, d, meta) => this.ingest(m, d, meta));
55
91
  this.ep.on("error", (e) => this.log(`endpoint error: ${e.message}`));
92
+ // The endpoint's (re)binds are the single source of truth for connectedness: this fires on
93
+ // initial start, manual reconnect, AND the background self-heal — so a recovery the endpoint
94
+ // did on its own can't leave us thinking we're offline (which would skip stop() → leak).
95
+ this.ep.on("connection", (e) => { this._connected = e.connected; });
56
96
  }
57
97
  get id() {
58
98
  return this.ep.card.id;
@@ -60,6 +100,11 @@ export class MeshAgent extends EventEmitter {
60
100
  get connected() {
61
101
  return this._connected;
62
102
  }
103
+ /** Correlates outgoing messages to the host agent's current context/window. */
104
+ setContextId(contextId) {
105
+ const clean = contextId?.trim();
106
+ this._contextId = clean ? clean : undefined;
107
+ }
63
108
  /** Begin connecting (with background retry). Returns immediately. */
64
109
  start(retryMs = 3000) {
65
110
  void this.connectLoop(retryMs);
@@ -68,8 +113,8 @@ export class MeshAgent extends EventEmitter {
68
113
  while (!this.stopping && !this._connected) {
69
114
  try {
70
115
  await this.ep.start();
71
- this._connected = true;
72
- this.log(`connected to ${this.config.servers} as ${this.who()} in space "${this.config.space}" on #${this.config.channels.join(", #")}`);
116
+ // _connected is set by the endpoint's "connection" event (fired inside start()), not here.
117
+ this.log(`connected to ${this.config.servers} as ${this.who()} in space "${this.config.space}" on #${this.config.subscribe.join(", #")}`);
73
118
  }
74
119
  catch (e) {
75
120
  this.log(`mesh unreachable (${e.message}); retrying in ${retryMs}ms`);
@@ -79,31 +124,80 @@ export class MeshAgent extends EventEmitter {
79
124
  }
80
125
  async stop() {
81
126
  this.stopping = true;
82
- if (this._connected)
83
- await this.ep.stop();
127
+ // Unconditional: a background self-heal can flip _connected without us, so a `_connected`
128
+ // guard could skip the stop and leak the live connection/heartbeat/supervisor. ep.stop() is
129
+ // idempotent (early-returns once stopped), so calling it when already-down is a noop.
130
+ await this.ep.stop();
131
+ }
132
+ /** Manual reconnect: tear down the mesh connection and rebuild it in-process, WITHOUT
133
+ * stopping the agent (the recovery path, so it does NOT assert connected). Delegates to
134
+ * {@link CotalEndpoint.reconnect}, which is serialized with the self-heal supervisor and
135
+ * interruptible. Returns a one-line status for the caller to surface (e.g. the
136
+ * cotal_reconnect tool → TUI); on failure the endpoint keeps retrying in the background. */
137
+ async reconnect() {
138
+ if (this.stopping) {
139
+ return {
140
+ ok: false,
141
+ message: "This session is shutting down, so its Cotal mesh connection cannot be reconnected. Start a new session instead.",
142
+ };
143
+ }
144
+ try {
145
+ await this.ep.reconnect();
146
+ // _connected is set by the endpoint's "connection" event on the successful rebind, not here.
147
+ return { ok: true, message: `Reconnected ✓ (${this.config.name}@${this.config.space})` };
148
+ }
149
+ catch (e) {
150
+ return { ok: false, message: `Reconnect failed: ${e.message}. Still retrying automatically — or run /reconnect to retry now.` };
151
+ }
84
152
  }
85
153
  // ---- inbox ---------------------------------------------------------------
86
154
  ingest(m, delivery, meta) {
87
- // Redelivery (we held it unacked past ack_wait): keep one entry, take the freshest ack handle.
155
+ // Already SURFACED and drained? This is a post-handle cross-path duplicate (the transition window's
156
+ // second copy, arriving after the first was handled). Don't surface it again; if it's the durable
157
+ // copy, ack it so JetStream stops redelivering — safe because the logical message was already
158
+ // handled (handledIds is recorded at drain time, never at receive time).
159
+ if (this.handledIds.has(m.id) || this.handledIdsPrev.has(m.id)) {
160
+ if (delivery.durable)
161
+ delivery.ack();
162
+ return;
163
+ }
164
+ // Duplicate id still PENDING — keep ONE entry. Take the freshest ack handle, but NEVER downgrade a
165
+ // durable (committing) ack to a live no-op. Two cases produce a duplicate: same-path JetStream
166
+ // redelivery (always durable → upgrade to the fresh handle), and the cross-path live/durable
167
+ // transition window. There, if the DURABLE copy arrived first and a LIVE copy lands second,
168
+ // overwriting with the live no-op would leave the durable copy uncommitted → JS redelivers it → it
169
+ // double-surfaces. So only a durable delivery may replace the stored handle; a live duplicate is
170
+ // dropped as-is.
88
171
  const existing = this.inbox.find((p) => p.item.id === m.id);
89
172
  if (existing) {
90
- existing.ack = delivery.ack;
173
+ if (delivery.durable)
174
+ existing.ack = delivery.ack;
91
175
  return;
92
176
  }
93
177
  if (!meta)
94
178
  throw new Error(`message ${m.id} delivered without MessageMeta — its class is unauthenticated`);
95
179
  const item = this.toInboxItem(m, meta.kind, meta.historical);
96
- // Focus: only subject-directed (dm/anycast) reach the buffer. Channel ambient AND @mentions
97
- // are acked-and-dropped right here acking does NOT delete (the chat stream is Limits-
98
- // retained), so they stay recallable via cotal_inbox (recallAmbient). An @mention still
99
- // *wakes* (emit "mention-wake"), but its body is never buffered or auto-injected F4=B
100
- // (wake-only + pull), because the mention tag is payload-forgeable and must not earn the
101
- // subject-directed privilege of auto-injection.
102
- if (this._attention === "focus" && item.kind === "channel") {
103
- delivery.ack();
104
- if (item.mentionsMe)
105
- this.emit("mention-wake", item);
106
- return;
180
+ // Per-channel override is the FINAL word for a channel message (DMs/anycast are never channel-
181
+ // scoped, so they bypass this entirely and always buffer). Evaluated BEFORE the global mode:
182
+ // - `muted` → hard drop, incl. @mention (a mention rides the channel; you can't keep it if you
183
+ // dropped the channel). Acking does NOT delete (Limits-retained) but it's not locally recallable.
184
+ // - `quiet` → buffer (read it on your terms); no ambient wake (the gate's job); an @mention still
185
+ // wakes. Overrides global `focus` so "retain this channel, just don't wake me" stays expressible.
186
+ // Focus (global, only when NOT overridden): channel ambient AND @mentions are acked-and-dropped —
187
+ // they stay recallable via cotal_inbox (recallAmbient); an @mention still *wakes* (mention-wake),
188
+ // body pulled (F4=B), never auto-injected (the mention tag is payload-forgeable).
189
+ if (item.kind === "channel") {
190
+ const cm = this.channelModes.get(item.channel ?? "");
191
+ if (cm === "muted") {
192
+ delivery.ack();
193
+ return;
194
+ }
195
+ if (cm !== "quiet" && this._attention === "focus") {
196
+ delivery.ack();
197
+ if (item.mentionsMe)
198
+ this.emit("mention-wake", item);
199
+ return;
200
+ }
107
201
  }
108
202
  this.inbox.push({ item, ack: delivery.ack });
109
203
  if (this.inbox.length > MAX_INBOX) {
@@ -142,10 +236,22 @@ export class MeshAgent extends EventEmitter {
142
236
  drainInbox(limit) {
143
237
  const n = limit && limit > 0 ? Math.min(limit, this.inbox.length) : this.inbox.length;
144
238
  const taken = this.inbox.splice(0, n);
145
- for (const p of taken)
239
+ for (const p of taken) {
146
240
  p.ack();
241
+ this.markHandled(p.item.id);
242
+ }
147
243
  return taken.map((p) => p.item);
148
244
  }
245
+ /** Record an id as surfaced/handled, for {@link ingest}'s commit-aware cross-path dedup. Bounded via
246
+ * two rotating windows: when the live set fills, it becomes the previous window and a fresh one
247
+ * starts — so memory stays ~2× the cap while the lookup horizon never shrinks below it. */
248
+ markHandled(id) {
249
+ this.handledIds.add(id);
250
+ if (this.handledIds.size >= 4096) {
251
+ this.handledIdsPrev = this.handledIds;
252
+ this.handledIds = new Set();
253
+ }
254
+ }
149
255
  /** Return pending messages without acking them (they stay on the stream). */
150
256
  peekInbox() {
151
257
  return this.inbox.map((p) => p.item);
@@ -160,6 +266,23 @@ export class MeshAgent extends EventEmitter {
160
266
  directedPendingCount() {
161
267
  return this.inbox.filter((p) => p.item.kind !== "channel" || p.item.mentionsMe).length;
162
268
  }
269
+ /** Buffered items that should WAKE a Stop→idle flush — the mode-and-channel-aware predicate the
270
+ * connectors use instead of branching on attention themselves:
271
+ * - directed (dm/anycast) or an @mention → always (a quiet @mention still wakes; muted never buffers);
272
+ * - NORMAL ambient (no per-channel override) → only under global `open` (today's behavior);
273
+ * - QUIET ambient → never (it rides the next human turn, not a proactive wake).
274
+ * Subsumes {@link directedPendingCount}: in `dnd`/`focus` (no override) the open term is false, so it
275
+ * equals the directed count; in `open` it adds normal ambient but excludes quiet-channel ambient. */
276
+ pendingWake() {
277
+ return this.inbox.filter((p) => {
278
+ const it = p.item;
279
+ if (it.kind !== "channel" || it.mentionsMe)
280
+ return true;
281
+ if (this.channelMode(it.channel) === "quiet")
282
+ return false;
283
+ return this._attention === "open";
284
+ }).length;
285
+ }
163
286
  /** Ask any push layer (the channel) to wake the session now — used by the Stop→idle flush
164
287
  * to deliver a batch of held messages. Emits `"wake"`; a no-op if nothing listens. Never acks
165
288
  * or drains. Ack sites are now two: {@link drainInbox} (surfaced items) and the focus ingest
@@ -168,10 +291,39 @@ export class MeshAgent extends EventEmitter {
168
291
  this.emit("wake");
169
292
  }
170
293
  // ---- attention ------------------------------------------------------------
171
- /** This agent's attention mode (how aggressively peer traffic interrupts it). Local-only. */
294
+ /** This agent's global attention mode. Authoritative here; mirrored to presence (advisory) so peers
295
+ * can see it. Delivery never reads it back from presence — local state wins. */
172
296
  get attention() {
173
297
  return this._attention;
174
298
  }
299
+ /** This agent's per-channel override for `channel` (undefined ⇒ follow the global mode). */
300
+ channelMode(channel) {
301
+ return channel ? this.channelModes.get(channel) : undefined;
302
+ }
303
+ /** A snapshot of every per-channel override (for the at-a-glance views). */
304
+ channelModeEntries() {
305
+ return Object.fromEntries(this.channelModes);
306
+ }
307
+ /** Set (or clear, with `"normal"`) one channel's attention override. Validates the channel is
308
+ * concrete and within this agent's read ACL (`allowSubscribe` — so a mode can be pre-set for a
309
+ * channel it may read but hasn't joined yet), updates the AUTHORITATIVE in-memory map, then mirrors
310
+ * the whole map to presence (best-effort; advisory). Per-instance + runtime: it NEVER writes the
311
+ * agent file (a shared template) and resets on restart.
312
+ *
313
+ * **Prospective only:** it does NOT purge messages already buffered from that channel — those were
314
+ * already received and still drain/wake per their original handling. Muting changes what arrives
315
+ * next, not what's already in the inbox. */
316
+ async setChannelMode(channel, mode) {
317
+ if (!isConcreteChannel(channel))
318
+ throw new Error(`"${channel}" must be a concrete channel (no wildcard) to set its attention`);
319
+ if (!channelInAllow(this.config.allowSubscribe, channel))
320
+ throw new Error(`"${channel}" is not within your read ACL (allowSubscribe) [${this.config.allowSubscribe.join(", ")}]`);
321
+ if (mode === "normal")
322
+ this.channelModes.delete(channel);
323
+ else
324
+ this.channelModes.set(channel, mode);
325
+ await this.ep.setChannelModes(this.channelModeEntries());
326
+ }
175
327
  /** Set the attention mode. Entering `focus` captures the chat frontier as the focus-watermark
176
328
  * (recall surfaces ambient published after it); leaving focus clears it. Requires a live
177
329
  * connection only for `focus` (it reads the stream frontier). Ambient already *buffered* when
@@ -188,6 +340,9 @@ export class MeshAgent extends EventEmitter {
188
340
  this.focusSince = undefined;
189
341
  }
190
342
  this._attention = mode;
343
+ // Mirror to presence (advisory observability — peers can see "they're in focus"). Best-effort:
344
+ // a no-op until the KV is bound, and never read back into delivery.
345
+ await this.ep.setAttention(mode);
191
346
  }
192
347
  /** Focus recall: the channel ambient + @mentions ack-dropped since this agent entered focus,
193
348
  * read back from the chat stream on demand and **replay-gated per channel** (a `replay=off`
@@ -204,6 +359,12 @@ export class MeshAgent extends EventEmitter {
204
359
  for (const channel of this.ep.joinedChannels()) {
205
360
  if (!isConcreteChannel(channel))
206
361
  continue;
362
+ // Skip any channel with a per-channel override: `muted` must NOT resurface via recall (you opted
363
+ // out of receiving it at all), and `quiet` overrides focus so its messages were buffered live —
364
+ // recalling them would duplicate what's already in the inbox. Only NORMAL channels' focus-
365
+ // ack-dropped ambient is recalled.
366
+ if (this.channelModes.has(channel))
367
+ continue;
207
368
  const { messages, dropped } = await this.ep.recallChannel(channel, this.focusSince);
208
369
  for (const m of messages)
209
370
  items.push(this.toInboxItem(m, "channel", true));
@@ -219,7 +380,7 @@ export class MeshAgent extends EventEmitter {
219
380
  const clean = normalizeMentions(mentions);
220
381
  if (clean)
221
382
  this.assertKnownMentions(clean);
222
- return this.ep.multicast(text, { channel, mentions: clean });
383
+ return this.ep.multicast(text, { channel, mentions: clean, contextId: this._contextId });
223
384
  }
224
385
  /** Throw if any name isn't a peer we've observed. Validates against the FULL roster
225
386
  * (incl. self — your own name is a valid participant; resolvePeer's self-filter would
@@ -235,25 +396,20 @@ export class MeshAgent extends EventEmitter {
235
396
  }
236
397
  async anycast(role, text) {
237
398
  this.assertConnected();
238
- return this.ep.anycast(role, text);
399
+ return this.ep.anycast(role, text, { contextId: this._contextId });
239
400
  }
240
- /** Resolve a peer by instance id (exact) or display name (case-insensitive, prefer present). */
401
+ /** Resolve a peer by instance id (exact) or display name. Deterministic and fail-loud: returns
402
+ * one peer, `undefined` if none match, or throws `AmbiguousPeerError` on a same-name collision —
403
+ * it never silently picks. See `resolvePeer` in @cotal-ai/core. */
241
404
  resolvePeer(target) {
242
- const roster = this.ep.getRoster().filter((p) => p.card.id !== this.id);
243
- const byId = roster.find((p) => p.card.id === target);
244
- if (byId)
245
- return byId;
246
- const t = target.toLowerCase();
247
- const present = roster.filter((p) => p.status !== "offline");
248
- return (present.find((p) => p.card.name.toLowerCase() === t) ??
249
- roster.find((p) => p.card.name.toLowerCase() === t));
405
+ return resolvePeerInRoster(this.ep.getRoster(), target, { selfId: this.id });
250
406
  }
251
407
  async dm(target, text) {
252
408
  this.assertConnected();
253
409
  const peer = this.resolvePeer(target);
254
410
  if (!peer)
255
411
  throw new Error(`no peer "${target}" in space "${this.config.space}"`);
256
- const msg = await this.ep.unicast(peer.card.id, text);
412
+ const msg = await this.ep.unicast(peer.card.id, text, { contextId: this._contextId });
257
413
  return { msg, peer };
258
414
  }
259
415
  // ---- supervision ---------------------------------------------------------
@@ -262,23 +418,32 @@ export class MeshAgent extends EventEmitter {
262
418
  * runtime; from here it just joins the mesh as a lateral peer. */
263
419
  async spawn(name, role) {
264
420
  this.assertConnected();
265
- return this.ep.requestControl("manager", { op: "start", args: { name, role } });
421
+ return this.ep.requestControl(CONTROL_PRIVILEGED, { op: "start", args: { name, role } });
266
422
  }
267
423
  /** Ask the manager to tear a teammate down (its `stop` op). Graceful by default —
268
424
  * the session is told to exit cleanly (so it leaves the mesh) before the
269
- * process/tab is closed; `graceful:false` is a hard, immediate kill. */
425
+ * process/tab is closed; `graceful:false` is a hard, immediate kill.
426
+ *
427
+ * No `name` ⇒ self-despawn: rides the self-service control subject and the manager
428
+ * resolves the target as the managed agent whose id == this caller — so it can only
429
+ * ever stop itself, never a peer. A `name` ⇒ rides the privileged control subject
430
+ * (transport-gated to spawn-capable/admin); the manager refines own-child vs admin. */
270
431
  async despawn(name, opts) {
271
432
  this.assertConnected();
272
- return this.ep.requestControl("manager", {
433
+ const graceful = opts?.graceful ?? true;
434
+ if (!name) {
435
+ return this.ep.requestControl(CONTROL_SELF_SERVICE, { op: "stop", args: { graceful } });
436
+ }
437
+ return this.ep.requestControl(CONTROL_PRIVILEGED, {
273
438
  op: "stop",
274
- args: { name, graceful: opts?.graceful ?? true },
439
+ args: { name, graceful },
275
440
  });
276
441
  }
277
442
  /** Ask the manager to purge the space's retained chat backlog (its `purge` op). Cleanup only —
278
443
  * it doesn't touch live agents or the anycast work queue. `includeDms` also clears DM history. */
279
444
  async purgeHistory(opts) {
280
445
  this.assertConnected();
281
- return this.ep.requestControl("manager", {
446
+ return this.ep.requestControl(CONTROL_PRIVILEGED, {
282
447
  op: "purge",
283
448
  args: { includeDms: opts?.includeDms ?? false },
284
449
  });
@@ -288,9 +453,10 @@ export class MeshAgent extends EventEmitter {
288
453
  * half — so peers see the new persona; `spawn(name)` then launches an agent wearing it. */
289
454
  async definePersona(def) {
290
455
  this.assertConnected();
291
- const reply = await this.ep.requestControl("manager", {
456
+ const reply = await this.ep.requestControl(CONTROL_PRIVILEGED, {
292
457
  op: "definePersona",
293
- args: { name: def.name, role: def.role, model: def.model, persona: def.prompt },
458
+ // role is policy set at spawn, never via definePersona; the manager ignores it regardless.
459
+ args: { name: def.name, model: def.model, persona: def.prompt },
294
460
  });
295
461
  if (reply.ok)
296
462
  await this.send(`persona \`${def.name}\` is now available — spawn it to bring it online`);
@@ -312,6 +478,16 @@ export class MeshAgent extends EventEmitter {
312
478
  await this.ep.setActivity(activity);
313
479
  await this.ep.setStatus(status);
314
480
  }
481
+ /** Record the host's *actual* model — learned after launch (e.g. from Claude Code's `SessionStart`
482
+ * hook payload) — into the card's display-only `meta.model`, so peers see it in `cotal_roster` and
483
+ * the web roster even when the operator never pinned one. An explicit pin (`config.model`, from the
484
+ * agent file's `model:` or `COTAL_MODEL`) is authoritative and wins; this only fills the gap. Best-
485
+ * effort presence mirror (no `assertConnected` — safe pre-connect; it rides the first publish). */
486
+ async setModel(model) {
487
+ if (this.config.model)
488
+ return; // operator pin is authoritative — never override it with the runtime value
489
+ await this.ep.setCardModel(model);
490
+ }
315
491
  // ---- channel registry ----------------------------------------------------
316
492
  /** The boot-time "push" half of channel onboarding: a fenced, one-line description per
317
493
  * subscribed channel that has one (the full `instructions` stay pull-only via
@@ -347,15 +523,43 @@ export class MeshAgent extends EventEmitter {
347
523
  * other peers' membership). The companion to cotal_join. */
348
524
  async listChannels() {
349
525
  const mine = this.ep.joinedChannels();
350
- return (await this.ep.listChannels()).map((c) => ({
526
+ const pending = this.ep.pendingDurableLeaves();
527
+ const unclosed = new Set(pending);
528
+ const rows = (await this.ep.listChannels()).map((c) => ({
351
529
  channel: c.channel,
352
530
  description: c.config?.description,
353
531
  replay: this.ep.channelReplay(c.channel),
354
532
  joined: mine.some((p) => subjectMatches(p, c.channel)),
533
+ // A live sub was refused while a Plane-3 durable membership stayed open; its §7 tombstone is still
534
+ // retrying. Surface it so the channel is never shown as ordinary "not subscribed" (ux requirement).
535
+ durableUnclosed: unclosed.has(c.channel),
355
536
  messages: c.messages,
537
+ mode: this.channelMode(c.channel) ?? "normal",
356
538
  }));
357
- }
358
- /** Join a channel mid-session (backfills history if replay is on; idempotent). */
539
+ // A channel in refused-sub durable cleanup can have NO traffic AND no registry entry, so listChannels()
540
+ // omits it UNION it in so the durable-unclosed state can never disappear by omission (ux/security).
541
+ const present = new Set(rows.map((r) => r.channel));
542
+ for (const ch of pending) {
543
+ if (present.has(ch))
544
+ continue;
545
+ rows.push({
546
+ channel: ch,
547
+ description: undefined,
548
+ replay: this.ep.channelReplay(ch),
549
+ joined: false,
550
+ durableUnclosed: true,
551
+ messages: 0,
552
+ mode: this.channelMode(ch) ?? "normal",
553
+ });
554
+ }
555
+ return rows;
556
+ }
557
+ /** Join a channel mid-session (backfills history if replay is on; idempotent). `durable` reports
558
+ * whether a durable backstop is active (Plane-3, SPEC §8, for a `durable`-class channel when a
559
+ * manager is present) — `false` means joined LIVE only, so messages sent while this session is
560
+ * offline won't be replayed. `reason` explains a `durable:false` on a channel that EXPECTED a
561
+ * backstop (e.g. no privileged provisioner); absent on a `live`-class channel (joined live is the
562
+ * contract there). */
359
563
  async joinChannel(channel) {
360
564
  this.assertConnected();
361
565
  return this.ep.joinChannel(channel);
package/dist/agent.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,aAAa,GAOd,MAAM,gBAAgB,CAAC;AAiCxB,MAAM,SAAS,GAAG,GAAG,CAAC;AActB,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,SAAU,SAAQ,YAAY;IAChC,EAAE,CAAgB;IAClB,MAAM,CAAc;IAErB,KAAK,GAAc,EAAE,CAAC;IACtB,UAAU,GAAG,KAAK,CAAC;IACnB,OAAO,GAAmB,MAAM,CAAC;IACjC,UAAU,GAAkB,MAAM,CAAC,CAAC,uDAAuD;IACnG;qFACiF;IACzE,UAAU,CAAU;IACpB,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAAY,MAAmB;QAC7B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,GAAG,IAAI,aAAa,CAAC;YAC1B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,IAAI,EAAE;gBACJ,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB;SACF,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAe,EAAE,CAAW,EAAE,IAAkB,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QACrG,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;IACzB,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,qEAAqE;IACrE,KAAK,CAAC,OAAO,GAAG,IAAI;QAClB,KAAK,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,OAAe;QACvC,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;gBACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,IAAI,CAAC,GAAG,CACN,gBAAgB,IAAI,CAAC,MAAM,CAAC,OAAO,OAAO,IAAI,CAAC,GAAG,EAAE,cAAc,IAAI,CAAC,MAAM,CAAC,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAC/H,CAAC;YACJ,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,GAAG,CAAC,qBAAsB,CAAW,CAAC,OAAO,kBAAkB,OAAO,IAAI,CAAC,CAAC;gBACjF,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IAC5C,CAAC;IAED,6EAA6E;IAErE,MAAM,CAAC,CAAe,EAAE,QAAkB,EAAE,IAAkB;QACpE,+FAA+F;QAC/F,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5D,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI;YACP,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,+DAA+D,CAAC,CAAC;QAClG,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7D,4FAA4F;QAC5F,wFAAwF;QACxF,wFAAwF;QACxF,wFAAwF;QACxF,yFAAyF;QACzF,gDAAgD;QAChD,IAAI,IAAI,CAAC,UAAU,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3D,QAAQ,CAAC,GAAG,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,UAAU;gBAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7C,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YAClC,mEAAmE;YACnE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;gBAAE,CAAC,CAAC,GAAG,EAAE,CAAC;QAC/E,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED;;;gDAG4C;IACpC,WAAW,CAAC,CAAe,EAAE,IAAuB,EAAE,UAAmB;QAC/E,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK;aACjB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;aACjE,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE;YACjB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;YACrB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;YACrB,IAAI;YACJ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,OAAO,EAAE,CAAC,CAAC,SAAS;YACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,UAAU,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,KAAK;YACzE,UAAU;YACV,IAAI;YACJ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,SAAS,EAAE,CAAC,CAAC,SAAS;SACvB,CAAC;IACJ,CAAC;IAED,oGAAoG;IACpG,UAAU,CAAC,KAAc;QACvB,MAAM,CAAC,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QACtF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,KAAK,MAAM,CAAC,IAAI,KAAK;YAAE,CAAC,CAAC,GAAG,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,6EAA6E;IAC7E,SAAS;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED;;;0EAGsE;IACtE,oBAAoB;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;IACzF,CAAC;IAED;;;wFAGoF;IACpF,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;IAED,8EAA8E;IAE9E,6FAA6F;IAC7F,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;;;;qCAMiC;IACjC,KAAK,CAAC,YAAY,CAAC,IAAmB;QACpC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAED;;;;;;yCAMqC;IACrC,KAAK,CAAC,aAAa;QACjB,IAAI,IAAI,CAAC,UAAU,KAAK,OAAO,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;YAC9D,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAgB,EAAE,CAAC;QAC9B,MAAM,eAAe,GAAa,EAAE,CAAC;QACrC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC;YAC/C,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;gBAAE,SAAS;YAC1C,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACpF,KAAK,MAAM,CAAC,IAAI,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;YAC3E,IAAI,OAAO;gBAAE,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAClC,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;IACpC,CAAC;IAED,6EAA6E;IAE7E,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,OAAgB,EAAE,QAAmB;QAC5D,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,KAAK;YAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED;;;;;2DAKuD;IAC/C,mBAAmB,CAAC,QAAkB;QAC5C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACjF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,IAAI,OAAO,CAAC,MAAM;YAChB,MAAM,IAAI,KAAK,CACb,kBAAkB,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,sCAAsC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CACrJ,CAAC;IACN,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,IAAY;QACtC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,gGAAgG;IAChG,WAAW,CAAC,MAAc;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;QACxE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QACtD,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAC7D,OAAO,CACL,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CACpD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,EAAE,CAAC,MAAc,EAAE,IAAY;QACnC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,MAAM,eAAe,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QAClF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACtD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACvB,CAAC;IAED,6EAA6E;IAE7E;;uEAEmE;IACnE,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,IAAa;QACrC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAClF,CAAC;IAED;;6EAEyE;IACzE,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,IAA6B;QACvD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE;YACvC,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,IAAI,EAAE;SACjD,CAAC,CAAC;IACL,CAAC;IAED;uGACmG;IACnG,KAAK,CAAC,YAAY,CAAC,IAA+B;QAChD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE;YACvC,EAAE,EAAE,OAAO;YACX,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,IAAI,KAAK,EAAE;SAChD,CAAC,CAAC;IACL,CAAC;IAED;;gGAE4F;IAC5F,KAAK,CAAC,aAAa,CAAC,GAKnB;QACC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE;YACpD,EAAE,EAAE,eAAe;YACnB,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE;SAChF,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,EAAE;YAAE,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,mDAAmD,CAAC,CAAC;QACxG,OAAO,KAAK,CAAC;IACf,CAAC;IAED,6EAA6E;IAE7E,4CAA4C;IAC5C,MAAM;QACJ,OAAO,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;IAC7B,CAAC;IAED,8CAA8C;IAC9C,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAsB,EAAE,QAAiB;QACvD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,QAAQ,KAAK,SAAS;YAAE,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAChE,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,6EAA6E;IAE7E;;;;qFAIiF;IACjF,eAAe;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE;aAClB,cAAc,EAAE;aAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;aAChE,MAAM,CAAC,CAAC,CAAC,EAAiC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAC1D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QACpC,OAAO,qFAAqF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACjH,CAAC;IAED;oFACgF;IAChF,WAAW,CAAC,OAAe;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC9C,OAAO;YACL,WAAW,EAAE,GAAG,EAAE,WAAW;YAC7B,YAAY,EAAE,GAAG,EAAE,YAAY;YAC/B,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC;SACvC,CAAC;IACJ,CAAC;IAED,2EAA2E;IAC3E,cAAc;QACZ,OAAO,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC;IAClC,CAAC;IAED;;iEAE6D;IAC7D,KAAK,CAAC,YAAY;QAGhB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC;QACtC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChD,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,WAAW;YAClC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC;YACxC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;YACtD,QAAQ,EAAE,CAAC,CAAC,QAAQ;SACrB,CAAC,CAAC,CAAC;IACN,CAAC;IAED,kFAAkF;IAClF,KAAK,CAAC,WAAW,CAAC,OAAe;QAC/B,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,mEAAmE;IACnE,KAAK,CAAC,YAAY,CAAC,OAAe;QAChC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,6EAA6E;IAErE,GAAG;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IACzF,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,gCAAgC,IAAI,CAAC,MAAM,CAAC,OAAO,mCAAmC,CACvF,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,GAAG,CAAC,GAAW;QACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;IACrD,CAAC;CACF"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -20,13 +20,41 @@ export interface AgentConfig {
20
20
  role?: string;
21
21
  description?: string;
22
22
  tags?: string[];
23
+ /** Display-only metadata from unmodelled agent-file frontmatter keys (for example `face`).
24
+ * Connector-owned keys such as `connector` and `model` are overlaid later and cannot be spoofed here. */
25
+ meta?: Record<string, string>;
26
+ /** Control-plane capabilities this session declares (from the agent file's `capabilities:`); today
27
+ * only `spawn`. Used to gate the manager-op tools (cotal_spawn / cotal_persona) so the advertised
28
+ * surface matches what the agent can actually invoke. The cred layer is the real boundary (auth
29
+ * mode); open mode mints no creds, so the gate is permissive there. Same file the manager minted
30
+ * creds from, so the tool gate mirrors the wire grant exactly. */
31
+ capabilities?: string[];
23
32
  servers: string;
24
- /** Channels this agent subscribes to (read). May include wildcard subtrees (`team.>`). */
25
- channels: string[];
26
- /** Channels this agent may post to (write). Falls back to `channels` when unset, matching
27
- * the agent-file convention and the minted publish ACL. */
28
- publish: string[];
33
+ /** The *active* read set — channels this agent actually subscribes to (read). May include
34
+ * wildcard subtrees (`team.>`). Maps to the endpoint's live filter. ⊆ {@link allowSubscribe}. */
35
+ subscribe: string[];
36
+ /** The read ACL — channels this agent *may* read (auth mode broker-enforced). Defaults to
37
+ * {@link subscribe}. Bounds runtime `cotal_join`. */
38
+ allowSubscribe: string[];
39
+ /** The post ACL — channels this agent may post to (auth mode → the minted publish ACL).
40
+ * **Default-deny** (empty): publishing must be declared. Informational only here; the broker
41
+ * enforces it under auth. */
42
+ allowPublish: string[];
43
+ /** Per-channel attention DEFAULTS (operator, one-way from the agent file): channels to receive but
44
+ * never wake on ({@link quiet}) / to drop on receive ({@link muted}). Seeds {@link MeshAgent}'s
45
+ * runtime map; the runtime never writes them back. Concrete channels within {@link allowSubscribe}.
46
+ * Optional (absent ⇒ none), like the other discovery fields. */
47
+ quiet?: string[];
48
+ muted?: string[];
29
49
  kind: EndpointKind;
50
+ /** The host connector this session runs under (`claude` / `opencode` / `hermes`). Set by the
51
+ * connector itself, never from user config — it rides the {@link AgentCard.meta}.connector on
52
+ * the wire as display-only discovery metadata (which harness an agent uses). */
53
+ connector?: string;
54
+ /** Model the host runs this agent on (e.g. `claude-opus-4`), from the agent file's `model:` or
55
+ * `COTAL_MODEL`. Rides {@link AgentCard.meta}.model as display-only discovery metadata; omitted
56
+ * when the operator didn't pin one (the harness default isn't knowable from here). */
57
+ model?: string;
30
58
  token?: string;
31
59
  user?: string;
32
60
  pass?: string;
@@ -36,6 +64,11 @@ export interface AgentConfig {
36
64
  feedbackKey?: string;
37
65
  /** Optional intake URL override (`COTAL_FEEDBACK_URL`) for self-hosted intakes. */
38
66
  feedbackUrl?: string;
67
+ /** Durable-consumer `ack_wait` in ms (how long an un-acked chat message waits before JetStream
68
+ * redelivers). Threaded straight to the endpoint; defaults to its 60s when unset. INTERNAL/TEST-ONLY:
69
+ * deliberately NOT parsed from env by `configFromEnv` — a test shortens it to observe redelivery /
70
+ * ack-commit in seconds; normal launches should not tune durability from connector config. */
71
+ ackWaitMs?: number;
39
72
  }
40
73
  /** True iff the env carries a Cotal identity — i.e. this is a launcher-spawned
41
74
  * session, not an operator's plain `claude`. `COTAL_LINK` / `COTAL_AGENT_FILE`
@@ -51,8 +84,10 @@ export declare function hasIdentity(env?: NodeJS.ProcessEnv): boolean;
51
84
  export declare function configFromEnv(env?: NodeJS.ProcessEnv): AgentConfig;
52
85
  /** One sentence telling the agent its channel lanes — what it reads and where it may post —
53
86
  * so it knows its scope up front instead of discovering it from inbound tags and send errors.
54
- * Folded into each connector's MCP `instructions`. Publish outside the lane is rejected by the
55
- * broker (auth mode), so state it plainly. */
87
+ * Folded into each connector's MCP `instructions`. It must match the broker truth: under auth the
88
+ * post ACL is default-deny, so an undeclared agent genuinely cannot post (state it plainly rather
89
+ * than promise a lane the broker will reject). In open mode there is no cred, so posting is
90
+ * unrestricted regardless of the (display-only) post ACL. */
56
91
  export declare function laneLine(config: AgentConfig): string;
57
92
  /** Beta-feedback guidance folded into connector instructions. */
58
93
  export declare function feedbackLine(config: AgentConfig): string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAA+D,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEhH,0EAA0E;AAC1E,eAAO,MAAM,YAAY,wCAAwC,CAAC;AAClE,2EAA2E;AAC3E,eAAO,MAAM,mBAAmB,iCAAiC,CAAC;AAElE;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd;iEAC6D;IAC7D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,0FAA0F;IAC1F,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;gEAC4D;IAC5D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,OAAO,CAAC;IACb;+EAC2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAUD;;;uBAGuB;AACvB,wBAAgB,WAAW,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAEzE;AAED;;;;;uEAKuE;AACvE,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,WAAW,CA+B/E;AAED;;;+CAG+C;AAC/C,wBAAgB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAQpD;AAED,iEAAiE;AACjE,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAaxD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwI,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEzL,0EAA0E;AAC1E,eAAO,MAAM,YAAY,wCAAwC,CAAC;AAClE,2EAA2E;AAC3E,eAAO,MAAM,mBAAmB,iCAAiC,CAAC;AAElE;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd;iEAC6D;IAC7D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB;8GAC0G;IAC1G,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B;;;;uEAImE;IACnE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB;sGACkG;IAClG,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB;0DACsD;IACtD,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB;;kCAE8B;IAC9B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB;;;qEAGiE;IACjE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;IACnB;;qFAEiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;2FAEuF;IACvF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,OAAO,CAAC;IACb;+EAC2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;mGAG+F;IAC/F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD;;;uBAGuB;AACvB,wBAAgB,WAAW,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAEzE;AAED;;;;;uEAKuE;AACvE,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,WAAW,CAgE/E;AAED;;;;;8DAK8D;AAC9D,wBAAgB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAWpD;AAED,iEAAiE;AACjE,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAaxD"}