@123456btc/123456btc-cli 1.0.3 → 1.0.5
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/auth.js +2 -2
- package/dist/api/auth.js.map +1 -1
- package/dist/api/client.d.ts +10 -6
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +62 -19
- package/dist/api/client.js.map +1 -1
- package/dist/api/client.test.js +24 -16
- package/dist/api/client.test.js.map +1 -1
- package/dist/api/token-manager.d.ts.map +1 -1
- package/dist/api/token-manager.js +4 -0
- package/dist/api/token-manager.js.map +1 -1
- package/dist/cli.js +17 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +49 -80
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/gas.d.ts.map +1 -1
- package/dist/commands/gas.js +3 -2
- package/dist/commands/gas.js.map +1 -1
- package/dist/commands/health.d.ts.map +1 -1
- package/dist/commands/health.js +5 -3
- package/dist/commands/health.js.map +1 -1
- package/dist/commands/provider.d.ts.map +1 -1
- package/dist/commands/provider.js +17 -20
- package/dist/commands/provider.js.map +1 -1
- package/dist/commands/signals.d.ts.map +1 -1
- package/dist/commands/signals.js +3 -2
- package/dist/commands/signals.js.map +1 -1
- package/dist/commands/strategy.d.ts.map +1 -1
- package/dist/commands/strategy.js +10 -2
- package/dist/commands/strategy.js.map +1 -1
- package/dist/commands/tier.d.ts.map +1 -1
- package/dist/commands/tier.js +3 -2
- package/dist/commands/tier.js.map +1 -1
- package/dist/commands/wallet.d.ts.map +1 -1
- package/dist/commands/wallet.js +3 -2
- package/dist/commands/wallet.js.map +1 -1
- package/dist/config.d.ts +12 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +28 -56
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -3
- package/dist/index.js.map +1 -1
- package/dist/session/store.d.ts +25 -0
- package/dist/session/store.d.ts.map +1 -0
- package/dist/session/store.js +108 -0
- package/dist/session/store.js.map +1 -0
- package/dist/session/store.test.d.ts +2 -0
- package/dist/session/store.test.d.ts.map +1 -0
- package/dist/session/store.test.js +118 -0
- package/dist/session/store.test.js.map +1 -0
- package/dist/utils/auth.d.ts +2 -5
- package/dist/utils/auth.d.ts.map +1 -1
- package/dist/utils/auth.js +5 -5
- package/dist/utils/auth.js.map +1 -1
- package/package.json +1 -1
package/dist/api/auth.js
CHANGED
|
@@ -10,7 +10,7 @@ class AuthApi {
|
|
|
10
10
|
* Verify API key and get identity tier
|
|
11
11
|
*/
|
|
12
12
|
async verifyKey() {
|
|
13
|
-
return this.client.get('/
|
|
13
|
+
return this.client.get('/auth/verify');
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
16
|
* Refresh session token
|
|
@@ -22,7 +22,7 @@ class AuthApi {
|
|
|
22
22
|
* Get current user info
|
|
23
23
|
*/
|
|
24
24
|
async userInfo() {
|
|
25
|
-
return this.client.get('/
|
|
25
|
+
return this.client.get('/auth/user');
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
exports.AuthApi = AuthApi;
|
package/dist/api/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":";;;AAGA,MAAa,OAAO;IACV,MAAM,CAAY;IAE1B,YAAY,MAAiB;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAe,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":";;;AAGA,MAAa,OAAO;IACV,MAAM,CAAY;IAE1B,YAAY,MAAiB;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAe,cAAc,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CACrB,kBAAkB,CACnB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QAMZ,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAKnB,YAAY,CAAC,CAAC;IACnB,CAAC;CACF;AAvCD,0BAuCC"}
|
package/dist/api/client.d.ts
CHANGED
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
import { AxiosRequestConfig } from 'axios';
|
|
2
2
|
import { ApiResponse } from '../types/api';
|
|
3
|
-
import {
|
|
3
|
+
import { SessionStore } from '../session/store';
|
|
4
4
|
export declare class ApiClient {
|
|
5
5
|
private client;
|
|
6
|
-
private
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
private store;
|
|
7
|
+
constructor(store: SessionStore);
|
|
8
|
+
/**
|
|
9
|
+
* Resolve the auth token to send with each request.
|
|
10
|
+
* Priority:
|
|
11
|
+
* 1. If apiKey present → exchange for access token (cached in session.json)
|
|
12
|
+
* 2. If jwt present → use JWT directly
|
|
13
|
+
*/
|
|
14
|
+
private resolveAuthToken;
|
|
10
15
|
get<T>(endpoint: string, params?: Record<string, unknown>): Promise<ApiResponse<T>>;
|
|
11
16
|
post<T>(endpoint: string, data?: unknown, config?: AxiosRequestConfig): Promise<ApiResponse<T>>;
|
|
12
17
|
put<T>(endpoint: string, data?: unknown): Promise<ApiResponse<T>>;
|
|
13
18
|
patch<T>(endpoint: string, data?: unknown): Promise<ApiResponse<T>>;
|
|
14
19
|
delete<T>(endpoint: string): Promise<ApiResponse<T>>;
|
|
15
|
-
getTokenManager(): TokenManager;
|
|
16
20
|
}
|
|
17
21
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/api/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAc,EAAiB,kBAAkB,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAc,EAAiB,kBAAkB,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,KAAK,CAAe;gBAEhB,KAAK,EAAE,YAAY;IAsF/B;;;;;OAKG;YACW,gBAAgB;IA4CxB,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAgBnF,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAgB/F,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAgBjE,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAgBnE,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;CAe3D"}
|
package/dist/api/client.js
CHANGED
|
@@ -5,16 +5,26 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.ApiClient = void 0;
|
|
7
7
|
const axios_1 = __importDefault(require("axios"));
|
|
8
|
-
const token_manager_1 = require("./token-manager");
|
|
9
8
|
class ApiClient {
|
|
10
9
|
client;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
10
|
+
store;
|
|
11
|
+
constructor(store) {
|
|
12
|
+
this.store = store;
|
|
13
|
+
const creds = store.getCredentials();
|
|
14
|
+
if (!creds) {
|
|
15
|
+
throw new Error('No credentials found. Run "123456btc-cli auth login" or "123456btc-cli auth wallet-login"');
|
|
16
|
+
}
|
|
17
|
+
// Normalize baseUrl: ensure /api suffix
|
|
18
|
+
let baseUrl = creds.baseUrl;
|
|
19
|
+
if (baseUrl.endsWith('/ext-api')) {
|
|
20
|
+
baseUrl = baseUrl.slice(0, -8);
|
|
21
|
+
}
|
|
22
|
+
if (baseUrl.endsWith('/')) {
|
|
23
|
+
baseUrl = baseUrl.slice(0, -1);
|
|
24
|
+
}
|
|
25
|
+
if (!baseUrl.endsWith('/api')) {
|
|
26
|
+
baseUrl = baseUrl + '/api';
|
|
27
|
+
}
|
|
18
28
|
this.client = axios_1.default.create({
|
|
19
29
|
baseURL: baseUrl,
|
|
20
30
|
timeout: 30000,
|
|
@@ -22,26 +32,24 @@ class ApiClient {
|
|
|
22
32
|
'Content-Type': 'application/json',
|
|
23
33
|
},
|
|
24
34
|
});
|
|
25
|
-
// Request interceptor: inject
|
|
35
|
+
// Request interceptor: inject auth token
|
|
26
36
|
this.client.interceptors.request.use(async (config) => {
|
|
27
|
-
const token = await this.
|
|
37
|
+
const token = await this.resolveAuthToken();
|
|
28
38
|
config.headers['Authorization'] = `Bearer ${token}`;
|
|
29
39
|
return config;
|
|
30
40
|
});
|
|
31
|
-
// Response interceptor: handle 401 by
|
|
41
|
+
// Response interceptor: handle 401 by clearing session and retrying once
|
|
32
42
|
this.client.interceptors.response.use((response) => response, async (error) => {
|
|
33
43
|
const originalRequest = error.config;
|
|
34
|
-
// If 401 and we haven't retried yet
|
|
35
44
|
if (error.response?.status === 401 && originalRequest && !originalRequest._retry) {
|
|
36
45
|
originalRequest._retry = true;
|
|
37
46
|
try {
|
|
38
|
-
|
|
39
|
-
this.
|
|
40
|
-
const token = await this.tokenManager.getAccessToken();
|
|
47
|
+
this.store.clearAccessToken();
|
|
48
|
+
const token = await this.resolveAuthToken();
|
|
41
49
|
originalRequest.headers['Authorization'] = `Bearer ${token}`;
|
|
42
50
|
return this.client(originalRequest);
|
|
43
51
|
}
|
|
44
|
-
catch
|
|
52
|
+
catch {
|
|
45
53
|
return {
|
|
46
54
|
data: {
|
|
47
55
|
success: false,
|
|
@@ -76,6 +84,44 @@ class ApiClient {
|
|
|
76
84
|
};
|
|
77
85
|
});
|
|
78
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Resolve the auth token to send with each request.
|
|
89
|
+
* Priority:
|
|
90
|
+
* 1. If apiKey present → exchange for access token (cached in session.json)
|
|
91
|
+
* 2. If jwt present → use JWT directly
|
|
92
|
+
*/
|
|
93
|
+
async resolveAuthToken() {
|
|
94
|
+
const creds = this.store.getCredentials();
|
|
95
|
+
if (!creds) {
|
|
96
|
+
throw new Error('Not authenticated');
|
|
97
|
+
}
|
|
98
|
+
// API Key mode: exchange for short-lived access token
|
|
99
|
+
if (creds.apiKey) {
|
|
100
|
+
const cached = this.store.getAccessToken();
|
|
101
|
+
if (cached && cached.expiresAt > Date.now() + 5 * 60 * 1000) {
|
|
102
|
+
return cached.token;
|
|
103
|
+
}
|
|
104
|
+
const res = await axios_1.default.post(`${this.client.defaults.baseURL}/v1/auth/token`, {}, {
|
|
105
|
+
headers: { Authorization: `Bearer ${creds.apiKey}` },
|
|
106
|
+
timeout: 15000,
|
|
107
|
+
});
|
|
108
|
+
const data = res.data?.data || res.data;
|
|
109
|
+
if (!data?.access_token) {
|
|
110
|
+
throw new Error('Failed to exchange token: invalid response');
|
|
111
|
+
}
|
|
112
|
+
this.store.saveAccessToken({
|
|
113
|
+
token: data.access_token,
|
|
114
|
+
expiresAt: data.expires_at || Date.now() + 24 * 60 * 60 * 1000,
|
|
115
|
+
scopes: data.scopes || [],
|
|
116
|
+
});
|
|
117
|
+
return data.access_token;
|
|
118
|
+
}
|
|
119
|
+
// JWT mode: use directly
|
|
120
|
+
if (creds.jwt) {
|
|
121
|
+
return creds.jwt;
|
|
122
|
+
}
|
|
123
|
+
throw new Error('No valid authentication credentials');
|
|
124
|
+
}
|
|
79
125
|
async get(endpoint, params) {
|
|
80
126
|
try {
|
|
81
127
|
const response = await this.client.get(endpoint, { params });
|
|
@@ -156,9 +202,6 @@ class ApiClient {
|
|
|
156
202
|
};
|
|
157
203
|
}
|
|
158
204
|
}
|
|
159
|
-
getTokenManager() {
|
|
160
|
-
return this.tokenManager;
|
|
161
|
-
}
|
|
162
205
|
}
|
|
163
206
|
exports.ApiClient = ApiClient;
|
|
164
207
|
//# sourceMappingURL=client.js.map
|
package/dist/api/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAiE;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
package/dist/api/client.test.js
CHANGED
|
@@ -1,27 +1,35 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const client_1 = require("./client");
|
|
4
|
+
const store_1 = require("../session/store");
|
|
5
|
+
// Mock SessionStore
|
|
6
|
+
jest.mock('../session/store', () => {
|
|
7
|
+
return {
|
|
8
|
+
SessionStore: jest.fn().mockImplementation(() => ({
|
|
9
|
+
getCredentials: jest.fn().mockReturnValue({
|
|
10
|
+
apiKey: 'sk-bbt-test123',
|
|
11
|
+
baseUrl: 'https://platform.123456btc.com',
|
|
12
|
+
environment: 'live',
|
|
13
|
+
savedAt: new Date().toISOString(),
|
|
14
|
+
}),
|
|
15
|
+
getAccessToken: jest.fn().mockReturnValue(null),
|
|
16
|
+
saveAccessToken: jest.fn(),
|
|
17
|
+
})),
|
|
18
|
+
};
|
|
19
|
+
});
|
|
4
20
|
describe('ApiClient', () => {
|
|
5
21
|
let client;
|
|
6
22
|
beforeEach(() => {
|
|
7
|
-
client = new client_1.ApiClient(
|
|
8
|
-
});
|
|
9
|
-
describe('constructor', () => {
|
|
10
|
-
it('should create client with correct base url', () => {
|
|
11
|
-
expect(client).toBeDefined();
|
|
12
|
-
});
|
|
23
|
+
client = new client_1.ApiClient(new store_1.SessionStore());
|
|
13
24
|
});
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const response = await client.get('/test');
|
|
17
|
-
expect(response).toHaveProperty('success');
|
|
18
|
-
});
|
|
25
|
+
it('should create client when credentials exist', () => {
|
|
26
|
+
expect(client).toBeDefined();
|
|
19
27
|
});
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
28
|
+
it('should throw when no credentials exist', () => {
|
|
29
|
+
store_1.SessionStore.mockImplementationOnce(() => ({
|
|
30
|
+
getCredentials: jest.fn().mockReturnValue(null),
|
|
31
|
+
}));
|
|
32
|
+
expect(() => new client_1.ApiClient(new store_1.SessionStore())).toThrow('No credentials found');
|
|
25
33
|
});
|
|
26
34
|
});
|
|
27
35
|
//# sourceMappingURL=client.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../src/api/client.test.ts"],"names":[],"mappings":";;AAAA,qCAAqC;
|
|
1
|
+
{"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../src/api/client.test.ts"],"names":[],"mappings":";;AAAA,qCAAqC;AACrC,4CAAgD;AAEhD,oBAAoB;AACpB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE;IACjC,OAAO;QACL,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;YAChD,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;gBACxC,MAAM,EAAE,gBAAgB;gBACxB,OAAO,EAAE,gCAAgC;gBACzC,WAAW,EAAE,MAAM;gBACnB,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAClC,CAAC;YACF,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;YAC/C,eAAe,EAAE,IAAI,CAAC,EAAE,EAAE;SAC3B,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAI,MAAiB,CAAC;IAEtB,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,IAAI,kBAAS,CAAC,IAAI,oBAAY,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAC/C,oBAA0B,CAAC,sBAAsB,CAAC,GAAG,EAAE,CAAC,CAAC;YACxD,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;SAChD,CAAC,CAAC,CAAC;QACJ,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,kBAAS,CAAC,IAAI,oBAAY,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-manager.d.ts","sourceRoot":"","sources":["../../src/api/token-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAkBH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAwB;gBAE3B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAM3C;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"token-manager.d.ts","sourceRoot":"","sources":["../../src/api/token-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAkBH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAwB;gBAE3B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAM3C;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IA4BvC;;OAEG;YACW,aAAa;IAsB3B;;OAEG;YACW,YAAY;IAsB1B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB7B,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,WAAW;IAanB,YAAY,IAAI,IAAI;IAWpB,SAAS,IAAI,MAAM,EAAE;CAGtB"}
|
|
@@ -64,6 +64,10 @@ class TokenManager {
|
|
|
64
64
|
* Get valid access token, auto-refresh if needed
|
|
65
65
|
*/
|
|
66
66
|
async getAccessToken() {
|
|
67
|
+
// If apiKey is a JWT (direct auth for /api routes), use it directly
|
|
68
|
+
if (this.apiKey.startsWith('eyJ')) {
|
|
69
|
+
return this.apiKey;
|
|
70
|
+
}
|
|
67
71
|
// Check cached session
|
|
68
72
|
if (this.session && this.session.expiresAt > Date.now() + 5 * 60 * 1000) {
|
|
69
73
|
return this.session.accessToken;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-manager.js","sourceRoot":"","sources":["../../src/api/token-manager.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"token-manager.js","sourceRoot":"","sources":["../../src/api/token-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
const commander_1 = require("commander");
|
|
5
|
+
const store_1 = require("./session/store");
|
|
5
6
|
const auth_1 = require("./commands/auth");
|
|
6
7
|
const strategy_1 = require("./commands/strategy");
|
|
7
8
|
const wallet_1 = require("./commands/wallet");
|
|
@@ -22,8 +23,23 @@ program
|
|
|
22
23
|
.name('123456btc-cli')
|
|
23
24
|
.description('123456btc CLI - Strategy dispatch & gas settlement for AI agents')
|
|
24
25
|
.version('1.0.0');
|
|
25
|
-
//
|
|
26
|
+
// Top-level logout shortcut
|
|
26
27
|
(0, auth_1.createAuthCommand)(program);
|
|
28
|
+
program
|
|
29
|
+
.command('logout')
|
|
30
|
+
.description('Clear authentication (shortcut for auth logout)')
|
|
31
|
+
.action(() => {
|
|
32
|
+
const store = new store_1.SessionStore();
|
|
33
|
+
const hadCreds = store.getCredentials() !== null;
|
|
34
|
+
store.clearAll();
|
|
35
|
+
if (hadCreds) {
|
|
36
|
+
console.log('✓ Authentication cleared');
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
console.log('Not authenticated');
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
// Add all other commands
|
|
27
43
|
(0, strategy_1.createStrategyCommand)(program);
|
|
28
44
|
(0, provider_1.createProviderCommand)(program);
|
|
29
45
|
(0, wallet_1.createWalletCommand)(program);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AAEpC,0CAAoD;AACpD,kDAA4D;AAC5D,8CAAwD;AACxD,gDAA0D;AAC1D,0CAAoD;AACpD,8CAAwD;AACxD,gDAA0D;AAC1D,kDAA4D;AAC5D,4CAAyD;AAEzD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,iBAAiB;AACjB,OAAO;KACJ,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;KACtE,MAAM,CAAC,sBAAsB,EAAE,cAAc,CAAC;KAC9C,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;AAE7C,UAAU;AACV,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,kEAAkE,CAAC;KAC/E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AAEpC,2CAA+C;AAC/C,0CAAoD;AACpD,kDAA4D;AAC5D,8CAAwD;AACxD,gDAA0D;AAC1D,0CAAoD;AACpD,8CAAwD;AACxD,gDAA0D;AAC1D,kDAA4D;AAC5D,4CAAyD;AAEzD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,iBAAiB;AACjB,OAAO;KACJ,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;KACtE,MAAM,CAAC,sBAAsB,EAAE,cAAc,CAAC;KAC9C,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;AAE7C,UAAU;AACV,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,kEAAkE,CAAC;KAC/E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,4BAA4B;AAC5B,IAAA,wBAAiB,EAAC,OAAO,CAAC,CAAC;AAE3B,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,GAAG,EAAE;IACX,MAAM,KAAK,GAAG,IAAI,oBAAY,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,EAAE,KAAK,IAAI,CAAC;IACjD,KAAK,CAAC,QAAQ,EAAE,CAAC;IACjB,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACnC,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,yBAAyB;AACzB,IAAA,gCAAqB,EAAC,OAAO,CAAC,CAAC;AAC/B,IAAA,gCAAqB,EAAC,OAAO,CAAC,CAAC;AAC/B,IAAA,4BAAmB,EAAC,OAAO,CAAC,CAAC;AAC7B,IAAA,8BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,wBAAiB,EAAC,OAAO,CAAC,CAAC;AAC3B,IAAA,4BAAmB,EAAC,OAAO,CAAC,CAAC;AAC7B,IAAA,8BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,6BAAqB,EAAC,OAAO,CAAC,CAAC;AAE/B,wBAAwB;AACxB,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE;IAC5B,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC,CAAC;AAEH,QAAQ;AACR,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B,oCAAoC;AACpC,MAAM,MAAM,GAAQ,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACvD,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IAC5C,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,QAqPjD"}
|
package/dist/commands/auth.js
CHANGED
|
@@ -1,37 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
4
|
};
|
|
@@ -39,16 +6,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
39
6
|
exports.createAuthCommand = createAuthCommand;
|
|
40
7
|
const commander_1 = require("commander");
|
|
41
8
|
const inquirer_1 = __importDefault(require("inquirer"));
|
|
42
|
-
const fs = __importStar(require("fs"));
|
|
43
|
-
const path = __importStar(require("path"));
|
|
44
9
|
const axios_1 = __importDefault(require("axios"));
|
|
45
10
|
const qrcode_terminal_1 = __importDefault(require("qrcode-terminal"));
|
|
46
11
|
const client_1 = require("../api/client");
|
|
47
12
|
const auth_1 = require("../api/auth");
|
|
48
13
|
const auth_2 = require("../utils/auth");
|
|
49
|
-
const
|
|
14
|
+
const store_1 = require("../session/store");
|
|
50
15
|
function createAuthCommand(program) {
|
|
51
16
|
const authCmd = new commander_1.Command('auth');
|
|
17
|
+
const store = new store_1.SessionStore();
|
|
52
18
|
// Login command
|
|
53
19
|
authCmd
|
|
54
20
|
.command('login')
|
|
@@ -67,26 +33,18 @@ function createAuthCommand(program) {
|
|
|
67
33
|
]);
|
|
68
34
|
apiKey = answers.apiKey;
|
|
69
35
|
}
|
|
70
|
-
// Validate API key format (支持新旧格式)
|
|
71
36
|
if (!apiKey.startsWith('sk_live_') && !apiKey.startsWith('sk_test_') && !apiKey.startsWith('sk-bbt-')) {
|
|
72
37
|
console.error('Invalid API key format. Should start with sk_live_, sk_test_, or sk-bbt-');
|
|
73
38
|
process.exit(1);
|
|
74
39
|
}
|
|
75
|
-
|
|
76
|
-
const dir = path.dirname(CREDENTIALS_FILE);
|
|
77
|
-
if (!fs.existsSync(dir)) {
|
|
78
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
79
|
-
}
|
|
80
|
-
// Save credentials
|
|
81
|
-
const credentials = {
|
|
40
|
+
store.saveCredentials({
|
|
82
41
|
apiKey,
|
|
83
42
|
baseUrl: process.env.API_BASE_URL || 'https://platform.123456btc.com',
|
|
84
43
|
environment: options.env,
|
|
85
44
|
savedAt: new Date().toISOString(),
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
console.log(
|
|
89
|
-
console.log(` Base URL: ${credentials.baseUrl}`);
|
|
45
|
+
});
|
|
46
|
+
console.log('✓ Authentication saved');
|
|
47
|
+
console.log(` Base URL: ${store.getCredentials()?.baseUrl}`);
|
|
90
48
|
console.log(` Environment: ${options.env}`);
|
|
91
49
|
});
|
|
92
50
|
// Status command
|
|
@@ -94,23 +52,25 @@ function createAuthCommand(program) {
|
|
|
94
52
|
.command('status')
|
|
95
53
|
.description('Show authentication status')
|
|
96
54
|
.action(async () => {
|
|
97
|
-
|
|
55
|
+
const creds = store.getCredentials();
|
|
56
|
+
if (!creds) {
|
|
98
57
|
console.log('Not authenticated. Run "123456btc-cli auth login" first.');
|
|
99
58
|
return;
|
|
100
59
|
}
|
|
101
|
-
const credentials = JSON.parse(fs.readFileSync(CREDENTIALS_FILE, 'utf-8'));
|
|
102
60
|
console.log('Authentication Status:');
|
|
103
|
-
console.log(` API Key: ${
|
|
104
|
-
console.log(`
|
|
105
|
-
console.log(`
|
|
61
|
+
console.log(` API Key: ${creds.apiKey?.substring(0, 20) ?? 'N/A'}...`);
|
|
62
|
+
console.log(` JWT: ${creds.jwt ? 'Present' : 'None'}`);
|
|
63
|
+
console.log(` Environment: ${creds.environment}`);
|
|
64
|
+
console.log(` Saved: ${creds.savedAt}`);
|
|
106
65
|
});
|
|
107
66
|
// Logout command
|
|
108
67
|
authCmd
|
|
109
68
|
.command('logout')
|
|
110
69
|
.description('Clear authentication')
|
|
111
70
|
.action(() => {
|
|
112
|
-
|
|
113
|
-
|
|
71
|
+
const hadCreds = store.getCredentials() !== null;
|
|
72
|
+
store.clearAll();
|
|
73
|
+
if (hadCreds) {
|
|
114
74
|
console.log('✓ Authentication cleared');
|
|
115
75
|
}
|
|
116
76
|
else {
|
|
@@ -122,8 +82,8 @@ function createAuthCommand(program) {
|
|
|
122
82
|
.command('verify')
|
|
123
83
|
.description('Verify API key and show tier info')
|
|
124
84
|
.action(async () => {
|
|
125
|
-
|
|
126
|
-
const client = new client_1.ApiClient(
|
|
85
|
+
(0, auth_2.checkAuth)();
|
|
86
|
+
const client = new client_1.ApiClient(new store_1.SessionStore());
|
|
127
87
|
const authApi = new auth_1.AuthApi(client);
|
|
128
88
|
console.log('Verifying API key...');
|
|
129
89
|
const tierResponse = await authApi.verifyKey();
|
|
@@ -144,7 +104,6 @@ function createAuthCommand(program) {
|
|
|
144
104
|
console.error('✗ API Key Invalid');
|
|
145
105
|
console.error('Error:', tierResponse.error?.message);
|
|
146
106
|
}
|
|
147
|
-
// Also get user info
|
|
148
107
|
const userInfoResponse = await authApi.userInfo();
|
|
149
108
|
if (userInfoResponse.success && userInfoResponse.data) {
|
|
150
109
|
console.log('');
|
|
@@ -155,8 +114,14 @@ function createAuthCommand(program) {
|
|
|
155
114
|
}
|
|
156
115
|
console.log(` Created: ${userInfoResponse.data.createdAt}`);
|
|
157
116
|
}
|
|
117
|
+
const creds = store.getCredentials();
|
|
118
|
+
if (creds?.walletAddress) {
|
|
119
|
+
console.log('');
|
|
120
|
+
console.log('Wallet:');
|
|
121
|
+
console.log(` Address: ${creds.walletAddress}`);
|
|
122
|
+
}
|
|
158
123
|
});
|
|
159
|
-
// Wallet login command
|
|
124
|
+
// Wallet login command
|
|
160
125
|
authCmd
|
|
161
126
|
.command('wallet-login')
|
|
162
127
|
.description('Login with Solana wallet scan (generates QR code link)')
|
|
@@ -164,17 +129,14 @@ function createAuthCommand(program) {
|
|
|
164
129
|
.action(async (options) => {
|
|
165
130
|
const baseUrl = options.url;
|
|
166
131
|
try {
|
|
167
|
-
// 1. 获取 session nonce
|
|
168
132
|
const sessionRes = await axios_1.default.get(`${baseUrl}/api/auth/wallet-session`);
|
|
169
|
-
const { nonce
|
|
170
|
-
// 2. 生成登录 URL(指向 platform 的扫码登录页面)
|
|
133
|
+
const { nonce } = sessionRes.data;
|
|
171
134
|
const loginUrl = `${baseUrl}/login?nonce=${nonce}`;
|
|
172
135
|
console.log('');
|
|
173
136
|
console.log('═══════════════════════════════════════════════════════');
|
|
174
137
|
console.log(' Wallet Login');
|
|
175
138
|
console.log('═══════════════════════════════════════════════════════');
|
|
176
139
|
console.log('');
|
|
177
|
-
// 在终端显示二维码
|
|
178
140
|
qrcode_terminal_1.default.generate(loginUrl, { small: true }, (qrcodeStr) => {
|
|
179
141
|
console.log(qrcodeStr);
|
|
180
142
|
});
|
|
@@ -185,10 +147,10 @@ function createAuthCommand(program) {
|
|
|
185
147
|
console.log('');
|
|
186
148
|
console.log(' Waiting for wallet signature...');
|
|
187
149
|
console.log('');
|
|
188
|
-
// 3. 轮询等待签名
|
|
189
150
|
let attempts = 0;
|
|
190
|
-
const maxAttempts = 60;
|
|
151
|
+
const maxAttempts = 60;
|
|
191
152
|
let loginResult = null;
|
|
153
|
+
let wallet_address = null;
|
|
192
154
|
while (attempts < maxAttempts) {
|
|
193
155
|
await new Promise(r => setTimeout(r, 5000));
|
|
194
156
|
attempts++;
|
|
@@ -196,23 +158,24 @@ function createAuthCommand(program) {
|
|
|
196
158
|
try {
|
|
197
159
|
const pollRes = await axios_1.default.get(`${baseUrl}/api/auth/wallet-poll/${nonce}`);
|
|
198
160
|
if (pollRes.data.ready) {
|
|
199
|
-
const {
|
|
161
|
+
const { signature, message } = pollRes.data;
|
|
162
|
+
wallet_address = pollRes.data.wallet_address;
|
|
200
163
|
console.log('\n✓ Signature received!');
|
|
201
|
-
|
|
164
|
+
console.log(` Wallet: ${wallet_address}`);
|
|
202
165
|
const loginRes = await axios_1.default.post(`${baseUrl}/api/auth/wallet-login`, {
|
|
203
166
|
wallet_address,
|
|
204
167
|
signature,
|
|
205
168
|
nonce,
|
|
206
169
|
message,
|
|
207
170
|
});
|
|
208
|
-
if (loginRes.data.success) {
|
|
209
|
-
loginResult = loginRes.data;
|
|
171
|
+
if (loginRes.data.success && loginRes.data.data) {
|
|
172
|
+
loginResult = loginRes.data.data;
|
|
210
173
|
break;
|
|
211
174
|
}
|
|
212
175
|
}
|
|
213
176
|
}
|
|
214
177
|
catch {
|
|
215
|
-
//
|
|
178
|
+
// continue polling
|
|
216
179
|
}
|
|
217
180
|
}
|
|
218
181
|
if (!loginResult) {
|
|
@@ -221,35 +184,41 @@ function createAuthCommand(program) {
|
|
|
221
184
|
}
|
|
222
185
|
console.log(`✓ Logged in as ${loginResult.user.sol_address}`);
|
|
223
186
|
console.log(' Creating API Key...');
|
|
224
|
-
// 5. 用 JWT 创建 API Key
|
|
225
187
|
const keyRes = await axios_1.default.post(`${baseUrl}/api/api-keys`, { name: '123456btc-cli' }, { headers: { Authorization: `Bearer ${loginResult.token}` } });
|
|
226
188
|
const apiKey = keyRes.data?.data?.key || keyRes.data?.key;
|
|
227
189
|
if (!apiKey) {
|
|
228
190
|
console.error('✗ Failed to create API key');
|
|
229
191
|
process.exit(1);
|
|
230
192
|
}
|
|
231
|
-
|
|
232
|
-
const dir = path.dirname(CREDENTIALS_FILE);
|
|
233
|
-
if (!fs.existsSync(dir)) {
|
|
234
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
235
|
-
}
|
|
236
|
-
const credentials = {
|
|
193
|
+
store.saveCredentials({
|
|
237
194
|
apiKey,
|
|
238
195
|
baseUrl,
|
|
239
196
|
jwt: loginResult.token,
|
|
197
|
+
walletAddress: wallet_address || undefined,
|
|
240
198
|
environment: 'live',
|
|
241
199
|
savedAt: new Date().toISOString(),
|
|
242
|
-
};
|
|
243
|
-
|
|
200
|
+
});
|
|
201
|
+
store.clearAccessToken();
|
|
244
202
|
console.log('');
|
|
245
203
|
console.log('✓ Login successful!');
|
|
246
204
|
console.log(` API Key: ${apiKey.slice(0, 20)}...`);
|
|
247
|
-
|
|
205
|
+
if (loginResult?.debug) {
|
|
206
|
+
console.log('');
|
|
207
|
+
console.log(' Debug:');
|
|
208
|
+
console.log(` Wallet: ${loginResult.debug.received_address}`);
|
|
209
|
+
console.log(` User ID: ${loginResult.debug.matched_user_id}`);
|
|
210
|
+
console.log(` Matched by: ${loginResult.debug.matched_by}`);
|
|
211
|
+
console.log(` New user: ${loginResult.debug.is_new_user ? 'Yes' : 'No'}`);
|
|
212
|
+
}
|
|
248
213
|
console.log('');
|
|
249
214
|
console.log(' You can now use:');
|
|
250
215
|
console.log(' 123456btc-cli signals latest');
|
|
251
216
|
console.log(' 123456btc-cli strategy list');
|
|
252
217
|
console.log('');
|
|
218
|
+
console.log(' To switch account:');
|
|
219
|
+
console.log(' 123456btc-cli auth logout');
|
|
220
|
+
console.log(' 123456btc-cli auth wallet-login');
|
|
221
|
+
console.log('');
|
|
253
222
|
}
|
|
254
223
|
catch (err) {
|
|
255
224
|
console.error('Login error:', err instanceof Error ? err.message : String(err));
|