@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.
- package/dist/agent-handlers.d.ts.map +1 -1
- package/dist/agent-handlers.js +25 -1
- package/dist/agent-handlers.js.map +1 -1
- package/dist/co-attendance.d.ts +93 -0
- package/dist/co-attendance.d.ts.map +1 -0
- package/dist/co-attendance.js +140 -0
- package/dist/co-attendance.js.map +1 -0
- package/dist/contact-handlers.d.ts +3 -0
- package/dist/contact-handlers.d.ts.map +1 -1
- package/dist/contact-handlers.js +13 -4
- package/dist/contact-handlers.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +29 -0
- package/dist/daemon.js.map +1 -1
- package/dist/inbound-seal-request.d.ts.map +1 -1
- package/dist/inbound-seal-request.js +29 -2
- package/dist/inbound-seal-request.js.map +1 -1
- package/dist/notification-dispatcher.d.ts.map +1 -1
- package/dist/notification-dispatcher.js +12 -0
- package/dist/notification-dispatcher.js.map +1 -1
- package/dist/notification-handlers.d.ts +3 -0
- package/dist/notification-handlers.d.ts.map +1 -1
- package/dist/notification-handlers.js +22 -2
- package/dist/notification-handlers.js.map +1 -1
- package/dist/resolve-named-agent.d.ts +49 -0
- package/dist/resolve-named-agent.d.ts.map +1 -0
- package/dist/resolve-named-agent.js +77 -0
- package/dist/resolve-named-agent.js.map +1 -0
- package/dist/seal-flows.d.ts +20 -2
- package/dist/seal-flows.d.ts.map +1 -1
- package/dist/seal-flows.js +43 -1
- package/dist/seal-flows.js.map +1 -1
- package/dist/session-content-handlers.d.ts +9 -0
- package/dist/session-content-handlers.d.ts.map +1 -1
- package/dist/session-content-handlers.js +98 -2
- package/dist/session-content-handlers.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- 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,
|
|
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":"
|
|
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"}
|
package/dist/seal-flows.d.ts
CHANGED
|
@@ -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
|
}>;
|
package/dist/seal-flows.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/seal-flows.js
CHANGED
|
@@ -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
|
-
|
|
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"
|
package/dist/seal-flows.js.map
CHANGED
|
@@ -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":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,8BAA8B,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAuC5F,MAAM,UAAU,eAAe,CAAC,IAAkB;IAChD,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAC5F,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,cAAc,EAAqD,CAAC;IAEhG,6CAA6C;IAC7C,EAAE;IACF,0FAA0F;IAC1F,EAAE;IACF,iGAAiG;IACjG,6FAA6F;IAC7F,4FAA4F;IAC5F,2EAA2E;IAC3E,EAAE;IACF,+EAA+E;IAC/E,kGAAkG;IAClG,6FAA6F;IAC7F,wFAAwF;IACxF,EAAE;IACF,uFAAuF;IACvF,+FAA+F;IAC/F,kGAAkG;IAClG,+FAA+F;IAC/F,iGAAiG;IACjG,yEAAyE;IACzE,EAAE;IACF,gGAAgG;IAChG,iGAAiG;IACjG,8DAA8D;IAE9D,yEAAyE;IACzE,qEAAqE;IACrE,gFAAgF;IAChF,gFAAgF;IAChF,iFAAiF;IACjF,6EAA6E;IAC7E,MAAM,2BAA2B,GAAG,MAAM,CAAC;IAU3C,SAAS,YAAY,CAAC,SAAiB,EAAE,GAAiC;QACxE,OAAO,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,EAAE;YAC5C,gGAAgG;YAChG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YACnD,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;gBACpC,UAAU,EAAE,CAAC;gBACb,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAC/B,CAAC,EAAE,2BAA2B,CAAC,CAAC;YAEhC,MAAM,UAAU,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,EAAE;gBACtD,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,IAAI,KAAK,CAAC,IAAI,KAAK,4BAA4B,EAAE,CAAC;oBACzF,OAAO;gBACT,CAAC;gBACD,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;oBAAE,OAAO;gBAEjF,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC5B,UAAU,EAAE,CAAC;gBAEb,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;oBAC1C,OAAO,CAAC;wBACN,IAAI,EAAE,sBAAsB;wBAC5B,mBAAmB,EAAG,KAAK,CAAC,mBAA+C,IAAI,EAAE;wBACjF,KAAK,EAAE,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;qBAC5D,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,yFAAyF;oBACzF,gFAAgF;oBAChF,MAAM,SAAS,GAAG,KAAK,CAAC,sBAAsB,CAAC,CAAC;oBAChD,MAAM,SAAS,GAAG,KAAK,CAAC,sBAAsB,CAAC,CAAC;oBAChD,MAAM,SAAS,GAAG,KAAK,CAAC,sBAAsB,CAAC,CAAC;oBAChD,MAAM,WAAW,GAAG,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,SAAS,KAAK,QAAQ,CAAC;oBACnF,OAAO,CAAC;wBACN,IAAI,EAAE,4BAA4B;wBAClC,MAAM,EAAE,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;wBACnE,GAAG,CAAC,WAAW;4BACb,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE;4BAC/H,CAAC,CAAC,EAAE,CAAC;qBACR,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,yBAAyB,CACtC,SAAiB,EACjB,MAA0C,EAC1C,aAAqB,EACrB,wBAAgC;QAEhC,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;QAE3B,sDAAsD;QACtD,sFAAsF;QACtF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,UAAU,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC;QACxC,MAAM,kBAAkB,GAAG,MAAM,CAAC,mBAAmB,CAAC;QAEtD,2EAA2E;QAC3E,4EAA4E;QAC5E,2EAA2E;QAC3E,4EAA4E;QAC5E,iEAAiE;QACjE,2EAA2E;QAC3E,sEAAsE;QACtE,4EAA4E;QAC5E,MAAM,YAAY,GAAG,kBAAkB,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACrF,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC3C,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC;QACpF,MAAM,aAAa,GAAG,UAAU;YAC9B,CAAC,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC;YACxE,CAAC,CAAC,wBAAwB,CAAC;QAE7B,2DAA2D;QAC3D,IAAI,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,cAAc,EAAE,CAAC;YAC/D,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;gBAC9C,SAAS;gBACT,SAAS,EAAE,MAAM,CAAC,UAAU;gBAC5B,MAAM,EAAE,wBAAwB;gBAChC,KAAK,EAAE,kCAAkC;gBACzC,aAAa;aACd,CAAC,CAAC;YACH,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,wBAAwB;gBAChC,QAAQ,EAAE,2NAA2N;aACtO,CAAC;QACJ,CAAC;QAED,gFAAgF;QAChF,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC1D,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;gBAC9C,SAAS;gBACT,SAAS,EAAE,MAAM,CAAC,UAAU;gBAC5B,MAAM,EAAE,yBAAyB;gBACjC,KAAK,EAAE,2BAA2B;gBAClC,aAAa;aACd,CAAC,CAAC;YACH,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,yBAAyB;gBACjC,QAAQ,EAAE,8JAA8J;aACzK,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,8BAA8B,CAAC,aAAa,EAAE;YAClE,SAAS;YACT,SAAS,EAAE,YAAY;YACvB,wBAAwB,EAAE,aAAa;YACvC,eAAe,EAAE,WAAW;SAC7B,CAAC,CAAC;QAEH,sDAAsD;QACtD,MAAM,OAAO,GAAG;YACd,IAAI,EAAE,0BAA0B;YAChC,SAAS;YACT,eAAe,EAAE,WAAW;YAC5B,kBAAkB;YAClB,uBAAuB,EAAE,YAAY;YACrC,wBAAwB,EAAE,aAAa;YACvC,KAAK;SACN,CAAC;QAEF,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9D,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;gBAC9C,SAAS;gBACT,SAAS,EAAE,MAAM,CAAC,UAAU;gBAC5B,MAAM,EAAE,2CAA2C;gBACnD,KAAK,EAAE,UAAU,CAAC,MAAM;gBACxB,aAAa;aACd,CAAC,CAAC;YACH,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,2CAA2C;gBACnD,QAAQ,EAAE,4KAA4K;aACvL,CAAC;QACJ,CAAC;QAED,gFAAgF;QAChF,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QAEjF,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;gBAC9C,SAAS;gBACT,SAAS,EAAE,MAAM,CAAC,UAAU;gBAC5B,MAAM,EAAE,2CAA2C;gBACnD,KAAK,EAAE,mCAAmC;gBAC1C,aAAa;aACd,CAAC,CAAC;YACH,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,2CAA2C;gBACnD,QAAQ,EAAE,4KAA4K;aACvL,CAAC;QACJ,CAAC;QAED,IAAI,SAAS,CAAC,IAAI,KAAK,4BAA4B,EAAE,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;gBAC9C,SAAS;gBACT,SAAS,EAAE,MAAM,CAAC,UAAU;gBAC5B,MAAM,EAAE,2CAA2C;gBACnD,KAAK,EAAE,SAAS,CAAC,MAAM;gBACvB,GAAG,CAAC,SAAS,CAAC,QAAQ;oBACpB,CAAC,CAAC;wBACA,kBAAkB,EAAE,SAAS,CAAC,QAAQ,CAAC,SAAS;wBAChD,kBAAkB,EAAE,SAAS,CAAC,QAAQ,CAAC,SAAS;wBAChD,kBAAkB,EAAE,SAAS,CAAC,QAAQ,CAAC,SAAS;qBACjD;oBACD,CAAC,CAAC,EAAE,CAAC;gBACP,aAAa;aACd,CAAC,CAAC;YACH,2FAA2F;YAC3F,6FAA6F;YAC7F,2FAA2F;YAC3F,qEAAqE;YACrE,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACvB,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC;gBAC/D,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,2CAA2C;oBACnD,gBAAgB,EAAE,SAAS,CAAC,MAAM;oBAClC,eAAe,EAAE,SAAS;oBAC1B,gBAAgB,EAAE,SAAS;oBAC3B,oBAAoB,EAAE,SAAS;oBAC/B,QAAQ,EACN,+EAA+E,SAAS,IAAI;wBAC5F,aAAa,SAAS,0BAA0B,SAAS,kCAAkC;wBAC3F,qCAAqC,SAAS,8CAA8C;wBAC5F,0FAA0F;wBAC1F,qEAAqE;iBACxE,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,2CAA2C;gBACnD,gBAAgB,EAAE,SAAS,CAAC,MAAM;gBAClC,2FAA2F;gBAC3F,gEAAgE;gBAChE,QAAQ,EACN,2DAA2D,SAAS,CAAC,MAAM,iBAAiB;oBAC5F,4FAA4F;oBAC5F,yBAAyB,SAAS,2DAA2D;oBAC7F,iBAAiB;aACpB,CAAC;QACJ,CAAC;QAED,4CAA4C;QAC5C,CAAC;YACC,MAAM,IAAI,GAAG,SAAS,CAAC,mBAAmB,CAAC;YAE3C,mEAAmE;YACnE,0EAA0E;YAC1E,2EAA2E;YAC3E,0EAA0E;YAC1E,wEAAwE;YACxE,kEAAkE;YAClE,MAAM,QAAQ,GAAG,0BAA0B,CAAC;gBAC1C,IAAI;gBACJ,SAAS,EAAE,KAAK;gBAChB,QAAQ,EAAE,SAAS,CAAC,KAAK;gBACzB,YAAY;gBACZ,0BAA0B,EAAE,MAAM,CAAC,mBAAmB;aACvD,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG;oBAChB,cAAc,EAAE,iCAAiC;oBACjD,mBAAmB,EAAE,sCAAsC;oBAC3D,sBAAsB,EAAE,yCAAyC;iBACzD,CAAC;gBACX,MAAM,WAAW,GAAG;oBAClB,cAAc,EAAE,+KAA+K;oBAC/L,mBAAmB,EAAE,0NAA0N;oBAC/O,sBAAsB,EAAE,iOAAiO;iBACjP,CAAC;gBACX,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;oBAC9C,SAAS;oBACT,SAAS,EAAE,MAAM,CAAC,UAAU;oBAC5B,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAClC,KAAK,EAAE,QAAQ,CAAC,KAAK;oBACrB,aAAa;iBACd,CAAC,CAAC;gBACH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACnG,CAAC;YAED,uEAAuE;YACvE,iEAAiE;YACjE,2EAA2E;YAC3E,qEAAqE;YACrE,uEAAuE;YACvE,gDAAgD;YAChD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,gCAAgC,CAAC;gBACnE,SAAS,EAAE,MAAM,CAAC,UAAU;gBAC5B,SAAS;gBACT,IAAI,EAAE,WAAW;gBACjB,OAAO;gBACP,gBAAgB,EAAE,IAAI;gBACtB,UAAU,EAAE,aAAa;gBACzB,KAAK;aACN,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;oBAC9C,SAAS;oBACT,SAAS,EAAE,MAAM,CAAC,UAAU;oBAC5B,MAAM,EAAE,iCAAiC;oBACzC,KAAK,EAAE,2DAA2D;oBAClE,aAAa;iBACd,CAAC,CAAC;gBACH,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,iCAAiC;oBACzC,QAAQ,EAAE,0KAA0K;iBACrL,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;gBACzC,SAAS;gBACT,SAAS,EAAE,MAAM,CAAC,UAAU;gBAC5B,SAAS,EAAE,YAAY;gBACvB,aAAa;aACd,CAAC,CAAC;YACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;QACrE,CAAC;IACH,CAAC;IAED,gFAAgF;IAChF,EAAE;IACF,8BAA8B;IAC9B,gFAAgF;IAChF,6DAA6D;IAC7D,uFAAuF;IACvF,sFAAsF;IACtF,wFAAwF;IACxF,mFAAmF;IACnF,uFAAuF;IACvF,kFAAkF;IAClF,mFAAmF;IACnF,iDAAiD;IACjD,4EAA4E;IAC5E,gFAAgF;IAChF,gFAAgF;IAChF,6EAA6E;IAC7E,+EAA+E;IAE/E,KAAK,UAAU,oBAAoB,CACjC,SAAiB,EACjB,MAA0C,EAC1C,aAAqB;QAErB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,UAAU,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC;QACxC,MAAM,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAE/C,yEAAyE;QACzE,IAAI,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,cAAc,EAAE,CAAC;YAC/D,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,wBAAwB;gBAChC,QAAQ,EAAE,gLAAgL;aAC3L,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE;gBAC3C,SAAS;gBACT,MAAM,EAAE,yBAAyB;gBACjC,YAAY,EAAE,gEAAgE;gBAC9E,aAAa;aACd,CAAC,CAAC;YACH,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,yBAAyB;gBACjC,QAAQ,EAAE,6JAA6J;aACxK,CAAC;QACJ,CAAC;QAED,+EAA+E;QAC/E,sEAAsE;QACtE,MAAM,UAAU,GAAG,kBAAkB,CAAC,qBAAqB,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAC1F,MAAM,SAAS,GAAG,kBAAkB,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;QACzF,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;QAE3B,yEAAyE;QACzE,8EAA8E;QAC9E,2EAA2E;QAC3E,uEAAuE;QACvE,2EAA2E;QAC3E,IAAI,OAA4B,CAAC;QACjC,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,8BAA8B,CAAC,EAAE,EAAE;gBACjD,SAAS;gBACT,SAAS;gBACT,wBAAwB,EAAE,UAAU;gBACpC,eAAe,EAAE,WAAW;aAC7B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE;gBAC3C,SAAS;gBACT,MAAM,EAAE,0BAA0B;gBAClC,YAAY,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;gBAC9D,aAAa;aACd,CAAC,CAAC;YACH,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,0BAA0B;gBAClC,QAAQ,EAAE,qHAAqH;aAChI,CAAC;QACJ,CAAC;QAED,6EAA6E;QAC7E,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE;YACpC,SAAS;YACT,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,WAAW;YACjB,aAAa;SACd,CAAC,CAAC;QAEH,8EAA8E;QAC9E,4EAA4E;QAC5E,oEAAoE;QACpE,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE;YACnD,IAAI,EAAE,0BAA0B;YAChC,SAAS;YACT,eAAe,EAAE,WAAW;YAC5B,kBAAkB,EAAE,MAAM,CAAC,mBAAmB;YAC9C,uBAAuB,EAAE,SAAS;YAClC,wBAAwB,EAAE,UAAU;YACpC,KAAK;SACN,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE;gBAC3C,SAAS;gBACT,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,YAAY,EAAE,UAAU,CAAC,MAAM;gBAC/B,aAAa;aACd,CAAC,CAAC;YACH,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,uBAAuB;gBACpD,QAAQ,EAAE,UAAU,IAAI,UAAU,IAAI,OAAO,UAAU,CAAC,QAAQ,KAAK,QAAQ;oBAC3E,CAAC,CAAC,UAAU,CAAC,QAAQ;oBACrB,CAAC,CAAC,gHAAgH;aACrH,CAAC;QACJ,CAAC;QAED,sEAAsE;QACtE,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QACjF,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,4BAA4B,EAAE,CAAC;YACpF,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,+BAA+B,CAAC;YAChH,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE;gBAC3C,SAAS;gBACT,MAAM;gBACN,YAAY,EAAE,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM;gBACvF,aAAa;aACd,CAAC,CAAC;YACH,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM;gBACN,QAAQ,EAAE,SAAS,CAAC,IAAI,KAAK,SAAS;oBACpC,CAAC,CAAC,gJAAgJ;oBAClJ,CAAC,CAAC,sIAAsI;aAC3I,CAAC;QACJ,CAAC;QAED,gFAAgF;QAChF,MAAM,QAAQ,GAAG,0BAA0B,CAAC;YAC1C,IAAI,EAAE,SAAS,CAAC,mBAAmB;YACnC,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,SAAS,CAAC,KAAK;YACzB,YAAY,EAAE,SAAS;YACvB,0BAA0B,EAAE,MAAM,CAAC,mBAAmB;SACvD,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE;gBAC3C,SAAS;gBACT,MAAM,EAAE,QAAQ,QAAQ,CAAC,MAAM,EAAE;gBACjC,YAAY,EAAE,QAAQ,CAAC,KAAK;gBAC5B,aAAa;aACd,CAAC,CAAC;YACH,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,QAAQ,QAAQ,CAAC,MAAM,EAAE;gBACjC,QAAQ,EAAE,gMAAgM;aAC3M,CAAC;QACJ,CAAC;QAED,yEAAyE;QACzE,mEAAmE;QACnE,sFAAsF;QACtF,2EAA2E;QAC3E,2DAA2D;QAC3D,MAAM,QAAQ,GAAG,kBAAkB,CAAC,gCAAgC,CAAC;YACnE,SAAS,EAAE,MAAM,CAAC,UAAU;YAC5B,SAAS;YACT,IAAI,EAAE,WAAW;YACjB,OAAO;YACP,gBAAgB,EAAE,SAAS,CAAC,mBAAmB;YAC/C,UAAU,EAAE,UAAU;YACtB,KAAK;SACN,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE;gBAC3C,SAAS;gBACT,MAAM,EAAE,qBAAqB;gBAC7B,YAAY,EAAE,mEAAmE;gBACjF,aAAa;aACd,CAAC,CAAC;YACH,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,qBAAqB;gBAC7B,QAAQ,EAAE,sJAAsJ;aACjK,CAAC;QACJ,CAAC;QAED,+EAA+E;QAC/E,8EAA8E;QAC9E,4EAA4E;QAC5E,iFAAiF;QACjF,MAAM,kBAAkB,CAAC,iBAAiB,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAEzE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,0BAA0B,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IAC1F,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,CAAC;AAC3E,CAAC"}
|
|
@@ -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;
|
|
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 (
|
|
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)));
|