@sherwoodagent/cli 0.53.3 → 0.54.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 (37) hide show
  1. package/dist/{abis-Z6M6SRPX.js → abis-VYJH7B2L.js} +2 -2
  2. package/dist/{agent-ER5GYBVQ.js → agent-VPUXRS7K.js} +2 -2
  3. package/dist/{chat-JMQNUJGF.js → chat-ZTFSH2BI.js} +5 -5
  4. package/dist/{chunk-4SZU32RM.js → chunk-2D4CFEU4.js} +25 -2
  5. package/dist/chunk-2D4CFEU4.js.map +1 -0
  6. package/dist/{chunk-DICS6PQM.js → chunk-6RPL24V6.js} +2 -2
  7. package/dist/{chunk-J2FOCXF2.js → chunk-FUH5ZDXH.js} +24 -1
  8. package/dist/chunk-FUH5ZDXH.js.map +1 -0
  9. package/dist/{chunk-KIRNQZJS.js → chunk-ZBEDR65Q.js} +2 -2
  10. package/dist/{chunk-AFLGHTOF.js → chunk-ZN5XF7OO.js} +2 -2
  11. package/dist/{chunk-MOU5FAEP.js → chunk-ZP64YMHR.js} +2 -2
  12. package/dist/{eas-U6DMTANA.js → eas-77DQGKWM.js} +3 -3
  13. package/dist/{governor-4Y6XDEVH.js → governor-65CZTQQQ.js} +7 -3
  14. package/dist/index.js +57 -21
  15. package/dist/index.js.map +1 -1
  16. package/dist/{price-RMH6KUTM.js → price-EIJSN5QA.js} +2 -2
  17. package/dist/{research-AQE726DA.js → research-7ABHFSI2.js} +3 -3
  18. package/dist/{session-MVLCQDLG.js → session-HB3XXXKS.js} +5 -5
  19. package/dist/{trade-FKC57GXZ.js → trade-XMOZ5ULE.js} +6 -6
  20. package/dist/{xmtp-VJMC2TR2.js → xmtp-OCLOP5OY.js} +3 -3
  21. package/package.json +1 -1
  22. package/dist/chunk-4SZU32RM.js.map +0 -1
  23. package/dist/chunk-J2FOCXF2.js.map +0 -1
  24. /package/dist/{abis-Z6M6SRPX.js.map → abis-VYJH7B2L.js.map} +0 -0
  25. /package/dist/{agent-ER5GYBVQ.js.map → agent-VPUXRS7K.js.map} +0 -0
  26. /package/dist/{chat-JMQNUJGF.js.map → chat-ZTFSH2BI.js.map} +0 -0
  27. /package/dist/{chunk-DICS6PQM.js.map → chunk-6RPL24V6.js.map} +0 -0
  28. /package/dist/{chunk-KIRNQZJS.js.map → chunk-ZBEDR65Q.js.map} +0 -0
  29. /package/dist/{chunk-AFLGHTOF.js.map → chunk-ZN5XF7OO.js.map} +0 -0
  30. /package/dist/{chunk-MOU5FAEP.js.map → chunk-ZP64YMHR.js.map} +0 -0
  31. /package/dist/{eas-U6DMTANA.js.map → eas-77DQGKWM.js.map} +0 -0
  32. /package/dist/{governor-4Y6XDEVH.js.map → governor-65CZTQQQ.js.map} +0 -0
  33. /package/dist/{price-RMH6KUTM.js.map → price-EIJSN5QA.js.map} +0 -0
  34. /package/dist/{research-AQE726DA.js.map → research-7ABHFSI2.js.map} +0 -0
  35. /package/dist/{session-MVLCQDLG.js.map → session-HB3XXXKS.js.map} +0 -0
  36. /package/dist/{trade-FKC57GXZ.js.map → trade-XMOZ5ULE.js.map} +0 -0
  37. /package/dist/{xmtp-VJMC2TR2.js.map → xmtp-OCLOP5OY.js.map} +0 -0
package/dist/index.js CHANGED
@@ -15,7 +15,7 @@ import {
15
15
  encodeSwapPath,
16
16
  getMultiHopQuote,
17
17
  getQuote
18
- } from "./chunk-DICS6PQM.js";
18
+ } from "./chunk-6RPL24V6.js";
19
19
  import {
20
20
  chatCompletion,
21
21
  checkApiKeyValid,
@@ -32,14 +32,14 @@ import {
32
32
  queryJoinRequests,
33
33
  revokeJoinRequest,
34
34
  stripReferrerPrefix
35
- } from "./chunk-MOU5FAEP.js";
35
+ } from "./chunk-ZP64YMHR.js";
36
36
  import {
37
37
  createSyndicate,
38
38
  getActiveSyndicates,
39
39
  getSyndicate,
40
40
  subdomainExists,
41
41
  updateMetadata
42
- } from "./chunk-KIRNQZJS.js";
42
+ } from "./chunk-ZBEDR65Q.js";
43
43
  import {
44
44
  approveDepositor,
45
45
  deposit,
@@ -63,11 +63,12 @@ import {
63
63
  searchSyndicateAcrossChains,
64
64
  setTextRecord,
65
65
  setVaultAddress
66
- } from "./chunk-AFLGHTOF.js";
66
+ } from "./chunk-ZN5XF7OO.js";
67
67
  import {
68
68
  PROPOSAL_STATE,
69
69
  PROPOSAL_STATES,
70
70
  VOTE_TYPE,
71
+ bindProposalAdapter,
71
72
  cancelProposal,
72
73
  emergencyCancel,
73
74
  emergencySettle,
@@ -95,7 +96,7 @@ import {
95
96
  setVotingPeriod,
96
97
  settleProposal,
97
98
  vote
98
- } from "./chunk-4SZU32RM.js";
99
+ } from "./chunk-2D4CFEU4.js";
99
100
  import {
100
101
  AERODROME,
101
102
  AGENT_REGISTRY,
@@ -160,7 +161,7 @@ import {
160
161
  SWAP_ROUTER_EXACT_INPUT_SINGLE_ABI,
161
162
  SYNDICATE_VAULT_ABI,
162
163
  VENICE_STAKING_ABI
163
- } from "./chunk-J2FOCXF2.js";
164
+ } from "./chunk-FUH5ZDXH.js";
164
165
  import {
165
166
  fetchMetadata,
166
167
  uploadMetadata
@@ -1538,9 +1539,9 @@ function registerStrategyTemplateCommands(strategy2) {
1538
1539
  console.error(chalk.red("Missing --name, --performance-fee, or --duration. Use --write-calls to skip proposal submission."));
1539
1540
  process.exit(1);
1540
1541
  }
1541
- const { propose: propose2 } = await import("./governor-4Y6XDEVH.js");
1542
+ const { propose: propose2, bindProposalAdapter: bindProposalAdapter2 } = await import("./governor-65CZTQQQ.js");
1542
1543
  const { pinJSON } = await import("./ipfs-IGXLLJCF.js");
1543
- const { parseDuration: parseDuration2 } = await import("./governor-4Y6XDEVH.js");
1544
+ const { parseDuration: parseDuration2 } = await import("./governor-65CZTQQQ.js");
1544
1545
  const performanceFeeBps = BigInt(opts.performanceFee);
1545
1546
  if (performanceFeeBps < 0n || performanceFeeBps > 10000n) {
1546
1547
  console.error(chalk.red("--performance-fee must be 0-10000 (basis points)"));
@@ -1569,6 +1570,7 @@ function registerStrategyTemplateCommands(strategy2) {
1569
1570
  process.exit(1);
1570
1571
  }
1571
1572
  const proposeSpinner = ora("Submitting proposal...").start();
1573
+ let createdProposalId = null;
1572
1574
  try {
1573
1575
  const { hash, proposalId } = await propose2(
1574
1576
  vault,
@@ -1578,6 +1580,7 @@ function registerStrategyTemplateCommands(strategy2) {
1578
1580
  executeCalls,
1579
1581
  settleCalls
1580
1582
  );
1583
+ createdProposalId = proposalId;
1581
1584
  proposeSpinner.succeed(`Proposal #${proposalId} created`);
1582
1585
  console.log(`Proposal #${proposalId}`);
1583
1586
  console.log(chalk.dim(` Tx: ${getExplorerUrl(hash)}`));
@@ -1587,6 +1590,18 @@ function registerStrategyTemplateCommands(strategy2) {
1587
1590
  console.error(chalk.red(formatContractError(err)));
1588
1591
  process.exit(1);
1589
1592
  }
1593
+ if (createdProposalId !== null) {
1594
+ const bindSpinner = ora("Binding adapter for live NAV...").start();
1595
+ try {
1596
+ const bindHash = await bindProposalAdapter2(createdProposalId, clone);
1597
+ bindSpinner.succeed("Adapter bound \u2014 live deposits/withdraws enabled during strategy");
1598
+ console.log(chalk.dim(` Tx: ${getExplorerUrl(bindHash)}`));
1599
+ } catch (err) {
1600
+ bindSpinner.warn(
1601
+ `Adapter bind skipped (${formatContractError(err)}) \u2014 strategy will use queue-only redemptions`
1602
+ );
1603
+ }
1604
+ }
1590
1605
  if (templateKey === "venice-inference") {
1591
1606
  console.log();
1592
1607
  console.log(chalk.yellow("Next steps:"));
@@ -1647,7 +1662,7 @@ function registerStrategyTemplateCommands(strategy2) {
1647
1662
  let prices = [];
1648
1663
  let priceSource = null;
1649
1664
  try {
1650
- const { getTokenPricesInAsset } = await import("./price-RMH6KUTM.js");
1665
+ const { getTokenPricesInAsset } = await import("./price-EIJSN5QA.js");
1651
1666
  prices = await getTokenPricesInAsset({
1652
1667
  tokens: allocations.map((a, i) => ({
1653
1668
  token: a.token,
@@ -2077,7 +2092,7 @@ function registerVeniceCommands(program2) {
2077
2092
  console.log(chalk2.dim(` Key: ${apiKey.slice(0, 8)}...${apiKey.slice(-4)}`));
2078
2093
  console.log(chalk2.dim(" Saved to ~/.sherwood/config.json"));
2079
2094
  try {
2080
- const { createVeniceProvisionAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-U6DMTANA.js");
2095
+ const { createVeniceProvisionAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-77DQGKWM.js");
2081
2096
  const { uid } = await createVeniceProvisionAttestation(account.address);
2082
2097
  if (uid !== "0x0000000000000000000000000000000000000000000000000000000000000000") {
2083
2098
  console.log(chalk2.dim(` Attested: ${getEasScanUrl2(uid)}`));
@@ -2433,7 +2448,7 @@ ${opts.prompt}`;
2433
2448
  console.log(chalk2.dim(`Model: ${result.model} | Tokens: ${result.usage.promptTokens} in, ${result.usage.completionTokens} out, ${result.usage.totalTokens} total`));
2434
2449
  }
2435
2450
  try {
2436
- const { createVeniceInferenceAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-U6DMTANA.js");
2451
+ const { createVeniceInferenceAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-77DQGKWM.js");
2437
2452
  const { keccak256: keccak2562, toHex, isAddress: isAddr } = await import("viem");
2438
2453
  const { getChainContracts: getChainContracts2 } = await import("./config-REASKDIK.js");
2439
2454
  const { getChain: getActiveChain } = await import("./network-3ZU7UBDU.js");
@@ -3609,7 +3624,7 @@ function printSimulationResult(result, callType) {
3609
3624
  }
3610
3625
  async function sendSimulationAlert(subdomain, proposalId, vault, execResult, settleResult) {
3611
3626
  try {
3612
- const xmtp = await import("./xmtp-VJMC2TR2.js");
3627
+ const xmtp = await import("./xmtp-OCLOP5OY.js");
3613
3628
  const { getAccount: getAccount2 } = await import("./client-UHHCB6EZ.js");
3614
3629
  const group = await xmtp.getGroup("", subdomain);
3615
3630
  const allRisks = [...execResult.risks, ...settleResult?.risks ?? []];
@@ -3981,6 +3996,25 @@ function registerProposalCommands(program2) {
3981
3996
  process.exit(1);
3982
3997
  }
3983
3998
  });
3999
+ proposal.command("bind-adapter").description("Bind a strategy clone to a proposal for live NAV (proposer-only, Draft or Pending, before any co-proposer approval)").requiredOption("--id <proposalId>", "Proposal ID").requiredOption("--adapter <address>", "Strategy clone address").action(async (opts) => {
4000
+ try {
4001
+ const proposalId = parseBigIntArg(opts.id, "proposal ID");
4002
+ if (!isAddress4(opts.adapter)) {
4003
+ console.error(chalk6.red("Invalid adapter address"));
4004
+ process.exit(1);
4005
+ }
4006
+ const adapter = opts.adapter;
4007
+ const spinner = ora5("Binding adapter...").start();
4008
+ const hash = await bindProposalAdapter(proposalId, adapter);
4009
+ spinner.succeed(G2("Adapter bound \u2014 live deposits/withdraws enabled"));
4010
+ console.log(DIM2(` ${getExplorerUrl(hash)}`));
4011
+ console.log();
4012
+ } catch (err) {
4013
+ console.error(chalk6.red(`
4014
+ \u2716 ${formatContractError(err)}`));
4015
+ process.exit(1);
4016
+ }
4017
+ });
3984
4018
  proposal.command("execute").description("Execute an approved proposal").requiredOption("--id <proposalId>", "Proposal ID").option("--dry-run", "Simulate execution without sending a transaction").action(async (opts) => {
3985
4019
  try {
3986
4020
  const proposalId = parseBigIntArg(opts.id, "proposal ID");
@@ -5196,8 +5230,10 @@ var DEFAULT_GRID_CONFIG = {
5196
5230
  allocationPct: 0.5,
5197
5231
  leverage: 5,
5198
5232
  // was 4 — +25% profit per RT
5199
- levelsPerSide: 15,
5200
- atrMultiplier: 2,
5233
+ levelsPerSide: 12,
5234
+ // disjoint-window winner — lowest MaxDD (18% vs 21-22%) at modest avg PnL trade-off
5235
+ atrMultiplier: 3,
5236
+ // ATR×3 dominates ATR×2 across all tested windows (lower fee burn)
5201
5237
  atrPeriod: 14,
5202
5238
  rebalanceDriftPct: 0.4,
5203
5239
  // was 0.55 — rebalance faster, keep levels near price
@@ -6762,7 +6798,7 @@ function parseTokenSplit(raw, tokens) {
6762
6798
  }
6763
6799
  function registerGridCommand(program2) {
6764
6800
  const grid = program2.command("grid").description("Grid trading strategy \u2014 ATR-based grid on BTC/ETH/SOL");
6765
- grid.command("start").description("Start the grid trading loop").option("--capital <usd>", "Starting capital in USD", "5000").option("--cycle <seconds>", "Cycle interval in seconds", "60").option("--tokens <list>", "Comma-separated token list", "bitcoin,ethereum,solana").option("--leverage <n>", "Leverage multiplier", "5").option("--levels <n>", "Grid levels per side", "15").option("--live", "enable live execution (places real orders on Hyperliquid)").option("--asset-indices <pairs>", "comma-separated token=index pairs (e.g. bitcoin=3,ethereum=4,solana=5)").option("--strategy <address>", "on-chain strategy contract address (enables on-chain executor)").option("--token-split <pairs>", "Comma-separated token=weight pairs (must sum to 1.0). Default: equal-weight.").action(async (opts) => {
6801
+ grid.command("start").description("Start the grid trading loop").option("--capital <usd>", "Starting capital in USD", "5000").option("--cycle <seconds>", "Cycle interval in seconds", "60").option("--tokens <list>", "Comma-separated token list", "bitcoin,ethereum,solana").option("--leverage <n>", "Leverage multiplier", String(DEFAULT_GRID_CONFIG.leverage)).option("--levels <n>", "Grid levels per side", String(DEFAULT_GRID_CONFIG.levelsPerSide)).option("--live", "enable live execution (places real orders on Hyperliquid)").option("--asset-indices <pairs>", "comma-separated token=index pairs (e.g. bitcoin=3,ethereum=4,solana=5)").option("--strategy <address>", "on-chain strategy contract address (enables on-chain executor)").option("--token-split <pairs>", "Comma-separated token=weight pairs (must sum to 1.0). Default: equal-weight.").action(async (opts) => {
6766
6802
  const capital = parseFloat(opts.capital);
6767
6803
  const cycleMs = parseInt(opts.cycle, 10) * 1e3;
6768
6804
  const tokens = opts.tokens.split(",").map((t) => t.trim());
@@ -6991,7 +7027,7 @@ try {
6991
7027
  var require2 = createRequire(import.meta.url);
6992
7028
  var { version: CLI_VERSION } = require2("../package.json");
6993
7029
  async function loadXmtp() {
6994
- return import("./xmtp-VJMC2TR2.js");
7030
+ return import("./xmtp-OCLOP5OY.js");
6995
7031
  }
6996
7032
  async function loadCron() {
6997
7033
  return import("./cron-EOULYO3R.js");
@@ -8141,7 +8177,7 @@ ${info.name} (${info.type})`);
8141
8177
  }
8142
8178
  });
8143
8179
  try {
8144
- const { registerChatCommands } = await import("./chat-JMQNUJGF.js");
8180
+ const { registerChatCommands } = await import("./chat-ZTFSH2BI.js");
8145
8181
  registerChatCommands(program);
8146
8182
  } catch {
8147
8183
  program.command("chat <name> [action] [actionArgs...]").description("Syndicate chat (XMTP) \u2014 requires @xmtp/cli").action(() => {
@@ -8151,7 +8187,7 @@ try {
8151
8187
  process.exit(1);
8152
8188
  });
8153
8189
  }
8154
- var { registerSessionCommands } = await import("./session-MVLCQDLG.js");
8190
+ var { registerSessionCommands } = await import("./session-HB3XXXKS.js");
8155
8191
  registerSessionCommands(program);
8156
8192
  registerVeniceCommands(program);
8157
8193
  registerAllowanceCommands(program);
@@ -8159,11 +8195,11 @@ registerIdentityCommands(program);
8159
8195
  registerProposalCommands(program);
8160
8196
  registerGovernorCommands(program);
8161
8197
  registerGuardianCommands(program);
8162
- var { registerResearchCommands } = await import("./research-AQE726DA.js");
8198
+ var { registerResearchCommands } = await import("./research-7ABHFSI2.js");
8163
8199
  registerResearchCommands(program);
8164
- var { registerAgentCommands } = await import("./agent-ER5GYBVQ.js");
8200
+ var { registerAgentCommands } = await import("./agent-VPUXRS7K.js");
8165
8201
  registerAgentCommands(program);
8166
- var { registerTradeCommands } = await import("./trade-FKC57GXZ.js");
8202
+ var { registerTradeCommands } = await import("./trade-XMOZ5ULE.js");
8167
8203
  registerTradeCommands(program);
8168
8204
  registerGridCommand(program);
8169
8205
  var configCmd = program.command("config");