@candledottv/cli 0.11.21 → 0.11.23

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.
Files changed (3) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +188 -10
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @candledottv/cli
2
2
 
3
- The Candle CLI (current version 0.11.21): authorize a device from your browser, keep your own keys
3
+ The Candle CLI (current version 0.11.23): authorize a device from your browser, keep your own keys
4
4
  in an encrypted vault on this machine, hand an agent a TEE wallet it can trade, and manage API
5
5
  keys, wallets, and setup health from the terminal. Zero runtime dependencies; the whole thing is
6
6
  one self-contained `dist/index.js` that runs under plain Node.
package/dist/index.js CHANGED
@@ -61132,7 +61132,7 @@ var init_convert = __esm(() => {
61132
61132
  });
61133
61133
 
61134
61134
  // ../mcp/src/version.ts
61135
- var SERVER_VERSION = "0.10.9";
61135
+ var SERVER_VERSION = "0.10.11";
61136
61136
 
61137
61137
  // ../mcp/src/update-notice.ts
61138
61138
  function newer(a, b) {
@@ -62570,6 +62570,27 @@ function buildRequest(name2, args, cfg) {
62570
62570
  const path = kind === "launch" ? `/api/v1/launch/headless/jobs/${encodeURIComponent(clientId)}` : `/api/v1/trade/agent/jobs/${encodeURIComponent(clientId)}`;
62571
62571
  return { url: `${base2}${path}`, init: { method: "GET", headers: jsonHeaders(apiKey) } };
62572
62572
  }
62573
+ case "candle_get_fees": {
62574
+ const apiKey = requireApiKey2(cfg);
62575
+ const { cursor, limit } = args;
62576
+ const params = new URLSearchParams;
62577
+ if (cursor !== undefined)
62578
+ params.set("cursor", cursor);
62579
+ if (limit !== undefined)
62580
+ params.set("limit", String(limit));
62581
+ return {
62582
+ url: `${base2}/api/v1/agent/fees${params.size ? `?${params}` : ""}`,
62583
+ init: { method: "GET", headers: jsonHeaders(apiKey) }
62584
+ };
62585
+ }
62586
+ case "candle_claim_fees": {
62587
+ const apiKey = requireApiKey2(cfg);
62588
+ const { mint, dryRun } = args;
62589
+ return {
62590
+ url: `${base2}/api/v1/agent/fees/${encodeURIComponent(mint)}/claim`,
62591
+ init: { method: "POST", headers: jsonHeaders(apiKey), body: JSON.stringify({ dryRun: dryRun === true }) }
62592
+ };
62593
+ }
62573
62594
  case "candle_get_wallets": {
62574
62595
  const apiKey = requireApiKey2(cfg);
62575
62596
  return {
@@ -62689,7 +62710,7 @@ MARKET_NOT_FOUND means Candle has no market for that token and this could not ru
62689
62710
  }, async (args) => callAndRelay("candle_token_forensics", args, getConfig(), doFetch));
62690
62711
  register("candle_get_feed", {
62691
62712
  title: "Get a token feed",
62692
- description: "Read one of the trade page's public feeds: new, graduated, onfire, or bluechip. Reads " + `only; moves nothing. No key needed. Start here when nobody has named a token.
62713
+ description: "Read one of the trade page's public feeds: new, graduated, onfire, or finalstretch " + "(bluechip still answers, is deprecated, and will be removed; where finalstretch is not " + "switched on it is refused as an unknown bucket, so use another bucket). Reads " + `only; moves nothing. No key needed. Start here when nobody has named a token.
62693
62714
 
62694
62715
  ` + "This indexes the WIDER market, not just Candle's own launches. Rows carry launchpad and " + "discovery flags (jupiterOk, externalTradeable, paperDiscoveryOk, organic0LiveOk). " + "candle_get_market resolves Jupiter-indexed rows; do not hard-skip organicScore=0 on live " + "when organic0LiveOk is true. liquidityDrawdownBps is a signal only — nothing here blocks " + `resolve or trade on drain; filter with where if you want to avoid draining pools.
62695
62716
 
@@ -62737,6 +62758,16 @@ MARKET_NOT_FOUND means Candle has no market for that token and this could not ru
62737
62758
  ` + "Amounts come back RAW, deliberately: the answer you need after a timeout is the outcome, " + "and you already know what you asked for.",
62738
62759
  inputSchema: getOperationShape
62739
62760
  }, async (args) => callAndRelay("candle_get_operation", args, getConfig(), doFetch));
62761
+ register("candle_get_fees", {
62762
+ title: "Read the creator fees this account's tokens can pay",
62763
+ description: "The tokens launched by the account's own wallets, with what each could pay now in creator fees " + "(raw units from direct chain reads) and `claimable: true` or the `reason` it is not. Reads only; " + "moves nothing. It returns no earned or paid-out totals. An unreadable token is marked, never " + "shown as zero. Paged: pass `continueCursor` back as `cursor`.",
62764
+ inputSchema: getFeesShape
62765
+ }, async (args) => callAndRelay("candle_get_fees", args, getConfig(), doFetch));
62766
+ register("candle_claim_fees", {
62767
+ title: "Claim a token's creator fees",
62768
+ description: "Collect one token's creator fees and pay them to the wallet fixed at launch. There is no destination " + "argument and the tool cannot send funds anywhere else. Candle signs with the embedded wallet, which " + "pays the network fee. Needs launch:write, and the server keeps it off until it is enabled (LAUNCH_DISABLED). " + "Call it with dryRun: true first; a real claim moves real funds into the recipient wallet, which may be " + "the wallet this agent trades from. Not idempotent by id: if the result is lost, read candle_get_fees " + "before claiming again.",
62769
+ inputSchema: claimFeesShape
62770
+ }, async (args) => callAndRelay("candle_claim_fees", args, getConfig(), doFetch));
62740
62771
  register("candle_get_wallets", {
62741
62772
  title: "List the wallets Candle executes with",
62742
62773
  description: "The account's EMBEDDED wallets, one per chain, with their delegation state. These are " + "the wallets candle_trade, candle_swap and candle_transfer spend from, so this is how an " + "agent finds its own funding addresses. Reads only; moves nothing. Not the same as the " + "account's LINKED wallets, which are the owner's own wallets and are not spent from here. " + "Balances are not included: read a specific one with the market and balance endpoints.",
@@ -62893,7 +62924,7 @@ MARKET_NOT_FOUND means Candle has no market for that token and this could not ru
62893
62924
  return { content: [{ type: "text", text: result.text }], ...result.isError ? { isError: true } : {} };
62894
62925
  });
62895
62926
  }
62896
- var TOOL_NAMES, launchTokenShape, getMarketShape, tokenForensicsShape, FEED_LIMIT_MESSAGE = "limit must be a whole number from 1 to 200", feedLimit, getFeedShape, reportActivityShape, getAgentProfileShape, getOperationShape, resolveTokenShape, profileWalletsShape, profilePnlShape, profileTradesShape, setProfileWalletsShape, swapShape, tradeShape, _rawBuyAmount, seedableLaunchShape, launchAndSeedShape, transferShape, sweepShape;
62927
+ var TOOL_NAMES, launchTokenShape, getMarketShape, tokenForensicsShape, FEED_LIMIT_MESSAGE = "limit must be a whole number from 1 to 200", feedLimit, getFeedShape, reportActivityShape, getAgentProfileShape, getOperationShape, getFeesShape, claimFeesShape, resolveTokenShape, profileWalletsShape, profilePnlShape, profileTradesShape, setProfileWalletsShape, swapShape, tradeShape, _rawBuyAmount, seedableLaunchShape, launchAndSeedShape, transferShape, sweepShape;
62897
62928
  var init_tools = __esm(() => {
62898
62929
  init_zod();
62899
62930
  init_convert();
@@ -62924,6 +62955,8 @@ var init_tools = __esm(() => {
62924
62955
  "candle_resolve_token",
62925
62956
  "candle_execution_status",
62926
62957
  "candle_get_operation",
62958
+ "candle_get_fees",
62959
+ "candle_claim_fees",
62927
62960
  "candle_perps_setup",
62928
62961
  "candle_perps_open",
62929
62962
  "candle_perps_close",
@@ -62967,7 +63000,7 @@ var init_tools = __esm(() => {
62967
63000
  return /^[0-9]+$/.test(trimmed) ? Number(trimmed) : value;
62968
63001
  }, exports_external.number({ invalid_type_error: FEED_LIMIT_MESSAGE }).int(FEED_LIMIT_MESSAGE).min(1, FEED_LIMIT_MESSAGE).max(200, FEED_LIMIT_MESSAGE).optional().describe("Max rows to return, an integer from 1 to 200."));
62969
63002
  getFeedShape = {
62970
- bucket: exports_external.enum(["new", "graduated", "onfire", "bluechip"]),
63003
+ bucket: exports_external.enum(["new", "graduated", "onfire", "bluechip", "finalstretch"]).describe("finalstretch: pump.fun tokens at 50% or more of their bonding curve, most complete first; no delta, read the whole list. Where it is not switched on it is refused as an unknown bucket: use another bucket. bluechip is deprecated and will be removed."),
62971
63004
  chain: exports_external.string().optional().describe("Optional chain filter"),
62972
63005
  where: exports_external.string().optional().describe('JSON filter, e.g. {"marketCap":{"lt":150000},"liquidityUsd":{"gte":25000},"mintAuthorityDisabled":{"eq":true}}. ' + "Comparators: eq, ne, lt, lte, gt, gte, present. An ABSENT field satisfies none of them except " + "present:false, so a filter for mintAuthorityDisabled eq true returns only tokens that actually say " + "true, never ones where the flag is simply missing. Use present:false to find the tokens with no data."),
62973
63006
  sort: exports_external.string().optional().describe('Sort as "field" or "field:asc" / "field:desc". A bare field means desc.'),
@@ -62985,6 +63018,14 @@ var init_tools = __esm(() => {
62985
63018
  clientId: exports_external.string().describe("The clientTradeId or clientLaunchId the write used, or that the tool echoed back to you"),
62986
63019
  kind: exports_external.enum(["trade", "launch"]).describe("Which rail the id belongs to. Required: ids are caller-chosen strings with no shape to dispatch on")
62987
63020
  };
63021
+ getFeesShape = {
63022
+ cursor: exports_external.string().optional().describe("The previous page's continueCursor, verbatim"),
63023
+ limit: exports_external.number().optional().describe("Tokens per page, 1 to 50 (default 20). Each one costs chain reads")
63024
+ };
63025
+ claimFeesShape = {
63026
+ mint: exports_external.string().describe("The launched token: a Solana mint or a Hood token address, as candle_get_fees lists it"),
63027
+ dryRun: exports_external.boolean().optional().describe("Check and read only. Sends nothing and writes nothing. Use it first to see what would be claimed")
63028
+ };
62988
63029
  resolveTokenShape = {
62989
63030
  mint: exports_external.string().describe("Token mint (Solana, base58) or contract address (Hood, 0x-prefixed)")
62990
63031
  };
@@ -63073,7 +63114,7 @@ var init_server2 = __esm(() => {
63073
63114
 
63074
63115
  START HERE — six tools need NO credential. Call these first to confirm the server is wired before asking anyone for anything:
63075
63116
  candle_get_market price, market cap, volume, curve state for one token
63076
- candle_get_feed the roster: hot streak, new pairs, graduated, blue chip
63117
+ candle_get_feed the roster: hot streak, new pairs, graduated, final stretch, blue chip (final stretch is refused where it is not switched on; use another bucket)
63077
63118
  candle_resolve_token a ticker or partial name -> mint address + chain
63078
63119
  candle_token_forensics call this before quoting or buying. Returns the on-chain developer (never a launchpad shared authority; deployer.attribution names the launchpad or issuer when no developer is on chain), their went-to-zero rate and last coins, who bought in the deploy window (strangers in the same slot are the bundle signal), same-funder insider share, same-funder cluster, and safety.summary with six sourced flags. Refuse an unprompted buy when flagged; incomplete or unknown is not clearance. launch.deployerLaunches is an inclusive informational count, never a warning
63079
63120
  candle_get_agent_profile your own tier, caps and verified activity
@@ -63167,7 +63208,7 @@ init_render();
63167
63208
  init_secret_store();
63168
63209
 
63169
63210
  // src/version.ts
63170
- var CLI_VERSION = "0.11.21";
63211
+ var CLI_VERSION = "0.11.23";
63171
63212
 
63172
63213
  // src/commands/auth.ts
63173
63214
  init_keys_embedded_wallet();
@@ -63896,6 +63937,24 @@ var HELP = {
63896
63937
  ],
63897
63938
  env: [...ENV_API, ...ENV_LOCAL_SIGNING]
63898
63939
  },
63940
+ fees: {
63941
+ group: "Account",
63942
+ summary: "Creator fees your launched tokens can pay, and the claim",
63943
+ description: "Lists the tokens launched by this account's wallets and what each could pay now, from direct chain reads, with the reason a token cannot be claimed. `fees claim` collects one token's creator fees and pays them to the wallet fixed at launch: there is no destination option, Candle signs with the embedded wallet, and that wallet pays the network fee. The key needs launch:write to claim and account:read to list. The server keeps the claim off until it is enabled, and while off even --dry-run answers LAUNCH_DISABLED. A Phantom-signup account's Solana fees are credited to the external wallet, which Candle cannot sign for, so its agent cannot claim them.",
63944
+ usage: ["candle fees [--cursor <cursor>] [--limit <1-50>]", "candle fees claim <mint> [--dry-run]"],
63945
+ rows: [
63946
+ {
63947
+ invocation: "claim <mint> [--dry-run]",
63948
+ description: "Claim one token's creator fees; --dry-run sends nothing"
63949
+ }
63950
+ ],
63951
+ flags: [
63952
+ { invocation: "--cursor <cursor>", description: "The previous page's continue cursor" },
63953
+ { invocation: "--limit <n>", description: "Tokens per page, 1 to 50 (default 20)" }
63954
+ ],
63955
+ examples: ["candle fees", "candle fees claim <mint> --dry-run", "candle fees claim <mint>"],
63956
+ env: ENV_API
63957
+ },
63899
63958
  pnl: {
63900
63959
  group: "Account",
63901
63960
  summary: "P&L per chain and combined: realized, fees, unrealized and open positions (--profile for one key's share)",
@@ -69757,6 +69816,122 @@ async function externalSweep(args, ctx) {
69757
69816
  });
69758
69817
  }
69759
69818
 
69819
+ // src/commands/fees.ts
69820
+ init_args();
69821
+ init_render();
69822
+ init_trading();
69823
+ init_swap();
69824
+ var LIST_USAGE = "Usage: candle fees [--cursor <cursor>] [--limit <1-50>] [--json]";
69825
+ var CLAIM_USAGE = "Usage: candle fees claim <mint> [--dry-run] [--json]";
69826
+ function amountText(row) {
69827
+ const raw = typeof row.amountRaw === "string" && /^\d+$/.test(row.amountRaw) ? row.amountRaw : null;
69828
+ if (raw === null)
69829
+ return "unknown";
69830
+ const decimals = Number.isInteger(row.decimals) ? row.decimals : 0;
69831
+ const label = row.symbol ? row.symbol : row.mint ?? "";
69832
+ const value = decimalAmount(raw, decimals);
69833
+ return `${value.includes(".") ? value.replace(/\.?0+$/, "") : value} ${safeText(label)}`.trim();
69834
+ }
69835
+ function amountsText(rows) {
69836
+ if (!Array.isArray(rows) || rows.length === 0)
69837
+ return "none";
69838
+ return rows.map((row) => amountText(row)).join(", ");
69839
+ }
69840
+ var REASON_WORDS = {
69841
+ below_dust: "under the dust floor",
69842
+ wallet_not_signable: "the recipient is a wallet Candle cannot sign for",
69843
+ delegation_off: "the embedded wallet is not delegated for agent access",
69844
+ embedded_wallet_not_permitted: "this key may not use the embedded wallet",
69845
+ not_recipient: "the fees go to someone else, or the token has no fee vault",
69846
+ insufficient_gas: "the recipient wallet cannot cover the network fee"
69847
+ };
69848
+ function reasonText(reason) {
69849
+ return typeof reason === "string" ? REASON_WORDS[reason] ?? safeText(reason) : "unknown";
69850
+ }
69851
+ async function feesList(args, ctx) {
69852
+ const parsed = parseArgs(args, { valueFlags: ["--cursor", "--limit"] });
69853
+ if ("error" in parsed) {
69854
+ writeUsageFailure(ctx.deps, parsed.error, ctx.json);
69855
+ return 2;
69856
+ }
69857
+ const limit = parsed.values["--limit"];
69858
+ if (parsed.positionals.length !== 0 || limit !== undefined && !/^(?:[1-9]|[1-4]\d|50)$/.test(limit)) {
69859
+ writeUsageFailure(ctx.deps, LIST_USAGE, ctx.json);
69860
+ return 2;
69861
+ }
69862
+ const cursor = parsed.values["--cursor"];
69863
+ try {
69864
+ const key = await tradingKey(ctx);
69865
+ const params = new URLSearchParams;
69866
+ if (cursor !== undefined)
69867
+ params.set("cursor", cursor);
69868
+ if (limit !== undefined)
69869
+ params.set("limit", limit);
69870
+ const body = await request(ctx, key, `/api/v1/agent/fees${params.size ? `?${params}` : ""}`);
69871
+ if (ctx.json)
69872
+ return printTradingResult(ctx, body);
69873
+ const page = Array.isArray(body.page) ? body.page : [];
69874
+ const out = ctx.deps.stdout;
69875
+ if (page.length === 0)
69876
+ out.write(`No launched tokens on this account.
69877
+ `);
69878
+ for (const row of page) {
69879
+ const name2 = safeText(String(row.symbol ?? row.name ?? row.mint));
69880
+ const status = row.unreadable ? "could not be read" : row.claimable ? `claimable: ${amountsText(row.claimableAmounts)}` : `not claimable: ${reasonText(row.reason)}`;
69881
+ out.write(`${name2} ${safeText(String(row.chain))} ${safeText(String(row.mint))} ${status}
69882
+ `);
69883
+ }
69884
+ if (body.isDone === false && typeof body.continueCursor === "string")
69885
+ out.write(`More: candle fees --cursor ${safeText(body.continueCursor)}
69886
+ `);
69887
+ return 0;
69888
+ } catch (error) {
69889
+ return tradingFailure(ctx, error);
69890
+ }
69891
+ }
69892
+ async function feesClaim(args, ctx) {
69893
+ const parsed = parseArgs(args, { booleanFlags: ["--dry-run"] });
69894
+ if ("error" in parsed) {
69895
+ writeUsageFailure(ctx.deps, parsed.error, ctx.json);
69896
+ return 2;
69897
+ }
69898
+ const mint = parsed.positionals[0];
69899
+ if (parsed.positionals.length !== 1 || !mint) {
69900
+ writeUsageFailure(ctx.deps, CLAIM_USAGE, ctx.json);
69901
+ return 2;
69902
+ }
69903
+ const dryRun = parsed.booleans.has("--dry-run");
69904
+ try {
69905
+ const key = await tradingKey(ctx);
69906
+ const body = await request(ctx, key, `/api/v1/agent/fees/${encodeURIComponent(mint)}/claim`, { dryRun });
69907
+ if (ctx.json)
69908
+ return printTradingResult(ctx, body);
69909
+ const out = ctx.deps.stdout;
69910
+ const claimed = Array.isArray(body.claimed) ? body.claimed : [];
69911
+ if (dryRun) {
69912
+ out.write(body.claimable === false ? `Dry run: would be refused: ${reasonText(body.reason)}. Nothing was sent.
69913
+ ` : `Dry run: would claim ${amountsText(claimed)} to ${safeText(String(body.recipient))}. Nothing was sent.
69914
+ `);
69915
+ } else {
69916
+ out.write(`Claimed ${amountsText(claimed)} to ${safeText(String(body.recipient))}
69917
+ `);
69918
+ for (const row of claimed)
69919
+ if (row.txHash)
69920
+ out.write(` ${safeText(row.txHash)}
69921
+ `);
69922
+ }
69923
+ out.write(`Still claimable: ${amountsText(body.remaining)}
69924
+ `);
69925
+ if (Array.isArray(body.warnings))
69926
+ for (const warning of body.warnings)
69927
+ ctx.deps.stderr.write(`Warning: ${safeText(String(warning))}
69928
+ `);
69929
+ return 0;
69930
+ } catch (error) {
69931
+ return tradingFailure(ctx, error);
69932
+ }
69933
+ }
69934
+
69760
69935
  // src/commands/help.ts
69761
69936
  async function help(args, ctx) {
69762
69937
  const word2 = args[0];
@@ -70999,6 +71174,8 @@ var MCP_TOOL_NAMES = [
70999
71174
  "candle_resolve_token",
71000
71175
  "candle_execution_status",
71001
71176
  "candle_get_operation",
71177
+ "candle_get_fees",
71178
+ "candle_claim_fees",
71002
71179
  "candle_perps_setup",
71003
71180
  "candle_perps_open",
71004
71181
  "candle_perps_close",
@@ -75412,9 +75589,9 @@ async function transfer(args, ctx) {
75412
75589
  const decimals = asset ? BASES[asset]?.decimals ?? 9 : await decimalsFor(ctx, flags["--mint"], lazySolanaClient(ctx, flags["--rpc-url"]));
75413
75590
  amountRaw = rawAmount(flags["--amount"], decimals);
75414
75591
  }
75415
- const amountText = isMax ? `the full spendable balance of ${label}` : `${flags["--amount"]} ${label}`;
75592
+ const amountText2 = isMax ? `the full spendable balance of ${label}` : `${flags["--amount"]} ${label}`;
75416
75593
  const confirmed = await confirmTransfer(ctx, [
75417
- `Transfer ${amountText} from ${wallet.address} (${wallet.id}) to ${describeDestination(destination)}`,
75594
+ `Transfer ${amountText2} from ${wallet.address} (${wallet.id}) to ${describeDestination(destination)}`,
75418
75595
  destination.kind === "vault" ? "Destination: this wallet's own vault, pinned when it was imported." : destination.kind === "linked" ? "Destination: a linked wallet on this account. Candle allows it only if you linked it while signed in or marked it trusted, and the amount counts against this key's spend caps." : "Destination: an address Candle will classify at build; from a TEE wallet only its vault or a trusted linked wallet is allowed."
75419
75596
  ], parsed.booleans.has("--yes"));
75420
75597
  if (!confirmed)
@@ -75478,9 +75655,9 @@ async function hoodTransfer(ctx, args) {
75478
75655
  const destination = await resolveDestination(ctx, key, wallet, to, "hood");
75479
75656
  const decimals = asset ? HOOD_BASES[asset]?.decimals ?? 18 : await hoodDecimals({ chain: "hood", asset: tokenAddress }, lazyEvmRpc(ctx, flags["--rpc-url"]));
75480
75657
  const requested = isMax ? "max" : rawAmount(flags["--amount"], decimals);
75481
- const amountText = isMax ? `the full spendable balance of ${label}` : `${flags["--amount"]} ${label}`;
75658
+ const amountText2 = isMax ? `the full spendable balance of ${label}` : `${flags["--amount"]} ${label}`;
75482
75659
  const confirmed = await confirmTransfer(ctx, [
75483
- `Transfer ${amountText} on Hood from ${wallet.address} (${wallet.id}) to ${describeDestination(destination)}`,
75660
+ `Transfer ${amountText2} on Hood from ${wallet.address} (${wallet.id}) to ${describeDestination(destination)}`,
75484
75661
  destination.kind === "vault" ? "Destination: this wallet's own vault, pinned when it was imported." : destination.kind === "linked" ? "Destination: a linked wallet on this account. Candle allows it only if you linked it while signed in or marked it trusted, only for ETH or USDG, and the amount counts against this key's spend caps." : "Destination: an address Candle will classify at build; from a TEE wallet only its vault or a trusted linked wallet is allowed.",
75485
75662
  ...asset === "ETH" ? [
75486
75663
  "ETH keeps this send's gas and the sweep-home gas reserve in the wallet; Candle refuses an amount that would spend them."
@@ -83984,6 +84161,7 @@ var COMMANDS = {
83984
84161
  launch: { bare: launch },
83985
84162
  pnl: { bare: pnl },
83986
84163
  portfolio: { bare: portfolio },
84164
+ fees: { bare: feesList, subcommands: { claim: feesClaim } },
83987
84165
  plans: { bare: plans },
83988
84166
  lp: { subcommands: { pools: lpPools, add: lpAdd, positions: lpPositions, remove: lpRemove, claim: lpClaim } },
83989
84167
  perps: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@candledottv/cli",
3
- "version": "0.11.21",
3
+ "version": "0.11.23",
4
4
  "description": "The Candle CLI: authorize a device from your browser, then manage API keys, wallets, and setup health from the terminal",
5
5
  "type": "module",
6
6
  "bin": {