@sherwoodagent/cli 0.29.1 → 0.38.2
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/{addresses-NOWMJT4H.js → addresses-6GJP2WAY.js} +4 -4
- package/dist/{agent-U6OFXITU.js → agent-NUYY5PF7.js} +1084 -295
- package/dist/agent-NUYY5PF7.js.map +1 -0
- package/dist/{chat-SIB6GCJF.js → chat-ABL6Z5XZ.js} +8 -8
- package/dist/{chunk-OD5JECOR.js → chunk-3RVDBIXD.js} +4 -4
- package/dist/{chunk-UW6P2PMP.js → chunk-6X3FGJJO.js} +5 -5
- package/dist/{chunk-EYI6JORK.js → chunk-B4AH26UI.js} +2 -2
- package/dist/{chunk-H32QA3NV.js → chunk-IJG4CTOI.js} +2 -2
- package/dist/{chunk-7W6U6ZC6.js → chunk-LWIPZN5P.js} +5 -5
- package/dist/{chunk-BVL3O7UH.js → chunk-O2JHLTDB.js} +4 -4
- package/dist/{chunk-C4SYHSY2.js → chunk-ODB2GWA7.js} +4 -4
- package/dist/{chunk-N2547R2L.js → chunk-OFR3LCYE.js} +3 -3
- package/dist/{chunk-7PDRYBHD.js → chunk-OPKMVIYJ.js} +4 -4
- package/dist/{chunk-7PDRYBHD.js.map → chunk-OPKMVIYJ.js.map} +1 -1
- package/dist/{chunk-RGOTBJIN.js → chunk-WCBG44IQ.js} +9 -1
- package/dist/chunk-WCBG44IQ.js.map +1 -0
- package/dist/{client-66VTYDRS.js → client-HKAG55PQ.js} +4 -4
- package/dist/{config-YXZKPSZB.js → config-LS7FKZL5.js} +4 -2
- package/dist/{eas-YTMCD3UN.js → eas-KBFTHWSI.js} +6 -6
- package/dist/{governor-2N3CPFOP.js → governor-KEXLUOGB.js} +6 -6
- package/dist/index.js +66 -47
- package/dist/index.js.map +1 -1
- package/dist/{network-GJA2ZN3O.js → network-KSMKPKNL.js} +3 -3
- package/dist/{price-HGBIMFYN.js → price-M5H57DPY.js} +5 -5
- package/dist/research-662HNMOG.js +14 -0
- package/dist/{research-ECOWBTFP.js → research-W6QW2JJ3.js} +9 -9
- package/dist/{session-RTCMOPAQ.js → session-64BCMJIB.js} +10 -10
- package/dist/{trade-3HVCELTB.js → trade-7343J4LA.js} +16 -16
- package/dist/{xmtp-5FPJN5WE.js → xmtp-EB2CU2LE.js} +20 -15
- package/dist/xmtp-EB2CU2LE.js.map +1 -0
- package/package.json +7 -5
- package/dist/agent-U6OFXITU.js.map +0 -1
- package/dist/chunk-RGOTBJIN.js.map +0 -1
- package/dist/research-3GNTDKY4.js +0 -14
- package/dist/xmtp-5FPJN5WE.js.map +0 -1
- /package/dist/{addresses-NOWMJT4H.js.map → addresses-6GJP2WAY.js.map} +0 -0
- /package/dist/{chat-SIB6GCJF.js.map → chat-ABL6Z5XZ.js.map} +0 -0
- /package/dist/{chunk-OD5JECOR.js.map → chunk-3RVDBIXD.js.map} +0 -0
- /package/dist/{chunk-UW6P2PMP.js.map → chunk-6X3FGJJO.js.map} +0 -0
- /package/dist/{chunk-EYI6JORK.js.map → chunk-B4AH26UI.js.map} +0 -0
- /package/dist/{chunk-H32QA3NV.js.map → chunk-IJG4CTOI.js.map} +0 -0
- /package/dist/{chunk-7W6U6ZC6.js.map → chunk-LWIPZN5P.js.map} +0 -0
- /package/dist/{chunk-BVL3O7UH.js.map → chunk-O2JHLTDB.js.map} +0 -0
- /package/dist/{chunk-C4SYHSY2.js.map → chunk-ODB2GWA7.js.map} +0 -0
- /package/dist/{chunk-N2547R2L.js.map → chunk-OFR3LCYE.js.map} +0 -0
- /package/dist/{client-66VTYDRS.js.map → client-HKAG55PQ.js.map} +0 -0
- /package/dist/{config-YXZKPSZB.js.map → config-LS7FKZL5.js.map} +0 -0
- /package/dist/{eas-YTMCD3UN.js.map → eas-KBFTHWSI.js.map} +0 -0
- /package/dist/{governor-2N3CPFOP.js.map → governor-KEXLUOGB.js.map} +0 -0
- /package/dist/{network-GJA2ZN3O.js.map → network-KSMKPKNL.js.map} +0 -0
- /package/dist/{price-HGBIMFYN.js.map → price-M5H57DPY.js.map} +0 -0
- /package/dist/{research-3GNTDKY4.js.map → research-662HNMOG.js.map} +0 -0
- /package/dist/{research-ECOWBTFP.js.map → research-W6QW2JJ3.js.map} +0 -0
- /package/dist/{session-RTCMOPAQ.js.map → session-64BCMJIB.js.map} +0 -0
- /package/dist/{trade-3HVCELTB.js.map → trade-7343J4LA.js.map} +0 -0
|
@@ -12,8 +12,8 @@ import {
|
|
|
12
12
|
isTestnet,
|
|
13
13
|
robinhoodTestnet,
|
|
14
14
|
setNetwork
|
|
15
|
-
} from "./chunk-
|
|
16
|
-
import "./chunk-
|
|
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-
|
|
32
|
+
//# sourceMappingURL=network-KSMKPKNL.js.map
|
|
@@ -4,14 +4,14 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
SYNTHRA,
|
|
6
6
|
UNISWAP
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-OPKMVIYJ.js";
|
|
8
8
|
import {
|
|
9
9
|
getPublicClient
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-OFR3LCYE.js";
|
|
11
11
|
import {
|
|
12
12
|
getNetwork
|
|
13
|
-
} from "./chunk-
|
|
14
|
-
import "./chunk-
|
|
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-
|
|
158
|
+
//# sourceMappingURL=price-M5H57DPY.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-
|
|
5
|
+
} from "./chunk-B4AH26UI.js";
|
|
6
6
|
import {
|
|
7
7
|
formatContractError,
|
|
8
8
|
getAccount
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
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-
|
|
19
|
+
return import("./xmtp-EB2CU2LE.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-
|
|
86
|
+
const { createResearchAttestation, getEasScanUrl } = await import("./eas-KBFTHWSI.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-
|
|
116
|
-
const { getChain } = await import("./network-
|
|
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-
|
|
315
|
+
//# sourceMappingURL=research-W6QW2JJ3.js.map
|
|
@@ -6,11 +6,11 @@ import {
|
|
|
6
6
|
} from "./chunk-W2ZUPR3W.js";
|
|
7
7
|
import {
|
|
8
8
|
resolveSyndicate
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-LWIPZN5P.js";
|
|
10
10
|
import {
|
|
11
11
|
PROPOSAL_STATES,
|
|
12
12
|
getProposal
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-ODB2GWA7.js";
|
|
14
14
|
import {
|
|
15
15
|
resolveMetadataSummary
|
|
16
16
|
} from "./chunk-2H6IGGKN.js";
|
|
@@ -19,14 +19,14 @@ import {
|
|
|
19
19
|
} from "./chunk-PQ5ZX6ZT.js";
|
|
20
20
|
import {
|
|
21
21
|
SHERWOOD
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-OPKMVIYJ.js";
|
|
23
23
|
import {
|
|
24
24
|
getPublicClient
|
|
25
|
-
} from "./chunk-
|
|
26
|
-
import "./chunk-
|
|
25
|
+
} from "./chunk-OFR3LCYE.js";
|
|
26
|
+
import "./chunk-IJG4CTOI.js";
|
|
27
27
|
import {
|
|
28
28
|
loadConfig
|
|
29
|
-
} from "./chunk-
|
|
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-
|
|
190
|
+
return import("./xmtp-EB2CU2LE.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-
|
|
428
|
-
const { getNotifyTo } = await import("./config-
|
|
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-
|
|
469
|
+
//# sourceMappingURL=session-64BCMJIB.js.map
|
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getResearchProvider
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-B4AH26UI.js";
|
|
4
4
|
import {
|
|
5
5
|
UniswapProvider,
|
|
6
6
|
chatCompletion,
|
|
7
7
|
getQuote
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-6X3FGJJO.js";
|
|
9
9
|
import {
|
|
10
10
|
ERC20_ABI
|
|
11
11
|
} from "./chunk-PQ5ZX6ZT.js";
|
|
12
12
|
import {
|
|
13
13
|
TOKENS
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-OPKMVIYJ.js";
|
|
15
15
|
import {
|
|
16
16
|
formatContractError,
|
|
17
17
|
getAccount,
|
|
18
18
|
getPublicClient
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-OFR3LCYE.js";
|
|
20
20
|
import {
|
|
21
21
|
getExplorerUrl
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-IJG4CTOI.js";
|
|
23
23
|
import {
|
|
24
24
|
loadConfig,
|
|
25
25
|
saveConfig
|
|
26
|
-
} from "./chunk-
|
|
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-
|
|
335
|
+
return import("./xmtp-EB2CU2LE.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-
|
|
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-
|
|
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-
|
|
643
|
-
const { getChainContracts } = await import("./config-
|
|
644
|
-
const { getChain: getActiveChain } = await import("./network-
|
|
642
|
+
const { createTradeAttestation, getEasScanUrl } = await import("./eas-KBFTHWSI.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-
|
|
771
|
-
const { getChainContracts } = await import("./config-
|
|
772
|
-
const { getChain: getActiveChain } = await import("./network-
|
|
770
|
+
const { createTradeAttestation, getEasScanUrl } = await import("./eas-KBFTHWSI.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-
|
|
947
|
+
//# sourceMappingURL=trade-7343J4LA.js.map
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getTextRecord
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-LWIPZN5P.js";
|
|
4
4
|
import "./chunk-PQ5ZX6ZT.js";
|
|
5
|
-
import "./chunk-
|
|
5
|
+
import "./chunk-OPKMVIYJ.js";
|
|
6
6
|
import {
|
|
7
7
|
getAccount
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-OFR3LCYE.js";
|
|
9
9
|
import {
|
|
10
10
|
getChainConfig
|
|
11
|
-
} from "./chunk-
|
|
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-
|
|
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 (
|
|
122
|
-
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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-
|
|
284
|
+
//# sourceMappingURL=xmtp-EB2CU2LE.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.
|
|
3
|
+
"version": "0.38.2",
|
|
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": [
|
|
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
|
-
"@
|
|
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": {
|