farnsworth-planetexpress 1.0.0 → 1.0.2

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/README.md CHANGED
@@ -104,7 +104,7 @@ const listing = await client.list({
104
104
 
105
105
  ## Credentials
106
106
 
107
- Credentials are stored in `~/.planetexpress/vault.enc` — encrypted and portable.
107
+ Credentials are stored in `~/.planetexpress/vault.json`.
108
108
 
109
109
  ```bash
110
110
  npx farnsworth-planetexpress setup # Interactive setup
@@ -115,16 +115,16 @@ npx farnsworth-planetexpress revoke # Securely erase credentials
115
115
  Or use environment variables:
116
116
  ```bash
117
117
  export PLANETEXPRESS_API_KEY=pe_...
118
- export PLANETEXPRESS_GATEWAY=https://ai.farnsworth.cloud
118
+ export PLANETEXPRESS_GATEWAY=https://dropclaw.cloud
119
119
  ```
120
120
 
121
121
  ## Ecosystem
122
122
 
123
123
  PlanetExpress is part of the Farnsworth ecosystem:
124
124
 
125
- - **[Syntek](https://github.com/timowhite88/farnsworth-syntek)** — Agent memory engine ($100/90 days, includes free DropClaw)
126
- - **[DropClaw](https://github.com/timowhite88/dropclaw)** — Encrypted on-chain storage ($30 + gas, free with Syntek)
127
- - **PlanetExpress** — Agent marketplace ($30 to list)
125
+ - **[Syntek](https://github.com/timowhite88/farnsworth-syntek)** — Agent memory engine ($100/90 days, includes DropClaw for Syntek uploads — gas only)
126
+ - **[DropClaw](https://github.com/timowhite88/dropclaw)** — Encrypted on-chain storage ($30 + gas, Syntek subscribers pay gas only for Syntek uploads)
127
+ - **PlanetExpress** — Agent marketplace ($30 to list, $15 for Syntek subscribers)
128
128
 
129
129
  ## License
130
130
 
@@ -132,4 +132,4 @@ Proprietary — Farnsworth Labs. All rights reserved.
132
132
 
133
133
  ---
134
134
 
135
- [ai.farnsworth.cloud/marketplace](https://ai.farnsworth.cloud/marketplace)
135
+ [ai.farnsworth.cloud/marketplace](https://dropclaw.cloud/marketplace)
package/SKILL.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## Endpoint
6
6
 
7
- `https://ai.farnsworth.cloud/marketplace`
7
+ `https://dropclaw.cloud/marketplace`
8
8
 
9
9
  ## Authentication
10
10
 
@@ -74,7 +74,7 @@ claude mcp add planetexpress -- npx farnsworth-planetexpress-mcp
74
74
 
75
75
  - **Listing fee:** $30 USD
76
76
  - **Browsing:** Always free
77
- - **Syntek subscribers:** Free listings — $100/90 days includes PlanetExpress
77
+ - **Syntek subscribers:** $15 listing fee active Syntek subscription ($100/90 days) gets 50% discount
78
78
  - **50% of fees** go to FARNS token buybacks
79
79
 
80
80
  ## Categories
@@ -89,17 +89,17 @@ claude mcp add planetexpress -- npx farnsworth-planetexpress-mcp
89
89
 
90
90
  ```bash
91
91
  # Browse marketplace
92
- curl https://ai.farnsworth.cloud/marketplace/browse?query=trading
92
+ curl https://dropclaw.cloud/marketplace/browse?query=trading
93
93
 
94
94
  # Get featured services
95
- curl https://ai.farnsworth.cloud/marketplace/featured
95
+ curl https://dropclaw.cloud/marketplace/featured
96
96
 
97
97
  # Get listing pricing
98
- curl https://ai.farnsworth.cloud/marketplace/pricing
98
+ curl https://dropclaw.cloud/marketplace/pricing
99
99
 
100
100
  # Get categories
101
- curl https://ai.farnsworth.cloud/marketplace/categories
101
+ curl https://dropclaw.cloud/marketplace/categories
102
102
 
103
103
  # Get skill file
104
- curl https://ai.farnsworth.cloud/marketplace/skill
104
+ curl https://dropclaw.cloud/marketplace/skill
105
105
  ```
package/dist/client.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * PlanetExpress v1.0.0
2
+ * PlanetExpress v1.0.2
3
3
  * (c) 2026 Farnsworth Labs — All rights reserved.
4
4
  * PROPRIETARY AND CONFIDENTIAL. Unauthorized copying prohibited.
5
5
  * This software is protected by international copyright law.
@@ -8,8 +8,8 @@
8
8
  const fs = require("fs");
9
9
  const path = require("path");
10
10
 
11
- const DEFAULT_GATEWAY = "https://ai.farnsworth.cloud";
12
- const VERSION = "1.0.0";
11
+ const DEFAULT_GATEWAY = "https://dropclaw.cloud";
12
+ const VERSION = "1.0.2";
13
13
 
14
14
  class PlanetExpressClient {
15
15
  constructor(opts = {}) {
@@ -33,7 +33,9 @@ class PlanetExpressClient {
33
33
 
34
34
  _loadVaultKey() {
35
35
  try {
36
- const vaultPath = path.join(this._vaultDir, "vault.enc");
36
+ const primary = path.join(this._vaultDir, "vault.json");
37
+ const legacy = path.join(this._vaultDir, "vault.enc");
38
+ const vaultPath = fs.existsSync(primary) ? primary : legacy;
37
39
  if (fs.existsSync(vaultPath)) {
38
40
  const data = JSON.parse(fs.readFileSync(vaultPath, "utf8"));
39
41
  if (data.apiKey) this.apiKey = data.apiKey;
@@ -55,7 +57,7 @@ class PlanetExpressClient {
55
57
  const body = await resp.text();
56
58
  let msg;
57
59
  try { msg = JSON.parse(body).error || body; } catch { msg = body; }
58
- throw new Error(msg);
60
+ throw new Error(`${resp.status}: ${msg}`);
59
61
  }
60
62
  return resp.json();
61
63
  }
@@ -82,15 +84,13 @@ class PlanetExpressClient {
82
84
  const params = new URLSearchParams();
83
85
  if (query) params.set("query", query);
84
86
  if (category) params.set("category", category);
85
- if (page) params.set("page", String(page));
87
+ if (page !== undefined) params.set("page", String(page));
86
88
  const qs = params.toString();
87
- const resp = await fetch(`${this.gateway}/marketplace/browse${qs ? "?" + qs : ""}`);
88
- return resp.json();
89
+ return this._get(`/marketplace/browse${qs ? "?" + qs : ""}`);
89
90
  }
90
91
 
91
92
  async getService(serviceId) {
92
- const resp = await fetch(`${this.gateway}/marketplace/service/${serviceId}`);
93
- return resp.json();
93
+ return this._get(`/marketplace/service/${serviceId}`);
94
94
  }
95
95
 
96
96
  async list(opts = {}) {
@@ -107,25 +107,23 @@ class PlanetExpressClient {
107
107
  payment_network: opts.paymentNetwork || "eip155:143",
108
108
  });
109
109
 
110
- // Save listing locally
111
- this._saveListing(result.serviceId, opts.name);
110
+ if (result.serviceId) {
111
+ this._saveListing(result.serviceId, opts.name);
112
+ }
112
113
 
113
114
  return result;
114
115
  }
115
116
 
116
117
  async pricing() {
117
- const resp = await fetch(`${this.gateway}/marketplace/pricing`);
118
- return resp.json();
118
+ return this._get("/marketplace/pricing");
119
119
  }
120
120
 
121
121
  async featured() {
122
- const resp = await fetch(`${this.gateway}/marketplace/featured`);
123
- return resp.json();
122
+ return this._get("/marketplace/featured");
124
123
  }
125
124
 
126
125
  async categories() {
127
- const resp = await fetch(`${this.gateway}/marketplace/categories`);
128
- return resp.json();
126
+ return this._get("/marketplace/categories");
129
127
  }
130
128
 
131
129
  _saveListing(serviceId, name) {
@@ -142,12 +140,13 @@ class PlanetExpressClient {
142
140
  listedAt: new Date().toISOString(),
143
141
  });
144
142
  fs.writeFileSync(listingsPath, JSON.stringify(listings, null, 2));
145
- } catch {}
143
+ } catch (e) {
144
+ console.warn(`Warning: Could not save listing locally: ${e.message}`);
145
+ }
146
146
  }
147
147
 
148
148
  async x402Discovery() {
149
- const resp = await fetch(`${this.gateway}/.well-known/x402`);
150
- return resp.json();
149
+ return this._get("/.well-known/x402");
151
150
  }
152
151
  }
153
152
 
@@ -1,16 +1,17 @@
1
1
  /**
2
- * PlanetExpress Credential Manager v1.0.0
2
+ * PlanetExpress Credential Manager v1.0.2
3
3
  * (c) 2026 Farnsworth Labs — All rights reserved.
4
4
  * PROPRIETARY AND CONFIDENTIAL. Unauthorized copying prohibited.
5
5
  */
6
- const fs=require("fs"),path=require("path"),crypto=require("crypto");
6
+ const fs=require("fs"),path=require("path");
7
7
  const VD=path.join(process.env.HOME||process.env.USERPROFILE||"/tmp",".planetexpress");
8
- const VP=path.join(VD,"vault.enc");
9
- function load(){try{if(fs.existsSync(VP))return JSON.parse(fs.readFileSync(VP,"utf8"));return null}catch{return null}}
8
+ const VP=path.join(VD,"vault.json");
9
+ const VP_LEGACY=path.join(VD,"vault.enc");
10
+ function load(){try{const p=fs.existsSync(VP)?VP:(fs.existsSync(VP_LEGACY)?VP_LEGACY:null);if(p)return JSON.parse(fs.readFileSync(p,"utf8"));return null}catch{return null}}
10
11
  function save(data){if(!fs.existsSync(VD))fs.mkdirSync(VD,{recursive:true});fs.writeFileSync(VP,JSON.stringify(data,null,2))}
11
12
  function getApiKey(){const v=load();return v?.apiKey||process.env.PLANETEXPRESS_API_KEY||null}
12
13
  function getGateway(){const v=load();return v?.gateway||process.env.PLANETEXPRESS_GATEWAY||"https://ai.farnsworth.cloud"}
13
- function saveListing(serviceId,name){const lp=path.join(VD,"listings.json");let ls=[];try{ls=JSON.parse(fs.readFileSync(lp,"utf8"))}catch{}ls.push({serviceId,name,listedAt:new Date().toISOString()});if(!fs.existsSync(VD))fs.mkdirSync(VD,{recursive:true});fs.writeFileSync(lp,JSON.stringify(ls,null,2))}
14
+ function saveListing(serviceId,name){if(!fs.existsSync(VD))fs.mkdirSync(VD,{recursive:true});const lp=path.join(VD,"listings.json");let ls=[];try{ls=JSON.parse(fs.readFileSync(lp,"utf8"))}catch{}ls.push({serviceId,name,listedAt:new Date().toISOString()});fs.writeFileSync(lp,JSON.stringify(ls,null,2))}
14
15
  function getListings(){const lp=path.join(VD,"listings.json");try{return JSON.parse(fs.readFileSync(lp,"utf8"))}catch{return[]}}
15
- function revoke(){if(fs.existsSync(VP)){crypto.randomFillSync(Buffer.alloc(256));fs.unlinkSync(VP)}const lp=path.join(VD,"listings.json");if(fs.existsSync(lp))fs.unlinkSync(lp)}
16
+ function revoke(){const files=[VP,VP_LEGACY,path.join(VD,"listings.json")];for(const f of files){if(fs.existsSync(f))fs.unlinkSync(f)}}
16
17
  module.exports={load,save,getApiKey,getGateway,saveListing,getListings,revoke};
@@ -1,26 +1,27 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * PlanetExpress MCP Server v1.0.0
3
+ * PlanetExpress MCP Server v1.0.2
4
4
  * (c) 2026 Farnsworth Labs — All rights reserved.
5
5
  * PROPRIETARY AND CONFIDENTIAL. Unauthorized copying prohibited.
6
6
  */
7
7
  import{Server}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema,ListToolsRequestSchema}from"@modelcontextprotocol/sdk/types.js";import fs from"fs";import path from"path";
8
- const G=process.env.PLANETEXPRESS_GATEWAY||"https://ai.farnsworth.cloud";const V="1.0.0";
9
- function lk(){try{const p=path.join(process.env.HOME||process.env.USERPROFILE||"/tmp",".planetexpress","vault.enc");if(fs.existsSync(p)){return JSON.parse(fs.readFileSync(p,"utf8"))}}catch{}return{}}
8
+ const G=process.env.PLANETEXPRESS_GATEWAY||"https://dropclaw.cloud";const V="1.0.2";
9
+ const VD=path.join(process.env.HOME||process.env.USERPROFILE||"/tmp",".planetexpress");
10
+ function lk(){try{const p=path.join(VD,"vault.json");if(fs.existsSync(p)){return JSON.parse(fs.readFileSync(p,"utf8"))}const p2=path.join(VD,"vault.enc");if(fs.existsSync(p2)){return JSON.parse(fs.readFileSync(p2,"utf8"))}}catch{}return{}}
10
11
  function hd(){const v=lk();const h={"Content-Type":"application/json","X-Client-Version":V};if(v.apiKey)h["Authorization"]=`Bearer ${v.apiKey}`;if(process.env.PLANETEXPRESS_API_KEY)h["Authorization"]=`Bearer ${process.env.PLANETEXPRESS_API_KEY}`;return h}
11
- async function api(m,p,b){const u=`${G}${p}`;const o={method:m,headers:hd()};if(b)o.body=JSON.stringify(b);const r=await fetch(u,o);return r.json()}
12
+ async function api(m,p,b){const u=`${G}${p}`;const h=hd();if(m==="GET")delete h["Content-Type"];const o={method:m,headers:h};if(b)o.body=JSON.stringify(b);const r=await fetch(u,o);if(!r.ok){const t=await r.text();let msg;try{msg=JSON.parse(t).error||t}catch{msg=t}throw new Error(`${r.status}: ${msg}`)}return r.json()}
12
13
  const server=new Server({name:"planetexpress-mcp",version:V},{capabilities:{tools:{}}});
13
14
  server.setRequestHandler(ListToolsRequestSchema,async()=>({tools:[
14
15
  {name:"planetexpress_browse",description:"Search the AI agent marketplace. Browse available services by query string or category. Returns matching services with names, descriptions, and endpoints.",inputSchema:{type:"object",properties:{query:{type:"string",description:"Search query (e.g. 'trading bot', 'image generation')"},category:{type:"string",enum:["Memory & Storage","Trading & Analytics","Content & Media","Infrastructure","Custom Agents"],description:"Filter by category"},page:{type:"number",description:"Page number for pagination",default:1}}}},
15
16
  {name:"planetexpress_get",description:"Get detailed information about a specific service listed on the marketplace. Returns full manifest, endpoint, pricing, and contact info.",inputSchema:{type:"object",properties:{service_id:{type:"string",description:"Service ID (e.g. svc_abc123)"}},required:["service_id"]}},
16
- {name:"planetexpress_list",description:"List a new AI service on the marketplace. Requires $30 x402 payment first. Call planetexpress_pricing to get payment addresses, send payment on-chain, then call this with the tx hash.",inputSchema:{type:"object",properties:{name:{type:"string",description:"Service name"},description:{type:"string",description:"Service description (what it does, capabilities)"},category:{type:"string",enum:["Memory & Storage","Trading & Analytics","Content & Media","Infrastructure","Custom Agents"],description:"Service category"},endpoint_url:{type:"string",description:"Service endpoint URL"},payment_tx_hash:{type:"string",description:"Transaction hash of on-chain payment"},payment_network:{type:"string",enum:["eip155:143","solana","eip155:8453"],description:"Payment network",default:"eip155:143"}},required:["name","description","category","endpoint_url","payment_tx_hash","payment_network"]}},
17
- {name:"planetexpress_pricing",description:"Get listing costs and x402 payment options. Returns $30 listing fee with payment addresses for MON, SOL, and USDC.",inputSchema:{type:"object",properties:{}}},
17
+ {name:"planetexpress_list",description:"List a new AI service on the marketplace. Requires x402 payment first ($30, or $15 for Syntek subscribers). Call planetexpress_pricing to get payment addresses, send payment on-chain, then call this with the tx hash.",inputSchema:{type:"object",properties:{name:{type:"string",description:"Service name"},description:{type:"string",description:"Service description (what it does, capabilities)"},category:{type:"string",enum:["Memory & Storage","Trading & Analytics","Content & Media","Infrastructure","Custom Agents"],description:"Service category"},endpoint_url:{type:"string",description:"Service endpoint URL"},payment_tx_hash:{type:"string",description:"Transaction hash of on-chain payment"},payment_network:{type:"string",enum:["eip155:143","solana","eip155:8453"],description:"Payment network",default:"eip155:143"}},required:["name","description","category","endpoint_url","payment_tx_hash","payment_network"]}},
18
+ {name:"planetexpress_pricing",description:"Get listing costs and x402 payment options. Returns $30 listing fee ($15 for Syntek subscribers) with payment addresses for MON, SOL, and USDC.",inputSchema:{type:"object",properties:{}}},
18
19
  {name:"planetexpress_featured",description:"Get featured and trending AI services on the marketplace. Returns top-ranked and recently popular services.",inputSchema:{type:"object",properties:{}}}
19
20
  ]}));
20
21
  server.setRequestHandler(CallToolRequestSchema,async(req)=>{const{name,arguments:args}=req.params;try{
21
- if(name==="planetexpress_browse"){const params=new URLSearchParams();if(args.query)params.set("query",args.query);if(args.category)params.set("category",args.category);if(args.page)params.set("page",String(args.page));const qs=params.toString();const r=await api("GET",`/marketplace/browse${qs?"?"+qs:""}`);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}
22
+ if(name==="planetexpress_browse"){const params=new URLSearchParams();if(args.query)params.set("query",args.query);if(args.category)params.set("category",args.category);if(args.page!==undefined)params.set("page",String(args.page));const qs=params.toString();const r=await api("GET",`/marketplace/browse${qs?"?"+qs:""}`);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}
22
23
  if(name==="planetexpress_get"){const r=await api("GET",`/marketplace/service/${args.service_id}`);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}
23
- if(name==="planetexpress_list"){const r=await api("POST","/marketplace/list",{name:args.name,description:args.description,category:args.category,endpoint_url:args.endpoint_url,payment_tx_hash:args.payment_tx_hash,payment_network:args.payment_network||"eip155:143"});if(r.serviceId){const vd=path.join(process.env.HOME||process.env.USERPROFILE||"/tmp",".planetexpress");if(!fs.existsSync(vd))fs.mkdirSync(vd,{recursive:true});const lp=path.join(vd,"listings.json");let ls=[];try{ls=JSON.parse(fs.readFileSync(lp,"utf8"))}catch{}ls.push({serviceId:r.serviceId,name:args.name,listedAt:new Date().toISOString()});fs.writeFileSync(lp,JSON.stringify(ls,null,2))}return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}
24
+ if(name==="planetexpress_list"){const r=await api("POST","/marketplace/list",{name:args.name,description:args.description,category:args.category,endpoint_url:args.endpoint_url,payment_tx_hash:args.payment_tx_hash,payment_network:args.payment_network||"eip155:143"});if(r.serviceId){if(!fs.existsSync(VD))fs.mkdirSync(VD,{recursive:true});const lp=path.join(VD,"listings.json");let ls=[];try{ls=JSON.parse(fs.readFileSync(lp,"utf8"))}catch{}ls.push({serviceId:r.serviceId,name:args.name,listedAt:new Date().toISOString()});fs.writeFileSync(lp,JSON.stringify(ls,null,2))}return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}
24
25
  if(name==="planetexpress_pricing"){const r=await api("GET","/marketplace/pricing");return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}
25
26
  if(name==="planetexpress_featured"){const r=await api("GET","/marketplace/featured");return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}
26
27
  return{content:[{type:"text",text:`Unknown tool: ${name}`}],isError:true}}catch(e){return{content:[{type:"text",text:`Error: ${e.message}`}],isError:true}}});
package/dist/mcp/setup.js CHANGED
@@ -1,13 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * PlanetExpress Setup CLI v1.0.0
3
+ * PlanetExpress Setup CLI v1.0.2
4
4
  * (c) 2026 Farnsworth Labs — All rights reserved.
5
5
  * PROPRIETARY AND CONFIDENTIAL. Unauthorized copying prohibited.
6
6
  */
7
- const fs=require("fs"),path=require("path"),crypto=require("crypto"),readline=require("readline");
8
- const V="1.0.0",G="https://ai.farnsworth.cloud";
7
+ const fs=require("fs"),path=require("path"),readline=require("readline");
8
+ const V="1.0.2",G="https://dropclaw.cloud";
9
9
  const VD=path.join(process.env.HOME||process.env.USERPROFILE||"/tmp",".planetexpress");
10
- const VP=path.join(VD,"vault.enc");
10
+ const VP=path.join(VD,"vault.json");
11
+ const VP_LEGACY=path.join(VD,"vault.enc");
11
12
  function rl(){return readline.createInterface({input:process.stdin,output:process.stdout})}
12
13
  function ask(r,q){return new Promise(res=>{r.question(q,ans=>{res(ans.trim())})})}
13
14
  async function setup(){
@@ -26,11 +27,12 @@ try{const resp=await fetch(`${gw}/marketplace/pricing`);const d=await resp.json(
26
27
  }
27
28
  async function status(){
28
29
  console.log(`\n PlanetExpress Status v${V}\n ${"─".repeat(30)}\n`);
29
- if(!fs.existsSync(VP)){console.log(" No credentials found. Run: npx farnsworth-planetexpress setup\n");return}
30
- const vault=JSON.parse(fs.readFileSync(VP,"utf8"));
30
+ if(!fs.existsSync(VP)&&!fs.existsSync(VP_LEGACY)){console.log(" No credentials found. Run: npx farnsworth-planetexpress setup\n");return}
31
+ let vault;
32
+ try{vault=JSON.parse(fs.readFileSync(fs.existsSync(VP)?VP:VP_LEGACY,"utf8"))}catch(e){console.log(` Error reading credentials: ${e.message}\n`);return}
31
33
  const gw=vault.gateway||G;
32
34
  console.log(` Gateway: ${gw}`);
33
- console.log(` API Key: ${vault.apiKey?.slice(0,8)}...`);
35
+ console.log(` API Key: ${vault.apiKey?.slice(0,6)}...`);
34
36
  console.log(` Created: ${vault.createdAt||"unknown"}`);
35
37
  try{const resp=await fetch(`${gw}/marketplace/pricing`);const d=await resp.json();console.log(` Service: Online`);console.log(` Listing Fee: $${d.listingFeeUSD}`);console.log(` Chains: MON, SOL, USDC`)}catch(e){console.log(` Service: Offline (${e.message})`)}
36
38
  const lp=path.join(VD,"listings.json");
@@ -38,8 +40,11 @@ try{const ls=JSON.parse(fs.readFileSync(lp,"utf8"));console.log(` Local listing
38
40
  console.log();
39
41
  }
40
42
  async function revoke(){
41
- if(fs.existsSync(VP)){crypto.randomFillSync(Buffer.alloc(256));fs.unlinkSync(VP);console.log("\n Credentials securely erased.\n")}
42
- else{console.log("\n No credentials found.\n")}
43
+ const files=[VP,VP_LEGACY,path.join(VD,"listings.json")];
44
+ let erased=false;
45
+ for(const f of files){if(fs.existsSync(f)){fs.unlinkSync(f);erased=true}}
46
+ if(erased)console.log("\n Local credentials removed.\n");
47
+ else console.log("\n No credentials found.\n");
43
48
  }
44
49
  const cmd=process.argv[2]||"setup";
45
50
  if(cmd==="setup")setup().catch(e=>console.error(e.message));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "farnsworth-planetexpress",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "PlanetExpress — AI Agent Marketplace with x402 payments. Browse, list, and discover AI services.",
5
5
  "main": "dist/client.js",
6
6
  "bin": {