@masons/agent-network 0.6.2 → 0.6.4

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.
@@ -0,0 +1,19 @@
1
+ export interface TraceContext {
2
+ readonly traceId: string;
3
+ readonly spanId: string;
4
+ readonly flags: string;
5
+ }
6
+ export type TraceparentReason = "present" | "missing" | "invalid";
7
+ export interface EnsuredTraceContext {
8
+ readonly traceparent: string;
9
+ readonly traceId: string;
10
+ readonly degraded: boolean;
11
+ readonly reason: TraceparentReason;
12
+ }
13
+ export declare function parseTraceparent(value: string | undefined | null): TraceContext | null;
14
+ export declare function formatTraceparent(ctx: TraceContext): string;
15
+ export declare function mintTraceparent(): string;
16
+ export declare function extractTraceId(value: string | undefined | null): string | null;
17
+ export declare function ensureTraceparent(value: string | undefined | null): EnsuredTraceContext;
18
+ export declare function childTraceparent(value: string | undefined | null): string | null;
19
+ //# sourceMappingURL=trace-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-context.d.ts","sourceRoot":"","sources":["../../src/_vendor/trace-context.ts"],"names":[],"mappings":"AAiCA,MAAM,WAAW,YAAY;IAE3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAGD,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAElE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAM3B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;CACpC;AAqBD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAC/B,YAAY,GAAG,IAAI,CAQrB;AAGD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAE3D;AAGD,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAGD,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAC/B,MAAM,GAAG,IAAI,CAEf;AAQD,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAC/B,mBAAmB,CAcrB;AAOD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAC/B,MAAM,GAAG,IAAI,CAIf"}
@@ -0,0 +1,66 @@
1
+ const TRACE_ID_HEX = 32;
2
+ const SPAN_ID_HEX = 16;
3
+ const VERSION = "00";
4
+ const SAMPLED_FLAGS = "01";
5
+ const ZERO_TRACE_ID = "0".repeat(TRACE_ID_HEX);
6
+ const ZERO_SPAN_ID = "0".repeat(SPAN_ID_HEX);
7
+ const TRACEPARENT_RE = /^[0-9a-f]{2}-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$/;
8
+ function randomHex(hexChars) {
9
+ const bytes = new Uint8Array(hexChars / 2);
10
+ globalThis.crypto.getRandomValues(bytes);
11
+ let out = "";
12
+ for (const byte of bytes) {
13
+ out += byte.toString(16).padStart(2, "0");
14
+ }
15
+ return out;
16
+ }
17
+ function mintContext() {
18
+ return {
19
+ traceId: randomHex(TRACE_ID_HEX),
20
+ spanId: randomHex(SPAN_ID_HEX),
21
+ flags: SAMPLED_FLAGS,
22
+ };
23
+ }
24
+ export function parseTraceparent(value) {
25
+ if (typeof value !== "string")
26
+ return null;
27
+ const normalized = value.trim().toLowerCase();
28
+ if (!TRACEPARENT_RE.test(normalized))
29
+ return null;
30
+ const [, traceId, spanId, flags] = normalized.split("-");
31
+ if (!traceId || !spanId || !flags)
32
+ return null;
33
+ if (traceId === ZERO_TRACE_ID || spanId === ZERO_SPAN_ID)
34
+ return null;
35
+ return { traceId, spanId, flags };
36
+ }
37
+ export function formatTraceparent(ctx) {
38
+ return `${VERSION}-${ctx.traceId}-${ctx.spanId}-${ctx.flags}`;
39
+ }
40
+ export function mintTraceparent() {
41
+ return formatTraceparent(mintContext());
42
+ }
43
+ export function extractTraceId(value) {
44
+ return parseTraceparent(value)?.traceId ?? null;
45
+ }
46
+ export function ensureTraceparent(value) {
47
+ const parsed = parseTraceparent(value);
48
+ const ctx = parsed ?? mintContext();
49
+ const reason = parsed
50
+ ? "present"
51
+ : value == null || (typeof value === "string" && value.trim() === "")
52
+ ? "missing"
53
+ : "invalid";
54
+ return {
55
+ traceparent: formatTraceparent(ctx),
56
+ traceId: ctx.traceId,
57
+ degraded: parsed === null,
58
+ reason,
59
+ };
60
+ }
61
+ export function childTraceparent(value) {
62
+ const parsed = parseTraceparent(value);
63
+ if (!parsed)
64
+ return null;
65
+ return `${VERSION}-${parsed.traceId}-${randomHex(SPAN_ID_HEX)}-${parsed.flags}`;
66
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAqC9D,wBAAgB,uBAAuB,IAAI,MAAM,GAAG,IAAI,CAEvD;AAOD,wBAAgB,2BAA2B,IAAI,OAAO,CAIrD;AAGD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAE/D;AAUD,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,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,sBAAsB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,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;AA2DD,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;AAEpC,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;AAqZD,eAAO,MAAM,mBAAmB,EAAE,yBA+NjC,CAAC"}
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAcA,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;AAUD,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,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,sBAAsB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,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;AA2DD,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;AAEpC,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;AAyaD,eAAO,MAAM,mBAAmB,EAAE,yBA+NjC,CAAC"}
package/dist/channel.js CHANGED
@@ -7,6 +7,7 @@ import { ConversationManager } from "./conversation-manager.js";
7
7
  import { clearEnvironmentContext } from "./environment-context.js";
8
8
  import { extractHandleFromAddress } from "./handle-utils.js";
9
9
  import { clearOwnerState, isOwnerAddress, markOwnerAddress, setCurrentTurnIsOwner, setCurrentTurnOwnerSignal, } from "./owner-session-state.js";
10
+ import { createReplyTraceMetadata, ensureTraceMetadata, } from "./trace-metadata.js";
10
11
  import { setCurrentTurnSender } from "./turn-context.js";
11
12
  import { checkForUpdate } from "./update-check.js";
12
13
  const dbg = createDebug("agent-network:channel");
@@ -113,24 +114,30 @@ function isDuplicate(from, content, sentAt) {
113
114
  async function handleAddressedMessage(event, conversationManager, client, ctx) {
114
115
  const fromAddress = event.from;
115
116
  dbg("routing inbound message from=%s contentLength=%d", fromAddress, event.content.length);
117
+ const inboundTrace = ensureTraceMetadata(event.metadata);
118
+ const metadata = inboundTrace.metadata;
119
+ if (inboundTrace.degraded) {
120
+ dbg("trace context degraded inbound from=%s traceId=%s reason=%s spanName=receive", fromAddress, inboundTrace.traceId, inboundTrace.reason);
121
+ if (inboundTrace.reason === "invalid") {
122
+ console.warn(`[agent-network:channel] invalid traceparent from=${fromAddress} traceId=${inboundTrace.traceId} spanName=receive`);
123
+ }
124
+ }
116
125
  if (isDuplicate(fromAddress, event.content, event.sentAt)) {
117
126
  dbg("duplicate message suppressed from=%s sentAt=%s", fromAddress, event.sentAt);
118
127
  return;
119
128
  }
120
- const inboundCorrelationId = typeof event.metadata?.correlation_id === "string"
121
- ? event.metadata.correlation_id
122
- : undefined;
123
- const inboundMessageId = typeof event.metadata?.message_id === "string"
124
- ? event.metadata.message_id
129
+ const inboundCorrelationId = typeof metadata.correlation_id === "string"
130
+ ? metadata.correlation_id
125
131
  : undefined;
126
- const nodeRef = tryProjectNodeRef(event.metadata);
132
+ const inboundMessageId = typeof metadata.message_id === "string" ? metadata.message_id : undefined;
133
+ const nodeRef = tryProjectNodeRef(metadata);
127
134
  if (nodeRef) {
128
135
  setCurrentTurnIsOwner(false);
129
136
  setCurrentTurnOwnerSignal(null);
130
137
  dbg("Full Node sender: kind=%s mstpAddress=%s handle=%s", nodeRef.kind, nodeRef.mstpAddress, nodeRef.handle ?? "(absent)");
131
138
  }
132
139
  else {
133
- if (event.metadata?.is_owner === true) {
140
+ if (metadata.is_owner === true) {
134
141
  markOwnerAddress(fromAddress);
135
142
  if (!storedOwnerPassportAddress) {
136
143
  storedOwnerPassportAddress = fromAddress;
@@ -145,10 +152,10 @@ async function handleAddressedMessage(event, conversationManager, client, ctx) {
145
152
  }
146
153
  }
147
154
  setCurrentTurnIsOwner(isOwnerAddress(fromAddress));
148
- if (event.metadata?.is_owner === true) {
155
+ if (metadata.is_owner === true) {
149
156
  setCurrentTurnOwnerSignal("owner");
150
157
  }
151
- else if (event.metadata?.is_owner === false) {
158
+ else if (metadata.is_owner === false) {
152
159
  setCurrentTurnOwnerSignal("non-owner");
153
160
  }
154
161
  else {
@@ -237,8 +244,9 @@ async function handleAddressedMessage(event, conversationManager, client, ctx) {
237
244
  if (inboundMessageId !== undefined) {
238
245
  replyMetadata.in_reply_to = inboundMessageId;
239
246
  }
240
- const deliverResult = await conversationManager.send(senderId, text, Object.keys(replyMetadata).length > 0 ? replyMetadata : undefined);
241
- dbg("deliver reply senderId=%s status=%s contentLength=%d", senderId, deliverResult.status, text.length);
247
+ const replyTrace = createReplyTraceMetadata(metadata, replyMetadata);
248
+ const deliverResult = await conversationManager.send(senderId, text, replyTrace.metadata);
249
+ 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)");
242
250
  },
243
251
  onError: (err) => {
244
252
  console.error(`[agent-network:${ctx.accountId}] dispatch error:`, err);
@@ -54,7 +54,10 @@ export declare class ConnectorClient extends EventEmitter {
54
54
  private handleMessage;
55
55
  private dispatchAddressed;
56
56
  private handleAddressedMessage;
57
+ private handleDeliverySkip;
58
+ private adoptDeliveredFloor;
57
59
  private acceptContiguous;
60
+ private drainPendingSeqMessagesFrom;
58
61
  private rememberPayloadId;
59
62
  private handleRegisterAck;
60
63
  private handleSendAck;
@@ -1 +1 @@
1
- {"version":3,"file":"connector-client.d.ts","sourceRoot":"","sources":["../src/connector-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,EAEL,KAAK,qBAAqB,EAI1B,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EAaxB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EAC1B,MAAM,YAAY,CAAC;AA2BpB,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;gBACT,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM;CAMvD;AAID,KAAK,qBAAqB,GAAG;IAC3B,gBAAgB,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACzD,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACxC,gBAAgB,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACxD,eAAe,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACtD,gBAAgB,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACxD,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B,CAAC;AAIF,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,uBAAuB,CAAK;IACpC,OAAO,CAAC,cAAc,CAA8C;IAEpE,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,cAAc,CAAuC;IAC7D,OAAO,CAAC,aAAa,CAA8C;IAGnE,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAG/B;IACJ,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAgB;IAGnD,OAAO,CAAC,YAAY,CAOhB;gBAEQ,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAQtC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IASxB,UAAU,IAAI,IAAI;IAwBlB,IAAI,CACF,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,WAAW,SAAS,EACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,YAAY,CAAC;IA+BxB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO;IAUlD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOrC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IASzC,EAAE,CAAC,CAAC,SAAS,MAAM,qBAAqB,EACtC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,qBAAqB,CAAC,CAAC,CAAC,GACjC,IAAI;IACP,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI;IAKxE,IAAI,CAAC,CAAC,SAAS,MAAM,qBAAqB,EACxC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,qBAAqB,CAAC,CAAC,CAAC,GACjC,IAAI;IACP,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI;IAK1E,GAAG,CAAC,CAAC,SAAS,MAAM,qBAAqB,EACvC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,qBAAqB,CAAC,CAAC,CAAC,GACjC,IAAI;IACP,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI;IAKzE,IAAI,CAAC,CAAC,SAAS,MAAM,qBAAqB,EACxC,KAAK,EAAE,CAAC,EACR,GAAG,IAAI,EAAE,UAAU,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,GAC5C,OAAO;IACV,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO;IAOzD,OAAO,CAAC,SAAS;IAqBjB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,aAAa,CAgBnB;IAGF,OAAO,CAAC,iBAAiB;IA+DzB,OAAO,CAAC,sBAAsB;IA0B9B,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,iBAAiB;IAsFzB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,qBAAqB;IAoB7B,OAAO,CAAC,WAAW,CAqDjB;IAEF,OAAO,CAAC,WAAW,CAIjB;IAIF,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,SAAS;CAelB"}
1
+ {"version":3,"file":"connector-client.d.ts","sourceRoot":"","sources":["../src/connector-client.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import { EventEmitter } from "node:events";
3
3
  import createDebug from "debug";
4
4
  import WebSocket from "ws";
5
5
  import { setEnvironmentContext } from "./environment-context.js";
6
- import { CURRENT_PROTOCOL_VERSION, isAddressedMessage, isDeliveryCursor, isDeliveryPending, isDeliveryStatus, isRegisterAck, isSendAck, isStructuredError, REGISTER_ACK_TIMEOUT_MS, SEND_ACK_TIMEOUT_MS, } from "./types.js";
6
+ import { CURRENT_PROTOCOL_VERSION, isAddressedMessage, isDeliveryCursor, isDeliveryPending, isDeliverySkip, isDeliveryStatus, isRegisterAck, isSendAck, isStructuredError, REGISTER_ACK_TIMEOUT_MS, SEND_ACK_TIMEOUT_MS, } from "./types.js";
7
7
  import { PLUGIN_VERSION } from "./version.js";
8
8
  const dbg = createDebug("agent-network:connector");
9
9
  const dbgMsg = createDebug("agent-network:connector:msg");
@@ -214,8 +214,12 @@ export class ConnectorClient extends EventEmitter {
214
214
  if (isDeliveryCursor(parsed)) {
215
215
  const floor = this.lastKnownSeq ?? 0;
216
216
  dbg("DELIVERY_CURSOR deliverySeq=%d deliveredSeq=%s local=%d", parsed.deliverySeq, parsed.deliveredSeq ?? "none", floor);
217
- if (parsed.deliverySeq > floor) {
218
- this.requestGapFill(floor);
217
+ if (parsed.deliveredSeq !== undefined && parsed.deliveredSeq > floor) {
218
+ this.adoptDeliveredFloor(parsed.deliveredSeq);
219
+ }
220
+ const reconciledFloor = this.lastKnownSeq ?? 0;
221
+ if (parsed.deliverySeq > reconciledFloor) {
222
+ this.requestGapFill(reconciledFloor);
219
223
  }
220
224
  else if (parsed.deliveredSeq !== undefined &&
221
225
  this.lastKnownSeq !== undefined &&
@@ -224,6 +228,11 @@ export class ConnectorClient extends EventEmitter {
224
228
  }
225
229
  return;
226
230
  }
231
+ if (isDeliverySkip(parsed)) {
232
+ dbg("DELIVERY_SKIP seq=%d reason=%s messageId=%s", parsed.seq, parsed.reason, parsed.messageId ?? "none");
233
+ this.handleDeliverySkip(parsed);
234
+ return;
235
+ }
227
236
  if (isStructuredError(parsed)) {
228
237
  dbg("ERROR code=%s message=%s", parsed.code, parsed.message);
229
238
  this.handleStructuredError(parsed);
@@ -249,13 +258,45 @@ export class ConnectorClient extends EventEmitter {
249
258
  }
250
259
  this.acceptContiguous(message);
251
260
  }
261
+ handleDeliverySkip(event) {
262
+ const floor = this.lastKnownSeq ?? 0;
263
+ if (event.seq <= floor)
264
+ return;
265
+ if (event.seq > floor + 1) {
266
+ this.requestGapFill(floor);
267
+ return;
268
+ }
269
+ this.lastKnownSeq = event.seq;
270
+ this.drainPendingSeqMessagesFrom(event.seq + 1);
271
+ this.ackDelivery(this.lastKnownSeq);
272
+ }
273
+ adoptDeliveredFloor(seq) {
274
+ if (!Number.isInteger(seq) || seq < 0)
275
+ return;
276
+ const floor = this.lastKnownSeq ?? 0;
277
+ if (seq <= floor)
278
+ return;
279
+ this.lastKnownSeq = seq;
280
+ for (const pendingSeq of [...this.pendingSeqMessages.keys()]) {
281
+ if (pendingSeq <= seq)
282
+ this.pendingSeqMessages.delete(pendingSeq);
283
+ }
284
+ this.drainPendingSeqMessagesFrom(seq + 1);
285
+ if (this.lastKnownSeq > seq) {
286
+ this.ackDelivery(this.lastKnownSeq);
287
+ }
288
+ }
252
289
  acceptContiguous(message) {
253
290
  const seq = message.seq;
254
291
  if (typeof seq !== "number")
255
292
  return;
256
293
  this.emit("message_received", message);
257
294
  this.lastKnownSeq = seq;
258
- let next = seq + 1;
295
+ this.drainPendingSeqMessagesFrom(seq + 1);
296
+ this.ackDelivery(this.lastKnownSeq);
297
+ }
298
+ drainPendingSeqMessagesFrom(startSeq) {
299
+ let next = startSeq;
259
300
  while (this.pendingSeqMessages.has(next)) {
260
301
  const pending = this.pendingSeqMessages.get(next);
261
302
  this.pendingSeqMessages.delete(next);
@@ -265,7 +306,6 @@ export class ConnectorClient extends EventEmitter {
265
306
  this.lastKnownSeq = next;
266
307
  next++;
267
308
  }
268
- this.ackDelivery(next - 1);
269
309
  }
270
310
  rememberPayloadId(payloadId) {
271
311
  if (this.seenPayloadIds.has(payloadId))
@@ -292,13 +332,13 @@ export class ConnectorClient extends EventEmitter {
292
332
  }
293
333
  setEnvironmentContext(ack.agent, ack.owner);
294
334
  if (typeof ack.deliverySeq === "number" &&
295
- (this.lastKnownSeq === undefined || ack.deliverySeq > this.lastKnownSeq)) {
335
+ this.lastKnownSeq === undefined) {
296
336
  this.lastKnownSeq = ack.deliverySeq;
297
337
  for (const seq of [...this.pendingSeqMessages.keys()]) {
298
338
  if (seq <= ack.deliverySeq)
299
339
  this.pendingSeqMessages.delete(seq);
300
340
  }
301
- dbg("delivery cursor reconciled: %d", ack.deliverySeq);
341
+ dbg("delivery cursor initialized from register ack: %d", ack.deliverySeq);
302
342
  }
303
343
  else if (typeof ack.deliverySeq === "number" &&
304
344
  this.lastKnownSeq !== undefined &&
@@ -1 +1 @@
1
- {"version":3,"file":"connector-url-boundary.d.ts","sourceRoot":"","sources":["../src/connector-url-boundary.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,kCAAkC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAGrE,CAAC;AAEF,eAAO,MAAM,qCAAqC,aAGhD,CAAC;AAEH,qBAAa,8BAA+B,SAAQ,KAAK;IAC9C,IAAI,SAAoC;CAClD;AA+CD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,GAAG,MAAM,CA4BT;AAKD,eAAO,MAAM,2CAA2C,EAAE,MAAM,CAC9D,MAAM,EACN,MAAM,CAIP,CAAC;AAaF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,MAAM,CAOT"}
1
+ {"version":3,"file":"connector-url-boundary.d.ts","sourceRoot":"","sources":["../src/connector-url-boundary.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,kCAAkC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAGrE,CAAC;AAEF,eAAO,MAAM,qCAAqC,aAGhD,CAAC;AAEH,qBAAa,8BAA+B,SAAQ,KAAK;IAC9C,IAAI,SAAoC;CAClD;AA+CD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,GAAG,MAAM,CA4BT;AAKD,eAAO,MAAM,2CAA2C,EAAE,MAAM,CAC9D,MAAM,EACN,MAAM,CAIP,CAAC;AAgBF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,MAAM,CAWT"}
@@ -74,6 +74,6 @@ export function resolveMstpAuthority(input) {
74
74
  return cloudAuthority;
75
75
  const parsed = parseUrl(input.connectorUrl);
76
76
  if (parsed)
77
- return parsed.hostname;
77
+ return parsed.host;
78
78
  return input.connectorUrl.replace(/^wss?:\/\//, "").replace(/\/.*$/, "");
79
79
  }
@@ -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;AAS7E,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;IAoCtB,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;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,6 +1,7 @@
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
5
  const dbg = createDebug("agent-network:conversation-manager");
5
6
  const ERROR_MESSAGES = {
6
7
  ADDRESS_NOT_FOUND: "Cannot find agent '{to}'. Check the handle.",
@@ -26,10 +27,17 @@ export class ConversationManager {
26
27
  }
27
28
  async send(contact, content, metadata) {
28
29
  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`);
35
+ }
36
+ }
29
37
  try {
30
- const ack = await this.client.send(address, content, "text", metadata);
38
+ const ack = await this.client.send(address, content, "text", trace.metadata);
31
39
  this.ensureConversationEntry(this.extractHandle(address), address, "local");
32
- dbg("send contact=%s address=%s status=%s", contact, address, ack.status);
40
+ dbg("send contact=%s address=%s status=%s traceId=%s spanName=send", contact, address, ack.status, trace.traceId);
33
41
  return { status: "sent" };
34
42
  }
35
43
  catch (err) {
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export { AUTHORIZED_TOKEN_TTL_MS, SETUP_CODE_CHARSET, SETUP_CODE_LENGTH, SETUP_CODE_TTL_MS, } from "./constants.js";
2
2
  export type { AgentNetworkAccount } from "./config-schema.js";
3
- export type { AddressedMessageEvent, DeliveryPendingEvent, DeliveryStatusEvent, RegisterAckEvent, SendAckEvent, StructuredErrorEvent, } from "./types.js";
3
+ export type { AddressedMessageEvent, DeliveryPendingEvent, DeliverySkipEvent, DeliveryStatusEvent, RegisterAckEvent, SendAckEvent, StructuredErrorEvent, } from "./types.js";
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAIxB,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAIxB,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type TraceparentReason } from "./_vendor/trace-context.js";
2
+ export interface TraceMetadataResult {
3
+ metadata: Record<string, unknown>;
4
+ traceId: string;
5
+ degraded: boolean;
6
+ reason: TraceparentReason;
7
+ }
8
+ export declare function ensureTraceMetadata(metadata: Record<string, unknown> | undefined): TraceMetadataResult;
9
+ export interface ReplyTraceMetadataResult {
10
+ metadata: Record<string, unknown>;
11
+ traceId: string;
12
+ originalTraceId?: string;
13
+ }
14
+ export declare function createReplyTraceMetadata(inboundMetadata: Record<string, unknown>, replyMetadata?: Record<string, unknown>): ReplyTraceMetadataResult;
15
+ //# sourceMappingURL=trace-metadata.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,36 @@
1
+ import { ensureTraceparent, extractTraceId, mintTraceparent, } from "./_vendor/trace-context.js";
2
+ function readTraceparent(metadata) {
3
+ return typeof metadata?.traceparent === "string"
4
+ ? metadata.traceparent
5
+ : undefined;
6
+ }
7
+ export function ensureTraceMetadata(metadata) {
8
+ const ensured = ensureTraceparent(readTraceparent(metadata));
9
+ return {
10
+ metadata: {
11
+ ...(metadata ?? {}),
12
+ traceparent: ensured.traceparent,
13
+ },
14
+ traceId: ensured.traceId,
15
+ degraded: ensured.degraded,
16
+ reason: ensured.reason,
17
+ };
18
+ }
19
+ export function createReplyTraceMetadata(inboundMetadata, replyMetadata = {}) {
20
+ const traceparent = mintTraceparent();
21
+ const traceId = extractTraceId(traceparent);
22
+ if (traceId === null) {
23
+ throw new Error("mintTraceparent returned an invalid traceparent");
24
+ }
25
+ const originalTraceId = extractTraceId(readTraceparent(inboundMetadata));
26
+ const { originalTraceId: _ignoredOriginalTraceId, ...safeReplyMetadata } = replyMetadata;
27
+ return {
28
+ metadata: {
29
+ ...safeReplyMetadata,
30
+ traceparent,
31
+ ...(originalTraceId !== null && { originalTraceId }),
32
+ },
33
+ traceId,
34
+ ...(originalTraceId !== null && { originalTraceId }),
35
+ };
36
+ }
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export declare const CURRENT_PROTOCOL_VERSION = 3;
1
+ export declare const CURRENT_PROTOCOL_VERSION = 4;
2
2
  export declare const REGISTER_ACK_TIMEOUT_MS = 15000;
3
3
  export declare const SEND_ACK_TIMEOUT_MS = 15000;
4
4
  export interface RegisterEvent {
@@ -6,6 +6,7 @@ export interface RegisterEvent {
6
6
  token: string;
7
7
  protocolVersion: number;
8
8
  clientVersion?: string;
9
+ runtimeSessionId?: string;
9
10
  lastKnownSeq?: number;
10
11
  }
11
12
  export interface AddressedSendEvent {
@@ -23,10 +24,12 @@ export interface AddressedTypingEvent {
23
24
  }
24
25
  export interface AddressedDeliveryAckEvent {
25
26
  event: "DELIVERY_ACK";
27
+ runtimeSessionId?: string;
26
28
  upToSeq: number;
27
29
  }
28
30
  export interface RequestGapFillEvent {
29
31
  event: "REQUEST_GAP_FILL";
32
+ runtimeSessionId?: string;
30
33
  sinceSeq: number;
31
34
  }
32
35
  export interface RegisterAckEvent {
@@ -52,6 +55,7 @@ export interface SendAckEvent {
52
55
  export interface AddressedMessageEvent {
53
56
  event: "MESSAGE_RECEIVED";
54
57
  messageId?: string;
58
+ runtimeSessionId?: string;
55
59
  from: string;
56
60
  content: string;
57
61
  contentType: string;
@@ -86,16 +90,26 @@ export interface DeliveryStatusEvent {
86
90
  }
87
91
  export interface DeliveryCursorEvent {
88
92
  event: "DELIVERY_CURSOR";
93
+ runtimeSessionId?: string;
89
94
  deliverySeq: number;
90
95
  deliveredSeq?: number;
91
96
  }
97
+ export interface DeliverySkipEvent {
98
+ event: "DELIVERY_SKIP";
99
+ runtimeSessionId?: string;
100
+ seq: number;
101
+ reason: "runtime_mailbox_dismissed";
102
+ messageId?: string;
103
+ deliveredAt?: string;
104
+ }
92
105
  export type PluginToConnectorEvent = RegisterEvent | AddressedSendEvent | AddressedTypingEvent | AddressedDeliveryAckEvent | RequestGapFillEvent;
93
- export type ConnectorToPluginEvent = RegisterAckEvent | SendAckEvent | AddressedMessageEvent | DeliveryPendingEvent | DeliveryStatusEvent | DeliveryCursorEvent | StructuredErrorEvent;
106
+ export type ConnectorToPluginEvent = RegisterAckEvent | SendAckEvent | AddressedMessageEvent | DeliveryPendingEvent | DeliveryStatusEvent | DeliveryCursorEvent | DeliverySkipEvent | StructuredErrorEvent;
94
107
  export declare function isRegisterAck(data: unknown): data is RegisterAckEvent;
95
108
  export declare function isSendAck(data: unknown): data is SendAckEvent;
96
109
  export declare function isAddressedMessage(data: unknown): data is AddressedMessageEvent;
97
110
  export declare function isDeliveryPending(data: unknown): data is DeliveryPendingEvent;
98
111
  export declare function isDeliveryStatus(data: unknown): data is DeliveryStatusEvent;
99
112
  export declare function isDeliveryCursor(data: unknown): data is DeliveryCursorEvent;
113
+ export declare function isDeliverySkip(data: unknown): data is DeliverySkipEvent;
100
114
  export declare function isStructuredError(data: unknown): data is StructuredErrorEvent;
101
115
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js CHANGED
@@ -1,9 +1,14 @@
1
- export const CURRENT_PROTOCOL_VERSION = 3;
1
+ export const CURRENT_PROTOCOL_VERSION = 4;
2
2
  export const REGISTER_ACK_TIMEOUT_MS = 15_000;
3
3
  export const SEND_ACK_TIMEOUT_MS = 15_000;
4
4
  function isObject(data) {
5
5
  return typeof data === "object" && data !== null;
6
6
  }
7
+ function hasValidOptionalRuntimeSessionId(data) {
8
+ return (data.runtimeSessionId === undefined ||
9
+ (typeof data.runtimeSessionId === "string" &&
10
+ data.runtimeSessionId.trim().length > 0));
11
+ }
7
12
  export function isRegisterAck(data) {
8
13
  return isObject(data) && data.event === "REGISTER_ACK";
9
14
  }
@@ -15,6 +20,7 @@ export function isSendAck(data) {
15
20
  export function isAddressedMessage(data) {
16
21
  return (isObject(data) &&
17
22
  data.event === "MESSAGE_RECEIVED" &&
23
+ hasValidOptionalRuntimeSessionId(data) &&
18
24
  (data.messageId === undefined || typeof data.messageId === "string") &&
19
25
  typeof data.from === "string" &&
20
26
  typeof data.content === "string");
@@ -34,6 +40,7 @@ export function isDeliveryStatus(data) {
34
40
  export function isDeliveryCursor(data) {
35
41
  return (isObject(data) &&
36
42
  data.event === "DELIVERY_CURSOR" &&
43
+ hasValidOptionalRuntimeSessionId(data) &&
37
44
  typeof data.deliverySeq === "number" &&
38
45
  Number.isInteger(data.deliverySeq) &&
39
46
  data.deliverySeq >= 0 &&
@@ -42,6 +49,17 @@ export function isDeliveryCursor(data) {
42
49
  Number.isInteger(data.deliveredSeq) &&
43
50
  data.deliveredSeq >= 0)));
44
51
  }
52
+ export function isDeliverySkip(data) {
53
+ return (isObject(data) &&
54
+ data.event === "DELIVERY_SKIP" &&
55
+ hasValidOptionalRuntimeSessionId(data) &&
56
+ typeof data.seq === "number" &&
57
+ Number.isInteger(data.seq) &&
58
+ data.seq >= 0 &&
59
+ data.reason === "runtime_mailbox_dismissed" &&
60
+ (data.messageId === undefined || typeof data.messageId === "string") &&
61
+ (data.deliveredAt === undefined || typeof data.deliveredAt === "string"));
62
+ }
45
63
  export function isStructuredError(data) {
46
64
  return (isObject(data) &&
47
65
  data.event === "ERROR" &&
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const PLUGIN_VERSION = "0.6.2";
1
+ export declare const PLUGIN_VERSION = "0.6.4";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export const PLUGIN_VERSION = "0.6.2";
1
+ export const PLUGIN_VERSION = "0.6.4";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@masons/agent-network",
3
- "version": "0.6.2",
3
+ "version": "0.6.4",
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)",
@@ -24,10 +24,10 @@
24
24
  "scripts": {
25
25
  "build": "tsc",
26
26
  "dev": "tsc --watch",
27
- "test": "tsc -p test/tsconfig.json && node --test --loader ts-node/esm 'test/**/*.test.ts'",
27
+ "test": "node ../../scripts/sync-vendored-trace-context.mjs && tsc -p test/tsconfig.json && node --test --loader ts-node/esm 'test/**/*.test.ts'",
28
28
  "lint": "biome check",
29
29
  "format": "biome format --write",
30
- "prepublishOnly": "bash scripts/check-version.sh && npm run build && npm run test",
30
+ "prepublishOnly": "node ../../scripts/sync-vendored-trace-context.mjs && bash scripts/check-version.sh && npm run build && npm run test",
31
31
  "release": "pnpm publish --access public"
32
32
  },
33
33
  "files": [