@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.
- package/dist/channel.d.ts.map +1 -1
- package/dist/channel.js +166 -197
- package/dist/config.d.ts +5 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -4
- package/dist/connector-client.d.ts +46 -24
- package/dist/connector-client.d.ts.map +1 -1
- package/dist/connector-client.js +123 -76
- package/dist/conversation-manager.d.ts +40 -33
- package/dist/conversation-manager.d.ts.map +1 -1
- package/dist/conversation-manager.js +103 -80
- package/dist/handle-utils.d.ts +16 -0
- package/dist/handle-utils.d.ts.map +1 -0
- package/dist/handle-utils.js +25 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/owner-session-state.d.ts +11 -18
- package/dist/owner-session-state.d.ts.map +1 -1
- package/dist/owner-session-state.js +17 -26
- package/dist/tools.d.ts +1 -2
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +2 -33
- package/dist/types.d.ts +47 -58
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +18 -33
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
package/dist/channel.d.ts.map
CHANGED
|
@@ -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;
|
|
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 {
|
|
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
|
|
15
|
+
* Resolution order:
|
|
18
16
|
* 1. `metadata.visitor_name` — display name for Passport browser visitors
|
|
19
|
-
*
|
|
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
|
-
//
|
|
34
|
-
|
|
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
|
|
116
|
-
// ConversationManager.send() handles
|
|
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
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
-
// ---
|
|
277
|
-
//
|
|
278
|
-
//
|
|
279
|
-
client.on("
|
|
280
|
-
|
|
281
|
-
|
|
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
|
-
// ---
|
|
307
|
-
//
|
|
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
|
-
|
|
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()`
|
|
55
|
-
*
|
|
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()`
|
|
69
|
-
*
|
|
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
|
/**
|
package/dist/config.d.ts.map
CHANGED
|
@@ -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
|
|
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()`
|
|
121
|
-
*
|
|
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()`
|
|
142
|
-
*
|
|
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
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
58
|
-
|
|
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
|
-
|
|
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":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,
|
|
1
|
+
{"version":3,"file":"connector-client.d.ts","sourceRoot":"","sources":["../src/connector-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAEL,KAAK,qBAAqB,EAI1B,KAAK,oBAAoB,EAUzB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EAC1B,MAAM,YAAY,CAAC;AAepB;;;GAGG;AACH,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,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;IAEnE,gEAAgE;IAChE,OAAO,CAAC,YAAY,CAOhB;gBAEQ,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAQtC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IASxB,UAAU,IAAI,IAAI;IAiBlB;;;;;;OAMG;IACH,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;IA4BxB;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO;IAOlD;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IASlC,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;IAmBjB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,aAAa,CAgBnB;IAEF,6CAA6C;IAC7C,OAAO,CAAC,iBAAiB;IAgCzB,OAAO,CAAC,iBAAiB;IA8CzB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAUrB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAoB7B,OAAO,CAAC,WAAW,CAqBjB;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;IAqBzB,wCAAwC;IACxC,OAAO,CAAC,SAAS;CAclB"}
|