━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// weapon-server // api
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
"Get just wasted enough, find yourself in some desperate but strangely
arbitrary kind of trouble, and it was possible to see Ninsei as a field
of data, the way the matrix had once reminded him of proteins linking to
distinguish cell specialities."
— Neuromancer
Complete HTTP API reference for the Weapon Haskell server. Server listens on port 4096 by default.
════════════════════════════════════════════════════════════════════════════════
Health check endpoint.
Response:
{
"healthy": true,
"version": "0.1.0"
}Server-sent events stream. All events are broadcast here.
Headers:
Accept: text/event-stream
Query Parameters:
directory(optional) — filter events by directory
Response: SSE stream
data: {"type":"server.connected","properties":{}}
data: {"type":"session.created","properties":{"info":{...}}}
Get global configuration.
Response:
{
"providers": {...},
"agents": {...},
"defaults": {...}
}Update global configuration. Merges with existing config.
Request Body:
{
"defaults": {
"provider": "anthropic"
}
}Gracefully shutdown the server instance.
════════════════════════════════════════════════════════════════════════════════
List all known projects.
Response:
[
{
"id": "proj_abc123",
"name": "my-project",
"directory": "/home/user/my-project"
}
]Get the current active project.
Get project by ID.
Update project properties.
════════════════════════════════════════════════════════════════════════════════
List sessions.
Query Parameters:
start(optional) — filter sessions updated on or after timestampsearch(optional) — filter sessions by title (case-insensitive)
Headers:
x-weapon-directory(optional) — filter by directory
Response:
[
{
"id": "ses_abc123",
"slug": "my-session",
"title": "My Session",
"projectID": "proj_xyz",
"directory": "/home/user/project",
"version": "1.0.0",
"time": {
"created": 1708300000,
"updated": 1708301000
}
}
]Create a new session.
Request Body:
{
"title": "My New Session",
"parentID": "ses_parent123"
}Response: Session object
Get status of all sessions.
Response:
{
"ses_abc123": "idle",
"ses_def456": "running"
}Get session by ID.
Delete session.
Get child sessions (forks).
Fork a session.
Request Body:
{
"messageID": "msg_abc123"
}Abort the current operation in session.
Get diff of changes made in session.
Query Parameters:
messageID(optional) — get diff for specific message
Trigger session summarization.
Response: true if summarization started
Create share link for session.
Remove share link.
Revert session to a previous state.
Undo a revert.
Get todos for session.
Response:
[
{
"id": "todo_1",
"content": "Implement feature X",
"status": "pending",
"priority": "high"
}
]════════════════════════════════════════════════════════════════════════════════
List messages in session.
Response:
[
{
"id": "msg_abc123",
"sessionID": "ses_xyz",
"role": "user",
"time": {
"created": 1708300000
}
},
{
"id": "msg_def456",
"sessionID": "ses_xyz",
"role": "assistant",
"time": {
"created": 1708300100,
"completed": 1708300200
},
"modelID": "claude-3-opus",
"providerID": "anthropic",
"cost": 0.0123
}
]Send a prompt to the session.
Request Body:
{
"parts": [
{
"type": "text",
"text": "Please explain this code"
}
]
}Get specific message.
Delete message.
Get specific message part.
Send prompt asynchronously (returns immediately).
Execute a slash command.
Request Body:
{
"command": "/help"
}Execute a shell command (via PTY).
════════════════════════════════════════════════════════════════════════════════
List pending permission requests.
Response:
[
{
"id": "perm_abc123",
"sessionID": "ses_xyz",
"tool": "bash",
"input": {"command": "rm -rf /tmp/test"}
}
]Reply to permission request.
Request Body:
{
"allowed": true
}Update permission rule for session.
════════════════════════════════════════════════════════════════════════════════
List pending questions.
Response:
[
{
"id": "q_abc123",
"sessionID": "ses_xyz",
"question": "Which framework should I use?",
"options": [
{"label": "React", "description": "Popular frontend framework"},
{"label": "Vue", "description": "Progressive framework"}
]
}
]Reply to question.
Request Body:
{
"answer": ["React"]
}Reject question (cancel).
════════════════════════════════════════════════════════════════════════════════
List PTY sessions.
Create new PTY session.
Request Body:
{
"command": "/bin/bash",
"rows": 24,
"cols": 80
}Get PTY session info.
Update PTY (resize).
Request Body:
{
"rows": 30,
"cols": 120
}Delete PTY session.
WebSocket endpoint for PTY I/O.
Protocol: Binary WebSocket
- client → server: raw terminal input
- server → client: terminal output
Commit PTY sandbox changes to filesystem.
List uncommitted changes in PTY sandbox.
════════════════════════════════════════════════════════════════════════════════
List files in directory.
Query Parameters:
path— directory path
Get file content.
Query Parameters:
path— file path
Get file status (modified, untracked, etc.).
════════════════════════════════════════════════════════════════════════════════
Search for text in files.
Query Parameters:
query— search terminclude(optional) — file pattern to includelimit(optional) — max results
Search for files by name.
Query Parameters:
query— file name patterndirs(optional) — include directories ("true"/"false")type(optional) — filter by type ("file"/"directory")limit(optional) — max results (1-200)
Search for symbols (functions, types, etc.).
Query Parameters:
query— symbol name
════════════════════════════════════════════════════════════════════════════════
List configured providers.
Get provider authentication status.
Start OAuth flow for provider.
OAuth callback endpoint.
════════════════════════════════════════════════════════════════════════════════
Get configuration.
Update configuration.
Get provider configuration.
════════════════════════════════════════════════════════════════════════════════
List available tools with JSON schemas.
Response:
[
{
"name": "read",
"description": "Read file contents",
"input_schema": {
"type": "object",
"properties": {
"path": {"type": "string"}
}
}
}
]List tool IDs.
Get worktree state.
Set worktree state.
Remove worktree.
Reset worktree to clean state.
════════════════════════════════════════════════════════════════════════════════
Endpoints for controlling the TUI (terminal user interface).
Append text to prompt input.
Submit the current prompt.
Clear the prompt input.
Execute a TUI command.
Show a toast notification.
Open help dialog.
Open sessions dialog.
Open themes dialog.
Open models dialog.
Publish TUI event.
════════════════════════════════════════════════════════════════════════════════
Events sent via SSE at /global/event:
| Event Type | Description |
|---|---|
server.connected |
initial connection event |
server.heartbeat |
periodic heartbeat |
session.created |
new session created |
session.updated |
session metadata changed |
session.deleted |
session deleted |
session.status |
session status changed |
session.idle |
session became idle |
session.error |
session error occurred |
message.updated |
message content changed |
message.removed |
message deleted |
message.part.updated |
message part changed |
message.part.removed |
message part deleted |
permission.asked |
permission request pending |
permission.replied |
permission request answered |
question.asked |
question pending |
question.replied |
question answered |
question.rejected |
question cancelled |
todo.updated |
todos changed |
project.updated |
project changed |
Event Format:
{
"type": "session.created",
"properties": {
"info": {...}
}
}────────────────────────────────────────────────────────────────────────────────
"And in the bloodlit dark behind his eyes, silver phosphenes boiling in from
the edge of space, hypnagogic images jerking past like film compiled from
random frames."
— Neuromancer
────────────────────────────────────────────────────────────────────────────────