clawmarket 0.4.0
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/README.md +142 -0
- package/dist/api-proxy.d.ts +11 -0
- package/dist/api-proxy.d.ts.map +1 -0
- package/dist/api-proxy.js +98 -0
- package/dist/api-proxy.js.map +1 -0
- package/dist/buyer/discovery.d.ts +52 -0
- package/dist/buyer/discovery.d.ts.map +1 -0
- package/dist/buyer/discovery.js +121 -0
- package/dist/buyer/discovery.js.map +1 -0
- package/dist/buyer/index.d.ts +4 -0
- package/dist/buyer/index.d.ts.map +1 -0
- package/dist/buyer/index.js +4 -0
- package/dist/buyer/index.js.map +1 -0
- package/dist/buyer/mode.d.ts +60 -0
- package/dist/buyer/mode.d.ts.map +1 -0
- package/dist/buyer/mode.js +150 -0
- package/dist/buyer/mode.js.map +1 -0
- package/dist/buyer/relay.d.ts +27 -0
- package/dist/buyer/relay.d.ts.map +1 -0
- package/dist/buyer/relay.js +103 -0
- package/dist/buyer/relay.js.map +1 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +252 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +29 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +37 -0
- package/dist/config.js.map +1 -0
- package/dist/crypto/e2ee.d.ts +45 -0
- package/dist/crypto/e2ee.d.ts.map +1 -0
- package/dist/crypto/e2ee.js +87 -0
- package/dist/crypto/e2ee.js.map +1 -0
- package/dist/crypto/index.d.ts +3 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +3 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/ticket.d.ts +62 -0
- package/dist/crypto/ticket.d.ts.map +1 -0
- package/dist/crypto/ticket.js +123 -0
- package/dist/crypto/ticket.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/local-proxy.d.ts +12 -0
- package/dist/local-proxy.d.ts.map +1 -0
- package/dist/local-proxy.js +593 -0
- package/dist/local-proxy.js.map +1 -0
- package/dist/openclaw-adapter.d.ts +105 -0
- package/dist/openclaw-adapter.d.ts.map +1 -0
- package/dist/openclaw-adapter.js +125 -0
- package/dist/openclaw-adapter.js.map +1 -0
- package/dist/provider.d.ts +116 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +328 -0
- package/dist/provider.js.map +1 -0
- package/dist/seller/index.d.ts +4 -0
- package/dist/seller/index.d.ts.map +1 -0
- package/dist/seller/index.js +4 -0
- package/dist/seller/index.js.map +1 -0
- package/dist/seller/mode.d.ts +62 -0
- package/dist/seller/mode.d.ts.map +1 -0
- package/dist/seller/mode.js +179 -0
- package/dist/seller/mode.js.map +1 -0
- package/dist/seller/registry.d.ts +27 -0
- package/dist/seller/registry.d.ts.map +1 -0
- package/dist/seller/registry.js +95 -0
- package/dist/seller/registry.js.map +1 -0
- package/dist/seller/relay.d.ts +64 -0
- package/dist/seller/relay.d.ts.map +1 -0
- package/dist/seller/relay.js +171 -0
- package/dist/seller/relay.js.map +1 -0
- package/dist/seller-cli.d.ts +26 -0
- package/dist/seller-cli.d.ts.map +1 -0
- package/dist/seller-cli.js +354 -0
- package/dist/seller-cli.js.map +1 -0
- package/dist/seller-daemon.d.ts +7 -0
- package/dist/seller-daemon.d.ts.map +1 -0
- package/dist/seller-daemon.js +349 -0
- package/dist/seller-daemon.js.map +1 -0
- package/dist/types/config.d.ts +529 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +81 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/protocol.d.ts +131 -0
- package/dist/types/protocol.d.ts.map +1 -0
- package/dist/types/protocol.js +2 -0
- package/dist/types/protocol.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { DiscoveryClient } from './discovery.js';
|
|
3
|
+
import { RelayClient } from './relay.js';
|
|
4
|
+
import { generateKeyPair, encrypt, decrypt, deserializePublicKey, serializePublicKey, } from '../crypto/e2ee.js';
|
|
5
|
+
import { TicketSigner, calculateTicketAmount } from '../crypto/ticket.js';
|
|
6
|
+
/**
|
|
7
|
+
* Buyer mode handler
|
|
8
|
+
* - Discovers sellers
|
|
9
|
+
* - Selects best seller
|
|
10
|
+
* - Sends encrypted requests
|
|
11
|
+
* - Handles payments
|
|
12
|
+
*/
|
|
13
|
+
export class BuyerMode extends EventEmitter {
|
|
14
|
+
config;
|
|
15
|
+
discovery;
|
|
16
|
+
relay;
|
|
17
|
+
keyPair;
|
|
18
|
+
ticketSigner;
|
|
19
|
+
channels = new Map(); // sellerId -> channel
|
|
20
|
+
nonceCounters = new Map(); // channelId -> nonce
|
|
21
|
+
constructor(config, privateKey, contractAddress, rpcUrl, chainId, keyPair) {
|
|
22
|
+
super();
|
|
23
|
+
this.config = config;
|
|
24
|
+
this.discovery = new DiscoveryClient(config);
|
|
25
|
+
this.relay = new RelayClient(config.relayUrl);
|
|
26
|
+
this.keyPair = keyPair || generateKeyPair();
|
|
27
|
+
this.ticketSigner = new TicketSigner(privateKey, contractAddress, rpcUrl, chainId);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Send a chat completion request through ClawMarket
|
|
31
|
+
*/
|
|
32
|
+
async chatCompletion(request) {
|
|
33
|
+
const { model } = request;
|
|
34
|
+
try {
|
|
35
|
+
// Find best seller
|
|
36
|
+
const seller = await this.discovery.selectSeller(model);
|
|
37
|
+
if (!seller) {
|
|
38
|
+
return this.handleFallback(request, 'No sellers available');
|
|
39
|
+
}
|
|
40
|
+
// Check price multiplier
|
|
41
|
+
const pricing = this.discovery.getModelPricing(seller, model);
|
|
42
|
+
if (!pricing) {
|
|
43
|
+
return this.handleFallback(request, 'Model pricing not found');
|
|
44
|
+
}
|
|
45
|
+
// Get or create channel
|
|
46
|
+
const channel = await this.getOrCreateChannel(seller);
|
|
47
|
+
if (!channel) {
|
|
48
|
+
return this.handleFallback(request, 'Failed to establish payment channel');
|
|
49
|
+
}
|
|
50
|
+
this.emit('request', model, seller.id);
|
|
51
|
+
// Estimate cost and create ticket
|
|
52
|
+
const estimatedTokens = this.estimateTokens(request);
|
|
53
|
+
const estimatedCost = calculateTicketAmount(estimatedTokens.input, estimatedTokens.output, pricing);
|
|
54
|
+
const nonce = this.getNextNonce(channel.channelId);
|
|
55
|
+
const cumulativeAmount = Number(channel.settledAmount) / 1e6 + estimatedCost;
|
|
56
|
+
const ticket = await this.ticketSigner.createTicket(channel.channelId, cumulativeAmount, nonce);
|
|
57
|
+
// Encrypt request
|
|
58
|
+
const sellerPubKey = deserializePublicKey(seller.publicKey);
|
|
59
|
+
const encryptedPayload = await encrypt(JSON.stringify(request), this.keyPair.privateKey, sellerPubKey);
|
|
60
|
+
// Send through relay
|
|
61
|
+
const response = await this.relay.sendRequest(seller.id, encryptedPayload, serializePublicKey(this.keyPair.publicKey), model, channel.channelId, ticket.amount.toString(), Number(ticket.nonce), ticket.signature);
|
|
62
|
+
// Decrypt response
|
|
63
|
+
const decryptedResponse = await decrypt(response.payload, this.keyPair.privateKey, sellerPubKey);
|
|
64
|
+
const chatResponse = JSON.parse(decryptedResponse);
|
|
65
|
+
this.emit('response', model, seller.id, true);
|
|
66
|
+
return chatResponse;
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
this.emit('error', err instanceof Error ? err : new Error(String(err)));
|
|
70
|
+
return this.handleFallback(request, err instanceof Error ? err.message : 'Unknown error');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Handle fallback to direct provider
|
|
75
|
+
*/
|
|
76
|
+
async handleFallback(request, reason) {
|
|
77
|
+
this.emit('fallback', request.model, reason);
|
|
78
|
+
if (!this.config.fallbackProvider) {
|
|
79
|
+
throw new Error(`No sellers available and no fallback configured: ${reason}`);
|
|
80
|
+
}
|
|
81
|
+
// In production, this would call the fallback provider directly
|
|
82
|
+
throw new Error(`Fallback not implemented: ${reason}`);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get or create payment channel with seller
|
|
86
|
+
*/
|
|
87
|
+
async getOrCreateChannel(seller) {
|
|
88
|
+
const existing = this.channels.get(seller.id);
|
|
89
|
+
if (existing && existing.isActive && existing.expiresAt > Date.now() / 1000) {
|
|
90
|
+
return existing;
|
|
91
|
+
}
|
|
92
|
+
// In production, this would:
|
|
93
|
+
// 1. Check if channel exists on-chain
|
|
94
|
+
// 2. If not, call openChannel() on the contract
|
|
95
|
+
// 3. Store channel state locally
|
|
96
|
+
// For now, return a mock channel for development
|
|
97
|
+
const mockChannel = {
|
|
98
|
+
channelId: `0x${'0'.repeat(64)}`,
|
|
99
|
+
buyer: this.ticketSigner.address,
|
|
100
|
+
seller: seller.id,
|
|
101
|
+
deposit: BigInt(10e6), // 10 USDC
|
|
102
|
+
settledAmount: BigInt(0),
|
|
103
|
+
expiresAt: Math.floor(Date.now() / 1000) + 86400, // 24 hours
|
|
104
|
+
isActive: true,
|
|
105
|
+
currentNonce: BigInt(0),
|
|
106
|
+
};
|
|
107
|
+
this.channels.set(seller.id, mockChannel);
|
|
108
|
+
return mockChannel;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get next nonce for a channel
|
|
112
|
+
*/
|
|
113
|
+
getNextNonce(channelId) {
|
|
114
|
+
const current = this.nonceCounters.get(channelId) ?? BigInt(0);
|
|
115
|
+
const next = current + BigInt(1);
|
|
116
|
+
this.nonceCounters.set(channelId, next);
|
|
117
|
+
return next;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Estimate token usage for a request
|
|
121
|
+
*/
|
|
122
|
+
estimateTokens(request) {
|
|
123
|
+
// Rough estimation: 4 chars per token
|
|
124
|
+
const inputChars = request.messages.reduce((sum, m) => sum + m.content.length, 0);
|
|
125
|
+
const inputTokens = Math.ceil(inputChars / 4);
|
|
126
|
+
// Estimate output based on max_tokens or default
|
|
127
|
+
const outputTokens = request.max_tokens ?? 1000;
|
|
128
|
+
return { input: inputTokens, output: outputTokens };
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get buyer's public key
|
|
132
|
+
*/
|
|
133
|
+
get publicKey() {
|
|
134
|
+
return this.keyPair.publicKey;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get buyer's wallet address
|
|
138
|
+
*/
|
|
139
|
+
get address() {
|
|
140
|
+
return this.ticketSigner.address;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Refresh seller cache
|
|
144
|
+
*/
|
|
145
|
+
async refreshSellers() {
|
|
146
|
+
this.discovery.clearCache();
|
|
147
|
+
await this.discovery.fetchSellers(undefined, true);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode.js","sourceRoot":"","sources":["../../src/buyer/mode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { RelayResponse } from '../types/protocol.js';
|
|
2
|
+
/**
|
|
3
|
+
* Relay client for buyers to send requests
|
|
4
|
+
*/
|
|
5
|
+
export declare class RelayClient {
|
|
6
|
+
private relayUrl;
|
|
7
|
+
private pendingRequests;
|
|
8
|
+
private defaultTimeoutMs;
|
|
9
|
+
constructor(relayUrl: string);
|
|
10
|
+
/**
|
|
11
|
+
* Send encrypted request to seller through Relay
|
|
12
|
+
*/
|
|
13
|
+
sendRequest(sellerId: string, payload: string, buyerPublicKey: string, model: string, channelId: string, ticketAmount: string, ticketNonce: number, ticketSignature: string, timeoutMs?: number): Promise<RelayResponse>;
|
|
14
|
+
/**
|
|
15
|
+
* Generate unique request ID
|
|
16
|
+
*/
|
|
17
|
+
private generateRequestId;
|
|
18
|
+
/**
|
|
19
|
+
* Cancel a pending request
|
|
20
|
+
*/
|
|
21
|
+
cancelRequest(requestId: string): void;
|
|
22
|
+
/**
|
|
23
|
+
* Cancel all pending requests
|
|
24
|
+
*/
|
|
25
|
+
cancelAll(): void;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=relay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../../src/buyer/relay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAQxE;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,gBAAgB,CAAS;gBAErB,QAAQ,EAAE,MAAM;IAI5B;;OAEG;IACG,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,EACvB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC;IAsEzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAStC;;OAEG;IACH,SAAS,IAAI,IAAI;CAOlB"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Relay client for buyers to send requests
|
|
3
|
+
*/
|
|
4
|
+
export class RelayClient {
|
|
5
|
+
relayUrl;
|
|
6
|
+
pendingRequests = new Map();
|
|
7
|
+
defaultTimeoutMs = 60000; // 60 seconds
|
|
8
|
+
constructor(relayUrl) {
|
|
9
|
+
this.relayUrl = relayUrl;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Send encrypted request to seller through Relay
|
|
13
|
+
*/
|
|
14
|
+
async sendRequest(sellerId, payload, buyerPublicKey, model, channelId, ticketAmount, ticketNonce, ticketSignature, timeoutMs) {
|
|
15
|
+
const requestId = this.generateRequestId();
|
|
16
|
+
const timeout = timeoutMs ?? this.defaultTimeoutMs;
|
|
17
|
+
const requestBody = {
|
|
18
|
+
sellerId,
|
|
19
|
+
requestId,
|
|
20
|
+
payload,
|
|
21
|
+
buyerPublicKey,
|
|
22
|
+
model,
|
|
23
|
+
channelId,
|
|
24
|
+
ticketAmount,
|
|
25
|
+
ticketNonce,
|
|
26
|
+
ticketSignature,
|
|
27
|
+
timestamp: Date.now(),
|
|
28
|
+
};
|
|
29
|
+
// Create promise for response
|
|
30
|
+
const responsePromise = new Promise((resolve, reject) => {
|
|
31
|
+
const timeoutHandle = setTimeout(() => {
|
|
32
|
+
this.pendingRequests.delete(requestId);
|
|
33
|
+
reject(new Error(`Request ${requestId} timed out after ${timeout}ms`));
|
|
34
|
+
}, timeout);
|
|
35
|
+
this.pendingRequests.set(requestId, {
|
|
36
|
+
resolve,
|
|
37
|
+
reject,
|
|
38
|
+
timeout: timeoutHandle,
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
try {
|
|
42
|
+
// Send request to Relay via HTTP
|
|
43
|
+
const response = await fetch(`${this.relayUrl}/relay/forward`, {
|
|
44
|
+
method: 'POST',
|
|
45
|
+
headers: { 'Content-Type': 'application/json' },
|
|
46
|
+
body: JSON.stringify(requestBody),
|
|
47
|
+
});
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
const error = await response.text();
|
|
50
|
+
throw new Error(`Relay forward failed: ${response.status} - ${error}`);
|
|
51
|
+
}
|
|
52
|
+
// For HTTP-based relay, response comes back directly
|
|
53
|
+
const relayResponse = await response.json();
|
|
54
|
+
if (relayResponse.type === 'error') {
|
|
55
|
+
throw new Error(relayResponse.error || 'Unknown relay error');
|
|
56
|
+
}
|
|
57
|
+
// Clear timeout and resolve
|
|
58
|
+
const pending = this.pendingRequests.get(requestId);
|
|
59
|
+
if (pending) {
|
|
60
|
+
clearTimeout(pending.timeout);
|
|
61
|
+
this.pendingRequests.delete(requestId);
|
|
62
|
+
}
|
|
63
|
+
return relayResponse;
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
// Clean up pending request
|
|
67
|
+
const pending = this.pendingRequests.get(requestId);
|
|
68
|
+
if (pending) {
|
|
69
|
+
clearTimeout(pending.timeout);
|
|
70
|
+
this.pendingRequests.delete(requestId);
|
|
71
|
+
}
|
|
72
|
+
throw err;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Generate unique request ID
|
|
77
|
+
*/
|
|
78
|
+
generateRequestId() {
|
|
79
|
+
return `req-${Date.now()}-${Math.random().toString(36).substring(2, 10)}`;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Cancel a pending request
|
|
83
|
+
*/
|
|
84
|
+
cancelRequest(requestId) {
|
|
85
|
+
const pending = this.pendingRequests.get(requestId);
|
|
86
|
+
if (pending) {
|
|
87
|
+
clearTimeout(pending.timeout);
|
|
88
|
+
pending.reject(new Error('Request cancelled'));
|
|
89
|
+
this.pendingRequests.delete(requestId);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Cancel all pending requests
|
|
94
|
+
*/
|
|
95
|
+
cancelAll() {
|
|
96
|
+
for (const [requestId, pending] of this.pendingRequests) {
|
|
97
|
+
clearTimeout(pending.timeout);
|
|
98
|
+
pending.reject(new Error('All requests cancelled'));
|
|
99
|
+
}
|
|
100
|
+
this.pendingRequests.clear();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=relay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay.js","sourceRoot":"","sources":["../../src/buyer/relay.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,OAAO,WAAW;IACd,QAAQ,CAAS;IACjB,eAAe,GAAgC,IAAI,GAAG,EAAE,CAAC;IACzD,gBAAgB,GAAG,KAAK,CAAC,CAAC,aAAa;IAE/C,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,QAAgB,EAChB,OAAe,EACf,cAAsB,EACtB,KAAa,EACb,SAAiB,EACjB,YAAoB,EACpB,WAAmB,EACnB,eAAuB,EACvB,SAAkB;QAElB,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC;QAEnD,MAAM,WAAW,GAAG;YAClB,QAAQ;YACR,SAAS;YACT,OAAO;YACP,cAAc;YACd,KAAK;YACL,SAAS;YACT,YAAY;YACZ,WAAW;YACX,eAAe;YACf,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,8BAA8B;QAC9B,MAAM,eAAe,GAAG,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrE,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;gBACpC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACvC,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,SAAS,oBAAoB,OAAO,IAAI,CAAC,CAAC,CAAC;YACzE,CAAC,EAAE,OAAO,CAAC,CAAC;YAEZ,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE;gBAClC,OAAO;gBACP,MAAM;gBACN,OAAO,EAAE,aAAa;aACvB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,iCAAiC;YACjC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,gBAAgB,EAAE;gBAC7D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;aAClC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,MAAM,KAAK,EAAE,CAAC,CAAC;YACzE,CAAC;YAED,qDAAqD;YACrD,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAkB,CAAC;YAE5D,IAAI,aAAa,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,KAAK,IAAI,qBAAqB,CAAC,CAAC;YAChE,CAAC;YAED,4BAA4B;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACpD,IAAI,OAAO,EAAE,CAAC;gBACZ,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC9B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACzC,CAAC;YAED,OAAO,aAA8B,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,2BAA2B;YAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACpD,IAAI,OAAO,EAAE,CAAC;gBACZ,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC9B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACzC,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,OAAO,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IAC5E,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,SAAiB;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,OAAO,EAAE,CAAC;YACZ,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9B,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;YAC/C,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS;QACP,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACxD,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9B,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;CACF"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* ClawMarket CLI - 一键配置 + 启动代理
|
|
4
|
+
*
|
|
5
|
+
* 用法:
|
|
6
|
+
* clawmarket - 配置 OpenClaw + 启动代理
|
|
7
|
+
* clawmarket setup - 只配置,不启动代理
|
|
8
|
+
* clawmarket status - 查看状态
|
|
9
|
+
*/
|
|
10
|
+
import * as fs from 'fs';
|
|
11
|
+
import * as path from 'path';
|
|
12
|
+
import * as os from 'os';
|
|
13
|
+
import { spawn } from 'child_process';
|
|
14
|
+
import { createPublicClient, http as viemHttp, formatUnits } from 'viem';
|
|
15
|
+
import { baseSepolia } from 'viem/chains';
|
|
16
|
+
import { privateKeyToAccount, generatePrivateKey } from 'viem/accounts';
|
|
17
|
+
import { sellerMain } from './seller-cli.js';
|
|
18
|
+
const LOCAL_PORT = 19082;
|
|
19
|
+
const OPENCLAW_CONFIG_PATH = path.join(os.homedir(), '.openclaw', 'openclaw.json');
|
|
20
|
+
const CLAWMARKET_DIR = path.join(os.homedir(), '.clawmarket');
|
|
21
|
+
const WALLET_PATH = path.join(CLAWMARKET_DIR, 'wallet.json');
|
|
22
|
+
const PID_PATH = path.join(CLAWMARKET_DIR, 'proxy.pid');
|
|
23
|
+
const USDC_CONTRACT = '0xcF0819eb156D6c6c1c5d9A515E351D2D1aefff7D';
|
|
24
|
+
const USDC_ABI = [
|
|
25
|
+
{ name: 'balanceOf', type: 'function', inputs: [{ name: 'account', type: 'address' }], outputs: [{ type: 'uint256' }], stateMutability: 'view' },
|
|
26
|
+
];
|
|
27
|
+
function loadOrCreateWallet() {
|
|
28
|
+
if (!fs.existsSync(CLAWMARKET_DIR)) {
|
|
29
|
+
fs.mkdirSync(CLAWMARKET_DIR, { recursive: true });
|
|
30
|
+
}
|
|
31
|
+
if (fs.existsSync(WALLET_PATH)) {
|
|
32
|
+
return JSON.parse(fs.readFileSync(WALLET_PATH, 'utf-8'));
|
|
33
|
+
}
|
|
34
|
+
const privateKey = generatePrivateKey();
|
|
35
|
+
const account = privateKeyToAccount(privateKey);
|
|
36
|
+
const wallet = {
|
|
37
|
+
address: account.address,
|
|
38
|
+
privateKey: privateKey,
|
|
39
|
+
createdAt: new Date().toISOString()
|
|
40
|
+
};
|
|
41
|
+
fs.writeFileSync(WALLET_PATH, JSON.stringify(wallet, null, 2), { mode: 0o600 });
|
|
42
|
+
return wallet;
|
|
43
|
+
}
|
|
44
|
+
async function getBalance(address) {
|
|
45
|
+
const publicClient = createPublicClient({
|
|
46
|
+
chain: baseSepolia,
|
|
47
|
+
transport: viemHttp('https://sepolia.base.org')
|
|
48
|
+
});
|
|
49
|
+
return await publicClient.readContract({
|
|
50
|
+
address: USDC_CONTRACT,
|
|
51
|
+
abi: USDC_ABI,
|
|
52
|
+
functionName: 'balanceOf',
|
|
53
|
+
args: [address]
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
// ============ OpenClaw 配置 ============
|
|
57
|
+
function configureOpenClaw() {
|
|
58
|
+
const dir = path.dirname(OPENCLAW_CONFIG_PATH);
|
|
59
|
+
if (!fs.existsSync(dir)) {
|
|
60
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
61
|
+
}
|
|
62
|
+
let config = {};
|
|
63
|
+
if (fs.existsSync(OPENCLAW_CONFIG_PATH)) {
|
|
64
|
+
config = JSON.parse(fs.readFileSync(OPENCLAW_CONFIG_PATH, 'utf-8'));
|
|
65
|
+
}
|
|
66
|
+
// 确保结构存在
|
|
67
|
+
if (!config.models)
|
|
68
|
+
config.models = {};
|
|
69
|
+
if (!config.models.providers)
|
|
70
|
+
config.models.providers = {};
|
|
71
|
+
if (!config.gateway)
|
|
72
|
+
config.gateway = {};
|
|
73
|
+
config.gateway.mode = 'local';
|
|
74
|
+
// 指向本地代理
|
|
75
|
+
config.models.providers.clawmarket = {
|
|
76
|
+
baseUrl: `http://127.0.0.1:${LOCAL_PORT}`,
|
|
77
|
+
apiKey: 'clawmarket',
|
|
78
|
+
api: 'anthropic-messages',
|
|
79
|
+
models: [
|
|
80
|
+
{
|
|
81
|
+
id: 'claude-opus-4-5',
|
|
82
|
+
name: 'Claude Opus 4.5 (ClawMarket)',
|
|
83
|
+
reasoning: false,
|
|
84
|
+
input: ['text', 'image'],
|
|
85
|
+
contextWindow: 200000,
|
|
86
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }
|
|
87
|
+
}
|
|
88
|
+
]
|
|
89
|
+
};
|
|
90
|
+
// 删除可能存在的无效 routing 字段
|
|
91
|
+
if (config.models.routing)
|
|
92
|
+
delete config.models.routing;
|
|
93
|
+
// 备份并保存
|
|
94
|
+
if (fs.existsSync(OPENCLAW_CONFIG_PATH)) {
|
|
95
|
+
fs.copyFileSync(OPENCLAW_CONFIG_PATH, OPENCLAW_CONFIG_PATH + '.bak');
|
|
96
|
+
}
|
|
97
|
+
fs.writeFileSync(OPENCLAW_CONFIG_PATH, JSON.stringify(config, null, 2));
|
|
98
|
+
// 写 ClawMarket 提示到 workspace TOOLS.md
|
|
99
|
+
const workspaceDir = path.join(os.homedir(), '.openclaw', 'workspace');
|
|
100
|
+
const toolsPath = path.join(workspaceDir, 'TOOLS.md');
|
|
101
|
+
const marker = '## 🛒 ClawMarket';
|
|
102
|
+
const clawSection = `
|
|
103
|
+
## 🛒 ClawMarket
|
|
104
|
+
|
|
105
|
+
- **本地代理:** http://127.0.0.1:${LOCAL_PORT}
|
|
106
|
+
- **查看状态/余额/消费:** \`curl http://127.0.0.1:${LOCAL_PORT}/status\`
|
|
107
|
+
- **查看消费明细:** \`curl http://127.0.0.1:${LOCAL_PORT}/usage\`
|
|
108
|
+
- **Dashboard:** http://shenjige.xyz:9082
|
|
109
|
+
- 用户问消费、余额、花了多少钱时,调 \`/status\` 或 \`/usage\` 接口即可
|
|
110
|
+
`;
|
|
111
|
+
if (fs.existsSync(workspaceDir)) {
|
|
112
|
+
let toolsContent = fs.existsSync(toolsPath) ? fs.readFileSync(toolsPath, 'utf-8') : '';
|
|
113
|
+
if (!toolsContent.includes(marker)) {
|
|
114
|
+
toolsContent += '\n' + clawSection;
|
|
115
|
+
fs.writeFileSync(toolsPath, toolsContent);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
// ============ 代理管理 ============
|
|
121
|
+
function isProxyRunning() {
|
|
122
|
+
if (!fs.existsSync(PID_PATH))
|
|
123
|
+
return false;
|
|
124
|
+
const pid = parseInt(fs.readFileSync(PID_PATH, 'utf-8').trim());
|
|
125
|
+
try {
|
|
126
|
+
process.kill(pid, 0);
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
fs.unlinkSync(PID_PATH);
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function startProxy() {
|
|
135
|
+
if (isProxyRunning()) {
|
|
136
|
+
console.log('[代理] 已在运行中');
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
// 找到 local-proxy.js 的路径
|
|
140
|
+
const proxyPath = path.join(path.dirname(new URL(import.meta.url).pathname), 'local-proxy.js');
|
|
141
|
+
const child = spawn('node', [proxyPath], {
|
|
142
|
+
detached: true,
|
|
143
|
+
stdio: 'ignore',
|
|
144
|
+
cwd: CLAWMARKET_DIR
|
|
145
|
+
});
|
|
146
|
+
child.unref();
|
|
147
|
+
if (child.pid) {
|
|
148
|
+
fs.writeFileSync(PID_PATH, child.pid.toString());
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
function stopProxy() {
|
|
154
|
+
if (!fs.existsSync(PID_PATH))
|
|
155
|
+
return true;
|
|
156
|
+
const pid = parseInt(fs.readFileSync(PID_PATH, 'utf-8').trim());
|
|
157
|
+
try {
|
|
158
|
+
process.kill(pid, 'SIGTERM');
|
|
159
|
+
fs.unlinkSync(PID_PATH);
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// ============ 主逻辑 ============
|
|
167
|
+
async function showStatus() {
|
|
168
|
+
const wallet = loadOrCreateWallet();
|
|
169
|
+
const balance = await getBalance(wallet.address);
|
|
170
|
+
const running = isProxyRunning();
|
|
171
|
+
console.log('');
|
|
172
|
+
console.log('ClawMarket 状态');
|
|
173
|
+
console.log('─'.repeat(50));
|
|
174
|
+
console.log(`钱包地址: ${wallet.address}`);
|
|
175
|
+
console.log(`USDC 余额: ${formatUnits(balance, 6)} USDC`);
|
|
176
|
+
console.log(`代理状态: ${running ? '✅ 运行中' : '❌ 未运行'}`);
|
|
177
|
+
console.log(`代理地址: http://127.0.0.1:${LOCAL_PORT}`);
|
|
178
|
+
console.log('─'.repeat(50));
|
|
179
|
+
console.log('');
|
|
180
|
+
}
|
|
181
|
+
async function main() {
|
|
182
|
+
const args = process.argv.slice(2);
|
|
183
|
+
const command = args[0] || 'start';
|
|
184
|
+
console.log('');
|
|
185
|
+
console.log('╔═══════════════════════════════════════════════════════════╗');
|
|
186
|
+
console.log('║ ClawMarket - 去中心化 AI 算力市场 ║');
|
|
187
|
+
console.log('╚═══════════════════════════════════════════════════════════╝');
|
|
188
|
+
console.log('');
|
|
189
|
+
// 卖家命令
|
|
190
|
+
if (command === 'sell') {
|
|
191
|
+
await sellerMain(args[1]);
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
if (command === 'status') {
|
|
195
|
+
await showStatus();
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
if (command === 'stop') {
|
|
199
|
+
if (stopProxy()) {
|
|
200
|
+
console.log('[代理] 已停止');
|
|
201
|
+
}
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
// setup 或 start
|
|
205
|
+
const wallet = loadOrCreateWallet();
|
|
206
|
+
console.log('[钱包] 地址:', wallet.address);
|
|
207
|
+
// 检查余额
|
|
208
|
+
const balance = await getBalance(wallet.address);
|
|
209
|
+
console.log('[余额]', formatUnits(balance, 6), 'USDC');
|
|
210
|
+
if (balance < 1000000n) {
|
|
211
|
+
console.log('');
|
|
212
|
+
console.log('⚠️ 余额不足!请充值 USDC (Base Sepolia) 到:');
|
|
213
|
+
console.log('');
|
|
214
|
+
console.log(` ${wallet.address}`);
|
|
215
|
+
console.log('');
|
|
216
|
+
console.log('获取测试币: https://faucet.circle.com/');
|
|
217
|
+
console.log('');
|
|
218
|
+
}
|
|
219
|
+
// 配置 OpenClaw
|
|
220
|
+
console.log('[配置] 更新 OpenClaw 配置...');
|
|
221
|
+
configureOpenClaw();
|
|
222
|
+
console.log('[配置] ✅ 完成');
|
|
223
|
+
if (command === 'setup') {
|
|
224
|
+
console.log('');
|
|
225
|
+
console.log('配置完成!运行 clawmarket 启动代理。');
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
// 启动代理
|
|
229
|
+
console.log('[代理] 启动中...');
|
|
230
|
+
if (startProxy()) {
|
|
231
|
+
console.log('[代理] ✅ 已在后台启动');
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
console.log('[代理] ❌ 启动失败');
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
console.log('');
|
|
238
|
+
console.log('═══════════════════════════════════════════════════════════');
|
|
239
|
+
console.log('');
|
|
240
|
+
console.log(' ✅ 配置完成!');
|
|
241
|
+
console.log('');
|
|
242
|
+
console.log(' 现在可以直接使用 OpenClaw,模型会自动走 ClawMarket。');
|
|
243
|
+
console.log('');
|
|
244
|
+
console.log(' 常用命令:');
|
|
245
|
+
console.log(' clawmarket status - 查看状态');
|
|
246
|
+
console.log(' clawmarket stop - 停止代理');
|
|
247
|
+
console.log('');
|
|
248
|
+
console.log('═══════════════════════════════════════════════════════════');
|
|
249
|
+
console.log('');
|
|
250
|
+
}
|
|
251
|
+
main().catch(console.error);
|
|
252
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClawMarket 默认配置
|
|
3
|
+
*
|
|
4
|
+
* 用户无需配置,开箱即用
|
|
5
|
+
*/
|
|
6
|
+
export declare const DEFAULT_CONFIG: {
|
|
7
|
+
registryUrl: string;
|
|
8
|
+
relayUrl: string;
|
|
9
|
+
relayWs: string;
|
|
10
|
+
rpcUrl: string;
|
|
11
|
+
chainId: number;
|
|
12
|
+
channelContract: `0x${string}`;
|
|
13
|
+
usdcContract: `0x${string}`;
|
|
14
|
+
minBalance: bigint;
|
|
15
|
+
channelDeposit: bigint;
|
|
16
|
+
strategy: "lowest_price";
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* OpenClaw 自动配置
|
|
20
|
+
*
|
|
21
|
+
* 插件安装后自动注入到 OpenClaw 配置
|
|
22
|
+
*/
|
|
23
|
+
export declare const OPENCLAW_PROVIDER_CONFIG: {
|
|
24
|
+
name: string;
|
|
25
|
+
type: string;
|
|
26
|
+
models: string[];
|
|
27
|
+
default: boolean;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,cAAc;;;;;;qBASwC,KAAK,MAAM,EAAE;kBAChB,KAAK,MAAM,EAAE;;;;CAM5E,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,wBAAwB;;;;;CAUpC,CAAC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClawMarket 默认配置
|
|
3
|
+
*
|
|
4
|
+
* 用户无需配置,开箱即用
|
|
5
|
+
*/
|
|
6
|
+
export const DEFAULT_CONFIG = {
|
|
7
|
+
// 服务地址
|
|
8
|
+
registryUrl: 'http://shenjige.xyz:9080',
|
|
9
|
+
relayUrl: 'http://shenjige.xyz:9081',
|
|
10
|
+
relayWs: 'ws://shenjige.xyz:9081',
|
|
11
|
+
// 链配置 (Base Sepolia)
|
|
12
|
+
rpcUrl: 'https://sepolia.base.org',
|
|
13
|
+
chainId: 84532,
|
|
14
|
+
channelContract: '0x1577e78D8a446edF10244A80bEf990751e80E495',
|
|
15
|
+
usdcContract: '0xcF0819eb156D6c6c1c5d9A515E351D2D1aefff7D',
|
|
16
|
+
// 默认参数
|
|
17
|
+
minBalance: 1000000n, // 1 USDC
|
|
18
|
+
channelDeposit: 10000000n, // 10 USDC per channel
|
|
19
|
+
strategy: 'lowest_price',
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* OpenClaw 自动配置
|
|
23
|
+
*
|
|
24
|
+
* 插件安装后自动注入到 OpenClaw 配置
|
|
25
|
+
*/
|
|
26
|
+
export const OPENCLAW_PROVIDER_CONFIG = {
|
|
27
|
+
name: 'clawmarket',
|
|
28
|
+
type: 'clawmarket',
|
|
29
|
+
models: [
|
|
30
|
+
'claude-opus-4',
|
|
31
|
+
'claude-sonnet-4',
|
|
32
|
+
'gpt-4',
|
|
33
|
+
'gpt-4-turbo'
|
|
34
|
+
],
|
|
35
|
+
default: true, // 设为默认 provider
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO;IACP,WAAW,EAAE,0BAA0B;IACvC,QAAQ,EAAE,0BAA0B;IACpC,OAAO,EAAE,wBAAwB;IAEjC,qBAAqB;IACrB,MAAM,EAAE,0BAA0B;IAClC,OAAO,EAAE,KAAK;IACd,eAAe,EAAE,4CAA6D;IAC9E,YAAY,EAAE,4CAA6D;IAE3E,OAAO;IACP,UAAU,EAAE,QAAU,EAAO,SAAS;IACtC,cAAc,EAAE,SAAW,EAAE,sBAAsB;IACnD,QAAQ,EAAE,cAAuB;CAClC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE;QACN,eAAe;QACf,iBAAiB;QACjB,OAAO;QACP,aAAa;KACd;IACD,OAAO,EAAE,IAAI,EAAG,gBAAgB;CACjC,CAAC"}
|