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,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":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ClawMarket CLI - 一键配置 + 启动代理
4
+ *
5
+ * 用法:
6
+ * clawmarket - 配置 OpenClaw + 启动代理
7
+ * clawmarket setup - 只配置,不启动代理
8
+ * clawmarket status - 查看状态
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=cli.d.ts.map
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -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"}