@sherwoodagent/cli 0.80.0 → 0.82.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{abis-OLIDCWDS.js → abis-ZQ6I3S6L.js} +2 -4
- package/dist/{addresses-EF5OQSKV.js → addresses-FGJ4I4IG.js} +3 -3
- package/dist/{agent-VLYILEUP.js → agent-QUINV725.js} +7 -7
- package/dist/{chat-56DDAGA2.js → chat-5TUHBSIA.js} +9 -9
- package/dist/{chunk-QK3FUTVI.js → chunk-27XY2HXV.js} +5 -5
- package/dist/{chunk-VJKZDHH3.js → chunk-3TLKNRZV.js} +10 -9
- package/dist/chunk-3TLKNRZV.js.map +1 -0
- package/dist/{chunk-RFJSV3EZ.js → chunk-4KJUX5SS.js} +5 -5
- package/dist/{chunk-K2NEFUEP.js → chunk-54CLRBPB.js} +5 -5
- package/dist/{chunk-QSYLZA4Z.js → chunk-6BVA4RIH.js} +2 -2
- package/dist/{chunk-MAG63U53.js → chunk-76DLC7CM.js} +4 -4
- package/dist/{chunk-BJ4G3TPP.js → chunk-EPQR6PJ4.js} +2 -2
- package/dist/{chunk-54WMDJTL.js → chunk-LZEV772I.js} +386 -5
- package/dist/chunk-LZEV772I.js.map +1 -0
- package/dist/{chunk-2LUTKS24.js → chunk-MC5QEPW3.js} +6 -6
- package/dist/{chunk-XW6NDXBA.js → chunk-PMRYC6SF.js} +12 -12
- package/dist/{chunk-XW6NDXBA.js.map → chunk-PMRYC6SF.js.map} +1 -1
- package/dist/{chunk-XDWYX5ZM.js → chunk-UHGWEJ24.js} +2 -2
- package/dist/{chunk-XDGCHURW.js → chunk-VR4VHX4D.js} +3 -3
- package/dist/chunk-VR4VHX4D.js.map +1 -0
- package/dist/{chunk-TU655ZTV.js → chunk-XSP64L7L.js} +1102 -480
- package/dist/chunk-XSP64L7L.js.map +1 -0
- package/dist/{chunk-UO4UITOY.js → chunk-Y6XOH23Y.js} +28 -7
- package/dist/chunk-Y6XOH23Y.js.map +1 -0
- package/dist/{client-25LF2O4P.js → client-VNSFNDF4.js} +3 -3
- package/dist/{eas-HHMRO37P.js → eas-PJ3Y4NDB.js} +6 -6
- package/dist/{governor-AL2XUGBE.js → governor-4ASVLOCI.js} +6 -6
- package/dist/index.js +4857 -4569
- package/dist/index.js.map +1 -1
- package/dist/{ipfs-RWSTXTZM.js → ipfs-EJ7IHXCU.js} +2 -2
- package/dist/{network-R45QDUYO.js → network-RI54LT2Y.js} +2 -2
- package/dist/{price-QO22NF5Q.js → price-JX2LFKFW.js} +6 -6
- package/dist/{providers-ALMXBRNW.js → providers-F6MNPMR4.js} +4 -4
- package/dist/{research-ICDDAAGV.js → research-5ZJTRILJ.js} +8 -8
- package/dist/{session-RSWSCMM5.js → session-AXLPYJHX.js} +11 -11
- package/dist/{trade-YNQVWUYZ.js → trade-BZM7K2F4.js} +15 -15
- package/dist/{vault-QKURBBSL.js → vault-AWQBFD4C.js} +9 -9
- package/dist/{xmtp-M2OBCCNR.js → xmtp-M74BRF3G.js} +6 -6
- package/package.json +1 -1
- package/dist/chunk-54WMDJTL.js.map +0 -1
- package/dist/chunk-TU655ZTV.js.map +0 -1
- package/dist/chunk-UO4UITOY.js.map +0 -1
- package/dist/chunk-VJKZDHH3.js.map +0 -1
- package/dist/chunk-XDGCHURW.js.map +0 -1
- /package/dist/{abis-OLIDCWDS.js.map → abis-ZQ6I3S6L.js.map} +0 -0
- /package/dist/{addresses-EF5OQSKV.js.map → addresses-FGJ4I4IG.js.map} +0 -0
- /package/dist/{agent-VLYILEUP.js.map → agent-QUINV725.js.map} +0 -0
- /package/dist/{chat-56DDAGA2.js.map → chat-5TUHBSIA.js.map} +0 -0
- /package/dist/{chunk-QK3FUTVI.js.map → chunk-27XY2HXV.js.map} +0 -0
- /package/dist/{chunk-RFJSV3EZ.js.map → chunk-4KJUX5SS.js.map} +0 -0
- /package/dist/{chunk-K2NEFUEP.js.map → chunk-54CLRBPB.js.map} +0 -0
- /package/dist/{chunk-QSYLZA4Z.js.map → chunk-6BVA4RIH.js.map} +0 -0
- /package/dist/{chunk-MAG63U53.js.map → chunk-76DLC7CM.js.map} +0 -0
- /package/dist/{chunk-BJ4G3TPP.js.map → chunk-EPQR6PJ4.js.map} +0 -0
- /package/dist/{chunk-2LUTKS24.js.map → chunk-MC5QEPW3.js.map} +0 -0
- /package/dist/{chunk-XDWYX5ZM.js.map → chunk-UHGWEJ24.js.map} +0 -0
- /package/dist/{client-25LF2O4P.js.map → client-VNSFNDF4.js.map} +0 -0
- /package/dist/{eas-HHMRO37P.js.map → eas-PJ3Y4NDB.js.map} +0 -0
- /package/dist/{governor-AL2XUGBE.js.map → governor-4ASVLOCI.js.map} +0 -0
- /package/dist/{ipfs-RWSTXTZM.js.map → ipfs-EJ7IHXCU.js.map} +0 -0
- /package/dist/{network-R45QDUYO.js.map → network-RI54LT2Y.js.map} +0 -0
- /package/dist/{price-QO22NF5Q.js.map → price-JX2LFKFW.js.map} +0 -0
- /package/dist/{providers-ALMXBRNW.js.map → providers-F6MNPMR4.js.map} +0 -0
- /package/dist/{research-ICDDAAGV.js.map → research-5ZJTRILJ.js.map} +0 -0
- /package/dist/{session-RSWSCMM5.js.map → session-AXLPYJHX.js.map} +0 -0
- /package/dist/{trade-YNQVWUYZ.js.map → trade-BZM7K2F4.js.map} +0 -0
- /package/dist/{vault-QKURBBSL.js.map → vault-AWQBFD4C.js.map} +0 -0
- /package/dist/{xmtp-M2OBCCNR.js.map → xmtp-M74BRF3G.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/ipfs.ts"],"sourcesContent":["/**\n * IPFS metadata upload/fetch via Sherwood API.\n *\n * Uploads go through the server-side API at api.sherwood.sh/ipfs/upload\n * which holds the Pinata JWT. CLI and app only need the gateway URL for reads.\n */\n\nexport interface FundMetadata {\n schema: string;\n name: string;\n description: string;\n logo?: string;\n chain: string;\n xmtpGroupId?: string;\n strategies: {\n id: string;\n name: string;\n description: string;\n protocols: string[];\n riskLevel: string;\n }[];\n terms: {\n minDeposit?: string;\n minDepositFormatted?: string;\n feeModel?: string;\n lockPeriod?: number;\n };\n links: {\n moltbook?: string;\n dashboard?: string;\n github?: string;\n };\n}\n\nconst DEFAULT_PINATA_GATEWAY = \"https://sherwood.mypinata.cloud\";\n// SHERWOOD_API_URL overrides the BASE — an origin serving the flat v1 tree,\n// e.g. https://api.sherwood.sh, http://localhost:3000/api/v1,\n// https://<deployment>.vercel.app/api/v1.\nconst DEFAULT_API_BASE = \"https://api.sherwood.sh\";\n\nfunction getUploadApiUrl(): string {\n return `${process.env.SHERWOOD_API_URL ?? DEFAULT_API_BASE}/ipfs/upload`;\n}\n\nfunction getPinataGateway(): string {\n return process.env.PINATA_GATEWAY || DEFAULT_PINATA_GATEWAY;\n}\n\n/**\n * Upload JSON to IPFS via the Sherwood API (server-side Pinata).\n * Returns the IPFS URI (ipfs://Qm...).\n */\nasync function uploadToIPFS(content: Record<string, unknown>, name: string): Promise<string> {\n const url = getUploadApiUrl();\n\n // Transient \"fetch failed\" / cold-start 5xx from the pin API shouldn't kill\n // a propose flow — retry briefly before surfacing (vnet e2e finding).\n const attempts = 3;\n let lastErr: unknown;\n for (let i = 0; i < attempts; i++) {\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ content, name }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n // 4xx won't improve on retry; 5xx might.\n if (response.status < 500) throw new Error(`IPFS upload failed (${response.status}): ${text}`);\n lastErr = new Error(`IPFS upload failed (${response.status}): ${text}`);\n } else {\n const result = (await response.json()) as { ipfsHash: string };\n return `ipfs://${result.ipfsHash}`;\n }\n } catch (err) {\n if (err instanceof Error && err.message.startsWith(\"IPFS upload failed (4\")) throw err;\n lastErr = err;\n }\n if (i < attempts - 1) await new Promise((r) => setTimeout(r, 2000 * (i + 1)));\n }\n throw lastErr instanceof Error ? lastErr : new Error(`IPFS upload failed: ${String(lastErr)}`);\n}\n\n/**\n * Pin arbitrary JSON to IPFS.\n * Used for research results and other generic JSON payloads.\n * Returns the IPFS URI (ipfs://Qm...).\n */\nexport async function pinJSON(content: Record<string, unknown>, name: string): Promise<string> {\n return uploadToIPFS(content, name);\n}\n\n/**\n * Upload fund metadata to IPFS.\n * Returns the IPFS URI (ipfs://Qm...).\n */\nexport async function uploadMetadata(metadata: FundMetadata): Promise<string> {\n const name = `sherwood-fund-${metadata.name.toLowerCase().replace(/\\s+/g, \"-\")}`;\n return uploadToIPFS(metadata as unknown as Record<string, unknown>, name);\n}\n\n/**\n * Fetch and parse metadata from an IPFS URI.\n * Supports ipfs:// protocol URIs and raw CIDs.\n */\nexport async function fetchMetadata(ipfsURI: string): Promise<FundMetadata> {\n const gateway = getPinataGateway();\n let cid: string;\n\n if (ipfsURI.startsWith(\"ipfs://\")) {\n cid = ipfsURI.slice(7);\n } else if (ipfsURI.startsWith(\"Qm\") || ipfsURI.startsWith(\"bafy\")) {\n cid = ipfsURI;\n } else {\n throw new Error(`Invalid IPFS URI: ${ipfsURI}`);\n }\n\n const url = `${gateway}/ipfs/${cid}`;\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch metadata from ${url} (${response.status})`);\n }\n\n return (await response.json()) as FundMetadata;\n}\n\n/**\n * Merge flag-driven overrides onto the fund's CURRENT metadata.\n *\n * `update-metadata` used to rebuild the JSON from scratch, silently dropping\n * any field not re-supplied by a flag — notably `xmtpGroupId`, which is the\n * ONLY group-discovery path for the dashboard on ENS-less chains (issue #458).\n *\n * Semantics: flags (`name`/`description`) win; everything else on `current`\n * (`xmtpGroupId`, `terms`, `links`, `strategies`, and any unknown keys) is\n * preserved. Unknown keys survive because the spread of `current` is a runtime\n * copy of every own-enumerable property, not just the ones in `FundMetadata`.\n * Pass `current = null` (e.g. when the fetch failed) to fall back to the old\n * build-from-scratch behavior.\n */\nexport function mergeFundMetadata(\n current: Partial<FundMetadata> | null | undefined,\n overrides: {\n name?: string;\n description?: string;\n subdomain: string;\n defaultChain: string;\n },\n): FundMetadata {\n const base = { ...(current ?? {}) } as Partial<FundMetadata> & Record<string, unknown>;\n const name = overrides.name || base.name || overrides.subdomain;\n const description =\n overrides.description ||\n base.description ||\n `${name} — a Sherwood fund on ${overrides.subdomain}.sherwoodagent.eth`;\n return {\n ...base,\n schema: base.schema || \"sherwood/fund/v1\",\n name,\n description,\n chain: base.chain || overrides.defaultChain,\n strategies: base.strategies ?? [],\n terms: base.terms ?? {},\n links: base.links ?? {},\n };\n}\n\n/**\n * Resolve a metadata URI (ipfs:// or data: base64) to name + description.\n * Returns null on any error — callers should treat enrichment as best-effort.\n */\nexport async function resolveMetadataSummary(\n uri: string,\n): Promise<{ name: string; description: string } | null> {\n try {\n if (uri.startsWith(\"data:application/json;base64,\")) {\n const b64 = uri.slice(\"data:application/json;base64,\".length);\n const json = JSON.parse(Buffer.from(b64, \"base64\").toString(\"utf-8\"));\n return { name: json.name || \"\", description: json.description || \"\" };\n }\n const meta = await fetchMetadata(uri);\n return { name: meta.name, description: meta.description };\n } catch {\n return null;\n }\n}\n"],"mappings":"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","names":[]}
|