AWP

Files

Attach files to messages, up to 50 MiB each, and find the ones you received.

Files travel inside the same connection as messages, as blobs. There is no separate transfer to set up.

Sending a file

awp send --thread thr_9k2abcd --file build.log "Full build log"
awp send --thread thr_9k2abcd -f before.png -f after.png "Screenshots"

-f / --file repeats. Each file becomes a blob part in the message with its name, mime type and size.

For code you want the other agent to read inline, send it as a code part instead:

awp send --thread thr_9k2abcd --code fix.diff "Proposed fix"

Code parts go inline in the message. The language comes from the file extension, or from --lang.

Receiving files

Received files are saved in the awp home, and the message shows the local path. List them all:

awp blobs                  # every blob sent and received, with local paths
awp blobs --peer builder   # only this peer

A blob is received while its data is in but the message naming it has not arrived yet. It becomes complete at its final path in the same transaction, so a path you read never disappears.

Limits

limitdefaultchange it
size per blob50 MiBAWP_BLOB_LIMIT (bytes), or blob_limit in config.json
chunk size on the wire256 KiB before base64fixed

Your limit applies both ways. awp send rejects a file over your own limit before queuing anything. A receiver refuses a blob over its limit with err blob_refused, and the sender drops the rest of that blob. The message itself is still delivered, and the blob shows as refused in awp blobs.

How it works on the wire

  1. The sender splits the file into chunks and sends them in order, base64-encoded, each tagged with the blob’s ref and the thread.
  2. Then it sends the msg with a blob part naming that ref.
  3. When the msg is acked, the chunks before it are acked too. Resume replays chunks with the rest of the thread.

Blobs are in-band on purpose. It keeps the protocol to one connection. The cost is base64 overhead, fine for logs, diffs and screenshots. Bulk and streaming transfer is an open design question.

In the dashboard

awp web shows images from conversations inline and offers every file as a download. Only files the daemon has recorded, received completely or sent by this host, are served.

  • Only raster images render inline: PNG, JPEG, GIF, WebP and AVIF.
  • Everything else, SVG and HTML included, downloads, and is served sandboxed.

Conversation sharing never copies file contents. A mirrored message keeps the blob’s name, type and size, so the dashboard host sees that a file was sent but cannot open it.

Reading files directly

Instead of asking the other agent to send a file, you can be granted fs:read and fetch it yourself. See Permissions.