@candledottv/cli 0.11.12 → 0.11.13
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/README.md +1 -1
- package/dist/index.js +18 -4
- 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.
|
|
3
|
+
The Candle CLI (current version 0.11.13): 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
|
@@ -49488,7 +49488,7 @@ var init_convert = __esm(() => {
|
|
|
49488
49488
|
});
|
|
49489
49489
|
|
|
49490
49490
|
// ../mcp/src/version.ts
|
|
49491
|
-
var SERVER_VERSION = "0.10.
|
|
49491
|
+
var SERVER_VERSION = "0.10.4";
|
|
49492
49492
|
|
|
49493
49493
|
// ../mcp/src/update-notice.ts
|
|
49494
49494
|
function newer(a, b) {
|
|
@@ -50082,6 +50082,13 @@ function buildRequest(name2, args, cfg) {
|
|
|
50082
50082
|
init: { method: "GET", headers: jsonHeaders(apiKey) }
|
|
50083
50083
|
};
|
|
50084
50084
|
}
|
|
50085
|
+
case "candle_get_portfolio": {
|
|
50086
|
+
const apiKey = requireApiKey2(cfg);
|
|
50087
|
+
return {
|
|
50088
|
+
url: `${base2}/api/v1/agent/portfolio`,
|
|
50089
|
+
init: { method: "GET", headers: jsonHeaders(apiKey) }
|
|
50090
|
+
};
|
|
50091
|
+
}
|
|
50085
50092
|
case "candle_get_profile_trades": {
|
|
50086
50093
|
const apiKey = requireApiKey2(cfg);
|
|
50087
50094
|
const { keyPrefix, limit } = args;
|
|
@@ -50132,7 +50139,7 @@ function registerTools(server, env = process.env) {
|
|
|
50132
50139
|
title: "Token forensics",
|
|
50133
50140
|
description: `Gate a buy before making it: who launched it (resolved on-chain; pump.fun's shared updateAuthority is never the developer; when no developer is on chain, deployer.attribution names the launchpad or issuer instead, e.g. launched via stonk.fun or issued by xStocks), their went-to-zero rate and last coins, who bought in the deploy window (the creator's own wallets are marked disclosed; strangers in the same slot are the bundle signal), same-funder insider share, same-funder deployer cluster, and safety.summary with six sourced flags (mintAuthority, freezeAuthority, tokenExtensions, lpLock, sellability, liquidityDrain). Refuse an unprompted buy when flagged; incomplete or unknown is not clearance. launch.deployerLaunches is an inclusive informational count, never a warning. Every measurement carries a coverage note -- 'unavailable' is not 'clean'. No key needed.
|
|
50134
50141
|
|
|
50135
|
-
MARKET_NOT_FOUND means Candle has no market for that token and this could not run. That is also not 'clean': report that you could not check it, rather than reporting the token as safe. That refusal now carries error.coverage -- covered:false, a reason ('external_launchpad' when the token launched somewhere else, 'unknown_mint' when nobody has indexed it), the launchpad when known, and every check that consequently did not run. Read it instead of guessing. Most of the feed, and any Solana mint Jupiter's index knows, now answers with a partial report instead.`,
|
|
50142
|
+
MARKET_NOT_FOUND means Candle has no market for that token and this could not run. That is also not 'clean': report that you could not check it, rather than reporting the token as safe. That refusal now carries error.coverage -- covered:false, a reason ('external_launchpad' when the token launched somewhere else, 'unknown_mint' when nobody has indexed it), the launchpad when known, and every check that consequently did not run. Read it instead of guessing. Most of the feed, and any Solana mint Jupiter's index knows, now answers with a partial report instead. On Hood, a token Candle did not launch names its launch account (deployer.method cvc_launch_account) for pons.family and pools.trade launches, with no record of earlier coins; other Hood launchpads return no developer.`,
|
|
50136
50143
|
inputSchema: tokenForensicsShape
|
|
50137
50144
|
}, async (args) => callAndRelay("candle_token_forensics", args, cfg));
|
|
50138
50145
|
register("candle_get_feed", {
|
|
@@ -50184,7 +50191,7 @@ MARKET_NOT_FOUND means Candle has no market for that token and this could not ru
|
|
|
50184
50191
|
}, async (args) => callAndRelay("candle_set_profile_wallets", args, cfg));
|
|
50185
50192
|
register("candle_get_profile_pnl", {
|
|
50186
50193
|
title: "Read an agent profile's P&L",
|
|
50187
|
-
description: "Realized profit for this profile's own fills, the Candle fees charged against it, and the " + "positions it still holds with their cost basis, each MARKED at Candle's current price where one " + "exists: `markPriceUsd`, `marketValueUsd` and `unrealizedUsd` per position, and `unrealizedUsd` " + "overall. A position with no price is counted in `unmarkedPositions` and left out of unrealized, " + "never valued at zero; `oldestMarkAt` says how old the marks are. Deposits, withdrawals and " + "transfers are excluded: funding a wallet is not profit. Check `unvalued` and `truncated` before " + "quoting the number; they mean the total is partial. Reads only.",
|
|
50194
|
+
description: "Realized profit for this profile's own fills, the Candle fees charged against it, and the " + "positions it still holds with their cost basis, each MARKED at Candle's current price where one " + "exists: `markPriceUsd`, `marketValueUsd` and `unrealizedUsd` per position, and `unrealizedUsd` " + "overall. A position with no price is counted in `unmarkedPositions` and left out of unrealized, " + "never valued at zero; `oldestMarkAt` says how old the marks are. Deposits, withdrawals and " + "transfers are excluded: funding a wallet is not profit. Check `unvalued` and `truncated` before " + "quoting the number; they mean the total is partial. `pnl.byWallet` splits the same fills by the " + "wallet that paid for each trade (main or linked, with the linked wallet's label), one row per " + "wallet with the same figures, for tracking one strategy per wallet. Each row is an independent " + "average-cost pool over its own fills, so the rows need not sum to the total (a token moved " + "between wallets, or two wallets holding one token at different costs); the total stays correct. " + "Every open position and every `byWallet` row (and its positions) carries `chain` ('solana' or " + "'hood'), and `pnl.byChain` has the total's figures over each chain's fills alone, both chains " + "always present, with `openPositions` there a count (the positions are in `pnl.openPositions`, by " + "`chain`). Each chain is its own average-cost pool, so the two need not sum exactly to the total. A " + "server that predates per-chain P&L omits `chain` and `byChain`. Reads only.",
|
|
50188
50195
|
inputSchema: profilePnlShape
|
|
50189
50196
|
}, async (args) => callAndRelay("candle_get_profile_pnl", args, cfg));
|
|
50190
50197
|
register("candle_get_profile_trades", {
|
|
@@ -50192,6 +50199,11 @@ MARKET_NOT_FOUND means Candle has no market for that token and this could not ru
|
|
|
50192
50199
|
description: "Orders, actual fills, fees, timestamps and transaction hashes for this profile. Includes FAILED " + "trades, with an errorCode saying why each did not go through, so this answers 'what happened to " + "my order' as well as 'what did I trade'. Reads only; moves nothing.",
|
|
50193
50200
|
inputSchema: profileTradesShape
|
|
50194
50201
|
}, async (args) => callAndRelay("candle_get_profile_trades", args, cfg));
|
|
50202
|
+
register("candle_get_portfolio", {
|
|
50203
|
+
title: "Read what the account holds, on Solana and Hood",
|
|
50204
|
+
description: "Balances and prices for the wallets Candle already knows on this account, on both chains: the " + "embedded wallet and every TEE wallet. Solana wallets are in `embedded` and `tee` (SOL as raw " + "`lamports`, tokens as raw `amountRaw` with `decimals`). Hood wallets are in `hood.embedded` and " + "`hood.tee` (ETH as raw `wei`, ERC-20s including USDG), never in the top-level arrays. Every " + "wallet and holding carries `chain`. Prices are in `prices`: a Solana mint under its own " + "address, Hood ETH under `hood:native`, and a Hood token under `hood:<contract lowercased>`, so " + "lowercase the address before looking it up. An unpriced entry is `priceUsd: null`, never zero; " + "a Hood one says why in `unpricedReason` (no-market-row, unusable-price, stale-mark, " + "source-unavailable), and `hood.unpriced` / `hood.unpricedByReason` count them. A Hood token " + "mark older than six hours is not used, so many Hood tokens read unpriced. A wallet whose read " + "failed has null balances, never zero, and is listed in `unavailable` (Solana) or " + "`hood.unavailable`; check `complete` before quoting a total. Vault and external wallets are " + "not included: Candle does not know their addresses (the Candle CLI's `candle portfolio` reads " + "them over your own RPC). Needs a key with the account:read scope; without it the answer is " + "SCOPE_MISSING. A server that predates Hood in the portfolio omits `hood` and `chain`. Reads " + "only; moves nothing.",
|
|
50205
|
+
inputSchema: {}
|
|
50206
|
+
}, async () => callAndRelay("candle_get_portfolio", {}, cfg));
|
|
50195
50207
|
register("candle_resolve_token", {
|
|
50196
50208
|
title: "Resolve a contract address to a token",
|
|
50197
50209
|
description: "Turn a bare contract address or mint into Candle's market for it: chain, symbol, " + "decimals, quote asset, and whether Candle can trade it. Start here when a human gives " + "you an address and nothing else. The chain is read off the address's own shape and is " + "not guessed, so it does not need to be supplied. Reads only; moves nothing. A 404 means " + "Candle has no market for that address, which is an answer, not a failure to retry.",
|
|
@@ -50291,6 +50303,7 @@ var init_tools = __esm(() => {
|
|
|
50291
50303
|
"candle_set_profile_wallets",
|
|
50292
50304
|
"candle_get_profile_pnl",
|
|
50293
50305
|
"candle_get_profile_trades",
|
|
50306
|
+
"candle_get_portfolio",
|
|
50294
50307
|
"candle_resolve_token",
|
|
50295
50308
|
"candle_execution_status",
|
|
50296
50309
|
"candle_get_operation"
|
|
@@ -50516,7 +50529,7 @@ init_render();
|
|
|
50516
50529
|
init_secret_store();
|
|
50517
50530
|
|
|
50518
50531
|
// src/version.ts
|
|
50519
|
-
var CLI_VERSION = "0.11.
|
|
50532
|
+
var CLI_VERSION = "0.11.13";
|
|
50520
50533
|
|
|
50521
50534
|
// src/commands/auth.ts
|
|
50522
50535
|
init_keys_embedded_wallet();
|
|
@@ -58954,6 +58967,7 @@ var MCP_TOOL_NAMES = [
|
|
|
58954
58967
|
"candle_set_profile_wallets",
|
|
58955
58968
|
"candle_get_profile_pnl",
|
|
58956
58969
|
"candle_get_profile_trades",
|
|
58970
|
+
"candle_get_portfolio",
|
|
58957
58971
|
"candle_resolve_token",
|
|
58958
58972
|
"candle_execution_status",
|
|
58959
58973
|
"candle_get_operation"
|
package/package.json
CHANGED