@123456btc/123456btc-cli 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +182 -39
- package/README.zh-CN.md +78 -0
- 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/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 +127 -24
- 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 +147 -59
- 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 +1 -0
- package/dist/utils/auth.d.ts.map +1 -1
- 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 +5 -2
|
@@ -1,36 +1,71 @@
|
|
|
1
|
-
import { StrategyResult, ExecutorContext } from '../types/strategy';
|
|
2
1
|
/**
|
|
3
|
-
*
|
|
4
|
-
* Executes strategies in isolated environment
|
|
2
|
+
* StrategyExecutor — Core Execution Engine
|
|
3
|
+
* Executes strategies in isolated environment with retry logic and state tracking.
|
|
5
4
|
*/
|
|
5
|
+
import type { ExecutorContext, StrategyResult, TrackedStrategy, RiskLimits } from '../types/strategy';
|
|
6
|
+
import { OrderStateManager } from './state';
|
|
7
|
+
import { RiskGuard } from './risk';
|
|
6
8
|
export declare class StrategyExecutor {
|
|
7
|
-
private
|
|
8
|
-
|
|
9
|
+
private state;
|
|
10
|
+
private risk;
|
|
11
|
+
private solana;
|
|
12
|
+
private retry;
|
|
13
|
+
private packagesDir;
|
|
14
|
+
constructor(options?: {
|
|
15
|
+
riskLimits?: RiskLimits;
|
|
16
|
+
packagesDir?: string;
|
|
17
|
+
});
|
|
9
18
|
/**
|
|
10
|
-
* Execute strategy
|
|
19
|
+
* Execute a strategy with full lifecycle tracking
|
|
11
20
|
*/
|
|
12
|
-
execute(): Promise<StrategyResult>;
|
|
21
|
+
execute(context: ExecutorContext): Promise<StrategyResult>;
|
|
13
22
|
/**
|
|
14
|
-
*
|
|
23
|
+
* Load strategy package and execute
|
|
15
24
|
*/
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Strategy execution manager
|
|
20
|
-
*/
|
|
21
|
-
export declare class ExecutionManager {
|
|
22
|
-
private executing;
|
|
25
|
+
private loadAndExecuteStrategy;
|
|
23
26
|
/**
|
|
24
|
-
*
|
|
27
|
+
* Estimate gas usage for a strategy
|
|
25
28
|
*/
|
|
26
|
-
|
|
29
|
+
private estimateGasUsage;
|
|
27
30
|
/**
|
|
28
|
-
*
|
|
31
|
+
* Get tracked strategy
|
|
29
32
|
*/
|
|
30
|
-
|
|
33
|
+
getStrategy(dispatchId: string): TrackedStrategy | undefined;
|
|
31
34
|
/**
|
|
32
35
|
* List executing strategies
|
|
33
36
|
*/
|
|
34
|
-
listExecuting():
|
|
37
|
+
listExecuting(): TrackedStrategy[];
|
|
38
|
+
/**
|
|
39
|
+
* Cancel a running strategy
|
|
40
|
+
*/
|
|
41
|
+
cancel(dispatchId: string): Promise<boolean>;
|
|
42
|
+
/**
|
|
43
|
+
* Sync strategy status from external source
|
|
44
|
+
*/
|
|
45
|
+
syncStatus(dispatchId: string): Promise<TrackedStrategy | null>;
|
|
46
|
+
/**
|
|
47
|
+
* Get state manager (for ExecutionManager)
|
|
48
|
+
*/
|
|
49
|
+
getState(): OrderStateManager;
|
|
50
|
+
/**
|
|
51
|
+
* Get risk guard (for ExecutionManager)
|
|
52
|
+
*/
|
|
53
|
+
getRisk(): RiskGuard;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Strategy execution manager (singleton-like)
|
|
57
|
+
* Manages multiple concurrent strategy executions
|
|
58
|
+
*/
|
|
59
|
+
export declare class ExecutionManager {
|
|
60
|
+
private executor;
|
|
61
|
+
private executing;
|
|
62
|
+
constructor(options?: {
|
|
63
|
+
riskLimits?: RiskLimits;
|
|
64
|
+
});
|
|
65
|
+
execute(context: ExecutorContext): Promise<StrategyResult>;
|
|
66
|
+
cancel(dispatchId: string): Promise<boolean>;
|
|
67
|
+
getStrategy(dispatchId: string): TrackedStrategy | undefined;
|
|
68
|
+
listExecuting(): TrackedStrategy[];
|
|
69
|
+
purgeOld(maxAgeMs?: number): number;
|
|
35
70
|
}
|
|
36
71
|
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/providers/executor.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/providers/executor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,eAAe,EACf,UAAU,EAEX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAYnC,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,IAAI,CAAY;IACxB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,WAAW,CAAS;gBAG1B,OAAO,GAAE;QACP,UAAU,CAAC,EAAE,UAAU,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;KACjB;IAeR;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAmFhE;;OAEG;YACW,sBAAsB;IAwEpC;;OAEG;YACW,gBAAgB;IAM9B;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI5D;;OAEG;IACH,aAAa,IAAI,eAAe,EAAE;IAIlC;;OAEG;IACG,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAclD;;OAEG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IASrE;;OAEG;IACH,QAAQ,IAAI,iBAAiB;IAI7B;;OAEG;IACH,OAAO,IAAI,SAAS;CAGrB;AAED;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,SAAS,CAA0C;gBAE/C,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,UAAU,CAAA;KAAE;IAI3C,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAM1D,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI5D,aAAa,IAAI,eAAe,EAAE;IAIlC,QAAQ,CAAC,QAAQ,GAAE,MAA4B,GAAG,MAAM;CAGzD"}
|
|
@@ -1,90 +1,292 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ExecutionManager = exports.StrategyExecutor = void 0;
|
|
4
2
|
/**
|
|
5
|
-
*
|
|
6
|
-
* Executes strategies in isolated environment
|
|
3
|
+
* StrategyExecutor — Core Execution Engine
|
|
4
|
+
* Executes strategies in isolated environment with retry logic and state tracking.
|
|
7
5
|
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.ExecutionManager = exports.StrategyExecutor = void 0;
|
|
41
|
+
const child_process_1 = require("child_process");
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const util_1 = require("util");
|
|
45
|
+
const state_1 = require("./state");
|
|
46
|
+
const risk_1 = require("./risk");
|
|
47
|
+
const solana_1 = require("./solana");
|
|
48
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
49
|
+
const DEFAULT_RETRY = {
|
|
50
|
+
maxAttempts: 3,
|
|
51
|
+
baseDelayMs: 500,
|
|
52
|
+
maxDelayMs: 10000,
|
|
53
|
+
backoffFactor: 2,
|
|
54
|
+
};
|
|
8
55
|
class StrategyExecutor {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
56
|
+
state;
|
|
57
|
+
risk;
|
|
58
|
+
solana;
|
|
59
|
+
retry;
|
|
60
|
+
packagesDir;
|
|
61
|
+
constructor(options = {}) {
|
|
62
|
+
this.state = new state_1.OrderStateManager();
|
|
63
|
+
this.risk = new risk_1.RiskGuard(options.riskLimits ?? {});
|
|
64
|
+
this.solana = new solana_1.SolanaProvider();
|
|
65
|
+
this.retry = { ...DEFAULT_RETRY };
|
|
66
|
+
this.packagesDir =
|
|
67
|
+
options.packagesDir ??
|
|
68
|
+
path.join(process.env.HOME || process.env.USERPROFILE || '.', '.123456btc-cli', 'packages');
|
|
12
69
|
}
|
|
13
70
|
/**
|
|
14
|
-
* Execute strategy
|
|
71
|
+
* Execute a strategy with full lifecycle tracking
|
|
15
72
|
*/
|
|
16
|
-
async execute() {
|
|
73
|
+
async execute(context) {
|
|
17
74
|
const startTime = Date.now();
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
console.log(`Dispatch ID: ${this.context.dispatchId}`);
|
|
26
|
-
console.log(`Config: ${JSON.stringify(this.context.config)}`);
|
|
27
|
-
// Simulated result
|
|
28
|
-
const result = {
|
|
29
|
-
success: true,
|
|
30
|
-
data: {
|
|
31
|
-
message: 'Strategy executed successfully',
|
|
32
|
-
strategyId: this.context.strategyId,
|
|
33
|
-
dispatchId: this.context.dispatchId,
|
|
34
|
-
},
|
|
35
|
-
gasUsed: Math.floor(Math.random() * 1000),
|
|
36
|
-
executionTime: Date.now() - startTime,
|
|
37
|
-
};
|
|
38
|
-
return result;
|
|
39
|
-
}
|
|
40
|
-
catch (error) {
|
|
75
|
+
const clientOrderId = `order_${Date.now()}_${Math.random().toString(36).slice(2, 7)}`;
|
|
76
|
+
// 1. Register in state manager
|
|
77
|
+
const tracked = this.state.register(clientOrderId, context.strategyId, context);
|
|
78
|
+
// 2. Risk check
|
|
79
|
+
const riskResult = await this.risk.check(context, context.gasBudget);
|
|
80
|
+
if (!riskResult.passed) {
|
|
81
|
+
this.state.markError(context.dispatchId, `Risk block: ${riskResult.message}`);
|
|
41
82
|
return {
|
|
42
83
|
success: false,
|
|
43
|
-
error:
|
|
84
|
+
error: riskResult.message,
|
|
44
85
|
gasUsed: 0,
|
|
45
86
|
executionTime: Date.now() - startTime,
|
|
46
87
|
};
|
|
47
88
|
}
|
|
89
|
+
// 3. Execute with retry
|
|
90
|
+
let lastError;
|
|
91
|
+
for (let attempt = 0; attempt < this.retry.maxAttempts; attempt++) {
|
|
92
|
+
if (attempt > 0) {
|
|
93
|
+
const delay = Math.min(this.retry.baseDelayMs * Math.pow(this.retry.backoffFactor, attempt - 1), this.retry.maxDelayMs);
|
|
94
|
+
await sleep(delay);
|
|
95
|
+
this.state.incrementRetry(context.dispatchId);
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
// Load and execute strategy
|
|
99
|
+
const result = await this.loadAndExecuteStrategy(context);
|
|
100
|
+
// Track gas usage via Solana
|
|
101
|
+
const gasUsed = await this.estimateGasUsage(context);
|
|
102
|
+
this.state.setResult(context.dispatchId, result.data);
|
|
103
|
+
this.risk.recordStrategyClosed();
|
|
104
|
+
return {
|
|
105
|
+
success: true,
|
|
106
|
+
data: result.data,
|
|
107
|
+
gasUsed,
|
|
108
|
+
executionTime: Date.now() - startTime,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
lastError = err;
|
|
113
|
+
const msg = lastError.message.toLowerCase();
|
|
114
|
+
// Retry on transient errors
|
|
115
|
+
const shouldRetry = msg.includes('timeout') ||
|
|
116
|
+
msg.includes('network') ||
|
|
117
|
+
msg.includes('rate limit');
|
|
118
|
+
if (!shouldRetry) {
|
|
119
|
+
this.state.markError(context.dispatchId, lastError.message);
|
|
120
|
+
return {
|
|
121
|
+
success: false,
|
|
122
|
+
error: lastError.message,
|
|
123
|
+
gasUsed: 0,
|
|
124
|
+
executionTime: Date.now() - startTime,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// All retries exhausted
|
|
130
|
+
this.state.markError(context.dispatchId, lastError?.message ?? 'Max retries exceeded');
|
|
131
|
+
return {
|
|
132
|
+
success: false,
|
|
133
|
+
error: lastError?.message ?? 'Order submission failed after max retries',
|
|
134
|
+
gasUsed: 0,
|
|
135
|
+
executionTime: Date.now() - startTime,
|
|
136
|
+
};
|
|
48
137
|
}
|
|
49
138
|
/**
|
|
50
|
-
*
|
|
139
|
+
* Load strategy package and execute
|
|
51
140
|
*/
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
141
|
+
async loadAndExecuteStrategy(context) {
|
|
142
|
+
const packageDir = path.join(this.packagesDir, context.strategyId);
|
|
143
|
+
if (!fs.existsSync(packageDir)) {
|
|
144
|
+
throw new Error(`Strategy package not found: ${context.strategyId}`);
|
|
145
|
+
}
|
|
146
|
+
const manifestPath = path.join(packageDir, 'manifest.json');
|
|
147
|
+
if (!fs.existsSync(manifestPath)) {
|
|
148
|
+
throw new Error(`Invalid strategy package: no manifest.json`);
|
|
149
|
+
}
|
|
150
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
|
|
151
|
+
if (!manifest.aiCompatible && !manifest.llmCompatible) {
|
|
152
|
+
throw new Error(`Strategy not AI/LLM compatible: ${context.strategyId}`);
|
|
153
|
+
}
|
|
154
|
+
const entryPoint = path.join(packageDir, manifest.entryPoint);
|
|
155
|
+
if (!fs.existsSync(entryPoint)) {
|
|
156
|
+
throw new Error(`Entry point not found: ${entryPoint}`);
|
|
157
|
+
}
|
|
158
|
+
// Execute the strategy
|
|
159
|
+
console.log(`Executing strategy: ${context.strategyId}`);
|
|
160
|
+
console.log(`Dispatch ID: ${context.dispatchId}`);
|
|
161
|
+
console.log(`Config: ${JSON.stringify(context.config.params)}`);
|
|
68
162
|
try {
|
|
69
|
-
const
|
|
70
|
-
|
|
163
|
+
const { stdout, stderr } = await execAsync(`node ${entryPoint}`, {
|
|
164
|
+
cwd: packageDir,
|
|
165
|
+
env: {
|
|
166
|
+
...process.env,
|
|
167
|
+
STRATEGY_ID: context.strategyId,
|
|
168
|
+
DISPATCH_ID: context.dispatchId,
|
|
169
|
+
CONFIG: JSON.stringify(context.config.params),
|
|
170
|
+
API_KEY: context.apiKey,
|
|
171
|
+
},
|
|
172
|
+
timeout: 300000, // 5 min timeout
|
|
173
|
+
});
|
|
174
|
+
if (stderr) {
|
|
175
|
+
console.warn(`Strategy stderr: ${stderr}`);
|
|
176
|
+
}
|
|
177
|
+
// Parse result from stdout
|
|
178
|
+
try {
|
|
179
|
+
const result = JSON.parse(stdout);
|
|
180
|
+
return {
|
|
181
|
+
success: true,
|
|
182
|
+
data: result,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return {
|
|
187
|
+
success: true,
|
|
188
|
+
data: { output: stdout },
|
|
189
|
+
};
|
|
190
|
+
}
|
|
71
191
|
}
|
|
72
|
-
|
|
73
|
-
|
|
192
|
+
catch (err) {
|
|
193
|
+
const error = err;
|
|
194
|
+
if (error.code === 124) {
|
|
195
|
+
throw new Error('Strategy execution timeout');
|
|
196
|
+
}
|
|
197
|
+
throw new Error(`Strategy execution failed: ${error.message}`);
|
|
74
198
|
}
|
|
75
199
|
}
|
|
76
200
|
/**
|
|
77
|
-
*
|
|
201
|
+
* Estimate gas usage for a strategy
|
|
202
|
+
*/
|
|
203
|
+
async estimateGasUsage(context) {
|
|
204
|
+
// In real implementation, track actual gas via Solana provider
|
|
205
|
+
// For now, return a simulated value
|
|
206
|
+
return Math.floor(Math.random() * 1000) + 100;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Get tracked strategy
|
|
78
210
|
*/
|
|
79
|
-
|
|
80
|
-
return this.
|
|
211
|
+
getStrategy(dispatchId) {
|
|
212
|
+
return this.state.get(dispatchId);
|
|
81
213
|
}
|
|
82
214
|
/**
|
|
83
215
|
* List executing strategies
|
|
84
216
|
*/
|
|
85
217
|
listExecuting() {
|
|
86
|
-
return
|
|
218
|
+
return this.state.list({ status: 'open' });
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Cancel a running strategy
|
|
222
|
+
*/
|
|
223
|
+
async cancel(dispatchId) {
|
|
224
|
+
const strategy = this.state.get(dispatchId);
|
|
225
|
+
if (!strategy)
|
|
226
|
+
return false;
|
|
227
|
+
if (strategy.status === 'pending' || strategy.status === 'open') {
|
|
228
|
+
this.state.transition(dispatchId, 'cancel_request');
|
|
229
|
+
this.state.transition(dispatchId, 'cancelled');
|
|
230
|
+
this.risk.recordStrategyClosed();
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Sync strategy status from external source
|
|
237
|
+
*/
|
|
238
|
+
async syncStatus(dispatchId) {
|
|
239
|
+
const strategy = this.state.get(dispatchId);
|
|
240
|
+
if (!strategy)
|
|
241
|
+
return null;
|
|
242
|
+
// In real implementation, check with API for latest status
|
|
243
|
+
// For now, return current state
|
|
244
|
+
return strategy;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Get state manager (for ExecutionManager)
|
|
248
|
+
*/
|
|
249
|
+
getState() {
|
|
250
|
+
return this.state;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Get risk guard (for ExecutionManager)
|
|
254
|
+
*/
|
|
255
|
+
getRisk() {
|
|
256
|
+
return this.risk;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
exports.StrategyExecutor = StrategyExecutor;
|
|
260
|
+
/**
|
|
261
|
+
* Strategy execution manager (singleton-like)
|
|
262
|
+
* Manages multiple concurrent strategy executions
|
|
263
|
+
*/
|
|
264
|
+
class ExecutionManager {
|
|
265
|
+
executor;
|
|
266
|
+
executing = new Map();
|
|
267
|
+
constructor(options) {
|
|
268
|
+
this.executor = new StrategyExecutor(options);
|
|
269
|
+
}
|
|
270
|
+
async execute(context) {
|
|
271
|
+
this.executor.getRisk().recordStrategyOpened();
|
|
272
|
+
const result = await this.executor.execute(context);
|
|
273
|
+
return result;
|
|
274
|
+
}
|
|
275
|
+
async cancel(dispatchId) {
|
|
276
|
+
return this.executor.cancel(dispatchId);
|
|
277
|
+
}
|
|
278
|
+
getStrategy(dispatchId) {
|
|
279
|
+
return this.executor.getStrategy(dispatchId);
|
|
280
|
+
}
|
|
281
|
+
listExecuting() {
|
|
282
|
+
return this.executor.listExecuting();
|
|
283
|
+
}
|
|
284
|
+
purgeOld(maxAgeMs = 24 * 60 * 60 * 1000) {
|
|
285
|
+
return this.executor.getState().purge(maxAgeMs);
|
|
87
286
|
}
|
|
88
287
|
}
|
|
89
288
|
exports.ExecutionManager = ExecutionManager;
|
|
289
|
+
function sleep(ms) {
|
|
290
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
291
|
+
}
|
|
90
292
|
//# sourceMappingURL=executor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/providers/executor.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/providers/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Risk Guard — Pre-execution checks
|
|
3
|
+
* Validates every strategy dispatch against configurable limits.
|
|
4
|
+
*/
|
|
5
|
+
import type { ExecutorContext, RiskLimits, RiskCheckResult } from '../types/strategy';
|
|
6
|
+
export declare class RiskGuard {
|
|
7
|
+
private limits;
|
|
8
|
+
private dailyLoss;
|
|
9
|
+
private openStrategyCount;
|
|
10
|
+
constructor(limits: RiskLimits);
|
|
11
|
+
recordStrategyOpened(): void;
|
|
12
|
+
recordStrategyClosed(): void;
|
|
13
|
+
recordPnl(pnl: number): void;
|
|
14
|
+
resetDailyStats(): void;
|
|
15
|
+
check(context: ExecutorContext, gasBudget?: number): Promise<RiskCheckResult>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=risk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.d.ts","sourceRoot":"","sources":["../../src/providers/risk.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAE3B,qBAAa,SAAS;IAIR,OAAO,CAAC,MAAM;IAH1B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,iBAAiB,CAAa;gBAElB,MAAM,EAAE,UAAU;IAEtC,oBAAoB,IAAI,IAAI;IAI5B,oBAAoB,IAAI,IAAI;IAI5B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI5B,eAAe,IAAI,IAAI;IAIjB,KAAK,CACT,OAAO,EAAE,eAAe,EACxB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,CAAC;CAqD5B"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Risk Guard — Pre-execution checks
|
|
4
|
+
* Validates every strategy dispatch against configurable limits.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.RiskGuard = void 0;
|
|
8
|
+
class RiskGuard {
|
|
9
|
+
limits;
|
|
10
|
+
dailyLoss = 0;
|
|
11
|
+
openStrategyCount = 0;
|
|
12
|
+
constructor(limits) {
|
|
13
|
+
this.limits = limits;
|
|
14
|
+
}
|
|
15
|
+
recordStrategyOpened() {
|
|
16
|
+
this.openStrategyCount++;
|
|
17
|
+
}
|
|
18
|
+
recordStrategyClosed() {
|
|
19
|
+
this.openStrategyCount = Math.max(0, this.openStrategyCount - 1);
|
|
20
|
+
}
|
|
21
|
+
recordPnl(pnl) {
|
|
22
|
+
if (pnl < 0)
|
|
23
|
+
this.dailyLoss += Math.abs(pnl);
|
|
24
|
+
}
|
|
25
|
+
resetDailyStats() {
|
|
26
|
+
this.dailyLoss = 0;
|
|
27
|
+
}
|
|
28
|
+
async check(context, gasBudget) {
|
|
29
|
+
const messages = [];
|
|
30
|
+
// ── 1. Strategy Whitelist / Blacklist ──────────────────────────────────
|
|
31
|
+
if (this.limits.allowedStrategies?.length) {
|
|
32
|
+
const allowed = this.limits.allowedStrategies.includes(context.strategyId);
|
|
33
|
+
if (!allowed) {
|
|
34
|
+
messages.push(`Strategy ${context.strategyId} not in whitelist`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (this.limits.blockedStrategies?.includes(context.strategyId)) {
|
|
38
|
+
messages.push(`Strategy ${context.strategyId} is blocked`);
|
|
39
|
+
}
|
|
40
|
+
// ── 2. Daily Limit ─────────────────────────────────────────────────────
|
|
41
|
+
if (this.limits.maxDailyStrategies !== undefined &&
|
|
42
|
+
this.limits.usedToday !== undefined) {
|
|
43
|
+
if (this.limits.usedToday >= this.limits.maxDailyStrategies) {
|
|
44
|
+
messages.push(`Daily limit reached: ${this.limits.usedToday}/${this.limits.maxDailyStrategies}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// ── 3. Max Open Strategies ────────────────────────────────────────────
|
|
48
|
+
if (this.limits.maxDailyStrategies !== undefined &&
|
|
49
|
+
this.openStrategyCount >= this.limits.maxDailyStrategies) {
|
|
50
|
+
messages.push(`Open strategy limit reached: ${this.openStrategyCount}`);
|
|
51
|
+
}
|
|
52
|
+
// ── 4. Gas Budget ─────────────────────────────────────────────────────
|
|
53
|
+
if (gasBudget !== undefined && this.limits.maxGasBudget !== undefined) {
|
|
54
|
+
if (gasBudget > this.limits.maxGasBudget) {
|
|
55
|
+
messages.push(`Gas budget $${gasBudget} exceeds limit $${this.limits.maxGasBudget}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const passed = messages.length === 0;
|
|
59
|
+
return {
|
|
60
|
+
passed,
|
|
61
|
+
message: messages.join('; '),
|
|
62
|
+
adjustedContext: passed ? undefined : context,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.RiskGuard = RiskGuard;
|
|
67
|
+
//# sourceMappingURL=risk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.js","sourceRoot":"","sources":["../../src/providers/risk.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAQH,MAAa,SAAS;IAIA;IAHZ,SAAS,GAAW,CAAC,CAAC;IACtB,iBAAiB,GAAW,CAAC,CAAC;IAEtC,YAAoB,MAAkB;QAAlB,WAAM,GAAN,MAAM,CAAY;IAAG,CAAC;IAE1C,oBAAoB;QAClB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED,oBAAoB;QAClB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,SAAS,CAAC,GAAW;QACnB,IAAI,GAAG,GAAG,CAAC;YAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED,eAAe;QACb,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,KAAK,CACT,OAAwB,EACxB,SAAkB;QAElB,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,0EAA0E;QAC1E,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC3E,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,UAAU,mBAAmB,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAChE,QAAQ,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,UAAU,aAAa,CAAC,CAAC;QAC7D,CAAC;QAED,0EAA0E;QAC1E,IACE,IAAI,CAAC,MAAM,CAAC,kBAAkB,KAAK,SAAS;YAC5C,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,EACnC,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBAC5D,QAAQ,CAAC,IAAI,CACX,wBAAwB,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAClF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,yEAAyE;QACzE,IACE,IAAI,CAAC,MAAM,CAAC,kBAAkB,KAAK,SAAS;YAC5C,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EACxD,CAAC;YACD,QAAQ,CAAC,IAAI,CACX,gCAAgC,IAAI,CAAC,iBAAiB,EAAE,CACzD,CAAC;QACJ,CAAC;QAED,yEAAyE;QACzE,IAAI,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACtE,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;gBACzC,QAAQ,CAAC,IAAI,CACX,eAAe,SAAS,mBAAmB,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CACtE,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;QACrC,OAAO;YACL,MAAM;YACN,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5B,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;SAC9C,CAAC;IACJ,CAAC;CACF;AA9ED,8BA8EC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Order State Manager
|
|
3
|
+
* Tracks every strategy through its lifecycle with complete transition log.
|
|
4
|
+
*/
|
|
5
|
+
import type { OrderStatus, OrderEvent, TrackedStrategy, ExecutorContext } from '../types/strategy';
|
|
6
|
+
export declare function applyTransition(current: OrderStatus, event: OrderEvent): OrderStatus | null;
|
|
7
|
+
export declare class OrderStateManager {
|
|
8
|
+
private strategies;
|
|
9
|
+
private clientIdMap;
|
|
10
|
+
register(clientOrderId: string, strategyId: string, context: ExecutorContext): TrackedStrategy;
|
|
11
|
+
bind(clientOrderId: string, dispatchId: string): TrackedStrategy | null;
|
|
12
|
+
transition(id: string, event: OrderEvent, detail?: string): TrackedStrategy | null;
|
|
13
|
+
applyResult(id: string, result: {
|
|
14
|
+
status: OrderStatus;
|
|
15
|
+
error?: string;
|
|
16
|
+
}): TrackedStrategy | null;
|
|
17
|
+
markError(id: string, error: string): TrackedStrategy | null;
|
|
18
|
+
setResult(id: string, result: unknown): TrackedStrategy | null;
|
|
19
|
+
incrementRetry(id: string): number;
|
|
20
|
+
get(id: string): TrackedStrategy | undefined;
|
|
21
|
+
getByDispatchId(dispatchId: string): TrackedStrategy | undefined;
|
|
22
|
+
list(filter?: {
|
|
23
|
+
status?: OrderStatus;
|
|
24
|
+
}): TrackedStrategy[];
|
|
25
|
+
remove(id: string): void;
|
|
26
|
+
/** Purge terminal strategies older than maxAgeMs */
|
|
27
|
+
purge(maxAgeMs?: number): number;
|
|
28
|
+
size(): number;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/providers/state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EAEV,eAAe,EACf,eAAe,EAChB,MAAM,mBAAmB,CAAC;AA6B3B,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,UAAU,GAChB,WAAW,GAAG,IAAI,CAEpB;AAID,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAA2C;IAC7D,OAAO,CAAC,WAAW,CAAkC;IAErD,QAAQ,CACN,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,eAAe,GACvB,eAAe;IAiBlB,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAUvE,UAAU,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,UAAU,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,eAAe,GAAG,IAAI;IAuBzB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,eAAe,GAAG,IAAI;IAwBhG,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAQ5D,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI;IAa9D,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAQlC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAO5C,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIhE,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,eAAe,EAAE;IAS1D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAOxB,oDAAoD;IACpD,KAAK,CAAC,QAAQ,GAAE,MAA4B,GAAG,MAAM;IAwBrD,IAAI,IAAI,MAAM;CAGf"}
|