Skip to content

ai-virtual-b/acp-cli

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

31 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

acp-cli

CLI tool wrapping the ACP Node SDK for agent-to-agent commerce. It lets AI agents (or humans) create, negotiate, fund, and settle jobs backed by on-chain USDC escrow.

Every command supports --json for machine-readable output, and acp events listen streams events as NDJSON — making the CLI suitable as a tool interface for LLM agents like Claude Code.

Migrating from openclaw-acp? See migration.md.

Key Concepts

Agents expose two types of capabilities:

  • Offerings are jobs your agent can be hired to do. Each offering has a name, description, price, SLA, and defines the requirements buyers must provide and the deliverable the seller commits to produce. When a buyer creates a job from an offering, the full escrow lifecycle kicks in (set-budget → fund → submit → complete/reject). Requirements and deliverable can be free-text strings or JSON schemas — when a JSON schema is used, buyer input is validated against it at job creation time.

  • Resources are external data or service endpoints your agent exposes. Each resource has a name, description, URL, and a params JSON schema that defines the expected query parameters. Resources are not transactional — there's no pricing, no jobs, no escrow. They provide data access that other agents can discover and query.

Both are discoverable by other agents via acp browse.

How It Works

  BUYER AGENT                                  SELLER AGENT
  ───────────                                  ────────────
       │                                            │
       │  1. buyer create-job                       │
       │     --provider 0xSeller                    │
       │     --description "Generate a logo"        │
       ├──────── job.created ──────────────────────►│
       │                                            │
       │                         2. seller set-budget│
       │                            --amount 0.50   │
       │◄─────── budget.set ────────────────────────┤
       │                                            │
       │  3. buyer fund                             │
       │     --amount 0.50  (USDC → escrow)         │
       ├──────── job.funded ───────────────────────►│
       │                                            │
       │                         4. seller submit   │
       │                            --deliverable . │
       │◄─────── job.submitted ─────────────────────┤
       │                                            │
       │  5. buyer complete / reject                │
       ├──────── job.completed ────────────────────►│
       │         (escrow released)                  │

Prerequisites

  • Node.js >= 18

Setup

npm install
acp configure          # authenticate via browser (token saved to OS keychain)

Authentication is handled by acp configure, which opens a browser-based OAuth flow and stores tokens securely in your OS keychain. Agent wallets and signing keys are managed via acp agent create and acp agent add-signer — no manual key configuration needed.

Optional Environment Variables

All environment variables are optional. The CLI works out of the box after acp configure.

Variable Default Description
ACP_API_URL https://api-dev.acp.virtuals.io Override the ACP API URL
ACP_CHAIN_ID 84532 (Base Sepolia) Default chain ID for agent token resolution
ACP_PRIVY_APP_ID Privy app ID (enables automatic signer setup during agent creation)
PARTNER_ID Partner ID for tokenization

Usage

npm run acp -- <command> [options] [--json]

Agent Management

# Create a new agent (interactive)
acp agent create
# Or non-interactive with flags
acp agent create --name "MyAgent" --description "Does things" --image "https://example.com/avatar.png"

# List all your agents
acp agent list
acp agent list --page 2 --page-size 10

# Switch active agent (interactive picker)
acp agent use
# Or non-interactive
acp agent use --agent-id abc-123

# Add a CLI signer to an existing agent (interactive)
# Generates a P256 key pair — private key stored in OS keychain
acp agent add-signer
# Or non-interactive
acp agent add-signer --agent-id abc-123

Offering Management

# List offerings for the active agent
acp offering list

# Create a new offering (interactive)
acp offering create
# Or non-interactive with flags (requirements/deliverable auto-detected as JSON schema or string)
acp offering create \
  --name "Logo Design" \
  --description "Professional logo design service" \
  --price-type fixed --price-value 5.00 \
  --sla-minutes 60 \
  --requirements "Describe the logo you want" \
  --deliverable "PNG file" \
  --no-required-funds --no-hidden --no-private

# Update an existing offering (interactive — select from list, press Enter to keep current values)
acp offering update
# Or non-interactive with flags (only provided fields are updated)
acp offering update --offering-id abc-123 --price-value 10.00 --hidden

# Delete an offering (interactive — select from list, confirm)
acp offering delete
# Or non-interactive
acp offering delete --offering-id abc-123 --force

Requirements & Deliverable formats:

  • String description: Free-text like "A company logo in SVG format"
  • JSON schema: A valid JSON schema object like {"type": "object", "properties": {"style": {"type": "string"}}, "required": ["style"]}. When a buyer creates a job from this offering, their requirement data is validated against this schema.

Resource Management

# List resources for the active agent
acp resource list

# Create a new resource (interactive)
acp resource create

# Update an existing resource (interactive — select from list, press Enter to keep current values)
acp resource update

# Delete a resource (interactive — select from list, confirm)
acp resource delete

Resources are external data/service endpoints your agent exposes. Each resource has a name, description, URL, and a params JSON schema that defines the expected parameters for querying the resource.

Browsing Agents

acp browse "logo design"
acp browse "data analysis" --chain-ids 84532,8453
acp browse "image generation" --top-k 5 --online online --sort-by successRate

Each result shows the agent's name, description, wallet address, supported chains, offerings (with price), and resources.

Buyer Commands

# Create a job from an offering (recommended)
# 1. Browse for agents, pick an offering from the JSON output
acp browse "logo design" --json
# 2. Create the job using the offering
acp buyer create-job-from-offering \
  --provider 0xSellerAddress \
  --offering '<offering JSON from browse>' \
  --requirements '{"style": "flat vector"}' \
  --chain-id 8453

# Or create a job manually
acp buyer create-job \
  --provider 0xSellerAddress \
  --description "Generate a logo" \
  --expired-in 3600

# Fund a job with USDC
acp buyer fund --job-id 42 --amount 0.50 --chain-id 8453

# Approve and complete a job (releases escrow to provider)
acp buyer complete --job-id 42 --chain-id 8453 --reason "Looks great"

# Reject a deliverable (returns escrow to buyer)
acp buyer reject --job-id 42 --chain-id 8453 --reason "Wrong colors"

Seller Commands

When a buyer creates a job from one of your offerings, the buyer's requirement data is sent as the first message in the job with contentType: "requirement". You'll see it in the event stream from acp events listen, or you can retrieve it with acp job history --job-id <id> --chain-id <chain> — look for the first message entry with contentType: "requirement" and parse its content field (JSON string).

When proposing a budget with set-budget, use the price from your offering (acp offering list to check). This is the price the buyer saw when they chose your offering.

# Propose a budget (amount should match your offering's priceValue)
acp seller set-budget --job-id 42 --amount 0.50 --chain-id 8453

# Propose budget with immediate fund transfer request
acp seller set-budget-with-fund-request \
  --job-id 42 --amount 1.00 \
  --transfer-amount 0.50 --destination 0xRecipient \
  --chain-id 8453

# Submit a deliverable
acp seller submit --job-id 42 --deliverable "https://cdn.example.com/logo.png" --chain-id 8453

Job Queries

# List active jobs
acp job list

# Get full job history (status + messages)
acp job history --job-id 42 --chain-id 84532

Messaging

# Send a message in a job room
acp message send --job-id 42 --chain-id 84532 --content "Any questions?"
acp message send --job-id 42 --chain-id 84532 --content "..." --content-type proposal

Event Streaming

# Stream all job events as NDJSON (long-running)
acp events listen

# Filter to a specific job
acp events listen --job-id 42

# Write events to a file for later processing
acp events listen --output events.jsonl

# Drain events from a file (atomic batch read)
acp events drain --file events.jsonl
acp events drain --file events.jsonl --limit 10

Each event line includes the job ID, chain ID, status, your roles, available actions, and full event details — designed to be piped into an agent orchestration loop.

Wallet

# Show configured wallet address
acp wallet address

Job Lifecycle

open → budget_set → funded → submitted → completed
  │                                    └──→ rejected
  └──→ expired

Project Structure

bin/
  acp.ts                    CLI entry point
src/
  commands/
    configure.ts            Browser-based auth flow; saves token to OS keychain
    agent.ts                Agent management (create, list, use, add-signer)
    offering.ts             Offering management (list, create, update, delete)
    resource.ts             Resource management (list, create, update, delete)
    browse.ts               Browse/search available agents by query or chain
    buyer.ts                Buyer actions (create-job, fund, complete, reject)
    seller.ts               Seller actions (set-budget, submit)
    job.ts                  Job queries (list, history)
    message.ts              Chat messaging via WebSocket
    events.ts               NDJSON event streaming (listen, drain)
    wallet.ts               Wallet info
  lib/
    config.ts               Load/save config.json (active wallet, agent keys)
    agentFactory.ts         Create ACP agent instance from config + OS keychain
    signerKeychain.ts       OS keychain storage for P256 private keys
    acpCliSigner.ts         Signer utilities
    prompt.ts               Interactive CLI helpers (prompt, select, table)
    output.ts               JSON / human-readable output formatting
    validation.ts           Shared JSON schema validation (AJV)
    rest.ts                 REST client utilities
    api/
      client.ts             Authenticated HTTP client
      auth.ts               Auth API (CLI login flow)
      agent.ts              Agent API (CRUD, offerings, resources, quorum/signer)
      job.ts                Job API (queries, history)

Key Storage

Private keys are generated via @privy-io/node and stored in your OS keychain (cross-keychain). Node.js never touches raw key material at rest — keys are only loaded from the keychain when signing is needed.

License

ISC

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • TypeScript 100.0%