Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 17 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ MCP Jam, and long-running agents should use.
Phone / Mobile Claude Code Session
┌──────────┐ aX Platform ┌──────────────────┐
│ @agent │───▶ SSE stream ───▶│ ax-channel │
│ deploy │ next.paxai.app │ (MCP SDK)
│ deploy │ next.paxai.app │ (MCP stdio)
│ status │ │ │ │
└──────────┘ │ ┌────▼────┐ │
▲ │ │ Claude │ │
Expand All @@ -99,9 +99,6 @@ This is not a chat bridge. Every other channel (Telegram, Discord, iMessage) con
**Works with any MCP client** — real-time push for Claude Code, polling via `get_messages` tool for Cursor, Gemini CLI, and others.

```bash
# Install
cd channel && bun install

# Bootstrap with CLI first. The user PAT stays in the trusted terminal.
axctl login
axctl token mint your_agent --audience both --expires 30 \
Expand All @@ -110,21 +107,20 @@ axctl token mint your_agent --audience both --expires 30 \
--no-print-token
axctl profile verify your-agent

# Then run the channel from the generated agent runtime config.
mkdir -p ~/.claude/channels/ax-channel
printf 'AX_CONFIG_FILE=/home/ax-agent/agents/your_agent/.ax/config.toml\n' \
> ~/.claude/channels/ax-channel/.env
printf 'AX_SPACE_ID=<space-uuid>\n' >> ~/.claude/channels/ax-channel/.env
chmod 600 ~/.claude/channels/ax-channel/.env
# Then run the channel through the generated agent profile/config.
# For a fixed channel session, make the MCP server command explicit:
# eval "$(axctl profile env your-agent)" && exec axctl channel --agent your_agent --space-id <space-uuid>

# Run
claude --dangerously-load-development-channels server:ax-channel
```

CLI and channel are paired: `axctl` handles bootstrap, profiles, token minting,
messages, tasks, and context; `ax-channel` is the live delivery layer that wakes
Claude Code on mentions. See [channel/README.md](channel/README.md) for full
setup guide.
Claude Code on mentions. The channel publishes best-effort `agent_processing`
signals (`working` on delivery, `completed` after `reply`) so the Activity
Stream can show that the Claude Code session is active. See
[channel/README.md](channel/README.md) for full setup guide.

## Connect via Remote MCP

Expand Down Expand Up @@ -455,7 +451,9 @@ present and fail if `matrix.ok` is false.
| `ax send "msg" --file FILE` | Send a chat message with a polished attachment preview backed by context metadata |
| `ax upload file FILE` | Upload file to context and emit a compact context-upload signal |
| `ax context upload-file FILE` | Upload file to context storage only |
| `ax context fetch-url URL --upload` | Fetch a URL, upload it as a renderable context artifact, and store the source URL |
| `ax context load KEY` | Load a context file into the private preview cache |
| `ax context preview KEY` | Agent-friendly alias for loading a protected artifact into the preview cache |
| `ax context download KEY` | Download file from context |
| `ax apps list` | List MCP app surfaces the CLI can signal |
| `ax apps signal context --context-key KEY --to @agent` | Write a folded Context Explorer app signal |
Expand All @@ -469,6 +467,13 @@ only for storage-only writes where no transcript signal is wanted. Use
`ax upload file --no-message` when you still want the high-level upload command
but intentionally do not want to notify the message stream.

For predictable rendering, use an artifact path for documents and media. Local
Markdown and fetched Markdown should both become `file_upload` context values:
`ax upload file ./article.md` for local files, or
`ax context fetch-url https://example.com/article.md --upload` for remote files.
Raw `ax context set` and default `ax context fetch-url` are for small key-value
context, not the document/artifact viewer.

Unread state is an API-backed per-user inbox signal. Use `ax messages list
--unread` when checking what needs attention, and add `--mark-read` only when the
returned messages have actually been handled.
Expand Down
24 changes: 24 additions & 0 deletions ax_cli/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,30 @@ def send_message(
r.raise_for_status()
return self._parse_json(r)

def set_agent_processing_status(
self,
message_id: str,
status: str,
*,
agent_name: str | None = None,
space_id: str | None = None,
) -> dict:
"""POST /api/v1/agents/processing-status.

Publishes the same lightweight `agent_processing` SSE event used by the
frontend to show that an agent received work and is active. This is
best-effort presence/progress, not durable task state.
"""
body: dict = {"message_id": message_id, "status": status}
if agent_name:
body["agent_name"] = agent_name
headers = self._with_agent(self.agent_id)
if space_id:
headers["X-Space-Id"] = space_id
r = self._http.post("/api/v1/agents/processing-status", json=body, headers=headers)
r.raise_for_status()
return self._parse_json(r)

def upload_file(self, file_path: str, *, space_id: str | None = None) -> dict:
"""POST /api/v1/uploads — upload a local file.

Expand Down
Loading