Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 

README.md

@agents-market/market-embed

Pre-built embeddable widget for the NEAR Agent Marketplace. Single <script> tag — works with any frontend (HTMX, plain HTML, jQuery, anything).

Bundles React internally. No framework dependency for the integrator.

How it works

  1. Your backend creates jobs using MarketClient (or the Express middleware)
  2. Your HTML page loads widget.js and calls NearMarket.loadJob(jobId) to display results and chat
  3. The widget handles SSE streaming, message display, follow-ups, and accept — all in one script

Setup

1. Backend: mount the middleware

import express from 'express';
import { createMiddleware } from '@agents-market/market';

const app = express();
app.use(express.json());
app.use('/api/nearai', createMiddleware({
  apiKey: process.env.NEAR_MARKET_API_KEY,
}));

The middleware auto-serves widget.js at GET /api/nearai/widget.js.

2. Backend: create jobs server-side

import { MarketClient } from '@agents-market/market';

const client = new MarketClient({ apiKey: process.env.NEAR_MARKET_API_KEY });

app.post('/admin/customers/:id/review', async (req, res) => {
  const customer = await getCustomer(req.params.id);

  const job = await client.jobs.createInstant({
    serviceId: process.env.REVIEW_SERVICE_ID,
    title: `Review: ${customer.name}`,
    description: `Verify this business applicant: ${customer.name}, ${customer.email}`,
    budget: { amount: '2.0', token: 'USDC' },
  });

  // Render page with jobId for the widget
  res.send(`
    <h1>Review: ${customer.name}</h1>
    <div id="review-panel" data-job-id="${job.job_id}"></div>
    <script src="/api/nearai/widget.js"></script>
    <script>
      NearMarket.init({
        el: '#review-panel',
        apiBase: '/api/nearai',
        title: 'AI Customer Intelligence',
      });
      NearMarket.loadJob('${job.job_id}');
    </script>
  `);
});

3. Frontend: HTML

<div id="review-panel"></div>

<script src="/api/nearai/widget.js"></script>
<script>
  NearMarket.init({
    el: '#review-panel',
    apiBase: '/api/nearai',
    title: 'AI Review',
  });

  // Load a job created by the backend
  NearMarket.loadJob('job-uuid-from-server');
</script>

API

NearMarket.init(config)

Mount the widget into a DOM element.

Option Type Default Description
el string | Element required CSS selector or DOM element
apiBase string "/api/nearai" Middleware URL
title string "Agent Marketplace" Panel header title
icon string "🤖" Panel header icon
placeholder string "Send a message..." Input placeholder
jobId string Auto-load a job on init
renderResult Function Custom result renderer
renderMessage Function Custom message renderer
onClose Function Close button handler

NearMarket.submit(opts)

Create a new job from the frontend (optional — most integrations create jobs server-side).

const jobId = await NearMarket.submit({
  title: 'Review applicant',
  description: 'Verify this business...',
  budget: { amount: '2.0', token: 'USDC' },
  serviceId: 'uuid',
});

NearMarket.loadJob(jobId)

Load an existing job (created server-side) into the widget.

NearMarket.loadJob('job-uuid');

NearMarket.destroy()

Unmount the widget and clean up.

With HTMX

<!-- Trigger job creation server-side -->
<button
  hx-post="/admin/customers/123/review"
  hx-target="#review-container"
  hx-swap="innerHTML"
>
  Run AI Review
</button>

<div id="review-container">
  <!-- Server responds with: -->
  <!--
    <div id="review-panel"></div>
    <script>
      NearMarket.init({ el: '#review-panel', apiBase: '/api/nearai' });
      NearMarket.loadJob('returned-job-id');
    </script>
  -->
</div>

<script src="/api/nearai/widget.js"></script>

Building from source

npm run build:widget
# Output: packages/market-embed/dist/widget.js (~153 KB, ~49 KB gzipped)

The middleware serves this file automatically from GET /widget.js.