@cello-protocol/daemon 0.0.110 → 0.0.112

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/agent-handlers.d.ts.map +1 -1
  2. package/dist/agent-handlers.js +25 -1
  3. package/dist/agent-handlers.js.map +1 -1
  4. package/dist/co-attendance.d.ts +93 -0
  5. package/dist/co-attendance.d.ts.map +1 -0
  6. package/dist/co-attendance.js +140 -0
  7. package/dist/co-attendance.js.map +1 -0
  8. package/dist/contact-handlers.d.ts +3 -0
  9. package/dist/contact-handlers.d.ts.map +1 -1
  10. package/dist/contact-handlers.js +13 -4
  11. package/dist/contact-handlers.js.map +1 -1
  12. package/dist/daemon.d.ts.map +1 -1
  13. package/dist/daemon.js +29 -0
  14. package/dist/daemon.js.map +1 -1
  15. package/dist/inbound-seal-request.d.ts.map +1 -1
  16. package/dist/inbound-seal-request.js +29 -2
  17. package/dist/inbound-seal-request.js.map +1 -1
  18. package/dist/notification-dispatcher.d.ts.map +1 -1
  19. package/dist/notification-dispatcher.js +12 -0
  20. package/dist/notification-dispatcher.js.map +1 -1
  21. package/dist/notification-handlers.d.ts +3 -0
  22. package/dist/notification-handlers.d.ts.map +1 -1
  23. package/dist/notification-handlers.js +22 -2
  24. package/dist/notification-handlers.js.map +1 -1
  25. package/dist/resolve-named-agent.d.ts +49 -0
  26. package/dist/resolve-named-agent.d.ts.map +1 -0
  27. package/dist/resolve-named-agent.js +77 -0
  28. package/dist/resolve-named-agent.js.map +1 -0
  29. package/dist/seal-flows.d.ts +20 -2
  30. package/dist/seal-flows.d.ts.map +1 -1
  31. package/dist/seal-flows.js +43 -1
  32. package/dist/seal-flows.js.map +1 -1
  33. package/dist/session-content-handlers.d.ts +9 -0
  34. package/dist/session-content-handlers.d.ts.map +1 -1
  35. package/dist/session-content-handlers.js +98 -2
  36. package/dist/session-content-handlers.js.map +1 -1
  37. package/dist/types.d.ts +7 -0
  38. package/dist/types.d.ts.map +1 -1
  39. package/dist/types.js.map +1 -1
  40. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"notification-handlers.d.ts","sourceRoot":"","sources":["../src/notification-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAExF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,YAAY,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,CAAC;IAC9D,mBAAmB,EAAE,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACjG,YAAY,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9D,0BAA0B,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC;IACzD,sBAAsB,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,EAAE,CAAC,CAAC;CAC9D;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,uBAAuB,GAAG,IAAI,CAkFhF"}
1
+ {"version":3,"file":"notification-handlers.d.ts","sourceRoot":"","sources":["../src/notification-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAExF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,YAAY,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,CAAC;IAC9D,mBAAmB,EAAE,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACjG,YAAY,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9D,0GAA0G;IAC1G,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACjC,0BAA0B,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC;IACzD,sBAAsB,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,EAAE,CAAC,CAAC;CAC9D;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,uBAAuB,GAAG,IAAI,CAsGhF"}
@@ -1,5 +1,6 @@
1
+ import { resolveNamedAgent } from "./resolve-named-agent.js";
1
2
  export function registerNotificationHandlers(deps) {
2
- const { handlers, logger, sessionNodeManager, getConnState, resolveCurrentAgent, loadedAgents, reapExpiredInboundSessions, inboundSessionQueues, expiredSessionRequests, } = deps;
3
+ const { handlers, logger, sessionNodeManager, getConnState, resolveCurrentAgent, loadedAgents, agents: allAgents, reapExpiredInboundSessions, inboundSessionQueues, expiredSessionRequests, } = deps;
3
4
  // ─── M8C-INBOX-1 (N1/N4): cello_check_notifications — push-loss reconciler + poll-only inbox ───
4
5
  // Notifications are fire-and-forget (no ack, no redelivery); this is how a client discovers what
5
6
  // it missed while its shim was down/busy, and the primary inbox for poll-only clients (Bedrock,
@@ -9,13 +10,32 @@ export function registerNotificationHandlers(deps) {
9
10
  handlers.set("cello_check_notifications", async (params, connectionId) => {
10
11
  const connState = getConnState(connectionId);
11
12
  const scope = params?.scope === "all" ? "all" : "current";
13
+ // DOD-INBOX-AGENT-1 (debt — from M8C): an explicitly NAMED agent. Every sibling handler passes
14
+ // `params?.agent` into resolveCurrentAgent; this one never did, so the parameter was accepted,
15
+ // silently dropped, and the call answered for whatever agent the CONNECTION held — ok:true, wrong
16
+ // desk, no signal. That is the receptionist's shared-file collision one layer up, with an MCP
17
+ // socket standing in for `~/.cello/current-agent`: two skills in one Claude Code session share
18
+ // one socket, so a sibling's cello_use_agent re-points this caller mid-flight.
19
+ // The named-agent guard runs BEFORE the scope branch, not inside it (review MEDIUM). Inside, the
20
+ // same parameter was refused when empty and silently ignored when unknown, depending only on
21
+ // whether scope was 'current' or 'all' — accept-and-ignore is the exact shape this line removes,
22
+ // so it must not survive on one branch of it.
23
+ const named = resolveNamedAgent(params?.agent, allAgents);
24
+ if (!named.ok) {
25
+ logger.warn("inbox.agent.rejected", { connectionId, scope, reason: named.reason });
26
+ return named;
27
+ }
28
+ const explicitAgent = named.agent ?? undefined;
12
29
  let agentNames;
13
30
  if (scope === "all") {
31
+ // 'all' means every loaded agent, so a named agent is not applicable — narrowing it here would
32
+ // make scope:'all' silently mean scope:'current'. It is still VALIDATED above, so a caller who
33
+ // passes a bad name is told, rather than having it quietly discarded.
14
34
  agentNames = loadedAgents.map((a) => a.name);
15
35
  }
16
36
  else {
17
37
  // F18: an explicit current agent, else the sole-online agent; ambiguous → no_current_agent.
18
- const current = resolveCurrentAgent(connState);
38
+ const current = resolveCurrentAgent(connState, explicitAgent);
19
39
  if (!current) {
20
40
  return {
21
41
  ok: false,
@@ -1 +1 @@
1
- {"version":3,"file":"notification-handlers.js","sourceRoot":"","sources":["../src/notification-handlers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notification-handlers.js","sourceRoot":"","sources":["../src/notification-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * One guard for "the caller named an agent" — shared, so the third copy never gets written.
3
+ *
4
+ * DOD-INBOX-AGENT-1 closed a defect where `cello_check_notifications` accepted an `agent` parameter
5
+ * and silently dropped it, answering as whatever agent the CONNECTION held. Reviewing that fix found
6
+ * the same shape in three more places, including the one next door in `contact-handlers.ts`, where
7
+ * it is worse because that path WRITES: `cello_contact_add({ agent: "", pubkey })` fell through to
8
+ * the connection's selection and filed the contact under the wrong desk, and `{ agent: "carol" }`
9
+ * with no carol wrote a row keyed to an agent that does not exist. Both `ok: true`.
10
+ *
11
+ * The three ways a named agent goes wrong, and why each must REFUSE rather than fall back:
12
+ *
13
+ * 1. **A non-string** (`{ agent: 123 }`). MCP callers are shielded by zod; direct-IPC callers are
14
+ * not. §5a is explicit that unreachability is a property of today's call graph, not of the code.
15
+ * 2. **An empty string.** `""` is falsy but not nullish, so a bare truthiness test reads it as "no
16
+ * name given" and runs as the connection's selection — the exact misroute, reintroduced through
17
+ * the guard meant to prevent it. `{ agent: someUnsetVar }` produces it, and so does an
18
+ * unsubstituted `<exact name>` placeholder in a prompt.
19
+ * 3. **A name that is not here.** Falling back answers a question about carol with alice's data.
20
+ *
21
+ * And one that is NOT "not found": an agent whose identity FAILED TO LOAD exists. Saying "does not
22
+ * exist" sends the operator to `cello_agents`, which filters `load_failed` out — so they see nothing,
23
+ * confirm the wrong diagnosis, and never reach `cello_status`, which would have shown the real error.
24
+ * That is an exit-point label standing in for the cause.
25
+ */
26
+ export interface NamedAgentRefusal {
27
+ ok: false;
28
+ reason: "invalid_agent_value" | "missing_agent_value" | "agent_not_found" | "agent_load_failed";
29
+ guidance: string;
30
+ }
31
+ /** What the resolver needs to know about the agents on this machine. */
32
+ export interface KnownAgent {
33
+ name: string;
34
+ state?: string;
35
+ error?: string;
36
+ }
37
+ /**
38
+ * Validate an explicitly-named agent.
39
+ *
40
+ * Returns `{ ok: true, agent }` when the caller named a real agent, `{ ok: true, agent: null }` when
41
+ * the caller named NOTHING (so the caller should fall back to its own connection-scoped resolution),
42
+ * and a refusal otherwise. The three-way return is the point: "named nothing" and "named something
43
+ * unusable" are different, and collapsing them is the whole defect class.
44
+ */
45
+ export declare function resolveNamedAgent(rawAgent: unknown, known: ReadonlyArray<KnownAgent>): {
46
+ ok: true;
47
+ agent: string | null;
48
+ } | NamedAgentRefusal;
49
+ //# sourceMappingURL=resolve-named-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-named-agent.d.ts","sourceRoot":"","sources":["../src/resolve-named-agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAKH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,qBAAqB,GAAG,qBAAqB,GAAG,iBAAiB,GAAG,mBAAmB,CAAC;IAChG,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wEAAwE;AACxE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,OAAO,EACjB,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,GAC/B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,iBAAiB,CAwCxD"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * One guard for "the caller named an agent" — shared, so the third copy never gets written.
3
+ *
4
+ * DOD-INBOX-AGENT-1 closed a defect where `cello_check_notifications` accepted an `agent` parameter
5
+ * and silently dropped it, answering as whatever agent the CONNECTION held. Reviewing that fix found
6
+ * the same shape in three more places, including the one next door in `contact-handlers.ts`, where
7
+ * it is worse because that path WRITES: `cello_contact_add({ agent: "", pubkey })` fell through to
8
+ * the connection's selection and filed the contact under the wrong desk, and `{ agent: "carol" }`
9
+ * with no carol wrote a row keyed to an agent that does not exist. Both `ok: true`.
10
+ *
11
+ * The three ways a named agent goes wrong, and why each must REFUSE rather than fall back:
12
+ *
13
+ * 1. **A non-string** (`{ agent: 123 }`). MCP callers are shielded by zod; direct-IPC callers are
14
+ * not. §5a is explicit that unreachability is a property of today's call graph, not of the code.
15
+ * 2. **An empty string.** `""` is falsy but not nullish, so a bare truthiness test reads it as "no
16
+ * name given" and runs as the connection's selection — the exact misroute, reintroduced through
17
+ * the guard meant to prevent it. `{ agent: someUnsetVar }` produces it, and so does an
18
+ * unsubstituted `<exact name>` placeholder in a prompt.
19
+ * 3. **A name that is not here.** Falling back answers a question about carol with alice's data.
20
+ *
21
+ * And one that is NOT "not found": an agent whose identity FAILED TO LOAD exists. Saying "does not
22
+ * exist" sends the operator to `cello_agents`, which filters `load_failed` out — so they see nothing,
23
+ * confirm the wrong diagnosis, and never reach `cello_status`, which would have shown the real error.
24
+ * That is an exit-point label standing in for the cause.
25
+ */
26
+ /** Agent-name length cap, matching the moniker convention — the name is echoed back into guidance. */
27
+ const MAX_NAME_ECHO = 64;
28
+ /** Truncate a caller-supplied name before echoing it into an operator-facing string. */
29
+ function echoName(name) {
30
+ return name.length <= MAX_NAME_ECHO ? name : `${name.slice(0, MAX_NAME_ECHO)}…`;
31
+ }
32
+ /**
33
+ * Validate an explicitly-named agent.
34
+ *
35
+ * Returns `{ ok: true, agent }` when the caller named a real agent, `{ ok: true, agent: null }` when
36
+ * the caller named NOTHING (so the caller should fall back to its own connection-scoped resolution),
37
+ * and a refusal otherwise. The three-way return is the point: "named nothing" and "named something
38
+ * unusable" are different, and collapsing them is the whole defect class.
39
+ */
40
+ export function resolveNamedAgent(rawAgent, known) {
41
+ if (rawAgent === undefined || rawAgent === null)
42
+ return { ok: true, agent: null };
43
+ if (typeof rawAgent !== "string") {
44
+ return {
45
+ ok: false,
46
+ reason: "invalid_agent_value",
47
+ guidance: `The 'agent' parameter must be an agent name (a string), but got ${Array.isArray(rawAgent) ? "an array" : typeof rawAgent}. Nothing was read or written. Pass the name, or omit 'agent' to use this connection's current agent.`,
48
+ };
49
+ }
50
+ if (rawAgent.trim() === "") {
51
+ return {
52
+ ok: false,
53
+ reason: "missing_agent_value",
54
+ guidance: "The 'agent' parameter was empty (an unset variable, or an unsubstituted placeholder?). Nothing was read or written — an empty name is NOT treated as 'no agent given', because that would silently run as whichever agent this connection happens to hold. Name an agent, or omit 'agent' entirely.",
55
+ };
56
+ }
57
+ const match = known.find((a) => a.name === rawAgent);
58
+ if (!match) {
59
+ return {
60
+ ok: false,
61
+ reason: "agent_not_found",
62
+ guidance: `Agent '${echoName(rawAgent)}' does not exist on this machine, so nothing was read or written. Check the name with cello_agents, or omit 'agent' to use this connection's current agent.`,
63
+ };
64
+ }
65
+ // It EXISTS but its identity could not be loaded. Reported as itself: cello_agents hides
66
+ // load_failed agents, so "does not exist" would send the operator to the one surface that
67
+ // confirms the wrong answer. cello_status shows the state and the underlying error.
68
+ if (match.state === "load_failed") {
69
+ return {
70
+ ok: false,
71
+ reason: "agent_load_failed",
72
+ guidance: `Agent '${echoName(rawAgent)}' exists but its identity failed to load, so nothing was read or written${match.error ? ` (${match.error})` : ""}. Run cello_status to see the error — note cello_agents omits agents in this state, so it will look like the agent is missing.`,
73
+ };
74
+ }
75
+ return { ok: true, agent: rawAgent };
76
+ }
77
+ //# sourceMappingURL=resolve-named-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-named-agent.js","sourceRoot":"","sources":["../src/resolve-named-agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,sGAAsG;AACtG,MAAM,aAAa,GAAG,EAAE,CAAC;AAezB,wFAAwF;AACxF,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,GAAG,CAAC;AAClF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAiB,EACjB,KAAgC;IAEhC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAElF,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,qBAAqB;YAC7B,QAAQ,EAAE,mEAAmE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,QAAQ,uGAAuG;SAC3O,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3B,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,qBAAqB;YAC7B,QAAQ,EAAE,qSAAqS;SAChT,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,iBAAiB;YACzB,QAAQ,EAAE,UAAU,QAAQ,CAAC,QAAQ,CAAC,6JAA6J;SACpM,CAAC;IACJ,CAAC;IAED,yFAAyF;IACzF,0FAA0F;IAC1F,oFAAoF;IACpF,IAAI,KAAK,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;QAClC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,mBAAmB;YAC3B,QAAQ,EAAE,UAAU,QAAQ,CAAC,QAAQ,CAAC,2EAA2E,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,gIAAgI;SACxR,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AACvC,CAAC"}
@@ -2,15 +2,28 @@ import { SignalingManager } from "@cello-protocol/transport";
2
2
  import type { KeyProvider } from "@cello-protocol/crypto";
3
3
  import type { SessionNodeManager } from "./session-node-manager.js";
4
4
  import type { AgentInfo, Logger } from "./types.js";
5
+ /**
6
+ * DOD-FRONTIER-STRAND-1 AC2: a failure may carry the numbers that caused it. `reason` stays the
7
+ * machine-readable discriminator every caller already switches on; these are additive detail so an
8
+ * operator is told WHAT disagreed rather than being sent to a counterparty that may be this same
9
+ * daemon. All optional — a rejection from an older counterparty carries none of them.
10
+ */
11
+ export interface SealFailureDetail {
12
+ /** The counterparty's own refusal reason, distinct from OUR terminal `reason`. */
13
+ rejection_reason?: string;
14
+ your_leaf_count?: number;
15
+ their_leaf_count?: number;
16
+ diverging_leaf_index?: number;
17
+ }
5
18
  export type SealFlowResult = {
6
19
  ok: true;
7
20
  sessionId: string;
8
21
  status: "seal_interrupted_pending";
9
- } | {
22
+ } | ({
10
23
  ok: false;
11
24
  reason: string;
12
25
  guidance: string;
13
- };
26
+ } & SealFailureDetail);
14
27
  export type ActiveSealResult = {
15
28
  ok: true;
16
29
  sessionId: string;
@@ -41,6 +54,11 @@ export declare function createSealFlows(deps: SealFlowDeps): {
41
54
  } | {
42
55
  type: "seal_interrupted_rejection";
43
56
  reason: string;
57
+ frontier?: {
58
+ responder: number;
59
+ initiator: number;
60
+ diverging: number;
61
+ };
44
62
  } | {
45
63
  type: "timeout";
46
64
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"seal-flows.d.ts","sourceRoot":"","sources":["../src/seal-flows.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,MAAM,cAAc,GACtB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,0BAA0B,CAAA;CAAE,GACnE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,0BAA0B,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACpF;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,WAAW,GAAG,SAAS,CAAC;IAC/D,4EAA4E;IAC5E,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,gBAAgB,GAAG,SAAS,CAAC;IAClE,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5G;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY;8BAyCf,MAAM,OAAO,gBAAgB,GAAG,SAAS,KAAG,OAAO;cAJxE,sBAAsB;6BAAuB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;eAAS,MAAM,GAAG,IAAI;;cAC1F,4BAA4B;gBAAU,MAAM;;cAC5C,SAAS;MAE8E;2CAmCtF,MAAM,UACT,OAAO,YAAY,EAAE,aAAa,iBAC3B,MAAM,4BACK,MAAM,KAC/B,OAAO,CAAC,cAAc,CAAC;sCA4Nb,MAAM,UACT,OAAO,YAAY,EAAE,aAAa,iBAC3B,MAAM,KACpB,OAAO,CAAC,gBAAgB,CAAC;EA+K7B"}
1
+ {"version":3,"file":"seal-flows.d.ts","sourceRoot":"","sources":["../src/seal-flows.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,0BAA0B,CAAA;CAAE,GACnE,CAAC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,iBAAiB,CAAC,CAAC;AAE1E,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,0BAA0B,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACpF;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,WAAW,GAAG,SAAS,CAAC;IAC/D,4EAA4E;IAC5E,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,gBAAgB,GAAG,SAAS,CAAC;IAClE,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5G;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY;8BA6Cf,MAAM,OAAO,gBAAgB,GAAG,SAAS,KAAG,OAAO;cARxE,sBAAsB;6BAAuB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;eAAS,MAAM,GAAG,IAAI;;cAK1F,4BAA4B;gBAAU,MAAM;mBAAa;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE;;cACpH,SAAS;MAE8E;2CA4CtF,MAAM,UACT,OAAO,YAAY,EAAE,aAAa,iBAC3B,MAAM,4BACK,MAAM,KAC/B,OAAO,CAAC,cAAc,CAAC;sCA+Pb,MAAM,UACT,OAAO,YAAY,EAAE,aAAa,iBAC3B,MAAM,KACpB,OAAO,CAAC,gBAAgB,CAAC;EA+K7B"}
@@ -72,9 +72,18 @@ export function createSealFlows(deps) {
72
72
  });
73
73
  }
74
74
  else {
75
+ // Only treat the frontier detail as present when BOTH numbers are real. A half-populated
76
+ // frame must render as "no detail", never as a mismatch with one side invented.
77
+ const responder = frame["responder_leaf_count"];
78
+ const initiator = frame["initiator_leaf_count"];
79
+ const diverging = frame["diverging_leaf_index"];
80
+ const hasFrontier = typeof responder === "number" && typeof initiator === "number";
75
81
  resolve({
76
82
  type: "seal_interrupted_rejection",
77
83
  reason: typeof frame.reason === "string" ? frame.reason : "unknown",
84
+ ...(hasFrontier
85
+ ? { frontier: { responder, initiator, diverging: typeof diverging === "number" ? diverging : Math.min(responder, initiator) } }
86
+ : {}),
78
87
  });
79
88
  }
80
89
  });
@@ -185,12 +194,45 @@ export function createSealFlows(deps) {
185
194
  agentName: record.agent_name,
186
195
  reason: "seal_interrupted_rejected_by_counterparty",
187
196
  error: ackResult.reason,
197
+ ...(ackResult.frontier
198
+ ? {
199
+ responderLeafCount: ackResult.frontier.responder,
200
+ initiatorLeafCount: ackResult.frontier.initiator,
201
+ divergingLeafIndex: ackResult.frontier.diverging,
202
+ }
203
+ : {}),
188
204
  correlationId,
189
205
  });
206
+ // DOD-FRONTIER-STRAND-1 AC2: name the mismatch. The old text said "ask the counterparty to
207
+ // check their interrupted sessions on their end" — which, when both agents run on ONE daemon
208
+ // (the case that stranded session dbb93dfc… for a week), points at a machine that does not
209
+ // exist while withholding the two numbers that identify the problem.
210
+ if (ackResult.frontier) {
211
+ const { responder, initiator, diverging } = ackResult.frontier;
212
+ return {
213
+ ok: false,
214
+ reason: "seal_interrupted_rejected_by_counterparty",
215
+ rejection_reason: ackResult.reason,
216
+ your_leaf_count: initiator,
217
+ their_leaf_count: responder,
218
+ diverging_leaf_index: diverging,
219
+ guidance: `The two sides disagree on how many messages this session contains: you hold ${initiator}, ` +
220
+ `they hold ${responder}. They diverge at leaf ${diverging} — compare that message on both ` +
221
+ `transcripts with cello_transcript ${sessionId}. A leaf that only one side recorded cannot ` +
222
+ `be co-signed, so the session cannot seal until the records agree. If BOTH agents run on ` +
223
+ `this machine, read both sides here; there is no other end to check.`,
224
+ };
225
+ }
190
226
  return {
191
227
  ok: false,
192
228
  reason: "seal_interrupted_rejected_by_counterparty",
193
- guidance: "The counterparty rejected the seal-interrupted request. This may indicate their session state is inconsistent. Ask the counterparty to check their interrupted sessions via cello status on their end.",
229
+ rejection_reason: ackResult.reason,
230
+ // No detail on the wire (an older counterparty). Say that, rather than implying the reason
231
+ // is unknowable — the operator can still read both transcripts.
232
+ guidance: `The counterparty rejected the seal-interrupted request (${ackResult.reason}), and did not ` +
233
+ `report its own message count — it is running an older daemon. Compare the two transcripts ` +
234
+ `with cello_transcript ${sessionId}; a session strands when one side holds a leaf the other ` +
235
+ `never recorded.`,
194
236
  };
195
237
  }
196
238
  // ackResult.type === "seal_interrupted_ack"
@@ -1 +1 @@
1
- {"version":3,"file":"seal-flows.js","sourceRoot":"","sources":["../src/seal-flows.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seal-flows.js","sourceRoot":"","sources":["../src/seal-flows.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import type { SessionNodeManager } from "./session-node-manager.js";
4
4
  import type { RetryQueue } from "./retry-queue.js";
5
5
  import type { Logger } from "./types.js";
6
6
  import type { ConnState } from "./contact-handlers.js";
7
+ import type { ContentTakeLedger } from "./co-attendance.js";
7
8
  export interface SessionContentDeps {
8
9
  handlers: Map<string, IpcHandler>;
9
10
  logger: Logger;
@@ -20,6 +21,14 @@ export interface SessionContentDeps {
20
21
  safeCursorAdvance: (connectionId: string, sessionId: string, deliveredSeqs: ReadonlySet<number>) => void;
21
22
  /** M8C-TGDOOR-1: a read clears the doorbell's ring-once-until-read. */
22
23
  clearTelegramRung: (agentName: string, sessionId: string) => void;
24
+ /** DOD-COATTEND-VISIBLE-1: how many connections attend this agent right now (reporting only). */
25
+ attendanceCount: (agentName: string) => number;
26
+ /**
27
+ * DOD-COATTEND-VISIBLE-1: which connection consumed which leaf. Written here, at the one place
28
+ * the destructive drain happens, and read at the timeout to tell a robbed caller apart from a
29
+ * quiet counterparty. It does not change delivery — the drain stays `buf.shift()`.
30
+ */
31
+ contentTakes: ContentTakeLedger;
23
32
  }
24
33
  export declare function registerSessionContentHandlers(deps: SessionContentDeps): void;
25
34
  //# sourceMappingURL=session-content-handlers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-content-handlers.d.ts","sourceRoot":"","sources":["../src/session-content-handlers.ts"],"names":[],"mappings":"AAcA,OAAO,EAA2C,KAAK,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC9G,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,eAAe,EAAE,qBAAqB,CAAC;IACvC,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,CAAC;IAC9D,mBAAmB,EAAE,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACjG,yBAAyB,EAAE,OAAO,CAAC;IACnC,+EAA+E;IAC/E,mBAAmB,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IACzE,uBAAuB,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACxF,qEAAqE;IACrE,iBAAiB,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IACzG,uEAAuE;IACvE,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACnE;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CA8b7E"}
1
+ {"version":3,"file":"session-content-handlers.d.ts","sourceRoot":"","sources":["../src/session-content-handlers.ts"],"names":[],"mappings":"AAcA,OAAO,EAA2C,KAAK,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC9G,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,eAAe,EAAE,qBAAqB,CAAC;IACvC,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,CAAC;IAC9D,mBAAmB,EAAE,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACjG,yBAAyB,EAAE,OAAO,CAAC;IACnC,+EAA+E;IAC/E,mBAAmB,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IACzE,uBAAuB,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACxF,qEAAqE;IACrE,iBAAiB,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IACzG,uEAAuE;IACvE,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,iGAAiG;IACjG,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/C;;;;OAIG;IACH,YAAY,EAAE,iBAAiB,CAAC;CACjC;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAiiB7E"}
@@ -14,7 +14,7 @@ import { MAX_CONTENT_BYTES } from "@cello-protocol/protocol-types";
14
14
  import { TIER } from "./contacts-tier-migration.js";
15
15
  import { GATEWAY_UNAVAILABLE, GOVERNANCE_TIMEOUT } from "@cello-protocol/gateway";
16
16
  export function registerSessionContentHandlers(deps) {
17
- const { handlers, logger, sessionNodeManager, securityGateway, retryQueue, getConnState, resolveCurrentAgent, NO_CURRENT_AGENT_RESPONSE, getConnectionCursor, advanceConnectionCursor, safeCursorAdvance, clearTelegramRung, } = deps;
17
+ const { handlers, logger, sessionNodeManager, securityGateway, retryQueue, getConnState, resolveCurrentAgent, NO_CURRENT_AGENT_RESPONSE, getConnectionCursor, advanceConnectionCursor, safeCursorAdvance, clearTelegramRung, attendanceCount, contentTakes, } = deps;
18
18
  // ─── CELLO-M7-DAEMON-004: cello_send (live send + daemon-owned tree append) ──
19
19
  handlers.set("cello_send", async (params, connectionId) => {
20
20
  const connState = getConnState(connectionId);
@@ -374,6 +374,17 @@ export function registerSessionContentHandlers(deps) {
374
374
  ? rawTimeout
375
375
  : RECEIVE_DEFAULT_TIMEOUT_MS;
376
376
  const deadline = Date.now() + timeoutMs;
377
+ // DOD-COATTEND-VISIBLE-1 AC3: before this line the plain blocking receive wrote NOTHING to the
378
+ // log on ANY outcome — the only event in the path was `session.receive.since_seq`, which is the
379
+ // OTHER branch — so a session having its message taken by a sibling left no trace anywhere, for
380
+ // the operator in the moment or for anyone reading the log afterwards. One correlationId threads
381
+ // every exit below.
382
+ const receiveCorrelationId = randomUUID();
383
+ // Recomputed at EVERY exit, never snapshotted here (review MEDIUM): the loop below blocks for
384
+ // up to timeout_ms — 30 s by default — and sessions attach and detach inside that window. A
385
+ // count captured before the wait is stale exactly when it matters, and it is the number the
386
+ // operator reads and the number interpolated into the guidance. It is an O(connections) walk
387
+ // over a handful of entries; there is nothing to save by caching it.
377
388
  for (;;) {
378
389
  // 1) Deliverable content wins — drain one buffered message per call (FIFO).
379
390
  const entry = sessionNodeManager.takeReceivedContent(agentName, sessionId);
@@ -386,6 +397,14 @@ export function registerSessionContentHandlers(deps) {
386
397
  // was read — safeCursorAdvance refuses to vault past a gap (e.g. an unread sent leaf from
387
398
  // another local connection) even though this specific sequence number is now known.
388
399
  safeCursorAdvance(connectionId, sessionId, new Set([entry.sequenceNumber]));
400
+ // DOD-COATTEND-VISIBLE-1: this is the destructive drain — the message has just been REMOVED
401
+ // from every co-attending session's view. Record which connection took it, at the one place
402
+ // it happens, so a sibling that finds an empty buffer can be told why.
403
+ contentTakes.record(agentName, sessionId, connectionId, entry.sequenceNumber);
404
+ logger.info("session.receive.delivered", {
405
+ sessionId, agentName, connectionId, sequenceNumber: entry.sequenceNumber,
406
+ attendance: attendanceCount(agentName), correlationId: receiveCorrelationId,
407
+ });
389
408
  const contentText = Buffer.from(entry.contentHex, "hex").toString("utf8");
390
409
  const trimmed = contentText.trimEnd();
391
410
  const signalGuidance = trimmed.endsWith("[[WRAP]]")
@@ -410,6 +429,12 @@ export function registerSessionContentHandlers(deps) {
410
429
  const terminal = sessionNodeManager.peekTerminalMarker(agentName, sessionId);
411
430
  if (terminal) {
412
431
  const sealedRoot = sessionNodeManager.getSealedRootHex(agentName, sessionId);
432
+ // AC3 covers "both outcomes" — got something / got nothing. This is the third exit from the
433
+ // same silent handler, and leaving it silent would reproduce the defect one branch over.
434
+ logger.info("session.receive.sealed", {
435
+ sessionId, agentName, connectionId, attendance: attendanceCount(agentName),
436
+ unreadCount: terminal.unreadCount, correlationId: receiveCorrelationId,
437
+ });
413
438
  return {
414
439
  ok: true,
415
440
  type: "session_sealed",
@@ -424,10 +449,77 @@ export function registerSessionContentHandlers(deps) {
424
449
  // 3) Out of time — non-blocking-equivalent empty answer.
425
450
  const remaining = deadline - Date.now();
426
451
  if (remaining <= 0) {
452
+ const liveness = sessionNodeManager.getSessionLiveness(agentName, sessionId);
453
+ const attendance = attendanceCount(agentName);
454
+ // ─── DOD-COATTEND-VISIBLE-1 AC1: the loser of the race gets a DIFFERENT answer ───
455
+ //
456
+ // The buffer is keyed (agentName, sessionId) and drained with `buf.shift()`, so when the
457
+ // multicast doorbell wakes two attending sessions the faster one REMOVES the message. Until
458
+ // this branch existed the slower one was told, word for word, what a quiet counterparty
459
+ // produces — and nothing was logged either, so the theft left no trace anywhere.
460
+ //
461
+ // The bar is this connection's own read cursor, not a time window: it reports content this
462
+ // connection genuinely has not seen, and it CLEARS itself once the caller catches up. The
463
+ // discriminator is `reason` — the field this very return already uses for its other branch —
464
+ // so a caller switching on it needs no new shape. `taken_by_sibling` carries the machine-
465
+ // readable detail; the prose below is the presentation of that, never a substitute for it.
466
+ const missed = contentTakes.missedBy(agentName, sessionId, connectionId, getConnectionCursor(connectionId, sessionId));
467
+ if (missed) {
468
+ // The message a sibling took is described WITHOUT claiming that sibling still attends
469
+ // this agent (review MEDIUM). A connection may operate on the sole online agent through
470
+ // `resolveCurrentAgent` WITHOUT attending it, and it drains the same buffer — so a real
471
+ // thief need not be counted in `attendance`. The old wording produced sentences that
472
+ // contradicted themselves ("another session attending alice — 1 sessions are attending").
473
+ // `attendance` stays as its own field, meaning what it says: how many sessions SELECTED
474
+ // this agent.
475
+ const takenDetail = {
476
+ count: missed.count,
477
+ last_sequence: missed.lastSequence,
478
+ connections: missed.connections,
479
+ // `count` is a floor once the per-session cap has discarded older takes.
480
+ ...(missed.truncated ? { truncated: true } : {}),
481
+ };
482
+ logger.warn("session.receive.taken_by_sibling", {
483
+ sessionId, agentName, connectionId, timeoutMs, attendance, liveness,
484
+ takenCount: missed.count, lastTakenSeq: missed.lastSequence, takenBy: missed.connections,
485
+ truncated: missed.truncated, correlationId: receiveCorrelationId,
486
+ });
487
+ const missedText = `Another session on this daemon already received ${missed.count} message(s) on this session that you have not read (up to sequence ${missed.lastSequence}). Nothing was lost: read what you missed with cello_transcript ${sessionId}.`;
488
+ // BOTH conditions can be true, and `counterparty_gone` WINS the `reason` field when they
489
+ // are (review MEDIUM). `reason` is the machine-readable discriminator, and a caller
490
+ // switching on it must still see the TERMINAL, actionable condition: telling an operator
491
+ // to "read what you missed, then reply" to a counterparty whose connection is dead sends
492
+ // them to the wrong subsystem and the reply goes nowhere. The theft is additive
493
+ // information, so it rides as a field and as the first half of the guidance — nothing is
494
+ // hidden, but the answer names the condition that changes what the operator should DO.
495
+ if (liveness === "gone") {
496
+ return {
497
+ ok: true,
498
+ content: null,
499
+ reason: "counterparty_gone",
500
+ liveness: "gone",
501
+ taken_by_sibling: takenDetail,
502
+ attendance,
503
+ guidance: `${missedText} Note the counterparty's session connection has ALSO dropped (liveness: gone), so no more content will arrive and a reply cannot reach them — call cello_close_session to seal the session once you have read the history. If the counterparty never co-closes, a unilateral seal becomes available after the directory's delivery-grace window.`,
504
+ };
505
+ }
506
+ return {
507
+ ok: true,
508
+ content: null,
509
+ reason: "taken_by_sibling_session",
510
+ taken_by_sibling: takenDetail,
511
+ attendance,
512
+ guidance: `${missedText} Then reply — do not resend your last message.`,
513
+ };
514
+ }
427
515
  // M8B F16: a dead session must not return the SAME null timeout as a
428
516
  // quiet-but-healthy one. The liveness signal (session.liveness.changed → gone,
429
517
  // tracked per session by the node manager) finally reaches the MCP surface here.
430
- if (sessionNodeManager.getSessionLiveness(agentName, sessionId) === "gone") {
518
+ if (liveness === "gone") {
519
+ logger.info("session.receive.empty", {
520
+ sessionId, agentName, connectionId, timeoutMs, attendance,
521
+ liveness, correlationId: receiveCorrelationId,
522
+ });
431
523
  return {
432
524
  ok: true,
433
525
  content: null,
@@ -436,6 +528,10 @@ export function registerSessionContentHandlers(deps) {
436
528
  guidance: "The counterparty's session connection has dropped (liveness: gone) — it may have crashed or gone offline. No more content will arrive on the direct path. Call cello_close_session to seal the session; if the counterparty never co-closes, a unilateral seal becomes available after the directory's delivery-grace window.",
437
529
  };
438
530
  }
531
+ logger.info("session.receive.empty", {
532
+ sessionId, agentName, connectionId, timeoutMs, attendance,
533
+ liveness, correlationId: receiveCorrelationId,
534
+ });
439
535
  return { ok: true, content: null, guidance: "No content arrived within timeout_ms. Call cello_receive again to keep waiting — do not resend your last message. Or read cello_transcript for the full session history." };
440
536
  }
441
537
  await new Promise((r) => setTimeout(r, Math.min(20, remaining)));