@123456btc/123456btc-cli 1.0.0 → 1.0.2
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/api/client.d.ts +4 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +74 -16
- package/dist/api/client.js.map +1 -1
- package/dist/api/provider.d.ts +163 -0
- package/dist/api/provider.d.ts.map +1 -0
- package/dist/api/provider.js +123 -0
- package/dist/api/provider.js.map +1 -0
- package/dist/api/signal-crypto.d.ts +17 -0
- package/dist/api/signal-crypto.d.ts.map +1 -0
- package/dist/api/signal-crypto.js +48 -0
- package/dist/api/signal-crypto.js.map +1 -0
- package/dist/api/signals.d.ts +47 -0
- package/dist/api/signals.d.ts.map +1 -0
- package/dist/api/signals.js +34 -0
- package/dist/api/signals.js.map +1 -0
- package/dist/api/strategy-stream.d.ts +59 -0
- package/dist/api/strategy-stream.d.ts.map +1 -0
- package/dist/api/strategy-stream.js +136 -0
- package/dist/api/strategy-stream.js.map +1 -0
- package/dist/api/strategy.d.ts +66 -20
- package/dist/api/strategy.d.ts.map +1 -1
- package/dist/api/strategy.js +15 -18
- package/dist/api/strategy.js.map +1 -1
- package/dist/api/token-manager.d.ts +37 -0
- package/dist/api/token-manager.d.ts.map +1 -0
- package/dist/api/token-manager.js +191 -0
- package/dist/api/token-manager.js.map +1 -0
- package/dist/api/wallet.d.ts +38 -0
- package/dist/api/wallet.d.ts.map +1 -0
- package/dist/api/wallet.js +23 -0
- package/dist/api/wallet.js.map +1 -0
- package/dist/cli.js +12 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +149 -3
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/gas.d.ts.map +1 -1
- package/dist/commands/gas.js +10 -9
- package/dist/commands/gas.js.map +1 -1
- package/dist/commands/health.d.ts +3 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +77 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +156 -50
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/provider.d.ts +3 -0
- package/dist/commands/provider.d.ts.map +1 -0
- package/dist/commands/provider.js +371 -0
- package/dist/commands/provider.js.map +1 -0
- package/dist/commands/signals.d.ts +3 -0
- package/dist/commands/signals.d.ts.map +1 -0
- package/dist/commands/signals.js +104 -0
- package/dist/commands/signals.js.map +1 -0
- package/dist/commands/strategy.d.ts.map +1 -1
- package/dist/commands/strategy.js +156 -67
- package/dist/commands/strategy.js.map +1 -1
- package/dist/commands/tier.d.ts +3 -0
- package/dist/commands/tier.d.ts.map +1 -0
- package/dist/commands/tier.js +105 -0
- package/dist/commands/tier.js.map +1 -0
- package/dist/commands/vault.d.ts +7 -0
- package/dist/commands/vault.d.ts.map +1 -0
- package/dist/commands/vault.js +377 -0
- package/dist/commands/vault.js.map +1 -0
- package/dist/commands/wallet.d.ts +3 -0
- package/dist/commands/wallet.d.ts.map +1 -0
- package/dist/commands/wallet.js +74 -0
- package/dist/commands/wallet.js.map +1 -0
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +16 -2
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +12 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -6
- package/dist/index.js.map +1 -1
- package/dist/providers/executor.d.ts +55 -20
- package/dist/providers/executor.d.ts.map +1 -1
- package/dist/providers/executor.js +260 -58
- package/dist/providers/executor.js.map +1 -1
- package/dist/providers/risk.d.ts +17 -0
- package/dist/providers/risk.d.ts.map +1 -0
- package/dist/providers/risk.js +67 -0
- package/dist/providers/risk.js.map +1 -0
- package/dist/providers/state.d.ts +30 -0
- package/dist/providers/state.d.ts.map +1 -0
- package/dist/providers/state.js +190 -0
- package/dist/providers/state.js.map +1 -0
- package/dist/types/strategy.d.ts +65 -1
- package/dist/types/strategy.d.ts.map +1 -1
- package/dist/types/strategy.js +1 -0
- package/dist/types/strategy.js.map +1 -1
- package/dist/utils/auth.d.ts +10 -0
- package/dist/utils/auth.d.ts.map +1 -0
- package/dist/utils/auth.js +26 -0
- package/dist/utils/auth.js.map +1 -0
- package/dist/utils/device.d.ts +13 -0
- package/dist/utils/device.d.ts.map +1 -0
- package/dist/utils/device.js +104 -0
- package/dist/utils/device.js.map +1 -0
- package/dist/vault/backends/file.d.ts +15 -0
- package/dist/vault/backends/file.d.ts.map +1 -0
- package/dist/vault/backends/file.js +39 -0
- package/dist/vault/backends/file.js.map +1 -0
- package/dist/vault/backends/os-keychain.d.ts +13 -0
- package/dist/vault/backends/os-keychain.d.ts.map +1 -0
- package/dist/vault/backends/os-keychain.js +60 -0
- package/dist/vault/backends/os-keychain.js.map +1 -0
- package/dist/vault/backends/os-secret.d.ts +13 -0
- package/dist/vault/backends/os-secret.d.ts.map +1 -0
- package/dist/vault/backends/os-secret.js +57 -0
- package/dist/vault/backends/os-secret.js.map +1 -0
- package/dist/vault/backends/os-win-cred.d.ts +13 -0
- package/dist/vault/backends/os-win-cred.d.ts.map +1 -0
- package/dist/vault/backends/os-win-cred.js +76 -0
- package/dist/vault/backends/os-win-cred.js.map +1 -0
- package/dist/vault/crypto.d.ts +49 -0
- package/dist/vault/crypto.d.ts.map +1 -0
- package/dist/vault/crypto.js +122 -0
- package/dist/vault/crypto.js.map +1 -0
- package/dist/vault/index.d.ts +88 -0
- package/dist/vault/index.d.ts.map +1 -0
- package/dist/vault/index.js +276 -0
- package/dist/vault/index.js.map +1 -0
- package/dist/vault/storage.d.ts +14 -0
- package/dist/vault/storage.d.ts.map +1 -0
- package/dist/vault/storage.js +68 -0
- package/dist/vault/storage.js.map +1 -0
- package/dist/vault/types.d.ts +41 -0
- package/dist/vault/types.d.ts.map +1 -0
- package/dist/vault/types.js +6 -0
- package/dist/vault/types.js.map +1 -0
- package/package.json +3 -1
package/dist/commands/install.js
CHANGED
|
@@ -42,16 +42,127 @@ const inquirer_1 = __importDefault(require("inquirer"));
|
|
|
42
42
|
const axios_1 = __importDefault(require("axios"));
|
|
43
43
|
const fs = __importStar(require("fs"));
|
|
44
44
|
const path = __importStar(require("path"));
|
|
45
|
+
const tar = __importStar(require("tar"));
|
|
46
|
+
const auth_1 = require("../utils/auth");
|
|
45
47
|
const PACKAGES_DIR = path.join(process.env.HOME || process.env.USERPROFILE || '.', '.123456btc-cli', 'packages');
|
|
46
48
|
function createInstallCommand(program) {
|
|
47
49
|
const installCmd = new commander_1.Command('install');
|
|
48
|
-
//
|
|
50
|
+
// List installed packages
|
|
51
|
+
installCmd
|
|
52
|
+
.command('list')
|
|
53
|
+
.description('List installed packages')
|
|
54
|
+
.action(() => {
|
|
55
|
+
if (!fs.existsSync(PACKAGES_DIR)) {
|
|
56
|
+
console.log('No packages installed');
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const packages = fs.readdirSync(PACKAGES_DIR);
|
|
60
|
+
if (packages.length === 0) {
|
|
61
|
+
console.log('No packages installed');
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
console.log('Installed Packages:');
|
|
65
|
+
console.log('='.repeat(60));
|
|
66
|
+
packages.forEach((pkg) => {
|
|
67
|
+
const manifestPath = path.join(PACKAGES_DIR, pkg, 'manifest.json');
|
|
68
|
+
if (fs.existsSync(manifestPath)) {
|
|
69
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
|
|
70
|
+
console.log(` ${manifest.name} v${manifest.version}`);
|
|
71
|
+
console.log(` Entry: ${manifest.entryPoint}`);
|
|
72
|
+
console.log(` Installed: ${manifest.installedAt}`);
|
|
73
|
+
console.log(` AI Compatible: ${manifest.aiCompatible || 'N/A'}`);
|
|
74
|
+
console.log(` LLM Compatible: ${manifest.llmCompatible || 'N/A'}`);
|
|
75
|
+
console.log('');
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
// Uninstall package
|
|
80
|
+
installCmd
|
|
81
|
+
.command('uninstall <name>')
|
|
82
|
+
.description('Uninstall a package')
|
|
83
|
+
.option('--force', 'Force uninstall without confirmation')
|
|
84
|
+
.action(async (name, options) => {
|
|
85
|
+
const packageDir = path.join(PACKAGES_DIR, name);
|
|
86
|
+
if (!fs.existsSync(packageDir)) {
|
|
87
|
+
console.error(`Package not found: ${name}`);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (!options.force) {
|
|
91
|
+
const answers = await inquirer_1.default.prompt([
|
|
92
|
+
{
|
|
93
|
+
type: 'confirm',
|
|
94
|
+
name: 'confirm',
|
|
95
|
+
message: `Uninstall ${name}?`,
|
|
96
|
+
default: true,
|
|
97
|
+
},
|
|
98
|
+
]);
|
|
99
|
+
if (!answers.confirm) {
|
|
100
|
+
console.log('Cancelled');
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Remove package directory
|
|
105
|
+
fs.rmSync(packageDir, { recursive: true, force: true });
|
|
106
|
+
console.log(`✓ Package uninstalled: ${name}`);
|
|
107
|
+
});
|
|
108
|
+
// Update package
|
|
109
|
+
installCmd
|
|
110
|
+
.command('update <name>')
|
|
111
|
+
.description('Update a package to latest version')
|
|
112
|
+
.action(async (name, options) => {
|
|
113
|
+
const packageDir = path.join(PACKAGES_DIR, name);
|
|
114
|
+
if (!fs.existsSync(packageDir)) {
|
|
115
|
+
console.error(`Package not found: ${name}`);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const manifestPath = path.join(packageDir, 'manifest.json');
|
|
119
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
|
|
120
|
+
console.log(`Updating package: ${name}`);
|
|
121
|
+
console.log(` Current version: ${manifest.version}`);
|
|
122
|
+
// Re-fetch package info
|
|
123
|
+
const packageUrl = manifest.packageUrl;
|
|
124
|
+
if (!packageUrl) {
|
|
125
|
+
console.error('Package URL not found in manifest');
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
const response = await axios_1.default.get(`${packageUrl}/package.json`);
|
|
130
|
+
const newVersion = response.data.version;
|
|
131
|
+
if (newVersion === manifest.version) {
|
|
132
|
+
console.log('Already up to date');
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
console.log(` New version: ${newVersion}`);
|
|
136
|
+
const answers = await inquirer_1.default.prompt([
|
|
137
|
+
{
|
|
138
|
+
type: 'confirm',
|
|
139
|
+
name: 'confirm',
|
|
140
|
+
message: `Update ${name} to v${newVersion}?`,
|
|
141
|
+
default: true,
|
|
142
|
+
},
|
|
143
|
+
]);
|
|
144
|
+
if (!answers.confirm) {
|
|
145
|
+
console.log('Cancelled');
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// Download and extract
|
|
149
|
+
await downloadAndExtractPackage(packageUrl, name, packageDir);
|
|
150
|
+
console.log(`✓ Package updated: ${name} v${manifest.version} -> v${newVersion}`);
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
const err = error;
|
|
154
|
+
console.error('Update failed:', err.message);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
// Install package
|
|
49
158
|
installCmd
|
|
50
159
|
.command('package <url>')
|
|
51
160
|
.description('Install an OpenClaw-compatible package')
|
|
52
161
|
.option('--name <name>', 'Package name')
|
|
53
162
|
.option('--force', 'Force reinstall')
|
|
54
163
|
.action(async (url, options) => {
|
|
164
|
+
// Check auth
|
|
165
|
+
const creds = (0, auth_1.checkAuth)();
|
|
55
166
|
// Download package info
|
|
56
167
|
console.log('Fetching package info from:', url);
|
|
57
168
|
let packageInfo;
|
|
@@ -96,56 +207,51 @@ function createInstallCommand(program) {
|
|
|
96
207
|
if (!fs.existsSync(PACKAGES_DIR)) {
|
|
97
208
|
fs.mkdirSync(PACKAGES_DIR, { recursive: true });
|
|
98
209
|
}
|
|
99
|
-
// Download
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const packageUrl = `${url}/package.tar.gz`;
|
|
103
|
-
const response = await axios_1.default.get(packageUrl, {
|
|
104
|
-
responseType: 'arraybuffer',
|
|
105
|
-
});
|
|
106
|
-
// Save package (simplified - in reality would extract)
|
|
107
|
-
const packagePath = path.join(PACKAGES_DIR, packageInfo.name || 'package');
|
|
108
|
-
fs.mkdirSync(packagePath, { recursive: true });
|
|
109
|
-
const manifest = {
|
|
110
|
-
name: packageInfo.name,
|
|
111
|
-
version: packageInfo.version,
|
|
112
|
-
entryPoint: packageInfo.entryPoint,
|
|
113
|
-
installedAt: new Date().toISOString(),
|
|
114
|
-
};
|
|
115
|
-
fs.writeFileSync(path.join(packagePath, 'manifest.json'), JSON.stringify(manifest, null, 2));
|
|
116
|
-
console.log('✓ Package installed to:', packagePath);
|
|
117
|
-
}
|
|
118
|
-
catch (error) {
|
|
119
|
-
const err = error;
|
|
120
|
-
console.error('Download failed:', err.message);
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
// List installed packages
|
|
124
|
-
installCmd
|
|
125
|
-
.command('list')
|
|
126
|
-
.description('List installed packages')
|
|
127
|
-
.action(() => {
|
|
128
|
-
if (!fs.existsSync(PACKAGES_DIR)) {
|
|
129
|
-
console.log('No packages installed');
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
const packages = fs.readdirSync(PACKAGES_DIR);
|
|
133
|
-
if (packages.length === 0) {
|
|
134
|
-
console.log('No packages installed');
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
|
-
console.log('Installed Packages:');
|
|
138
|
-
console.log('='.repeat(60));
|
|
139
|
-
packages.forEach((pkg) => {
|
|
140
|
-
const manifestPath = path.join(PACKAGES_DIR, pkg, 'manifest.json');
|
|
141
|
-
if (fs.existsSync(manifestPath)) {
|
|
142
|
-
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
|
|
143
|
-
console.log(` ${manifest.name} v${manifest.version}`);
|
|
144
|
-
console.log(` Entry: ${manifest.entryPoint}`);
|
|
145
|
-
console.log(` Installed: ${manifest.installedAt}`);
|
|
146
|
-
}
|
|
147
|
-
});
|
|
210
|
+
// Download and extract
|
|
211
|
+
await downloadAndExtractPackage(url, packageInfo.name || 'package', packageDir);
|
|
212
|
+
console.log(`✓ Package installed: ${packageInfo.name} v${packageInfo.version}`);
|
|
148
213
|
});
|
|
149
214
|
program.addCommand(installCmd);
|
|
150
215
|
}
|
|
216
|
+
/**
|
|
217
|
+
* Download and extract a package
|
|
218
|
+
*/
|
|
219
|
+
async function downloadAndExtractPackage(url, packageName, packageDir) {
|
|
220
|
+
const packageUrl = `${url}/package.tar.gz`;
|
|
221
|
+
console.log(`\nDownloading package from: ${packageUrl}`);
|
|
222
|
+
// Download tarball
|
|
223
|
+
const response = await axios_1.default.get(packageUrl, {
|
|
224
|
+
responseType: 'arraybuffer',
|
|
225
|
+
});
|
|
226
|
+
// Extract to package directory
|
|
227
|
+
console.log(`Extracting to: ${packageDir}`);
|
|
228
|
+
if (!fs.existsSync(packageDir)) {
|
|
229
|
+
fs.mkdirSync(packageDir, { recursive: true });
|
|
230
|
+
}
|
|
231
|
+
// Extract tarball
|
|
232
|
+
await tar.x({
|
|
233
|
+
file: packageUrl,
|
|
234
|
+
cwd: packageDir,
|
|
235
|
+
});
|
|
236
|
+
// Create manifest
|
|
237
|
+
const manifest = {
|
|
238
|
+
name: packageName,
|
|
239
|
+
version: '1.0.0', // Will be updated from package.json
|
|
240
|
+
entryPoint: 'index.js', // Default, will be updated
|
|
241
|
+
installedAt: new Date().toISOString(),
|
|
242
|
+
packageUrl: url,
|
|
243
|
+
aiCompatible: true,
|
|
244
|
+
llmCompatible: true,
|
|
245
|
+
};
|
|
246
|
+
// Read actual manifest from extracted package
|
|
247
|
+
const extractedManifestPath = path.join(packageDir, 'package.json');
|
|
248
|
+
if (fs.existsSync(extractedManifestPath)) {
|
|
249
|
+
const extractedManifest = JSON.parse(fs.readFileSync(extractedManifestPath, 'utf-8'));
|
|
250
|
+
manifest.version = extractedManifest.version || '1.0.0';
|
|
251
|
+
manifest.entryPoint = extractedManifest.main || 'index.js';
|
|
252
|
+
manifest.aiCompatible = extractedManifest.aiCompatible || true;
|
|
253
|
+
manifest.llmCompatible = extractedManifest.llmCompatible || true;
|
|
254
|
+
}
|
|
255
|
+
fs.writeFileSync(path.join(packageDir, 'manifest.json'), JSON.stringify(manifest, null, 2));
|
|
256
|
+
}
|
|
151
257
|
//# sourceMappingURL=install.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/commands/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QA8XrD"}
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createProviderCommand = createProviderCommand;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const client_1 = require("../api/client");
|
|
6
|
+
const provider_1 = require("../api/provider");
|
|
7
|
+
const auth_1 = require("../utils/auth");
|
|
8
|
+
function createProviderCommand(program) {
|
|
9
|
+
const providerCmd = new commander_1.Command('provider');
|
|
10
|
+
function getClient(jwt) {
|
|
11
|
+
const creds = (0, auth_1.checkAuth)();
|
|
12
|
+
if (jwt && creds.jwt) {
|
|
13
|
+
// Provider 管理操作使用 JWT 直接认证
|
|
14
|
+
return new client_1.ApiClient(creds.baseUrl.replace('/ext-api', '/api'), creds.jwt);
|
|
15
|
+
}
|
|
16
|
+
return new client_1.ApiClient(creds.baseUrl, creds.apiKey);
|
|
17
|
+
}
|
|
18
|
+
// ── Provider 入驻 ──
|
|
19
|
+
providerCmd
|
|
20
|
+
.command('apply')
|
|
21
|
+
.description('Apply to become a strategy provider (requires ≥1M BBT)')
|
|
22
|
+
.requiredOption('-n, --name <name>', 'Provider name')
|
|
23
|
+
.option('-d, --description <desc>', 'Description')
|
|
24
|
+
.option('-e, --email <email>', 'Contact email')
|
|
25
|
+
.action(async (options) => {
|
|
26
|
+
const client = getClient(true);
|
|
27
|
+
const providerApi = new provider_1.ProviderApi(client);
|
|
28
|
+
console.log('Applying to become a provider...');
|
|
29
|
+
const response = await providerApi.apply({
|
|
30
|
+
name: options.name,
|
|
31
|
+
description: options.description,
|
|
32
|
+
contact_email: options.email,
|
|
33
|
+
});
|
|
34
|
+
if (response.success && response.data) {
|
|
35
|
+
console.log('✓ Application successful!');
|
|
36
|
+
console.log(` Provider ID: ${response.data.provider_id}`);
|
|
37
|
+
console.log(` Name: ${response.data.name}`);
|
|
38
|
+
console.log(` BBT Verified: ${response.data.bbt_verified}`);
|
|
39
|
+
console.log('');
|
|
40
|
+
console.log('⚠️ IMPORTANT: Your Provider Key is shown below. SAVE IT NOW!');
|
|
41
|
+
console.log(` Key: ${response.data.key}`);
|
|
42
|
+
console.log(` Prefix: ${response.data.prefix}`);
|
|
43
|
+
console.log('');
|
|
44
|
+
console.log(' Store it in your environment:');
|
|
45
|
+
console.log(` export PROVIDER_API_KEY=${response.data.key}`);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
console.error('Application failed:', response.error?.message);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
// ── Provider 信息 ──
|
|
52
|
+
providerCmd
|
|
53
|
+
.command('me')
|
|
54
|
+
.description('Show my provider info and stats')
|
|
55
|
+
.action(async () => {
|
|
56
|
+
const client = getClient(true);
|
|
57
|
+
const providerApi = new provider_1.ProviderApi(client);
|
|
58
|
+
const response = await providerApi.me();
|
|
59
|
+
if (response.success && response.data) {
|
|
60
|
+
const p = response.data.provider;
|
|
61
|
+
const s = response.data;
|
|
62
|
+
console.log('Provider Info:');
|
|
63
|
+
console.log('='.repeat(60));
|
|
64
|
+
console.log(` ID: ${p.id}`);
|
|
65
|
+
console.log(` Name: ${p.name}`);
|
|
66
|
+
console.log(` Status: ${p.status}`);
|
|
67
|
+
console.log(` Contact: ${p.contact_email || 'N/A'}`);
|
|
68
|
+
console.log('');
|
|
69
|
+
console.log('Stats:');
|
|
70
|
+
console.log(` Strategies: ${s.strategy_count}`);
|
|
71
|
+
console.log(` Signals Pushed: ${p.total_signals_pushed}`);
|
|
72
|
+
console.log(` Active Subscriptions: ${s.active_subscriptions}`);
|
|
73
|
+
console.log(` Total Earnings: ${p.total_earnings} BBT`);
|
|
74
|
+
console.log(` Total Burned: ${p.total_burned} BBT`);
|
|
75
|
+
console.log(` Total Settled: ${p.total_revenue_settled} BBT`);
|
|
76
|
+
console.log(` Pending Reviews: ${s.pending_review_count}`);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
console.error('Error:', response.error?.message);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
// ── 收益查询 ──
|
|
83
|
+
providerCmd
|
|
84
|
+
.command('earnings')
|
|
85
|
+
.description('Show earnings summary and available balance')
|
|
86
|
+
.action(async () => {
|
|
87
|
+
const client = getClient(true);
|
|
88
|
+
const providerApi = new provider_1.ProviderApi(client);
|
|
89
|
+
const response = await providerApi.earnings();
|
|
90
|
+
if (response.success && response.data) {
|
|
91
|
+
const e = response.data;
|
|
92
|
+
console.log('Earnings Summary:');
|
|
93
|
+
console.log('='.repeat(60));
|
|
94
|
+
console.log(` Total Earnings: ${e.total_earnings.toFixed(6)} BBT`);
|
|
95
|
+
console.log(` Total Settled: ${e.total_settled.toFixed(6)} BBT`);
|
|
96
|
+
console.log(` Available: ${e.available.toFixed(6)} BBT`);
|
|
97
|
+
console.log(` Pending Withdrawal: ${e.pending_withdrawal.toFixed(6)} BBT`);
|
|
98
|
+
console.log(` Approved Withdrawal: ${e.approved_withdrawal.toFixed(6)} BBT`);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
console.error('Error:', response.error?.message);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
// ── 申请提现 ──
|
|
105
|
+
providerCmd
|
|
106
|
+
.command('withdraw')
|
|
107
|
+
.description('Request a withdrawal')
|
|
108
|
+
.requiredOption('-a, --amount <amount>', 'Amount in BBT')
|
|
109
|
+
.requiredOption('-s, --sol-address <address>', 'Solana receiving address')
|
|
110
|
+
.action(async (options) => {
|
|
111
|
+
const client = getClient(true);
|
|
112
|
+
const providerApi = new provider_1.ProviderApi(client);
|
|
113
|
+
const amount = parseFloat(options.amount);
|
|
114
|
+
console.log(`Requesting withdrawal of ${amount} BBT to ${options.solAddress}...`);
|
|
115
|
+
const response = await providerApi.withdraw({
|
|
116
|
+
amount,
|
|
117
|
+
sol_address: options.solAddress,
|
|
118
|
+
});
|
|
119
|
+
if (response.success && response.data) {
|
|
120
|
+
console.log('✓ Withdrawal request submitted');
|
|
121
|
+
console.log(` ID: ${response.data.id}`);
|
|
122
|
+
console.log(` Amount: ${response.data.amount} BBT`);
|
|
123
|
+
console.log(` Status: ${response.data.status}`);
|
|
124
|
+
console.log(' Waiting for admin approval...');
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
console.error('Withdrawal failed:', response.error?.message);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
// ── 提现记录 ──
|
|
131
|
+
providerCmd
|
|
132
|
+
.command('withdrawals')
|
|
133
|
+
.description('Show withdrawal history')
|
|
134
|
+
.action(async () => {
|
|
135
|
+
const client = getClient(true);
|
|
136
|
+
const providerApi = new provider_1.ProviderApi(client);
|
|
137
|
+
const response = await providerApi.withdrawals();
|
|
138
|
+
if (response.success && response.data) {
|
|
139
|
+
console.log('Withdrawal History:');
|
|
140
|
+
console.log('='.repeat(80));
|
|
141
|
+
if (response.data.withdrawals.length === 0) {
|
|
142
|
+
console.log('No withdrawals found.');
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
response.data.withdrawals.forEach((w) => {
|
|
146
|
+
console.log(` ${w.id} — ${w.amount} BBT — ${w.status.toUpperCase()}`);
|
|
147
|
+
console.log(` Sol Address: ${w.sol_address}`);
|
|
148
|
+
if (w.note)
|
|
149
|
+
console.log(` Note: ${w.note}`);
|
|
150
|
+
if (w.tx_signature)
|
|
151
|
+
console.log(` Tx: ${w.tx_signature}`);
|
|
152
|
+
console.log(` Created: ${new Date(w.created_at).toISOString()}`);
|
|
153
|
+
console.log('');
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
console.error('Error:', response.error?.message);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
// ── 我的策略 ──
|
|
161
|
+
providerCmd
|
|
162
|
+
.command('strategies')
|
|
163
|
+
.description('List my strategies')
|
|
164
|
+
.action(async () => {
|
|
165
|
+
const client = getClient(true);
|
|
166
|
+
const providerApi = new provider_1.ProviderApi(client);
|
|
167
|
+
const response = await providerApi.strategies();
|
|
168
|
+
if (response.success && response.data) {
|
|
169
|
+
console.log('My Strategies:');
|
|
170
|
+
console.log('='.repeat(80));
|
|
171
|
+
if (response.data.strategies.length === 0) {
|
|
172
|
+
console.log('No strategies yet. Create one with: provider create-strategy');
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
response.data.strategies.forEach((s) => {
|
|
176
|
+
const pricing = s.pricing_model === 'free'
|
|
177
|
+
? 'Free'
|
|
178
|
+
: s.pricing_model === 'daily_bbt'
|
|
179
|
+
? `${s.price_per_day} BBT/day`
|
|
180
|
+
: `${s.price_per_signal} BBT/signal`;
|
|
181
|
+
console.log(` ${s.id} [${s.status}] [${s.review_status}]`);
|
|
182
|
+
console.log(` Name: ${s.name}`);
|
|
183
|
+
console.log(` Market: ${s.market_type} | Symbol: ${s.symbol_pattern || 'N/A'}`);
|
|
184
|
+
console.log(` Pricing: ${pricing}`);
|
|
185
|
+
console.log(` Subscribers: ${s.subscriber_count} | Signals: ${s.total_signals}`);
|
|
186
|
+
console.log('');
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
console.error('Error:', response.error?.message);
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
// ── 创建策略 ──
|
|
194
|
+
providerCmd
|
|
195
|
+
.command('create-strategy')
|
|
196
|
+
.description('Create a new strategy (draft)')
|
|
197
|
+
.requiredOption('-n, --name <name>', 'Strategy name')
|
|
198
|
+
.requiredOption('--symbol <pattern>', 'Symbol pattern (e.g. BTC,ETH)')
|
|
199
|
+
.requiredOption('--market <type>', 'Market type: crypto, stock, futures, forex, options')
|
|
200
|
+
.requiredOption('--pricing <model>', 'Pricing: free, daily_bbt, per_signal_bbt')
|
|
201
|
+
.option('-d, --description <desc>', 'Description')
|
|
202
|
+
.option('--price-day <num>', 'Price per day (for daily_bbt)')
|
|
203
|
+
.option('--price-signal <num>', 'Price per signal (for per_signal_bbt)')
|
|
204
|
+
.option('--min-bbt <num>', 'Minimum BBT tier required')
|
|
205
|
+
.option('--burn-rate <num>', 'Burn rate (default 0.7)', '0.7')
|
|
206
|
+
.option('--provider-rate <num>', 'Provider revenue rate (default 0.3)', '0.3')
|
|
207
|
+
.action(async (options) => {
|
|
208
|
+
const client = getClient(true);
|
|
209
|
+
const providerApi = new provider_1.ProviderApi(client);
|
|
210
|
+
const body = {
|
|
211
|
+
name: options.name,
|
|
212
|
+
description: options.description || '',
|
|
213
|
+
symbol_pattern: options.symbol,
|
|
214
|
+
market_type: options.market,
|
|
215
|
+
pricing_model: options.pricing,
|
|
216
|
+
};
|
|
217
|
+
if (options.priceDay)
|
|
218
|
+
body.price_per_day = parseFloat(options.priceDay);
|
|
219
|
+
if (options.priceSignal)
|
|
220
|
+
body.price_per_signal = parseFloat(options.priceSignal);
|
|
221
|
+
if (options.minBbt)
|
|
222
|
+
body.min_bbt_tier = parseInt(options.minBbt);
|
|
223
|
+
body.burn_rate = parseFloat(options.burnRate);
|
|
224
|
+
body.provider_revenue_rate = parseFloat(options.providerRate);
|
|
225
|
+
const response = await providerApi.createStrategy(body);
|
|
226
|
+
if (response.success && response.data) {
|
|
227
|
+
console.log('✓ Strategy created');
|
|
228
|
+
console.log(` ID: ${response.data.id}`);
|
|
229
|
+
console.log(` Name: ${response.data.name}`);
|
|
230
|
+
console.log(` Status: ${response.data.status}`);
|
|
231
|
+
console.log('');
|
|
232
|
+
console.log(` Submit for review: provider submit ${response.data.id}`);
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
console.error('Create failed:', response.error?.message);
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
// ── 提交审核 ──
|
|
239
|
+
providerCmd
|
|
240
|
+
.command('submit <strategyId>')
|
|
241
|
+
.description('Submit strategy for admin review')
|
|
242
|
+
.action(async (strategyId) => {
|
|
243
|
+
const client = getClient(true);
|
|
244
|
+
const providerApi = new provider_1.ProviderApi(client);
|
|
245
|
+
const response = await providerApi.submitStrategy(strategyId);
|
|
246
|
+
if (response.success && response.data) {
|
|
247
|
+
console.log('✓ Strategy submitted for review');
|
|
248
|
+
console.log(` Status: ${response.data.status}`);
|
|
249
|
+
console.log(` Review: ${response.data.review_status}`);
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
console.error('Submit failed:', response.error?.message);
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
// ── 暂停策略 ──
|
|
256
|
+
providerCmd
|
|
257
|
+
.command('pause <strategyId>')
|
|
258
|
+
.description('Pause a live strategy')
|
|
259
|
+
.action(async (strategyId) => {
|
|
260
|
+
const client = getClient(true);
|
|
261
|
+
const providerApi = new provider_1.ProviderApi(client);
|
|
262
|
+
const response = await providerApi.pauseStrategy(strategyId);
|
|
263
|
+
if (response.success && response.data) {
|
|
264
|
+
console.log(`✓ Strategy paused (${response.data.status})`);
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
console.error('Error:', response.error?.message);
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
// ── 恢复策略 ──
|
|
271
|
+
providerCmd
|
|
272
|
+
.command('resume <strategyId>')
|
|
273
|
+
.description('Resume a paused strategy')
|
|
274
|
+
.action(async (strategyId) => {
|
|
275
|
+
const client = getClient(true);
|
|
276
|
+
const providerApi = new provider_1.ProviderApi(client);
|
|
277
|
+
const response = await providerApi.resumeStrategy(strategyId);
|
|
278
|
+
if (response.success && response.data) {
|
|
279
|
+
console.log(`✓ Strategy resumed (${response.data.status})`);
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
console.error('Error:', response.error?.message);
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
// ── 删除策略 ──
|
|
286
|
+
providerCmd
|
|
287
|
+
.command('delete <strategyId>')
|
|
288
|
+
.description('Delete a draft strategy')
|
|
289
|
+
.action(async (strategyId) => {
|
|
290
|
+
const client = getClient(true);
|
|
291
|
+
const providerApi = new provider_1.ProviderApi(client);
|
|
292
|
+
const response = await providerApi.deleteStrategy(strategyId);
|
|
293
|
+
if (response.success && response.data) {
|
|
294
|
+
console.log('✓ Strategy deleted');
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
console.error('Error:', response.error?.message);
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
// ── 推送信号 (pk-bbt 认证) ──
|
|
301
|
+
providerCmd
|
|
302
|
+
.command('push-signal')
|
|
303
|
+
.description('Push a signal to the platform (uses PROVIDER_API_KEY)')
|
|
304
|
+
.requiredOption('-s, --strategy-id <id>', 'Strategy ID')
|
|
305
|
+
.requiredOption('--symbol <symbol>', 'Symbol (e.g. BTCUSDT)')
|
|
306
|
+
.requiredOption('--decision <decision>', 'Decision: long, short, close_long, close_short, tp, sl')
|
|
307
|
+
.option('--price <price>', 'Current price')
|
|
308
|
+
.option('--confidence <num>', 'Confidence 0-1', '0.9')
|
|
309
|
+
.option('--stop-loss <price>', 'Stop loss price')
|
|
310
|
+
.option('--take-profit <price>', 'Take profit price')
|
|
311
|
+
.option('--reasoning <text>', 'Signal reasoning')
|
|
312
|
+
.action(async (options) => {
|
|
313
|
+
const creds = (0, auth_1.checkAuth)();
|
|
314
|
+
const pkKey = process.env.PROVIDER_API_KEY;
|
|
315
|
+
if (!pkKey) {
|
|
316
|
+
console.error('Error: PROVIDER_API_KEY environment variable not set');
|
|
317
|
+
console.error(' export PROVIDER_API_KEY=pk-bbt-your_key');
|
|
318
|
+
process.exit(1);
|
|
319
|
+
}
|
|
320
|
+
const providerApi = new provider_1.ProviderApi(new client_1.ApiClient(creds.baseUrl, ''));
|
|
321
|
+
const body = {
|
|
322
|
+
strategy_id: options.strategyId,
|
|
323
|
+
symbol: options.symbol,
|
|
324
|
+
decision: options.decision,
|
|
325
|
+
price: options.price ? parseFloat(options.price) : undefined,
|
|
326
|
+
confidence: parseFloat(options.confidence),
|
|
327
|
+
stop_loss: options.stopLoss ? parseFloat(options.stopLoss) : undefined,
|
|
328
|
+
take_profit: options.takeProfit ? parseFloat(options.takeProfit) : undefined,
|
|
329
|
+
reasoning: options.reasoning || `CLI push at ${new Date().toISOString()}`,
|
|
330
|
+
};
|
|
331
|
+
console.log(`Pushing signal: ${body.decision} ${body.symbol}...`);
|
|
332
|
+
const response = await providerApi.pushSignal(pkKey, creds.baseUrl, body);
|
|
333
|
+
if (response.success && response.data) {
|
|
334
|
+
console.log('✓ Signal pushed');
|
|
335
|
+
console.log(` Signal ID: ${response.data.id}`);
|
|
336
|
+
console.log(` Dispatched: ${response.data.dispatched}`);
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
console.error('Push failed:', response.error?.message);
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
// ── Provider 统计 (pk-bbt 认证) ──
|
|
343
|
+
providerCmd
|
|
344
|
+
.command('stats')
|
|
345
|
+
.description('Show provider stats (uses PROVIDER_API_KEY)')
|
|
346
|
+
.action(async () => {
|
|
347
|
+
const creds = (0, auth_1.checkAuth)();
|
|
348
|
+
const pkKey = process.env.PROVIDER_API_KEY;
|
|
349
|
+
if (!pkKey) {
|
|
350
|
+
console.error('Error: PROVIDER_API_KEY environment variable not set');
|
|
351
|
+
process.exit(1);
|
|
352
|
+
}
|
|
353
|
+
const providerApi = new provider_1.ProviderApi(new client_1.ApiClient(creds.baseUrl, ''));
|
|
354
|
+
const response = await providerApi.stats(pkKey, creds.baseUrl);
|
|
355
|
+
if (response.success && response.data) {
|
|
356
|
+
const d = response.data;
|
|
357
|
+
console.log('Provider Stats:');
|
|
358
|
+
console.log('='.repeat(60));
|
|
359
|
+
console.log(` Signals Pushed: ${d.provider.total_signals_pushed}`);
|
|
360
|
+
console.log(` Total Earnings: ${d.provider.total_earnings} BBT`);
|
|
361
|
+
console.log(` Strategies: ${d.strategy_count}`);
|
|
362
|
+
console.log(` Signal Count: ${d.signal_count}`);
|
|
363
|
+
console.log(` Active Subscriptions: ${d.active_subscriptions}`);
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
console.error('Error:', response.error?.message);
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
program.addCommand(providerCmd);
|
|
370
|
+
}
|
|
371
|
+
//# sourceMappingURL=provider.js.map
|