@masons/agent-network 0.4.15 → 0.4.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAsB9D,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,UAAU,oBAAoB,CAAC,CAAC;IAC9B,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAAC;IACvD,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;IACpE,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;IACjE,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;CAC/D;AAED,UAAU,sBAAsB;IAC9B,EAAE,EAAE,OAAO,CAAC;CACb;AAED,UAAU,sBAAsB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,sBAAsB;IAC9B,YAAY,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC9C,QAAQ,CAAC,CAAC,GAAG,EAAE,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;CACzE;AAED,UAAU,qBAAqB,CAAC,CAAC,GAAG,OAAO;IACzC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAsDD,UAAU,qBAAqB,CAAC,CAAC,GAAG,OAAO;IACzC,YAAY,CAAC,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,WAAW,CAAC,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D;AAED,UAAU,yBAAyB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,YAAY,EAAE,mBAAmB,CAAC;IAClC,MAAM,EAAE,oBAAoB,CAAC,mBAAmB,CAAC,CAAC;IAClD,QAAQ,EAAE,sBAAsB,CAAC;IACjC,OAAO,EAAE,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;CACrD;AAkED,eAAO,MAAM,mBAAmB,EAAE,yBAkajC,CAAC"}
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAsB9D,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,UAAU,oBAAoB,CAAC,CAAC;IAC9B,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAAC;IACvD,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;IACpE,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;IACjE,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;CAC/D;AAED,UAAU,sBAAsB;IAC9B,EAAE,EAAE,OAAO,CAAC;CACb;AAED,UAAU,sBAAsB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,sBAAsB;IAC9B,YAAY,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC9C,QAAQ,CAAC,CAAC,GAAG,EAAE,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;CACzE;AAED,UAAU,qBAAqB,CAAC,CAAC,GAAG,OAAO;IACzC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAsDD,UAAU,qBAAqB,CAAC,CAAC,GAAG,OAAO;IACzC,YAAY,CAAC,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,WAAW,CAAC,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D;AAED,UAAU,yBAAyB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,YAAY,EAAE,mBAAmB,CAAC;IAClC,MAAM,EAAE,oBAAoB,CAAC,mBAAmB,CAAC,CAAC;IAClD,QAAQ,EAAE,sBAAsB,CAAC;IACjC,OAAO,EAAE,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;CACrD;AA+ND,eAAO,MAAM,mBAAmB,EAAE,yBAoNjC,CAAC"}
package/dist/channel.js CHANGED
@@ -3,26 +3,18 @@ import createDebug from "debug";
3
3
  import { clearConnectorClient, clearConversationManager, extractNetworkConfig, initConnectorClient, initConversationManager, initToolConfig, requirePluginRuntime, } from "./config.js";
4
4
  import { ConnectorClient } from "./connector-client.js";
5
5
  import { ConversationManager } from "./conversation-manager.js";
6
- import { clearOwnerSessions, isOwnerSession, markOwnerSession, removeOwnerSession, setCurrentTurnIsOwner, } from "./owner-session-state.js";
6
+ import { extractHandleFromAddress } from "./handle-utils.js";
7
+ import { clearOwnerState, isOwnerAddress, markOwnerAddress, setCurrentTurnIsOwner, } from "./owner-session-state.js";
7
8
  import { setCurrentTurnSender } from "./turn-context.js";
8
9
  import { checkForUpdate } from "./update-check.js";
9
10
  const dbg = createDebug("agent-network:channel");
10
11
  // --- Sender identity ---
11
- // Identity resolution uses session state (remoteAddress from SESSION_CREATED),
12
- // not per-message metadata. See the message_received handler for details.
13
- // See: docs/openclaw/research/session-identity-mapping.md §5
14
12
  /**
15
13
  * Extract a human-readable name from the sender's metadata.
16
14
  *
17
- * Resolution order (account-level identity first, then address):
15
+ * Resolution order:
18
16
  * 1. `metadata.visitor_name` — display name for Passport browser visitors
19
- * (resolved by Connector from user_info.displayName)
20
- * 2. `metadata.from` — MSTP address for agent-to-agent connections
21
- * (e.g. `mstps://preview.masons.ai/alice` → "alice")
22
- * 3. Fallback: "Unknown" for direct MSTP clients without metadata
23
- *
24
- * Design: Channel determines routing, Account determines identity.
25
- * See: interop-routing-system-design.md §3 "Channel vs Account".
17
+ * 2. `event.from` — extract handle from routable address
26
18
  */
27
19
  function deriveSenderName(event) {
28
20
  // Account-level identity: Passport visitor with resolved display name
@@ -30,14 +22,8 @@ function deriveSenderName(event) {
30
22
  if (visitorName && typeof visitorName === "string") {
31
23
  return visitorName;
32
24
  }
33
- // MSTP address: extract handle from agent address
34
- const from = event.metadata?.from;
35
- if (from && typeof from === "string") {
36
- const trimmed = from.replace(/\/+$/, "");
37
- const parts = trimmed.split("/");
38
- return parts[parts.length - 1] || from;
39
- }
40
- return "Unknown";
25
+ // Extract handle from `from` address
26
+ return extractHandleFromAddress(event.from);
41
27
  }
42
28
  /**
43
29
  * Extract the Connector host from a connectorUrl.
@@ -53,6 +39,140 @@ function extractConnectorHost(connectorUrl) {
53
39
  return connectorUrl.replace(/^wss?:\/\//, "").replace(/\/.*$/, "");
54
40
  }
55
41
  }
42
+ // --- Duplicate message protection for at-least-once delivery ---
43
+ // Short-window dedup: stored messages re-delivered on reconnect are
44
+ // suppressed if the same (from, content, sentAt) was seen within 60 seconds.
45
+ const DEDUP_WINDOW_MS = 60_000;
46
+ const recentMessages = new Map(); // key → timestamp
47
+ function isDuplicate(from, content, sentAt) {
48
+ if (!sentAt)
49
+ return false; // only dedup stored messages (have sentAt)
50
+ const key = `${from}\0${content}\0${sentAt}`;
51
+ const now = Date.now();
52
+ const seen = recentMessages.get(key);
53
+ if (seen && now - seen < DEDUP_WINDOW_MS) {
54
+ return true;
55
+ }
56
+ recentMessages.set(key, now);
57
+ // Lazy cleanup: remove expired entries when map grows large
58
+ if (recentMessages.size > 200) {
59
+ for (const [k, ts] of recentMessages) {
60
+ if (now - ts > DEDUP_WINDOW_MS)
61
+ recentMessages.delete(k);
62
+ }
63
+ }
64
+ return false;
65
+ }
66
+ // --- Message dispatch helpers ---
67
+ /**
68
+ * Handle an address-based MESSAGE_RECEIVED { from, content, metadata }.
69
+ * This is the primary path for the address-based protocol.
70
+ */
71
+ async function handleAddressedMessage(event, conversationManager, client, ctx) {
72
+ const fromAddress = event.from;
73
+ dbg("routing inbound message from=%s contentLength=%d", fromAddress, event.content.length);
74
+ // Duplicate protection for at-least-once re-delivery (stored messages).
75
+ if (isDuplicate(fromAddress, event.content, event.sentAt)) {
76
+ dbg("duplicate message suppressed from=%s sentAt=%s", fromAddress, event.sentAt);
77
+ return;
78
+ }
79
+ // Owner detection: first-message-sets, subsequent-inherits.
80
+ // Connector includes is_owner in metadata for Passport visitors.
81
+ if (event.metadata?.is_owner === true) {
82
+ markOwnerAddress(fromAddress);
83
+ }
84
+ setCurrentTurnIsOwner(isOwnerAddress(fromAddress));
85
+ // Resolve contact from address. Register inbound conversation if new.
86
+ const contact = deriveSenderName(event);
87
+ if (!conversationManager.getContactByAddress(fromAddress)) {
88
+ conversationManager.registerInbound(contact, fromAddress);
89
+ }
90
+ setCurrentTurnSender(conversationManager.getContactByAddress(fromAddress) ?? null);
91
+ // Runtime guard
92
+ let runtime;
93
+ try {
94
+ runtime = requirePluginRuntime();
95
+ }
96
+ catch {
97
+ dbg("plugin runtime not available, dropping message from=%s", fromAddress);
98
+ return;
99
+ }
100
+ if (!runtime.channel) {
101
+ dbg("channelRuntime not available, dropping message from=%s", fromAddress);
102
+ return;
103
+ }
104
+ // senderId for OpenClaw routing: use the routable address
105
+ const senderId = fromAddress;
106
+ const senderName = contact;
107
+ try {
108
+ const route = await runtime.channel.routing.resolveAgentRoute({
109
+ cfg: ctx.cfg,
110
+ channel: "agent-network",
111
+ accountId: ctx.accountId,
112
+ peer: { kind: "direct", id: senderId },
113
+ });
114
+ const msgCtx = runtime.channel.reply.finalizeInboundContext({
115
+ Body: event.content,
116
+ RawBody: event.content,
117
+ CommandBody: event.content,
118
+ From: senderId,
119
+ To: senderId,
120
+ SessionKey: route.sessionKey,
121
+ AccountId: ctx.accountId,
122
+ ChatType: "direct",
123
+ SenderName: senderName,
124
+ SenderId: senderId,
125
+ Timestamp: event.sentAt ? new Date(event.sentAt).getTime() : Date.now(),
126
+ Provider: "agent-network",
127
+ Surface: "agent-network",
128
+ MessageSid: `an:${extractHandleFromAddress(fromAddress)}:${randomUUID()}`,
129
+ CommandAuthorized: true,
130
+ OriginatingChannel: "agent-network",
131
+ OriginatingTo: senderId,
132
+ });
133
+ const storePath = runtime.channel.session.resolveStorePath(undefined, {
134
+ agentId: route.agentId,
135
+ });
136
+ const sessionKey = typeof msgCtx.SessionKey === "string"
137
+ ? msgCtx.SessionKey
138
+ : route.sessionKey;
139
+ await runtime.channel.session.recordInboundSession({
140
+ storePath,
141
+ sessionKey,
142
+ ctx: msgCtx,
143
+ });
144
+ // Typing: address-based
145
+ client.sendTyping(fromAddress, true);
146
+ try {
147
+ await runtime.channel.reply.dispatchReplyWithBufferedBlockDispatcher({
148
+ ctx: msgCtx,
149
+ cfg: ctx.cfg,
150
+ dispatcherOptions: {
151
+ deliver: async (payload) => {
152
+ const text = payload.text;
153
+ if (!text)
154
+ return;
155
+ if (!conversationManager.hasConversation(senderId)) {
156
+ dbg("deliver suppressed: conversation ended senderId=%s len=%d", senderId, text.length);
157
+ return;
158
+ }
159
+ const deliverResult = await conversationManager.send(senderId, text);
160
+ dbg("deliver reply senderId=%s status=%s contentLength=%d", senderId, deliverResult.status, text.length);
161
+ },
162
+ onError: (err) => {
163
+ console.error(`[agent-network:${ctx.accountId}] dispatch error:`, err);
164
+ },
165
+ },
166
+ });
167
+ }
168
+ finally {
169
+ client.sendTyping(fromAddress, false);
170
+ }
171
+ }
172
+ catch (err) {
173
+ console.error(`[agent-network:${ctx.accountId}] inbound dispatch failed from=${fromAddress}:`, err);
174
+ }
175
+ }
56
176
  const accounts = new Map();
57
177
  // --- Channel Plugin ---
58
178
  export const agentNetworkChannel = {
@@ -112,8 +232,8 @@ export const agentNetworkChannel = {
112
232
  outbound: {
113
233
  deliveryMode: "direct",
114
234
  async sendText(ctx) {
115
- // ctx.recipient is the MSTP address or sessionId fallback (senderId from inbound dispatch).
116
- // ConversationManager.send() handles session management transparently.
235
+ // ctx.recipient is the routable address (senderId from inbound dispatch).
236
+ // ConversationManager.send() handles address resolution transparently.
117
237
  const state = accounts.get(ctx.accountId);
118
238
  if (!state)
119
239
  return { ok: false };
@@ -125,6 +245,12 @@ export const agentNetworkChannel = {
125
245
  gateway: {
126
246
  async startAccount(ctx) {
127
247
  dbg("starting account %s", ctx.accountId);
248
+ // Defensive: clear stale singletons from a previous cycle.
249
+ // The abort handler intentionally leaves them alive for in-flight tool
250
+ // calls (#935). Clean up here at cycle start so initConnectorClient()
251
+ // doesn't throw its double-init guard.
252
+ clearConversationManager();
253
+ clearConnectorClient();
128
254
  const { connectorUrl, token } = ctx.account;
129
255
  const client = new ConnectorClient(connectorUrl, token);
130
256
  const connectorHost = extractConnectorHost(connectorUrl);
@@ -145,182 +271,21 @@ export const agentNetworkChannel = {
145
271
  // Acceptable for unstructured text conversation (Phase 1). If MSTP adds
146
272
  // structured multi-step interactions, add a per-session dispatch queue.
147
273
  client.on("message_received", async (event) => {
148
- dbg("routing inbound message sessionId=%s contentLength=%d", event.sessionId, event.content.length);
149
- // --- Per-turn context (#836, #873) ---
150
- // Set BEFORE dispatch so before_prompt_build can read these synchronously.
151
- setCurrentTurnIsOwner(isOwnerSession(event.sessionId));
152
- // Sender identity: resolve sessionId → contact handle using
153
- // the closure-scoped conversationManager (NOT imported from config.ts).
154
- setCurrentTurnSender(conversationManager.getContactBySessionId(event.sessionId) ?? null);
155
- // --- Runtime guard ---
156
- let runtime;
157
- try {
158
- runtime = requirePluginRuntime();
159
- }
160
- catch {
161
- dbg("plugin runtime not available, dropping message sessionId=%s", event.sessionId);
162
- return;
163
- }
164
- // channel is required in our PluginRuntime type but may be absent
165
- // at runtime on older OpenClaw versions (pre-2026.2.19).
166
- if (!runtime.channel) {
167
- dbg("channelRuntime not available, dropping message sessionId=%s", event.sessionId);
168
- return;
169
- }
170
- // Resolve sender identity via ConversationManager.
171
- // The session_created handler registered the inbound session with
172
- // the ConversationManager, so we can look up the contact handle.
173
- const senderAddress = conversationManager.getAddressBySessionId(event.sessionId);
174
- // Determine if the address is a real MSTP address or a sessionId fallback.
175
- const isRealAddress = typeof senderAddress === "string" &&
176
- (senderAddress.startsWith("mstps://") ||
177
- senderAddress.startsWith("mstp://"));
178
- // senderId for OpenClaw routing: use MSTP address if available,
179
- // fall back to sessionId for unknown sessions / direct MSTP clients.
180
- const senderId = isRealAddress ? senderAddress : event.sessionId;
181
- // Derive sender name.
182
- // - MSTP agents: extract handle from address.
183
- // - Passport visitors / direct clients: use the contact name stored
184
- // in ConversationManager at session_created time (which read
185
- // visitor_name from session metadata). Per-message metadata does
186
- // NOT carry session-level fields like visitor_name, so we must
187
- // use the stored value. Falls back to deriveSenderName → "Unknown".
188
- const senderName = isRealAddress
189
- ? deriveSenderName({
190
- ...event,
191
- metadata: { ...event.metadata, from: senderAddress },
192
- })
193
- : (conversationManager.getContactBySessionId(event.sessionId) ??
194
- deriveSenderName(event));
195
- try {
196
- // Step 1 — Resolve agent route (await defensively — may be sync or async)
197
- const route = await runtime.channel.routing.resolveAgentRoute({
198
- cfg: ctx.cfg,
199
- channel: "agent-network",
200
- accountId: ctx.accountId,
201
- peer: { kind: "direct", id: senderId },
202
- });
203
- // Step 2 — Finalize inbound context (builds MsgContext for LLM pipeline)
204
- const msgCtx = runtime.channel.reply.finalizeInboundContext({
205
- Body: event.content,
206
- RawBody: event.content,
207
- CommandBody: event.content,
208
- From: senderId,
209
- To: senderId,
210
- SessionKey: route.sessionKey,
211
- AccountId: ctx.accountId,
212
- ChatType: "direct",
213
- SenderName: senderName,
214
- SenderId: senderId,
215
- Timestamp: Date.now(),
216
- Provider: "agent-network",
217
- Surface: "agent-network",
218
- MessageSid: `mstp:${event.sessionId}:${randomUUID()}`,
219
- CommandAuthorized: true,
220
- OriginatingChannel: "agent-network",
221
- OriginatingTo: senderId,
222
- });
223
- // Step 3 — Record inbound session
224
- const storePath = runtime.channel.session.resolveStorePath(undefined, { agentId: route.agentId });
225
- const sessionKey = typeof msgCtx.SessionKey === "string"
226
- ? msgCtx.SessionKey
227
- : route.sessionKey;
228
- await runtime.channel.session.recordInboundSession({
229
- storePath,
230
- sessionKey,
231
- ctx: msgCtx,
232
- });
233
- // Step 4 — Dispatch to LLM pipeline + deliver reply via callback
234
- // Signal typing start — agent is composing a reply.
235
- // Wrapped in try/finally so typing stop fires even on dispatch error.
236
- // Without this, a failed dispatch leaves a stale "typing..." for 30s.
237
- client.sendTypingStart(event.sessionId);
238
- try {
239
- await runtime.channel.reply.dispatchReplyWithBufferedBlockDispatcher({
240
- ctx: msgCtx,
241
- cfg: ctx.cfg,
242
- dispatcherOptions: {
243
- deliver: async (payload) => {
244
- const text = payload.text;
245
- if (!text)
246
- return;
247
- // Guard: if conversation was ended during this dispatch
248
- // (LLM called masons_end_conversation mid-turn), suppress
249
- // straggler text to prevent auto-creating a new session.
250
- // endConversation() deletes the conversation entry — its
251
- // absence is the signal. Normal inbound replies always
252
- // have an entry (registerInbound creates it before dispatch).
253
- if (!conversationManager.hasConversation(senderId)) {
254
- dbg("deliver suppressed: conversation ended senderId=%s len=%d", senderId, text.length);
255
- return;
256
- }
257
- const deliverResult = await conversationManager.send(senderId, text);
258
- dbg("deliver reply senderId=%s status=%s contentLength=%d", senderId, deliverResult.status, text.length);
259
- },
260
- onError: (err) => {
261
- console.error(`[agent-network:${ctx.accountId}] dispatch error:`, err);
262
- },
263
- },
264
- });
265
- }
266
- finally {
267
- // Signal typing stop — dispatch complete (explicit stop, layer 1).
268
- // Also implicitly cleared by Connector on SEND_MESSAGE (layer 2).
269
- client.sendTypingStop(event.sessionId);
270
- }
271
- }
272
- catch (err) {
273
- console.error(`[agent-network:${ctx.accountId}] inbound dispatch failed sessionId=${event.sessionId}:`, err);
274
- }
274
+ if (!("from" in event))
275
+ return; // address-based only
276
+ await handleAddressedMessage(event, conversationManager, client, ctx);
275
277
  });
276
- // --- Inbound session registration ---
277
- // When a remote agent creates a session (direction=inbound),
278
- // register it with the ConversationManager.
279
- client.on("session_created", (event) => {
280
- dbg("session created sessionId=%s direction=%s", event.sessionId, event.direction);
281
- if (event.direction === "inbound") {
282
- // --- Owner identity binding (#836) ---
283
- // Connector sets `is_owner: true` when visitor_user_id === agent.userId.
284
- // Track this session so message_received can set the per-turn flag.
285
- if (event.metadata?.is_owner === true) {
286
- markOwnerSession(event.sessionId);
287
- dbg("owner session detected sessionId=%s", event.sessionId);
288
- }
289
- const from = event.metadata?.from;
290
- const remoteAddress = typeof from === "string" && from.length > 0 ? from : null;
291
- if (remoteAddress) {
292
- const contact = deriveSenderName(event);
293
- conversationManager.registerInbound(event.sessionId, contact, remoteAddress);
294
- }
295
- else {
296
- // No MSTP address — Passport visitor or direct MSTP client.
297
- // Use visitor_name from session metadata (account-level identity
298
- // resolved by Connector) if available, else sessionId fallback.
299
- const contact = deriveSenderName(event);
300
- conversationManager.registerInbound(event.sessionId, contact, event.sessionId);
301
- }
302
- }
303
- // Outbound sessions are handled by SessionLifecycle internally
304
- // (matched by requestId in the createSession flow).
278
+ // --- Delivery ACK ---
279
+ // ACK immediately on DELIVERY_PENDING tells Connector it's safe
280
+ // to delete delivered stored messages.
281
+ client.on("delivery_pending", (event) => {
282
+ client.ackDelivery(event.upTo);
283
+ dbg("delivery_pending → ACK sent count=%d upTo=%s", event.count, event.upTo);
305
284
  });
306
- // --- Mailbox delivery ACK ---
307
- // "received" semanticsACK immediately on FLUSH_COMPLETE,
308
- // don't wait for LLM processing. This tells Connector it's safe
309
- // to delete the flushed entries from MongoDB.
310
- client.on("flush_complete", (event) => {
311
- client.sendDeliveryAck(event.mailboxSessionId);
312
- dbg("flush_complete → ACK sent mailboxSessionId=%s", event.mailboxSessionId);
313
- });
314
- // --- Session ended + disconnect ---
315
- // SessionLifecycle handles session state transitions (session_ended, disconnected)
316
- // via its own event subscriptions. No CM calls needed here.
317
- // Owner session cleanup (#836): remove from ownerSessionIds on session_ended.
318
- client.on("session_ended", (event) => {
319
- removeOwnerSession(event.sessionId);
320
- });
321
- // On disconnect, all sessions are invalid — clear owner state.
285
+ // --- Disconnect ---
286
+ // On disconnect, all owner addresses are invalid clear owner state.
322
287
  client.on("disconnected", () => {
323
- clearOwnerSessions();
288
+ clearOwnerState();
324
289
  });
325
290
  // --- Error handling ---
326
291
  // Must register before connect() — unhandled "error" events crash the process.
@@ -328,9 +293,13 @@ export const agentNetworkChannel = {
328
293
  console.error(`[agent-network:${ctx.accountId}]`, err.message);
329
294
  });
330
295
  // --- Abort signal ---
296
+ // Do NOT clear ConversationManager or ConnectorClient here.
297
+ // In-flight LLM dispatches may still be running — tools that call
298
+ // requireConversationManager() would throw "Not connected" and trigger
299
+ // LLM confidence collapse (#935). Instead, let the stale CM survive:
300
+ // the disconnected WebSocket causes tools to graceful-fail ("Failed to
301
+ // send message") rather than throw. stopAccount() handles final cleanup.
331
302
  ctx.abortSignal.addEventListener("abort", () => {
332
- clearConversationManager();
333
- clearConnectorClient(); // idempotent — stopAccount() may also call
334
303
  client.disconnect();
335
304
  }, { once: true });
336
305
  // --- Inject config for LLM tools ---
package/dist/config.d.ts CHANGED
@@ -51,8 +51,8 @@ export declare function initConnectorClient(client: ConnectorClient): void;
51
51
  /**
52
52
  * Clear the stored ConnectorClient reference.
53
53
  *
54
- * Called by `stopAccount()` before disconnecting prevents tools from
55
- * operating on a disconnected client.
54
+ * Called by `stopAccount()` and at `startAccount()` entry (defensive).
55
+ * NOT called by the abort handler — see #935.
56
56
  */
57
57
  export declare function clearConnectorClient(): void;
58
58
  /**
@@ -65,8 +65,9 @@ export declare function initConversationManager(manager: ConversationManager): v
65
65
  /**
66
66
  * Clear the stored ConversationManager reference.
67
67
  *
68
- * Called by `stopAccount()` before disconnecting prevents tools from
69
- * operating on a stale manager.
68
+ * Called by `stopAccount()` and at `startAccount()` entry (defensive).
69
+ * NOT called by the abort handler — in-flight tools need the stale CM
70
+ * to graceful-fail via disconnected WebSocket instead of throwing (#935).
70
71
  */
71
72
  export declare function clearConversationManager(): void;
72
73
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,sBAAsB,CAAC;AAuB9B;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAcD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAMhC;AAMD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAwBjE;AAMD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAOjE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAMD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAE1E;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,mBAAmB,CAOhE;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,mBAAmB,GAAG,IAAI,CAEnE;AAMD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAExD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAO9C;AAMD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,IAAI,oBAAoB,CAE5D;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAKtC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAEhD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,eAAe,CAOxD;AAMD,+EAA+E;AAC/E,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAgDD,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,kBAAkB,EACzB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMrE;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CASvD;AAMD;;;;;GAKG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAOvD;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAOzD;AAMD,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,6DAA6D;IAC7D,cAAc,EAAE,OAAO,CAAC;IACxB,wDAAwD;IACxD,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,4EAA4E;IAC5E,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,YAAY,CAAC,CA2BhE;AAMD,uDAAuD;AACvD,wBAAgB,gBAAgB,IAAI,IAAI,CASvC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/config.js CHANGED
@@ -117,8 +117,8 @@ export function initConnectorClient(client) {
117
117
  /**
118
118
  * Clear the stored ConnectorClient reference.
119
119
  *
120
- * Called by `stopAccount()` before disconnecting prevents tools from
121
- * operating on a disconnected client.
120
+ * Called by `stopAccount()` and at `startAccount()` entry (defensive).
121
+ * NOT called by the abort handler — see #935.
122
122
  */
123
123
  export function clearConnectorClient() {
124
124
  storedConnectorClient = null;
@@ -138,8 +138,9 @@ export function initConversationManager(manager) {
138
138
  /**
139
139
  * Clear the stored ConversationManager reference.
140
140
  *
141
- * Called by `stopAccount()` before disconnecting prevents tools from
142
- * operating on a stale manager.
141
+ * Called by `stopAccount()` and at `startAccount()` entry (defensive).
142
+ * NOT called by the abort handler — in-flight tools need the stale CM
143
+ * to graceful-fail via disconnected WebSocket instead of throwing (#935).
143
144
  */
144
145
  export function clearConversationManager() {
145
146
  storedConversationManager = null;
@@ -1,11 +1,19 @@
1
1
  import { EventEmitter } from "node:events";
2
- import { type FlushCompleteEvent, type MessageReceivedEvent, type SessionCreatedEvent, type SessionEndedEvent } from "./types.js";
2
+ import { type AddressedMessageEvent, type DeliveryPendingEvent, type SendAckEvent, type StructuredErrorEvent } from "./types.js";
3
+ /**
4
+ * Error with machine-readable `code` from Connector structured errors.
5
+ * Thrown by `send()` when the Connector responds with ERROR { code }.
6
+ */
7
+ export declare class ConnectorError extends Error {
8
+ readonly code: string;
9
+ readonly to?: string;
10
+ constructor(message: string, code: string, to?: string);
11
+ }
3
12
  type ConnectorClientEvents = {
4
- session_created: (event: SessionCreatedEvent) => void;
5
- message_received: (event: MessageReceivedEvent) => void;
6
- session_ended: (event: SessionEndedEvent) => void;
7
- flush_complete: (event: FlushCompleteEvent) => void;
8
- session_error: (sessionId: string, message: string) => void;
13
+ message_received: (event: AddressedMessageEvent) => void;
14
+ send_ack: (event: SendAckEvent) => void;
15
+ delivery_pending: (event: DeliveryPendingEvent) => void;
16
+ structured_error: (event: StructuredErrorEvent) => void;
9
17
  error: (error: Error) => void;
10
18
  connected: () => void;
11
19
  disconnected: () => void;
@@ -21,24 +29,27 @@ export declare class ConnectorClient extends EventEmitter {
21
29
  private registerResolve;
22
30
  private registerReject;
23
31
  private registerTimer;
32
+ /** Pending SEND_ACK correlation map for address-based sends. */
33
+ private pendingSends;
24
34
  constructor(url: string, token: string);
25
35
  connect(): Promise<void>;
26
36
  disconnect(): void;
27
- createSession(target: string, opts?: {
28
- secret?: string;
29
- metadata?: Record<string, unknown>;
30
- }): {
31
- requestId: string;
32
- sent: boolean;
33
- };
34
- sendMessage(sessionId: string, content: string, opts?: {
35
- contentType?: string;
36
- metadata?: Record<string, unknown>;
37
- }): boolean;
38
- endSession(sessionId: string, reason?: string): boolean;
39
- sendDeliveryAck(mailboxSessionId: string): boolean;
40
- sendTypingStart(sessionId: string): boolean;
41
- sendTypingStop(sessionId: string): boolean;
37
+ /**
38
+ * Send a message to a routable address. Returns a Promise that resolves
39
+ * with the SEND_ACK from the Connector, or rejects with a ConnectorError
40
+ * (structured error code) or a plain Error (timeout / disconnect).
41
+ *
42
+ * The messageId is generated internally and used for ACK correlation.
43
+ */
44
+ send(to: string, content: string, contentType?: string, metadata?: Record<string, unknown>): Promise<SendAckEvent>;
45
+ /**
46
+ * Send a typing indicator to a routable address.
47
+ */
48
+ sendTyping(to: string, isTyping: boolean): boolean;
49
+ /**
50
+ * Acknowledge delivery of stored messages up to a timestamp.
51
+ */
52
+ ackDelivery(upTo: string): boolean;
42
53
  on<K extends keyof ConnectorClientEvents>(event: K, listener: ConnectorClientEvents[K]): this;
43
54
  on(event: string | symbol, listener: (...args: unknown[]) => void): this;
44
55
  once<K extends keyof ConnectorClientEvents>(event: K, listener: ConnectorClientEvents[K]): this;
@@ -53,9 +64,19 @@ export declare class ConnectorClient extends EventEmitter {
53
64
  private resolveRegister;
54
65
  private rejectRegister;
55
66
  private handleMessage;
67
+ /** Dispatch inbound address-based events. */
68
+ private dispatchAddressed;
56
69
  private handleRegisterAck;
57
- private handleSessionCreated;
58
- private handleErrorEvent;
70
+ /**
71
+ * Resolve the pending send promise matching this SEND_ACK.
72
+ * Also emits `send_ack` for listeners that want to observe all ACKs.
73
+ */
74
+ private handleSendAck;
75
+ /**
76
+ * Structured ERROR: message-scoped errors reject pending sends,
77
+ * connection-scoped errors emit generic event.
78
+ */
79
+ private handleStructuredError;
59
80
  private handleClose;
60
81
  private handleError;
61
82
  private scheduleReconnect;
@@ -63,7 +84,8 @@ export declare class ConnectorClient extends EventEmitter {
63
84
  private nextExponentialBackoff;
64
85
  private clearReconnectTimer;
65
86
  private cleanupConnection;
66
- private send;
87
+ /** Send an event over the WebSocket. */
88
+ private sendEvent;
67
89
  }
68
90
  export {};
69
91
  //# sourceMappingURL=connector-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"connector-client.d.ts","sourceRoot":"","sources":["../src/connector-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connector-client.d.ts","sourceRoot":"","sources":["../src/connector-client.ts"],"names":[],"mappings":"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"}