From b063d21999b6305562ba45684996fb633250b560 Mon Sep 17 00:00:00 2001 From: fabri Date: Thu, 19 Dec 2024 20:28:57 -0300 Subject: [PATCH 01/19] push --- packages/docs/pages/plugins/xmtp.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/docs/pages/plugins/xmtp.mdx b/packages/docs/pages/plugins/xmtp.mdx index b46dae5e4..d0c0fdb75 100644 --- a/packages/docs/pages/plugins/xmtp.mdx +++ b/packages/docs/pages/plugins/xmtp.mdx @@ -1,10 +1,10 @@ # XMTP AI -AI is transforming consumer tech, with messaging becoming the main channel for interacting with agent services. This shift will scale message traffic astronomically, akin to the web’s rise in the 2000s. Just as Cloudflare secured web traffic, messaging will need robust encryption, threat protection, and scalable infrastructure to handle the surge and protect sensitive AI-driven interactions. +AI is transforming consumer tech, with messaging becoming the main channel for interacting with agent services. This shift will scale message traffic astronomically, analogous to the web’s rise in the 2000s. Just as Cloud-flare secured web traffic, messaging will need robust scalable end-to-end encrypted messages to protect sensitive communications. ## Risks -⚠️ **Risks of not using end-to-end encryption**: Exposes users to Man in the Middle Attacks. +Risks of not using end-to-end encryption: > **Man in the Middle Attacks (MITM)**: Intercept requests in between to alter or manipulate data sent or received by the AI service or user. From 2e4b9e305d6d7f670e70f85e8c355c488df63ccb Mon Sep 17 00:00:00 2001 From: fabri Date: Thu, 19 Dec 2024 20:47:59 -0300 Subject: [PATCH 02/19] docs --- packages/docs/pages/plugins/xmtp.mdx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/docs/pages/plugins/xmtp.mdx b/packages/docs/pages/plugins/xmtp.mdx index d0c0fdb75..a63326d61 100644 --- a/packages/docs/pages/plugins/xmtp.mdx +++ b/packages/docs/pages/plugins/xmtp.mdx @@ -18,6 +18,8 @@ Using ephemeral addresses can enhance security by allowing users to message agen ## Backend +You can use the `xmtp` package to create wrapper around the messages sent and received by the AI agent. + ### Installation Install the `xmtp` package @@ -87,6 +89,8 @@ const onMessage = async (message, user) => { ## Frontend +Same as the backend, you can use the `xmtp-client` package to create a client that decrypts and encrypts messages locally. + ### Installation Install the `xmtp-client` package compatible with your frontend framework. From 1086a277f714cd24405117e18c9a2a457eff0d9b Mon Sep 17 00:00:00 2001 From: fabri Date: Thu, 19 Dec 2024 20:59:22 -0300 Subject: [PATCH 03/19] docs --- packages/docs/pages/changelog.mdx | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/packages/docs/pages/changelog.mdx b/packages/docs/pages/changelog.mdx index 9cceca600..2de8f247a 100644 --- a/packages/docs/pages/changelog.mdx +++ b/packages/docs/pages/changelog.mdx @@ -1,5 +1,28 @@ # Changelog +## 1.2.35 + +- **New Features** + + - Enhanced documentation for the `paymentagent` with multimedia elements and clearer content structure. + - Added a new XMTP plugin for secure messaging with installation instructions and usage examples. + - Introduced `createAgent` function for streamlined agent creation across multiple templates. + - Added a new `xmtp-client` package for secure messaging with installation instructions and usage examples. + - Added a new `xmtp` package for secure messaging with installation instructions and usage examples. + +- **Bug Fixes** + + - Corrected video file extensions in documentation. + +- **Documentation** + + - Updated various documentation files for clarity and improved organization, including the changelog and agent concepts. + - Improved the "Compatible apps" section in the quickstart guide for better clarity. + - Enhanced the XMTP plugin documentation to include detailed usage examples and installation steps. + +- **Chores** + - Updated versioning scheme across multiple packages to a generic "patch". + ## 1.2.32 - **New Features** From 8605532866052508d7757d684601325049911409 Mon Sep 17 00:00:00 2001 From: fabri Date: Sat, 21 Dec 2024 16:36:17 -0300 Subject: [PATCH 04/19] 0.0.4 --- packages/create-message-kit/package.json | 2 +- packages/docs/pages/plugins/xmtp.mdx | 22 ++++---- packages/message-kit/package.json | 2 +- packages/message-kit/src/helpers/types.ts | 28 ---------- packages/message-kit/src/helpers/utils.ts | 4 +- packages/message-kit/src/lib/core.ts | 18 +++---- packages/message-kit/src/plugins/cdp.ts | 62 ++++++++++++++++------ packages/message-kit/src/plugins/circle.ts | 32 +++++++++-- packages/xmtp-client/package.json | 2 +- packages/xmtp-client/src/lib/xmtp.ts | 8 +-- packages/xmtp/README.md | 28 +++++++++- packages/xmtp/package.json | 4 +- packages/xmtp/src/lib/types.ts | 7 ++- packages/xmtp/src/lib/xmtp.ts | 32 +++++------ packages/xmtp/tests/Client.test.ts | 8 +-- templates/ens/example_prompt.md | 9 ++-- templates/gated-group/src/index.ts | 4 +- templates/paymentagent/src/index.ts | 2 + 18 files changed, 166 insertions(+), 108 deletions(-) diff --git a/packages/create-message-kit/package.json b/packages/create-message-kit/package.json index dfbe6464c..7d1f8e41b 100644 --- a/packages/create-message-kit/package.json +++ b/packages/create-message-kit/package.json @@ -36,4 +36,4 @@ "access": "public", "registry": "https://registry.npmjs.org/" } -} +} \ No newline at end of file diff --git a/packages/docs/pages/plugins/xmtp.mdx b/packages/docs/pages/plugins/xmtp.mdx index a63326d61..f4d0538df 100644 --- a/packages/docs/pages/plugins/xmtp.mdx +++ b/packages/docs/pages/plugins/xmtp.mdx @@ -33,16 +33,16 @@ bun install xmtp This is how you can use the `xmtp` package to create a client and handle messages. ```tsx -import { createClient } from "xmtp"; +import { XMTP } from "xmtp"; -const xmtp = await createClient(onMessage, { - encryptionKey: process.env.LOCAL_KEY, +const xmtp = await XMTP(onMessage, { + encryptionKey: process.env.WALLET_PRIVATE_KEY, }); const onMessage = async (message, user) => { - console.log(`Decoded message: ${response} by ${user}`); + console.log(`Decoded message: ${message.content.text} by ${user.address}`); // Your AI model response - xmtp.send(response); + await xmtp.sendMessage(response); }; ``` @@ -54,14 +54,14 @@ const onMessage = async (message, user) => { In this example, when `handleMessage` is invoked, it takes the incoming user message, passes it to the AI model (OpenAI's Chat Completion API), and then sends the AI's response back over XMTP. ```javascript -import { createClient } from "xmtp"; +import { XMTP } from "xmtp"; import { OpenAI } from "openai"; const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY, }); -const xmtp = await createClient(onMessage, { +const xmtp = await XMTP(onMessage, { encryptionKey: process.env.LOCAL_KEY, }); @@ -102,20 +102,20 @@ bun install xmtp-client ### Usage ```tsx -import { createClient, XMTP, Message } from "xmtp-client"; +import { XMTP, Message } from "xmtp-client"; -const xmtp = await createClient(onMessage, { +const xmtp = await XMTP(onMessage, { encryptionKey: process.env.LOCAL_KEY, }); const onSend = async (text) => { - const message = await xmtp.sendMessage(text, agentAddress); return message; }; const onMessage = async (message, agentAddress) => { console.log(`Decoded message: ${message} by ${agentAddress}`); - // Your AI model response + let response; // Your ai model response + await xmtp.sendMessage(response, agentAddress); }; ``` diff --git a/packages/message-kit/package.json b/packages/message-kit/package.json index 62ef91412..a3daf9974 100644 --- a/packages/message-kit/package.json +++ b/packages/message-kit/package.json @@ -81,4 +81,4 @@ "access": "public", "registry": "https://registry.npmjs.org/" } -} +} \ No newline at end of file diff --git a/packages/message-kit/src/helpers/types.ts b/packages/message-kit/src/helpers/types.ts index 80bb23927..7b58de65f 100644 --- a/packages/message-kit/src/helpers/types.ts +++ b/packages/message-kit/src/helpers/types.ts @@ -7,37 +7,9 @@ export type SkillResponse = { data?: any; }; -export type AgentWalletData = { - id: string; - wallet: any; - address: string; - agent_address: string; - blockchain?: string; - state?: string; - key: string; -}; - -export interface AgentWallet { - getWallet: ( - key: string, - createIfNotFound?: boolean, - ) => Promise; - transfer: ( - fromAddress: string, - toAddress: string, - amount: number, - ) => Promise; - checkBalance: ( - key: string, - ) => Promise<{ address: string | undefined; balance: number }>; - createWallet: (key: string) => Promise; - onRampURL: (amount: number, address: string) => Promise; -} export type AgentConfig = { // client options from XMTP client client?: xmtpConfig; - // private key to be used for the client, if not, default from env - privateKey?: string; // if true, the init log message with messagekit logo and stuff will be hidden experimental?: boolean; // hide the init log message with messagekit logo and stuff diff --git a/packages/message-kit/src/helpers/utils.ts b/packages/message-kit/src/helpers/utils.ts index 67dfa7b1c..c5a16bf79 100644 --- a/packages/message-kit/src/helpers/utils.ts +++ b/packages/message-kit/src/helpers/utils.ts @@ -70,7 +70,7 @@ export async function logInitMessage(client: Client, agent?: Agent) { agentConfig?.attachments || process.env.OPENAI_API_KEY === undefined || agentConfig?.client?.structuredLogging || - agentConfig?.privateKey || + agentConfig?.client?.privateKey || agentConfig?.memberChange || agent === undefined || agent?.skills?.flat().length === 0 @@ -95,7 +95,7 @@ export async function logInitMessage(client: Client, agent?: Agent) { `\t- ⚠️ Structured logging is set to ${agentConfig.client.structuredLogging}`, ); } - if (agentConfig?.privateKey) { + if (agentConfig?.client?.privateKey) { console.warn("\t- ⚠️ Private key is set from the code"); } if (agentConfig?.memberChange) { diff --git a/packages/message-kit/src/lib/core.ts b/packages/message-kit/src/lib/core.ts index fd0d43cb4..3ef06542e 100644 --- a/packages/message-kit/src/lib/core.ts +++ b/packages/message-kit/src/lib/core.ts @@ -2,7 +2,7 @@ import { Agent, SkillResponse } from "../helpers/types.js"; import { agentReply, chatMemory, defaultSystemPrompt } from "../plugins/gpt.js"; import { getUserInfo, userInfoCache } from "../plugins/resolver.js"; import { logInitMessage, logMessage } from "../helpers/utils.js"; -import { Message, XMTP, createClient, Conversation } from "xmtp"; +import { Message, XMTP, Conversation, XMTPClass } from "xmtp"; import { WalletService as CdpWalletService } from "../plugins/cdp.js"; import { WalletService as CircleWalletService } from "../plugins/circle.js"; @@ -58,7 +58,7 @@ export type Context = { resetAwaitedState(): void; //XMTP - xmtp: XMTP; + xmtp: XMTPClass; conversation: Conversation; group: Conversation | undefined; getMemoryKey(): string; @@ -74,7 +74,7 @@ export type Context = { /* Context implementation */ export class MessageKit implements Context { - xmtp!: XMTP; + xmtp!: XMTPClass; storage!: LocalStorage; message!: Message; conversation!: Conversation; @@ -97,10 +97,7 @@ export class MessageKit implements Context { async run(): Promise { // Initialize the clients - this.xmtp = await createClient( - this.handleMessage, - this.agent.config?.client, - ); + this.xmtp = await XMTP(this.handleMessage, this.agent.config?.client); // Store the GPT model in process.env for global access process.env.GPT_MODEL = this.agent.config?.gptModel || "gpt-4o"; @@ -110,11 +107,10 @@ export class MessageKit implements Context { message: Message, conversation: Conversation, agent: Agent, - xmtp: XMTP, + xmtp: XMTPClass, ): Promise { try { const context = new MessageKit(agent); - xmtp.setMessage(message); context.xmtp = xmtp; context.message = message; //trim spaces from text @@ -176,13 +172,13 @@ export class MessageKit implements Context { if (process.env.MSG_LOG === "true") console.log("CDP Wallet Service Started"); context.walletService = new CdpWalletService( - context as unknown as Context, + context.message.sender.address, ); } else if (process.env.CIRCLE_API_KEY) { if (process.env.MSG_LOG === "true") console.log("Circle Wallet Service Started"); context.walletService = new CircleWalletService( - context as unknown as Context, + context.message.sender.address, ); } } diff --git a/packages/message-kit/src/plugins/cdp.ts b/packages/message-kit/src/plugins/cdp.ts index faff77e59..ac2fde0fa 100644 --- a/packages/message-kit/src/plugins/cdp.ts +++ b/packages/message-kit/src/plugins/cdp.ts @@ -5,12 +5,10 @@ import { TimeoutError, Trade, } from "@coinbase/coinbase-sdk"; -import { type Context } from "../lib/core"; import { keccak256, toHex, toBytes } from "viem"; -import { getUserInfo } from "../plugins/resolver"; +import { getUserInfo } from "./resolver"; import { isAddress } from "viem"; import { generateOnRampURL } from "@coinbase/cbpay-js"; -import { AgentWallet, AgentWalletData } from "../helpers/types"; import { LocalStorage } from "./storage"; const appId = process.env.COINBASE_APP_ID; @@ -25,17 +23,49 @@ const coinbase = }) : undefined; +console.log("Coinbase initialized", coinbase !== undefined); +export type AgentWalletData = { + id: string; + wallet: any; + address: string; + agent_address: string; + blockchain?: string; + state?: string; + key: string; +}; + +export interface AgentWallet { + getWallet: ( + key: string, + createIfNotFound?: boolean, + ) => Promise; + transfer: ( + fromAddress: string, + toAddress: string, + amount: number, + ) => Promise; + checkBalance: ( + key: string, + ) => Promise<{ address: string | undefined; balance: number }>; + createWallet: (key: string) => Promise; + onRampURL: (amount: number, address: string) => Promise; +} + export class WalletService implements AgentWallet { private walletStorage: LocalStorage; private cdpEncriptionKey: string; private senderAddress: string; - private developerAddress: string; - constructor(context: Context) { + constructor(sender: string) { this.walletStorage = new LocalStorage(".data/wallets"); this.cdpEncriptionKey = (process.env.KEY as string).toLowerCase(); - this.senderAddress = context.message.sender.address.toLowerCase(); - this.developerAddress = context.xmtp.address.toLowerCase(); + this.senderAddress = sender.toLowerCase(); + console.log( + "WalletService initialized with sender", + this.walletStorage, + this.cdpEncriptionKey, + this.senderAddress, + ); } encrypt(data: any): string { @@ -122,7 +152,7 @@ export class WalletService implements AgentWallet { try { const decrypted = this.decrypt(walletData); - let importedWallet = await Wallet.import(decrypted.data); + const importedWallet = await Wallet.import(decrypted.data); return { id: importedWallet.getId() ?? "", wallet: importedWallet, @@ -140,11 +170,11 @@ export class WalletService implements AgentWallet { humanAddress: string, ): Promise<{ address: string | undefined; balance: number }> { humanAddress = humanAddress.toLowerCase(); - let walletData = await this.getWallet(humanAddress); + const walletData = await this.getWallet(humanAddress); if (!walletData) return { address: undefined, balance: 0 }; console.log(`Retrieved wallet data for ${humanAddress}`); - let balance = await walletData.wallet.getBalance(Coinbase.assets.Usdc); + const balance = await walletData.wallet.getBalance(Coinbase.assets.Usdc); return { address: walletData.agent_address, @@ -169,25 +199,25 @@ export class WalletService implements AgentWallet { ): Promise { fromAddress = fromAddress.toLowerCase(); toAddress = toAddress.toLowerCase(); - let from = await this.getWallet(fromAddress); + const from = await this.getWallet(fromAddress); if (!from) return undefined; if (!Number(amount)) return undefined; console.log(`Retrieved wallet data for ${fromAddress}`); - let balance = await from.wallet.getBalance(Coinbase.assets.Usdc); + const balance = await from.wallet.getBalance(Coinbase.assets.Usdc); if (Number(balance) < amount) { return undefined; } if (!isAddress(toAddress) && !toAddress.includes(":")) { - let user = await getUserInfo(toAddress); + const user = await getUserInfo(toAddress); console.log("resolved toAddress", toAddress, user?.address); if (!user) { return undefined; } toAddress = user.address as string; } - let to = await this.getWallet(toAddress, false); - let toWallet = to?.agent_address ?? toAddress; + const to = await this.getWallet(toAddress, false); + const toWallet = to?.agent_address ?? toAddress; if (toWallet.includes(":")) { console.log("Failed accessing the wallet"); return undefined; @@ -223,7 +253,7 @@ export class WalletService implements AgentWallet { amount: number, ): Promise { address = address.toLowerCase(); - let walletData = await this.getWallet(address); + const walletData = await this.getWallet(address); if (!walletData) return undefined; console.log(`Retrieved wallet data for ${address}`); diff --git a/packages/message-kit/src/plugins/circle.ts b/packages/message-kit/src/plugins/circle.ts index 27bbf5943..5e9498199 100644 --- a/packages/message-kit/src/plugins/circle.ts +++ b/packages/message-kit/src/plugins/circle.ts @@ -1,12 +1,38 @@ import { initiateDeveloperControlledWalletsClient } from "@circle-fin/developer-controlled-wallets"; import { type Context } from "../lib/core"; -import { AgentWallet, AgentWalletData } from "../helpers/types"; import { LocalStorage } from "./storage"; const apiKey = process.env.CIRCLE_API_KEY; const entitySecret = process.env.CIRCLE_ENTITY_SECRET; const walletSetId = process.env.CIRCLE_WALLET_SET_ID; +export type AgentWalletData = { + id: string; + wallet: any; + address: string; + agent_address: string; + blockchain?: string; + state?: string; + key: string; +}; + +export interface AgentWallet { + getWallet: ( + key: string, + createIfNotFound?: boolean, + ) => Promise; + transfer: ( + fromAddress: string, + toAddress: string, + amount: number, + ) => Promise; + checkBalance: ( + key: string, + ) => Promise<{ address: string | undefined; balance: number }>; + createWallet: (key: string) => Promise; + onRampURL: (amount: number, address: string) => Promise; +} + const client = apiKey && entitySecret && walletSetId ? initiateDeveloperControlledWalletsClient({ @@ -47,8 +73,8 @@ export class WalletService implements AgentWallet { private walletStorage!: LocalStorage; private senderAddress: string; - constructor(context: Context) { - this.senderAddress = context.message.sender.address; + constructor(sender: string) { + this.senderAddress = sender; this.walletStorage = new LocalStorage(".data/wallets"); } diff --git a/packages/xmtp-client/package.json b/packages/xmtp-client/package.json index 906cc88fd..08c65b6a0 100644 --- a/packages/xmtp-client/package.json +++ b/packages/xmtp-client/package.json @@ -55,4 +55,4 @@ "access": "public", "registry": "https://registry.npmjs.org/" } -} +} \ No newline at end of file diff --git a/packages/xmtp-client/src/lib/xmtp.ts b/packages/xmtp-client/src/lib/xmtp.ts index 4b66ad00d..035342b12 100644 --- a/packages/xmtp-client/src/lib/xmtp.ts +++ b/packages/xmtp-client/src/lib/xmtp.ts @@ -5,6 +5,7 @@ import { generatePrivateKey, privateKeyToAccount } from "viem/accounts"; import { mainnet } from "viem/chains"; import { Message } from "./types.js"; import { parseMessage } from "./parse.js"; +import { XMTPClass } from "xmtp"; export class XMTP { client: Client; @@ -84,17 +85,16 @@ export async function createClient( env: "production", }); - const xmtpInstance = new XMTP(client); + const xmtp = new XMTP(client); - streamMessages(onMessage, client, xmtpInstance); + streamMessages(onMessage, client); - return xmtpInstance; + return xmtp; } async function streamMessages( onMessage: (message: Message | undefined) => Promise, client: Client, - xmtp: XMTP, ) { while (true) { try { diff --git a/packages/xmtp/README.md b/packages/xmtp/README.md index 634fb3804..beaec7c68 100644 --- a/packages/xmtp/README.md +++ b/packages/xmtp/README.md @@ -1,3 +1,29 @@ -# XMTP AI +# XMTP See [XMTP AI](https://message-kit.org/plugins/xmtp) plugin + +### Installation + +Install the `xmtp` package + +```bash [cmd] +bun install xmtp +``` + +### Usage + +This is how you can use the `xmtp` package to create a client and handle messages. + +```tsx +import { XMTP } from "xmtp"; + +const xmtp = await XMTP(onMessage, { + encryptionKey: process.env.WALLET_PRIVATE_KEY, +}); + +const onMessage = async (message, user) => { + console.log(`Decoded message: ${message.content.text} by ${user.address}`); + // Your AI model response + await xmtp.sendMessage(response); +}; +``` diff --git a/packages/xmtp/package.json b/packages/xmtp/package.json index f391c9afa..6e99a1027 100644 --- a/packages/xmtp/package.json +++ b/packages/xmtp/package.json @@ -1,6 +1,6 @@ { "name": "xmtp", - "version": "0.0.2", + "version": "0.0.4", "license": "MIT", "type": "module", "exports": { @@ -59,4 +59,4 @@ "access": "public", "registry": "https://registry.npmjs.org/" } -} +} \ No newline at end of file diff --git a/packages/xmtp/src/lib/types.ts b/packages/xmtp/src/lib/types.ts index 4011f6365..e25faba1a 100644 --- a/packages/xmtp/src/lib/types.ts +++ b/packages/xmtp/src/lib/types.ts @@ -10,8 +10,7 @@ export interface UserReturnType { } export type xmtpConfig = { privateKey?: string; - client?: any; - gptModel?: string; + path?: string; } & ClientOptions; export type Conversation = { @@ -49,6 +48,10 @@ export type Message = { conversation: Conversation; // Conversation the message belongs to sender: User; // Sender of the message typeId: string; // Type identifier for the message + client: { + address: string; + inboxId: string; + }; }; export interface User { diff --git a/packages/xmtp/src/lib/xmtp.ts b/packages/xmtp/src/lib/xmtp.ts index 822096b3b..c82305892 100644 --- a/packages/xmtp/src/lib/xmtp.ts +++ b/packages/xmtp/src/lib/xmtp.ts @@ -19,7 +19,7 @@ import { ReactionCodec, } from "@xmtp/content-type-reaction"; import { ContentTypeText, TextCodec } from "@xmtp/content-type-text"; -import { parseMessage, isV2Conversation } from "./parse.js"; +import { parseMessage } from "./parse.js"; import { Attachment, AttachmentCodec, @@ -50,7 +50,7 @@ interface UserReturnType { account: ReturnType; wallet: ReturnType; } -export class XMTP { +export class XMTPClass { v2client: V2Client; client: V3Client; address: string; @@ -222,7 +222,7 @@ export class XMTP { return (conversation as V3Conversation)?.id !== undefined; } setMessage(message: Message) { - this.message = message; + this.message = message as Message; } async getV2ConversationByAddress(address: string) { try { @@ -271,10 +271,10 @@ export class XMTP { } } -export async function createClient( +export async function XMTP( onMessage: (message: Message | undefined) => Promise = async () => {}, // Default to a no-op function config?: xmtpConfig, -): Promise { +): Promise { // Check if both clientConfig and privateKey are empty const testKey = await setupTestEncryptionKey(); const { key, isRandom } = setupPrivateKey(config?.privateKey); @@ -283,8 +283,8 @@ export async function createClient( let env = process.env.XMTP_ENV as XmtpEnv; if (!env) env = "production" as XmtpEnv; - let volumePath = process.env.RAILWAY_VOLUME_MOUNT_PATH ?? ""; - volumePath += ".data/xmtp"; + let volumePath = + process.env.RAILWAY_VOLUME_MOUNT_PATH ?? config?.path ?? ".data/xmtp"; if (fs && !fs.existsSync(volumePath)) { fs.mkdirSync(volumePath, { recursive: true }); @@ -305,7 +305,7 @@ export async function createClient( }; // Merge the default configuration with the provided config. Repeated fields in clientConfig will override the default values - const finalConfig = { ...defaultConfig, ...config?.client }; + const finalConfig = { ...defaultConfig, ...config }; //v2 const account2 = privateKeyToAccount(key as `0x${string}`); const wallet2 = createWalletClient({ @@ -325,20 +325,20 @@ export async function createClient( finalConfig, ); - const xmtpInstance = new XMTP(client, v2client); + const xmtp = new XMTPClass(client, v2client); Promise.all([ - streamMessages(onMessage, v2client, xmtpInstance), - streamMessages(onMessage, client, xmtpInstance), + streamMessages(onMessage, v2client, xmtp), + streamMessages(onMessage, client, xmtp), ]); - return xmtpInstance as XMTP; + return xmtp as XMTPClass; } async function streamMessages( onMessage: (message: Message | undefined) => Promise, client: V3Client | V2Client, - xmtp: XMTP, + xmtp: XMTPClass, ) { let v3client = client instanceof V3Client ? client : undefined; let v2client = client instanceof V2Client ? client : undefined; @@ -371,7 +371,8 @@ async function streamMessages( conversation, client, ); - onMessage(parsedMessage); + xmtp.setMessage(parsedMessage as Message); + onMessage(parsedMessage as Message); } catch (e) { console.log(`error`, e); } @@ -400,7 +401,8 @@ async function streamMessages( conversation, client, ); - onMessage(parsedMessage); + xmtp.setMessage(parsedMessage as Message); + onMessage(parsedMessage as Message); } catch (e) { console.log(`error`, e); } diff --git a/packages/xmtp/tests/Client.test.ts b/packages/xmtp/tests/Client.test.ts index cda70a439..1f088d16e 100644 --- a/packages/xmtp/tests/Client.test.ts +++ b/packages/xmtp/tests/Client.test.ts @@ -1,17 +1,17 @@ import { describe, test, expect } from "vitest"; import { generatePrivateKey } from "viem/accounts"; -import { createClient, createUser } from "xmtp"; +import { XMTP, createUser } from "xmtp"; describe("Client Private Key Configuration Tests", () => { test("creates a client with a random generated key", async () => { - const { client, v2client } = await createClient(); + const { client, v2client } = await XMTP(); expect(client.inboxId).toBeDefined(); expect(v2client.address).toBeDefined(); }, 25000); // Added 15 second timeout test("creates a client with a provided private key", async () => { const privateKey = generatePrivateKey(); - const { client, v2client } = await createClient(undefined, { + const { client, v2client } = await XMTP(undefined, { privateKey, }); expect(client.inboxId).toBeDefined(); @@ -21,7 +21,7 @@ describe("Client Private Key Configuration Tests", () => { test("fails gracefully with invalid private key format", async () => { const invalidKey = "invalid_key"; - const { client } = await createClient(undefined, { + const { client } = await XMTP(undefined, { privateKey: invalidKey, }); diff --git a/templates/ens/example_prompt.md b/templates/ens/example_prompt.md index 713f980e3..0731c5066 100644 --- a/templates/ens/example_prompt.md +++ b/templates/ens/example_prompt.md @@ -13,16 +13,17 @@ You are a helpful agent called @bot that lives inside a web3 messaging app calle - Do not make guesses or assumptions - Only answer if the verified information is in the prompt. - Focus only on helping users with operations detailed below. -- Date: Thu, 19 Dec 2024 21:48:45 GMT, +- Date: Sat, 21 Dec 2024 19:32:56 GMT, ## User context - Start by fetch their domain from or Converse username - Call the user by their name or domain, in case they have one - Ask for a name (if they don't have one) so you can suggest domains. -- Message sent date: 2024-12-19T22:24:41.511Z -- Users address is: 0xc055ae06f552ef5dffb31f99d6b03f4f207549b9 -- Users name is: Friend +- Message sent date: 2024-12-21T19:33:09.736Z +- Users address is: 0x40f08f0f853d1c42c61815652b7ccd5a50f0be09 +- Users name is: ArizonaOregon +- Converse username is: ArizonaOregon ## Commands /check [domain] - Check if a domain is available. diff --git a/templates/gated-group/src/index.ts b/templates/gated-group/src/index.ts index 525bd0544..dd904dcad 100644 --- a/templates/gated-group/src/index.ts +++ b/templates/gated-group/src/index.ts @@ -1,9 +1,9 @@ import { createAgent } from "@xmtp/message-kit"; -import { createClient } from "xmtp"; +import { XMTP } from "xmtp"; import { gated } from "./skills/gated.js"; import { startGatedGroupServer } from "./skills/gated.js"; -const { client } = await createClient(); +const { client } = await XMTP(); startGatedGroupServer(client); diff --git a/templates/paymentagent/src/index.ts b/templates/paymentagent/src/index.ts index d6d160301..e82fa4295 100644 --- a/templates/paymentagent/src/index.ts +++ b/templates/paymentagent/src/index.ts @@ -13,3 +13,5 @@ export const agent = createAgent({ walletService: true, }, }).run(); + + From a1c9d71e6c8e44fc79dd60b6aeecf35f80f6172e Mon Sep 17 00:00:00 2001 From: fabri Date: Sun, 22 Dec 2024 00:33:50 -0300 Subject: [PATCH 05/19] agent-client --- .changeset/config.json | 2 +- README.md | 6 +- community/plugins.json | 6 +- package.json | 6 +- .../{framekit => agent-client}/.gitignore | 0 .../{framekit => agent-client}/.yarnrc.yml | 0 packages/agent-client/README.md | 3 + .../{framekit => agent-client}/next.config.js | 0 packages/agent-client/package.json | 35 ++ .../public/fonts/GeistMonoVF.woff | Bin .../public/fonts/GeistVF.woff | Bin .../public/fonts/Inter-Regular.ttf | Bin .../public/fonts/Inter-SemiBold.ttf | Bin .../public/hero.jpg | Bin .../public/messagekit-logo.png | Bin .../src/app/api/og/route.ts | 0 .../src/app/favicon.ico | Bin .../src/app/fonts/GeistMonoVF.woff | Bin .../src/app/fonts/GeistVF.woff | Bin .../src/app/globals.css | 0 .../src/app/layout.tsx | 0 packages/agent-client/src/app/page.module.css | 168 ++++++++ packages/agent-client/src/app/page.tsx | 89 +++++ .../src/app/utils/networks.ts | 0 .../src/app/utils/resolver.ts | 0 .../src/components/Chat.module.css | 239 +++++++++++ .../src/components/Chat.tsx | 4 +- .../src/components/UrlPreview.tsx | 0 .../{framekit => agent-client}/tsconfig.json | 0 .../{framekit => agent-client}/vercel.json | 0 packages/baselinks/.gitignore | 30 ++ packages/baselinks/.yarnrc.yml | 7 + packages/baselinks/README.md | 3 + packages/baselinks/next.config.js | 4 + packages/{framekit => baselinks}/package.json | 2 +- .../baselinks/public/fonts/GeistMonoVF.woff | Bin 0 -> 67864 bytes packages/baselinks/public/fonts/GeistVF.woff | Bin 0 -> 66268 bytes .../baselinks/public/fonts/Inter-Regular.ttf | Bin 0 -> 310252 bytes .../baselinks/public/fonts/Inter-SemiBold.ttf | Bin 0 -> 316220 bytes packages/baselinks/public/hero.jpg | Bin 0 -> 86815 bytes packages/baselinks/public/messagekit-logo.png | Bin 0 -> 29461 bytes .../src/app/api/dmimage/route.tsx | 0 .../src/app/api/mint/route.tsx | 0 packages/baselinks/src/app/api/og/route.ts | 74 ++++ .../src/app/api/payment/route.tsx | 0 .../src/app/api/receipt/route.tsx | 0 .../src/app/api/resolve/route.ts | 0 .../src/app/api/wallet/route.tsx | 0 .../src/app/custom/page.tsx | 0 .../src/app/dm/[address]/ChatClient.tsx | 0 .../src/app/dm/[address]/metadata.ts | 0 .../src/app/dm/[address]/page.tsx | 0 packages/baselinks/src/app/favicon.ico | Bin 0 -> 25931 bytes .../baselinks/src/app/fonts/GeistMonoVF.woff | Bin 0 -> 67864 bytes packages/baselinks/src/app/fonts/GeistVF.woff | Bin 0 -> 66268 bytes .../src/app/generator/page.tsx | 0 packages/baselinks/src/app/globals.css | 150 +++++++ packages/baselinks/src/app/layout.tsx | 14 + .../src/app/mint/page.tsx | 0 .../src/app/page.module.css | 0 .../{framekit => baselinks}/src/app/page.tsx | 0 .../src/app/payment/page.tsx | 0 .../src/app/receipt/page.tsx | 0 packages/baselinks/src/app/utils/networks.ts | 374 ++++++++++++++++++ packages/baselinks/src/app/utils/resolver.ts | 209 ++++++++++ .../src/app/wallet/page.tsx | 0 .../src/components/Chat.module.css | 0 packages/baselinks/src/components/Chat.tsx | 263 ++++++++++++ .../src/components/PaymentFrame.tsx | 0 .../src/components/ReceiptGenerator.tsx | 0 .../src/components/UrlGenerator.tsx | 0 .../baselinks/src/components/UrlPreview.tsx | 68 ++++ packages/baselinks/tsconfig.json | 34 ++ packages/baselinks/vercel.json | 7 + packages/create-message-kit/package.json | 2 +- packages/docs/pages/changelog.mdx | 8 +- packages/docs/pages/plugins/framekit.mdx | 94 +---- packages/docs/pages/skills/concierge.mdx | 2 +- packages/docs/pages/ux/frames.mdx | 8 +- ....timestamp-1734838080672-555165cda1cb2.mjs | 182 +++++++++ ....timestamp-1734838080676-8f5d6f6bfcf92.mjs | 182 +++++++++ ...x.timestamp-1734838080741-1ac173819a28.mjs | 0 packages/framekit/README.md | 3 - packages/message-kit/package.json | 2 +- packages/message-kit/src/helpers/utils.ts | 2 +- packages/message-kit/src/index.ts | 2 +- .../src/plugins/{framekit.ts => baselinks.ts} | 2 +- packages/message-kit/src/plugins/circle.ts | 1 - packages/message-kit/src/plugins/storage.ts | 22 +- packages/message-kit/src/skills/concierge.ts | 14 +- packages/xmtp-client/package.json | 2 +- packages/xmtp/package.json | 2 +- templates/ens/src/skills/pay.ts | 6 +- templates/playground/src/skills/cash.ts | 4 +- templates/playground/src/skills/drip.ts | 4 +- templates/playground/src/skills/pay.ts | 4 +- templates/playground/src/skills/token.ts | 4 +- yarn.lock | 69 ++-- 98 files changed, 2247 insertions(+), 171 deletions(-) rename packages/{framekit => agent-client}/.gitignore (100%) rename packages/{framekit => agent-client}/.yarnrc.yml (100%) create mode 100644 packages/agent-client/README.md rename packages/{framekit => agent-client}/next.config.js (100%) create mode 100644 packages/agent-client/package.json rename packages/{framekit => agent-client}/public/fonts/GeistMonoVF.woff (100%) rename packages/{framekit => agent-client}/public/fonts/GeistVF.woff (100%) rename packages/{framekit => agent-client}/public/fonts/Inter-Regular.ttf (100%) rename packages/{framekit => agent-client}/public/fonts/Inter-SemiBold.ttf (100%) rename packages/{framekit => agent-client}/public/hero.jpg (100%) rename packages/{framekit => agent-client}/public/messagekit-logo.png (100%) rename packages/{framekit => agent-client}/src/app/api/og/route.ts (100%) rename packages/{framekit => agent-client}/src/app/favicon.ico (100%) rename packages/{framekit => agent-client}/src/app/fonts/GeistMonoVF.woff (100%) rename packages/{framekit => agent-client}/src/app/fonts/GeistVF.woff (100%) rename packages/{framekit => agent-client}/src/app/globals.css (100%) rename packages/{framekit => agent-client}/src/app/layout.tsx (100%) create mode 100644 packages/agent-client/src/app/page.module.css create mode 100644 packages/agent-client/src/app/page.tsx rename packages/{framekit => agent-client}/src/app/utils/networks.ts (100%) rename packages/{framekit => agent-client}/src/app/utils/resolver.ts (100%) create mode 100644 packages/agent-client/src/components/Chat.module.css rename packages/{framekit => agent-client}/src/components/Chat.tsx (98%) rename packages/{framekit => agent-client}/src/components/UrlPreview.tsx (100%) rename packages/{framekit => agent-client}/tsconfig.json (100%) rename packages/{framekit => agent-client}/vercel.json (100%) create mode 100644 packages/baselinks/.gitignore create mode 100644 packages/baselinks/.yarnrc.yml create mode 100644 packages/baselinks/README.md create mode 100644 packages/baselinks/next.config.js rename packages/{framekit => baselinks}/package.json (96%) create mode 100644 packages/baselinks/public/fonts/GeistMonoVF.woff create mode 100644 packages/baselinks/public/fonts/GeistVF.woff create mode 100644 packages/baselinks/public/fonts/Inter-Regular.ttf create mode 100644 packages/baselinks/public/fonts/Inter-SemiBold.ttf create mode 100644 packages/baselinks/public/hero.jpg create mode 100644 packages/baselinks/public/messagekit-logo.png rename packages/{framekit => baselinks}/src/app/api/dmimage/route.tsx (100%) rename packages/{framekit => baselinks}/src/app/api/mint/route.tsx (100%) create mode 100644 packages/baselinks/src/app/api/og/route.ts rename packages/{framekit => baselinks}/src/app/api/payment/route.tsx (100%) rename packages/{framekit => baselinks}/src/app/api/receipt/route.tsx (100%) rename packages/{framekit => baselinks}/src/app/api/resolve/route.ts (100%) rename packages/{framekit => baselinks}/src/app/api/wallet/route.tsx (100%) rename packages/{framekit => baselinks}/src/app/custom/page.tsx (100%) rename packages/{framekit => baselinks}/src/app/dm/[address]/ChatClient.tsx (100%) rename packages/{framekit => baselinks}/src/app/dm/[address]/metadata.ts (100%) rename packages/{framekit => baselinks}/src/app/dm/[address]/page.tsx (100%) create mode 100644 packages/baselinks/src/app/favicon.ico create mode 100644 packages/baselinks/src/app/fonts/GeistMonoVF.woff create mode 100644 packages/baselinks/src/app/fonts/GeistVF.woff rename packages/{framekit => baselinks}/src/app/generator/page.tsx (100%) create mode 100644 packages/baselinks/src/app/globals.css create mode 100644 packages/baselinks/src/app/layout.tsx rename packages/{framekit => baselinks}/src/app/mint/page.tsx (100%) rename packages/{framekit => baselinks}/src/app/page.module.css (100%) rename packages/{framekit => baselinks}/src/app/page.tsx (100%) rename packages/{framekit => baselinks}/src/app/payment/page.tsx (100%) rename packages/{framekit => baselinks}/src/app/receipt/page.tsx (100%) create mode 100644 packages/baselinks/src/app/utils/networks.ts create mode 100644 packages/baselinks/src/app/utils/resolver.ts rename packages/{framekit => baselinks}/src/app/wallet/page.tsx (100%) rename packages/{framekit => baselinks}/src/components/Chat.module.css (100%) create mode 100644 packages/baselinks/src/components/Chat.tsx rename packages/{framekit => baselinks}/src/components/PaymentFrame.tsx (100%) rename packages/{framekit => baselinks}/src/components/ReceiptGenerator.tsx (100%) rename packages/{framekit => baselinks}/src/components/UrlGenerator.tsx (100%) create mode 100644 packages/baselinks/src/components/UrlPreview.tsx create mode 100644 packages/baselinks/tsconfig.json create mode 100644 packages/baselinks/vercel.json create mode 100644 packages/docs/vocs.config.tsx.timestamp-1734838080672-555165cda1cb2.mjs create mode 100644 packages/docs/vocs.config.tsx.timestamp-1734838080676-8f5d6f6bfcf92.mjs create mode 100644 packages/docs/vocs.config.tsx.timestamp-1734838080741-1ac173819a28.mjs delete mode 100644 packages/framekit/README.md rename packages/message-kit/src/plugins/{framekit.ts => baselinks.ts} (98%) diff --git a/.changeset/config.json b/.changeset/config.json index d51a7f0cb..ee97a7e12 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -12,5 +12,5 @@ "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", - "ignore": ["framekit", "docs", "@xmtp/tsconfig"] + "ignore": ["baselinks", "agent-client", "docs", "@xmtp/tsconfig"] } diff --git a/README.md b/README.md index b1774d99f..8b6f50d7d 100644 --- a/README.md +++ b/README.md @@ -12,10 +12,14 @@ A set of tools for AI developers to build on top of [XMTP](https://xmtp.org) ### Plugins -- [`framekit`](/packages/framekit): A suite for backend frames - [`xmtp`](/packages/xmtp/): A node js wrapper for AI agents. - [`xmtp-client`](/packages/xmtp-client/): A client plugin for interacting with hte backend. +### Other + +- [`agent-client`](/packages/agent-client): A suite for backend frames +- [`baselinks`](/packages/baselinks): A suite for backend frames + ## Contributing See our [contribution guide](./CONTRIBUTING.md) to learn more about contributing to this project. diff --git a/community/plugins.json b/community/plugins.json index e9d014a32..4b6fd09db 100644 --- a/community/plugins.json +++ b/community/plugins.json @@ -14,9 +14,9 @@ "author": "ephemeraHQ" }, { - "href": "/plugins/framekit", - "title": "FrameKit", - "description": "Use FrameKit to send frames.", + "href": "/plugins/baselinks", + "title": "Baselinks", + "description": "Use Baselinks to send frames.", "icon": "🖼️", "author": "ephemeraHQ" }, diff --git a/package.json b/package.json index 021488664..7a0952280 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ ], "scripts": { "build": "yarn build:message-kit && yarn build:packages && yarn build:templates", + "build:agent-client": "turbo run build --filter=./packages/agent-client --force", "build:message-kit": "turbo run build --filter=./packages/message-kit --force", "build:packages": "turbo run build --filter='./packages/*' --filter='!./packages/message-kit'", "build:templates": "turbo run build --filter='./templates/*'", @@ -21,18 +22,19 @@ "cli": "node packages/create-message-kit/index.js", "copy": "node scripts/copyTemplates.js", "dev": "yarn build:xmtp && cd packages/message-kit && yarn build:watch", + "dm": "yarn build:agent-client && cd packages/agent-client && yarn dev", "docs": "cd packages/docs && yarn dev", "domain": "ngrok http --hostname=frames.ngrok.app 3000", "format": "turbo run format", - "framekit": "yarn build:xmtp-client && cd packages/framekit && yarn dev", + "links": "yarn build:xmtp-client && cd packages/links && yarn dev", "play": "cd templates/playground && yarn dev", "publish": "yarn install && yarn build && yarn copy && node scripts/publish.js", "templates": "node scripts/devTemplates.js", "test": "FORCE_COLOR=1 turbo run test --force --concurrency=1", "test:client": "cd packages/xmtp/tests && yarn test:client", "test:flow": "cd packages/message-kit/tests && yarn test:flow", - "test:framekit": "cd packages/message-kit/tests && yarn test:framekit", "test:intent": "cd packages/message-kit/tests && yarn test:intent", + "test:links": "cd packages/message-kit/tests && yarn test:links", "test:parsing": "cd packages/message-kit/tests && yarn test:parsing", "test:prompt": "cd packages/message-kit/tests && yarn test:prompt", "typecheck": "FORCE_COLOR=1 turbo run typecheck" diff --git a/packages/framekit/.gitignore b/packages/agent-client/.gitignore similarity index 100% rename from packages/framekit/.gitignore rename to packages/agent-client/.gitignore diff --git a/packages/framekit/.yarnrc.yml b/packages/agent-client/.yarnrc.yml similarity index 100% rename from packages/framekit/.yarnrc.yml rename to packages/agent-client/.yarnrc.yml diff --git a/packages/agent-client/README.md b/packages/agent-client/README.md new file mode 100644 index 000000000..0acd6e98d --- /dev/null +++ b/packages/agent-client/README.md @@ -0,0 +1,3 @@ +# Baselinks + +See [Baselinks](https://message-kit.org/plugins/baselinks) in MessageKit diff --git a/packages/framekit/next.config.js b/packages/agent-client/next.config.js similarity index 100% rename from packages/framekit/next.config.js rename to packages/agent-client/next.config.js diff --git a/packages/agent-client/package.json b/packages/agent-client/package.json new file mode 100644 index 000000000..dd1e03b83 --- /dev/null +++ b/packages/agent-client/package.json @@ -0,0 +1,35 @@ +{ + "name": "agent-client", + "version": "0.1.0", + "private": true, + "scripts": { + "build": "next build ", + "dev": "next dev", + "lint": "next lint", + "start": "next start" + }, + "dependencies": { + "@farcaster/frame-sdk": "0.0.10", + "@types/next": "^9.0.0", + "cheerio": "^1.0.0", + "ethers": "^6.13.4", + "geist": "^1.3.1", + "next": "^15.0.3", + "qrcode": "^1.5.4", + "qrcode.react": "^4.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "viem": "^2.21.45", + "xmtp-client": "workspace:*" + }, + "devDependencies": { + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "typescript": "^5" + }, + "packageManager": "yarn@4.5.1", + "engines": { + "node": ">=20" + } +} diff --git a/packages/framekit/public/fonts/GeistMonoVF.woff b/packages/agent-client/public/fonts/GeistMonoVF.woff similarity index 100% rename from packages/framekit/public/fonts/GeistMonoVF.woff rename to packages/agent-client/public/fonts/GeistMonoVF.woff diff --git a/packages/framekit/public/fonts/GeistVF.woff b/packages/agent-client/public/fonts/GeistVF.woff similarity index 100% rename from packages/framekit/public/fonts/GeistVF.woff rename to packages/agent-client/public/fonts/GeistVF.woff diff --git a/packages/framekit/public/fonts/Inter-Regular.ttf b/packages/agent-client/public/fonts/Inter-Regular.ttf similarity index 100% rename from packages/framekit/public/fonts/Inter-Regular.ttf rename to packages/agent-client/public/fonts/Inter-Regular.ttf diff --git a/packages/framekit/public/fonts/Inter-SemiBold.ttf b/packages/agent-client/public/fonts/Inter-SemiBold.ttf similarity index 100% rename from packages/framekit/public/fonts/Inter-SemiBold.ttf rename to packages/agent-client/public/fonts/Inter-SemiBold.ttf diff --git a/packages/framekit/public/hero.jpg b/packages/agent-client/public/hero.jpg similarity index 100% rename from packages/framekit/public/hero.jpg rename to packages/agent-client/public/hero.jpg diff --git a/packages/framekit/public/messagekit-logo.png b/packages/agent-client/public/messagekit-logo.png similarity index 100% rename from packages/framekit/public/messagekit-logo.png rename to packages/agent-client/public/messagekit-logo.png diff --git a/packages/framekit/src/app/api/og/route.ts b/packages/agent-client/src/app/api/og/route.ts similarity index 100% rename from packages/framekit/src/app/api/og/route.ts rename to packages/agent-client/src/app/api/og/route.ts diff --git a/packages/framekit/src/app/favicon.ico b/packages/agent-client/src/app/favicon.ico similarity index 100% rename from packages/framekit/src/app/favicon.ico rename to packages/agent-client/src/app/favicon.ico diff --git a/packages/framekit/src/app/fonts/GeistMonoVF.woff b/packages/agent-client/src/app/fonts/GeistMonoVF.woff similarity index 100% rename from packages/framekit/src/app/fonts/GeistMonoVF.woff rename to packages/agent-client/src/app/fonts/GeistMonoVF.woff diff --git a/packages/framekit/src/app/fonts/GeistVF.woff b/packages/agent-client/src/app/fonts/GeistVF.woff similarity index 100% rename from packages/framekit/src/app/fonts/GeistVF.woff rename to packages/agent-client/src/app/fonts/GeistVF.woff diff --git a/packages/framekit/src/app/globals.css b/packages/agent-client/src/app/globals.css similarity index 100% rename from packages/framekit/src/app/globals.css rename to packages/agent-client/src/app/globals.css diff --git a/packages/framekit/src/app/layout.tsx b/packages/agent-client/src/app/layout.tsx similarity index 100% rename from packages/framekit/src/app/layout.tsx rename to packages/agent-client/src/app/layout.tsx diff --git a/packages/agent-client/src/app/page.module.css b/packages/agent-client/src/app/page.module.css new file mode 100644 index 000000000..f1467a745 --- /dev/null +++ b/packages/agent-client/src/app/page.module.css @@ -0,0 +1,168 @@ +.page { + --gray-rgb: 255, 255, 255; + --gray-alpha-200: rgba(var(--gray-rgb), 0.08); + --gray-alpha-100: rgba(var(--gray-rgb), 0.05); + + --button-primary-hover: #0052ff; + --button-secondary-hover: #e6f0ff; + + display: grid; + grid-template-rows: 20px 1fr 20px; + align-items: center; + justify-items: center; + min-height: 100svh; + padding: 80px; + gap: 64px; + font-family: var(--font-geist-sans); +} + +@media (prefers-color-scheme: dark) { + .page { + --gray-rgb: 0, 0, 0; + --gray-alpha-200: rgba(var(--gray-rgb), 0.145); + --gray-alpha-100: rgba(var(--gray-rgb), 0.06); + + --button-primary-hover: #003bb3; + --button-secondary-hover: #1a1a1a; + } +} + +.main { + display: flex; + flex-direction: column; + gap: 32px; + grid-row-start: 2; +} + +.main ol { + font-family: var(--font-geist-mono); + padding-left: 0; + margin: 0; + font-size: 14px; + line-height: 24px; + letter-spacing: -0.01em; + list-style-position: inside; +} + +.main li:not(:last-of-type) { + margin-bottom: 8px; +} + +.main code { + font-family: inherit; + background: var(--gray-alpha-100); + padding: 2px 4px; + border-radius: 4px; + font-weight: 600; +} + +.ctas { + display: flex; + gap: 16px; +} + +.ctas a { + appearance: none; + border-radius: 128px; + height: 48px; + padding: 0 20px; + border: none; + border: 1px solid transparent; + transition: + background 0.2s, + color 0.2s, + border-color 0.2s; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + font-size: 16px; + line-height: 20px; + font-weight: 500; +} + +a.primary { + background: #0052ff; + color: #ffffff; + gap: 8px; +} + +a.secondary { + border-color: #e6f0ff; + min-width: 180px; +} + +.footer { + grid-row-start: 3; + display: flex; + gap: 24px; +} + +.footer a { + display: flex; + align-items: center; + gap: 8px; +} + +.footer img { + flex-shrink: 0; +} + +/* Enable hover only on non-touch devices */ +@media (hover: hover) and (pointer: fine) { + a.primary:hover { + background: var(--button-primary-hover); + border-color: transparent; + } + + a.secondary:hover { + background: var(--button-secondary-hover); + border-color: transparent; + } + + .footer a:hover { + text-decoration: underline; + text-underline-offset: 4px; + } +} + +@media (max-width: 600px) { + .page { + padding: 32px; + padding-bottom: 80px; + } + + .main { + align-items: center; + } + + .main ol { + text-align: center; + } + + .ctas { + flex-direction: column; + } + + .ctas a { + font-size: 14px; + height: 40px; + padding: 0 16px; + } + + a.secondary { + min-width: auto; + } + + .footer { + flex-wrap: wrap; + align-items: center; + justify-content: center; + } +} + +@media (prefers-color-scheme: dark) { + .logo { + filter: invert(); + } +} diff --git a/packages/agent-client/src/app/page.tsx b/packages/agent-client/src/app/page.tsx new file mode 100644 index 000000000..d37bbc39a --- /dev/null +++ b/packages/agent-client/src/app/page.tsx @@ -0,0 +1,89 @@ +"use client"; +import React, { Suspense, useEffect, useState } from "react"; +import { useSearchParams } from "next/navigation"; +import sdk, { type FrameContext } from "@farcaster/frame-sdk"; +import { getUserInfo, type UserInfo } from "@/app/utils/resolver"; +import Chat from "../components/Chat"; + +export default function Home(): JSX.Element { + return ( + Loading...}> + + + ); +} + +function HomeContent(): JSX.Element { + const searchParams = useSearchParams(); + const address = searchParams.get("address"); + console.log("address", address); + const [user, setUser] = useState(null); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const fetchUserInfo = async () => { + try { + console.log("Fetching user info for address:", address); + const userInfo = await getUserInfo(address as string); + console.log("Fetched user info:", userInfo); + + setUser(userInfo ?? null); + } catch (error) { + console.error("Error fetching user info:", error); + } finally { + setLoading(false); + } + }; + fetchUserInfo(); + }, [address]); + + if (loading) { + return
Loading...
; + } + + if (!user) { + return
User not found
; + } + + return ( + + Loading...}> + + + + ); +} + +// Create a wrapper component that will render the full HTML +function FrameHTML({ + children, + user, +}: { + children: React.ReactNode; + user: UserInfo; +}) { + return <>{children}; +} + +function ChatContent({ user }: { user: UserInfo }): JSX.Element { + const [isSDKLoaded, setIsSDKLoaded] = useState(false); + const [context, setContext] = useState(); + + useEffect(() => { + const initFrame = async () => { + setContext(await sdk.context); + sdk.actions.ready(); + }; + + if (sdk && !isSDKLoaded) { + setIsSDKLoaded(true); + initFrame(); + } + }, [isSDKLoaded]); + + return ( +
+ +
+ ); +} diff --git a/packages/framekit/src/app/utils/networks.ts b/packages/agent-client/src/app/utils/networks.ts similarity index 100% rename from packages/framekit/src/app/utils/networks.ts rename to packages/agent-client/src/app/utils/networks.ts diff --git a/packages/framekit/src/app/utils/resolver.ts b/packages/agent-client/src/app/utils/resolver.ts similarity index 100% rename from packages/framekit/src/app/utils/resolver.ts rename to packages/agent-client/src/app/utils/resolver.ts diff --git a/packages/agent-client/src/components/Chat.module.css b/packages/agent-client/src/components/Chat.module.css new file mode 100644 index 000000000..c1fe43c07 --- /dev/null +++ b/packages/agent-client/src/components/Chat.module.css @@ -0,0 +1,239 @@ +/* Chat Container */ +.chatContainer { + display: flex; + flex-direction: column; + height: 100%; + height: -webkit-fill-available; /* iOS viewport fix */ + background-color: #ffffff; + color: #0052ff; + font-family: monospace; + padding: 0.75rem; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +/* Wallet Info Section */ +.walletInfo { + background-color: #e0e0e0; + padding: 0.75rem; + margin-bottom: 0.75rem; + border-radius: 8px; + font-size: 1rem; +} + +/* Messages Container */ +.messagesContainer { + flex: 1; + overflow-y: auto; + padding: 0.5rem; + display: flex; + flex-direction: column; + gap: 0.5rem; + margin-bottom: env(safe-area-inset-bottom); + -webkit-overflow-scrolling: touch; + position: relative; + height: auto; +} + +/* Message Bubbles */ +.message { + display: flex; + align-items: flex-start; + padding: 0.5rem; + line-height: 1.3; + font-size: 0.95rem; + white-space: pre-wrap; + color: #0052ff; +} + +.sender { + color: #0052ff; + margin-right: 0.375rem; + font-weight: bold; +} + +/* Message Form */ +.messageForm { + position: sticky; + bottom: 0; + left: 0; + right: 0; + padding: 0.75rem; + background-color: #ffffff; + margin: 0 -0.75rem -0.75rem; + padding-bottom: calc(0.75rem + env(safe-area-inset-bottom)); +} + +/* Input Field */ +.inputWrapper { + display: flex; + gap: 0.5rem; + width: 100%; +} + +.input { + flex: 1; + background-color: #e0e0e0; + border: 1px solid #b0b0b0; + color: #0052ff; + padding: 0 1rem; + font-family: monospace; + font-size: 1rem; + height: 48px; + border-radius: 8px; + line-height: 48px; + -webkit-appearance: none; + appearance: none; +} + +.input:focus { + outline: none; + border-color: #0052ff; +} + +/* Send Button */ +.sendButton { + background-color: #0052ff; + color: #ffffff; + border: none; + cursor: pointer; + font-family: monospace; + height: 48px; + border-radius: 8px; + font-size: 1rem; + font-weight: 600; + min-width: 80px; + transition: background-color 0.2s; +} + +.sendButton:hover { + background-color: #0041cc; +} + +.sendButton:active { + background-color: #0033a1; +} + +/* Add these new mobile-specific styles */ +@media (max-width: 768px) { + .chatContainer { + padding: 0.375rem; + height: 100%; + position: absolute; + } + + .messageForm { + position: sticky; + bottom: 0; + background-color: #ffffff; + padding: 0.5rem; + padding-bottom: calc(0.5rem + env(safe-area-inset-bottom)); + margin: 0 -0.375rem -0.375rem; + z-index: 2; + } + + .messagesContainer { + padding-bottom: 0; + margin-bottom: 0; + flex: 1 1 auto; + } + + .walletInfo { + padding: 0.5rem; + margin-bottom: 0.5rem; + font-size: 0.9rem; + } + + /* Prevent zoom on input focus for iOS */ + .input { + font-size: 16px; + } +} + +/* Add support for iOS safe areas */ +@supports (padding: max(0px)) { + .chatContainer { + padding-left: max(0.75rem, env(safe-area-inset-left)); + padding-right: max(0.75rem, env(safe-area-inset-right)); + padding-bottom: max(0.75rem, env(safe-area-inset-bottom)); + } +} + +/* iOS viewport height fix */ +@supports (-webkit-touch-callout: none) { + .chatContainer { + height: -webkit-fill-available; + } + + .messagesContainer { + height: auto; + min-height: 0; + } +} + +.urlContainer { + margin: 8px 0; + display: flex; + flex-direction: column; + gap: 8px; + max-width: 300px; + background: #e0e0e0; +} + +.urlPreview { + border-radius: 8px 8px 0 0; + overflow: hidden; + background: #ffffff; + border: 1px solid #b0b0b0; + width: 100%; +} + +.previewImage { + width: 100%; + height: 150px; + object-fit: cover; +} + +.buttonContainer { + display: flex; + gap: 1px; + width: 100%; + background: #b0b0b0; +} + +.urlButton { + flex: 1; + padding: 12px; + border: none; + background-color: #0052ff; + color: #ffffff; + cursor: pointer; + font-size: 14px; + transition: all 0.2s; + width: 100%; + text-align: center; +} + +.urlButton:hover { + background-color: #0041cc; +} + +.messageLink { + color: #0052ff; + text-decoration: underline; + word-break: break-all; + width: 100%; + display: block; +} + +.loadingContainer { + display: flex; + justify-content: center; + align-items: center; + padding: 1rem; + color: #0052ff; + font-size: 0.9rem; +} diff --git a/packages/framekit/src/components/Chat.tsx b/packages/agent-client/src/components/Chat.tsx similarity index 98% rename from packages/framekit/src/components/Chat.tsx rename to packages/agent-client/src/components/Chat.tsx index b75fec3dd..367412821 100644 --- a/packages/framekit/src/components/Chat.tsx +++ b/packages/agent-client/src/components/Chat.tsx @@ -228,7 +228,9 @@ function Chat({ user }: { user: UserInfo }) { {messages.map((msg, index) => (
- {msg.sender.address === user.address ? "Agent" : "Human"} + {msg.sender.address.toLowerCase() === user.address?.toLowerCase() + ? "Agent" + : "Human"} {renderMessageContent(msg.content?.text as string)}
diff --git a/packages/framekit/src/components/UrlPreview.tsx b/packages/agent-client/src/components/UrlPreview.tsx similarity index 100% rename from packages/framekit/src/components/UrlPreview.tsx rename to packages/agent-client/src/components/UrlPreview.tsx diff --git a/packages/framekit/tsconfig.json b/packages/agent-client/tsconfig.json similarity index 100% rename from packages/framekit/tsconfig.json rename to packages/agent-client/tsconfig.json diff --git a/packages/framekit/vercel.json b/packages/agent-client/vercel.json similarity index 100% rename from packages/framekit/vercel.json rename to packages/agent-client/vercel.json diff --git a/packages/baselinks/.gitignore b/packages/baselinks/.gitignore new file mode 100644 index 000000000..b85faa397 --- /dev/null +++ b/packages/baselinks/.gitignore @@ -0,0 +1,30 @@ +# Dependencies +node_modules +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions + +# Build outputs +.next +dist +out +build + +# Environment files +.env +.env.local +.env.development +.env.test +.env.production + +# System files +.DS_Store + +# Cache and logs +.turbo +.vocs +.vercel diff --git a/packages/baselinks/.yarnrc.yml b/packages/baselinks/.yarnrc.yml new file mode 100644 index 000000000..77ffe90a8 --- /dev/null +++ b/packages/baselinks/.yarnrc.yml @@ -0,0 +1,7 @@ +compressionLevel: mixed + +enableGlobalCache: false + +enableTelemetry: false + +nodeLinker: node-modules diff --git a/packages/baselinks/README.md b/packages/baselinks/README.md new file mode 100644 index 000000000..0acd6e98d --- /dev/null +++ b/packages/baselinks/README.md @@ -0,0 +1,3 @@ +# Baselinks + +See [Baselinks](https://message-kit.org/plugins/baselinks) in MessageKit diff --git a/packages/baselinks/next.config.js b/packages/baselinks/next.config.js new file mode 100644 index 000000000..658404ac6 --- /dev/null +++ b/packages/baselinks/next.config.js @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {}; + +module.exports = nextConfig; diff --git a/packages/framekit/package.json b/packages/baselinks/package.json similarity index 96% rename from packages/framekit/package.json rename to packages/baselinks/package.json index af23ba9e0..128825398 100644 --- a/packages/framekit/package.json +++ b/packages/baselinks/package.json @@ -1,5 +1,5 @@ { - "name": "framekit", + "name": "baselinks", "version": "0.1.0", "private": true, "scripts": { diff --git a/packages/baselinks/public/fonts/GeistMonoVF.woff b/packages/baselinks/public/fonts/GeistMonoVF.woff new file mode 100644 index 0000000000000000000000000000000000000000..f2ae185cbfd16946a534d819e9eb03924abbcc49 GIT binary patch literal 67864 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ϣ%UY8`RWp~V-U_7 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 CLkb=M literal 0 HcmV?d00001 diff --git a/packages/baselinks/public/fonts/GeistVF.woff b/packages/baselinks/public/fonts/GeistVF.woff new file mode 100644 index 0000000000000000000000000000000000000000..1b62daacff96dad6584e71cd962051b82957c313 GIT binary patch literal 66268 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 >-Aun5A4Gp>4U0IQJ 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 G)cz05(PHWV literal 0 HcmV?d00001 diff --git a/packages/baselinks/public/fonts/Inter-Regular.ttf b/packages/baselinks/public/fonts/Inter-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5e4851f0ab7e0268da6ce903306e2f871ee19821 GIT binary patch literal 310252 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 z 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%0D1lG~DE2ff7BeoTnFxKM!4172W=IjHdV9zf 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

+ ); + } catch (error) { + console.error("Error rendering URL content:", error); + return part; + } + } + return part; + }); + }; + + return ( +
+
+
+ Agent: + {user?.preferredName || + (user?.address && isAddress(user.address) + ? user.address.slice(0, 6) + "..." + user.address.slice(-4) + : user?.address)} +
+
+ {isLoading && ( +
+ Loading messages... +
+ )} +
+ {messages.map((msg, index) => ( +
+ + {msg.sender.address.toLowerCase() === user.address?.toLowerCase() + ? "Agent" + : "Human"} + + {renderMessageContent(msg.content?.text as string)} +
+ ))} +
+
+
+ setNewMessage(e.target.value)} + placeholder={ + isLoading ? "Initializing XMTP..." : "Type a message..." + } + className={styles.input} + disabled={isLoading} + /> + +
+
+
+ ); +} + +export default React.memo(Chat); diff --git a/packages/framekit/src/components/PaymentFrame.tsx b/packages/baselinks/src/components/PaymentFrame.tsx similarity index 100% rename from packages/framekit/src/components/PaymentFrame.tsx rename to packages/baselinks/src/components/PaymentFrame.tsx diff --git a/packages/framekit/src/components/ReceiptGenerator.tsx b/packages/baselinks/src/components/ReceiptGenerator.tsx similarity index 100% rename from packages/framekit/src/components/ReceiptGenerator.tsx rename to packages/baselinks/src/components/ReceiptGenerator.tsx diff --git a/packages/framekit/src/components/UrlGenerator.tsx b/packages/baselinks/src/components/UrlGenerator.tsx similarity index 100% rename from packages/framekit/src/components/UrlGenerator.tsx rename to packages/baselinks/src/components/UrlGenerator.tsx diff --git a/packages/baselinks/src/components/UrlPreview.tsx b/packages/baselinks/src/components/UrlPreview.tsx new file mode 100644 index 000000000..c9d98d99d --- /dev/null +++ b/packages/baselinks/src/components/UrlPreview.tsx @@ -0,0 +1,68 @@ +import { useState, useEffect } from "react"; +import styles from "./Chat.module.css"; + +interface OgData { + image?: string; + title?: string; + description?: string; + url?: string; +} + +export const UrlPreview = ({ + url, + urlType, +}: { + url: string; + urlType?: string; +}) => { + const [ogData, setOgData] = useState(null); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const fetchOGData = async () => { + try { + const decodedUrl = decodeURIComponent(url); + console.log("Fetching OG data for URL:", decodedUrl); + + // Use the /api/og endpoint to avoid CORS + const response = await fetch( + `/api/og?url=${encodeURIComponent(decodedUrl)}`, + ); + + if (!response.ok) { + throw new Error(`Failed to fetch OG data: ${response.status}`); + } + + const data = await response.json(); + console.log("Extracted OG data:", data); + setOgData(data); + } catch (error) { + console.error("Error fetching OG data:", error); + } finally { + setLoading(false); + } + }; + + if (url) { + fetchOGData(); + } + }, [url]); + + if (loading) { + return
Loading preview...
; + } + + if (!ogData?.image) { + return null; + } + + return ( +
+ {ogData.title +
+ ); +}; diff --git a/packages/baselinks/tsconfig.json b/packages/baselinks/tsconfig.json new file mode 100644 index 000000000..c751961a0 --- /dev/null +++ b/packages/baselinks/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + }, + "target": "ES2017", + "baseUrl": "." + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + "next.config.js" + ], + "exclude": ["node_modules"] +} diff --git a/packages/baselinks/vercel.json b/packages/baselinks/vercel.json new file mode 100644 index 000000000..9752d128d --- /dev/null +++ b/packages/baselinks/vercel.json @@ -0,0 +1,7 @@ +{ + "outputDirectory": ".next", + "framework": "nextjs", + "env": { + "VERCEL_FORCE_NO_CACHE": "1" + } +} diff --git a/packages/create-message-kit/package.json b/packages/create-message-kit/package.json index 7d1f8e41b..dfbe6464c 100644 --- a/packages/create-message-kit/package.json +++ b/packages/create-message-kit/package.json @@ -36,4 +36,4 @@ "access": "public", "registry": "https://registry.npmjs.org/" } -} \ No newline at end of file +} diff --git a/packages/docs/pages/changelog.mdx b/packages/docs/pages/changelog.mdx index 2de8f247a..25ee379a5 100644 --- a/packages/docs/pages/changelog.mdx +++ b/packages/docs/pages/changelog.mdx @@ -50,7 +50,7 @@ - Introduced a new `Video` component for enhanced documentation presentation. - Added a new `XMTP` class for managing conversations and groups using the XMTP protocol. - - Enhanced `FrameKit` functionality for simplified receipt generation and wallet interactions. + - Enhanced `baselinks` functionality for simplified receipt generation and wallet interactions. - Added a `getWalletCount` method to the `LocalStorage` class for counting wallet files. - Implemented a new content type for agent messages, including encoding and decoding logic. @@ -71,7 +71,7 @@ - Removed unused imports and simplified user notification messages in the concierge skill. - Cleaned up documentation by removing obsolete sections and files. - Removed the "Introduction" entry from the sidebar configuration. - - Updated URL formats in the FrameKit documentation for receipts. + - Updated URL formats in the baselinks documentation for receipts. ## 1.2.29 @@ -86,7 +86,7 @@ - **Documentation Updates** - - Enhanced clarity and detail in XMTP, FrameKit, and WalletService documentation. + - Enhanced clarity and detail in XMTP, baselinks, and WalletService documentation. - Streamlined the quickstart guide with improved section headers and content organization. - Removed redundant sections from various documentation files to focus on essential information. - Updated the `example_prompt.md` files for various templates to reflect new commands and user context. @@ -103,7 +103,7 @@ - **New Features** - - Introduced a new `framekit` plugin for sending frames. + - Introduced a new `baselinks` plugin for sending frames. - Added a new "Toss" template for a Cointoss bot, expanding user options. ## 1.2.27 diff --git a/packages/docs/pages/plugins/framekit.mdx b/packages/docs/pages/plugins/framekit.mdx index 0f1189ff9..6ab9dfcc4 100644 --- a/packages/docs/pages/plugins/framekit.mdx +++ b/packages/docs/pages/plugins/framekit.mdx @@ -1,11 +1,10 @@ -# FrameKit +# BaseLinks MessageKit enables developers to create interactive elements (frames) inside messaging applications. These frames can be used for various purposes such as handling payments, displaying transaction receipts, managing conversations, and creating custom interactive interfaces. - `Payment Frames`: Request and handle cryptocurrency payments - `Receipt Frames`: Display transaction confirmations -- `Conversation Frames`: Manage DMs and group messages -- `Custom Frames`: Create custom interactive UI elements +- `Wallet Details`: Send wallet info ## Request payment @@ -13,7 +12,7 @@ You can request payments using the payment frame: ```typescript // Request 1 USDC payment to a specific address -const url = await FrameKit.requestPayment(recipientAddress, 1, "USDC"); +const url = await baselinks.requestPayment(recipientAddress, 1, "USDC"); // Send the url to the user await context.send(url); @@ -25,7 +24,7 @@ You can send agent wallet info using the `sendWallet` method: ```typescript // Send agent wallet info -const url = await FrameKit.sendWallet( +const url = await baselinks.sendWallet( "0x93E2fc3e99dFb1238eB9e0eF2580EFC5809C7204", ); @@ -45,7 +44,7 @@ You can request receipts using the receipt frame: ```typescript // Request a receipt -const url = await FrameKit.sendReceipt(urlOfTransaction); +const url = await baselinks.sendReceipt(urlOfTransaction); // Send the url to the user await context.send(url); @@ -55,34 +54,7 @@ Properties: - `url`: URL of the transaction receipt scanner like basescan, etherscan, etc. -## Converse - -You can send messages to a user or group on Converse using the `sendConverseDmFrame` and `sendConverseGroupFrame` methods. - -```typescript -// Send a message to a user -const url = await FrameKit.converseLink(userAddress); - -// Send the url to the user -await context.send(url); - -// Send a message to a user with an optional pretext -const url = await FrameKit.converseLink(userAddress, "Hello, how are you?"); - -// Send the url to the user -await context.send(url); - -// Send a message to a group -const url = await FrameKit.converseGroup(groupId); - -// Send a message to a group with an optional pretext -const url = await FrameKit.converseGroup(groupId, "gm all!"); - -// Send the url to the user -await context.send(url); -``` - -## Coinbase +## Deeplinks :::warning Coinbase does not render frames but you can deeplink into other users inside the wallet. @@ -92,57 +64,3 @@ Coinbase does not render frames but you can deeplink into other users inside the // Send a message to a user with an optional pretext await context.coinbaseLink(userAddress); ``` - -## Custom - -Custom frames allow you to create interactive UI elements. Here's how to create a token price frame: - -```typescript -const frame = { - title: "Weather Update", - buttons: [ - { - content: "View Forecast", - action: "link", - target: "https://example.com/forecast", - }, - { - content: "Current Temperature (75°F)", - action: "link", - target: "https://example.com/current-temperature", - }, - ], - image: "https://example.com/weather.png", -}; - -const url = await FrameKit.sendCustomFrame(frame); - -// Send the url to the user -await context.send(url); -``` - -Properties: - -- `title`: The header text of your frame -- `buttons`: Array of interactive buttons (max 2) -- `image`: URL of the image to display -- `action`: Type of button action ("link" or "post") -- `target`: Destination URL for button clicks - -:::info - -## Open Frames - -In compliance with [Open Frames](https://www.openframes.xyz/), use a meta tag in your frame's HTML to declare the client protocols your frame supports. - -```html - -``` - -These are quickstarts for different Frameworks that support Open Frames - -- [OnchainKit Quickstart](https://github.com/ephemeraHQ/open-frames-starter-onchainkit/): Onchain Kit quickstart that integrates XMTP. -- [Frog Quickstart](https://github.com/ephemeraHQ/open-frames-starter-frog): Frog XMTP quickstart -- [Frames.js Quickstart](https://github.com/ephemeraHQ/open-frames-starter-framesjs/): Frames.js quickstart that integrates XMTP. - -::: diff --git a/packages/docs/pages/skills/concierge.mdx b/packages/docs/pages/skills/concierge.mdx index 50a77eca6..9533fefe4 100644 --- a/packages/docs/pages/skills/concierge.mdx +++ b/packages/docs/pages/skills/concierge.mdx @@ -50,7 +50,7 @@ async function fund(context: Context, amount: number) { amount, walletData.agent_address, ); - const url = await FrameKit.requestPayment( + const url = await baselinks.requestPayment( walletData.agent_address, amount, "USDC", diff --git a/packages/docs/pages/ux/frames.mdx b/packages/docs/pages/ux/frames.mdx index 3e66d278a..1457c22b0 100644 --- a/packages/docs/pages/ux/frames.mdx +++ b/packages/docs/pages/ux/frames.mdx @@ -19,14 +19,14 @@ Share in Farcaster (Framev2): https://frames.message-kit.org/dm/0x... - `address`: The address of the agent. Could be converse profile name , ens name or address -## Framekit +## Baselinks -Framekit is a way to generate dynamic urls for your agent. They can work on Browsers or in a frame rendering environment. +Baselinks is a way to generate dynamic urls for your agent. They can work on Browsers or in a frame rendering environment. diff --git a/packages/docs/vocs.config.tsx.timestamp-1734838080672-555165cda1cb2.mjs b/packages/docs/vocs.config.tsx.timestamp-1734838080672-555165cda1cb2.mjs new file mode 100644 index 000000000..ddb5b0f86 --- /dev/null +++ b/packages/docs/vocs.config.tsx.timestamp-1734838080672-555165cda1cb2.mjs @@ -0,0 +1,182 @@ +// vocs.config.tsx +import { defineConfig } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/vocs/_lib/index.js"; +import { Fragment, jsx, jsxs } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/react/jsx-runtime.js"; +var vocs_config_default = defineConfig({ + head: () => { + return /* @__PURE__ */ jsxs(Fragment, { children: [ + /* @__PURE__ */ jsx("meta", { charSet: "utf-8" }), + /* @__PURE__ */ jsx("meta", { name: "viewport", content: "width=device-width" }), + /* @__PURE__ */ jsx("meta", { property: "og:title", content: "MessageKit" }), + /* @__PURE__ */ jsx("meta", { property: "og:image", content: "https://message-kit.org/hero.jpg" }), + /* @__PURE__ */ jsx("meta", { property: "fc:frame", content: "vNext" }), + /* @__PURE__ */ jsx("meta", { property: "of:version", content: "vNext" }), + /* @__PURE__ */ jsx("meta", { property: "of:accepts:xmtp", content: "vNext" }), + /* @__PURE__ */ jsx("meta", { property: "of:image", content: "https://message-kit.org/hero.jpg" }), + /* @__PURE__ */ jsx( + "meta", + { + property: "fc:frame:image", + content: "https://message-kit.org/hero.jpg" + } + ), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1", content: "Docs" }), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1:action", content: "link" }), + /* @__PURE__ */ jsx( + "meta", + { + property: "fc:frame:button:1:target", + content: "https://message-kit.org/" + } + ), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2", content: "Drop a \u2B50\uFE0F" }), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2:action", content: "link" }), + /* @__PURE__ */ jsx( + "meta", + { + property: "fc:frame:button:2:target", + content: "https://github.com/ephemeraHQ/message-kit" + } + ), + /* @__PURE__ */ jsx("meta", { property: "og:site_name", content: "MessageKit" }), + /* @__PURE__ */ jsx("meta", { name: "twitter:card", content: "summary_large_image" }), + /* @__PURE__ */ jsx("meta", { name: "twitter:site", content: "@MessageKit" }), + /* @__PURE__ */ jsx("meta", { name: "twitter:title", content: "MessageKit" }), + /* @__PURE__ */ jsx( + "meta", + { + name: "twitter:description", + content: "MessageKit is a powerful tool for managing your messages." + } + ), + /* @__PURE__ */ jsx("meta", { name: "twitter:image", content: "https://message-kit.org/hero.jpg" }), + /* @__PURE__ */ jsx( + "script", + { + src: "https://plausible.io/js/script.outbound-links.js", + "data-domain": "message-kit.org", + defer: true + } + ) + ] }); + }, + ogImageUrl: { + "/": "/hero.jpg", + "/docs": "/hero.jpg" + }, + title: "MessageKit", + rootDir: ".", + iconUrl: { + light: "/messagekit-logo.png", + dark: "/messagekit-logo.png" + }, + theme: { + accentColor: { + light: "#FA6977", + dark: "#FA6977" + } + }, + socials: [ + { + icon: "github", + link: "https://github.com/ephemeraHQ/message-kit" + } + ], + topNav: [{ text: "Changelog", link: "/changelog" }], + editLink: { + pattern: "https://github.com/ephemeraHQ/message-kit/blob/main/packages/docs/pages/:path", + text: "Suggest changes to this page" + }, + sidebar: [ + { + text: "Quickstart", + link: "/quickstart" + }, + { + text: "UX", + items: [ + { + text: "Concierge", + link: "/skills/concierge" + }, + { + text: "Frames", + link: "/ux/frames" + }, + { + text: "Wallet service", + link: "/ux/wallet-service" + }, + { + text: "Groups", + link: "/ux/groups" + } + ] + }, + { + text: "Community", + items: [ + { + text: "Skills", + link: "/community/skills" + }, + { + text: "Plugins", + link: "/community/plugins" + }, + { + text: "Templates", + link: "/community/templates" + }, + { + text: "Vibes", + link: "/community/vibes" + }, + { + text: "Projects", + link: "/community/projects" + } + ] + }, + { + text: "Fundations", + items: [ + { + text: "Agents", + link: "/concepts/agents" + }, + { + text: "Skills", + link: "/concepts/skills" + }, + { + text: "XMTP", + link: "/concepts/xmtp" + }, + { + text: "Usernames", + link: "/plugins/resolver" + } + ] + }, + { + text: "Contribute", + link: "/contribute" + }, + { + text: "Deployment", + link: "/deployment" + }, + { + text: "Guidelines", + link: "/guidelines" + }, + { + text: "Changelog", + link: "/changelog" + } + ] +}); +export { + vocs_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidm9jcy5jb25maWcudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwidm9jc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBoZWFkOiAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxtZXRhIGNoYXJTZXQ9XCJ1dGYtOFwiIC8+XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGhcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOnRpdGxlXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOmltYWdlXCIgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZVwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6dmVyc2lvblwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6YWNjZXB0czp4bXRwXCIgY29udGVudD1cInZOZXh0XCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJvZjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTppbWFnZVwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCJcbiAgICAgICAgLz5cblxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxXCIgY29udGVudD1cIkRvY3NcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOmFjdGlvblwiIGNvbnRlbnQ9XCJsaW5rXCIgLz5cbiAgICAgICAgPG1ldGFcbiAgICAgICAgICBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOnRhcmdldFwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL1wiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MlwiIGNvbnRlbnQ9XCJEcm9wIGEgXHUyQjUwXHVGRTBGXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MjphY3Rpb25cIiBjb250ZW50PVwibGlua1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246Mjp0YXJnZXRcIlxuICAgICAgICAgIGNvbnRlbnQ9XCJodHRwczovL2dpdGh1Yi5jb20vZXBoZW1lcmFIUS9tZXNzYWdlLWtpdFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2c6c2l0ZV9uYW1lXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpjYXJkXCIgY29udGVudD1cInN1bW1hcnlfbGFyZ2VfaW1hZ2VcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpzaXRlXCIgY29udGVudD1cIkBNZXNzYWdlS2l0XCIgLz5cbiAgICAgICAgPG1ldGEgbmFtZT1cInR3aXR0ZXI6dGl0bGVcIiBjb250ZW50PVwiTWVzc2FnZUtpdFwiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgbmFtZT1cInR3aXR0ZXI6ZGVzY3JpcHRpb25cIlxuICAgICAgICAgIGNvbnRlbnQ9XCJNZXNzYWdlS2l0IGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgbWFuYWdpbmcgeW91ciBtZXNzYWdlcy5cIlxuICAgICAgICAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxzY3JpcHRcbiAgICAgICAgICBzcmM9XCJodHRwczovL3BsYXVzaWJsZS5pby9qcy9zY3JpcHQub3V0Ym91bmQtbGlua3MuanNcIlxuICAgICAgICAgIGRhdGEtZG9tYWluPVwibWVzc2FnZS1raXQub3JnXCJcbiAgICAgICAgICBkZWZlclxuICAgICAgICAvPlxuICAgICAgPC8+XG4gICAgKTtcbiAgfSxcbiAgb2dJbWFnZVVybDoge1xuICAgIFwiL1wiOiBcIi9oZXJvLmpwZ1wiLFxuICAgIFwiL2RvY3NcIjogXCIvaGVyby5qcGdcIixcbiAgfSxcbiAgdGl0bGU6IFwiTWVzc2FnZUtpdFwiLFxuICByb290RGlyOiBcIi5cIixcbiAgaWNvblVybDoge1xuICAgIGxpZ2h0OiBcIi9tZXNzYWdla2l0LWxvZ28ucG5nXCIsXG4gICAgZGFyazogXCIvbWVzc2FnZWtpdC1sb2dvLnBuZ1wiLFxuICB9LFxuICB0aGVtZToge1xuICAgIGFjY2VudENvbG9yOiB7XG4gICAgICBsaWdodDogXCIjRkE2OTc3XCIsXG4gICAgICBkYXJrOiBcIiNGQTY5NzdcIixcbiAgICB9LFxuICB9LFxuICBzb2NpYWxzOiBbXG4gICAge1xuICAgICAgaWNvbjogXCJnaXRodWJcIixcbiAgICAgIGxpbms6IFwiaHR0cHM6Ly9naXRodWIuY29tL2VwaGVtZXJhSFEvbWVzc2FnZS1raXRcIixcbiAgICB9LFxuICBdLFxuICB0b3BOYXY6IFt7IHRleHQ6IFwiQ2hhbmdlbG9nXCIsIGxpbms6IFwiL2NoYW5nZWxvZ1wiIH1dLFxuICBlZGl0TGluazoge1xuICAgIHBhdHRlcm46XG4gICAgICBcImh0dHBzOi8vZ2l0aHViLmNvbS9lcGhlbWVyYUhRL21lc3NhZ2Uta2l0L2Jsb2IvbWFpbi9wYWNrYWdlcy9kb2NzL3BhZ2VzLzpwYXRoXCIsXG4gICAgdGV4dDogXCJTdWdnZXN0IGNoYW5nZXMgdG8gdGhpcyBwYWdlXCIsXG4gIH0sXG4gIHNpZGViYXI6IFtcbiAgICB7XG4gICAgICB0ZXh0OiBcIlF1aWNrc3RhcnRcIixcbiAgICAgIGxpbms6IFwiL3F1aWNrc3RhcnRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiVVhcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkNvbmNpZXJnZVwiLFxuICAgICAgICAgIGxpbms6IFwiL3NraWxscy9jb25jaWVyZ2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiRnJhbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZnJhbWVzXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIldhbGxldCBzZXJ2aWNlXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvd2FsbGV0LXNlcnZpY2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiR3JvdXBzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZ3JvdXBzXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJDb21tdW5pdHlcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlNraWxsc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUGx1Z2luc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9wbHVnaW5zXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlRlbXBsYXRlc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS90ZW1wbGF0ZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVmliZXNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvdmliZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUHJvamVjdHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvcHJvamVjdHNcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkZ1bmRhdGlvbnNcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkFnZW50c1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL2FnZW50c1wiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJTa2lsbHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb25jZXB0cy9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiWE1UUFwiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL3htdHBcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVXNlcm5hbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvcGx1Z2lucy9yZXNvbHZlclwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ29udHJpYnV0ZVwiLFxuICAgICAgbGluazogXCIvY29udHJpYnV0ZVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJEZXBsb3ltZW50XCIsXG4gICAgICBsaW5rOiBcIi9kZXBsb3ltZW50XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkd1aWRlbGluZXNcIixcbiAgICAgIGxpbms6IFwiL2d1aWRlbGluZXNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ2hhbmdlbG9nXCIsXG4gICAgICBsaW5r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 diff --git a/packages/docs/vocs.config.tsx.timestamp-1734838080676-8f5d6f6bfcf92.mjs b/packages/docs/vocs.config.tsx.timestamp-1734838080676-8f5d6f6bfcf92.mjs new file mode 100644 index 000000000..ddb5b0f86 --- /dev/null +++ b/packages/docs/vocs.config.tsx.timestamp-1734838080676-8f5d6f6bfcf92.mjs @@ -0,0 +1,182 @@ +// vocs.config.tsx +import { defineConfig } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/vocs/_lib/index.js"; +import { Fragment, jsx, jsxs } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/react/jsx-runtime.js"; +var vocs_config_default = defineConfig({ + head: () => { + return /* @__PURE__ */ jsxs(Fragment, { children: [ + /* @__PURE__ */ jsx("meta", { charSet: "utf-8" }), + /* @__PURE__ */ jsx("meta", { name: "viewport", content: "width=device-width" }), + /* @__PURE__ */ jsx("meta", { property: "og:title", content: "MessageKit" }), + /* @__PURE__ */ jsx("meta", { property: "og:image", content: "https://message-kit.org/hero.jpg" }), + /* @__PURE__ */ jsx("meta", { property: "fc:frame", content: "vNext" }), + /* @__PURE__ */ jsx("meta", { property: "of:version", content: "vNext" }), + /* @__PURE__ */ jsx("meta", { property: "of:accepts:xmtp", content: "vNext" }), + /* @__PURE__ */ jsx("meta", { property: "of:image", content: "https://message-kit.org/hero.jpg" }), + /* @__PURE__ */ jsx( + "meta", + { + property: "fc:frame:image", + content: "https://message-kit.org/hero.jpg" + } + ), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1", content: "Docs" }), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1:action", content: "link" }), + /* @__PURE__ */ jsx( + "meta", + { + property: "fc:frame:button:1:target", + content: "https://message-kit.org/" + } + ), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2", content: "Drop a \u2B50\uFE0F" }), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2:action", content: "link" }), + /* @__PURE__ */ jsx( + "meta", + { + property: "fc:frame:button:2:target", + content: "https://github.com/ephemeraHQ/message-kit" + } + ), + /* @__PURE__ */ jsx("meta", { property: "og:site_name", content: "MessageKit" }), + /* @__PURE__ */ jsx("meta", { name: "twitter:card", content: "summary_large_image" }), + /* @__PURE__ */ jsx("meta", { name: "twitter:site", content: "@MessageKit" }), + /* @__PURE__ */ jsx("meta", { name: "twitter:title", content: "MessageKit" }), + /* @__PURE__ */ jsx( + "meta", + { + name: "twitter:description", + content: "MessageKit is a powerful tool for managing your messages." + } + ), + /* @__PURE__ */ jsx("meta", { name: "twitter:image", content: "https://message-kit.org/hero.jpg" }), + /* @__PURE__ */ jsx( + "script", + { + src: "https://plausible.io/js/script.outbound-links.js", + "data-domain": "message-kit.org", + defer: true + } + ) + ] }); + }, + ogImageUrl: { + "/": "/hero.jpg", + "/docs": "/hero.jpg" + }, + title: "MessageKit", + rootDir: ".", + iconUrl: { + light: "/messagekit-logo.png", + dark: "/messagekit-logo.png" + }, + theme: { + accentColor: { + light: "#FA6977", + dark: "#FA6977" + } + }, + socials: [ + { + icon: "github", + link: "https://github.com/ephemeraHQ/message-kit" + } + ], + topNav: [{ text: "Changelog", link: "/changelog" }], + editLink: { + pattern: "https://github.com/ephemeraHQ/message-kit/blob/main/packages/docs/pages/:path", + text: "Suggest changes to this page" + }, + sidebar: [ + { + text: "Quickstart", + link: "/quickstart" + }, + { + text: "UX", + items: [ + { + text: "Concierge", + link: "/skills/concierge" + }, + { + text: "Frames", + link: "/ux/frames" + }, + { + text: "Wallet service", + link: "/ux/wallet-service" + }, + { + text: "Groups", + link: "/ux/groups" + } + ] + }, + { + text: "Community", + items: [ + { + text: "Skills", + link: "/community/skills" + }, + { + text: "Plugins", + link: "/community/plugins" + }, + { + text: "Templates", + link: "/community/templates" + }, + { + text: "Vibes", + link: "/community/vibes" + }, + { + text: "Projects", + link: "/community/projects" + } + ] + }, + { + text: "Fundations", + items: [ + { + text: "Agents", + link: "/concepts/agents" + }, + { + text: "Skills", + link: "/concepts/skills" + }, + { + text: "XMTP", + link: "/concepts/xmtp" + }, + { + text: "Usernames", + link: "/plugins/resolver" + } + ] + }, + { + text: "Contribute", + link: "/contribute" + }, + { + text: "Deployment", + link: "/deployment" + }, + { + text: "Guidelines", + link: "/guidelines" + }, + { + text: "Changelog", + link: "/changelog" + } + ] +}); +export { + vocs_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidm9jcy5jb25maWcudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwidm9jc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBoZWFkOiAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxtZXRhIGNoYXJTZXQ9XCJ1dGYtOFwiIC8+XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGhcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOnRpdGxlXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOmltYWdlXCIgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZVwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6dmVyc2lvblwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6YWNjZXB0czp4bXRwXCIgY29udGVudD1cInZOZXh0XCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJvZjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTppbWFnZVwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCJcbiAgICAgICAgLz5cblxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxXCIgY29udGVudD1cIkRvY3NcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOmFjdGlvblwiIGNvbnRlbnQ9XCJsaW5rXCIgLz5cbiAgICAgICAgPG1ldGFcbiAgICAgICAgICBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOnRhcmdldFwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL1wiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MlwiIGNvbnRlbnQ9XCJEcm9wIGEgXHUyQjUwXHVGRTBGXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MjphY3Rpb25cIiBjb250ZW50PVwibGlua1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246Mjp0YXJnZXRcIlxuICAgICAgICAgIGNvbnRlbnQ9XCJodHRwczovL2dpdGh1Yi5jb20vZXBoZW1lcmFIUS9tZXNzYWdlLWtpdFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2c6c2l0ZV9uYW1lXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpjYXJkXCIgY29udGVudD1cInN1bW1hcnlfbGFyZ2VfaW1hZ2VcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpzaXRlXCIgY29udGVudD1cIkBNZXNzYWdlS2l0XCIgLz5cbiAgICAgICAgPG1ldGEgbmFtZT1cInR3aXR0ZXI6dGl0bGVcIiBjb250ZW50PVwiTWVzc2FnZUtpdFwiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgbmFtZT1cInR3aXR0ZXI6ZGVzY3JpcHRpb25cIlxuICAgICAgICAgIGNvbnRlbnQ9XCJNZXNzYWdlS2l0IGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgbWFuYWdpbmcgeW91ciBtZXNzYWdlcy5cIlxuICAgICAgICAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxzY3JpcHRcbiAgICAgICAgICBzcmM9XCJodHRwczovL3BsYXVzaWJsZS5pby9qcy9zY3JpcHQub3V0Ym91bmQtbGlua3MuanNcIlxuICAgICAgICAgIGRhdGEtZG9tYWluPVwibWVzc2FnZS1raXQub3JnXCJcbiAgICAgICAgICBkZWZlclxuICAgICAgICAvPlxuICAgICAgPC8+XG4gICAgKTtcbiAgfSxcbiAgb2dJbWFnZVVybDoge1xuICAgIFwiL1wiOiBcIi9oZXJvLmpwZ1wiLFxuICAgIFwiL2RvY3NcIjogXCIvaGVyby5qcGdcIixcbiAgfSxcbiAgdGl0bGU6IFwiTWVzc2FnZUtpdFwiLFxuICByb290RGlyOiBcIi5cIixcbiAgaWNvblVybDoge1xuICAgIGxpZ2h0OiBcIi9tZXNzYWdla2l0LWxvZ28ucG5nXCIsXG4gICAgZGFyazogXCIvbWVzc2FnZWtpdC1sb2dvLnBuZ1wiLFxuICB9LFxuICB0aGVtZToge1xuICAgIGFjY2VudENvbG9yOiB7XG4gICAgICBsaWdodDogXCIjRkE2OTc3XCIsXG4gICAgICBkYXJrOiBcIiNGQTY5NzdcIixcbiAgICB9LFxuICB9LFxuICBzb2NpYWxzOiBbXG4gICAge1xuICAgICAgaWNvbjogXCJnaXRodWJcIixcbiAgICAgIGxpbms6IFwiaHR0cHM6Ly9naXRodWIuY29tL2VwaGVtZXJhSFEvbWVzc2FnZS1raXRcIixcbiAgICB9LFxuICBdLFxuICB0b3BOYXY6IFt7IHRleHQ6IFwiQ2hhbmdlbG9nXCIsIGxpbms6IFwiL2NoYW5nZWxvZ1wiIH1dLFxuICBlZGl0TGluazoge1xuICAgIHBhdHRlcm46XG4gICAgICBcImh0dHBzOi8vZ2l0aHViLmNvbS9lcGhlbWVyYUhRL21lc3NhZ2Uta2l0L2Jsb2IvbWFpbi9wYWNrYWdlcy9kb2NzL3BhZ2VzLzpwYXRoXCIsXG4gICAgdGV4dDogXCJTdWdnZXN0IGNoYW5nZXMgdG8gdGhpcyBwYWdlXCIsXG4gIH0sXG4gIHNpZGViYXI6IFtcbiAgICB7XG4gICAgICB0ZXh0OiBcIlF1aWNrc3RhcnRcIixcbiAgICAgIGxpbms6IFwiL3F1aWNrc3RhcnRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiVVhcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkNvbmNpZXJnZVwiLFxuICAgICAgICAgIGxpbms6IFwiL3NraWxscy9jb25jaWVyZ2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiRnJhbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZnJhbWVzXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIldhbGxldCBzZXJ2aWNlXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvd2FsbGV0LXNlcnZpY2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiR3JvdXBzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZ3JvdXBzXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJDb21tdW5pdHlcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlNraWxsc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUGx1Z2luc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9wbHVnaW5zXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlRlbXBsYXRlc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS90ZW1wbGF0ZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVmliZXNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvdmliZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUHJvamVjdHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvcHJvamVjdHNcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkZ1bmRhdGlvbnNcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkFnZW50c1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL2FnZW50c1wiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJTa2lsbHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb25jZXB0cy9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiWE1UUFwiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL3htdHBcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVXNlcm5hbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvcGx1Z2lucy9yZXNvbHZlclwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ29udHJpYnV0ZVwiLFxuICAgICAgbGluazogXCIvY29udHJpYnV0ZVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJEZXBsb3ltZW50XCIsXG4gICAgICBsaW5rOiBcIi9kZXBsb3ltZW50XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkd1aWRlbGluZXNcIixcbiAgICAgIGxpbms6IFwiL2d1aWRlbGluZXNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ2hhbmdlbG9nXCIsXG4gICAgICBsaW5rOiBcIi9jaGFuZ2Vsb2dcIixcbiAgICB9LFxuICBdLFxufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUyxvQkFBb0I7QUFLdkIsbUJBQ0UsS0FERjtBQUhOLElBQU8sc0JBQVEsYUFBYTtBQUFBLEVBQzFCLE1BQU0sTUFBTTtBQUNWLFdBQ0UsaUNBQ0U7QUFBQSwwQkFBQyxVQUFLLFNBQVEsU0FBUTtBQUFBLE1BQ3RCLG9CQUFDLFVBQUssTUFBSyxZQUFXLFNBQVEsc0JBQXFCO0FBQUEsTUFDbkQsb0JBQUMsVUFBSyxVQUFTLFlBQVcsU0FBUSxjQUFhO0FBQUEsTUFDL0Msb0JBQUMsVUFBSyxVQUFTLFlBQVcsU0FBUSxvQ0FBbUM7QUFBQSxNQUNyRSxvQkFBQyxVQUFLLFVBQVMsWUFBVyxTQUFRLFNBQVE7QUFBQSxNQUMxQyxvQkFBQyxVQUFLLFVBQVMsY0FBYSxTQUFRLFNBQVE7QUFBQSxNQUM1QyxvQkFBQyxVQUFLLFVBQVMsbUJBQWtCLFNBQVEsU0FBUTtBQUFBLE1BQ2pELG9CQUFDLFVBQUssVUFBUyxZQUFXLFNBQVEsb0NBQW1DO0FBQUEsTUFDckU7QUFBQSxRQUFDO0FBQUE7QUFBQSxVQUNDLFVBQVM7QUFBQSxVQUNULFNBQVE7QUFBQTtBQUFBLE1BQ1Y7QUFBQSxNQUVBLG9CQUFDLFVBQUssVUFBUyxxQkFBb0IsU0FBUSxRQUFPO0FBQUEsTUFDbEQsb0JBQUMsVUFBSyxVQUFTLDRCQUEyQixTQUFRLFFBQU87QUFBQSxNQUN6RDtBQUFBLFFBQUM7QUFBQTtBQUFBLFVBQ0MsVUFBUztBQUFBLFVBQ1QsU0FBUTtBQUFBO0FBQUEsTUFDVjtBQUFBLE1BRUEsb0JBQUMsVUFBSyxVQUFTLHFCQUFvQixTQUFRLHVCQUFZO0FBQUEsTUFDdkQsb0JBQUMsVUFBSyxVQUFTLDRCQUEyQixTQUFRLFFBQU87QUFBQSxNQUN6RDtBQUFBLFFBQUM7QUFBQTtBQUFBLFVBQ0MsVUFBUztBQUFBLFVBQ1QsU0FBUTtBQUFBO0FBQUEsTUFDVjtBQUFBLE1BQ0Esb0JBQUMsVUFBSyxVQUFTLGdCQUFlLFNBQVEsY0FBYTtBQUFBLE1BQ25ELG9CQUFDLFVBQUssTUFBSyxnQkFBZSxTQUFRLHVCQUFzQjtBQUFBLE1BQ3hELG9CQUFDLFVBQUssTUFBSyxnQkFBZSxTQUFRLGVBQWM7QUFBQSxNQUNoRCxvQkFBQyxVQUFLLE1BQUssaUJBQWdCLFNBQVEsY0FBYTtBQUFBLE1BQ2hEO0FBQUEsUUFBQztBQUFBO0FBQUEsVUFDQyxNQUFLO0FBQUEsVUFDTCxTQUFRO0FBQUE7QUFBQSxNQUNWO0FBQUEsTUFDQSxvQkFBQyxVQUFLLE1BQUssaUJBQWdCLFNBQVEsb0NBQW1DO0FBQUEsTUFDdEU7QUFBQSxRQUFDO0FBQUE7QUFBQSxVQUNDLEtBQUk7QUFBQSxVQUNKLGVBQVk7QUFBQSxVQUNaLE9BQUs7QUFBQTtBQUFBLE1BQ1A7QUFBQSxPQUNGO0FBQUEsRUFFSjtBQUFBLEVBQ0EsWUFBWTtBQUFBLElBQ1YsS0FBSztBQUFBLElBQ0wsU0FBUztBQUFBLEVBQ1g7QUFBQSxFQUNBLE9BQU87QUFBQSxFQUNQLFNBQVM7QUFBQSxFQUNULFNBQVM7QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLE1BQU07QUFBQSxFQUNSO0FBQUEsRUFDQSxPQUFPO0FBQUEsSUFDTCxhQUFhO0FBQUEsTUFDWCxPQUFPO0FBQUEsTUFDUCxNQUFNO0FBQUEsSUFDUjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLFNBQVM7QUFBQSxJQUNQO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixNQUFNO0FBQUEsSUFDUjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLFFBQVEsQ0FBQyxFQUFFLE1BQU0sYUFBYSxNQUFNLGFBQWEsQ0FBQztBQUFBLEVBQ2xELFVBQVU7QUFBQSxJQUNSLFNBQ0U7QUFBQSxJQUNGLE1BQU07QUFBQSxFQUNSO0FBQUEsRUFDQSxTQUFTO0FBQUEsSUFDUDtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLElBQ1I7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixPQUFPO0FBQUEsUUFDTDtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFFBQ1I7QUFBQSxRQUNBO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixNQUFNO0FBQUEsUUFDUjtBQUFBLFFBQ0E7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxRQUNSO0FBQUEsUUFDQTtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFFBQ1I7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxRQUNMO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixNQUFNO0FBQUEsUUFDUjtBQUFBLFFBQ0E7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxRQUNSO0FBQUEsUUFDQTtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFFBQ1I7QUFBQSxRQUNBO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixNQUFNO0FBQUEsUUFDUjtBQUFBLFFBQ0E7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxRQUNSO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixPQUFPO0FBQUEsUUFDTDtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFFBQ1I7QUFBQSxRQUNBO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixNQUFNO0FBQUEsUUFDUjtBQUFBLFFBQ0E7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxRQUNSO0FBQUEsUUFDQTtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFFBQ1I7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLE1BQU07QUFBQSxJQUNSO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLElBQ1I7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixNQUFNO0FBQUEsSUFDUjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLE1BQU07QUFBQSxJQUNSO0FBQUEsRUFDRjtBQUNGLENBQUM7IiwKICAibmFtZXMiOiBbXQp9Cg== diff --git a/packages/docs/vocs.config.tsx.timestamp-1734838080741-1ac173819a28.mjs b/packages/docs/vocs.config.tsx.timestamp-1734838080741-1ac173819a28.mjs new file mode 100644 index 000000000..e69de29bb diff --git a/packages/framekit/README.md b/packages/framekit/README.md deleted file mode 100644 index d85664052..000000000 --- a/packages/framekit/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# FrameKit - -See [FrameKit](https://message-kit.org/plugins/framekit) in MessageKit diff --git a/packages/message-kit/package.json b/packages/message-kit/package.json index a3daf9974..62ef91412 100644 --- a/packages/message-kit/package.json +++ b/packages/message-kit/package.json @@ -81,4 +81,4 @@ "access": "public", "registry": "https://registry.npmjs.org/" } -} \ No newline at end of file +} diff --git a/packages/message-kit/src/helpers/utils.ts b/packages/message-kit/src/helpers/utils.ts index c5a16bf79..817b9ac29 100644 --- a/packages/message-kit/src/helpers/utils.ts +++ b/packages/message-kit/src/helpers/utils.ts @@ -63,7 +63,7 @@ export async function logInitMessage(client: Client, agent?: Agent) { console.log(`\nSend a message to this account on: \x1b[90m Converse: https://converse.xyz/dm/${client.accountAddress}\x1b[0m \x1b[38;2;0;0;255m Coinbase Wallet: https://go.cb-w.com/messaging?address=${client.accountAddress}\x1b[0m - \x1b[38;2;128;0;128m Share in Farcaster (Framev2): https://frames.message-kit.org/dm/${client.accountAddress}\x1b[0m`); + \x1b[38;2;128;0;128m Share in Farcaster (Framev2): https://client.message-kit.org/?address=${client.accountAddress}\x1b[0m`); if ( agentConfig?.walletService == true || diff --git a/packages/message-kit/src/index.ts b/packages/message-kit/src/index.ts index 867dc735f..1b9eec68f 100644 --- a/packages/message-kit/src/index.ts +++ b/packages/message-kit/src/index.ts @@ -3,5 +3,5 @@ export * from "./lib/skills.js"; export * from "./helpers/types.js"; export * from "./plugins/gpt.js"; export * from "./plugins/resolver.js"; -export * from "./plugins/framekit.js"; +export * from "./plugins/baselinks.js"; export * from "./skills/concierge.js"; diff --git a/packages/message-kit/src/plugins/framekit.ts b/packages/message-kit/src/plugins/baselinks.ts similarity index 98% rename from packages/message-kit/src/plugins/framekit.ts rename to packages/message-kit/src/plugins/baselinks.ts index b824e1f5d..92e4844a3 100644 --- a/packages/message-kit/src/plugins/framekit.ts +++ b/packages/message-kit/src/plugins/baselinks.ts @@ -11,7 +11,7 @@ const framesUrl = ? process.env.FRAME_URL : "https://frames.message-kit.org"; -export class FrameKit { +export class baselinks { static async sendWallet( ownerAddress: string, agentAddress: string, diff --git a/packages/message-kit/src/plugins/circle.ts b/packages/message-kit/src/plugins/circle.ts index 5e9498199..9e0982780 100644 --- a/packages/message-kit/src/plugins/circle.ts +++ b/packages/message-kit/src/plugins/circle.ts @@ -1,5 +1,4 @@ import { initiateDeveloperControlledWalletsClient } from "@circle-fin/developer-controlled-wallets"; -import { type Context } from "../lib/core"; import { LocalStorage } from "./storage"; const apiKey = process.env.CIRCLE_API_KEY; diff --git a/packages/message-kit/src/plugins/storage.ts b/packages/message-kit/src/plugins/storage.ts index 8b26ab5f3..0179d5b83 100644 --- a/packages/message-kit/src/plugins/storage.ts +++ b/packages/message-kit/src/plugins/storage.ts @@ -1,7 +1,5 @@ -import { getFS } from "../helpers/utils"; import path from "path"; - -const { fsPromises } = getFS(); +import fs from "fs"; export class LocalStorage { private baseDir: string; @@ -22,15 +20,14 @@ export class LocalStorage { } private async ensureDir(): Promise { - if (!fsPromises) { + if (!fs) { console.error("Filesystem not available"); throw new Error("Filesystem is not available"); } try { - const { fs } = getFS(); if (!fs?.existsSync(this.baseDir)) { - await fsPromises.mkdir(this.baseDir, { + fs.mkdirSync(this.baseDir, { recursive: true, mode: 0o755, }); @@ -52,7 +49,7 @@ export class LocalStorage { try { const filePath = path.join(this.baseDir, `${key.toLowerCase()}.dat`); - await fsPromises?.writeFile(filePath, value, "utf8"); + fs.writeFileSync(filePath, value, "utf8"); } catch (error) { throw new Error(`Failed to write file: ${error}`); } @@ -61,8 +58,9 @@ export class LocalStorage { async get(key: string): Promise { try { const filePath = path.join(this.baseDir, `${key.toLowerCase()}.dat`); - return (await fsPromises?.readFile(filePath, "utf8")) ?? undefined; + return fs.readFileSync(filePath, "utf8") ?? undefined; } catch (error) { + console.log("Error reading file:", error); return undefined; } } @@ -70,18 +68,18 @@ export class LocalStorage { async del(key: string): Promise { try { const filePath = path.join(this.baseDir, `${key.toLowerCase()}.dat`); - await fsPromises?.unlink(filePath); + fs.unlinkSync(filePath); } catch (error) { - // Ignore if file doesn't exist + console.log("Error deleting file:", error); } } async getWalletCount(): Promise { try { - const walletFiles = await fsPromises?.readdir(this.baseDir); + const walletFiles = fs.readdirSync(this.baseDir); return walletFiles?.length || 0; } catch (error) { - console.log("Error reading directory:", this.baseDir); + console.log("Error reading directory:", this.baseDir, error); return 0; } } diff --git a/packages/message-kit/src/skills/concierge.ts b/packages/message-kit/src/skills/concierge.ts index ec6d456ee..54a6b865b 100644 --- a/packages/message-kit/src/skills/concierge.ts +++ b/packages/message-kit/src/skills/concierge.ts @@ -3,7 +3,7 @@ import { Skill } from "../helpers/types"; import { Context } from "../lib/core"; import { getUserInfo } from "../plugins/resolver"; import { isAddress } from "viem"; -import { FrameKit } from "../plugins/framekit"; +import { baselinks } from "../plugins/baselinks"; export const concierge: Skill[] = [ { @@ -106,7 +106,7 @@ export async function handleWallet(context: Context) { if (walletExist) { const { balance } = await walletService.checkBalance(sender.address); await context.dm("Your agent wallet address"); - const url = await FrameKit.sendWallet( + const url = await baselinks.sendWallet( walletExist.address, walletExist.agent_address, balance, @@ -126,8 +126,6 @@ export async function handleWallet(context: Context) { } else if (skill === "swap") { context.dm("I cant do that yet"); // await walletService.swap(sender.address, fromToken, toToken, amount); - // await context.dm("Swap completed"); - // return; } else if (skill === "transfer") { const { balance } = await walletService.checkBalance(sender.address); if (balance === 0) { @@ -168,13 +166,13 @@ async function notifyUser( if (transaction) { await context.dm(`Transfer completed successfully`); if ((await transaction.getTransactionHash()) !== undefined) { - const url = await FrameKit.sendReceipt( + const url = await baselinks.sendReceipt( `https://basescan.org/tx/${await transaction.getTransactionHash()}`, amount, ); await context.dm(url); } else if ((await transaction.getTransaction()) !== undefined) { - const url = await FrameKit.sendReceipt( + const url = await baselinks.sendReceipt( `https://basescan.org/tx/${await transaction.getTransaction()}`, amount, ); @@ -230,7 +228,7 @@ async function fund( walletData.agent_address, ); await context.dm("Here is the payment link:"); - const url = await FrameKit.requestPayment( + const url = await baselinks.requestPayment( walletData.agent_address, amount, "USDC", @@ -259,7 +257,7 @@ async function fund( walletData.agent_address, ); - const url = await FrameKit.requestPayment( + const url = await baselinks.requestPayment( walletData.agent_address, Number(response), "USDC", diff --git a/packages/xmtp-client/package.json b/packages/xmtp-client/package.json index 08c65b6a0..906cc88fd 100644 --- a/packages/xmtp-client/package.json +++ b/packages/xmtp-client/package.json @@ -55,4 +55,4 @@ "access": "public", "registry": "https://registry.npmjs.org/" } -} \ No newline at end of file +} diff --git a/packages/xmtp/package.json b/packages/xmtp/package.json index 6e99a1027..87d39d367 100644 --- a/packages/xmtp/package.json +++ b/packages/xmtp/package.json @@ -59,4 +59,4 @@ "access": "public", "registry": "https://registry.npmjs.org/" } -} \ No newline at end of file +} diff --git a/templates/ens/src/skills/pay.ts b/templates/ens/src/skills/pay.ts index 333228a15..59f13e0c0 100644 --- a/templates/ens/src/skills/pay.ts +++ b/templates/ens/src/skills/pay.ts @@ -1,4 +1,4 @@ -import { Context, FrameKit, getUserInfo, Skill } from "@xmtp/message-kit"; +import { Context, baselinks, Skill } from "@xmtp/message-kit"; export const pay: Skill[] = [ { @@ -51,10 +51,10 @@ export async function handler(context: Context) { let receiverAddress = username?.address; if (skill === "tip") { let tipAmount = 1; - const url = await FrameKit.requestPayment(receiverAddress, tipAmount); + const url = await baselinks.requestPayment(receiverAddress, tipAmount); await context.dm(url); } else if (skill === "pay") { - const url = await FrameKit.requestPayment(receiverAddress, amount, token); + const url = await baselinks.requestPayment(receiverAddress, amount, token); await context.dm(url); } } diff --git a/templates/playground/src/skills/cash.ts b/templates/playground/src/skills/cash.ts index d590081ab..6a2769405 100644 --- a/templates/playground/src/skills/cash.ts +++ b/templates/playground/src/skills/cash.ts @@ -1,4 +1,4 @@ -import { Context, FrameKit } from "@xmtp/message-kit"; +import { Context, baselinks } from "@xmtp/message-kit"; import type { Skill } from "@xmtp/message-kit"; import { USDCWallet } from "../plugins/usdc.js"; @@ -93,7 +93,7 @@ async function fundHandler(context: Context) { return; } - const url = await FrameKit.requestPayment( + const url = await baselinks.requestPayment( usdcWallet.agentAddress, fundAmount, ); diff --git a/templates/playground/src/skills/drip.ts b/templates/playground/src/skills/drip.ts index a433da6f2..e5b91ae60 100644 --- a/templates/playground/src/skills/drip.ts +++ b/templates/playground/src/skills/drip.ts @@ -1,4 +1,4 @@ -import { Context, FrameKit } from "@xmtp/message-kit"; +import { Context, baselinks } from "@xmtp/message-kit"; import type { Skill } from "@xmtp/message-kit"; import { getRedisClient } from "../plugins/redis.js"; import { LearnWeb3Client, Network } from "../plugins/learnweb3.js"; @@ -77,7 +77,7 @@ export async function handler(context: Context) { } await context.send("Here's your transaction receipt:"); - const url = await FrameKit.sendReceipt( + const url = await baselinks.sendReceipt( result.value!, selectedNetwork.dripAmount as number, ); diff --git a/templates/playground/src/skills/pay.ts b/templates/playground/src/skills/pay.ts index b78e0958c..458f42388 100644 --- a/templates/playground/src/skills/pay.ts +++ b/templates/playground/src/skills/pay.ts @@ -1,4 +1,4 @@ -import { Context, FrameKit } from "@xmtp/message-kit"; +import { baselinks, Context } from "@xmtp/message-kit"; import type { Skill } from "@xmtp/message-kit"; export const registerSkill: Skill[] = [ @@ -31,7 +31,7 @@ export async function handler(context: Context) { const { amount: amountSend, token: tokenSend, username } = params; - const url = await FrameKit.requestPayment( + const url = await baselinks.requestPayment( username?.address, amountSend, tokenSend, diff --git a/templates/playground/src/skills/token.ts b/templates/playground/src/skills/token.ts index 3f4fb01b8..d04cd5470 100644 --- a/templates/playground/src/skills/token.ts +++ b/templates/playground/src/skills/token.ts @@ -1,6 +1,6 @@ import { Context } from "@xmtp/message-kit"; import type { Skill } from "@xmtp/message-kit"; -import { FrameKit } from "@xmtp/message-kit"; +import { baselinks } from "@xmtp/message-kit"; export const token: Skill[] = [ { @@ -54,6 +54,6 @@ export async function handler(context: Context) { ], image: tokenInfo.image, }; - const url = await FrameKit.sendCustomFrame(frame); + const url = await baselinks.sendCustomFrame(frame); await context.dm(url); } diff --git a/yarn.lock b/yarn.lock index 0654b94b3..9dde9d341 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3864,6 +3864,29 @@ __metadata: languageName: node linkType: hard +"agent-client@workspace:packages/agent-client": + version: 0.0.0-use.local + resolution: "agent-client@workspace:packages/agent-client" + dependencies: + "@farcaster/frame-sdk": "npm:0.0.10" + "@types/next": "npm:^9.0.0" + "@types/node": "npm:^20" + "@types/react": "npm:^18" + "@types/react-dom": "npm:^18" + cheerio: "npm:^1.0.0" + ethers: "npm:^6.13.4" + geist: "npm:^1.3.1" + next: "npm:^15.0.3" + qrcode: "npm:^1.5.4" + qrcode.react: "npm:^4.1.0" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" + typescript: "npm:^5" + viem: "npm:^2.21.45" + xmtp-client: "workspace:*" + languageName: unknown + linkType: soft + "agentkeepalive@npm:^4.2.1": version: 4.5.0 resolution: "agentkeepalive@npm:4.5.0" @@ -4132,6 +4155,29 @@ __metadata: languageName: node linkType: hard +"baselinks@workspace:packages/baselinks": + version: 0.0.0-use.local + resolution: "baselinks@workspace:packages/baselinks" + dependencies: + "@farcaster/frame-sdk": "npm:0.0.10" + "@types/next": "npm:^9.0.0" + "@types/node": "npm:^20" + "@types/react": "npm:^18" + "@types/react-dom": "npm:^18" + cheerio: "npm:^1.0.0" + ethers: "npm:^6.13.4" + geist: "npm:^1.3.1" + next: "npm:^15.0.3" + qrcode: "npm:^1.5.4" + qrcode.react: "npm:^4.1.0" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" + typescript: "npm:^5" + viem: "npm:^2.21.45" + xmtp-client: "workspace:*" + languageName: unknown + linkType: soft + "bcp-47-match@npm:^2.0.0": version: 2.0.3 resolution: "bcp-47-match@npm:2.0.3" @@ -6199,29 +6245,6 @@ __metadata: languageName: node linkType: hard -"framekit@workspace:packages/framekit": - version: 0.0.0-use.local - resolution: "framekit@workspace:packages/framekit" - dependencies: - "@farcaster/frame-sdk": "npm:0.0.10" - "@types/next": "npm:^9.0.0" - "@types/node": "npm:^20" - "@types/react": "npm:^18" - "@types/react-dom": "npm:^18" - cheerio: "npm:^1.0.0" - ethers: "npm:^6.13.4" - geist: "npm:^1.3.1" - next: "npm:^15.0.3" - qrcode: "npm:^1.5.4" - qrcode.react: "npm:^4.1.0" - react: "npm:^18.2.0" - react-dom: "npm:^18.2.0" - typescript: "npm:^5" - viem: "npm:^2.21.45" - xmtp-client: "workspace:*" - languageName: unknown - linkType: soft - "fresh@npm:0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" From 525098846c5de03bad8edf3169e71545230de48e Mon Sep 17 00:00:00 2001 From: fabri Date: Sun, 22 Dec 2024 09:37:38 -0300 Subject: [PATCH 06/19] deploy --- packages/agent-client/src/components/Chat.tsx | 6 +- packages/baselinks/package.json | 3 +- packages/baselinks/src/app/api/og/route.ts | 74 ----- .../src/app/dm/[address]/ChatClient.tsx | 79 ------ .../src/app/dm/[address]/metadata.ts | 45 --- .../baselinks/src/app/dm/[address]/page.tsx | 8 - .../baselinks/src/components/Chat.module.css | 237 ---------------- packages/baselinks/src/components/Chat.tsx | 263 ------------------ .../baselinks/src/components/UrlPreview.tsx | 68 ----- ....timestamp-1734838080672-555165cda1cb2.mjs | 182 ------------ ....timestamp-1734838080676-8f5d6f6bfcf92.mjs | 182 ------------ ...x.timestamp-1734838080741-1ac173819a28.mjs | 0 packages/xmtp-client/src/lib/xmtp.ts | 9 +- yarn.lock | 1 - 14 files changed, 8 insertions(+), 1149 deletions(-) delete mode 100644 packages/baselinks/src/app/api/og/route.ts delete mode 100644 packages/baselinks/src/app/dm/[address]/ChatClient.tsx delete mode 100644 packages/baselinks/src/app/dm/[address]/metadata.ts delete mode 100644 packages/baselinks/src/app/dm/[address]/page.tsx delete mode 100644 packages/baselinks/src/components/Chat.module.css delete mode 100644 packages/baselinks/src/components/Chat.tsx delete mode 100644 packages/baselinks/src/components/UrlPreview.tsx delete mode 100644 packages/docs/vocs.config.tsx.timestamp-1734838080672-555165cda1cb2.mjs delete mode 100644 packages/docs/vocs.config.tsx.timestamp-1734838080676-8f5d6f6bfcf92.mjs delete mode 100644 packages/docs/vocs.config.tsx.timestamp-1734838080741-1ac173819a28.mjs diff --git a/packages/agent-client/src/components/Chat.tsx b/packages/agent-client/src/components/Chat.tsx index 367412821..5554732bb 100644 --- a/packages/agent-client/src/components/Chat.tsx +++ b/packages/agent-client/src/components/Chat.tsx @@ -7,7 +7,7 @@ import { isAddress, parseUnits } from "viem"; import { extractFrameChain } from "@/app/utils/networks"; import sdk from "@farcaster/frame-sdk"; import { UrlPreview } from "./UrlPreview"; -import { createClient, XMTP, Message } from "xmtp-client"; +import { XMTP, Message, XMTPClass } from "xmtp-client"; type UrlType = "receipt" | "payment" | "wallet" | "unknown"; @@ -31,7 +31,7 @@ function Chat({ user }: { user: UserInfo }) { const [messages, setMessages] = useState([]); const [newMessage, setNewMessage] = useState(""); const [wallet, setWallet] = useState(undefined); - const [xmtp, setXmtp] = useState(undefined); + const [xmtp, setXmtp] = useState(undefined); const [isLoading, setIsLoading] = useState(true); const [recipientInfo, setRecipientInfo] = useState( undefined, @@ -72,7 +72,7 @@ function Chat({ user }: { user: UserInfo }) { const initXmtp = async (wallet: any) => { try { - const xmtpClient = await createClient(onMessage, { + const xmtpClient = await XMTP(onMessage, { privateKey: wallet.privateKey, }); diff --git a/packages/baselinks/package.json b/packages/baselinks/package.json index 128825398..da8480348 100644 --- a/packages/baselinks/package.json +++ b/packages/baselinks/package.json @@ -19,8 +19,7 @@ "qrcode.react": "^4.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "viem": "^2.21.45", - "xmtp-client": "workspace:*" + "viem": "^2.21.45" }, "devDependencies": { "@types/node": "^20", diff --git a/packages/baselinks/src/app/api/og/route.ts b/packages/baselinks/src/app/api/og/route.ts deleted file mode 100644 index f2f95ac8f..000000000 --- a/packages/baselinks/src/app/api/og/route.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { NextResponse } from "next/server"; -import * as cheerio from 'cheerio'; - -export async function GET(request: Request) { - try { - const { searchParams } = new URL(request.url); - const url = searchParams.get("url"); - - if (!url) { - return NextResponse.json( - { error: "URL parameter is required" }, - { status: 400 }, - ); - } - - console.log("Fetching OG data for URL:", url); - - const response = await fetch(url, { - headers: { - "user-agent": "bot", - }, - }); - - if (!response.ok) { - throw new Error(`Failed to fetch: ${response.status}`); - } - - const html = await response.text(); - const $ = cheerio.load(html); - - // Extract meta tags using cheerio - const getMetaContent = (property: string) => { - return ( - $(`meta[property="${property}"]`).attr('content') || - $(`meta[name="${property}"]`).attr('content') - ); - }; - - const ogData = { - title: - getMetaContent("og:title") || - getMetaContent("twitter:title") || - $('title').text() || - url, - description: - getMetaContent("og:description") || - getMetaContent("twitter:description") || - getMetaContent("description") || - "", - image: - getMetaContent("og:image") || - getMetaContent("twitter:image") || - "", - url, - siteName: getMetaContent("og:site_name") || "", - }; - - console.log("Extracted OG data:", ogData); - - return NextResponse.json(ogData); - } catch (error) { - console.error("Error in OG route:", error); - return NextResponse.json( - { - error: - error instanceof Error ? error.message : "Failed to fetch OG data", - }, - { status: 500 }, - ); - } -} - -export const runtime = "edge"; -export const dynamic = "force-dynamic"; diff --git a/packages/baselinks/src/app/dm/[address]/ChatClient.tsx b/packages/baselinks/src/app/dm/[address]/ChatClient.tsx deleted file mode 100644 index 27f663a26..000000000 --- a/packages/baselinks/src/app/dm/[address]/ChatClient.tsx +++ /dev/null @@ -1,79 +0,0 @@ -"use client"; -import React, { Suspense, useEffect, useState } from "react"; -import { useParams } from "next/navigation"; -import sdk, { type FrameContext } from "@farcaster/frame-sdk"; -import { getUserInfo, type UserInfo } from "@/app/utils/resolver"; -import Chat from "../../../components/Chat"; - -export function ChatFrameClient(): JSX.Element { - const params = useParams(); - const [user, setUser] = useState(null); - const [loading, setLoading] = useState(true); - - useEffect(() => { - const fetchUserInfo = async () => { - try { - console.log("Fetching user info for address:", params?.address); - const userInfo = await getUserInfo(params?.address as string); - console.log("Fetched user info:", userInfo); - - setUser(userInfo ?? null); - } catch (error) { - console.error("Error fetching user info:", error); - } finally { - setLoading(false); - } - }; - fetchUserInfo(); - }, [params?.address]); - - if (loading) { - return
Loading...
; - } - - if (!user) { - return
User not found
; - } - - return ( - - Loading...}> - - - - ); -} - -// Create a wrapper component that will render the full HTML -function FrameHTML({ - children, - user, -}: { - children: React.ReactNode; - user: UserInfo; -}) { - return <>{children}; -} - -function ChatContent({ user }: { user: UserInfo }): JSX.Element { - const [isSDKLoaded, setIsSDKLoaded] = useState(false); - const [context, setContext] = useState(); - - useEffect(() => { - const initFrame = async () => { - setContext(await sdk.context); - sdk.actions.ready(); - }; - - if (sdk && !isSDKLoaded) { - setIsSDKLoaded(true); - initFrame(); - } - }, [isSDKLoaded]); - - return ( -
- -
- ); -} diff --git a/packages/baselinks/src/app/dm/[address]/metadata.ts b/packages/baselinks/src/app/dm/[address]/metadata.ts deleted file mode 100644 index 4a4c2dc4b..000000000 --- a/packages/baselinks/src/app/dm/[address]/metadata.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { getUserInfo } from "@/app/utils/resolver"; -import { Metadata, ResolvedMetadata } from "next"; - -type Props = { - params: Promise<{ address: string }>; -}; - -// Helper function to safely get params -async function getParams(params: Promise<{ address: string }>) { - const resolvedParams = await params; - return { - address: resolvedParams.address || "", - }; -} - -export async function generateMetadata({ params }: Props): Promise { - const resolvedParams = await params; - const userInfo = await getUserInfo(resolvedParams?.address as string); - const imageUrl = `${process.env.NEXT_PUBLIC_URL ?? "http://localhost:3000"}/api/dmimage?address=${userInfo?.address}`; - console.log("imageUrl", imageUrl); - return { - title: `Chat with ${userInfo?.preferredName || resolvedParams?.address}`, - other: { - "og:image": imageUrl, - "fc:frame": JSON.stringify({ - version: "next", - imageUrl, - button: { - title: "Start Chat", - action: { - type: "launch_frame", - name: "Chat App", - url: `${process.env.NEXT_PUBLIC_URL ?? "http://localhost:3000"}/dm/${userInfo?.address}`, - splashImageUrl: `${process.env.NEXT_PUBLIC_URL ?? "http://localhost:3000"}/messagekit-logo.png`, - splashBackgroundColor: "#ffffff", - }, - }, - }), - "of:version": "vNext", - "of:accepts:xmtp": "vNext", - "fc:frame:image": imageUrl, - "fc:frame:button:1": "Start Chat", - }, - }; -} diff --git a/packages/baselinks/src/app/dm/[address]/page.tsx b/packages/baselinks/src/app/dm/[address]/page.tsx deleted file mode 100644 index eb6bed2d7..000000000 --- a/packages/baselinks/src/app/dm/[address]/page.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { generateMetadata } from "./metadata"; -import { ChatFrameClient } from "./ChatClient"; - -export { generateMetadata }; - -export default function ChatFrame(): JSX.Element { - return ; -} diff --git a/packages/baselinks/src/components/Chat.module.css b/packages/baselinks/src/components/Chat.module.css deleted file mode 100644 index db1155dbe..000000000 --- a/packages/baselinks/src/components/Chat.module.css +++ /dev/null @@ -1,237 +0,0 @@ -/* Chat Container */ -.chatContainer { - display: flex; - flex-direction: column; - height: 100%; - height: -webkit-fill-available; /* iOS viewport fix */ - background-color: #1a1a1a; - color: #f0f0f0; - font-family: monospace; - padding: 0.75rem; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; -} - -/* Wallet Info Section */ -.walletInfo { - background-color: #2a2a2a; - padding: 0.75rem; - margin-bottom: 0.75rem; - border-radius: 8px; - font-size: 1rem; -} - -/* Messages Container */ -.messagesContainer { - flex: 1; - overflow-y: auto; - padding: 0.5rem; - display: flex; - flex-direction: column; - gap: 0.5rem; - margin-bottom: env(safe-area-inset-bottom); - -webkit-overflow-scrolling: touch; - position: relative; - height: auto; -} - -/* Message Bubbles */ -.message { - display: flex; - align-items: flex-start; - padding: 0.5rem; - line-height: 1.3; - font-size: 0.95rem; - white-space: pre-wrap; -} - -.sender { - color: #fa6977; - margin-right: 0.375rem; - font-weight: bold; -} - -/* Message Form */ -.messageForm { - position: sticky; - bottom: 0; - left: 0; - right: 0; - padding: 0.75rem; - background-color: #1a1a1a; - margin: 0 -0.75rem -0.75rem; - padding-bottom: calc(0.75rem + env(safe-area-inset-bottom)); -} - -/* Input Field */ -.inputWrapper { - display: flex; - gap: 0.5rem; - width: 100%; -} - -.input { - flex: 1; - background-color: #2a2a2a; - border: 1px solid #3a3a3a; - color: #f0f0f0; - padding: 0 1rem; - font-family: monospace; - font-size: 1rem; - height: 48px; - border-radius: 8px; - line-height: 48px; - -webkit-appearance: none; - appearance: none; -} - -.input:focus { - outline: none; - border-color: #fa6977; -} - -/* Send Button */ -.sendButton { - background-color: #fa6977; - color: white; - border: none; - cursor: pointer; - font-family: monospace; - height: 48px; - border-radius: 8px; - font-size: 1rem; - font-weight: 600; - min-width: 80px; - transition: background-color 0.2s; -} - -.sendButton:hover { - background-color: #ff7a87; -} - -.sendButton:active { - background-color: #e55d6a; -} - -/* Add these new mobile-specific styles */ -@media (max-width: 768px) { - .chatContainer { - padding: 0.375rem; - height: 100%; - position: absolute; - } - - .messageForm { - position: sticky; - bottom: 0; - background-color: #1a1a1a; - padding: 0.5rem; - padding-bottom: calc(0.5rem + env(safe-area-inset-bottom)); - margin: 0 -0.375rem -0.375rem; - z-index: 2; - } - - .messagesContainer { - padding-bottom: 0; - margin-bottom: 0; - flex: 1 1 auto; - } - - .walletInfo { - padding: 0.5rem; - margin-bottom: 0.5rem; - font-size: 0.9rem; - } - - /* Prevent zoom on input focus for iOS */ - .input { - font-size: 16px; - } -} - -/* Add support for iOS safe areas */ -@supports (padding: max(0px)) { - .chatContainer { - padding-left: max(0.75rem, env(safe-area-inset-left)); - padding-right: max(0.75rem, env(safe-area-inset-right)); - padding-bottom: max(0.75rem, env(safe-area-inset-bottom)); - } -} - -/* iOS viewport height fix */ -@supports (-webkit-touch-callout: none) { - .chatContainer { - height: -webkit-fill-available; - } - - .messagesContainer { - height: auto; - min-height: 0; - } -} - -.urlContainer { - margin: 8px 0; - display: flex; - flex-direction: column; - gap: 8px; - max-width: 300px; -} - -.urlPreview { - border-radius: 8px 8px 0 0; - overflow: hidden; - background: #2a2a2a; - border: 1px solid #3a3a3a; - width: 100%; -} - -.previewImage { - width: 100%; - height: 150px; - object-fit: cover; -} - -.buttonContainer { - display: flex; - gap: 1px; - width: 100%; - background: #3a3a3a; -} - -.urlButton { - flex: 1; - padding: 12px; - border: none; - background-color: #0052ff; - color: #f0f0f0; - cursor: pointer; - font-size: 14px; - transition: all 0.2s; - width: 100%; - text-align: center; -} - -.urlButton:hover { - background-color: #3a3a3a; -} - -.messageLink { - color: #fa6977; - text-decoration: underline; - word-break: break-all; - width: 100%; - display: block; -} - -.loadingContainer { - display: flex; - justify-content: center; - align-items: center; - padding: 1rem; - color: #666; - font-size: 0.9rem; -} diff --git a/packages/baselinks/src/components/Chat.tsx b/packages/baselinks/src/components/Chat.tsx deleted file mode 100644 index 367412821..000000000 --- a/packages/baselinks/src/components/Chat.tsx +++ /dev/null @@ -1,263 +0,0 @@ -import React, { useCallback } from "react"; -import { useState, useEffect } from "react"; -import { Wallet } from "ethers"; -import styles from "./Chat.module.css"; -import { UserInfo } from "@/app/utils/resolver"; -import { isAddress, parseUnits } from "viem"; -import { extractFrameChain } from "@/app/utils/networks"; -import sdk from "@farcaster/frame-sdk"; -import { UrlPreview } from "./UrlPreview"; -import { createClient, XMTP, Message } from "xmtp-client"; - -type UrlType = "receipt" | "payment" | "wallet" | "unknown"; - -const getUrlType = (url: string): UrlType => { - if (url.includes("/receipt")) return "receipt"; - if (url.includes("/payment")) return "payment"; - if (url.includes("/wallet")) return "wallet"; - return "unknown"; -}; - -const isFrame = async () => { - try { - const context = await sdk.context; - return !!context; // If we can get context, we're in a frame - } catch { - return false; // If we can't get context, we're not in a frame - } -}; - -function Chat({ user }: { user: UserInfo }) { - const [messages, setMessages] = useState([]); - const [newMessage, setNewMessage] = useState(""); - const [wallet, setWallet] = useState(undefined); - const [xmtp, setXmtp] = useState(undefined); - const [isLoading, setIsLoading] = useState(true); - const [recipientInfo, setRecipientInfo] = useState( - undefined, - ); - const [processedMessageIds] = useState(new Set()); - - useEffect(() => { - console.log("useEffect triggered with user:", user); - - const init = async () => { - const newWallet = Wallet.createRandom(); - setWallet(newWallet); - - try { - setRecipientInfo(user); - if (user?.address) { - console.log("Initializing XMTP with address:", user.address); - await initXmtp(newWallet); - } else { - console.error("Could not resolve recipient address"); - setIsLoading(false); - } - } catch (error) { - console.error("Error resolving recipient:", error); - setIsLoading(false); - } - }; - - init(); - }, [user.address]); - - const onMessage = async (message: Message | undefined) => { - if (message) { - console.log("onMessage", message); - setMessages((prevMessages) => [...prevMessages, message]); - } - }; - - const initXmtp = async (wallet: any) => { - try { - const xmtpClient = await createClient(onMessage, { - privateKey: wallet.privateKey, - }); - - setXmtp(xmtpClient); - setIsLoading(false); - } catch (error) { - console.error("Error initializing XMTP:", error); - setIsLoading(false); - } - }; - - const sendMessage = async (e: React.FormEvent) => { - e.preventDefault(); - - if (!xmtp || !newMessage || !recipientInfo?.address) { - console.log("Missing required data:", { - xmtp: !!xmtp, - newMessage, - recipientAddress: recipientInfo?.address, - }); - return; - } - - try { - console.log("Sending message:", newMessage); - const message = await xmtp.sendMessage(newMessage, user.address); - - setMessages((prevMessages) => [...prevMessages, message]); - setNewMessage(""); - } catch (error) { - console.error("Error sending message:", error); - } - }; - - const ethereumURL = (url: string) => { - try { - const urlObject = new URL(url); - const urlParams = new URLSearchParams(urlObject.search); - const networkId = urlParams.get("networkId"); - const { chainId, tokenAddress } = extractFrameChain(networkId as string); - const amount = urlParams.get("amount"); - const recipientAddress = urlParams.get("recipientAddress"); - - if (!amount || !recipientAddress) { - console.error("Missing required parameters for ethereum URL"); - return url; - } - - const amountUint256 = parseUnits(amount, 6); - return `ethereum:${tokenAddress}@${chainId}/transfer?address=${recipientAddress}&uint256=${amountUint256}`; - } catch (error) { - console.error("Error constructing ethereum URL:", error); - return url; - } - }; - - const openUrl = useCallback(async (url: string) => { - try { - const inFrame = await isFrame(); - if (inFrame) { - sdk.actions.openUrl(url); - } else { - window.open(url, "_blank"); - } - } catch (error) { - console.error("Error opening URL:", error); - window.location.href = url; - } - }, []); - - const renderMessageContent = (text: string) => { - const urlRegex = /(https?:\/\/[^\s]+)/g; - const parts = text?.split(urlRegex); - - return parts.map((part, index) => { - if (urlRegex.test(part)) { - try { - const urlType = getUrlType(part); - const isMessageKitUrl = part.includes("frames.message-kit.org"); - - return ( -
- {isMessageKitUrl && } -
- {urlType === "payment" && ( - - )} - {urlType === "receipt" && ( - - )} - {urlType === "wallet" && ( - - )} - {urlType === "unknown" && ( - - {part} - - )} -
-
- ); - } catch (error) { - console.error("Error rendering URL content:", error); - return part; - } - } - return part; - }); - }; - - return ( -
-
-
- Agent: - {user?.preferredName || - (user?.address && isAddress(user.address) - ? user.address.slice(0, 6) + "..." + user.address.slice(-4) - : user?.address)} -
-
- {isLoading && ( -
- Loading messages... -
- )} -
- {messages.map((msg, index) => ( -
- - {msg.sender.address.toLowerCase() === user.address?.toLowerCase() - ? "Agent" - : "Human"} - - {renderMessageContent(msg.content?.text as string)} -
- ))} -
-
-
- setNewMessage(e.target.value)} - placeholder={ - isLoading ? "Initializing XMTP..." : "Type a message..." - } - className={styles.input} - disabled={isLoading} - /> - -
-
-
- ); -} - -export default React.memo(Chat); diff --git a/packages/baselinks/src/components/UrlPreview.tsx b/packages/baselinks/src/components/UrlPreview.tsx deleted file mode 100644 index c9d98d99d..000000000 --- a/packages/baselinks/src/components/UrlPreview.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import { useState, useEffect } from "react"; -import styles from "./Chat.module.css"; - -interface OgData { - image?: string; - title?: string; - description?: string; - url?: string; -} - -export const UrlPreview = ({ - url, - urlType, -}: { - url: string; - urlType?: string; -}) => { - const [ogData, setOgData] = useState(null); - const [loading, setLoading] = useState(true); - - useEffect(() => { - const fetchOGData = async () => { - try { - const decodedUrl = decodeURIComponent(url); - console.log("Fetching OG data for URL:", decodedUrl); - - // Use the /api/og endpoint to avoid CORS - const response = await fetch( - `/api/og?url=${encodeURIComponent(decodedUrl)}`, - ); - - if (!response.ok) { - throw new Error(`Failed to fetch OG data: ${response.status}`); - } - - const data = await response.json(); - console.log("Extracted OG data:", data); - setOgData(data); - } catch (error) { - console.error("Error fetching OG data:", error); - } finally { - setLoading(false); - } - }; - - if (url) { - fetchOGData(); - } - }, [url]); - - if (loading) { - return
Loading preview...
; - } - - if (!ogData?.image) { - return null; - } - - return ( -
- {ogData.title -
- ); -}; diff --git a/packages/docs/vocs.config.tsx.timestamp-1734838080672-555165cda1cb2.mjs b/packages/docs/vocs.config.tsx.timestamp-1734838080672-555165cda1cb2.mjs deleted file mode 100644 index ddb5b0f86..000000000 --- a/packages/docs/vocs.config.tsx.timestamp-1734838080672-555165cda1cb2.mjs +++ /dev/null @@ -1,182 +0,0 @@ -// vocs.config.tsx -import { defineConfig } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/vocs/_lib/index.js"; -import { Fragment, jsx, jsxs } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/react/jsx-runtime.js"; -var vocs_config_default = defineConfig({ - head: () => { - return /* @__PURE__ */ jsxs(Fragment, { children: [ - /* @__PURE__ */ jsx("meta", { charSet: "utf-8" }), - /* @__PURE__ */ jsx("meta", { name: "viewport", content: "width=device-width" }), - /* @__PURE__ */ jsx("meta", { property: "og:title", content: "MessageKit" }), - /* @__PURE__ */ jsx("meta", { property: "og:image", content: "https://message-kit.org/hero.jpg" }), - /* @__PURE__ */ jsx("meta", { property: "fc:frame", content: "vNext" }), - /* @__PURE__ */ jsx("meta", { property: "of:version", content: "vNext" }), - /* @__PURE__ */ jsx("meta", { property: "of:accepts:xmtp", content: "vNext" }), - /* @__PURE__ */ jsx("meta", { property: "of:image", content: "https://message-kit.org/hero.jpg" }), - /* @__PURE__ */ jsx( - "meta", - { - property: "fc:frame:image", - content: "https://message-kit.org/hero.jpg" - } - ), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1", content: "Docs" }), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1:action", content: "link" }), - /* @__PURE__ */ jsx( - "meta", - { - property: "fc:frame:button:1:target", - content: "https://message-kit.org/" - } - ), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2", content: "Drop a \u2B50\uFE0F" }), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2:action", content: "link" }), - /* @__PURE__ */ jsx( - "meta", - { - property: "fc:frame:button:2:target", - content: "https://github.com/ephemeraHQ/message-kit" - } - ), - /* @__PURE__ */ jsx("meta", { property: "og:site_name", content: "MessageKit" }), - /* @__PURE__ */ jsx("meta", { name: "twitter:card", content: "summary_large_image" }), - /* @__PURE__ */ jsx("meta", { name: "twitter:site", content: "@MessageKit" }), - /* @__PURE__ */ jsx("meta", { name: "twitter:title", content: "MessageKit" }), - /* @__PURE__ */ jsx( - "meta", - { - name: "twitter:description", - content: "MessageKit is a powerful tool for managing your messages." - } - ), - /* @__PURE__ */ jsx("meta", { name: "twitter:image", content: "https://message-kit.org/hero.jpg" }), - /* @__PURE__ */ jsx( - "script", - { - src: "https://plausible.io/js/script.outbound-links.js", - "data-domain": "message-kit.org", - defer: true - } - ) - ] }); - }, - ogImageUrl: { - "/": "/hero.jpg", - "/docs": "/hero.jpg" - }, - title: "MessageKit", - rootDir: ".", - iconUrl: { - light: "/messagekit-logo.png", - dark: "/messagekit-logo.png" - }, - theme: { - accentColor: { - light: "#FA6977", - dark: "#FA6977" - } - }, - socials: [ - { - icon: "github", - link: "https://github.com/ephemeraHQ/message-kit" - } - ], - topNav: [{ text: "Changelog", link: "/changelog" }], - editLink: { - pattern: "https://github.com/ephemeraHQ/message-kit/blob/main/packages/docs/pages/:path", - text: "Suggest changes to this page" - }, - sidebar: [ - { - text: "Quickstart", - link: "/quickstart" - }, - { - text: "UX", - items: [ - { - text: "Concierge", - link: "/skills/concierge" - }, - { - text: "Frames", - link: "/ux/frames" - }, - { - text: "Wallet service", - link: "/ux/wallet-service" - }, - { - text: "Groups", - link: "/ux/groups" - } - ] - }, - { - text: "Community", - items: [ - { - text: "Skills", - link: "/community/skills" - }, - { - text: "Plugins", - link: "/community/plugins" - }, - { - text: "Templates", - link: "/community/templates" - }, - { - text: "Vibes", - link: "/community/vibes" - }, - { - text: "Projects", - link: "/community/projects" - } - ] - }, - { - text: "Fundations", - items: [ - { - text: "Agents", - link: "/concepts/agents" - }, - { - text: "Skills", - link: "/concepts/skills" - }, - { - text: "XMTP", - link: "/concepts/xmtp" - }, - { - text: "Usernames", - link: "/plugins/resolver" - } - ] - }, - { - text: "Contribute", - link: "/contribute" - }, - { - text: "Deployment", - link: "/deployment" - }, - { - text: "Guidelines", - link: "/guidelines" - }, - { - text: "Changelog", - link: "/changelog" - } - ] -}); -export { - vocs_config_default as default -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidm9jcy5jb25maWcudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwidm9jc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBoZWFkOiAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxtZXRhIGNoYXJTZXQ9XCJ1dGYtOFwiIC8+XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGhcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOnRpdGxlXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOmltYWdlXCIgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZVwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6dmVyc2lvblwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6YWNjZXB0czp4bXRwXCIgY29udGVudD1cInZOZXh0XCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJvZjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTppbWFnZVwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCJcbiAgICAgICAgLz5cblxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxXCIgY29udGVudD1cIkRvY3NcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOmFjdGlvblwiIGNvbnRlbnQ9XCJsaW5rXCIgLz5cbiAgICAgICAgPG1ldGFcbiAgICAgICAgICBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOnRhcmdldFwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL1wiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MlwiIGNvbnRlbnQ9XCJEcm9wIGEgXHUyQjUwXHVGRTBGXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MjphY3Rpb25cIiBjb250ZW50PVwibGlua1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246Mjp0YXJnZXRcIlxuICAgICAgICAgIGNvbnRlbnQ9XCJodHRwczovL2dpdGh1Yi5jb20vZXBoZW1lcmFIUS9tZXNzYWdlLWtpdFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2c6c2l0ZV9uYW1lXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpjYXJkXCIgY29udGVudD1cInN1bW1hcnlfbGFyZ2VfaW1hZ2VcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpzaXRlXCIgY29udGVudD1cIkBNZXNzYWdlS2l0XCIgLz5cbiAgICAgICAgPG1ldGEgbmFtZT1cInR3aXR0ZXI6dGl0bGVcIiBjb250ZW50PVwiTWVzc2FnZUtpdFwiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgbmFtZT1cInR3aXR0ZXI6ZGVzY3JpcHRpb25cIlxuICAgICAgICAgIGNvbnRlbnQ9XCJNZXNzYWdlS2l0IGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgbWFuYWdpbmcgeW91ciBtZXNzYWdlcy5cIlxuICAgICAgICAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxzY3JpcHRcbiAgICAgICAgICBzcmM9XCJodHRwczovL3BsYXVzaWJsZS5pby9qcy9zY3JpcHQub3V0Ym91bmQtbGlua3MuanNcIlxuICAgICAgICAgIGRhdGEtZG9tYWluPVwibWVzc2FnZS1raXQub3JnXCJcbiAgICAgICAgICBkZWZlclxuICAgICAgICAvPlxuICAgICAgPC8+XG4gICAgKTtcbiAgfSxcbiAgb2dJbWFnZVVybDoge1xuICAgIFwiL1wiOiBcIi9oZXJvLmpwZ1wiLFxuICAgIFwiL2RvY3NcIjogXCIvaGVyby5qcGdcIixcbiAgfSxcbiAgdGl0bGU6IFwiTWVzc2FnZUtpdFwiLFxuICByb290RGlyOiBcIi5cIixcbiAgaWNvblVybDoge1xuICAgIGxpZ2h0OiBcIi9tZXNzYWdla2l0LWxvZ28ucG5nXCIsXG4gICAgZGFyazogXCIvbWVzc2FnZWtpdC1sb2dvLnBuZ1wiLFxuICB9LFxuICB0aGVtZToge1xuICAgIGFjY2VudENvbG9yOiB7XG4gICAgICBsaWdodDogXCIjRkE2OTc3XCIsXG4gICAgICBkYXJrOiBcIiNGQTY5NzdcIixcbiAgICB9LFxuICB9LFxuICBzb2NpYWxzOiBbXG4gICAge1xuICAgICAgaWNvbjogXCJnaXRodWJcIixcbiAgICAgIGxpbms6IFwiaHR0cHM6Ly9naXRodWIuY29tL2VwaGVtZXJhSFEvbWVzc2FnZS1raXRcIixcbiAgICB9LFxuICBdLFxuICB0b3BOYXY6IFt7IHRleHQ6IFwiQ2hhbmdlbG9nXCIsIGxpbms6IFwiL2NoYW5nZWxvZ1wiIH1dLFxuICBlZGl0TGluazoge1xuICAgIHBhdHRlcm46XG4gICAgICBcImh0dHBzOi8vZ2l0aHViLmNvbS9lcGhlbWVyYUhRL21lc3NhZ2Uta2l0L2Jsb2IvbWFpbi9wYWNrYWdlcy9kb2NzL3BhZ2VzLzpwYXRoXCIsXG4gICAgdGV4dDogXCJTdWdnZXN0IGNoYW5nZXMgdG8gdGhpcyBwYWdlXCIsXG4gIH0sXG4gIHNpZGViYXI6IFtcbiAgICB7XG4gICAgICB0ZXh0OiBcIlF1aWNrc3RhcnRcIixcbiAgICAgIGxpbms6IFwiL3F1aWNrc3RhcnRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiVVhcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkNvbmNpZXJnZVwiLFxuICAgICAgICAgIGxpbms6IFwiL3NraWxscy9jb25jaWVyZ2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiRnJhbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZnJhbWVzXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIldhbGxldCBzZXJ2aWNlXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvd2FsbGV0LXNlcnZpY2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiR3JvdXBzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZ3JvdXBzXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJDb21tdW5pdHlcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlNraWxsc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUGx1Z2luc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9wbHVnaW5zXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlRlbXBsYXRlc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS90ZW1wbGF0ZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVmliZXNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvdmliZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUHJvamVjdHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvcHJvamVjdHNcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkZ1bmRhdGlvbnNcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkFnZW50c1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL2FnZW50c1wiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJTa2lsbHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb25jZXB0cy9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiWE1UUFwiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL3htdHBcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVXNlcm5hbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvcGx1Z2lucy9yZXNvbHZlclwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ29udHJpYnV0ZVwiLFxuICAgICAgbGluazogXCIvY29udHJpYnV0ZVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJEZXBsb3ltZW50XCIsXG4gICAgICBsaW5rOiBcIi9kZXBsb3ltZW50XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkd1aWRlbGluZXNcIixcbiAgICAgIGxpbms6IFwiL2d1aWRlbGluZXNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ2hhbmdlbG9nXCIsXG4gICAgICBsaW5r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 diff --git a/packages/docs/vocs.config.tsx.timestamp-1734838080676-8f5d6f6bfcf92.mjs b/packages/docs/vocs.config.tsx.timestamp-1734838080676-8f5d6f6bfcf92.mjs deleted file mode 100644 index ddb5b0f86..000000000 --- a/packages/docs/vocs.config.tsx.timestamp-1734838080676-8f5d6f6bfcf92.mjs +++ /dev/null @@ -1,182 +0,0 @@ -// vocs.config.tsx -import { defineConfig } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/vocs/_lib/index.js"; -import { Fragment, jsx, jsxs } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/react/jsx-runtime.js"; -var vocs_config_default = defineConfig({ - head: () => { - return /* @__PURE__ */ jsxs(Fragment, { children: [ - /* @__PURE__ */ jsx("meta", { charSet: "utf-8" }), - /* @__PURE__ */ jsx("meta", { name: "viewport", content: "width=device-width" }), - /* @__PURE__ */ jsx("meta", { property: "og:title", content: "MessageKit" }), - /* @__PURE__ */ jsx("meta", { property: "og:image", content: "https://message-kit.org/hero.jpg" }), - /* @__PURE__ */ jsx("meta", { property: "fc:frame", content: "vNext" }), - /* @__PURE__ */ jsx("meta", { property: "of:version", content: "vNext" }), - /* @__PURE__ */ jsx("meta", { property: "of:accepts:xmtp", content: "vNext" }), - /* @__PURE__ */ jsx("meta", { property: "of:image", content: "https://message-kit.org/hero.jpg" }), - /* @__PURE__ */ jsx( - "meta", - { - property: "fc:frame:image", - content: "https://message-kit.org/hero.jpg" - } - ), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1", content: "Docs" }), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1:action", content: "link" }), - /* @__PURE__ */ jsx( - "meta", - { - property: "fc:frame:button:1:target", - content: "https://message-kit.org/" - } - ), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2", content: "Drop a \u2B50\uFE0F" }), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2:action", content: "link" }), - /* @__PURE__ */ jsx( - "meta", - { - property: "fc:frame:button:2:target", - content: "https://github.com/ephemeraHQ/message-kit" - } - ), - /* @__PURE__ */ jsx("meta", { property: "og:site_name", content: "MessageKit" }), - /* @__PURE__ */ jsx("meta", { name: "twitter:card", content: "summary_large_image" }), - /* @__PURE__ */ jsx("meta", { name: "twitter:site", content: "@MessageKit" }), - /* @__PURE__ */ jsx("meta", { name: "twitter:title", content: "MessageKit" }), - /* @__PURE__ */ jsx( - "meta", - { - name: "twitter:description", - content: "MessageKit is a powerful tool for managing your messages." - } - ), - /* @__PURE__ */ jsx("meta", { name: "twitter:image", content: "https://message-kit.org/hero.jpg" }), - /* @__PURE__ */ jsx( - "script", - { - src: "https://plausible.io/js/script.outbound-links.js", - "data-domain": "message-kit.org", - defer: true - } - ) - ] }); - }, - ogImageUrl: { - "/": "/hero.jpg", - "/docs": "/hero.jpg" - }, - title: "MessageKit", - rootDir: ".", - iconUrl: { - light: "/messagekit-logo.png", - dark: "/messagekit-logo.png" - }, - theme: { - accentColor: { - light: "#FA6977", - dark: "#FA6977" - } - }, - socials: [ - { - icon: "github", - link: "https://github.com/ephemeraHQ/message-kit" - } - ], - topNav: [{ text: "Changelog", link: "/changelog" }], - editLink: { - pattern: "https://github.com/ephemeraHQ/message-kit/blob/main/packages/docs/pages/:path", - text: "Suggest changes to this page" - }, - sidebar: [ - { - text: "Quickstart", - link: "/quickstart" - }, - { - text: "UX", - items: [ - { - text: "Concierge", - link: "/skills/concierge" - }, - { - text: "Frames", - link: "/ux/frames" - }, - { - text: "Wallet service", - link: "/ux/wallet-service" - }, - { - text: "Groups", - link: "/ux/groups" - } - ] - }, - { - text: "Community", - items: [ - { - text: "Skills", - link: "/community/skills" - }, - { - text: "Plugins", - link: "/community/plugins" - }, - { - text: "Templates", - link: "/community/templates" - }, - { - text: "Vibes", - link: "/community/vibes" - }, - { - text: "Projects", - link: "/community/projects" - } - ] - }, - { - text: "Fundations", - items: [ - { - text: "Agents", - link: "/concepts/agents" - }, - { - text: "Skills", - link: "/concepts/skills" - }, - { - text: "XMTP", - link: "/concepts/xmtp" - }, - { - text: "Usernames", - link: "/plugins/resolver" - } - ] - }, - { - text: "Contribute", - link: "/contribute" - }, - { - text: "Deployment", - link: "/deployment" - }, - { - text: "Guidelines", - link: "/guidelines" - }, - { - text: "Changelog", - link: "/changelog" - } - ] -}); -export { - vocs_config_default as default -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidm9jcy5jb25maWcudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwidm9jc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBoZWFkOiAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxtZXRhIGNoYXJTZXQ9XCJ1dGYtOFwiIC8+XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGhcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOnRpdGxlXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOmltYWdlXCIgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZVwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6dmVyc2lvblwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6YWNjZXB0czp4bXRwXCIgY29udGVudD1cInZOZXh0XCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJvZjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTppbWFnZVwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCJcbiAgICAgICAgLz5cblxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxXCIgY29udGVudD1cIkRvY3NcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOmFjdGlvblwiIGNvbnRlbnQ9XCJsaW5rXCIgLz5cbiAgICAgICAgPG1ldGFcbiAgICAgICAgICBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOnRhcmdldFwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL1wiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MlwiIGNvbnRlbnQ9XCJEcm9wIGEgXHUyQjUwXHVGRTBGXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MjphY3Rpb25cIiBjb250ZW50PVwibGlua1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246Mjp0YXJnZXRcIlxuICAgICAgICAgIGNvbnRlbnQ9XCJodHRwczovL2dpdGh1Yi5jb20vZXBoZW1lcmFIUS9tZXNzYWdlLWtpdFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2c6c2l0ZV9uYW1lXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpjYXJkXCIgY29udGVudD1cInN1bW1hcnlfbGFyZ2VfaW1hZ2VcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpzaXRlXCIgY29udGVudD1cIkBNZXNzYWdlS2l0XCIgLz5cbiAgICAgICAgPG1ldGEgbmFtZT1cInR3aXR0ZXI6dGl0bGVcIiBjb250ZW50PVwiTWVzc2FnZUtpdFwiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgbmFtZT1cInR3aXR0ZXI6ZGVzY3JpcHRpb25cIlxuICAgICAgICAgIGNvbnRlbnQ9XCJNZXNzYWdlS2l0IGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgbWFuYWdpbmcgeW91ciBtZXNzYWdlcy5cIlxuICAgICAgICAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxzY3JpcHRcbiAgICAgICAgICBzcmM9XCJodHRwczovL3BsYXVzaWJsZS5pby9qcy9zY3JpcHQub3V0Ym91bmQtbGlua3MuanNcIlxuICAgICAgICAgIGRhdGEtZG9tYWluPVwibWVzc2FnZS1raXQub3JnXCJcbiAgICAgICAgICBkZWZlclxuICAgICAgICAvPlxuICAgICAgPC8+XG4gICAgKTtcbiAgfSxcbiAgb2dJbWFnZVVybDoge1xuICAgIFwiL1wiOiBcIi9oZXJvLmpwZ1wiLFxuICAgIFwiL2RvY3NcIjogXCIvaGVyby5qcGdcIixcbiAgfSxcbiAgdGl0bGU6IFwiTWVzc2FnZUtpdFwiLFxuICByb290RGlyOiBcIi5cIixcbiAgaWNvblVybDoge1xuICAgIGxpZ2h0OiBcIi9tZXNzYWdla2l0LWxvZ28ucG5nXCIsXG4gICAgZGFyazogXCIvbWVzc2FnZWtpdC1sb2dvLnBuZ1wiLFxuICB9LFxuICB0aGVtZToge1xuICAgIGFjY2VudENvbG9yOiB7XG4gICAgICBsaWdodDogXCIjRkE2OTc3XCIsXG4gICAgICBkYXJrOiBcIiNGQTY5NzdcIixcbiAgICB9LFxuICB9LFxuICBzb2NpYWxzOiBbXG4gICAge1xuICAgICAgaWNvbjogXCJnaXRodWJcIixcbiAgICAgIGxpbms6IFwiaHR0cHM6Ly9naXRodWIuY29tL2VwaGVtZXJhSFEvbWVzc2FnZS1raXRcIixcbiAgICB9LFxuICBdLFxuICB0b3BOYXY6IFt7IHRleHQ6IFwiQ2hhbmdlbG9nXCIsIGxpbms6IFwiL2NoYW5nZWxvZ1wiIH1dLFxuICBlZGl0TGluazoge1xuICAgIHBhdHRlcm46XG4gICAgICBcImh0dHBzOi8vZ2l0aHViLmNvbS9lcGhlbWVyYUhRL21lc3NhZ2Uta2l0L2Jsb2IvbWFpbi9wYWNrYWdlcy9kb2NzL3BhZ2VzLzpwYXRoXCIsXG4gICAgdGV4dDogXCJTdWdnZXN0IGNoYW5nZXMgdG8gdGhpcyBwYWdlXCIsXG4gIH0sXG4gIHNpZGViYXI6IFtcbiAgICB7XG4gICAgICB0ZXh0OiBcIlF1aWNrc3RhcnRcIixcbiAgICAgIGxpbms6IFwiL3F1aWNrc3RhcnRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiVVhcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkNvbmNpZXJnZVwiLFxuICAgICAgICAgIGxpbms6IFwiL3NraWxscy9jb25jaWVyZ2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiRnJhbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZnJhbWVzXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIldhbGxldCBzZXJ2aWNlXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvd2FsbGV0LXNlcnZpY2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiR3JvdXBzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZ3JvdXBzXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJDb21tdW5pdHlcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlNraWxsc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUGx1Z2luc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9wbHVnaW5zXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlRlbXBsYXRlc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS90ZW1wbGF0ZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVmliZXNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvdmliZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUHJvamVjdHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvcHJvamVjdHNcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkZ1bmRhdGlvbnNcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkFnZW50c1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL2FnZW50c1wiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJTa2lsbHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb25jZXB0cy9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiWE1UUFwiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL3htdHBcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVXNlcm5hbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvcGx1Z2lucy9yZXNvbHZlclwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ29udHJpYnV0ZVwiLFxuICAgICAgbGluazogXCIvY29udHJpYnV0ZVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJEZXBsb3ltZW50XCIsXG4gICAgICBsaW5rOiBcIi9kZXBsb3ltZW50XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkd1aWRlbGluZXNcIixcbiAgICAgIGxpbms6IFwiL2d1aWRlbGluZXNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ2hhbmdlbG9nXCIsXG4gICAgICBsaW5r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 diff --git a/packages/docs/vocs.config.tsx.timestamp-1734838080741-1ac173819a28.mjs b/packages/docs/vocs.config.tsx.timestamp-1734838080741-1ac173819a28.mjs deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/xmtp-client/src/lib/xmtp.ts b/packages/xmtp-client/src/lib/xmtp.ts index 035342b12..362f31faa 100644 --- a/packages/xmtp-client/src/lib/xmtp.ts +++ b/packages/xmtp-client/src/lib/xmtp.ts @@ -5,9 +5,8 @@ import { generatePrivateKey, privateKeyToAccount } from "viem/accounts"; import { mainnet } from "viem/chains"; import { Message } from "./types.js"; import { parseMessage } from "./parse.js"; -import { XMTPClass } from "xmtp"; -export class XMTP { +export class XMTPClass { client: Client; address: string; message: Message; @@ -72,10 +71,10 @@ export class XMTP { } } -export async function createClient( +export async function XMTP( onMessage: (message: Message | undefined) => Promise = async () => {}, config?: { privateKey?: string; apiKey?: string }, -): Promise { +): Promise { const { Client } = await import("@xmtp/xmtp-js"); const { key } = setupPrivateKey(config?.privateKey); const user = createUser(key); @@ -85,7 +84,7 @@ export async function createClient( env: "production", }); - const xmtp = new XMTP(client); + const xmtp = new XMTPClass(client); streamMessages(onMessage, client); diff --git a/yarn.lock b/yarn.lock index 9dde9d341..56f340b3e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4174,7 +4174,6 @@ __metadata: react-dom: "npm:^18.2.0" typescript: "npm:^5" viem: "npm:^2.21.45" - xmtp-client: "workspace:*" languageName: unknown linkType: soft From dd9b0d16082f4f8f163dca1029958615021dfe56 Mon Sep 17 00:00:00 2001 From: fabri Date: Sun, 22 Dec 2024 10:34:25 -0300 Subject: [PATCH 07/19] deploy --- package.json | 2 +- packages/agent-client/src/app/page.tsx | 2 +- packages/agent-client/src/components/Chat.tsx | 2 +- .../baselinks/src/app/api/payment/route.tsx | 2 +- .../baselinks/src/app/api/wallet/route.tsx | 2 +- packages/baselinks/src/app/generator/page.tsx | 2 +- packages/baselinks/src/app/globals.css | 69 ++--- packages/baselinks/src/app/mint/page.tsx | 2 +- packages/baselinks/src/app/page.module.css | 168 ----------- packages/baselinks/src/app/page.tsx | 103 +++++-- packages/baselinks/src/app/payment/page.tsx | 4 +- packages/baselinks/src/app/utils/networks.ts | 284 +----------------- packages/baselinks/src/app/wallet/page.tsx | 2 +- .../baselinks/src/components/PaymentFrame.tsx | 55 ---- .../src/components/ReceiptGenerator.tsx | 137 +++------ .../baselinks/src/components/UrlGenerator.tsx | 177 +++++------ packages/docs/pages/plugins/framekit.mdx | 2 +- packages/docs/pages/plugins/learnweb3.mdx | 1 - packages/docs/pages/skills/concierge.mdx | 1 - packages/docs/pages/ux/frames.mdx | 2 +- packages/message-kit/src/plugins/baselinks.ts | 21 +- packages/message-kit/src/skills/concierge.ts | 2 - packages/message-kit/tests/Frames.test.ts | 2 +- templates/ens/src/skills/pay.ts | 4 +- .../payroll-agent/src/plugins/payroll.ts | 7 +- templates/playground/src/skills/pay.ts | 6 +- 26 files changed, 258 insertions(+), 803 deletions(-) delete mode 100644 packages/baselinks/src/app/page.module.css diff --git a/package.json b/package.json index 7a0952280..b1dce8cd9 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "docs": "cd packages/docs && yarn dev", "domain": "ngrok http --hostname=frames.ngrok.app 3000", "format": "turbo run format", - "links": "yarn build:xmtp-client && cd packages/links && yarn dev", + "links": " cd packages/baselinks && yarn dev", "play": "cd templates/playground && yarn dev", "publish": "yarn install && yarn build && yarn copy && node scripts/publish.js", "templates": "node scripts/devTemplates.js", diff --git a/packages/agent-client/src/app/page.tsx b/packages/agent-client/src/app/page.tsx index d37bbc39a..9623ea4eb 100644 --- a/packages/agent-client/src/app/page.tsx +++ b/packages/agent-client/src/app/page.tsx @@ -15,7 +15,7 @@ export default function Home(): JSX.Element { function HomeContent(): JSX.Element { const searchParams = useSearchParams(); - const address = searchParams.get("address"); + const address = searchParams.get("address") ?? "paymentagent.eth"; console.log("address", address); const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); diff --git a/packages/agent-client/src/components/Chat.tsx b/packages/agent-client/src/components/Chat.tsx index 5554732bb..4606ee439 100644 --- a/packages/agent-client/src/components/Chat.tsx +++ b/packages/agent-client/src/components/Chat.tsx @@ -151,7 +151,7 @@ function Chat({ user }: { user: UserInfo }) { if (urlRegex.test(part)) { try { const urlType = getUrlType(part); - const isMessageKitUrl = part.includes("frames.message-kit.org"); + const isMessageKitUrl = part.includes("message-kit.org"); return (
diff --git a/packages/baselinks/src/app/api/payment/route.tsx b/packages/baselinks/src/app/api/payment/route.tsx index 0504bb2e7..8952d3b44 100644 --- a/packages/baselinks/src/app/api/payment/route.tsx +++ b/packages/baselinks/src/app/api/payment/route.tsx @@ -28,7 +28,7 @@ export async function GET(req: NextRequest) { try { let searchParams = req.nextUrl.searchParams; let params = { - url: process.env.NEXT_PUBLIC_URL, + url: process.env.NEXT_PUBLIC_URL ?? "http://localhost:3000", amount: searchParams.get("amount") ?? "1", recipientAddress: searchParams.get("recipientAddress") ?? diff --git a/packages/baselinks/src/app/api/wallet/route.tsx b/packages/baselinks/src/app/api/wallet/route.tsx index b7e71c832..1fa45800f 100644 --- a/packages/baselinks/src/app/api/wallet/route.tsx +++ b/packages/baselinks/src/app/api/wallet/route.tsx @@ -20,7 +20,7 @@ export async function GET(req: NextRequest) { let searchParams = req.nextUrl.searchParams; const params = { - url: process.env.NEXT_PUBLIC_URL, + url: process.env.NEXT_PUBLIC_URL ?? "http://localhost:3000", balance: searchParams.get("balance") ?? searchParams.get("Balance") ?? "0", networkId: diff --git a/packages/baselinks/src/app/generator/page.tsx b/packages/baselinks/src/app/generator/page.tsx index e603e1302..ce9af8b1e 100644 --- a/packages/baselinks/src/app/generator/page.tsx +++ b/packages/baselinks/src/app/generator/page.tsx @@ -8,7 +8,7 @@ export default async function Home({ const resolvedSearchParams = await searchParams; // Await the promises //tes sd const params = { - url: `${process.env.NEXT_PUBLIC_URL}`, + url: process.env.NEXT_PUBLIC_URL ?? "http://localhost:3000", recipientAddress: (resolvedSearchParams?.recipientAddress as string) || "0x93E2fc3e99dFb1238eB9e0eF2580EFC5809C7204", diff --git a/packages/baselinks/src/app/globals.css b/packages/baselinks/src/app/globals.css index 02730cc54..6c2cca3d4 100644 --- a/packages/baselinks/src/app/globals.css +++ b/packages/baselinks/src/app/globals.css @@ -1,13 +1,14 @@ :root { - --background: #000000; + --background: #ffffff; --foreground: #ffffff; - --accent: #fa6977; + --accent: #0052ff; } @media (prefers-color-scheme: dark) { :root { - --background: #000000; + --background: #ffffff; --foreground: #ffffff; + --accent: #0052ff; } } @@ -21,12 +22,13 @@ body { } body { - color: var(--foreground); + color: var(--accent); background: var(--background); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; + line-height: 1.5; } .container { @@ -47,7 +49,6 @@ body { } .title { - font-size: 2.25rem; font-weight: bold; text-align: center; margin-bottom: 2rem; @@ -55,10 +56,17 @@ body { } .form-container { - background-color: #111111; + width: 800px; + background-color: var(--background); border-radius: 0.5rem; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); padding: 1.5rem; + margin-bottom: 1rem; +} +@media (max-width: 799px) { + .form-container { + width: 90%; + } } .form-group { @@ -69,19 +77,20 @@ body { display: block; font-size: 0.875rem; font-weight: 500; - color: #ffffff; + color: var(--accent); margin-bottom: 0.5rem; } .input, .select { - width: 100%; - padding: 0.5rem 0.75rem; - border: 1px solid #333333; - background-color: #000000; - color: #ffffff; + width: 100% !important; + padding: 0.3rem; + border: 1px solid var(--accent); + background-color: var(--background); + color: var(--accent); border-radius: 0.375rem; margin-top: 0.25rem; + display: block; } .submit-button { @@ -95,7 +104,7 @@ body { } .submit-button:hover { - background-color: #e55967; + background-color: #0033a1; } .url-container { @@ -109,8 +118,8 @@ body { .copy-button { padding: 0.5rem 1rem; - background-color: #111111; - color: #ffffff; + background-color: var(--background); + color: var(--accent); border-radius: 0.375rem; border: none; cursor: pointer; @@ -118,33 +127,5 @@ body { } .copy-button:hover { - background-color: #222222; -} - -/* For any monospace text, like the generated URL */ -.url-container .input { - font-family: var(--font-geist-mono); -} - -.powered-by { - text-align: center; - align-items: center; - font-family: var(--font-geist-sans); - color: #ffffff; -} - -.powered-by a { - color: var(--accent); - text-decoration: none; - font-weight: 500; -} - -.powered-by a:hover { - text-decoration: underline; -} - -.nextjs-toast, -nextjs-portal, -.nextjs-static-indicator-toast-wrapper { - display: none !important; + background-color: var(--background); } diff --git a/packages/baselinks/src/app/mint/page.tsx b/packages/baselinks/src/app/mint/page.tsx index ccf6e20cb..72b308231 100644 --- a/packages/baselinks/src/app/mint/page.tsx +++ b/packages/baselinks/src/app/mint/page.tsx @@ -7,7 +7,7 @@ export default async function Home({ }) { const resolvedSearchParams = await searchParams; // Await the promise - const url = `${process.env.NEXT_PUBLIC_URL || "http://localhost:3000"}`; + const url = process.env.NEXT_PUBLIC_URL || "http://localhost:3000"; const collectionId = (resolvedSearchParams.collectionId as string) || "0x73a333cb82862d4f66f0154229755b184fb4f5b0"; diff --git a/packages/baselinks/src/app/page.module.css b/packages/baselinks/src/app/page.module.css deleted file mode 100644 index ee9b8e633..000000000 --- a/packages/baselinks/src/app/page.module.css +++ /dev/null @@ -1,168 +0,0 @@ -.page { - --gray-rgb: 0, 0, 0; - --gray-alpha-200: rgba(var(--gray-rgb), 0.08); - --gray-alpha-100: rgba(var(--gray-rgb), 0.05); - - --button-primary-hover: #383838; - --button-secondary-hover: #f2f2f2; - - display: grid; - grid-template-rows: 20px 1fr 20px; - align-items: center; - justify-items: center; - min-height: 100svh; - padding: 80px; - gap: 64px; - font-family: var(--font-geist-sans); -} - -@media (prefers-color-scheme: dark) { - .page { - --gray-rgb: 255, 255, 255; - --gray-alpha-200: rgba(var(--gray-rgb), 0.145); - --gray-alpha-100: rgba(var(--gray-rgb), 0.06); - - --button-primary-hover: #ccc; - --button-secondary-hover: #1a1a1a; - } -} - -.main { - display: flex; - flex-direction: column; - gap: 32px; - grid-row-start: 2; -} - -.main ol { - font-family: var(--font-geist-mono); - padding-left: 0; - margin: 0; - font-size: 14px; - line-height: 24px; - letter-spacing: -0.01em; - list-style-position: inside; -} - -.main li:not(:last-of-type) { - margin-bottom: 8px; -} - -.main code { - font-family: inherit; - background: var(--gray-alpha-100); - padding: 2px 4px; - border-radius: 4px; - font-weight: 600; -} - -.ctas { - display: flex; - gap: 16px; -} - -.ctas a { - appearance: none; - border-radius: 128px; - height: 48px; - padding: 0 20px; - border: none; - border: 1px solid transparent; - transition: - background 0.2s, - color 0.2s, - border-color 0.2s; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - font-size: 16px; - line-height: 20px; - font-weight: 500; -} - -a.primary { - background: var(--foreground); - color: var(--background); - gap: 8px; -} - -a.secondary { - border-color: var(--gray-alpha-200); - min-width: 180px; -} - -.footer { - grid-row-start: 3; - display: flex; - gap: 24px; -} - -.footer a { - display: flex; - align-items: center; - gap: 8px; -} - -.footer img { - flex-shrink: 0; -} - -/* Enable hover only on non-touch devices */ -@media (hover: hover) and (pointer: fine) { - a.primary:hover { - background: var(--button-primary-hover); - border-color: transparent; - } - - a.secondary:hover { - background: var(--button-secondary-hover); - border-color: transparent; - } - - .footer a:hover { - text-decoration: underline; - text-underline-offset: 4px; - } -} - -@media (max-width: 600px) { - .page { - padding: 32px; - padding-bottom: 80px; - } - - .main { - align-items: center; - } - - .main ol { - text-align: center; - } - - .ctas { - flex-direction: column; - } - - .ctas a { - font-size: 14px; - height: 40px; - padding: 0 16px; - } - - a.secondary { - min-width: auto; - } - - .footer { - flex-wrap: wrap; - align-items: center; - justify-content: center; - } -} - -@media (prefers-color-scheme: dark) { - .logo { - filter: invert(); - } -} diff --git a/packages/baselinks/src/app/page.tsx b/packages/baselinks/src/app/page.tsx index 914c1afd8..7b2ac31eb 100644 --- a/packages/baselinks/src/app/page.tsx +++ b/packages/baselinks/src/app/page.tsx @@ -2,10 +2,35 @@ import { GeistMono as geistMono } from "geist/font/mono"; import { GeistSans as geistSans } from "geist/font/sans"; import Head from "next/head"; +import UrlGenerator from "../components/UrlGenerator"; +import { useState } from "react"; export default function Home() { const url = `${process.env.NEXT_PUBLIC_URL || "http://localhost:3000"}`; let image = `${url}/hero.jpg`; + const [formData, setFormData] = useState({ + txLink: + "https://sepolia.basescan.org/tx/0x2ec524f740c5831b16ca84053f9b6ae3e3923d3399d527113982e884a75e6bfa", + networkLogo: "https://avatars.githubusercontent.com/u/108554348?s=280&v=4", + amount: "1", + networkName: "Base", + tokenName: "usdc", + }); + + const [generatedUrl, setGeneratedUrl] = useState(""); + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + const baseUrl = window.location.origin; + + // Create URLSearchParams object to properly encode parameters + const params = new URLSearchParams({ + txLink: formData.txLink, + }); + + setGeneratedUrl(`${baseUrl}/receipt?txLink=${formData.txLink}`); + }; + return ( <> @@ -34,37 +59,53 @@ export default function Home() {
-
-

frames

- - - - - - -
- - Custom - + className={`container ${geistSans.variable} ${geistMono.variable}`} + style={{ + display: "flex", + flexDirection: "column", + justifyContent: "center", + alignItems: "center", + height: "100vh", + padding: "20px", + boxSizing: "border-box", + }}> +
+
+

+ BaseLinks +

+

+ Generate payment links with QR code for coinbase wallet +

+
+ +
diff --git a/packages/baselinks/src/app/payment/page.tsx b/packages/baselinks/src/app/payment/page.tsx index b7724a00a..a9cd5e85f 100644 --- a/packages/baselinks/src/app/payment/page.tsx +++ b/packages/baselinks/src/app/payment/page.tsx @@ -35,7 +35,7 @@ export async function generateMetadata({ const { chainId, tokenAddress } = extractFrameChain(params.networkId); const amountUint256 = parseUnits(params.amount.toString(), 6); const ethereumUrl = `ethereum:${tokenAddress}@${chainId}/transfer?address=${params.recipientAddress}&uint256=${amountUint256}`; - const image = `${params.url}/api/payment?networkId=${params.networkId}&amount=${params.amount}&recipientAddress=${params.recipientAddress}`; + const image = `${params.url}/api/payment?amount=${params.amount}&recipientAddress=${params.recipientAddress}`; return { title: "Ethereum Payment", @@ -63,7 +63,7 @@ export default async function Home({ searchParams }: Props) { const { chainId, tokenAddress } = extractFrameChain(params.networkId); const amountUint256 = parseUnits(params.amount.toString(), 6); const ethereumUrl = `ethereum:${tokenAddress}@${chainId}/transfer?address=${params.recipientAddress}&uint256=${amountUint256}`; - const image = `${params.url}/api/payment?networkId=${params.networkId}&amount=${params.amount}&recipientAddress=${params.recipientAddress}`; + const image = `${params.url}/api/payment?amount=${params.amount}&recipientAddress=${params.recipientAddress}`; return (
n.networkId === "eth"); - } else if (txLink?.includes("goerli.etherscan.io")) { - network = db.find((n) => n.networkId === "eth_goerli"); - } else if (txLink?.includes("sepolia.etherscan.io")) { - network = db.find((n) => n.networkId === "eth_sepolia"); - } else if (txLink?.includes("sepolia.basescan.org")) { + if (txLink?.includes("sepolia.basescan.org")) { network = db.find((n) => n.networkId === "base_sepolia"); } else if (txLink?.includes("goerli.basescan.org")) { network = db.find((n) => n.networkId === "base_goerli"); @@ -352,23 +93,8 @@ export function extractFrameChain(txLink: string): Network { network = db.find((n) => n.networkId === "base"); } } - if (network === undefined) { - console.error(`Network ${network} not found`); - return { - networkId: "", - networkName: "", - networkLogo: "", - tokenName: "", - dripAmount: 0, - address: "", - isERC20: false, - erc20Address: undefined, - erc20Decimals: undefined, - chainId: 0, - tokenAddress: "", - isActive: false, - balance: "0", - }; + if (!network) { + throw new Error("Network not found"); } return network; } diff --git a/packages/baselinks/src/app/wallet/page.tsx b/packages/baselinks/src/app/wallet/page.tsx index 114ae125d..753b6f4f2 100644 --- a/packages/baselinks/src/app/wallet/page.tsx +++ b/packages/baselinks/src/app/wallet/page.tsx @@ -12,7 +12,7 @@ type Props = { async function getParams(searchParams: Promise) { const resolvedSearchParams = await searchParams; return { - url: process.env.NEXT_PUBLIC_URL, + url: process.env.NEXT_PUBLIC_URL ?? "http://localhost:3000", agentAddress: (resolvedSearchParams?.agentAddress as string) || (resolvedSearchParams?.agentaddress as string), diff --git a/packages/baselinks/src/components/PaymentFrame.tsx b/packages/baselinks/src/components/PaymentFrame.tsx index d18efacc5..076096418 100644 --- a/packages/baselinks/src/components/PaymentFrame.tsx +++ b/packages/baselinks/src/components/PaymentFrame.tsx @@ -1,6 +1,5 @@ "use client"; import React from "react"; -import { ethers } from "ethers"; import { GeistMono as geistMono } from "geist/font/mono"; import { GeistSans as geistSans } from "geist/font/sans"; @@ -14,62 +13,11 @@ declare global { } const PaymentFrame: React.FC = ({ url, image, label }) => { - // const handleWeb3Payment = async () => { - // if (typeof window.ethereum !== "undefined") { - // try { - // // Ensure we're on Base network - // await window.ethereum.request({ - // method: "wallet_switchEthereumChain", - // params: [{ chainId: `0x${BASE_CHAIN_ID.toString(16)}` }], - // }); - - // // Create transaction parameters for USDC transfer with gasless transaction - // const accounts = await window.ethereum.request({ - // method: "eth_requestAccounts", - // }); - // const transactionParameters = { - // to: params.tokenAddress, // USDC contract address - // from: accounts[0], - // data: generateERC20TransferData( - // params.recipientAddress, - // amountUint256, - // ), - // maxFeePerGas: "0x0", // Set to 0 for gasless - // maxPriorityFeePerGas: "0x0", // Set to 0 for gasless - // // Add Base Paymaster contract as the gas sponsor - // gasPrice: "0x0", - // }; - - // // Send the transaction - // await window.ethereum.request({ - // method: "eth_sendTransaction", - // params: [transactionParameters], - // }); - // } catch (error) { - // console.error("Payment failed:", error); - // } - // } else { - // window.location.href = url; - // } - // }; - const handleCoinbaseDeeplink = () => { const coinbasePaymentURL = url; window.location.href = coinbasePaymentURL; }; - // // Helper function to generate ERC20 transfer data - // function generateERC20TransferData(recipient: string, amount: string) { - // // ERC20 transfer function signature - // const transferFunctionSignature = "0xa9059cbb"; - - // // Pad address and amount to 32 bytes - // const paddedAddress = recipient.slice(2).padStart(64, "0"); - // const paddedAmount = ethers.toBeHex(amount).slice(2).padStart(64, "0"); - - // return `${transferFunctionSignature}${paddedAddress}${paddedAmount}`; - // } - return (
@@ -77,9 +25,6 @@ const PaymentFrame: React.FC = ({ url, image, label }) => {
Payment Frame
- {/* */} + - - - - {generatedUrl && ( -
- -
- - -
-
- )} +
-
+ )}
); } diff --git a/packages/baselinks/src/components/UrlGenerator.tsx b/packages/baselinks/src/components/UrlGenerator.tsx index 69d5478aa..366313021 100644 --- a/packages/baselinks/src/components/UrlGenerator.tsx +++ b/packages/baselinks/src/components/UrlGenerator.tsx @@ -16,7 +16,7 @@ export default function UrlGenerator({ params }: { params: any }) { const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); - const baseUrl = process.env.NEXT_PUBLIC_URL; + const baseUrl = process.env.NEXT_PUBLIC_URL ?? "http://localhost:3000"; const params = new URLSearchParams({ recipientAddress: formData.recipientAddress, amount: formData.amount, @@ -27,109 +27,88 @@ export default function UrlGenerator({ params }: { params: any }) { }; return ( -
-
-

Payment Generator

- -
-
-
- - - setFormData({ ...formData, recipientAddress: e.target.value }) - } - className="input" - placeholder="0x..." - /> -
+
+ +
+ + + setFormData({ ...formData, recipientAddress: e.target.value }) + } + className="input" + placeholder="0x..." + /> +
-
- - - setFormData({ ...formData, amount: e.target.value }) - } - className="input" - placeholder="1.0" - /> -
+
+ + + setFormData({ ...formData, amount: e.target.value }) + } + className="input" + placeholder="1.0" + /> +
-
- - -
+ + - {" "} + - - - {generatedUrl && ( -
- -
- This frame can be sent through Converse and includes a button - that deeplinks to the wallet transaction. It only works on - mobile devices and EVM wallets. -
-
- - {" "} - -
-
- -
-
- This QR works in Mobile, scan this qr code with your mobile - camera -
-
- )} +
+
+ +
+
+ This QR works in Mobile, scan this qr code with your mobile camera +
-
+ )}
); } diff --git a/packages/docs/pages/plugins/framekit.mdx b/packages/docs/pages/plugins/framekit.mdx index 6ab9dfcc4..e56341931 100644 --- a/packages/docs/pages/plugins/framekit.mdx +++ b/packages/docs/pages/plugins/framekit.mdx @@ -12,7 +12,7 @@ You can request payments using the payment frame: ```typescript // Request 1 USDC payment to a specific address -const url = await baselinks.requestPayment(recipientAddress, 1, "USDC"); +const url = await baselinks.requestPayment(recipientAddress, 1); // Send the url to the user await context.send(url); diff --git a/packages/docs/pages/plugins/learnweb3.mdx b/packages/docs/pages/plugins/learnweb3.mdx index 7abb4d4d5..ea3dd551c 100644 --- a/packages/docs/pages/plugins/learnweb3.mdx +++ b/packages/docs/pages/plugins/learnweb3.mdx @@ -5,7 +5,6 @@ ```tsx [src/plugins/learnweb3.ts] import axios from "axios"; -export const BASE_TX_FRAME_URL = "https://frames.message-kit.org"; export const SUPPORTED_NETWORKS = [ "arbitrum_goerli", "arbitrum_sepolia", diff --git a/packages/docs/pages/skills/concierge.mdx b/packages/docs/pages/skills/concierge.mdx index 9533fefe4..1b9f5142d 100644 --- a/packages/docs/pages/skills/concierge.mdx +++ b/packages/docs/pages/skills/concierge.mdx @@ -53,7 +53,6 @@ async function fund(context: Context, amount: number) { const url = await baselinks.requestPayment( walletData.agent_address, amount, - "USDC", onRamp ? onRampURL : undefined, ); await context.send(url); diff --git a/packages/docs/pages/ux/frames.mdx b/packages/docs/pages/ux/frames.mdx index 1457c22b0..73a5b5b3d 100644 --- a/packages/docs/pages/ux/frames.mdx +++ b/packages/docs/pages/ux/frames.mdx @@ -12,7 +12,7 @@ Frames are a way to interact with your agent via Farcaster. Framesv2 is a new way to interact with agents via frames. It allows you to have your own landing page for your agent and interact with it via frames in Farcaster. ```bash -Share in Farcaster (Framev2): https://frames.message-kit.org/dm/0x... +Share in Farcaster (Framev2): https://agent-client.message-kit.org/?address=0x... ``` **Properties:** diff --git a/packages/message-kit/src/plugins/baselinks.ts b/packages/message-kit/src/plugins/baselinks.ts index 92e4844a3..5a2075a72 100644 --- a/packages/message-kit/src/plugins/baselinks.ts +++ b/packages/message-kit/src/plugins/baselinks.ts @@ -7,9 +7,9 @@ export interface Frame { } const framesUrl = - process.env.FRAME_URL !== undefined - ? process.env.FRAME_URL - : "https://frames.message-kit.org"; + process.env.BASELINKS_URL !== undefined + ? process.env.BASELINKS_URL + : "https://baselinks.vercel.app"; export class baselinks { static async sendWallet( @@ -17,7 +17,7 @@ export class baselinks { agentAddress: string, balance: number, ): Promise { - let url = `${framesUrl}/wallet?networkId=${"base"}&agentAddress=${agentAddress}&ownerAddress=${ownerAddress}&balance=${balance}`; + let url = `${framesUrl}/wallet?agentAddress=${agentAddress}&ownerAddress=${ownerAddress}&balance=${balance}`; return url; } @@ -29,7 +29,6 @@ export class baselinks { static async requestPayment( to: string = "humanagent.eth", amount: number = 0.01, - token: string = "usdc", onRampURL?: string, ): Promise { let senderInfo = await getUserInfo(to); @@ -38,7 +37,7 @@ export class baselinks { return ""; } - let sendUrl = `${framesUrl}/payment?networkId=${"base"}&amount=${amount}&token=${token}&recipientAddress=${senderInfo?.address}`; + let sendUrl = `${framesUrl}/payment?amount=${amount}&recipientAddress=${senderInfo?.address}`; if (onRampURL) { sendUrl = sendUrl + "&onRampURL=" + encodeURIComponent(onRampURL); } @@ -47,10 +46,18 @@ export class baselinks { static async sendReceipt(txLink: string, amount: number): Promise { if (!txLink) return ""; - let receiptUrl = `${framesUrl}/receipt?networkId=${"base"}&txLink=${txLink}&amount=${amount}`; + let receiptUrl = `${framesUrl}/receipt?txLink=${txLink}&amount=${amount}`; return receiptUrl; } + static async sendCoinbaseDMLink( + address: string, + amount: number, + ): Promise { + let url = `${framesUrl}/coinbase?address=${address}&amount=${amount}`; + return url; + } + static async converseLink(peer: string, pretext?: string): Promise { let url = `https://converse.xyz/dm/${peer}`; if (pretext) url += `&pretext=${encodeURIComponent(pretext)}`; diff --git a/packages/message-kit/src/skills/concierge.ts b/packages/message-kit/src/skills/concierge.ts index 54a6b865b..8f593616b 100644 --- a/packages/message-kit/src/skills/concierge.ts +++ b/packages/message-kit/src/skills/concierge.ts @@ -231,7 +231,6 @@ async function fund( const url = await baselinks.requestPayment( walletData.agent_address, amount, - "USDC", onRamp ? onRampURL : undefined, ); await context.dm(url); @@ -260,7 +259,6 @@ async function fund( const url = await baselinks.requestPayment( walletData.agent_address, Number(response), - "USDC", onRamp ? onRampURL : undefined, ); await context.dm(url); diff --git a/packages/message-kit/tests/Frames.test.ts b/packages/message-kit/tests/Frames.test.ts index a24b9d2ae..c893ee8b1 100644 --- a/packages/message-kit/tests/Frames.test.ts +++ b/packages/message-kit/tests/Frames.test.ts @@ -1,5 +1,5 @@ import { describe, test, expect } from "vitest"; -import { extractFrameChain } from "../../framekit/src/app/utils/networks"; +import { extractFrameChain } from "../../baselinks/src/app/utils/networks"; describe("Frame Chain Tests", () => { test.each([ diff --git a/templates/ens/src/skills/pay.ts b/templates/ens/src/skills/pay.ts index 59f13e0c0..a9bc3b2d2 100644 --- a/templates/ens/src/skills/pay.ts +++ b/templates/ens/src/skills/pay.ts @@ -44,7 +44,7 @@ export async function handler(context: Context) { message: { content: { skill, - params: { amount, token, username }, + params: { amount, username }, }, }, } = context; @@ -54,7 +54,7 @@ export async function handler(context: Context) { const url = await baselinks.requestPayment(receiverAddress, tipAmount); await context.dm(url); } else if (skill === "pay") { - const url = await baselinks.requestPayment(receiverAddress, amount, token); + const url = await baselinks.requestPayment(receiverAddress, amount); await context.dm(url); } } diff --git a/templates/payroll-agent/src/plugins/payroll.ts b/templates/payroll-agent/src/plugins/payroll.ts index cca74386d..9c92b6114 100644 --- a/templates/payroll-agent/src/plugins/payroll.ts +++ b/templates/payroll-agent/src/plugins/payroll.ts @@ -1,6 +1,7 @@ -import { getRedisClient, getAllEmployees } from "./redis.js"; +import { getAllEmployees } from "./redis.js"; import { Context } from "@xmtp/message-kit"; import cron from "node-cron"; +import { baselinks } from "@xmtp/message-kit"; export class Payroll { private context: Context; @@ -72,9 +73,7 @@ export class Payroll { const message = `⚠️ Insufficient funds for today's payroll!\nRequired: ${totalRequired} USDC\nAvailable: ${balance} USDC\nPlease fund your account.`; console.log(message); await this.context.send(message); - await this.context.send( - `https://frames.message-kit.org/payment?networkId=base&amount=${totalRequired}&token=USDC&recipientAddress=${wallet?.agent_address}`, - ); + await baselinks.requestPayment(wallet?.agent_address, totalRequired); return; } diff --git a/templates/playground/src/skills/pay.ts b/templates/playground/src/skills/pay.ts index 458f42388..55e4d05f7 100644 --- a/templates/playground/src/skills/pay.ts +++ b/templates/playground/src/skills/pay.ts @@ -31,10 +31,6 @@ export async function handler(context: Context) { const { amount: amountSend, token: tokenSend, username } = params; - const url = await baselinks.requestPayment( - username?.address, - amountSend, - tokenSend, - ); + const url = await baselinks.requestPayment(username?.address, amountSend); await context.dm(url); } From 227e26dcbd1570e0ed08d67ccbc3182c5da25448 Mon Sep 17 00:00:00 2001 From: fabri Date: Sun, 22 Dec 2024 10:42:25 -0300 Subject: [PATCH 08/19] testing ok --- packages/message-kit/tests/Frames.test.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/packages/message-kit/tests/Frames.test.ts b/packages/message-kit/tests/Frames.test.ts index c893ee8b1..843cf1e62 100644 --- a/packages/message-kit/tests/Frames.test.ts +++ b/packages/message-kit/tests/Frames.test.ts @@ -3,15 +3,6 @@ import { extractFrameChain } from "../../baselinks/src/app/utils/networks"; describe("Frame Chain Tests", () => { test.each([ - [ - "https://etherscan.io/tx/0x6c43658dfaaa4a2cecfe1646da8c4130a630f46b4eff590c71c711be7b2c5c8a", - { - networkLogo: "https://cryptologos.cc/logos/ethereum-eth-logo.png", - networkName: "Ethereum Mainnet", - tokenName: "ETH", - dripAmount: 0.01, - }, - ], [ "https://sepolia.basescan.org/tx/0xd60833f6e38ffce6e19109cf525726f54859593a0716201ae9f6444a04765a37", { From 500ce970b86cf266303f5f2902a9bca615b26628 Mon Sep 17 00:00:00 2001 From: fabri Date: Sun, 22 Dec 2024 12:53:23 -0300 Subject: [PATCH 09/19] deploy --- .changeset/config.json | 2 +- README.md | 4 +- package.json | 6 +- packages/{agent-client => client}/.gitignore | 0 packages/{agent-client => client}/.yarnrc.yml | 0 packages/{agent-client => client}/README.md | 0 .../{agent-client => client}/next.config.js | 0 .../{agent-client => client}/package.json | 7 +- .../public/fonts/GeistMonoVF.woff | Bin .../public/fonts/GeistVF.woff | Bin .../public/fonts/Inter-Regular.ttf | Bin .../public/fonts/Inter-SemiBold.ttf | Bin .../{agent-client => client}/public/hero.jpg | Bin .../public/messagekit-logo.png | Bin .../src/app/api/og/route.ts | 0 .../src/app/favicon.ico | Bin .../src/app/fonts/GeistMonoVF.woff | Bin .../src/app/fonts/GeistVF.woff | Bin .../src/app/globals.css | 0 .../src/app/layout.tsx | 0 .../src/app/page.module.css | 0 .../{agent-client => client}/src/app/page.tsx | 0 .../src/app/utils/networks.ts | 0 .../src/app/utils/resolver.ts | 0 .../src/components/Chat.module.css | 0 .../src/components/Chat.tsx | 27 +-- .../src/components/UrlPreview.tsx | 0 .../{agent-client => client}/tsconfig.json | 0 packages/{agent-client => client}/vercel.json | 0 packages/docs/pages/changelog.mdx | 2 +- packages/docs/pages/plugins/xmtp.mdx | 12 +- packages/docs/pages/ux/frames.mdx | 2 +- ....timestamp-1734881463365-9f79bf95ec7b2.mjs | 182 ++++++++++++++++++ ....timestamp-1734881463377-71370c3873b4a.mjs | 182 ++++++++++++++++++ ....timestamp-1734881463417-5232a778f8c7d.mjs | 182 ++++++++++++++++++ packages/message-kit/src/lib/core.ts | 8 +- packages/xmtp-client/src/index.ts | 2 - packages/xmtp-client/src/lib/types.ts | 46 ----- packages/{xmtp-client => xmtp-web}/README.md | 0 .../{xmtp-client => xmtp-web}/package.json | 4 +- .../rollup.config.js | 0 packages/xmtp-web/src/index.ts | 2 + .../src/lib/parse.ts | 2 +- .../{xmtp-client => xmtp-web}/src/lib/xmtp.ts | 56 ++++-- packages/xmtp-web/src/types.ts | 63 ++++++ .../{xmtp-client => xmtp-web}/tsconfig.json | 0 packages/xmtp/src/index.ts | 2 +- packages/xmtp/src/lib/parse.ts | 2 +- packages/xmtp/src/lib/xmtp.ts | 2 +- packages/xmtp/src/{lib => }/types.ts | 1 - scripts/publish.js | 2 +- yarn.lock | 47 +++-- 52 files changed, 703 insertions(+), 144 deletions(-) rename packages/{agent-client => client}/.gitignore (100%) rename packages/{agent-client => client}/.yarnrc.yml (100%) rename packages/{agent-client => client}/README.md (100%) rename packages/{agent-client => client}/next.config.js (100%) rename packages/{agent-client => client}/package.json (81%) rename packages/{agent-client => client}/public/fonts/GeistMonoVF.woff (100%) rename packages/{agent-client => client}/public/fonts/GeistVF.woff (100%) rename packages/{agent-client => client}/public/fonts/Inter-Regular.ttf (100%) rename packages/{agent-client => client}/public/fonts/Inter-SemiBold.ttf (100%) rename packages/{agent-client => client}/public/hero.jpg (100%) rename packages/{agent-client => client}/public/messagekit-logo.png (100%) rename packages/{agent-client => client}/src/app/api/og/route.ts (100%) rename packages/{agent-client => client}/src/app/favicon.ico (100%) rename packages/{agent-client => client}/src/app/fonts/GeistMonoVF.woff (100%) rename packages/{agent-client => client}/src/app/fonts/GeistVF.woff (100%) rename packages/{agent-client => client}/src/app/globals.css (100%) rename packages/{agent-client => client}/src/app/layout.tsx (100%) rename packages/{agent-client => client}/src/app/page.module.css (100%) rename packages/{agent-client => client}/src/app/page.tsx (100%) rename packages/{agent-client => client}/src/app/utils/networks.ts (100%) rename packages/{agent-client => client}/src/app/utils/resolver.ts (100%) rename packages/{agent-client => client}/src/components/Chat.module.css (100%) rename packages/{agent-client => client}/src/components/Chat.tsx (92%) rename packages/{agent-client => client}/src/components/UrlPreview.tsx (100%) rename packages/{agent-client => client}/tsconfig.json (100%) rename packages/{agent-client => client}/vercel.json (100%) create mode 100644 packages/docs/vocs.config.tsx.timestamp-1734881463365-9f79bf95ec7b2.mjs create mode 100644 packages/docs/vocs.config.tsx.timestamp-1734881463377-71370c3873b4a.mjs create mode 100644 packages/docs/vocs.config.tsx.timestamp-1734881463417-5232a778f8c7d.mjs delete mode 100644 packages/xmtp-client/src/index.ts delete mode 100644 packages/xmtp-client/src/lib/types.ts rename packages/{xmtp-client => xmtp-web}/README.md (100%) rename packages/{xmtp-client => xmtp-web}/package.json (96%) rename packages/{xmtp-client => xmtp-web}/rollup.config.js (100%) create mode 100644 packages/xmtp-web/src/index.ts rename packages/{xmtp-client => xmtp-web}/src/lib/parse.ts (96%) rename packages/{xmtp-client => xmtp-web}/src/lib/xmtp.ts (85%) create mode 100644 packages/xmtp-web/src/types.ts rename packages/{xmtp-client => xmtp-web}/tsconfig.json (100%) rename packages/xmtp/src/{lib => }/types.ts (97%) diff --git a/.changeset/config.json b/.changeset/config.json index ee97a7e12..ce7254800 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -12,5 +12,5 @@ "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", - "ignore": ["baselinks", "agent-client", "docs", "@xmtp/tsconfig"] + "ignore": ["baselinks", "client", "docs", "@xmtp/tsconfig"] } diff --git a/README.md b/README.md index 8b6f50d7d..8336e6c14 100644 --- a/README.md +++ b/README.md @@ -13,11 +13,11 @@ A set of tools for AI developers to build on top of [XMTP](https://xmtp.org) ### Plugins - [`xmtp`](/packages/xmtp/): A node js wrapper for AI agents. -- [`xmtp-client`](/packages/xmtp-client/): A client plugin for interacting with hte backend. +- [`xmtp-web`](/packages/xmtp-web/): A client plugin for interacting with hte backend. ### Other -- [`agent-client`](/packages/agent-client): A suite for backend frames +- [`client`](/packages/client): A suite for backend frames - [`baselinks`](/packages/baselinks): A suite for backend frames ## Contributing diff --git a/package.json b/package.json index b1dce8cd9..e3c78d761 100644 --- a/package.json +++ b/package.json @@ -9,20 +9,20 @@ "shared/*" ], "scripts": { + "agent": "yarn build:xmtp-web && cd packages/client && yarn dev", "build": "yarn build:message-kit && yarn build:packages && yarn build:templates", - "build:agent-client": "turbo run build --filter=./packages/agent-client --force", + "build:client": "turbo run build --filter=./packages/client --force", "build:message-kit": "turbo run build --filter=./packages/message-kit --force", "build:packages": "turbo run build --filter='./packages/*' --filter='!./packages/message-kit'", "build:templates": "turbo run build --filter='./templates/*'", "build:xmtp": "turbo run build --filter=./packages/xmtp --force", - "build:xmtp-client": "turbo run build --filter=./packages/xmtp-client --force", + "build:xmtp-web": "turbo run build --filter=./packages/xmtp-web --force", "bump": "node scripts/update-version.js -t patch", "changeset": "yarn copy && changeset add --type patch", "clean": "turbo run clean && rm -rf node_modules && rm -rf .turbo && rm -rf packages/message-kit/dist && rm -rf packages/message-kit/.turbo && rm -rf packages/docs/dist && yarn cache clean", "cli": "node packages/create-message-kit/index.js", "copy": "node scripts/copyTemplates.js", "dev": "yarn build:xmtp && cd packages/message-kit && yarn build:watch", - "dm": "yarn build:agent-client && cd packages/agent-client && yarn dev", "docs": "cd packages/docs && yarn dev", "domain": "ngrok http --hostname=frames.ngrok.app 3000", "format": "turbo run format", diff --git a/packages/agent-client/.gitignore b/packages/client/.gitignore similarity index 100% rename from packages/agent-client/.gitignore rename to packages/client/.gitignore diff --git a/packages/agent-client/.yarnrc.yml b/packages/client/.yarnrc.yml similarity index 100% rename from packages/agent-client/.yarnrc.yml rename to packages/client/.yarnrc.yml diff --git a/packages/agent-client/README.md b/packages/client/README.md similarity index 100% rename from packages/agent-client/README.md rename to packages/client/README.md diff --git a/packages/agent-client/next.config.js b/packages/client/next.config.js similarity index 100% rename from packages/agent-client/next.config.js rename to packages/client/next.config.js diff --git a/packages/agent-client/package.json b/packages/client/package.json similarity index 81% rename from packages/agent-client/package.json rename to packages/client/package.json index dd1e03b83..68b0be2ee 100644 --- a/packages/agent-client/package.json +++ b/packages/client/package.json @@ -1,5 +1,5 @@ { - "name": "agent-client", + "name": "client", "version": "0.1.0", "private": true, "scripts": { @@ -12,15 +12,12 @@ "@farcaster/frame-sdk": "0.0.10", "@types/next": "^9.0.0", "cheerio": "^1.0.0", - "ethers": "^6.13.4", "geist": "^1.3.1", "next": "^15.0.3", - "qrcode": "^1.5.4", - "qrcode.react": "^4.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", "viem": "^2.21.45", - "xmtp-client": "workspace:*" + "xmtp-web": "workspace:*" }, "devDependencies": { "@types/node": "^20", diff --git a/packages/agent-client/public/fonts/GeistMonoVF.woff b/packages/client/public/fonts/GeistMonoVF.woff similarity index 100% rename from packages/agent-client/public/fonts/GeistMonoVF.woff rename to packages/client/public/fonts/GeistMonoVF.woff diff --git a/packages/agent-client/public/fonts/GeistVF.woff b/packages/client/public/fonts/GeistVF.woff similarity index 100% rename from packages/agent-client/public/fonts/GeistVF.woff rename to packages/client/public/fonts/GeistVF.woff diff --git a/packages/agent-client/public/fonts/Inter-Regular.ttf b/packages/client/public/fonts/Inter-Regular.ttf similarity index 100% rename from packages/agent-client/public/fonts/Inter-Regular.ttf rename to packages/client/public/fonts/Inter-Regular.ttf diff --git a/packages/agent-client/public/fonts/Inter-SemiBold.ttf b/packages/client/public/fonts/Inter-SemiBold.ttf similarity index 100% rename from packages/agent-client/public/fonts/Inter-SemiBold.ttf rename to packages/client/public/fonts/Inter-SemiBold.ttf diff --git a/packages/agent-client/public/hero.jpg b/packages/client/public/hero.jpg similarity index 100% rename from packages/agent-client/public/hero.jpg rename to packages/client/public/hero.jpg diff --git a/packages/agent-client/public/messagekit-logo.png b/packages/client/public/messagekit-logo.png similarity index 100% rename from packages/agent-client/public/messagekit-logo.png rename to packages/client/public/messagekit-logo.png diff --git a/packages/agent-client/src/app/api/og/route.ts b/packages/client/src/app/api/og/route.ts similarity index 100% rename from packages/agent-client/src/app/api/og/route.ts rename to packages/client/src/app/api/og/route.ts diff --git a/packages/agent-client/src/app/favicon.ico b/packages/client/src/app/favicon.ico similarity index 100% rename from packages/agent-client/src/app/favicon.ico rename to packages/client/src/app/favicon.ico diff --git a/packages/agent-client/src/app/fonts/GeistMonoVF.woff b/packages/client/src/app/fonts/GeistMonoVF.woff similarity index 100% rename from packages/agent-client/src/app/fonts/GeistMonoVF.woff rename to packages/client/src/app/fonts/GeistMonoVF.woff diff --git a/packages/agent-client/src/app/fonts/GeistVF.woff b/packages/client/src/app/fonts/GeistVF.woff similarity index 100% rename from packages/agent-client/src/app/fonts/GeistVF.woff rename to packages/client/src/app/fonts/GeistVF.woff diff --git a/packages/agent-client/src/app/globals.css b/packages/client/src/app/globals.css similarity index 100% rename from packages/agent-client/src/app/globals.css rename to packages/client/src/app/globals.css diff --git a/packages/agent-client/src/app/layout.tsx b/packages/client/src/app/layout.tsx similarity index 100% rename from packages/agent-client/src/app/layout.tsx rename to packages/client/src/app/layout.tsx diff --git a/packages/agent-client/src/app/page.module.css b/packages/client/src/app/page.module.css similarity index 100% rename from packages/agent-client/src/app/page.module.css rename to packages/client/src/app/page.module.css diff --git a/packages/agent-client/src/app/page.tsx b/packages/client/src/app/page.tsx similarity index 100% rename from packages/agent-client/src/app/page.tsx rename to packages/client/src/app/page.tsx diff --git a/packages/agent-client/src/app/utils/networks.ts b/packages/client/src/app/utils/networks.ts similarity index 100% rename from packages/agent-client/src/app/utils/networks.ts rename to packages/client/src/app/utils/networks.ts diff --git a/packages/agent-client/src/app/utils/resolver.ts b/packages/client/src/app/utils/resolver.ts similarity index 100% rename from packages/agent-client/src/app/utils/resolver.ts rename to packages/client/src/app/utils/resolver.ts diff --git a/packages/agent-client/src/components/Chat.module.css b/packages/client/src/components/Chat.module.css similarity index 100% rename from packages/agent-client/src/components/Chat.module.css rename to packages/client/src/components/Chat.module.css diff --git a/packages/agent-client/src/components/Chat.tsx b/packages/client/src/components/Chat.tsx similarity index 92% rename from packages/agent-client/src/components/Chat.tsx rename to packages/client/src/components/Chat.tsx index 4606ee439..69ba59961 100644 --- a/packages/agent-client/src/components/Chat.tsx +++ b/packages/client/src/components/Chat.tsx @@ -1,13 +1,12 @@ import React, { useCallback } from "react"; import { useState, useEffect } from "react"; -import { Wallet } from "ethers"; import styles from "./Chat.module.css"; import { UserInfo } from "@/app/utils/resolver"; import { isAddress, parseUnits } from "viem"; import { extractFrameChain } from "@/app/utils/networks"; import sdk from "@farcaster/frame-sdk"; import { UrlPreview } from "./UrlPreview"; -import { XMTP, Message, XMTPClass } from "xmtp-client"; +import { XMTP, Message, XMTPClass } from "xmtp-web"; type UrlType = "receipt" | "payment" | "wallet" | "unknown"; @@ -30,7 +29,6 @@ const isFrame = async () => { function Chat({ user }: { user: UserInfo }) { const [messages, setMessages] = useState([]); const [newMessage, setNewMessage] = useState(""); - const [wallet, setWallet] = useState(undefined); const [xmtp, setXmtp] = useState(undefined); const [isLoading, setIsLoading] = useState(true); const [recipientInfo, setRecipientInfo] = useState( @@ -42,14 +40,15 @@ function Chat({ user }: { user: UserInfo }) { console.log("useEffect triggered with user:", user); const init = async () => { - const newWallet = Wallet.createRandom(); - setWallet(newWallet); - try { setRecipientInfo(user); if (user?.address) { console.log("Initializing XMTP with address:", user.address); - await initXmtp(newWallet); + + const xmtpClient = await XMTP(onMessage); + + setXmtp(xmtpClient); + setIsLoading(false); } else { console.error("Could not resolve recipient address"); setIsLoading(false); @@ -70,20 +69,6 @@ function Chat({ user }: { user: UserInfo }) { } }; - const initXmtp = async (wallet: any) => { - try { - const xmtpClient = await XMTP(onMessage, { - privateKey: wallet.privateKey, - }); - - setXmtp(xmtpClient); - setIsLoading(false); - } catch (error) { - console.error("Error initializing XMTP:", error); - setIsLoading(false); - } - }; - const sendMessage = async (e: React.FormEvent) => { e.preventDefault(); diff --git a/packages/agent-client/src/components/UrlPreview.tsx b/packages/client/src/components/UrlPreview.tsx similarity index 100% rename from packages/agent-client/src/components/UrlPreview.tsx rename to packages/client/src/components/UrlPreview.tsx diff --git a/packages/agent-client/tsconfig.json b/packages/client/tsconfig.json similarity index 100% rename from packages/agent-client/tsconfig.json rename to packages/client/tsconfig.json diff --git a/packages/agent-client/vercel.json b/packages/client/vercel.json similarity index 100% rename from packages/agent-client/vercel.json rename to packages/client/vercel.json diff --git a/packages/docs/pages/changelog.mdx b/packages/docs/pages/changelog.mdx index 25ee379a5..86ab842b2 100644 --- a/packages/docs/pages/changelog.mdx +++ b/packages/docs/pages/changelog.mdx @@ -7,7 +7,7 @@ - Enhanced documentation for the `paymentagent` with multimedia elements and clearer content structure. - Added a new XMTP plugin for secure messaging with installation instructions and usage examples. - Introduced `createAgent` function for streamlined agent creation across multiple templates. - - Added a new `xmtp-client` package for secure messaging with installation instructions and usage examples. + - Added a new `xmtp-web` package for secure messaging with installation instructions and usage examples. - Added a new `xmtp` package for secure messaging with installation instructions and usage examples. - **Bug Fixes** diff --git a/packages/docs/pages/plugins/xmtp.mdx b/packages/docs/pages/plugins/xmtp.mdx index f4d0538df..22660834e 100644 --- a/packages/docs/pages/plugins/xmtp.mdx +++ b/packages/docs/pages/plugins/xmtp.mdx @@ -89,20 +89,20 @@ const onMessage = async (message, user) => { ## Frontend -Same as the backend, you can use the `xmtp-client` package to create a client that decrypts and encrypts messages locally. +Same as the backend, you can use the `xmtp-web` package to create a client that decrypts and encrypts messages locally. ### Installation -Install the `xmtp-client` package compatible with your frontend framework. +Install the `xmtp-web` package compatible with your frontend framework. ```bash [cmd] -bun install xmtp-client +bun install xmtp-web ``` ### Usage ```tsx -import { XMTP, Message } from "xmtp-client"; +import { XMTP, Message } from "xmtp-web"; const xmtp = await XMTP(onMessage, { encryptionKey: process.env.LOCAL_KEY, @@ -121,10 +121,10 @@ const onMessage = async (message, agentAddress) => { ### React example -This is how you can use the `xmtp-client` package to create a client and handle messages. +This is how you can use the `xmtp-web` package to create a client and handle messages. ```tsx -import { createClient, XMTP, Message } from "xmtp-client"; +import { createClient, XMTP, Message } from "xmtp-web"; // ... other imports ... function Chat({ user }: { user: UserInfo }) { diff --git a/packages/docs/pages/ux/frames.mdx b/packages/docs/pages/ux/frames.mdx index 73a5b5b3d..bf32260a3 100644 --- a/packages/docs/pages/ux/frames.mdx +++ b/packages/docs/pages/ux/frames.mdx @@ -12,7 +12,7 @@ Frames are a way to interact with your agent via Farcaster. Framesv2 is a new way to interact with agents via frames. It allows you to have your own landing page for your agent and interact with it via frames in Farcaster. ```bash -Share in Farcaster (Framev2): https://agent-client.message-kit.org/?address=0x... +Share in Farcaster (Framev2): https://client.message-kit.org/?address=0x... ``` **Properties:** diff --git a/packages/docs/vocs.config.tsx.timestamp-1734881463365-9f79bf95ec7b2.mjs b/packages/docs/vocs.config.tsx.timestamp-1734881463365-9f79bf95ec7b2.mjs new file mode 100644 index 000000000..ddb5b0f86 --- /dev/null +++ b/packages/docs/vocs.config.tsx.timestamp-1734881463365-9f79bf95ec7b2.mjs @@ -0,0 +1,182 @@ +// vocs.config.tsx +import { defineConfig } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/vocs/_lib/index.js"; +import { Fragment, jsx, jsxs } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/react/jsx-runtime.js"; +var vocs_config_default = defineConfig({ + head: () => { + return /* @__PURE__ */ jsxs(Fragment, { children: [ + /* @__PURE__ */ jsx("meta", { charSet: "utf-8" }), + /* @__PURE__ */ jsx("meta", { name: "viewport", content: "width=device-width" }), + /* @__PURE__ */ jsx("meta", { property: "og:title", content: "MessageKit" }), + /* @__PURE__ */ jsx("meta", { property: "og:image", content: "https://message-kit.org/hero.jpg" }), + /* @__PURE__ */ jsx("meta", { property: "fc:frame", content: "vNext" }), + /* @__PURE__ */ jsx("meta", { property: "of:version", content: "vNext" }), + /* @__PURE__ */ jsx("meta", { property: "of:accepts:xmtp", content: "vNext" }), + /* @__PURE__ */ jsx("meta", { property: "of:image", content: "https://message-kit.org/hero.jpg" }), + /* @__PURE__ */ jsx( + "meta", + { + property: "fc:frame:image", + content: "https://message-kit.org/hero.jpg" + } + ), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1", content: "Docs" }), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1:action", content: "link" }), + /* @__PURE__ */ jsx( + "meta", + { + property: "fc:frame:button:1:target", + content: "https://message-kit.org/" + } + ), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2", content: "Drop a \u2B50\uFE0F" }), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2:action", content: "link" }), + /* @__PURE__ */ jsx( + "meta", + { + property: "fc:frame:button:2:target", + content: "https://github.com/ephemeraHQ/message-kit" + } + ), + /* @__PURE__ */ jsx("meta", { property: "og:site_name", content: "MessageKit" }), + /* @__PURE__ */ jsx("meta", { name: "twitter:card", content: "summary_large_image" }), + /* @__PURE__ */ jsx("meta", { name: "twitter:site", content: "@MessageKit" }), + /* @__PURE__ */ jsx("meta", { name: "twitter:title", content: "MessageKit" }), + /* @__PURE__ */ jsx( + "meta", + { + name: "twitter:description", + content: "MessageKit is a powerful tool for managing your messages." + } + ), + /* @__PURE__ */ jsx("meta", { name: "twitter:image", content: "https://message-kit.org/hero.jpg" }), + /* @__PURE__ */ jsx( + "script", + { + src: "https://plausible.io/js/script.outbound-links.js", + "data-domain": "message-kit.org", + defer: true + } + ) + ] }); + }, + ogImageUrl: { + "/": "/hero.jpg", + "/docs": "/hero.jpg" + }, + title: "MessageKit", + rootDir: ".", + iconUrl: { + light: "/messagekit-logo.png", + dark: "/messagekit-logo.png" + }, + theme: { + accentColor: { + light: "#FA6977", + dark: "#FA6977" + } + }, + socials: [ + { + icon: "github", + link: "https://github.com/ephemeraHQ/message-kit" + } + ], + topNav: [{ text: "Changelog", link: "/changelog" }], + editLink: { + pattern: "https://github.com/ephemeraHQ/message-kit/blob/main/packages/docs/pages/:path", + text: "Suggest changes to this page" + }, + sidebar: [ + { + text: "Quickstart", + link: "/quickstart" + }, + { + text: "UX", + items: [ + { + text: "Concierge", + link: "/skills/concierge" + }, + { + text: "Frames", + link: "/ux/frames" + }, + { + text: "Wallet service", + link: "/ux/wallet-service" + }, + { + text: "Groups", + link: "/ux/groups" + } + ] + }, + { + text: "Community", + items: [ + { + text: "Skills", + link: "/community/skills" + }, + { + text: "Plugins", + link: "/community/plugins" + }, + { + text: "Templates", + link: "/community/templates" + }, + { + text: "Vibes", + link: "/community/vibes" + }, + { + text: "Projects", + link: "/community/projects" + } + ] + }, + { + text: "Fundations", + items: [ + { + text: "Agents", + link: "/concepts/agents" + }, + { + text: "Skills", + link: "/concepts/skills" + }, + { + text: "XMTP", + link: "/concepts/xmtp" + }, + { + text: "Usernames", + link: "/plugins/resolver" + } + ] + }, + { + text: "Contribute", + link: "/contribute" + }, + { + text: "Deployment", + link: "/deployment" + }, + { + text: "Guidelines", + link: "/guidelines" + }, + { + text: "Changelog", + link: "/changelog" + } + ] +}); +export { + vocs_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidm9jcy5jb25maWcudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwidm9jc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBoZWFkOiAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxtZXRhIGNoYXJTZXQ9XCJ1dGYtOFwiIC8+XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGhcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOnRpdGxlXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOmltYWdlXCIgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZVwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6dmVyc2lvblwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6YWNjZXB0czp4bXRwXCIgY29udGVudD1cInZOZXh0XCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJvZjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTppbWFnZVwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCJcbiAgICAgICAgLz5cblxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxXCIgY29udGVudD1cIkRvY3NcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOmFjdGlvblwiIGNvbnRlbnQ9XCJsaW5rXCIgLz5cbiAgICAgICAgPG1ldGFcbiAgICAgICAgICBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOnRhcmdldFwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL1wiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MlwiIGNvbnRlbnQ9XCJEcm9wIGEgXHUyQjUwXHVGRTBGXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MjphY3Rpb25cIiBjb250ZW50PVwibGlua1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246Mjp0YXJnZXRcIlxuICAgICAgICAgIGNvbnRlbnQ9XCJodHRwczovL2dpdGh1Yi5jb20vZXBoZW1lcmFIUS9tZXNzYWdlLWtpdFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2c6c2l0ZV9uYW1lXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpjYXJkXCIgY29udGVudD1cInN1bW1hcnlfbGFyZ2VfaW1hZ2VcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpzaXRlXCIgY29udGVudD1cIkBNZXNzYWdlS2l0XCIgLz5cbiAgICAgICAgPG1ldGEgbmFtZT1cInR3aXR0ZXI6dGl0bGVcIiBjb250ZW50PVwiTWVzc2FnZUtpdFwiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgbmFtZT1cInR3aXR0ZXI6ZGVzY3JpcHRpb25cIlxuICAgICAgICAgIGNvbnRlbnQ9XCJNZXNzYWdlS2l0IGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgbWFuYWdpbmcgeW91ciBtZXNzYWdlcy5cIlxuICAgICAgICAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxzY3JpcHRcbiAgICAgICAgICBzcmM9XCJodHRwczovL3BsYXVzaWJsZS5pby9qcy9zY3JpcHQub3V0Ym91bmQtbGlua3MuanNcIlxuICAgICAgICAgIGRhdGEtZG9tYWluPVwibWVzc2FnZS1raXQub3JnXCJcbiAgICAgICAgICBkZWZlclxuICAgICAgICAvPlxuICAgICAgPC8+XG4gICAgKTtcbiAgfSxcbiAgb2dJbWFnZVVybDoge1xuICAgIFwiL1wiOiBcIi9oZXJvLmpwZ1wiLFxuICAgIFwiL2RvY3NcIjogXCIvaGVyby5qcGdcIixcbiAgfSxcbiAgdGl0bGU6IFwiTWVzc2FnZUtpdFwiLFxuICByb290RGlyOiBcIi5cIixcbiAgaWNvblVybDoge1xuICAgIGxpZ2h0OiBcIi9tZXNzYWdla2l0LWxvZ28ucG5nXCIsXG4gICAgZGFyazogXCIvbWVzc2FnZWtpdC1sb2dvLnBuZ1wiLFxuICB9LFxuICB0aGVtZToge1xuICAgIGFjY2VudENvbG9yOiB7XG4gICAgICBsaWdodDogXCIjRkE2OTc3XCIsXG4gICAgICBkYXJrOiBcIiNGQTY5NzdcIixcbiAgICB9LFxuICB9LFxuICBzb2NpYWxzOiBbXG4gICAge1xuICAgICAgaWNvbjogXCJnaXRodWJcIixcbiAgICAgIGxpbms6IFwiaHR0cHM6Ly9naXRodWIuY29tL2VwaGVtZXJhSFEvbWVzc2FnZS1raXRcIixcbiAgICB9LFxuICBdLFxuICB0b3BOYXY6IFt7IHRleHQ6IFwiQ2hhbmdlbG9nXCIsIGxpbms6IFwiL2NoYW5nZWxvZ1wiIH1dLFxuICBlZGl0TGluazoge1xuICAgIHBhdHRlcm46XG4gICAgICBcImh0dHBzOi8vZ2l0aHViLmNvbS9lcGhlbWVyYUhRL21lc3NhZ2Uta2l0L2Jsb2IvbWFpbi9wYWNrYWdlcy9kb2NzL3BhZ2VzLzpwYXRoXCIsXG4gICAgdGV4dDogXCJTdWdnZXN0IGNoYW5nZXMgdG8gdGhpcyBwYWdlXCIsXG4gIH0sXG4gIHNpZGViYXI6IFtcbiAgICB7XG4gICAgICB0ZXh0OiBcIlF1aWNrc3RhcnRcIixcbiAgICAgIGxpbms6IFwiL3F1aWNrc3RhcnRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiVVhcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkNvbmNpZXJnZVwiLFxuICAgICAgICAgIGxpbms6IFwiL3NraWxscy9jb25jaWVyZ2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiRnJhbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZnJhbWVzXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIldhbGxldCBzZXJ2aWNlXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvd2FsbGV0LXNlcnZpY2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiR3JvdXBzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZ3JvdXBzXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJDb21tdW5pdHlcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlNraWxsc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUGx1Z2luc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9wbHVnaW5zXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlRlbXBsYXRlc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS90ZW1wbGF0ZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVmliZXNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvdmliZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUHJvamVjdHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvcHJvamVjdHNcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkZ1bmRhdGlvbnNcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkFnZW50c1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL2FnZW50c1wiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJTa2lsbHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb25jZXB0cy9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiWE1UUFwiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL3htdHBcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVXNlcm5hbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvcGx1Z2lucy9yZXNvbHZlclwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ29udHJpYnV0ZVwiLFxuICAgICAgbGluazogXCIvY29udHJpYnV0ZVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJEZXBsb3ltZW50XCIsXG4gICAgICBsaW5rOiBcIi9kZXBsb3ltZW50XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkd1aWRlbGluZXNcIixcbiAgICAgIGxpbms6IFwiL2d1aWRlbGluZXNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ2hhbmdlbG9nXCIsXG4gICAgICBsaW5r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 diff --git a/packages/docs/vocs.config.tsx.timestamp-1734881463377-71370c3873b4a.mjs b/packages/docs/vocs.config.tsx.timestamp-1734881463377-71370c3873b4a.mjs new file mode 100644 index 000000000..ddb5b0f86 --- /dev/null +++ b/packages/docs/vocs.config.tsx.timestamp-1734881463377-71370c3873b4a.mjs @@ -0,0 +1,182 @@ +// vocs.config.tsx +import { defineConfig } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/vocs/_lib/index.js"; +import { Fragment, jsx, jsxs } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/react/jsx-runtime.js"; +var vocs_config_default = defineConfig({ + head: () => { + return /* @__PURE__ */ jsxs(Fragment, { children: [ + /* @__PURE__ */ jsx("meta", { charSet: "utf-8" }), + /* @__PURE__ */ jsx("meta", { name: "viewport", content: "width=device-width" }), + /* @__PURE__ */ jsx("meta", { property: "og:title", content: "MessageKit" }), + /* @__PURE__ */ jsx("meta", { property: "og:image", content: "https://message-kit.org/hero.jpg" }), + /* @__PURE__ */ jsx("meta", { property: "fc:frame", content: "vNext" }), + /* @__PURE__ */ jsx("meta", { property: "of:version", content: "vNext" }), + /* @__PURE__ */ jsx("meta", { property: "of:accepts:xmtp", content: "vNext" }), + /* @__PURE__ */ jsx("meta", { property: "of:image", content: "https://message-kit.org/hero.jpg" }), + /* @__PURE__ */ jsx( + "meta", + { + property: "fc:frame:image", + content: "https://message-kit.org/hero.jpg" + } + ), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1", content: "Docs" }), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1:action", content: "link" }), + /* @__PURE__ */ jsx( + "meta", + { + property: "fc:frame:button:1:target", + content: "https://message-kit.org/" + } + ), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2", content: "Drop a \u2B50\uFE0F" }), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2:action", content: "link" }), + /* @__PURE__ */ jsx( + "meta", + { + property: "fc:frame:button:2:target", + content: "https://github.com/ephemeraHQ/message-kit" + } + ), + /* @__PURE__ */ jsx("meta", { property: "og:site_name", content: "MessageKit" }), + /* @__PURE__ */ jsx("meta", { name: "twitter:card", content: "summary_large_image" }), + /* @__PURE__ */ jsx("meta", { name: "twitter:site", content: "@MessageKit" }), + /* @__PURE__ */ jsx("meta", { name: "twitter:title", content: "MessageKit" }), + /* @__PURE__ */ jsx( + "meta", + { + name: "twitter:description", + content: "MessageKit is a powerful tool for managing your messages." + } + ), + /* @__PURE__ */ jsx("meta", { name: "twitter:image", content: "https://message-kit.org/hero.jpg" }), + /* @__PURE__ */ jsx( + "script", + { + src: "https://plausible.io/js/script.outbound-links.js", + "data-domain": "message-kit.org", + defer: true + } + ) + ] }); + }, + ogImageUrl: { + "/": "/hero.jpg", + "/docs": "/hero.jpg" + }, + title: "MessageKit", + rootDir: ".", + iconUrl: { + light: "/messagekit-logo.png", + dark: "/messagekit-logo.png" + }, + theme: { + accentColor: { + light: "#FA6977", + dark: "#FA6977" + } + }, + socials: [ + { + icon: "github", + link: "https://github.com/ephemeraHQ/message-kit" + } + ], + topNav: [{ text: "Changelog", link: "/changelog" }], + editLink: { + pattern: "https://github.com/ephemeraHQ/message-kit/blob/main/packages/docs/pages/:path", + text: "Suggest changes to this page" + }, + sidebar: [ + { + text: "Quickstart", + link: "/quickstart" + }, + { + text: "UX", + items: [ + { + text: "Concierge", + link: "/skills/concierge" + }, + { + text: "Frames", + link: "/ux/frames" + }, + { + text: "Wallet service", + link: "/ux/wallet-service" + }, + { + text: "Groups", + link: "/ux/groups" + } + ] + }, + { + text: "Community", + items: [ + { + text: "Skills", + link: "/community/skills" + }, + { + text: "Plugins", + link: "/community/plugins" + }, + { + text: "Templates", + link: "/community/templates" + }, + { + text: "Vibes", + link: "/community/vibes" + }, + { + text: "Projects", + link: "/community/projects" + } + ] + }, + { + text: "Fundations", + items: [ + { + text: "Agents", + link: "/concepts/agents" + }, + { + text: "Skills", + link: "/concepts/skills" + }, + { + text: "XMTP", + link: "/concepts/xmtp" + }, + { + text: "Usernames", + link: "/plugins/resolver" + } + ] + }, + { + text: "Contribute", + link: "/contribute" + }, + { + text: "Deployment", + link: "/deployment" + }, + { + text: "Guidelines", + link: "/guidelines" + }, + { + text: "Changelog", + link: "/changelog" + } + ] +}); +export { + vocs_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidm9jcy5jb25maWcudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwidm9jc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBoZWFkOiAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxtZXRhIGNoYXJTZXQ9XCJ1dGYtOFwiIC8+XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGhcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOnRpdGxlXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOmltYWdlXCIgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZVwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6dmVyc2lvblwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6YWNjZXB0czp4bXRwXCIgY29udGVudD1cInZOZXh0XCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJvZjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTppbWFnZVwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCJcbiAgICAgICAgLz5cblxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxXCIgY29udGVudD1cIkRvY3NcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOmFjdGlvblwiIGNvbnRlbnQ9XCJsaW5rXCIgLz5cbiAgICAgICAgPG1ldGFcbiAgICAgICAgICBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOnRhcmdldFwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL1wiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MlwiIGNvbnRlbnQ9XCJEcm9wIGEgXHUyQjUwXHVGRTBGXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MjphY3Rpb25cIiBjb250ZW50PVwibGlua1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246Mjp0YXJnZXRcIlxuICAgICAgICAgIGNvbnRlbnQ9XCJodHRwczovL2dpdGh1Yi5jb20vZXBoZW1lcmFIUS9tZXNzYWdlLWtpdFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2c6c2l0ZV9uYW1lXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpjYXJkXCIgY29udGVudD1cInN1bW1hcnlfbGFyZ2VfaW1hZ2VcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpzaXRlXCIgY29udGVudD1cIkBNZXNzYWdlS2l0XCIgLz5cbiAgICAgICAgPG1ldGEgbmFtZT1cInR3aXR0ZXI6dGl0bGVcIiBjb250ZW50PVwiTWVzc2FnZUtpdFwiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgbmFtZT1cInR3aXR0ZXI6ZGVzY3JpcHRpb25cIlxuICAgICAgICAgIGNvbnRlbnQ9XCJNZXNzYWdlS2l0IGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgbWFuYWdpbmcgeW91ciBtZXNzYWdlcy5cIlxuICAgICAgICAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxzY3JpcHRcbiAgICAgICAgICBzcmM9XCJodHRwczovL3BsYXVzaWJsZS5pby9qcy9zY3JpcHQub3V0Ym91bmQtbGlua3MuanNcIlxuICAgICAgICAgIGRhdGEtZG9tYWluPVwibWVzc2FnZS1raXQub3JnXCJcbiAgICAgICAgICBkZWZlclxuICAgICAgICAvPlxuICAgICAgPC8+XG4gICAgKTtcbiAgfSxcbiAgb2dJbWFnZVVybDoge1xuICAgIFwiL1wiOiBcIi9oZXJvLmpwZ1wiLFxuICAgIFwiL2RvY3NcIjogXCIvaGVyby5qcGdcIixcbiAgfSxcbiAgdGl0bGU6IFwiTWVzc2FnZUtpdFwiLFxuICByb290RGlyOiBcIi5cIixcbiAgaWNvblVybDoge1xuICAgIGxpZ2h0OiBcIi9tZXNzYWdla2l0LWxvZ28ucG5nXCIsXG4gICAgZGFyazogXCIvbWVzc2FnZWtpdC1sb2dvLnBuZ1wiLFxuICB9LFxuICB0aGVtZToge1xuICAgIGFjY2VudENvbG9yOiB7XG4gICAgICBsaWdodDogXCIjRkE2OTc3XCIsXG4gICAgICBkYXJrOiBcIiNGQTY5NzdcIixcbiAgICB9LFxuICB9LFxuICBzb2NpYWxzOiBbXG4gICAge1xuICAgICAgaWNvbjogXCJnaXRodWJcIixcbiAgICAgIGxpbms6IFwiaHR0cHM6Ly9naXRodWIuY29tL2VwaGVtZXJhSFEvbWVzc2FnZS1raXRcIixcbiAgICB9LFxuICBdLFxuICB0b3BOYXY6IFt7IHRleHQ6IFwiQ2hhbmdlbG9nXCIsIGxpbms6IFwiL2NoYW5nZWxvZ1wiIH1dLFxuICBlZGl0TGluazoge1xuICAgIHBhdHRlcm46XG4gICAgICBcImh0dHBzOi8vZ2l0aHViLmNvbS9lcGhlbWVyYUhRL21lc3NhZ2Uta2l0L2Jsb2IvbWFpbi9wYWNrYWdlcy9kb2NzL3BhZ2VzLzpwYXRoXCIsXG4gICAgdGV4dDogXCJTdWdnZXN0IGNoYW5nZXMgdG8gdGhpcyBwYWdlXCIsXG4gIH0sXG4gIHNpZGViYXI6IFtcbiAgICB7XG4gICAgICB0ZXh0OiBcIlF1aWNrc3RhcnRcIixcbiAgICAgIGxpbms6IFwiL3F1aWNrc3RhcnRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiVVhcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkNvbmNpZXJnZVwiLFxuICAgICAgICAgIGxpbms6IFwiL3NraWxscy9jb25jaWVyZ2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiRnJhbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZnJhbWVzXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIldhbGxldCBzZXJ2aWNlXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvd2FsbGV0LXNlcnZpY2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiR3JvdXBzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZ3JvdXBzXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJDb21tdW5pdHlcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlNraWxsc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUGx1Z2luc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9wbHVnaW5zXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlRlbXBsYXRlc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS90ZW1wbGF0ZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVmliZXNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvdmliZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUHJvamVjdHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvcHJvamVjdHNcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkZ1bmRhdGlvbnNcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkFnZW50c1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL2FnZW50c1wiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJTa2lsbHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb25jZXB0cy9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiWE1UUFwiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL3htdHBcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVXNlcm5hbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvcGx1Z2lucy9yZXNvbHZlclwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ29udHJpYnV0ZVwiLFxuICAgICAgbGluazogXCIvY29udHJpYnV0ZVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJEZXBsb3ltZW50XCIsXG4gICAgICBsaW5rOiBcIi9kZXBsb3ltZW50XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkd1aWRlbGluZXNcIixcbiAgICAgIGxpbms6IFwiL2d1aWRlbGluZXNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ2hhbmdlbG9nXCIsXG4gICAgICBsaW5r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 diff --git a/packages/docs/vocs.config.tsx.timestamp-1734881463417-5232a778f8c7d.mjs b/packages/docs/vocs.config.tsx.timestamp-1734881463417-5232a778f8c7d.mjs new file mode 100644 index 000000000..ddb5b0f86 --- /dev/null +++ b/packages/docs/vocs.config.tsx.timestamp-1734881463417-5232a778f8c7d.mjs @@ -0,0 +1,182 @@ +// vocs.config.tsx +import { defineConfig } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/vocs/_lib/index.js"; +import { Fragment, jsx, jsxs } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/react/jsx-runtime.js"; +var vocs_config_default = defineConfig({ + head: () => { + return /* @__PURE__ */ jsxs(Fragment, { children: [ + /* @__PURE__ */ jsx("meta", { charSet: "utf-8" }), + /* @__PURE__ */ jsx("meta", { name: "viewport", content: "width=device-width" }), + /* @__PURE__ */ jsx("meta", { property: "og:title", content: "MessageKit" }), + /* @__PURE__ */ jsx("meta", { property: "og:image", content: "https://message-kit.org/hero.jpg" }), + /* @__PURE__ */ jsx("meta", { property: "fc:frame", content: "vNext" }), + /* @__PURE__ */ jsx("meta", { property: "of:version", content: "vNext" }), + /* @__PURE__ */ jsx("meta", { property: "of:accepts:xmtp", content: "vNext" }), + /* @__PURE__ */ jsx("meta", { property: "of:image", content: "https://message-kit.org/hero.jpg" }), + /* @__PURE__ */ jsx( + "meta", + { + property: "fc:frame:image", + content: "https://message-kit.org/hero.jpg" + } + ), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1", content: "Docs" }), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1:action", content: "link" }), + /* @__PURE__ */ jsx( + "meta", + { + property: "fc:frame:button:1:target", + content: "https://message-kit.org/" + } + ), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2", content: "Drop a \u2B50\uFE0F" }), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2:action", content: "link" }), + /* @__PURE__ */ jsx( + "meta", + { + property: "fc:frame:button:2:target", + content: "https://github.com/ephemeraHQ/message-kit" + } + ), + /* @__PURE__ */ jsx("meta", { property: "og:site_name", content: "MessageKit" }), + /* @__PURE__ */ jsx("meta", { name: "twitter:card", content: "summary_large_image" }), + /* @__PURE__ */ jsx("meta", { name: "twitter:site", content: "@MessageKit" }), + /* @__PURE__ */ jsx("meta", { name: "twitter:title", content: "MessageKit" }), + /* @__PURE__ */ jsx( + "meta", + { + name: "twitter:description", + content: "MessageKit is a powerful tool for managing your messages." + } + ), + /* @__PURE__ */ jsx("meta", { name: "twitter:image", content: "https://message-kit.org/hero.jpg" }), + /* @__PURE__ */ jsx( + "script", + { + src: "https://plausible.io/js/script.outbound-links.js", + "data-domain": "message-kit.org", + defer: true + } + ) + ] }); + }, + ogImageUrl: { + "/": "/hero.jpg", + "/docs": "/hero.jpg" + }, + title: "MessageKit", + rootDir: ".", + iconUrl: { + light: "/messagekit-logo.png", + dark: "/messagekit-logo.png" + }, + theme: { + accentColor: { + light: "#FA6977", + dark: "#FA6977" + } + }, + socials: [ + { + icon: "github", + link: "https://github.com/ephemeraHQ/message-kit" + } + ], + topNav: [{ text: "Changelog", link: "/changelog" }], + editLink: { + pattern: "https://github.com/ephemeraHQ/message-kit/blob/main/packages/docs/pages/:path", + text: "Suggest changes to this page" + }, + sidebar: [ + { + text: "Quickstart", + link: "/quickstart" + }, + { + text: "UX", + items: [ + { + text: "Concierge", + link: "/skills/concierge" + }, + { + text: "Frames", + link: "/ux/frames" + }, + { + text: "Wallet service", + link: "/ux/wallet-service" + }, + { + text: "Groups", + link: "/ux/groups" + } + ] + }, + { + text: "Community", + items: [ + { + text: "Skills", + link: "/community/skills" + }, + { + text: "Plugins", + link: "/community/plugins" + }, + { + text: "Templates", + link: "/community/templates" + }, + { + text: "Vibes", + link: "/community/vibes" + }, + { + text: "Projects", + link: "/community/projects" + } + ] + }, + { + text: "Fundations", + items: [ + { + text: "Agents", + link: "/concepts/agents" + }, + { + text: "Skills", + link: "/concepts/skills" + }, + { + text: "XMTP", + link: "/concepts/xmtp" + }, + { + text: "Usernames", + link: "/plugins/resolver" + } + ] + }, + { + text: "Contribute", + link: "/contribute" + }, + { + text: "Deployment", + link: "/deployment" + }, + { + text: "Guidelines", + link: "/guidelines" + }, + { + text: "Changelog", + link: "/changelog" + } + ] +}); +export { + vocs_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidm9jcy5jb25maWcudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwidm9jc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBoZWFkOiAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxtZXRhIGNoYXJTZXQ9XCJ1dGYtOFwiIC8+XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGhcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOnRpdGxlXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOmltYWdlXCIgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZVwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6dmVyc2lvblwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6YWNjZXB0czp4bXRwXCIgY29udGVudD1cInZOZXh0XCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJvZjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTppbWFnZVwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCJcbiAgICAgICAgLz5cblxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxXCIgY29udGVudD1cIkRvY3NcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOmFjdGlvblwiIGNvbnRlbnQ9XCJsaW5rXCIgLz5cbiAgICAgICAgPG1ldGFcbiAgICAgICAgICBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOnRhcmdldFwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL1wiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MlwiIGNvbnRlbnQ9XCJEcm9wIGEgXHUyQjUwXHVGRTBGXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MjphY3Rpb25cIiBjb250ZW50PVwibGlua1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246Mjp0YXJnZXRcIlxuICAgICAgICAgIGNvbnRlbnQ9XCJodHRwczovL2dpdGh1Yi5jb20vZXBoZW1lcmFIUS9tZXNzYWdlLWtpdFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2c6c2l0ZV9uYW1lXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpjYXJkXCIgY29udGVudD1cInN1bW1hcnlfbGFyZ2VfaW1hZ2VcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpzaXRlXCIgY29udGVudD1cIkBNZXNzYWdlS2l0XCIgLz5cbiAgICAgICAgPG1ldGEgbmFtZT1cInR3aXR0ZXI6dGl0bGVcIiBjb250ZW50PVwiTWVzc2FnZUtpdFwiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgbmFtZT1cInR3aXR0ZXI6ZGVzY3JpcHRpb25cIlxuICAgICAgICAgIGNvbnRlbnQ9XCJNZXNzYWdlS2l0IGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgbWFuYWdpbmcgeW91ciBtZXNzYWdlcy5cIlxuICAgICAgICAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxzY3JpcHRcbiAgICAgICAgICBzcmM9XCJodHRwczovL3BsYXVzaWJsZS5pby9qcy9zY3JpcHQub3V0Ym91bmQtbGlua3MuanNcIlxuICAgICAgICAgIGRhdGEtZG9tYWluPVwibWVzc2FnZS1raXQub3JnXCJcbiAgICAgICAgICBkZWZlclxuICAgICAgICAvPlxuICAgICAgPC8+XG4gICAgKTtcbiAgfSxcbiAgb2dJbWFnZVVybDoge1xuICAgIFwiL1wiOiBcIi9oZXJvLmpwZ1wiLFxuICAgIFwiL2RvY3NcIjogXCIvaGVyby5qcGdcIixcbiAgfSxcbiAgdGl0bGU6IFwiTWVzc2FnZUtpdFwiLFxuICByb290RGlyOiBcIi5cIixcbiAgaWNvblVybDoge1xuICAgIGxpZ2h0OiBcIi9tZXNzYWdla2l0LWxvZ28ucG5nXCIsXG4gICAgZGFyazogXCIvbWVzc2FnZWtpdC1sb2dvLnBuZ1wiLFxuICB9LFxuICB0aGVtZToge1xuICAgIGFjY2VudENvbG9yOiB7XG4gICAgICBsaWdodDogXCIjRkE2OTc3XCIsXG4gICAgICBkYXJrOiBcIiNGQTY5NzdcIixcbiAgICB9LFxuICB9LFxuICBzb2NpYWxzOiBbXG4gICAge1xuICAgICAgaWNvbjogXCJnaXRodWJcIixcbiAgICAgIGxpbms6IFwiaHR0cHM6Ly9naXRodWIuY29tL2VwaGVtZXJhSFEvbWVzc2FnZS1raXRcIixcbiAgICB9LFxuICBdLFxuICB0b3BOYXY6IFt7IHRleHQ6IFwiQ2hhbmdlbG9nXCIsIGxpbms6IFwiL2NoYW5nZWxvZ1wiIH1dLFxuICBlZGl0TGluazoge1xuICAgIHBhdHRlcm46XG4gICAgICBcImh0dHBzOi8vZ2l0aHViLmNvbS9lcGhlbWVyYUhRL21lc3NhZ2Uta2l0L2Jsb2IvbWFpbi9wYWNrYWdlcy9kb2NzL3BhZ2VzLzpwYXRoXCIsXG4gICAgdGV4dDogXCJTdWdnZXN0IGNoYW5nZXMgdG8gdGhpcyBwYWdlXCIsXG4gIH0sXG4gIHNpZGViYXI6IFtcbiAgICB7XG4gICAgICB0ZXh0OiBcIlF1aWNrc3RhcnRcIixcbiAgICAgIGxpbms6IFwiL3F1aWNrc3RhcnRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiVVhcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkNvbmNpZXJnZVwiLFxuICAgICAgICAgIGxpbms6IFwiL3NraWxscy9jb25jaWVyZ2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiRnJhbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZnJhbWVzXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIldhbGxldCBzZXJ2aWNlXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvd2FsbGV0LXNlcnZpY2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiR3JvdXBzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZ3JvdXBzXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJDb21tdW5pdHlcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlNraWxsc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUGx1Z2luc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9wbHVnaW5zXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlRlbXBsYXRlc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS90ZW1wbGF0ZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVmliZXNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvdmliZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUHJvamVjdHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvcHJvamVjdHNcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkZ1bmRhdGlvbnNcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkFnZW50c1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL2FnZW50c1wiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJTa2lsbHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb25jZXB0cy9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiWE1UUFwiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL3htdHBcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVXNlcm5hbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvcGx1Z2lucy9yZXNvbHZlclwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ29udHJpYnV0ZVwiLFxuICAgICAgbGluazogXCIvY29udHJpYnV0ZVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJEZXBsb3ltZW50XCIsXG4gICAgICBsaW5rOiBcIi9kZXBsb3ltZW50XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkd1aWRlbGluZXNcIixcbiAgICAgIGxpbms6IFwiL2d1aWRlbGluZXNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ2hhbmdlbG9nXCIsXG4gICAgICBsaW5rOiBcIi9jaGFuZ2Vsb2dcIixcbiAgICB9LFxuICBdLFxufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUyxvQkFBb0I7QUFLdkIsbUJBQ0UsS0FERjtBQUhOLElBQU8sc0JBQVEsYUFBYTtBQUFBLEVBQzFCLE1BQU0sTUFBTTtBQUNWLFdBQ0UsaUNBQ0U7QUFBQSwwQkFBQyxVQUFLLFNBQVEsU0FBUTtBQUFBLE1BQ3RCLG9CQUFDLFVBQUssTUFBSyxZQUFXLFNBQVEsc0JBQXFCO0FBQUEsTUFDbkQsb0JBQUMsVUFBSyxVQUFTLFlBQVcsU0FBUSxjQUFhO0FBQUEsTUFDL0Msb0JBQUMsVUFBSyxVQUFTLFlBQVcsU0FBUSxvQ0FBbUM7QUFBQSxNQUNyRSxvQkFBQyxVQUFLLFVBQVMsWUFBVyxTQUFRLFNBQVE7QUFBQSxNQUMxQyxvQkFBQyxVQUFLLFVBQVMsY0FBYSxTQUFRLFNBQVE7QUFBQSxNQUM1QyxvQkFBQyxVQUFLLFVBQVMsbUJBQWtCLFNBQVEsU0FBUTtBQUFBLE1BQ2pELG9CQUFDLFVBQUssVUFBUyxZQUFXLFNBQVEsb0NBQW1DO0FBQUEsTUFDckU7QUFBQSxRQUFDO0FBQUE7QUFBQSxVQUNDLFVBQVM7QUFBQSxVQUNULFNBQVE7QUFBQTtBQUFBLE1BQ1Y7QUFBQSxNQUVBLG9CQUFDLFVBQUssVUFBUyxxQkFBb0IsU0FBUSxRQUFPO0FBQUEsTUFDbEQsb0JBQUMsVUFBSyxVQUFTLDRCQUEyQixTQUFRLFFBQU87QUFBQSxNQUN6RDtBQUFBLFFBQUM7QUFBQTtBQUFBLFVBQ0MsVUFBUztBQUFBLFVBQ1QsU0FBUTtBQUFBO0FBQUEsTUFDVjtBQUFBLE1BRUEsb0JBQUMsVUFBSyxVQUFTLHFCQUFvQixTQUFRLHVCQUFZO0FBQUEsTUFDdkQsb0JBQUMsVUFBSyxVQUFTLDRCQUEyQixTQUFRLFFBQU87QUFBQSxNQUN6RDtBQUFBLFFBQUM7QUFBQTtBQUFBLFVBQ0MsVUFBUztBQUFBLFVBQ1QsU0FBUTtBQUFBO0FBQUEsTUFDVjtBQUFBLE1BQ0Esb0JBQUMsVUFBSyxVQUFTLGdCQUFlLFNBQVEsY0FBYTtBQUFBLE1BQ25ELG9CQUFDLFVBQUssTUFBSyxnQkFBZSxTQUFRLHVCQUFzQjtBQUFBLE1BQ3hELG9CQUFDLFVBQUssTUFBSyxnQkFBZSxTQUFRLGVBQWM7QUFBQSxNQUNoRCxvQkFBQyxVQUFLLE1BQUssaUJBQWdCLFNBQVEsY0FBYTtBQUFBLE1BQ2hEO0FBQUEsUUFBQztBQUFBO0FBQUEsVUFDQyxNQUFLO0FBQUEsVUFDTCxTQUFRO0FBQUE7QUFBQSxNQUNWO0FBQUEsTUFDQSxvQkFBQyxVQUFLLE1BQUssaUJBQWdCLFNBQVEsb0NBQW1DO0FBQUEsTUFDdEU7QUFBQSxRQUFDO0FBQUE7QUFBQSxVQUNDLEtBQUk7QUFBQSxVQUNKLGVBQVk7QUFBQSxVQUNaLE9BQUs7QUFBQTtBQUFBLE1BQ1A7QUFBQSxPQUNGO0FBQUEsRUFFSjtBQUFBLEVBQ0EsWUFBWTtBQUFBLElBQ1YsS0FBSztBQUFBLElBQ0wsU0FBUztBQUFBLEVBQ1g7QUFBQSxFQUNBLE9BQU87QUFBQSxFQUNQLFNBQVM7QUFBQSxFQUNULFNBQVM7QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLE1BQU07QUFBQSxFQUNSO0FBQUEsRUFDQSxPQUFPO0FBQUEsSUFDTCxhQUFhO0FBQUEsTUFDWCxPQUFPO0FBQUEsTUFDUCxNQUFNO0FBQUEsSUFDUjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLFNBQVM7QUFBQSxJQUNQO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixNQUFNO0FBQUEsSUFDUjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLFFBQVEsQ0FBQyxFQUFFLE1BQU0sYUFBYSxNQUFNLGFBQWEsQ0FBQztBQUFBLEVBQ2xELFVBQVU7QUFBQSxJQUNSLFNBQ0U7QUFBQSxJQUNGLE1BQU07QUFBQSxFQUNSO0FBQUEsRUFDQSxTQUFTO0FBQUEsSUFDUDtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLElBQ1I7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixPQUFPO0FBQUEsUUFDTDtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFFBQ1I7QUFBQSxRQUNBO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixNQUFNO0FBQUEsUUFDUjtBQUFBLFFBQ0E7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxRQUNSO0FBQUEsUUFDQTtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFFBQ1I7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxRQUNMO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixNQUFNO0FBQUEsUUFDUjtBQUFBLFFBQ0E7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxRQUNSO0FBQUEsUUFDQTtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFFBQ1I7QUFBQSxRQUNBO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixNQUFNO0FBQUEsUUFDUjtBQUFBLFFBQ0E7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxRQUNSO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixPQUFPO0FBQUEsUUFDTDtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFFBQ1I7QUFBQSxRQUNBO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixNQUFNO0FBQUEsUUFDUjtBQUFBLFFBQ0E7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxRQUNSO0FBQUEsUUFDQTtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFFBQ1I7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLE1BQU07QUFBQSxJQUNSO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLElBQ1I7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixNQUFNO0FBQUEsSUFDUjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLE1BQU07QUFBQSxJQUNSO0FBQUEsRUFDRjtBQUNGLENBQUM7IiwKICAibmFtZXMiOiBbXQp9Cg== diff --git a/packages/message-kit/src/lib/core.ts b/packages/message-kit/src/lib/core.ts index 3ef06542e..0040c9bc3 100644 --- a/packages/message-kit/src/lib/core.ts +++ b/packages/message-kit/src/lib/core.ts @@ -2,7 +2,7 @@ import { Agent, SkillResponse } from "../helpers/types.js"; import { agentReply, chatMemory, defaultSystemPrompt } from "../plugins/gpt.js"; import { getUserInfo, userInfoCache } from "../plugins/resolver.js"; import { logInitMessage, logMessage } from "../helpers/utils.js"; -import { Message, XMTP, Conversation, XMTPClass } from "xmtp"; +import { Message, XMTP, Conversation, type XMTPClass } from "xmtp"; import { WalletService as CdpWalletService } from "../plugins/cdp.js"; import { WalletService as CircleWalletService } from "../plugins/circle.js"; @@ -58,7 +58,7 @@ export type Context = { resetAwaitedState(): void; //XMTP - xmtp: XMTPClass; + xmtp: InstanceType; conversation: Conversation; group: Conversation | undefined; getMemoryKey(): string; @@ -74,7 +74,7 @@ export type Context = { /* Context implementation */ export class MessageKit implements Context { - xmtp!: XMTPClass; + xmtp!: InstanceType; storage!: LocalStorage; message!: Message; conversation!: Conversation; @@ -107,7 +107,7 @@ export class MessageKit implements Context { message: Message, conversation: Conversation, agent: Agent, - xmtp: XMTPClass, + xmtp: InstanceType, ): Promise { try { const context = new MessageKit(agent); diff --git a/packages/xmtp-client/src/index.ts b/packages/xmtp-client/src/index.ts deleted file mode 100644 index e881199fc..000000000 --- a/packages/xmtp-client/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./lib/xmtp.js"; -export * from "./lib/types.js"; diff --git a/packages/xmtp-client/src/lib/types.ts b/packages/xmtp-client/src/lib/types.ts deleted file mode 100644 index 5b88f79ef..000000000 --- a/packages/xmtp-client/src/lib/types.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { privateKeyToAccount } from "viem/accounts"; -import { createWalletClient } from "viem"; -import { ClientOptions } from "@xmtp/node-sdk"; - -export interface UserReturnType { - key: string; - account: ReturnType; - wallet: ReturnType; -} -export type xmtpConfig = { - privateKey?: string; - client?: any; - gptModel?: string; -} & ClientOptions; - -export type Conversation = { - id: string; - createdAt: Date; - topic?: string; - members?: User[]; - admins?: string[]; - name?: string; - superAdmins?: string[]; -}; - -export type Message = { - id: string; - sender: User; - conversation: { - id: string; - topic: string; - createdAt: Date; - }; - group?: undefined; - sent: Date; - content: { text: string }; - typeId: string; - version: "v2"; -}; - -export interface User { - address: string; - inboxId: string; - installationIds: string[]; - accountAddresses: string[]; -} diff --git a/packages/xmtp-client/README.md b/packages/xmtp-web/README.md similarity index 100% rename from packages/xmtp-client/README.md rename to packages/xmtp-web/README.md diff --git a/packages/xmtp-client/package.json b/packages/xmtp-web/package.json similarity index 96% rename from packages/xmtp-client/package.json rename to packages/xmtp-web/package.json index 906cc88fd..3300e767b 100644 --- a/packages/xmtp-client/package.json +++ b/packages/xmtp-web/package.json @@ -1,6 +1,6 @@ { - "name": "xmtp-client", - "version": "0.0.1", + "name": "xmtp-web", + "version": "0.0.2", "license": "MIT", "type": "module", "exports": { diff --git a/packages/xmtp-client/rollup.config.js b/packages/xmtp-web/rollup.config.js similarity index 100% rename from packages/xmtp-client/rollup.config.js rename to packages/xmtp-web/rollup.config.js diff --git a/packages/xmtp-web/src/index.ts b/packages/xmtp-web/src/index.ts new file mode 100644 index 000000000..1dfe7a126 --- /dev/null +++ b/packages/xmtp-web/src/index.ts @@ -0,0 +1,2 @@ +export * from "./lib/xmtp.js"; +export * from "./types.js"; diff --git a/packages/xmtp-client/src/lib/parse.ts b/packages/xmtp-web/src/lib/parse.ts similarity index 96% rename from packages/xmtp-client/src/lib/parse.ts rename to packages/xmtp-web/src/lib/parse.ts index cfc447d13..102ccb6b2 100644 --- a/packages/xmtp-client/src/lib/parse.ts +++ b/packages/xmtp-web/src/lib/parse.ts @@ -1,5 +1,5 @@ import { DecodedMessage, Conversation } from "@xmtp/xmtp-js"; -import { Message, User } from "./types"; +import { Message, User } from "../types"; export async function parseMessage( message: DecodedMessage | undefined | null, diff --git a/packages/xmtp-client/src/lib/xmtp.ts b/packages/xmtp-web/src/lib/xmtp.ts similarity index 85% rename from packages/xmtp-client/src/lib/xmtp.ts rename to packages/xmtp-web/src/lib/xmtp.ts index 362f31faa..13f60fb6d 100644 --- a/packages/xmtp-client/src/lib/xmtp.ts +++ b/packages/xmtp-web/src/lib/xmtp.ts @@ -3,7 +3,7 @@ import { ContentTypeText, TextCodec } from "@xmtp/content-type-text"; import { createWalletClient, http } from "viem"; import { generatePrivateKey, privateKeyToAccount } from "viem/accounts"; import { mainnet } from "viem/chains"; -import { Message } from "./types.js"; +import { Message, xmtpConfig } from "../types"; import { parseMessage } from "./parse.js"; export class XMTPClass { @@ -23,6 +23,11 @@ export class XMTPClass { }, conversation: { id: "", topic: "", createdAt: new Date() }, id: "", + + client: { + address: "", + inboxId: "", + }, sent: new Date(), content: { text: "" }, typeId: "text", @@ -73,15 +78,19 @@ export class XMTPClass { export async function XMTP( onMessage: (message: Message | undefined) => Promise = async () => {}, - config?: { privateKey?: string; apiKey?: string }, + config?: xmtpConfig, ): Promise { + const { key, isRandom } = await setupPrivateKey(config?.privateKey); const { Client } = await import("@xmtp/xmtp-js"); - const { key } = setupPrivateKey(config?.privateKey); const user = createUser(key); - const client = await Client.create(user.wallet, { + const defaultConfig = { codecs: [new TextCodec()], - env: "production", + env: config?.env ?? "production", + }; + const client = await Client.create(user.wallet, { + ...defaultConfig, + ...config, }); const xmtp = new XMTPClass(client); @@ -91,6 +100,29 @@ export async function XMTP( return xmtp; } +export async function setupPrivateKey( + customKey?: string, +): Promise<{ key: string; isRandom: boolean }> { + let isRandom = false; + + // Handle private key setup + let key = process?.env?.KEY || customKey; + if (key && !key.startsWith("0x")) { + key = "0x" + key; + } + + // Generate new key if none exists or invalid + if (!key || !checkPrivateKey(key)) { + key = generatePrivateKey(); + isRandom = true; + } + + return { + key, + isRandom, + }; +} + async function streamMessages( onMessage: (message: Message | undefined) => Promise, client: Client, @@ -122,20 +154,6 @@ async function streamMessages( } } -function setupPrivateKey(customKey?: string): { key: string } { - let key = customKey; - - if (key && !key.startsWith("0x")) { - key = "0x" + key; - } - - if (!key || !checkPrivateKey(key)) { - key = generatePrivateKey(); - } - - return { key }; -} - function checkPrivateKey(key: string) { try { return privateKeyToAccount(key as `0x${string}`).address !== undefined; diff --git a/packages/xmtp-web/src/types.ts b/packages/xmtp-web/src/types.ts new file mode 100644 index 000000000..018980e7a --- /dev/null +++ b/packages/xmtp-web/src/types.ts @@ -0,0 +1,63 @@ +import { privateKeyToAccount } from "viem/accounts"; +import { createWalletClient } from "viem"; +import { ClientOptions } from "@xmtp/xmtp-js"; + +export interface UserReturnType { + key: string; + account: ReturnType; + wallet: ReturnType; +} +export type xmtpConfig = { + privateKey?: string; + path?: string; +} & ClientOptions; + +export type Conversation = { + id: string; + createdAt: Date; + topic?: string; + members?: User[]; + admins?: string[]; + name?: string; + superAdmins?: string[]; +}; + +export type Message = { + id: string; // Unique identifier for the message + sent: Date; // Date when the message was sent + content: { + text?: string | undefined; // Text content of the message + reply?: string | undefined; // Reply content if the message is a reply + previousMsg?: string | undefined; // Reference to the previous message + attachment?: string | undefined; // Attachment content if the message is an attachment + react?: string | undefined; // Reaction content if the message is a reaction + content?: any | undefined; // Any other content + metadata?: any | undefined; // Metadata for the message + remoteAttachment?: any | undefined; // Remote attachment content if the message is a remote attachment + readReceipt?: any | undefined; // Read receipt content if the message is a read receipt + agentMessage?: any | undefined; // Agent message content if the message is an agent message + reaction?: any | undefined; // Reaction content if the message is a reaction + params?: any | undefined; // Parameters for the message + reference?: string | undefined; // Reference ID for the message + skill?: string | undefined; // Skill associated with the message + any?: any; // Any other content + }; + version: "v2" | "v3"; + group?: Conversation | undefined; // Group the message belongs to + conversation: Conversation; // Conversation the message belongs to + sender: User; // Sender of the message + typeId: string; // Type identifier for the message + client: { + address: string; + inboxId: string; + }; +}; + +export interface User { + address: string; + inboxId: string; + installationIds: string[]; + accountAddresses: string[]; + username?: string; + ensDomain?: string; +} diff --git a/packages/xmtp-client/tsconfig.json b/packages/xmtp-web/tsconfig.json similarity index 100% rename from packages/xmtp-client/tsconfig.json rename to packages/xmtp-web/tsconfig.json diff --git a/packages/xmtp/src/index.ts b/packages/xmtp/src/index.ts index 5b54c41a8..61f901828 100644 --- a/packages/xmtp/src/index.ts +++ b/packages/xmtp/src/index.ts @@ -1,3 +1,3 @@ export * from "./lib/xmtp.js"; -export * from "./lib/types.js"; +export * from "./types.js"; export * from "./content-types/agent-message.js"; diff --git a/packages/xmtp/src/lib/parse.ts b/packages/xmtp/src/lib/parse.ts index 4e40e63c1..c6fe976ed 100644 --- a/packages/xmtp/src/lib/parse.ts +++ b/packages/xmtp/src/lib/parse.ts @@ -9,7 +9,7 @@ import { Client as V2Client, } from "@xmtp/xmtp-js"; import { RemoteAttachmentCodec } from "@xmtp/content-type-remote-attachment"; -import { Message, User } from "./types"; +import { Message, User } from "../types"; export async function parseMessage( message: V3DecodedMessage | V2DecodedMessage | undefined | null, diff --git a/packages/xmtp/src/lib/xmtp.ts b/packages/xmtp/src/lib/xmtp.ts index c82305892..9e1863768 100644 --- a/packages/xmtp/src/lib/xmtp.ts +++ b/packages/xmtp/src/lib/xmtp.ts @@ -42,7 +42,7 @@ import { mainnet } from "viem/chains"; import { GrpcApiClient } from "@xmtp/grpc-api-client"; import { getRandomValues } from "crypto"; import path from "path"; -import { xmtpConfig, Message } from "./types.js"; +import { xmtpConfig, Message } from "../types.js"; import { readFile } from "fs/promises"; interface UserReturnType { diff --git a/packages/xmtp/src/lib/types.ts b/packages/xmtp/src/types.ts similarity index 97% rename from packages/xmtp/src/lib/types.ts rename to packages/xmtp/src/types.ts index e25faba1a..e7af7ef8c 100644 --- a/packages/xmtp/src/lib/types.ts +++ b/packages/xmtp/src/types.ts @@ -1,5 +1,4 @@ import { privateKeyToAccount } from "viem/accounts"; -import { ContentTypeId } from "@xmtp/content-type-primitives"; import { createWalletClient } from "viem"; import { ClientOptions } from "@xmtp/node-sdk"; diff --git a/scripts/publish.js b/scripts/publish.js index eea82d27a..a5238dc93 100644 --- a/scripts/publish.js +++ b/scripts/publish.js @@ -43,7 +43,7 @@ const packages = [ "packages/message-kit", "packages/xmtp", "packages/create-message-kit", - "packages/xmtp-client", + "packages/xmtp-web", ]; packages.forEach((packagePath) => { diff --git a/yarn.lock b/yarn.lock index 56f340b3e..76840c7f0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3864,29 +3864,6 @@ __metadata: languageName: node linkType: hard -"agent-client@workspace:packages/agent-client": - version: 0.0.0-use.local - resolution: "agent-client@workspace:packages/agent-client" - dependencies: - "@farcaster/frame-sdk": "npm:0.0.10" - "@types/next": "npm:^9.0.0" - "@types/node": "npm:^20" - "@types/react": "npm:^18" - "@types/react-dom": "npm:^18" - cheerio: "npm:^1.0.0" - ethers: "npm:^6.13.4" - geist: "npm:^1.3.1" - next: "npm:^15.0.3" - qrcode: "npm:^1.5.4" - qrcode.react: "npm:^4.1.0" - react: "npm:^18.2.0" - react-dom: "npm:^18.2.0" - typescript: "npm:^5" - viem: "npm:^2.21.45" - xmtp-client: "workspace:*" - languageName: unknown - linkType: soft - "agentkeepalive@npm:^4.2.1": version: 4.5.0 resolution: "agentkeepalive@npm:4.5.0" @@ -4688,6 +4665,26 @@ __metadata: languageName: node linkType: hard +"client@workspace:packages/client": + version: 0.0.0-use.local + resolution: "client@workspace:packages/client" + dependencies: + "@farcaster/frame-sdk": "npm:0.0.10" + "@types/next": "npm:^9.0.0" + "@types/node": "npm:^20" + "@types/react": "npm:^18" + "@types/react-dom": "npm:^18" + cheerio: "npm:^1.0.0" + geist: "npm:^1.3.1" + next: "npm:^15.0.3" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" + typescript: "npm:^5" + viem: "npm:^2.21.45" + xmtp-web: "workspace:*" + languageName: unknown + linkType: soft + "cliui@npm:^6.0.0": version: 6.0.0 resolution: "cliui@npm:6.0.0" @@ -12298,9 +12295,9 @@ __metadata: languageName: unknown linkType: soft -"xmtp-client@workspace:*, xmtp-client@workspace:packages/xmtp-client": +"xmtp-web@workspace:*, xmtp-web@workspace:packages/xmtp-web": version: 0.0.0-use.local - resolution: "xmtp-client@workspace:packages/xmtp-client" + resolution: "xmtp-web@workspace:packages/xmtp-web" dependencies: "@changesets/changelog-git": "npm:^0.2.0" "@changesets/cli": "npm:^2.27.5" From c2433ec71e7efb3761f5aa2bdb23fe7ec89405a4 Mon Sep 17 00:00:00 2001 From: fabri Date: Sun, 22 Dec 2024 13:43:16 -0300 Subject: [PATCH 10/19] deploy --- packages/baselinks/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/baselinks/README.md b/packages/baselinks/README.md index 0acd6e98d..8682e6333 100644 --- a/packages/baselinks/README.md +++ b/packages/baselinks/README.md @@ -1,3 +1,3 @@ # Baselinks -See [Baselinks](https://message-kit.org/plugins/baselinks) in MessageKit +See [Baselinks](https://message-kit.org/plugins/baselinks) in MessageKit. From 7578ccb9b4f7aa5491d073b008261e95166ef9a9 Mon Sep 17 00:00:00 2001 From: fabri Date: Mon, 23 Dec 2024 09:41:21 -0300 Subject: [PATCH 11/19] update git --- packages/client/src/components/Chat.tsx | 8 +- packages/docs/pages/concepts/skills.mdx | 79 +++-- packages/docs/pages/plugins/xmtp.mdx | 8 +- packages/docs/pages/skills/concierge.mdx | 7 +- packages/message-kit/package.json | 2 +- packages/message-kit/src/helpers/utils.ts | 11 +- packages/message-kit/src/lib/core.ts | 127 ++++---- packages/message-kit/src/lib/skills.ts | 24 +- packages/message-kit/src/plugins/cdp.ts | 6 + packages/message-kit/src/plugins/circle.ts | 15 +- packages/message-kit/src/plugins/gpt.ts | 24 +- packages/message-kit/src/plugins/resolver.ts | 2 +- packages/message-kit/src/skills/concierge.ts | 197 +++++++++-- packages/xmtp-web/README.md | 30 +- packages/xmtp-web/package.json | 2 +- packages/xmtp-web/src/lib/xmtp.ts | 76 ++--- packages/xmtp/README.md | 2 +- packages/xmtp/package.json | 2 +- packages/xmtp/src/lib/xmtp.ts | 323 ++++++++++--------- packages/xmtp/src/types.ts | 16 + templates/ens/example_prompt.md | 4 +- 21 files changed, 616 insertions(+), 349 deletions(-) diff --git a/packages/client/src/components/Chat.tsx b/packages/client/src/components/Chat.tsx index 69ba59961..2f4d04380 100644 --- a/packages/client/src/components/Chat.tsx +++ b/packages/client/src/components/Chat.tsx @@ -6,7 +6,7 @@ import { isAddress, parseUnits } from "viem"; import { extractFrameChain } from "@/app/utils/networks"; import sdk from "@farcaster/frame-sdk"; import { UrlPreview } from "./UrlPreview"; -import { XMTP, Message, XMTPClass } from "xmtp-web"; +import { XMTP, Message } from "xmtp-web"; type UrlType = "receipt" | "payment" | "wallet" | "unknown"; @@ -29,7 +29,7 @@ const isFrame = async () => { function Chat({ user }: { user: UserInfo }) { const [messages, setMessages] = useState([]); const [newMessage, setNewMessage] = useState(""); - const [xmtp, setXmtp] = useState(undefined); + const [xmtp, setXmtp] = useState(undefined); const [isLoading, setIsLoading] = useState(true); const [recipientInfo, setRecipientInfo] = useState( undefined, @@ -45,8 +45,8 @@ function Chat({ user }: { user: UserInfo }) { if (user?.address) { console.log("Initializing XMTP with address:", user.address); - const xmtpClient = await XMTP(onMessage); - + const xmtpClient = new XMTP(onMessage); + await xmtpClient.init(); setXmtp(xmtpClient); setIsLoading(false); } else { diff --git a/packages/docs/pages/concepts/skills.mdx b/packages/docs/pages/concepts/skills.mdx index 53b0c2707..8ce7eed51 100644 --- a/packages/docs/pages/concepts/skills.mdx +++ b/packages/docs/pages/concepts/skills.mdx @@ -64,36 +64,69 @@ function handler(context: Context) { {/* prettier-ignore-end */} -## Sending messages +## Text messages App messages are messages that are sent when you send a reply to a message and are highlighted differently by the apps. ```tsx -// Send a message -await context.send("Your message."); -// Reply to the last message -await context.reply("Your message."); -// Send a message to specific users -await context.sendTo("Your message.", ["address1", "address2"]); -// Await a response +//text +let textMessage: userMessage = { + message: "Your message.", + originalMessage: context.message, +}; +await context.send(textMessage); + const answer = await context.awaitResponse("Please answer with yes or no", [ "yes", "no", ]); console.log(`You answered: ${answer}`); -// Send an image (max 1MB) -await context.sendImage("path/to/image.png"); -// Send a remote image (max 1MB) -await context.sendImage("https://picsum.photos/200/300"); -//Send a message to another agent -await context.sendAgentMessage("Would you like to approve this transaction?", { - agentId: "payment-bot", - skillUsed: "approve-tx", - amount: "10", - token: "USDC", - chain: "base", - destinationAddress: "0x123...789", -}); -// Send a dm to the sender -await context.dm("Your message."); +``` + +### Other messages + +```tsx +// reaction +let reaction: userMessage = { + message: "😅", + receivers: [context.message.sender.address], + originalMessage: context.message, + typeId: "reaction", +}; +await context.send(reaction); + +// Reply +let reply: userMessage = { + message: "Your message.", + receivers: [context.message.sender.address], + originalMessage: context.message, + typeId: "reply", +}; +await context.send(reply); + +//Attachment +let attachment: userMessage = { + message: "https://picsum.photos/200/300", + receivers: [context.message.sender.address], + originalMessage: context.message, + typeId: "attachment", +}; +await context.send(attachment); + +//agent message +let agentMessage: userMessage = { + message: "Would you like to approve this transaction?", + metadata: { + agentId: "payment-bot", + skillUsed: "approve-tx", + amount: "10", + token: "USDC", + chain: "base", + destinationAddress: "0x123...789", + }, + receivers: [context.message.sender.address], + originalMessage: context.message, + typeId: "agent", +}; +await context.send(agentMessage); ``` diff --git a/packages/docs/pages/plugins/xmtp.mdx b/packages/docs/pages/plugins/xmtp.mdx index 22660834e..15b46feba 100644 --- a/packages/docs/pages/plugins/xmtp.mdx +++ b/packages/docs/pages/plugins/xmtp.mdx @@ -42,7 +42,7 @@ const xmtp = await XMTP(onMessage, { const onMessage = async (message, user) => { console.log(`Decoded message: ${message.content.text} by ${user.address}`); // Your AI model response - await xmtp.sendMessage(response); + await xmtp.sendMessage(response, user.address); }; ``` @@ -112,10 +112,10 @@ const onSend = async (text) => { return message; }; -const onMessage = async (message, agentAddress) => { - console.log(`Decoded message: ${message} by ${agentAddress}`); +const onMessage = async (message, user) => { + console.log(`Decoded message: ${message} by ${user.address}`); let response; // Your ai model response - await xmtp.sendMessage(response, agentAddress); + await xmtp.sendMessage(response, user.address); }; ``` diff --git a/packages/docs/pages/skills/concierge.mdx b/packages/docs/pages/skills/concierge.mdx index 1b9f5142d..c9461c956 100644 --- a/packages/docs/pages/skills/concierge.mdx +++ b/packages/docs/pages/skills/concierge.mdx @@ -42,7 +42,12 @@ The concierge will handle the transaction. // Funding logic async function fund(context: Context, amount: number) { if (Number(balance) === 10) { - await context.dm("You have maxed out your funds. Max 10 USDC."); + await context.send({ + message: "You have maxed out your funds. Max 10 USDC.", + receivers: [context.message.sender.address], + originalMessage: context.message, + typeId: "text", + }); return false; } diff --git a/packages/message-kit/package.json b/packages/message-kit/package.json index 62ef91412..0ce2d88f1 100644 --- a/packages/message-kit/package.json +++ b/packages/message-kit/package.json @@ -1,6 +1,6 @@ { "name": "@xmtp/message-kit", - "version": "1.2.35", + "version": "1.3.0", "license": "MIT", "type": "module", "exports": { diff --git a/packages/message-kit/src/helpers/utils.ts b/packages/message-kit/src/helpers/utils.ts index 817b9ac29..490bcf822 100644 --- a/packages/message-kit/src/helpers/utils.ts +++ b/packages/message-kit/src/helpers/utils.ts @@ -43,7 +43,10 @@ export async function checkStorage() { console.error("Error checking storage:", error); } } -export async function logInitMessage(client: Client, agent?: Agent) { +export async function logInitMessage( + client: Client | undefined, + agent?: Agent, +) { if (process.env.MSG_LOG === "true" && process.env.NODE_ENV === "production") await checkStorage(); const agentConfig = agent?.config; @@ -61,9 +64,9 @@ export async function logInitMessage(client: Client, agent?: Agent) { Powered by XMTP \x1b[0m`; console.log(coolLogo); console.log(`\nSend a message to this account on: - \x1b[90m Converse: https://converse.xyz/dm/${client.accountAddress}\x1b[0m - \x1b[38;2;0;0;255m Coinbase Wallet: https://go.cb-w.com/messaging?address=${client.accountAddress}\x1b[0m - \x1b[38;2;128;0;128m Share in Farcaster (Framev2): https://client.message-kit.org/?address=${client.accountAddress}\x1b[0m`); + \x1b[90m Converse: https://converse.xyz/dm/${client?.accountAddress}\x1b[0m + \x1b[38;2;0;0;255m Coinbase Wallet: https://go.cb-w.com/messaging?address=${client?.accountAddress}\x1b[0m + \x1b[38;2;128;0;128m Share in Farcaster (Framev2): https://client.message-kit.org/?address=${client?.accountAddress}\x1b[0m`); if ( agentConfig?.walletService == true || diff --git a/packages/message-kit/src/lib/core.ts b/packages/message-kit/src/lib/core.ts index 0040c9bc3..255de8395 100644 --- a/packages/message-kit/src/lib/core.ts +++ b/packages/message-kit/src/lib/core.ts @@ -2,7 +2,7 @@ import { Agent, SkillResponse } from "../helpers/types.js"; import { agentReply, chatMemory, defaultSystemPrompt } from "../plugins/gpt.js"; import { getUserInfo, userInfoCache } from "../plugins/resolver.js"; import { logInitMessage, logMessage } from "../helpers/utils.js"; -import { Message, XMTP, Conversation, type XMTPClass } from "xmtp"; +import { Message, XMTP, Conversation, userMessage } from "xmtp"; import { WalletService as CdpWalletService } from "../plugins/cdp.js"; import { WalletService as CircleWalletService } from "../plugins/circle.js"; @@ -49,7 +49,7 @@ export type Context = { executeSkill: (text: string) => Promise; clearMemory: (address?: string) => Promise; clearCache: (address?: string) => Promise; - + send: (message: userMessage) => Promise; awaitResponse( prompt: string, validResponses?: string[], @@ -58,23 +58,16 @@ export type Context = { resetAwaitedState(): void; //XMTP - xmtp: InstanceType; + xmtp: XMTP; conversation: Conversation; group: Conversation | undefined; - getMemoryKey(): string; - sendAgentMessage: (message: string, metadata: any) => Promise; - sendTo(message: string, receivers: string[]): Promise; - reply(message: string, reference?: string): Promise; - dm(message: string): Promise; - send(message: string): Promise; - sendImage(image: string): Promise; - react(emoji: string): Promise; + getMemoryKey(sender: string, conversationId: string): string; awaitedHandler: ((text: string) => Promise) | undefined; }; /* Context implementation */ export class MessageKit implements Context { - xmtp!: InstanceType; + xmtp!: XMTP; storage!: LocalStorage; message!: Message; conversation!: Conversation; @@ -97,17 +90,17 @@ export class MessageKit implements Context { async run(): Promise { // Initialize the clients - this.xmtp = await XMTP(this.handleMessage, this.agent.config?.client); - + this.xmtp = new XMTP(this.handleMessage, this.agent.config?.client); + await this.xmtp.init(); // Store the GPT model in process.env for global access process.env.GPT_MODEL = this.agent.config?.gptModel || "gpt-4o"; - logInitMessage(this.xmtp.client, this.agent); + logInitMessage(this.xmtp?.client, this.agent); } static async create( message: Message, conversation: Conversation, agent: Agent, - xmtp: InstanceType, + xmtp: XMTP, ): Promise { try { const context = new MessageKit(agent); @@ -184,7 +177,7 @@ export class MessageKit implements Context { } context.storage = new LocalStorage(".data/storage"); - return context as Context; + return context as unknown as Context; } return undefined; } catch (error) { @@ -212,20 +205,22 @@ export class MessageKit implements Context { //Await response const awaitedHandler = awaitedHandlers.get( - context.xmtp.getConversationKey(), + context.xmtp.getConversationKey(message), ); if (awaitedHandler) { const messageText = context.message.content.text || context.message.content.reply || ""; // Check if the response is from the expected user - const expectedUser = context.xmtp.getConversationKey().split(":")[1]; + const expectedUser = context.xmtp + .getConversationKey(message) + .split(":")[1]; const actualSender = message.sender.address; if (expectedUser?.toLowerCase() === actualSender?.toLowerCase()) { const isValidResponse = await awaitedHandler(messageText); // Only remove the handler if we got a valid response if (isValidResponse) { - awaitedHandlers.delete(context.xmtp.getConversationKey()); + awaitedHandlers.delete(context.xmtp.getConversationKey(message)); } } return; @@ -237,7 +232,11 @@ export class MessageKit implements Context { const result = await customHandler(context); if (result && "code" in result) { if (result.code === 200) { - await context.dm(result.message); + await context.send({ + message: result.message, + originalMessage: context.message, + typeId: "text", + }); } } } else if (isMessageValid && this.agent?.onMessage) @@ -264,7 +263,11 @@ export class MessageKit implements Context { validResponses?: string[], attempts?: number, ): Promise { - await this.dm(`${prompt}`); + await this.send({ + message: `${prompt}`, + originalMessage: this.message, + typeId: "text", + }); let attemptCount = 0; attempts = attempts ?? 2; @@ -301,66 +304,54 @@ export class MessageKit implements Context { } // Invalid response - send error message and continue waiting - await this.dm( - `Invalid response "${text}". Please respond with one of: ${validResponses.join(", ")}. Attempts remaining: ${attempts - attemptCount}`, - ); + await this.send({ + message: `Invalid response "${text}". Please respond with one of: ${validResponses.join(", ")}. Attempts remaining: ${attempts - attemptCount}`, + originalMessage: this.message, + typeId: "text", + }); return false; }; // Add the handler to the Map - awaitedHandlers.set(this.xmtp.getConversationKey(), handler); + awaitedHandlers.set( + this.getMemoryKey( + this.message.sender.address, + this.message.conversation.id, + ), + handler, + ); }); } // Method to reset the awaited state resetAwaitedState() { this.awaitingResponse = false; this.awaitedHandler = undefined; - awaitedHandlers.delete(this.xmtp.getConversationKey()); - } - async sendAgentMessage(message: string, metadata: any) { - this.addMemory(message); - this.xmtp.sendAgentMessage(message, metadata); - } - async reply(message: string) { - this.addMemory(message); - await this.xmtp.reply(message, this.message.id); - } - addMemory(message: string) { - logMessage("sent:" + message); - chatMemory.addEntry(this.getMemoryKey(), message, "assistant"); + awaitedHandlers.delete( + this.getMemoryKey( + this.message.sender.address, + this.message.conversation.id, + ), + ); } - getMemoryKey() { - return this.xmtp.getConversationKey() + ":" + this.message?.sender?.address; + async send(message: userMessage): Promise { + this.addMemory( + message.message, + message.originalMessage?.sender.address, + message.originalMessage?.conversation.id, + ); + await this.xmtp.send(message); + return Promise.resolve(); } - - async react(emoji: string) { - this.addMemory(emoji); - this.xmtp.react(emoji, this.message.id); + addMemory(message: string, sender: string, conversationId: string) { + chatMemory.addEntry( + this.getMemoryKey(sender, conversationId), + message, + "assistant", + ); } - async sendTo(message: string, receivers: string[]) { - if (typeof message !== "string") { - console.error("Message must be a string"); - return; - } - for (const receiver of receivers) { - if (this.xmtp.address.toLowerCase() === receiver.toLowerCase()) { - continue; - } - this.dm(message, receiver); - } - } - async dm(message: string, receiver?: string) { - this.addMemory(message); - this.xmtp.sendMessage(message, receiver); - } - async send(message: string) { - this.addMemory(message); - this.xmtp.sendMessage(message); - } - async sendImage(image: string) { - this.addMemory(image); - this.xmtp.sendImage(image); + getMemoryKey(sender: string, conversationId: string) { + return conversationId + ":" + sender; } } diff --git a/packages/message-kit/src/lib/skills.ts b/packages/message-kit/src/lib/skills.ts index a8b00ac21..071fc4b72 100644 --- a/packages/message-kit/src/lib/skills.ts +++ b/packages/message-kit/src/lib/skills.ts @@ -79,10 +79,21 @@ export async function executeSkill( if (skillAction?.handler) return skillAction.handler(mockContext); } else if (skillAction) { console.warn("No handler for", skillAction.skill); - return context.send(text); + return context.send({ + message: text, + receivers: [context.message.sender.address], + originalMessage: context.message, + typeId: "text", + }); } else if (text.startsWith("/") || text.startsWith("@")) { console.warn("Skill not valid", text); - } else return context.send(text); + } else + return context.send({ + message: text, + receivers: [context.message.sender.address], + originalMessage: context.message, + typeId: "text", + }); } catch (error) { if (error instanceof Error) { console.error(`Skill execution failed: ${error.message}`); @@ -322,7 +333,12 @@ export async function filterMessage(context: Context): Promise<{ if (context.message.content.text?.startsWith("/reset")) { context.clearMemory(sender?.address); //context.clearCache(sender?.address); - context.send("Memory cleared"); + context.send({ + message: "Memory cleared", + + originalMessage: context.message, + typeId: "text", + }); return { isMessageValid: false, customHandler: undefined }; } let customOnMessage = agent?.onMessage !== undefined; @@ -370,7 +386,7 @@ export async function filterMessage(context: Context): Promise<{ typeId ?? "", ); // Check if the message content triggers a tag - let botTag = (await getUserInfo(xmtp.address))?.converseUsername; + let botTag = (await getUserInfo(xmtp?.address))?.converseUsername; const isTagged = text?.toLowerCase()?.includes(agent?.tag?.toLowerCase() ?? "") ?? text?.toLowerCase()?.includes(botTag?.toLowerCase() ?? ""); diff --git a/packages/message-kit/src/plugins/cdp.ts b/packages/message-kit/src/plugins/cdp.ts index ac2fde0fa..07df4b198 100644 --- a/packages/message-kit/src/plugins/cdp.ts +++ b/packages/message-kit/src/plugins/cdp.ts @@ -44,6 +44,12 @@ export interface AgentWallet { toAddress: string, amount: number, ) => Promise; + swap: ( + address: string, + fromAssetId: string, + toAssetId: string, + amount: number, + ) => Promise; checkBalance: ( key: string, ) => Promise<{ address: string | undefined; balance: number }>; diff --git a/packages/message-kit/src/plugins/circle.ts b/packages/message-kit/src/plugins/circle.ts index 9e0982780..42d3642a7 100644 --- a/packages/message-kit/src/plugins/circle.ts +++ b/packages/message-kit/src/plugins/circle.ts @@ -25,6 +25,12 @@ export interface AgentWallet { toAddress: string, amount: number, ) => Promise; + swap: ( + address: string, + fromAssetId: string, + toAssetId: string, + amount: number, + ) => Promise; checkBalance: ( key: string, ) => Promise<{ address: string | undefined; balance: number }>; @@ -134,7 +140,14 @@ export class WalletService implements AgentWallet { key: wallet.id, }; } - + async swap( + address: string, + fromAssetId: string, + toAssetId: string, + amount: number, + ) { + return undefined; + } async transfer( fromAddress: string, toAddress: string, diff --git a/packages/message-kit/src/plugins/gpt.ts b/packages/message-kit/src/plugins/gpt.ts index 91498a48e..692726e63 100644 --- a/packages/message-kit/src/plugins/gpt.ts +++ b/packages/message-kit/src/plugins/gpt.ts @@ -203,7 +203,10 @@ export async function agentReply(context: Context) { let userPrompt = params?.prompt ?? text; //Memory - let memoryKey = context.getMemoryKey(); + let memoryKey = context.getMemoryKey( + sender.address, + context.conversation.id, + ); chatMemory.createMemory(memoryKey, systemPrompt); chatMemory.addEntry(memoryKey, userPrompt, "user"); @@ -223,7 +226,10 @@ export async function agentReply(context: Context) { // Log any errors that occur during the OpenAI call console.error("Error during OpenAI call:", error); // Inform the user that an error occurred - await context.send("An error occurred while processing your request."); + await context.send({ + message: "An error occurred while processing your request.", + originalMessage: context.message, + }); return { reply: "An error occurred while processing your request." }; } } @@ -345,11 +351,21 @@ export async function processMultilineResponse( if (response && typeof response.message === "string") { let msg = parseMarkdown(response.message); - await context.send(msg); + await context.send({ + message: msg, + receivers: [context.message.sender.address], + originalMessage: context.message, + typeId: "text", + }); } } else { // If it's not a command and didn't match forbidden prefixes, it's probably valid free-form text - await context.send(message); + await context.send({ + message: message, + receivers: [context.message.sender.address], + originalMessage: context.message, + typeId: "text", + }); } } return true; diff --git a/packages/message-kit/src/plugins/resolver.ts b/packages/message-kit/src/plugins/resolver.ts index 0d938c1e5..7222f28e9 100644 --- a/packages/message-kit/src/plugins/resolver.ts +++ b/packages/message-kit/src/plugins/resolver.ts @@ -72,7 +72,7 @@ class UserInfoCache { export const userInfoCache = UserInfoCache.getInstance(); export const getUserInfo = async ( - key: string, + key: string | undefined, clientAddress?: string, ): Promise => { let data: UserInfo = { diff --git a/packages/message-kit/src/skills/concierge.ts b/packages/message-kit/src/skills/concierge.ts index 8f593616b..1e3e5c14b 100644 --- a/packages/message-kit/src/skills/concierge.ts +++ b/packages/message-kit/src/skills/concierge.ts @@ -88,7 +88,7 @@ export async function handleWallet(context: Context) { message: { content: { skill, - params: { amount, recipient }, + params: { amount, recipient, fromToken, toToken }, }, sender, }, @@ -97,49 +97,128 @@ export async function handleWallet(context: Context) { } = context; if (group && skill == "help") { - await context.reply("Check your DM's"); + await context.send({ + message: "Check your DM's", + + originalMessage: context.message, + typeId: "reply", + }); return; } else if (skill === "help") { - await context.dm("Im your personal assistant. How can I help you today?"); + await context.send({ + message: "Im your personal assistant. How can I help you today?", + + originalMessage: context.message, + typeId: "text", + }); } else if (skill === "address") { const walletExist = await walletService.getWallet(sender.address); if (walletExist) { const { balance } = await walletService.checkBalance(sender.address); - await context.dm("Your agent wallet address"); + await context.send({ + message: "Your agent wallet address", + + originalMessage: context.message, + typeId: "text", + }); const url = await baselinks.sendWallet( walletExist.address, walletExist.agent_address, balance, ); - await context.dm(url); + await context.send({ + message: url, + + originalMessage: context.message, + typeId: "text", + }); return; } - await context.reply("You don't have an agent wallet."); + await context.send({ + message: "You don't have an agent wallet.", + + originalMessage: context.message, + typeId: "text", + }); } else if (skill === "balance") { const { balance } = await walletService.checkBalance(sender.address); - await context.dm(`Your agent wallet has a balance of $${balance}`); + await context.send({ + message: `Your agent wallet has a balance of $${balance}`, + + originalMessage: context.message, + typeId: "text", + }); } else if (skill === "fund") { await fund(context, amount); return; } else if (skill === "withdraw") { await withdraw(context, amount); } else if (skill === "swap") { - context.dm("I cant do that yet"); - // await walletService.swap(sender.address, fromToken, toToken, amount); - } else if (skill === "transfer") { const { balance } = await walletService.checkBalance(sender.address); if (balance === 0) { - await context.reply("You have no funds to transfer."); + await context.send({ + message: "You have no funds to transfer.", + + originalMessage: context.message, + typeId: "text", + }); return; } if (!recipient?.address) { console.log("recipient", recipient); - await context.reply("User not found."); + await context.send({ + message: "User not found.", + + originalMessage: context.message, + typeId: "text", + }); return; } - await context.dm( - `Transferring ${amount} USDC to ${recipient?.preferredName}`, + await context.send({ + message: `Swapping ${amount} ${fromToken} to ${toToken}`, + + originalMessage: context.message, + typeId: "text", + }); + const swap = await walletService.swap( + sender.address, + fromToken, + toToken, + amount, ); + await context.send({ + message: `Swap completed successfully`, + + originalMessage: context.message, + typeId: "text", + }); + } else if (skill === "transfer") { + const { balance } = await walletService.checkBalance(sender.address); + if (balance === 0) { + await context.send({ + message: "You have no funds to transfer.", + + originalMessage: context.message, + typeId: "text", + }); + return; + } + if (!recipient?.address) { + console.log("recipient", recipient); + await context.send({ + message: "User not found.", + + originalMessage: context.message, + typeId: "text", + }); + return; + } + await context.send({ + message: `Transferring ${amount} USDC to ${recipient?.preferredName}`, + + originalMessage: context.message, + typeId: "text", + }); const tx = await walletService.transfer( sender.address, recipient?.address as string, @@ -164,31 +243,54 @@ async function notifyUser( amount: number, ) { if (transaction) { - await context.dm(`Transfer completed successfully`); + await context.send({ + message: `Transfer completed successfully`, + receivers: [context.message.sender.address], + originalMessage: context.message, + typeId: "text", + }); if ((await transaction.getTransactionHash()) !== undefined) { const url = await baselinks.sendReceipt( `https://basescan.org/tx/${await transaction.getTransactionHash()}`, amount, ); - await context.dm(url); + await context.send({ + message: url, + receivers: [context.message.sender.address], + originalMessage: context.message, + typeId: "text", + }); } else if ((await transaction.getTransaction()) !== undefined) { const url = await baselinks.sendReceipt( `https://basescan.org/tx/${await transaction.getTransaction()}`, amount, ); - await context.dm(url); + await context.send({ + message: url, + receivers: [context.message.sender.address], + originalMessage: context.message, + typeId: "text", + }); } } - await context.dm(`Your balance was deducted by $${amount}`); + await context.send({ + message: `Your balance was deducted by $${amount}`, + receivers: [context.message.sender.address], + originalMessage: context.message, + typeId: "text", + }); if (!isAddress(toAddress)) return; const { v2, v3 } = await context.xmtp.isOnXMTP(toAddress); console.log(toAddress, { v2, v3 }); if (!v2 && !v3) return; let userInfo = await getUserInfo(fromAddress); - await context.sendTo(`${userInfo?.preferredName} just sent you $${amount}`, [ - toAddress, - ]); + await context.send({ + message: `${userInfo?.preferredName} just sent you $${amount}`, + receivers: [toAddress], + originalMessage: context.message, + typeId: "text", + }); } async function fund( @@ -203,7 +305,10 @@ async function fund( } = context; if (amount <= 0) { - await context.dm("Please specify a valid amount to fund."); + await context.send({ + message: "Please specify a valid amount to fund.", + originalMessage: context.message, + }); return false; } @@ -212,31 +317,46 @@ async function fund( console.log(`Retrieved wallet data for ${sender.address}`); let { balance } = await walletService.checkBalance(sender.address); if (Number(balance) === 10) { - await context.dm("You have maxed out your funds. Max 10 USDC."); + await context.send({ + message: "You have maxed out your funds. Max 10 USDC.", + originalMessage: context.message, + }); return false; } else if (amount) { console.log("amount", amount); console.log("balance", balance); if (amount + Number(balance) <= 10) { if (group) { - await context.reply( - `You need to fund your agent account. Check your DMs https://converse.xyz/${context.xmtp.address}`, - ); + await context.send({ + message: `You need to fund your agent account. Check your DMs https://converse.xyz/${context.xmtp.address}`, + originalMessage: context.message, + typeId: "text", + }); } let onRampURL = await walletService.onRampURL( amount, walletData.agent_address, ); - await context.dm("Here is the payment link:"); + + await context.send({ + message: "Here is the payment link:", + originalMessage: context.message, + }); const url = await baselinks.requestPayment( walletData.agent_address, amount, onRamp ? onRampURL : undefined, ); - await context.dm(url); + await context.send({ + message: url, + originalMessage: context.message, + }); return true; } else { - await context.dm("Wrong amount. Max 10 USDC."); + await context.send({ + message: "Wrong amount. Max 10 USDC.", + originalMessage: context.message, + }); return false; } } else { @@ -261,7 +381,10 @@ async function fund( Number(response), onRamp ? onRampURL : undefined, ); - await context.dm(url); + await context.send({ + message: url, + originalMessage: context.message, + }); return true; } } @@ -280,11 +403,21 @@ async function withdraw( console.log(`Retrieved wallet data for ${sender.address}`); let { balance } = await walletService.checkBalance(sender.address); if (amount && amount <= 0) { - await context.dm("Please specify a valid positive amount to withdraw."); + await context.send({ + message: "Please specify a valid positive amount to withdraw.", + receivers: [context.message.sender.address], + originalMessage: context.message, + typeId: "text", + }); return; } if (amount && amount > Number(balance)) { - await context.dm("You don't have enough funds to withdraw."); + await context.send({ + message: "You don't have enough funds to withdraw.", + receivers: [context.message.sender.address], + originalMessage: context.message, + typeId: "text", + }); return; } let toWithdraw = amount ?? Number(balance); diff --git a/packages/xmtp-web/README.md b/packages/xmtp-web/README.md index 634fb3804..ebf685bd5 100644 --- a/packages/xmtp-web/README.md +++ b/packages/xmtp-web/README.md @@ -1,3 +1,29 @@ -# XMTP AI +# XMTP -See [XMTP AI](https://message-kit.org/plugins/xmtp) plugin +> See [XMTP AI](https://message-kit.org/plugins/xmtp) plugin + +### Installation + +Install the `xmtp-web` package for using in the users devices. + +```bash [cmd] +bun install xmtp-web +``` + +### Usage + +This is how you can use the `xmtp-web` package to create a client and handle messages. + +> It will always create an anonimous identity by default. + +```tsx +import { XMTP } from "xmtp-web"; + +const xmtp = await XMTP(onMessage); + +const onMessage = async (message, user) => { + console.log(`Decoded message: ${message.content.text} by ${user.address}`); + // Your AI model response + await xmtp.sendMessage(response); +}; +``` diff --git a/packages/xmtp-web/package.json b/packages/xmtp-web/package.json index 3300e767b..013a90225 100644 --- a/packages/xmtp-web/package.json +++ b/packages/xmtp-web/package.json @@ -1,6 +1,6 @@ { "name": "xmtp-web", - "version": "0.0.2", + "version": "0.0.3", "license": "MIT", "type": "module", "exports": { diff --git a/packages/xmtp-web/src/lib/xmtp.ts b/packages/xmtp-web/src/lib/xmtp.ts index 13f60fb6d..32a176416 100644 --- a/packages/xmtp-web/src/lib/xmtp.ts +++ b/packages/xmtp-web/src/lib/xmtp.ts @@ -6,14 +6,19 @@ import { mainnet } from "viem/chains"; import { Message, xmtpConfig } from "../types"; import { parseMessage } from "./parse.js"; -export class XMTPClass { - client: Client; - address: string; - message: Message; - - constructor(client: Client) { - this.client = client; - this.address = client.address; +export class XMTP { + client: Client | undefined; + address: string | undefined; + message: Message | undefined; + onMessage: (message: Message | undefined) => Promise; + config: xmtpConfig | undefined; + + constructor( + onMessage: (message: Message | undefined) => Promise = async () => {}, + config?: xmtpConfig | undefined, + ) { + this.onMessage = onMessage; + this.config = config; this.message = { sender: { address: "", @@ -35,9 +40,30 @@ export class XMTPClass { }; } + async init(): Promise { + const { key, isRandom } = await setupPrivateKey(this.config?.privateKey); + const { Client } = await import("@xmtp/xmtp-js"); + const user = createUser(key); + + const defaultConfig = { + codecs: [new TextCodec()], + env: this.config?.env ?? "production", + }; + const client = await Client.create(user.wallet, { + ...defaultConfig, + ...this.config, + }); + + this.client = client; + this.address = client.address; + streamMessages(this.onMessage, client); + + return this; + } + async sendMessage(message: string, receiver?: string): Promise { const conversation = await this.getConversationByAddress( - receiver ?? this.message.sender.address, + receiver ?? this.message?.sender?.address ?? "", ); const toDecode = await conversation?.send(message, { contentType: ContentTypeText, @@ -48,12 +74,12 @@ export class XMTPClass { async getConversationByAddress(address: string) { try { - const conversations = await this.client.conversations.list(); - let found = conversations.find( + const conversations = await this.client?.conversations.list(); + let found = conversations?.find( (conv) => conv.peerAddress.toLowerCase() === address.toLowerCase(), ); if (!found) { - found = await this.client.conversations.newConversation(address); + found = await this.client?.conversations.newConversation(address); } return found; } catch (error) { @@ -68,7 +94,7 @@ export class XMTPClass { async isOnXMTP(address: string): Promise { try { - return await this.client.canMessage(address); + return (await this.client?.canMessage(address)) ?? false; } catch (error) { console.error("Error checking XMTP availability:", error); return false; @@ -76,30 +102,6 @@ export class XMTPClass { } } -export async function XMTP( - onMessage: (message: Message | undefined) => Promise = async () => {}, - config?: xmtpConfig, -): Promise { - const { key, isRandom } = await setupPrivateKey(config?.privateKey); - const { Client } = await import("@xmtp/xmtp-js"); - const user = createUser(key); - - const defaultConfig = { - codecs: [new TextCodec()], - env: config?.env ?? "production", - }; - const client = await Client.create(user.wallet, { - ...defaultConfig, - ...config, - }); - - const xmtp = new XMTPClass(client); - - streamMessages(onMessage, client); - - return xmtp; -} - export async function setupPrivateKey( customKey?: string, ): Promise<{ key: string; isRandom: boolean }> { diff --git a/packages/xmtp/README.md b/packages/xmtp/README.md index beaec7c68..68ba4e31e 100644 --- a/packages/xmtp/README.md +++ b/packages/xmtp/README.md @@ -1,6 +1,6 @@ # XMTP -See [XMTP AI](https://message-kit.org/plugins/xmtp) plugin +> See [XMTP AI](https://message-kit.org/plugins/xmtp) plugin ### Installation diff --git a/packages/xmtp/package.json b/packages/xmtp/package.json index 87d39d367..26e260517 100644 --- a/packages/xmtp/package.json +++ b/packages/xmtp/package.json @@ -1,6 +1,6 @@ { "name": "xmtp", - "version": "0.0.4", + "version": "0.0.5", "license": "MIT", "type": "module", "exports": { diff --git a/packages/xmtp/src/lib/xmtp.ts b/packages/xmtp/src/lib/xmtp.ts index 9e1863768..12b660324 100644 --- a/packages/xmtp/src/lib/xmtp.ts +++ b/packages/xmtp/src/lib/xmtp.ts @@ -24,12 +24,13 @@ import { Attachment, AttachmentCodec, ContentTypeRemoteAttachment, - ContentTypeAttachment, - RemoteAttachment, RemoteAttachmentCodec, } from "@xmtp/content-type-remote-attachment"; import * as fs from "fs"; -import { ReadReceipt, ReadReceiptCodec } from "@xmtp/content-type-read-receipt"; +import { + ContentTypeReadReceipt, + ReadReceiptCodec, +} from "@xmtp/content-type-read-receipt"; import { AgentMessage, AgentMessageCodec, @@ -42,45 +43,88 @@ import { mainnet } from "viem/chains"; import { GrpcApiClient } from "@xmtp/grpc-api-client"; import { getRandomValues } from "crypto"; import path from "path"; -import { xmtpConfig, Message } from "../types.js"; +import { xmtpConfig, Message, userMessage, UserReturnType } from "../types.js"; import { readFile } from "fs/promises"; -interface UserReturnType { - key: string; - account: ReturnType; - wallet: ReturnType; -} -export class XMTPClass { - v2client: V2Client; - client: V3Client; - address: string; - inboxId: string; - message: Message; - - constructor(client: V3Client, v2client: V2Client) { - this.client = client; - this.v2client = v2client; - this.address = client.accountAddress; - this.inboxId = client.inboxId; - this.message = {} as Message; - } - async sendMessage(message: string, receiver?: string) { - await this.send(message, ContentTypeText, receiver ?? undefined); - } - async sendAgentMessage(message: string, metadata: any) { - let agentMessage = new AgentMessage(message, metadata); - await this.send(agentMessage, ContentTypeAgentMessage); +export class XMTP { + v2client: V2Client | undefined; + client: V3Client | undefined; + address: string | undefined; + inboxId: string | undefined; + onMessage: (message: Message | undefined) => Promise; + config?: xmtpConfig; + + constructor( + onMessage: (message: Message | undefined) => Promise, + config?: xmtpConfig, + ) { + this.onMessage = onMessage; + this.config = config; } - async reply(message: string, replyTo: string) { - const reply: Reply = { - content: message, - contentType: ContentTypeText, - reference: replyTo, + + async init(): Promise { + const testKey = await setupTestEncryptionKey(); + const { key, isRandom } = setupPrivateKey(this.config?.privateKey); + const user = createUser(key); + + let env = process.env.XMTP_ENV as XmtpEnv; + if (!env) env = "production" as XmtpEnv; + + let volumePath = + process.env.RAILWAY_VOLUME_MOUNT_PATH ?? + this.config?.path ?? + ".data/xmtp"; + + if (fs && !fs.existsSync(volumePath)) { + fs.mkdirSync(volumePath, { recursive: true }); + } + + const defaultConfig: ClientOptions = { + env: env, + dbPath: `${volumePath}/${user.account?.address.toLowerCase()}-${env}`, + codecs: [ + new TextCodec(), + new ReactionCodec(), + new ReplyCodec(), + new RemoteAttachmentCodec(), + new AttachmentCodec(), + new ReadReceiptCodec(), + new AgentMessageCodec(), + ], }; - await this.send(reply, ContentTypeReply); + + // Merge the default configuration with the provided config. Repeated fields in clientConfig will override the default values + const finalConfig = { ...defaultConfig, ...this.config }; + //v2 + const account2 = privateKeyToAccount(key as `0x${string}`); + const wallet2 = createWalletClient({ + account: account2, + chain: mainnet, + transport: http(), + }); + const v2client = await V2Client.create(wallet2, { + ...finalConfig, + apiUrl: undefined, + skipContactPublishing: false, + apiClientFactory: GrpcApiClient.fromOptions as any, + }); + const client = await V3Client.create( + createSigner(user), + testKey, + finalConfig, + ); + + this.client = client; + this.v2client = v2client; + + Promise.all([ + streamMessages(this.onMessage, client, this), + streamMessages(this.onMessage, v2client, this), + ]); + return this; } - async sendImage(source: string) { + async getAttachment(source: string): Promise { try { let imgArray: Uint8Array; let mimeType: string; @@ -128,7 +172,7 @@ export class XMTPClass { const file = await readFile(source); if (!file) { console.error("File operations not supported in this environment"); - return; + return undefined; } // Check file size @@ -142,53 +186,82 @@ export class XMTPClass { imgArray = new Uint8Array(file); } - const attachment = { + const attachment: Attachment = { filename, mimeType, data: imgArray, }; - - await this.send(attachment, ContentTypeRemoteAttachment); + return attachment; } catch (error) { console.error("Failed to send image:", error); throw error; } } - async react(emoji: string, reference: string) { - let reaction: Reaction = { - content: emoji, - action: "added", - reference: reference, - schema: "unicode", - }; - await this.send(reaction, ContentTypeReaction); - } - async send( - message: - | string - | Reply - | Reaction - | RemoteAttachment - | Attachment - | ReadReceipt - | AgentMessage, - contentType: ContentTypeId, - receiver?: string, - ) { - if (this.message.version == "v2") { + async send(userMessage: userMessage) { + let contentType: + | typeof ContentTypeReaction + | typeof ContentTypeText + | typeof ContentTypeRemoteAttachment + | typeof ContentTypeAgentMessage + | typeof ContentTypeReadReceipt + | typeof ContentTypeReply = ContentTypeText; + + let message: any; + if (!userMessage.typeId || userMessage.typeId === "text") { + message = { + content: userMessage.message, + }; + contentType = ContentTypeText; + } else if (userMessage.typeId === "attachment") { + message = (await this.getAttachment(userMessage.message)) as Attachment; + contentType = ContentTypeRemoteAttachment; + } else if (userMessage.typeId === "reaction") { + message = { + content: userMessage.message, + action: "added", + reference: userMessage.originalMessage?.id, + schema: "unicode", + } as Reaction; + contentType = ContentTypeReaction; + } else if (userMessage.typeId === "reply") { + contentType = ContentTypeReply; + message = { + content: userMessage.message, + contentType: ContentTypeText, + reference: userMessage.originalMessage?.id, + } as Reply; + } else if (userMessage.typeId === "agentMessage") { + message = new AgentMessage( + userMessage.message, + userMessage.metadata, + ) as AgentMessage; + contentType = ContentTypeAgentMessage; + } + + if (userMessage.originalMessage?.version == "v2") { let v2Conversation = await this.getV2ConversationByAddress( - receiver ?? this.message.sender.address, + userMessage.originalMessage.client?.address, ); - await v2Conversation?.send(message, { - contentType: contentType, - }); - } else if (this.message.version == "v3") { - let v3Conversation = await this.client.conversations.getConversationById( - this.message.conversation.id, + + if (!userMessage.receivers || userMessage.receivers.length == 0) { + userMessage.receivers = [userMessage.originalMessage.sender.address]; + } + for (let receiver of userMessage.receivers) { + v2Conversation = await this.getV2ConversationByAddress(receiver); + await v2Conversation?.send(message, { + contentType: contentType, + }); + } + } else if (userMessage.originalMessage?.version == "v3") { + let v3Conversation = await this.client?.conversations.getConversationById( + userMessage.originalMessage?.conversation?.id, ); - if (receiver) { - v3Conversation = await this.client.conversations + if (!userMessage.receivers || userMessage.receivers.length == 0) { + userMessage.receivers = [userMessage.originalMessage.sender.address]; + } + for (let receiver of userMessage.receivers) { + v3Conversation = await this.client?.conversations .list() .then( (conversations) => @@ -197,8 +270,8 @@ export class XMTPClass { conv.dmPeerInboxId.toLowerCase() === receiver.toLowerCase(), ) as V3Conversation, ); + await v3Conversation?.send(message, contentType); } - await v3Conversation?.send(message, contentType); } } @@ -206,7 +279,7 @@ export class XMTPClass { message: V3DecodedMessage | V2DecodedMessage | undefined, ): Promise { return !this.isV2Message(message) - ? ((await this.client.conversations.getConversationById( + ? ((await this.client?.conversations.getConversationById( (message as V3DecodedMessage)?.conversationId as string, )) as V3Conversation) : ((message as V2DecodedMessage)?.conversation as V2Conversation); @@ -221,13 +294,11 @@ export class XMTPClass { ): conversation is V3Conversation { return (conversation as V3Conversation)?.id !== undefined; } - setMessage(message: Message) { - this.message = message as Message; - } + async getV2ConversationByAddress(address: string) { try { - const conversations = await this.v2client.conversations.list(); - return conversations.find( + const conversations = await this.v2client?.conversations.list(); + return conversations?.find( (conv) => conv.peerAddress.toLowerCase() === address.toLowerCase(), ); } catch (error) { @@ -236,21 +307,21 @@ export class XMTPClass { } } - getConversationKey() { - return `${this.message.conversation.id}`; + getConversationKey(message: Message) { + return `${message?.conversation?.id}`; } - getUserConversationKey() { + getUserConversationKey(message: Message) { const awaitingSender = - this.message.version == "v2" - ? this.message.sender.address - : this.message.sender.inboxId; - return `${this.message.conversation.id}:${awaitingSender}`; + message?.version == "v2" + ? message?.sender?.address + : message?.sender?.inboxId; + return `${message?.conversation?.id}:${awaitingSender}`; } async getMessageById(reference: string) { - return this.client.conversations?.getMessageById?.bind( - this.client.conversations, + return this.client?.conversations?.getMessageById?.bind( + this.client?.conversations, )(reference); } @@ -271,74 +342,10 @@ export class XMTPClass { } } -export async function XMTP( - onMessage: (message: Message | undefined) => Promise = async () => {}, // Default to a no-op function - config?: xmtpConfig, -): Promise { - // Check if both clientConfig and privateKey are empty - const testKey = await setupTestEncryptionKey(); - const { key, isRandom } = setupPrivateKey(config?.privateKey); - const user = createUser(key); - - let env = process.env.XMTP_ENV as XmtpEnv; - if (!env) env = "production" as XmtpEnv; - - let volumePath = - process.env.RAILWAY_VOLUME_MOUNT_PATH ?? config?.path ?? ".data/xmtp"; - - if (fs && !fs.existsSync(volumePath)) { - fs.mkdirSync(volumePath, { recursive: true }); - } - - const defaultConfig: ClientOptions = { - env: env, - dbPath: `${volumePath}/${user.account?.address.toLowerCase()}-${env}`, - codecs: [ - new TextCodec(), - new ReactionCodec(), - new ReplyCodec(), - new RemoteAttachmentCodec(), - new AttachmentCodec(), - new ReadReceiptCodec(), - new AgentMessageCodec(), - ], - }; - - // Merge the default configuration with the provided config. Repeated fields in clientConfig will override the default values - const finalConfig = { ...defaultConfig, ...config }; - //v2 - const account2 = privateKeyToAccount(key as `0x${string}`); - const wallet2 = createWalletClient({ - account: account2, - chain: mainnet, - transport: http(), - }); - const v2client = await V2Client.create(wallet2, { - ...finalConfig, - apiUrl: undefined, - skipContactPublishing: false, - apiClientFactory: GrpcApiClient.fromOptions as any, - }); - const client = await V3Client.create( - createSigner(user), - testKey, - finalConfig, - ); - - const xmtp = new XMTPClass(client, v2client); - - Promise.all([ - streamMessages(onMessage, v2client, xmtp), - streamMessages(onMessage, client, xmtp), - ]); - - return xmtp as XMTPClass; -} - async function streamMessages( onMessage: (message: Message | undefined) => Promise, client: V3Client | V2Client, - xmtp: XMTPClass, + xmtp: XMTP, ) { let v3client = client instanceof V3Client ? client : undefined; let v2client = client instanceof V2Client ? client : undefined; @@ -352,7 +359,7 @@ async function streamMessages( await v3client.conversations.sync(); await v3client.conversations.list(); const stream = await v3client.conversations.streamAllMessages(); - console.warn(`\t- [v3] Stream started`); + console.warn(`XMTP: [v3] Stream started`); for await (const message of stream) { let conversation = await xmtp.getConversationFromMessage(message); if (message && conversation) { @@ -371,8 +378,8 @@ async function streamMessages( conversation, client, ); - xmtp.setMessage(parsedMessage as Message); - onMessage(parsedMessage as Message); + //xmtp.setMessage(parsedMessage as Message); + await onMessage(parsedMessage as Message); } catch (e) { console.log(`error`, e); } @@ -383,7 +390,7 @@ async function streamMessages( typeof v2client.conversations.streamAllMessages === "function" ) { const stream = await v2client.conversations.streamAllMessages(); - console.warn(`\t- [v2] Stream started`); + console.warn(`XMTP: [v2] Stream started`); for await (const message of stream) { let conversation = await xmtp.getConversationFromMessage(message); if (message && conversation) { @@ -401,8 +408,8 @@ async function streamMessages( conversation, client, ); - xmtp.setMessage(parsedMessage as Message); - onMessage(parsedMessage as Message); + //xmtp.setMessage(parsedMessage as Message); + await onMessage(parsedMessage as Message); } catch (e) { console.log(`error`, e); } diff --git a/packages/xmtp/src/types.ts b/packages/xmtp/src/types.ts index e7af7ef8c..502e1fcc9 100644 --- a/packages/xmtp/src/types.ts +++ b/packages/xmtp/src/types.ts @@ -2,11 +2,27 @@ import { privateKeyToAccount } from "viem/accounts"; import { createWalletClient } from "viem"; import { ClientOptions } from "@xmtp/node-sdk"; +export type userMessage = { + message: string; + originalMessage: Message; + metadata?: any; + receivers?: string[]; + typeId?: + | "text" + | "image" + | "reaction" + | "reply" + | "attachment" + | "readReceipt" + | "agentMessage"; +}; + export interface UserReturnType { key: string; account: ReturnType; wallet: ReturnType; } + export type xmtpConfig = { privateKey?: string; path?: string; diff --git a/templates/ens/example_prompt.md b/templates/ens/example_prompt.md index 0731c5066..75c1ef374 100644 --- a/templates/ens/example_prompt.md +++ b/templates/ens/example_prompt.md @@ -13,14 +13,14 @@ You are a helpful agent called @bot that lives inside a web3 messaging app calle - Do not make guesses or assumptions - Only answer if the verified information is in the prompt. - Focus only on helping users with operations detailed below. -- Date: Sat, 21 Dec 2024 19:32:56 GMT, +- Date: Sun, 22 Dec 2024 17:48:39 GMT, ## User context - Start by fetch their domain from or Converse username - Call the user by their name or domain, in case they have one - Ask for a name (if they don't have one) so you can suggest domains. -- Message sent date: 2024-12-21T19:33:09.736Z +- Message sent date: 2024-12-22T17:49:59.299Z - Users address is: 0x40f08f0f853d1c42c61815652b7ccd5a50f0be09 - Users name is: ArizonaOregon - Converse username is: ArizonaOregon From 553bdd92a78fbb6fd9e9fb6890a274665633ed1e Mon Sep 17 00:00:00 2001 From: fabri Date: Mon, 23 Dec 2024 15:17:13 -0300 Subject: [PATCH 12/19] refactor --- README.md | 8 +- packages/client/src/components/Chat.tsx | 18 +- packages/docs/pages/plugins/framekit.mdx | 29 ++- packages/docs/pages/plugins/stackso.mdx | 14 +- packages/docs/pages/plugins/xmtp.mdx | 35 ++- packages/docs/pages/skills/concierge.mdx | 31 ++- packages/docs/pages/templates/simple.mdx | 10 +- ....timestamp-1734972589941-faf7cf2428c66.mjs | 182 ++++++++++++++++ ...sx.timestamp-1734972589960-8ba90b016df.mjs | 0 packages/message-kit/src/lib/core.ts | 3 - packages/message-kit/src/lib/skills.ts | 3 - packages/message-kit/src/plugins/baselinks.ts | 36 +-- packages/message-kit/src/plugins/gpt.ts | 2 - packages/message-kit/src/skills/concierge.ts | 30 +-- packages/message-kit/tests/utils.ts | 2 +- packages/xmtp-web/README.md | 6 +- packages/xmtp-web/package.json | 6 + packages/xmtp-web/rollup.config.js | 5 + .../src/content-types/agent-message.ts | 64 ++++++ packages/xmtp-web/src/index.ts | 1 + packages/xmtp-web/src/lib/parse.ts | 127 +++++++++-- packages/xmtp-web/src/lib/xmtp.ts | 206 ++++++++++++++---- packages/xmtp-web/src/types.ts | 18 +- packages/xmtp/README.md | 9 +- packages/xmtp/src/lib/parse.ts | 19 +- packages/xmtp/src/lib/xmtp.ts | 11 +- packages/xmtp/tests/Client.test.ts | 19 +- templates/ens/src/skills/pay.ts | 8 +- templates/faucet/src/skills/faucet.ts | 48 ++-- templates/gated-group/src/index.ts | 8 +- .../gated-group/src/plugins/xmtp-groups.ts | 26 +-- templates/gated-group/src/skills/gated.ts | 15 +- templates/gm/src/index.ts | 2 +- templates/hackathon-store/src/index.ts | 6 +- .../payroll-agent/src/plugins/payroll.ts | 45 ++-- templates/playground/src/skills/broadcast.ts | 29 ++- templates/playground/src/skills/cash.ts | 46 ++-- templates/playground/src/skills/dalle.ts | 6 +- templates/playground/src/skills/drip.ts | 45 ++-- templates/playground/src/skills/mint.ts | 26 ++- templates/playground/src/skills/pay.ts | 4 +- templates/playground/src/skills/swap.ts | 9 +- templates/playground/src/skills/todo.ts | 35 ++- templates/playground/src/skills/token.ts | 14 +- templates/playground/src/skills/wordle.ts | 36 ++- templates/toss/src/plugins/helpers.ts | 38 +++- templates/toss/src/skills/toss.ts | 139 +++++++++--- yarn.lock | 6 + 48 files changed, 1118 insertions(+), 367 deletions(-) create mode 100644 packages/docs/vocs.config.tsx.timestamp-1734972589941-faf7cf2428c66.mjs create mode 100644 packages/docs/vocs.config.tsx.timestamp-1734972589960-8ba90b016df.mjs create mode 100644 packages/xmtp-web/src/content-types/agent-message.ts diff --git a/README.md b/README.md index 8336e6c14..8bc904742 100644 --- a/README.md +++ b/README.md @@ -12,13 +12,13 @@ A set of tools for AI developers to build on top of [XMTP](https://xmtp.org) ### Plugins -- [`xmtp`](/packages/xmtp/): A node js wrapper for AI agents. -- [`xmtp-web`](/packages/xmtp-web/): A client plugin for interacting with hte backend. +- [`xmtp`](/packages/xmtp/): An xmtp node js wrapper for AI agents. +- [`xmtp-web`](/packages/xmtp-web/): A js wrapper for AI agents. ### Other -- [`client`](/packages/client): A suite for backend frames -- [`baselinks`](/packages/baselinks): A suite for backend frames +- [`client`](/packages/client): A simple E2EE encrypted agent inbox +- [`baselinks`](/packages/baselinks): A suite of coinbase wallet usdc links ## Contributing diff --git a/packages/client/src/components/Chat.tsx b/packages/client/src/components/Chat.tsx index 2f4d04380..1c2869399 100644 --- a/packages/client/src/components/Chat.tsx +++ b/packages/client/src/components/Chat.tsx @@ -83,7 +83,12 @@ function Chat({ user }: { user: UserInfo }) { try { console.log("Sending message:", newMessage); - const message = await xmtp.sendMessage(newMessage, user.address); + const message = (await xmtp.send({ + message: newMessage, + receivers: [recipientInfo.address], + originalMessage: undefined, + })) as Message; + console.log("message", message); setMessages((prevMessages) => [...prevMessages, message]); setNewMessage(""); @@ -128,11 +133,14 @@ function Chat({ user }: { user: UserInfo }) { } }, []); - const renderMessageContent = (text: string) => { + const renderMessageContent = (message: Message) => { const urlRegex = /(https?:\/\/[^\s]+)/g; - const parts = text?.split(urlRegex); + //only strings + const textContent = + typeof message.content?.text === "string" ? message.content.text : ""; - return parts.map((part, index) => { + const parts = textContent.split(urlRegex); + return parts?.map((part, index) => { if (urlRegex.test(part)) { try { const urlType = getUrlType(part); @@ -217,7 +225,7 @@ function Chat({ user }: { user: UserInfo }) { ? "Agent" : "Human"} - {renderMessageContent(msg.content?.text as string)} + {renderMessageContent(msg)}
))}
diff --git a/packages/docs/pages/plugins/framekit.mdx b/packages/docs/pages/plugins/framekit.mdx index e56341931..2c7550b84 100644 --- a/packages/docs/pages/plugins/framekit.mdx +++ b/packages/docs/pages/plugins/framekit.mdx @@ -12,10 +12,13 @@ You can request payments using the payment frame: ```typescript // Request 1 USDC payment to a specific address -const url = await baselinks.requestPayment(recipientAddress, 1); +const url = baselinks.paymentLink(recipientAddress, 1); // Send the url to the user -await context.send(url); +await context.send({ + message: url, + originalMessage: context.message, +}); ``` ## Wallet details @@ -24,12 +27,15 @@ You can send agent wallet info using the `sendWallet` method: ```typescript // Send agent wallet info -const url = await baselinks.sendWallet( +const url = baselinks.walletDetails( "0x93E2fc3e99dFb1238eB9e0eF2580EFC5809C7204", ); // Send the url to the user -await context.send(url); +await context.send({ + message: url, + originalMessage: context.message, +}); ``` Properties: @@ -44,10 +50,13 @@ You can request receipts using the receipt frame: ```typescript // Request a receipt -const url = await baselinks.sendReceipt(urlOfTransaction); +const url = baselinks.receiptLink(urlOfTransaction); // Send the url to the user -await context.send(url); +await context.send({ + message: url, + originalMessage: context.message, +}); ``` Properties: @@ -62,5 +71,11 @@ Coinbase does not render frames but you can deeplink into other users inside the ```typescript // Send a message to a user with an optional pretext -await context.coinbaseLink(userAddress); +const url = await context.coinbaseLink(userAddress); + +// Send the url to the user +await context.send({ + message: url, + originalMessage: context.message, +}); ``` diff --git a/packages/docs/pages/plugins/stackso.mdx b/packages/docs/pages/plugins/stackso.mdx index 96407d4df..3a82562a2 100644 --- a/packages/docs/pages/plugins/stackso.mdx +++ b/packages/docs/pages/plugins/stackso.mdx @@ -55,7 +55,11 @@ export async function handler(context: Context, fake?: boolean) { if (text) { if (skill === "points") { const points = await stack?.getPoints(sender.address); - context.reply(`You have ${points} points`); + context.send({ + message: `You have ${points} points`, + originalMessage: context.message, + typeId: "reply", + }); return; } else if (skill === "leaderboard") { const leaderboard = await stack?.getLeaderboard(); @@ -68,9 +72,11 @@ export async function handler(context: Context, fake?: boolean) { )}...${entry.address.slice(-4)}`}, Points: ${entry.points}`, ) .join("\n"); - context.reply( - `Leaderboard:\n\n${formattedLeaderboard}\n\nCheck out the public leaderboard\nhttps://www.stack.so/leaderboard/degen-group`, - ); + context.send({ + message: `Leaderboard:\n\n${formattedLeaderboard}\n\nCheck out the public leaderboard\nhttps://www.stack.so/leaderboard/degen-group`, + originalMessage: context.message, + typeId: "reply", + }); return; } } else if (typeId === "group_updated") { diff --git a/packages/docs/pages/plugins/xmtp.mdx b/packages/docs/pages/plugins/xmtp.mdx index 15b46feba..185cbfa60 100644 --- a/packages/docs/pages/plugins/xmtp.mdx +++ b/packages/docs/pages/plugins/xmtp.mdx @@ -35,14 +35,19 @@ This is how you can use the `xmtp` package to create a client and handle message ```tsx import { XMTP } from "xmtp"; -const xmtp = await XMTP(onMessage, { +const xmtp = new XMTP(onMessage, { encryptionKey: process.env.WALLET_PRIVATE_KEY, }); +await xmtp.init(); + const onMessage = async (message, user) => { console.log(`Decoded message: ${message.content.text} by ${user.address}`); // Your AI model response - await xmtp.sendMessage(response, user.address); + await xmtp.send({ + message: response, + originalMessage: message, + }); }; ``` @@ -61,9 +66,10 @@ const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY, }); -const xmtp = await XMTP(onMessage, { +const xmtp = new XMTP(onMessage, { encryptionKey: process.env.LOCAL_KEY, }); +await xmtp.init(); const onMessage = async (message, user) => { console.log(`Decoded message: ${response} by ${user}`); @@ -83,7 +89,10 @@ const onMessage = async (message, user) => { const response = response.data.choices[0].message.content.trim(); // Send the AI-generated response back to the XMTP network - xmtp.send(response); + xmtp.send({ + message: response, + originalMessage: message, + }); }; ``` @@ -104,9 +113,10 @@ bun install xmtp-web ```tsx import { XMTP, Message } from "xmtp-web"; -const xmtp = await XMTP(onMessage, { +const xmtp = new XMTP(onMessage, { encryptionKey: process.env.LOCAL_KEY, }); +await xmtp.init(); const onSend = async (text) => { return message; @@ -115,7 +125,10 @@ const onSend = async (text) => { const onMessage = async (message, user) => { console.log(`Decoded message: ${message} by ${user.address}`); let response; // Your ai model response - await xmtp.sendMessage(response, user.address); + await xmtp.send({ + message: response, + originalMessage: message, + }); }; ``` @@ -124,7 +137,7 @@ const onMessage = async (message, user) => { This is how you can use the `xmtp-web` package to create a client and handle messages. ```tsx -import { createClient, XMTP, Message } from "xmtp-web"; +import { XMTP, Message } from "xmtp-web"; // ... other imports ... function Chat({ user }: { user: UserInfo }) { @@ -160,9 +173,10 @@ function Chat({ user }: { user: UserInfo }) { const initXmtp = async (wallet: any) => { try { - const xmtpClient = await createClient(onMessage, { + const xmtpClient = new XMTP(onMessage, { privateKey: wallet.privateKey, }); + await xmtpClient.init(); setXmtp(xmtpClient); setIsLoading(false); } catch (error) { @@ -176,7 +190,10 @@ function Chat({ user }: { user: UserInfo }) { if (!xmtp || !newMessage || !recipientInfo?.address) return; try { - const message = await xmtp.sendMessage(newMessage, user.address); + const message = await xmtp.send({ + message: newMessage, + receivers: [recipientInfo.address], + }); setMessages((prevMessages) => [...prevMessages, message]); setNewMessage(""); } catch (error) { diff --git a/packages/docs/pages/skills/concierge.mdx b/packages/docs/pages/skills/concierge.mdx index c9461c956..43657c605 100644 --- a/packages/docs/pages/skills/concierge.mdx +++ b/packages/docs/pages/skills/concierge.mdx @@ -24,7 +24,10 @@ The concierge will respond with your current balance. // Balance checking implementation if (skill === "balance") { const { balance } = await walletService.checkBalance(sender.address); - await context.send(`Your agent wallet has a balance of $${balance}`); + await context.send({ + message: `Your agent wallet has a balance of $${balance}`, + originalMessage: context.message, + }); } ``` @@ -46,7 +49,6 @@ async function fund(context: Context, amount: number) { message: "You have maxed out your funds. Max 10 USDC.", receivers: [context.message.sender.address], originalMessage: context.message, - typeId: "text", }); return false; } @@ -55,12 +57,15 @@ async function fund(context: Context, amount: number) { amount, walletData.agent_address, ); - const url = await baselinks.requestPayment( + const url = baselinks.paymentLink( walletData.agent_address, amount, onRamp ? onRampURL : undefined, ); - await context.send(url); + await context.send({ + message: url, + originalMessage: context.message, + }); } ``` @@ -79,13 +84,18 @@ The concierge will execute the transfer. if (skill === "transfer") { const { balance } = await walletService.checkBalance(sender.address); if (balance === 0) { - await context.reply("You have no funds to transfer."); + await context.send({ + message: "You have no funds to transfer.", + originalMessage: context.message, + typeId: "reply", + }); return; } - await context.send( - `Transferring ${amount} USDC to ${recipient?.preferredName}`, - ); + await context.send({ + message: `Transferring ${amount} USDC to ${recipient?.preferredName}`, + originalMessage: context.message, + }); const tx = await walletService.transfer( sender.address, recipient?.address as string, @@ -108,7 +118,10 @@ The concierge will execute the swap. // Swap implementation if (skill === "swap") { await walletService.swap(sender.address, fromToken, toToken, amount); - await context.send("Swap completed"); + await context.send({ + message: "Swap completed", + originalMessage: context.message, + }); return; } ``` diff --git a/packages/docs/pages/templates/simple.mdx b/packages/docs/pages/templates/simple.mdx index 1d9183976..b88fa750a 100644 --- a/packages/docs/pages/templates/simple.mdx +++ b/packages/docs/pages/templates/simple.mdx @@ -53,10 +53,16 @@ onMessage: async (context: Context) => { }); const apiData = response.data; //Return the agent framework with the response - await context.send(response.data); + await context.send({ + message: apiData, + originalMessage: context.message, + }); } catch (error) { console.error("Error fetching data from API:", error); - await context.send("An error occurred while fetching data from the API."); + await context.send({ + message: "An error occurred while fetching data from the API.", + originalMessage: context.message, + }); } }; ``` diff --git a/packages/docs/vocs.config.tsx.timestamp-1734972589941-faf7cf2428c66.mjs b/packages/docs/vocs.config.tsx.timestamp-1734972589941-faf7cf2428c66.mjs new file mode 100644 index 000000000..ddb5b0f86 --- /dev/null +++ b/packages/docs/vocs.config.tsx.timestamp-1734972589941-faf7cf2428c66.mjs @@ -0,0 +1,182 @@ +// vocs.config.tsx +import { defineConfig } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/vocs/_lib/index.js"; +import { Fragment, jsx, jsxs } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/react/jsx-runtime.js"; +var vocs_config_default = defineConfig({ + head: () => { + return /* @__PURE__ */ jsxs(Fragment, { children: [ + /* @__PURE__ */ jsx("meta", { charSet: "utf-8" }), + /* @__PURE__ */ jsx("meta", { name: "viewport", content: "width=device-width" }), + /* @__PURE__ */ jsx("meta", { property: "og:title", content: "MessageKit" }), + /* @__PURE__ */ jsx("meta", { property: "og:image", content: "https://message-kit.org/hero.jpg" }), + /* @__PURE__ */ jsx("meta", { property: "fc:frame", content: "vNext" }), + /* @__PURE__ */ jsx("meta", { property: "of:version", content: "vNext" }), + /* @__PURE__ */ jsx("meta", { property: "of:accepts:xmtp", content: "vNext" }), + /* @__PURE__ */ jsx("meta", { property: "of:image", content: "https://message-kit.org/hero.jpg" }), + /* @__PURE__ */ jsx( + "meta", + { + property: "fc:frame:image", + content: "https://message-kit.org/hero.jpg" + } + ), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1", content: "Docs" }), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1:action", content: "link" }), + /* @__PURE__ */ jsx( + "meta", + { + property: "fc:frame:button:1:target", + content: "https://message-kit.org/" + } + ), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2", content: "Drop a \u2B50\uFE0F" }), + /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2:action", content: "link" }), + /* @__PURE__ */ jsx( + "meta", + { + property: "fc:frame:button:2:target", + content: "https://github.com/ephemeraHQ/message-kit" + } + ), + /* @__PURE__ */ jsx("meta", { property: "og:site_name", content: "MessageKit" }), + /* @__PURE__ */ jsx("meta", { name: "twitter:card", content: "summary_large_image" }), + /* @__PURE__ */ jsx("meta", { name: "twitter:site", content: "@MessageKit" }), + /* @__PURE__ */ jsx("meta", { name: "twitter:title", content: "MessageKit" }), + /* @__PURE__ */ jsx( + "meta", + { + name: "twitter:description", + content: "MessageKit is a powerful tool for managing your messages." + } + ), + /* @__PURE__ */ jsx("meta", { name: "twitter:image", content: "https://message-kit.org/hero.jpg" }), + /* @__PURE__ */ jsx( + "script", + { + src: "https://plausible.io/js/script.outbound-links.js", + "data-domain": "message-kit.org", + defer: true + } + ) + ] }); + }, + ogImageUrl: { + "/": "/hero.jpg", + "/docs": "/hero.jpg" + }, + title: "MessageKit", + rootDir: ".", + iconUrl: { + light: "/messagekit-logo.png", + dark: "/messagekit-logo.png" + }, + theme: { + accentColor: { + light: "#FA6977", + dark: "#FA6977" + } + }, + socials: [ + { + icon: "github", + link: "https://github.com/ephemeraHQ/message-kit" + } + ], + topNav: [{ text: "Changelog", link: "/changelog" }], + editLink: { + pattern: "https://github.com/ephemeraHQ/message-kit/blob/main/packages/docs/pages/:path", + text: "Suggest changes to this page" + }, + sidebar: [ + { + text: "Quickstart", + link: "/quickstart" + }, + { + text: "UX", + items: [ + { + text: "Concierge", + link: "/skills/concierge" + }, + { + text: "Frames", + link: "/ux/frames" + }, + { + text: "Wallet service", + link: "/ux/wallet-service" + }, + { + text: "Groups", + link: "/ux/groups" + } + ] + }, + { + text: "Community", + items: [ + { + text: "Skills", + link: "/community/skills" + }, + { + text: "Plugins", + link: "/community/plugins" + }, + { + text: "Templates", + link: "/community/templates" + }, + { + text: "Vibes", + link: "/community/vibes" + }, + { + text: "Projects", + link: "/community/projects" + } + ] + }, + { + text: "Fundations", + items: [ + { + text: "Agents", + link: "/concepts/agents" + }, + { + text: "Skills", + link: "/concepts/skills" + }, + { + text: "XMTP", + link: "/concepts/xmtp" + }, + { + text: "Usernames", + link: "/plugins/resolver" + } + ] + }, + { + text: "Contribute", + link: "/contribute" + }, + { + text: "Deployment", + link: "/deployment" + }, + { + text: "Guidelines", + link: "/guidelines" + }, + { + text: "Changelog", + link: "/changelog" + } + ] +}); +export { + vocs_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidm9jcy5jb25maWcudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwidm9jc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBoZWFkOiAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxtZXRhIGNoYXJTZXQ9XCJ1dGYtOFwiIC8+XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGhcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOnRpdGxlXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOmltYWdlXCIgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZVwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6dmVyc2lvblwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6YWNjZXB0czp4bXRwXCIgY29udGVudD1cInZOZXh0XCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJvZjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTppbWFnZVwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCJcbiAgICAgICAgLz5cblxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxXCIgY29udGVudD1cIkRvY3NcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOmFjdGlvblwiIGNvbnRlbnQ9XCJsaW5rXCIgLz5cbiAgICAgICAgPG1ldGFcbiAgICAgICAgICBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOnRhcmdldFwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL1wiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MlwiIGNvbnRlbnQ9XCJEcm9wIGEgXHUyQjUwXHVGRTBGXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MjphY3Rpb25cIiBjb250ZW50PVwibGlua1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246Mjp0YXJnZXRcIlxuICAgICAgICAgIGNvbnRlbnQ9XCJodHRwczovL2dpdGh1Yi5jb20vZXBoZW1lcmFIUS9tZXNzYWdlLWtpdFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2c6c2l0ZV9uYW1lXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpjYXJkXCIgY29udGVudD1cInN1bW1hcnlfbGFyZ2VfaW1hZ2VcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpzaXRlXCIgY29udGVudD1cIkBNZXNzYWdlS2l0XCIgLz5cbiAgICAgICAgPG1ldGEgbmFtZT1cInR3aXR0ZXI6dGl0bGVcIiBjb250ZW50PVwiTWVzc2FnZUtpdFwiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgbmFtZT1cInR3aXR0ZXI6ZGVzY3JpcHRpb25cIlxuICAgICAgICAgIGNvbnRlbnQ9XCJNZXNzYWdlS2l0IGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgbWFuYWdpbmcgeW91ciBtZXNzYWdlcy5cIlxuICAgICAgICAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxzY3JpcHRcbiAgICAgICAgICBzcmM9XCJodHRwczovL3BsYXVzaWJsZS5pby9qcy9zY3JpcHQub3V0Ym91bmQtbGlua3MuanNcIlxuICAgICAgICAgIGRhdGEtZG9tYWluPVwibWVzc2FnZS1raXQub3JnXCJcbiAgICAgICAgICBkZWZlclxuICAgICAgICAvPlxuICAgICAgPC8+XG4gICAgKTtcbiAgfSxcbiAgb2dJbWFnZVVybDoge1xuICAgIFwiL1wiOiBcIi9oZXJvLmpwZ1wiLFxuICAgIFwiL2RvY3NcIjogXCIvaGVyby5qcGdcIixcbiAgfSxcbiAgdGl0bGU6IFwiTWVzc2FnZUtpdFwiLFxuICByb290RGlyOiBcIi5cIixcbiAgaWNvblVybDoge1xuICAgIGxpZ2h0OiBcIi9tZXNzYWdla2l0LWxvZ28ucG5nXCIsXG4gICAgZGFyazogXCIvbWVzc2FnZWtpdC1sb2dvLnBuZ1wiLFxuICB9LFxuICB0aGVtZToge1xuICAgIGFjY2VudENvbG9yOiB7XG4gICAgICBsaWdodDogXCIjRkE2OTc3XCIsXG4gICAgICBkYXJrOiBcIiNGQTY5NzdcIixcbiAgICB9LFxuICB9LFxuICBzb2NpYWxzOiBbXG4gICAge1xuICAgICAgaWNvbjogXCJnaXRodWJcIixcbiAgICAgIGxpbms6IFwiaHR0cHM6Ly9naXRodWIuY29tL2VwaGVtZXJhSFEvbWVzc2FnZS1raXRcIixcbiAgICB9LFxuICBdLFxuICB0b3BOYXY6IFt7IHRleHQ6IFwiQ2hhbmdlbG9nXCIsIGxpbms6IFwiL2NoYW5nZWxvZ1wiIH1dLFxuICBlZGl0TGluazoge1xuICAgIHBhdHRlcm46XG4gICAgICBcImh0dHBzOi8vZ2l0aHViLmNvbS9lcGhlbWVyYUhRL21lc3NhZ2Uta2l0L2Jsb2IvbWFpbi9wYWNrYWdlcy9kb2NzL3BhZ2VzLzpwYXRoXCIsXG4gICAgdGV4dDogXCJTdWdnZXN0IGNoYW5nZXMgdG8gdGhpcyBwYWdlXCIsXG4gIH0sXG4gIHNpZGViYXI6IFtcbiAgICB7XG4gICAgICB0ZXh0OiBcIlF1aWNrc3RhcnRcIixcbiAgICAgIGxpbms6IFwiL3F1aWNrc3RhcnRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiVVhcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkNvbmNpZXJnZVwiLFxuICAgICAgICAgIGxpbms6IFwiL3NraWxscy9jb25jaWVyZ2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiRnJhbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZnJhbWVzXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIldhbGxldCBzZXJ2aWNlXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvd2FsbGV0LXNlcnZpY2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiR3JvdXBzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZ3JvdXBzXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJDb21tdW5pdHlcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlNraWxsc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUGx1Z2luc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9wbHVnaW5zXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlRlbXBsYXRlc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS90ZW1wbGF0ZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVmliZXNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvdmliZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUHJvamVjdHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvcHJvamVjdHNcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkZ1bmRhdGlvbnNcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkFnZW50c1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL2FnZW50c1wiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJTa2lsbHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb25jZXB0cy9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiWE1UUFwiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL3htdHBcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVXNlcm5hbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvcGx1Z2lucy9yZXNvbHZlclwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ29udHJpYnV0ZVwiLFxuICAgICAgbGluazogXCIvY29udHJpYnV0ZVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJEZXBsb3ltZW50XCIsXG4gICAgICBsaW5rOiBcIi9kZXBsb3ltZW50XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkd1aWRlbGluZXNcIixcbiAgICAgIGxpbms6IFwiL2d1aWRlbGluZXNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ2hhbmdlbG9nXCIsXG4gICAgICBsaW5r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 diff --git a/packages/docs/vocs.config.tsx.timestamp-1734972589960-8ba90b016df.mjs b/packages/docs/vocs.config.tsx.timestamp-1734972589960-8ba90b016df.mjs new file mode 100644 index 000000000..e69de29bb diff --git a/packages/message-kit/src/lib/core.ts b/packages/message-kit/src/lib/core.ts index 255de8395..ef9820bc7 100644 --- a/packages/message-kit/src/lib/core.ts +++ b/packages/message-kit/src/lib/core.ts @@ -235,7 +235,6 @@ export class MessageKit implements Context { await context.send({ message: result.message, originalMessage: context.message, - typeId: "text", }); } } @@ -266,7 +265,6 @@ export class MessageKit implements Context { await this.send({ message: `${prompt}`, originalMessage: this.message, - typeId: "text", }); let attemptCount = 0; attempts = attempts ?? 2; @@ -307,7 +305,6 @@ export class MessageKit implements Context { await this.send({ message: `Invalid response "${text}". Please respond with one of: ${validResponses.join(", ")}. Attempts remaining: ${attempts - attemptCount}`, originalMessage: this.message, - typeId: "text", }); return false; }; diff --git a/packages/message-kit/src/lib/skills.ts b/packages/message-kit/src/lib/skills.ts index 071fc4b72..8e39c87b5 100644 --- a/packages/message-kit/src/lib/skills.ts +++ b/packages/message-kit/src/lib/skills.ts @@ -83,7 +83,6 @@ export async function executeSkill( message: text, receivers: [context.message.sender.address], originalMessage: context.message, - typeId: "text", }); } else if (text.startsWith("/") || text.startsWith("@")) { console.warn("Skill not valid", text); @@ -92,7 +91,6 @@ export async function executeSkill( message: text, receivers: [context.message.sender.address], originalMessage: context.message, - typeId: "text", }); } catch (error) { if (error instanceof Error) { @@ -337,7 +335,6 @@ export async function filterMessage(context: Context): Promise<{ message: "Memory cleared", originalMessage: context.message, - typeId: "text", }); return { isMessageValid: false, customHandler: undefined }; } diff --git a/packages/message-kit/src/plugins/baselinks.ts b/packages/message-kit/src/plugins/baselinks.ts index 5a2075a72..f019d5b54 100644 --- a/packages/message-kit/src/plugins/baselinks.ts +++ b/packages/message-kit/src/plugins/baselinks.ts @@ -12,68 +12,56 @@ const framesUrl = : "https://baselinks.vercel.app"; export class baselinks { - static async sendWallet( + static walletDetails( ownerAddress: string, agentAddress: string, balance: number, - ): Promise { + ): string { let url = `${framesUrl}/wallet?agentAddress=${agentAddress}&ownerAddress=${ownerAddress}&balance=${balance}`; return url; } - static async coinbaseLink(address: string): Promise { + static coinbaseLink(address: string): string { let url = `${framesUrl}/coinbase?address=${address}`; return url; } - static async requestPayment( - to: string = "humanagent.eth", + static paymentLink( + toAddress: string = "0x0000000000000000000000000000000000000000", amount: number = 0.01, onRampURL?: string, - ): Promise { - let senderInfo = await getUserInfo(to); - if (!senderInfo) { - console.error("Failed to get sender info"); - return ""; - } - - let sendUrl = `${framesUrl}/payment?amount=${amount}&recipientAddress=${senderInfo?.address}`; + ): string { + let sendUrl = `${framesUrl}/payment?amount=${amount}&recipientAddress=${toAddress}`; if (onRampURL) { sendUrl = sendUrl + "&onRampURL=" + encodeURIComponent(onRampURL); } return sendUrl; } - static async sendReceipt(txLink: string, amount: number): Promise { + static receiptLink(txLink: string, amount: number): string { if (!txLink) return ""; let receiptUrl = `${framesUrl}/receipt?txLink=${txLink}&amount=${amount}`; return receiptUrl; } - static async sendCoinbaseDMLink( - address: string, - amount: number, - ): Promise { + static coinbaseDMLink(address: string, amount: number): string { let url = `${framesUrl}/coinbase?address=${address}&amount=${amount}`; return url; } - static async converseLink(peer: string, pretext?: string): Promise { + static converseLink(peer: string, pretext?: string): string { let url = `https://converse.xyz/dm/${peer}`; if (pretext) url += `&pretext=${encodeURIComponent(pretext)}`; return url; } - static async converseGroup( - groupId: string, - pretext?: string, - ): Promise { + static converseGroupLink(groupId: string, pretext?: string): string { let url = `https://converse.xyz/group/${groupId}`; if (pretext) url += `&pretext=${encodeURIComponent(pretext)}`; return url; } - static async sendCustomFrame(frame: Frame): Promise { + static customFrame(frame: Frame): string { const params = new URLSearchParams(); for (const [key, value] of Object.entries(frame)) { params.append( diff --git a/packages/message-kit/src/plugins/gpt.ts b/packages/message-kit/src/plugins/gpt.ts index 692726e63..314f4e6a9 100644 --- a/packages/message-kit/src/plugins/gpt.ts +++ b/packages/message-kit/src/plugins/gpt.ts @@ -355,7 +355,6 @@ export async function processMultilineResponse( message: msg, receivers: [context.message.sender.address], originalMessage: context.message, - typeId: "text", }); } } else { @@ -364,7 +363,6 @@ export async function processMultilineResponse( message: message, receivers: [context.message.sender.address], originalMessage: context.message, - typeId: "text", }); } } diff --git a/packages/message-kit/src/skills/concierge.ts b/packages/message-kit/src/skills/concierge.ts index 1e3e5c14b..0aaf194a3 100644 --- a/packages/message-kit/src/skills/concierge.ts +++ b/packages/message-kit/src/skills/concierge.ts @@ -109,7 +109,6 @@ export async function handleWallet(context: Context) { message: "Im your personal assistant. How can I help you today?", originalMessage: context.message, - typeId: "text", }); } else if (skill === "address") { const walletExist = await walletService.getWallet(sender.address); @@ -119,9 +118,8 @@ export async function handleWallet(context: Context) { message: "Your agent wallet address", originalMessage: context.message, - typeId: "text", }); - const url = await baselinks.sendWallet( + const url = baselinks.walletDetails( walletExist.address, walletExist.agent_address, balance, @@ -130,7 +128,6 @@ export async function handleWallet(context: Context) { message: url, originalMessage: context.message, - typeId: "text", }); return; } @@ -138,7 +135,6 @@ export async function handleWallet(context: Context) { message: "You don't have an agent wallet.", originalMessage: context.message, - typeId: "text", }); } else if (skill === "balance") { const { balance } = await walletService.checkBalance(sender.address); @@ -146,7 +142,6 @@ export async function handleWallet(context: Context) { message: `Your agent wallet has a balance of $${balance}`, originalMessage: context.message, - typeId: "text", }); } else if (skill === "fund") { await fund(context, amount); @@ -160,7 +155,6 @@ export async function handleWallet(context: Context) { message: "You have no funds to transfer.", originalMessage: context.message, - typeId: "text", }); return; } @@ -170,7 +164,6 @@ export async function handleWallet(context: Context) { message: "User not found.", originalMessage: context.message, - typeId: "text", }); return; } @@ -178,7 +171,6 @@ export async function handleWallet(context: Context) { message: `Swapping ${amount} ${fromToken} to ${toToken}`, originalMessage: context.message, - typeId: "text", }); const swap = await walletService.swap( sender.address, @@ -190,7 +182,6 @@ export async function handleWallet(context: Context) { message: `Swap completed successfully`, originalMessage: context.message, - typeId: "text", }); } else if (skill === "transfer") { const { balance } = await walletService.checkBalance(sender.address); @@ -199,7 +190,6 @@ export async function handleWallet(context: Context) { message: "You have no funds to transfer.", originalMessage: context.message, - typeId: "text", }); return; } @@ -209,7 +199,6 @@ export async function handleWallet(context: Context) { message: "User not found.", originalMessage: context.message, - typeId: "text", }); return; } @@ -217,7 +206,6 @@ export async function handleWallet(context: Context) { message: `Transferring ${amount} USDC to ${recipient?.preferredName}`, originalMessage: context.message, - typeId: "text", }); const tx = await walletService.transfer( sender.address, @@ -247,10 +235,9 @@ async function notifyUser( message: `Transfer completed successfully`, receivers: [context.message.sender.address], originalMessage: context.message, - typeId: "text", }); if ((await transaction.getTransactionHash()) !== undefined) { - const url = await baselinks.sendReceipt( + const url = baselinks.receiptLink( `https://basescan.org/tx/${await transaction.getTransactionHash()}`, amount, ); @@ -258,10 +245,9 @@ async function notifyUser( message: url, receivers: [context.message.sender.address], originalMessage: context.message, - typeId: "text", }); } else if ((await transaction.getTransaction()) !== undefined) { - const url = await baselinks.sendReceipt( + const url = baselinks.receiptLink( `https://basescan.org/tx/${await transaction.getTransaction()}`, amount, ); @@ -269,7 +255,6 @@ async function notifyUser( message: url, receivers: [context.message.sender.address], originalMessage: context.message, - typeId: "text", }); } } @@ -277,7 +262,6 @@ async function notifyUser( message: `Your balance was deducted by $${amount}`, receivers: [context.message.sender.address], originalMessage: context.message, - typeId: "text", }); if (!isAddress(toAddress)) return; @@ -289,7 +273,6 @@ async function notifyUser( message: `${userInfo?.preferredName} just sent you $${amount}`, receivers: [toAddress], originalMessage: context.message, - typeId: "text", }); } @@ -330,7 +313,6 @@ async function fund( await context.send({ message: `You need to fund your agent account. Check your DMs https://converse.xyz/${context.xmtp.address}`, originalMessage: context.message, - typeId: "text", }); } let onRampURL = await walletService.onRampURL( @@ -342,7 +324,7 @@ async function fund( message: "Here is the payment link:", originalMessage: context.message, }); - const url = await baselinks.requestPayment( + const url = baselinks.paymentLink( walletData.agent_address, amount, onRamp ? onRampURL : undefined, @@ -376,7 +358,7 @@ async function fund( walletData.agent_address, ); - const url = await baselinks.requestPayment( + const url = baselinks.paymentLink( walletData.agent_address, Number(response), onRamp ? onRampURL : undefined, @@ -407,7 +389,6 @@ async function withdraw( message: "Please specify a valid positive amount to withdraw.", receivers: [context.message.sender.address], originalMessage: context.message, - typeId: "text", }); return; } @@ -416,7 +397,6 @@ async function withdraw( message: "You don't have enough funds to withdraw.", receivers: [context.message.sender.address], originalMessage: context.message, - typeId: "text", }); return; } diff --git a/packages/message-kit/tests/utils.ts b/packages/message-kit/tests/utils.ts index e60186932..8c67c8ef3 100644 --- a/packages/message-kit/tests/utils.ts +++ b/packages/message-kit/tests/utils.ts @@ -25,7 +25,7 @@ const mockMessage: Message = { text: "Hello world", params: {}, }, - typeId: "text", + version: "v2", sent: new Date(), conversation: mockConversation, diff --git a/packages/xmtp-web/README.md b/packages/xmtp-web/README.md index ebf685bd5..107c6aeb5 100644 --- a/packages/xmtp-web/README.md +++ b/packages/xmtp-web/README.md @@ -19,11 +19,13 @@ This is how you can use the `xmtp-web` package to create a client and handle mes ```tsx import { XMTP } from "xmtp-web"; -const xmtp = await XMTP(onMessage); +const xmtp = new XMTP(onMessage); + +await xmtp.init(); const onMessage = async (message, user) => { console.log(`Decoded message: ${message.content.text} by ${user.address}`); // Your AI model response - await xmtp.sendMessage(response); + await xmtp.send({ message: response, originalMessage: message }); }; ``` diff --git a/packages/xmtp-web/package.json b/packages/xmtp-web/package.json index 013a90225..c3860841c 100644 --- a/packages/xmtp-web/package.json +++ b/packages/xmtp-web/package.json @@ -31,7 +31,13 @@ "dependencies": { "@changesets/changelog-git": "^0.2.0", "@changesets/cli": "^2.27.5", + "@xmtp/content-type-primitives": "^1.0.2", + "@xmtp/content-type-reaction": "^1.1.10-beta.1", + "@xmtp/content-type-read-receipt": "^2.0.0", + "@xmtp/content-type-remote-attachment": "1.1.11", + "@xmtp/content-type-reply": "^1.1.11", "@xmtp/content-type-text": "^1.0.0", + "@xmtp/grpc-api-client": "^0.2.8", "@xmtp/xmtp-js": "^13.0.3", "typescript": "^5.4.5", "viem": "^2.16.3" diff --git a/packages/xmtp-web/rollup.config.js b/packages/xmtp-web/rollup.config.js index 622651a48..f8f491c2b 100644 --- a/packages/xmtp-web/rollup.config.js +++ b/packages/xmtp-web/rollup.config.js @@ -9,6 +9,11 @@ const external = [ "viem", "viem/accounts", "@xmtp/content-type-text", + "@xmtp/content-type-primitives", + "@xmtp/content-type-reaction", + "@xmtp/content-type-read-receipt", + "@xmtp/content-type-remote-attachment", + "@xmtp/content-type-reply", "viem/chains", ]; diff --git a/packages/xmtp-web/src/content-types/agent-message.ts b/packages/xmtp-web/src/content-types/agent-message.ts new file mode 100644 index 000000000..e52c0b220 --- /dev/null +++ b/packages/xmtp-web/src/content-types/agent-message.ts @@ -0,0 +1,64 @@ +import { ContentTypeId } from "@xmtp/content-type-primitives"; +import type { + ContentCodec, + EncodedContent, +} from "@xmtp/content-type-primitives"; + +// Create a unique identifier for your content type +export const ContentTypeAgentMessage = new ContentTypeId({ + authorityId: "xmtp.org", + typeId: "agent-message", + versionMajor: 1, + versionMinor: 0, +}); + +// Define the message structure with metadata +export class AgentMessage { + public text: string; + public metadata: { + agentId: string; + skillUsed?: string; + timestamp: number; + isAgent: boolean; + [key: string]: any; // Allow for flexible metadata + }; + + constructor(text: string, metadata: any) { + this.text = text; + this.metadata = { + timestamp: Date.now(), + isAgent: true, + ...metadata, + }; + } +} + +// Define the codec +export class AgentMessageCodec implements ContentCodec { + get contentType(): ContentTypeId { + return ContentTypeAgentMessage; + } + + encode(message: AgentMessage): EncodedContent { + return { + type: ContentTypeAgentMessage, + parameters: {}, + content: new TextEncoder().encode(JSON.stringify(message)), + }; + } + + decode(encodedContent: EncodedContent): AgentMessage { + const decoded = new TextDecoder().decode(encodedContent.content); + const { text, metadata } = JSON.parse(decoded); + return new AgentMessage(text, metadata); + } + + // Only show the message text in unsupported clients + fallback(content: AgentMessage): string { + return content.text; + } + + shouldPush(): boolean { + return true; + } +} diff --git a/packages/xmtp-web/src/index.ts b/packages/xmtp-web/src/index.ts index 1dfe7a126..61f901828 100644 --- a/packages/xmtp-web/src/index.ts +++ b/packages/xmtp-web/src/index.ts @@ -1,2 +1,3 @@ export * from "./lib/xmtp.js"; export * from "./types.js"; +export * from "./content-types/agent-message.js"; diff --git a/packages/xmtp-web/src/lib/parse.ts b/packages/xmtp-web/src/lib/parse.ts index 102ccb6b2..b3d07bd6e 100644 --- a/packages/xmtp-web/src/lib/parse.ts +++ b/packages/xmtp-web/src/lib/parse.ts @@ -1,48 +1,135 @@ -import { DecodedMessage, Conversation } from "@xmtp/xmtp-js"; -import { Message, User } from "../types"; +import { + Client as V2Client, + DecodedMessage as V2DecodedMessage, + Conversation as V2Conversation, +} from "@xmtp/xmtp-js"; +import { RemoteAttachmentCodec } from "@xmtp/content-type-remote-attachment"; +import { Message } from "../types"; export async function parseMessage( - message: DecodedMessage | undefined | null, + message: V2DecodedMessage | undefined | null, + conversation: V2Conversation | undefined, + client: V2Client, ): Promise { if (message == null) return undefined; - let typeId = message.contentType?.typeId ?? "text"; let content = message.content; + if (typeId == "text") { + content = { + text: content.content ?? content, + }; + } else if (typeId == "reply") { + let previousMsg = await getLastMessageById( + message.content?.reference as string, + conversation, + client, + ); + content = { + previousMsg: previousMsg, + reply: content.content, + text: content.content, + reference: content.reference, + }; + } else if (typeId == "reaction") { + content = { + reaction: content.content, + reference: content.reference, + }; + } else if (message.contentType?.typeId == "remote_attachment") { + const attachment = await RemoteAttachmentCodec.load( + message.content, + client, + ); + content = { + attachment: attachment as string, + }; + } else if (typeId == "read_receipt") { + //Log read receipt + } else if (typeId == "agent") { + content = { + text: message.content.text, + metadata: message.content.metadata, + }; + } else if (typeId == "attachment") { + const blobdecoded = new Blob([message.content.data], { + type: message.content.mimeType, + }); + const url = URL.createObjectURL(blobdecoded); - // Handle text messages - if (typeId === "text") { content = { - text: content, + attachment: url, }; } + let date = "sentAt" in message ? message.sentAt : message.sent; - const sender: User = { - address: message.senderAddress, - inboxId: message.senderAddress, + let sender = { + address: (message as V2DecodedMessage).senderAddress, + inboxId: (message as V2DecodedMessage).senderAddress, installationIds: [], - accountAddresses: [message.senderAddress], + accountAddresses: [(message as V2DecodedMessage).senderAddress], + }; + + let convo = { + id: (conversation as V2Conversation)?.topic, + topic: (conversation as V2Conversation)?.topic ?? undefined, + createdAt: (conversation as V2Conversation)?.createdAt as Date, }; - const conversation = { - id: message.conversation?.topic, - topic: message.conversation?.topic, - createdAt: message.conversation?.createdAt as Date, + let xmtpClient: { address: string; inboxId: string } = { + address: (client as V2Client).address, + inboxId: (client as V2Client).address, }; return { id: message.id, - sender, - conversation, + sender: sender, + conversation: convo, group: undefined, - sent: message.sent as Date, + sent: date as Date, content, typeId, + client: xmtpClient, version: "v2", } as Message; } +async function getLastMessageById( + reference: string, + conversation: V2Conversation | undefined, + client: V2Client, +): Promise { + let msg = await getV2MessageById( + (conversation as V2Conversation).topic, + reference, + client as V2Client, + ); + + if (msg == null) return undefined; + else return msg.content as string; +} + +export async function getV2MessageById( + conversationId: string, + reference: string, + client: V2Client, +): Promise { + /*Takes to long, deprecated*/ + try { + const conversations = await client.conversations.list(); + const conversation = conversations.find( + (conv) => conv.topic === conversationId, + ); + if (!conversation) return undefined; + const messages = await conversation.messages(); + return messages.find((m) => m.id === reference) as V2DecodedMessage; + } catch (error) { + console.error("Error getting V2 message by id:", error); + return undefined; + } +} + export function isV2Conversation( - conversation: Conversation | undefined, -): conversation is Conversation { + conversation: V2Conversation | undefined, +): conversation is V2Conversation { return conversation?.topic !== undefined; } diff --git a/packages/xmtp-web/src/lib/xmtp.ts b/packages/xmtp-web/src/lib/xmtp.ts index 32a176416..e482fdea2 100644 --- a/packages/xmtp-web/src/lib/xmtp.ts +++ b/packages/xmtp-web/src/lib/xmtp.ts @@ -1,43 +1,41 @@ -import { Client } from "@xmtp/xmtp-js"; +import { + Client as V2Client, + DecodedMessage as V2DecodedMessage, + Conversation as V2Conversation, +} from "@xmtp/xmtp-js"; + import { ContentTypeText, TextCodec } from "@xmtp/content-type-text"; import { createWalletClient, http } from "viem"; import { generatePrivateKey, privateKeyToAccount } from "viem/accounts"; import { mainnet } from "viem/chains"; -import { Message, xmtpConfig } from "../types"; +import { Message, xmtpConfig, userMessage } from "../types"; import { parseMessage } from "./parse.js"; +import { + AgentMessage, + ContentTypeAgentMessage, +} from "../content-types/agent-message.js"; +import { Reaction } from "@xmtp/content-type-reaction"; +import { ContentTypeReply, Reply } from "@xmtp/content-type-reply"; +import { + Attachment, + ContentTypeRemoteAttachment, +} from "@xmtp/content-type-remote-attachment"; +import { ContentTypeReadReceipt } from "@xmtp/content-type-read-receipt"; +import { ContentTypeReaction } from "@xmtp/content-type-reaction"; export class XMTP { - client: Client | undefined; + v2client: V2Client | undefined; address: string | undefined; - message: Message | undefined; - onMessage: (message: Message | undefined) => Promise; - config: xmtpConfig | undefined; + inboxId: string | undefined; + onMessage: (message: Message | undefined) => Promise | undefined; + config?: xmtpConfig; constructor( - onMessage: (message: Message | undefined) => Promise = async () => {}, - config?: xmtpConfig | undefined, + onMessage?: (message: Message | undefined) => Promise | undefined, + config?: xmtpConfig, ) { - this.onMessage = onMessage; + this.onMessage = onMessage ?? (() => Promise.resolve()); this.config = config; - this.message = { - sender: { - address: "", - inboxId: "", - installationIds: [], - accountAddresses: [], - }, - conversation: { id: "", topic: "", createdAt: new Date() }, - id: "", - - client: { - address: "", - inboxId: "", - }, - sent: new Date(), - content: { text: "" }, - typeId: "text", - version: "v2", - }; } async init(): Promise { @@ -54,32 +52,144 @@ export class XMTP { ...this.config, }); - this.client = client; + this.v2client = client; this.address = client.address; streamMessages(this.onMessage, client); return this; } - async sendMessage(message: string, receiver?: string): Promise { - const conversation = await this.getConversationByAddress( - receiver ?? this.message?.sender?.address ?? "", + async send(userMessage: userMessage): Promise { + let contentType: + | typeof ContentTypeReaction + | typeof ContentTypeText + | typeof ContentTypeRemoteAttachment + | typeof ContentTypeAgentMessage + | typeof ContentTypeReadReceipt + | typeof ContentTypeReply = ContentTypeText; + + let message: any; + if (!userMessage.typeId || userMessage.typeId === "text") { + message = { + content: userMessage.message, + }; + contentType = ContentTypeText; + } else if (userMessage.typeId === "attachment") { + message = (await this.getAttachment(userMessage.message)) as Attachment; + contentType = ContentTypeRemoteAttachment; + } else if (userMessage.typeId === "reaction") { + message = { + content: userMessage.message, + action: "added", + reference: userMessage.originalMessage?.id, + schema: "unicode", + } as Reaction; + contentType = ContentTypeReaction; + } else if (userMessage.typeId === "reply") { + contentType = ContentTypeReply; + message = { + content: userMessage.message, + contentType: ContentTypeText, + reference: userMessage.originalMessage?.id, + } as Reply; + } else if (userMessage.typeId === "agentMessage") { + message = new AgentMessage( + userMessage.message, + userMessage.metadata, + ) as AgentMessage; + contentType = ContentTypeAgentMessage; + } + + if (!userMessage.receivers || userMessage.receivers.length == 0) { + userMessage.receivers = [ + userMessage.originalMessage?.sender.address ?? "", + ]; + } + let messageSent: V2DecodedMessage | undefined | null = null; + let conversation: V2Conversation | undefined | null = null; + for (let receiver of userMessage?.receivers ?? []) { + conversation = await this.getConversationByAddress(receiver); + messageSent = (await conversation?.send(message, { + contentType: contentType, + })) as V2DecodedMessage; + } + const parsedMessage = await parseMessage( + messageSent, + conversation as V2Conversation, + this.v2client as V2Client, ); - const toDecode = await conversation?.send(message, { - contentType: ContentTypeText, - }); - const parsedMessage = await parseMessage(toDecode); return parsedMessage as Message; } + async getAttachment(source: string): Promise { + try { + let imgArray: Uint8Array; + let mimeType: string; + let filename: string; + + const MAX_SIZE = 1024 * 1024; // 1MB in bytes + + // Check if source is a URL + if (source.startsWith("http://") || source.startsWith("https://")) { + try { + // Handle URL + const response = await fetch(source); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + // Check Content-Length header first if available + const contentLength = response.headers.get("content-length"); + if (contentLength && parseInt(contentLength) > MAX_SIZE) { + throw new Error("Image size exceeds 1MB limit"); + } + + const arrayBuffer = await response.arrayBuffer(); + + // Double check actual size + if (arrayBuffer.byteLength > MAX_SIZE) { + throw new Error("Image size exceeds 1MB limit"); + } + + imgArray = new Uint8Array(arrayBuffer); + mimeType = response.headers.get("content-type") || "image/jpeg"; + filename = source.split("/").pop() || "image"; + + // If filename doesn't have an extension, add one based on mime type + if (!filename.includes(".")) { + const ext = mimeType.split("/")[1]; + filename = `${filename}.${ext}`; + } + } catch (error) { + console.error("Error fetching image from URL:", error); + throw error; + } + } else { + // Handle file path + return undefined; + } + + const attachment: Attachment = { + filename, + mimeType, + data: imgArray, + }; + return attachment; + } catch (error) { + console.error("Failed to send image:", error); + throw error; + } + } + async getConversationByAddress(address: string) { try { - const conversations = await this.client?.conversations.list(); + const conversations = await this.v2client?.conversations.list(); let found = conversations?.find( - (conv) => conv.peerAddress.toLowerCase() === address.toLowerCase(), + (conv: V2Conversation) => + conv.peerAddress.toLowerCase() === address.toLowerCase(), ); if (!found) { - found = await this.client?.conversations.newConversation(address); + found = await this.v2client?.conversations.newConversation(address); } return found; } catch (error) { @@ -88,13 +198,9 @@ export class XMTP { } } - setMessage(message: Message) { - this.message = message; - } - async isOnXMTP(address: string): Promise { try { - return (await this.client?.canMessage(address)) ?? false; + return (await this.v2client?.canMessage(address)) ?? false; } catch (error) { console.error("Error checking XMTP availability:", error); return false; @@ -126,8 +232,8 @@ export async function setupPrivateKey( } async function streamMessages( - onMessage: (message: Message | undefined) => Promise, - client: Client, + onMessage: (message: Message | undefined) => Promise | undefined, + client: V2Client, ) { while (true) { try { @@ -142,8 +248,12 @@ async function streamMessages( ) { continue; } - // You'll need to adapt parseMessage for the simplified version - const parsedMessage = await parseMessage(message); + + const parsedMessage = await parseMessage( + message, + message.conversation, + client, + ); onMessage(parsedMessage); } catch (e) { console.log(`error`, e); diff --git a/packages/xmtp-web/src/types.ts b/packages/xmtp-web/src/types.ts index 018980e7a..1d3a38f0e 100644 --- a/packages/xmtp-web/src/types.ts +++ b/packages/xmtp-web/src/types.ts @@ -1,12 +1,28 @@ import { privateKeyToAccount } from "viem/accounts"; import { createWalletClient } from "viem"; -import { ClientOptions } from "@xmtp/xmtp-js"; +import { ClientOptions } from "@xmtp/node-sdk"; + +export type userMessage = { + message: string; + originalMessage: Message | undefined; + metadata?: any; + receivers?: string[]; + typeId?: + | "text" + | "image" + | "reaction" + | "reply" + | "attachment" + | "readReceipt" + | "agentMessage"; +}; export interface UserReturnType { key: string; account: ReturnType; wallet: ReturnType; } + export type xmtpConfig = { privateKey?: string; path?: string; diff --git a/packages/xmtp/README.md b/packages/xmtp/README.md index 68ba4e31e..d3d318ba5 100644 --- a/packages/xmtp/README.md +++ b/packages/xmtp/README.md @@ -17,13 +17,18 @@ This is how you can use the `xmtp` package to create a client and handle message ```tsx import { XMTP } from "xmtp"; -const xmtp = await XMTP(onMessage, { +const xmtp = new XMTP(onMessage, { encryptionKey: process.env.WALLET_PRIVATE_KEY, }); +await xmtp.init(); + const onMessage = async (message, user) => { console.log(`Decoded message: ${message.content.text} by ${user.address}`); // Your AI model response - await xmtp.sendMessage(response); + await xmtp.send({ + message: response, + originalMessage: message, + }); }; ``` diff --git a/packages/xmtp/src/lib/parse.ts b/packages/xmtp/src/lib/parse.ts index c6fe976ed..cb6858580 100644 --- a/packages/xmtp/src/lib/parse.ts +++ b/packages/xmtp/src/lib/parse.ts @@ -21,7 +21,7 @@ export async function parseMessage( let content = message.content; if (typeId == "text") { content = { - text: content, + text: content.content ?? content, }; } else if (typeId == "reply") { let previousMsg = await getLastMessageById( @@ -112,7 +112,21 @@ export async function parseMessage( ((conversation as V2Conversation)?.createdAt as Date) || ((conversation as V3Conversation)?.createdAt as Date), }; - + let xmtpClient: { address: string; inboxId: string } = { + address: "", + inboxId: "", + }; + if (client instanceof V2Client) { + xmtpClient = { + address: (client as V2Client).address, + inboxId: (client as V2Client).address, + }; + } else { + xmtpClient = { + address: (client as V3Client).accountAddress, + inboxId: (client as V3Client).inboxId, + }; + } return { id: message.id, sender: sender, @@ -122,6 +136,7 @@ export async function parseMessage( content, typeId, version: group ? "v3" : "v2", + client: xmtpClient, } as Message; } diff --git a/packages/xmtp/src/lib/xmtp.ts b/packages/xmtp/src/lib/xmtp.ts index 12b660324..656bbede0 100644 --- a/packages/xmtp/src/lib/xmtp.ts +++ b/packages/xmtp/src/lib/xmtp.ts @@ -36,7 +36,6 @@ import { AgentMessageCodec, ContentTypeAgentMessage, } from "../content-types/agent-message.js"; -import { ContentTypeId } from "@xmtp/content-type-primitives"; import { createWalletClient, http, toBytes, toHex } from "viem"; import { generatePrivateKey, privateKeyToAccount } from "viem/accounts"; import { mainnet } from "viem/chains"; @@ -51,14 +50,14 @@ export class XMTP { client: V3Client | undefined; address: string | undefined; inboxId: string | undefined; - onMessage: (message: Message | undefined) => Promise; + onMessage: (message: Message | undefined) => Promise | undefined; config?: xmtpConfig; constructor( - onMessage: (message: Message | undefined) => Promise, + onMessage?: (message: Message | undefined) => Promise | undefined, config?: xmtpConfig, ) { - this.onMessage = onMessage; + this.onMessage = onMessage ?? (() => Promise.resolve()); this.config = config; } @@ -343,7 +342,7 @@ export class XMTP { } async function streamMessages( - onMessage: (message: Message | undefined) => Promise, + onMessage: (message: Message | undefined) => Promise | undefined, client: V3Client | V2Client, xmtp: XMTP, ) { @@ -378,7 +377,6 @@ async function streamMessages( conversation, client, ); - //xmtp.setMessage(parsedMessage as Message); await onMessage(parsedMessage as Message); } catch (e) { console.log(`error`, e); @@ -408,7 +406,6 @@ async function streamMessages( conversation, client, ); - //xmtp.setMessage(parsedMessage as Message); await onMessage(parsedMessage as Message); } catch (e) { console.log(`error`, e); diff --git a/packages/xmtp/tests/Client.test.ts b/packages/xmtp/tests/Client.test.ts index 1f088d16e..1a6c71a3f 100644 --- a/packages/xmtp/tests/Client.test.ts +++ b/packages/xmtp/tests/Client.test.ts @@ -4,29 +4,32 @@ import { XMTP, createUser } from "xmtp"; describe("Client Private Key Configuration Tests", () => { test("creates a client with a random generated key", async () => { - const { client, v2client } = await XMTP(); - expect(client.inboxId).toBeDefined(); - expect(v2client.address).toBeDefined(); + const xmtp = new XMTP(); + const { client, v2client } = await xmtp.init(); + expect(client?.inboxId).toBeDefined(); + expect(v2client?.address).toBeDefined(); }, 25000); // Added 15 second timeout test("creates a client with a provided private key", async () => { const privateKey = generatePrivateKey(); - const { client, v2client } = await XMTP(undefined, { + const xmtp = new XMTP(undefined, { privateKey, }); - expect(client.inboxId).toBeDefined(); - expect(v2client.address).toBeDefined(); + const { client, v2client } = await xmtp.init(); + expect(client?.inboxId).toBeDefined(); + expect(v2client?.address).toBeDefined(); }, 15000); // Added 15 second timeout test("fails gracefully with invalid private key format", async () => { const invalidKey = "invalid_key"; - const { client } = await XMTP(undefined, { + const xmtp = new XMTP(undefined, { privateKey: invalidKey, }); + const { client, v2client } = await xmtp.init(); // Should fall back to random key generation - expect(client.inboxId).toBeDefined(); + expect(client?.inboxId).toBeDefined(); }, 15000); // Added 15 second timeout test("creates user with valid private key", () => { diff --git a/templates/ens/src/skills/pay.ts b/templates/ens/src/skills/pay.ts index a9bc3b2d2..36a25a3e0 100644 --- a/templates/ens/src/skills/pay.ts +++ b/templates/ens/src/skills/pay.ts @@ -51,10 +51,10 @@ export async function handler(context: Context) { let receiverAddress = username?.address; if (skill === "tip") { let tipAmount = 1; - const url = await baselinks.requestPayment(receiverAddress, tipAmount); - await context.dm(url); + const url = baselinks.paymentLink(receiverAddress, tipAmount); + await context.send({ message: url, originalMessage: context.message }); } else if (skill === "pay") { - const url = await baselinks.requestPayment(receiverAddress, amount); - await context.dm(url); + const url = baselinks.paymentLink(receiverAddress, amount); + await context.send({ message: url, originalMessage: context.message }); } } diff --git a/templates/faucet/src/skills/faucet.ts b/templates/faucet/src/skills/faucet.ts index 56d261f1c..f7f630270 100644 --- a/templates/faucet/src/skills/faucet.ts +++ b/templates/faucet/src/skills/faucet.ts @@ -1,4 +1,4 @@ -import { Context, chatMemory, Skill } from "@xmtp/message-kit"; +import { Context, Skill, baselinks } from "@xmtp/message-kit"; import { getRedisClient } from "../plugins/redis.js"; import { FIVE_MINUTES, @@ -99,13 +99,18 @@ export async function handleFaucet(context: Context) { ); if (!selectedNetwork) { - await context.send("Invalid network. Please select a valid option."); + await context.send({ + message: "Invalid network. Please select a valid option.", + originalMessage: context.message, + }); return; } - await context.send( - "Your testnet tokens are being processed. Please wait a moment for the transaction to process.", - ); + await context.send({ + message: + "Your testnet tokens are being processed. Please wait a moment for the transaction to process.", + originalMessage: context.message, + }); const result = await learnWeb3Client.dripTokens( selectedNetwork.networkId, @@ -113,24 +118,29 @@ export async function handleFaucet(context: Context) { ); if (!result.ok) { - await context.send( - `❌ Sorry, there was an error processing your request:\n\n"${result.error!}"`, - ); + await context.send({ + message: `❌ Sorry, there was an error processing your request:\n\n"${result.error!}"`, + originalMessage: context.message, + }); return; } - await context.send("Here's your transaction receipt:"); - await context.send( - `${process.env.FRAME_BASE_URL}?txLink=${result.value}&networkLogo=${ - selectedNetwork?.networkLogo - }&networkName=${selectedNetwork?.networkName.replaceAll( - " ", - "-", - )}&tokenName=${selectedNetwork?.tokenName}&amount=${ - selectedNetwork?.dripAmount - }`, + await context.send({ + message: "Here's your transaction receipt:", + originalMessage: context.message, + }); + let receiptLink = baselinks.receiptLink( + result.value as string, + selectedNetwork?.dripAmount, ); + await context.send({ + message: receiptLink, + originalMessage: context.message, + }); } else { - await context.send("Unknown skill. Please use 'list' or 'drip'."); + await context.send({ + message: "Unknown skill. Please use 'list' or 'drip'.", + originalMessage: context.message, + }); } } diff --git a/templates/gated-group/src/index.ts b/templates/gated-group/src/index.ts index dd904dcad..ee5bd5c2e 100644 --- a/templates/gated-group/src/index.ts +++ b/templates/gated-group/src/index.ts @@ -3,9 +3,11 @@ import { XMTP } from "xmtp"; import { gated } from "./skills/gated.js"; import { startGatedGroupServer } from "./skills/gated.js"; -const { client } = await XMTP(); - -startGatedGroupServer(client); +const xmtp = new XMTP(); +const { client } = await xmtp.init(); +if (client) { + startGatedGroupServer(client); +} export const agent = createAgent({ name: "Gated Group Creator Agent", diff --git a/templates/gated-group/src/plugins/xmtp-groups.ts b/templates/gated-group/src/plugins/xmtp-groups.ts index 944ff0004..29fc20ebc 100644 --- a/templates/gated-group/src/plugins/xmtp-groups.ts +++ b/templates/gated-group/src/plugins/xmtp-groups.ts @@ -1,21 +1,21 @@ import { Client } from "@xmtp/node-sdk"; export async function createGroup( - client: Client, - senderAddress: string, - clientAddress: string, + client: Client | undefined, + senderAddress: string | undefined, + clientAddress: string | undefined, ) { try { let senderInboxId = ""; - await client.conversations.sync(); + await client?.conversations.sync(); const group = await client?.conversations.newGroup([ - senderAddress, - clientAddress, + senderAddress ?? "", + clientAddress ?? "", ]); console.log("Group created", group?.id); - const members = await group.members(); - const senderMember = members.find((member) => - member.accountAddresses.includes(senderAddress.toLowerCase()), + const members = await group?.members(); + const senderMember = members?.find((member) => + member.accountAddresses.includes(senderAddress?.toLowerCase() ?? ""), ); if (senderMember) { senderInboxId = senderMember.inboxId; @@ -23,13 +23,13 @@ export async function createGroup( } else { console.log("Sender not found in members list"); } - await group.addSuperAdmin(senderInboxId); + await group?.addSuperAdmin(senderInboxId); console.log( "Sender is superAdmin", - await group.isSuperAdmin(senderInboxId), + await group?.isSuperAdmin(senderInboxId), ); - await group.send(`Welcome to the new group!`); - await group.send(`You are now the admin of this group as well as the bot`); + await group?.send(`Welcome to the new group!`); + await group?.send(`You are now the admin of this group as well as the bot`); return group; } catch (error) { console.log("Error creating group", error); diff --git a/templates/gated-group/src/skills/gated.ts b/templates/gated-group/src/skills/gated.ts index ab24ba84b..24f731b31 100644 --- a/templates/gated-group/src/skills/gated.ts +++ b/templates/gated-group/src/skills/gated.ts @@ -26,14 +26,17 @@ async function handler(context: Context) { if (skill === "create") { const group = await createGroup(xmtp.client, sender.address, xmtp.address); - await context.send( - `Group created!\n- ID: ${group?.id}\n- Group Frame URL: https://converse.xyz/group/${group?.id}: \n- This url will deelink to the group inside Converse\n- Once in the other group you can share the invite with your friends.`, - ); + await context.send({ + message: `Group created!\n- ID: ${group?.id}\n- Group Frame URL: https://converse.xyz/group/${group?.id}: \n- This url will deelink to the group inside Converse\n- Once in the other group you can share the invite with your friends.`, + originalMessage: context.message, + }); return; } else { - await context.send( - "👋 Welcome to the Gated Bot Group!\nTo get started, type /create to set up a new group. 🚀\nThis example will check if the user has a particular nft and add them to the group if they do.\nOnce your group is created, you'll receive a unique Group ID and URL.\nShare the URL with friends to invite them to join your group!", - ); + await context.send({ + message: + "👋 Welcome to the Gated Bot Group!\nTo get started, type /create to set up a new group. 🚀\nThis example will check if the user has a particular nft and add them to the group if they do.\nOnce your group is created, you'll receive a unique Group ID and URL.\nShare the URL with friends to invite them to join your group!", + originalMessage: context.message, + }); } } diff --git a/templates/gm/src/index.ts b/templates/gm/src/index.ts index f33934f9b..bcbd13e8b 100644 --- a/templates/gm/src/index.ts +++ b/templates/gm/src/index.ts @@ -8,7 +8,7 @@ export const agent = createAgent({ const { group } = context; if (!group) { - await context.send(`gm`); + await context.send({ message: "gm", originalMessage: context.message }); } }, }).run(); diff --git a/templates/hackathon-store/src/index.ts b/templates/hackathon-store/src/index.ts index b6ecb0b14..408952601 100644 --- a/templates/hackathon-store/src/index.ts +++ b/templates/hackathon-store/src/index.ts @@ -22,7 +22,11 @@ export const agent = createAgent({ if (skill === "update") { const page = await downloadPage(); fs.writeFileSync("src/prompt.md", page); - await context.reply("Notion DB updated"); + await context.send({ + message: "Notion DB updated", + originalMessage: context.message, + typeId: "reply", + }); } await agentReply(context); diff --git a/templates/payroll-agent/src/plugins/payroll.ts b/templates/payroll-agent/src/plugins/payroll.ts index 9c92b6114..036c57287 100644 --- a/templates/payroll-agent/src/plugins/payroll.ts +++ b/templates/payroll-agent/src/plugins/payroll.ts @@ -62,7 +62,11 @@ export class Payroll { .join("\n") + `\n\n💰 Total amount to be disbursed: ${totalRequired} USDC`; - await this.context.send(summaryMessage); + await this.context.send({ + message: summaryMessage, + receivers: [this.senderAddress], + originalMessage: this.context.message, + }); // Check wallet balance const { balance } = await walletService.checkBalance(this.senderAddress); @@ -71,9 +75,18 @@ export class Payroll { if (Number(balance) < totalRequired) { const wallet = await walletService.getWallet(this.senderAddress); const message = `⚠️ Insufficient funds for today's payroll!\nRequired: ${totalRequired} USDC\nAvailable: ${balance} USDC\nPlease fund your account.`; - console.log(message); - await this.context.send(message); - await baselinks.requestPayment(wallet?.agent_address, totalRequired); + + await this.context.send({ + message: message, + receivers: [this.senderAddress], + originalMessage: this.context.message, + }); + const url = baselinks.paymentLink(wallet?.agent_address, totalRequired); + await this.context.send({ + message: url, + receivers: [this.senderAddress], + originalMessage: this.context.message, + }); return; } @@ -89,22 +102,28 @@ export class Payroll { employee.address, employee.salary, ); - await this.context.send( - `✅ Processed salary payment of ${employee.salary} USDC to ${employee.name}`, - ); + await this.context.send({ + message: `✅ Processed salary payment of ${employee.salary} USDC to ${employee.name}`, + receivers: [employee.address], + originalMessage: this.context.message, + }); } catch (error: any) { console.error(`Payment failed for ${employee.name}:`, error); - await this.context.send( - `❌ Failed to process payment for ${employee.name}: ${error.message}`, - ); + await this.context.send({ + message: `❌ Failed to process payment for ${employee.name}: ${error.message}`, + receivers: [employee.address], + originalMessage: this.context.message, + }); } } console.log("Daily payroll processing completed"); } catch (error) { console.error("Error in payroll processing:", error); - await this.context.send( - "❌ An error occurred while processing payroll. Please check the logs.", - ); + await this.context.send({ + message: + "❌ An error occurred while processing payroll. Please check the logs.", + originalMessage: this.context.message, + }); } } diff --git a/templates/playground/src/skills/broadcast.ts b/templates/playground/src/skills/broadcast.ts index 7e6956ccf..975067e06 100644 --- a/templates/playground/src/skills/broadcast.ts +++ b/templates/playground/src/skills/broadcast.ts @@ -25,15 +25,34 @@ async function handler(context: Context) { } = context; const fakeSubscribers = ["0x93E2fc3e99dFb1238eB9e0eF2580EFC5809C7204"]; - await context.send("This is how your message will look like:"); - await context.send(message); + await context.send({ + message: "This is how your message will look like:", + originalMessage: context.message, + }); + await context.send({ + message: message, + originalMessage: context.message, + typeId: "reply", + }); const emailResponse = await context.awaitResponse( "Are you sure you want to send this broadcast?\nType 'yes' to confirm.", ["yes", "no"], ); if (emailResponse === "yes") { - await context.send("Sending broadcast..."); - await context.sendTo(message, fakeSubscribers); - await context.send("Broadcast sent!"); + await context.send({ + message: "Sending broadcast...", + originalMessage: context.message, + typeId: "reply", + }); + await context.send({ + message: message, + receivers: fakeSubscribers, + originalMessage: context.message, + }); + await context.send({ + message: "Broadcast sent!", + originalMessage: context.message, + typeId: "reply", + }); } } diff --git a/templates/playground/src/skills/cash.ts b/templates/playground/src/skills/cash.ts index 6a2769405..b6f51395b 100644 --- a/templates/playground/src/skills/cash.ts +++ b/templates/playground/src/skills/cash.ts @@ -45,9 +45,10 @@ async function balanceHandler(context: Context) { } = context; const usdcWallet = new USDCWallet(sender.address); const { usdc } = await usdcWallet.checkBalances(); - await context.send( - `Your balance is ${usdc} USDC. let me know if you want check again or to fund your wallet.`, - ); + await context.send({ + message: `Your balance is ${usdc} USDC. let me know if you want check again or to fund your wallet.`, + originalMessage: context.message, + }); } async function fundHandler(context: Context) { @@ -65,7 +66,10 @@ async function fundHandler(context: Context) { const MAX_USDC = 10; if (usdc >= MAX_USDC) { - await context.send(`Your balance is maxed out at ${MAX_USDC} USDC.`); + await context.send({ + message: `Your balance is maxed out at ${MAX_USDC} USDC.`, + originalMessage: context.message, + }); return; } @@ -87,24 +91,25 @@ async function fundHandler(context: Context) { } if (isNaN(fundAmount) || fundAmount <= 0 || fundAmount > remainingLimit) { - await context.send( - `Invalid amount. Please specify a value between 1 and ${remainingLimit} USDC.`, - ); + await context.send({ + message: `Invalid amount. Please specify a value between 1 and ${remainingLimit} USDC.`, + originalMessage: context.message, + }); return; } - const url = await baselinks.requestPayment( - usdcWallet.agentAddress, - fundAmount, - ); - await context.dm(url); - await context.send( - "After funding, let me know so I can check your balance.", - ); + const url = baselinks.paymentLink(usdcWallet.agentAddress, fundAmount); + await context.send({ message: url, originalMessage: context.message }); + await context.send({ + message: "After funding, let me know so I can check your balance.", + originalMessage: context.message, + }); } catch (error) { - await context.send( - "An error occurred while processing your request. Please try again.", - ); + await context.send({ + message: + "An error occurred while processing your request. Please try again.", + originalMessage: context.message, + }); } } @@ -119,7 +124,10 @@ async function transferHandler(context: Context) { } = context; const usdcWallet = new USDCWallet(sender.address); if (amount > 10) { - await context.send("You can only transfer up to 10 USDC at a time."); + await context.send({ + message: "You can only transfer up to 10 USDC at a time.", + originalMessage: context.message, + }); return; } await usdcWallet.transferUsdc(address, amount); diff --git a/templates/playground/src/skills/dalle.ts b/templates/playground/src/skills/dalle.ts index a2d971453..26c4bf854 100644 --- a/templates/playground/src/skills/dalle.ts +++ b/templates/playground/src/skills/dalle.ts @@ -46,9 +46,11 @@ export async function handler(context: Context) { }); const imageUrl = response.data[0].url; - console.log(imageUrl); const message = `Here is the image generated for the prompt "${prompt}": ${imageUrl}`; - context.send(message); + context.send({ + message: message, + originalMessage: context.message, + }); } catch (error) { // @ts-ignore const message = `Failed to generate image. Error: ${error?.message} diff --git a/templates/playground/src/skills/drip.ts b/templates/playground/src/skills/drip.ts index e5b91ae60..69a1832fd 100644 --- a/templates/playground/src/skills/drip.ts +++ b/templates/playground/src/skills/drip.ts @@ -38,10 +38,16 @@ export async function handler(context: Context) { } = context; if (!network) { - await context.send("Invalid network. Please select a valid option."); + await context.send({ + message: "Invalid network. Please select a valid option.", + originalMessage: context.message, + }); return; } - context.send("Fetching testnet tokens..."); + await context.send({ + message: "Fetching testnet tokens...", + originalMessage: context.message, + }); const redisClient = await getRedisClient(); const learnWeb3Client = new LearnWeb3Client(); @@ -52,16 +58,20 @@ export async function handler(context: Context) { supportedNetworks = JSON.parse( cachedSupportedNetworksData!, ).supportedNetworks; - await context.send( - "Your testnet tokens are being processed. Please wait a moment for the transaction to process.", - ); + await context.send({ + message: + "Your testnet tokens are being processed. Please wait a moment for the transaction to process.", + originalMessage: context.message, + }); const selectedNetwork = supportedNetworks.find( (n) => n.networkId.toLowerCase() === network.toLowerCase(), ); if (!selectedNetwork) { - await context.send( - "The network currently does not have funds provided by web3 api's\nTry again later...", - ); + await context.send({ + message: + "The network currently does not have funds provided by web3 api's\nTry again later...", + originalMessage: context.message, + }); return; } const result = await learnWeb3Client.dripTokens( @@ -70,17 +80,24 @@ export async function handler(context: Context) { ); if (!result.ok) { - await context.send( - `❌ Sorry, there was an error processing your request:\n\n"${result.error!}"`, - ); + await context.send({ + message: `❌ Sorry, there was an error processing your request:\n\n"${result.error!}"`, + originalMessage: context.message, + }); return; } - await context.send("Here's your transaction receipt:"); - const url = await baselinks.sendReceipt( + await context.send({ + message: "Here's your transaction receipt:", + originalMessage: context.message, + }); + const url = baselinks.receiptLink( result.value!, selectedNetwork.dripAmount as number, ); - await context.dm(url); + await context.send({ + message: url, + originalMessage: context.message, + }); return; } diff --git a/templates/playground/src/skills/mint.ts b/templates/playground/src/skills/mint.ts index 7bedaddca..6fc696d8d 100644 --- a/templates/playground/src/skills/mint.ts +++ b/templates/playground/src/skills/mint.ts @@ -72,22 +72,32 @@ export async function handler(context: Context) { } } if (parsedUrl) { - await context.send("Here is your Mint Frame URL: "); - await context.send(parsedUrl); + await context.send({ + message: "Here is your Mint Frame URL: ", + originalMessage: context.message, + }); + await context.send({ + message: parsedUrl, + originalMessage: context.message, + }); return; } else { - await context.send( - "Error: Unable to parse the provided URL. Please ensure you're sending a valid Zora or Coinbase Wallet URL.", - ); + await context.send({ + message: + "Error: Unable to parse the provided URL. Please ensure you're sending a valid Zora or Coinbase Wallet URL.", + originalMessage: context.message, + }); return; } } else { const { collection, token_id } = params; console.log(collection, token_id); if (!collection || !token_id) { - context.reply( - "Missing required parameters. Please provide collection and token_id.", - ); + await context.send({ + message: + "Missing required parameters. Please provide collection and token_id.", + originalMessage: context.message, + }); return; } let mintUrl = `${baseUrl}/?transaction_type=mint&collection=${collection}&token_id=${token_id}`; diff --git a/templates/playground/src/skills/pay.ts b/templates/playground/src/skills/pay.ts index 55e4d05f7..e3027c5a3 100644 --- a/templates/playground/src/skills/pay.ts +++ b/templates/playground/src/skills/pay.ts @@ -31,6 +31,6 @@ export async function handler(context: Context) { const { amount: amountSend, token: tokenSend, username } = params; - const url = await baselinks.requestPayment(username?.address, amountSend); - await context.dm(url); + const url = baselinks.paymentLink(username?.address, amountSend); + await context.send({ message: url, originalMessage: context.message }); } diff --git a/templates/playground/src/skills/swap.ts b/templates/playground/src/skills/swap.ts index c718e8fb3..3574ee768 100644 --- a/templates/playground/src/skills/swap.ts +++ b/templates/playground/src/skills/swap.ts @@ -38,9 +38,12 @@ export async function handler(context: Context) { const { amount, token_from, token_to } = params; if (!amount || !token_from || !token_to) { - context.reply( - "Missing required parameters. Please provide amount, token_from, and token_to.", - ); + context.send({ + message: + "Missing required parameters. Please provide amount, token_from, and token_to.", + originalMessage: context.message, + typeId: "reply", + }); return; } diff --git a/templates/playground/src/skills/todo.ts b/templates/playground/src/skills/todo.ts index 1b02532e9..b4ab70306 100644 --- a/templates/playground/src/skills/todo.ts +++ b/templates/playground/src/skills/todo.ts @@ -24,7 +24,10 @@ export async function handler(context: Context) { let email = ""; if (!previousMsg) { - await context.send("You need to do it on a reply."); + await context.send({ + message: "You need to do it on a reply.", + originalMessage: context.message, + }); return; } let intents = 2; @@ -37,18 +40,21 @@ export async function handler(context: Context) { // Basic email validation const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(email)) { - await context.send( - "Invalid email format. Please try again with a valid email address.", - ); + await context.send({ + message: + "Invalid email format. Please try again with a valid email address.", + originalMessage: context.message, + }); intents--; continue; } break; } if (intents == 0) { - await context.send( - "I couldn't get your email address. Please try again later.", - ); + await context.send({ + message: "I couldn't get your email address. Please try again later.", + originalMessage: context.message, + }); return; } try { @@ -69,12 +75,21 @@ export async function handler(context: Context) { `, }; await resend.emails.send(content); - await context.send(`✅ Summary sent successfully to ${email}`); + await context.send({ + message: `✅ Summary sent successfully to ${email}`, + originalMessage: context.message, + }); } else { - await context.send("❌ Message not found."); + await context.send({ + message: "❌ Message not found.", + originalMessage: context.message, + }); } } catch (error) { - await context.send("❌ Failed to send email. Please try again later."); + await context.send({ + message: "❌ Failed to send email. Please try again later.", + originalMessage: context.message, + }); console.error("Error sending email:", error); } } diff --git a/templates/playground/src/skills/token.ts b/templates/playground/src/skills/token.ts index d04cd5470..2a89e1b41 100644 --- a/templates/playground/src/skills/token.ts +++ b/templates/playground/src/skills/token.ts @@ -27,8 +27,14 @@ export async function handler(context: Context) { `https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&ids=${symbol}`, ); if (!response.ok) { - context.send("Token not found"); - context.send("try with its full name, instead of btc it would be bitcoin"); + context.send({ + message: "Token not found", + originalMessage: context.message, + }); + context.send({ + message: "try with its full name, instead of btc it would be bitcoin", + originalMessage: context.message, + }); return; } const data = (await response.json()) as any; @@ -54,6 +60,6 @@ export async function handler(context: Context) { ], image: tokenInfo.image, }; - const url = await baselinks.sendCustomFrame(frame); - await context.dm(url); + const url = baselinks.customFrame(frame); + await context.send({ message: url, originalMessage: context.message }); } diff --git a/templates/playground/src/skills/wordle.ts b/templates/playground/src/skills/wordle.ts index adea58a79..69acf078c 100644 --- a/templates/playground/src/skills/wordle.ts +++ b/templates/playground/src/skills/wordle.ts @@ -36,14 +36,19 @@ async function handler(context: Context) { if (skill === "arena") { await handleArenaMessage(context); } else if (skill === "wordle") { - await context.send("https://framedl.xyz"); + await context.send({ + message: "https://framedl.xyz", + originalMessage: context.message, + }); } else if (skill === "help") { - await context.send( - "For using this bot you can use the following commands:\n\n" + + await context.send({ + message: + "For using this bot you can use the following commands:\n\n" + "/wordle, @wordle, 🔍, 🔎 - To start the game\n" + "/arena - To start the arena game\n" + "/help - To see commands", - ); + originalMessage: context.message, + }); } } async function handleArenaMessage(context: Context) { @@ -57,7 +62,10 @@ async function handleArenaMessage(context: Context) { const apiKey = process.env.FRAMEDL_API_KEY; if (!apiKey) { console.log("FRAMEDL_API_KEY is not set"); - await context.send("https://www.framedl.xyz/games/arena/create"); + await context.send({ + message: "https://www.framedl.xyz/games/arena/create", + originalMessage: context.message, + }); return; } const participantCount = group?.members?.length @@ -67,11 +75,13 @@ async function handleArenaMessage(context: Context) { const wordCountArg = args[1] ? parseInt(args[1], 10) : 3; const audienceSizeArg = args[2] ? parseInt(args[2], 10) : participantCount; if (isNaN(wordCountArg) || isNaN(audienceSizeArg)) { - await context.send( - "usage: /arena \n\n" + + await context.send({ + message: + "usage: /arena \n\n" + "word count: number of words in the arena (default: 3, min: 1, max: 9)\n" + "audience size: number of audience members (default: number of participants excluding wordle bot, min: 1, max: 15)", - ); + originalMessage: context.message, + }); return; } @@ -90,9 +100,15 @@ async function handleArenaMessage(context: Context) { const data = (await response.json()) as { arenaUrl: string }; - await context.send(data.arenaUrl); + await context.send({ + message: data.arenaUrl, + originalMessage: context.message, + }); } catch (error) { console.error(error); - await context.send("https://www.framedl.xyz/games/arena/create"); + await context.send({ + message: "https://www.framedl.xyz/games/arena/create", + originalMessage: context.message, + }); } } diff --git a/templates/toss/src/plugins/helpers.ts b/templates/toss/src/plugins/helpers.ts index 4ccd5db6c..9ca78742c 100644 --- a/templates/toss/src/plugins/helpers.ts +++ b/templates/toss/src/plugins/helpers.ts @@ -30,18 +30,28 @@ export async function checkTossCorrect( } = context; if (!group) { - await context.reply("This command can only be used in a group."); + await context.send({ + message: "This command can only be used in a group.", + originalMessage: context.message, + typeId: "reply", + }); return undefined; } else if (!previousMsg) { - await context.reply("You must reply to a toss."); + await context.send({ + message: "You must reply to a toss.", + originalMessage: context.message, + typeId: "reply", + }); return undefined; } let toss_id = extractTossId(previousMsg); if (!toss_id) { - await context.reply( - "Invalid toss ID. Be sure you are replying to a original toss.", - ); + await context.send({ + message: "Invalid toss ID. Be sure you are replying to a original toss.", + originalMessage: context.message, + typeId: "reply", + }); return undefined; } const tossDBClient = await getRedisClient(); @@ -53,13 +63,25 @@ export async function checkTossCorrect( } if (!tossData) { - await context.reply("Toss not found"); + await context.send({ + message: "Toss not found", + originalMessage: context.message, + typeId: "reply", + }); return undefined; } else if (tossData.status === "closed") { - await context.reply("Toss has already ended."); + await context.send({ + message: "Toss has already ended.", + originalMessage: context.message, + typeId: "reply", + }); return undefined; } else if (tossData.group_id.toLowerCase() !== group.id.toLowerCase()) { - await context.reply("This toss is not in this group."); + await context.send({ + message: "This toss is not in this group.", + originalMessage: context.message, + typeId: "reply", + }); return undefined; } diff --git a/templates/toss/src/skills/toss.ts b/templates/toss/src/skills/toss.ts index 902d66765..9eac4dfdf 100644 --- a/templates/toss/src/skills/toss.ts +++ b/templates/toss/src/skills/toss.ts @@ -86,7 +86,11 @@ export async function handleTossCreation(context: Context) { group, } = context; if (!group) { - await context.reply("This command can only be used in a group."); + await context.send({ + message: "This command can only be used in a group.", + originalMessage: context.message, + typeId: "reply", + }); return; } @@ -98,7 +102,11 @@ export async function handleTossCreation(context: Context) { tossId + ":" + sender.address, ); if (!isCreated) { - await context.reply("Failed to create toss wallet"); + await context.send({ + message: "Failed to create toss wallet", + originalMessage: context.message, + typeId: "reply", + }); return; } @@ -119,11 +127,16 @@ export async function handleTossCreation(context: Context) { }; await tossDBClient.set("toss:" + tossId, JSON.stringify(tossData)); if (tossId !== undefined) { - await context.send(generateTossMessage(tossData)); + await context.send({ + message: generateTossMessage(tossData), + originalMessage: context.message, + }); } else { - await context.reply( - `An error occurred while creating the toss. ${tossId}`, - ); + await context.send({ + message: `An error occurred while creating the toss. ${tossId}`, + originalMessage: context.message, + typeId: "reply", + }); } } } @@ -148,7 +161,11 @@ export async function handleJoinToss(context: Context) { const tossDBClient = await getRedisClient(); if (participants?.some((p) => p.address === sender.address)) { - await context.reply("You have already joined this toss."); + await context.send({ + message: "You have already joined this toss.", + originalMessage: context.message, + typeId: "reply", + }); return; } const { balance } = await walletService.checkBalance(sender.address); @@ -164,7 +181,11 @@ export async function handleJoinToss(context: Context) { amount, ); if (transfer === undefined) { - await context.reply("Failed to transfer funds to the toss wallet."); + await context.send({ + message: "Failed to transfer funds to the toss wallet.", + originalMessage: context.message, + typeId: "reply", + }); return; } const participant = { @@ -180,12 +201,20 @@ export async function handleJoinToss(context: Context) { JSON.stringify({ ...tossData, participants }), ); - await context.reply("Successfully joined the toss!"); + await context.send({ + message: "Successfully joined the toss!", + originalMessage: context.message, + typeId: "reply", + }); await context.executeSkill(`/status ${toss_id}`); } catch (error) { console.error(error); - await context.reply("Failed to process your entry. Please try again."); + await context.send({ + message: "Failed to process your entry. Please try again.", + originalMessage: context.message, + typeId: "reply", + }); } } @@ -206,10 +235,18 @@ export async function handleEndToss(context: Context) { const tossDBClient = await getRedisClient(); if (participants?.length === 0) { - await context.reply("No participants for this toss."); + await context.send({ + message: "No participants for this toss.", + originalMessage: context.message, + typeId: "reply", + }); return; } else if (admin_address.toLowerCase() !== sender.address.toLowerCase()) { - await context.reply("Only the admin can cancel the toss."); + await context.send({ + message: "Only the admin can cancel the toss.", + originalMessage: context.message, + typeId: "reply", + }); return; } @@ -217,9 +254,11 @@ export async function handleEndToss(context: Context) { const { balance } = await walletService.checkBalance(tempWalletID); const fundsNeeded = tossData.amount * participants?.length; if (balance < fundsNeeded) { - await context.reply( - `Toss wallet does not have enough funds ${fundsNeeded}, has ${balance}`, - ); + await context.send({ + message: `Toss wallet does not have enough funds ${fundsNeeded}, has ${balance}`, + originalMessage: context.message, + typeId: "reply", + }); return; } @@ -231,7 +270,10 @@ export async function handleEndToss(context: Context) { (tossData.amount * (participants?.length ?? 0)) / (winners.length ?? 1); try { - await context.send("Sending prize to winners..."); + await context.send({ + message: "Sending prize to winners...", + originalMessage: context.message, + }); for (const winner of winners) { await walletService.transfer(tempWalletID, winner.address, prize); await tossDBClient.set( @@ -242,15 +284,25 @@ export async function handleEndToss(context: Context) { // Clean up //await walletService.deleteTempWallet(tossWalletRedis, tossId.toString()); if (winners.length > 0) { - await context.reply(generateEndTossMessage(winners, losers, prize)); + await context.send({ + message: generateEndTossMessage(winners, losers, prize), + originalMessage: context.message, + typeId: "reply", + }); } - await context.sendTo( - `You received $${prize} from the toss!`, - winners.map((w) => w.address), - ); + await context.send({ + message: `You received $${prize} from the toss!`, + originalMessage: context.message, + receivers: winners.map((w) => w.address), + typeId: "reply", + }); } catch (error) { - await context.reply(`Failed to send prize to ${winners.length} winners`); + await context.send({ + message: `Failed to send prize to ${winners.length} winners`, + originalMessage: context.message, + typeId: "reply", + }); } } @@ -267,10 +319,18 @@ export async function handleCancelToss(context: Context) { const tossDBClient = await getRedisClient(); if (participants?.length === 0) { - await context.reply("No participants for this toss."); + await context.send({ + message: "No participants for this toss.", + originalMessage: context.message, + typeId: "reply", + }); return; } else if (admin_address.toLowerCase() !== sender.address.toLowerCase()) { - await context.reply("Only the admin can cancel the toss."); + await context.send({ + message: "Only the admin can cancel the toss.", + originalMessage: context.message, + typeId: "reply", + }); return; } @@ -278,9 +338,11 @@ export async function handleCancelToss(context: Context) { const { balance } = await walletService.checkBalance(tempWalletID); const fundsNeeded = tossData.amount * participants?.length; if (balance < fundsNeeded) { - await context.reply( - `Toss wallet does not have enough funds ${fundsNeeded}, has ${balance}`, - ); + await context.send({ + message: `Toss wallet does not have enough funds ${fundsNeeded}, has ${balance}`, + originalMessage: context.message, + typeId: "reply", + }); return; } for (const participant of participants) { @@ -291,9 +353,11 @@ export async function handleCancelToss(context: Context) { `Failed to send prize to ${participant.address} agent wallet`, error, ); - await context.reply( - `Failed to send prize to ${participant.address} agent wallet`, - ); + await context.send({ + message: `Failed to send prize to ${participant.address} agent wallet`, + originalMessage: context.message, + typeId: "reply", + }); } } @@ -305,13 +369,20 @@ export async function handleCancelToss(context: Context) { JSON.stringify({ ...tossData, status: "cancelled" }), ); - await context.reply( - `Toss cancelled successfully.\nFunds distributed to participants:\n + await context.send({ + message: `Toss cancelled successfully.\nFunds distributed to participants:\n ${participants?.map((p) => `${p.name} - $${amount}`).join("\n")}`, - ); + receivers: participants.map((p) => p.address), + originalMessage: context.message, + typeId: "reply", + }); } export async function handleTossStatus(context: Context) { const tossData = await checkTossCorrect(context); if (!tossData) return; - await context.reply(await generateTossStatusMessage(tossData)); + await context.send({ + message: await generateTossStatusMessage(tossData), + originalMessage: context.message, + typeId: "reply", + }); } diff --git a/yarn.lock b/yarn.lock index 76840c7f0..8f431b9e9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12304,7 +12304,13 @@ __metadata: "@rollup/plugin-typescript": "npm:^11.1.6" "@types/node": "npm:^20.14.2" "@vitest/coverage-v8": "npm:^2.1.4" + "@xmtp/content-type-primitives": "npm:^1.0.2" + "@xmtp/content-type-reaction": "npm:^1.1.10-beta.1" + "@xmtp/content-type-read-receipt": "npm:^2.0.0" + "@xmtp/content-type-remote-attachment": "npm:1.1.11" + "@xmtp/content-type-reply": "npm:^1.1.11" "@xmtp/content-type-text": "npm:^1.0.0" + "@xmtp/grpc-api-client": "npm:^0.2.8" "@xmtp/xmtp-js": "npm:^13.0.3" prettier: "npm:^3.3.1" rollup: "npm:^4.18.0" From 1fe896928f1314047fd7041b6596f425724233e1 Mon Sep 17 00:00:00 2001 From: fabri Date: Mon, 23 Dec 2024 15:35:45 -0300 Subject: [PATCH 13/19] 1.3.0 --- packages/baselinks/package.json | 1 - packages/create-message-kit/package.json | 4 +- packages/docs/pages/changelog.mdx | 32 +++ packages/docs/pages/concepts/xmtp.mdx | 7 +- packages/docs/pages/plugins/cron.mdx | 5 +- packages/docs/pages/plugins/xmtp.mdx | 4 +- packages/docs/vocs.config.tsx | 2 +- ....timestamp-1734881463365-9f79bf95ec7b2.mjs | 182 ------------------ ....timestamp-1734881463377-71370c3873b4a.mjs | 182 ------------------ ....timestamp-1734881463417-5232a778f8c7d.mjs | 182 ------------------ ....timestamp-1734972589941-faf7cf2428c66.mjs | 182 ------------------ ...sx.timestamp-1734972589960-8ba90b016df.mjs | 0 packages/message-kit/package.json | 2 +- packages/message-kit/src/lib/core.ts | 8 +- packages/xmtp-web/package.json | 4 +- packages/xmtp/package.json | 4 +- yarn.lock | 1 - 17 files changed, 52 insertions(+), 750 deletions(-) delete mode 100644 packages/docs/vocs.config.tsx.timestamp-1734881463365-9f79bf95ec7b2.mjs delete mode 100644 packages/docs/vocs.config.tsx.timestamp-1734881463377-71370c3873b4a.mjs delete mode 100644 packages/docs/vocs.config.tsx.timestamp-1734881463417-5232a778f8c7d.mjs delete mode 100644 packages/docs/vocs.config.tsx.timestamp-1734972589941-faf7cf2428c66.mjs delete mode 100644 packages/docs/vocs.config.tsx.timestamp-1734972589960-8ba90b016df.mjs diff --git a/packages/baselinks/package.json b/packages/baselinks/package.json index da8480348..6d69f5928 100644 --- a/packages/baselinks/package.json +++ b/packages/baselinks/package.json @@ -9,7 +9,6 @@ "start": "next start" }, "dependencies": { - "@farcaster/frame-sdk": "0.0.10", "@types/next": "^9.0.0", "cheerio": "^1.0.0", "ethers": "^6.13.4", diff --git a/packages/create-message-kit/package.json b/packages/create-message-kit/package.json index dfbe6464c..7372ba55b 100644 --- a/packages/create-message-kit/package.json +++ b/packages/create-message-kit/package.json @@ -1,6 +1,6 @@ { "name": "create-message-kit", - "version": "1.2.35", + "version": "1.3.0", "license": "MIT", "type": "module", "main": "index.js", @@ -36,4 +36,4 @@ "access": "public", "registry": "https://registry.npmjs.org/" } -} +} \ No newline at end of file diff --git a/packages/docs/pages/changelog.mdx b/packages/docs/pages/changelog.mdx index 86ab842b2..6728cf1e2 100644 --- a/packages/docs/pages/changelog.mdx +++ b/packages/docs/pages/changelog.mdx @@ -1,5 +1,37 @@ # Changelog +## 1.3.0 + +- **New Features** + + - Introduced the Baselinks plugin for secure messaging, including installation instructions and usage examples. + - Added a new `PaymentFrame` component for processing payments through Coinbase. + - Added a `ReceiptGenerator` component for generating receipt URLs based on user input. + - Enhanced documentation for the `paymentagent` with multimedia elements and clearer structure. + - Introduced a new `UrlGenerator` component for generating Ethereum transaction URLs and QR codes. + - Updated messaging documentation to clarify the handling of various message types. + +- **Bug Fixes** + + - Corrected video file extensions in the documentation. + +- **Documentation** + + - Revised messaging security documentation for clarity and specificity. + - Updated README files to reflect changes in plugins and add new sections. + +- **Refactor** + + - Renamed and restructured the XMTP class for better clarity and maintainability. + - Simplified the initialization of the XMTP client by removing unnecessary complexity. + +- **Style** + + - Updated CSS styles for various components to enhance visual appeal and consistency. + +- **Chores** + - Updated configuration files for various packages to improve build processes and dependency management. + ## 1.2.35 - **New Features** diff --git a/packages/docs/pages/concepts/xmtp.mdx b/packages/docs/pages/concepts/xmtp.mdx index 66ddc7556..24c8ff5ac 100644 --- a/packages/docs/pages/concepts/xmtp.mdx +++ b/packages/docs/pages/concepts/xmtp.mdx @@ -87,11 +87,10 @@ import { V2Client, V3Client } from "xmtp"; You can create new client instances using the `createClient` helper: ```tsx -import { createClient } from "xmtp"; +import { XMTP } from "xmtp"; -const { v2client } = await createClient({ - // Optional configuration -}); +const xmtp = new XMTP(); +const { v2client, v3client } = await xmtp.init(); ``` ## Availability diff --git a/packages/docs/pages/plugins/cron.mdx b/packages/docs/pages/plugins/cron.mdx index df852a7ad..bded97807 100644 --- a/packages/docs/pages/plugins/cron.mdx +++ b/packages/docs/pages/plugins/cron.mdx @@ -16,12 +16,13 @@ Run a node cron daily to send message to users ```tsx [src/plugins/cron.ts] import cron from "node-cron"; -import { createClient } from "xmtp"; import { RedisClientType } from "@redis/client"; +import { XMTP } from "xmtp"; export async function startCron(redisClient: RedisClientType) { // Daily task - const client = await createClient(); + const xmtp = new XMTP(); + const { v2client, v3client } = await xmtp.init(); console.log("Starting daily cron"); cron.schedule( "0 0 * * *", // Daily or every 5 seconds in debug mode diff --git a/packages/docs/pages/plugins/xmtp.mdx b/packages/docs/pages/plugins/xmtp.mdx index 185cbfa60..f002c4219 100644 --- a/packages/docs/pages/plugins/xmtp.mdx +++ b/packages/docs/pages/plugins/xmtp.mdx @@ -67,7 +67,7 @@ const openai = new OpenAI({ }); const xmtp = new XMTP(onMessage, { - encryptionKey: process.env.LOCAL_KEY, + encryptionKey: /*wallet private key*/, }); await xmtp.init(); @@ -114,7 +114,7 @@ bun install xmtp-web import { XMTP, Message } from "xmtp-web"; const xmtp = new XMTP(onMessage, { - encryptionKey: process.env.LOCAL_KEY, + encryptionKey: /*wallet private key*/, }); await xmtp.init(); diff --git a/packages/docs/vocs.config.tsx b/packages/docs/vocs.config.tsx index 7c05daa21..0a65e1a32 100644 --- a/packages/docs/vocs.config.tsx +++ b/packages/docs/vocs.config.tsx @@ -127,7 +127,7 @@ export default defineConfig({ ], }, { - text: "Fundations", + text: "Foundations", items: [ { text: "Agents", diff --git a/packages/docs/vocs.config.tsx.timestamp-1734881463365-9f79bf95ec7b2.mjs b/packages/docs/vocs.config.tsx.timestamp-1734881463365-9f79bf95ec7b2.mjs deleted file mode 100644 index ddb5b0f86..000000000 --- a/packages/docs/vocs.config.tsx.timestamp-1734881463365-9f79bf95ec7b2.mjs +++ /dev/null @@ -1,182 +0,0 @@ -// vocs.config.tsx -import { defineConfig } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/vocs/_lib/index.js"; -import { Fragment, jsx, jsxs } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/react/jsx-runtime.js"; -var vocs_config_default = defineConfig({ - head: () => { - return /* @__PURE__ */ jsxs(Fragment, { children: [ - /* @__PURE__ */ jsx("meta", { charSet: "utf-8" }), - /* @__PURE__ */ jsx("meta", { name: "viewport", content: "width=device-width" }), - /* @__PURE__ */ jsx("meta", { property: "og:title", content: "MessageKit" }), - /* @__PURE__ */ jsx("meta", { property: "og:image", content: "https://message-kit.org/hero.jpg" }), - /* @__PURE__ */ jsx("meta", { property: "fc:frame", content: "vNext" }), - /* @__PURE__ */ jsx("meta", { property: "of:version", content: "vNext" }), - /* @__PURE__ */ jsx("meta", { property: "of:accepts:xmtp", content: "vNext" }), - /* @__PURE__ */ jsx("meta", { property: "of:image", content: "https://message-kit.org/hero.jpg" }), - /* @__PURE__ */ jsx( - "meta", - { - property: "fc:frame:image", - content: "https://message-kit.org/hero.jpg" - } - ), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1", content: "Docs" }), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1:action", content: "link" }), - /* @__PURE__ */ jsx( - "meta", - { - property: "fc:frame:button:1:target", - content: "https://message-kit.org/" - } - ), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2", content: "Drop a \u2B50\uFE0F" }), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2:action", content: "link" }), - /* @__PURE__ */ jsx( - "meta", - { - property: "fc:frame:button:2:target", - content: "https://github.com/ephemeraHQ/message-kit" - } - ), - /* @__PURE__ */ jsx("meta", { property: "og:site_name", content: "MessageKit" }), - /* @__PURE__ */ jsx("meta", { name: "twitter:card", content: "summary_large_image" }), - /* @__PURE__ */ jsx("meta", { name: "twitter:site", content: "@MessageKit" }), - /* @__PURE__ */ jsx("meta", { name: "twitter:title", content: "MessageKit" }), - /* @__PURE__ */ jsx( - "meta", - { - name: "twitter:description", - content: "MessageKit is a powerful tool for managing your messages." - } - ), - /* @__PURE__ */ jsx("meta", { name: "twitter:image", content: "https://message-kit.org/hero.jpg" }), - /* @__PURE__ */ jsx( - "script", - { - src: "https://plausible.io/js/script.outbound-links.js", - "data-domain": "message-kit.org", - defer: true - } - ) - ] }); - }, - ogImageUrl: { - "/": "/hero.jpg", - "/docs": "/hero.jpg" - }, - title: "MessageKit", - rootDir: ".", - iconUrl: { - light: "/messagekit-logo.png", - dark: "/messagekit-logo.png" - }, - theme: { - accentColor: { - light: "#FA6977", - dark: "#FA6977" - } - }, - socials: [ - { - icon: "github", - link: "https://github.com/ephemeraHQ/message-kit" - } - ], - topNav: [{ text: "Changelog", link: "/changelog" }], - editLink: { - pattern: "https://github.com/ephemeraHQ/message-kit/blob/main/packages/docs/pages/:path", - text: "Suggest changes to this page" - }, - sidebar: [ - { - text: "Quickstart", - link: "/quickstart" - }, - { - text: "UX", - items: [ - { - text: "Concierge", - link: "/skills/concierge" - }, - { - text: "Frames", - link: "/ux/frames" - }, - { - text: "Wallet service", - link: "/ux/wallet-service" - }, - { - text: "Groups", - link: "/ux/groups" - } - ] - }, - { - text: "Community", - items: [ - { - text: "Skills", - link: "/community/skills" - }, - { - text: "Plugins", - link: "/community/plugins" - }, - { - text: "Templates", - link: "/community/templates" - }, - { - text: "Vibes", - link: "/community/vibes" - }, - { - text: "Projects", - link: "/community/projects" - } - ] - }, - { - text: "Fundations", - items: [ - { - text: "Agents", - link: "/concepts/agents" - }, - { - text: "Skills", - link: "/concepts/skills" - }, - { - text: "XMTP", - link: "/concepts/xmtp" - }, - { - text: "Usernames", - link: "/plugins/resolver" - } - ] - }, - { - text: "Contribute", - link: "/contribute" - }, - { - text: "Deployment", - link: "/deployment" - }, - { - text: "Guidelines", - link: "/guidelines" - }, - { - text: "Changelog", - link: "/changelog" - } - ] -}); -export { - vocs_config_default as default -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidm9jcy5jb25maWcudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwidm9jc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBoZWFkOiAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxtZXRhIGNoYXJTZXQ9XCJ1dGYtOFwiIC8+XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGhcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOnRpdGxlXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOmltYWdlXCIgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZVwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6dmVyc2lvblwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6YWNjZXB0czp4bXRwXCIgY29udGVudD1cInZOZXh0XCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJvZjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTppbWFnZVwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCJcbiAgICAgICAgLz5cblxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxXCIgY29udGVudD1cIkRvY3NcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOmFjdGlvblwiIGNvbnRlbnQ9XCJsaW5rXCIgLz5cbiAgICAgICAgPG1ldGFcbiAgICAgICAgICBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOnRhcmdldFwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL1wiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MlwiIGNvbnRlbnQ9XCJEcm9wIGEgXHUyQjUwXHVGRTBGXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MjphY3Rpb25cIiBjb250ZW50PVwibGlua1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246Mjp0YXJnZXRcIlxuICAgICAgICAgIGNvbnRlbnQ9XCJodHRwczovL2dpdGh1Yi5jb20vZXBoZW1lcmFIUS9tZXNzYWdlLWtpdFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2c6c2l0ZV9uYW1lXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpjYXJkXCIgY29udGVudD1cInN1bW1hcnlfbGFyZ2VfaW1hZ2VcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpzaXRlXCIgY29udGVudD1cIkBNZXNzYWdlS2l0XCIgLz5cbiAgICAgICAgPG1ldGEgbmFtZT1cInR3aXR0ZXI6dGl0bGVcIiBjb250ZW50PVwiTWVzc2FnZUtpdFwiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgbmFtZT1cInR3aXR0ZXI6ZGVzY3JpcHRpb25cIlxuICAgICAgICAgIGNvbnRlbnQ9XCJNZXNzYWdlS2l0IGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgbWFuYWdpbmcgeW91ciBtZXNzYWdlcy5cIlxuICAgICAgICAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxzY3JpcHRcbiAgICAgICAgICBzcmM9XCJodHRwczovL3BsYXVzaWJsZS5pby9qcy9zY3JpcHQub3V0Ym91bmQtbGlua3MuanNcIlxuICAgICAgICAgIGRhdGEtZG9tYWluPVwibWVzc2FnZS1raXQub3JnXCJcbiAgICAgICAgICBkZWZlclxuICAgICAgICAvPlxuICAgICAgPC8+XG4gICAgKTtcbiAgfSxcbiAgb2dJbWFnZVVybDoge1xuICAgIFwiL1wiOiBcIi9oZXJvLmpwZ1wiLFxuICAgIFwiL2RvY3NcIjogXCIvaGVyby5qcGdcIixcbiAgfSxcbiAgdGl0bGU6IFwiTWVzc2FnZUtpdFwiLFxuICByb290RGlyOiBcIi5cIixcbiAgaWNvblVybDoge1xuICAgIGxpZ2h0OiBcIi9tZXNzYWdla2l0LWxvZ28ucG5nXCIsXG4gICAgZGFyazogXCIvbWVzc2FnZWtpdC1sb2dvLnBuZ1wiLFxuICB9LFxuICB0aGVtZToge1xuICAgIGFjY2VudENvbG9yOiB7XG4gICAgICBsaWdodDogXCIjRkE2OTc3XCIsXG4gICAgICBkYXJrOiBcIiNGQTY5NzdcIixcbiAgICB9LFxuICB9LFxuICBzb2NpYWxzOiBbXG4gICAge1xuICAgICAgaWNvbjogXCJnaXRodWJcIixcbiAgICAgIGxpbms6IFwiaHR0cHM6Ly9naXRodWIuY29tL2VwaGVtZXJhSFEvbWVzc2FnZS1raXRcIixcbiAgICB9LFxuICBdLFxuICB0b3BOYXY6IFt7IHRleHQ6IFwiQ2hhbmdlbG9nXCIsIGxpbms6IFwiL2NoYW5nZWxvZ1wiIH1dLFxuICBlZGl0TGluazoge1xuICAgIHBhdHRlcm46XG4gICAgICBcImh0dHBzOi8vZ2l0aHViLmNvbS9lcGhlbWVyYUhRL21lc3NhZ2Uta2l0L2Jsb2IvbWFpbi9wYWNrYWdlcy9kb2NzL3BhZ2VzLzpwYXRoXCIsXG4gICAgdGV4dDogXCJTdWdnZXN0IGNoYW5nZXMgdG8gdGhpcyBwYWdlXCIsXG4gIH0sXG4gIHNpZGViYXI6IFtcbiAgICB7XG4gICAgICB0ZXh0OiBcIlF1aWNrc3RhcnRcIixcbiAgICAgIGxpbms6IFwiL3F1aWNrc3RhcnRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiVVhcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkNvbmNpZXJnZVwiLFxuICAgICAgICAgIGxpbms6IFwiL3NraWxscy9jb25jaWVyZ2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiRnJhbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZnJhbWVzXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIldhbGxldCBzZXJ2aWNlXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvd2FsbGV0LXNlcnZpY2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiR3JvdXBzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZ3JvdXBzXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJDb21tdW5pdHlcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlNraWxsc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUGx1Z2luc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9wbHVnaW5zXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlRlbXBsYXRlc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS90ZW1wbGF0ZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVmliZXNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvdmliZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUHJvamVjdHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvcHJvamVjdHNcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkZ1bmRhdGlvbnNcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkFnZW50c1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL2FnZW50c1wiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJTa2lsbHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb25jZXB0cy9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiWE1UUFwiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL3htdHBcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVXNlcm5hbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvcGx1Z2lucy9yZXNvbHZlclwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ29udHJpYnV0ZVwiLFxuICAgICAgbGluazogXCIvY29udHJpYnV0ZVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJEZXBsb3ltZW50XCIsXG4gICAgICBsaW5rOiBcIi9kZXBsb3ltZW50XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkd1aWRlbGluZXNcIixcbiAgICAgIGxpbms6IFwiL2d1aWRlbGluZXNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ2hhbmdlbG9nXCIsXG4gICAgICBsaW5r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 diff --git a/packages/docs/vocs.config.tsx.timestamp-1734881463377-71370c3873b4a.mjs b/packages/docs/vocs.config.tsx.timestamp-1734881463377-71370c3873b4a.mjs deleted file mode 100644 index ddb5b0f86..000000000 --- a/packages/docs/vocs.config.tsx.timestamp-1734881463377-71370c3873b4a.mjs +++ /dev/null @@ -1,182 +0,0 @@ -// vocs.config.tsx -import { defineConfig } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/vocs/_lib/index.js"; -import { Fragment, jsx, jsxs } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/react/jsx-runtime.js"; -var vocs_config_default = defineConfig({ - head: () => { - return /* @__PURE__ */ jsxs(Fragment, { children: [ - /* @__PURE__ */ jsx("meta", { charSet: "utf-8" }), - /* @__PURE__ */ jsx("meta", { name: "viewport", content: "width=device-width" }), - /* @__PURE__ */ jsx("meta", { property: "og:title", content: "MessageKit" }), - /* @__PURE__ */ jsx("meta", { property: "og:image", content: "https://message-kit.org/hero.jpg" }), - /* @__PURE__ */ jsx("meta", { property: "fc:frame", content: "vNext" }), - /* @__PURE__ */ jsx("meta", { property: "of:version", content: "vNext" }), - /* @__PURE__ */ jsx("meta", { property: "of:accepts:xmtp", content: "vNext" }), - /* @__PURE__ */ jsx("meta", { property: "of:image", content: "https://message-kit.org/hero.jpg" }), - /* @__PURE__ */ jsx( - "meta", - { - property: "fc:frame:image", - content: "https://message-kit.org/hero.jpg" - } - ), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1", content: "Docs" }), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1:action", content: "link" }), - /* @__PURE__ */ jsx( - "meta", - { - property: "fc:frame:button:1:target", - content: "https://message-kit.org/" - } - ), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2", content: "Drop a \u2B50\uFE0F" }), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2:action", content: "link" }), - /* @__PURE__ */ jsx( - "meta", - { - property: "fc:frame:button:2:target", - content: "https://github.com/ephemeraHQ/message-kit" - } - ), - /* @__PURE__ */ jsx("meta", { property: "og:site_name", content: "MessageKit" }), - /* @__PURE__ */ jsx("meta", { name: "twitter:card", content: "summary_large_image" }), - /* @__PURE__ */ jsx("meta", { name: "twitter:site", content: "@MessageKit" }), - /* @__PURE__ */ jsx("meta", { name: "twitter:title", content: "MessageKit" }), - /* @__PURE__ */ jsx( - "meta", - { - name: "twitter:description", - content: "MessageKit is a powerful tool for managing your messages." - } - ), - /* @__PURE__ */ jsx("meta", { name: "twitter:image", content: "https://message-kit.org/hero.jpg" }), - /* @__PURE__ */ jsx( - "script", - { - src: "https://plausible.io/js/script.outbound-links.js", - "data-domain": "message-kit.org", - defer: true - } - ) - ] }); - }, - ogImageUrl: { - "/": "/hero.jpg", - "/docs": "/hero.jpg" - }, - title: "MessageKit", - rootDir: ".", - iconUrl: { - light: "/messagekit-logo.png", - dark: "/messagekit-logo.png" - }, - theme: { - accentColor: { - light: "#FA6977", - dark: "#FA6977" - } - }, - socials: [ - { - icon: "github", - link: "https://github.com/ephemeraHQ/message-kit" - } - ], - topNav: [{ text: "Changelog", link: "/changelog" }], - editLink: { - pattern: "https://github.com/ephemeraHQ/message-kit/blob/main/packages/docs/pages/:path", - text: "Suggest changes to this page" - }, - sidebar: [ - { - text: "Quickstart", - link: "/quickstart" - }, - { - text: "UX", - items: [ - { - text: "Concierge", - link: "/skills/concierge" - }, - { - text: "Frames", - link: "/ux/frames" - }, - { - text: "Wallet service", - link: "/ux/wallet-service" - }, - { - text: "Groups", - link: "/ux/groups" - } - ] - }, - { - text: "Community", - items: [ - { - text: "Skills", - link: "/community/skills" - }, - { - text: "Plugins", - link: "/community/plugins" - }, - { - text: "Templates", - link: "/community/templates" - }, - { - text: "Vibes", - link: "/community/vibes" - }, - { - text: "Projects", - link: "/community/projects" - } - ] - }, - { - text: "Fundations", - items: [ - { - text: "Agents", - link: "/concepts/agents" - }, - { - text: "Skills", - link: "/concepts/skills" - }, - { - text: "XMTP", - link: "/concepts/xmtp" - }, - { - text: "Usernames", - link: "/plugins/resolver" - } - ] - }, - { - text: "Contribute", - link: "/contribute" - }, - { - text: "Deployment", - link: "/deployment" - }, - { - text: "Guidelines", - link: "/guidelines" - }, - { - text: "Changelog", - link: "/changelog" - } - ] -}); -export { - vocs_config_default as default -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidm9jcy5jb25maWcudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwidm9jc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBoZWFkOiAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxtZXRhIGNoYXJTZXQ9XCJ1dGYtOFwiIC8+XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGhcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOnRpdGxlXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOmltYWdlXCIgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZVwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6dmVyc2lvblwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6YWNjZXB0czp4bXRwXCIgY29udGVudD1cInZOZXh0XCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJvZjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTppbWFnZVwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCJcbiAgICAgICAgLz5cblxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxXCIgY29udGVudD1cIkRvY3NcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOmFjdGlvblwiIGNvbnRlbnQ9XCJsaW5rXCIgLz5cbiAgICAgICAgPG1ldGFcbiAgICAgICAgICBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOnRhcmdldFwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL1wiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MlwiIGNvbnRlbnQ9XCJEcm9wIGEgXHUyQjUwXHVGRTBGXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MjphY3Rpb25cIiBjb250ZW50PVwibGlua1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246Mjp0YXJnZXRcIlxuICAgICAgICAgIGNvbnRlbnQ9XCJodHRwczovL2dpdGh1Yi5jb20vZXBoZW1lcmFIUS9tZXNzYWdlLWtpdFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2c6c2l0ZV9uYW1lXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpjYXJkXCIgY29udGVudD1cInN1bW1hcnlfbGFyZ2VfaW1hZ2VcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpzaXRlXCIgY29udGVudD1cIkBNZXNzYWdlS2l0XCIgLz5cbiAgICAgICAgPG1ldGEgbmFtZT1cInR3aXR0ZXI6dGl0bGVcIiBjb250ZW50PVwiTWVzc2FnZUtpdFwiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgbmFtZT1cInR3aXR0ZXI6ZGVzY3JpcHRpb25cIlxuICAgICAgICAgIGNvbnRlbnQ9XCJNZXNzYWdlS2l0IGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgbWFuYWdpbmcgeW91ciBtZXNzYWdlcy5cIlxuICAgICAgICAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxzY3JpcHRcbiAgICAgICAgICBzcmM9XCJodHRwczovL3BsYXVzaWJsZS5pby9qcy9zY3JpcHQub3V0Ym91bmQtbGlua3MuanNcIlxuICAgICAgICAgIGRhdGEtZG9tYWluPVwibWVzc2FnZS1raXQub3JnXCJcbiAgICAgICAgICBkZWZlclxuICAgICAgICAvPlxuICAgICAgPC8+XG4gICAgKTtcbiAgfSxcbiAgb2dJbWFnZVVybDoge1xuICAgIFwiL1wiOiBcIi9oZXJvLmpwZ1wiLFxuICAgIFwiL2RvY3NcIjogXCIvaGVyby5qcGdcIixcbiAgfSxcbiAgdGl0bGU6IFwiTWVzc2FnZUtpdFwiLFxuICByb290RGlyOiBcIi5cIixcbiAgaWNvblVybDoge1xuICAgIGxpZ2h0OiBcIi9tZXNzYWdla2l0LWxvZ28ucG5nXCIsXG4gICAgZGFyazogXCIvbWVzc2FnZWtpdC1sb2dvLnBuZ1wiLFxuICB9LFxuICB0aGVtZToge1xuICAgIGFjY2VudENvbG9yOiB7XG4gICAgICBsaWdodDogXCIjRkE2OTc3XCIsXG4gICAgICBkYXJrOiBcIiNGQTY5NzdcIixcbiAgICB9LFxuICB9LFxuICBzb2NpYWxzOiBbXG4gICAge1xuICAgICAgaWNvbjogXCJnaXRodWJcIixcbiAgICAgIGxpbms6IFwiaHR0cHM6Ly9naXRodWIuY29tL2VwaGVtZXJhSFEvbWVzc2FnZS1raXRcIixcbiAgICB9LFxuICBdLFxuICB0b3BOYXY6IFt7IHRleHQ6IFwiQ2hhbmdlbG9nXCIsIGxpbms6IFwiL2NoYW5nZWxvZ1wiIH1dLFxuICBlZGl0TGluazoge1xuICAgIHBhdHRlcm46XG4gICAgICBcImh0dHBzOi8vZ2l0aHViLmNvbS9lcGhlbWVyYUhRL21lc3NhZ2Uta2l0L2Jsb2IvbWFpbi9wYWNrYWdlcy9kb2NzL3BhZ2VzLzpwYXRoXCIsXG4gICAgdGV4dDogXCJTdWdnZXN0IGNoYW5nZXMgdG8gdGhpcyBwYWdlXCIsXG4gIH0sXG4gIHNpZGViYXI6IFtcbiAgICB7XG4gICAgICB0ZXh0OiBcIlF1aWNrc3RhcnRcIixcbiAgICAgIGxpbms6IFwiL3F1aWNrc3RhcnRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiVVhcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkNvbmNpZXJnZVwiLFxuICAgICAgICAgIGxpbms6IFwiL3NraWxscy9jb25jaWVyZ2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiRnJhbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZnJhbWVzXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIldhbGxldCBzZXJ2aWNlXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvd2FsbGV0LXNlcnZpY2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiR3JvdXBzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZ3JvdXBzXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJDb21tdW5pdHlcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlNraWxsc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUGx1Z2luc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9wbHVnaW5zXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlRlbXBsYXRlc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS90ZW1wbGF0ZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVmliZXNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvdmliZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUHJvamVjdHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvcHJvamVjdHNcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkZ1bmRhdGlvbnNcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkFnZW50c1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL2FnZW50c1wiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJTa2lsbHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb25jZXB0cy9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiWE1UUFwiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL3htdHBcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVXNlcm5hbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvcGx1Z2lucy9yZXNvbHZlclwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ29udHJpYnV0ZVwiLFxuICAgICAgbGluazogXCIvY29udHJpYnV0ZVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJEZXBsb3ltZW50XCIsXG4gICAgICBsaW5rOiBcIi9kZXBsb3ltZW50XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkd1aWRlbGluZXNcIixcbiAgICAgIGxpbms6IFwiL2d1aWRlbGluZXNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ2hhbmdlbG9nXCIsXG4gICAgICBsaW5r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 diff --git a/packages/docs/vocs.config.tsx.timestamp-1734881463417-5232a778f8c7d.mjs b/packages/docs/vocs.config.tsx.timestamp-1734881463417-5232a778f8c7d.mjs deleted file mode 100644 index ddb5b0f86..000000000 --- a/packages/docs/vocs.config.tsx.timestamp-1734881463417-5232a778f8c7d.mjs +++ /dev/null @@ -1,182 +0,0 @@ -// vocs.config.tsx -import { defineConfig } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/vocs/_lib/index.js"; -import { Fragment, jsx, jsxs } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/react/jsx-runtime.js"; -var vocs_config_default = defineConfig({ - head: () => { - return /* @__PURE__ */ jsxs(Fragment, { children: [ - /* @__PURE__ */ jsx("meta", { charSet: "utf-8" }), - /* @__PURE__ */ jsx("meta", { name: "viewport", content: "width=device-width" }), - /* @__PURE__ */ jsx("meta", { property: "og:title", content: "MessageKit" }), - /* @__PURE__ */ jsx("meta", { property: "og:image", content: "https://message-kit.org/hero.jpg" }), - /* @__PURE__ */ jsx("meta", { property: "fc:frame", content: "vNext" }), - /* @__PURE__ */ jsx("meta", { property: "of:version", content: "vNext" }), - /* @__PURE__ */ jsx("meta", { property: "of:accepts:xmtp", content: "vNext" }), - /* @__PURE__ */ jsx("meta", { property: "of:image", content: "https://message-kit.org/hero.jpg" }), - /* @__PURE__ */ jsx( - "meta", - { - property: "fc:frame:image", - content: "https://message-kit.org/hero.jpg" - } - ), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1", content: "Docs" }), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1:action", content: "link" }), - /* @__PURE__ */ jsx( - "meta", - { - property: "fc:frame:button:1:target", - content: "https://message-kit.org/" - } - ), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2", content: "Drop a \u2B50\uFE0F" }), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2:action", content: "link" }), - /* @__PURE__ */ jsx( - "meta", - { - property: "fc:frame:button:2:target", - content: "https://github.com/ephemeraHQ/message-kit" - } - ), - /* @__PURE__ */ jsx("meta", { property: "og:site_name", content: "MessageKit" }), - /* @__PURE__ */ jsx("meta", { name: "twitter:card", content: "summary_large_image" }), - /* @__PURE__ */ jsx("meta", { name: "twitter:site", content: "@MessageKit" }), - /* @__PURE__ */ jsx("meta", { name: "twitter:title", content: "MessageKit" }), - /* @__PURE__ */ jsx( - "meta", - { - name: "twitter:description", - content: "MessageKit is a powerful tool for managing your messages." - } - ), - /* @__PURE__ */ jsx("meta", { name: "twitter:image", content: "https://message-kit.org/hero.jpg" }), - /* @__PURE__ */ jsx( - "script", - { - src: "https://plausible.io/js/script.outbound-links.js", - "data-domain": "message-kit.org", - defer: true - } - ) - ] }); - }, - ogImageUrl: { - "/": "/hero.jpg", - "/docs": "/hero.jpg" - }, - title: "MessageKit", - rootDir: ".", - iconUrl: { - light: "/messagekit-logo.png", - dark: "/messagekit-logo.png" - }, - theme: { - accentColor: { - light: "#FA6977", - dark: "#FA6977" - } - }, - socials: [ - { - icon: "github", - link: "https://github.com/ephemeraHQ/message-kit" - } - ], - topNav: [{ text: "Changelog", link: "/changelog" }], - editLink: { - pattern: "https://github.com/ephemeraHQ/message-kit/blob/main/packages/docs/pages/:path", - text: "Suggest changes to this page" - }, - sidebar: [ - { - text: "Quickstart", - link: "/quickstart" - }, - { - text: "UX", - items: [ - { - text: "Concierge", - link: "/skills/concierge" - }, - { - text: "Frames", - link: "/ux/frames" - }, - { - text: "Wallet service", - link: "/ux/wallet-service" - }, - { - text: "Groups", - link: "/ux/groups" - } - ] - }, - { - text: "Community", - items: [ - { - text: "Skills", - link: "/community/skills" - }, - { - text: "Plugins", - link: "/community/plugins" - }, - { - text: "Templates", - link: "/community/templates" - }, - { - text: "Vibes", - link: "/community/vibes" - }, - { - text: "Projects", - link: "/community/projects" - } - ] - }, - { - text: "Fundations", - items: [ - { - text: "Agents", - link: "/concepts/agents" - }, - { - text: "Skills", - link: "/concepts/skills" - }, - { - text: "XMTP", - link: "/concepts/xmtp" - }, - { - text: "Usernames", - link: "/plugins/resolver" - } - ] - }, - { - text: "Contribute", - link: "/contribute" - }, - { - text: "Deployment", - link: "/deployment" - }, - { - text: "Guidelines", - link: "/guidelines" - }, - { - text: "Changelog", - link: "/changelog" - } - ] -}); -export { - vocs_config_default as default -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidm9jcy5jb25maWcudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwidm9jc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBoZWFkOiAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxtZXRhIGNoYXJTZXQ9XCJ1dGYtOFwiIC8+XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGhcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOnRpdGxlXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOmltYWdlXCIgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZVwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6dmVyc2lvblwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6YWNjZXB0czp4bXRwXCIgY29udGVudD1cInZOZXh0XCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJvZjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTppbWFnZVwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCJcbiAgICAgICAgLz5cblxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxXCIgY29udGVudD1cIkRvY3NcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOmFjdGlvblwiIGNvbnRlbnQ9XCJsaW5rXCIgLz5cbiAgICAgICAgPG1ldGFcbiAgICAgICAgICBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOnRhcmdldFwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL1wiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MlwiIGNvbnRlbnQ9XCJEcm9wIGEgXHUyQjUwXHVGRTBGXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MjphY3Rpb25cIiBjb250ZW50PVwibGlua1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246Mjp0YXJnZXRcIlxuICAgICAgICAgIGNvbnRlbnQ9XCJodHRwczovL2dpdGh1Yi5jb20vZXBoZW1lcmFIUS9tZXNzYWdlLWtpdFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2c6c2l0ZV9uYW1lXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpjYXJkXCIgY29udGVudD1cInN1bW1hcnlfbGFyZ2VfaW1hZ2VcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpzaXRlXCIgY29udGVudD1cIkBNZXNzYWdlS2l0XCIgLz5cbiAgICAgICAgPG1ldGEgbmFtZT1cInR3aXR0ZXI6dGl0bGVcIiBjb250ZW50PVwiTWVzc2FnZUtpdFwiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgbmFtZT1cInR3aXR0ZXI6ZGVzY3JpcHRpb25cIlxuICAgICAgICAgIGNvbnRlbnQ9XCJNZXNzYWdlS2l0IGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgbWFuYWdpbmcgeW91ciBtZXNzYWdlcy5cIlxuICAgICAgICAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxzY3JpcHRcbiAgICAgICAgICBzcmM9XCJodHRwczovL3BsYXVzaWJsZS5pby9qcy9zY3JpcHQub3V0Ym91bmQtbGlua3MuanNcIlxuICAgICAgICAgIGRhdGEtZG9tYWluPVwibWVzc2FnZS1raXQub3JnXCJcbiAgICAgICAgICBkZWZlclxuICAgICAgICAvPlxuICAgICAgPC8+XG4gICAgKTtcbiAgfSxcbiAgb2dJbWFnZVVybDoge1xuICAgIFwiL1wiOiBcIi9oZXJvLmpwZ1wiLFxuICAgIFwiL2RvY3NcIjogXCIvaGVyby5qcGdcIixcbiAgfSxcbiAgdGl0bGU6IFwiTWVzc2FnZUtpdFwiLFxuICByb290RGlyOiBcIi5cIixcbiAgaWNvblVybDoge1xuICAgIGxpZ2h0OiBcIi9tZXNzYWdla2l0LWxvZ28ucG5nXCIsXG4gICAgZGFyazogXCIvbWVzc2FnZWtpdC1sb2dvLnBuZ1wiLFxuICB9LFxuICB0aGVtZToge1xuICAgIGFjY2VudENvbG9yOiB7XG4gICAgICBsaWdodDogXCIjRkE2OTc3XCIsXG4gICAgICBkYXJrOiBcIiNGQTY5NzdcIixcbiAgICB9LFxuICB9LFxuICBzb2NpYWxzOiBbXG4gICAge1xuICAgICAgaWNvbjogXCJnaXRodWJcIixcbiAgICAgIGxpbms6IFwiaHR0cHM6Ly9naXRodWIuY29tL2VwaGVtZXJhSFEvbWVzc2FnZS1raXRcIixcbiAgICB9LFxuICBdLFxuICB0b3BOYXY6IFt7IHRleHQ6IFwiQ2hhbmdlbG9nXCIsIGxpbms6IFwiL2NoYW5nZWxvZ1wiIH1dLFxuICBlZGl0TGluazoge1xuICAgIHBhdHRlcm46XG4gICAgICBcImh0dHBzOi8vZ2l0aHViLmNvbS9lcGhlbWVyYUhRL21lc3NhZ2Uta2l0L2Jsb2IvbWFpbi9wYWNrYWdlcy9kb2NzL3BhZ2VzLzpwYXRoXCIsXG4gICAgdGV4dDogXCJTdWdnZXN0IGNoYW5nZXMgdG8gdGhpcyBwYWdlXCIsXG4gIH0sXG4gIHNpZGViYXI6IFtcbiAgICB7XG4gICAgICB0ZXh0OiBcIlF1aWNrc3RhcnRcIixcbiAgICAgIGxpbms6IFwiL3F1aWNrc3RhcnRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiVVhcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkNvbmNpZXJnZVwiLFxuICAgICAgICAgIGxpbms6IFwiL3NraWxscy9jb25jaWVyZ2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiRnJhbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZnJhbWVzXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIldhbGxldCBzZXJ2aWNlXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvd2FsbGV0LXNlcnZpY2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiR3JvdXBzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZ3JvdXBzXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJDb21tdW5pdHlcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlNraWxsc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUGx1Z2luc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9wbHVnaW5zXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlRlbXBsYXRlc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS90ZW1wbGF0ZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVmliZXNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvdmliZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUHJvamVjdHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvcHJvamVjdHNcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkZ1bmRhdGlvbnNcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkFnZW50c1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL2FnZW50c1wiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJTa2lsbHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb25jZXB0cy9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiWE1UUFwiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL3htdHBcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVXNlcm5hbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvcGx1Z2lucy9yZXNvbHZlclwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ29udHJpYnV0ZVwiLFxuICAgICAgbGluazogXCIvY29udHJpYnV0ZVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJEZXBsb3ltZW50XCIsXG4gICAgICBsaW5rOiBcIi9kZXBsb3ltZW50XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkd1aWRlbGluZXNcIixcbiAgICAgIGxpbms6IFwiL2d1aWRlbGluZXNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ2hhbmdlbG9nXCIsXG4gICAgICBsaW5r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 diff --git a/packages/docs/vocs.config.tsx.timestamp-1734972589941-faf7cf2428c66.mjs b/packages/docs/vocs.config.tsx.timestamp-1734972589941-faf7cf2428c66.mjs deleted file mode 100644 index ddb5b0f86..000000000 --- a/packages/docs/vocs.config.tsx.timestamp-1734972589941-faf7cf2428c66.mjs +++ /dev/null @@ -1,182 +0,0 @@ -// vocs.config.tsx -import { defineConfig } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/vocs/_lib/index.js"; -import { Fragment, jsx, jsxs } from "file:///Users/fabrizioguespe/DevRel/message-kit/node_modules/react/jsx-runtime.js"; -var vocs_config_default = defineConfig({ - head: () => { - return /* @__PURE__ */ jsxs(Fragment, { children: [ - /* @__PURE__ */ jsx("meta", { charSet: "utf-8" }), - /* @__PURE__ */ jsx("meta", { name: "viewport", content: "width=device-width" }), - /* @__PURE__ */ jsx("meta", { property: "og:title", content: "MessageKit" }), - /* @__PURE__ */ jsx("meta", { property: "og:image", content: "https://message-kit.org/hero.jpg" }), - /* @__PURE__ */ jsx("meta", { property: "fc:frame", content: "vNext" }), - /* @__PURE__ */ jsx("meta", { property: "of:version", content: "vNext" }), - /* @__PURE__ */ jsx("meta", { property: "of:accepts:xmtp", content: "vNext" }), - /* @__PURE__ */ jsx("meta", { property: "of:image", content: "https://message-kit.org/hero.jpg" }), - /* @__PURE__ */ jsx( - "meta", - { - property: "fc:frame:image", - content: "https://message-kit.org/hero.jpg" - } - ), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1", content: "Docs" }), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:1:action", content: "link" }), - /* @__PURE__ */ jsx( - "meta", - { - property: "fc:frame:button:1:target", - content: "https://message-kit.org/" - } - ), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2", content: "Drop a \u2B50\uFE0F" }), - /* @__PURE__ */ jsx("meta", { property: "fc:frame:button:2:action", content: "link" }), - /* @__PURE__ */ jsx( - "meta", - { - property: "fc:frame:button:2:target", - content: "https://github.com/ephemeraHQ/message-kit" - } - ), - /* @__PURE__ */ jsx("meta", { property: "og:site_name", content: "MessageKit" }), - /* @__PURE__ */ jsx("meta", { name: "twitter:card", content: "summary_large_image" }), - /* @__PURE__ */ jsx("meta", { name: "twitter:site", content: "@MessageKit" }), - /* @__PURE__ */ jsx("meta", { name: "twitter:title", content: "MessageKit" }), - /* @__PURE__ */ jsx( - "meta", - { - name: "twitter:description", - content: "MessageKit is a powerful tool for managing your messages." - } - ), - /* @__PURE__ */ jsx("meta", { name: "twitter:image", content: "https://message-kit.org/hero.jpg" }), - /* @__PURE__ */ jsx( - "script", - { - src: "https://plausible.io/js/script.outbound-links.js", - "data-domain": "message-kit.org", - defer: true - } - ) - ] }); - }, - ogImageUrl: { - "/": "/hero.jpg", - "/docs": "/hero.jpg" - }, - title: "MessageKit", - rootDir: ".", - iconUrl: { - light: "/messagekit-logo.png", - dark: "/messagekit-logo.png" - }, - theme: { - accentColor: { - light: "#FA6977", - dark: "#FA6977" - } - }, - socials: [ - { - icon: "github", - link: "https://github.com/ephemeraHQ/message-kit" - } - ], - topNav: [{ text: "Changelog", link: "/changelog" }], - editLink: { - pattern: "https://github.com/ephemeraHQ/message-kit/blob/main/packages/docs/pages/:path", - text: "Suggest changes to this page" - }, - sidebar: [ - { - text: "Quickstart", - link: "/quickstart" - }, - { - text: "UX", - items: [ - { - text: "Concierge", - link: "/skills/concierge" - }, - { - text: "Frames", - link: "/ux/frames" - }, - { - text: "Wallet service", - link: "/ux/wallet-service" - }, - { - text: "Groups", - link: "/ux/groups" - } - ] - }, - { - text: "Community", - items: [ - { - text: "Skills", - link: "/community/skills" - }, - { - text: "Plugins", - link: "/community/plugins" - }, - { - text: "Templates", - link: "/community/templates" - }, - { - text: "Vibes", - link: "/community/vibes" - }, - { - text: "Projects", - link: "/community/projects" - } - ] - }, - { - text: "Fundations", - items: [ - { - text: "Agents", - link: "/concepts/agents" - }, - { - text: "Skills", - link: "/concepts/skills" - }, - { - text: "XMTP", - link: "/concepts/xmtp" - }, - { - text: "Usernames", - link: "/plugins/resolver" - } - ] - }, - { - text: "Contribute", - link: "/contribute" - }, - { - text: "Deployment", - link: "/deployment" - }, - { - text: "Guidelines", - link: "/guidelines" - }, - { - text: "Changelog", - link: "/changelog" - } - ] -}); -export { - vocs_config_default as default -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidm9jcy5jb25maWcudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwidm9jc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBoZWFkOiAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxtZXRhIGNoYXJTZXQ9XCJ1dGYtOFwiIC8+XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGhcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOnRpdGxlXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cIm9nOmltYWdlXCIgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZVwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6dmVyc2lvblwiIGNvbnRlbnQ9XCJ2TmV4dFwiIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2Y6YWNjZXB0czp4bXRwXCIgY29udGVudD1cInZOZXh0XCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJvZjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTppbWFnZVwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL2hlcm8uanBnXCJcbiAgICAgICAgLz5cblxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxXCIgY29udGVudD1cIkRvY3NcIiAvPlxuICAgICAgICA8bWV0YSBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOmFjdGlvblwiIGNvbnRlbnQ9XCJsaW5rXCIgLz5cbiAgICAgICAgPG1ldGFcbiAgICAgICAgICBwcm9wZXJ0eT1cImZjOmZyYW1lOmJ1dHRvbjoxOnRhcmdldFwiXG4gICAgICAgICAgY29udGVudD1cImh0dHBzOi8vbWVzc2FnZS1raXQub3JnL1wiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MlwiIGNvbnRlbnQ9XCJEcm9wIGEgXHUyQjUwXHVGRTBGXCIgLz5cbiAgICAgICAgPG1ldGEgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246MjphY3Rpb25cIiBjb250ZW50PVwibGlua1wiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgcHJvcGVydHk9XCJmYzpmcmFtZTpidXR0b246Mjp0YXJnZXRcIlxuICAgICAgICAgIGNvbnRlbnQ9XCJodHRwczovL2dpdGh1Yi5jb20vZXBoZW1lcmFIUS9tZXNzYWdlLWtpdFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxtZXRhIHByb3BlcnR5PVwib2c6c2l0ZV9uYW1lXCIgY29udGVudD1cIk1lc3NhZ2VLaXRcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpjYXJkXCIgY29udGVudD1cInN1bW1hcnlfbGFyZ2VfaW1hZ2VcIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjpzaXRlXCIgY29udGVudD1cIkBNZXNzYWdlS2l0XCIgLz5cbiAgICAgICAgPG1ldGEgbmFtZT1cInR3aXR0ZXI6dGl0bGVcIiBjb250ZW50PVwiTWVzc2FnZUtpdFwiIC8+XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgbmFtZT1cInR3aXR0ZXI6ZGVzY3JpcHRpb25cIlxuICAgICAgICAgIGNvbnRlbnQ9XCJNZXNzYWdlS2l0IGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgbWFuYWdpbmcgeW91ciBtZXNzYWdlcy5cIlxuICAgICAgICAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidHdpdHRlcjppbWFnZVwiIGNvbnRlbnQ9XCJodHRwczovL21lc3NhZ2Uta2l0Lm9yZy9oZXJvLmpwZ1wiIC8+XG4gICAgICAgIDxzY3JpcHRcbiAgICAgICAgICBzcmM9XCJodHRwczovL3BsYXVzaWJsZS5pby9qcy9zY3JpcHQub3V0Ym91bmQtbGlua3MuanNcIlxuICAgICAgICAgIGRhdGEtZG9tYWluPVwibWVzc2FnZS1raXQub3JnXCJcbiAgICAgICAgICBkZWZlclxuICAgICAgICAvPlxuICAgICAgPC8+XG4gICAgKTtcbiAgfSxcbiAgb2dJbWFnZVVybDoge1xuICAgIFwiL1wiOiBcIi9oZXJvLmpwZ1wiLFxuICAgIFwiL2RvY3NcIjogXCIvaGVyby5qcGdcIixcbiAgfSxcbiAgdGl0bGU6IFwiTWVzc2FnZUtpdFwiLFxuICByb290RGlyOiBcIi5cIixcbiAgaWNvblVybDoge1xuICAgIGxpZ2h0OiBcIi9tZXNzYWdla2l0LWxvZ28ucG5nXCIsXG4gICAgZGFyazogXCIvbWVzc2FnZWtpdC1sb2dvLnBuZ1wiLFxuICB9LFxuICB0aGVtZToge1xuICAgIGFjY2VudENvbG9yOiB7XG4gICAgICBsaWdodDogXCIjRkE2OTc3XCIsXG4gICAgICBkYXJrOiBcIiNGQTY5NzdcIixcbiAgICB9LFxuICB9LFxuICBzb2NpYWxzOiBbXG4gICAge1xuICAgICAgaWNvbjogXCJnaXRodWJcIixcbiAgICAgIGxpbms6IFwiaHR0cHM6Ly9naXRodWIuY29tL2VwaGVtZXJhSFEvbWVzc2FnZS1raXRcIixcbiAgICB9LFxuICBdLFxuICB0b3BOYXY6IFt7IHRleHQ6IFwiQ2hhbmdlbG9nXCIsIGxpbms6IFwiL2NoYW5nZWxvZ1wiIH1dLFxuICBlZGl0TGluazoge1xuICAgIHBhdHRlcm46XG4gICAgICBcImh0dHBzOi8vZ2l0aHViLmNvbS9lcGhlbWVyYUhRL21lc3NhZ2Uta2l0L2Jsb2IvbWFpbi9wYWNrYWdlcy9kb2NzL3BhZ2VzLzpwYXRoXCIsXG4gICAgdGV4dDogXCJTdWdnZXN0IGNoYW5nZXMgdG8gdGhpcyBwYWdlXCIsXG4gIH0sXG4gIHNpZGViYXI6IFtcbiAgICB7XG4gICAgICB0ZXh0OiBcIlF1aWNrc3RhcnRcIixcbiAgICAgIGxpbms6IFwiL3F1aWNrc3RhcnRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiVVhcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkNvbmNpZXJnZVwiLFxuICAgICAgICAgIGxpbms6IFwiL3NraWxscy9jb25jaWVyZ2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiRnJhbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZnJhbWVzXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIldhbGxldCBzZXJ2aWNlXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvd2FsbGV0LXNlcnZpY2VcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiR3JvdXBzXCIsXG4gICAgICAgICAgbGluazogXCIvdXgvZ3JvdXBzXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJDb21tdW5pdHlcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlNraWxsc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUGx1Z2luc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS9wbHVnaW5zXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlRlbXBsYXRlc1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbW11bml0eS90ZW1wbGF0ZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVmliZXNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvdmliZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiUHJvamVjdHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb21tdW5pdHkvcHJvamVjdHNcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkZ1bmRhdGlvbnNcIixcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkFnZW50c1wiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL2FnZW50c1wiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJTa2lsbHNcIixcbiAgICAgICAgICBsaW5rOiBcIi9jb25jZXB0cy9za2lsbHNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiWE1UUFwiLFxuICAgICAgICAgIGxpbms6IFwiL2NvbmNlcHRzL3htdHBcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVXNlcm5hbWVzXCIsXG4gICAgICAgICAgbGluazogXCIvcGx1Z2lucy9yZXNvbHZlclwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ29udHJpYnV0ZVwiLFxuICAgICAgbGluazogXCIvY29udHJpYnV0ZVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJEZXBsb3ltZW50XCIsXG4gICAgICBsaW5rOiBcIi9kZXBsb3ltZW50XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkd1aWRlbGluZXNcIixcbiAgICAgIGxpbms6IFwiL2d1aWRlbGluZXNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiQ2hhbmdlbG9nXCIsXG4gICAgICBsaW5r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 diff --git a/packages/docs/vocs.config.tsx.timestamp-1734972589960-8ba90b016df.mjs b/packages/docs/vocs.config.tsx.timestamp-1734972589960-8ba90b016df.mjs deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/message-kit/package.json b/packages/message-kit/package.json index 0ce2d88f1..ecaa3a1c9 100644 --- a/packages/message-kit/package.json +++ b/packages/message-kit/package.json @@ -81,4 +81,4 @@ "access": "public", "registry": "https://registry.npmjs.org/" } -} +} \ No newline at end of file diff --git a/packages/message-kit/src/lib/core.ts b/packages/message-kit/src/lib/core.ts index ef9820bc7..9d0386a65 100644 --- a/packages/message-kit/src/lib/core.ts +++ b/packages/message-kit/src/lib/core.ts @@ -148,7 +148,7 @@ export class MessageKit implements Context { const result = await executeSkill( text, context.agent, - context as unknown as Context, + context as Context, ); return result ?? undefined; }; @@ -165,19 +165,19 @@ export class MessageKit implements Context { if (process.env.MSG_LOG === "true") console.log("CDP Wallet Service Started"); context.walletService = new CdpWalletService( - context.message.sender.address, + context.message.sender.address.toLowerCase(), ); } else if (process.env.CIRCLE_API_KEY) { if (process.env.MSG_LOG === "true") console.log("Circle Wallet Service Started"); context.walletService = new CircleWalletService( - context.message.sender.address, + context.message.sender.address.toLowerCase(), ); } } context.storage = new LocalStorage(".data/storage"); - return context as unknown as Context; + return context; } return undefined; } catch (error) { diff --git a/packages/xmtp-web/package.json b/packages/xmtp-web/package.json index c3860841c..1356b8f1f 100644 --- a/packages/xmtp-web/package.json +++ b/packages/xmtp-web/package.json @@ -1,6 +1,6 @@ { "name": "xmtp-web", - "version": "0.0.3", + "version": "0.0.6", "license": "MIT", "type": "module", "exports": { @@ -61,4 +61,4 @@ "access": "public", "registry": "https://registry.npmjs.org/" } -} +} \ No newline at end of file diff --git a/packages/xmtp/package.json b/packages/xmtp/package.json index 26e260517..c03ae3c29 100644 --- a/packages/xmtp/package.json +++ b/packages/xmtp/package.json @@ -1,6 +1,6 @@ { "name": "xmtp", - "version": "0.0.5", + "version": "0.0.6", "license": "MIT", "type": "module", "exports": { @@ -59,4 +59,4 @@ "access": "public", "registry": "https://registry.npmjs.org/" } -} +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 8f431b9e9..efe25a7c5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4136,7 +4136,6 @@ __metadata: version: 0.0.0-use.local resolution: "baselinks@workspace:packages/baselinks" dependencies: - "@farcaster/frame-sdk": "npm:0.0.10" "@types/next": "npm:^9.0.0" "@types/node": "npm:^20" "@types/react": "npm:^18" From b05732344ce03b5e0545786d5cfd0e383ebf9c00 Mon Sep 17 00:00:00 2001 From: fabri Date: Mon, 23 Dec 2024 16:07:02 -0300 Subject: [PATCH 14/19] 0.0.7 --- packages/xmtp-web/package.json | 2 +- packages/xmtp-web/src/lib/parse.ts | 2 +- packages/xmtp-web/src/lib/xmtp.ts | 4 +--- packages/xmtp/package.json | 2 +- packages/xmtp/src/lib/parse.ts | 2 +- packages/xmtp/src/lib/xmtp.ts | 7 ++++--- templates/ens/example_prompt.md | 4 ++-- 7 files changed, 11 insertions(+), 12 deletions(-) diff --git a/packages/xmtp-web/package.json b/packages/xmtp-web/package.json index 1356b8f1f..61dea51af 100644 --- a/packages/xmtp-web/package.json +++ b/packages/xmtp-web/package.json @@ -1,6 +1,6 @@ { "name": "xmtp-web", - "version": "0.0.6", + "version": "0.0.7", "license": "MIT", "type": "module", "exports": { diff --git a/packages/xmtp-web/src/lib/parse.ts b/packages/xmtp-web/src/lib/parse.ts index b3d07bd6e..8d714331c 100644 --- a/packages/xmtp-web/src/lib/parse.ts +++ b/packages/xmtp-web/src/lib/parse.ts @@ -16,7 +16,7 @@ export async function parseMessage( let content = message.content; if (typeId == "text") { content = { - text: content.content ?? content, + text: content, }; } else if (typeId == "reply") { let previousMsg = await getLastMessageById( diff --git a/packages/xmtp-web/src/lib/xmtp.ts b/packages/xmtp-web/src/lib/xmtp.ts index e482fdea2..65b30ba4a 100644 --- a/packages/xmtp-web/src/lib/xmtp.ts +++ b/packages/xmtp-web/src/lib/xmtp.ts @@ -70,9 +70,7 @@ export class XMTP { let message: any; if (!userMessage.typeId || userMessage.typeId === "text") { - message = { - content: userMessage.message, - }; + message = userMessage.message; contentType = ContentTypeText; } else if (userMessage.typeId === "attachment") { message = (await this.getAttachment(userMessage.message)) as Attachment; diff --git a/packages/xmtp/package.json b/packages/xmtp/package.json index c03ae3c29..dd61682d9 100644 --- a/packages/xmtp/package.json +++ b/packages/xmtp/package.json @@ -1,6 +1,6 @@ { "name": "xmtp", - "version": "0.0.6", + "version": "0.0.7", "license": "MIT", "type": "module", "exports": { diff --git a/packages/xmtp/src/lib/parse.ts b/packages/xmtp/src/lib/parse.ts index cb6858580..4e75338ab 100644 --- a/packages/xmtp/src/lib/parse.ts +++ b/packages/xmtp/src/lib/parse.ts @@ -21,7 +21,7 @@ export async function parseMessage( let content = message.content; if (typeId == "text") { content = { - text: content.content ?? content, + text: content, }; } else if (typeId == "reply") { let previousMsg = await getLastMessageById( diff --git a/packages/xmtp/src/lib/xmtp.ts b/packages/xmtp/src/lib/xmtp.ts index 656bbede0..f0a7fedf6 100644 --- a/packages/xmtp/src/lib/xmtp.ts +++ b/packages/xmtp/src/lib/xmtp.ts @@ -208,9 +208,7 @@ export class XMTP { let message: any; if (!userMessage.typeId || userMessage.typeId === "text") { - message = { - content: userMessage.message, - }; + message = userMessage.message; contentType = ContentTypeText; } else if (userMessage.typeId === "attachment") { message = (await this.getAttachment(userMessage.message)) as Attachment; @@ -238,6 +236,7 @@ export class XMTP { contentType = ContentTypeAgentMessage; } + console.log(`message`, message); if (userMessage.originalMessage?.version == "v2") { let v2Conversation = await this.getV2ConversationByAddress( userMessage.originalMessage.client?.address, @@ -377,6 +376,7 @@ async function streamMessages( conversation, client, ); + console.log(`parsedMessage`, parsedMessage); await onMessage(parsedMessage as Message); } catch (e) { console.log(`error`, e); @@ -406,6 +406,7 @@ async function streamMessages( conversation, client, ); + console.log(`parsedMessage`, parsedMessage); await onMessage(parsedMessage as Message); } catch (e) { console.log(`error`, e); diff --git a/templates/ens/example_prompt.md b/templates/ens/example_prompt.md index 75c1ef374..201c234ea 100644 --- a/templates/ens/example_prompt.md +++ b/templates/ens/example_prompt.md @@ -13,14 +13,14 @@ You are a helpful agent called @bot that lives inside a web3 messaging app calle - Do not make guesses or assumptions - Only answer if the verified information is in the prompt. - Focus only on helping users with operations detailed below. -- Date: Sun, 22 Dec 2024 17:48:39 GMT, +- Date: Mon, 23 Dec 2024 19:00:44 GMT, ## User context - Start by fetch their domain from or Converse username - Call the user by their name or domain, in case they have one - Ask for a name (if they don't have one) so you can suggest domains. -- Message sent date: 2024-12-22T17:49:59.299Z +- Message sent date: 2024-12-23T19:01:13.885Z - Users address is: 0x40f08f0f853d1c42c61815652b7ccd5a50f0be09 - Users name is: ArizonaOregon - Converse username is: ArizonaOregon From 17ece8d236e5d64885b85abf0d487eeddd7ad622 Mon Sep 17 00:00:00 2001 From: fabri Date: Mon, 23 Dec 2024 17:06:18 -0300 Subject: [PATCH 15/19] agent inbox --- README.md | 2 +- package.json | 4 +- packages/client/package.json | 2 +- packages/client/src/app/globals.css | 131 +------------- packages/client/src/app/layout.tsx | 1 - packages/client/src/app/page.module.css | 168 ------------------ packages/client/src/app/page.tsx | 9 +- .../client/src/components/Chat.module.css | 44 ++--- packages/client/src/components/Chat.tsx | 2 +- packages/docs/pages/changelog.mdx | 2 +- packages/docs/pages/plugins/xmtp.mdx | 12 +- packages/{xmtp-web => xmtp-e2ee}/README.md | 8 +- packages/{xmtp-web => xmtp-e2ee}/package.json | 4 +- .../{xmtp-web => xmtp-e2ee}/rollup.config.js | 0 .../src/content-types/agent-message.ts | 0 packages/{xmtp-web => xmtp-e2ee}/src/index.ts | 0 .../{xmtp-web => xmtp-e2ee}/src/lib/parse.ts | 0 .../{xmtp-web => xmtp-e2ee}/src/lib/xmtp.ts | 1 + packages/{xmtp-web => xmtp-e2ee}/src/types.ts | 0 .../{xmtp-web => xmtp-e2ee}/tsconfig.json | 0 packages/xmtp/package.json | 2 +- packages/xmtp/src/lib/xmtp.ts | 2 + scripts/publish.js | 2 +- yarn.lock | 6 +- 24 files changed, 59 insertions(+), 343 deletions(-) delete mode 100644 packages/client/src/app/page.module.css rename packages/{xmtp-web => xmtp-e2ee}/README.md (69%) rename packages/{xmtp-web => xmtp-e2ee}/package.json (97%) rename packages/{xmtp-web => xmtp-e2ee}/rollup.config.js (100%) rename packages/{xmtp-web => xmtp-e2ee}/src/content-types/agent-message.ts (100%) rename packages/{xmtp-web => xmtp-e2ee}/src/index.ts (100%) rename packages/{xmtp-web => xmtp-e2ee}/src/lib/parse.ts (100%) rename packages/{xmtp-web => xmtp-e2ee}/src/lib/xmtp.ts (99%) rename packages/{xmtp-web => xmtp-e2ee}/src/types.ts (100%) rename packages/{xmtp-web => xmtp-e2ee}/tsconfig.json (100%) diff --git a/README.md b/README.md index 8bc904742..350444e63 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ A set of tools for AI developers to build on top of [XMTP](https://xmtp.org) ### Plugins - [`xmtp`](/packages/xmtp/): An xmtp node js wrapper for AI agents. -- [`xmtp-web`](/packages/xmtp-web/): A js wrapper for AI agents. +- [`xmtp-e2ee`](/packages/xmtp-e2ee/): A js wrapper for AI agents. ### Other diff --git a/package.json b/package.json index e3c78d761..c1bf48e1d 100644 --- a/package.json +++ b/package.json @@ -9,14 +9,14 @@ "shared/*" ], "scripts": { - "agent": "yarn build:xmtp-web && cd packages/client && yarn dev", + "agent": "yarn build:xmtp-e2ee && cd packages/client && yarn dev", "build": "yarn build:message-kit && yarn build:packages && yarn build:templates", "build:client": "turbo run build --filter=./packages/client --force", "build:message-kit": "turbo run build --filter=./packages/message-kit --force", "build:packages": "turbo run build --filter='./packages/*' --filter='!./packages/message-kit'", "build:templates": "turbo run build --filter='./templates/*'", "build:xmtp": "turbo run build --filter=./packages/xmtp --force", - "build:xmtp-web": "turbo run build --filter=./packages/xmtp-web --force", + "build:xmtp-e2ee": "turbo run build --filter=./packages/xmtp-e2ee --force", "bump": "node scripts/update-version.js -t patch", "changeset": "yarn copy && changeset add --type patch", "clean": "turbo run clean && rm -rf node_modules && rm -rf .turbo && rm -rf packages/message-kit/dist && rm -rf packages/message-kit/.turbo && rm -rf packages/docs/dist && yarn cache clean", diff --git a/packages/client/package.json b/packages/client/package.json index 68b0be2ee..ddf5a6b36 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -17,7 +17,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "viem": "^2.21.45", - "xmtp-web": "workspace:*" + "xmtp-e2ee": "workspace:*" }, "devDependencies": { "@types/node": "^20", diff --git a/packages/client/src/app/globals.css b/packages/client/src/app/globals.css index 02730cc54..c6ff274d1 100644 --- a/packages/client/src/app/globals.css +++ b/packages/client/src/app/globals.css @@ -1,13 +1,14 @@ :root { - --background: #000000; - --foreground: #ffffff; - --accent: #fa6977; + --background: #ffffff; + --foreground: #000000; + --accent: #ef4444; } @media (prefers-color-scheme: dark) { :root { - --background: #000000; - --foreground: #ffffff; + --background: #ffffff; + --accent: #ef4444; + --foreground: #000000; } } @@ -28,123 +29,3 @@ body { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } - -.container { - width: 100vw; - height: 100vh; - background-color: var(--background); - display: flex; - align-items: center; - justify-content: center; - font-family: var(--font-geist-sans); -} - -.wrapper { - width: 100%; - max-width: 56rem; - margin: 0 auto; - padding: 0 1rem; -} - -.title { - font-size: 2.25rem; - font-weight: bold; - text-align: center; - margin-bottom: 2rem; - font-family: var(--font-geist-sans); -} - -.form-container { - background-color: #111111; - border-radius: 0.5rem; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); - padding: 1.5rem; -} - -.form-group { - margin-bottom: 1rem; -} - -.label { - display: block; - font-size: 0.875rem; - font-weight: 500; - color: #ffffff; - margin-bottom: 0.5rem; -} - -.input, -.select { - width: 100%; - padding: 0.5rem 0.75rem; - border: 1px solid #333333; - background-color: #000000; - color: #ffffff; - border-radius: 0.375rem; - margin-top: 0.25rem; -} - -.submit-button { - width: 100%; - background-color: var(--accent); - color: white; - padding: 0.5rem 1rem; - border-radius: 0.375rem; - border: none; - cursor: pointer; -} - -.submit-button:hover { - background-color: #e55967; -} - -.url-container { - margin-top: 1.5rem; -} - -.url-group { - display: flex; - gap: 0.5rem; -} - -.copy-button { - padding: 0.5rem 1rem; - background-color: #111111; - color: #ffffff; - border-radius: 0.375rem; - border: none; - cursor: pointer; - margin-top: 0.25rem; -} - -.copy-button:hover { - background-color: #222222; -} - -/* For any monospace text, like the generated URL */ -.url-container .input { - font-family: var(--font-geist-mono); -} - -.powered-by { - text-align: center; - align-items: center; - font-family: var(--font-geist-sans); - color: #ffffff; -} - -.powered-by a { - color: var(--accent); - text-decoration: none; - font-weight: 500; -} - -.powered-by a:hover { - text-decoration: underline; -} - -.nextjs-toast, -nextjs-portal, -.nextjs-static-indicator-toast-wrapper { - display: none !important; -} diff --git a/packages/client/src/app/layout.tsx b/packages/client/src/app/layout.tsx index 587a86c43..4db5fb81b 100644 --- a/packages/client/src/app/layout.tsx +++ b/packages/client/src/app/layout.tsx @@ -1,4 +1,3 @@ -import Head from "next/head"; import "./globals.css"; export default function RootLayout({ diff --git a/packages/client/src/app/page.module.css b/packages/client/src/app/page.module.css deleted file mode 100644 index f1467a745..000000000 --- a/packages/client/src/app/page.module.css +++ /dev/null @@ -1,168 +0,0 @@ -.page { - --gray-rgb: 255, 255, 255; - --gray-alpha-200: rgba(var(--gray-rgb), 0.08); - --gray-alpha-100: rgba(var(--gray-rgb), 0.05); - - --button-primary-hover: #0052ff; - --button-secondary-hover: #e6f0ff; - - display: grid; - grid-template-rows: 20px 1fr 20px; - align-items: center; - justify-items: center; - min-height: 100svh; - padding: 80px; - gap: 64px; - font-family: var(--font-geist-sans); -} - -@media (prefers-color-scheme: dark) { - .page { - --gray-rgb: 0, 0, 0; - --gray-alpha-200: rgba(var(--gray-rgb), 0.145); - --gray-alpha-100: rgba(var(--gray-rgb), 0.06); - - --button-primary-hover: #003bb3; - --button-secondary-hover: #1a1a1a; - } -} - -.main { - display: flex; - flex-direction: column; - gap: 32px; - grid-row-start: 2; -} - -.main ol { - font-family: var(--font-geist-mono); - padding-left: 0; - margin: 0; - font-size: 14px; - line-height: 24px; - letter-spacing: -0.01em; - list-style-position: inside; -} - -.main li:not(:last-of-type) { - margin-bottom: 8px; -} - -.main code { - font-family: inherit; - background: var(--gray-alpha-100); - padding: 2px 4px; - border-radius: 4px; - font-weight: 600; -} - -.ctas { - display: flex; - gap: 16px; -} - -.ctas a { - appearance: none; - border-radius: 128px; - height: 48px; - padding: 0 20px; - border: none; - border: 1px solid transparent; - transition: - background 0.2s, - color 0.2s, - border-color 0.2s; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - font-size: 16px; - line-height: 20px; - font-weight: 500; -} - -a.primary { - background: #0052ff; - color: #ffffff; - gap: 8px; -} - -a.secondary { - border-color: #e6f0ff; - min-width: 180px; -} - -.footer { - grid-row-start: 3; - display: flex; - gap: 24px; -} - -.footer a { - display: flex; - align-items: center; - gap: 8px; -} - -.footer img { - flex-shrink: 0; -} - -/* Enable hover only on non-touch devices */ -@media (hover: hover) and (pointer: fine) { - a.primary:hover { - background: var(--button-primary-hover); - border-color: transparent; - } - - a.secondary:hover { - background: var(--button-secondary-hover); - border-color: transparent; - } - - .footer a:hover { - text-decoration: underline; - text-underline-offset: 4px; - } -} - -@media (max-width: 600px) { - .page { - padding: 32px; - padding-bottom: 80px; - } - - .main { - align-items: center; - } - - .main ol { - text-align: center; - } - - .ctas { - flex-direction: column; - } - - .ctas a { - font-size: 14px; - height: 40px; - padding: 0 16px; - } - - a.secondary { - min-width: auto; - } - - .footer { - flex-wrap: wrap; - align-items: center; - justify-content: center; - } -} - -@media (prefers-color-scheme: dark) { - .logo { - filter: invert(); - } -} diff --git a/packages/client/src/app/page.tsx b/packages/client/src/app/page.tsx index 9623ea4eb..7ba35a904 100644 --- a/packages/client/src/app/page.tsx +++ b/packages/client/src/app/page.tsx @@ -82,7 +82,14 @@ function ChatContent({ user }: { user: UserInfo }): JSX.Element { }, [isSDKLoaded]); return ( -
+
); diff --git a/packages/client/src/components/Chat.module.css b/packages/client/src/components/Chat.module.css index c1fe43c07..095b5425e 100644 --- a/packages/client/src/components/Chat.module.css +++ b/packages/client/src/components/Chat.module.css @@ -3,16 +3,17 @@ display: flex; flex-direction: column; height: 100%; + width: 100%; height: -webkit-fill-available; /* iOS viewport fix */ background-color: #ffffff; - color: #0052ff; + color: var(--accent); + margin: 0 auto; + max-height: 800px; + max-width: 600px; font-family: monospace; padding: 0.75rem; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; + border-radius: 8px; + border: 1px solid var(--accent); } /* Wallet Info Section */ @@ -46,25 +47,19 @@ line-height: 1.3; font-size: 0.95rem; white-space: pre-wrap; - color: #0052ff; + color: var(--accent); } .sender { - color: #0052ff; + color: var(--accent); margin-right: 0.375rem; font-weight: bold; } /* Message Form */ .messageForm { - position: sticky; - bottom: 0; - left: 0; - right: 0; - padding: 0.75rem; + padding-bottom: 0px; background-color: #ffffff; - margin: 0 -0.75rem -0.75rem; - padding-bottom: calc(0.75rem + env(safe-area-inset-bottom)); } /* Input Field */ @@ -76,9 +71,8 @@ .input { flex: 1; - background-color: #e0e0e0; border: 1px solid #b0b0b0; - color: #0052ff; + color: var(--accent); padding: 0 1rem; font-family: monospace; font-size: 1rem; @@ -91,12 +85,12 @@ .input:focus { outline: none; - border-color: #0052ff; + border-color: var(--accent); } /* Send Button */ .sendButton { - background-color: #0052ff; + background-color: var(--accent); color: #ffffff; border: none; cursor: pointer; @@ -110,11 +104,11 @@ } .sendButton:hover { - background-color: #0041cc; + background-color: var(--accent); } .sendButton:active { - background-color: #0033a1; + background-color: var(--accent); } /* Add these new mobile-specific styles */ @@ -208,7 +202,7 @@ flex: 1; padding: 12px; border: none; - background-color: #0052ff; + background-color: var(--accent); color: #ffffff; cursor: pointer; font-size: 14px; @@ -218,11 +212,11 @@ } .urlButton:hover { - background-color: #0041cc; + background-color: var(--accent); } .messageLink { - color: #0052ff; + color: var(--accent); text-decoration: underline; word-break: break-all; width: 100%; @@ -234,6 +228,6 @@ justify-content: center; align-items: center; padding: 1rem; - color: #0052ff; + color: var(--accent); font-size: 0.9rem; } diff --git a/packages/client/src/components/Chat.tsx b/packages/client/src/components/Chat.tsx index 1c2869399..68eb777d4 100644 --- a/packages/client/src/components/Chat.tsx +++ b/packages/client/src/components/Chat.tsx @@ -6,7 +6,7 @@ import { isAddress, parseUnits } from "viem"; import { extractFrameChain } from "@/app/utils/networks"; import sdk from "@farcaster/frame-sdk"; import { UrlPreview } from "./UrlPreview"; -import { XMTP, Message } from "xmtp-web"; +import { XMTP, Message } from "../../../xmtp-e2ee/dist"; type UrlType = "receipt" | "payment" | "wallet" | "unknown"; diff --git a/packages/docs/pages/changelog.mdx b/packages/docs/pages/changelog.mdx index 6728cf1e2..0b5839a83 100644 --- a/packages/docs/pages/changelog.mdx +++ b/packages/docs/pages/changelog.mdx @@ -39,7 +39,7 @@ - Enhanced documentation for the `paymentagent` with multimedia elements and clearer content structure. - Added a new XMTP plugin for secure messaging with installation instructions and usage examples. - Introduced `createAgent` function for streamlined agent creation across multiple templates. - - Added a new `xmtp-web` package for secure messaging with installation instructions and usage examples. + - Added a new `xmtp-e2ee` package for secure messaging with installation instructions and usage examples. - Added a new `xmtp` package for secure messaging with installation instructions and usage examples. - **Bug Fixes** diff --git a/packages/docs/pages/plugins/xmtp.mdx b/packages/docs/pages/plugins/xmtp.mdx index f002c4219..b580a94fd 100644 --- a/packages/docs/pages/plugins/xmtp.mdx +++ b/packages/docs/pages/plugins/xmtp.mdx @@ -98,20 +98,20 @@ const onMessage = async (message, user) => { ## Frontend -Same as the backend, you can use the `xmtp-web` package to create a client that decrypts and encrypts messages locally. +Same as the backend, you can use the `xmtp-e2ee` package to create a client that decrypts and encrypts messages locally. ### Installation -Install the `xmtp-web` package compatible with your frontend framework. +Install the `xmtp-e2ee` package compatible with your frontend framework. ```bash [cmd] -bun install xmtp-web +bun install xmtp-e2ee ``` ### Usage ```tsx -import { XMTP, Message } from "xmtp-web"; +import { XMTP, Message } from "xmtp-e2ee"; const xmtp = new XMTP(onMessage, { encryptionKey: /*wallet private key*/, @@ -134,10 +134,10 @@ const onMessage = async (message, user) => { ### React example -This is how you can use the `xmtp-web` package to create a client and handle messages. +This is how you can use the `xmtp-e2ee` package to create a client and handle messages. ```tsx -import { XMTP, Message } from "xmtp-web"; +import { XMTP, Message } from "xmtp-e2ee"; // ... other imports ... function Chat({ user }: { user: UserInfo }) { diff --git a/packages/xmtp-web/README.md b/packages/xmtp-e2ee/README.md similarity index 69% rename from packages/xmtp-web/README.md rename to packages/xmtp-e2ee/README.md index 107c6aeb5..d34724a87 100644 --- a/packages/xmtp-web/README.md +++ b/packages/xmtp-e2ee/README.md @@ -4,20 +4,20 @@ ### Installation -Install the `xmtp-web` package for using in the users devices. +Install the `xmtp-e2ee` package for using in the users devices. ```bash [cmd] -bun install xmtp-web +bun install xmtp-e2ee ``` ### Usage -This is how you can use the `xmtp-web` package to create a client and handle messages. +This is how you can use the `xmtp-e2ee` package to create a client and handle messages. > It will always create an anonimous identity by default. ```tsx -import { XMTP } from "xmtp-web"; +import { XMTP } from "xmtp-e2ee"; const xmtp = new XMTP(onMessage); diff --git a/packages/xmtp-web/package.json b/packages/xmtp-e2ee/package.json similarity index 97% rename from packages/xmtp-web/package.json rename to packages/xmtp-e2ee/package.json index 61dea51af..c6c801ce0 100644 --- a/packages/xmtp-web/package.json +++ b/packages/xmtp-e2ee/package.json @@ -1,6 +1,6 @@ { - "name": "xmtp-web", - "version": "0.0.7", + "name": "xmtp-e2ee", + "version": "0.0.8", "license": "MIT", "type": "module", "exports": { diff --git a/packages/xmtp-web/rollup.config.js b/packages/xmtp-e2ee/rollup.config.js similarity index 100% rename from packages/xmtp-web/rollup.config.js rename to packages/xmtp-e2ee/rollup.config.js diff --git a/packages/xmtp-web/src/content-types/agent-message.ts b/packages/xmtp-e2ee/src/content-types/agent-message.ts similarity index 100% rename from packages/xmtp-web/src/content-types/agent-message.ts rename to packages/xmtp-e2ee/src/content-types/agent-message.ts diff --git a/packages/xmtp-web/src/index.ts b/packages/xmtp-e2ee/src/index.ts similarity index 100% rename from packages/xmtp-web/src/index.ts rename to packages/xmtp-e2ee/src/index.ts diff --git a/packages/xmtp-web/src/lib/parse.ts b/packages/xmtp-e2ee/src/lib/parse.ts similarity index 100% rename from packages/xmtp-web/src/lib/parse.ts rename to packages/xmtp-e2ee/src/lib/parse.ts diff --git a/packages/xmtp-web/src/lib/xmtp.ts b/packages/xmtp-e2ee/src/lib/xmtp.ts similarity index 99% rename from packages/xmtp-web/src/lib/xmtp.ts rename to packages/xmtp-e2ee/src/lib/xmtp.ts index 65b30ba4a..c00b3d53d 100644 --- a/packages/xmtp-web/src/lib/xmtp.ts +++ b/packages/xmtp-e2ee/src/lib/xmtp.ts @@ -54,6 +54,7 @@ export class XMTP { this.v2client = client; this.address = client.address; + this.inboxId = client.address; streamMessages(this.onMessage, client); return this; diff --git a/packages/xmtp-web/src/types.ts b/packages/xmtp-e2ee/src/types.ts similarity index 100% rename from packages/xmtp-web/src/types.ts rename to packages/xmtp-e2ee/src/types.ts diff --git a/packages/xmtp-web/tsconfig.json b/packages/xmtp-e2ee/tsconfig.json similarity index 100% rename from packages/xmtp-web/tsconfig.json rename to packages/xmtp-e2ee/tsconfig.json diff --git a/packages/xmtp/package.json b/packages/xmtp/package.json index dd61682d9..ca2eb22fe 100644 --- a/packages/xmtp/package.json +++ b/packages/xmtp/package.json @@ -1,6 +1,6 @@ { "name": "xmtp", - "version": "0.0.7", + "version": "0.0.8", "license": "MIT", "type": "module", "exports": { diff --git a/packages/xmtp/src/lib/xmtp.ts b/packages/xmtp/src/lib/xmtp.ts index f0a7fedf6..222a1d5ec 100644 --- a/packages/xmtp/src/lib/xmtp.ts +++ b/packages/xmtp/src/lib/xmtp.ts @@ -116,6 +116,8 @@ export class XMTP { this.client = client; this.v2client = v2client; + this.address = v2client.address; + this.inboxId = client.inboxId ?? v2client.address; Promise.all([ streamMessages(this.onMessage, client, this), streamMessages(this.onMessage, v2client, this), diff --git a/scripts/publish.js b/scripts/publish.js index a5238dc93..956ae22b3 100644 --- a/scripts/publish.js +++ b/scripts/publish.js @@ -43,7 +43,7 @@ const packages = [ "packages/message-kit", "packages/xmtp", "packages/create-message-kit", - "packages/xmtp-web", + "packages/xmtp-e2ee", ]; packages.forEach((packagePath) => { diff --git a/yarn.lock b/yarn.lock index efe25a7c5..43e33d02d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4680,7 +4680,7 @@ __metadata: react-dom: "npm:^18.2.0" typescript: "npm:^5" viem: "npm:^2.21.45" - xmtp-web: "workspace:*" + xmtp-e2ee: "workspace:*" languageName: unknown linkType: soft @@ -12294,9 +12294,9 @@ __metadata: languageName: unknown linkType: soft -"xmtp-web@workspace:*, xmtp-web@workspace:packages/xmtp-web": +"xmtp-e2ee@workspace:*, xmtp-e2ee@workspace:packages/xmtp-e2ee": version: 0.0.0-use.local - resolution: "xmtp-web@workspace:packages/xmtp-web" + resolution: "xmtp-e2ee@workspace:packages/xmtp-e2ee" dependencies: "@changesets/changelog-git": "npm:^0.2.0" "@changesets/cli": "npm:^2.27.5" From 8d9c43aaaf8c889aa808babc3cc7a5e56d31de1a Mon Sep 17 00:00:00 2001 From: fabri Date: Mon, 23 Dec 2024 17:34:06 -0300 Subject: [PATCH 16/19] xmtp --- packages/docs/pages/plugins/xmtp.mdx | 77 +++++++++------------------- 1 file changed, 23 insertions(+), 54 deletions(-) diff --git a/packages/docs/pages/plugins/xmtp.mdx b/packages/docs/pages/plugins/xmtp.mdx index b580a94fd..e0e9d5e29 100644 --- a/packages/docs/pages/plugins/xmtp.mdx +++ b/packages/docs/pages/plugins/xmtp.mdx @@ -1,24 +1,32 @@ -# XMTP AI +# End-to-end encrypted messaging + +XMTP provides end-to-end encrypted messaging for agent interactions, crucial for privacy, security, and compliance. Without it, messages are exposed to many security risks + +### Thesis AI is transforming consumer tech, with messaging becoming the main channel for interacting with agent services. This shift will scale message traffic astronomically, analogous to the web’s rise in the 2000s. Just as Cloud-flare secured web traffic, messaging will need robust scalable end-to-end encrypted messages to protect sensitive communications. +### Features: + +- **E2EE**: End to end encrypted MLS encryption +- **Multi-agent**: Support multi-agent through group chats +- **Interoperable**: Works across all platforms and frontends +- **Scalable**: Decentralized, open-source +- **Anonymous**: By defaul every identity is ephemeral and anonymous. + ## Risks -Risks of not using end-to-end encryption: +Risks of not using end-to-end encryption for agent interactions exposes the users to what is called as Man in the **Middle Attacks**. -> **Man in the Middle Attacks (MITM)**: Intercept requests in between to alter or manipulate data sent or received by the AI service or user. +> **Man in the Middle Attacks**: Intercept requests in between to alter or manipulate data sent or received by the AI service - **Phishing**: Messages can be intercepted and manipulated. -- **Privacy**: Sensitive information read by unwanted parties. +- **Privacy**: Sensible information read by unwanted parties - **Tampering**: Content can be altered without detection. -## Anonymity - -Using ephemeral addresses can enhance security by allowing users to message agents anonymously, protecting their identities from exposure. - -## Backend - -You can use the `xmtp` package to create wrapper around the messages sent and received by the AI agent. +:::tip +More concrete sensible data could include credit card details and passwords which is not yet widely spread but as agents become smarter more use cases will include this type of sharing. +::: ### Installation @@ -32,6 +40,8 @@ bun install xmtp This is how you can use the `xmtp` package to create a client and handle messages. +> If you are in web use the `xmtp-e2ee` package instead. + ```tsx import { XMTP } from "xmtp"; @@ -51,7 +61,7 @@ const onMessage = async (message, user) => { }; ``` -### Gpt example +### GPT example 1. **`handleMessage`**: Triggered each time a new message is received from XMTP. 2. **`client.send()`**: Used to send messages (e.g., AI prompts and responses) back to the XMTP network. @@ -96,42 +106,6 @@ const onMessage = async (message, user) => { }; ``` -## Frontend - -Same as the backend, you can use the `xmtp-e2ee` package to create a client that decrypts and encrypts messages locally. - -### Installation - -Install the `xmtp-e2ee` package compatible with your frontend framework. - -```bash [cmd] -bun install xmtp-e2ee -``` - -### Usage - -```tsx -import { XMTP, Message } from "xmtp-e2ee"; - -const xmtp = new XMTP(onMessage, { - encryptionKey: /*wallet private key*/, -}); -await xmtp.init(); - -const onSend = async (text) => { - return message; -}; - -const onMessage = async (message, user) => { - console.log(`Decoded message: ${message} by ${user.address}`); - let response; // Your ai model response - await xmtp.send({ - message: response, - originalMessage: message, - }); -}; -``` - ### React example This is how you can use the `xmtp-e2ee` package to create a client and handle messages. @@ -149,9 +123,6 @@ function Chat({ user }: { user: UserInfo }) { useEffect(() => { const init = async () => { - const newWallet = Wallet.createRandom(); - // ... set wallet and recipient info ... - try { if (user?.address) { await initXmtp(newWallet); @@ -173,9 +144,7 @@ function Chat({ user }: { user: UserInfo }) { const initXmtp = async (wallet: any) => { try { - const xmtpClient = new XMTP(onMessage, { - privateKey: wallet.privateKey, - }); + const xmtpClient = new XMTP(onMessage); await xmtpClient.init(); setXmtp(xmtpClient); setIsLoading(false); From 7f932d5dc8bf27880f5d9aaa483835532396b2fe Mon Sep 17 00:00:00 2001 From: fabri Date: Mon, 23 Dec 2024 17:41:53 -0300 Subject: [PATCH 17/19] merge --- packages/create-message-kit/package.json | 2 +- packages/message-kit/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/create-message-kit/package.json b/packages/create-message-kit/package.json index 7372ba55b..bbcaf5355 100644 --- a/packages/create-message-kit/package.json +++ b/packages/create-message-kit/package.json @@ -1,6 +1,6 @@ { "name": "create-message-kit", - "version": "1.3.0", + "version": "1.3.1", "license": "MIT", "type": "module", "main": "index.js", diff --git a/packages/message-kit/package.json b/packages/message-kit/package.json index ecaa3a1c9..7e535acb8 100644 --- a/packages/message-kit/package.json +++ b/packages/message-kit/package.json @@ -1,6 +1,6 @@ { "name": "@xmtp/message-kit", - "version": "1.3.0", + "version": "1.3.1", "license": "MIT", "type": "module", "exports": { From c6adccc119bfa2039378da442279ef970eb7ba5c Mon Sep 17 00:00:00 2001 From: fabri Date: Mon, 23 Dec 2024 17:46:11 -0300 Subject: [PATCH 18/19] eploy --- packages/message-kit/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/message-kit/package.json b/packages/message-kit/package.json index 7e535acb8..7f33aa036 100644 --- a/packages/message-kit/package.json +++ b/packages/message-kit/package.json @@ -81,4 +81,4 @@ "access": "public", "registry": "https://registry.npmjs.org/" } -} \ No newline at end of file +} From 0ce945271c343e5207872fdf7e8ecf4cc9495219 Mon Sep 17 00:00:00 2001 From: fabri Date: Mon, 23 Dec 2024 17:51:35 -0300 Subject: [PATCH 19/19] deploy --- packages/docs/pages/plugins/xmtp.mdx | 40 ++++++++++++++-------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/docs/pages/plugins/xmtp.mdx b/packages/docs/pages/plugins/xmtp.mdx index e0e9d5e29..47dae8f9e 100644 --- a/packages/docs/pages/plugins/xmtp.mdx +++ b/packages/docs/pages/plugins/xmtp.mdx @@ -1,18 +1,6 @@ # End-to-end encrypted messaging -XMTP provides end-to-end encrypted messaging for agent interactions, crucial for privacy, security, and compliance. Without it, messages are exposed to many security risks - -### Thesis - -AI is transforming consumer tech, with messaging becoming the main channel for interacting with agent services. This shift will scale message traffic astronomically, analogous to the web’s rise in the 2000s. Just as Cloud-flare secured web traffic, messaging will need robust scalable end-to-end encrypted messages to protect sensitive communications. - -### Features: - -- **E2EE**: End to end encrypted MLS encryption -- **Multi-agent**: Support multi-agent through group chats -- **Interoperable**: Works across all platforms and frontends -- **Scalable**: Decentralized, open-source -- **Anonymous**: By defaul every identity is ephemeral and anonymous. +AI is transforming consumer tech, with messaging becoming the main channel for interacting with agent services. This shift will scale message traffic astronomically, analogous to the web’s rise in the 2000s. Just as Cloud-flare secured web traffic, messaging will need robust scalable end-to-end encrypted messages to protect sensitive information. ## Risks @@ -21,13 +9,25 @@ Risks of not using end-to-end encryption for agent interactions exposes the user > **Man in the Middle Attacks**: Intercept requests in between to alter or manipulate data sent or received by the AI service - **Phishing**: Messages can be intercepted and manipulated. -- **Privacy**: Sensible information read by unwanted parties +- **Privacy**: Sensitive information read by unwanted parties - **Tampering**: Content can be altered without detection. :::tip -More concrete sensible data could include credit card details and passwords which is not yet widely spread but as agents become smarter more use cases will include this type of sharing. +More concrete sensitive data could include credit card details, private keys and passwords which is not yet widely spread but as agents become smarter more use cases will include this type of sharing. ::: +## XMTP + +XMTP provides end-to-end encrypted messaging for agent interactions, crucial for privacy, security, and compliance. Without it, messages are exposed to many security risks + +### Features: + +- **E2EE**: End to end encrypted MLS encryption +- **Multi-agent**: Support multi-agent through group chats +- **Interoperable**: Works across all platforms and frontends +- **Scalable**: Decentralized, open-source +- **Anonymous**: By default every identity is ephemeral and anonymous. + ### Installation Install the `xmtp` package @@ -38,19 +38,17 @@ bun install xmtp ### Usage -This is how you can use the `xmtp` package to create a client and handle messages. +This is how you can use the `xmtp` package to create an agent and handle messages. -> If you are in web use the `xmtp-e2ee` package instead. +- `WALLET_PRIVATE_KEY`: This will encrypt all messages and make it available through its public address or ens domain. ```tsx import { XMTP } from "xmtp"; const xmtp = new XMTP(onMessage, { - encryptionKey: process.env.WALLET_PRIVATE_KEY, + encryptionKey: WALLET_PRIVATE_KEY, }); - await xmtp.init(); - const onMessage = async (message, user) => { console.log(`Decoded message: ${message.content.text} by ${user.address}`); // Your AI model response @@ -61,6 +59,8 @@ const onMessage = async (message, user) => { }; ``` +For more information visit XMTP [website](https://xmtp.org/) + ### GPT example 1. **`handleMessage`**: Triggered each time a new message is received from XMTP.

mHT<2aKVXDrZk*5SNdz<2xt!`>9<}<{7 zP_idCr%Hdcu0;jU*hup^q_K5gfzuc->N1~`KDjmeNy9Etb>U!Nd`9K(SxZmiC19(^ zh&E{Lsu7f3j<-PHj>VOKq92`a%o@M+Q5RsKH@9riEHo(G{>AXK-SEGCxNiih!GP!< zNavnLr~ZuKkg(uZ3vr5}8~to%LEG^6sOYWSassP-q*B{wV>K-Z#t5%guJir*>Rn@V zFlu)KY@wP&*S8AdzSqB`oqZ zlq8W%g7$W}>k|tWj+emh`Q62B29~ zdW`6irKd(VMZp3lt%Cl+K7FKXZcuofja@xLFVo^})mK`CeaJB`)t)4r*3EW3Sn5aD zUsb-9q5k31p}G15Z$TsF_WoL75Irua;Jte*d5DE~q zo-HyEF`4K}=Lzp7w80Y+NdRA=D-e~rkSf}Sk^pt! zsDI^R4df}}&T0A^EfSS_yQ?Obr+ipek<3_+S+p_5=VOB{%X5>a9?AgOQ^RE^WSPLKlns z_4>=@fR{alMZ$h6J)_pFwQB42w-qH>fmbP1FwD`m$Si3-n~F|1&G2&m0fOfLV8d## zu~?*B@Jg?oKl}*H!mZMk6`^vVe>zJM#&y_c0KmS7m5%8LrrLj47y_Qg?Td~7nK@Vi z)n#()WRQx=cR-YZ(|Ra$<{KA5eiKxev3w{NJ*VpBJ)FpT+?4{iW!YKQxIBE?{u7n) zORijBqI5579XPeCD;l<1f~c7hl~Ow1vCK{L!mcr4D+i#$`E{@5KI6TstIqHBrLUFT zzktjalaOf~C#Fkn1`eKXl2B}h%0FA7|9I5Y{(dG5YK{~H5LZoKe>PG|c813Iodvgs z;32=`X}6ab=t=0M{;%+O_w0!5xt!Hpni!NMohf{Vpv2>Zp+S%tNfi~PrYbVFG0ES()bMS zkq+q>v%Q7ft*tHO?M8$QN$Nw>w7`?&#)`_lKl{3i1e~_btplvg1*0|=n4;Br_XHTNXQ!91wUMEtIw%5=Fr&YP_OO3j9R6dO}t zGY&{>3o0YDC2^fJ4r4()kiJ5W@R$r5<5>Q!E~k3(aRro8v7dyN59HC(x`&(SJ>+cr zo1_)(JLGuIVQ%H+RBtiXsjlc^|=4|Np4HqUBG1I4FqksTQdqH`hY4tn~S zoA{CQVb{ts%$i@RE?v&le6FK}OhyR_fq zK8Fd6S!sA{J{4I36ZLCrLQ}qPGYbcYlL}_iIwlOsnjw_ZUU{sA`GUYso?BN>M{YDd z13v{3EOMYi$!Fr>0T*T@|YtvR9>CVN_&k+J z9x~VV>Lv$d3a@OxOOsh2YlymSeMFnLkgm;{tTqlhopmmCVB+bnrNEQaJ|(&1tSIER zkiYQtl3mBr_-(u{>u7481Vhf-AMV6YVxc9&`p`+7UYi@Kj`RyHw?Wb*V{sG@) zO?rvSU&uqWVTA}a4j%ru(Uj7|ekbCcA!0}TI_@jYZoZ_y^ni)%Dkc89h>d~R0>muY5UEc+Ws0W?Xz5qC05Mv_XgW@(Nybwt~0svw=u|jK%hvM;@-#G*98sUx7 zT~=vrX4f@sB=K7>)l<8it{m6qe)+8pdMX^p(Dyv=DTr0trC*0a=p{n=j1~#K)gJv5 zaN}4=m?$W(W;G+$%!BK2#GVS$G+MmBy0A_GN!W2B#iljssK@csg&{TO>hv7D-7j4A z`}{No+cyu+)i4ygrs=0k~+*4p9dM;G8=5A0=;?R9b zI~I3~72!hiyP^S9+;7xLbNjOZ-F+(5vU|0=J2R{}_=$S;+?s?=r2MfvD^siL%R8nqkf9qKm$4L5OwW=won$neoHI}pcxjOx-QEcl7_`u zA!m5Ig>#!RJ12sN7emai5>irwlBmtyi!f5|ma&)*184J2Yx`73dM)m?ynvF$Ms?8( z#WsQvPl?UVHT$Erz=0Tqy9Ie4bod02KhIec#KXDD%{qX?^;}4A{>33^fv(E+tCf~_P1pN#es#3xrHHl@o z?7P`ra?-%xS}AesjpuF*dCSI~WQ&8si%LPRF^_#*+Dlec(A`=ii%~D;jZ(cx7ug@; zLEbist46}z^qTPz8C#{DRl3fB_#R{N^vhpPpIqC!2JuZI_`gL4zT`6?>}+n?+1p=0 z>&ZuWoHP_f^O`61lu2<9P*s3wo3~HfUSCw-h~hir6Y-TWd@e9W#reqbV>yC{Gb8~J zIQ42IE}W-ZXXPK{;r{^(!-+H=r4#Wkxrcp0=4BCCnPXV?1oqug| zj3?Q(^m=I)ifxI$+jiUrXe}jMG8`PiUcTPC%j0j|no?4*Ay^iasjH{9u7quJH2FOr7O`2h%25Tmaq{16zX30qnBemt(j@!HD@ocSVr zGsDcD*r8~9?Fxv!%kEcul~RYPa10I=LpA^c5S)^VJ-}p_r*#x>?gx})Q<&MtVY>i_ zr~%v2=U@D5F;Q?AQBe}91A&My+G%t$)n~iG$lGy&_Yp(_yu$IP1wbs=OVyAmR@_sk zq4aEP_TyzidGo~}ZGJ*)E$$z^9c^G&vZ!gK&3WWg<%>zGP)7$B+c~+AZQMaZ!gs^@ z?xuT`|D%F7VQMRvGe)k4>0St0+HhRi{p878~a8+*;7G zL2RlReJX<~(&25-&Ai4aE`Qa>H1?8@)|8}^;AZQQkw@8fs9oF1>mz|Dkq}6$oL^rg z6LHA*;slmr4$F`qSNPqDXU2YfyXu`meP3LVvDusP!~lf<^ds7?{z|{XtL=cJZrR58 zFZDb2Pr55NgJU&wRWKL??KZj@la@E}-ckXY(P$Jh+vjR6X7w^~xGpZr_suGb47dj0 z&+_hxT#E(zN-f`>3hg^oVM^Yv`b?W+F*NyU^dy2oAP0uR@Rin&~ zylCb0j^sx%cICq`$Z`(&R!l*sa^K}_QaVP$Y!koQ6mQq z?0bv0L7Vw1V+=sAYV-p_@VRgCR$=jd-RBv4kfP#=)MU1~*6Ewh5fwu%Z+&sIXoGL* zE0+?L>#}ByvnqJIlF)LX1>Zvx@QIAtoNP0LO>YV-yTuHHaJ+{Ipg@Ml(kOma zoX8e`odR2(Z}dbQt+olOUX~?HR0On+ap?k)Zmcj9sZW!&Od7vQcC@}RH*7_3m^-cP z2K;KsAD5rf7`gjtVl74>NcxuEv1V`Ml2boC7*#E{JUQ9Xo1h{l@TYEn(aqpFs<0^) z3GQ-x16P}99*CPw0|8z<^UzIhL?And#IOBixv6bdjE!D|3D}YS=8~mbjdja}ct5_;Fy^C>Q`Xf?UtmqAzzw9tU9N*xjlC9bO3ZyNLjh17xK+Uc&)$ z!}QFk-|89B>y{ALTvyB2T7PQUP}~Z0JpI8sMmihoY$lBAwi^(bz3F^g+ed;nxd4>m z4RZomn2?7CUNN=JCZyuoXXgoKJa1aG6qcFY*h)aIcCz}OD?WW5Y`kF3Hb@YP96Ah7 zY7Zz!v~cDqgkQ11*2mY3f_Z>1+~vWwxkxIzKU$OJT6V0~zQ8=H$iZ$*UWnl!t|&^v zMn!??drL`5B|Ce%9BbmiIvV(H-haZ!+wimni{dFMBzs&oWhChJ!wtu1z0m(JSH`wEK&Tnx?x=cE zs~~7O0KlQa2MQU=8uKcWTg?PsMiY*e13F+Jw#_`1Q9%LW$!5M4O!#-Kmd~4g5rW@S zP(N@VePOKixIK}bM*3aAA&UN3lk{O70xrfh3VL^2=+eK9@g)3)bgisa&G-G@JtSceJjK+o%XIz6#cmLOc; zb=_axye-vpJ=Bv$A?_2KOUo|jBGvf&XkasDl}zFc#K|Us*Q18+a?yh z*Ki_>1h3PUK-O8iBow{sm)WTE^@XQJYEkAETCFg=1A#FiP`WyMKfYQSk*17xdKr^ z^53I`auvA_n67%Gp;X*0w#hE+AS%iwKiDY%^I9{yIoIh9Wz}l&n}g9*9b;r;u*E2QLxE zYLtdRbOt{f+5fX{YyGgI?d7PbAf1jN^|Kz&OktK+6+sFe|Ead22soQgFfDgDwBg)p$KY}14QF@04Jkjzwpt{g&86jM58mJV=LgZ=mn z(dOcllNWT5f*M*ieu!puwMIzzL^bA5fVyD5DJ zDiDlOvhueJ4eZ*#&y+L`i#g$C#Exz7CFJl2++UlEde{VeL-kwhXB@r&qLu}31XG82 z@StlQTlBnn5!G#`02LSnN^36_mPV;(bbgLkAs9uTdnuLVCD>keNUO+_IJw4Q$hRy? zVvK$u1TkP49t}Flnudux-o?2Jdm@)HH}c=(C}I zF(7XUmBPeN;_KzKzTki66V z!SE#rMoFy3#e?m56N3}|q}j(9qjJKz8ZPZw$rzx5%T`{A1V z)o6^1h$6+kY9FCUeNfr^n-`i9EBqC}2--tr&nmq$1M*pR8lbTfK#zQVqmJ^kHKjj^ zb~Uqxc)hPTLF&JkWUS@@EmWdMB>*6Xw7j|1=}Rp8 zOSxbC)si_7OzDE&FY=WO&FPxF+mcx+S>^}J>12U9GuohPA^Z1${qR|Yk>fkA*#&Hh zM<_9tpW+d7^I4}RYpdRezDDcnnj!DJ5vj6p&hKmOzN;Q)VIEBz_y^YMn2oi~8Gc*e zCaZkjC4Zdnf@~ns@7ChU+*!mo9Zp;im9x+Ce-6GBi(7Ouu8bJ}M(6dF#><3GP81-p zS4|tSD@Z&@@Rja76^LHt?d+kd+}%h(XM|`V8Dsw%Uu+Fbic~xvHv{pGo?M7WsSlvC zK^LAjfBg_X@%7d=fMVN#@3#}EAMNfLi6)S3x@EVq=+)R)jgph_(&y*8AbCiLyG40E zdE6WoCFs}>?EC&0>+?p!VOlD{{kyW#=wtyayQnK}W(uM{x^M@neblc2e5&$@g}#_W zMTA&V0g_=i;7qNo zytu16D`n&F+N9&?uI&KTL(Qzaqw=E>QSF{s?zk*m=x&BLI6_2`-JG<8^zA9Wko|rI zY*l&rg>7KlkF>{ebGb*)gF78zHBSp#HMW-9Jom+ul?%45*+)Ed0ogVzo0jVt$a~zn z)gFfotqd_WWH>=;vXrV`Ek?mg9{N$7*|ZI&GBhW5b^sn*siQxcJAaNmJnb_7HDS zTY+qztZF=OTtC)Sl>9u> zC0e}5ti9)0A=}bwHXang+kI#`FyCMVN^$33Bu`I1${Iw7)6XI<%TVPQ-=WYx4G@Jw zcf92#uW3Rl?O?p=TcN;mG*ip}_S44-#=dNPvBpf<3h3Qa5%<@Ma$2Qz;ZwRwrM}aks$_+X?!^3}%)r zpWAD`S|l%x0s`fW3fn5~u9+7@C{wCfLsYmeA5S43G%(K@!0=_Qr;Dc( zCvqe%_gOO~ziw6l`Khv3lJ0R|FU!EP&PQ{0b@(hpsxgnM>bk0q8{NT=OYkJ%H_#Tu z0ac7t;R#x zYtN$Vf|OH`L5wFU@oAZ4UW z27ddkAkAQ=HRm%h-~otV&-;kOZ<6}sM3@yaeKa4Rh713;v%KvnJ2@fQ>g8+Mme;fO zF2Q6Lqj#ZAcS1zH5ybj$1ly(<{ifze%637_bcs4K4}kC~sB>adsBXo=1i60nF6_$X zBZC14W+(oZN8{agJ)`|vVzOXlhh_IF#%b5?1DVzeZ2kfBN~Xk6g97WtKa84c9_CEx zVT0s6&LNZ0K6zUhgZy;$b}(HVK|AlG!)L1j;Cx30jP0#b0Us{>G2eF#Y4Zgzg&U+(I2Iqr>n zEjPIkXFkOn@etBv-iP7=`2@}K86aKemaD&n4|*UnB{zV~+^Z@gsW1@?p5wbW*l+)l z${gJ8WF-1mZv7s{oFkAOs`Ci|s`}gPE$caBx4EHzor05}3V>w*euxUUNNbJ?gm!Wr zE zAaq$e$HD#W00Lyc2Hpy+GJ9(v0=1okH)lyOG$W!;?GxbcqR4sb@a8K3ZbNxCO$nIy zme#{^yP3tg%MqH359FWOCx^XkP8MoQf(cnH$1{bQ-%F-`4_wT$-pL)WQ1V+v_6m0R z=NB8cY3;Y_I(9tl?EyaS$Ccw<)g($%CV z{;Zk+2gmgcpnEtC0xFXY5ZPJXw;o8+Qv6I$XqmCVC5@zu*m44N<;9Ur@eGidfvLZc zG58E@DdJ-w1dr@xvl?SM%YWdbxKXzX_P`pcT#>jee9icw*-I~M1>hTXS=P(i<@Euj ztdd7C@w7Flk`JOD^`Fs>qDA^QiVr>~0Sbxd0-(ubDfz&qozD~L%Q!s5(kh$FW`Mlf zfy|uKDCYFke12e=zSaRr>u^U|ktgQyh`Os|uQ`1uGTyP||2)$m7AO;`$ys`}Qf_fX zaBzTz)iec7{%I_=#|S>Xj=iW@c%vECES-PQ%Mz!)@=(d|z6SU9c z+vrHv2%)MrlykWYiheE+_lDt*Spdc|HWAqlLZm5Mv!?ytP2A;)uj8 zgR=ihgTwAuErRwNBDaY!#PTjy^1jTaoV@RT!MGK)x)fF4Fd zUqEg{0574f?e=62i()*mvvrczo;lrqCRGIS(bdPgHx~`8*>e#g-fMF&3GX2wCObB4 z=eE>d9A@gAVe!vw0{3jC`#73!E(sFO$7s@C#Yge&Iv|gB^pL7~wzN&XyJuoxPan33$asY60N#J^MDp zAb;b2(7zf)+l85;9oT1b6A27E!&A8czM6o5&S71^=Q9#+sBe*-R zTMbFPJzkL01gWw;#jgA|gm$Q36en=`XJjP*S9#z4Pxb%C%}H5hr;?16tRj0ml%#A~ z5z350M##t^A!S7Np2^-jlDI%H(s*Bjr@<9DKQAAqU5gFa#RSZq8lQYP0h-KXr- z(a6? zzKwZZ(sAzVLxNu(rSG(*?Qqd)oMIT$uAqr4V+ z1AO>&e>-{fniBE>GE$10=zl#rqz~K~d16I9g*tv?#8ar5q=FcKq%ym)iqF&GFs|AK zhU?5Y!%Xiuo%AvTn%9DL_+w}PTL;P@+kNMa#i0e<)SX`I_#YEFa{1WDiA_w`nFZRg zbXTUENO4p*J$5|387`5XYmpNuUn2c{W?{UI=HL40b^C@J9ejeuwZ|Ch&QSuV5#(c! zn()b5_2O{R{UI;AKNIR_GVwcY#>MNPo`;3sWKC%45ELVZrI}3379bL1@dDlqhJuGr zPTg;1)~}>G6SeN3YaZeki(mWnUj|Zwv+rih!zrhG!&TH*( zf?eoO!(K2C_xSUFen-#4l(8@wIS0lDOQwcb(!3Z=t~N<6RG!Z#A{35z>wCCUnaC$S zvSY`TbbM1GtR63>Ys-G#dl4Zp4`$bz;7%Bqh#GZke_FS4J{BrBdUL9#8>cP>-Kq+_ zYy|RgG}%FTLf;or0rT4s{_)3MBkZ&<07IiHu^M_2uekS{>u{0b5O-&&PaD9Ua66w9 z2PY6{&0+_Evy~S;E01P?oBFnrlBBWOCQJfodxcra)fd)i{tIun5&)R&$SEUAYk3MHs z*c(mcW`jX4gJA3`^-*BvbE3z1l?WxBBzLJE_-U(?cPbF zeStw84?B0}qqF+zt^Z<f177d%5G1N+6wW_})RV!1b3ah;)=P=7SWveMbHh+52DA6!6#q9FIQ_=23y@7zi z5cYhn_H}5_aZ7`TE6~1BUAR`-YBUI9xr3~j7{jfmrZ!wEmJ>;)%NIw>anC&eCt)AI zhz}ty$jTX+VR%h1cEYTyoX#qlL#4fZ&lma9ZUreTMhjl8KwMhV;li&DpN3{qKmpah z0M3MlrLV46|1=gBVFjKnc<9}2{?zbrtA6*b!^Qt`kxan!h+>@D$-ymY5UEu6IhpHp zMHPP+i<`OVW<-4P@qim0<>ZVLEbs8PZa8CbbuDC=f)HFVPBo;ZU(&dp=t0BWs{C~Y zF*entdb|tO=WQd^4_6%IP15LWD#GHHs9EDU{leyNF2UlE8(LX}*U-s%Sw%9jCw#a~Ix(e^Q{zcYm3t&ejHoCUy2<-Bm>Ifwxn~&pyHRFP$ni%t= zq+qW8MmJ9@Jvo<28@c&$X=cBBl90Fj8)zL4_e}xwa$n6}aT7qcZamR)NzXZjNUF0f zl%#Ydqoz)0vYH^|`2_Rs>RH$|Xm=(l?SDTMw&w2nlzB*&h<8|wfJ%yr&$O*Sw#O~! zXfHC^aNuh!-dcikWhTS%Px<>~?`zi7ppPpt2$Os0;^~ojcwRC6EGmVj?Kxo5+Z@P< zF!{y4c#|pMZe)#l6jeJYDGshe4_hcQr)?9UunlnVB~9_!YJH4&C@q2Z;Y^=CNXl&yt|1V&D(r zRxLL4{xCf#jfZ#99q9!yG+`z4$#f$nm_=@}i`g=zGR)rTb#&H4ZV<1080T@5e>F+ zdvxshi_8X{%fh4GXrs~-7C$1_F1s}^%@QE7jOEm6j(caXamNX zyqlGl?bnZ*4=^zhe=Ohq1m4euykE~cwW~?^_+!N!JEQ<_qN%2R*5wwVj}tzcnY#p% znr3DGRTK&0Ix}z_?tJ(Vm*s1}CSy!=?C2}wW-~51Ms2Omkq3zl2ftKY{%Li#dtT5*4gGw?P)DN)q8hS z8Ejf=Vs`xA$b`$rX@kN_5trqu!B-+aC7%5a#qgK_R)pD!OBClJzNyU+7v|tzsZrwc z5YT(8i%BLL+Z+!iaWX0YjZ6vk@3}r87{qZiC(XX`S&+CbkJcgHm0#RGin)%0N5?FS zYE!S***aJDn)26PPZn_Z&=+RSX$mAhFwBWg<5$<^aRI$-r`skI<3u3VwoWwNHNkb+ zVk<$T=fySMk|*iG8r)AGr^<)Q*e?|K(W+6`*RhHC@Ex6*TuN=G`Kn0Nhi8x6$zSnW z&{p`h4wl;mw%n0Q`)XH^sS{~d9$##7f^ouYM|v-Te%Vw63%9r=V$!t!(P*iA?{tNq z9$c<3bpfWS*7s-oeSpzGl@(lD0)*nQRTxEQvRFwKLl3JX=c_35DftU7pTufT3$7o9 z&)YEWYRQ`XKALA+< zCe=$u$3G*++3DA}wj-|9_Mj5aI2 zd#adASb3g_81hM1Pb8njIIc=tSj^!TewB9eKc4v8u1Pv{Q(yBRdSMtRO7w;BFuoF9 zRsk1LFP)?0m9>g9olmt8X- z1zokfo=Yp#c#Sj_ z7`2q!!Qn;c$F87Xoj&-rF@KNyp+43_6@Q&;z76y~v`pjyz}_KR^bGy=J{?7l>}$s% z*JNaat4dsh>`%pPTJ+nM*~)fR(jjbyO5zt;Am6vKjwwVu2j{$A90SOPBh>Z1_ENXH z;ahlgpn|wEuq*wpTU|iyz5bqN|JoZK%Pl zoZ+i;2XFT%q!uPpZxRaX;hDbvNjsKN2+F@cKnOK(ceMZda_1=RA^=RAdnC5dtaFcd zGioH@g0*caUhK1mbAdBX(f<{yqg0q;xVYU0F4rVaWpgSnYR(AoC-|LM>MZT}d6X^0 zu&OBkf|C<2x?o+jYu7F#MERY*oV4hCyM=m|pvlBhk$@qctZmW;r|MFfMPf7_c*K$u zrdozR4HtiF7dZ-{walo>6J+$-4}r+XY^l=Yx&*EDim{4W;N=cggDa-6J)cy7Z~W>W zLnH4&nJl%UMOI|dGdHNMI+b?PZb(K5!=wBAi}yYY=Wa(4-`-IkTtekE3&oMpz?|3D zfJ)vcR||!QU+(X!zXTVybcGgg;kMoZ=YUUi)35e*<@0RbYMQCg6)s@(q1+1O^6e6Z-uk5-U5mCOW0Vy>%5)f&YrP__qeev9I0~>r>~J!k z(RX_IcVpPaI{U-x{DKY8DXM^|$0a06+O@PrF^h;`<)F@LB`At(`U^Xo;k^Gd`)YMP zwr&8J-~A}g2=nfc%=ZZ9dYNq3-lf!cJCDu{P~F3x3fOUo*LW7Q7ii=_$A!SEdPx*%Jl zOI4(}I(nGmiche1X9TNOS5f_8BoCRa^FxhIh)l|fhsEor-1roIPX4MJWvfdkr~R=S z@C0h~0)+c{Vm&>nXHtdQS5!A3q- zARa-*9XpC5;hyQ#qOBly1dShwE4bAB9ke;w80Zg>8gvY`itJ+G{@zAS`|FeEsHo?o zeWGJNtIx1{f@)%gdAs`#}&oMUNLf(+n=#IHvF*#7`Y^iJq8 zZ<5n0SqS@8XCG*QLfxB?rt%aB7{?N4;{ zOF_~PffGqLXb!VkQXumjTZ8zh-{l{t^gZWoHI^d3xoXKA&S>8+$QE!kzkev4&|zE2 zZg=_AY~8uRDCrsC;uRy!bC7HbB8+jK0c>TTXDJ_*aDgu zQHM{ea}L>-hsAVlA3UA z<+s`0ET=<f-;qv6Wi*_5*nKb1$JT5!iD=B5kjZq z6KN9^DK&0ECcpDT)GS^M^(+~CDxgo_B^wKrnfcVt)3a}Zc*%&&ckm!5^ONlqB23XGT_=zq8WoRq1T&ml67CAIrovClv!iCo_! zm0(67D~du8lj;0v=t@@(+}7y2sQ9}~eda`H=!?&mIptGE?0-qyoIf6~bH3$|0wGRG z9%PnvC!G6#q}~m$F>hMYRA()ey;Yl~M(g+s%pCzE5XF}=S+x~|ttlPxd=Ku_Knj&f z!zmB^WA_oGnu|EqrI8aX*RI-g78^gl^y$iE@<22(DesViVz>4sou`97=Jye2MflohBvPDx5v27L2l|Bg9a&d`~6neP`### zTW8BxpKX~cD079h(n#cNVGJ^$z75xt>@+$EmqCOmfGd{RO!hou(2>&^qnS*$HR_v) zSToytJ^?zh_50GAFbd+o6LP6`b%#T`H(X2NP zIzpf&eZSfoIz#RDi9y8HxM(bZm)!i=#@?81ak2SmuY%k*qths6x|los{rexRbXH?0 zka=XJbXxubgL~2v%3kS4GZjI`K_WrkoM|naK}bd)(GSgw5Ok#CzEZ~fH>nmuUy$tS zks#v}kaWmqLXzlOWd8kPmMzN+!_OagE(8)Zbk>yt?Ri)7Z@0REeDK5UZ4qW-G2j3$ zU?wDI4@Qm1YDPgUDl1`>%kqXJXB@~bo>CD2PDSk<039f<*DiiV)&x!Sn}`%AO@ z0>w^e6zn-mLCTSHqW0$P2q#%V|B*JIxe1;n$0t6?L?q5^LvG4`|)4Y(=|v} zUE@PT@7+3g39Iu~f?gqA8iXXvAL;4a!nq9?vja@01`@h-`%^!=aPyE2nXdm!`#b|$ zx7@5Rzql@(T?U5iEfZ3F5KfNzf#NdkJ@5Yghc_al32@(EdoLP3LXz6QQysBl8ZFgt z2^TtEI>jHT>Z?P1)YU@G^5P#^nv7TxCdTBzl!LLrjztD+IH5~fNsB@ORyI*NFGzd3}eo{iP zB*Ps>PZWMUWq)dmKI5tA-Cy;7)IytFe+Yz7D7Lpm2|u^qXxfP7{G6nf+8p&_F>Q-b zz2{ymw5Kyt+n=s8W#e&d>td@dv+UORop)Cl*C4iW^O?MP_>Fd(;K#44Mp8MS-~NX9 z{b?7G`YB+nr&@_9%t0W_j>^E9H$lU?;j;i)Ql^W4V_c#zOcP#8kxgTEUaH>cWsr0& z^VSrd%Oq4QEKtY}FOM&uB#8(7N3N}Ol@_+K*Gia_-}h?v)0K;!YGTWFojEOPbP8j&a*=Uav~ z9Js#6s84~Lk^#4k))hPzJ?` z&bCTVB4rgXgGahcb7`;Ars13!{XUeUJ7;WU0N(opQlZ**$o<@rE!KgR5_`4+x8B z9=RpA^@yJ#B61NvD~%=-XD2l6|2c%%++IR)*$cLtT}l%MwvtVMDtuZqKdRfMF^{`H zes6^m+QhANr_lhGPYyMr0oPj1>xkj3Z))z?C3JxGGH9TgJiHn3`E#p~Ru4FUap#P_ zc*#!5`@gmK8wpE(&=PV3v6%4|G>GK_CDn^$BF?FQnCSE6nX+l#wwHZ#&4P>`Hvk!S z?z=5tDrurkFOMzSy_Eay`Y}*saj@IJj@e=vdc+zEdrQ?ynz{)))kHOux=suX7M%f-+x3+Yy)rNaJ!}jGPzM2eD*(m z0_x+d(4DBqwKz0?y-a;{<%%wfZSBd5)9Mrmy?bXtGaEhCj-}*41bz23QVeE57t0y7 zV-ox#o$+0>HWj-8HSBb*Ekvv}3Ldu+X41ruBoXLz&UKq0aRO76F{1`qWl_@an$&tJ za}es@c^$EpmG}1RXcE>fY^H!LE((nIPbEnO>%2V-h}t-SW+D2k6#vP3?3adgl2NpQ zT7V5Jmc2tx#s)dAd@Y086Q)L>iDT;As#PczEr8NC8!?l8nd^Su0OT5L6iJW3<1&=RpAwuU6Nwo9+89Z->({I;BY?HLMZ*8eG zNE+CjLw#n=lWw2l?#|YAw1uq|_Lg46wkFr;#wardGd|6WSEDg66seouJ}9&K?Vz;f zBSo={k70+t2lVLyPoy5#g%r~%J#Qj>$m&ax7YkR$^ZH;H8?ar)uMSw|x>1*tRuSXB zqz;;txO?4c=`CN!rv8UtCZM_K6riY5%K z9U)q2xR;{%%Y7%4!X2)~l$y=s7!{OS@7wP*YEaZx;_O1NC^PAcHy)fB23;- z!%n99iPO+eQ`iK1SdUy1#IS@M~>v)%A(IMu!re^?#8u@x*Vv6>LPMX?o?h z^F1q1?6z=|j^;I)pqFq#zyp<*e-S%3b>xV}JCJLN%|8A1^l0a3otHIYe*8$!F#h}x z)oqRLw>_4=?;AEkNOA;dSEFaIfP8 zd5?=r@cJ)ki}4bD(KNJ3wZAbn;a&a1T{;q=jL`RxMCT2kYvZOBgCt*WHM8vA)+wPu zn?QH})I3EyfkQN|o*G}ki#5Y>xs-0ePH%)iuyEsyPZy}vL-u#3rMS$_D@TTv$<%%& z$iqHRh=Hqhi7eYr^2;}-Q3qp!UNT0>ogK3{=c&LZ{b^|Xf`|Hk#X}}gvP-Z0qms>4 z#Ly{H{vyIh{090)iB%kc`~DX9g+}UsA_=L}YxH|F87et^XK*6l{V2B`nC8{(r=*6F zm>!-?>}0kp%6Tr^KDL2s5f9+yRQ2`Fo8KxO$@@x9b>^_ydU8cNVI2yORl+&y39k<*FT zPPnJ4GsOJXKqh#RGNBprW4PI?<@D`OtvA@)k`4qURCK}~O22ZpZTZ>J+!TB*` zHzG3r0SPCMa;3=B-~)y`{*2pev+CcMaI%}oLtjxfnR9p#Pl{he%@Js!V@Jc}o$mp4 zt6$(%>wZdhJ~`1`UGaD;8MzJhAzJP0F-wrXK%LCL>Fgy9Mh=Fv(D%{yq~AGJgiEm@ z!RK0251Lqzfn#fB0IWfXGc^59mPUWbWCwM2`M=a~{Q;^|8#aeTz}PD^cx?tAeQ^20 zVeq}sOnIs$FvL}kA6$$45M5N?zlyf1$oK;-EX}#3Z;{>fdrZ)g!f%cpEr9+OFB@by zD6!+Gk(pdkf~LS9Og@v$4@%5e0mr=06H7V%fYwjyU^;HzuC@2I!*iS<{UIb})qubLYzk5E#66ha%mFzRKc zhw{r3sP7`F0{0l5!wl&WOc)PC&@QN{*D^`bTW-|5)e8u?J#V})g%t9B$QdSDoA2X} zr`gJ7vy%(m!hg3=)5H^aXY4o8!7HMfd~1n9%NJU9Y#?Uln7uA#${43OnDit$MCdr3 z(Dqbgsu6NK@mI{|-$Qit4pFI-V z5R$Gaf{t3=z$g><+r)fC{^C(%eupZ=AQlXCo1^)D;}-Gp&#{Gp5nmYuvJJ92thVf4 zbsRgIIX3E`hjE*JgD3fmbu~q&AFlL&oPAcw8zA2D-p}sfI~24SyEXnWXXBH5S&$OA z=uB{3IUm-va>%#bj7CfAOc1`+xaPyRaPo{rzK`UY^o=V*kZ{Fm^T=8jU8dSVwmh2Y zA}Vn9YS!u?pVJidoy(%2e5`*&O!Z5n{XHW77V~LO#hA5>=amiiS2|jEJqtRb<3>eL z`>MWq9fhWOw_IP?FAhdB%*RnbKpjpG{z1#@-a2^`E4Le^Ip4On2%de+WE^Qce&mi2 zS3txPr%qReki?GHp53W|8{kulPsqCj1ljj>L7ikLp~R%5q%<&xkNsUE&*tjW8E^C_ zseL)!7Fj5!FHK>6ut}DgF@TnzQp+3vDYNegw39ORv8Wz5wi<#%u1JYOMJ{(y^sSJ$ zq(N6foL$mBUI8+4_>pBP474=TQ0E$xPGnRUXEX<7S$032?)t&jgb?S`gob_9JFjNZ zG^s7R3)(MU(>u`FrMt!*Q11488j-OhIRz2xa+cDg<~u^5Xo999=}tD6L=LoT;40zA z0LY}NNwAxP-C!px%~VETUYH%F?V`FnakvIzsQB5mk-% zF!jLKX$Eii%?N4L+z#EoSiP|XPVJbNlOMD+FG#tI)0TN0N<6`Xvq^hiq_Q^JbZ-^R zO&_$OL3$6gSMBaEd8)ewz1GkC7@U!VEcUbV_SJ%_(hp$pz6%hJvAi?BtRSy^M|KGnYxU{@~vB>9QU}#A_@_)I=%PQT>kumiAKXwiT<^TWy literal 0 HcmV?d00001 diff --git a/packages/framekit/src/app/api/dmimage/route.tsx b/packages/baselinks/src/app/api/dmimage/route.tsx similarity index 100% rename from packages/framekit/src/app/api/dmimage/route.tsx rename to packages/baselinks/src/app/api/dmimage/route.tsx diff --git a/packages/framekit/src/app/api/mint/route.tsx b/packages/baselinks/src/app/api/mint/route.tsx similarity index 100% rename from packages/framekit/src/app/api/mint/route.tsx rename to packages/baselinks/src/app/api/mint/route.tsx diff --git a/packages/baselinks/src/app/api/og/route.ts b/packages/baselinks/src/app/api/og/route.ts new file mode 100644 index 000000000..f2f95ac8f --- /dev/null +++ b/packages/baselinks/src/app/api/og/route.ts @@ -0,0 +1,74 @@ +import { NextResponse } from "next/server"; +import * as cheerio from 'cheerio'; + +export async function GET(request: Request) { + try { + const { searchParams } = new URL(request.url); + const url = searchParams.get("url"); + + if (!url) { + return NextResponse.json( + { error: "URL parameter is required" }, + { status: 400 }, + ); + } + + console.log("Fetching OG data for URL:", url); + + const response = await fetch(url, { + headers: { + "user-agent": "bot", + }, + }); + + if (!response.ok) { + throw new Error(`Failed to fetch: ${response.status}`); + } + + const html = await response.text(); + const $ = cheerio.load(html); + + // Extract meta tags using cheerio + const getMetaContent = (property: string) => { + return ( + $(`meta[property="${property}"]`).attr('content') || + $(`meta[name="${property}"]`).attr('content') + ); + }; + + const ogData = { + title: + getMetaContent("og:title") || + getMetaContent("twitter:title") || + $('title').text() || + url, + description: + getMetaContent("og:description") || + getMetaContent("twitter:description") || + getMetaContent("description") || + "", + image: + getMetaContent("og:image") || + getMetaContent("twitter:image") || + "", + url, + siteName: getMetaContent("og:site_name") || "", + }; + + console.log("Extracted OG data:", ogData); + + return NextResponse.json(ogData); + } catch (error) { + console.error("Error in OG route:", error); + return NextResponse.json( + { + error: + error instanceof Error ? error.message : "Failed to fetch OG data", + }, + { status: 500 }, + ); + } +} + +export const runtime = "edge"; +export const dynamic = "force-dynamic"; diff --git a/packages/framekit/src/app/api/payment/route.tsx b/packages/baselinks/src/app/api/payment/route.tsx similarity index 100% rename from packages/framekit/src/app/api/payment/route.tsx rename to packages/baselinks/src/app/api/payment/route.tsx diff --git a/packages/framekit/src/app/api/receipt/route.tsx b/packages/baselinks/src/app/api/receipt/route.tsx similarity index 100% rename from packages/framekit/src/app/api/receipt/route.tsx rename to packages/baselinks/src/app/api/receipt/route.tsx diff --git a/packages/framekit/src/app/api/resolve/route.ts b/packages/baselinks/src/app/api/resolve/route.ts similarity index 100% rename from packages/framekit/src/app/api/resolve/route.ts rename to packages/baselinks/src/app/api/resolve/route.ts diff --git a/packages/framekit/src/app/api/wallet/route.tsx b/packages/baselinks/src/app/api/wallet/route.tsx similarity index 100% rename from packages/framekit/src/app/api/wallet/route.tsx rename to packages/baselinks/src/app/api/wallet/route.tsx diff --git a/packages/framekit/src/app/custom/page.tsx b/packages/baselinks/src/app/custom/page.tsx similarity index 100% rename from packages/framekit/src/app/custom/page.tsx rename to packages/baselinks/src/app/custom/page.tsx diff --git a/packages/framekit/src/app/dm/[address]/ChatClient.tsx b/packages/baselinks/src/app/dm/[address]/ChatClient.tsx similarity index 100% rename from packages/framekit/src/app/dm/[address]/ChatClient.tsx rename to packages/baselinks/src/app/dm/[address]/ChatClient.tsx diff --git a/packages/framekit/src/app/dm/[address]/metadata.ts b/packages/baselinks/src/app/dm/[address]/metadata.ts similarity index 100% rename from packages/framekit/src/app/dm/[address]/metadata.ts rename to packages/baselinks/src/app/dm/[address]/metadata.ts diff --git a/packages/framekit/src/app/dm/[address]/page.tsx b/packages/baselinks/src/app/dm/[address]/page.tsx similarity index 100% rename from packages/framekit/src/app/dm/[address]/page.tsx rename to packages/baselinks/src/app/dm/[address]/page.tsx diff --git a/packages/baselinks/src/app/favicon.ico b/packages/baselinks/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/packages/baselinks/src/app/fonts/GeistMonoVF.woff b/packages/baselinks/src/app/fonts/GeistMonoVF.woff new file mode 100644 index 0000000000000000000000000000000000000000..f2ae185cbfd16946a534d819e9eb03924abbcc49 GIT binary patch literal 67864 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ϣ%UY8`RWp~V-U_7 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 CLkb=M literal 0 HcmV?d00001 diff --git a/packages/baselinks/src/app/fonts/GeistVF.woff b/packages/baselinks/src/app/fonts/GeistVF.woff new file mode 100644 index 0000000000000000000000000000000000000000..1b62daacff96dad6584e71cd962051b82957c313 GIT binary patch literal 66268 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 >-Aun5A4Gp>4U0IQJ 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 G)cz05(PHWV literal 0 HcmV?d00001 diff --git a/packages/framekit/src/app/generator/page.tsx b/packages/baselinks/src/app/generator/page.tsx similarity index 100% rename from packages/framekit/src/app/generator/page.tsx rename to packages/baselinks/src/app/generator/page.tsx diff --git a/packages/baselinks/src/app/globals.css b/packages/baselinks/src/app/globals.css new file mode 100644 index 000000000..02730cc54 --- /dev/null +++ b/packages/baselinks/src/app/globals.css @@ -0,0 +1,150 @@ +:root { + --background: #000000; + --foreground: #ffffff; + --accent: #fa6977; +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #000000; + --foreground: #ffffff; + } +} + +html, +body { + max-width: 100vw; + overflow-x: hidden; + margin: 0; + padding: 0; + height: 100vh; +} + +body { + color: var(--foreground); + background: var(--background); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, + Ubuntu, Cantarell, sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.container { + width: 100vw; + height: 100vh; + background-color: var(--background); + display: flex; + align-items: center; + justify-content: center; + font-family: var(--font-geist-sans); +} + +.wrapper { + width: 100%; + max-width: 56rem; + margin: 0 auto; + padding: 0 1rem; +} + +.title { + font-size: 2.25rem; + font-weight: bold; + text-align: center; + margin-bottom: 2rem; + font-family: var(--font-geist-sans); +} + +.form-container { + background-color: #111111; + border-radius: 0.5rem; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); + padding: 1.5rem; +} + +.form-group { + margin-bottom: 1rem; +} + +.label { + display: block; + font-size: 0.875rem; + font-weight: 500; + color: #ffffff; + margin-bottom: 0.5rem; +} + +.input, +.select { + width: 100%; + padding: 0.5rem 0.75rem; + border: 1px solid #333333; + background-color: #000000; + color: #ffffff; + border-radius: 0.375rem; + margin-top: 0.25rem; +} + +.submit-button { + width: 100%; + background-color: var(--accent); + color: white; + padding: 0.5rem 1rem; + border-radius: 0.375rem; + border: none; + cursor: pointer; +} + +.submit-button:hover { + background-color: #e55967; +} + +.url-container { + margin-top: 1.5rem; +} + +.url-group { + display: flex; + gap: 0.5rem; +} + +.copy-button { + padding: 0.5rem 1rem; + background-color: #111111; + color: #ffffff; + border-radius: 0.375rem; + border: none; + cursor: pointer; + margin-top: 0.25rem; +} + +.copy-button:hover { + background-color: #222222; +} + +/* For any monospace text, like the generated URL */ +.url-container .input { + font-family: var(--font-geist-mono); +} + +.powered-by { + text-align: center; + align-items: center; + font-family: var(--font-geist-sans); + color: #ffffff; +} + +.powered-by a { + color: var(--accent); + text-decoration: none; + font-weight: 500; +} + +.powered-by a:hover { + text-decoration: underline; +} + +.nextjs-toast, +nextjs-portal, +.nextjs-static-indicator-toast-wrapper { + display: none !important; +} diff --git a/packages/baselinks/src/app/layout.tsx b/packages/baselinks/src/app/layout.tsx new file mode 100644 index 000000000..587a86c43 --- /dev/null +++ b/packages/baselinks/src/app/layout.tsx @@ -0,0 +1,14 @@ +import Head from "next/head"; +import "./globals.css"; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + {children} + + ); +} diff --git a/packages/framekit/src/app/mint/page.tsx b/packages/baselinks/src/app/mint/page.tsx similarity index 100% rename from packages/framekit/src/app/mint/page.tsx rename to packages/baselinks/src/app/mint/page.tsx diff --git a/packages/framekit/src/app/page.module.css b/packages/baselinks/src/app/page.module.css similarity index 100% rename from packages/framekit/src/app/page.module.css rename to packages/baselinks/src/app/page.module.css diff --git a/packages/framekit/src/app/page.tsx b/packages/baselinks/src/app/page.tsx similarity index 100% rename from packages/framekit/src/app/page.tsx rename to packages/baselinks/src/app/page.tsx diff --git a/packages/framekit/src/app/payment/page.tsx b/packages/baselinks/src/app/payment/page.tsx similarity index 100% rename from packages/framekit/src/app/payment/page.tsx rename to packages/baselinks/src/app/payment/page.tsx diff --git a/packages/framekit/src/app/receipt/page.tsx b/packages/baselinks/src/app/receipt/page.tsx similarity index 100% rename from packages/framekit/src/app/receipt/page.tsx rename to packages/baselinks/src/app/receipt/page.tsx diff --git a/packages/baselinks/src/app/utils/networks.ts b/packages/baselinks/src/app/utils/networks.ts new file mode 100644 index 000000000..da7ffffdc --- /dev/null +++ b/packages/baselinks/src/app/utils/networks.ts @@ -0,0 +1,374 @@ +type Network = { + networkId: string; + networkName: string; + networkLogo: string; + tokenName: string; + dripAmount: number; + address: string; + chainId: number; + tokenAddress: string; + isERC20: boolean; + erc20Address: string | undefined; + erc20Decimals: number | undefined; + isActive: boolean; + balance: string; +}; +const db = [ + { + networkId: "arbitrum_sepolia", + networkName: "Arbitrum Sepolia", + networkLogo: "https://cryptologos.cc/logos/arbitrum-arb-logo.png?v=026", + tokenName: "arbETH", + dripAmount: 0.01, + address: "0x625BCC1142E97796173104A6e817Ee46C593b3C5", + isERC20: false, + erc20Address: undefined, + erc20Decimals: undefined, + chainId: 421614, + tokenAddress: "0x82af49447d8a07e3bd95bd0d56f35241523fbab8", + isActive: true, + balance: "0.01", + }, + { + networkId: "base", + networkName: "Base", + networkLogo: "https://avatars.githubusercontent.com/u/108554348?s=280&v=4", + tokenName: "USDC", + dripAmount: 0.01, + address: "0x625BCC1142E97796173104A6e817Ee46C593b3C5", + isERC20: false, + erc20Address: undefined, + erc20Decimals: undefined, + chainId: 8453, + tokenAddress: "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", + isActive: true, + balance: "179.70", + }, + { + networkId: "base_goerli", + networkName: "Base Goerli", + networkLogo: "https://avatars.githubusercontent.com/u/108554348?s=280&v=4", + tokenName: "bgETH", + dripAmount: 0.01, + address: "0x625BCC1142E97796173104A6e817Ee46C593b3C5", + isERC20: false, + erc20Address: undefined, + erc20Decimals: undefined, + chainId: 84532, + tokenAddress: "0x82af49447d8a07e3bd95bd0d56f35241523fbab8", + isActive: true, + balance: "179.70", + }, + { + networkId: "base_sepolia", + networkName: "Base Sepolia", + networkLogo: "https://avatars.githubusercontent.com/u/108554348?s=280&v=4", + tokenName: "bsETH", + dripAmount: 0.01, + address: "0x625BCC1142E97796173104A6e817Ee46C593b3C5", + isERC20: false, + erc20Address: undefined, + erc20Decimals: undefined, + chainId: 84532, + tokenAddress: "0x82af49447d8a07e3bd95bd0d56f35241523fbab8", + isActive: true, + balance: "179.70", + }, + { + networkId: "base_sepolia_usdc", + networkName: "Base Sepolia USDC", + networkLogo: "https://avatars.githubusercontent.com/u/108554348?s=280&v=4", + tokenName: "bUSDC", + dripAmount: 1, + address: "0x625BCC1142E97796173104A6e817Ee46C593b3C5", + isERC20: true, + erc20Address: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", + erc20Decimals: 6, + chainId: 84532, + tokenAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", + isActive: true, + balance: "489148.00", + }, + { + networkId: "berachain_artio", + networkName: "Berachain Artio", + networkLogo: "https://avatars.githubusercontent.com/u/96059542", + tokenName: "BERA", + dripAmount: 0.1, + address: "0x625BCC1142E97796173104A6e817Ee46C593b3C5", + isERC20: false, + erc20Address: undefined, + erc20Decimals: undefined, + chainId: 1115, + tokenAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", + isActive: true, + balance: "0.00", + }, + { + networkId: "celo_alfajores", + networkName: "Celo Alfajores", + networkLogo: "https://cryptologos.cc/logos/celo-celo-logo.png?v=026", + tokenName: "CELO", + dripAmount: 0.05, + address: "0x625BCC1142E97796173104A6e817Ee46C593b3C5", + isERC20: false, + erc20Address: undefined, + erc20Decimals: undefined, + chainId: 42220, + tokenAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", + isActive: true, + balance: "4553.99", + }, + { + networkId: "holesky", + networkName: "Ethereum Holesky", + networkLogo: "https://cryptologos.cc/logos/ethereum-eth-logo.png", + tokenName: "hETH", + dripAmount: 0.1, + address: "0x625BCC1142E97796173104A6e817Ee46C593b3C5", + isERC20: false, + erc20Address: undefined, + erc20Decimals: undefined, + chainId: 1115, + tokenAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", + isActive: true, + balance: "6450.40", + }, + { + networkId: "eth", + networkName: "Ethereum Mainnet", + networkLogo: "https://cryptologos.cc/logos/ethereum-eth-logo.png", + tokenName: "ETH", + dripAmount: 0.01, + address: "0x625BCC1142E97796173104A6e817Ee46C593b3C5", + isERC20: false, + erc20Address: undefined, + erc20Decimals: undefined, + chainId: 1115, + tokenAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", + isActive: true, + balance: "6450.40", + }, + { + networkId: "sepolia", + networkName: "Ethereum Sepolia", + networkLogo: "https://cryptologos.cc/logos/ethereum-eth-logo.png", + tokenName: "sETH", + dripAmount: 0.02, + address: "0x625BCC1142E97796173104A6e817Ee46C593b3C5", + isERC20: false, + erc20Address: undefined, + erc20Decimals: undefined, + chainId: 1115, + tokenAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", + isActive: true, + balance: "54.45", + }, + { + networkId: "flow", + networkName: "Flow Testnet", + networkLogo: "https://cryptologos.cc/logos/flow-flow-logo.png?v=026", + tokenName: "FLOW", + dripAmount: 1, + address: "0x3e2ab8b954bc0bc0", + isERC20: false, + erc20Address: undefined, + erc20Decimals: undefined, + chainId: 1115, + tokenAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", + isActive: true, + balance: "9964.00", + }, + { + networkId: "mode_sepolia", + networkName: "Mode Sepolia", + networkLogo: + "https://raw.githubusercontent.com/mode-network/brandkit/ef5d79dc521a56ca5674697810407fc04f6dec71/Assets/Logo/Mode%20logo%20primary.png", + tokenName: "ETH", + dripAmount: 0.1, + address: "0x625BCC1142E97796173104A6e817Ee46C593b3C5", + isERC20: false, + erc20Address: undefined, + erc20Decimals: undefined, + chainId: 1115, + tokenAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", + isActive: true, + balance: "0.02", + }, + { + networkId: "optimism_sepolia", + networkName: "Optimism Sepolia", + networkLogo: + "https://cryptologos.cc/logos/optimism-ethereum-op-logo.png?v=026", + tokenName: "opETH", + dripAmount: 0.01, + address: "0x625BCC1142E97796173104A6e817Ee46C593b3C5", + isERC20: false, + erc20Address: undefined, + erc20Decimals: undefined, + chainId: 1115, + tokenAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", + isActive: true, + balance: "2.30", + }, + { + networkId: "polygon_amoy", + networkName: "Polygon Amoy", + networkLogo: "https://s2.coinmarketcap.com/static/img/coins/64x64/3890.png", + tokenName: "MATIC", + dripAmount: 0.1, + address: "0x625BCC1142E97796173104A6e817Ee46C593b3C5", + isERC20: false, + erc20Address: undefined, + erc20Decimals: undefined, + chainId: 1115, + tokenAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", + isActive: true, + balance: "0.03", + }, + { + networkId: "scroll_sepolia", + networkName: "Scroll Sepolia", + networkLogo: + "https://pbs.twimg.com/profile_images/1696533090683011075/46xlNPQR_400x400.jpg", + tokenName: "ETH", + dripAmount: 0.01, + address: "0x625BCC1142E97796173104A6e817Ee46C593b3C5", + isERC20: false, + erc20Address: undefined, + erc20Decimals: undefined, + chainId: 1115, + tokenAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", + isActive: true, + balance: "6.42", + }, + { + networkId: "stacks", + networkName: "Stacks Testnet", + networkLogo: "https://cryptologos.cc/logos/stacks-stx-logo.png", + tokenName: "STX", + dripAmount: 1, + address: "ST4HMZRS8XSTGEPQXNKXFAY9T45HMS4FE72Q3ED0", + isERC20: false, + erc20Address: undefined, + erc20Decimals: undefined, + chainId: 1115, + tokenAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", + isActive: true, + balance: "907.42", + }, + { + networkId: "starknet_sepolia", + networkName: "Starknet Sepolia", + networkLogo: + "https://pbs.twimg.com/profile_images/1834202903189618688/N4J8emeY_400x400.png", + tokenName: "ETH", + dripAmount: 0.001, + address: + "0x012b6781F1Fbe402F75efacDD4D90bb22c69c0172b7d34bB5233854631Ca3272", + isERC20: false, + erc20Address: undefined, + erc20Decimals: undefined, + chainId: 1115, + tokenAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", + isActive: true, + balance: "99.64", + }, + { + networkId: "sui_testnet", + networkName: "Sui Testnet", + networkLogo: + "https://suifoundation.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F25d4a7b2-cc43-4d0f-8b5e-7f840eef1508%2FSui_Droplet_Logo_Blue.png?table=block&id=cd93d06a-6ec4-474e-8a35-a09f4e86c3f6&spaceId=279a541f-304a-4674-a846-6f35af6d2aab&width=1570&userId=&cache=v2", + tokenName: "SUI", + dripAmount: 0.5, + address: + "0xda593ab6a600ccf74e9dc1f2ef0f7ba852bf29bcc92d91e302c33c883b333432", + isERC20: false, + erc20Address: undefined, + erc20Decimals: undefined, + chainId: 1115, + tokenAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", + isActive: true, + balance: "0.00", + }, + { + networkId: "zksync_sepolia", + networkName: "zkSync Era Sepolia", + networkLogo: + "https://pbs.twimg.com/profile_images/1835668010951950336/Aq1Kg1p0_400x400.jpg", + tokenName: "ETH", + dripAmount: 0.01, + address: "0x625BCC1142E97796173104A6e817Ee46C593b3C5", + isERC20: false, + erc20Address: undefined, + erc20Decimals: undefined, + chainId: 1115, + tokenAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", + isActive: true, + balance: "369.47", + }, + { + networkId: "zora_sepolia", + networkName: "Zora Sepolia", + networkLogo: "https://docs.zora.co/zoraOrb.svg", + tokenName: "zsETH", + dripAmount: 0.01, + address: "0x625BCC1142E97796173104A6e817Ee46C593b3C5", + isERC20: false, + erc20Address: undefined, + erc20Decimals: undefined, + chainId: 1115, + tokenAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", + isActive: true, + balance: "7.85", + }, +]; + +export function extractFrameChain(txLink: string): Network { + // if its basescan is base + // if its seoplia is sepolia + // if its etherscan is eth + // if its goerli is goerli + + let network: Network | undefined = undefined; + for (const netWork of db) { + if (txLink === netWork.networkId) { + network = netWork; + break; + } + } + if (network === undefined) { + if (txLink?.includes("etherscan.io")) { + network = db.find((n) => n.networkId === "eth"); + } else if (txLink?.includes("goerli.etherscan.io")) { + network = db.find((n) => n.networkId === "eth_goerli"); + } else if (txLink?.includes("sepolia.etherscan.io")) { + network = db.find((n) => n.networkId === "eth_sepolia"); + } else if (txLink?.includes("sepolia.basescan.org")) { + network = db.find((n) => n.networkId === "base_sepolia"); + } else if (txLink?.includes("goerli.basescan.org")) { + network = db.find((n) => n.networkId === "base_goerli"); + } else if (txLink?.includes("basescan.org")) { + network = db.find((n) => n.networkId === "base"); + } + } + if (network === undefined) { + console.error(`Network ${network} not found`); + return { + networkId: "", + networkName: "", + networkLogo: "", + tokenName: "", + dripAmount: 0, + address: "", + isERC20: false, + erc20Address: undefined, + erc20Decimals: undefined, + chainId: 0, + tokenAddress: "", + isActive: false, + balance: "0", + }; + } + return network; +} diff --git a/packages/baselinks/src/app/utils/resolver.ts b/packages/baselinks/src/app/utils/resolver.ts new file mode 100644 index 000000000..7f986571e --- /dev/null +++ b/packages/baselinks/src/app/utils/resolver.ts @@ -0,0 +1,209 @@ +import { isAddress } from "viem"; +export const converseEndpointURL = "https://converse.xyz/profile/"; + +export type InfoCache = Map; +export type ConverseProfile = { + address: string | undefined; + onXmtp: boolean; + avatar: string | undefined; + formattedName: string | undefined; + name: string | undefined; +}; +export type UserInfo = { + ensDomain?: string | undefined; + address?: string | undefined; + preferredName: string | undefined; + converseUsername?: string | undefined; + ensInfo?: EnsData | undefined; + avatar?: string | undefined; + converseEndpoint?: string | undefined; +}; + +export interface EnsData { + address?: string; + avatar?: string; + avatar_small?: string; + converse?: string; + avatar_url?: string; + contentHash?: string; + description?: string; + ens?: string; + ens_primary?: string; + github?: string; + resolverAddress?: string; + twitter?: string; + url?: string; + wallets?: { + eth?: string; + }; +} + +class UserInfoCache { + private static instance: UserInfoCache; + private cache: InfoCache = new Map(); + + private constructor() {} + + public static getInstance(): UserInfoCache { + if (!UserInfoCache.instance) { + UserInfoCache.instance = new UserInfoCache(); + } + return UserInfoCache.instance; + } + + get(key: string): UserInfo | undefined { + return this.cache.get(key.toLowerCase()); + } + + set(key: string, data: UserInfo): void { + this.cache.set(key.toLowerCase(), data); + } + + clear(key?: string): void { + if (key) { + this.cache.delete(key.toLowerCase()); + } else { + this.cache.clear(); + } + } +} + +// Use the singleton instance +export const userInfoCache = UserInfoCache.getInstance(); + +export const getUserInfo = async ( + key: string, + clientAddress?: string, +): Promise => { + let data: UserInfo = { + ensDomain: undefined, + address: undefined, + converseUsername: undefined, + ensInfo: undefined, + avatar: undefined, + converseEndpoint: undefined, + preferredName: undefined, + }; + + if (typeof key !== "string") { + console.error("userinfo key must be a string"); + return data; + } + + const cachedData = userInfoCache.get(key); + if (cachedData) return cachedData; + + key = key?.toLowerCase(); + clientAddress = clientAddress?.toLowerCase(); + + // Determine user information based on provided key + if (isAddress(clientAddress || "")) { + data.address = clientAddress; + } else if (isAddress(key || "")) { + data.address = key; + } else if (key.includes(".eth")) { + data.ensDomain = key; + } else if (["@user", "@me", "@bot"].includes(key)) { + data.address = clientAddress; + data.ensDomain = key.replace("@", "") + ".eth"; + data.converseUsername = key.replace("@", ""); + } else if (key === "@alix") { + data.address = "0x3a044b218BaE80E5b9E16609443A192129A67BeA".toLowerCase(); + data.converseUsername = "alix"; + } else if (key === "@bo") { + data.address = "0xbc3246461ab5e1682baE48fa95172CDf0689201a".toLowerCase(); + data.converseUsername = "bo"; + } else { + data.converseUsername = key; + } + + data.preferredName = data.ensDomain || data.converseUsername || "Friend"; + const keyToUse = + data.address?.toLowerCase() || data.ensDomain || data.converseUsername; + + if (!keyToUse) { + console.log("Unable to determine a valid key for fetching user info."); + return data; + } else { + // Fetch ENS data + try { + const response = await fetch(`https://ensdata.net/${keyToUse}`); + if (response.status !== 200) { + if (process.env.MSG_LOG === "true") + console.log("- ENS data request failed for", keyToUse); + } else { + const ensData = (await response.json()) as EnsData; + if (ensData) { + data.ensInfo = ensData; + data.ensDomain = ensData.ens || data.ensDomain; + data.address = + ensData.address?.toLowerCase() || data.address?.toLowerCase(); + data.avatar = ensData.avatar_url || data.avatar; + } + } + } catch (error) { + console.error(`Failed to fetch ENS data for ${keyToUse}`); + } + //Converse profile + // try { + // const username = keyToUse.replace("@", ""); + // const converseEndpoint = `${converseEndpointURL}${username}`; + // const response = await fetchWithTimeout( + // converseEndpoint, + // { + // method: "POST", + // headers: { + // "Content-Type": "application/json", + // Accept: "application/json", + // }, + // body: JSON.stringify({ peer: username }), + // mode: "cors", + // credentials: "include", + // }, + // 5000, + // ); + // if (!response?.ok) { + // console.error( + // `Converse profile request failed with status ${response?.status}`, + // ); + // } + // const converseData = (await response?.json()) as ConverseProfile; + // if (converseData) { + // data.converseUsername = + // converseData.formattedName || + // converseData.name || + // data.converseUsername; + // data.address = + // converseData.address?.toLowerCase() || data.address?.toLowerCase(); + // data.avatar = converseData.avatar || data.avatar; + // data.converseEndpoint = converseEndpoint; + // } + // } catch (error) { + // console.error("Failed to fetch Converse profile:", error); + // } + + data.preferredName = data.ensDomain || data.converseUsername || "Friend"; + userInfoCache.set(keyToUse, data); + return data; + } +}; + +const fetchWithTimeout = async ( + url: string, + options: RequestInit, + timeout = 5000, +) => { + const controller = new AbortController(); + const id = setTimeout(() => controller.abort(), timeout); + try { + const response = await fetch(url, { + ...options, + signal: controller.signal, + }); + clearTimeout(id); + return response; + } catch (error) { + clearTimeout(id); + console.error("fetching"); + } +}; diff --git a/packages/framekit/src/app/wallet/page.tsx b/packages/baselinks/src/app/wallet/page.tsx similarity index 100% rename from packages/framekit/src/app/wallet/page.tsx rename to packages/baselinks/src/app/wallet/page.tsx diff --git a/packages/framekit/src/components/Chat.module.css b/packages/baselinks/src/components/Chat.module.css similarity index 100% rename from packages/framekit/src/components/Chat.module.css rename to packages/baselinks/src/components/Chat.module.css diff --git a/packages/baselinks/src/components/Chat.tsx b/packages/baselinks/src/components/Chat.tsx new file mode 100644 index 000000000..367412821 --- /dev/null +++ b/packages/baselinks/src/components/Chat.tsx @@ -0,0 +1,263 @@ +import React, { useCallback } from "react"; +import { useState, useEffect } from "react"; +import { Wallet } from "ethers"; +import styles from "./Chat.module.css"; +import { UserInfo } from "@/app/utils/resolver"; +import { isAddress, parseUnits } from "viem"; +import { extractFrameChain } from "@/app/utils/networks"; +import sdk from "@farcaster/frame-sdk"; +import { UrlPreview } from "./UrlPreview"; +import { createClient, XMTP, Message } from "xmtp-client"; + +type UrlType = "receipt" | "payment" | "wallet" | "unknown"; + +const getUrlType = (url: string): UrlType => { + if (url.includes("/receipt")) return "receipt"; + if (url.includes("/payment")) return "payment"; + if (url.includes("/wallet")) return "wallet"; + return "unknown"; +}; + +const isFrame = async () => { + try { + const context = await sdk.context; + return !!context; // If we can get context, we're in a frame + } catch { + return false; // If we can't get context, we're not in a frame + } +}; + +function Chat({ user }: { user: UserInfo }) { + const [messages, setMessages] = useState([]); + const [newMessage, setNewMessage] = useState(""); + const [wallet, setWallet] = useState(undefined); + const [xmtp, setXmtp] = useState(undefined); + const [isLoading, setIsLoading] = useState(true); + const [recipientInfo, setRecipientInfo] = useState( + undefined, + ); + const [processedMessageIds] = useState(new Set()); + + useEffect(() => { + console.log("useEffect triggered with user:", user); + + const init = async () => { + const newWallet = Wallet.createRandom(); + setWallet(newWallet); + + try { + setRecipientInfo(user); + if (user?.address) { + console.log("Initializing XMTP with address:", user.address); + await initXmtp(newWallet); + } else { + console.error("Could not resolve recipient address"); + setIsLoading(false); + } + } catch (error) { + console.error("Error resolving recipient:", error); + setIsLoading(false); + } + }; + + init(); + }, [user.address]); + + const onMessage = async (message: Message | undefined) => { + if (message) { + console.log("onMessage", message); + setMessages((prevMessages) => [...prevMessages, message]); + } + }; + + const initXmtp = async (wallet: any) => { + try { + const xmtpClient = await createClient(onMessage, { + privateKey: wallet.privateKey, + }); + + setXmtp(xmtpClient); + setIsLoading(false); + } catch (error) { + console.error("Error initializing XMTP:", error); + setIsLoading(false); + } + }; + + const sendMessage = async (e: React.FormEvent) => { + e.preventDefault(); + + if (!xmtp || !newMessage || !recipientInfo?.address) { + console.log("Missing required data:", { + xmtp: !!xmtp, + newMessage, + recipientAddress: recipientInfo?.address, + }); + return; + } + + try { + console.log("Sending message:", newMessage); + const message = await xmtp.sendMessage(newMessage, user.address); + + setMessages((prevMessages) => [...prevMessages, message]); + setNewMessage(""); + } catch (error) { + console.error("Error sending message:", error); + } + }; + + const ethereumURL = (url: string) => { + try { + const urlObject = new URL(url); + const urlParams = new URLSearchParams(urlObject.search); + const networkId = urlParams.get("networkId"); + const { chainId, tokenAddress } = extractFrameChain(networkId as string); + const amount = urlParams.get("amount"); + const recipientAddress = urlParams.get("recipientAddress"); + + if (!amount || !recipientAddress) { + console.error("Missing required parameters for ethereum URL"); + return url; + } + + const amountUint256 = parseUnits(amount, 6); + return `ethereum:${tokenAddress}@${chainId}/transfer?address=${recipientAddress}&uint256=${amountUint256}`; + } catch (error) { + console.error("Error constructing ethereum URL:", error); + return url; + } + }; + + const openUrl = useCallback(async (url: string) => { + try { + const inFrame = await isFrame(); + if (inFrame) { + sdk.actions.openUrl(url); + } else { + window.open(url, "_blank"); + } + } catch (error) { + console.error("Error opening URL:", error); + window.location.href = url; + } + }, []); + + const renderMessageContent = (text: string) => { + const urlRegex = /(https?:\/\/[^\s]+)/g; + const parts = text?.split(urlRegex); + + return parts.map((part, index) => { + if (urlRegex.test(part)) { + try { + const urlType = getUrlType(part); + const isMessageKitUrl = part.includes("frames.message-kit.org"); + + return ( +