@sherwoodagent/cli 0.14.1 → 0.14.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.
Files changed (44) hide show
  1. package/dist/{chat-LFH2SA46.js → chat-VDYE5MV4.js} +7 -7
  2. package/dist/chunk-CCOGGRA5.js +54 -0
  3. package/dist/chunk-CCOGGRA5.js.map +1 -0
  4. package/dist/{chunk-KAZRNDZQ.js → chunk-F275BM3F.js} +2 -2
  5. package/dist/{chunk-FWJBUK57.js → chunk-GH3F42AO.js} +3 -3
  6. package/dist/{chunk-7CN3TSAA.js → chunk-MJMWA4LY.js} +2 -2
  7. package/dist/{chunk-AC4QMJKC.js → chunk-SQWLOFHS.js} +2 -2
  8. package/dist/{chunk-IIDZ2TK5.js → chunk-TWX6FSCM.js} +6 -8
  9. package/dist/chunk-TWX6FSCM.js.map +1 -0
  10. package/dist/{chunk-ADPAZUTB.js → chunk-UKPICG5X.js} +20 -9
  11. package/dist/chunk-UKPICG5X.js.map +1 -0
  12. package/dist/{chunk-2N7B5N7D.js → chunk-YENI5RLE.js} +6 -4
  13. package/dist/chunk-YENI5RLE.js.map +1 -0
  14. package/dist/{config-U74QT4SC.js → config-LW4Q6NK5.js} +2 -2
  15. package/dist/{eas-XWLMRKJU.js → eas-AOY2MLIS.js} +6 -6
  16. package/dist/index.js +67 -32
  17. package/dist/index.js.map +1 -1
  18. package/dist/{ipfs-LUJHZGKF.js → ipfs-6XVOOHSR.js} +2 -2
  19. package/dist/{network-ROF3SSAA.js → network-C32G5D3J.js} +3 -3
  20. package/dist/{research-QXGYAJUL.js → research-CJ2JA24Q.js} +8 -8
  21. package/dist/research-DNR46NSK.js +14 -0
  22. package/dist/{session-ECETX4MM.js → session-GZVBQCSP.js} +12 -11
  23. package/dist/session-GZVBQCSP.js.map +1 -0
  24. package/dist/{xmtp-EKFDS5Y3.js → xmtp-2RDICHX6.js} +7 -7
  25. package/dist/{xmtp-EKFDS5Y3.js.map → xmtp-2RDICHX6.js.map} +1 -1
  26. package/package.json +1 -1
  27. package/dist/chunk-2N7B5N7D.js.map +0 -1
  28. package/dist/chunk-ADPAZUTB.js.map +0 -1
  29. package/dist/chunk-IIDZ2TK5.js.map +0 -1
  30. package/dist/chunk-LEQLX7XF.js +0 -75
  31. package/dist/chunk-LEQLX7XF.js.map +0 -1
  32. package/dist/research-HEZP7VPY.js +0 -14
  33. package/dist/session-ECETX4MM.js.map +0 -1
  34. /package/dist/{chat-LFH2SA46.js.map → chat-VDYE5MV4.js.map} +0 -0
  35. /package/dist/{chunk-KAZRNDZQ.js.map → chunk-F275BM3F.js.map} +0 -0
  36. /package/dist/{chunk-FWJBUK57.js.map → chunk-GH3F42AO.js.map} +0 -0
  37. /package/dist/{chunk-7CN3TSAA.js.map → chunk-MJMWA4LY.js.map} +0 -0
  38. /package/dist/{chunk-AC4QMJKC.js.map → chunk-SQWLOFHS.js.map} +0 -0
  39. /package/dist/{config-U74QT4SC.js.map → config-LW4Q6NK5.js.map} +0 -0
  40. /package/dist/{eas-XWLMRKJU.js.map → eas-AOY2MLIS.js.map} +0 -0
  41. /package/dist/{ipfs-LUJHZGKF.js.map → ipfs-6XVOOHSR.js.map} +0 -0
  42. /package/dist/{network-ROF3SSAA.js.map → network-C32G5D3J.js.map} +0 -0
  43. /package/dist/{research-QXGYAJUL.js.map → research-CJ2JA24Q.js.map} +0 -0
  44. /package/dist/{research-HEZP7VPY.js.map → research-DNR46NSK.js.map} +0 -0
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  fetchMetadata,
4
4
  uploadMetadata
5
- } from "./chunk-LEQLX7XF.js";
5
+ } from "./chunk-CCOGGRA5.js";
6
6
  import {
7
7
  createApproval,
8
8
  createJoinRequest,
@@ -10,7 +10,7 @@ import {
10
10
  queryApprovals,
11
11
  queryJoinRequests,
12
12
  revokeAttestation
13
- } from "./chunk-2N7B5N7D.js";
13
+ } from "./chunk-YENI5RLE.js";
14
14
  import {
15
15
  approveDepositor,
16
16
  deposit,
@@ -26,7 +26,7 @@ import {
26
26
  resolveVaultSyndicate,
27
27
  setTextRecord,
28
28
  setVaultAddress
29
- } from "./chunk-ADPAZUTB.js";
29
+ } from "./chunk-UKPICG5X.js";
30
30
  import {
31
31
  AGENT_REGISTRY,
32
32
  EAS_SCHEMAS,
@@ -42,12 +42,12 @@ import {
42
42
  UNISWAP_QUOTER_V2_ABI,
43
43
  VENICE,
44
44
  VENICE_STAKING_ABI
45
- } from "./chunk-AC4QMJKC.js";
45
+ } from "./chunk-SQWLOFHS.js";
46
46
  import {
47
47
  getAccount,
48
48
  getPublicClient,
49
49
  getWalletClient
50
- } from "./chunk-FWJBUK57.js";
50
+ } from "./chunk-GH3F42AO.js";
51
51
  import {
52
52
  VALID_NETWORKS,
53
53
  getChain,
@@ -56,7 +56,7 @@ import {
56
56
  getRpcUrl,
57
57
  isTestnet,
58
58
  setNetwork
59
- } from "./chunk-7CN3TSAA.js";
59
+ } from "./chunk-MJMWA4LY.js";
60
60
  import {
61
61
  cacheGroupId,
62
62
  getAgentId,
@@ -70,12 +70,13 @@ import {
70
70
  setNotifyTo,
71
71
  setPrivateKey,
72
72
  setVeniceApiKey
73
- } from "./chunk-IIDZ2TK5.js";
73
+ } from "./chunk-TWX6FSCM.js";
74
74
 
75
75
  // src/index.ts
76
76
  import { config as loadDotenv } from "dotenv";
77
+ import { createRequire } from "module";
77
78
  import { Command, Option } from "commander";
78
- import { parseUnits as parseUnits8 } from "viem";
79
+ import { parseUnits as parseUnits8, isAddress as isAddress5 } from "viem";
79
80
  import chalk7 from "chalk";
80
81
  import ora7 from "ora";
81
82
  import { input, confirm, select } from "@inquirer/prompts";
@@ -572,7 +573,8 @@ async function getActiveSyndicates() {
572
573
  }
573
574
  async function updateMetadata(syndicateId, metadataURI) {
574
575
  const wallet = getWalletClient();
575
- return wallet.writeContract({
576
+ const client = getPublicClient();
577
+ const hash = await wallet.writeContract({
576
578
  account: getAccount(),
577
579
  chain: getChain(),
578
580
  address: getFactoryAddress(),
@@ -580,6 +582,8 @@ async function updateMetadata(syndicateId, metadataURI) {
580
582
  functionName: "updateMetadata",
581
583
  args: [syndicateId, metadataURI]
582
584
  });
585
+ await client.waitForTransactionReceipt({ hash });
586
+ return hash;
583
587
  }
584
588
 
585
589
  // src/lib/subgraph.ts
@@ -613,10 +617,27 @@ async function query(graphql, variables) {
613
617
  return result.data;
614
618
  }
615
619
  async function getActiveSyndicates2(creator) {
616
- const where = creator ? `where: { active: true, creator: "${creator.toLowerCase()}" }` : `where: { active: true }`;
620
+ if (creator) {
621
+ const data2 = await query(
622
+ `query($creator: String!) {
623
+ syndicates(where: { active: true, creator: $creator }, orderBy: createdAt, orderDirection: desc, first: 100) {
624
+ id
625
+ vault
626
+ creator
627
+ metadataURI
628
+ createdAt
629
+ active
630
+ totalDeposits
631
+ totalWithdrawals
632
+ }
633
+ }`,
634
+ { creator: creator.toLowerCase() }
635
+ );
636
+ return data2.syndicates;
637
+ }
617
638
  const data = await query(`
618
639
  {
619
- syndicates(${where}, orderBy: createdAt, orderDirection: desc, first: 100) {
640
+ syndicates(where: { active: true }, orderBy: createdAt, orderDirection: desc, first: 100) {
620
641
  id
621
642
  vault
622
643
  creator
@@ -1978,8 +1999,8 @@ function formatDurationLong(seconds) {
1978
1999
  if (s >= 60) return `${(s / 60).toFixed(0)} min`;
1979
2000
  return `${s}s`;
1980
2001
  }
1981
- function formatShares(raw) {
1982
- const num = Number(raw) / 1e6;
2002
+ function formatShares(raw, decimals = 6) {
2003
+ const num = Number(raw) / 10 ** decimals;
1983
2004
  return num.toLocaleString("en-US", { minimumFractionDigits: 0, maximumFractionDigits: 2 });
1984
2005
  }
1985
2006
  function formatUSDC(raw) {
@@ -2401,7 +2422,7 @@ function registerGovernorCommands(program2) {
2401
2422
  const spinner = ora6("Setting voting period...").start();
2402
2423
  try {
2403
2424
  const hash = await setVotingPeriod(parseBigIntArg(opts.seconds, "seconds"));
2404
- spinner.succeed(G2(`Voting period updated to ${opts.seconds}s`));
2425
+ spinner.succeed(G2(`Voting period change queued (${opts.seconds}s). Finalize after the timelock delay with \`sherwood governor finalize-param\`.`));
2405
2426
  console.log(DIM2(` ${getExplorerUrl(hash)}`));
2406
2427
  } catch (err) {
2407
2428
  spinner.fail("Failed to set voting period");
@@ -2413,7 +2434,7 @@ function registerGovernorCommands(program2) {
2413
2434
  const spinner = ora6("Setting execution window...").start();
2414
2435
  try {
2415
2436
  const hash = await setExecutionWindow(parseBigIntArg(opts.seconds, "seconds"));
2416
- spinner.succeed(G2(`Execution window updated to ${opts.seconds}s`));
2437
+ spinner.succeed(G2(`Execution window change queued (${opts.seconds}s). Finalize after the timelock delay with \`sherwood governor finalize-param\`.`));
2417
2438
  console.log(DIM2(` ${getExplorerUrl(hash)}`));
2418
2439
  } catch (err) {
2419
2440
  spinner.fail("Failed to set execution window");
@@ -2425,7 +2446,7 @@ function registerGovernorCommands(program2) {
2425
2446
  const spinner = ora6("Setting veto threshold...").start();
2426
2447
  try {
2427
2448
  const hash = await setVetoThresholdBps(parseBigIntArg(opts.bps, "bps"));
2428
- spinner.succeed(G2(`Veto threshold updated to ${Number(opts.bps) / 100}%`));
2449
+ spinner.succeed(G2(`Veto threshold change queued (${Number(opts.bps) / 100}%). Finalize after the timelock delay with \`sherwood governor finalize-param\`.`));
2429
2450
  console.log(DIM2(` ${getExplorerUrl(hash)}`));
2430
2451
  } catch (err) {
2431
2452
  spinner.fail("Failed to set veto threshold");
@@ -2437,7 +2458,7 @@ function registerGovernorCommands(program2) {
2437
2458
  const spinner = ora6("Setting max fee...").start();
2438
2459
  try {
2439
2460
  const hash = await setMaxPerformanceFeeBps(parseBigIntArg(opts.bps, "bps"));
2440
- spinner.succeed(G2(`Max performance fee updated to ${Number(opts.bps) / 100}%`));
2461
+ spinner.succeed(G2(`Max performance fee change queued (${Number(opts.bps) / 100}%). Finalize after the timelock delay with \`sherwood governor finalize-param\`.`));
2441
2462
  console.log(DIM2(` ${getExplorerUrl(hash)}`));
2442
2463
  } catch (err) {
2443
2464
  spinner.fail("Failed to set max fee");
@@ -2449,7 +2470,7 @@ function registerGovernorCommands(program2) {
2449
2470
  const spinner = ora6("Setting max duration...").start();
2450
2471
  try {
2451
2472
  const hash = await setMaxStrategyDuration(parseBigIntArg(opts.seconds, "seconds"));
2452
- spinner.succeed(G2(`Max strategy duration updated to ${opts.seconds}s`));
2473
+ spinner.succeed(G2(`Max strategy duration change queued (${opts.seconds}s). Finalize after the timelock delay with \`sherwood governor finalize-param\`.`));
2453
2474
  console.log(DIM2(` ${getExplorerUrl(hash)}`));
2454
2475
  } catch (err) {
2455
2476
  spinner.fail("Failed to set max duration");
@@ -2461,7 +2482,7 @@ function registerGovernorCommands(program2) {
2461
2482
  const spinner = ora6("Setting cooldown...").start();
2462
2483
  try {
2463
2484
  const hash = await setCooldownPeriod(parseBigIntArg(opts.seconds, "seconds"));
2464
- spinner.succeed(G2(`Cooldown period updated to ${opts.seconds}s`));
2485
+ spinner.succeed(G2(`Cooldown period change queued (${opts.seconds}s). Finalize after the timelock delay with \`sherwood governor finalize-param\`.`));
2465
2486
  console.log(DIM2(` ${getExplorerUrl(hash)}`));
2466
2487
  } catch (err) {
2467
2488
  spinner.fail("Failed to set cooldown");
@@ -2473,7 +2494,7 @@ function registerGovernorCommands(program2) {
2473
2494
  const spinner = ora6("Setting protocol fee...").start();
2474
2495
  try {
2475
2496
  const hash = await setProtocolFeeBps(parseBigIntArg(opts.bps, "bps"));
2476
- spinner.succeed(G2(`Protocol fee updated to ${Number(opts.bps) / 100}%`));
2497
+ spinner.succeed(G2(`Protocol fee change queued (${Number(opts.bps) / 100}%). Finalize after the timelock delay with \`sherwood governor finalize-param\`.`));
2477
2498
  console.log(DIM2(` ${getExplorerUrl(hash)}`));
2478
2499
  } catch (err) {
2479
2500
  spinner.fail("Failed to set protocol fee");
@@ -2488,8 +2509,10 @@ try {
2488
2509
  loadDotenv();
2489
2510
  } catch {
2490
2511
  }
2512
+ var require2 = createRequire(import.meta.url);
2513
+ var { version: CLI_VERSION } = require2("../package.json");
2491
2514
  async function loadXmtp() {
2492
- return import("./xmtp-EKFDS5Y3.js");
2515
+ return import("./xmtp-2RDICHX6.js");
2493
2516
  }
2494
2517
  async function loadCron() {
2495
2518
  return import("./cron-RG46PYWA.js");
@@ -2500,18 +2523,26 @@ var DIM3 = chalk7.gray;
2500
2523
  var BOLD3 = chalk7.white.bold;
2501
2524
  var LABEL3 = chalk7.green.bold;
2502
2525
  var SEP3 = () => console.log(DIM3("\u2500".repeat(60)));
2526
+ function validateAddress(value, name) {
2527
+ if (!isAddress5(value)) {
2528
+ console.error(chalk7.red(`Invalid ${name} address: ${value}`));
2529
+ process.exit(1);
2530
+ }
2531
+ return value;
2532
+ }
2503
2533
  function resolveVault(opts) {
2504
2534
  if (opts.vault) {
2505
- setVaultAddress(opts.vault);
2535
+ setVaultAddress(validateAddress(opts.vault, "vault"));
2506
2536
  }
2507
2537
  }
2508
2538
  var program = new Command();
2509
- program.name("sherwood").description("CLI for agent-managed investment syndicates").version("0.1.0").addOption(
2539
+ program.name("sherwood").description("CLI for agent-managed investment syndicates").version(CLI_VERSION).addOption(
2510
2540
  new Option("--chain <network>", "Target network").choices(VALID_NETWORKS).default("base")
2511
2541
  ).option("--testnet", "Alias for --chain base-sepolia (deprecated)", false).hook("preAction", (thisCommand) => {
2512
2542
  const opts = thisCommand.optsWithGlobals();
2513
2543
  let network = opts.chain;
2514
2544
  if (opts.testnet) {
2545
+ process.env.ENABLE_TESTNET = "true";
2515
2546
  if (network !== "base") {
2516
2547
  console.warn(
2517
2548
  chalk7.yellow("[warn] --testnet ignored, --chain takes precedence")
@@ -2826,7 +2857,8 @@ syndicate.command("approve-depositor").description("Approve an address to deposi
2826
2857
  resolveVault(opts);
2827
2858
  const spinner = ora7("Approving depositor...").start();
2828
2859
  try {
2829
- const hash = await approveDepositor(opts.depositor);
2860
+ const depositor = validateAddress(opts.depositor, "depositor");
2861
+ const hash = await approveDepositor(depositor);
2830
2862
  spinner.succeed(`Depositor approved: ${hash}`);
2831
2863
  console.log(chalk7.dim(` ${getExplorerUrl(hash)}`));
2832
2864
  } catch (err) {
@@ -2839,7 +2871,8 @@ syndicate.command("remove-depositor").description("Remove an address from the de
2839
2871
  resolveVault(opts);
2840
2872
  const spinner = ora7("Removing depositor...").start();
2841
2873
  try {
2842
- const hash = await removeDepositor(opts.depositor);
2874
+ const depositor = validateAddress(opts.depositor, "depositor");
2875
+ const hash = await removeDepositor(depositor);
2843
2876
  spinner.succeed(`Depositor removed: ${hash}`);
2844
2877
  console.log(chalk7.dim(` ${getExplorerUrl(hash)}`));
2845
2878
  } catch (err) {
@@ -2859,10 +2892,11 @@ syndicate.command("add").description("Register an agent on a syndicate vault (cr
2859
2892
  spinner.fail("Only the syndicate creator can add agents");
2860
2893
  process.exit(1);
2861
2894
  }
2895
+ const agentWallet = validateAddress(opts.wallet, "wallet");
2862
2896
  spinner.text = "Registering agent...";
2863
2897
  const hash = await registerAgent(
2864
2898
  BigInt(opts.agentId),
2865
- opts.wallet
2899
+ agentWallet
2866
2900
  );
2867
2901
  spinner.succeed(`Agent registered: ${hash}`);
2868
2902
  console.log(chalk7.dim(` ${getExplorerUrl(hash)}`));
@@ -3054,6 +3088,7 @@ syndicate.command("approve").description("Approve an agent join request (registe
3054
3088
  resolveVault(opts);
3055
3089
  }
3056
3090
  const vaultAddress = getVaultAddress();
3091
+ const agentWallet = validateAddress(opts.wallet, "wallet");
3057
3092
  const { creator, subdomain, id: syndicateId } = await resolveVaultSyndicate(vaultAddress);
3058
3093
  const callerAddress = getAccount().address.toLowerCase();
3059
3094
  if (creator.toLowerCase() !== callerAddress) {
@@ -3065,7 +3100,7 @@ syndicate.command("approve").description("Approve an agent join request (registe
3065
3100
  try {
3066
3101
  const regHash = await registerAgent(
3067
3102
  BigInt(opts.agentId),
3068
- opts.wallet
3103
+ agentWallet
3069
3104
  );
3070
3105
  agentWasRegistered = true;
3071
3106
  console.log(DIM3(` Agent registered: ${getExplorerUrl(regHash)}`));
@@ -3095,7 +3130,7 @@ syndicate.command("approve").description("Approve an agent join request (registe
3095
3130
  syndicateId,
3096
3131
  BigInt(opts.agentId),
3097
3132
  vaultAddress,
3098
- opts.wallet
3133
+ agentWallet
3099
3134
  );
3100
3135
  approvalUid = result.uid;
3101
3136
  }
@@ -3278,7 +3313,7 @@ strategy.command("run").description("Execute the levered swap strategy").option(
3278
3313
  await runLeveredSwap(opts);
3279
3314
  });
3280
3315
  program.command("providers").description("List available DeFi providers").action(async () => {
3281
- const { MessariProvider, NansenProvider } = await import("./research-HEZP7VPY.js");
3316
+ const { MessariProvider, NansenProvider } = await import("./research-DNR46NSK.js");
3282
3317
  const providers = [new MoonwellProvider(), new UniswapProvider(), new MessariProvider(), new NansenProvider()];
3283
3318
  for (const p of providers) {
3284
3319
  const info = p.info();
@@ -3289,7 +3324,7 @@ ${info.name} (${info.type})`);
3289
3324
  }
3290
3325
  });
3291
3326
  try {
3292
- const { registerChatCommands } = await import("./chat-LFH2SA46.js");
3327
+ const { registerChatCommands } = await import("./chat-VDYE5MV4.js");
3293
3328
  registerChatCommands(program);
3294
3329
  } catch {
3295
3330
  program.command("chat <name> [action] [actionArgs...]").description("Syndicate chat (XMTP) \u2014 requires @xmtp/cli").action(() => {
@@ -3299,14 +3334,14 @@ try {
3299
3334
  process.exit(1);
3300
3335
  });
3301
3336
  }
3302
- var { registerSessionCommands } = await import("./session-ECETX4MM.js");
3337
+ var { registerSessionCommands } = await import("./session-GZVBQCSP.js");
3303
3338
  registerSessionCommands(program);
3304
3339
  registerVeniceCommands(program);
3305
3340
  registerAllowanceCommands(program);
3306
3341
  registerIdentityCommands(program);
3307
3342
  registerProposalCommands(program);
3308
3343
  registerGovernorCommands(program);
3309
- var { registerResearchCommands } = await import("./research-QXGYAJUL.js");
3344
+ var { registerResearchCommands } = await import("./research-CJ2JA24Q.js");
3310
3345
  registerResearchCommands(program);
3311
3346
  var configCmd = program.command("config");
3312
3347
  configCmd.command("set").description("Save settings to ~/.sherwood/config.json (persists across sessions)").option("--private-key <key>", "Wallet private key (0x-prefixed)").option("--vault <address>", "Default SyndicateVault address").option("--rpc <url>", "Custom RPC URL for the active --chain network").option("--notify-to <id>", "Destination for cron summaries (Telegram chat ID, phone, etc.)").action((opts) => {