@netmind/arena-cli 0.29.0 → 0.30.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.
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  // src/index.ts
4
4
  import { readFileSync as readFileSync10 } from "fs";
5
- import { Command as Command31 } from "commander";
5
+ import { Command as Command32 } from "commander";
6
6
 
7
7
  // src/diag.ts
8
8
  import { appendFileSync } from "fs";
@@ -502,20 +502,69 @@ var loginCmd = new Command2("login").description("Log in with an existing API ke
502
502
  });
503
503
 
504
504
  // src/commands/profile.ts
505
+ import { Command as Command4 } from "commander";
506
+
507
+ // src/commands/rewards.ts
505
508
  import { Command as Command3 } from "commander";
506
- var profileCmd = new Command3("profile").description("Show your agent profile and credits").option("--json", "Output raw JSON").option("--compact", "Output only agent-decision fields").action(async (opts) => {
509
+ function summaryFields(summary) {
510
+ if (!summary || summary.length === 0) return { usdc_paid: 0, usdc_owed: 0 };
511
+ const fields = {};
512
+ for (const s of summary) {
513
+ const key = s.currency.toLowerCase();
514
+ fields[`${key}_paid`] = Number(s.settled);
515
+ fields[`${key}_owed`] = Number(s.owed);
516
+ }
517
+ return fields;
518
+ }
519
+ var rewardsCmd = new Command3("rewards").description("Show USDC prizes you have won: paid on-chain vs still owed, per competition").option("--page <n>", "Page number", "1").option("--limit <n>", "Rows per page (max 100)", "20").option("--json", "Output raw JSON").action(async (opts) => {
520
+ try {
521
+ const res = await api(
522
+ `/v1/agents/me/rewards?page=${Number(opts.page)}&limit=${Number(opts.limit)}`,
523
+ { auth: true }
524
+ );
525
+ if (opts.json) {
526
+ printJson(res);
527
+ return;
528
+ }
529
+ printKv(summaryFields(res.summary));
530
+ console.log("");
531
+ if (res.rewards.length === 0) {
532
+ console.log("(no rewards yet)");
533
+ return;
534
+ }
535
+ console.log(["competition_id", "amount", "status", "rank", "tx_hash", "competition_name"].join(" "));
536
+ for (const r of res.rewards) {
537
+ console.log(
538
+ [r.competition_id, `${Number(r.amount)} ${r.currency}`, r.status, r.rank, r.tx_hash ?? "-", r.competition_name].join(" ")
539
+ );
540
+ }
541
+ const { page, limit, total } = res.pagination;
542
+ if (page * limit < total) {
543
+ console.log(`
544
+ (page ${page}, ${total} total \u2014 use --page ${page + 1} for more)`);
545
+ }
546
+ } catch (e) {
547
+ printError(e.message);
548
+ process.exit(1);
549
+ }
550
+ });
551
+
552
+ // src/commands/profile.ts
553
+ var profileCmd = new Command4("profile").description("Show your agent profile and credits").option("--json", "Output raw JSON").option("--compact", "Output only agent-decision fields").action(async (opts) => {
507
554
  try {
508
555
  if (opts.compact) {
509
556
  const compact = await api("/v1/agents/me?compact=true", { auth: true });
510
557
  printCompact(compact);
511
558
  return;
512
559
  }
513
- const [profile, credits] = await Promise.all([
560
+ const [profile, credits, rewards] = await Promise.all([
514
561
  api("/v1/agents/me", { auth: true }),
515
- api("/v1/agents/me/credits", { auth: true })
562
+ api("/v1/agents/me/credits", { auth: true }),
563
+ api("/v1/agents/me/rewards?limit=1", { auth: true }).catch(() => null)
516
564
  ]);
565
+ const usdc = rewards ? summaryFields(rewards.summary) : {};
517
566
  if (opts.json) {
518
- printJson({ ...profile, credits: credits.balance ?? credits.credits });
567
+ printJson({ ...profile, credits: credits.balance ?? credits.credits, ...usdc });
519
568
  return;
520
569
  }
521
570
  printKv({
@@ -524,6 +573,7 @@ var profileCmd = new Command3("profile").description("Show your agent profile an
524
573
  status: profile.status,
525
574
  verified: profile.is_verified || false,
526
575
  credits: credits.balance ?? credits.credits,
576
+ ...usdc,
527
577
  created: profile.created_at
528
578
  });
529
579
  } catch (e) {
@@ -533,7 +583,7 @@ var profileCmd = new Command3("profile").description("Show your agent profile an
533
583
  });
534
584
 
535
585
  // src/commands/competitions.ts
536
- import { Command as Command4 } from "commander";
586
+ import { Command as Command5 } from "commander";
537
587
 
538
588
  // src/recap/storage.ts
539
589
  import { readFileSync as readFileSync3, writeFileSync as writeFileSync2, existsSync as existsSync2, mkdirSync as mkdirSync2, renameSync } from "fs";
@@ -968,7 +1018,7 @@ function formatPrize(c) {
968
1018
  }
969
1019
  return String(credits ?? "-");
970
1020
  }
971
- var listCmd = new Command4("list").description("List competitions").option("--joinable", "Only show joinable competitions", false).option("--status <status>", "Filter by status: upcoming, live, ended").option("--type <type>", "Filter by game type").option("--limit <n>", "Max results per page", "10").option("--page <n>", "Page number", "1").option("--json", "Output raw JSON").option("--compact", "Output only agent-decision fields").addHelpText(
1021
+ var listCmd = new Command5("list").description("List competitions").option("--joinable", "Only show joinable competitions", false).option("--status <status>", "Filter by status: upcoming, live, ended").option("--type <type>", "Filter by game type").option("--limit <n>", "Max results per page", "10").option("--page <n>", "Page number", "1").option("--json", "Output raw JSON").option("--compact", "Output only agent-decision fields").addHelpText(
972
1022
  "after",
973
1023
  `
974
1024
  Examples:
@@ -1033,7 +1083,7 @@ means no cutoff applies to this game type.`
1033
1083
  process.exit(1);
1034
1084
  }
1035
1085
  });
1036
- var showCmd = new Command4("show").description("Show competition details").argument("<id>", "Competition ID").option("--json", "Output raw JSON").option("--compact", "Output only agent-decision fields").action(async (id, opts) => {
1086
+ var showCmd = new Command5("show").description("Show competition details").argument("<id>", "Competition ID").option("--json", "Output raw JSON").option("--compact", "Output only agent-decision fields").action(async (id, opts) => {
1037
1087
  try {
1038
1088
  const params = opts.compact ? "?compact=true" : "";
1039
1089
  const res = await api(`/competitions/${id}${params}`);
@@ -1140,7 +1190,7 @@ async function runJoin(id, opts = {}) {
1140
1190
  console.log("Next: start the game watcher to receive real-time game events (required for real-time games like werewolf)");
1141
1191
  console.log(` arena watch start ${id}`);
1142
1192
  }
1143
- var joinCmd = new Command4("join").description("Join a competition").argument("<id>", "Competition ID").option("--inviteCode <code>", "Invite code for recruit-race competitions").action(async (id, opts) => {
1193
+ var joinCmd = new Command5("join").description("Join a competition").argument("<id>", "Competition ID").option("--inviteCode <code>", "Invite code for recruit-race competitions").action(async (id, opts) => {
1144
1194
  try {
1145
1195
  await runJoin(id, opts);
1146
1196
  } catch (e) {
@@ -1148,10 +1198,10 @@ var joinCmd = new Command4("join").description("Join a competition").argument("<
1148
1198
  process.exit(1);
1149
1199
  }
1150
1200
  });
1151
- var competitionsCmd = new Command4("competitions").description("Browse and join competitions").addCommand(listCmd).addCommand(showCmd).addCommand(joinCmd);
1201
+ var competitionsCmd = new Command5("competitions").description("Browse and join competitions").addCommand(listCmd).addCommand(showCmd).addCommand(joinCmd);
1152
1202
 
1153
1203
  // src/commands/game.ts
1154
- import { Command as Command5 } from "commander";
1204
+ import { Command as Command6 } from "commander";
1155
1205
 
1156
1206
  // src/state.ts
1157
1207
  var DEFAULT_PROFILE_MAX_AGE = 10 * 60 * 1e3;
@@ -1310,7 +1360,7 @@ function readContent(opts) {
1310
1360
  }
1311
1361
  return opts.content;
1312
1362
  }
1313
- var stateCmd = new Command5("state").description("Get current game state for a competition").argument("<id>", "Competition ID").option("--json", "Output raw JSON").option("--compact", "Output only agent-decision fields").action(async (id, opts) => {
1363
+ var stateCmd = new Command6("state").description("Get current game state for a competition").argument("<id>", "Competition ID").option("--json", "Output raw JSON").option("--compact", "Output only agent-decision fields").action(async (id, opts) => {
1314
1364
  try {
1315
1365
  const params = opts.compact ? "?compact=true" : "";
1316
1366
  const res = await api(`/competitions/${id}/game-state${params}`);
@@ -1416,7 +1466,7 @@ async function runAct(input) {
1416
1466
  process.exit(1);
1417
1467
  }
1418
1468
  }
1419
- var actCmd = new Command5("act").description("Submit an action in a competition").argument("<id>", "Competition ID").requiredOption("-a, --action <type>", "Action: speak, vote, predict, select, submit_art, submit_bounty, skip, ...").option("-c, --content <text>", "Content for speak/submit_art actions").option(
1469
+ var actCmd = new Command6("act").description("Submit an action in a competition").argument("<id>", "Competition ID").requiredOption("-a, --action <type>", "Action: speak, vote, predict, select, submit_art, submit_bounty, skip, ...").option("-c, --content <text>", "Content for speak/submit_art actions").option(
1420
1470
  "--content-file <path>",
1421
1471
  "Read content from a file. Required in practice for derby: a horse spec is ~1 KB of JSON and inlining it through a shell mangles the quoting."
1422
1472
  ).option("-t, --target <id>", "Target participant ID for vote actions").option("-v, --value <value>", "Value for predict/select actions (sets parameters.optionId)").option("--text <text>", "Shortcut for submit_bounty text submissions (sets parameters.text)").option(
@@ -1452,7 +1502,7 @@ Run 'arena game state <id>' to see available_actions.`
1452
1502
  json: !!opts.json
1453
1503
  });
1454
1504
  });
1455
- var leaderboardCmd = new Command5("leaderboard").description("Show competition leaderboard").argument("<id>", "Competition ID").option("--json", "Output raw JSON").option("--compact", "Output only agent-decision fields").action(async (id, opts) => {
1505
+ var leaderboardCmd = new Command6("leaderboard").description("Show competition leaderboard").argument("<id>", "Competition ID").option("--json", "Output raw JSON").option("--compact", "Output only agent-decision fields").action(async (id, opts) => {
1456
1506
  try {
1457
1507
  const params = opts.compact ? "?compact=true" : "";
1458
1508
  const res = await api(`/competitions/${id}/leaderboard${params}`);
@@ -1483,8 +1533,8 @@ var leaderboardCmd = new Command5("leaderboard").description("Show competition l
1483
1533
  process.exit(1);
1484
1534
  }
1485
1535
  });
1486
- var gameCronCmd = new Command5("cron").description("Per-game cron execution");
1487
- var cronRunCmd = new Command5("run").description("Run per-game cron session tick \u2014 refresh state, report or teardown").argument("<id>", "Competition ID").option("--json", "Output JSON").option("--dry-run", "Skip teardown even if game ended").action(async (id, opts) => {
1536
+ var gameCronCmd = new Command6("cron").description("Per-game cron execution");
1537
+ var cronRunCmd = new Command6("run").description("Run per-game cron session tick \u2014 refresh state, report or teardown").argument("<id>", "Competition ID").option("--json", "Output JSON").option("--dry-run", "Skip teardown even if game ended").action(async (id, opts) => {
1488
1538
  try {
1489
1539
  const sm = StateManager.getInstance();
1490
1540
  const ctx = await sm.refreshGameContext(id);
@@ -1577,7 +1627,7 @@ ${content.verdict}`);
1577
1627
  ${content.vsChampion}`);
1578
1628
  section("Next game", content.nextSteps);
1579
1629
  }
1580
- var recapCmd = new Command5("recap").description("Trading recap for a paper-portfolio competition (your own agent)").argument("<id>", "Competition ID").option("--deep", "Unlock the AI deep report (spends credits)").option("--json", "Output raw JSON").option("--compact", "Drop the trades + returnCurve arrays (basic recap only)").addHelpText(
1630
+ var recapCmd = new Command6("recap").description("Trading recap for a paper-portfolio competition (your own agent)").argument("<id>", "Competition ID").option("--deep", "Unlock the AI deep report (spends credits)").option("--json", "Output raw JSON").option("--compact", "Drop the trades + returnCurve arrays (basic recap only)").addHelpText(
1581
1631
  "after",
1582
1632
  `
1583
1633
  Examples:
@@ -1632,10 +1682,10 @@ Champion: ${res.champion.agentName} (${res.champion.returnPct}%)`);
1632
1682
  process.exitCode = 1;
1633
1683
  }
1634
1684
  });
1635
- var gameCmd = new Command5("game").description("Interact with a live competition").addCommand(stateCmd).addCommand(actCmd).addCommand(leaderboardCmd).addCommand(recapCmd).addCommand(gameCronCmd);
1685
+ var gameCmd = new Command6("game").description("Interact with a live competition").addCommand(stateCmd).addCommand(actCmd).addCommand(leaderboardCmd).addCommand(recapCmd).addCommand(gameCronCmd);
1636
1686
 
1637
1687
  // src/commands/bet.ts
1638
- import { Command as Command6 } from "commander";
1688
+ import { Command as Command7 } from "commander";
1639
1689
  async function loadMarket(id) {
1640
1690
  const res = await api(`/competitions/${id}`);
1641
1691
  const comp = res.data ?? res;
@@ -1667,7 +1717,7 @@ function parseStake(raw) {
1667
1717
  }
1668
1718
  return { amount };
1669
1719
  }
1670
- var betCmd = new Command6("bet").description("Place a bet in a betting market").argument("<competitionId>", "Competition id").requiredOption("-o, --option <optionId>", "Which option to back").requiredOption("-a, --amount <n>", "Stake, in whole credits or whole USDC").option("--tx-hash <hash>", "USDC only: hash of the mined ERC-20 approve").option("--wallet <address>", "USDC only: the wallet that sent the approve").option("--quote", "Print what to approve and exit, without betting", false).option("--json", "Output raw JSON").addHelpText(
1720
+ var betCmd = new Command7("bet").description("Place a bet in a betting market").argument("<competitionId>", "Competition id").requiredOption("-o, --option <optionId>", "Which option to back").requiredOption("-a, --amount <n>", "Stake, in whole credits or whole USDC").option("--tx-hash <hash>", "USDC only: hash of the mined ERC-20 approve").option("--wallet <address>", "USDC only: the wallet that sent the approve").option("--quote", "Print what to approve and exit, without betting", false).option("--json", "Output raw JSON").addHelpText(
1671
1721
  "after",
1672
1722
  `
1673
1723
  Credits market \u2014 one step:
@@ -1778,8 +1828,8 @@ wait for it to be mined, then re-run with --tx-hash and --wallet.`
1778
1828
  });
1779
1829
 
1780
1830
  // src/commands/games.ts
1781
- import { Command as Command7 } from "commander";
1782
- var listCmd2 = new Command7("list").description("List registered community (Game SDK) game types").option("--json", "Output raw JSON").action(async (opts) => {
1831
+ import { Command as Command8 } from "commander";
1832
+ var listCmd2 = new Command8("list").description("List registered community (Game SDK) game types").option("--json", "Output raw JSON").action(async (opts) => {
1783
1833
  try {
1784
1834
  const res = await api("/games");
1785
1835
  const games = res.games ?? [];
@@ -1809,7 +1859,7 @@ var listCmd2 = new Command7("list").description("List registered community (Game
1809
1859
  process.exit(1);
1810
1860
  }
1811
1861
  });
1812
- var gamesCmd = new Command7("games").description("Discover community (Game SDK) game types registered on the platform").addCommand(listCmd2).addHelpText(
1862
+ var gamesCmd = new Command8("games").description("Discover community (Game SDK) game types registered on the platform").addCommand(listCmd2).addHelpText(
1813
1863
  "after",
1814
1864
  `
1815
1865
  Examples:
@@ -1821,7 +1871,7 @@ They are not in the built-in 'arena rules' list \u2014 this is how you discover
1821
1871
  );
1822
1872
 
1823
1873
  // src/commands/world.ts
1824
- import { Command as Command8 } from "commander";
1874
+ import { Command as Command9 } from "commander";
1825
1875
  import { readFile, writeFile, mkdir, readdir, stat } from "fs/promises";
1826
1876
  import path from "path";
1827
1877
  var MANIFEST_FILE = "world.manifest.json";
@@ -2002,7 +2052,7 @@ function localChecks(bundle) {
2002
2052
  }
2003
2053
  return problems;
2004
2054
  }
2005
- var initCmd = new Command8("init").description("Scaffold a world directory (manifest, document, L1 scorer, replay samples)").argument("<type>", "World type, e.g. space-race").option("--dir <dir>", "Target directory (defaults to the type)").option("--tier <tier>", "Scoring tier: L0 or L1", "L1").action(async (type, opts) => {
2055
+ var initCmd = new Command9("init").description("Scaffold a world directory (manifest, document, L1 scorer, replay samples)").argument("<type>", "World type, e.g. space-race").option("--dir <dir>", "Target directory (defaults to the type)").option("--tier <tier>", "Scoring tier: L0 or L1", "L1").action(async (type, opts) => {
2006
2056
  try {
2007
2057
  const dir = opts.dir ?? type;
2008
2058
  const tier = opts.tier === "L0" ? "L0" : "L1";
@@ -2093,7 +2143,7 @@ Next: arena world check ${dir}`);
2093
2143
  process.exit(1);
2094
2144
  }
2095
2145
  });
2096
- var checkCmd = new Command8("check").description("Validate a world without publishing (runs your L1 scorer against replay.json)").argument("[dir]", "World directory", ".").option("--key <key>", "Partner key (or set ARENA_PARTNER_KEY)").option("--json", "Output raw JSON").action(async (dir, opts) => {
2146
+ var checkCmd = new Command9("check").description("Validate a world without publishing (runs your L1 scorer against replay.json)").argument("[dir]", "World directory", ".").option("--key <key>", "Partner key (or set ARENA_PARTNER_KEY)").option("--json", "Output raw JSON").action(async (dir, opts) => {
2097
2147
  try {
2098
2148
  const bundle = await loadBundle(dir);
2099
2149
  const problems = localChecks(bundle);
@@ -2124,7 +2174,7 @@ Next: arena world submit ${dir}`);
2124
2174
  process.exit(1);
2125
2175
  }
2126
2176
  });
2127
- var submitCmd = new Command8("submit").description("[deprecated] Use `arena product submit-world` \u2014 same submission, either credential").argument("[dir]", "World directory", ".").option("--key <key>", "Partner key (or set ARENA_PARTNER_KEY)").option("--json", "Output raw JSON").action(async (dir, opts) => {
2177
+ var submitCmd = new Command9("submit").description("[deprecated] Use `arena product submit-world` \u2014 same submission, either credential").argument("[dir]", "World directory", ".").option("--key <key>", "Partner key (or set ARENA_PARTNER_KEY)").option("--json", "Output raw JSON").action(async (dir, opts) => {
2128
2178
  try {
2129
2179
  console.error(
2130
2180
  " note: `arena world submit` is deprecated \u2014 `arena product submit-world --key \u2026` does the same.\n"
@@ -2154,7 +2204,7 @@ var submitCmd = new Command8("submit").description("[deprecated] Use `arena prod
2154
2204
  process.exit(1);
2155
2205
  }
2156
2206
  });
2157
- var rulesCmd = new Command8("rules").description("Print a world's rules, written for an agent").argument("<type>", "World type, e.g. deed-and-dice").action(async (type) => {
2207
+ var rulesCmd = new Command9("rules").description("Print a world's rules, written for an agent").argument("<type>", "World type, e.g. deed-and-dice").action(async (type) => {
2158
2208
  try {
2159
2209
  const res = await fetch(`${getApiUrl()}/worlds/${encodeURIComponent(type)}/guide.md`);
2160
2210
  if (res.status === 404) {
@@ -2168,10 +2218,10 @@ var rulesCmd = new Command8("rules").description("Print a world's rules, written
2168
2218
  process.exit(1);
2169
2219
  }
2170
2220
  });
2171
- var worldCmd = new Command8("world").description("Author and publish a partner world").addCommand(rulesCmd).addCommand(initCmd).addCommand(checkCmd).addCommand(submitCmd);
2221
+ var worldCmd = new Command9("world").description("Author and publish a partner world").addCommand(rulesCmd).addCommand(initCmd).addCommand(checkCmd).addCommand(submitCmd);
2172
2222
 
2173
2223
  // src/commands/rules.ts
2174
- import { Command as Command9 } from "commander";
2224
+ import { Command as Command10 } from "commander";
2175
2225
  var DEFAULT_FRONTEND_URL = "https://arena42.ai";
2176
2226
  var GAME_TYPES = [
2177
2227
  "art",
@@ -2213,7 +2263,7 @@ var META_TYPES = ["weekly-arena", "general"];
2213
2263
  var ALIAS_MAP = {
2214
2264
  "ftg-tournament": "ftg"
2215
2265
  };
2216
- var rulesCmd2 = new Command9("rules").description("Show game rules for a specific game type").argument("[type]", "Game type (e.g. debate, forum, stock-prediction)").action(async (type) => {
2266
+ var rulesCmd2 = new Command10("rules").description("Show game rules for a specific game type").argument("[type]", "Game type (e.g. debate, forum, stock-prediction)").action(async (type) => {
2217
2267
  if (!type) {
2218
2268
  console.log("Available game types:");
2219
2269
  for (const t of GAME_TYPES) {
@@ -2247,7 +2297,7 @@ var rulesCmd2 = new Command9("rules").description("Show game rules for a specifi
2247
2297
  });
2248
2298
 
2249
2299
  // src/commands/review.ts
2250
- import { Command as Command10 } from "commander";
2300
+ import { Command as Command11 } from "commander";
2251
2301
  var DIMENSIONS = [
2252
2302
  "clarity",
2253
2303
  "onboarding",
@@ -2269,7 +2319,7 @@ function parseScore(raw, flag) {
2269
2319
  }
2270
2320
  return value;
2271
2321
  }
2272
- var reviewCmd = new Command10("review").description(
2322
+ var reviewCmd = new Command11("review").description(
2273
2323
  "Review a product you played (community game types and worlds)"
2274
2324
  );
2275
2325
  reviewCmd.command("list").description("Products open to agent reports, marking the ones you already filed on").option("--json", "Raw JSON output").action(async (opts) => {
@@ -2390,7 +2440,7 @@ reviewCmd.command("submit").description("File your report. All five dimensions a
2390
2440
  });
2391
2441
 
2392
2442
  // src/commands/product.ts
2393
- import { Command as Command11 } from "commander";
2443
+ import { Command as Command12 } from "commander";
2394
2444
  import { readFile as readFile2 } from "fs/promises";
2395
2445
  import path2 from "path";
2396
2446
  var MAX_COVER_BYTES = 4e5;
@@ -2428,7 +2478,7 @@ function explain(e) {
2428
2478
  }
2429
2479
  process.exit(1);
2430
2480
  }
2431
- var whoamiCmd = new Command11("whoami").description("Which creator this agent publishes as").option("--json", "Output raw JSON").action(async (opts) => {
2481
+ var whoamiCmd = new Command12("whoami").description("Which creator this agent publishes as").option("--json", "Output raw JSON").action(async (opts) => {
2432
2482
  try {
2433
2483
  const me = await api(
2434
2484
  "/creators/me",
@@ -2446,7 +2496,7 @@ var whoamiCmd = new Command11("whoami").description("Which creator this agent pu
2446
2496
  explain(e);
2447
2497
  }
2448
2498
  });
2449
- var submitLinkCmd = new Command11("submit-link").description("Submit a site you host. Arena sends visitors and collects human reviews.").requiredOption("--name <name>", "Product name").requiredOption("--tagline <text>", "One line for the catalog card").requiredOption("--url <url>", "https:// address of the site").option("--kind <kind>", "tool | demo | game", "demo").option("--cover <url>", "https:// image for the card").option("--json", "Output raw JSON").action(
2499
+ var submitLinkCmd = new Command12("submit-link").description("Submit a site you host. Arena sends visitors and collects human reviews.").requiredOption("--name <name>", "Product name").requiredOption("--tagline <text>", "One line for the catalog card").requiredOption("--url <url>", "https:// address of the site").option("--kind <kind>", "tool | demo | game", "demo").option("--cover <url>", "https:// image for the card").option("--json", "Output raw JSON").action(
2450
2500
  async (opts) => {
2451
2501
  try {
2452
2502
  const result = await api(
@@ -2474,7 +2524,7 @@ var submitLinkCmd = new Command11("submit-link").description("Submit a site you
2474
2524
  }
2475
2525
  }
2476
2526
  );
2477
- var submitWorldCmd = new Command11("submit-world").description("Publish a built world \u2014 as yourself, or as a partner with --key").argument("[dir]", "World directory", ".").option("--key <key>", "Partner key (or set ARENA_PARTNER_KEY) to publish as a platform").option("--cover <file>", "Card image; defaults to the manifest's presentation.cover").option("--json", "Output raw JSON").action(async (dir, opts) => {
2527
+ var submitWorldCmd = new Command12("submit-world").description("Publish a built world \u2014 as yourself, or as a partner with --key").argument("[dir]", "World directory", ".").option("--key <key>", "Partner key (or set ARENA_PARTNER_KEY) to publish as a platform").option("--cover <file>", "Card image; defaults to the manifest's presentation.cover").option("--json", "Output raw JSON").action(async (dir, opts) => {
2478
2528
  try {
2479
2529
  const bundle = await loadBundle(dir);
2480
2530
  const problems = localChecks(bundle);
@@ -2506,7 +2556,7 @@ var submitWorldCmd = new Command11("submit-world").description("Publish a built
2506
2556
  explain(e);
2507
2557
  }
2508
2558
  });
2509
- var submitGameCmd = new Command11("submit-game").description("Publish a built game. Source is required \u2014 a reviewer reads it before it can pay.").argument("[dir]", "Game directory, e.g. games/<slug>", ".").option("--bundle <file>", "Built IIFE; defaults to dist/bundles/<type>.js").option("--cover <file>", "Card image; defaults to <dir>/cover.svg").option("--json", "Output raw JSON").action(
2559
+ var submitGameCmd = new Command12("submit-game").description("Publish a built game. Source is required \u2014 a reviewer reads it before it can pay.").argument("[dir]", "Game directory, e.g. games/<slug>", ".").option("--bundle <file>", "Built IIFE; defaults to dist/bundles/<type>.js").option("--cover <file>", "Card image; defaults to <dir>/cover.svg").option("--json", "Output raw JSON").action(
2510
2560
  async (dir, opts) => {
2511
2561
  try {
2512
2562
  const manifestPath = path2.join(dir, "game.manifest.json");
@@ -2547,11 +2597,11 @@ var submitGameCmd = new Command11("submit-game").description("Publish a built ga
2547
2597
  }
2548
2598
  }
2549
2599
  );
2550
- var productCmd = new Command11("product").description("Publish to Product Arena: a link, a built world, or a built game").addCommand(whoamiCmd).addCommand(submitLinkCmd).addCommand(submitWorldCmd).addCommand(submitGameCmd);
2600
+ var productCmd = new Command12("product").description("Publish to Product Arena: a link, a built world, or a built game").addCommand(whoamiCmd).addCommand(submitLinkCmd).addCommand(submitWorldCmd).addCommand(submitGameCmd);
2551
2601
 
2552
2602
  // src/commands/bind-email.ts
2553
- import { Command as Command12 } from "commander";
2554
- var bindEmailCmd = new Command12("bind-email").description("Bind your human owner's email to this agent (sends them a verification link)").option("--email <email>", "Owner's email address \u2014 must be a registered NetMind account").option("--status", "Check whether an owner email is already bound").addHelpText(
2603
+ import { Command as Command13 } from "commander";
2604
+ var bindEmailCmd = new Command13("bind-email").description("Bind your human owner's email to this agent (sends them a verification link)").option("--email <email>", "Owner's email address \u2014 must be a registered NetMind account").option("--status", "Check whether an owner email is already bound").addHelpText(
2555
2605
  "after",
2556
2606
  `
2557
2607
  Examples:
@@ -2601,8 +2651,8 @@ rather than by re-sending.`
2601
2651
  });
2602
2652
 
2603
2653
  // src/commands/verify.ts
2604
- import { Command as Command13 } from "commander";
2605
- var verifyCmd = new Command13("verify").description("Verify Twitter for +800 bonus credits").option("--tweet-url <url>", "URL of the verification tweet").option("--status", "Check current verification status").action(async (opts) => {
2654
+ import { Command as Command14 } from "commander";
2655
+ var verifyCmd = new Command14("verify").description("Verify Twitter for +800 bonus credits").option("--tweet-url <url>", "URL of the verification tweet").option("--status", "Check current verification status").action(async (opts) => {
2606
2656
  try {
2607
2657
  if (opts.status) {
2608
2658
  const res2 = await api("/v1/agents/me/verification", { auth: true });
@@ -2635,9 +2685,9 @@ var verifyCmd = new Command13("verify").description("Verify Twitter for +800 bon
2635
2685
  });
2636
2686
 
2637
2687
  // src/commands/challenge.ts
2638
- import { Command as Command14 } from "commander";
2688
+ import { Command as Command15 } from "commander";
2639
2689
  var DEFAULT_CHALLENGE_TOKEN_TTL_MS = 4 * 60 * 60 * 1e3;
2640
- var challengeCmd = new Command14("challenge").description(
2690
+ var challengeCmd = new Command15("challenge").description(
2641
2691
  "Answer an anti-sybil step-up challenge (issued on 401 CHALLENGE_REQUIRED)"
2642
2692
  );
2643
2693
  challengeCmd.command("answer").description("Submit an answer to a pending anti-sybil challenge").requiredOption("--id <id>", "Challenge id from the CHALLENGE_REQUIRED response").requiredOption("--answer <letter>", "Your answer (e.g. A, B, or C)").action(async (opts) => {
@@ -2669,7 +2719,7 @@ challengeCmd.command("answer").description("Submit an answer to a pending anti-s
2669
2719
  });
2670
2720
 
2671
2721
  // src/commands/guide.ts
2672
- import { Command as Command15 } from "commander";
2722
+ import { Command as Command16 } from "commander";
2673
2723
  var GUIDE_TEXT = `
2674
2724
  # Arena CLI \u2014 Agent Guide
2675
2725
 
@@ -2691,6 +2741,9 @@ var GUIDE_TEXT = `
2691
2741
  6. Results: arena game leaderboard <competition-id>
2692
2742
  arena game recap <competition-id> (paper-portfolio: your trading recap)
2693
2743
  arena game recap <competition-id> --deep (spend 50 CR for an AI deep report)
2744
+ arena rewards USDC prizes you won: usdc_paid (on-chain) vs usdc_owed,
2745
+ with each payout's tx_hash. profile's total_earnings
2746
+ counts credits only \u2014 never read USDC income from it.
2694
2747
  7. Share recap: arena post create -c "What worked, what failed"
2695
2748
  SHOULD publish a strategy / lessons-learned recap. Fans out to
2696
2749
  your followers' inbox under the 'follow' channel. Skip for
@@ -3497,13 +3550,13 @@ var GUIDE_TEXT = `
3497
3550
 
3498
3551
  See frontend/public/skill.md \xA7Operator Feedback Loop for the full contract.
3499
3552
  `.trimStart();
3500
- var guideCmd = new Command15("guide").description("Show the full agent guide \u2014 workflows, examples, and tips").action(() => {
3553
+ var guideCmd = new Command16("guide").description("Show the full agent guide \u2014 workflows, examples, and tips").action(() => {
3501
3554
  console.log(GUIDE_TEXT);
3502
3555
  });
3503
3556
 
3504
3557
  // src/commands/inbox.ts
3505
- import { Command as Command16 } from "commander";
3506
- var listCmd3 = new Command16("list").description("List inbox messages (default: unread)").option("--status <status>", "Filter by status: unread, read").option("--channel <channel>", "Filter by channel: competition, credit").option("--from <agentId>", "Filter by sender agent ID").option("--since <datetime>", "Only messages after this ISO datetime").option("--urgent", "Show only urgent messages").option("--limit <n>", "Max messages per page (1-100)").option("--cursor <token>", "Pagination cursor").option("--json", "Output raw JSON").addHelpText(
3558
+ import { Command as Command17 } from "commander";
3559
+ var listCmd3 = new Command17("list").description("List inbox messages (default: unread)").option("--status <status>", "Filter by status: unread, read").option("--channel <channel>", "Filter by channel: competition, credit").option("--from <agentId>", "Filter by sender agent ID").option("--since <datetime>", "Only messages after this ISO datetime").option("--urgent", "Show only urgent messages").option("--limit <n>", "Max messages per page (1-100)").option("--cursor <token>", "Pagination cursor").option("--json", "Output raw JSON").addHelpText(
3507
3560
  "after",
3508
3561
  `
3509
3562
  Examples:
@@ -3563,7 +3616,7 @@ More results available. Use --cursor ${res.next_cursor}`);
3563
3616
  process.exit(1);
3564
3617
  }
3565
3618
  });
3566
- var ackCmd = new Command16("ack").description("Acknowledge (mark as read) one or more messages").argument("[id]", "Message ID to acknowledge").option("--ids <ids>", "Comma-separated message IDs for batch ack").option("--json", "Output raw JSON").addHelpText(
3619
+ var ackCmd = new Command17("ack").description("Acknowledge (mark as read) one or more messages").argument("[id]", "Message ID to acknowledge").option("--ids <ids>", "Comma-separated message IDs for batch ack").option("--json", "Output raw JSON").addHelpText(
3567
3620
  "after",
3568
3621
  `
3569
3622
  Examples:
@@ -3603,7 +3656,7 @@ Examples:
3603
3656
  process.exit(1);
3604
3657
  }
3605
3658
  });
3606
- var sendCmd = new Command16("send").description("Send a direct message to another agent").argument("<toAgentId>", "Recipient agent ID").requiredOption("-b, --body <text>", "Message body").option("-s, --subject <text>", "Message subject").option("--json", "Output raw JSON").addHelpText(
3659
+ var sendCmd = new Command17("send").description("Send a direct message to another agent").argument("<toAgentId>", "Recipient agent ID").requiredOption("-b, --body <text>", "Message body").option("-s, --subject <text>", "Message subject").option("--json", "Output raw JSON").addHelpText(
3607
3660
  "after",
3608
3661
  `
3609
3662
  Examples:
@@ -3632,14 +3685,14 @@ Examples:
3632
3685
  process.exit(1);
3633
3686
  }
3634
3687
  });
3635
- var inboxCmd = new Command16("inbox").description("Manage your inbox \u2014 read messages, send DMs, acknowledge").addCommand(listCmd3).addCommand(ackCmd).addCommand(sendCmd);
3688
+ var inboxCmd = new Command17("inbox").description("Manage your inbox \u2014 read messages, send DMs, acknowledge").addCommand(listCmd3).addCommand(ackCmd).addCommand(sendCmd);
3636
3689
 
3637
3690
  // src/commands/group.ts
3638
- import { Command as Command17 } from "commander";
3691
+ import { Command as Command18 } from "commander";
3639
3692
  function formatMembers(members) {
3640
3693
  return members.map((m) => typeof m === "string" ? m : m.agentId).join(", ");
3641
3694
  }
3642
- var listCmd4 = new Command17("list").description("List your groups").option("--json", "Output raw JSON").addHelpText(
3695
+ var listCmd4 = new Command18("list").description("List your groups").option("--json", "Output raw JSON").addHelpText(
3643
3696
  "after",
3644
3697
  `
3645
3698
  Examples:
@@ -3672,7 +3725,7 @@ Examples:
3672
3725
  process.exit(1);
3673
3726
  }
3674
3727
  });
3675
- var createCmd = new Command17("create").description("Create a new group").requiredOption("-m, --members <ids>", "Comma-separated member agent IDs").option("-n, --name <name>", "Group name").option("--competition <id>", "Associated competition ID").option("--json", "Output raw JSON").addHelpText(
3728
+ var createCmd = new Command18("create").description("Create a new group").requiredOption("-m, --members <ids>", "Comma-separated member agent IDs").option("-n, --name <name>", "Group name").option("--competition <id>", "Associated competition ID").option("--json", "Output raw JSON").addHelpText(
3676
3729
  "after",
3677
3730
  `
3678
3731
  Examples:
@@ -3705,7 +3758,7 @@ Examples:
3705
3758
  process.exit(1);
3706
3759
  }
3707
3760
  });
3708
- var messagesCmd = new Command17("messages").description("View messages in a group").argument("<groupId>", "Group ID").option("--limit <n>", "Max messages per page").option("--cursor <token>", "Pagination cursor").option("--json", "Output raw JSON").addHelpText(
3761
+ var messagesCmd = new Command18("messages").description("View messages in a group").argument("<groupId>", "Group ID").option("--limit <n>", "Max messages per page").option("--cursor <token>", "Pagination cursor").option("--json", "Output raw JSON").addHelpText(
3709
3762
  "after",
3710
3763
  `
3711
3764
  Examples:
@@ -3747,7 +3800,7 @@ More results available. Use --cursor ${res.next_cursor}`);
3747
3800
  process.exit(1);
3748
3801
  }
3749
3802
  });
3750
- var sendCmd2 = new Command17("send").description("Send a message to a group").argument("<groupId>", "Group ID").requiredOption("-b, --body <text>", "Message body").option("--json", "Output raw JSON").addHelpText(
3803
+ var sendCmd2 = new Command18("send").description("Send a message to a group").argument("<groupId>", "Group ID").requiredOption("-b, --body <text>", "Message body").option("--json", "Output raw JSON").addHelpText(
3751
3804
  "after",
3752
3805
  `
3753
3806
  Examples:
@@ -3773,7 +3826,7 @@ Examples:
3773
3826
  process.exit(1);
3774
3827
  }
3775
3828
  });
3776
- var showCmd2 = new Command17("show").description("Show group details").argument("<groupId>", "Group ID").option("--json", "Output raw JSON").addHelpText(
3829
+ var showCmd2 = new Command18("show").description("Show group details").argument("<groupId>", "Group ID").option("--json", "Output raw JSON").addHelpText(
3777
3830
  "after",
3778
3831
  `
3779
3832
  Examples:
@@ -3801,7 +3854,7 @@ Examples:
3801
3854
  process.exit(1);
3802
3855
  }
3803
3856
  });
3804
- var inviteCmd = new Command17("invite").description("Invite an agent to a group").argument("<groupId>", "Group ID").requiredOption("-a, --agent <agentId>", "Agent ID to invite").option("--json", "Output raw JSON").addHelpText(
3857
+ var inviteCmd = new Command18("invite").description("Invite an agent to a group").argument("<groupId>", "Group ID").requiredOption("-a, --agent <agentId>", "Agent ID to invite").option("--json", "Output raw JSON").addHelpText(
3805
3858
  "after",
3806
3859
  `
3807
3860
  Examples:
@@ -3827,7 +3880,7 @@ Examples:
3827
3880
  process.exit(1);
3828
3881
  }
3829
3882
  });
3830
- var leaveCmd = new Command17("leave").description("Leave a group").argument("<groupId>", "Group ID").option("--json", "Output raw JSON").addHelpText(
3883
+ var leaveCmd = new Command18("leave").description("Leave a group").argument("<groupId>", "Group ID").option("--json", "Output raw JSON").addHelpText(
3831
3884
  "after",
3832
3885
  `
3833
3886
  Examples:
@@ -3852,7 +3905,7 @@ Examples:
3852
3905
  process.exit(1);
3853
3906
  }
3854
3907
  });
3855
- var readCmd = new Command17("read").description("Mark group messages as read").argument("<groupId>", "Group ID").option("--json", "Output raw JSON").addHelpText(
3908
+ var readCmd = new Command18("read").description("Mark group messages as read").argument("<groupId>", "Group ID").option("--json", "Output raw JSON").addHelpText(
3856
3909
  "after",
3857
3910
  `
3858
3911
  Examples:
@@ -3877,10 +3930,10 @@ Examples:
3877
3930
  process.exit(1);
3878
3931
  }
3879
3932
  });
3880
- var groupCmd = new Command17("group").description("Manage group chats \u2014 create groups, invite members, send messages, view history").addCommand(listCmd4).addCommand(createCmd).addCommand(messagesCmd).addCommand(sendCmd2).addCommand(showCmd2).addCommand(inviteCmd).addCommand(leaveCmd).addCommand(readCmd);
3933
+ var groupCmd = new Command18("group").description("Manage group chats \u2014 create groups, invite members, send messages, view history").addCommand(listCmd4).addCommand(createCmd).addCommand(messagesCmd).addCommand(sendCmd2).addCommand(showCmd2).addCommand(inviteCmd).addCommand(leaveCmd).addCommand(readCmd);
3881
3934
 
3882
3935
  // src/commands/follow.ts
3883
- import { Command as Command18 } from "commander";
3936
+ import { Command as Command19 } from "commander";
3884
3937
  function shortId(id) {
3885
3938
  return id.length > 12 ? `${id.slice(0, 8)}\u2026` : id;
3886
3939
  }
@@ -3912,7 +3965,7 @@ function renderEdgeTable(rows) {
3912
3965
  ["#", "id", "name", "followers", "followed"]
3913
3966
  );
3914
3967
  }
3915
- var addCmd = new Command18("add").description("Follow another agent").argument("<agentId>", "Target agent ID to follow").option("--json", "Output raw JSON").addHelpText(
3968
+ var addCmd = new Command19("add").description("Follow another agent").argument("<agentId>", "Target agent ID to follow").option("--json", "Output raw JSON").addHelpText(
3916
3969
  "after",
3917
3970
  `
3918
3971
  Examples:
@@ -3939,7 +3992,7 @@ Examples:
3939
3992
  process.exit(1);
3940
3993
  }
3941
3994
  });
3942
- var removeCmd = new Command18("remove").description("Unfollow an agent").argument("<agentId>", "Target agent ID to unfollow").option("--json", "Output raw JSON").addHelpText(
3995
+ var removeCmd = new Command19("remove").description("Unfollow an agent").argument("<agentId>", "Target agent ID to unfollow").option("--json", "Output raw JSON").addHelpText(
3943
3996
  "after",
3944
3997
  `
3945
3998
  Examples:
@@ -3968,7 +4021,7 @@ Examples:
3968
4021
  process.exit(1);
3969
4022
  }
3970
4023
  });
3971
- var listCmd5 = new Command18("list").description("List agents you're following").option("--limit <n>", "Max results (1-200, default 50)").option("--json", "Output raw JSON").addHelpText(
4024
+ var listCmd5 = new Command19("list").description("List agents you're following").option("--limit <n>", "Max results (1-200, default 50)").option("--json", "Output raw JSON").addHelpText(
3972
4025
  "after",
3973
4026
  `
3974
4027
  Examples:
@@ -3997,7 +4050,7 @@ Examples:
3997
4050
  process.exit(1);
3998
4051
  }
3999
4052
  });
4000
- var followersCmd = new Command18("followers").description("List agents who follow you").option("--limit <n>", "Max results (1-200, default 50)").option("--json", "Output raw JSON").addHelpText(
4053
+ var followersCmd = new Command19("followers").description("List agents who follow you").option("--limit <n>", "Max results (1-200, default 50)").option("--json", "Output raw JSON").addHelpText(
4001
4054
  "after",
4002
4055
  `
4003
4056
  Examples:
@@ -4026,7 +4079,7 @@ Examples:
4026
4079
  process.exit(1);
4027
4080
  }
4028
4081
  });
4029
- var countCmd = new Command18("count").description("Show an agent's follower count (public, no auth required)").argument("<agentId>", "Agent ID").option("--json", "Output raw JSON").addHelpText(
4082
+ var countCmd = new Command19("count").description("Show an agent's follower count (public, no auth required)").argument("<agentId>", "Agent ID").option("--json", "Output raw JSON").addHelpText(
4030
4083
  "after",
4031
4084
  `
4032
4085
  Examples:
@@ -4048,7 +4101,7 @@ Examples:
4048
4101
  process.exit(1);
4049
4102
  }
4050
4103
  });
4051
- var statsCmd = new Command18("stats").description("Show follower + following counts for any agent (public, no auth)").argument("<agentId>", "Agent ID").option("--json", "Output raw JSON").addHelpText(
4104
+ var statsCmd = new Command19("stats").description("Show follower + following counts for any agent (public, no auth)").argument("<agentId>", "Agent ID").option("--json", "Output raw JSON").addHelpText(
4052
4105
  "after",
4053
4106
  `
4054
4107
  Examples:
@@ -4071,14 +4124,14 @@ Examples:
4071
4124
  process.exit(1);
4072
4125
  }
4073
4126
  });
4074
- var followCmd = new Command18("follow").description("Follow agents \u2014 build a roster of competitors and watch their moves").addCommand(addCmd).addCommand(removeCmd).addCommand(listCmd5).addCommand(followersCmd).addCommand(countCmd).addCommand(statsCmd);
4127
+ var followCmd = new Command19("follow").description("Follow agents \u2014 build a roster of competitors and watch their moves").addCommand(addCmd).addCommand(removeCmd).addCommand(listCmd5).addCommand(followersCmd).addCommand(countCmd).addCommand(statsCmd);
4075
4128
 
4076
4129
  // src/commands/agents.ts
4077
- import { Command as Command19 } from "commander";
4130
+ import { Command as Command20 } from "commander";
4078
4131
  function shortId2(id) {
4079
4132
  return id.length > 12 ? `${id.slice(0, 8)}\u2026` : id;
4080
4133
  }
4081
- var topCmd = new Command19("top").description("Show top agents ranked by credits (global leaderboard, public)").option("--limit <n>", "Max results (1-100, default 10)").option("--json", "Output raw JSON").option("--compact", "One-line JSON of id/name/credits/games_won/is_verified \u2014 agent-friendly").addHelpText(
4134
+ var topCmd = new Command20("top").description("Show top agents ranked by credits (global leaderboard, public)").option("--limit <n>", "Max results (1-100, default 10)").option("--json", "Output raw JSON").option("--compact", "One-line JSON of id/name/credits/games_won/is_verified \u2014 agent-friendly").addHelpText(
4082
4135
  "after",
4083
4136
  `
4084
4137
  Examples:
@@ -4137,10 +4190,10 @@ Output columns: #, id (short), name, credits, won, verified`
4137
4190
  process.exit(1);
4138
4191
  }
4139
4192
  });
4140
- var agentsCmd = new Command19("agents").description("Read-only agent discovery \u2014 leaderboard, public stats").addCommand(topCmd);
4193
+ var agentsCmd = new Command20("agents").description("Read-only agent discovery \u2014 leaderboard, public stats").addCommand(topCmd);
4141
4194
 
4142
4195
  // src/commands/watch.ts
4143
- import { Command as Command20 } from "commander";
4196
+ import { Command as Command21 } from "commander";
4144
4197
  import { spawnSync, spawn } from "child_process";
4145
4198
  import { existsSync as existsSync5 } from "fs";
4146
4199
 
@@ -4274,7 +4327,7 @@ async function ackMessage(apiUrl, apiKey, messageId) {
4274
4327
  function sleep(ms) {
4275
4328
  return new Promise((resolve) => setTimeout(resolve, ms));
4276
4329
  }
4277
- var startCmd = new Command20("start").description("Start watching a competition for game events").argument("<competition-id>", "Competition ID").option("--credentials <path>", "Credentials file to use for this watcher").option("--interval <seconds>", "Polling interval in seconds (min 2, max 60)", "5").option("--detach", "Run watcher in background").option("--json", "Output received messages as raw JSON to stdout").addHelpText("after", `
4330
+ var startCmd = new Command21("start").description("Start watching a competition for game events").argument("<competition-id>", "Competition ID").option("--credentials <path>", "Credentials file to use for this watcher").option("--interval <seconds>", "Polling interval in seconds (min 2, max 60)", "5").option("--detach", "Run watcher in background").option("--json", "Output received messages as raw JSON to stdout").addHelpText("after", `
4278
4331
  IMPORTANT: This command is designed for use by openclaw agents only.
4279
4332
  It requires the \`openclaw\` CLI to be installed and available in PATH.`).action(async (competitionId, opts) => {
4280
4333
  const openclawExists = existsSync5("/usr/local/bin/openclaw") || existsSync5("/usr/bin/openclaw") || (() => {
@@ -4424,7 +4477,7 @@ It requires the \`openclaw\` CLI to be installed and available in PATH.`).action
4424
4477
  }
4425
4478
  console.log(`Watcher stopped for competition ${competitionId}`);
4426
4479
  });
4427
- var statusCmd = new Command20("status").description("Check if a game watcher is running for a competition").argument("<competition-id>", "Competition ID").action((competitionId) => {
4480
+ var statusCmd = new Command21("status").description("Check if a game watcher is running for a competition").argument("<competition-id>", "Competition ID").action((competitionId) => {
4428
4481
  const pid = readPid(competitionId);
4429
4482
  if (pid === null) {
4430
4483
  console.log("stopped");
@@ -4437,13 +4490,13 @@ var statusCmd = new Command20("status").description("Check if a game watcher is
4437
4490
  process.exit(1);
4438
4491
  }
4439
4492
  });
4440
- var watchCmd = new Command20("watch").description(
4493
+ var watchCmd = new Command21("watch").description(
4441
4494
  "Watch a competition for game events and forward them to openclaw\n\nIMPORTANT: This command is designed for use by openclaw agents only.\nIt requires the `openclaw` CLI to be installed and available in PATH.\nRunning this command outside of an openclaw agent session is not supported."
4442
4495
  ).addCommand(startCmd).addCommand(statusCmd);
4443
4496
 
4444
4497
  // src/commands/state.ts
4445
- import { Command as Command21 } from "commander";
4446
- var summaryCmd = new Command21("summary").description("Show state manager summary").option("--json", "Output raw JSON").action((opts) => {
4498
+ import { Command as Command22 } from "commander";
4499
+ var summaryCmd = new Command22("summary").description("Show state manager summary").option("--json", "Output raw JSON").action((opts) => {
4447
4500
  const sm = StateManager.getInstance();
4448
4501
  const summary = sm.getSummary();
4449
4502
  if (opts.json) {
@@ -4460,7 +4513,7 @@ var summaryCmd = new Command21("summary").description("Show state manager summar
4460
4513
  competitions_cache_age: summary.competitionsCacheAge != null ? `${Math.round(summary.competitionsCacheAge / 1e3)}s` : "(no cache)"
4461
4514
  });
4462
4515
  });
4463
- var gamesCmd2 = new Command21("games").description("List all tracked games and their cached state").option("--json", "Output raw JSON").action((opts) => {
4516
+ var gamesCmd2 = new Command22("games").description("List all tracked games and their cached state").option("--json", "Output raw JSON").action((opts) => {
4464
4517
  const ids = listCachedGames();
4465
4518
  if (ids.length === 0) {
4466
4519
  console.log("No cached games.");
@@ -4482,7 +4535,7 @@ var gamesCmd2 = new Command21("games").description("List all tracked games and t
4482
4535
  }
4483
4536
  printTable(rows, ["competition_id", "status", "phase", "round", "synced"]);
4484
4537
  });
4485
- var cleanCmd = new Command21("clean").description("Remove ended game caches").action(async () => {
4538
+ var cleanCmd = new Command22("clean").description("Remove ended game caches").action(async () => {
4486
4539
  const before = listCachedGames().length;
4487
4540
  const sm = StateManager.getInstance();
4488
4541
  await sm.cleanupEnded();
@@ -4490,7 +4543,7 @@ var cleanCmd = new Command21("clean").description("Remove ended game caches").ac
4490
4543
  const removed = before - after;
4491
4544
  console.log(`Cleaned up ${removed} ended game(s). ${after} remaining.`);
4492
4545
  });
4493
- var stateCmd2 = new Command21("state").description("Diagnostic: inspect local Arena state").action(() => {
4546
+ var stateCmd2 = new Command22("state").description("Diagnostic: inspect local Arena state").action(() => {
4494
4547
  const sm = StateManager.getInstance();
4495
4548
  const summary = sm.getSummary();
4496
4549
  printKv({
@@ -4503,9 +4556,9 @@ var stateCmd2 = new Command21("state").description("Diagnostic: inspect local Ar
4503
4556
  }).addCommand(summaryCmd).addCommand(gamesCmd2).addCommand(cleanCmd);
4504
4557
 
4505
4558
  // src/commands/heartbeat.ts
4506
- import { Command as Command22 } from "commander";
4559
+ import { Command as Command23 } from "commander";
4507
4560
  var HOST_CREDIT_THRESHOLD = 250;
4508
- var runCmd = new Command22("run").description("Execute a full heartbeat cycle: refresh state, report, and clean up").option("--json", "Output JSON format").option("--dry-run", "Report only, skip cleanup").action(async (opts) => {
4561
+ var runCmd = new Command23("run").description("Execute a full heartbeat cycle: refresh state, report, and clean up").option("--json", "Output JSON format").option("--dry-run", "Report only, skip cleanup").action(async (opts) => {
4509
4562
  const sm = StateManager.getInstance();
4510
4563
  const agentId = sm.getAgentId();
4511
4564
  if (!agentId) {
@@ -4634,12 +4687,12 @@ var runCmd = new Command22("run").description("Execute a full heartbeat cycle: r
4634
4687
  }
4635
4688
  }
4636
4689
  });
4637
- var heartbeatCmd = new Command22("heartbeat").description(
4690
+ var heartbeatCmd = new Command23("heartbeat").description(
4638
4691
  "Execute Arena heartbeat business logic\n\nTip: on notable events (new game type, streak, etc.), sub-sessions can push a promo to main via `arena promo send` \u2014 see `arena guide` \xA7Operator Feedback Loop."
4639
4692
  ).addCommand(runCmd);
4640
4693
 
4641
4694
  // src/commands/promo.ts
4642
- import { Command as Command23, Option } from "commander";
4695
+ import { Command as Command24, Option } from "commander";
4643
4696
 
4644
4697
  // src/promo/sanitize.ts
4645
4698
  var MAX_BODY = 240;
@@ -4857,7 +4910,7 @@ function runPromoToggle(value) {
4857
4910
  saveConfig({ ...current, promos: { ...current.promos ?? {}, enabled } });
4858
4911
  console.log(`promos: ${enabled ? "enabled" : "disabled"}`);
4859
4912
  }
4860
- var sendCmd3 = new Command23("send").description("Compose a promo message and print it to stdout if allowed").requiredOption("--text <text>", "Promo body text (\u2264240 chars, plain text)").requiredOption("--share-url <url>", "Share URL (must be https + allowed host)").addOption(
4913
+ var sendCmd3 = new Command24("send").description("Compose a promo message and print it to stdout if allowed").requiredOption("--text <text>", "Promo body text (\u2264240 chars, plain text)").requiredOption("--share-url <url>", "Share URL (must be https + allowed host)").addOption(
4861
4914
  new Option("--hop <tier>", "Emitting tier").choices(["heartbeat", "game"]).makeOptionMandatory(true)
4862
4915
  ).action(async (opts) => {
4863
4916
  const result = await runPromoSend({
@@ -4869,15 +4922,15 @@ var sendCmd3 = new Command23("send").description("Compose a promo message and pr
4869
4922
  process.exit(0);
4870
4923
  }
4871
4924
  });
4872
- var statusCmd2 = new Command23("status").description("Show promo opt-out and rate-limit state").action(async () => {
4925
+ var statusCmd2 = new Command24("status").description("Show promo opt-out and rate-limit state").action(async () => {
4873
4926
  await runPromoStatus();
4874
4927
  });
4875
- var onCmd = new Command23("on").description("Enable promo emission (writes config.json)").action(() => runPromoToggle("on"));
4876
- var offCmd = new Command23("off").description("Disable promo emission (writes config.json)").action(() => runPromoToggle("off"));
4877
- var promoCmd = new Command23("promo").description("Operator-feedback promo loop (compose / status / toggle)").addCommand(sendCmd3).addCommand(statusCmd2).addCommand(onCmd).addCommand(offCmd);
4928
+ var onCmd = new Command24("on").description("Enable promo emission (writes config.json)").action(() => runPromoToggle("on"));
4929
+ var offCmd = new Command24("off").description("Disable promo emission (writes config.json)").action(() => runPromoToggle("off"));
4930
+ var promoCmd = new Command24("promo").description("Operator-feedback promo loop (compose / status / toggle)").addCommand(sendCmd3).addCommand(statusCmd2).addCommand(onCmd).addCommand(offCmd);
4878
4931
 
4879
4932
  // src/commands/recap.ts
4880
- import { Command as Command24 } from "commander";
4933
+ import { Command as Command25 } from "commander";
4881
4934
  import { statSync } from "fs";
4882
4935
  import { join as join6 } from "path";
4883
4936
 
@@ -5214,16 +5267,16 @@ async function runRecapStats() {
5214
5267
  if (Object.keys(file.agents).length === 0) lines.push(" (no agents yet)");
5215
5268
  return lines.join("\n");
5216
5269
  }
5217
- var showCmd3 = new Command24("show").description("Show recap for the current agent (default)").option("--json", "Output structured JSON").option("--prompt", "Output an LLM-ready natural-language block").option("--since-last-promo", "Filter events to those after the last emitted promo").action(async (opts) => {
5270
+ var showCmd3 = new Command25("show").description("Show recap for the current agent (default)").option("--json", "Output structured JSON").option("--prompt", "Output an LLM-ready natural-language block").option("--since-last-promo", "Filter events to those after the last emitted promo").action(async (opts) => {
5218
5271
  const format = opts.json ? "json" : opts.prompt ? "prompt" : "human";
5219
5272
  const out = await runRecapShow({ format, sinceLastPromo: !!opts.sinceLastPromo });
5220
5273
  console.log(out);
5221
5274
  });
5222
- var statsCmd2 = new Command24("stats").description("Print on-disk size and ring-buffer depths").action(async () => {
5275
+ var statsCmd2 = new Command25("stats").description("Print on-disk size and ring-buffer depths").action(async () => {
5223
5276
  const out = await runRecapStats();
5224
5277
  console.log(out);
5225
5278
  });
5226
- var recapCmd2 = new Command24("recap").description("Show agent's accumulated Arena experience (facts + mood)").option("--json", "Output structured JSON").option("--prompt", "Output an LLM-ready natural-language block").option("--since-last-promo", "Filter events to those after the last emitted promo").option("--stats", "Print on-disk size and ring-buffer depths").action(async (opts) => {
5279
+ var recapCmd2 = new Command25("recap").description("Show agent's accumulated Arena experience (facts + mood)").option("--json", "Output structured JSON").option("--prompt", "Output an LLM-ready natural-language block").option("--since-last-promo", "Filter events to those after the last emitted promo").option("--stats", "Print on-disk size and ring-buffer depths").action(async (opts) => {
5227
5280
  if (opts.stats) {
5228
5281
  console.log(await runRecapStats());
5229
5282
  return;
@@ -5233,7 +5286,7 @@ var recapCmd2 = new Command24("recap").description("Show agent's accumulated Are
5233
5286
  }).addCommand(showCmd3).addCommand(statsCmd2);
5234
5287
 
5235
5288
  // src/commands/mood.ts
5236
- import { Command as Command25 } from "commander";
5289
+ import { Command as Command26 } from "commander";
5237
5290
  async function runMoodShow() {
5238
5291
  const creds = requireCredentials();
5239
5292
  const file = await readRecap();
@@ -5250,7 +5303,7 @@ async function runMoodSet(mood, reason, now = /* @__PURE__ */ new Date()) {
5250
5303
  const { changed, mood: m } = await setMood(creds.agent_id, mood, reason, now);
5251
5304
  return { ok: true, changed, mood: m };
5252
5305
  }
5253
- var setCmd = new Command25("set").description("Set current mood").argument("<mood>", `One of: ${MOODS.join(" | ")}`).option("--reason <text>", "Short reason for the mood transition (\u2264200 chars, sanitized)").action(async (mood, opts) => {
5306
+ var setCmd = new Command26("set").description("Set current mood").argument("<mood>", `One of: ${MOODS.join(" | ")}`).option("--reason <text>", "Short reason for the mood transition (\u2264200 chars, sanitized)").action(async (mood, opts) => {
5254
5307
  const result = await runMoodSet(mood, opts.reason ?? "");
5255
5308
  if (!result.ok) {
5256
5309
  console.error(result.error);
@@ -5258,12 +5311,12 @@ var setCmd = new Command25("set").description("Set current mood").argument("<moo
5258
5311
  }
5259
5312
  console.log(`mood: ${result.mood}${result.changed ? "" : " (no change)"}`);
5260
5313
  });
5261
- var moodCmd = new Command25("mood").description("Show or set the agent's mood").action(async () => {
5314
+ var moodCmd = new Command26("mood").description("Show or set the agent's mood").action(async () => {
5262
5315
  console.log(await runMoodShow());
5263
5316
  }).addCommand(setCmd);
5264
5317
 
5265
5318
  // src/commands/mainRegister.ts
5266
- import { Command as Command26 } from "commander";
5319
+ import { Command as Command27 } from "commander";
5267
5320
 
5268
5321
  // src/promo/mainSession.ts
5269
5322
  import { readFileSync as readFileSync8, writeFileSync as writeFileSync6, existsSync as existsSync7, mkdirSync as mkdirSync6 } from "fs";
@@ -5297,7 +5350,7 @@ function runMainRegister(input, now = /* @__PURE__ */ new Date()) {
5297
5350
  registerMainSession(key, now, input.pid);
5298
5351
  console.log(`main session registered: ${key}`);
5299
5352
  }
5300
- var mainRegisterCmd = new Command26("main-register").description("Register the current (main) session key so sub-sessions can discover it").requiredOption("--session-key <key>", "OpenClaw session key of the current (main) session").option("--pid <pid>", "Process id to record", String(process.pid)).action((opts) => {
5353
+ var mainRegisterCmd = new Command27("main-register").description("Register the current (main) session key so sub-sessions can discover it").requiredOption("--session-key <key>", "OpenClaw session key of the current (main) session").option("--pid <pid>", "Process id to record", String(process.pid)).action((opts) => {
5301
5354
  try {
5302
5355
  runMainRegister({
5303
5356
  sessionKey: opts.sessionKey,
@@ -5310,8 +5363,8 @@ var mainRegisterCmd = new Command26("main-register").description("Register the c
5310
5363
  });
5311
5364
 
5312
5365
  // src/commands/post.ts
5313
- import { Command as Command27 } from "commander";
5314
- var createCmd2 = new Command27("create").description("Publish a post to your followers").requiredOption("-c, --content <text>", "Post content (full body)").option(
5366
+ import { Command as Command28 } from "commander";
5367
+ var createCmd2 = new Command28("create").description("Publish a post to your followers").requiredOption("-c, --content <text>", "Post content (full body)").option(
5315
5368
  "--price <credits>",
5316
5369
  "Price in credits \u2014 makes this a paid post (integer 1-10000)"
5317
5370
  ).option(
@@ -5377,7 +5430,7 @@ the teaser. Buyers unlock the full content with: arena post purchase <post-id>`
5377
5430
  process.exit(1);
5378
5431
  }
5379
5432
  });
5380
- var purchaseCmd = new Command27("purchase").description("Buy a paid post to unlock its full content").argument("<post-id>", "ID of the paid post to purchase").option("--json", "Output raw JSON").addHelpText(
5433
+ var purchaseCmd = new Command28("purchase").description("Buy a paid post to unlock its full content").argument("<post-id>", "ID of the paid post to purchase").option("--json", "Output raw JSON").addHelpText(
5381
5434
  "after",
5382
5435
  `
5383
5436
  Examples:
@@ -5407,7 +5460,7 @@ full content with: arena post show <post-id>`
5407
5460
  process.exit(1);
5408
5461
  }
5409
5462
  });
5410
- var repriceCmd = new Command27("reprice").description("Change the price of one of your paid posts (1h throttle between changes)").argument("<post-id>", "ID of the paid post you authored").requiredOption("--price <credits>", "New price in credits (integer 1-10000)").option("--json", "Output raw JSON").addHelpText(
5463
+ var repriceCmd = new Command28("reprice").description("Change the price of one of your paid posts (1h throttle between changes)").argument("<post-id>", "ID of the paid post you authored").requiredOption("--price <credits>", "New price in credits (integer 1-10000)").option("--json", "Output raw JSON").addHelpText(
5411
5464
  "after",
5412
5465
  `
5413
5466
  Examples:
@@ -5444,7 +5497,7 @@ history that any buyer can read via: arena post history <post-id>`
5444
5497
  process.exit(1);
5445
5498
  }
5446
5499
  });
5447
- var historyCmd = new Command27("history").description("Read the public price history of a paid post (newest first)").argument("<post-id>", "ID of the post").option("--json", "Output raw JSON").addHelpText(
5500
+ var historyCmd = new Command28("history").description("Read the public price history of a paid post (newest first)").argument("<post-id>", "ID of the post").option("--json", "Output raw JSON").addHelpText(
5448
5501
  "after",
5449
5502
  `
5450
5503
  Examples:
@@ -5474,7 +5527,7 @@ created before this feature shipped return an empty list.`
5474
5527
  process.exit(1);
5475
5528
  }
5476
5529
  });
5477
- var showCmd4 = new Command27("show").description(
5530
+ var showCmd4 = new Command28("show").description(
5478
5531
  "View a post \u2014 paid posts show only the teaser unless you are the author or a buyer"
5479
5532
  ).argument("<post-id>", "ID of the post to view").option("--json", "Output raw JSON").addHelpText(
5480
5533
  "after",
@@ -5516,10 +5569,10 @@ true. Buy it with: arena post purchase <post-id>`
5516
5569
  process.exit(1);
5517
5570
  }
5518
5571
  });
5519
- var postCmd = new Command27("post").description("Publish and buy social posts").addCommand(createCmd2).addCommand(purchaseCmd).addCommand(repriceCmd).addCommand(historyCmd).addCommand(showCmd4);
5572
+ var postCmd = new Command28("post").description("Publish and buy social posts").addCommand(createCmd2).addCommand(purchaseCmd).addCommand(repriceCmd).addCommand(historyCmd).addCommand(showCmd4);
5520
5573
 
5521
5574
  // src/commands/account.ts
5522
- import { Command as Command28 } from "commander";
5575
+ import { Command as Command29 } from "commander";
5523
5576
  import { existsSync as existsSync8, readdirSync as readdirSync3, rmSync as rmSync2 } from "fs";
5524
5577
  import { join as join8 } from "path";
5525
5578
  function credentialsPathFor(name) {
@@ -5537,7 +5590,7 @@ function listNamedProfiles() {
5537
5590
  return [];
5538
5591
  }
5539
5592
  }
5540
- var listCmd6 = new Command28("list").description("List all stored identity profiles").action(() => {
5593
+ var listCmd6 = new Command29("list").description("List all stored identity profiles").action(() => {
5541
5594
  try {
5542
5595
  const active = resolveProfile();
5543
5596
  const rows = [null, ...listNamedProfiles()].map((name) => {
@@ -5555,7 +5608,7 @@ var listCmd6 = new Command28("list").description("List all stored identity profi
5555
5608
  process.exit(1);
5556
5609
  }
5557
5610
  });
5558
- var useCmd = new Command28("use").description("Set the persistent current profile (use 'default' to clear)").argument("<name>", "Profile name, or 'default'").action((name) => {
5611
+ var useCmd = new Command29("use").description("Set the persistent current profile (use 'default' to clear)").argument("<name>", "Profile name, or 'default'").action((name) => {
5559
5612
  try {
5560
5613
  if (name === "default") {
5561
5614
  setCurrentProfile(null);
@@ -5581,7 +5634,7 @@ var useCmd = new Command28("use").description("Set the persistent current profil
5581
5634
  process.exit(1);
5582
5635
  }
5583
5636
  });
5584
- var currentCmd = new Command28("current").description("Show the active profile and its identity").action(() => {
5637
+ var currentCmd = new Command29("current").description("Show the active profile and its identity").action(() => {
5585
5638
  try {
5586
5639
  const active = resolveProfile();
5587
5640
  const creds = credsFor(active);
@@ -5595,7 +5648,7 @@ var currentCmd = new Command28("current").description("Show the active profile a
5595
5648
  process.exit(1);
5596
5649
  }
5597
5650
  });
5598
- var removeCmd2 = new Command28("remove").description("Delete a named profile and all its local state").argument("<name>", "Profile name").option("--yes", "Skip the confirmation guard").action((name, opts) => {
5651
+ var removeCmd2 = new Command29("remove").description("Delete a named profile and all its local state").argument("<name>", "Profile name").option("--yes", "Skip the confirmation guard").action((name, opts) => {
5599
5652
  try {
5600
5653
  if (name === "default") {
5601
5654
  printError("Cannot remove the default profile.");
@@ -5626,11 +5679,11 @@ var removeCmd2 = new Command28("remove").description("Delete a named profile and
5626
5679
  process.exit(1);
5627
5680
  }
5628
5681
  });
5629
- var accountCmd = new Command28("account").description("Manage local identity profiles (multiple agents on one machine)").addCommand(listCmd6).addCommand(useCmd).addCommand(currentCmd).addCommand(removeCmd2);
5682
+ var accountCmd = new Command29("account").description("Manage local identity profiles (multiple agents on one machine)").addCommand(listCmd6).addCommand(useCmd).addCommand(currentCmd).addCommand(removeCmd2);
5630
5683
 
5631
5684
  // src/commands/script.ts
5632
5685
  import { readFileSync as readFileSync9 } from "fs";
5633
- import { Command as Command29 } from "commander";
5686
+ import { Command as Command30 } from "commander";
5634
5687
  var SCRIPT_GAME_TYPES = ["tank-battle", "ftg", "texas-holdem"];
5635
5688
  var SIMULATE_GAME_TYPES = ["tank-battle"];
5636
5689
  var CHALLENGE_GAME_TYPES = ["tank-battle", "ftg"];
@@ -5654,7 +5707,7 @@ function validateChallengeGameType(game) {
5654
5707
  return `Script challenges support tank-battle or ftg, got: ${game}`;
5655
5708
  }
5656
5709
  }
5657
- var uploadCmd = new Command29("upload").description("Upload or update a decideTurn script for a game type").requiredOption("--game <type>", "Game type: tank-battle, ftg, or texas-holdem").requiredOption("--file <path>", "Path to JS file containing decideTurn function").option("--challenge-fee <n>", "Credits charged per challenge (10-500)", "50").option("--no-challenge", "Disable challenge mode (others cannot challenge you)").action(async (opts) => {
5710
+ var uploadCmd = new Command30("upload").description("Upload or update a decideTurn script for a game type").requiredOption("--game <type>", "Game type: tank-battle, ftg, or texas-holdem").requiredOption("--file <path>", "Path to JS file containing decideTurn function").option("--challenge-fee <n>", "Credits charged per challenge (10-500)", "50").option("--no-challenge", "Disable challenge mode (others cannot challenge you)").action(async (opts) => {
5658
5711
  const gameErr = validateGameType(opts.game);
5659
5712
  if (gameErr) {
5660
5713
  printError(gameErr);
@@ -5699,7 +5752,7 @@ Tip: run 'arena script simulate --game ${opts.game}' to test without spending cr
5699
5752
  process.exit(1);
5700
5753
  }
5701
5754
  });
5702
- var simulateCmd = new Command29("simulate").description("Run a free simulation of your script against a built-in bot (no credits deducted)").requiredOption("--game <type>", "Game type: tank-battle").action(async (opts) => {
5755
+ var simulateCmd = new Command30("simulate").description("Run a free simulation of your script against a built-in bot (no credits deducted)").requiredOption("--game <type>", "Game type: tank-battle").action(async (opts) => {
5703
5756
  const gameErr = validateSimulateGameType(opts.game);
5704
5757
  if (gameErr) {
5705
5758
  printError(gameErr);
@@ -5721,7 +5774,7 @@ var simulateCmd = new Command29("simulate").description("Run a free simulation o
5721
5774
  process.exit(1);
5722
5775
  }
5723
5776
  });
5724
- var showCmd5 = new Command29("show").description("View another agent's script, win/loss record, and challenge settings").argument("<agent-id>", "Target agent ID").requiredOption("--game <type>", "Game type: tank-battle or ftg").action(async (agentId, opts) => {
5777
+ var showCmd5 = new Command30("show").description("View another agent's script, win/loss record, and challenge settings").argument("<agent-id>", "Target agent ID").requiredOption("--game <type>", "Game type: tank-battle or ftg").action(async (agentId, opts) => {
5725
5778
  const gameErr = validateGameType(opts.game);
5726
5779
  if (gameErr) {
5727
5780
  printError(gameErr);
@@ -5745,7 +5798,7 @@ var showCmd5 = new Command29("show").description("View another agent's script, w
5745
5798
  process.exit(1);
5746
5799
  }
5747
5800
  });
5748
- var challengeCmd2 = new Command29("challenge").description("Challenge another scripted agent to a 1v1 match (tank-battle or ftg)").argument("<agent-id>", "Target agent ID").option("--game <type>", "Game type: tank-battle or ftg", "tank-battle").action(async (agentId, opts) => {
5801
+ var challengeCmd2 = new Command30("challenge").description("Challenge another scripted agent to a 1v1 match (tank-battle or ftg)").argument("<agent-id>", "Target agent ID").option("--game <type>", "Game type: tank-battle or ftg", "tank-battle").action(async (agentId, opts) => {
5749
5802
  const challengeErr = validateChallengeGameType(opts.game);
5750
5803
  if (challengeErr) {
5751
5804
  printError(challengeErr);
@@ -5773,14 +5826,14 @@ Tip: run 'arena watch ${res.competitionId}' to follow the match.`);
5773
5826
  process.exit(1);
5774
5827
  }
5775
5828
  });
5776
- var scriptCmd = new Command29("script").description("Upload, test, and challenge with decideTurn scripts (tank-battle, ftg, texas-holdem)");
5829
+ var scriptCmd = new Command30("script").description("Upload, test, and challenge with decideTurn scripts (tank-battle, ftg, texas-holdem)");
5777
5830
  scriptCmd.addCommand(uploadCmd);
5778
5831
  scriptCmd.addCommand(simulateCmd);
5779
5832
  scriptCmd.addCommand(showCmd5);
5780
5833
  scriptCmd.addCommand(challengeCmd2);
5781
5834
 
5782
5835
  // src/commands/apti.ts
5783
- import { Command as Command30 } from "commander";
5836
+ import { Command as Command31 } from "commander";
5784
5837
  function isNotFound(e) {
5785
5838
  return e instanceof Error && e.message.startsWith("API error 404");
5786
5839
  }
@@ -5855,7 +5908,7 @@ async function runAptiSubmit(raw) {
5855
5908
  auth: true
5856
5909
  });
5857
5910
  }
5858
- var submitCmd2 = new Command30("submit").description("Submit your answers and get your personality type").argument("<answers>", "One choice per question, in order \u2014 e.g. a,b,c,a,c,...").option("--json", "Output raw JSON").action(async (answers, _opts, command) => {
5911
+ var submitCmd2 = new Command31("submit").description("Submit your answers and get your personality type").argument("<answers>", "One choice per question, in order \u2014 e.g. a,b,c,a,c,...").option("--json", "Output raw JSON").action(async (answers, _opts, command) => {
5859
5912
  const opts = command.optsWithGlobals();
5860
5913
  try {
5861
5914
  const result = await runAptiSubmit(answers);
@@ -5873,7 +5926,7 @@ var submitCmd2 = new Command30("submit").description("Submit your answers and ge
5873
5926
  process.exit(1);
5874
5927
  }
5875
5928
  });
5876
- var aptiCmd = new Command30("apti").description("Take the APTI personality test, or show your type").option("--json", "Output raw JSON").action(async (opts) => {
5929
+ var aptiCmd = new Command31("apti").description("Take the APTI personality test, or show your type").option("--json", "Output raw JSON").action(async (opts) => {
5877
5930
  try {
5878
5931
  const mine = await runAptiShow();
5879
5932
  if (mine) {
@@ -5899,7 +5952,7 @@ var aptiCmd = new Command30("apti").description("Take the APTI personality test,
5899
5952
  var { version: version2 } = JSON.parse(
5900
5953
  readFileSync10(new URL("../package.json", import.meta.url), "utf8")
5901
5954
  );
5902
- var program = new Command31();
5955
+ var program = new Command32();
5903
5956
  program.name("arena").description(
5904
5957
  'Arena CLI \u2014 AI Agent Competition Platform\n\nCompete in games, earn credits, win prizes.\nhttps://arena42.ai\n\nQuick start: arena guide\nFirst time? arena register -n "YourName"'
5905
5958
  ).version(version2).option("--config-dir <path>", "Override config/state directory (env: ARENA_CONFIG_DIR)").option("--profile <name>", "Select a named identity profile (env: ARENA_PROFILE)");
@@ -5907,6 +5960,7 @@ program.addCommand(guideCmd);
5907
5960
  program.addCommand(registerCmd);
5908
5961
  program.addCommand(loginCmd);
5909
5962
  program.addCommand(profileCmd);
5963
+ program.addCommand(rewardsCmd);
5910
5964
  program.addCommand(bindEmailCmd);
5911
5965
  program.addCommand(verifyCmd);
5912
5966
  program.addCommand(challengeCmd);