create-message-kit 1.1.8-beta.1 → 1.1.8-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js CHANGED
@@ -84,8 +84,8 @@ async function addPackagejson(destDir, name, pkgManager) {
84
84
  },
85
85
  };
86
86
 
87
- if (pkgManager.startsWith("yarn")) {
88
- packageTemplate.packageManager = `${pkgManager}`;
87
+ if (pkgManager.includes("yarn")) {
88
+ //packageTemplate.packageManager = `${pkgManager}`;
89
89
  // Add .yarnrc.yml to disable PnP mode
90
90
  }
91
91
 
@@ -101,7 +101,7 @@ async function addPackagejson(destDir, name, pkgManager) {
101
101
 
102
102
  async function gatherProjectInfo() {
103
103
  const templateOptions = [
104
- { value: "gm", label: "GM" },
104
+ { value: "gpt", label: "GPT" },
105
105
  { value: "agent", label: "Agent" },
106
106
  { value: "group", label: "Group" },
107
107
  ];
@@ -203,11 +203,23 @@ yarn-error.log*
203
203
 
204
204
  fs.writeFileSync(resolve(destDir, ".gitignore"), gitignoreContent.trim());
205
205
  }
206
-
207
206
  async function detectPackageManager() {
208
207
  try {
209
- const pkgManager = await detect();
208
+ // Check for npm_config_user_agent first
210
209
  const userAgent = process.env.npm_config_user_agent;
210
+
211
+ // Check if running through bun create
212
+ if (process.env.BUN_CREATE === "true") {
213
+ return "bun";
214
+ }
215
+
216
+ // Check if running through npm init
217
+ if (userAgent?.startsWith("npm")) {
218
+ return "npm";
219
+ }
220
+
221
+ // Fallback to detect for other cases
222
+ const pkgManager = await detect();
211
223
  let version = "";
212
224
 
213
225
  if (userAgent && pkgManager === "yarn") {
@@ -223,7 +235,6 @@ async function detectPackageManager() {
223
235
  return "npm";
224
236
  }
225
237
  }
226
-
227
238
  function kebabcase(str) {
228
239
  return str
229
240
  .replace(/([a-z])([A-Z])/g, "$1-$2")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-message-kit",
3
- "version": "1.1.8-beta.1",
3
+ "version": "1.1.8-beta.3",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -5,7 +5,7 @@ import { clearMemory } from "@xmtp/message-kit";
5
5
 
6
6
  export const frameUrl = "https://ens.steer.fun/";
7
7
  export const ensUrl = "https://app.ens.domains/";
8
- export const baseTxUrl = "https://base-tx-frame.vercel.app";
8
+ export const txpayUrl = "https://txpay.vercel.app";
9
9
 
10
10
  export async function handleEns(
11
11
  context: HandlerContext,
@@ -128,13 +128,12 @@ export async function handleEns(
128
128
  };
129
129
  }
130
130
  const data = await getUserInfo(address);
131
- let txUrl = `${baseTxUrl}/transaction/?transaction_type=send&buttonName=Tip%20${data?.ensDomain ?? ""}&amount=1&token=USDC&receiver=${
132
- isAddress(address) ? address : data?.address
133
- }`;
134
- console.log(txUrl);
131
+
132
+ let sendUrl = `${txpayUrl}/?&amount=1&token=USDC&receiver=${address}`;
133
+
135
134
  return {
136
135
  code: 200,
137
- message: txUrl,
136
+ message: sendUrl,
138
137
  };
139
138
  } else if (skill == "cool") {
140
139
  const { domain } = params;
@@ -2,7 +2,7 @@ import { skills } from "./skills.js";
2
2
  import { defaultPromptTemplate } from "@xmtp/message-kit";
3
3
 
4
4
  export async function agent_prompt(senderAddress: string) {
5
- let fineTunning = `
5
+ let fineTuning = `
6
6
  ## Example responses:
7
7
 
8
8
  1. Check if the user does not have a ENS domain
@@ -23,8 +23,8 @@ export async function agent_prompt(senderAddress: string) {
23
23
  6. If the user wants to register a ENS domain, use the command "/register [domain]"
24
24
  Looks like {ENS_DOMAIN} is available! Let me help you register it\n/register {ENS_DOMAIN}
25
25
 
26
- 7. If the user wants to directly to tip to the ENS domain owner, use directly the command "/tip [domain]", this will return a url but a button to send the tip
27
- Here is the url to send the tip:\n/tip {ENS_DOMAIN}
26
+ 7. If the user wants to directly to tip to the ENS domain owner, use directly the command "/tip [address]", this will return a url but a button to send the tip
27
+ Here is the url to send the tip:\n/tip 0x...
28
28
 
29
29
  8. If the user wants to get information about the ENS domain, use the command "/info [domain]"
30
30
  Hello! I'll help you get info about {ENS_DOMAIN}.\n Give me a moment.\n/info {ENS_DOMAIN}
@@ -42,5 +42,5 @@ export async function agent_prompt(senderAddress: string) {
42
42
  You should have said something like: "Looks like vitalik.eth is registered! What about these cool alternatives?\n/cool vitalik.eth
43
43
  `;
44
44
 
45
- return defaultPromptTemplate(fineTunning, senderAddress, skills, "@ens");
45
+ return defaultPromptTemplate(fineTuning, senderAddress, skills, "@ens");
46
46
  }
@@ -9,7 +9,6 @@ export const skills: SkillGroup[] = [
9
9
  skills: [
10
10
  {
11
11
  skill: "/register [domain]",
12
- triggers: ["/register"],
13
12
  handler: handleEns,
14
13
  description:
15
14
  "Register a new ENS domain. Returns a URL to complete the registration process.",
@@ -22,7 +21,6 @@ export const skills: SkillGroup[] = [
22
21
  },
23
22
  {
24
23
  skill: "/info [domain]",
25
- triggers: ["/info"],
26
24
  handler: handleEns,
27
25
  description:
28
26
  "Get detailed information about an ENS domain including owner, expiry date, and resolver.",
@@ -35,7 +33,6 @@ export const skills: SkillGroup[] = [
35
33
  },
36
34
  {
37
35
  skill: "/renew [domain]",
38
- triggers: ["/renew"],
39
36
  handler: handleEns,
40
37
  description:
41
38
  "Extend the registration period of your ENS domain. Returns a URL to complete the renewal.",
@@ -48,7 +45,6 @@ export const skills: SkillGroup[] = [
48
45
  },
49
46
  {
50
47
  skill: "/check [domain]",
51
- triggers: ["/check"],
52
48
  handler: handleEns,
53
49
  examples: ["/check vitalik.eth", "/check fabri.base.eth"],
54
50
  description: "Check if a domain is available.",
@@ -60,7 +56,6 @@ export const skills: SkillGroup[] = [
60
56
  },
61
57
  {
62
58
  skill: "/cool [domain]",
63
- triggers: ["/cool"],
64
59
  examples: ["/cool vitalik.eth"],
65
60
  handler: handleEns,
66
61
  description: "Get cool alternatives for a .eth domain.",
@@ -72,7 +67,6 @@ export const skills: SkillGroup[] = [
72
67
  },
73
68
  {
74
69
  skill: "/reset",
75
- triggers: ["/reset"],
76
70
  examples: ["/reset"],
77
71
  handler: handleEns,
78
72
  description: "Reset the conversation.",
@@ -81,7 +75,6 @@ export const skills: SkillGroup[] = [
81
75
  {
82
76
  skill: "/tip [address]",
83
77
  description: "Show a URL for tipping a domain owner.",
84
- triggers: ["/tip"],
85
78
  handler: handleEns,
86
79
  examples: ["/tip 0x1234567890123456789012345678901234567890"],
87
80
  params: {
@@ -0,0 +1,2 @@
1
+ KEY= # the private key of the agent wallet
2
+ OPEN_AI_API_KEY= # the API key for OpenAI
@@ -0,0 +1,37 @@
1
+ import {
2
+ run,
3
+ HandlerContext,
4
+ textGeneration,
5
+ processMultilineResponse,
6
+ } from "@xmtp/message-kit";
7
+ import { agent_prompt } from "./prompt.js";
8
+
9
+ if (!process.env.OPEN_AI_API_KEY) {
10
+ console.error("OPEN_AI_API_KEY is not set");
11
+ }
12
+
13
+ run(async (context: HandlerContext) => {
14
+ if (!process.env.OPEN_AI_API_KEY) {
15
+ context.send("gm");
16
+ return;
17
+ }
18
+ const {
19
+ message: {
20
+ content: { text, params },
21
+ sender,
22
+ },
23
+ } = context;
24
+
25
+ try {
26
+ let userPrompt = params?.prompt ?? text;
27
+ const { reply } = await textGeneration(
28
+ sender.address,
29
+ userPrompt,
30
+ await agent_prompt(sender.address),
31
+ );
32
+ await processMultilineResponse(sender.address, reply, context);
33
+ } catch (error) {
34
+ console.error("Error during OpenAI call:", error);
35
+ await context.send("An error occurred while processing your request.");
36
+ }
37
+ });
@@ -0,0 +1,20 @@
1
+ import { defaultPromptTemplate } from "@xmtp/message-kit";
2
+
3
+ export async function agent_prompt(senderAddress: string) {
4
+ let fineTunedPrompt = `
5
+
6
+ ### Context
7
+
8
+ You are a helpful bot agent that lives inside a web3 messaging group that helps interpret user requests and execute commands.
9
+ The message was sent by @${senderAddress}
10
+
11
+
12
+ Important:
13
+ - If a user asks jokes, make jokes about web3 devs\n
14
+ - If the user asks about performing an action and you can think of a command that would help, answer directly with the command and nothing else.
15
+ - Populate the command with the correct or random values. Always return commands with real values only, using usernames with @ and excluding addresses.\n
16
+ - If the user asks a question or makes a statement that does not clearly map to a command, respond with helpful information or a clarification question.\n
17
+ - If the user is grateful, respond asking for a tip in a playful manner.
18
+ `;
19
+ return defaultPromptTemplate(fineTunedPrompt, senderAddress, [], "@bot");
20
+ }
@@ -6,7 +6,7 @@ export async function handler(context: HandlerContext) {
6
6
  content: { skill, params },
7
7
  },
8
8
  } = context;
9
- const baseUrl = "https://txpay.vercel.app";
9
+ const txpayUrl = "https://txpay.vercel.app";
10
10
 
11
11
  if (skill === "pay") {
12
12
  const { amount: amountSend, token: tokenSend, username } = params;
@@ -23,7 +23,7 @@ export async function handler(context: HandlerContext) {
23
23
  };
24
24
  }
25
25
 
26
- let sendUrl = `${baseUrl}/?&amount=${amountSend}&token=${tokenSend}&receiver=${senderInfo.address}`;
26
+ let sendUrl = `${txpayUrl}/?&amount=${amountSend}&token=${tokenSend}&receiver=${senderInfo.address}`;
27
27
  await context.send(`${sendUrl}`);
28
28
  }
29
29
  }
@@ -9,7 +9,7 @@ export async function agent_prompt(senderAddress: string) {
9
9
  Hey! Sure let's do that.\n/game wordle
10
10
 
11
11
  2. When user wants to pay a specific token:
12
- I'll help you pay 1 USDC to 0x123...\n/pay 1 {TOKE}} 0x123456789...
12
+ I'll help you pay 1 USDC to 0x123...\n/pay 1 [token] 0x123456789...
13
13
  *This will return a url to pay
14
14
 
15
15
  3. If the user wants to pay a eth domain:
@@ -11,8 +11,7 @@ export const skills: SkillGroup[] = [
11
11
  description: "Group agent for tipping and transactions.",
12
12
  skills: [
13
13
  {
14
- skill: "/tip [username] [amount] [token]",
15
- triggers: ["/tip"],
14
+ skill: "/tip [usernames] [amount] [token]",
16
15
  examples: ["/tip @vitalik 10 usdc"],
17
16
  description: "Tip users in a specified token.",
18
17
  handler: tipping,
@@ -35,7 +34,6 @@ export const skills: SkillGroup[] = [
35
34
  },
36
35
  {
37
36
  skill: "/pay [amount] [token] [username]",
38
- triggers: ["/pay"],
39
37
  examples: ["/pay 10 usdc vitalik.eth", "/pay 1 @alix"],
40
38
  description:
41
39
  "Send a specified amount of a cryptocurrency to a destination address.",
@@ -58,7 +56,6 @@ export const skills: SkillGroup[] = [
58
56
  },
59
57
  {
60
58
  skill: "/game [game]",
61
- triggers: ["/game", "🔎", "🔍"],
62
59
  handler: games,
63
60
  description: "Play a game.",
64
61
  examples: ["/game wordle", "/game slot", "/game help"],
@@ -72,7 +69,6 @@ export const skills: SkillGroup[] = [
72
69
  },
73
70
  {
74
71
  skill: "/help",
75
- triggers: ["/help"],
76
72
  examples: ["/help"],
77
73
  handler: help,
78
74
  description: "Get help with the bot.",
@@ -83,7 +79,6 @@ export const skills: SkillGroup[] = [
83
79
  adminOnly: true,
84
80
  examples: ["/id"],
85
81
  handler: help,
86
- triggers: ["/id"],
87
82
  description: "Get the group ID.",
88
83
  params: {},
89
84
  },
@@ -1 +0,0 @@
1
- KEY= # the private key of the agent wallet
@@ -1,5 +0,0 @@
1
- import { run, HandlerContext } from "@xmtp/message-kit";
2
-
3
- run(async (context: HandlerContext) => {
4
- context.send("gm");
5
- });