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.
Files changed (94) hide show
  1. package/README.md +142 -0
  2. package/dist/api-proxy.d.ts +11 -0
  3. package/dist/api-proxy.d.ts.map +1 -0
  4. package/dist/api-proxy.js +98 -0
  5. package/dist/api-proxy.js.map +1 -0
  6. package/dist/buyer/discovery.d.ts +52 -0
  7. package/dist/buyer/discovery.d.ts.map +1 -0
  8. package/dist/buyer/discovery.js +121 -0
  9. package/dist/buyer/discovery.js.map +1 -0
  10. package/dist/buyer/index.d.ts +4 -0
  11. package/dist/buyer/index.d.ts.map +1 -0
  12. package/dist/buyer/index.js +4 -0
  13. package/dist/buyer/index.js.map +1 -0
  14. package/dist/buyer/mode.d.ts +60 -0
  15. package/dist/buyer/mode.d.ts.map +1 -0
  16. package/dist/buyer/mode.js +150 -0
  17. package/dist/buyer/mode.js.map +1 -0
  18. package/dist/buyer/relay.d.ts +27 -0
  19. package/dist/buyer/relay.d.ts.map +1 -0
  20. package/dist/buyer/relay.js +103 -0
  21. package/dist/buyer/relay.js.map +1 -0
  22. package/dist/cli.d.ts +11 -0
  23. package/dist/cli.d.ts.map +1 -0
  24. package/dist/cli.js +252 -0
  25. package/dist/cli.js.map +1 -0
  26. package/dist/config.d.ts +29 -0
  27. package/dist/config.d.ts.map +1 -0
  28. package/dist/config.js +37 -0
  29. package/dist/config.js.map +1 -0
  30. package/dist/crypto/e2ee.d.ts +45 -0
  31. package/dist/crypto/e2ee.d.ts.map +1 -0
  32. package/dist/crypto/e2ee.js +87 -0
  33. package/dist/crypto/e2ee.js.map +1 -0
  34. package/dist/crypto/index.d.ts +3 -0
  35. package/dist/crypto/index.d.ts.map +1 -0
  36. package/dist/crypto/index.js +3 -0
  37. package/dist/crypto/index.js.map +1 -0
  38. package/dist/crypto/ticket.d.ts +62 -0
  39. package/dist/crypto/ticket.d.ts.map +1 -0
  40. package/dist/crypto/ticket.js +123 -0
  41. package/dist/crypto/ticket.js.map +1 -0
  42. package/dist/index.d.ts +11 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +13 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/local-proxy.d.ts +12 -0
  47. package/dist/local-proxy.d.ts.map +1 -0
  48. package/dist/local-proxy.js +593 -0
  49. package/dist/local-proxy.js.map +1 -0
  50. package/dist/openclaw-adapter.d.ts +105 -0
  51. package/dist/openclaw-adapter.d.ts.map +1 -0
  52. package/dist/openclaw-adapter.js +125 -0
  53. package/dist/openclaw-adapter.js.map +1 -0
  54. package/dist/provider.d.ts +116 -0
  55. package/dist/provider.d.ts.map +1 -0
  56. package/dist/provider.js +328 -0
  57. package/dist/provider.js.map +1 -0
  58. package/dist/seller/index.d.ts +4 -0
  59. package/dist/seller/index.d.ts.map +1 -0
  60. package/dist/seller/index.js +4 -0
  61. package/dist/seller/index.js.map +1 -0
  62. package/dist/seller/mode.d.ts +62 -0
  63. package/dist/seller/mode.d.ts.map +1 -0
  64. package/dist/seller/mode.js +179 -0
  65. package/dist/seller/mode.js.map +1 -0
  66. package/dist/seller/registry.d.ts +27 -0
  67. package/dist/seller/registry.d.ts.map +1 -0
  68. package/dist/seller/registry.js +95 -0
  69. package/dist/seller/registry.js.map +1 -0
  70. package/dist/seller/relay.d.ts +64 -0
  71. package/dist/seller/relay.d.ts.map +1 -0
  72. package/dist/seller/relay.js +171 -0
  73. package/dist/seller/relay.js.map +1 -0
  74. package/dist/seller-cli.d.ts +26 -0
  75. package/dist/seller-cli.d.ts.map +1 -0
  76. package/dist/seller-cli.js +354 -0
  77. package/dist/seller-cli.js.map +1 -0
  78. package/dist/seller-daemon.d.ts +7 -0
  79. package/dist/seller-daemon.d.ts.map +1 -0
  80. package/dist/seller-daemon.js +349 -0
  81. package/dist/seller-daemon.js.map +1 -0
  82. package/dist/types/config.d.ts +529 -0
  83. package/dist/types/config.d.ts.map +1 -0
  84. package/dist/types/config.js +81 -0
  85. package/dist/types/config.js.map +1 -0
  86. package/dist/types/index.d.ts +3 -0
  87. package/dist/types/index.d.ts.map +1 -0
  88. package/dist/types/index.js +3 -0
  89. package/dist/types/index.js.map +1 -0
  90. package/dist/types/protocol.d.ts +131 -0
  91. package/dist/types/protocol.d.ts.map +1 -0
  92. package/dist/types/protocol.js +2 -0
  93. package/dist/types/protocol.js.map +1 -0
  94. package/package.json +53 -0
@@ -0,0 +1,349 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ClawMarket Seller Daemon
4
+ * 读取 ~/.clawmarket/seller.json 配置,启动卖家节点
5
+ */
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
8
+ import * as os from 'os';
9
+ import * as http from 'http';
10
+ import * as https from 'https';
11
+ import * as crypto from 'crypto';
12
+ import WebSocket from 'ws';
13
+ const CLAWMARKET_DIR = path.join(os.homedir(), '.clawmarket');
14
+ const SELLER_CONFIG_PATH = path.join(CLAWMARKET_DIR, 'seller.json');
15
+ const SELLER_STATS_PATH = path.join(CLAWMARKET_DIR, 'seller-stats.json');
16
+ const TICKETS_DIR = path.join(CLAWMARKET_DIR, 'seller-tickets');
17
+ const REGISTRY_URL = process.env.REGISTRY_URL || 'http://shenjige.xyz:9080';
18
+ const RELAY_WS = process.env.RELAY_WS || 'ws://shenjige.xyz:9081';
19
+ const RELAY_TOKEN = process.env.RELAY_TOKEN || 'clawmarket2026';
20
+ if (!fs.existsSync(TICKETS_DIR))
21
+ fs.mkdirSync(TICKETS_DIR, { recursive: true });
22
+ // ============ 并发控制 & 自动保护 ============
23
+ let currentConcurrent = 0; // 当前并发数
24
+ let isOffline = false; // 是否下线(限额/错误触发)
25
+ let offlineUntil = 0; // 下线到什么时候(时间戳)
26
+ let consecutiveErrors = 0; // 连续错误计数
27
+ const OFFLINE_DURATION_MS = 5 * 60 * 1000; // 错误后下线 5 分钟
28
+ const MAX_CONSECUTIVE_ERRORS = 3; // 连续 3 次错误触发下线
29
+ function loadConfig() {
30
+ if (!fs.existsSync(SELLER_CONFIG_PATH)) {
31
+ console.error('❌ 未找到卖家配置,请先运行 clawmarket sell');
32
+ process.exit(1);
33
+ }
34
+ return JSON.parse(fs.readFileSync(SELLER_CONFIG_PATH, 'utf-8'));
35
+ }
36
+ function loadStats() {
37
+ const today = new Date().toISOString().slice(0, 10);
38
+ if (fs.existsSync(SELLER_STATS_PATH)) {
39
+ try {
40
+ const stats = JSON.parse(fs.readFileSync(SELLER_STATS_PATH, 'utf-8'));
41
+ if (stats.date === today)
42
+ return stats;
43
+ }
44
+ catch { }
45
+ }
46
+ return { date: today, requests: 0, earned: 0, sold: 0 };
47
+ }
48
+ function saveStats(stats) {
49
+ fs.writeFileSync(SELLER_STATS_PATH, JSON.stringify(stats, null, 2));
50
+ }
51
+ // ============ AI 调用 ============
52
+ function callAIStream(config, messages, onChunk, onEnd, onError) {
53
+ const isAnthropic = config.apiBaseUrl.includes('anthropic') || config.sourceType === 'claude-sub' || config.sourceType === 'api-key';
54
+ const payload = isAnthropic
55
+ ? JSON.stringify({ model: config.model, max_tokens: 8192, stream: true, messages })
56
+ : JSON.stringify({ model: config.model, max_tokens: 8192, stream: true, messages });
57
+ const apiPath = isAnthropic ? '/v1/messages' : '/v1/chat/completions';
58
+ const url = new URL(config.apiBaseUrl + apiPath);
59
+ const mod = url.protocol === 'https:' ? https : http;
60
+ const headers = { 'Content-Type': 'application/json' };
61
+ if (isAnthropic) {
62
+ headers['x-api-key'] = config.apiKey;
63
+ headers['anthropic-version'] = '2023-06-01';
64
+ }
65
+ else {
66
+ headers['Authorization'] = `Bearer ${config.apiKey}`;
67
+ }
68
+ const req = mod.request(url, { method: 'POST', headers }, (res) => {
69
+ let buffer = '';
70
+ let totalInputTokens = 0;
71
+ let totalOutputTokens = 0;
72
+ res.on('data', (chunk) => {
73
+ buffer += chunk.toString();
74
+ const lines = buffer.split('\n');
75
+ buffer = lines.pop();
76
+ for (const line of lines) {
77
+ if (!line.startsWith('data: '))
78
+ continue;
79
+ const data = line.slice(6).trim();
80
+ if (data === '[DONE]')
81
+ continue;
82
+ try {
83
+ const event = JSON.parse(data);
84
+ if (isAnthropic) {
85
+ if (event.type === 'message_start' && event.message?.usage) {
86
+ totalInputTokens = event.message.usage.input_tokens || 0;
87
+ }
88
+ if (event.type === 'content_block_delta' && event.delta?.text) {
89
+ onChunk(event.delta.text);
90
+ }
91
+ if (event.type === 'message_delta' && event.usage) {
92
+ totalOutputTokens = event.usage.output_tokens || 0;
93
+ }
94
+ if (event.type === 'message_stop') {
95
+ onEnd(totalInputTokens, totalOutputTokens);
96
+ }
97
+ }
98
+ else {
99
+ // OpenAI format
100
+ if (event.choices?.[0]?.delta?.content) {
101
+ onChunk(event.choices[0].delta.content);
102
+ }
103
+ if (event.usage) {
104
+ totalInputTokens = event.usage.prompt_tokens || 0;
105
+ totalOutputTokens = event.usage.completion_tokens || 0;
106
+ }
107
+ if (event.choices?.[0]?.finish_reason) {
108
+ onEnd(totalInputTokens, totalOutputTokens);
109
+ }
110
+ }
111
+ }
112
+ catch { }
113
+ }
114
+ });
115
+ res.on('end', () => { });
116
+ res.on('error', onError);
117
+ });
118
+ req.on('error', onError);
119
+ req.write(payload);
120
+ req.end();
121
+ }
122
+ // ============ 流式请求处理 ============
123
+ function sendMsg(ws, msg) {
124
+ if (ws.readyState === WebSocket.OPEN)
125
+ ws.send(JSON.stringify(msg));
126
+ }
127
+ function calculateCost(inputTokens, outputTokens, pricing) {
128
+ return (inputTokens / 1_000_000) * pricing.inputPer1m + (outputTokens / 1_000_000) * pricing.outputPer1m;
129
+ }
130
+ async function handleStreamRequest(msg, ws, config) {
131
+ const requestId = msg.request_id;
132
+ const maxConcurrent = config.maxConcurrent || 3;
133
+ // 检查是否下线中
134
+ if (isOffline) {
135
+ if (Date.now() < offlineUntil) {
136
+ const remainSec = Math.ceil((offlineUntil - Date.now()) / 1000);
137
+ console.log(`[保护] 下线中,还剩 ${remainSec} 秒,拒绝请求`);
138
+ sendMsg(ws, { type: 'error', request_id: requestId, payload: JSON.stringify({
139
+ error: { type: 'seller_offline', message: 'Seller temporarily offline', retry_after: remainSec }
140
+ }) });
141
+ return;
142
+ }
143
+ else {
144
+ // 下线时间到,恢复
145
+ isOffline = false;
146
+ offlineUntil = 0;
147
+ consecutiveErrors = 0;
148
+ console.log('[保护] 下线时间结束,恢复接单');
149
+ }
150
+ }
151
+ // 检查并发
152
+ if (currentConcurrent >= maxConcurrent) {
153
+ console.log(`[并发] 已满 ${currentConcurrent}/${maxConcurrent},拒绝请求`);
154
+ sendMsg(ws, { type: 'error', request_id: requestId, payload: JSON.stringify({
155
+ error: { type: 'concurrent_limit', message: 'Seller busy, try another' }
156
+ }) });
157
+ return;
158
+ }
159
+ // 检查每日上限
160
+ const stats = loadStats();
161
+ if (stats.sold >= config.dailyLimitUsd) {
162
+ console.log(`[限额] 今日已达上限 $${config.dailyLimitUsd},下线到零点`);
163
+ isOffline = true;
164
+ // 计算到今天零点的时间
165
+ const now = new Date();
166
+ const midnight = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, 0, 0, 0);
167
+ offlineUntil = midnight.getTime();
168
+ sendMsg(ws, { type: 'error', request_id: requestId, payload: JSON.stringify({
169
+ error: { type: 'daily_limit', message: 'Daily limit reached' }
170
+ }) });
171
+ return;
172
+ }
173
+ let request;
174
+ try {
175
+ request = typeof msg.payload === 'string' ? JSON.parse(msg.payload) : msg.payload;
176
+ }
177
+ catch {
178
+ request = { messages: [{ role: 'user', content: String(msg.payload) }] };
179
+ }
180
+ // 验证 ticket
181
+ const ticketData = request._clawmarket;
182
+ if (!ticketData || !ticketData.channelId || !ticketData.amount || !ticketData.nonce || !ticketData.signature || !ticketData.buyer) {
183
+ console.log('[Ticket] ❌ 缺少 ticket 或字段不完整,拒绝请求');
184
+ sendMsg(ws, { type: 'error', request_id: requestId, payload: JSON.stringify({
185
+ type: 'error', error: { type: 'payment_required', message: 'Valid ticket required' }
186
+ }) });
187
+ return;
188
+ }
189
+ console.log(`[Ticket] ✅ channel=${ticketData.channelId.slice(0, 12)}... nonce=${ticketData.nonce} amount=${(Number(ticketData.amount) / 1e6).toFixed(2)} USDC`);
190
+ // 清理内部字段
191
+ delete request._clawmarket;
192
+ const messages = request.messages || [{ role: 'user', content: String(request) }];
193
+ console.log(`[AI] 调用 ${config.model} (streaming)... 并发 ${currentConcurrent + 1}/${maxConcurrent}`);
194
+ // 增加并发计数
195
+ currentConcurrent++;
196
+ sendMsg(ws, { type: 'stream_start', request_id: requestId, payload: JSON.stringify({ model: config.model }) });
197
+ let totalText = '';
198
+ callAIStream(config, messages, (text) => {
199
+ totalText += text;
200
+ sendMsg(ws, { type: 'stream_chunk', request_id: requestId, payload: text });
201
+ }, (totalInput, totalOutput) => {
202
+ // 减少并发计数
203
+ currentConcurrent--;
204
+ // 成功,重置错误计数
205
+ consecutiveErrors = 0;
206
+ const cost = calculateCost(totalInput, totalOutput, config.pricing);
207
+ console.log(`[AI] 完成 input=${totalInput} output=${totalOutput} cost=$${cost.toFixed(6)}`);
208
+ sendMsg(ws, { type: 'stream_end', request_id: requestId, payload: JSON.stringify({
209
+ usage: { input_tokens: totalInput, output_tokens: totalOutput },
210
+ cost: cost.toFixed(6),
211
+ text_length: totalText.length
212
+ }) });
213
+ // 更新统计
214
+ const stats = loadStats();
215
+ stats.requests++;
216
+ stats.earned += cost;
217
+ stats.sold += cost;
218
+ saveStats(stats);
219
+ // 检查是否达到限额
220
+ if (stats.sold >= config.dailyLimitUsd) {
221
+ console.log(`[限额] 今日已达上限 $${config.dailyLimitUsd},下线到零点`);
222
+ isOffline = true;
223
+ const now = new Date();
224
+ const midnight = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, 0, 0, 0);
225
+ offlineUntil = midnight.getTime();
226
+ }
227
+ }, (err) => {
228
+ // 减少并发计数
229
+ currentConcurrent--;
230
+ console.error(`[AI] 错误: ${err.message}`);
231
+ sendMsg(ws, { type: 'error', request_id: requestId, payload: JSON.stringify({ error: err.message }) });
232
+ // 检查是否是上游限流/错误
233
+ const errMsg = err.message.toLowerCase();
234
+ if (errMsg.includes('429') || errMsg.includes('rate') || errMsg.includes('limit') ||
235
+ errMsg.includes('503') || errMsg.includes('502') || errMsg.includes('timeout')) {
236
+ consecutiveErrors++;
237
+ console.log(`[保护] 上游错误 (${consecutiveErrors}/${MAX_CONSECUTIVE_ERRORS})`);
238
+ if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) {
239
+ console.log(`[保护] 连续错误过多,下线 ${OFFLINE_DURATION_MS / 1000} 秒`);
240
+ isOffline = true;
241
+ offlineUntil = Date.now() + OFFLINE_DURATION_MS;
242
+ }
243
+ }
244
+ });
245
+ }
246
+ // ============ Registry + Relay ============
247
+ const config = loadConfig();
248
+ const pubKeyHex = crypto.randomBytes(32).toString('hex');
249
+ let sellerId;
250
+ let ws;
251
+ async function httpRequest(url, options = {}) {
252
+ return new Promise((resolve, reject) => {
253
+ const mod = url.startsWith('https') ? https : http;
254
+ const body = options.body;
255
+ delete options.body;
256
+ const req = mod.request(url, options, (res) => {
257
+ let data = '';
258
+ res.on('data', (chunk) => data += chunk);
259
+ res.on('end', () => { try {
260
+ resolve(JSON.parse(data));
261
+ }
262
+ catch {
263
+ resolve(data);
264
+ } });
265
+ });
266
+ req.on('error', reject);
267
+ if (body)
268
+ req.write(body);
269
+ req.end();
270
+ });
271
+ }
272
+ async function register() {
273
+ console.log('[注册] 向 Registry 注册...');
274
+ const result = await httpRequest(`${REGISTRY_URL}/v1/sellers/register`, {
275
+ method: 'POST', headers: { 'Content-Type': 'application/json' },
276
+ body: JSON.stringify({
277
+ public_key: pubKeyHex,
278
+ endpoint: RELAY_WS,
279
+ name: `seller-${os.hostname()}`,
280
+ models: [{
281
+ model: config.model,
282
+ input_per_1m: config.pricing.inputPer1m,
283
+ output_per_1m: config.pricing.outputPer1m,
284
+ daily_quota_usd: config.dailyLimitUsd
285
+ }],
286
+ region: config.region || 'auto'
287
+ })
288
+ });
289
+ sellerId = result.id;
290
+ console.log('[注册] 成功! ID:', sellerId);
291
+ }
292
+ function connectRelay() {
293
+ console.log('[Relay] 连接中...');
294
+ ws = new WebSocket(`${RELAY_WS}/relay?seller_id=${sellerId}&token=${RELAY_TOKEN}`);
295
+ ws.on('open', () => console.log('[Relay] 连接成功!\n'));
296
+ ws.on('message', async (data) => {
297
+ try {
298
+ const msg = JSON.parse(data.toString());
299
+ if (msg.type === 'request') {
300
+ console.log(`\n[请求] ${msg.request_id?.slice(0, 8)}...`);
301
+ handleStreamRequest(msg, ws, config);
302
+ }
303
+ }
304
+ catch (err) {
305
+ console.error('[错误]', err.message);
306
+ }
307
+ });
308
+ ws.on('close', () => { console.log('[Relay] 断开,5秒后重连...'); setTimeout(connectRelay, 5000); });
309
+ ws.on('error', (err) => console.error('[Relay] 错误:', err.message));
310
+ }
311
+ function startHeartbeat() {
312
+ setInterval(async () => {
313
+ try {
314
+ await httpRequest(`${REGISTRY_URL}/v1/sellers/${sellerId}/heartbeat`, {
315
+ method: 'PUT', headers: { 'Content-Type': 'application/json' },
316
+ body: JSON.stringify({ latency_ms: 100 })
317
+ });
318
+ }
319
+ catch { }
320
+ }, 20000);
321
+ // 每日重置统计
322
+ setInterval(() => {
323
+ const stats = loadStats();
324
+ const today = new Date().toISOString().slice(0, 10);
325
+ if (stats.date !== today) {
326
+ saveStats({ date: today, requests: 0, earned: 0, sold: 0 });
327
+ console.log('[统计] 新的一天,计数器已重置');
328
+ }
329
+ }, 60000);
330
+ }
331
+ // ============ 启动 ============
332
+ async function main() {
333
+ process.on('uncaughtException', (err) => console.error('[致命]', err.message));
334
+ process.on('unhandledRejection', (reason) => console.error('[致命]', reason?.message || reason));
335
+ console.log('╔════════════════════════════════════════════════════════════╗');
336
+ console.log('║ ClawMarket Seller Daemon ║');
337
+ console.log('╚════════════════════════════════════════════════════════════╝\n');
338
+ console.log('[配置] 模型:', config.model);
339
+ console.log('[配置] 来源:', config.sourceType);
340
+ console.log('[配置] 定价: $' + config.pricing.inputPer1m + '/M 输入, $' + config.pricing.outputPer1m + '/M 输出');
341
+ console.log('[配置] 并发上限:', config.maxConcurrent || 3);
342
+ console.log('[配置] 每日上限: $' + config.dailyLimitUsd);
343
+ await register();
344
+ connectRelay();
345
+ startHeartbeat();
346
+ console.log('[状态] 等待买家请求...\n');
347
+ }
348
+ main().catch(console.error);
349
+ //# sourceMappingURL=seller-daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seller-daemon.js","sourceRoot":"","sources":["../src/seller-daemon.ts"],"names":[],"mappings":"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"}