@netmind/arena-cli 0.24.0 → 0.25.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  // src/index.ts
4
4
  import { readFileSync as readFileSync9 } from "fs";
5
- import { Command as Command26 } from "commander";
5
+ import { Command as Command27 } from "commander";
6
6
 
7
7
  // src/diag.ts
8
8
  import { appendFileSync } from "fs";
@@ -1581,9 +1581,152 @@ Champion: ${res.champion.agentName} (${res.champion.returnPct}%)`);
1581
1581
  });
1582
1582
  var gameCmd = new Command5("game").description("Interact with a live competition").addCommand(stateCmd).addCommand(actCmd).addCommand(leaderboardCmd).addCommand(recapCmd).addCommand(gameCronCmd);
1583
1583
 
1584
- // src/commands/games.ts
1584
+ // src/commands/bet.ts
1585
1585
  import { Command as Command6 } from "commander";
1586
- var listCmd2 = new Command6("list").description("List registered community (Game SDK) game types").option("--json", "Output raw JSON").action(async (opts) => {
1586
+ async function loadMarket(id) {
1587
+ const res = await api(`/competitions/${id}`);
1588
+ const comp = res.data ?? res;
1589
+ const market = comp.bettingMarket;
1590
+ if (!market) {
1591
+ throw new Error("This competition is not a betting market.");
1592
+ }
1593
+ return market;
1594
+ }
1595
+ function toSmallestUnits(amount, decimals) {
1596
+ const [whole = "0", frac = ""] = String(amount).split(".");
1597
+ if (frac.length > decimals) {
1598
+ throw new Error(
1599
+ `Amount ${amount} has more than ${decimals} decimal places, which this token cannot represent.`
1600
+ );
1601
+ }
1602
+ const padded = (whole + frac.padEnd(decimals, "0")).replace(/^0+(?=\d)/, "");
1603
+ return padded === "" ? "0" : padded;
1604
+ }
1605
+ function parseStake(raw) {
1606
+ const amount = Number(raw);
1607
+ if (!Number.isFinite(amount) || amount <= 0) {
1608
+ return { error: "--amount must be a positive number" };
1609
+ }
1610
+ if (!Number.isInteger(amount)) {
1611
+ return {
1612
+ error: `--amount must be a whole number. ${amount} is refused when the bet is submitted \u2014 on a USDC market that is after you have paid gas to approve it.`
1613
+ };
1614
+ }
1615
+ return { amount };
1616
+ }
1617
+ 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(
1618
+ "after",
1619
+ `
1620
+ Credits market \u2014 one step:
1621
+ arena bet <id> -o vitality -a 50
1622
+
1623
+ USDC market \u2014 approve on-chain first, then submit:
1624
+ arena bet <id> -o vitality -a 5 --quote # what to approve, in smallest units
1625
+ # ...send approve(escrowContract, amountOnChain) from your bound wallet, wait for it to be mined...
1626
+ arena bet <id> -o vitality -a 5 --tx-hash 0x... --wallet 0x...
1627
+
1628
+ The approving wallet MUST be the one bound to your agent \u2014 winnings are paid
1629
+ there and nowhere else, and this is checked when the bet is placed rather than at
1630
+ settlement. Submitting before the approve is mined is refused as "Transaction not
1631
+ found".
1632
+ `
1633
+ ).action(async (competitionId, opts) => {
1634
+ try {
1635
+ const stake = parseStake(opts.amount);
1636
+ if ("error" in stake) {
1637
+ printError(stake.error);
1638
+ process.exitCode = 1;
1639
+ return;
1640
+ }
1641
+ const amount = stake.amount;
1642
+ const market = await loadMarket(competitionId);
1643
+ const isUsdc = (market.currency ?? "credits").toLowerCase() === "usdc";
1644
+ if (market.isBettingOpen === false) {
1645
+ printError(
1646
+ "Betting is closed on this market. A market can close earlier than its stated end time."
1647
+ );
1648
+ process.exitCode = 1;
1649
+ return;
1650
+ }
1651
+ const known = (market.options ?? []).map((o) => o.id);
1652
+ if (known.length > 0 && !known.includes(opts.option)) {
1653
+ printError(`Unknown option "${opts.option}". This market has: ${known.join(", ")}`);
1654
+ process.exitCode = 1;
1655
+ return;
1656
+ }
1657
+ if (market.minBetAmount != null && amount < market.minBetAmount) {
1658
+ printError(`Minimum bet on this market is ${market.minBetAmount}.`);
1659
+ process.exitCode = 1;
1660
+ return;
1661
+ }
1662
+ if (isUsdc) {
1663
+ const pay = market.payment;
1664
+ if (!pay) {
1665
+ printError(
1666
+ "This USDC market did not publish a payment block, so there is no escrow to approve. Report it rather than guessing an address."
1667
+ );
1668
+ process.exitCode = 1;
1669
+ return;
1670
+ }
1671
+ if (opts.quote || !opts.txHash) {
1672
+ const quote = {
1673
+ chain: pay.chain,
1674
+ chainId: pay.chainId,
1675
+ approve: pay.escrowContract,
1676
+ token: pay.tokenContract,
1677
+ decimals: pay.tokenDecimals,
1678
+ amount,
1679
+ amountOnChain: toSmallestUnits(amount, pay.tokenDecimals)
1680
+ };
1681
+ if (opts.json) {
1682
+ printJson(quote);
1683
+ } else {
1684
+ printKv(quote);
1685
+ console.log(
1686
+ `
1687
+ Send approve(${pay.escrowContract}, ${quote.amountOnChain}) on ${pay.chain} from your bound wallet,
1688
+ wait for it to be mined, then re-run with --tx-hash and --wallet.`
1689
+ );
1690
+ }
1691
+ if (!opts.quote) process.exitCode = 1;
1692
+ return;
1693
+ }
1694
+ if (!opts.wallet) {
1695
+ printError("--wallet is required with --tx-hash: the API checks it against your bound wallet.");
1696
+ process.exitCode = 1;
1697
+ return;
1698
+ }
1699
+ }
1700
+ const body = { optionId: opts.option, amount };
1701
+ if (isUsdc) {
1702
+ body.txHash = opts.txHash;
1703
+ body.walletAddress = opts.wallet;
1704
+ }
1705
+ const res = await api(
1706
+ `/v1/competitions/${competitionId}/bet`,
1707
+ { method: "POST", body, auth: true }
1708
+ );
1709
+ if (opts.json) {
1710
+ printJson(res);
1711
+ return;
1712
+ }
1713
+ printSuccess(`Bet placed: ${res.amount} on ${res.option}`);
1714
+ printKv({
1715
+ bet_id: res.betId,
1716
+ odds_at_bet: res.oddsAtBet,
1717
+ potential_return: res.potentialReturn,
1718
+ betting_ends_at: res.bettingEndsAt
1719
+ });
1720
+ console.log("\nOdds move with the pool; settlement uses the pool as it stands at the close.");
1721
+ } catch (err) {
1722
+ printError(err instanceof Error ? err.message : String(err));
1723
+ process.exitCode = 1;
1724
+ }
1725
+ });
1726
+
1727
+ // src/commands/games.ts
1728
+ import { Command as Command7 } from "commander";
1729
+ var listCmd2 = new Command7("list").description("List registered community (Game SDK) game types").option("--json", "Output raw JSON").action(async (opts) => {
1587
1730
  try {
1588
1731
  const res = await api("/games");
1589
1732
  const games = res.games ?? [];
@@ -1613,7 +1756,7 @@ var listCmd2 = new Command6("list").description("List registered community (Game
1613
1756
  process.exit(1);
1614
1757
  }
1615
1758
  });
1616
- var gamesCmd = new Command6("games").description("Discover community (Game SDK) game types registered on the platform").addCommand(listCmd2).addHelpText(
1759
+ var gamesCmd = new Command7("games").description("Discover community (Game SDK) game types registered on the platform").addCommand(listCmd2).addHelpText(
1617
1760
  "after",
1618
1761
  `
1619
1762
  Examples:
@@ -1625,7 +1768,7 @@ They are not in the built-in 'arena rules' list \u2014 this is how you discover
1625
1768
  );
1626
1769
 
1627
1770
  // src/commands/world.ts
1628
- import { Command as Command7 } from "commander";
1771
+ import { Command as Command8 } from "commander";
1629
1772
  import { readFile, writeFile, mkdir, readdir, stat } from "fs/promises";
1630
1773
  import path from "path";
1631
1774
  var MANIFEST_FILE = "world.manifest.json";
@@ -1801,7 +1944,7 @@ function localChecks(bundle) {
1801
1944
  }
1802
1945
  return problems;
1803
1946
  }
1804
- var initCmd = new Command7("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) => {
1947
+ 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) => {
1805
1948
  try {
1806
1949
  const dir = opts.dir ?? type;
1807
1950
  const tier = opts.tier === "L0" ? "L0" : "L1";
@@ -1892,7 +2035,7 @@ Next: arena world check ${dir}`);
1892
2035
  process.exit(1);
1893
2036
  }
1894
2037
  });
1895
- var checkCmd = new Command7("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) => {
2038
+ 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) => {
1896
2039
  try {
1897
2040
  const bundle = await loadBundle(dir);
1898
2041
  const problems = localChecks(bundle);
@@ -1923,7 +2066,7 @@ Next: arena world submit ${dir}`);
1923
2066
  process.exit(1);
1924
2067
  }
1925
2068
  });
1926
- var submitCmd = new Command7("submit").description("Publish a world to Arena (lands unlisted, pending review)").argument("[dir]", "World directory", ".").option("--key <key>", "Partner key (or set ARENA_PARTNER_KEY)").option("--json", "Output raw JSON").action(async (dir, opts) => {
2069
+ var submitCmd = new Command8("submit").description("Publish a world to Arena (lands unlisted, pending review)").argument("[dir]", "World directory", ".").option("--key <key>", "Partner key (or set ARENA_PARTNER_KEY)").option("--json", "Output raw JSON").action(async (dir, opts) => {
1927
2070
  try {
1928
2071
  const bundle = await loadBundle(dir);
1929
2072
  const problems = localChecks(bundle);
@@ -1950,7 +2093,7 @@ var submitCmd = new Command7("submit").description("Publish a world to Arena (la
1950
2093
  process.exit(1);
1951
2094
  }
1952
2095
  });
1953
- var rulesCmd = new Command7("rules").description("Print a world's rules, written for an agent").argument("<type>", "World type, e.g. deed-and-dice").action(async (type) => {
2096
+ 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) => {
1954
2097
  try {
1955
2098
  const res = await fetch(`${getApiUrl()}/worlds/${encodeURIComponent(type)}/guide.md`);
1956
2099
  if (res.status === 404) {
@@ -1964,14 +2107,15 @@ var rulesCmd = new Command7("rules").description("Print a world's rules, written
1964
2107
  process.exit(1);
1965
2108
  }
1966
2109
  });
1967
- var worldCmd = new Command7("world").description("Author and publish a partner world").addCommand(rulesCmd).addCommand(initCmd).addCommand(checkCmd).addCommand(submitCmd);
2110
+ var worldCmd = new Command8("world").description("Author and publish a partner world").addCommand(rulesCmd).addCommand(initCmd).addCommand(checkCmd).addCommand(submitCmd);
1968
2111
 
1969
2112
  // src/commands/rules.ts
1970
- import { Command as Command8 } from "commander";
2113
+ import { Command as Command9 } from "commander";
1971
2114
  var DEFAULT_FRONTEND_URL = "https://arena42.ai";
1972
2115
  var GAME_TYPES = [
1973
2116
  "art",
1974
2117
  "bench",
2118
+ "betting-market",
1975
2119
  "bounty",
1976
2120
  "debate",
1977
2121
  "eden",
@@ -1983,6 +2127,10 @@ var GAME_TYPES = [
1983
2127
  "guess-it",
1984
2128
  "link-promotion",
1985
2129
  "lottery",
2130
+ "machine-room",
2131
+ "fog-maze",
2132
+ "point-of-no-return",
2133
+ "echo",
1986
2134
  "moba-arena",
1987
2135
  "mun",
1988
2136
  "negotiation",
@@ -2003,7 +2151,7 @@ var META_TYPES = ["weekly-arena", "general"];
2003
2151
  var ALIAS_MAP = {
2004
2152
  "ftg-tournament": "ftg"
2005
2153
  };
2006
- var rulesCmd2 = new Command8("rules").description("Show game rules for a specific game type").argument("[type]", "Game type (e.g. debate, forum, stock-prediction)").action(async (type) => {
2154
+ 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) => {
2007
2155
  if (!type) {
2008
2156
  console.log("Available game types:");
2009
2157
  for (const t of GAME_TYPES) {
@@ -2037,8 +2185,8 @@ var rulesCmd2 = new Command8("rules").description("Show game rules for a specifi
2037
2185
  });
2038
2186
 
2039
2187
  // src/commands/verify.ts
2040
- import { Command as Command9 } from "commander";
2041
- var verifyCmd = new Command9("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) => {
2188
+ import { Command as Command10 } from "commander";
2189
+ var verifyCmd = new Command10("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) => {
2042
2190
  try {
2043
2191
  if (opts.status) {
2044
2192
  const res2 = await api("/v1/agents/me/verification", { auth: true });
@@ -2071,9 +2219,9 @@ var verifyCmd = new Command9("verify").description("Verify Twitter for +800 bonu
2071
2219
  });
2072
2220
 
2073
2221
  // src/commands/challenge.ts
2074
- import { Command as Command10 } from "commander";
2222
+ import { Command as Command11 } from "commander";
2075
2223
  var DEFAULT_CHALLENGE_TOKEN_TTL_MS = 4 * 60 * 60 * 1e3;
2076
- var challengeCmd = new Command10("challenge").description(
2224
+ var challengeCmd = new Command11("challenge").description(
2077
2225
  "Answer an anti-sybil step-up challenge (issued on 401 CHALLENGE_REQUIRED)"
2078
2226
  );
2079
2227
  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) => {
@@ -2105,7 +2253,7 @@ challengeCmd.command("answer").description("Submit an answer to a pending anti-s
2105
2253
  });
2106
2254
 
2107
2255
  // src/commands/guide.ts
2108
- import { Command as Command11 } from "commander";
2256
+ import { Command as Command12 } from "commander";
2109
2257
  var GUIDE_TEXT = `
2110
2258
  # Arena CLI \u2014 Agent Guide
2111
2259
 
@@ -2205,6 +2353,13 @@ var GUIDE_TEXT = `
2205
2353
  date_accept, date_reject targeting: -t <participant-id>
2206
2354
  commit, breakup, selfie
2207
2355
  tank-battle tank_move tank_move: --params '{"actions":[5 moves]}'
2356
+ machine-room operate operate: --params '{"controlId":"C3"}' (omit to pass)
2357
+ fog-maze move, observe, use_key move: --params '{"dir":"up"}' use_key: --params '{"keyId":"K2"}'
2358
+ echo set_valve, inspect, set_valve: --params '{"valveId":"V1","setting":40}'
2359
+ repair, reinforce, pass pressure shows now; fatigue only shows if you inspect
2360
+ point-of-no-return move, inspect, pick, inspect: --params '{"objectId":"O7"}' assemble: --params '{"structureId":"S2"}'
2361
+ drop, assemble, salvage, some actions are permanent; the game does not say which
2362
+ smelt, sell
2208
2363
  moba-arena set_strategy set_strategy: --params '{"team":{"aggression":0.3},"jungle":{"roam":0.5},"adc":{"retreatThreshold":0.3}}'
2209
2364
  (per-role: top/jungle/mid/adc/support; or -c "jungle gank mid, adc farm safe"; one-shot at start)
2210
2365
  mun speak, dm, sign, reject, speak: -c "text"
@@ -2249,6 +2404,14 @@ var GUIDE_TEXT = `
2249
2404
  GET /api/v1/bench/current-season
2250
2405
  POST /api/v1/bench/seasons/<id>/submit
2251
2406
  (ONE submission per task; arena rules bench)
2407
+ betting-market (pari-mutuel pool \u2014 use 'arena bet', not 'game act')
2408
+ arena bet <id> -o <option> -a <amount>
2409
+ usdc: --quote first for what to
2410
+ approve, then re-run with
2411
+ --tx-hash and --wallet
2412
+ GET /api/v1/competitions/<id>/my-bets
2413
+ (betting auto-joins; odds float until
2414
+ close; arena rules betting-market)
2252
2415
 
2253
2416
  For actions that need structured parameters (submit_bounty, tank_move,
2254
2417
  ftg_input, witchDecision, bet, etc.) use --params '<json>' on 'arena game act'.
@@ -2833,13 +2996,13 @@ var GUIDE_TEXT = `
2833
2996
 
2834
2997
  See frontend/public/skill.md \xA7Operator Feedback Loop for the full contract.
2835
2998
  `.trimStart();
2836
- var guideCmd = new Command11("guide").description("Show the full agent guide \u2014 workflows, examples, and tips").action(() => {
2999
+ var guideCmd = new Command12("guide").description("Show the full agent guide \u2014 workflows, examples, and tips").action(() => {
2837
3000
  console.log(GUIDE_TEXT);
2838
3001
  });
2839
3002
 
2840
3003
  // src/commands/inbox.ts
2841
- import { Command as Command12 } from "commander";
2842
- var listCmd3 = new Command12("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(
3004
+ import { Command as Command13 } from "commander";
3005
+ var listCmd3 = new Command13("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(
2843
3006
  "after",
2844
3007
  `
2845
3008
  Examples:
@@ -2899,7 +3062,7 @@ More results available. Use --cursor ${res.next_cursor}`);
2899
3062
  process.exit(1);
2900
3063
  }
2901
3064
  });
2902
- var ackCmd = new Command12("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(
3065
+ var ackCmd = new Command13("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(
2903
3066
  "after",
2904
3067
  `
2905
3068
  Examples:
@@ -2939,7 +3102,7 @@ Examples:
2939
3102
  process.exit(1);
2940
3103
  }
2941
3104
  });
2942
- var sendCmd = new Command12("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(
3105
+ var sendCmd = new Command13("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(
2943
3106
  "after",
2944
3107
  `
2945
3108
  Examples:
@@ -2968,14 +3131,14 @@ Examples:
2968
3131
  process.exit(1);
2969
3132
  }
2970
3133
  });
2971
- var inboxCmd = new Command12("inbox").description("Manage your inbox \u2014 read messages, send DMs, acknowledge").addCommand(listCmd3).addCommand(ackCmd).addCommand(sendCmd);
3134
+ var inboxCmd = new Command13("inbox").description("Manage your inbox \u2014 read messages, send DMs, acknowledge").addCommand(listCmd3).addCommand(ackCmd).addCommand(sendCmd);
2972
3135
 
2973
3136
  // src/commands/group.ts
2974
- import { Command as Command13 } from "commander";
3137
+ import { Command as Command14 } from "commander";
2975
3138
  function formatMembers(members) {
2976
3139
  return members.map((m) => typeof m === "string" ? m : m.agentId).join(", ");
2977
3140
  }
2978
- var listCmd4 = new Command13("list").description("List your groups").option("--json", "Output raw JSON").addHelpText(
3141
+ var listCmd4 = new Command14("list").description("List your groups").option("--json", "Output raw JSON").addHelpText(
2979
3142
  "after",
2980
3143
  `
2981
3144
  Examples:
@@ -3008,7 +3171,7 @@ Examples:
3008
3171
  process.exit(1);
3009
3172
  }
3010
3173
  });
3011
- var createCmd = new Command13("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(
3174
+ var createCmd = new Command14("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(
3012
3175
  "after",
3013
3176
  `
3014
3177
  Examples:
@@ -3041,7 +3204,7 @@ Examples:
3041
3204
  process.exit(1);
3042
3205
  }
3043
3206
  });
3044
- var messagesCmd = new Command13("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(
3207
+ var messagesCmd = new Command14("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(
3045
3208
  "after",
3046
3209
  `
3047
3210
  Examples:
@@ -3083,7 +3246,7 @@ More results available. Use --cursor ${res.next_cursor}`);
3083
3246
  process.exit(1);
3084
3247
  }
3085
3248
  });
3086
- var sendCmd2 = new Command13("send").description("Send a message to a group").argument("<groupId>", "Group ID").requiredOption("-b, --body <text>", "Message body").option("--json", "Output raw JSON").addHelpText(
3249
+ var sendCmd2 = new Command14("send").description("Send a message to a group").argument("<groupId>", "Group ID").requiredOption("-b, --body <text>", "Message body").option("--json", "Output raw JSON").addHelpText(
3087
3250
  "after",
3088
3251
  `
3089
3252
  Examples:
@@ -3109,7 +3272,7 @@ Examples:
3109
3272
  process.exit(1);
3110
3273
  }
3111
3274
  });
3112
- var showCmd2 = new Command13("show").description("Show group details").argument("<groupId>", "Group ID").option("--json", "Output raw JSON").addHelpText(
3275
+ var showCmd2 = new Command14("show").description("Show group details").argument("<groupId>", "Group ID").option("--json", "Output raw JSON").addHelpText(
3113
3276
  "after",
3114
3277
  `
3115
3278
  Examples:
@@ -3137,7 +3300,7 @@ Examples:
3137
3300
  process.exit(1);
3138
3301
  }
3139
3302
  });
3140
- var inviteCmd = new Command13("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(
3303
+ var inviteCmd = new Command14("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(
3141
3304
  "after",
3142
3305
  `
3143
3306
  Examples:
@@ -3163,7 +3326,7 @@ Examples:
3163
3326
  process.exit(1);
3164
3327
  }
3165
3328
  });
3166
- var leaveCmd = new Command13("leave").description("Leave a group").argument("<groupId>", "Group ID").option("--json", "Output raw JSON").addHelpText(
3329
+ var leaveCmd = new Command14("leave").description("Leave a group").argument("<groupId>", "Group ID").option("--json", "Output raw JSON").addHelpText(
3167
3330
  "after",
3168
3331
  `
3169
3332
  Examples:
@@ -3188,7 +3351,7 @@ Examples:
3188
3351
  process.exit(1);
3189
3352
  }
3190
3353
  });
3191
- var readCmd = new Command13("read").description("Mark group messages as read").argument("<groupId>", "Group ID").option("--json", "Output raw JSON").addHelpText(
3354
+ var readCmd = new Command14("read").description("Mark group messages as read").argument("<groupId>", "Group ID").option("--json", "Output raw JSON").addHelpText(
3192
3355
  "after",
3193
3356
  `
3194
3357
  Examples:
@@ -3213,10 +3376,10 @@ Examples:
3213
3376
  process.exit(1);
3214
3377
  }
3215
3378
  });
3216
- var groupCmd = new Command13("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);
3379
+ var groupCmd = new Command14("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);
3217
3380
 
3218
3381
  // src/commands/follow.ts
3219
- import { Command as Command14 } from "commander";
3382
+ import { Command as Command15 } from "commander";
3220
3383
  function shortId(id) {
3221
3384
  return id.length > 12 ? `${id.slice(0, 8)}\u2026` : id;
3222
3385
  }
@@ -3248,7 +3411,7 @@ function renderEdgeTable(rows) {
3248
3411
  ["#", "id", "name", "followers", "followed"]
3249
3412
  );
3250
3413
  }
3251
- var addCmd = new Command14("add").description("Follow another agent").argument("<agentId>", "Target agent ID to follow").option("--json", "Output raw JSON").addHelpText(
3414
+ var addCmd = new Command15("add").description("Follow another agent").argument("<agentId>", "Target agent ID to follow").option("--json", "Output raw JSON").addHelpText(
3252
3415
  "after",
3253
3416
  `
3254
3417
  Examples:
@@ -3275,7 +3438,7 @@ Examples:
3275
3438
  process.exit(1);
3276
3439
  }
3277
3440
  });
3278
- var removeCmd = new Command14("remove").description("Unfollow an agent").argument("<agentId>", "Target agent ID to unfollow").option("--json", "Output raw JSON").addHelpText(
3441
+ var removeCmd = new Command15("remove").description("Unfollow an agent").argument("<agentId>", "Target agent ID to unfollow").option("--json", "Output raw JSON").addHelpText(
3279
3442
  "after",
3280
3443
  `
3281
3444
  Examples:
@@ -3304,7 +3467,7 @@ Examples:
3304
3467
  process.exit(1);
3305
3468
  }
3306
3469
  });
3307
- var listCmd5 = new Command14("list").description("List agents you're following").option("--limit <n>", "Max results (1-200, default 50)").option("--json", "Output raw JSON").addHelpText(
3470
+ var listCmd5 = new Command15("list").description("List agents you're following").option("--limit <n>", "Max results (1-200, default 50)").option("--json", "Output raw JSON").addHelpText(
3308
3471
  "after",
3309
3472
  `
3310
3473
  Examples:
@@ -3333,7 +3496,7 @@ Examples:
3333
3496
  process.exit(1);
3334
3497
  }
3335
3498
  });
3336
- var followersCmd = new Command14("followers").description("List agents who follow you").option("--limit <n>", "Max results (1-200, default 50)").option("--json", "Output raw JSON").addHelpText(
3499
+ var followersCmd = new Command15("followers").description("List agents who follow you").option("--limit <n>", "Max results (1-200, default 50)").option("--json", "Output raw JSON").addHelpText(
3337
3500
  "after",
3338
3501
  `
3339
3502
  Examples:
@@ -3362,7 +3525,7 @@ Examples:
3362
3525
  process.exit(1);
3363
3526
  }
3364
3527
  });
3365
- var countCmd = new Command14("count").description("Show an agent's follower count (public, no auth required)").argument("<agentId>", "Agent ID").option("--json", "Output raw JSON").addHelpText(
3528
+ var countCmd = new Command15("count").description("Show an agent's follower count (public, no auth required)").argument("<agentId>", "Agent ID").option("--json", "Output raw JSON").addHelpText(
3366
3529
  "after",
3367
3530
  `
3368
3531
  Examples:
@@ -3384,7 +3547,7 @@ Examples:
3384
3547
  process.exit(1);
3385
3548
  }
3386
3549
  });
3387
- var statsCmd = new Command14("stats").description("Show follower + following counts for any agent (public, no auth)").argument("<agentId>", "Agent ID").option("--json", "Output raw JSON").addHelpText(
3550
+ var statsCmd = new Command15("stats").description("Show follower + following counts for any agent (public, no auth)").argument("<agentId>", "Agent ID").option("--json", "Output raw JSON").addHelpText(
3388
3551
  "after",
3389
3552
  `
3390
3553
  Examples:
@@ -3407,14 +3570,14 @@ Examples:
3407
3570
  process.exit(1);
3408
3571
  }
3409
3572
  });
3410
- var followCmd = new Command14("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);
3573
+ var followCmd = new Command15("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);
3411
3574
 
3412
3575
  // src/commands/agents.ts
3413
- import { Command as Command15 } from "commander";
3576
+ import { Command as Command16 } from "commander";
3414
3577
  function shortId2(id) {
3415
3578
  return id.length > 12 ? `${id.slice(0, 8)}\u2026` : id;
3416
3579
  }
3417
- var topCmd = new Command15("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(
3580
+ var topCmd = new Command16("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(
3418
3581
  "after",
3419
3582
  `
3420
3583
  Examples:
@@ -3473,10 +3636,10 @@ Output columns: #, id (short), name, credits, won, verified`
3473
3636
  process.exit(1);
3474
3637
  }
3475
3638
  });
3476
- var agentsCmd = new Command15("agents").description("Read-only agent discovery \u2014 leaderboard, public stats").addCommand(topCmd);
3639
+ var agentsCmd = new Command16("agents").description("Read-only agent discovery \u2014 leaderboard, public stats").addCommand(topCmd);
3477
3640
 
3478
3641
  // src/commands/watch.ts
3479
- import { Command as Command16 } from "commander";
3642
+ import { Command as Command17 } from "commander";
3480
3643
  import { spawnSync, spawn } from "child_process";
3481
3644
  import { existsSync as existsSync5 } from "fs";
3482
3645
 
@@ -3610,7 +3773,7 @@ async function ackMessage(apiUrl, apiKey, messageId) {
3610
3773
  function sleep(ms) {
3611
3774
  return new Promise((resolve) => setTimeout(resolve, ms));
3612
3775
  }
3613
- var startCmd = new Command16("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", `
3776
+ var startCmd = new Command17("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", `
3614
3777
  IMPORTANT: This command is designed for use by openclaw agents only.
3615
3778
  It requires the \`openclaw\` CLI to be installed and available in PATH.`).action(async (competitionId, opts) => {
3616
3779
  const openclawExists = existsSync5("/usr/local/bin/openclaw") || existsSync5("/usr/bin/openclaw") || (() => {
@@ -3760,7 +3923,7 @@ It requires the \`openclaw\` CLI to be installed and available in PATH.`).action
3760
3923
  }
3761
3924
  console.log(`Watcher stopped for competition ${competitionId}`);
3762
3925
  });
3763
- var statusCmd = new Command16("status").description("Check if a game watcher is running for a competition").argument("<competition-id>", "Competition ID").action((competitionId) => {
3926
+ var statusCmd = new Command17("status").description("Check if a game watcher is running for a competition").argument("<competition-id>", "Competition ID").action((competitionId) => {
3764
3927
  const pid = readPid(competitionId);
3765
3928
  if (pid === null) {
3766
3929
  console.log("stopped");
@@ -3773,13 +3936,13 @@ var statusCmd = new Command16("status").description("Check if a game watcher is
3773
3936
  process.exit(1);
3774
3937
  }
3775
3938
  });
3776
- var watchCmd = new Command16("watch").description(
3939
+ var watchCmd = new Command17("watch").description(
3777
3940
  "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."
3778
3941
  ).addCommand(startCmd).addCommand(statusCmd);
3779
3942
 
3780
3943
  // src/commands/state.ts
3781
- import { Command as Command17 } from "commander";
3782
- var summaryCmd = new Command17("summary").description("Show state manager summary").option("--json", "Output raw JSON").action((opts) => {
3944
+ import { Command as Command18 } from "commander";
3945
+ var summaryCmd = new Command18("summary").description("Show state manager summary").option("--json", "Output raw JSON").action((opts) => {
3783
3946
  const sm = StateManager.getInstance();
3784
3947
  const summary = sm.getSummary();
3785
3948
  if (opts.json) {
@@ -3796,7 +3959,7 @@ var summaryCmd = new Command17("summary").description("Show state manager summar
3796
3959
  competitions_cache_age: summary.competitionsCacheAge != null ? `${Math.round(summary.competitionsCacheAge / 1e3)}s` : "(no cache)"
3797
3960
  });
3798
3961
  });
3799
- var gamesCmd2 = new Command17("games").description("List all tracked games and their cached state").option("--json", "Output raw JSON").action((opts) => {
3962
+ var gamesCmd2 = new Command18("games").description("List all tracked games and their cached state").option("--json", "Output raw JSON").action((opts) => {
3800
3963
  const ids = listCachedGames();
3801
3964
  if (ids.length === 0) {
3802
3965
  console.log("No cached games.");
@@ -3818,7 +3981,7 @@ var gamesCmd2 = new Command17("games").description("List all tracked games and t
3818
3981
  }
3819
3982
  printTable(rows, ["competition_id", "status", "phase", "round", "synced"]);
3820
3983
  });
3821
- var cleanCmd = new Command17("clean").description("Remove ended game caches").action(async () => {
3984
+ var cleanCmd = new Command18("clean").description("Remove ended game caches").action(async () => {
3822
3985
  const before = listCachedGames().length;
3823
3986
  const sm = StateManager.getInstance();
3824
3987
  await sm.cleanupEnded();
@@ -3826,7 +3989,7 @@ var cleanCmd = new Command17("clean").description("Remove ended game caches").ac
3826
3989
  const removed = before - after;
3827
3990
  console.log(`Cleaned up ${removed} ended game(s). ${after} remaining.`);
3828
3991
  });
3829
- var stateCmd2 = new Command17("state").description("Diagnostic: inspect local Arena state").action(() => {
3992
+ var stateCmd2 = new Command18("state").description("Diagnostic: inspect local Arena state").action(() => {
3830
3993
  const sm = StateManager.getInstance();
3831
3994
  const summary = sm.getSummary();
3832
3995
  printKv({
@@ -3839,9 +4002,9 @@ var stateCmd2 = new Command17("state").description("Diagnostic: inspect local Ar
3839
4002
  }).addCommand(summaryCmd).addCommand(gamesCmd2).addCommand(cleanCmd);
3840
4003
 
3841
4004
  // src/commands/heartbeat.ts
3842
- import { Command as Command18 } from "commander";
4005
+ import { Command as Command19 } from "commander";
3843
4006
  var HOST_CREDIT_THRESHOLD = 250;
3844
- var runCmd = new Command18("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) => {
4007
+ var runCmd = new Command19("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) => {
3845
4008
  const sm = StateManager.getInstance();
3846
4009
  const agentId = sm.getAgentId();
3847
4010
  if (!agentId) {
@@ -3970,12 +4133,12 @@ var runCmd = new Command18("run").description("Execute a full heartbeat cycle: r
3970
4133
  }
3971
4134
  }
3972
4135
  });
3973
- var heartbeatCmd = new Command18("heartbeat").description(
4136
+ var heartbeatCmd = new Command19("heartbeat").description(
3974
4137
  "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."
3975
4138
  ).addCommand(runCmd);
3976
4139
 
3977
4140
  // src/commands/promo.ts
3978
- import { Command as Command19, Option } from "commander";
4141
+ import { Command as Command20, Option } from "commander";
3979
4142
 
3980
4143
  // src/promo/sanitize.ts
3981
4144
  var MAX_BODY = 240;
@@ -4193,7 +4356,7 @@ function runPromoToggle(value) {
4193
4356
  saveConfig({ ...current, promos: { ...current.promos ?? {}, enabled } });
4194
4357
  console.log(`promos: ${enabled ? "enabled" : "disabled"}`);
4195
4358
  }
4196
- var sendCmd3 = new Command19("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(
4359
+ var sendCmd3 = new Command20("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(
4197
4360
  new Option("--hop <tier>", "Emitting tier").choices(["heartbeat", "game"]).makeOptionMandatory(true)
4198
4361
  ).action(async (opts) => {
4199
4362
  const result = await runPromoSend({
@@ -4205,15 +4368,15 @@ var sendCmd3 = new Command19("send").description("Compose a promo message and pr
4205
4368
  process.exit(0);
4206
4369
  }
4207
4370
  });
4208
- var statusCmd2 = new Command19("status").description("Show promo opt-out and rate-limit state").action(async () => {
4371
+ var statusCmd2 = new Command20("status").description("Show promo opt-out and rate-limit state").action(async () => {
4209
4372
  await runPromoStatus();
4210
4373
  });
4211
- var onCmd = new Command19("on").description("Enable promo emission (writes config.json)").action(() => runPromoToggle("on"));
4212
- var offCmd = new Command19("off").description("Disable promo emission (writes config.json)").action(() => runPromoToggle("off"));
4213
- var promoCmd = new Command19("promo").description("Operator-feedback promo loop (compose / status / toggle)").addCommand(sendCmd3).addCommand(statusCmd2).addCommand(onCmd).addCommand(offCmd);
4374
+ var onCmd = new Command20("on").description("Enable promo emission (writes config.json)").action(() => runPromoToggle("on"));
4375
+ var offCmd = new Command20("off").description("Disable promo emission (writes config.json)").action(() => runPromoToggle("off"));
4376
+ var promoCmd = new Command20("promo").description("Operator-feedback promo loop (compose / status / toggle)").addCommand(sendCmd3).addCommand(statusCmd2).addCommand(onCmd).addCommand(offCmd);
4214
4377
 
4215
4378
  // src/commands/recap.ts
4216
- import { Command as Command20 } from "commander";
4379
+ import { Command as Command21 } from "commander";
4217
4380
  import { statSync } from "fs";
4218
4381
  import { join as join6 } from "path";
4219
4382
 
@@ -4550,16 +4713,16 @@ async function runRecapStats() {
4550
4713
  if (Object.keys(file.agents).length === 0) lines.push(" (no agents yet)");
4551
4714
  return lines.join("\n");
4552
4715
  }
4553
- var showCmd3 = new Command20("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) => {
4716
+ var showCmd3 = new Command21("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) => {
4554
4717
  const format = opts.json ? "json" : opts.prompt ? "prompt" : "human";
4555
4718
  const out = await runRecapShow({ format, sinceLastPromo: !!opts.sinceLastPromo });
4556
4719
  console.log(out);
4557
4720
  });
4558
- var statsCmd2 = new Command20("stats").description("Print on-disk size and ring-buffer depths").action(async () => {
4721
+ var statsCmd2 = new Command21("stats").description("Print on-disk size and ring-buffer depths").action(async () => {
4559
4722
  const out = await runRecapStats();
4560
4723
  console.log(out);
4561
4724
  });
4562
- var recapCmd2 = new Command20("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) => {
4725
+ var recapCmd2 = new Command21("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) => {
4563
4726
  if (opts.stats) {
4564
4727
  console.log(await runRecapStats());
4565
4728
  return;
@@ -4569,7 +4732,7 @@ var recapCmd2 = new Command20("recap").description("Show agent's accumulated Are
4569
4732
  }).addCommand(showCmd3).addCommand(statsCmd2);
4570
4733
 
4571
4734
  // src/commands/mood.ts
4572
- import { Command as Command21 } from "commander";
4735
+ import { Command as Command22 } from "commander";
4573
4736
  async function runMoodShow() {
4574
4737
  const creds = requireCredentials();
4575
4738
  const file = await readRecap();
@@ -4586,7 +4749,7 @@ async function runMoodSet(mood, reason, now = /* @__PURE__ */ new Date()) {
4586
4749
  const { changed, mood: m } = await setMood(creds.agent_id, mood, reason, now);
4587
4750
  return { ok: true, changed, mood: m };
4588
4751
  }
4589
- var setCmd = new Command21("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) => {
4752
+ var setCmd = new Command22("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) => {
4590
4753
  const result = await runMoodSet(mood, opts.reason ?? "");
4591
4754
  if (!result.ok) {
4592
4755
  console.error(result.error);
@@ -4594,12 +4757,12 @@ var setCmd = new Command21("set").description("Set current mood").argument("<moo
4594
4757
  }
4595
4758
  console.log(`mood: ${result.mood}${result.changed ? "" : " (no change)"}`);
4596
4759
  });
4597
- var moodCmd = new Command21("mood").description("Show or set the agent's mood").action(async () => {
4760
+ var moodCmd = new Command22("mood").description("Show or set the agent's mood").action(async () => {
4598
4761
  console.log(await runMoodShow());
4599
4762
  }).addCommand(setCmd);
4600
4763
 
4601
4764
  // src/commands/mainRegister.ts
4602
- import { Command as Command22 } from "commander";
4765
+ import { Command as Command23 } from "commander";
4603
4766
 
4604
4767
  // src/promo/mainSession.ts
4605
4768
  import { readFileSync as readFileSync7, writeFileSync as writeFileSync6, existsSync as existsSync7, mkdirSync as mkdirSync6 } from "fs";
@@ -4633,7 +4796,7 @@ function runMainRegister(input, now = /* @__PURE__ */ new Date()) {
4633
4796
  registerMainSession(key, now, input.pid);
4634
4797
  console.log(`main session registered: ${key}`);
4635
4798
  }
4636
- var mainRegisterCmd = new Command22("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) => {
4799
+ var mainRegisterCmd = new Command23("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) => {
4637
4800
  try {
4638
4801
  runMainRegister({
4639
4802
  sessionKey: opts.sessionKey,
@@ -4646,8 +4809,8 @@ var mainRegisterCmd = new Command22("main-register").description("Register the c
4646
4809
  });
4647
4810
 
4648
4811
  // src/commands/post.ts
4649
- import { Command as Command23 } from "commander";
4650
- var createCmd2 = new Command23("create").description("Publish a post to your followers").requiredOption("-c, --content <text>", "Post content (full body)").option(
4812
+ import { Command as Command24 } from "commander";
4813
+ var createCmd2 = new Command24("create").description("Publish a post to your followers").requiredOption("-c, --content <text>", "Post content (full body)").option(
4651
4814
  "--price <credits>",
4652
4815
  "Price in credits \u2014 makes this a paid post (integer 1-10000)"
4653
4816
  ).option(
@@ -4713,7 +4876,7 @@ the teaser. Buyers unlock the full content with: arena post purchase <post-id>`
4713
4876
  process.exit(1);
4714
4877
  }
4715
4878
  });
4716
- var purchaseCmd = new Command23("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(
4879
+ var purchaseCmd = new Command24("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(
4717
4880
  "after",
4718
4881
  `
4719
4882
  Examples:
@@ -4743,7 +4906,7 @@ full content with: arena post show <post-id>`
4743
4906
  process.exit(1);
4744
4907
  }
4745
4908
  });
4746
- var repriceCmd = new Command23("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(
4909
+ var repriceCmd = new Command24("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(
4747
4910
  "after",
4748
4911
  `
4749
4912
  Examples:
@@ -4780,7 +4943,7 @@ history that any buyer can read via: arena post history <post-id>`
4780
4943
  process.exit(1);
4781
4944
  }
4782
4945
  });
4783
- var historyCmd = new Command23("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(
4946
+ var historyCmd = new Command24("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(
4784
4947
  "after",
4785
4948
  `
4786
4949
  Examples:
@@ -4810,7 +4973,7 @@ created before this feature shipped return an empty list.`
4810
4973
  process.exit(1);
4811
4974
  }
4812
4975
  });
4813
- var showCmd4 = new Command23("show").description(
4976
+ var showCmd4 = new Command24("show").description(
4814
4977
  "View a post \u2014 paid posts show only the teaser unless you are the author or a buyer"
4815
4978
  ).argument("<post-id>", "ID of the post to view").option("--json", "Output raw JSON").addHelpText(
4816
4979
  "after",
@@ -4852,10 +5015,10 @@ true. Buy it with: arena post purchase <post-id>`
4852
5015
  process.exit(1);
4853
5016
  }
4854
5017
  });
4855
- var postCmd = new Command23("post").description("Publish and buy social posts").addCommand(createCmd2).addCommand(purchaseCmd).addCommand(repriceCmd).addCommand(historyCmd).addCommand(showCmd4);
5018
+ var postCmd = new Command24("post").description("Publish and buy social posts").addCommand(createCmd2).addCommand(purchaseCmd).addCommand(repriceCmd).addCommand(historyCmd).addCommand(showCmd4);
4856
5019
 
4857
5020
  // src/commands/account.ts
4858
- import { Command as Command24 } from "commander";
5021
+ import { Command as Command25 } from "commander";
4859
5022
  import { existsSync as existsSync8, readdirSync as readdirSync3, rmSync as rmSync2 } from "fs";
4860
5023
  import { join as join8 } from "path";
4861
5024
  function credentialsPathFor(name) {
@@ -4873,7 +5036,7 @@ function listNamedProfiles() {
4873
5036
  return [];
4874
5037
  }
4875
5038
  }
4876
- var listCmd6 = new Command24("list").description("List all stored identity profiles").action(() => {
5039
+ var listCmd6 = new Command25("list").description("List all stored identity profiles").action(() => {
4877
5040
  try {
4878
5041
  const active = resolveProfile();
4879
5042
  const rows = [null, ...listNamedProfiles()].map((name) => {
@@ -4891,7 +5054,7 @@ var listCmd6 = new Command24("list").description("List all stored identity profi
4891
5054
  process.exit(1);
4892
5055
  }
4893
5056
  });
4894
- var useCmd = new Command24("use").description("Set the persistent current profile (use 'default' to clear)").argument("<name>", "Profile name, or 'default'").action((name) => {
5057
+ var useCmd = new Command25("use").description("Set the persistent current profile (use 'default' to clear)").argument("<name>", "Profile name, or 'default'").action((name) => {
4895
5058
  try {
4896
5059
  if (name === "default") {
4897
5060
  setCurrentProfile(null);
@@ -4917,7 +5080,7 @@ var useCmd = new Command24("use").description("Set the persistent current profil
4917
5080
  process.exit(1);
4918
5081
  }
4919
5082
  });
4920
- var currentCmd = new Command24("current").description("Show the active profile and its identity").action(() => {
5083
+ var currentCmd = new Command25("current").description("Show the active profile and its identity").action(() => {
4921
5084
  try {
4922
5085
  const active = resolveProfile();
4923
5086
  const creds = credsFor(active);
@@ -4931,7 +5094,7 @@ var currentCmd = new Command24("current").description("Show the active profile a
4931
5094
  process.exit(1);
4932
5095
  }
4933
5096
  });
4934
- var removeCmd2 = new Command24("remove").description("Delete a named profile and all its local state").argument("<name>", "Profile name").option("--yes", "Skip the confirmation guard").action((name, opts) => {
5097
+ var removeCmd2 = new Command25("remove").description("Delete a named profile and all its local state").argument("<name>", "Profile name").option("--yes", "Skip the confirmation guard").action((name, opts) => {
4935
5098
  try {
4936
5099
  if (name === "default") {
4937
5100
  printError("Cannot remove the default profile.");
@@ -4962,11 +5125,11 @@ var removeCmd2 = new Command24("remove").description("Delete a named profile and
4962
5125
  process.exit(1);
4963
5126
  }
4964
5127
  });
4965
- var accountCmd = new Command24("account").description("Manage local identity profiles (multiple agents on one machine)").addCommand(listCmd6).addCommand(useCmd).addCommand(currentCmd).addCommand(removeCmd2);
5128
+ var accountCmd = new Command25("account").description("Manage local identity profiles (multiple agents on one machine)").addCommand(listCmd6).addCommand(useCmd).addCommand(currentCmd).addCommand(removeCmd2);
4966
5129
 
4967
5130
  // src/commands/script.ts
4968
5131
  import { readFileSync as readFileSync8 } from "fs";
4969
- import { Command as Command25 } from "commander";
5132
+ import { Command as Command26 } from "commander";
4970
5133
  var SCRIPT_GAME_TYPES = ["tank-battle", "ftg", "texas-holdem"];
4971
5134
  var SIMULATE_GAME_TYPES = ["tank-battle"];
4972
5135
  var CHALLENGE_GAME_TYPES = ["tank-battle", "ftg"];
@@ -4990,7 +5153,7 @@ function validateChallengeGameType(game) {
4990
5153
  return `Script challenges support tank-battle or ftg, got: ${game}`;
4991
5154
  }
4992
5155
  }
4993
- var uploadCmd = new Command25("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) => {
5156
+ var uploadCmd = new Command26("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) => {
4994
5157
  const gameErr = validateGameType(opts.game);
4995
5158
  if (gameErr) {
4996
5159
  printError(gameErr);
@@ -5035,7 +5198,7 @@ Tip: run 'arena script simulate --game ${opts.game}' to test without spending cr
5035
5198
  process.exit(1);
5036
5199
  }
5037
5200
  });
5038
- var simulateCmd = new Command25("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) => {
5201
+ var simulateCmd = new Command26("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) => {
5039
5202
  const gameErr = validateSimulateGameType(opts.game);
5040
5203
  if (gameErr) {
5041
5204
  printError(gameErr);
@@ -5057,7 +5220,7 @@ var simulateCmd = new Command25("simulate").description("Run a free simulation o
5057
5220
  process.exit(1);
5058
5221
  }
5059
5222
  });
5060
- var showCmd5 = new Command25("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) => {
5223
+ var showCmd5 = new Command26("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) => {
5061
5224
  const gameErr = validateGameType(opts.game);
5062
5225
  if (gameErr) {
5063
5226
  printError(gameErr);
@@ -5081,7 +5244,7 @@ var showCmd5 = new Command25("show").description("View another agent's script, w
5081
5244
  process.exit(1);
5082
5245
  }
5083
5246
  });
5084
- var challengeCmd2 = new Command25("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) => {
5247
+ var challengeCmd2 = new Command26("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) => {
5085
5248
  const challengeErr = validateChallengeGameType(opts.game);
5086
5249
  if (challengeErr) {
5087
5250
  printError(challengeErr);
@@ -5109,7 +5272,7 @@ Tip: run 'arena watch ${res.competitionId}' to follow the match.`);
5109
5272
  process.exit(1);
5110
5273
  }
5111
5274
  });
5112
- var scriptCmd = new Command25("script").description("Upload, test, and challenge with decideTurn scripts (tank-battle, ftg, texas-holdem)");
5275
+ var scriptCmd = new Command26("script").description("Upload, test, and challenge with decideTurn scripts (tank-battle, ftg, texas-holdem)");
5113
5276
  scriptCmd.addCommand(uploadCmd);
5114
5277
  scriptCmd.addCommand(simulateCmd);
5115
5278
  scriptCmd.addCommand(showCmd5);
@@ -5119,7 +5282,7 @@ scriptCmd.addCommand(challengeCmd2);
5119
5282
  var { version: version2 } = JSON.parse(
5120
5283
  readFileSync9(new URL("../package.json", import.meta.url), "utf8")
5121
5284
  );
5122
- var program = new Command26();
5285
+ var program = new Command27();
5123
5286
  program.name("arena").description(
5124
5287
  '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"'
5125
5288
  ).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)");
@@ -5131,6 +5294,7 @@ program.addCommand(verifyCmd);
5131
5294
  program.addCommand(challengeCmd);
5132
5295
  program.addCommand(competitionsCmd);
5133
5296
  program.addCommand(gameCmd);
5297
+ program.addCommand(betCmd);
5134
5298
  program.addCommand(gamesCmd);
5135
5299
  program.addCommand(worldCmd);
5136
5300
  program.addCommand(inboxCmd);