@bankr/cli 0.1.0-beta.9 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +18 -0
  2. package/dist/cli.js +200 -3
  3. package/dist/commands/balances.d.ts +5 -0
  4. package/dist/commands/balances.js +113 -0
  5. package/dist/commands/fees.d.ts +18 -0
  6. package/dist/commands/fees.js +793 -0
  7. package/dist/commands/launch.d.ts +13 -0
  8. package/dist/commands/launch.js +174 -0
  9. package/dist/commands/llm.d.ts +11 -0
  10. package/dist/commands/llm.js +319 -3
  11. package/dist/commands/login.d.ts +3 -0
  12. package/dist/commands/login.js +94 -4
  13. package/dist/commands/profile.d.ts +26 -0
  14. package/dist/commands/profile.js +183 -0
  15. package/dist/commands/prompt.js +5 -0
  16. package/dist/commands/sign.js +3 -0
  17. package/dist/commands/sounds.d.ts +12 -0
  18. package/dist/commands/sounds.js +262 -0
  19. package/dist/commands/submit.js +14 -4
  20. package/dist/index.d.ts +2 -2
  21. package/dist/index.js +1 -1
  22. package/dist/lib/api.d.ts +213 -0
  23. package/dist/lib/api.js +177 -3
  24. package/dist/lib/cesp/engine.d.ts +13 -0
  25. package/dist/lib/cesp/engine.js +132 -0
  26. package/dist/lib/cesp/player.d.ts +6 -0
  27. package/dist/lib/cesp/player.js +50 -0
  28. package/dist/lib/cesp/types.d.ts +38 -0
  29. package/dist/lib/cesp/types.js +2 -0
  30. package/dist/lib/config.d.ts +4 -0
  31. package/dist/lib/config.js +1 -0
  32. package/package.json +4 -2
  33. package/dist/cli.d.ts.map +0 -1
  34. package/dist/cli.js.map +0 -1
  35. package/dist/commands/cancel.d.ts.map +0 -1
  36. package/dist/commands/cancel.js.map +0 -1
  37. package/dist/commands/capabilities.d.ts.map +0 -1
  38. package/dist/commands/capabilities.js.map +0 -1
  39. package/dist/commands/config.d.ts.map +0 -1
  40. package/dist/commands/config.js.map +0 -1
  41. package/dist/commands/llm.d.ts.map +0 -1
  42. package/dist/commands/llm.js.map +0 -1
  43. package/dist/commands/login.d.ts.map +0 -1
  44. package/dist/commands/login.js.map +0 -1
  45. package/dist/commands/logout.d.ts.map +0 -1
  46. package/dist/commands/logout.js.map +0 -1
  47. package/dist/commands/prompt.d.ts.map +0 -1
  48. package/dist/commands/prompt.js.map +0 -1
  49. package/dist/commands/sign.d.ts.map +0 -1
  50. package/dist/commands/sign.js.map +0 -1
  51. package/dist/commands/status.d.ts.map +0 -1
  52. package/dist/commands/status.js.map +0 -1
  53. package/dist/commands/submit.d.ts.map +0 -1
  54. package/dist/commands/submit.js.map +0 -1
  55. package/dist/commands/whoami.d.ts.map +0 -1
  56. package/dist/commands/whoami.js.map +0 -1
  57. package/dist/index.d.ts.map +0 -1
  58. package/dist/index.js.map +0 -1
  59. package/dist/lib/api.d.ts.map +0 -1
  60. package/dist/lib/api.js.map +0 -1
  61. package/dist/lib/config.d.ts.map +0 -1
  62. package/dist/lib/config.js.map +0 -1
  63. package/dist/lib/output.d.ts.map +0 -1
  64. package/dist/lib/output.js.map +0 -1
package/README.md CHANGED
@@ -73,6 +73,24 @@ bankr prompt -c "compare them"
73
73
  bankr prompt --thread thr_ABC123 "tell me more"
74
74
  ```
75
75
 
76
+ ### Token Launch
77
+
78
+ ```bash
79
+ # Interactive wizard — guides you through name, image, tweet, and fee recipient
80
+ bankr launch
81
+
82
+ # Non-interactive with all options
83
+ bankr launch --name "TESTCOIN" --image "https://example.com/img.png" \
84
+ --tweet "https://x.com/user/status/123" --fee "@vitalik" --fee-type x -y
85
+
86
+ # Quick launch (name only, skip confirmation)
87
+ bankr launch --name "TESTCOIN" -y
88
+
89
+ # Fee recipient types: x, farcaster, ens, wallet
90
+ bankr launch --name "TESTCOIN" --fee "vitalik.eth" --fee-type ens -y
91
+ bankr launch --name "TESTCOIN" --fee "0x1234..." --fee-type wallet -y
92
+ ```
93
+
76
94
  ### Job Management
77
95
 
78
96
  ```bash
package/dist/cli.js CHANGED
@@ -2,18 +2,23 @@
2
2
  import { readFileSync } from "node:fs";
3
3
  import { Command } from "commander";
4
4
  import { input } from "@inquirer/prompts";
5
+ import { balancesCommand } from "./commands/balances.js";
5
6
  import { skillsCommand } from "./commands/capabilities.js";
6
7
  import { cancelCommand } from "./commands/cancel.js";
7
8
  import { configGetCommand, configSetCommand } from "./commands/config.js";
8
9
  import { setConfigPath } from "./lib/config.js";
9
- import { claudeCommand, creditsCommand, modelsCommand, opencodeCommand, setupClaudeCodeCommand, setupCursorCommand, setupOpenclawCommand, setupOpenCodeCommand, } from "./commands/llm.js";
10
+ import { claudeCommand, creditsCommand, creditsAddCommand, creditsAutoCommand, modelsCommand, opencodeCommand, setupClaudeCodeCommand, setupCursorCommand, setupOpenclawCommand, setupOpenCodeCommand, } from "./commands/llm.js";
11
+ import { feesCommand, feesClaimCommand, feesClaimWalletCommand, } from "./commands/fees.js";
12
+ import { launchCommand } from "./commands/launch.js";
10
13
  import { loginCommand } from "./commands/login.js";
11
14
  import { logoutCommand } from "./commands/logout.js";
12
15
  import { promptCommand } from "./commands/prompt.js";
13
16
  import { signCommand } from "./commands/sign.js";
17
+ import { soundsDisableCommand, soundsEnableCommand, soundsInstallCommand, soundsListCommand, soundsMuteCommand, soundsSearchCommand, soundsStatusCommand, soundsTestCommand, soundsUnmuteCommand, soundsUseCommand, soundsVolumeCommand, } from "./commands/sounds.js";
14
18
  import { statusCommand } from "./commands/status.js";
15
19
  import { submitCommand, submitJsonCommand } from "./commands/submit.js";
16
20
  import { whoamiCommand } from "./commands/whoami.js";
21
+ import { profileViewCommand, profileCreateCommand, profileUpdateCommand, profileDeleteCommand, profileAddUpdateCommand, } from "./commands/profile.js";
17
22
  import * as output from "./lib/output.js";
18
23
  const pkg = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf-8"));
19
24
  /**
@@ -120,6 +125,24 @@ loginCmd
120
125
  llm: opts.llm,
121
126
  });
122
127
  });
128
+ loginCmd
129
+ .command("siwe")
130
+ .description("Sign in with Ethereum wallet (SIWE, for headless agents)")
131
+ .requiredOption("--private-key <key>", "Ethereum private key (0x...)")
132
+ .option("--partner-key <key>", "Partner API key for fee attribution")
133
+ .option("--key-name <name>", "API key name (default: SIWE-<date>)")
134
+ .option("--read-write", "Enable write operations on the API key")
135
+ .action(async (opts, cmd) => {
136
+ const parentOpts = cmd.parent.opts();
137
+ await loginCommand({
138
+ apiUrl: parentOpts.apiUrl,
139
+ siwe: true,
140
+ privateKey: opts.privateKey,
141
+ partnerKey: opts.partnerKey,
142
+ keyName: opts.keyName,
143
+ readWrite: opts.readWrite,
144
+ });
145
+ });
123
146
  program
124
147
  .command("logout")
125
148
  .description("Clear stored credentials")
@@ -128,6 +151,14 @@ program
128
151
  .command("whoami")
129
152
  .description("Show current authentication info")
130
153
  .action(whoamiCommand);
154
+ program
155
+ .command("balances")
156
+ .description("Show wallet token balances across chains")
157
+ .option("--chain <chains>", "Chain(s) to fetch: base, polygon, mainnet, unichain, solana (comma-separated)")
158
+ .option("--json", "Output raw JSON")
159
+ .action(async (opts) => {
160
+ await balancesCommand({ chain: opts.chain, json: opts.json });
161
+ });
131
162
  program
132
163
  .command("prompt [text...]")
133
164
  .description("Send a prompt to the Bankr AI agent")
@@ -160,6 +191,157 @@ program
160
191
  .command("skills")
161
192
  .description("Show all Bankr AI agent skills with examples")
162
193
  .action(skillsCommand);
194
+ const soundsCmd = program
195
+ .command("sounds")
196
+ .description("Manage CESP sound packs")
197
+ .action(soundsStatusCommand);
198
+ soundsCmd
199
+ .command("enable")
200
+ .description("Enable sounds")
201
+ .action(soundsEnableCommand);
202
+ soundsCmd
203
+ .command("disable")
204
+ .description("Disable sounds")
205
+ .action(soundsDisableCommand);
206
+ soundsCmd
207
+ .command("install <pack>")
208
+ .description("Install a sound pack from the CESP registry")
209
+ .action(soundsInstallCommand);
210
+ soundsCmd
211
+ .command("search [query]")
212
+ .description("Search available packs in the CESP registry")
213
+ .action(soundsSearchCommand);
214
+ soundsCmd
215
+ .command("list")
216
+ .description("List installed sound packs")
217
+ .action(soundsListCommand);
218
+ soundsCmd
219
+ .command("use <pack>")
220
+ .description("Set active sound pack")
221
+ .action(soundsUseCommand);
222
+ soundsCmd
223
+ .command("volume [level]")
224
+ .description("Get or set volume (0.0-1.0)")
225
+ .action(soundsVolumeCommand);
226
+ soundsCmd
227
+ .command("mute")
228
+ .description("Mute all sounds")
229
+ .action(soundsMuteCommand);
230
+ soundsCmd
231
+ .command("unmute")
232
+ .description("Unmute sounds")
233
+ .action(soundsUnmuteCommand);
234
+ soundsCmd
235
+ .command("test [category]")
236
+ .description("Play a test sound")
237
+ .action(soundsTestCommand);
238
+ program
239
+ .command("launch")
240
+ .description("Launch a token on Base (interactive wizard)")
241
+ .option("--name <name>", "Token name")
242
+ .option("--symbol <symbol>", "Token symbol (default: auto-generated from name)")
243
+ .option("--image <url>", "Token image URL")
244
+ .option("--tweet <url>", "Associated tweet URL")
245
+ .option("--website <url>", "Project website URL")
246
+ .option("--fee <recipient>", "Fee recipient (username, ENS, or address)")
247
+ .option("--fee-type <type>", "Fee recipient type: x, farcaster, ens, wallet (default: x)")
248
+ .option("-y, --yes", "Skip confirmation prompt")
249
+ .option("--simulate", "Simulate the deploy without broadcasting a transaction")
250
+ .action(async (opts) => {
251
+ await launchCommand({
252
+ name: opts.name,
253
+ symbol: opts.symbol,
254
+ image: opts.image,
255
+ tweet: opts.tweet,
256
+ website: opts.website,
257
+ fee: opts.fee,
258
+ feeType: opts.feeType,
259
+ yes: opts.yes,
260
+ simulate: opts.simulate,
261
+ });
262
+ });
263
+ const feesCmd = program
264
+ .command("fees [address]")
265
+ .description("View and claim creator token fee earnings")
266
+ .option("--days <n>", "Lookback period for daily chart (1-90, default: 30)")
267
+ .option("--token <address>", "Look up fees by token contract address")
268
+ .option("--json", "Output raw JSON")
269
+ .action(feesCommand);
270
+ feesCmd
271
+ .command("claim <tokenAddress>")
272
+ .description("Claim earned fees for a token")
273
+ .option("-y, --yes", "Skip confirmation prompt")
274
+ .action(feesClaimCommand);
275
+ feesCmd
276
+ .command("claim-wallet [address]")
277
+ .description("Claim earned fees using your own private key (no Bankr account needed). Reads .env from current directory automatically.")
278
+ .option("--private-key <key>", "Private key (0x...). Also reads BANKR_PRIVATE_KEY from .env or environment. If neither set, prompted interactively. Address is derived from the key when not provided.")
279
+ .option("--rpc <url>", "Custom RPC URL (default: https://mainnet.base.org)")
280
+ .option("--all", "Claim all tokens without selection prompt")
281
+ .option("-y, --yes", "Skip confirmation prompt")
282
+ .action(feesClaimWalletCommand);
283
+ const profileCmd = program
284
+ .command("profile")
285
+ .description("Manage your agent profile page")
286
+ .option("--json", "Output raw JSON")
287
+ .action(async (opts) => {
288
+ await profileViewCommand({ json: opts.json });
289
+ });
290
+ profileCmd
291
+ .command("create")
292
+ .description("Create a new agent profile")
293
+ .option("--name <name>", "Project name")
294
+ .option("--description <text>", "Project description")
295
+ .option("--token <address>", "Token contract address")
296
+ .option("--image <url>", "Profile image URL")
297
+ .option("--website <url>", "Project website URL")
298
+ .option("--json", "Output raw JSON")
299
+ .action(async (opts) => {
300
+ await profileCreateCommand({
301
+ name: opts.name,
302
+ description: opts.description,
303
+ token: opts.token,
304
+ image: opts.image,
305
+ website: opts.website,
306
+ json: opts.json,
307
+ });
308
+ });
309
+ profileCmd
310
+ .command("update")
311
+ .description("Update your agent profile")
312
+ .option("--name <name>", "Project name")
313
+ .option("--description <text>", "Project description")
314
+ .option("--token <address>", "Token contract address")
315
+ .option("--image <url>", "Profile image URL")
316
+ .option("--website <url>", "Project website URL")
317
+ .option("--json", "Output raw JSON")
318
+ .action(async (opts) => {
319
+ await profileUpdateCommand({
320
+ name: opts.name,
321
+ description: opts.description,
322
+ token: opts.token,
323
+ image: opts.image,
324
+ website: opts.website,
325
+ json: opts.json,
326
+ });
327
+ });
328
+ profileCmd
329
+ .command("delete")
330
+ .description("Delete your agent profile")
331
+ .action(profileDeleteCommand);
332
+ profileCmd
333
+ .command("add-update")
334
+ .description("Add a project update to your profile")
335
+ .option("--title <title>", "Update title")
336
+ .option("--content <text>", "Update content")
337
+ .option("--json", "Output raw JSON")
338
+ .action(async (opts) => {
339
+ await profileAddUpdateCommand({
340
+ title: opts.title,
341
+ content: opts.content,
342
+ json: opts.json,
343
+ });
344
+ });
163
345
  program
164
346
  .command("sign")
165
347
  .description("Sign messages, typed data, or transactions")
@@ -228,10 +410,25 @@ llmCmd
228
410
  .command("models")
229
411
  .description("List available models")
230
412
  .action(modelsCommand);
231
- llmCmd
413
+ const llmCreditsCmd = llmCmd
232
414
  .command("credits")
233
- .description("Show LLM gateway credit balance")
415
+ .description("LLM credit management")
234
416
  .action(creditsCommand);
417
+ llmCreditsCmd
418
+ .command("add <amount>")
419
+ .description("Add LLM credits from your wallet")
420
+ .option("--token <address>", "Source token address (default: USDC)")
421
+ .option("-y, --yes", "Skip confirmation prompt")
422
+ .action(creditsAddCommand);
423
+ llmCreditsCmd
424
+ .command("auto")
425
+ .description("View or configure auto top-up")
426
+ .option("--enable", "Enable auto top-up")
427
+ .option("--disable", "Disable auto top-up")
428
+ .option("--amount <usd>", "Top-up amount in USD")
429
+ .option("--threshold <usd>", "Trigger when balance drops below this USD amount")
430
+ .option("--tokens <symbols>", "Comma-separated token symbols (e.g. USDC,DAI)")
431
+ .action(creditsAutoCommand);
235
432
  const llmSetupCmd = llmCmd
236
433
  .command("setup")
237
434
  .description("Generate agent config (openclaw, claude, opencode, cursor)");
@@ -0,0 +1,5 @@
1
+ export declare function balancesCommand(opts: {
2
+ chain?: string;
3
+ json?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=balances.d.ts.map
@@ -0,0 +1,113 @@
1
+ import chalk from "chalk";
2
+ import { getBalances, } from "../lib/api.js";
3
+ import * as output from "../lib/output.js";
4
+ const BRAND = chalk.hex("#FF613D");
5
+ const DIM = chalk.dim;
6
+ const BOLD = chalk.bold;
7
+ const GREEN = chalk.greenBright;
8
+ const WHITE = chalk.whiteBright;
9
+ const CHAIN_LABELS = {
10
+ base: "Base",
11
+ polygon: "Polygon",
12
+ mainnet: "Ethereum",
13
+ unichain: "Unichain",
14
+ solana: "Solana",
15
+ };
16
+ const VALID_CHAINS = new Set([
17
+ "base",
18
+ "polygon",
19
+ "mainnet",
20
+ "unichain",
21
+ "solana",
22
+ ]);
23
+ function formatUsd(value) {
24
+ const num = typeof value === "string" ? parseFloat(value) : value;
25
+ if (isNaN(num) || num === 0)
26
+ return DIM("$0.00");
27
+ return `$${num.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
28
+ }
29
+ function formatBalance(value, decimals = 6) {
30
+ const num = typeof value === "string" ? parseFloat(value) : value;
31
+ if (isNaN(num) || num === 0)
32
+ return "0";
33
+ if (num < 0.000001)
34
+ return "<0.000001";
35
+ return num.toLocaleString("en-US", {
36
+ minimumFractionDigits: 0,
37
+ maximumFractionDigits: decimals,
38
+ });
39
+ }
40
+ function printChainBalances(chain, data) {
41
+ const label = CHAIN_LABELS[chain] || chain;
42
+ const total = parseFloat(data.total);
43
+ const totalStr = total > 0 ? GREEN(formatUsd(total)) : DIM(formatUsd(total));
44
+ console.log();
45
+ console.log();
46
+ console.log(` ${BRAND.bold(label)} ${totalStr}`);
47
+ console.log(` ${DIM("─".repeat(58))}`);
48
+ // Native balance
49
+ const nativeUsd = parseFloat(data.nativeUsd);
50
+ if (nativeUsd > 0 || parseFloat(data.nativeBalance) > 0) {
51
+ const nativeSymbol = chain === "solana" ? "SOL" : chain === "polygon" ? "POL" : "ETH";
52
+ console.log(` ${BOLD(WHITE(nativeSymbol.padEnd(12)))} ${formatBalance(data.nativeBalance).padStart(18)} ${DIM(formatUsd(nativeUsd))}`);
53
+ }
54
+ // Token balances sorted by USD value descending
55
+ const sorted = [...data.tokenBalances].sort((a, b) => b.token.balanceUSD - a.token.balanceUSD);
56
+ for (const tb of sorted) {
57
+ const symbol = tb.token.baseToken.symbol || "???";
58
+ const bal = formatBalance(tb.token.balance);
59
+ const usd = formatUsd(tb.token.balanceUSD);
60
+ console.log(` ${WHITE(symbol.padEnd(12))} ${bal.padStart(18)} ${DIM(usd)}`);
61
+ }
62
+ if (sorted.length === 0 && (nativeUsd === 0 || isNaN(nativeUsd))) {
63
+ console.log(DIM(" No token balances"));
64
+ }
65
+ }
66
+ export async function balancesCommand(opts) {
67
+ // Validate chain option
68
+ const chains = opts.chain
69
+ ? opts.chain.split(",").map((c) => c.trim().toLowerCase())
70
+ : undefined;
71
+ if (chains) {
72
+ const invalid = chains.filter((c) => !VALID_CHAINS.has(c));
73
+ if (invalid.length > 0) {
74
+ output.error(`Invalid chain${invalid.length > 1 ? "s" : ""}: ${invalid.join(", ")}. Valid chains: ${[...VALID_CHAINS].join(", ")}`);
75
+ process.exit(1);
76
+ }
77
+ }
78
+ const spin = output.spinner("Fetching balances...");
79
+ let data;
80
+ try {
81
+ data = await getBalances(chains);
82
+ spin.succeed("Balances loaded");
83
+ }
84
+ catch (err) {
85
+ spin.fail(`Failed to fetch balances: ${err.message}`);
86
+ process.exit(1);
87
+ }
88
+ // JSON output mode
89
+ if (opts.json) {
90
+ console.log(JSON.stringify(data, null, 2));
91
+ return;
92
+ }
93
+ // Calculate grand total
94
+ let grandTotal = 0;
95
+ const chainEntries = Object.entries(data.balances);
96
+ for (const [, chainData] of chainEntries) {
97
+ grandTotal += parseFloat(chainData.total) || 0;
98
+ }
99
+ console.log();
100
+ output.label("Wallet", "");
101
+ console.log(` ${"EVM".padEnd(8)} ${data.evmAddress}`);
102
+ if (data.solAddress) {
103
+ console.log(` ${"SOLANA".padEnd(8)} ${data.solAddress}`);
104
+ }
105
+ console.log();
106
+ output.label("Total", GREEN(formatUsd(grandTotal)));
107
+ // Print each chain
108
+ for (const [chain, chainData] of chainEntries) {
109
+ printChainBalances(chain, chainData);
110
+ }
111
+ console.log();
112
+ }
113
+ //# sourceMappingURL=balances.js.map
@@ -0,0 +1,18 @@
1
+ export interface FeesOptions {
2
+ days?: string;
3
+ json?: boolean;
4
+ token?: string;
5
+ }
6
+ export declare function feesCommand(address: string | undefined, opts: FeesOptions): Promise<void>;
7
+ export interface FeesClaimOptions {
8
+ yes?: boolean;
9
+ }
10
+ export declare function feesClaimCommand(tokenAddress: string, opts: FeesClaimOptions): Promise<void>;
11
+ export interface FeesClaimWalletOptions {
12
+ privateKey?: string;
13
+ rpc?: string;
14
+ yes?: boolean;
15
+ all?: boolean;
16
+ }
17
+ export declare function feesClaimWalletCommand(address: string | undefined, opts: FeesClaimWalletOptions): Promise<void>;
18
+ //# sourceMappingURL=fees.d.ts.map