@sherwoodagent/cli 0.41.4 → 0.42.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 (54) hide show
  1. package/dist/{addresses-JBIU5U3T.js → addresses-DCQMJJFI.js} +4 -4
  2. package/dist/{agent-LBF6OZRW.js → agent-5YEJ6W6W.js} +6 -6
  3. package/dist/{chat-3GE6474H.js → chat-UWJ6JBFE.js} +8 -8
  4. package/dist/{chunk-WCBG44IQ.js → chunk-4EHI4SKM.js} +25 -1
  5. package/dist/chunk-4EHI4SKM.js.map +1 -0
  6. package/dist/{chunk-AGKCDHKI.js → chunk-4OAZ7TP5.js} +4 -4
  7. package/dist/{chunk-JJ4EF7ZE.js → chunk-5Q3VT6NQ.js} +25 -6
  8. package/dist/{chunk-JJ4EF7ZE.js.map → chunk-5Q3VT6NQ.js.map} +1 -1
  9. package/dist/{chunk-JGJAKTKK.js → chunk-6U3A6ZJ2.js} +5 -5
  10. package/dist/{chunk-IJG4CTOI.js → chunk-FOOZC4AM.js} +12 -2
  11. package/dist/{chunk-IJG4CTOI.js.map → chunk-FOOZC4AM.js.map} +1 -1
  12. package/dist/{chunk-DNX3P5YK.js → chunk-GMVDHSCF.js} +2 -2
  13. package/dist/{chunk-CECQNUS6.js → chunk-JNDEZFXW.js} +110 -68
  14. package/dist/chunk-JNDEZFXW.js.map +1 -0
  15. package/dist/{chunk-OFR3LCYE.js → chunk-SWKHSKDH.js} +3 -3
  16. package/dist/{chunk-ARHM3CYN.js → chunk-T2IA6CCW.js} +4 -4
  17. package/dist/{chunk-VMNB4ARO.js → chunk-XAUMJZU2.js} +2 -2
  18. package/dist/{client-HKAG55PQ.js → client-DRVUILER.js} +4 -4
  19. package/dist/{config-LS7FKZL5.js → config-YRERDZSL.js} +2 -2
  20. package/dist/{eas-27JA63VQ.js → eas-KBU2BAOD.js} +16 -6
  21. package/dist/{governor-YLZJIQOB.js → governor-KH7RNH2E.js} +6 -6
  22. package/dist/index.js +163 -45
  23. package/dist/index.js.map +1 -1
  24. package/dist/{network-KSMKPKNL.js → network-3HB46JMQ.js} +7 -5
  25. package/dist/{price-5RAPTAYW.js → price-TTQWI672.js} +5 -5
  26. package/dist/{research-HDEPP2SL.js → research-J3HYU3N6.js} +9 -9
  27. package/dist/research-NR4VC5LN.js +14 -0
  28. package/dist/{session-EST3O7W3.js → session-NUPHC6ZN.js} +10 -10
  29. package/dist/{trade-XTLUZJB6.js → trade-VGECC4QZ.js} +16 -16
  30. package/dist/{xmtp-LPCRZRHX.js → xmtp-JO7W6RFK.js} +6 -6
  31. package/package.json +1 -1
  32. package/dist/chunk-CECQNUS6.js.map +0 -1
  33. package/dist/chunk-WCBG44IQ.js.map +0 -1
  34. package/dist/research-4UA4UB5P.js +0 -14
  35. /package/dist/{addresses-JBIU5U3T.js.map → addresses-DCQMJJFI.js.map} +0 -0
  36. /package/dist/{agent-LBF6OZRW.js.map → agent-5YEJ6W6W.js.map} +0 -0
  37. /package/dist/{chat-3GE6474H.js.map → chat-UWJ6JBFE.js.map} +0 -0
  38. /package/dist/{chunk-AGKCDHKI.js.map → chunk-4OAZ7TP5.js.map} +0 -0
  39. /package/dist/{chunk-JGJAKTKK.js.map → chunk-6U3A6ZJ2.js.map} +0 -0
  40. /package/dist/{chunk-DNX3P5YK.js.map → chunk-GMVDHSCF.js.map} +0 -0
  41. /package/dist/{chunk-OFR3LCYE.js.map → chunk-SWKHSKDH.js.map} +0 -0
  42. /package/dist/{chunk-ARHM3CYN.js.map → chunk-T2IA6CCW.js.map} +0 -0
  43. /package/dist/{chunk-VMNB4ARO.js.map → chunk-XAUMJZU2.js.map} +0 -0
  44. /package/dist/{client-HKAG55PQ.js.map → client-DRVUILER.js.map} +0 -0
  45. /package/dist/{config-LS7FKZL5.js.map → config-YRERDZSL.js.map} +0 -0
  46. /package/dist/{eas-27JA63VQ.js.map → eas-KBU2BAOD.js.map} +0 -0
  47. /package/dist/{governor-YLZJIQOB.js.map → governor-KH7RNH2E.js.map} +0 -0
  48. /package/dist/{network-KSMKPKNL.js.map → network-3HB46JMQ.js.map} +0 -0
  49. /package/dist/{price-5RAPTAYW.js.map → price-TTQWI672.js.map} +0 -0
  50. /package/dist/{research-HDEPP2SL.js.map → research-J3HYU3N6.js.map} +0 -0
  51. /package/dist/{research-4UA4UB5P.js.map → research-NR4VC5LN.js.map} +0 -0
  52. /package/dist/{session-EST3O7W3.js.map → session-NUPHC6ZN.js.map} +0 -0
  53. /package/dist/{trade-XTLUZJB6.js.map → trade-VGECC4QZ.js.map} +0 -0
  54. /package/dist/{xmtp-LPCRZRHX.js.map → xmtp-JO7W6RFK.js.map} +0 -0
package/dist/index.js CHANGED
@@ -9,24 +9,25 @@ import {
9
9
  getQuote,
10
10
  listModels,
11
11
  provisionApiKey
12
- } from "./chunk-JGJAKTKK.js";
12
+ } from "./chunk-6U3A6ZJ2.js";
13
13
  import {
14
14
  createApproval,
15
15
  createJoinRequest,
16
+ getEasExplorerUrl,
16
17
  getEasScanUrl,
17
18
  parseReferrer,
18
19
  queryApprovals,
19
20
  queryJoinRequests,
20
- revokeAttestation,
21
+ revokeJoinRequest,
21
22
  stripReferrerPrefix
22
- } from "./chunk-CECQNUS6.js";
23
+ } from "./chunk-JNDEZFXW.js";
23
24
  import {
24
25
  createSyndicate,
25
26
  getActiveSyndicates,
26
27
  getSyndicate,
27
28
  subdomainExists,
28
29
  updateMetadata
29
- } from "./chunk-AGKCDHKI.js";
30
+ } from "./chunk-4OAZ7TP5.js";
30
31
  import {
31
32
  approveDepositor,
32
33
  deposit,
@@ -47,9 +48,10 @@ import {
47
48
  removeDepositor,
48
49
  resolveSyndicate,
49
50
  resolveVaultSyndicate,
51
+ searchSyndicateAcrossChains,
50
52
  setTextRecord,
51
53
  setVaultAddress
52
- } from "./chunk-JJ4EF7ZE.js";
54
+ } from "./chunk-5Q3VT6NQ.js";
53
55
  import {
54
56
  PROPOSAL_STATE,
55
57
  PROPOSAL_STATES,
@@ -81,12 +83,11 @@ import {
81
83
  setVotingPeriod,
82
84
  settleProposal,
83
85
  vote
84
- } from "./chunk-ARHM3CYN.js";
86
+ } from "./chunk-T2IA6CCW.js";
85
87
  import {
86
88
  AERODROME,
87
89
  AGENT_REGISTRY,
88
90
  CHAINLINK,
89
- EAS_SCHEMAS,
90
91
  MOONWELL,
91
92
  SHERWOOD,
92
93
  STRATEGY_TEMPLATES,
@@ -94,7 +95,7 @@ import {
94
95
  TOKENS,
95
96
  UNISWAP,
96
97
  VENICE
97
- } from "./chunk-VMNB4ARO.js";
98
+ } from "./chunk-XAUMJZU2.js";
98
99
  import {
99
100
  formatContractError,
100
101
  getAccount,
@@ -103,7 +104,7 @@ import {
103
104
  sendTxWithRetry,
104
105
  waitForReceipt,
105
106
  writeContractWithRetry
106
- } from "./chunk-OFR3LCYE.js";
107
+ } from "./chunk-SWKHSKDH.js";
107
108
  import {
108
109
  CHAIN_REGISTRY,
109
110
  VALID_NETWORKS,
@@ -112,8 +113,9 @@ import {
112
113
  getNetwork,
113
114
  getRpcUrl,
114
115
  isTestnet,
115
- setNetwork
116
- } from "./chunk-IJG4CTOI.js";
116
+ setNetwork,
117
+ withNetwork
118
+ } from "./chunk-FOOZC4AM.js";
117
119
  import {
118
120
  addSyndicate,
119
121
  cacheGroupId,
@@ -136,7 +138,7 @@ import {
136
138
  setPrivateKey,
137
139
  setUniswapApiKey,
138
140
  setVeniceApiKey
139
- } from "./chunk-WCBG44IQ.js";
141
+ } from "./chunk-4EHI4SKM.js";
140
142
  import {
141
143
  BASE_STRATEGY_ABI,
142
144
  ERC20_ABI,
@@ -1445,9 +1447,9 @@ function registerStrategyTemplateCommands(strategy2) {
1445
1447
  console.error(chalk.red("Missing --name, --performance-fee, or --duration. Use --write-calls to skip proposal submission."));
1446
1448
  process.exit(1);
1447
1449
  }
1448
- const { propose: propose2 } = await import("./governor-YLZJIQOB.js");
1450
+ const { propose: propose2 } = await import("./governor-KH7RNH2E.js");
1449
1451
  const { pinJSON } = await import("./ipfs-IGXLLJCF.js");
1450
- const { parseDuration: parseDuration2 } = await import("./governor-YLZJIQOB.js");
1452
+ const { parseDuration: parseDuration2 } = await import("./governor-KH7RNH2E.js");
1451
1453
  const performanceFeeBps = BigInt(opts.performanceFee);
1452
1454
  if (performanceFeeBps < 0n || performanceFeeBps > 10000n) {
1453
1455
  console.error(chalk.red("--performance-fee must be 0-10000 (basis points)"));
@@ -1554,7 +1556,7 @@ function registerStrategyTemplateCommands(strategy2) {
1554
1556
  let prices = [];
1555
1557
  let priceSource = null;
1556
1558
  try {
1557
- const { getTokenPricesInAsset } = await import("./price-5RAPTAYW.js");
1559
+ const { getTokenPricesInAsset } = await import("./price-TTQWI672.js");
1558
1560
  prices = await getTokenPricesInAsset({
1559
1561
  tokens: allocations.map((a, i) => ({
1560
1562
  token: a.token,
@@ -1984,7 +1986,7 @@ function registerVeniceCommands(program2) {
1984
1986
  console.log(chalk2.dim(` Key: ${apiKey.slice(0, 8)}...${apiKey.slice(-4)}`));
1985
1987
  console.log(chalk2.dim(" Saved to ~/.sherwood/config.json"));
1986
1988
  try {
1987
- const { createVeniceProvisionAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-27JA63VQ.js");
1989
+ const { createVeniceProvisionAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-KBU2BAOD.js");
1988
1990
  const { uid } = await createVeniceProvisionAttestation(account.address);
1989
1991
  if (uid !== "0x0000000000000000000000000000000000000000000000000000000000000000") {
1990
1992
  console.log(chalk2.dim(` Attested: ${getEasScanUrl2(uid)}`));
@@ -2340,10 +2342,10 @@ ${opts.prompt}`;
2340
2342
  console.log(chalk2.dim(`Model: ${result.model} | Tokens: ${result.usage.promptTokens} in, ${result.usage.completionTokens} out, ${result.usage.totalTokens} total`));
2341
2343
  }
2342
2344
  try {
2343
- const { createVeniceInferenceAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-27JA63VQ.js");
2345
+ const { createVeniceInferenceAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-KBU2BAOD.js");
2344
2346
  const { keccak256, toHex, isAddress: isAddr } = await import("viem");
2345
- const { getChainContracts: getChainContracts2 } = await import("./config-LS7FKZL5.js");
2346
- const { getChain: getActiveChain } = await import("./network-KSMKPKNL.js");
2347
+ const { getChainContracts: getChainContracts2 } = await import("./config-YRERDZSL.js");
2348
+ const { getChain: getActiveChain } = await import("./network-3HB46JMQ.js");
2347
2349
  const vaultRecipient = opts.vault && isAddr(opts.vault) ? opts.vault : getChainContracts2(getActiveChain().id).vault;
2348
2350
  const promptHash = keccak256(toHex(userContent)).slice(0, 18);
2349
2351
  const { uid } = await createVeniceInferenceAttestation(
@@ -2738,6 +2740,50 @@ function registerIdentityCommands(program2) {
2738
2740
  process.exit(1);
2739
2741
  }
2740
2742
  });
2743
+ identity.command("find").description("Search ERC-8004 agents by wallet address or name (recover a lost agent ID)").option("--wallet <address>", "Filter by owner / wallet address").option("--name <text>", "Filter by agent name (exact or substring match, depending on registry)").option("--all-chains", "Search across all chains, not just the active one").action(async (opts) => {
2744
+ if (!opts.wallet && !opts.name) {
2745
+ console.error(chalk4.red("Pass --wallet <address> or --name <text> (or both)."));
2746
+ process.exit(1);
2747
+ }
2748
+ const spinner = ora4("Searching ERC-8004 registry...").start();
2749
+ try {
2750
+ const sdk = getAgent0SDK();
2751
+ const filters = {};
2752
+ if (opts.wallet) filters.walletAddress = opts.wallet;
2753
+ if (opts.name) filters.name = opts.name;
2754
+ filters.chains = opts.allChains ? "all" : [getChain().id];
2755
+ const results = await sdk.searchAgents(filters);
2756
+ spinner.stop();
2757
+ if (results.length === 0) {
2758
+ console.log(chalk4.dim("No agents found matching those filters."));
2759
+ console.log(chalk4.dim("If you minted on a different chain, retry with --all-chains."));
2760
+ return;
2761
+ }
2762
+ console.log();
2763
+ console.log(chalk4.bold(`Found ${results.length} agent${results.length === 1 ? "" : "s"}`));
2764
+ console.log(chalk4.dim("\u2500".repeat(50)));
2765
+ for (const a of results) {
2766
+ const idStr = String(a.agentId);
2767
+ const tokenId = idStr.includes(":") ? idStr.split(":")[1] : idStr;
2768
+ console.log(` ${chalk4.bold(`#${tokenId}`)} ${a.name || chalk4.dim("(no name)")}`);
2769
+ console.log(chalk4.dim(` Chain: ${a.chainId}`));
2770
+ console.log(chalk4.dim(` Full: ${idStr}`));
2771
+ if (a.owners?.length) {
2772
+ console.log(chalk4.dim(` Owner: ${a.owners[0]}`));
2773
+ }
2774
+ if (a.walletAddress) {
2775
+ console.log(chalk4.dim(` Wallet: ${a.walletAddress}`));
2776
+ }
2777
+ }
2778
+ console.log();
2779
+ console.log(chalk4.green("To bind one of these to this machine:"));
2780
+ console.log(chalk4.dim(` sherwood identity load --id <tokenId>`));
2781
+ } catch (err) {
2782
+ spinner.fail("Search failed");
2783
+ console.error(chalk4.red(formatContractError(err)));
2784
+ process.exit(1);
2785
+ }
2786
+ });
2741
2787
  identity.command("status").description("Show your agent identity status").action(async () => {
2742
2788
  const account = getAccount();
2743
2789
  const registry2 = AGENT_REGISTRY().IDENTITY_REGISTRY;
@@ -3472,8 +3518,8 @@ function printSimulationResult(result, callType) {
3472
3518
  }
3473
3519
  async function sendSimulationAlert(subdomain, proposalId, vault, execResult, settleResult) {
3474
3520
  try {
3475
- const xmtp = await import("./xmtp-LPCRZRHX.js");
3476
- const { getAccount: getAccount2 } = await import("./client-HKAG55PQ.js");
3521
+ const xmtp = await import("./xmtp-JO7W6RFK.js");
3522
+ const { getAccount: getAccount2 } = await import("./client-DRVUILER.js");
3477
3523
  const group = await xmtp.getGroup("", subdomain);
3478
3524
  const allRisks = [...execResult.risks, ...settleResult?.risks ?? []];
3479
3525
  const criticals = allRisks.filter((r) => r.level === "critical");
@@ -4572,7 +4618,7 @@ try {
4572
4618
  var require2 = createRequire(import.meta.url);
4573
4619
  var { version: CLI_VERSION } = require2("../package.json");
4574
4620
  async function loadXmtp() {
4575
- return import("./xmtp-LPCRZRHX.js");
4621
+ return import("./xmtp-JO7W6RFK.js");
4576
4622
  }
4577
4623
  async function loadCron() {
4578
4624
  return import("./cron-EOULYO3R.js");
@@ -4858,11 +4904,36 @@ syndicate.command("create").description("Create a new syndicate via the factory
4858
4904
  process.exit(1);
4859
4905
  }
4860
4906
  });
4861
- syndicate.command("list").description("List active syndicates (queries subgraph, falls back to on-chain)").option("--creator <address>", "Filter by creator address").action(async (opts) => {
4907
+ syndicate.command("list").description("List active syndicates (queries subgraph, falls back to on-chain)").option("--creator <address>", "Filter by creator address").option("--all-chains", "Aggregate active syndicates across all supported chains (on-chain only)").action(async (opts) => {
4862
4908
  const spinner = ora8("Loading syndicates...").start();
4863
4909
  try {
4864
- let syndicates;
4865
- if (process.env.SUBGRAPH_URL) {
4910
+ let syndicates = [];
4911
+ if (opts.allChains) {
4912
+ const includeTestnets = process.env.ENABLE_TESTNET === "true";
4913
+ const targets = VALID_NETWORKS.filter((n) => includeTestnets || !["base-sepolia", "robinhood-testnet", "hyperevm-testnet"].includes(n));
4914
+ for (const net of targets) {
4915
+ spinner.text = `Loading from ${net}...`;
4916
+ try {
4917
+ const rows = await withNetwork(net, () => getActiveSyndicates());
4918
+ for (const s of rows) {
4919
+ syndicates.push({
4920
+ id: s.id.toString(),
4921
+ vault: s.vault,
4922
+ creator: s.creator,
4923
+ metadataURI: s.metadataURI,
4924
+ createdAt: s.createdAt.toString(),
4925
+ subdomain: s.subdomain,
4926
+ chain: net
4927
+ });
4928
+ }
4929
+ } catch {
4930
+ }
4931
+ }
4932
+ if (opts.creator) {
4933
+ const c = String(opts.creator).toLowerCase();
4934
+ syndicates = syndicates.filter((s) => s.creator.toLowerCase() === c);
4935
+ }
4936
+ } else if (process.env.SUBGRAPH_URL) {
4866
4937
  const result = await getActiveSyndicates2(opts.creator);
4867
4938
  syndicates = result;
4868
4939
  } else {
@@ -4883,15 +4954,19 @@ syndicate.command("list").description("List active syndicates (queries subgraph,
4883
4954
  }
4884
4955
  console.log();
4885
4956
  console.log(chalk9.bold(`Active Syndicates (${syndicates.length})`));
4886
- if (!process.env.SUBGRAPH_URL) {
4957
+ if (!process.env.SUBGRAPH_URL && !opts.allChains) {
4887
4958
  console.log(chalk9.dim(" (Set SUBGRAPH_URL for faster indexed queries)"));
4888
4959
  }
4960
+ if (opts.allChains) {
4961
+ console.log(chalk9.dim(" (Aggregated across chains via on-chain factory calls; SUBGRAPH_URL is single-chain only)"));
4962
+ }
4889
4963
  console.log(chalk9.dim("\u2500".repeat(70)));
4890
4964
  for (const s of syndicates) {
4891
4965
  const ts = typeof s.createdAt === "string" ? Number(s.createdAt) : Number(s.createdAt);
4892
4966
  const date = new Date(ts * 1e3).toLocaleDateString();
4893
4967
  const ensName = s.subdomain ? `${s.subdomain}.sherwoodagent.eth` : "";
4894
- console.log(` #${s.id} ${chalk9.bold(ensName || String(s.vault))}`);
4968
+ const chainTag = s.chain ? chalk9.dim(`[${s.chain}] `) : "";
4969
+ console.log(` ${chainTag}#${s.id} ${chalk9.bold(ensName || String(s.vault))}`);
4895
4970
  if (ensName) console.log(` Vault: ${chalk9.cyan(String(s.vault))}`);
4896
4971
  console.log(` Creator: ${s.creator}`);
4897
4972
  console.log(` Created: ${date}`);
@@ -4913,14 +4988,42 @@ syndicate.command("info").description("Display syndicate details by ID or subdom
4913
4988
  const spinner = ora8("Loading syndicate info...").start();
4914
4989
  try {
4915
4990
  let id;
4991
+ let crossChainHint = null;
4992
+ let infoOverride = null;
4916
4993
  if (/^\d+$/.test(idStr)) {
4917
4994
  id = BigInt(idStr);
4918
4995
  } else {
4919
- const resolved = await resolveSyndicate(idStr);
4920
- id = resolved.id;
4996
+ try {
4997
+ const resolved = await resolveSyndicate(idStr);
4998
+ id = resolved.id;
4999
+ } catch {
5000
+ spinner.text = `Searching across chains...`;
5001
+ const hits = await searchSyndicateAcrossChains(idStr);
5002
+ if (hits.length === 0) {
5003
+ spinner.fail(`Syndicate "${idStr}" not found on any supported chain`);
5004
+ process.exit(1);
5005
+ }
5006
+ const active = getNetwork();
5007
+ const primary = hits.find((h) => h.network === active) ?? hits[0];
5008
+ id = primary.result.id;
5009
+ infoOverride = await withNetwork(
5010
+ primary.network,
5011
+ () => getSyndicate(primary.result.id)
5012
+ );
5013
+ crossChainHint = {
5014
+ network: primary.network,
5015
+ others: hits.filter((h) => h.network !== primary.network).map((h) => h.network)
5016
+ };
5017
+ }
4921
5018
  }
4922
- const info = await getSyndicate(id);
5019
+ const info = infoOverride ?? await getSyndicate(id);
4923
5020
  spinner.stop();
5021
+ if (crossChainHint) {
5022
+ const others = crossChainHint.others.length > 0 ? ` (also on: ${crossChainHint.others.join(", ")})` : "";
5023
+ console.log(chalk9.yellow(` Found on chain: ${chalk9.bold(crossChainHint.network)}${others}`));
5024
+ console.log(chalk9.dim(` Re-run with --chain ${crossChainHint.network} to interact with this syndicate.`));
5025
+ console.log();
5026
+ }
4924
5027
  if (!info.vault || info.vault === "0x0000000000000000000000000000000000000000") {
4925
5028
  console.log(chalk9.red(`Syndicate #${id} not found.`));
4926
5029
  process.exit(1);
@@ -4946,7 +5049,7 @@ syndicate.command("info").description("Display syndicate details by ID or subdom
4946
5049
  }
4947
5050
  }
4948
5051
  setVaultAddress(info.vault);
4949
- const vaultInfo = await getVaultInfo();
5052
+ const vaultInfo = crossChainHint ? await withNetwork(crossChainHint.network, () => getVaultInfo()) : await getVaultInfo();
4950
5053
  console.log();
4951
5054
  console.log(chalk9.bold(" Vault Stats"));
4952
5055
  console.log(` Total Assets: ${vaultInfo.totalAssets}`);
@@ -5040,7 +5143,7 @@ syndicate.command("add").description("Register an agent on a syndicate vault (cr
5040
5143
  if (opts.agentId) {
5041
5144
  agentId = BigInt(opts.agentId);
5042
5145
  } else {
5043
- const { AGENT_REGISTRY: AGENT_REGISTRY2 } = await import("./addresses-JBIU5U3T.js");
5146
+ const { AGENT_REGISTRY: AGENT_REGISTRY2 } = await import("./addresses-DCQMJJFI.js");
5044
5147
  const registry2 = AGENT_REGISTRY2().IDENTITY_REGISTRY;
5045
5148
  if (registry2 === "0x0000000000000000000000000000000000000000") {
5046
5149
  agentId = 0n;
@@ -5154,7 +5257,25 @@ syndicate.command("join").description("Request to join a syndicate (creates an E
5154
5257
  spinner.fail("No agent identity found. Run 'sherwood identity mint' first.");
5155
5258
  process.exit(1);
5156
5259
  }
5157
- const syndicate2 = await resolveSyndicate(subdomain);
5260
+ let syndicate2;
5261
+ try {
5262
+ syndicate2 = await resolveSyndicate(subdomain);
5263
+ } catch {
5264
+ spinner.text = "Searching across chains...";
5265
+ const hits = await searchSyndicateAcrossChains(subdomain);
5266
+ spinner.fail(`Syndicate "${subdomain}" not found on ${getNetwork()}`);
5267
+ if (hits.length === 0) {
5268
+ console.error(chalk9.red(` Not found on any supported chain.`));
5269
+ } else if (hits.length === 1) {
5270
+ console.error(chalk9.yellow(` Found on chain: ${chalk9.bold(hits[0].network)}`));
5271
+ console.error(chalk9.dim(` Re-run: sherwood --chain ${hits[0].network} syndicate join --subdomain ${subdomain}`));
5272
+ } else {
5273
+ const chains = hits.map((h) => h.network).join(", ");
5274
+ console.error(chalk9.yellow(` Found on chains: ${chalk9.bold(chains)}`));
5275
+ console.error(chalk9.dim(` Specify which chain to join with --chain <network>.`));
5276
+ }
5277
+ process.exit(1);
5278
+ }
5158
5279
  const callerAddress = getAccount().address;
5159
5280
  spinner.text = "Checking membership...";
5160
5281
  setVaultAddress(syndicate2.vault);
@@ -5237,7 +5358,7 @@ syndicate.command("join").description("Request to join a syndicate (creates an E
5237
5358
  console.log(W5(` Creator: ${DIM5(syndicate2.creator)}`));
5238
5359
  console.log(W5(` Attestation: ${DIM5(uid)}`));
5239
5360
  console.log(W5(` EAS Scan: ${DIM5(getEasScanUrl(uid))}`));
5240
- console.log(W5(` Explorer: ${DIM5(getExplorerUrl(hash))}`));
5361
+ console.log(W5(` Explorer: ${DIM5(getEasExplorerUrl(hash))}`));
5241
5362
  SEP5();
5242
5363
  console.log(G5(" \u2713 Syndicate saved to ~/.sherwood/config.json (set as primary)"));
5243
5364
  console.log(G5(" \u2713 The creator can review with:"));
@@ -5409,12 +5530,9 @@ syndicate.command("approve").description("Approve an agent join request (registe
5409
5530
  syndicate.command("reject").description("Reject a join request by revoking its attestation").requiredOption("--attestation <uid>", "Join request attestation UID to revoke").action(async (opts) => {
5410
5531
  const spinner = ora8("Revoking attestation...").start();
5411
5532
  try {
5412
- const hash = await revokeAttestation(
5413
- EAS_SCHEMAS().SYNDICATE_JOIN_REQUEST,
5414
- opts.attestation
5415
- );
5533
+ const hash = await revokeJoinRequest(opts.attestation);
5416
5534
  spinner.succeed("Join request rejected");
5417
- console.log(DIM5(` ${getExplorerUrl(hash)}`));
5535
+ console.log(DIM5(` ${getEasExplorerUrl(hash)}`));
5418
5536
  } catch (err) {
5419
5537
  spinner.fail("Rejection failed");
5420
5538
  console.error(chalk9.red(formatContractError(err)));
@@ -5639,7 +5757,7 @@ vaultCmd.command("redeem").description("Redeem vault shares for the underlying a
5639
5757
  var strategy = program.command("strategy").description("Strategy templates \u2014 list, clone, propose");
5640
5758
  registerStrategyTemplateCommands(strategy);
5641
5759
  program.command("providers").description("List available DeFi providers").action(async () => {
5642
- const { MessariProvider, NansenProvider } = await import("./research-4UA4UB5P.js");
5760
+ const { MessariProvider, NansenProvider } = await import("./research-NR4VC5LN.js");
5643
5761
  const providers = [new MoonwellProvider(), new UniswapProvider(), new MessariProvider(), new NansenProvider()];
5644
5762
  for (const p of providers) {
5645
5763
  const info = p.info();
@@ -5650,7 +5768,7 @@ ${info.name} (${info.type})`);
5650
5768
  }
5651
5769
  });
5652
5770
  try {
5653
- const { registerChatCommands } = await import("./chat-3GE6474H.js");
5771
+ const { registerChatCommands } = await import("./chat-UWJ6JBFE.js");
5654
5772
  registerChatCommands(program);
5655
5773
  } catch {
5656
5774
  program.command("chat <name> [action] [actionArgs...]").description("Syndicate chat (XMTP) \u2014 requires @xmtp/cli").action(() => {
@@ -5660,7 +5778,7 @@ try {
5660
5778
  process.exit(1);
5661
5779
  });
5662
5780
  }
5663
- var { registerSessionCommands } = await import("./session-EST3O7W3.js");
5781
+ var { registerSessionCommands } = await import("./session-NUPHC6ZN.js");
5664
5782
  registerSessionCommands(program);
5665
5783
  registerVeniceCommands(program);
5666
5784
  registerAllowanceCommands(program);
@@ -5668,11 +5786,11 @@ registerIdentityCommands(program);
5668
5786
  registerProposalCommands(program);
5669
5787
  registerGovernorCommands(program);
5670
5788
  registerGuardianCommands(program);
5671
- var { registerResearchCommands } = await import("./research-HDEPP2SL.js");
5789
+ var { registerResearchCommands } = await import("./research-J3HYU3N6.js");
5672
5790
  registerResearchCommands(program);
5673
- var { registerAgentCommands } = await import("./agent-LBF6OZRW.js");
5791
+ var { registerAgentCommands } = await import("./agent-5YEJ6W6W.js");
5674
5792
  registerAgentCommands(program);
5675
- var { registerTradeCommands } = await import("./trade-XTLUZJB6.js");
5793
+ var { registerTradeCommands } = await import("./trade-VGECC4QZ.js");
5676
5794
  registerTradeCommands(program);
5677
5795
  var configCmd = program.command("config");
5678
5796
  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.)").option("--uniswap-api-key <key>", "Uniswap Trading API key (from developers.uniswap.org)").option("--venice-api-key <key>", "Venice AI inference API key").option("--xmtp-group <subdomain:groupId>", "Cache an XMTP group ID for a syndicate (e.g. my-fund:abc123)").action((opts) => {