@sherwoodagent/cli 0.8.0 → 0.10.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.
package/dist/index.js CHANGED
@@ -10,7 +10,7 @@ import {
10
10
  queryApprovals,
11
11
  queryJoinRequests,
12
12
  revokeAttestation
13
- } from "./chunk-VQP4XR67.js";
13
+ } from "./chunk-DTSTJUZH.js";
14
14
  import {
15
15
  approveDepositor,
16
16
  deposit,
@@ -28,7 +28,7 @@ import {
28
28
  setTextRecord,
29
29
  setVaultAddress,
30
30
  simulateBatch
31
- } from "./chunk-ARZIQ7YZ.js";
31
+ } from "./chunk-3EBFJLQR.js";
32
32
  import {
33
33
  AGENT_REGISTRY,
34
34
  EAS_SCHEMAS,
@@ -44,7 +44,7 @@ import {
44
44
  UNISWAP_QUOTER_V2_ABI,
45
45
  VENICE,
46
46
  VENICE_STAKING_ABI
47
- } from "./chunk-BXUNWV52.js";
47
+ } from "./chunk-SGYOOHML.js";
48
48
  import {
49
49
  VALID_NETWORKS,
50
50
  cacheGroupId,
@@ -934,7 +934,7 @@ function registerVeniceCommands(program2) {
934
934
  [assetAddress, totalDeposited, agents] = await Promise.all([
935
935
  client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: "asset" }),
936
936
  client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: "totalDeposited" }),
937
- client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: "getAgentOperators" })
937
+ client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: "getAgentAddresses" })
938
938
  ]);
939
939
  [assetDecimals, assetSymbol, assetBalance] = await Promise.all([
940
940
  client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: "decimals" }),
@@ -1101,7 +1101,7 @@ function registerVeniceCommands(program2) {
1101
1101
  const [assetAddress, totalDeposited, agents] = await Promise.all([
1102
1102
  client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: "asset" }),
1103
1103
  client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: "totalDeposited" }),
1104
- client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: "getAgentOperators" })
1104
+ client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: "getAgentAddresses" })
1105
1105
  ]);
1106
1106
  const [assetDecimals, assetSymbol, assetBalance] = await Promise.all([
1107
1107
  client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: "decimals" }),
@@ -1335,7 +1335,7 @@ function registerAllowanceCommands(program2) {
1335
1335
  [assetAddress, totalDeposited, agents] = await Promise.all([
1336
1336
  client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: "asset" }),
1337
1337
  client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: "totalDeposited" }),
1338
- client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: "getAgentOperators" })
1338
+ client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: "getAgentAddresses" })
1339
1339
  ]);
1340
1340
  [assetDecimals, assetSymbol, assetBalance] = await Promise.all([
1341
1341
  client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: "decimals" }),
@@ -1478,7 +1478,7 @@ function registerAllowanceCommands(program2) {
1478
1478
  const [assetAddress, totalDeposited, agents] = await Promise.all([
1479
1479
  client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: "asset" }),
1480
1480
  client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: "totalDeposited" }),
1481
- client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: "getAgentOperators" })
1481
+ client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: "getAgentAddresses" })
1482
1482
  ]);
1483
1483
  const [assetDecimals, assetSymbol, assetBalance] = await Promise.all([
1484
1484
  client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: "decimals" }),
@@ -1687,6 +1687,7 @@ import { readFileSync } from "fs";
1687
1687
 
1688
1688
  // src/lib/governor.ts
1689
1689
  var PROPOSAL_STATES = [
1690
+ "Draft",
1690
1691
  "Pending",
1691
1692
  "Approved",
1692
1693
  "Rejected",
@@ -1695,6 +1696,21 @@ var PROPOSAL_STATES = [
1695
1696
  "Settled",
1696
1697
  "Cancelled"
1697
1698
  ];
1699
+ var PROPOSAL_STATE = {
1700
+ Draft: 0,
1701
+ Pending: 1,
1702
+ Approved: 2,
1703
+ Rejected: 3,
1704
+ Expired: 4,
1705
+ Executed: 5,
1706
+ Settled: 6,
1707
+ Cancelled: 7
1708
+ };
1709
+ var VOTE_TYPE = {
1710
+ For: 0,
1711
+ Against: 1,
1712
+ Abstain: 2
1713
+ };
1698
1714
  function parseDuration(input2) {
1699
1715
  const match = input2.match(/^(\d+)(d|h|m|s)?$/);
1700
1716
  if (!match) throw new Error(`Invalid duration: ${input2}`);
@@ -1797,7 +1813,7 @@ async function getCapitalSnapshot(proposalId) {
1797
1813
  args: [proposalId]
1798
1814
  });
1799
1815
  }
1800
- async function propose(vault, metadataURI, performanceFeeBps, strategyDuration, calls, splitIndex) {
1816
+ async function propose(vault, metadataURI, performanceFeeBps, strategyDuration, calls, splitIndex, coProposers = []) {
1801
1817
  const wallet = getWalletClient();
1802
1818
  const client = getPublicClient();
1803
1819
  const hash = await wallet.writeContract({
@@ -1806,7 +1822,7 @@ async function propose(vault, metadataURI, performanceFeeBps, strategyDuration,
1806
1822
  address: getGovernorAddress(),
1807
1823
  abi: SYNDICATE_GOVERNOR_ABI,
1808
1824
  functionName: "propose",
1809
- args: [vault, metadataURI, performanceFeeBps, strategyDuration, calls, splitIndex]
1825
+ args: [vault, metadataURI, performanceFeeBps, strategyDuration, calls, splitIndex, coProposers]
1810
1826
  });
1811
1827
  const receipt = await client.waitForTransactionReceipt({ hash });
1812
1828
  let proposalId;
@@ -2119,7 +2135,7 @@ function registerProposalCommands(program2) {
2119
2135
  process.exit(1);
2120
2136
  }
2121
2137
  });
2122
- proposal.command("list").description("List proposals").option("--vault <address>", "Filter by vault").option("--state <filter>", "Filter by state: pending, approved, executed, settled, all", "all").action(async (opts) => {
2138
+ proposal.command("list").description("List proposals").option("--vault <address>", "Filter by vault").option("--state <filter>", "Filter by state: draft, pending, approved, executed, settled, all", "all").action(async (opts) => {
2123
2139
  const spinner = ora5("Loading proposals...").start();
2124
2140
  try {
2125
2141
  const count = await proposalCount();
@@ -2214,8 +2230,9 @@ function registerProposalCommands(program2) {
2214
2230
  console.log(LABEL(" Votes"));
2215
2231
  console.log(W(` For: ${formatShares(p.votesFor)}`));
2216
2232
  console.log(W(` Against: ${formatShares(p.votesAgainst)}`));
2233
+ console.log(W(` Abstain: ${formatShares(p.votesAbstain)}`));
2217
2234
  console.log(W(` Quorum: ${quorumNeeded}`));
2218
- if (state === 4 || state === 5) {
2235
+ if (state === PROPOSAL_STATE.Executed || state === PROPOSAL_STATE.Settled) {
2219
2236
  try {
2220
2237
  const cap = await getCapitalSnapshot(id);
2221
2238
  console.log();
@@ -2239,15 +2256,20 @@ function registerProposalCommands(program2) {
2239
2256
  process.exit(1);
2240
2257
  }
2241
2258
  });
2242
- proposal.command("vote").description("Cast a vote on a pending proposal").requiredOption("--id <proposalId>", "Proposal ID").requiredOption("--support <yes|no>", "Vote direction: yes or no").action(async (opts) => {
2259
+ proposal.command("vote").description("Cast a vote on a pending proposal").requiredOption("--id <proposalId>", "Proposal ID").requiredOption("--support <for|against|abstain>", "Vote direction: for, against, or abstain").action(async (opts) => {
2243
2260
  try {
2244
2261
  const proposalId = parseBigIntArg(opts.id, "proposal ID");
2245
- const support = opts.support.toLowerCase() === "yes";
2262
+ const supportRaw = String(opts.support).toLowerCase();
2263
+ const support = supportRaw === "yes" || supportRaw === "for" ? VOTE_TYPE.For : supportRaw === "no" || supportRaw === "against" ? VOTE_TYPE.Against : supportRaw === "abstain" ? VOTE_TYPE.Abstain : null;
2264
+ if (support === null) {
2265
+ console.error(chalk5.red(`Invalid support value "${opts.support}". Use for|against|abstain.`));
2266
+ process.exit(1);
2267
+ }
2246
2268
  const account = getAccount();
2247
2269
  const spinner = ora5("Loading proposal...").start();
2248
2270
  const p = await getProposal(proposalId);
2249
2271
  const state = await getProposalState(proposalId);
2250
- if (state !== 0) {
2272
+ if (state !== PROPOSAL_STATE.Pending) {
2251
2273
  spinner.fail(`Proposal is ${PROPOSAL_STATES[state] || "Unknown"}, not Pending`);
2252
2274
  process.exit(1);
2253
2275
  }
@@ -2263,7 +2285,9 @@ function registerProposalCommands(program2) {
2263
2285
  SEP();
2264
2286
  console.log(W(` Proposal: #${proposalId}`));
2265
2287
  console.log(W(` Vault: ${G(p.vault)}`));
2266
- console.log(W(` Support: ${support ? G("YES") : chalk5.red("NO")}`));
2288
+ console.log(W(
2289
+ ` Support: ${support === VOTE_TYPE.For ? G("FOR") : support === VOTE_TYPE.Against ? chalk5.red("AGAINST") : DIM("ABSTAIN")}`
2290
+ ));
2267
2291
  console.log(W(` Weight: ${formatShares(weight)} shares`));
2268
2292
  SEP();
2269
2293
  const voteSpinner = ora5({ text: W("Submitting vote..."), color: "green" }).start();
@@ -2282,7 +2306,7 @@ function registerProposalCommands(program2) {
2282
2306
  const proposalId = parseBigIntArg(opts.id, "proposal ID");
2283
2307
  const spinner = ora5("Loading proposal...").start();
2284
2308
  const state = await getProposalState(proposalId);
2285
- if (state !== 1) {
2309
+ if (state !== PROPOSAL_STATE.Approved) {
2286
2310
  spinner.fail(`Proposal is ${PROPOSAL_STATES[state] || "Unknown"}, not Approved`);
2287
2311
  process.exit(1);
2288
2312
  }
@@ -2309,7 +2333,7 @@ function registerProposalCommands(program2) {
2309
2333
  const spinner = ora5("Loading proposal...").start();
2310
2334
  const p = await getProposal(proposalId);
2311
2335
  const state = await getProposalState(proposalId);
2312
- if (state !== 4) {
2336
+ if (state !== PROPOSAL_STATE.Executed) {
2313
2337
  spinner.fail(`Proposal is ${PROPOSAL_STATES[state] || "Unknown"}, not Executed`);
2314
2338
  process.exit(1);
2315
2339
  }
@@ -2348,7 +2372,7 @@ function registerProposalCommands(program2) {
2348
2372
  const proposalId = parseBigIntArg(opts.id, "proposal ID");
2349
2373
  const spinner = ora5("Loading proposal...").start();
2350
2374
  const state = await getProposalState(proposalId);
2351
- if (state === 5 || state === 6) {
2375
+ if (state === PROPOSAL_STATE.Settled || state === PROPOSAL_STATE.Cancelled) {
2352
2376
  spinner.fail(`Proposal is already ${PROPOSAL_STATES[state]}`);
2353
2377
  process.exit(1);
2354
2378
  }
@@ -2358,7 +2382,7 @@ function registerProposalCommands(program2) {
2358
2382
  hash = await emergencyCancel(proposalId);
2359
2383
  spinner.succeed(G("Emergency cancelled"));
2360
2384
  } else {
2361
- if (state !== 0 && state !== 1) {
2385
+ if (state !== PROPOSAL_STATE.Draft && state !== PROPOSAL_STATE.Pending) {
2362
2386
  spinner.fail(`Proposal is ${PROPOSAL_STATES[state] || "Unknown"} \u2014 use --emergency for non-pending/approved`);
2363
2387
  process.exit(1);
2364
2388
  }
@@ -2502,7 +2526,7 @@ try {
2502
2526
  } catch {
2503
2527
  }
2504
2528
  async function loadXmtp() {
2505
- return import("./xmtp-A6F63GZH.js");
2529
+ return import("./xmtp-JC5AUYRG.js");
2506
2530
  }
2507
2531
  var G3 = chalk7.green;
2508
2532
  var W3 = chalk7.white;
@@ -2660,10 +2684,8 @@ syndicate.command("create").description("Create a new syndicate via the factory
2660
2684
  const creatorAddress = getAccount().address;
2661
2685
  await registerAgent(
2662
2686
  BigInt(agentIdStr),
2663
- creatorAddress,
2664
- // pkp = creator EOA (direct execution)
2665
2687
  creatorAddress
2666
- // operator = creator EOA
2688
+ // agentAddress = creator EOA (direct execution)
2667
2689
  );
2668
2690
  } catch (regErr) {
2669
2691
  console.warn(chalk7.yellow("\n \u26A0 Could not auto-register creator as agent \u2014 register manually with `syndicate add`"));
@@ -2850,7 +2872,7 @@ syndicate.command("remove-depositor").description("Remove an address from the de
2850
2872
  process.exit(1);
2851
2873
  }
2852
2874
  });
2853
- syndicate.command("add").description("Register an agent on a syndicate vault (creator only)").option("--vault <address>", "Vault address (default: from config)").requiredOption("--agent-id <id>", "Agent's ERC-8004 identity token ID").requiredOption("--pkp <address>", "Agent PKP address").requiredOption("--eoa <address>", "Operator EOA address").action(async (opts) => {
2875
+ syndicate.command("add").description("Register an agent on a syndicate vault (creator only)").option("--vault <address>", "Vault address (default: from config)").requiredOption("--agent-id <id>", "Agent's ERC-8004 identity token ID").requiredOption("--wallet <address>", "Agent wallet address").action(async (opts) => {
2854
2876
  const spinner = ora7("Verifying creator...").start();
2855
2877
  try {
2856
2878
  resolveVault(opts);
@@ -2864,8 +2886,7 @@ syndicate.command("add").description("Register an agent on a syndicate vault (cr
2864
2886
  spinner.text = "Registering agent...";
2865
2887
  const hash = await registerAgent(
2866
2888
  BigInt(opts.agentId),
2867
- opts.pkp,
2868
- opts.eoa
2889
+ opts.wallet
2869
2890
  );
2870
2891
  spinner.succeed(`Agent registered: ${hash}`);
2871
2892
  console.log(chalk7.dim(` ${getExplorerUrl(hash)}`));
@@ -2873,10 +2894,10 @@ syndicate.command("add").description("Register an agent on a syndicate vault (cr
2873
2894
  const xmtp = await loadXmtp();
2874
2895
  const xmtpClient = await xmtp.getXmtpClient();
2875
2896
  const group = await xmtp.getGroup(xmtpClient, subdomain);
2876
- await xmtp.addMember(group, opts.pkp);
2897
+ await xmtp.addMember(group, opts.wallet);
2877
2898
  await xmtp.sendEnvelope(group, {
2878
2899
  type: "AGENT_REGISTERED",
2879
- agent: { erc8004Id: Number(opts.agentId), address: opts.pkp },
2900
+ agent: { erc8004Id: Number(opts.agentId), address: opts.wallet },
2880
2901
  syndicate: subdomain,
2881
2902
  timestamp: Math.floor(Date.now() / 1e3)
2882
2903
  });
@@ -3017,7 +3038,7 @@ syndicate.command("requests").description("View pending join requests for a synd
3017
3038
  console.log();
3018
3039
  }
3019
3040
  console.log(G3(" To approve:"));
3020
- console.log(DIM3(` sherwood syndicate approve --agent-id <id> --pkp <addr> --eoa <addr>`));
3041
+ console.log(DIM3(` sherwood syndicate approve --agent-id <id> --wallet <addr>`));
3021
3042
  console.log(G3(" To reject:"));
3022
3043
  console.log(DIM3(` sherwood syndicate reject --attestation <uid>`));
3023
3044
  console.log();
@@ -3027,7 +3048,7 @@ syndicate.command("requests").description("View pending join requests for a synd
3027
3048
  process.exit(1);
3028
3049
  }
3029
3050
  });
3030
- syndicate.command("approve").description("Approve an agent join request (registers agent + creates EAS approval)").option("--vault <address>", "Vault address (default: from config)").option("--subdomain <name>", "Syndicate subdomain (alternative to --vault)").requiredOption("--agent-id <id>", "Agent's ERC-8004 identity token ID").requiredOption("--pkp <address>", "Agent PKP address").requiredOption("--eoa <address>", "Operator EOA address").action(async (opts) => {
3051
+ syndicate.command("approve").description("Approve an agent join request (registers agent + creates EAS approval)").option("--vault <address>", "Vault address (default: from config)").option("--subdomain <name>", "Syndicate subdomain (alternative to --vault)").requiredOption("--agent-id <id>", "Agent's ERC-8004 identity token ID").requiredOption("--wallet <address>", "Agent wallet address").action(async (opts) => {
3031
3052
  const spinner = ora7("Verifying creator...").start();
3032
3053
  try {
3033
3054
  if (opts.subdomain && !opts.vault) {
@@ -3047,8 +3068,7 @@ syndicate.command("approve").description("Approve an agent join request (registe
3047
3068
  try {
3048
3069
  const regHash = await registerAgent(
3049
3070
  BigInt(opts.agentId),
3050
- opts.pkp,
3051
- opts.eoa
3071
+ opts.wallet
3052
3072
  );
3053
3073
  console.log(DIM3(` Agent registered: ${getExplorerUrl(regHash)}`));
3054
3074
  } catch (regErr) {
@@ -3074,7 +3094,7 @@ syndicate.command("approve").description("Approve an agent join request (registe
3074
3094
  syndicateId,
3075
3095
  BigInt(opts.agentId),
3076
3096
  vaultAddress,
3077
- opts.eoa
3097
+ opts.wallet
3078
3098
  );
3079
3099
  approvalUid = result.uid;
3080
3100
  }
@@ -3083,10 +3103,10 @@ syndicate.command("approve").description("Approve an agent join request (registe
3083
3103
  const xmtp = await loadXmtp();
3084
3104
  const xmtpClient = await xmtp.getXmtpClient();
3085
3105
  const group = await xmtp.getGroup(xmtpClient, subdomain);
3086
- await xmtp.addMember(group, opts.pkp);
3106
+ await xmtp.addMember(group, opts.wallet);
3087
3107
  await xmtp.sendEnvelope(group, {
3088
3108
  type: "AGENT_REGISTERED",
3089
- agent: { erc8004Id: Number(opts.agentId), address: opts.pkp },
3109
+ agent: { erc8004Id: Number(opts.agentId), address: opts.wallet },
3090
3110
  syndicate: subdomain,
3091
3111
  timestamp: Math.floor(Date.now() / 1e3)
3092
3112
  });
@@ -3100,8 +3120,7 @@ syndicate.command("approve").description("Approve an agent join request (registe
3100
3120
  console.log(LABEL3(" \u25C6 Agent Approved"));
3101
3121
  SEP3();
3102
3122
  console.log(W3(` Agent ID: #${opts.agentId}`));
3103
- console.log(W3(` PKP: ${G3(opts.pkp)}`));
3104
- console.log(W3(` EOA: ${G3(opts.eoa)}`));
3123
+ console.log(W3(` Wallet: ${G3(opts.wallet)}`));
3105
3124
  console.log(W3(` Approval: ${DIM3(approvalUid)}`));
3106
3125
  console.log(W3(` EAS Scan: ${DIM3(getEasScanUrl(approvalUid))}`));
3107
3126
  SEP3();
@@ -3282,7 +3301,7 @@ ${info.name} (${info.type})`);
3282
3301
  }
3283
3302
  });
3284
3303
  try {
3285
- const { registerChatCommands } = await import("./chat-O34BTHII.js");
3304
+ const { registerChatCommands } = await import("./chat-4Q7G3DFO.js");
3286
3305
  registerChatCommands(program);
3287
3306
  } catch {
3288
3307
  program.command("chat <name> [action] [actionArgs...]").description("Syndicate chat (XMTP) \u2014 requires @xmtp/cli").action(() => {
@@ -3292,14 +3311,14 @@ try {
3292
3311
  process.exit(1);
3293
3312
  });
3294
3313
  }
3295
- var { registerSessionCommands } = await import("./session-QEIVURQO.js");
3314
+ var { registerSessionCommands } = await import("./session-FVFIACYW.js");
3296
3315
  registerSessionCommands(program);
3297
3316
  registerVeniceCommands(program);
3298
3317
  registerAllowanceCommands(program);
3299
3318
  registerIdentityCommands(program);
3300
3319
  registerProposalCommands(program);
3301
3320
  registerGovernorCommands(program);
3302
- var { registerResearchCommands } = await import("./research-GX32VMP7.js");
3321
+ var { registerResearchCommands } = await import("./research-3XEIOMDP.js");
3303
3322
  registerResearchCommands(program);
3304
3323
  var configCmd = program.command("config");
3305
3324
  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").action((opts) => {