@contextvm/sdk 0.11.8 → 0.11.9
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/esm/core/utils/base64.d.ts +3 -0
- package/dist/esm/core/utils/base64.d.ts.map +1 -0
- package/dist/esm/core/utils/base64.js +24 -0
- package/dist/esm/core/utils/base64.js.map +1 -0
- package/dist/esm/payments/handlers/ln-bolt11-lnbits-payment-handler.d.ts.map +1 -1
- package/dist/esm/payments/handlers/ln-bolt11-lnbits-payment-handler.js +2 -1
- package/dist/esm/payments/handlers/ln-bolt11-lnbits-payment-handler.js.map +1 -1
- package/dist/esm/payments/processors/ln-bolt11-lnbits-payment-processor.d.ts.map +1 -1
- package/dist/esm/payments/processors/ln-bolt11-lnbits-payment-processor.js +2 -1
- package/dist/esm/payments/processors/ln-bolt11-lnbits-payment-processor.js.map +1 -1
- package/dist/esm/transport/capability-negotiator.d.ts +141 -0
- package/dist/esm/transport/capability-negotiator.d.ts.map +1 -0
- package/dist/esm/transport/capability-negotiator.js +198 -0
- package/dist/esm/transport/capability-negotiator.js.map +1 -0
- package/dist/esm/transport/middleware.d.ts +9 -0
- package/dist/esm/transport/middleware.d.ts.map +1 -0
- package/dist/esm/transport/middleware.js +2 -0
- package/dist/esm/transport/middleware.js.map +1 -0
- package/dist/esm/transport/nostr-client/event-pipeline.d.ts +29 -0
- package/dist/esm/transport/nostr-client/event-pipeline.d.ts.map +1 -0
- package/dist/esm/transport/nostr-client/event-pipeline.js +109 -0
- package/dist/esm/transport/nostr-client/event-pipeline.js.map +1 -0
- package/dist/esm/transport/nostr-client/inbound-coordinator.d.ts +37 -0
- package/dist/esm/transport/nostr-client/inbound-coordinator.d.ts.map +1 -0
- package/dist/esm/transport/nostr-client/inbound-coordinator.js +159 -0
- package/dist/esm/transport/nostr-client/inbound-coordinator.js.map +1 -0
- package/dist/esm/transport/nostr-client/inbound-notification-dispatcher.d.ts +28 -0
- package/dist/esm/transport/nostr-client/inbound-notification-dispatcher.d.ts.map +1 -0
- package/dist/esm/transport/nostr-client/inbound-notification-dispatcher.js +65 -0
- package/dist/esm/transport/nostr-client/inbound-notification-dispatcher.js.map +1 -0
- package/dist/esm/transport/nostr-client/open-stream-factory.d.ts +36 -0
- package/dist/esm/transport/nostr-client/open-stream-factory.d.ts.map +1 -0
- package/dist/esm/transport/nostr-client/open-stream-factory.js +126 -0
- package/dist/esm/transport/nostr-client/open-stream-factory.js.map +1 -0
- package/dist/esm/transport/nostr-client/outbound-sender.d.ts +45 -0
- package/dist/esm/transport/nostr-client/outbound-sender.d.ts.map +1 -0
- package/dist/esm/transport/nostr-client/outbound-sender.js +105 -0
- package/dist/esm/transport/nostr-client/outbound-sender.js.map +1 -0
- package/dist/esm/transport/nostr-client/server-metadata-store.d.ts +35 -0
- package/dist/esm/transport/nostr-client/server-metadata-store.d.ts.map +1 -0
- package/dist/esm/transport/nostr-client/server-metadata-store.js +107 -0
- package/dist/esm/transport/nostr-client/server-metadata-store.js.map +1 -0
- package/dist/esm/transport/nostr-client-transport.d.ts +18 -41
- package/dist/esm/transport/nostr-client-transport.d.ts.map +1 -1
- package/dist/esm/transport/nostr-client-transport.js +117 -553
- package/dist/esm/transport/nostr-client-transport.js.map +1 -1
- package/dist/esm/transport/nostr-server/correlation-store.d.ts +2 -2
- package/dist/esm/transport/nostr-server/correlation-store.d.ts.map +1 -1
- package/dist/esm/transport/nostr-server/correlation-store.js +12 -3
- package/dist/esm/transport/nostr-server/correlation-store.js.map +1 -1
- package/dist/esm/transport/nostr-server/event-pipeline.d.ts +32 -0
- package/dist/esm/transport/nostr-server/event-pipeline.d.ts.map +1 -0
- package/dist/esm/transport/nostr-server/event-pipeline.js +118 -0
- package/dist/esm/transport/nostr-server/event-pipeline.js.map +1 -0
- package/dist/esm/transport/nostr-server/inbound-coordinator.d.ts +56 -0
- package/dist/esm/transport/nostr-server/inbound-coordinator.d.ts.map +1 -0
- package/dist/esm/transport/nostr-server/inbound-coordinator.js +168 -0
- package/dist/esm/transport/nostr-server/inbound-coordinator.js.map +1 -0
- package/dist/esm/transport/nostr-server/inbound-notification-dispatcher.d.ts +44 -0
- package/dist/esm/transport/nostr-server/inbound-notification-dispatcher.d.ts.map +1 -0
- package/dist/esm/transport/nostr-server/inbound-notification-dispatcher.js +153 -0
- package/dist/esm/transport/nostr-server/inbound-notification-dispatcher.js.map +1 -0
- package/dist/esm/transport/nostr-server/open-stream-factory.d.ts +81 -0
- package/dist/esm/transport/nostr-server/open-stream-factory.d.ts.map +1 -0
- package/dist/esm/transport/nostr-server/open-stream-factory.js +224 -0
- package/dist/esm/transport/nostr-server/open-stream-factory.js.map +1 -0
- package/dist/esm/transport/nostr-server/outbound-notification-broadcaster.d.ts +24 -0
- package/dist/esm/transport/nostr-server/outbound-notification-broadcaster.d.ts.map +1 -0
- package/dist/esm/transport/nostr-server/outbound-notification-broadcaster.js +64 -0
- package/dist/esm/transport/nostr-server/outbound-notification-broadcaster.js.map +1 -0
- package/dist/esm/transport/nostr-server/outbound-response-router.d.ts +62 -0
- package/dist/esm/transport/nostr-server/outbound-response-router.d.ts.map +1 -0
- package/dist/esm/transport/nostr-server/outbound-response-router.js +125 -0
- package/dist/esm/transport/nostr-server/outbound-response-router.js.map +1 -0
- package/dist/esm/transport/nostr-server-transport.d.ts +15 -62
- package/dist/esm/transport/nostr-server-transport.d.ts.map +1 -1
- package/dist/esm/transport/nostr-server-transport.js +121 -741
- package/dist/esm/transport/nostr-server-transport.js.map +1 -1
- package/dist/esm/transport/open-stream/registry.d.ts.map +1 -1
- package/dist/esm/transport/open-stream/registry.js +7 -1
- package/dist/esm/transport/open-stream/registry.js.map +1 -1
- package/dist/esm/transport/open-stream/session.d.ts +1 -0
- package/dist/esm/transport/open-stream/session.d.ts.map +1 -1
- package/dist/esm/transport/open-stream/session.js +14 -4
- package/dist/esm/transport/open-stream/session.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-pipeline.js","sourceRoot":"","sources":["../../../../src/transport/nostr-client/event-pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { type NostrEvent } from 'nostr-tools';
|
|
3
|
+
import { type Logger } from '../../core/utils/logger.js';
|
|
4
|
+
import { type ClientCapabilityNegotiator } from '../capability-negotiator.js';
|
|
5
|
+
import { type ClientCorrelationStore } from './correlation-store.js';
|
|
6
|
+
import { type UnwrappedClientEvent } from './event-pipeline.js';
|
|
7
|
+
import { type ClientInboundNotificationDispatcher } from './inbound-notification-dispatcher.js';
|
|
8
|
+
import { type ServerMetadataStore } from './server-metadata-store.js';
|
|
9
|
+
export interface ClientInboundCoordinatorDeps {
|
|
10
|
+
capabilityNegotiator: ClientCapabilityNegotiator;
|
|
11
|
+
correlationStore: ClientCorrelationStore;
|
|
12
|
+
notificationDispatcher: ClientInboundNotificationDispatcher;
|
|
13
|
+
metadataStore: ServerMetadataStore;
|
|
14
|
+
unwrapEvent: (event: NostrEvent) => Promise<UnwrappedClientEvent | null>;
|
|
15
|
+
convertNostrEventToMcpMessage: (event: NostrEvent) => JSONRPCMessage | null;
|
|
16
|
+
handleResponse: (correlatedEventId: string, msg: JSONRPCMessage) => void;
|
|
17
|
+
handleNotification: (eventId: string, correlatedEventId: string | undefined, msg: JSONRPCMessage) => void;
|
|
18
|
+
logger: Logger;
|
|
19
|
+
onerror?: (error: Error) => void;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Owns the inbound protocol workflow for the client: discovery learning,
|
|
23
|
+
* initialize tracking, message classification, and response routing.
|
|
24
|
+
*/
|
|
25
|
+
export declare class ClientInboundCoordinator {
|
|
26
|
+
private deps;
|
|
27
|
+
constructor(deps: ClientInboundCoordinatorDeps);
|
|
28
|
+
/**
|
|
29
|
+
* Processes an inbound Nostr event by unwrapping, validating, and routing it.
|
|
30
|
+
*/
|
|
31
|
+
processIncomingEvent(event: NostrEvent): Promise<void>;
|
|
32
|
+
private learnServerDiscovery;
|
|
33
|
+
private trySetInitializeEventFromResponse;
|
|
34
|
+
private setInitializeEvent;
|
|
35
|
+
private getInitializeResultCandidate;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=inbound-coordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbound-coordinator.d.ts","sourceRoot":"","sources":["../../../../src/transport/nostr-client/inbound-coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,cAAc,EAIpB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,EACL,KAAK,0BAA0B,EAEhC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,KAAK,mCAAmC,EAAE,MAAM,sCAAsC,CAAC;AAChG,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,MAAM,WAAW,4BAA4B;IAC3C,oBAAoB,EAAE,0BAA0B,CAAC;IACjD,gBAAgB,EAAE,sBAAsB,CAAC;IACzC,sBAAsB,EAAE,mCAAmC,CAAC;IAC5D,aAAa,EAAE,mBAAmB,CAAC;IACnC,WAAW,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IACzE,6BAA6B,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,cAAc,GAAG,IAAI,CAAC;IAC5E,cAAc,EAAE,CAAC,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,KAAK,IAAI,CAAC;IACzE,kBAAkB,EAAE,CAClB,OAAO,EAAE,MAAM,EACf,iBAAiB,EAAE,MAAM,GAAG,SAAS,EACrC,GAAG,EAAE,cAAc,KAChB,IAAI,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED;;;GAGG;AACH,qBAAa,wBAAwB;IACvB,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,4BAA4B;IAEtD;;OAEG;IACU,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAiInE,OAAO,CAAC,oBAAoB;IAiD5B,OAAO,CAAC,iCAAiC;IAiBzC,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,4BAA4B;CAYrC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { InitializeResultSchema, ListPromptsResultSchema, ListResourcesResultSchema, ListResourceTemplatesResultSchema, ListToolsResultSchema, isJSONRPCResultResponse, isJSONRPCErrorResponse, isJSONRPCNotification, } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { getNostrEventTag } from '../../core/utils/serializers.js';
|
|
3
|
+
import { parseDiscoveredPeerCapabilities, } from '../capability-negotiator.js';
|
|
4
|
+
/**
|
|
5
|
+
* Owns the inbound protocol workflow for the client: discovery learning,
|
|
6
|
+
* initialize tracking, message classification, and response routing.
|
|
7
|
+
*/
|
|
8
|
+
export class ClientInboundCoordinator {
|
|
9
|
+
constructor(deps) {
|
|
10
|
+
this.deps = deps;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Processes an inbound Nostr event by unwrapping, validating, and routing it.
|
|
14
|
+
*/
|
|
15
|
+
async processIncomingEvent(event) {
|
|
16
|
+
var _a, _b;
|
|
17
|
+
try {
|
|
18
|
+
const unwrapped = await this.deps.unwrapEvent(event);
|
|
19
|
+
if (!unwrapped) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const nostrEvent = unwrapped.event;
|
|
23
|
+
this.learnServerDiscovery(nostrEvent);
|
|
24
|
+
const eTag = getNostrEventTag(nostrEvent.tags, 'e');
|
|
25
|
+
if (!this.deps.metadataStore.getServerInitializeEvent() && eTag) {
|
|
26
|
+
this.trySetInitializeEventFromResponse(nostrEvent);
|
|
27
|
+
}
|
|
28
|
+
const mcpMessage = this.deps.convertNostrEventToMcpMessage(nostrEvent);
|
|
29
|
+
if (!mcpMessage) {
|
|
30
|
+
this.deps.logger.error('Skipping invalid Nostr event with malformed JSON content', { eventId: nostrEvent.id, pubkey: nostrEvent.pubkey });
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// CEP-22/41 Interception
|
|
34
|
+
if (this.deps.notificationDispatcher.tryIntercept(mcpMessage, nostrEvent.id, eTag !== null && eTag !== void 0 ? eTag : undefined)) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// Message classification MUST be based on JSON-RPC type, not on the presence of an `e` tag.
|
|
38
|
+
// CEP-8 notifications are correlated (include `e`) but are still notifications.
|
|
39
|
+
if (isJSONRPCResultResponse(mcpMessage) ||
|
|
40
|
+
isJSONRPCErrorResponse(mcpMessage)) {
|
|
41
|
+
if (!eTag) {
|
|
42
|
+
this.deps.logger.warn('Received JSON-RPC response without correlation `e` tag', {
|
|
43
|
+
eventId: nostrEvent.id,
|
|
44
|
+
});
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (!this.deps.correlationStore.hasPendingRequest(eTag)) {
|
|
48
|
+
this.deps.logger.warn('Received response for unknown/expired request', {
|
|
49
|
+
eventId: nostrEvent.id,
|
|
50
|
+
eTag,
|
|
51
|
+
reason: 'Request not found in pending set - may be duplicate or late response',
|
|
52
|
+
});
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// Capture outer Nostr event envelope for capability list JSON-RPC responses.
|
|
56
|
+
// This allows consumers to inspect Nostr tags (e.g. CEP-8 `cap` tags)
|
|
57
|
+
// that are not present in the JSON-RPC payload.
|
|
58
|
+
if (isJSONRPCResultResponse(mcpMessage)) {
|
|
59
|
+
const result = mcpMessage.result;
|
|
60
|
+
if (ListToolsResultSchema.safeParse(result).success) {
|
|
61
|
+
this.deps.metadataStore.updateListEnvelopeState('tools', nostrEvent);
|
|
62
|
+
}
|
|
63
|
+
else if (ListResourcesResultSchema.safeParse(result).success) {
|
|
64
|
+
this.deps.metadataStore.updateListEnvelopeState('resources', nostrEvent);
|
|
65
|
+
}
|
|
66
|
+
else if (ListResourceTemplatesResultSchema.safeParse(result).success) {
|
|
67
|
+
this.deps.metadataStore.updateListEnvelopeState('templates', nostrEvent);
|
|
68
|
+
}
|
|
69
|
+
else if (ListPromptsResultSchema.safeParse(result).success) {
|
|
70
|
+
this.deps.metadataStore.updateListEnvelopeState('prompts', nostrEvent);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
this.deps.handleResponse(eTag, mcpMessage);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (isJSONRPCNotification(mcpMessage)) {
|
|
77
|
+
this.deps.handleNotification(nostrEvent.id, eTag !== null && eTag !== void 0 ? eTag : undefined, mcpMessage);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
this.deps.logger.warn('Received unsupported JSON-RPC message type', {
|
|
81
|
+
eventId: nostrEvent.id,
|
|
82
|
+
hasETag: !!eTag,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
this.deps.logger.error('Error handling incoming Nostr event', {
|
|
87
|
+
error: error instanceof Error ? error.message : String(error),
|
|
88
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
89
|
+
eventId: event.id,
|
|
90
|
+
pubkey: event.pubkey,
|
|
91
|
+
kind: event.kind,
|
|
92
|
+
});
|
|
93
|
+
(_b = (_a = this.deps).onerror) === null || _b === void 0 ? void 0 : _b.call(_a, error instanceof Error
|
|
94
|
+
? error
|
|
95
|
+
: new Error('Failed to handle incoming Nostr event'));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
learnServerDiscovery(event) {
|
|
99
|
+
if (!Array.isArray(event.tags)) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const discovered = parseDiscoveredPeerCapabilities(event.tags);
|
|
103
|
+
if (discovered.discoveryTags.length === 0) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
this.deps.capabilityNegotiator.learnServerCapabilities(discovered);
|
|
107
|
+
this.deps.metadataStore.setSupportsOversizedTransfer(discovered.supportsOversizedTransfer);
|
|
108
|
+
this.deps.metadataStore.setSupportsOpenStream(discovered.supportsOpenStream);
|
|
109
|
+
if (!this.deps.metadataStore.getServerInitializeEvent()) {
|
|
110
|
+
this.setInitializeEvent(event);
|
|
111
|
+
this.deps.logger.info('Learned server discovery tags from inbound event', {
|
|
112
|
+
eventId: event.id,
|
|
113
|
+
});
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const currentHasInitializeResult = InitializeResultSchema.safeParse(this.getInitializeResultCandidate(event)).success;
|
|
117
|
+
const existingHasInitializeResult = InitializeResultSchema.safeParse(this.getInitializeResultCandidate(this.deps.metadataStore.getServerInitializeEvent())).success;
|
|
118
|
+
if (!existingHasInitializeResult && currentHasInitializeResult) {
|
|
119
|
+
this.setInitializeEvent(event);
|
|
120
|
+
this.deps.logger.info('Upgraded learned server discovery event to initialize response', {
|
|
121
|
+
eventId: event.id,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
trySetInitializeEventFromResponse(event) {
|
|
126
|
+
try {
|
|
127
|
+
const content = JSON.parse(event.content);
|
|
128
|
+
const parse = InitializeResultSchema.safeParse(content.result);
|
|
129
|
+
if (parse.success) {
|
|
130
|
+
this.setInitializeEvent(event);
|
|
131
|
+
this.deps.logger.info('Received server initialize event', {
|
|
132
|
+
eventId: event.id,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (_a) {
|
|
137
|
+
this.deps.logger.debug('Event is not a valid initialize response', {
|
|
138
|
+
eventId: event.id,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
setInitializeEvent(event) {
|
|
143
|
+
this.deps.metadataStore.setServerInitializeEvent(event);
|
|
144
|
+
this.deps.capabilityNegotiator.setServerInitializeEvent(event);
|
|
145
|
+
}
|
|
146
|
+
getInitializeResultCandidate(event) {
|
|
147
|
+
if (!event) {
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
const content = JSON.parse(event.content);
|
|
152
|
+
return content.result;
|
|
153
|
+
}
|
|
154
|
+
catch (_a) {
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=inbound-coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbound-coordinator.js","sourceRoot":"","sources":["../../../../src/transport/nostr-client/inbound-coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type JSONRPCMessage, type JSONRPCResponse } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { type Logger } from '../../core/utils/logger.js';
|
|
3
|
+
import { OpenStreamReceiver } from '../open-stream/index.js';
|
|
4
|
+
import { OversizedTransferReceiver } from '../oversized-transfer/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Dependencies for the ClientInboundNotificationDispatcher.
|
|
7
|
+
*/
|
|
8
|
+
export interface ClientInboundNotificationDispatcherDeps {
|
|
9
|
+
openStreamReceiver: OpenStreamReceiver;
|
|
10
|
+
oversizedReceiver: OversizedTransferReceiver;
|
|
11
|
+
handleResponse: (correlatedEventId: string, synthetic: JSONRPCResponse) => void;
|
|
12
|
+
handleNotification: (eventId: string, correlatedEventId: string | undefined, synthetic: JSONRPCMessage) => void;
|
|
13
|
+
logger: Logger;
|
|
14
|
+
onerror?: (error: Error) => void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Intercepts incoming transport-level notifications (CEP-22, CEP-41) for the client.
|
|
18
|
+
*/
|
|
19
|
+
export declare class ClientInboundNotificationDispatcher {
|
|
20
|
+
private deps;
|
|
21
|
+
constructor(deps: ClientInboundNotificationDispatcherDeps);
|
|
22
|
+
/**
|
|
23
|
+
* Returns true if the notification was intercepted (CEP-22 or CEP-41).
|
|
24
|
+
* Returns false if it should fall through to normal processing.
|
|
25
|
+
*/
|
|
26
|
+
tryIntercept(mcpMessage: JSONRPCMessage, eventId: string, correlatedEventId: string | undefined): boolean;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=inbound-notification-dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbound-notification-dispatcher.d.ts","sourceRoot":"","sources":["../../../../src/transport/nostr-client/inbound-notification-dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,eAAe,EAIrB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E;;GAEG;AACH,MAAM,WAAW,uCAAuC;IACtD,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,iBAAiB,EAAE,yBAAyB,CAAC;IAC7C,cAAc,EAAE,CACd,iBAAiB,EAAE,MAAM,EACzB,SAAS,EAAE,eAAe,KACvB,IAAI,CAAC;IACV,kBAAkB,EAAE,CAClB,OAAO,EAAE,MAAM,EACf,iBAAiB,EAAE,MAAM,GAAG,SAAS,EACrC,SAAS,EAAE,cAAc,KACtB,IAAI,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED;;GAEG;AACH,qBAAa,mCAAmC;IAClC,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,uCAAuC;IAEjE;;;OAGG;IACI,YAAY,CACjB,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,MAAM,EACf,iBAAiB,EAAE,MAAM,GAAG,SAAS,GACpC,OAAO;CA8DX"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { isJSONRPCNotification, isJSONRPCResultResponse, isJSONRPCErrorResponse, } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { OpenStreamReceiver } from '../open-stream/index.js';
|
|
3
|
+
import { OversizedTransferReceiver } from '../oversized-transfer/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Intercepts incoming transport-level notifications (CEP-22, CEP-41) for the client.
|
|
6
|
+
*/
|
|
7
|
+
export class ClientInboundNotificationDispatcher {
|
|
8
|
+
constructor(deps) {
|
|
9
|
+
this.deps = deps;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Returns true if the notification was intercepted (CEP-22 or CEP-41).
|
|
13
|
+
* Returns false if it should fall through to normal processing.
|
|
14
|
+
*/
|
|
15
|
+
tryIntercept(mcpMessage, eventId, correlatedEventId) {
|
|
16
|
+
if (isJSONRPCNotification(mcpMessage) &&
|
|
17
|
+
mcpMessage.method === 'notifications/progress' &&
|
|
18
|
+
OpenStreamReceiver.isOpenStreamFrame(mcpMessage)) {
|
|
19
|
+
this.deps.openStreamReceiver
|
|
20
|
+
.processFrame(mcpMessage)
|
|
21
|
+
.catch((err) => {
|
|
22
|
+
var _a, _b;
|
|
23
|
+
this.deps.logger.error('Open stream error (client)', {
|
|
24
|
+
error: err instanceof Error ? err.message : String(err),
|
|
25
|
+
});
|
|
26
|
+
(_b = (_a = this.deps).onerror) === null || _b === void 0 ? void 0 : _b.call(_a, err instanceof Error ? err : new Error(String(err)));
|
|
27
|
+
});
|
|
28
|
+
// Allow progress notifications to fall through to the user's onmessage handler
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
if (isJSONRPCNotification(mcpMessage) &&
|
|
32
|
+
mcpMessage.method === 'notifications/progress' &&
|
|
33
|
+
OversizedTransferReceiver.isOversizedFrame(mcpMessage)) {
|
|
34
|
+
this.deps.oversizedReceiver
|
|
35
|
+
.processFrame(mcpMessage)
|
|
36
|
+
.then((synthetic) => {
|
|
37
|
+
if (synthetic !== null) {
|
|
38
|
+
if (isJSONRPCResultResponse(synthetic) ||
|
|
39
|
+
isJSONRPCErrorResponse(synthetic)) {
|
|
40
|
+
if (correlatedEventId) {
|
|
41
|
+
this.deps.handleResponse(correlatedEventId, synthetic);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
this.deps.logger.warn('Oversized response completed without correlation `e` tag', {
|
|
45
|
+
eventId,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
this.deps.handleNotification(eventId, correlatedEventId, synthetic);
|
|
51
|
+
}
|
|
52
|
+
})
|
|
53
|
+
.catch((err) => {
|
|
54
|
+
var _a, _b;
|
|
55
|
+
this.deps.logger.error('Oversized transfer error (client)', {
|
|
56
|
+
error: err instanceof Error ? err.message : String(err),
|
|
57
|
+
});
|
|
58
|
+
(_b = (_a = this.deps).onerror) === null || _b === void 0 ? void 0 : _b.call(_a, err instanceof Error ? err : new Error(String(err)));
|
|
59
|
+
});
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=inbound-notification-dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbound-notification-dispatcher.js","sourceRoot":"","sources":["../../../../src/transport/nostr-client/inbound-notification-dispatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { OpenStreamReceiver, OpenStreamSession } from '../open-stream/index.js';
|
|
2
|
+
import type { OpenStreamTransportPolicy } from '../open-stream-policy.js';
|
|
3
|
+
import type { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import type { Logger } from '../../core/utils/logger.js';
|
|
5
|
+
/** Dependencies for the ClientOpenStreamFactory. */
|
|
6
|
+
export interface ClientOpenStreamFactoryDeps {
|
|
7
|
+
openStreamEnabled: boolean;
|
|
8
|
+
policy?: OpenStreamTransportPolicy;
|
|
9
|
+
send: (message: JSONRPCMessage) => Promise<void>;
|
|
10
|
+
logger: Logger;
|
|
11
|
+
onerror?: (error: Error) => void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Manages the lifecycle of CEP-41 OpenStream instances for the client transport.
|
|
15
|
+
*
|
|
16
|
+
* Owns the inbound OpenStreamReceiver and exposes helpers for creating
|
|
17
|
+
* outbound sessions with the correct ping/pong/abort wiring.
|
|
18
|
+
*/
|
|
19
|
+
export declare class ClientOpenStreamFactory {
|
|
20
|
+
private readonly receiver;
|
|
21
|
+
private readonly policy;
|
|
22
|
+
private readonly send;
|
|
23
|
+
constructor(deps: ClientOpenStreamFactoryDeps);
|
|
24
|
+
/** Gets the inbound OpenStreamReceiver instance used for CEP-41. */
|
|
25
|
+
getReceiver(): OpenStreamReceiver;
|
|
26
|
+
/** Returns an existing session for a progress token, or undefined. */
|
|
27
|
+
getSession(progressToken: string): OpenStreamSession | undefined;
|
|
28
|
+
/** Returns the session for a progress token, creating it lazily if needed. */
|
|
29
|
+
getOrCreateSession(progressToken: string): OpenStreamSession;
|
|
30
|
+
/**
|
|
31
|
+
* Creates an outbound CEP-41 session whose local ping/pong/abort
|
|
32
|
+
* publishes the corresponding notification to the server.
|
|
33
|
+
*/
|
|
34
|
+
createOutboundSession(progressToken: string): OpenStreamSession;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=open-stream-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-stream-factory.d.ts","sourceRoot":"","sources":["../../../../src/transport/nostr-client/open-stream-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EAIlB,MAAM,yBAAyB,CAAC;AAQjC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEzD,oDAAoD;AACpD,MAAM,WAAW,2BAA2B;IAC1C,iBAAiB,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,yBAAyB,CAAC;IACnC,IAAI,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED;;;;;GAKG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAC/D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6C;gBAEtD,IAAI,EAAE,2BAA2B;IAwD7C,oEAAoE;IAC7D,WAAW,IAAI,kBAAkB;IAIxC,sEAAsE;IAC/D,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAIvE,8EAA8E;IACvE,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,iBAAiB;IAInE;;;OAGG;IACI,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,iBAAiB;CAoDvE"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { OpenStreamReceiver, buildOpenStreamPingFrame, buildOpenStreamPongFrame, buildOpenStreamAbortFrame, } from '../open-stream/index.js';
|
|
2
|
+
import { DEFAULT_OPEN_STREAM_CLOSE_GRACE_PERIOD_MS, DEFAULT_OPEN_STREAM_IDLE_TIMEOUT_MS, DEFAULT_OPEN_STREAM_PROBE_TIMEOUT_MS, DEFAULT_MAX_BUFFERED_BYTES_PER_STREAM, DEFAULT_MAX_BUFFERED_CHUNKS_PER_STREAM, } from '../open-stream/constants.js';
|
|
3
|
+
/**
|
|
4
|
+
* Manages the lifecycle of CEP-41 OpenStream instances for the client transport.
|
|
5
|
+
*
|
|
6
|
+
* Owns the inbound OpenStreamReceiver and exposes helpers for creating
|
|
7
|
+
* outbound sessions with the correct ping/pong/abort wiring.
|
|
8
|
+
*/
|
|
9
|
+
export class ClientOpenStreamFactory {
|
|
10
|
+
constructor(deps) {
|
|
11
|
+
var _a, _b, _c, _d, _e, _f;
|
|
12
|
+
this.policy = deps.policy;
|
|
13
|
+
this.send = deps.send;
|
|
14
|
+
this.receiver = new OpenStreamReceiver({
|
|
15
|
+
maxConcurrentStreams: (_a = deps.policy) === null || _a === void 0 ? void 0 : _a.maxConcurrentStreams,
|
|
16
|
+
maxBufferedChunksPerStream: (_b = deps.policy) === null || _b === void 0 ? void 0 : _b.maxBufferedChunksPerStream,
|
|
17
|
+
maxBufferedBytesPerStream: (_c = deps.policy) === null || _c === void 0 ? void 0 : _c.maxBufferedBytesPerStream,
|
|
18
|
+
idleTimeoutMs: (_d = deps.policy) === null || _d === void 0 ? void 0 : _d.idleTimeoutMs,
|
|
19
|
+
probeTimeoutMs: (_e = deps.policy) === null || _e === void 0 ? void 0 : _e.probeTimeoutMs,
|
|
20
|
+
closeGracePeriodMs: (_f = deps.policy) === null || _f === void 0 ? void 0 : _f.closeGracePeriodMs,
|
|
21
|
+
getSessionOptions: (progressToken) => {
|
|
22
|
+
let progress = 0;
|
|
23
|
+
return {
|
|
24
|
+
sendPing: async (nonce) => {
|
|
25
|
+
progress += 1;
|
|
26
|
+
await this.send({
|
|
27
|
+
jsonrpc: '2.0',
|
|
28
|
+
method: 'notifications/progress',
|
|
29
|
+
params: buildOpenStreamPingFrame({
|
|
30
|
+
progressToken,
|
|
31
|
+
progress,
|
|
32
|
+
nonce,
|
|
33
|
+
}),
|
|
34
|
+
});
|
|
35
|
+
},
|
|
36
|
+
sendPong: async (nonce) => {
|
|
37
|
+
progress += 1;
|
|
38
|
+
await this.send({
|
|
39
|
+
jsonrpc: '2.0',
|
|
40
|
+
method: 'notifications/progress',
|
|
41
|
+
params: buildOpenStreamPongFrame({
|
|
42
|
+
progressToken,
|
|
43
|
+
progress,
|
|
44
|
+
nonce,
|
|
45
|
+
}),
|
|
46
|
+
});
|
|
47
|
+
},
|
|
48
|
+
sendAbort: async (reason) => {
|
|
49
|
+
progress += 1;
|
|
50
|
+
await this.send({
|
|
51
|
+
jsonrpc: '2.0',
|
|
52
|
+
method: 'notifications/progress',
|
|
53
|
+
params: buildOpenStreamAbortFrame({
|
|
54
|
+
progressToken,
|
|
55
|
+
progress,
|
|
56
|
+
reason,
|
|
57
|
+
}),
|
|
58
|
+
});
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
},
|
|
62
|
+
logger: deps.logger,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/** Gets the inbound OpenStreamReceiver instance used for CEP-41. */
|
|
66
|
+
getReceiver() {
|
|
67
|
+
return this.receiver;
|
|
68
|
+
}
|
|
69
|
+
/** Returns an existing session for a progress token, or undefined. */
|
|
70
|
+
getSession(progressToken) {
|
|
71
|
+
return this.receiver.getSession(progressToken);
|
|
72
|
+
}
|
|
73
|
+
/** Returns the session for a progress token, creating it lazily if needed. */
|
|
74
|
+
getOrCreateSession(progressToken) {
|
|
75
|
+
return this.receiver.getOrCreateSession(progressToken);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Creates an outbound CEP-41 session whose local ping/pong/abort
|
|
79
|
+
* publishes the corresponding notification to the server.
|
|
80
|
+
*/
|
|
81
|
+
createOutboundSession(progressToken) {
|
|
82
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
83
|
+
const existing = this.receiver.getSession(progressToken);
|
|
84
|
+
if (existing) {
|
|
85
|
+
return existing;
|
|
86
|
+
}
|
|
87
|
+
let progress = 0;
|
|
88
|
+
return this.receiver.createSession({
|
|
89
|
+
progressToken,
|
|
90
|
+
maxBufferedChunks: (_b = (_a = this.policy) === null || _a === void 0 ? void 0 : _a.maxBufferedChunksPerStream) !== null && _b !== void 0 ? _b : DEFAULT_MAX_BUFFERED_CHUNKS_PER_STREAM,
|
|
91
|
+
maxBufferedBytes: (_d = (_c = this.policy) === null || _c === void 0 ? void 0 : _c.maxBufferedBytesPerStream) !== null && _d !== void 0 ? _d : DEFAULT_MAX_BUFFERED_BYTES_PER_STREAM,
|
|
92
|
+
idleTimeoutMs: (_f = (_e = this.policy) === null || _e === void 0 ? void 0 : _e.idleTimeoutMs) !== null && _f !== void 0 ? _f : DEFAULT_OPEN_STREAM_IDLE_TIMEOUT_MS,
|
|
93
|
+
probeTimeoutMs: (_h = (_g = this.policy) === null || _g === void 0 ? void 0 : _g.probeTimeoutMs) !== null && _h !== void 0 ? _h : DEFAULT_OPEN_STREAM_PROBE_TIMEOUT_MS,
|
|
94
|
+
closeGracePeriodMs: (_k = (_j = this.policy) === null || _j === void 0 ? void 0 : _j.closeGracePeriodMs) !== null && _k !== void 0 ? _k : DEFAULT_OPEN_STREAM_CLOSE_GRACE_PERIOD_MS,
|
|
95
|
+
sendPing: async (nonce) => {
|
|
96
|
+
progress += 1;
|
|
97
|
+
await this.send({
|
|
98
|
+
jsonrpc: '2.0',
|
|
99
|
+
method: 'notifications/progress',
|
|
100
|
+
params: buildOpenStreamPingFrame({ progressToken, progress, nonce }),
|
|
101
|
+
});
|
|
102
|
+
},
|
|
103
|
+
sendPong: async (nonce) => {
|
|
104
|
+
progress += 1;
|
|
105
|
+
await this.send({
|
|
106
|
+
jsonrpc: '2.0',
|
|
107
|
+
method: 'notifications/progress',
|
|
108
|
+
params: buildOpenStreamPongFrame({ progressToken, progress, nonce }),
|
|
109
|
+
});
|
|
110
|
+
},
|
|
111
|
+
sendAbort: async (reason) => {
|
|
112
|
+
progress += 1;
|
|
113
|
+
await this.send({
|
|
114
|
+
jsonrpc: '2.0',
|
|
115
|
+
method: 'notifications/progress',
|
|
116
|
+
params: buildOpenStreamAbortFrame({
|
|
117
|
+
progressToken,
|
|
118
|
+
progress,
|
|
119
|
+
reason,
|
|
120
|
+
}),
|
|
121
|
+
});
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=open-stream-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-stream-factory.js","sourceRoot":"","sources":["../../../../src/transport/nostr-client/open-stream-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { type Logger } from '../../core/utils/logger.js';
|
|
3
|
+
import { type ClientCorrelationStore, type OriginalRequestContext } from './correlation-store.js';
|
|
4
|
+
import { type ClientCapabilityNegotiator } from '../capability-negotiator.js';
|
|
5
|
+
export interface ClientOutboundSenderDeps {
|
|
6
|
+
serverPubkey: string;
|
|
7
|
+
correlationStore: ClientCorrelationStore;
|
|
8
|
+
capabilityNegotiator: ClientCapabilityNegotiator;
|
|
9
|
+
oversizedEnabled: boolean;
|
|
10
|
+
oversizedThreshold: number;
|
|
11
|
+
oversizedChunkSize: number;
|
|
12
|
+
oversizedAcceptTimeoutMs: number;
|
|
13
|
+
serverSupportsOversizedTransfer: () => boolean;
|
|
14
|
+
createRecipientTags: (pubkey: string) => string[][];
|
|
15
|
+
sendMcpMessage: (msg: JSONRPCMessage, pubkey: string, kind: number, tags?: string[][], isEncrypted?: boolean, onEventPublished?: (id: string) => void, wrapKind?: number) => Promise<string>;
|
|
16
|
+
waitForAccept: (token: string, timeoutMs: number) => Promise<void>;
|
|
17
|
+
getOriginalRequestContext: (msg: JSONRPCMessage) => OriginalRequestContext | undefined;
|
|
18
|
+
resolvePendingOpenStream: (progressToken: string) => void;
|
|
19
|
+
measurePublishedMcpMessageSize: (message: JSONRPCMessage, recipientPublicKey: string, kind: number, tags?: string[][], isEncrypted?: boolean, giftWrapKind?: number) => Promise<number>;
|
|
20
|
+
resolveSafeOversizedChunkSize: (params: {
|
|
21
|
+
desiredChunkSizeBytes: number;
|
|
22
|
+
maxPublishedEventBytes: number;
|
|
23
|
+
recipientPublicKey: string;
|
|
24
|
+
kind: number;
|
|
25
|
+
progressToken: string;
|
|
26
|
+
progress: number;
|
|
27
|
+
tags?: string[][];
|
|
28
|
+
isEncrypted?: boolean;
|
|
29
|
+
giftWrapKind?: number;
|
|
30
|
+
}) => Promise<number>;
|
|
31
|
+
logger: Logger;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Encapsulates outbound client request routing, including CEP-22 oversized handling.
|
|
35
|
+
*/
|
|
36
|
+
export declare class ClientOutboundSender {
|
|
37
|
+
private deps;
|
|
38
|
+
constructor(deps: ClientOutboundSenderDeps);
|
|
39
|
+
/**
|
|
40
|
+
* Sends an MCP message to the server, registering correlation when applicable.
|
|
41
|
+
*/
|
|
42
|
+
sendRequest(message: JSONRPCMessage): Promise<string>;
|
|
43
|
+
private sendOversizedRequest;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=outbound-sender.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbound-sender.d.ts","sourceRoot":"","sources":["../../../../src/transport/nostr-client/outbound-sender.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EAEpB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC5B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,KAAK,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAG9E,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,sBAAsB,CAAC;IACzC,oBAAoB,EAAE,0BAA0B,CAAC;IACjD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,wBAAwB,EAAE,MAAM,CAAC;IACjC,+BAA+B,EAAE,MAAM,OAAO,CAAC;IAC/C,mBAAmB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,EAAE,EAAE,CAAC;IACpD,cAAc,EAAE,CACd,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EACjB,WAAW,CAAC,EAAE,OAAO,EACrB,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,EACvC,QAAQ,CAAC,EAAE,MAAM,KACd,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,yBAAyB,EAAE,CACzB,GAAG,EAAE,cAAc,KAChB,sBAAsB,GAAG,SAAS,CAAC;IACxC,wBAAwB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,8BAA8B,EAAE,CAC9B,OAAO,EAAE,cAAc,EACvB,kBAAkB,EAAE,MAAM,EAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EACjB,WAAW,CAAC,EAAE,OAAO,EACrB,YAAY,CAAC,EAAE,MAAM,KAClB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,6BAA6B,EAAE,CAAC,MAAM,EAAE;QACtC,qBAAqB,EAAE,MAAM,CAAC;QAC9B,sBAAsB,EAAE,MAAM,CAAC;QAC/B,kBAAkB,EAAE,MAAM,CAAC;QAC3B,IAAI,EAAE,MAAM,CAAC;QACb,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;QAClB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,oBAAoB;IACnB,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,wBAAwB;IAElD;;OAEG;IACU,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;YAmFpD,oBAAoB;CA4DnC"}
|