@masons/agent-network 0.6.11 → 0.6.13

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":"AAEA,OAAO,KAAK,EACV,aAAa,EAEd,MAAM,kCAAkC,CAAC;AAa1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAyC9D,wBAAgB,uBAAuB,IAAI,MAAM,GAAG,IAAI,CAEvD;AAOD,wBAAgB,2BAA2B,IAAI,OAAO,CAIrD;AAGD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAE/D;AAaD,iBAAS,iCAAiC,CACxC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA6BzB;AAED,eAAO,MAAM,4CAA4C,0CACtB,CAAC;AAmbpC,eAAO,MAAM,mBAAmB,EAAE,aAAa,CAAC,mBAAmB,CAqOlE,CAAC"}
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EAEd,MAAM,kCAAkC,CAAC;AAa1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAyC9D,wBAAgB,uBAAuB,IAAI,MAAM,GAAG,IAAI,CAEvD;AAOD,wBAAgB,2BAA2B,IAAI,OAAO,CAIrD;AAGD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAE/D;AAaD,iBAAS,iCAAiC,CACxC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA6BzB;AAED,eAAO,MAAM,4CAA4C,0CACtB,CAAC;AAodpC,eAAO,MAAM,mBAAmB,EAAE,aAAa,CAAC,mBAAmB,CAqOlE,CAAC"}
package/dist/channel.js CHANGED
@@ -183,6 +183,13 @@ async function handleAddressedMessage(event, conversationManager, client, ctx) {
183
183
  }
184
184
  const senderId = fromAddress;
185
185
  const senderName = contact;
186
+ conversationManager.recordInboundEnvelope(fromAddress, {
187
+ traceparent: typeof metadata.traceparent === "string"
188
+ ? metadata.traceparent
189
+ : undefined,
190
+ correlationId: inboundCorrelationId,
191
+ messageId: inboundMessageId,
192
+ });
186
193
  try {
187
194
  const route = await runtime.channel.routing.resolveAgentRoute({
188
195
  cfg: ctx.cfg,
@@ -224,6 +231,8 @@ async function handleAddressedMessage(event, conversationManager, client, ctx) {
224
231
  },
225
232
  });
226
233
  client.sendTyping(fromAddress, true);
234
+ let replyDelivered = false;
235
+ let suppressedBlocks = 0;
227
236
  try {
228
237
  await runtime.channel.reply.dispatchReplyWithBufferedBlockDispatcher({
229
238
  ctx: msgCtx,
@@ -234,18 +243,20 @@ async function handleAddressedMessage(event, conversationManager, client, ctx) {
234
243
  if (!text)
235
244
  return;
236
245
  if (!conversationManager.hasConversation(senderId)) {
237
- dbg("deliver suppressed: conversation ended senderId=%s len=%d", senderId, text.length);
246
+ suppressedBlocks++;
238
247
  return;
239
248
  }
240
- const replyMetadata = {};
241
- if (inboundCorrelationId !== undefined) {
242
- replyMetadata.correlation_id = inboundCorrelationId;
249
+ const replyTrace = createReplyTraceMetadata(metadata, {
250
+ correlationId: inboundCorrelationId,
251
+ messageId: inboundMessageId,
252
+ });
253
+ const deliverResult = await conversationManager.send(senderId, text, replyTrace.metadata);
254
+ if (deliverResult.status === "sent") {
255
+ replyDelivered = true;
243
256
  }
244
- if (inboundMessageId !== undefined) {
245
- replyMetadata.in_reply_to = inboundMessageId;
257
+ else {
258
+ console.warn(`[agent-network:${ctx.accountId}] reply send FAILED to=${senderId} code=${deliverResult.errorCode ?? "(none)"} error=${deliverResult.error ?? "(none)"}`);
246
259
  }
247
- const replyTrace = createReplyTraceMetadata(metadata, replyMetadata);
248
- const deliverResult = await conversationManager.send(senderId, text, replyTrace.metadata);
249
260
  dbg("deliver reply senderId=%s status=%s contentLength=%d traceId=%s originalTraceId=%s spanName=send", senderId, deliverResult.status, text.length, replyTrace.traceId, replyTrace.originalTraceId ?? "(absent)");
250
261
  },
251
262
  onError: (err) => {
@@ -253,6 +264,12 @@ async function handleAddressedMessage(event, conversationManager, client, ctx) {
253
264
  },
254
265
  },
255
266
  });
267
+ if (suppressedBlocks > 0) {
268
+ console.warn(`[agent-network:${ctx.accountId}] reply suppressed (conversation ended) from=${senderId} blocks=${suppressedBlocks}`);
269
+ }
270
+ else if (!replyDelivered) {
271
+ console.log(`[agent-network:${ctx.accountId}] dispatch completed without in-turn reply text from=${senderId} (tool-path reply or silence)`);
272
+ }
256
273
  }
257
274
  finally {
258
275
  client.sendTyping(fromAddress, false);
@@ -27,6 +27,7 @@ export declare class ConnectorClient extends EventEmitter {
27
27
  private registerReject;
28
28
  private registerTimer;
29
29
  private lastKnownSeq;
30
+ private highestWireSeq;
30
31
  private readonly pendingSeqMessages;
31
32
  private readonly seenPayloadIds;
32
33
  private readonly seenPayloadIdOrder;
@@ -55,6 +56,7 @@ export declare class ConnectorClient extends EventEmitter {
55
56
  private dispatchAddressed;
56
57
  private handleAddressedMessage;
57
58
  private handleDeliverySkip;
59
+ private adoptLedgerDeliveryCursor;
58
60
  private adoptDeliveredFloor;
59
61
  private acceptContiguous;
60
62
  private drainPendingSeqMessagesFrom;
@@ -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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"}
@@ -36,6 +36,7 @@ export class ConnectorClient extends EventEmitter {
36
36
  registerReject = null;
37
37
  registerTimer = null;
38
38
  lastKnownSeq;
39
+ highestWireSeq = 0;
39
40
  pendingSeqMessages = new Map();
40
41
  seenPayloadIds = new Set();
41
42
  seenPayloadIdOrder = [];
@@ -126,6 +127,7 @@ export class ConnectorClient extends EventEmitter {
126
127
  const ws = new WebSocket(this.url, { handshakeTimeout: 10_000 });
127
128
  this.ws = ws;
128
129
  ws.on("open", () => {
130
+ this.highestWireSeq = 0;
129
131
  this.sendRegister();
130
132
  this.startRegisterTimeout();
131
133
  });
@@ -212,6 +214,10 @@ export class ConnectorClient extends EventEmitter {
212
214
  return;
213
215
  }
214
216
  if (isDeliveryCursor(parsed)) {
217
+ if (parsed.deliveredSeq !== undefined &&
218
+ parsed.deliveredSeq > this.highestWireSeq) {
219
+ this.highestWireSeq = parsed.deliveredSeq;
220
+ }
215
221
  const floor = this.lastKnownSeq ?? 0;
216
222
  dbg("DELIVERY_CURSOR deliverySeq=%d deliveredSeq=%s local=%d", parsed.deliverySeq, parsed.deliveredSeq ?? "none", floor);
217
223
  if (parsed.deliveredSeq !== undefined && parsed.deliveredSeq > floor) {
@@ -224,7 +230,18 @@ export class ConnectorClient extends EventEmitter {
224
230
  else if (parsed.deliveredSeq !== undefined &&
225
231
  this.lastKnownSeq !== undefined &&
226
232
  parsed.deliveredSeq < this.lastKnownSeq) {
227
- this.ackDelivery(this.lastKnownSeq);
233
+ if (parsed.deliverySeq < this.lastKnownSeq &&
234
+ this.highestWireSeq <= parsed.deliverySeq) {
235
+ const adopted = parsed.deliveredSeq;
236
+ console.warn(`[agent-network] delivery cursor unattainable: local claim ${this.lastKnownSeq} exceeds the ledger's highest reserved seq ${parsed.deliverySeq}; adopting the ledger floor ${adopted}. Messages are being recovered from that point.`);
237
+ this.adoptLedgerDeliveryCursor(adopted);
238
+ if (parsed.deliverySeq > adopted) {
239
+ this.requestGapFill(adopted);
240
+ }
241
+ }
242
+ else {
243
+ this.ackDelivery(this.lastKnownSeq);
244
+ }
228
245
  }
229
246
  return;
230
247
  }
@@ -248,6 +265,8 @@ export class ConnectorClient extends EventEmitter {
248
265
  this.emit("message_received", message);
249
266
  return;
250
267
  }
268
+ if (message.seq > this.highestWireSeq)
269
+ this.highestWireSeq = message.seq;
251
270
  const floor = this.lastKnownSeq ?? 0;
252
271
  if (message.seq <= floor)
253
272
  return;
@@ -259,6 +278,8 @@ export class ConnectorClient extends EventEmitter {
259
278
  this.acceptContiguous(message);
260
279
  }
261
280
  handleDeliverySkip(event) {
281
+ if (event.seq > this.highestWireSeq)
282
+ this.highestWireSeq = event.seq;
262
283
  const floor = this.lastKnownSeq ?? 0;
263
284
  if (event.seq <= floor)
264
285
  return;
@@ -270,6 +291,12 @@ export class ConnectorClient extends EventEmitter {
270
291
  this.drainPendingSeqMessagesFrom(event.seq + 1);
271
292
  this.ackDelivery(this.lastKnownSeq);
272
293
  }
294
+ adoptLedgerDeliveryCursor(seq) {
295
+ this.pendingSeqMessages.clear();
296
+ this.seenPayloadIds.clear();
297
+ this.seenPayloadIdOrder.length = 0;
298
+ this.lastKnownSeq = seq;
299
+ }
273
300
  adoptDeliveredFloor(seq) {
274
301
  if (!Number.isInteger(seq) || seq < 0)
275
302
  return;
@@ -10,6 +10,7 @@ export interface ConversationEntry {
10
10
  lastMessageAt: number;
11
11
  initiatedBy: "local" | "remote";
12
12
  ended?: boolean;
13
+ inboundEnvelope?: InboundEnvelope;
13
14
  }
14
15
  export interface ConversationSummary {
15
16
  contact: string;
@@ -18,6 +19,13 @@ export interface ConversationSummary {
18
19
  lastMessageAt: number;
19
20
  initiatedBy: "local" | "remote";
20
21
  }
22
+ export interface InboundEnvelope {
23
+ traceparent?: string;
24
+ correlationId?: string;
25
+ messageId?: string;
26
+ receivedAt: number;
27
+ }
28
+ export declare const REPLY_CORRELATION_MAX_AGE_MS: number;
21
29
  export declare class ConversationManager {
22
30
  private readonly client;
23
31
  private readonly mstpAuthority;
@@ -25,6 +33,7 @@ export declare class ConversationManager {
25
33
  constructor(client: ConnectorClient, mstpAuthority: string);
26
34
  send(contact: string, content: string, metadata?: Record<string, unknown>): Promise<SendResult>;
27
35
  registerInbound(contact: string, address: string): void;
36
+ recordInboundEnvelope(address: string, envelope: Omit<InboundEnvelope, "receivedAt">): void;
28
37
  getContactByAddress(address: string): string | undefined;
29
38
  listConversations(): ConversationSummary[];
30
39
  hasConversation(contact: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-manager.d.ts","sourceRoot":"","sources":["../src/conversation-manager.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,eAAe,EAAkB,MAAM,uBAAuB,CAAC;AAU7E,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,OAAO,GAAG,QAAQ,CAAC;IAchC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,OAAO,GAAG,QAAQ,CAAC;CACjC;AA4BD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAGvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwC;gBAE1D,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM;IAuBpD,IAAI,CACR,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,UAAU,CAAC;IA6DtB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IASvD,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAkBxD,iBAAiB,IAAI,mBAAmB,EAAE;IAwB1C,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAiBzC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAyBzC,wBAAwB,IAAI,IAAI;IAgChC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAyBvC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAQtC,OAAO,CAAC,uBAAuB;IA0B/B,gBAAgB,IAAI,IAAI;CAGzB"}
1
+ {"version":3,"file":"conversation-manager.d.ts","sourceRoot":"","sources":["../src/conversation-manager.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,eAAe,EAAkB,MAAM,uBAAuB,CAAC;AAa7E,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,OAAO,GAAG,QAAQ,CAAC;IAchC,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,OAAO,GAAG,QAAQ,CAAC;CACjC;AAuBD,MAAM,WAAW,eAAe;IAE9B,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AASD,eAAO,MAAM,4BAA4B,QAAc,CAAC;AA4BxD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAGvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwC;gBAE1D,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM;IAuBpD,IAAI,CACR,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,UAAU,CAAC;IAmGtB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAYvD,qBAAqB,CACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,GAC5C,IAAI;IAmBP,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAkBxD,iBAAiB,IAAI,mBAAmB,EAAE;IAwB1C,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAiBzC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAyBzC,wBAAwB,IAAI,IAAI;IAkChC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAyBvC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAQtC,OAAO,CAAC,uBAAuB;IA0B/B,gBAAgB,IAAI,IAAI;CAGzB"}
@@ -1,8 +1,9 @@
1
1
  import createDebug from "debug";
2
2
  import { ConnectorError } from "./connector-client.js";
3
3
  import { extractHandleFromAddress } from "./handle-utils.js";
4
- import { ensureTraceMetadata } from "./trace-metadata.js";
4
+ import { createReplyTraceMetadata, ensureTraceMetadata, } from "./trace-metadata.js";
5
5
  const dbg = createDebug("agent-network:conversation-manager");
6
+ export const REPLY_CORRELATION_MAX_AGE_MS = 10 * 60_000;
6
7
  const ERROR_MESSAGES = {
7
8
  ADDRESS_NOT_FOUND: "Cannot find agent '{to}'. Check the handle.",
8
9
  ACCESS_DENIED: "No connection to '{to}'. Send a connection request first.",
@@ -27,17 +28,40 @@ export class ConversationManager {
27
28
  }
28
29
  async send(contact, content, metadata) {
29
30
  const address = this.resolveAddress(contact);
30
- const trace = ensureTraceMetadata(metadata);
31
- if (trace.degraded) {
32
- dbg("trace context degraded contact=%s traceId=%s reason=%s spanName=send", contact, trace.traceId, trace.reason);
33
- if (trace.reason === "invalid") {
34
- console.warn(`[agent-network:conversation-manager] invalid traceparent contact=${contact} traceId=${trace.traceId} spanName=send`);
31
+ let wireMetadata;
32
+ let sendTraceId;
33
+ let envelope = metadata === undefined
34
+ ? this.conversations.get(address)?.inboundEnvelope
35
+ : undefined;
36
+ if (envelope &&
37
+ Date.now() - envelope.receivedAt > REPLY_CORRELATION_MAX_AGE_MS) {
38
+ dbg("inbound envelope stale, sending uncorrelated contact=%s ageMs=%d", contact, Date.now() - envelope.receivedAt);
39
+ envelope = undefined;
40
+ }
41
+ if (envelope) {
42
+ const replyTrace = createReplyTraceMetadata(envelope, {
43
+ correlationId: envelope.correlationId,
44
+ messageId: envelope.messageId,
45
+ });
46
+ wireMetadata = replyTrace.metadata;
47
+ sendTraceId = replyTrace.traceId;
48
+ dbg("auto reply-correlation contact=%s in_reply_to=%s correlation_id=%s originalTraceId=%s spanName=send", contact, envelope.messageId ?? "(absent)", envelope.correlationId ?? "(absent)", replyTrace.originalTraceId ?? "(absent)");
49
+ }
50
+ else {
51
+ const trace = ensureTraceMetadata(metadata);
52
+ if (trace.degraded) {
53
+ dbg("trace context degraded contact=%s traceId=%s reason=%s spanName=send", contact, trace.traceId, trace.reason);
54
+ if (trace.reason === "invalid") {
55
+ console.warn(`[agent-network:conversation-manager] invalid traceparent contact=${contact} traceId=${trace.traceId} spanName=send`);
56
+ }
35
57
  }
58
+ wireMetadata = trace.metadata;
59
+ sendTraceId = trace.traceId;
36
60
  }
37
61
  try {
38
- const ack = await this.client.send(address, content, "text", trace.metadata);
62
+ const ack = await this.client.send(address, content, "text", wireMetadata);
39
63
  this.ensureConversationEntry(this.extractHandle(address), address, "local");
40
- dbg("send contact=%s address=%s status=%s traceId=%s spanName=send", contact, address, ack.status, trace.traceId);
64
+ dbg("send contact=%s address=%s status=%s traceId=%s spanName=send", contact, address, ack.status, sendTraceId);
41
65
  return { status: "sent" };
42
66
  }
43
67
  catch (err) {
@@ -55,6 +79,15 @@ export class ConversationManager {
55
79
  this.ensureConversationEntry(contact, address, "remote");
56
80
  dbg("registerInbound contact=%s address=%s", contact, address);
57
81
  }
82
+ recordInboundEnvelope(address, envelope) {
83
+ const entry = this.conversations.get(address);
84
+ if (!entry) {
85
+ dbg("recordInboundEnvelope no entry, skipped address=%s", address);
86
+ return;
87
+ }
88
+ entry.inboundEnvelope = { ...envelope, receivedAt: Date.now() };
89
+ dbg("recordInboundEnvelope address=%s messageId=%s correlationId=%s", address, envelope.messageId ?? "(absent)", envelope.correlationId ?? "(absent)");
90
+ }
58
91
  getContactByAddress(address) {
59
92
  const entry = this.conversations.get(address);
60
93
  if (entry)
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAuEA,UAAU,WAAW;IACnB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,CACP,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,OAAO,CAAC,WAAW,CAAC,CAAC;CAC3B;AAED,UAAU,WAAW;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,KAAK,WAAW,GAAG,CAAC,GAAG,EAAE,WAAW,KAAK,cAAc,GAAG,IAAI,GAAG,SAAS,CAAC;AAE3E,UAAU,OAAO;IACf,YAAY,CACV,IAAI,EAAE,cAAc,GAAG,WAAW,EAWlC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAC7D,IAAI,CAAC;CACT;AAoDD,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;AAwSD,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CA41BhD"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAuEA,UAAU,WAAW;IACnB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,CACP,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,OAAO,CAAC,WAAW,CAAC,CAAC;CAC3B;AAED,UAAU,WAAW;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,KAAK,WAAW,GAAG,CAAC,GAAG,EAAE,WAAW,KAAK,cAAc,GAAG,IAAI,GAAG,SAAS,CAAC;AAE3E,UAAU,OAAO;IACf,YAAY,CACV,IAAI,EAAE,cAAc,GAAG,WAAW,EAWlC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAC7D,IAAI,CAAC;CACT;AAoDD,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;AAwSD,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAs2BhD"}
package/dist/tools.js CHANGED
@@ -566,7 +566,8 @@ export function registerTools(api) {
566
566
  const displayName = node.displayName || node.handle || "(unnamed)";
567
567
  const address = node.mstpAddress;
568
568
  const kindLabel = formatKindLabel(node?.kind);
569
- return `${i + 1}. ${kindLabel}${displayName} (${address})`;
569
+ const handlePart = node.handle ? `@${node.handle} — ` : "";
570
+ return `${i + 1}. ${kindLabel}${displayName} (${handlePart}${address})`;
570
571
  });
571
572
  return textResult(`${result.total} connection(s):\n\n${lines.join("\n")}\n\nUse masons_send_message with a handle or address to send a message.`);
572
573
  }),
@@ -576,7 +577,7 @@ export function registerTools(api) {
576
577
  description: "Send a message to a remote agent on the agent network. This is agent-to-agent communication — separate from your owner's conversation. Sessions are managed automatically — just provide the contact handle or address.",
577
578
  parameters: Type.Object({
578
579
  to: Type.String({
579
- description: "Handle (e.g. alice) or network address (e.g. mstps://preview.masons.ai/alice) of the agent to message",
580
+ description: "Handle of the agent to message, e.g. alice resolved against your connection list, which is the reliable path. A full network address is accepted only when copied verbatim from masons_list_connections; do not assemble one from a handle yourself.",
580
581
  }),
581
582
  content: Type.String({
582
583
  description: "Message content to send",
@@ -592,6 +593,7 @@ export function registerTools(api) {
592
593
  sentMessageBuffer.record(handle, content);
593
594
  return textResult("Message sent.");
594
595
  }
596
+ console.warn(`[agent-network:tools] masons_send_message FAILED to=${to} code=${result.errorCode ?? "(none)"} error=${result.error ?? "(none)"}`);
595
597
  return textResult(result.error ??
596
598
  "Failed to send message. The network connection may be temporarily unavailable. Try again in a moment.");
597
599
  }),
@@ -11,5 +11,10 @@ export interface ReplyTraceMetadataResult {
11
11
  traceId: string;
12
12
  originalTraceId?: string;
13
13
  }
14
- export declare function createReplyTraceMetadata(inboundMetadata: Record<string, unknown>, replyMetadata?: Record<string, unknown>): ReplyTraceMetadataResult;
14
+ export declare function createReplyTraceMetadata(inbound: {
15
+ traceparent?: unknown;
16
+ }, reply?: {
17
+ correlationId?: string;
18
+ messageId?: string;
19
+ }): ReplyTraceMetadataResult;
15
20
  //# sourceMappingURL=trace-metadata.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"trace-metadata.d.ts","sourceRoot":"","sources":["../src/trace-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAUD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC5C,mBAAmB,CAWrB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,wBAAwB,CACtC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxC,aAAa,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAC1C,wBAAwB,CAkB1B"}
1
+ {"version":3,"file":"trace-metadata.d.ts","sourceRoot":"","sources":["../src/trace-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAUD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC5C,mBAAmB,CAWrB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AASD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,EAClC,KAAK,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACzD,wBAAwB,CAqB1B"}
@@ -16,17 +16,19 @@ export function ensureTraceMetadata(metadata) {
16
16
  reason: ensured.reason,
17
17
  };
18
18
  }
19
- export function createReplyTraceMetadata(inboundMetadata, replyMetadata = {}) {
19
+ export function createReplyTraceMetadata(inbound, reply = {}) {
20
20
  const traceparent = mintTraceparent();
21
21
  const traceId = extractTraceId(traceparent);
22
22
  if (traceId === null) {
23
23
  throw new Error("mintTraceparent returned an invalid traceparent");
24
24
  }
25
- const originalTraceId = extractTraceId(readTraceparent(inboundMetadata));
26
- const { originalTraceId: _ignoredOriginalTraceId, ...safeReplyMetadata } = replyMetadata;
25
+ const originalTraceId = extractTraceId(typeof inbound.traceparent === "string" ? inbound.traceparent : undefined);
27
26
  return {
28
27
  metadata: {
29
- ...safeReplyMetadata,
28
+ ...(reply.correlationId !== undefined && {
29
+ correlation_id: reply.correlationId,
30
+ }),
31
+ ...(reply.messageId !== undefined && { in_reply_to: reply.messageId }),
30
32
  traceparent,
31
33
  ...(originalTraceId !== null && { originalTraceId }),
32
34
  },
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const PLUGIN_VERSION = "0.6.11";
1
+ export declare const PLUGIN_VERSION = "0.6.13";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export const PLUGIN_VERSION = "0.6.11";
1
+ export const PLUGIN_VERSION = "0.6.13";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@masons/agent-network",
3
- "version": "0.6.11",
3
+ "version": "0.6.13",
4
4
  "description": "MASONS Agent Network — OpenClaw channel plugin for connecting agent runtimes to the Agent Network over MSTP.",
5
5
  "license": "MIT",
6
6
  "author": "MASONS.ai <hello@masons.ai> (https://masons.ai)",
@@ -21,6 +21,16 @@
21
21
  "publishConfig": {
22
22
  "access": "public"
23
23
  },
24
+ "scripts": {
25
+ "build": "tsc",
26
+ "dev": "tsc --watch",
27
+ "test": "node ../../scripts/sync-vendored-trace-context.mjs && tsc -p test/tsconfig.json && node --test --loader ts-node/esm 'test/**/*.test.ts'",
28
+ "biome:check": "biome check .",
29
+ "biome:fix": "biome check . --write",
30
+ "biome:ci": "biome ci .",
31
+ "prepublishOnly": "node ../../scripts/sync-vendored-trace-context.mjs && bash scripts/check-version.sh && npm run build && npm run test",
32
+ "release": "pnpm publish --access public"
33
+ },
24
34
  "files": [
25
35
  "dist/",
26
36
  "openclaw.plugin.json",
@@ -86,15 +96,6 @@
86
96
  "@types/ws": "^8",
87
97
  "openclaw": "2026.6.11",
88
98
  "ts-node": "^10",
89
- "typescript": "6.0.3"
90
- },
91
- "scripts": {
92
- "build": "tsc",
93
- "dev": "tsc --watch",
94
- "test": "node ../../scripts/sync-vendored-trace-context.mjs && tsc -p test/tsconfig.json && node --test --loader ts-node/esm 'test/**/*.test.ts'",
95
- "biome:check": "biome check .",
96
- "biome:fix": "biome check . --write",
97
- "biome:ci": "biome ci .",
98
- "release": "pnpm publish --access public"
99
+ "typescript": "catalog:"
99
100
  }
100
- }
101
+ }
@@ -294,6 +294,8 @@ Your context will show your **active interactions** — who you're interacting w
294
294
  - To report to your owner: `masons_note_for_owner(content, from?)`
295
295
  - To mark an explicitly stopped interaction closed for this turn: `masons_end_conversation(contact)` (rare compatibility tool)
296
296
 
297
+ **Addressing rule:** pass the bare handle (as listed by `masons_list_connections`), or an address copied verbatim from your connections or from the incoming message. **Never assemble an `mstps://` address yourself** — a handle does not tell you which host the agent lives on, so a hand-built address can be well-formed and still name the wrong host. Handles resolve through your own connection list, which knows the real address.
298
+
297
299
  `masons_end_conversation` is not routine cleanup. The Connector owns endpoint lifecycle. Use the tool at most once for a direct stop/close instruction, and never call it in response to tail acknowledgements such as "Done", "Goodbye", "OK", or "收到".
298
300
 
299
301
  ### When you contact another agent (you initiate)