@sherwoodagent/cli 0.86.1 → 0.87.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 (71) hide show
  1. package/dist/{abis-WVW2EBI3.js → abis-WJQ6IVYV.js} +2 -2
  2. package/dist/{agent-TBLC3WNJ.js → agent-A2JEYGQS.js} +7 -7
  3. package/dist/{chat-ETZSKQDI.js → chat-OZAAN5LT.js} +8 -8
  4. package/dist/{chunk-ZN2MHIB7.js → chunk-37GT3TJX.js} +5 -5
  5. package/dist/{chunk-45FELUWY.js → chunk-3UYGXGMF.js} +2 -2
  6. package/dist/{chunk-YAS52NEF.js → chunk-CU42ZD4K.js} +5 -5
  7. package/dist/chunk-CU42ZD4K.js.map +1 -0
  8. package/dist/{chunk-PVTZMRC6.js → chunk-G3FUEM5N.js} +2 -2
  9. package/dist/chunk-G3FUEM5N.js.map +1 -0
  10. package/dist/{chunk-XPVXNG2K.js → chunk-GR3GSU3I.js} +6 -6
  11. package/dist/{chunk-KVB5P2OE.js → chunk-IINWI3LD.js} +2 -2
  12. package/dist/{chunk-F3MDCUGO.js → chunk-J2IZWAEW.js} +75 -227
  13. package/dist/chunk-J2IZWAEW.js.map +1 -0
  14. package/dist/{chunk-3IAZQMAW.js → chunk-JGD6A2Q4.js} +29 -82
  15. package/dist/chunk-JGD6A2Q4.js.map +1 -0
  16. package/dist/{chunk-QRMZRAMG.js → chunk-MIAMGVZ4.js} +8 -8
  17. package/dist/chunk-MIAMGVZ4.js.map +1 -0
  18. package/dist/{chunk-EA65CDQH.js → chunk-R6F57QQF.js} +14 -23
  19. package/dist/chunk-R6F57QQF.js.map +1 -0
  20. package/dist/{chunk-EVUKJ7CJ.js → chunk-TTF5TDRV.js} +5 -5
  21. package/dist/{chunk-IAM4VIU2.js → chunk-UOIAY6ZG.js} +6 -39
  22. package/dist/chunk-UOIAY6ZG.js.map +1 -0
  23. package/dist/{chunk-6QBGTX2Q.js → chunk-V7TNYHIK.js} +257 -484
  24. package/dist/chunk-V7TNYHIK.js.map +1 -0
  25. package/dist/{chunk-OUYMZ5ZC.js → chunk-W3XWRWML.js} +5 -5
  26. package/dist/{client-3SE632Q2.js → client-C6N2ASTH.js} +3 -3
  27. package/dist/{eas-KMDAMLXW.js → eas-VFTWEI4K.js} +6 -6
  28. package/dist/{governor-JNSWPJVQ.js → governor-HVBSI6Z2.js} +6 -6
  29. package/dist/identity-OLD25QEP.js +18 -0
  30. package/dist/index.js +91 -305
  31. package/dist/index.js.map +1 -1
  32. package/dist/{network-FEHRFDPJ.js → network-7445KSCF.js} +2 -2
  33. package/dist/{price-YNPYE2EO.js → price-O3THX2HL.js} +6 -6
  34. package/dist/{providers-BMOHHVUN.js → providers-KZNCCUKT.js} +4 -4
  35. package/dist/{research-W74PNYPO.js → research-ARFBFXIT.js} +7 -7
  36. package/dist/{session-HVRZ6AJM.js → session-A7CYZSSA.js} +14 -12
  37. package/dist/session-A7CYZSSA.js.map +1 -0
  38. package/dist/{trade-EOQY72L7.js → trade-ZCK332E4.js} +15 -15
  39. package/dist/{vault-HWJQJW5U.js → vault-CDI7BELZ.js} +8 -8
  40. package/dist/{xmtp-KW73BGVO.js → xmtp-7LAWDKJT.js} +6 -6
  41. package/package.json +1 -1
  42. package/dist/chunk-3IAZQMAW.js.map +0 -1
  43. package/dist/chunk-6QBGTX2Q.js.map +0 -1
  44. package/dist/chunk-EA65CDQH.js.map +0 -1
  45. package/dist/chunk-F3MDCUGO.js.map +0 -1
  46. package/dist/chunk-IAM4VIU2.js.map +0 -1
  47. package/dist/chunk-PVTZMRC6.js.map +0 -1
  48. package/dist/chunk-QRMZRAMG.js.map +0 -1
  49. package/dist/chunk-YAS52NEF.js.map +0 -1
  50. package/dist/identity-ATWV2O7Y.js +0 -15
  51. package/dist/session-HVRZ6AJM.js.map +0 -1
  52. /package/dist/{abis-WVW2EBI3.js.map → abis-WJQ6IVYV.js.map} +0 -0
  53. /package/dist/{agent-TBLC3WNJ.js.map → agent-A2JEYGQS.js.map} +0 -0
  54. /package/dist/{chat-ETZSKQDI.js.map → chat-OZAAN5LT.js.map} +0 -0
  55. /package/dist/{chunk-ZN2MHIB7.js.map → chunk-37GT3TJX.js.map} +0 -0
  56. /package/dist/{chunk-45FELUWY.js.map → chunk-3UYGXGMF.js.map} +0 -0
  57. /package/dist/{chunk-XPVXNG2K.js.map → chunk-GR3GSU3I.js.map} +0 -0
  58. /package/dist/{chunk-KVB5P2OE.js.map → chunk-IINWI3LD.js.map} +0 -0
  59. /package/dist/{chunk-EVUKJ7CJ.js.map → chunk-TTF5TDRV.js.map} +0 -0
  60. /package/dist/{chunk-OUYMZ5ZC.js.map → chunk-W3XWRWML.js.map} +0 -0
  61. /package/dist/{client-3SE632Q2.js.map → client-C6N2ASTH.js.map} +0 -0
  62. /package/dist/{eas-KMDAMLXW.js.map → eas-VFTWEI4K.js.map} +0 -0
  63. /package/dist/{governor-JNSWPJVQ.js.map → governor-HVBSI6Z2.js.map} +0 -0
  64. /package/dist/{identity-ATWV2O7Y.js.map → identity-OLD25QEP.js.map} +0 -0
  65. /package/dist/{network-FEHRFDPJ.js.map → network-7445KSCF.js.map} +0 -0
  66. /package/dist/{price-YNPYE2EO.js.map → price-O3THX2HL.js.map} +0 -0
  67. /package/dist/{providers-BMOHHVUN.js.map → providers-KZNCCUKT.js.map} +0 -0
  68. /package/dist/{research-W74PNYPO.js.map → research-ARFBFXIT.js.map} +0 -0
  69. /package/dist/{trade-EOQY72L7.js.map → trade-ZCK332E4.js.map} +0 -0
  70. /package/dist/{vault-HWJQJW5U.js.map → vault-CDI7BELZ.js.map} +0 -0
  71. /package/dist/{xmtp-KW73BGVO.js.map → xmtp-7LAWDKJT.js.map} +0 -0
@@ -18,7 +18,7 @@ import {
18
18
  robinhoodTestnet,
19
19
  setNetwork,
20
20
  withNetwork
21
- } from "./chunk-PVTZMRC6.js";
21
+ } from "./chunk-G3FUEM5N.js";
22
22
  import "./chunk-3TZIOAPH.js";
23
23
  export {
24
24
  CHAIN_REGISTRY,
@@ -41,4 +41,4 @@ export {
41
41
  setNetwork,
42
42
  withNetwork
43
43
  };
44
- //# sourceMappingURL=network-FEHRFDPJ.js.map
44
+ //# sourceMappingURL=network-7445KSCF.js.map
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  quote
3
- } from "./chunk-3IAZQMAW.js";
3
+ } from "./chunk-JGD6A2Q4.js";
4
4
  import {
5
5
  SYNTHRA
6
- } from "./chunk-IAM4VIU2.js";
6
+ } from "./chunk-UOIAY6ZG.js";
7
7
  import {
8
8
  getPublicClient
9
- } from "./chunk-QRMZRAMG.js";
9
+ } from "./chunk-MIAMGVZ4.js";
10
10
  import {
11
11
  getNetwork
12
- } from "./chunk-PVTZMRC6.js";
12
+ } from "./chunk-G3FUEM5N.js";
13
13
  import "./chunk-3TZIOAPH.js";
14
- import "./chunk-F3MDCUGO.js";
14
+ import "./chunk-J2IZWAEW.js";
15
15
 
16
16
  // src/lib/price.ts
17
17
  import { parseUnits, formatUnits } from "viem";
@@ -133,4 +133,4 @@ export {
133
133
  getTokenPriceInAsset,
134
134
  getTokenPricesInAsset
135
135
  };
136
- //# sourceMappingURL=price-YNPYE2EO.js.map
136
+ //# sourceMappingURL=price-O3THX2HL.js.map
@@ -2,11 +2,11 @@ import {
2
2
  MessariProvider,
3
3
  NansenProvider,
4
4
  getResearchProvider
5
- } from "./chunk-45FELUWY.js";
6
- import "./chunk-QRMZRAMG.js";
5
+ } from "./chunk-3UYGXGMF.js";
6
+ import "./chunk-MIAMGVZ4.js";
7
7
  import {
8
8
  robinhoodTestnet
9
- } from "./chunk-PVTZMRC6.js";
9
+ } from "./chunk-G3FUEM5N.js";
10
10
  import "./chunk-3TZIOAPH.js";
11
11
 
12
12
  // src/providers/index.ts
@@ -28,4 +28,4 @@ export {
28
28
  getResearchProvider,
29
29
  listProviders
30
30
  };
31
- //# sourceMappingURL=providers-BMOHHVUN.js.map
31
+ //# sourceMappingURL=providers-KZNCCUKT.js.map
@@ -2,12 +2,12 @@ import {
2
2
  MESSARI_COST_ESTIMATE,
3
3
  NANSEN_COST_ESTIMATE,
4
4
  getResearchProvider
5
- } from "./chunk-45FELUWY.js";
5
+ } from "./chunk-3UYGXGMF.js";
6
6
  import {
7
7
  formatContractError,
8
8
  getAccount
9
- } from "./chunk-QRMZRAMG.js";
10
- import "./chunk-PVTZMRC6.js";
9
+ } from "./chunk-MIAMGVZ4.js";
10
+ import "./chunk-G3FUEM5N.js";
11
11
  import "./chunk-3TZIOAPH.js";
12
12
 
13
13
  // src/commands/research.ts
@@ -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-KW73BGVO.js");
19
+ return import("./xmtp-7LAWDKJT.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(fundName, result, prompt) {
85
85
  const { pinJSON } = await import("./ipfs-M56BLMCW.js");
86
- const { createResearchAttestation, getEasScanUrl } = await import("./eas-KMDAMLXW.js");
86
+ const { createResearchAttestation, getEasScanUrl } = await import("./eas-VFTWEI4K.js");
87
87
  const xmtp = await loadXmtp();
88
88
  const pinSpinner = ora("Pinning research result to IPFS...").start();
89
89
  let resultUri;
@@ -113,7 +113,7 @@ async function postResearch(fundName, result, prompt) {
113
113
  let attestationUid;
114
114
  try {
115
115
  const { getChainContracts } = await import("./config-ZGFS4I7K.js");
116
- const { getChain } = await import("./network-FEHRFDPJ.js");
116
+ const { getChain } = await import("./network-7445KSCF.js");
117
117
  const vaultRecipient = getChainContracts(getChain().id).vault;
118
118
  const attestation = await createResearchAttestation(
119
119
  result.provider,
@@ -315,4 +315,4 @@ function registerResearchCommands(program) {
315
315
  export {
316
316
  registerResearchCommands
317
317
  };
318
- //# sourceMappingURL=research-W74PNYPO.js.map
318
+ //# sourceMappingURL=research-ARFBFXIT.js.map
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-5DWB5Y7G.js";
7
7
  import {
8
8
  resolveFund
9
- } from "./chunk-ZN2MHIB7.js";
9
+ } from "./chunk-37GT3TJX.js";
10
10
  import {
11
11
  enrichProposalEvents,
12
12
  getCurrentBlock,
@@ -14,29 +14,29 @@ import {
14
14
  getGuardianRegistryEvents,
15
15
  getStakedWoodEvents,
16
16
  getVaultEvents
17
- } from "./chunk-EA65CDQH.js";
17
+ } from "./chunk-R6F57QQF.js";
18
18
  import {
19
19
  getGovernorOf
20
- } from "./chunk-YAS52NEF.js";
20
+ } from "./chunk-CU42ZD4K.js";
21
21
  import {
22
22
  SHERWOOD
23
- } from "./chunk-IAM4VIU2.js";
23
+ } from "./chunk-UOIAY6ZG.js";
24
24
  import {
25
25
  getPublicClient
26
- } from "./chunk-QRMZRAMG.js";
27
- import "./chunk-PVTZMRC6.js";
26
+ } from "./chunk-MIAMGVZ4.js";
27
+ import "./chunk-G3FUEM5N.js";
28
28
  import {
29
29
  loadConfig
30
30
  } from "./chunk-3TZIOAPH.js";
31
31
  import {
32
32
  SYNDICATE_VAULT_ABI
33
- } from "./chunk-F3MDCUGO.js";
33
+ } from "./chunk-J2IZWAEW.js";
34
34
  import "./chunk-YMB4RJOR.js";
35
35
 
36
36
  // src/commands/session.ts
37
37
  import chalk from "chalk";
38
38
  async function loadXmtp() {
39
- return import("./xmtp-KW73BGVO.js");
39
+ return import("./xmtp-7LAWDKJT.js");
40
40
  }
41
41
  async function resolveGovernor(vaultAddress) {
42
42
  const client = getPublicClient();
@@ -111,7 +111,8 @@ async function handleCheck(name, stream, noXmtp) {
111
111
  const guardianEvents = await getGuardianRegistryEvents(
112
112
  GUARDIAN_REGISTRY,
113
113
  fromBlock,
114
- currentBlock
114
+ currentBlock,
115
+ governorAddress
115
116
  );
116
117
  const slashEvents = await getStakedWoodEvents(
117
118
  STAKED_WOOD,
@@ -204,7 +205,8 @@ async function startStream(name, vaultAddress, governorAddress, noXmtp) {
204
205
  const guardianEvents = await getGuardianRegistryEvents(
205
206
  GUARDIAN_REGISTRY,
206
207
  fromBlock,
207
- toBlock
208
+ toBlock,
209
+ governorAddress
208
210
  );
209
211
  const slashEvents = await getStakedWoodEvents(
210
212
  STAKED_WOOD,
@@ -311,7 +313,7 @@ function registerSessionCommands(program) {
311
313
  );
312
314
  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) => {
313
315
  const { isOpenClaw, registerFundCrons, unregisterFundCrons, getFundCronStatus } = await import("./cron-E3UAZF5B.js");
314
- const { isTestnet } = await import("./network-FEHRFDPJ.js");
316
+ const { isTestnet } = await import("./network-7445KSCF.js");
315
317
  const { getNotifyTo } = await import("./config-ZGFS4I7K.js");
316
318
  if (!isOpenClaw()) {
317
319
  console.log(chalk.yellow("Not running on OpenClaw \u2014 cron commands unavailable"));
@@ -353,4 +355,4 @@ function registerSessionCommands(program) {
353
355
  export {
354
356
  registerSessionCommands
355
357
  };
356
- //# sourceMappingURL=session-HVRZ6AJM.js.map
358
+ //# sourceMappingURL=session-A7CYZSSA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/session.ts"],"sourcesContent":["/**\n * Session commands — sherwood session check|status|reset\n *\n * Provides agent awareness: catch up on XMTP messages and on-chain events\n * since the last session. Supports one-shot polling (default) and persistent\n * streaming (--stream).\n *\n * Usage:\n * sherwood session check <name> — one-shot catch-up (JSON to stdout)\n * sherwood session check <name> --stream — persistent stream (JSON lines to stdout)\n * sherwood session check <name> --no-xmtp — skip XMTP entirely (on-chain events only)\n * sherwood session status [name] — show session cursor positions\n * sherwood session reset <name> [--full] — reset session cursors\n *\n * Env: SHERWOOD_SKIP_XMTP=1 is equivalent to --no-xmtp.\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type { Address } from \"viem\";\nimport { resolveFund } from \"../lib/ens.js\";\nimport { getPublicClient } from \"../lib/client.js\";\nimport { getGovernorOf } from \"../lib/governor.js\";\nimport { SYNDICATE_VAULT_ABI } from \"../lib/abis.js\";\nimport {\n getSession,\n updateSession,\n resetSession,\n getAllSessions,\n} from \"../lib/session.js\";\nimport {\n getVaultEvents,\n getGovernorEvents,\n getGuardianRegistryEvents,\n getStakedWoodEvents,\n getCurrentBlock,\n enrichProposalEvents,\n type ChainEvent,\n} from \"../lib/events.js\";\nimport { SHERWOOD } from \"../lib/addresses.js\";\nimport type { ChatEnvelope } from \"../lib/types.js\";\nimport { loadConfig } from \"../lib/config.js\";\n\n// Lazy-load XMTP to avoid breaking session commands when @xmtp/cli is missing\nasync function loadXmtp() {\n return import(\"../lib/xmtp.js\");\n}\n\n// ── Output types ──\n\ninterface SessionMessage {\n source: \"xmtp\";\n id: string;\n from: string;\n type: string;\n text: string;\n sentAt: string; // ISO 8601\n}\n\ninterface SessionCheckResult {\n fund: string;\n messages: SessionMessage[];\n events: ChainEvent[];\n meta: {\n newMessages: number;\n newEvents: number;\n blocksScanned: number;\n lastCheckAt: string; // ISO 8601\n };\n}\n\n// ── Helpers ──\n\n/** Resolve the per-vault governor address from the vault contract. */\nasync function resolveGovernor(vaultAddress: Address): Promise<Address> {\n const client = getPublicClient();\n try {\n const governor = await client.readContract({\n address: vaultAddress,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"governor\",\n });\n return governor as Address;\n } catch {\n // Vault didn't answer — fall back to the factory's per-vault mapping.\n return getGovernorOf(vaultAddress);\n }\n}\n\n/** Convert an XMTP message to session output format. */\nfunction toSessionMessage(msg: {\n id: string;\n senderInboxId: string;\n content: string;\n sentAt: Date;\n}): SessionMessage {\n let type = \"MESSAGE\";\n let text = msg.content;\n let from = msg.senderInboxId;\n\n try {\n const envelope: ChatEnvelope = JSON.parse(msg.content);\n type = envelope.type;\n text = envelope.text || envelope.type;\n from = envelope.from || msg.senderInboxId;\n } catch {\n // Plain text message\n }\n\n return {\n source: \"xmtp\",\n id: msg.id,\n from,\n type,\n text,\n sentAt: msg.sentAt.toISOString(),\n };\n}\n\n// ── Command handlers ──\n\nasync function handleCheck(\n name: string,\n stream: boolean,\n noXmtp: boolean,\n): Promise<void> {\n // Resolve fund\n const fund = await resolveFund(name);\n const vaultAddress = fund.vault;\n const governorAddress = await resolveGovernor(vaultAddress);\n\n // Load or initialize session\n const session = getSession(name);\n const currentBlock = await getCurrentBlock();\n\n // On first run: look back ~1000 blocks (~8 min on Base)\n const fromBlock = session?.lastBlockNumber\n ? BigInt(session.lastBlockNumber) + 1n\n : currentBlock > 1000n\n ? currentBlock - 1000n\n : 0n;\n\n const lastMessageTimestamp = session?.lastMessageTimestamp || 0;\n\n // ── Fetch XMTP messages ──\n // Skipped entirely when noXmtp is true — used by callers that own XMTP\n // themselves (e.g. the sherwood-monitor Hermes plugin via its bundled\n // sidecar) or when the local @xmtp/node-bindings load would fail.\n let messages: SessionMessage[] = [];\n if (!noXmtp) {\n try {\n const xmtp = await loadXmtp();\n const groupId = await xmtp.getGroup(\"\", name);\n const recent = await xmtp.getRecentMessages(groupId, 100);\n\n // Filter to messages after our cursor, excluding our own messages\n const cursorMs = lastMessageTimestamp * 1000;\n const ownInboxId = loadConfig().xmtpInboxId;\n const newMessages = recent.filter(\n (m) =>\n m.sentAt.getTime() > cursorMs &&\n (!ownInboxId || m.senderInboxId !== ownInboxId),\n );\n messages = newMessages.map(toSessionMessage);\n } catch {\n // XMTP not available or group not found — skip messages\n }\n }\n\n // ── Fetch on-chain events ──\n let events: ChainEvent[] = [];\n if (fromBlock <= currentBlock) {\n const vaultEvents = await getVaultEvents(\n vaultAddress,\n fromBlock,\n currentBlock,\n );\n const govEvents = await getGovernorEvents(\n governorAddress,\n vaultAddress,\n fromBlock,\n currentBlock,\n );\n // Guardian layer — resolved from the address book (zero addresses on\n // chains without the guardian stack yield no events).\n const { GUARDIAN_REGISTRY, STAKED_WOOD } = SHERWOOD();\n const guardianEvents = await getGuardianRegistryEvents(\n GUARDIAN_REGISTRY,\n fromBlock,\n currentBlock,\n governorAddress,\n );\n const slashEvents = await getStakedWoodEvents(\n STAKED_WOOD,\n fromBlock,\n currentBlock,\n );\n events = [...vaultEvents, ...govEvents, ...guardianEvents, ...slashEvents].sort(\n (a, b) => a.block - b.block,\n );\n\n // Enrich proposal events with IPFS metadata (name, description, state)\n try {\n events = await enrichProposalEvents(vaultAddress, events);\n } catch {\n // IPFS/RPC unreachable — continue with raw events\n }\n }\n\n // ── Output initial catch-up result ──\n const result: SessionCheckResult = {\n fund: name,\n messages,\n events,\n meta: {\n newMessages: messages.length,\n newEvents: events.length,\n blocksScanned: Number(currentBlock - fromBlock),\n lastCheckAt: session?.lastCheckAt\n ? new Date(session.lastCheckAt * 1000).toISOString()\n : \"never\",\n },\n };\n\n process.stdout.write(JSON.stringify(result) + \"\\n\");\n\n // ── Update session state ──\n // Find the newest message timestamp (messages may not be sorted)\n // Use ceil to ensure we don't re-fetch the same message due to sub-second precision\n let newestTimestamp = lastMessageTimestamp;\n let newestMessageId = session?.lastMessageId || \"\";\n for (const msg of messages) {\n const ts = Math.ceil(new Date(msg.sentAt).getTime() / 1000);\n if (ts > newestTimestamp) {\n newestTimestamp = ts;\n newestMessageId = msg.id;\n }\n }\n\n updateSession(name, {\n vault: vaultAddress,\n governor: governorAddress,\n lastBlockNumber: Number(currentBlock),\n lastCheckAt: Math.floor(Date.now() / 1000),\n lastMessageId: newestMessageId,\n lastMessageTimestamp: newestTimestamp,\n totalMessagesProcessed:\n (session?.totalMessagesProcessed || 0) + messages.length,\n totalEventsProcessed:\n (session?.totalEventsProcessed || 0) + events.length,\n });\n\n // ── If --stream, stay alive ──\n if (stream) {\n await startStream(name, vaultAddress, governorAddress, noXmtp);\n }\n}\n\nasync function startStream(\n name: string,\n vaultAddress: Address,\n governorAddress: Address,\n noXmtp: boolean,\n): Promise<void> {\n // Cache for proposal metadata — immutable once pinned, safe to reuse across polls\n const metadataCache = new Map<string, { name: string; description: string }>();\n\n // Start XMTP message stream\n // Skipped entirely when noXmtp is true — see handleCheck for the rationale.\n // xmtpCleanup stays undefined in that case; the on-exit cleanup does\n // `xmtpCleanup?.()` which is a no-op on undefined, so teardown is unaffected.\n let xmtpCleanup: (() => void) | undefined;\n if (!noXmtp) {\n try {\n const xmtp = await loadXmtp();\n const groupId = await xmtp.getGroup(\"\", name);\n\n const streamOwnInboxId = loadConfig().xmtpInboxId;\n xmtpCleanup = await xmtp.streamMessages(groupId, (msg) => {\n // Skip own messages to prevent self-replies\n if (streamOwnInboxId && msg.senderInboxId === streamOwnInboxId) return;\n\n const sessionMsg = toSessionMessage(msg);\n process.stdout.write(JSON.stringify(sessionMsg) + \"\\n\");\n\n // Update session state incrementally\n updateSession(name, {\n lastMessageId: msg.id,\n lastMessageTimestamp: Math.floor(msg.sentAt.getTime() / 1000),\n lastCheckAt: Math.floor(Date.now() / 1000),\n totalMessagesProcessed:\n (getSession(name)?.totalMessagesProcessed || 0) + 1,\n });\n });\n } catch {\n // XMTP not available — continue with event polling only\n }\n }\n\n // Start on-chain event polling (~30s interval)\n const pollInterval = setInterval(async () => {\n try {\n const session = getSession(name);\n const fromBlock = BigInt(session?.lastBlockNumber || 0) + 1n;\n const toBlock = await getCurrentBlock();\n\n if (fromBlock > toBlock) return; // No new blocks\n\n const vaultEvents = await getVaultEvents(\n vaultAddress,\n fromBlock,\n toBlock,\n );\n const govEvents = await getGovernorEvents(\n governorAddress,\n vaultAddress,\n fromBlock,\n toBlock,\n );\n const { GUARDIAN_REGISTRY, STAKED_WOOD } = SHERWOOD();\n const guardianEvents = await getGuardianRegistryEvents(\n GUARDIAN_REGISTRY,\n fromBlock,\n toBlock,\n governorAddress,\n );\n const slashEvents = await getStakedWoodEvents(\n STAKED_WOOD,\n fromBlock,\n toBlock,\n );\n\n let events = [\n ...vaultEvents,\n ...govEvents,\n ...guardianEvents,\n ...slashEvents,\n ].sort((a, b) => a.block - b.block);\n\n // Enrich proposal events with IPFS metadata (reuse cache across polls)\n try {\n events = await enrichProposalEvents(vaultAddress, events, metadataCache);\n } catch {\n // IPFS/RPC unreachable — continue with raw events\n }\n\n for (const event of events) {\n process.stdout.write(JSON.stringify(event) + \"\\n\");\n }\n\n updateSession(name, {\n lastBlockNumber: Number(toBlock),\n lastCheckAt: Math.floor(Date.now() / 1000),\n totalEventsProcessed:\n (getSession(name)?.totalEventsProcessed || 0) + events.length,\n });\n } catch {\n // RPC error — skip this poll cycle\n }\n }, 30_000);\n\n // Clean up on exit\n const cleanup = () => {\n clearInterval(pollInterval);\n xmtpCleanup?.();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n // Keep alive\n await new Promise(() => {});\n}\n\nasync function handleStatus(name?: string): Promise<void> {\n const sessions = getAllSessions();\n\n if (name) {\n const session = sessions[name];\n if (!session) {\n console.log(\n chalk.dim(`No session found for \"${name}\". Run \"sherwood session check ${name}\" first.`),\n );\n return;\n }\n console.log(JSON.stringify({ [name]: formatSessionStatus(session) }, null, 2));\n return;\n }\n\n // Show all sessions\n if (Object.keys(sessions).length === 0) {\n console.log(chalk.dim(\"No sessions found. Run \\\"sherwood session check <name>\\\" to start.\"));\n return;\n }\n\n const output: Record<string, ReturnType<typeof formatSessionStatus>> = {};\n for (const [subdomain, session] of Object.entries(sessions)) {\n output[subdomain] = formatSessionStatus(session);\n }\n console.log(JSON.stringify(output, null, 2));\n}\n\nfunction formatSessionStatus(session: {\n lastCheckAt: number;\n lastBlockNumber: number;\n totalMessagesProcessed: number;\n totalEventsProcessed: number;\n}) {\n return {\n lastCheckAt: session.lastCheckAt\n ? new Date(session.lastCheckAt * 1000).toISOString()\n : \"never\",\n lastBlockNumber: session.lastBlockNumber,\n totalMessagesProcessed: session.totalMessagesProcessed,\n totalEventsProcessed: session.totalEventsProcessed,\n };\n}\n\nasync function handleReset(\n name: string,\n sinceBlock?: string,\n full?: boolean,\n): Promise<void> {\n if (full || !sinceBlock) {\n resetSession(name);\n console.log(chalk.green(`Session for \"${name}\" has been reset.`));\n } else {\n const block = parseInt(sinceBlock, 10);\n if (isNaN(block)) {\n console.error(chalk.red(\"--since-block must be a number\"));\n process.exit(1);\n }\n resetSession(name, block);\n console.log(\n chalk.green(`Block cursor for \"${name}\" reset to ${block}.`),\n );\n }\n}\n\n// ── Command Registration ──\n\nexport function registerSessionCommands(program: Command): void {\n const session = program\n .command(\"session\")\n .description(\"Agent session — catch up on messages + on-chain events\");\n\n session\n .command(\"check <name>\")\n .description(\"Fetch new XMTP messages and on-chain events since last check\")\n .option(\"--stream\", \"Stay alive streaming messages and polling events\", false)\n .option(\n \"--no-xmtp\",\n \"Skip XMTP catch-up and streaming. Use when XMTP bindings are unavailable or when an external process owns XMTP (e.g. the sherwood-monitor Hermes plugin's bundled sidecar). Also honors SHERWOOD_SKIP_XMTP=1.\",\n false,\n )\n .action(\n async (name: string, opts: { stream: boolean; noXmtp: boolean }) => {\n const skipXmtp =\n opts.noXmtp || process.env.SHERWOOD_SKIP_XMTP === \"1\";\n await handleCheck(name, opts.stream, skipXmtp);\n },\n );\n\n session\n .command(\"status [name]\")\n .description(\"Show session cursor positions\")\n .action(async (name?: string) => {\n await handleStatus(name);\n });\n\n session\n .command(\"reset <name>\")\n .description(\"Reset session cursors\")\n .option(\"--since-block <n>\", \"Reset block cursor to a specific block\")\n .option(\"--full\", \"Reset everything (messages + events)\", false)\n .action(\n async (\n name: string,\n opts: { sinceBlock?: string; full: boolean },\n ) => {\n await handleReset(name, opts.sinceBlock, opts.full);\n },\n );\n\n session\n .command(\"cron <name>\")\n .description(\"Manage participation crons (OpenClaw agents)\")\n .option(\"--remove\", \"Remove participation crons\", false)\n .option(\"--status\", \"Show cron status\", false)\n .action(async (name: string, opts: { remove: boolean; status: boolean }) => {\n const { isOpenClaw, registerFundCrons, unregisterFundCrons, getFundCronStatus } =\n await import(\"../lib/cron.js\");\n const { isTestnet } = await import(\"../lib/network.js\");\n const { getNotifyTo } = await import(\"../lib/config.js\");\n\n if (!isOpenClaw()) {\n console.log(chalk.yellow(\"Not running on OpenClaw — cron commands unavailable\"));\n console.log(chalk.dim(` Set up your own scheduler: sherwood session check ${name} --stream`));\n return;\n }\n\n if (opts.status) {\n const status = getFundCronStatus(name, isTestnet());\n if (status.crons.length === 0) {\n console.log(chalk.dim(\"No participation crons found for \" + name));\n return;\n }\n console.log();\n console.log(chalk.bold(`Participation Crons — ${name}`));\n console.log(chalk.dim(\"─\".repeat(50)));\n for (const cron of status.crons) {\n console.log(` ${chalk.green(cron.name)} every ${cron.every}${cron.lastRun ? ` last: ${cron.lastRun}` : \"\"}`);\n }\n console.log();\n return;\n }\n\n if (opts.remove) {\n const result = unregisterFundCrons(name, isTestnet());\n if (result.removed) {\n console.log(chalk.green(\"Participation crons removed\"));\n } else {\n console.log(chalk.dim(\"No crons found to remove\"));\n }\n return;\n }\n\n // Register/update\n const result = registerFundCrons(name, isTestnet(), getNotifyTo());\n if (result.registered) {\n console.log(chalk.green(\"Participation crons registered: \" + result.cronNames.join(\", \")));\n } else {\n console.log(chalk.dim(\"Crons already registered\"));\n }\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,OAAO,WAAW;AA0BlB,eAAe,WAAW;AACxB,SAAO,OAAO,oBAAgB;AAChC;AA4BA,eAAe,gBAAgB,cAAyC;AACtE,QAAM,SAAS,gBAAgB;AAC/B,MAAI;AACF,UAAM,WAAW,MAAM,OAAO,aAAa;AAAA,MACzC,SAAS;AAAA,MACT,KAAK;AAAA,MACL,cAAc;AAAA,IAChB,CAAC;AACD,WAAO;AAAA,EACT,QAAQ;AAEN,WAAO,cAAc,YAAY;AAAA,EACnC;AACF;AAGA,SAAS,iBAAiB,KAKP;AACjB,MAAI,OAAO;AACX,MAAI,OAAO,IAAI;AACf,MAAI,OAAO,IAAI;AAEf,MAAI;AACF,UAAM,WAAyB,KAAK,MAAM,IAAI,OAAO;AACrD,WAAO,SAAS;AAChB,WAAO,SAAS,QAAQ,SAAS;AACjC,WAAO,SAAS,QAAQ,IAAI;AAAA,EAC9B,QAAQ;AAAA,EAER;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,IAAI,IAAI;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,IAAI,OAAO,YAAY;AAAA,EACjC;AACF;AAIA,eAAe,YACb,MACA,QACA,QACe;AAEf,QAAM,OAAO,MAAM,YAAY,IAAI;AACnC,QAAM,eAAe,KAAK;AAC1B,QAAM,kBAAkB,MAAM,gBAAgB,YAAY;AAG1D,QAAM,UAAU,WAAW,IAAI;AAC/B,QAAM,eAAe,MAAM,gBAAgB;AAG3C,QAAM,YAAY,SAAS,kBACvB,OAAO,QAAQ,eAAe,IAAI,KAClC,eAAe,QACb,eAAe,QACf;AAEN,QAAM,uBAAuB,SAAS,wBAAwB;AAM9D,MAAI,WAA6B,CAAC;AAClC,MAAI,CAAC,QAAQ;AACX,QAAI;AACF,YAAM,OAAO,MAAM,SAAS;AAC5B,YAAM,UAAU,MAAM,KAAK,SAAS,IAAI,IAAI;AAC5C,YAAM,SAAS,MAAM,KAAK,kBAAkB,SAAS,GAAG;AAGxD,YAAM,WAAW,uBAAuB;AACxC,YAAM,aAAa,WAAW,EAAE;AAChC,YAAM,cAAc,OAAO;AAAA,QACzB,CAAC,MACC,EAAE,OAAO,QAAQ,IAAI,aACpB,CAAC,cAAc,EAAE,kBAAkB;AAAA,MACxC;AACA,iBAAW,YAAY,IAAI,gBAAgB;AAAA,IAC7C,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,MAAI,SAAuB,CAAC;AAC5B,MAAI,aAAa,cAAc;AAC7B,UAAM,cAAc,MAAM;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,YAAY,MAAM;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,UAAM,EAAE,mBAAmB,YAAY,IAAI,SAAS;AACpD,UAAM,iBAAiB,MAAM;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,cAAc,MAAM;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,aAAS,CAAC,GAAG,aAAa,GAAG,WAAW,GAAG,gBAAgB,GAAG,WAAW,EAAE;AAAA,MACzE,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE;AAAA,IACxB;AAGA,QAAI;AACF,eAAS,MAAM,qBAAqB,cAAc,MAAM;AAAA,IAC1D,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,SAA6B;AAAA,IACjC,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,MAAM;AAAA,MACJ,aAAa,SAAS;AAAA,MACtB,WAAW,OAAO;AAAA,MAClB,eAAe,OAAO,eAAe,SAAS;AAAA,MAC9C,aAAa,SAAS,cAClB,IAAI,KAAK,QAAQ,cAAc,GAAI,EAAE,YAAY,IACjD;AAAA,IACN;AAAA,EACF;AAEA,UAAQ,OAAO,MAAM,KAAK,UAAU,MAAM,IAAI,IAAI;AAKlD,MAAI,kBAAkB;AACtB,MAAI,kBAAkB,SAAS,iBAAiB;AAChD,aAAW,OAAO,UAAU;AAC1B,UAAM,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,QAAQ,IAAI,GAAI;AAC1D,QAAI,KAAK,iBAAiB;AACxB,wBAAkB;AAClB,wBAAkB,IAAI;AAAA,IACxB;AAAA,EACF;AAEA,gBAAc,MAAM;AAAA,IAClB,OAAO;AAAA,IACP,UAAU;AAAA,IACV,iBAAiB,OAAO,YAAY;AAAA,IACpC,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,IACzC,eAAe;AAAA,IACf,sBAAsB;AAAA,IACtB,yBACG,SAAS,0BAA0B,KAAK,SAAS;AAAA,IACpD,uBACG,SAAS,wBAAwB,KAAK,OAAO;AAAA,EAClD,CAAC;AAGD,MAAI,QAAQ;AACV,UAAM,YAAY,MAAM,cAAc,iBAAiB,MAAM;AAAA,EAC/D;AACF;AAEA,eAAe,YACb,MACA,cACA,iBACA,QACe;AAEf,QAAM,gBAAgB,oBAAI,IAAmD;AAM7E,MAAI;AACJ,MAAI,CAAC,QAAQ;AACX,QAAI;AACF,YAAM,OAAO,MAAM,SAAS;AAC5B,YAAM,UAAU,MAAM,KAAK,SAAS,IAAI,IAAI;AAE5C,YAAM,mBAAmB,WAAW,EAAE;AACtC,oBAAc,MAAM,KAAK,eAAe,SAAS,CAAC,QAAQ;AAExD,YAAI,oBAAoB,IAAI,kBAAkB,iBAAkB;AAEhE,cAAM,aAAa,iBAAiB,GAAG;AACvC,gBAAQ,OAAO,MAAM,KAAK,UAAU,UAAU,IAAI,IAAI;AAGtD,sBAAc,MAAM;AAAA,UAClB,eAAe,IAAI;AAAA,UACnB,sBAAsB,KAAK,MAAM,IAAI,OAAO,QAAQ,IAAI,GAAI;AAAA,UAC5D,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,UACzC,yBACG,WAAW,IAAI,GAAG,0BAA0B,KAAK;AAAA,QACtD,CAAC;AAAA,MACH,CAAC;AAAA,IACH,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,eAAe,YAAY,YAAY;AAC3C,QAAI;AACF,YAAM,UAAU,WAAW,IAAI;AAC/B,YAAM,YAAY,OAAO,SAAS,mBAAmB,CAAC,IAAI;AAC1D,YAAM,UAAU,MAAM,gBAAgB;AAEtC,UAAI,YAAY,QAAS;AAEzB,YAAM,cAAc,MAAM;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,YAAY,MAAM;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,EAAE,mBAAmB,YAAY,IAAI,SAAS;AACpD,YAAM,iBAAiB,MAAM;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,cAAc,MAAM;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,SAAS;AAAA,QACX,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,MACL,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAGlC,UAAI;AACF,iBAAS,MAAM,qBAAqB,cAAc,QAAQ,aAAa;AAAA,MACzE,QAAQ;AAAA,MAER;AAEA,iBAAW,SAAS,QAAQ;AAC1B,gBAAQ,OAAO,MAAM,KAAK,UAAU,KAAK,IAAI,IAAI;AAAA,MACnD;AAEA,oBAAc,MAAM;AAAA,QAClB,iBAAiB,OAAO,OAAO;AAAA,QAC/B,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,QACzC,uBACG,WAAW,IAAI,GAAG,wBAAwB,KAAK,OAAO;AAAA,MAC3D,CAAC;AAAA,IACH,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,GAAM;AAGT,QAAM,UAAU,MAAM;AACpB,kBAAc,YAAY;AAC1B,kBAAc;AACd,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,GAAG,UAAU,OAAO;AAC5B,UAAQ,GAAG,WAAW,OAAO;AAG7B,QAAM,IAAI,QAAQ,MAAM;AAAA,EAAC,CAAC;AAC5B;AAEA,eAAe,aAAa,MAA8B;AACxD,QAAM,WAAW,eAAe;AAEhC,MAAI,MAAM;AACR,UAAM,UAAU,SAAS,IAAI;AAC7B,QAAI,CAAC,SAAS;AACZ,cAAQ;AAAA,QACN,MAAM,IAAI,yBAAyB,IAAI,kCAAkC,IAAI,UAAU;AAAA,MACzF;AACA;AAAA,IACF;AACA,YAAQ,IAAI,KAAK,UAAU,EAAE,CAAC,IAAI,GAAG,oBAAoB,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC;AAC7E;AAAA,EACF;AAGA,MAAI,OAAO,KAAK,QAAQ,EAAE,WAAW,GAAG;AACtC,YAAQ,IAAI,MAAM,IAAI,kEAAoE,CAAC;AAC3F;AAAA,EACF;AAEA,QAAM,SAAiE,CAAC;AACxE,aAAW,CAAC,WAAW,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC3D,WAAO,SAAS,IAAI,oBAAoB,OAAO;AAAA,EACjD;AACA,UAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC7C;AAEA,SAAS,oBAAoB,SAK1B;AACD,SAAO;AAAA,IACL,aAAa,QAAQ,cACjB,IAAI,KAAK,QAAQ,cAAc,GAAI,EAAE,YAAY,IACjD;AAAA,IACJ,iBAAiB,QAAQ;AAAA,IACzB,wBAAwB,QAAQ;AAAA,IAChC,sBAAsB,QAAQ;AAAA,EAChC;AACF;AAEA,eAAe,YACb,MACA,YACA,MACe;AACf,MAAI,QAAQ,CAAC,YAAY;AACvB,iBAAa,IAAI;AACjB,YAAQ,IAAI,MAAM,MAAM,gBAAgB,IAAI,mBAAmB,CAAC;AAAA,EAClE,OAAO;AACL,UAAM,QAAQ,SAAS,YAAY,EAAE;AACrC,QAAI,MAAM,KAAK,GAAG;AAChB,cAAQ,MAAM,MAAM,IAAI,gCAAgC,CAAC;AACzD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,iBAAa,MAAM,KAAK;AACxB,YAAQ;AAAA,MACN,MAAM,MAAM,qBAAqB,IAAI,cAAc,KAAK,GAAG;AAAA,IAC7D;AAAA,EACF;AACF;AAIO,SAAS,wBAAwB,SAAwB;AAC9D,QAAM,UAAU,QACb,QAAQ,SAAS,EACjB,YAAY,6DAAwD;AAEvE,UACG,QAAQ,cAAc,EACtB,YAAY,8DAA8D,EAC1E,OAAO,YAAY,oDAAoD,KAAK,EAC5E;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC,OAAO,MAAc,SAA+C;AAClE,YAAM,WACJ,KAAK,UAAU,QAAQ,IAAI,uBAAuB;AACpD,YAAM,YAAY,MAAM,KAAK,QAAQ,QAAQ;AAAA,IAC/C;AAAA,EACF;AAEF,UACG,QAAQ,eAAe,EACvB,YAAY,+BAA+B,EAC3C,OAAO,OAAO,SAAkB;AAC/B,UAAM,aAAa,IAAI;AAAA,EACzB,CAAC;AAEH,UACG,QAAQ,cAAc,EACtB,YAAY,uBAAuB,EACnC,OAAO,qBAAqB,wCAAwC,EACpE,OAAO,UAAU,wCAAwC,KAAK,EAC9D;AAAA,IACC,OACE,MACA,SACG;AACH,YAAM,YAAY,MAAM,KAAK,YAAY,KAAK,IAAI;AAAA,IACpD;AAAA,EACF;AAEF,UACG,QAAQ,aAAa,EACrB,YAAY,8CAA8C,EAC1D,OAAO,YAAY,8BAA8B,KAAK,EACtD,OAAO,YAAY,oBAAoB,KAAK,EAC5C,OAAO,OAAO,MAAc,SAA+C;AAC1E,UAAM,EAAE,YAAY,mBAAmB,qBAAqB,kBAAkB,IAC5E,MAAM,OAAO,oBAAgB;AAC/B,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,uBAAmB;AACtD,UAAM,EAAE,YAAY,IAAI,MAAM,OAAO,sBAAkB;AAEvD,QAAI,CAAC,WAAW,GAAG;AACjB,cAAQ,IAAI,MAAM,OAAO,0DAAqD,CAAC;AAC/E,cAAQ,IAAI,MAAM,IAAI,uDAAuD,IAAI,WAAW,CAAC;AAC7F;AAAA,IACF;AAEA,QAAI,KAAK,QAAQ;AACf,YAAM,SAAS,kBAAkB,MAAM,UAAU,CAAC;AAClD,UAAI,OAAO,MAAM,WAAW,GAAG;AAC7B,gBAAQ,IAAI,MAAM,IAAI,sCAAsC,IAAI,CAAC;AACjE;AAAA,MACF;AACA,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,KAAK,8BAAyB,IAAI,EAAE,CAAC;AACvD,cAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,iBAAW,QAAQ,OAAO,OAAO;AAC/B,gBAAQ,IAAI,KAAK,MAAM,MAAM,KAAK,IAAI,CAAC,WAAW,KAAK,KAAK,GAAG,KAAK,UAAU,WAAW,KAAK,OAAO,KAAK,EAAE,EAAE;AAAA,MAChH;AACA,cAAQ,IAAI;AACZ;AAAA,IACF;AAEA,QAAI,KAAK,QAAQ;AACf,YAAMA,UAAS,oBAAoB,MAAM,UAAU,CAAC;AACpD,UAAIA,QAAO,SAAS;AAClB,gBAAQ,IAAI,MAAM,MAAM,6BAA6B,CAAC;AAAA,MACxD,OAAO;AACL,gBAAQ,IAAI,MAAM,IAAI,0BAA0B,CAAC;AAAA,MACnD;AACA;AAAA,IACF;AAGA,UAAM,SAAS,kBAAkB,MAAM,UAAU,GAAG,YAAY,CAAC;AACjE,QAAI,OAAO,YAAY;AACrB,cAAQ,IAAI,MAAM,MAAM,qCAAqC,OAAO,UAAU,KAAK,IAAI,CAAC,CAAC;AAAA,IAC3F,OAAO;AACL,cAAQ,IAAI,MAAM,IAAI,0BAA0B,CAAC;AAAA,IACnD;AAAA,EACF,CAAC;AACL;","names":["result"]}
@@ -1,28 +1,28 @@
1
1
  import {
2
2
  getResearchProvider
3
- } from "./chunk-45FELUWY.js";
3
+ } from "./chunk-3UYGXGMF.js";
4
4
  import "./chunk-EGJESQXZ.js";
5
5
  import {
6
6
  chatCompletion
7
- } from "./chunk-KVB5P2OE.js";
7
+ } from "./chunk-IINWI3LD.js";
8
8
  import {
9
9
  getQuote
10
- } from "./chunk-3IAZQMAW.js";
10
+ } from "./chunk-JGD6A2Q4.js";
11
11
  import {
12
12
  TOKENS
13
- } from "./chunk-IAM4VIU2.js";
13
+ } from "./chunk-UOIAY6ZG.js";
14
14
  import {
15
15
  formatContractError,
16
16
  getAccount,
17
17
  getPublicClient,
18
18
  sendTxWithRetry,
19
19
  waitForReceipt
20
- } from "./chunk-QRMZRAMG.js";
20
+ } from "./chunk-MIAMGVZ4.js";
21
21
  import {
22
22
  getChain,
23
23
  getExplorerUrl,
24
24
  getNetwork
25
- } from "./chunk-PVTZMRC6.js";
25
+ } from "./chunk-G3FUEM5N.js";
26
26
  import {
27
27
  getUniswapApiKey,
28
28
  loadConfig,
@@ -30,7 +30,7 @@ import {
30
30
  } from "./chunk-3TZIOAPH.js";
31
31
  import {
32
32
  ERC20_ABI
33
- } from "./chunk-F3MDCUGO.js";
33
+ } from "./chunk-J2IZWAEW.js";
34
34
 
35
35
  // src/commands/trade.ts
36
36
  import chalk from "chalk";
@@ -555,7 +555,7 @@ async function getCurrentPrice(tokenAddress, tokenDecimals, feeTier) {
555
555
  // src/commands/trade.ts
556
556
  var uniswap = new UniswapProvider();
557
557
  async function loadXmtp() {
558
- return import("./xmtp-KW73BGVO.js");
558
+ return import("./xmtp-7LAWDKJT.js");
559
559
  }
560
560
  var ETH_ADDRESS = "0x0000000000000000000000000000000000000000";
561
561
  var KNOWN_MEMECOINS = {
@@ -752,7 +752,7 @@ function registerTradeCommands(program) {
752
752
  }
753
753
  const wrapSpinner = ora("Wrapping ETH \u2192 WETH...").start();
754
754
  try {
755
- const { writeContractWithRetry: writeContractWithRetry2, waitForReceipt: waitForReceiptFn } = await import("./client-3SE632Q2.js");
755
+ const { writeContractWithRetry: writeContractWithRetry2, waitForReceipt: waitForReceiptFn } = await import("./client-C6N2ASTH.js");
756
756
  const wethAddr = TOKENS().WETH;
757
757
  const wrapHash = await writeContractWithRetry2({
758
758
  address: wethAddr,
@@ -761,7 +761,7 @@ function registerTradeCommands(program) {
761
761
  args: [],
762
762
  value: inputAmount,
763
763
  account,
764
- chain: (await import("./network-FEHRFDPJ.js")).getChain()
764
+ chain: (await import("./network-7445KSCF.js")).getChain()
765
765
  });
766
766
  await waitForReceiptFn(wrapHash);
767
767
  wrapSpinner.succeed(`Wrapped ${opts.amount} ETH \u2192 WETH`);
@@ -875,9 +875,9 @@ function registerTradeCommands(program) {
875
875
  }
876
876
  console.log(` Tx: ${chalk.dim(getExplorerUrl(txHash))}`);
877
877
  try {
878
- const { createTradeAttestation, getEasScanUrl } = await import("./eas-KMDAMLXW.js");
878
+ const { createTradeAttestation, getEasScanUrl } = await import("./eas-VFTWEI4K.js");
879
879
  const { getChainContracts } = await import("./config-ZGFS4I7K.js");
880
- const { getChain: getActiveChain } = await import("./network-FEHRFDPJ.js");
880
+ const { getChain: getActiveChain } = await import("./network-7445KSCF.js");
881
881
  const vaultRecipient = getChainContracts(getActiveChain().id).vault;
882
882
  const attestation = await createTradeAttestation(
883
883
  inputAddr,
@@ -1003,9 +1003,9 @@ function registerTradeCommands(program) {
1003
1003
  }
1004
1004
  console.log(` Tx: ${chalk.dim(getExplorerUrl(txHash))}`);
1005
1005
  try {
1006
- const { createTradeAttestation, getEasScanUrl } = await import("./eas-KMDAMLXW.js");
1006
+ const { createTradeAttestation, getEasScanUrl } = await import("./eas-VFTWEI4K.js");
1007
1007
  const { getChainContracts } = await import("./config-ZGFS4I7K.js");
1008
- const { getChain: getActiveChain } = await import("./network-FEHRFDPJ.js");
1008
+ const { getChain: getActiveChain } = await import("./network-7445KSCF.js");
1009
1009
  const vaultRecipient = getChainContracts(getActiveChain().id).vault;
1010
1010
  const attestation = await createTradeAttestation(
1011
1011
  tokenAddr,
@@ -1180,4 +1180,4 @@ function sleep(ms) {
1180
1180
  export {
1181
1181
  registerTradeCommands
1182
1182
  };
1183
- //# sourceMappingURL=trade-EOQY72L7.js.map
1183
+ //# sourceMappingURL=trade-ZCK332E4.js.map
@@ -22,14 +22,14 @@ import {
22
22
  removeDepositor,
23
23
  setAgentFeeBps,
24
24
  setVaultAddress
25
- } from "./chunk-XPVXNG2K.js";
26
- import "./chunk-EA65CDQH.js";
27
- import "./chunk-YAS52NEF.js";
28
- import "./chunk-IAM4VIU2.js";
29
- import "./chunk-QRMZRAMG.js";
30
- import "./chunk-PVTZMRC6.js";
25
+ } from "./chunk-GR3GSU3I.js";
26
+ import "./chunk-R6F57QQF.js";
27
+ import "./chunk-CU42ZD4K.js";
28
+ import "./chunk-UOIAY6ZG.js";
29
+ import "./chunk-MIAMGVZ4.js";
30
+ import "./chunk-G3FUEM5N.js";
31
31
  import "./chunk-3TZIOAPH.js";
32
- import "./chunk-F3MDCUGO.js";
32
+ import "./chunk-J2IZWAEW.js";
33
33
  import "./chunk-YMB4RJOR.js";
34
34
  export {
35
35
  approveDepositor,
@@ -56,4 +56,4 @@ export {
56
56
  setAgentFeeBps,
57
57
  setVaultAddress
58
58
  };
59
- //# sourceMappingURL=vault-HWJQJW5U.js.map
59
+ //# sourceMappingURL=vault-CDI7BELZ.js.map
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  getTextRecord
3
- } from "./chunk-ZN2MHIB7.js";
4
- import "./chunk-IAM4VIU2.js";
3
+ } from "./chunk-37GT3TJX.js";
4
+ import "./chunk-UOIAY6ZG.js";
5
5
  import {
6
6
  getAccount
7
- } from "./chunk-QRMZRAMG.js";
7
+ } from "./chunk-MIAMGVZ4.js";
8
8
  import {
9
9
  getChainConfig
10
- } from "./chunk-PVTZMRC6.js";
10
+ } from "./chunk-G3FUEM5N.js";
11
11
  import {
12
12
  cacheGroupId,
13
13
  getCachedGroupId,
@@ -16,7 +16,7 @@ import {
16
16
  requirePrivateKey,
17
17
  saveConfig
18
18
  } from "./chunk-3TZIOAPH.js";
19
- import "./chunk-F3MDCUGO.js";
19
+ import "./chunk-J2IZWAEW.js";
20
20
 
21
21
  // src/lib/xmtp.ts
22
22
  import fs from "fs";
@@ -315,4 +315,4 @@ export {
315
315
  sendReaction,
316
316
  streamMessages
317
317
  };
318
- //# sourceMappingURL=xmtp-KW73BGVO.js.map
318
+ //# sourceMappingURL=xmtp-7LAWDKJT.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sherwoodagent/cli",
3
- "version": "0.86.1",
3
+ "version": "0.87.0",
4
4
  "description": "CLI for agent-managed onchain vaults \u2014 strategies, depositors, and XMTP chat",
5
5
  "type": "module",
6
6
  "bin": {