@tradejs/cli 3.1.8-beta.206 → 3.1.8-beta.210

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tradejs/cli",
3
- "version": "3.1.8-beta.206",
3
+ "version": "3.1.8-beta.210",
4
4
  "description": "Official CLI for the TradeJS TypeScript framework: infra setup, backtests, signals, bots, and ML workflows.",
5
5
  "keywords": [
6
6
  "tradejs",
@@ -32,13 +32,13 @@
32
32
  "tradejs": "dist/cli.js"
33
33
  },
34
34
  "dependencies": {
35
- "@tradejs/connectors": "^3.1.8-beta.206",
36
- "@tradejs/core": "^3.1.8-beta.206",
37
- "@tradejs/indicators": "^3.1.8-beta.206",
38
- "@tradejs/infra": "^3.1.8-beta.206",
39
- "@tradejs/node": "^3.1.8-beta.206",
35
+ "@tradejs/connectors": "^3.1.8-beta.210",
36
+ "@tradejs/core": "^3.1.8-beta.210",
37
+ "@tradejs/indicators": "^3.1.8-beta.210",
38
+ "@tradejs/infra": "^3.1.8-beta.210",
39
+ "@tradejs/node": "^3.1.8-beta.210",
40
40
  "@tradejs/strategy-kit": "^3.0.0",
41
- "@tradejs/types": "^3.1.8-beta.206",
41
+ "@tradejs/types": "^3.1.8-beta.210",
42
42
  "args": "^5.0.3",
43
43
  "bcryptjs": "^2.4.3",
44
44
  "chalk": "4.1.2",
@@ -83,7 +83,7 @@
83
83
  "runtime-evidence": "yarn run run:dist runtime-evidence",
84
84
  "runtime-evidence-sync": "yarn run run:dist runtime-evidence-sync",
85
85
  "runtime-scorecard": "yarn run run:dist runtime-scorecard",
86
- "runtime-config": "yarn run run:dist runtime-config",
86
+ "runtime-control": "yarn run run:dist runtime-control",
87
87
  "strategy-release": "yarn run run:dist strategy-release",
88
88
  "continuity": "yarn run run:dist continuity",
89
89
  "derivatives:ingest": "yarn run run:dist derivatives:ingest",
@@ -1,427 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
- // src/scripts/runtimeConfig.ts
31
- var runtimeConfig_exports = {};
32
- __export(runtimeConfig_exports, {
33
- RUNTIME_CONFIG_ACTIONS: () => RUNTIME_CONFIG_ACTIONS,
34
- buildProvisionedRuntimeDeployment: () => buildProvisionedRuntimeDeployment,
35
- isEquivalentRuntimeStrategyRelease: () => isEquivalentRuntimeStrategyRelease,
36
- main: () => main,
37
- pointRuntimeDeploymentAtRelease: () => pointRuntimeDeploymentAtRelease,
38
- resolveProvisionConnectorName: () => resolveProvisionConnectorName,
39
- runtimeConfig: () => runtimeConfig
40
- });
41
- module.exports = __toCommonJS(runtimeConfig_exports);
42
- var import_config = require("dotenv/config");
43
- var import_promises = require("fs/promises");
44
- var import_node_path = __toESM(require("path"));
45
- var import_node_util = require("util");
46
- var import_runtimeDeployments = require("@tradejs/infra/runtimeDeployments");
47
- var import_runtimeStrategyReleases = require("@tradejs/infra/runtimeStrategyReleases");
48
- var import_runtimeStrategies = require("@tradejs/node/runtimeStrategies");
49
- var import_strategies = require("@tradejs/node/strategies");
50
- var argv = process.argv.slice(2);
51
- var RUNTIME_CONFIG_ACTIONS = [
52
- "inspect",
53
- "verify",
54
- "provision",
55
- "rollout",
56
- "pause",
57
- "resume",
58
- "rollback"
59
- ];
60
- var action = argv[0] ?? "inspect";
61
- var option = (name) => {
62
- const index = argv.indexOf(`--${name}`);
63
- return index >= 0 ? argv[index + 1] : void 0;
64
- };
65
- var hasFlag = (name) => argv.includes(`--${name}`);
66
- var required = (name) => {
67
- const value = String(option(name) ?? "").trim();
68
- if (!value) throw new Error(`--${name} is required`);
69
- return value;
70
- };
71
- var projectRoot = String(process.env.PROJECT_CWD || process.cwd()).trim() || process.cwd();
72
- var userName = String(option("user") ?? process.env.USER_NAME ?? "root");
73
- var OPERATIONAL_CONFIG_KEYS = [
74
- "ACCOUNT_ID",
75
- "AI_REPLAY_ANALYSES",
76
- "DEPLOYMENT_ID",
77
- "ENABLE",
78
- "ENV",
79
- "MAKE_ORDERS",
80
- "RECORD_RUNTIME_TRADES"
81
- ];
82
- var resolveProvisionConnectorName = (value) => {
83
- const connectorName = String(value ?? "").trim();
84
- if (!connectorName) throw new Error("--connector is required");
85
- return connectorName;
86
- };
87
- var requireRuntimePackageIdentity = (strategyName, metadata) => {
88
- if (!metadata.strategyPackage || !metadata.strategyPackageVersion || !metadata.runtimePackageVersion) {
89
- throw new Error(
90
- `Runtime package manifest is incomplete for ${strategyName}`
91
- );
92
- }
93
- return {
94
- strategyPackage: metadata.strategyPackage,
95
- strategyPackageVersion: metadata.strategyPackageVersion,
96
- runtimePackageVersion: metadata.runtimePackageVersion
97
- };
98
- };
99
- var toReleaseConfig = async (strategyName, sourceConfig) => {
100
- const defaults = await (0, import_strategies.getStrategyDefaults)(strategyName, projectRoot) ?? {};
101
- const config = { ...defaults, ...sourceConfig };
102
- for (const key of OPERATIONAL_CONFIG_KEYS) delete config[key];
103
- return config;
104
- };
105
- var publish = async ({
106
- strategyName,
107
- sourceConfig
108
- }) => {
109
- const config = await toReleaseConfig(strategyName, sourceConfig);
110
- const metadata = await (0, import_runtimeStrategies.getRuntimeStrategyPackageMetadata)({
111
- strategyName,
112
- projectRoot
113
- });
114
- const packageIdentity = requireRuntimePackageIdentity(strategyName, metadata);
115
- return (0, import_runtimeStrategyReleases.publishRuntimeStrategyRelease)({
116
- userName,
117
- strategyName,
118
- config,
119
- ...packageIdentity,
120
- createdBy: `cli:${userName}`
121
- });
122
- };
123
- var buildProvisionedRuntimeDeployment = ({
124
- deploymentId,
125
- label,
126
- connectorName,
127
- provider,
128
- accountId,
129
- strategyName,
130
- releaseVersion
131
- }) => ({
132
- id: deploymentId,
133
- label,
134
- connectorName,
135
- provider,
136
- accountId,
137
- enabled: true,
138
- strategies: [
139
- {
140
- strategyName,
141
- releaseVersion,
142
- controlState: "entries_paused"
143
- }
144
- ]
145
- });
146
- var isEquivalentRuntimeStrategyRelease = ({
147
- release,
148
- config,
149
- strategyPackage,
150
- strategyPackageVersion,
151
- runtimePackageVersion
152
- }) => Boolean(
153
- release && (0, import_node_util.isDeepStrictEqual)(release.config, config) && release.strategyPackage === strategyPackage && release.strategyPackageVersion === strategyPackageVersion && release.runtimePackageVersion === runtimePackageVersion
154
- );
155
- var pointRuntimeDeploymentAtRelease = ({
156
- deployment,
157
- strategyName,
158
- releaseVersion
159
- }) => ({
160
- ...deployment,
161
- strategies: deployment.strategies.map(
162
- (strategy) => strategy.strategyName === strategyName ? {
163
- strategyName,
164
- releaseVersion,
165
- controlState: "entries_paused"
166
- } : strategy
167
- )
168
- });
169
- var provision = async () => {
170
- const strategyName = required("strategy");
171
- const deploymentId = required("deployment");
172
- const accountId = required("account");
173
- const connectorName = resolveProvisionConnectorName(option("connector"));
174
- const provider = option("provider") ?? connectorName;
175
- const label = option("label") ?? deploymentId;
176
- const configFile = import_node_path.default.resolve(projectRoot, required("file"));
177
- const sourceConfig = JSON.parse(
178
- await (0, import_promises.readFile)(configFile, "utf8")
179
- );
180
- const existingDeployment = await (0, import_runtimeDeployments.getRuntimeDeployment)(userName, deploymentId);
181
- if (existingDeployment) {
182
- throw new Error(
183
- `Deployment already exists: ${deploymentId}; publish a release and switch its pointer instead`
184
- );
185
- }
186
- const releaseConfig = await toReleaseConfig(strategyName, sourceConfig);
187
- const previewDeployment = buildProvisionedRuntimeDeployment({
188
- deploymentId,
189
- label,
190
- connectorName,
191
- provider,
192
- accountId,
193
- strategyName,
194
- releaseVersion: 1
195
- });
196
- if (!hasFlag("write")) {
197
- console.log(
198
- JSON.stringify(
199
- {
200
- dryRun: true,
201
- releaseConfig,
202
- deployment: {
203
- ...previewDeployment,
204
- strategies: previewDeployment.strategies.map((strategy) => ({
205
- ...strategy,
206
- releaseVersion: "<allocated on write>"
207
- }))
208
- }
209
- },
210
- null,
211
- 2
212
- )
213
- );
214
- return;
215
- }
216
- const release = await publish({ strategyName, sourceConfig });
217
- const deployment = await (0, import_runtimeDeployments.saveRuntimeDeployment)(
218
- userName,
219
- buildProvisionedRuntimeDeployment({
220
- deploymentId,
221
- label,
222
- connectorName,
223
- provider,
224
- accountId,
225
- strategyName,
226
- releaseVersion: release.releaseVersion
227
- })
228
- );
229
- console.log(
230
- JSON.stringify({ provisioned: true, release, deployment }, null, 2)
231
- );
232
- };
233
- var rollout = async () => {
234
- const strategyName = required("strategy");
235
- const deploymentId = required("deployment");
236
- const configFile = import_node_path.default.resolve(projectRoot, required("file"));
237
- const [deployment, sourceConfig] = await Promise.all([
238
- (0, import_runtimeDeployments.getRuntimeDeployment)(userName, deploymentId),
239
- (0, import_promises.readFile)(configFile, "utf8").then(
240
- (value) => JSON.parse(value)
241
- )
242
- ]);
243
- if (!deployment) throw new Error(`Deployment not found: ${deploymentId}`);
244
- const reference = deployment.strategies.find(
245
- (strategy) => strategy.strategyName === strategyName
246
- );
247
- if (!reference)
248
- throw new Error(`${strategyName} is not bound to ${deploymentId}`);
249
- const [config, metadata, currentRelease] = await Promise.all([
250
- toReleaseConfig(strategyName, sourceConfig),
251
- (0, import_runtimeStrategies.getRuntimeStrategyPackageMetadata)({ strategyName, projectRoot }),
252
- (0, import_runtimeStrategyReleases.getRuntimeStrategyRelease)(userName, strategyName, reference.releaseVersion)
253
- ]);
254
- const packageIdentity = requireRuntimePackageIdentity(strategyName, metadata);
255
- const unchanged = isEquivalentRuntimeStrategyRelease({
256
- release: currentRelease,
257
- config,
258
- ...packageIdentity
259
- });
260
- const preview = {
261
- deploymentId,
262
- strategyName,
263
- currentReleaseVersion: reference.releaseVersion,
264
- nextControlState: "entries_paused",
265
- unchanged,
266
- config,
267
- ...packageIdentity
268
- };
269
- if (!hasFlag("write")) {
270
- console.log(JSON.stringify({ dryRun: true, ...preview }, null, 2));
271
- return;
272
- }
273
- if (unchanged) {
274
- console.log(
275
- JSON.stringify(
276
- {
277
- rolledOut: false,
278
- reason: "release_config_and_packages_unchanged",
279
- release: currentRelease,
280
- deployment
281
- },
282
- null,
283
- 2
284
- )
285
- );
286
- return;
287
- }
288
- const release = await (0, import_runtimeStrategyReleases.publishRuntimeStrategyRelease)({
289
- userName,
290
- strategyName,
291
- config,
292
- ...packageIdentity,
293
- createdBy: `cli:${userName}`
294
- });
295
- const updatedDeployment = pointRuntimeDeploymentAtRelease({
296
- deployment,
297
- strategyName,
298
- releaseVersion: release.releaseVersion
299
- });
300
- await (0, import_runtimeDeployments.saveRuntimeDeployment)(userName, updatedDeployment);
301
- console.log(
302
- JSON.stringify(
303
- {
304
- rolledOut: true,
305
- release,
306
- deployment: updatedDeployment
307
- },
308
- null,
309
- 2
310
- )
311
- );
312
- };
313
- var updateControlState = async (nextState) => {
314
- const strategyName = required("strategy");
315
- const deploymentId = required("deployment");
316
- const deployment = await (0, import_runtimeDeployments.getRuntimeDeployment)(userName, deploymentId);
317
- if (!deployment) throw new Error(`Deployment not found: ${deploymentId}`);
318
- const reference = deployment.strategies.find(
319
- (strategy) => strategy.strategyName === strategyName
320
- );
321
- if (!reference)
322
- throw new Error(`${strategyName} is not bound to ${deploymentId}`);
323
- const previousState = reference.controlState;
324
- const updated = await (0, import_runtimeDeployments.saveRuntimeDeployment)(userName, {
325
- ...deployment,
326
- strategies: deployment.strategies.map(
327
- (strategy) => strategy.strategyName === strategyName ? { ...strategy, controlState: nextState } : strategy
328
- )
329
- });
330
- const event = previousState === nextState ? null : await (0, import_runtimeStrategyReleases.recordRuntimeStrategyControlEvent)({
331
- userName,
332
- deploymentId,
333
- strategyName,
334
- releaseVersion: reference.releaseVersion,
335
- previousState,
336
- nextState,
337
- createdBy: `cli:${userName}`
338
- });
339
- console.log(JSON.stringify({ deployment: updated, event }, null, 2));
340
- };
341
- var rollback = async () => {
342
- const strategyName = required("strategy");
343
- const deploymentId = required("deployment");
344
- const releaseVersion = Number(required("release"));
345
- if (!Number.isSafeInteger(releaseVersion) || releaseVersion <= 0) {
346
- throw new Error("--release must be a positive integer");
347
- }
348
- const deployment = await (0, import_runtimeDeployments.getRuntimeDeployment)(userName, deploymentId);
349
- if (!deployment) throw new Error(`Deployment not found: ${deploymentId}`);
350
- const release = (await (0, import_runtimeStrategyReleases.listRuntimeStrategyReleases)(userName, strategyName)).find((candidate) => candidate.releaseVersion === releaseVersion);
351
- if (!release)
352
- throw new Error(`Release not found: ${strategyName} v${releaseVersion}`);
353
- const updated = await (0, import_runtimeDeployments.saveRuntimeDeployment)(userName, {
354
- ...deployment,
355
- strategies: deployment.strategies.map(
356
- (strategy) => strategy.strategyName === strategyName ? {
357
- strategyName,
358
- releaseVersion,
359
- controlState: "entries_paused"
360
- } : strategy
361
- )
362
- });
363
- console.log(JSON.stringify({ deployment: updated }, null, 2));
364
- };
365
- var verify = async () => {
366
- const deployments = await (0, import_runtimeDeployments.listRuntimeDeployments)(userName);
367
- const selected = option("deployment") ? deployments.filter((deployment) => deployment.id === option("deployment")) : deployments;
368
- const results = [];
369
- for (const deployment of selected) {
370
- try {
371
- const strategies = await (0, import_runtimeStrategies.loadResolvedRuntimeStrategies)({
372
- userName,
373
- projectRoot,
374
- deployment
375
- });
376
- results.push({
377
- deploymentId: deployment.id,
378
- ok: true,
379
- strategies: strategies.map((strategy) => ({
380
- strategyName: strategy.strategyName,
381
- releaseVersion: strategy.releaseVersion,
382
- controlState: strategy.controlState,
383
- interval: strategy.interval,
384
- universe: strategy.universe,
385
- accountId: strategy.accountId
386
- }))
387
- });
388
- } catch (error) {
389
- results.push({
390
- deploymentId: deployment.id,
391
- ok: false,
392
- error: error instanceof Error ? error.message : String(error)
393
- });
394
- }
395
- }
396
- console.log(JSON.stringify({ userName, results }, null, 2));
397
- if (results.some((result) => !result.ok)) process.exitCode = 1;
398
- };
399
- var inspect = async () => {
400
- const strategyName = option("strategy");
401
- const deployments = await (0, import_runtimeDeployments.listRuntimeDeployments)(userName);
402
- const releases = strategyName ? await (0, import_runtimeStrategyReleases.listRuntimeStrategyReleases)(userName, strategyName) : void 0;
403
- console.log(JSON.stringify({ userName, deployments, releases }, null, 2));
404
- };
405
- var runtimeConfig = async () => {
406
- if (action === "provision") return provision();
407
- if (action === "rollout") return rollout();
408
- if (action === "verify") return verify();
409
- if (action === "pause") return updateControlState("entries_paused");
410
- if (action === "resume") return updateControlState("active");
411
- if (action === "rollback") return rollback();
412
- if (action === "inspect") return inspect();
413
- throw new Error(
414
- `Usage: tradejs runtime-config ${RUNTIME_CONFIG_ACTIONS.join("|")}`
415
- );
416
- };
417
- var main = runtimeConfig;
418
- // Annotate the CommonJS export names for ESM import in node:
419
- 0 && (module.exports = {
420
- RUNTIME_CONFIG_ACTIONS,
421
- buildProvisionedRuntimeDeployment,
422
- isEquivalentRuntimeStrategyRelease,
423
- main,
424
- pointRuntimeDeploymentAtRelease,
425
- resolveProvisionConnectorName,
426
- runtimeConfig
427
- });