@trading-boy/cli 1.7.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -59155,7 +59155,7 @@ function parseHumanInterval(value) {
59155
59155
  var MIN_SCAN_INTERVAL_MS = 6e4;
59156
59156
  function registerAgentCommand(program2) {
59157
59157
  const agent = program2.command("agent").description("Manage autonomous trading agents");
59158
- agent.command("create").description("Create a new agent").option("--trader-id <traderId>", "Trader ID").option("--strategy-id <strategyId>", "Strategy ID").option("--name <name>", "Agent name").option("--autonomy <level>", "Autonomy level: OBSERVE_ONLY, SUGGEST, AUTO_WITH_APPROVAL, FULLY_AUTONOMOUS", "OBSERVE_ONLY").option("--scan-interval <ms>", "Scan interval in ms (min 60000)", "300000").option("--scan-interval-human <duration>", "Scan interval in human-readable format (e.g. 1m, 5m, 15m, 30m, 1h)").option("--watchlist <symbols>", "Comma-separated token symbols").option("--max-daily-trades <n>", "Max daily trades", "10").option("--max-daily-loss <usd>", "Max daily loss in USD", "500").option("--max-position-size <pct>", "Max position size as decimal (0.10 = 10%)", "0.10").option("--min-confidence <n>", "Min confidence threshold (0-1)", "0.60").option("--scan-model <model>", "LLM model for market scanning").option("--analyze-model <model>", "LLM model for deep analysis").option("--decide-model <model>", "LLM model for trade decisions").addOption(new Option("--asset-class <class>", "Asset class for this agent").choices(["crypto", "commodities", "mixed"]).default("crypto")).option("--soul-override <text>", "Custom soul/personality for this agent").option("--purpose-override <text>", "Custom purpose/mission for this agent").option("--soul-file <path>", "Load soul from a file").option("--purpose-file <path>", "Load purpose from a file").addOption(new Option("--format <format>", "Output format").choices(["text", "json"]).default("text")).action(async (options) => {
59158
+ agent.command("create").description("Create a new agent").option("--trader-id <traderId>", "Trader ID").option("--strategy-id <strategyId>", "Strategy ID").option("--name <name>", "Agent name").option("--autonomy <level>", "Autonomy level: OBSERVE_ONLY, SUGGEST, AUTO_WITH_APPROVAL, FULLY_AUTONOMOUS", "OBSERVE_ONLY").option("--scan-interval <ms>", "Scan interval in ms (min 60000)", "300000").option("--scan-interval-human <duration>", "Scan interval in human-readable format (e.g. 1m, 5m, 15m, 30m, 1h)").option("--watchlist <symbols>", "Comma-separated token symbols").option("--max-daily-trades <n>", "Max daily trades", "10").option("--max-daily-loss <usd>", "Max daily loss in USD", "500").option("--max-position-size <pct>", "Max position size as decimal (0.10 = 10%)", "0.10").option("--min-confidence <n>", "Min confidence threshold (0-1)", "0.60").option("--scan-model <model>", "LLM model for market scanning").option("--analyze-model <model>", "LLM model for deep analysis").option("--decide-model <model>", "LLM model for trade decisions").addOption(new Option("--asset-class <class>", "Asset class for this agent").choices(["crypto", "commodities", "mixed"]).default("crypto")).option("--soul-override <text>", "Custom soul/personality for this agent").option("--purpose-override <text>", "Custom purpose/mission for this agent").option("--soul-file <path>", "Load soul from a file").option("--purpose-file <path>", "Load purpose from a file").option("--exit-reasoner", "Enable LLM-powered exit reasoning for this agent").addOption(new Option("--format <format>", "Output format").choices(["text", "json"]).default("text")).action(async (options) => {
59159
59159
  if (!await ensureRemote())
59160
59160
  return;
59161
59161
  if (!options.traderId) {
@@ -59212,6 +59212,8 @@ function registerAgentCommand(program2) {
59212
59212
  body.decideModel = options.decideModel;
59213
59213
  if (options.assetClass)
59214
59214
  body.assetClass = options.assetClass;
59215
+ if (options.exitReasoner)
59216
+ body.exitReasoner = true;
59215
59217
  if (options.soulFile) {
59216
59218
  const path5 = resolve2(options.soulFile);
59217
59219
  if (!existsSync3(path5)) {
@@ -59440,12 +59442,14 @@ function registerAgentCommand(program2) {
59440
59442
  handleApiError(error49, "Position exit failed", logger30);
59441
59443
  }
59442
59444
  });
59443
- agent.command("update <agentId>").description("Update agent config").option("--name <name>", "Agent name").option("--autonomy <level>", "Autonomy level").option("--scan-interval <ms>", "Scan interval in ms").option("--scan-interval-human <duration>", "Scan interval in human-readable format (e.g. 1m, 5m, 15m, 30m, 1h)").option("--watchlist <symbols>", "Comma-separated token symbols").option("--max-daily-trades <n>", "Max daily trades").option("--max-daily-loss <usd>", "Max daily loss in USD").option("--max-position-size <pct>", "Max position size as decimal").option("--min-confidence <n>", "Min confidence threshold").option("--scan-model <model>", "LLM model for market scanning").option("--analyze-model <model>", "LLM model for deep analysis").option("--decide-model <model>", "LLM model for trade decisions").addOption(new Option("--asset-class <class>", "Asset class for this agent").choices(["crypto", "commodities", "mixed"])).option("--soul-override <text>", "Custom soul/personality for this agent").option("--purpose-override <text>", "Custom purpose/mission for this agent").option("--soul-file <path>", "Load soul from a file").option("--purpose-file <path>", "Load purpose from a file").addOption(new Option("--format <format>", "Output format").choices(["text", "json"]).default("text")).action(async (agentId, options) => {
59445
+ agent.command("update <agentId>").description("Update agent config").option("--name <name>", "Agent name").option("--autonomy <level>", "Autonomy level").option("--scan-interval <ms>", "Scan interval in ms").option("--scan-interval-human <duration>", "Scan interval in human-readable format (e.g. 1m, 5m, 15m, 30m, 1h)").option("--watchlist <symbols>", "Comma-separated token symbols").option("--max-daily-trades <n>", "Max daily trades").option("--max-daily-loss <usd>", "Max daily loss in USD").option("--max-position-size <pct>", "Max position size as decimal").option("--min-confidence <n>", "Min confidence threshold").option("--scan-model <model>", "LLM model for market scanning").option("--analyze-model <model>", "LLM model for deep analysis").option("--decide-model <model>", "LLM model for trade decisions").addOption(new Option("--asset-class <class>", "Asset class for this agent").choices(["crypto", "commodities", "mixed"])).option("--soul-override <text>", "Custom soul/personality for this agent").option("--purpose-override <text>", "Custom purpose/mission for this agent").option("--soul-file <path>", "Load soul from a file").option("--purpose-file <path>", "Load purpose from a file").option("--exit-reasoner", "Enable LLM-powered exit reasoning for this agent").addOption(new Option("--format <format>", "Output format").choices(["text", "json"]).default("text")).action(async (agentId, options) => {
59444
59446
  if (!await ensureRemote())
59445
59447
  return;
59446
59448
  const body = {};
59447
59449
  if (options.name)
59448
59450
  body.name = options.name;
59451
+ if (options.exitReasoner)
59452
+ body.exitReasoner = true;
59449
59453
  if (options.autonomy)
59450
59454
  body.autonomyLevel = options.autonomy;
59451
59455
  if (options.scanIntervalHuman) {
@@ -97,6 +97,7 @@ export function registerAgentCommand(program) {
97
97
  .option('--purpose-override <text>', 'Custom purpose/mission for this agent')
98
98
  .option('--soul-file <path>', 'Load soul from a file')
99
99
  .option('--purpose-file <path>', 'Load purpose from a file')
100
+ .option('--exit-reasoner', 'Enable LLM-powered exit reasoning for this agent')
100
101
  .addOption(new Option('--format <format>', 'Output format').choices(['text', 'json']).default('text'))
101
102
  .action(async (options) => {
102
103
  if (!(await ensureRemote()))
@@ -157,6 +158,8 @@ export function registerAgentCommand(program) {
157
158
  body.decideModel = options.decideModel;
158
159
  if (options.assetClass)
159
160
  body.assetClass = options.assetClass;
161
+ if (options.exitReasoner)
162
+ body.exitReasoner = true;
160
163
  // Soul override — file takes precedence over inline text
161
164
  if (options.soulFile) {
162
165
  const path = resolve(options.soulFile);
@@ -470,6 +473,7 @@ export function registerAgentCommand(program) {
470
473
  .option('--purpose-override <text>', 'Custom purpose/mission for this agent')
471
474
  .option('--soul-file <path>', 'Load soul from a file')
472
475
  .option('--purpose-file <path>', 'Load purpose from a file')
476
+ .option('--exit-reasoner', 'Enable LLM-powered exit reasoning for this agent')
473
477
  .addOption(new Option('--format <format>', 'Output format').choices(['text', 'json']).default('text'))
474
478
  .action(async (agentId, options) => {
475
479
  if (!(await ensureRemote()))
@@ -477,6 +481,8 @@ export function registerAgentCommand(program) {
477
481
  const body = {};
478
482
  if (options.name)
479
483
  body.name = options.name;
484
+ if (options.exitReasoner)
485
+ body.exitReasoner = true;
480
486
  if (options.autonomy)
481
487
  body.autonomyLevel = options.autonomy;
482
488
  // Resolve scan interval: --scan-interval-human takes precedence
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trading-boy/cli",
3
- "version": "1.7.0",
3
+ "version": "1.8.0",
4
4
  "description": "Trading Boy CLI — crypto context intelligence for traders and AI agents. Query real-time prices, funding rates, whale activity, and DeFi risk for 100+ Solana tokens and 229 Hyperliquid perpetuals.",
5
5
  "homepage": "https://cabal.ventures",
6
6
  "repository": {