@sherwoodagent/cli 0.29.1 → 0.38.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 (57) hide show
  1. package/dist/{addresses-NOWMJT4H.js → addresses-6GJP2WAY.js} +4 -4
  2. package/dist/{agent-U6OFXITU.js → agent-TB7VNLFH.js} +1085 -296
  3. package/dist/agent-TB7VNLFH.js.map +1 -0
  4. package/dist/{chat-SIB6GCJF.js → chat-36TB53HK.js} +9 -9
  5. package/dist/{chunk-7W6U6ZC6.js → chunk-4EG4TSRE.js} +6 -6
  6. package/dist/{chunk-UW6P2PMP.js → chunk-6SKMCZ7I.js} +6 -6
  7. package/dist/{chunk-EYI6JORK.js → chunk-B4AH26UI.js} +2 -2
  8. package/dist/{chunk-H32QA3NV.js → chunk-IJG4CTOI.js} +2 -2
  9. package/dist/{chunk-N2547R2L.js → chunk-OFR3LCYE.js} +3 -3
  10. package/dist/{chunk-7PDRYBHD.js → chunk-OPKMVIYJ.js} +4 -4
  11. package/dist/{chunk-7PDRYBHD.js.map → chunk-OPKMVIYJ.js.map} +1 -1
  12. package/dist/{chunk-PQ5ZX6ZT.js → chunk-OQUGUIYM.js} +14 -1
  13. package/dist/{chunk-PQ5ZX6ZT.js.map → chunk-OQUGUIYM.js.map} +1 -1
  14. package/dist/{chunk-OD5JECOR.js → chunk-PNUBECG2.js} +5 -5
  15. package/dist/{chunk-BVL3O7UH.js → chunk-SP2SI63D.js} +5 -5
  16. package/dist/{chunk-RGOTBJIN.js → chunk-WCBG44IQ.js} +9 -1
  17. package/dist/chunk-WCBG44IQ.js.map +1 -0
  18. package/dist/{chunk-C4SYHSY2.js → chunk-XKDB5D4E.js} +5 -5
  19. package/dist/{client-66VTYDRS.js → client-HKAG55PQ.js} +4 -4
  20. package/dist/{config-YXZKPSZB.js → config-LS7FKZL5.js} +4 -2
  21. package/dist/{eas-YTMCD3UN.js → eas-XNLD5PTV.js} +7 -7
  22. package/dist/{governor-2N3CPFOP.js → governor-ZOIXGEVS.js} +7 -7
  23. package/dist/index.js +67 -48
  24. package/dist/index.js.map +1 -1
  25. package/dist/{network-GJA2ZN3O.js → network-KSMKPKNL.js} +3 -3
  26. package/dist/{price-HGBIMFYN.js → price-WGV6NYK3.js} +6 -6
  27. package/dist/research-662HNMOG.js +14 -0
  28. package/dist/{research-ECOWBTFP.js → research-AYT6QDJP.js} +9 -9
  29. package/dist/{session-RTCMOPAQ.js → session-46SXKEKP.js} +11 -11
  30. package/dist/{trade-3HVCELTB.js → trade-LIRSGOV7.js} +17 -17
  31. package/dist/{xmtp-5FPJN5WE.js → xmtp-XQGWSO72.js} +21 -16
  32. package/dist/xmtp-XQGWSO72.js.map +1 -0
  33. package/package.json +7 -5
  34. package/dist/agent-U6OFXITU.js.map +0 -1
  35. package/dist/chunk-RGOTBJIN.js.map +0 -1
  36. package/dist/research-3GNTDKY4.js +0 -14
  37. package/dist/xmtp-5FPJN5WE.js.map +0 -1
  38. /package/dist/{addresses-NOWMJT4H.js.map → addresses-6GJP2WAY.js.map} +0 -0
  39. /package/dist/{chat-SIB6GCJF.js.map → chat-36TB53HK.js.map} +0 -0
  40. /package/dist/{chunk-7W6U6ZC6.js.map → chunk-4EG4TSRE.js.map} +0 -0
  41. /package/dist/{chunk-UW6P2PMP.js.map → chunk-6SKMCZ7I.js.map} +0 -0
  42. /package/dist/{chunk-EYI6JORK.js.map → chunk-B4AH26UI.js.map} +0 -0
  43. /package/dist/{chunk-H32QA3NV.js.map → chunk-IJG4CTOI.js.map} +0 -0
  44. /package/dist/{chunk-N2547R2L.js.map → chunk-OFR3LCYE.js.map} +0 -0
  45. /package/dist/{chunk-OD5JECOR.js.map → chunk-PNUBECG2.js.map} +0 -0
  46. /package/dist/{chunk-BVL3O7UH.js.map → chunk-SP2SI63D.js.map} +0 -0
  47. /package/dist/{chunk-C4SYHSY2.js.map → chunk-XKDB5D4E.js.map} +0 -0
  48. /package/dist/{client-66VTYDRS.js.map → client-HKAG55PQ.js.map} +0 -0
  49. /package/dist/{config-YXZKPSZB.js.map → config-LS7FKZL5.js.map} +0 -0
  50. /package/dist/{eas-YTMCD3UN.js.map → eas-XNLD5PTV.js.map} +0 -0
  51. /package/dist/{governor-2N3CPFOP.js.map → governor-ZOIXGEVS.js.map} +0 -0
  52. /package/dist/{network-GJA2ZN3O.js.map → network-KSMKPKNL.js.map} +0 -0
  53. /package/dist/{price-HGBIMFYN.js.map → price-WGV6NYK3.js.map} +0 -0
  54. /package/dist/{research-3GNTDKY4.js.map → research-662HNMOG.js.map} +0 -0
  55. /package/dist/{research-ECOWBTFP.js.map → research-AYT6QDJP.js.map} +0 -0
  56. /package/dist/{session-RTCMOPAQ.js.map → session-46SXKEKP.js.map} +0 -0
  57. /package/dist/{trade-3HVCELTB.js.map → trade-LIRSGOV7.js.map} +0 -0
@@ -12,8 +12,8 @@ import {
12
12
  isTestnet,
13
13
  robinhoodTestnet,
14
14
  setNetwork
15
- } from "./chunk-H32QA3NV.js";
16
- import "./chunk-RGOTBJIN.js";
15
+ } from "./chunk-IJG4CTOI.js";
16
+ import "./chunk-WCBG44IQ.js";
17
17
  export {
18
18
  CHAIN_REGISTRY,
19
19
  VALID_NETWORKS,
@@ -29,4 +29,4 @@ export {
29
29
  robinhoodTestnet,
30
30
  setNetwork
31
31
  };
32
- //# sourceMappingURL=network-GJA2ZN3O.js.map
32
+ //# sourceMappingURL=network-KSMKPKNL.js.map
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  UNISWAP_QUOTER_V2_ABI
3
- } from "./chunk-PQ5ZX6ZT.js";
3
+ } from "./chunk-OQUGUIYM.js";
4
4
  import {
5
5
  SYNTHRA,
6
6
  UNISWAP
7
- } from "./chunk-7PDRYBHD.js";
7
+ } from "./chunk-OPKMVIYJ.js";
8
8
  import {
9
9
  getPublicClient
10
- } from "./chunk-N2547R2L.js";
10
+ } from "./chunk-OFR3LCYE.js";
11
11
  import {
12
12
  getNetwork
13
- } from "./chunk-H32QA3NV.js";
14
- import "./chunk-RGOTBJIN.js";
13
+ } from "./chunk-IJG4CTOI.js";
14
+ import "./chunk-WCBG44IQ.js";
15
15
 
16
16
  // src/lib/price.ts
17
17
  import { encodeFunctionData, decodeFunctionResult, parseUnits, formatUnits } from "viem";
@@ -155,4 +155,4 @@ export {
155
155
  getTokenPriceInAsset,
156
156
  getTokenPricesInAsset
157
157
  };
158
- //# sourceMappingURL=price-HGBIMFYN.js.map
158
+ //# sourceMappingURL=price-WGV6NYK3.js.map
@@ -0,0 +1,14 @@
1
+ import {
2
+ MessariProvider,
3
+ NansenProvider,
4
+ getResearchProvider
5
+ } from "./chunk-B4AH26UI.js";
6
+ import "./chunk-OFR3LCYE.js";
7
+ import "./chunk-IJG4CTOI.js";
8
+ import "./chunk-WCBG44IQ.js";
9
+ export {
10
+ MessariProvider,
11
+ NansenProvider,
12
+ getResearchProvider
13
+ };
14
+ //# sourceMappingURL=research-662HNMOG.js.map
@@ -2,13 +2,13 @@ import {
2
2
  MESSARI_COST_ESTIMATE,
3
3
  NANSEN_COST_ESTIMATE,
4
4
  getResearchProvider
5
- } from "./chunk-EYI6JORK.js";
5
+ } from "./chunk-B4AH26UI.js";
6
6
  import {
7
7
  formatContractError,
8
8
  getAccount
9
- } from "./chunk-N2547R2L.js";
10
- import "./chunk-H32QA3NV.js";
11
- import "./chunk-RGOTBJIN.js";
9
+ } from "./chunk-OFR3LCYE.js";
10
+ import "./chunk-IJG4CTOI.js";
11
+ import "./chunk-WCBG44IQ.js";
12
12
 
13
13
  // src/commands/research.ts
14
14
  import chalk from "chalk";
@@ -16,7 +16,7 @@ import ora from "ora";
16
16
  import { confirm } from "@inquirer/prompts";
17
17
  import { isAddress } from "viem";
18
18
  async function loadXmtp() {
19
- return import("./xmtp-5FPJN5WE.js");
19
+ return import("./xmtp-XQGWSO72.js");
20
20
  }
21
21
  var COST_ESTIMATES = {
22
22
  messari: MESSARI_COST_ESTIMATE,
@@ -83,7 +83,7 @@ function formatValue(value) {
83
83
  }
84
84
  async function postResearch(syndicateName, result, prompt) {
85
85
  const { pinJSON } = await import("./ipfs-IGXLLJCF.js");
86
- const { createResearchAttestation, getEasScanUrl } = await import("./eas-YTMCD3UN.js");
86
+ const { createResearchAttestation, getEasScanUrl } = await import("./eas-XNLD5PTV.js");
87
87
  const xmtp = await loadXmtp();
88
88
  const pinSpinner = ora("Pinning research result to IPFS...").start();
89
89
  let resultUri;
@@ -112,8 +112,8 @@ async function postResearch(syndicateName, result, prompt) {
112
112
  const easSpinner = ora("Creating EAS attestation...").start();
113
113
  let attestationUid;
114
114
  try {
115
- const { getChainContracts } = await import("./config-YXZKPSZB.js");
116
- const { getChain } = await import("./network-GJA2ZN3O.js");
115
+ const { getChainContracts } = await import("./config-LS7FKZL5.js");
116
+ const { getChain } = await import("./network-KSMKPKNL.js");
117
117
  const vaultRecipient = getChainContracts(getChain().id).vault;
118
118
  const { uid } = await createResearchAttestation(
119
119
  result.provider,
@@ -312,4 +312,4 @@ function registerResearchCommands(program) {
312
312
  export {
313
313
  registerResearchCommands
314
314
  };
315
- //# sourceMappingURL=research-ECOWBTFP.js.map
315
+ //# sourceMappingURL=research-AYT6QDJP.js.map
@@ -6,27 +6,27 @@ import {
6
6
  } from "./chunk-W2ZUPR3W.js";
7
7
  import {
8
8
  resolveSyndicate
9
- } from "./chunk-7W6U6ZC6.js";
9
+ } from "./chunk-4EG4TSRE.js";
10
10
  import {
11
11
  PROPOSAL_STATES,
12
12
  getProposal
13
- } from "./chunk-C4SYHSY2.js";
13
+ } from "./chunk-XKDB5D4E.js";
14
14
  import {
15
15
  resolveMetadataSummary
16
16
  } from "./chunk-2H6IGGKN.js";
17
17
  import {
18
18
  SYNDICATE_VAULT_ABI
19
- } from "./chunk-PQ5ZX6ZT.js";
19
+ } from "./chunk-OQUGUIYM.js";
20
20
  import {
21
21
  SHERWOOD
22
- } from "./chunk-7PDRYBHD.js";
22
+ } from "./chunk-OPKMVIYJ.js";
23
23
  import {
24
24
  getPublicClient
25
- } from "./chunk-N2547R2L.js";
26
- import "./chunk-H32QA3NV.js";
25
+ } from "./chunk-OFR3LCYE.js";
26
+ import "./chunk-IJG4CTOI.js";
27
27
  import {
28
28
  loadConfig
29
- } from "./chunk-RGOTBJIN.js";
29
+ } from "./chunk-WCBG44IQ.js";
30
30
 
31
31
  // src/commands/session.ts
32
32
  import chalk from "chalk";
@@ -187,7 +187,7 @@ async function enrichProposalEvents(events, metadataCache) {
187
187
 
188
188
  // src/commands/session.ts
189
189
  async function loadXmtp() {
190
- return import("./xmtp-5FPJN5WE.js");
190
+ return import("./xmtp-XQGWSO72.js");
191
191
  }
192
192
  async function resolveGovernor(vaultAddress) {
193
193
  const client = getPublicClient();
@@ -424,8 +424,8 @@ function registerSessionCommands(program) {
424
424
  );
425
425
  session.command("cron <name>").description("Manage participation crons (OpenClaw agents)").option("--remove", "Remove participation crons", false).option("--status", "Show cron status", false).action(async (name, opts) => {
426
426
  const { isOpenClaw, registerSyndicateCrons, unregisterSyndicateCrons, getSyndicateCronStatus } = await import("./cron-EOULYO3R.js");
427
- const { isTestnet } = await import("./network-GJA2ZN3O.js");
428
- const { getNotifyTo } = await import("./config-YXZKPSZB.js");
427
+ const { isTestnet } = await import("./network-KSMKPKNL.js");
428
+ const { getNotifyTo } = await import("./config-LS7FKZL5.js");
429
429
  if (!isOpenClaw()) {
430
430
  console.log(chalk.yellow("Not running on OpenClaw \u2014 cron commands unavailable"));
431
431
  console.log(chalk.dim(` Set up your own scheduler: sherwood session check ${name} --stream`));
@@ -466,4 +466,4 @@ function registerSessionCommands(program) {
466
466
  export {
467
467
  registerSessionCommands
468
468
  };
469
- //# sourceMappingURL=session-RTCMOPAQ.js.map
469
+ //# sourceMappingURL=session-46SXKEKP.js.map
@@ -1,29 +1,29 @@
1
1
  import {
2
2
  getResearchProvider
3
- } from "./chunk-EYI6JORK.js";
3
+ } from "./chunk-B4AH26UI.js";
4
4
  import {
5
5
  UniswapProvider,
6
6
  chatCompletion,
7
7
  getQuote
8
- } from "./chunk-UW6P2PMP.js";
8
+ } from "./chunk-6SKMCZ7I.js";
9
9
  import {
10
10
  ERC20_ABI
11
- } from "./chunk-PQ5ZX6ZT.js";
11
+ } from "./chunk-OQUGUIYM.js";
12
12
  import {
13
13
  TOKENS
14
- } from "./chunk-7PDRYBHD.js";
14
+ } from "./chunk-OPKMVIYJ.js";
15
15
  import {
16
16
  formatContractError,
17
17
  getAccount,
18
18
  getPublicClient
19
- } from "./chunk-N2547R2L.js";
19
+ } from "./chunk-OFR3LCYE.js";
20
20
  import {
21
21
  getExplorerUrl
22
- } from "./chunk-H32QA3NV.js";
22
+ } from "./chunk-IJG4CTOI.js";
23
23
  import {
24
24
  loadConfig,
25
25
  saveConfig
26
- } from "./chunk-RGOTBJIN.js";
26
+ } from "./chunk-WCBG44IQ.js";
27
27
 
28
28
  // src/commands/trade.ts
29
29
  import chalk from "chalk";
@@ -332,7 +332,7 @@ async function getCurrentPrice(tokenAddress, tokenDecimals, feeTier) {
332
332
  // src/commands/trade.ts
333
333
  var uniswap = new UniswapProvider();
334
334
  async function loadXmtp() {
335
- return import("./xmtp-5FPJN5WE.js");
335
+ return import("./xmtp-XQGWSO72.js");
336
336
  }
337
337
  var ETH_ADDRESS = "0x0000000000000000000000000000000000000000";
338
338
  var KNOWN_MEMECOINS = {
@@ -516,7 +516,7 @@ function registerTradeCommands(program) {
516
516
  }
517
517
  const wrapSpinner = ora("Wrapping ETH \u2192 WETH...").start();
518
518
  try {
519
- const { writeContractWithRetry, waitForReceipt: waitForReceiptFn } = await import("./client-66VTYDRS.js");
519
+ const { writeContractWithRetry, waitForReceipt: waitForReceiptFn } = await import("./client-HKAG55PQ.js");
520
520
  const wethAddr = TOKENS().WETH;
521
521
  const wrapHash = await writeContractWithRetry({
522
522
  address: wethAddr,
@@ -525,7 +525,7 @@ function registerTradeCommands(program) {
525
525
  args: [],
526
526
  value: inputAmount,
527
527
  account,
528
- chain: (await import("./network-GJA2ZN3O.js")).getChain()
528
+ chain: (await import("./network-KSMKPKNL.js")).getChain()
529
529
  });
530
530
  await waitForReceiptFn(wrapHash);
531
531
  wrapSpinner.succeed(`Wrapped ${opts.amount} ETH \u2192 WETH`);
@@ -639,9 +639,9 @@ function registerTradeCommands(program) {
639
639
  }
640
640
  console.log(` Tx: ${chalk.dim(getExplorerUrl(txHash))}`);
641
641
  try {
642
- const { createTradeAttestation, getEasScanUrl } = await import("./eas-YTMCD3UN.js");
643
- const { getChainContracts } = await import("./config-YXZKPSZB.js");
644
- const { getChain: getActiveChain } = await import("./network-GJA2ZN3O.js");
642
+ const { createTradeAttestation, getEasScanUrl } = await import("./eas-XNLD5PTV.js");
643
+ const { getChainContracts } = await import("./config-LS7FKZL5.js");
644
+ const { getChain: getActiveChain } = await import("./network-KSMKPKNL.js");
645
645
  const vaultRecipient = getChainContracts(getActiveChain().id).vault;
646
646
  const { uid } = await createTradeAttestation(
647
647
  inputAddr,
@@ -767,9 +767,9 @@ function registerTradeCommands(program) {
767
767
  }
768
768
  console.log(` Tx: ${chalk.dim(getExplorerUrl(txHash))}`);
769
769
  try {
770
- const { createTradeAttestation, getEasScanUrl } = await import("./eas-YTMCD3UN.js");
771
- const { getChainContracts } = await import("./config-YXZKPSZB.js");
772
- const { getChain: getActiveChain } = await import("./network-GJA2ZN3O.js");
770
+ const { createTradeAttestation, getEasScanUrl } = await import("./eas-XNLD5PTV.js");
771
+ const { getChainContracts } = await import("./config-LS7FKZL5.js");
772
+ const { getChain: getActiveChain } = await import("./network-KSMKPKNL.js");
773
773
  const vaultRecipient = getChainContracts(getActiveChain().id).vault;
774
774
  const { uid } = await createTradeAttestation(
775
775
  tokenAddr,
@@ -944,4 +944,4 @@ function sleep(ms) {
944
944
  export {
945
945
  registerTradeCommands
946
946
  };
947
- //# sourceMappingURL=trade-3HVCELTB.js.map
947
+ //# sourceMappingURL=trade-LIRSGOV7.js.map
@@ -1,20 +1,21 @@
1
1
  import {
2
2
  getTextRecord
3
- } from "./chunk-7W6U6ZC6.js";
4
- import "./chunk-PQ5ZX6ZT.js";
5
- import "./chunk-7PDRYBHD.js";
3
+ } from "./chunk-4EG4TSRE.js";
4
+ import "./chunk-OQUGUIYM.js";
5
+ import "./chunk-OPKMVIYJ.js";
6
6
  import {
7
7
  getAccount
8
- } from "./chunk-N2547R2L.js";
8
+ } from "./chunk-OFR3LCYE.js";
9
9
  import {
10
10
  getChainConfig
11
- } from "./chunk-H32QA3NV.js";
11
+ } from "./chunk-IJG4CTOI.js";
12
12
  import {
13
13
  cacheGroupId,
14
14
  getCachedGroupId,
15
+ invalidateCachedGroupId,
15
16
  loadConfig,
16
17
  saveConfig
17
- } from "./chunk-RGOTBJIN.js";
18
+ } from "./chunk-WCBG44IQ.js";
18
19
 
19
20
  // src/lib/xmtp.ts
20
21
  import fs from "fs";
@@ -118,19 +119,23 @@ async function getGroup(_client2, subdomain) {
118
119
  let groupId = getCachedGroupId(subdomain);
119
120
  if (groupId) {
120
121
  const conv = await client.conversations.getConversationById(groupId);
121
- if (!conv) {
122
- cacheGroupId(subdomain, "");
123
- groupId = void 0;
122
+ if (conv) {
123
+ return groupId;
124
124
  }
125
+ invalidateCachedGroupId(subdomain);
126
+ groupId = void 0;
125
127
  }
126
128
  if (!groupId) {
127
- const ensId = await getTextRecord(subdomain, "xmtpGroupId");
128
- if (ensId) {
129
- const conv = await client.conversations.getConversationById(ensId);
130
- if (conv) {
131
- groupId = ensId;
132
- cacheGroupId(subdomain, groupId);
129
+ try {
130
+ const ensId = await getTextRecord(subdomain, "xmtpGroupId");
131
+ if (ensId) {
132
+ const conv = await client.conversations.getConversationById(ensId);
133
+ if (conv) {
134
+ groupId = ensId;
135
+ cacheGroupId(subdomain, groupId);
136
+ }
133
137
  }
138
+ } catch {
134
139
  }
135
140
  }
136
141
  if (!groupId) {
@@ -276,4 +281,4 @@ export {
276
281
  sendReaction,
277
282
  streamMessages
278
283
  };
279
- //# sourceMappingURL=xmtp-5FPJN5WE.js.map
284
+ //# sourceMappingURL=xmtp-XQGWSO72.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/xmtp.ts"],"sourcesContent":["/**\n * XMTP client and group operations for syndicate chat.\n *\n * Uses @xmtp/node-sdk directly with a singleton Client instance.\n * Deterministic DB path (~/.sherwood/xmtp/) and encryption key derived\n * from the sherwood private key via keccak256.\n *\n * This replaces the previous @xmtp/cli subprocess architecture which\n * caused stale MLS installations (issue #110).\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { homedir } from \"node:os\";\nimport {\n Client,\n ConsentState,\n Group,\n GroupPermissionsOptions,\n IdentifierKind,\n type CreateGroupOptions,\n type DecodedMessage,\n type Identifier,\n type NetworkOptions,\n type Signer,\n type XmtpEnv,\n} from \"@xmtp/node-sdk\";\nimport { keccak256, toBytes } from \"viem\";\nimport {\n loadConfig,\n saveConfig,\n cacheGroupId,\n getCachedGroupId,\n invalidateCachedGroupId,\n} from \"./config.js\";\nimport { getTextRecord } from \"./ens.js\";\nimport { getChainConfig } from \"./network.js\";\nimport type { ChatEnvelope } from \"./types.js\";\nimport { getAccount } from \"./client.js\";\n\n// ── Types ──\n\nexport interface XmtpMessage {\n id: string;\n conversationId: string;\n senderInboxId: string;\n contentType: string;\n content: string;\n sentAt: Date;\n}\n\nexport interface XmtpMember {\n inboxId: string;\n permissionLevel: string;\n}\n\n// ── Internal helpers ──\n\nlet _client: Client | null = null;\n\nfunction getXmtpEnv(): string {\n return getChainConfig().xmtpEnv;\n}\n\nfunction getDbEncryptionKey(privateKey: string): Uint8Array {\n const hash = keccak256(toBytes(privateKey + \"xmtp-db-key\"));\n return toBytes(hash);\n}\n\nfunction getDbPath(): string {\n const dir = path.join(homedir(), \".sherwood\", \"xmtp\");\n fs.mkdirSync(dir, { recursive: true, mode: 0o700 });\n return path.join(dir, \"xmtp.db3\");\n}\n\nfunction ethIdentifier(address: string): Identifier {\n return {\n identifier: address.toLowerCase(),\n identifierKind: IdentifierKind.Ethereum,\n };\n}\n\nasync function getOrCreateClient(): Promise<Client> {\n if (_client) return _client;\n\n const config = loadConfig();\n if (!config.privateKey) {\n throw new Error(\n 'No private key configured. Run \"sherwood config set --private-key 0x...\"',\n );\n }\n\n const account = getAccount();\n\n const signer: Signer = {\n type: \"EOA\",\n getIdentifier: () => ({\n identifier: account.address.toLowerCase(),\n identifierKind: IdentifierKind.Ethereum,\n }),\n signMessage: async (message: string) => {\n const signature = await account.signMessage({ message });\n return toBytes(signature);\n },\n };\n\n const clientOptions: NetworkOptions = {\n env: getXmtpEnv() as XmtpEnv,\n };\n _client = await Client.create(signer, {\n ...clientOptions,\n dbEncryptionKey: getDbEncryptionKey(config.privateKey),\n dbPath: getDbPath(),\n });\n\n // Sync all conversations on first connect (processes MLS welcome messages)\n await _client.conversations.syncAll([ConsentState.Allowed]);\n\n // One-time migration: revoke stale installations from the old ~/.xmtp/ era\n if (!config._xmtpMigrated) {\n try {\n await _client.revokeAllOtherInstallations();\n } catch {\n // Non-fatal — stale installations are a UX issue, not a blocker\n }\n config._xmtpMigrated = true;\n saveConfig(config);\n }\n\n return _client;\n}\n\n// ── Client ──\n\nexport async function getXmtpClient(): Promise<string> {\n const client = await getOrCreateClient();\n\n // Cache inbox ID\n const config = loadConfig();\n if (!config.xmtpInboxId && client.inboxId) {\n config.xmtpInboxId = client.inboxId;\n saveConfig(config);\n }\n\n return client.inboxId;\n}\n\n// ── Group Creation ──\n\nexport async function createSyndicateGroup(\n _client: string,\n subdomain: string,\n isPublic: boolean = false,\n): Promise<string> {\n const client = await getOrCreateClient();\n\n const group = await client.conversations.createGroup([], {\n name: subdomain,\n description: `Sherwood syndicate: ${subdomain}.sherwoodagent.eth`,\n permissionLevel: GroupPermissionsOptions.AdminOnly,\n } as CreateGroupOptions);\n\n const groupId = group.id;\n if (!groupId) {\n throw new Error(\"Failed to create XMTP group — no group ID returned\");\n }\n\n // Add spectator if requested — enables dashboard live feed\n const SPECTATOR_ADDRESS =\n process.env.DASHBOARD_SPECTATOR_ADDRESS ||\n \"0x9f6518e69a62c526ead155ad2661f5957b6b2fc3\";\n if (isPublic) {\n await addMember(groupId, SPECTATOR_ADDRESS);\n }\n\n // Cache locally\n cacheGroupId(subdomain, groupId);\n\n return groupId;\n}\n\n// ── Group Lookup ──\n\nexport async function getGroup(\n _client: string,\n subdomain: string,\n): Promise<string> {\n const client = await getOrCreateClient();\n\n // Sync to get latest conversations (including MLS welcome messages)\n await client.conversations.syncAll([ConsentState.Allowed]);\n\n // Try local cache — validate it exists in the local DB before trusting.\n // Stale cache entries (e.g. after `init --force` recreated the group) would\n // otherwise short-circuit every downstream call with a nonexistent group.\n let groupId: string | undefined = getCachedGroupId(subdomain);\n if (groupId) {\n const conv = await client.conversations.getConversationById(groupId);\n if (conv) {\n return groupId;\n }\n // Stale cache — clear and fall through to ENS / name search.\n invalidateCachedGroupId(subdomain);\n groupId = undefined;\n }\n\n // Fall back to on-chain ENS text record (may not exist on all chains)\n if (!groupId) {\n try {\n const ensId = await getTextRecord(subdomain, \"xmtpGroupId\");\n if (ensId) {\n const conv = await client.conversations.getConversationById(ensId);\n if (conv) {\n groupId = ensId;\n cacheGroupId(subdomain, groupId);\n }\n }\n } catch {\n // ENS not available on this chain (e.g. HyperEVM) — skip\n }\n }\n\n // Last resort: search synced conversations by name\n if (!groupId) {\n const groups = client.conversations.listGroups();\n const match = groups.find(\n (g) =>\n g.name === subdomain ||\n g.description?.includes(`${subdomain}.sherwoodagent.eth`),\n );\n if (match) {\n groupId = match.id;\n cacheGroupId(subdomain, groupId);\n }\n }\n\n if (!groupId) {\n throw new Error(\n `No XMTP group found for syndicate \"${subdomain}\". Run \"sherwood chat ${subdomain} init\" to create one.`,\n );\n }\n\n return groupId;\n}\n\n// ── Member Management ──\n\nexport async function addMember(\n groupId: string,\n address: string,\n): Promise<void> {\n const client = await getOrCreateClient();\n\n // Verify the target has an active XMTP identity before adding\n const reachable = await client.canMessage([ethIdentifier(address)]);\n // Try both original and lowercased as map key\n const isReachable =\n reachable.get(address) ?? reachable.get(address.toLowerCase()) ?? false;\n if (!isReachable) {\n throw new Error(\n `${address} is not reachable on XMTP. They need to initialize their client first.`,\n );\n }\n\n await client.conversations.syncAll([ConsentState.Allowed]);\n const conv = await client.conversations.getConversationById(groupId);\n if (!conv) throw new Error(`Conversation ${groupId} not found`);\n\n // Cast to Group — we know syndicate conversations are always groups\n const group = conv as Group;\n await group.addMembersByIdentifiers([ethIdentifier(address)]);\n\n // Set consent to \"allowed\" so subsequent operations don't skip this conversation\n try {\n group.updateConsentState(ConsentState.Allowed);\n } catch {\n // Non-fatal — consent state is a filtering concern, not a blocker\n }\n}\n\nexport async function removeMember(\n groupId: string,\n address: string,\n): Promise<void> {\n const client = await getOrCreateClient();\n await client.conversations.syncAll([ConsentState.Allowed]);\n\n const conv = await client.conversations.getConversationById(groupId);\n if (!conv) throw new Error(`Conversation ${groupId} not found`);\n\n // Cast to Group — we know syndicate conversations are always groups\n const group = conv as Group;\n await group.removeMembersByIdentifiers([ethIdentifier(address)]);\n}\n\n// ── Messaging ──\n\nexport async function sendEnvelope(\n groupId: string,\n envelope: ChatEnvelope,\n): Promise<void> {\n const client = await getOrCreateClient();\n const conv = await client.conversations.getConversationById(groupId);\n if (!conv) throw new Error(`Conversation ${groupId} not found`);\n\n const text = JSON.stringify(envelope);\n await conv.sendText(text);\n}\n\nexport async function sendMarkdown(\n groupId: string,\n markdown: string,\n): Promise<void> {\n const envelope: ChatEnvelope = {\n type: \"MESSAGE\",\n from: getAccount().address,\n text: markdown,\n data: { format: \"markdown\" },\n timestamp: Math.floor(Date.now() / 1000),\n };\n await sendEnvelope(groupId, envelope);\n}\n\nexport async function sendReaction(\n groupId: string,\n messageId: string,\n emoji: string,\n): Promise<void> {\n const envelope: ChatEnvelope = {\n type: \"REACTION\",\n from: getAccount().address,\n data: { reference: messageId, emoji },\n timestamp: Math.floor(Date.now() / 1000),\n };\n await sendEnvelope(groupId, envelope);\n}\n\n// ── Streaming ──\n\nexport async function streamMessages(\n groupId: string,\n onMessage: (msg: XmtpMessage) => void,\n): Promise<() => void> {\n const client = await getOrCreateClient();\n\n const stream = await client.conversations.streamAllMessages({\n consentStates: [ConsentState.Allowed],\n });\n\n let stopped = false;\n\n // Consume stream in background\n (async () => {\n try {\n for await (const message of stream) {\n if (stopped) break;\n // Filter to our group\n if (message.conversationId !== groupId) continue;\n\n onMessage({\n id: message.id || \"\",\n conversationId: message.conversationId || \"\",\n senderInboxId: message.senderInboxId || \"\",\n contentType:\n typeof message.contentType === \"object\"\n ? (message.contentType as { typeId?: string })?.typeId || \"text\"\n : String(message.contentType || \"text\"),\n content:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content),\n sentAt: message.sentAt || new Date(),\n });\n }\n } catch {\n // Stream ended or errored — expected on cleanup\n }\n })();\n\n // Return cleanup function\n return () => {\n stopped = true;\n try {\n // AsyncStreamProxy exposes end() to terminate the stream\n if (typeof (stream as any).end === \"function\") {\n (stream as any).end();\n } else if (typeof (stream as any).return === \"function\") {\n (stream as any).return();\n }\n } catch {\n // Best-effort cleanup\n }\n };\n}\n\n// ── Message History ──\n\nexport async function getRecentMessages(\n groupId: string,\n limit: number = 20,\n): Promise<XmtpMessage[]> {\n const client = await getOrCreateClient();\n const conv = await client.conversations.getConversationById(groupId);\n if (!conv) throw new Error(`Conversation ${groupId} not found`);\n\n // Sync to get latest messages\n await conv.sync();\n\n const rawMessages = await conv.messages({ limit });\n\n return rawMessages.map((m) => ({\n id: m.id || \"\",\n conversationId: m.conversationId || \"\",\n senderInboxId: m.senderInboxId || \"\",\n contentType:\n typeof m.contentType === \"object\"\n ? (m.contentType as { typeId?: string })?.typeId || \"text\"\n : String(m.contentType || \"text\"),\n content:\n typeof m.content === \"string\"\n ? m.content\n : JSON.stringify(m.content),\n sentAt: m.sentAt || new Date(),\n }));\n}\n\n// ── Members ──\n\nexport async function getMembers(\n groupId: string,\n): Promise<XmtpMember[]> {\n const client = await getOrCreateClient();\n const conv = await client.conversations.getConversationById(groupId);\n if (!conv) throw new Error(`Conversation ${groupId} not found`);\n\n const members = await conv.members();\n\n return (Array.isArray(members) ? members : []).map((m: any) => ({\n inboxId: String(m.inboxId || \"\"),\n permissionLevel:\n m.permissionLevel === 2\n ? \"super_admin\"\n : m.permissionLevel === 1\n ? \"admin\"\n : \"member\",\n }));\n}\n"],"mappings":"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","names":["_client"]}
package/package.json CHANGED
@@ -1,12 +1,14 @@
1
1
  {
2
2
  "name": "@sherwoodagent/cli",
3
- "version": "0.29.1",
3
+ "version": "0.38.3",
4
4
  "description": "CLI for agent-managed investment syndicates — onchain DeFi syndicates with XMTP chat",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "sherwood": "./dist/index.js"
8
8
  },
9
- "files": ["dist"],
9
+ "files": [
10
+ "dist"
11
+ ],
10
12
  "publishConfig": {
11
13
  "access": "public"
12
14
  },
@@ -29,14 +31,14 @@
29
31
  },
30
32
  "dependencies": {
31
33
  "@inquirer/prompts": "^8.3.2",
32
- "@xmtp/node-sdk": "6.0.0",
34
+ "@x402/evm": "^2.7.0",
35
+ "@x402/fetch": "^2.7.0",
36
+ "@xmtp/node-sdk": "^6.0.0",
33
37
  "agent0-sdk": "^1.7.0",
34
38
  "chalk": "^5.3.0",
35
39
  "commander": "^12.1.0",
36
40
  "dotenv": "^16.4.0",
37
41
  "ora": "^8.1.0",
38
- "@x402/evm": "^2.7.0",
39
- "@x402/fetch": "^2.7.0",
40
42
  "viem": "^2.21.0"
41
43
  },
42
44
  "overrides": {