@openagentmarket/nodejs 1.3.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/client.d.ts CHANGED
@@ -69,6 +69,14 @@ export declare class OpenAgentClient {
69
69
  * @returns TaskResult with the reply
70
70
  */
71
71
  chat(agentAddress: string, text: string, timeout?: number): Promise<TaskResult>;
72
+ /**
73
+ * Send a plain text message without waiting for a reply.
74
+ * Use this for peer-to-peer chat where streamAllMessages handles incoming messages.
75
+ *
76
+ * @param recipientAddress - The recipient's wallet address
77
+ * @param text - The message text
78
+ */
79
+ sendMessage(recipientAddress: string, text: string): Promise<void>;
72
80
  /**
73
81
  * Wait for a response message from the agent on a conversation.
74
82
  */
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,qBAAqB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,YAAY,GAAG,KAAK,GAAG,OAAO,CAAC;CACxC;AAED,MAAM,WAAW,UAAU;IACvB,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,yDAAyD;IACzD,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,oCAAoC;IACpC,eAAe,CAAC,EAAE;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC5B,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,eAAe;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAwB;IAEtC,OAAO;IAKP;;;OAGG;WACiB,MAAM,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;IAiCnF;;OAEG;IACI,UAAU,IAAI,MAAM;IAI3B;;;;;;;;OAQG;IACU,QAAQ,CACjB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAChC,IAAI,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC,UAAU,CAAC;IA4BtB;;;;;;;OAOG;IACU,IAAI,CACb,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAc,GACxB,OAAO,CAAC,UAAU,CAAC;IAWtB;;OAEG;YACW,eAAe;IAgF7B;;;;;;OAMG;IACU,iBAAiB,CAC1B,SAAS,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,IAAI,GACpF,OAAO,CAAC,IAAI,CAAC;CA0BnB"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,qBAAqB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,YAAY,GAAG,KAAK,GAAG,OAAO,CAAC;CACxC;AAED,MAAM,WAAW,UAAU;IACvB,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,yDAAyD;IACzD,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,oCAAoC;IACpC,eAAe,CAAC,EAAE;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC5B,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,eAAe;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAwB;IAEtC,OAAO;IAKP;;;OAGG;WACiB,MAAM,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;IAiCnF;;OAEG;IACI,UAAU,IAAI,MAAM;IAI3B;;;;;;;;OAQG;IACU,QAAQ,CACjB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAChC,IAAI,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC,UAAU,CAAC;IA4BtB;;;;;;;OAOG;IACU,IAAI,CACb,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAc,GACxB,OAAO,CAAC,UAAU,CAAC;IAWtB;;;;;;OAMG;IACU,WAAW,CACpB,gBAAgB,EAAE,MAAM,EACxB,IAAI,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IAShB;;OAEG;YACW,eAAe;IA+F7B;;;;;;OAMG;IACU,iBAAiB,CAC1B,SAAS,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,IAAI,GACpF,OAAO,CAAC,IAAI,CAAC;CAyCnB"}
package/dist/client.js CHANGED
@@ -105,6 +105,20 @@ export class OpenAgentClient {
105
105
  await conversation.send(text);
106
106
  return await this.waitForResponse(conversation, timeout);
107
107
  }
108
+ /**
109
+ * Send a plain text message without waiting for a reply.
110
+ * Use this for peer-to-peer chat where streamAllMessages handles incoming messages.
111
+ *
112
+ * @param recipientAddress - The recipient's wallet address
113
+ * @param text - The message text
114
+ */
115
+ async sendMessage(recipientAddress, text) {
116
+ const conversation = await this.client.conversations.newDmWithIdentifier({
117
+ identifier: recipientAddress,
118
+ identifierKind: 0
119
+ });
120
+ await conversation.send(text);
121
+ }
108
122
  /**
109
123
  * Wait for a response message from the agent on a conversation.
110
124
  */
@@ -123,7 +137,19 @@ export class OpenAgentClient {
123
137
  if (message.senderInboxId === this.client.inboxId)
124
138
  continue;
125
139
  clearTimeout(timer);
126
- const content = message.content;
140
+ let content = message.content;
141
+ // Fall back to .fallback for unsupported content types (e.g. reply)
142
+ if (content === undefined || content === null) {
143
+ const fallback = message.fallback;
144
+ if (fallback) {
145
+ // Strip 'Replied with "..." to an earlier message' wrapper
146
+ const match = fallback.match(/^Replied with \"(.*)\" to an earlier message$/s);
147
+ content = match ? match[1] : fallback;
148
+ }
149
+ }
150
+ if (content === undefined || content === null) {
151
+ continue; // skip unreadable messages
152
+ }
127
153
  if (typeof content !== 'string') {
128
154
  resolve({ success: true, raw: String(content) });
129
155
  return;
@@ -198,10 +224,23 @@ export class OpenAgentClient {
198
224
  // Skip our own messages
199
225
  if (message.senderInboxId === this.client.inboxId)
200
226
  continue;
201
- const content = message.content;
227
+ let content = message.content;
228
+ // Fall back to .fallback for unsupported content types (e.g. reply)
229
+ if (content === undefined || content === null) {
230
+ const fallback = message.fallback;
231
+ if (fallback) {
232
+ const match = fallback.match(/^Replied with \"(.*)\" to an earlier message$/s);
233
+ content = match ? match[1] : fallback;
234
+ }
235
+ }
236
+ if (content === undefined || content === null)
237
+ continue;
238
+ const contentStr = String(content);
239
+ if (!contentStr || !contentStr.trim())
240
+ continue;
202
241
  const conversationId = message.conversationId || '';
203
242
  const senderAddress = message.senderInboxId || 'unknown';
204
- onMessage(senderAddress, String(content), conversationId);
243
+ onMessage(senderAddress, contentStr, conversationId);
205
244
  }
206
245
  }
207
246
  catch (err) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openagentmarket/nodejs",
3
- "version": "1.3.0",
3
+ "version": "1.5.0",
4
4
  "description": "OpenAgent Market Node.js SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/src/client.ts CHANGED
@@ -161,6 +161,25 @@ export class OpenAgentClient {
161
161
  return await this.waitForResponse(conversation, timeout);
162
162
  }
163
163
 
164
+ /**
165
+ * Send a plain text message without waiting for a reply.
166
+ * Use this for peer-to-peer chat where streamAllMessages handles incoming messages.
167
+ *
168
+ * @param recipientAddress - The recipient's wallet address
169
+ * @param text - The message text
170
+ */
171
+ public async sendMessage(
172
+ recipientAddress: string,
173
+ text: string
174
+ ): Promise<void> {
175
+ const conversation = await this.client.conversations.newDmWithIdentifier({
176
+ identifier: recipientAddress,
177
+ identifierKind: 0
178
+ });
179
+
180
+ await conversation.send(text);
181
+ }
182
+
164
183
  /**
165
184
  * Wait for a response message from the agent on a conversation.
166
185
  */
@@ -185,7 +204,22 @@ export class OpenAgentClient {
185
204
 
186
205
  clearTimeout(timer);
187
206
 
188
- const content = (message as any).content;
207
+ let content = (message as any).content;
208
+
209
+ // Fall back to .fallback for unsupported content types (e.g. reply)
210
+ if (content === undefined || content === null) {
211
+ const fallback = (message as any).fallback;
212
+ if (fallback) {
213
+ // Strip 'Replied with "..." to an earlier message' wrapper
214
+ const match = fallback.match(/^Replied with \"(.*)\" to an earlier message$/s);
215
+ content = match ? match[1] : fallback;
216
+ }
217
+ }
218
+
219
+ if (content === undefined || content === null) {
220
+ continue; // skip unreadable messages
221
+ }
222
+
189
223
  if (typeof content !== 'string') {
190
224
  resolve({ success: true, raw: String(content) });
191
225
  return;
@@ -268,11 +302,26 @@ export class OpenAgentClient {
268
302
  // Skip our own messages
269
303
  if ((message as any).senderInboxId === this.client.inboxId) continue;
270
304
 
271
- const content = (message as any).content;
305
+ let content = (message as any).content;
306
+
307
+ // Fall back to .fallback for unsupported content types (e.g. reply)
308
+ if (content === undefined || content === null) {
309
+ const fallback = (message as any).fallback;
310
+ if (fallback) {
311
+ const match = fallback.match(/^Replied with \"(.*)\" to an earlier message$/s);
312
+ content = match ? match[1] : fallback;
313
+ }
314
+ }
315
+
316
+ if (content === undefined || content === null) continue;
317
+
318
+ const contentStr = String(content);
319
+ if (!contentStr || !contentStr.trim()) continue;
320
+
272
321
  const conversationId = (message as any).conversationId || '';
273
322
  const senderAddress = (message as any).senderInboxId || 'unknown';
274
323
 
275
- onMessage(senderAddress, String(content), conversationId);
324
+ onMessage(senderAddress, contentStr, conversationId);
276
325
  }
277
326
  } catch (err: any) {
278
327
  console.error('[OpenAgentClient] Stream error:', err.message);
@@ -1,40 +0,0 @@
1
- # OpenAgent Hirer CLI
2
-
3
- A persistent XMTP chat CLI for hiring agents on [OpenAgent Market](https://openagent.market).
4
-
5
- ## Getting Started
6
-
7
- ```bash
8
- npm install
9
- npm start
10
- ```
11
-
12
- ## Commands
13
-
14
- | Command | Description |
15
- |---------|-------------|
16
- | `/discover` | Browse available agents from the marketplace |
17
- | `/chat <address> <message>` | Send a plain text message to an agent |
18
- | `/task <address> <method> [json]` | Send a JSON-RPC task to an agent |
19
- | `/help` | Show available commands |
20
- | `/quit` | Exit the CLI |
21
-
22
- ## Examples
23
-
24
- ```
25
- > /discover
26
- > /chat 0xAgentAddr What can you do?
27
- > /task 0xAgentAddr say_hello {"name": "World"}
28
- ```
29
-
30
- ## Environment Variables
31
-
32
- | Variable | Description |
33
- |----------|-------------|
34
- | `MNEMONIC` | Wallet seed phrase (auto-generated for you) |
35
-
36
- ## Resources
37
-
38
- - [Discover API](https://openagent.market/discover?protocol=openagentmarket)
39
- - [SDK Docs](https://www.npmjs.com/package/@openagentmarket/nodejs)
40
- - [Explorer](https://8004agents.ai)
package/my-hirer/index.ts DELETED
@@ -1,142 +0,0 @@
1
- import { OpenAgentClient } from '@openagentmarket/nodejs';
2
- import * as readline from 'node:readline';
3
- import 'dotenv/config';
4
-
5
- const DISCOVER_URL = "https://openagent.market/discover?protocol=openagentmarket";
6
-
7
- async function main() {
8
- const client = await OpenAgentClient.create({
9
- mnemonic: process.env.MNEMONIC,
10
- env: "production"
11
- });
12
-
13
- console.log("");
14
- console.log("✅ Connected to XMTP");
15
- console.log(" Wallet: " + client.getAddress());
16
- console.log("");
17
- printHelp();
18
-
19
- // ── Start REPL ──
20
- const rl = readline.createInterface({
21
- input: process.stdin,
22
- output: process.stdout,
23
- prompt: "\n> "
24
- });
25
-
26
- // ── Background message listener ──
27
- await client.streamAllMessages((sender, content, convId) => {
28
- console.log("\n📨 [" + sender.slice(0, 10) + "...] " + content);
29
- rl.prompt();
30
- });
31
-
32
- rl.prompt();
33
-
34
- rl.on("line", async (line: string) => {
35
- const input = line.trim();
36
- if (!input) { rl.prompt(); return; }
37
-
38
- try {
39
- if (input === "/help") {
40
- printHelp();
41
- }
42
- else if (input === "/discover") {
43
- await discoverAgents();
44
- }
45
- else if (input.startsWith("/chat ")) {
46
- const parts = input.slice(6).trim().split(" ");
47
- const address = parts[0];
48
- const message = parts.slice(1).join(" ");
49
- if (!address || !message) {
50
- console.log("Usage: /chat <agent-address> <message>");
51
- } else {
52
- console.log("📤 Sending to " + address + "...");
53
- const reply = await client.chat(address, message);
54
- if (reply.success) {
55
- console.log("📩 Reply:", reply.result ?? reply.raw ?? "(empty)");
56
- } else {
57
- console.log("❌ Error:", reply.error ?? "Unknown error");
58
- }
59
- }
60
- }
61
- else if (input.startsWith("/task ")) {
62
- const parts = input.slice(6).trim().split(" ");
63
- const address = parts[0];
64
- const method = parts[1];
65
- const paramsStr = parts.slice(2).join(" ") || "{}";
66
- if (!address || !method) {
67
- console.log("Usage: /task <agent-address> <method> [json-params]");
68
- } else {
69
- let params: any = {};
70
- try { params = JSON.parse(paramsStr); } catch { params = { input: paramsStr }; }
71
- console.log("📤 Sending task '" + method + "' to " + address + "...");
72
- const result = await client.sendTask(address, method, params);
73
- if (result.paymentRequired) {
74
- console.log("💰 Payment required:", result.paymentRequired);
75
- } else if (result.success) {
76
- console.log("✅ Result:", JSON.stringify(result.result, null, 2));
77
- } else {
78
- console.log("❌ Error:", result.error);
79
- }
80
- }
81
- }
82
- else if (input === "/quit" || input === "/exit") {
83
- console.log("Bye! 👋");
84
- process.exit(0);
85
- }
86
- else {
87
- console.log("Unknown command. Type /help for available commands.");
88
- }
89
- } catch (err: any) {
90
- console.error("❌ Error:", err.message || err);
91
- }
92
-
93
- rl.prompt();
94
- });
95
-
96
- rl.on("close", () => {
97
- console.log("\nBye! 👋");
98
- process.exit(0);
99
- });
100
- }
101
-
102
- function printHelp() {
103
- console.log("📖 Commands:");
104
- console.log(" /discover — Browse available agents");
105
- console.log(" /chat <agent-address> <message> — Send a chat message");
106
- console.log(" /task <agent-address> <method> [params] — Send a task (params as JSON)");
107
- console.log(" /help — Show this help");
108
- console.log(" /quit — Exit");
109
- }
110
-
111
- async function discoverAgents() {
112
- console.log("🔍 Fetching agents from OpenAgent Market...\n");
113
- try {
114
- const res = await fetch(DISCOVER_URL);
115
- const data = await res.json() as any;
116
- if (!data.success || !data.items?.length) {
117
- console.log("No agents found.");
118
- return;
119
- }
120
- for (const item of data.items) {
121
- const reg = item.registrationFile || {};
122
- const name = reg.name || "Unknown";
123
- const desc = reg.description || "";
124
- // Find xmtpAddress from metadata array
125
- const meta = item.metadata || [];
126
- let addr = item.owner || "?";
127
- const walletMeta = meta.find((m: any) => m.key === "agentWallet");
128
- if (walletMeta) addr = walletMeta.value;
129
- const agentId = item.agentId || "";
130
- console.log(" 🤖 " + name + (agentId ? " (#" + agentId + ")" : ""));
131
- if (desc) console.log(" " + desc.slice(0, 120) + (desc.length > 120 ? "..." : ""));
132
- console.log(" Address: " + addr);
133
- console.log("");
134
- }
135
- console.log("Total: " + data.items.length + " agent(s)");
136
- if (data.hasMore) console.log("(more agents available)");
137
- } catch (err: any) {
138
- console.error("Failed to fetch agents:", err.message);
139
- }
140
- }
141
-
142
- main().catch(console.error);