API.md

API

API Reference

Base URL

http://localhost:8080/api

Authentication

Currently, no authentication is required. This is intended for internal development environments.

Response Format

All API responses return JSON. Success responses include the requested data. Error responses include an error message.

Endpoints

Projects

POST /api/projects

Create a new project.

Request Body:

{
  "name": "string (required)",
  "description": "string (optional)"
}

Response:

{
  "id": "uuid",
  "name": "string",
  "description": "string",
  "status": "active",
  "created_at": "timestamp",
  "updated_at": "timestamp"
}

Status Codes:

  • 200 OK - Project created successfully
  • 400 Bad Request - Invalid request body
  • 500 Internal Server Error - Server error

GET /api/projects

List all projects.

Response:

[
  {
    "id": "uuid",
    "name": "string",
    "description": "string",
    "status": "string",
    "created_at": "timestamp",
    "updated_at": "timestamp"
  }
]

GET /api/projects/{id}

Get a specific project.

URL Parameters:

  • id (uuid) - Project ID

Response:

{
  "id": "uuid",
  "name": "string",
  "description": "string",
  "status": "string",
  "created_at": "timestamp",
  "updated_at": "timestamp"
}

Status Codes:

  • 200 OK - Project found
  • 400 Bad Request - Invalid project ID
  • 404 Not Found - Project not found

Agents

POST /api/agents

Register a new agent.

Request Body:

{
  "project_id": "uuid (required)",
  "name": "string (required)",
  "role": "string (optional)",
  "team": "string (optional)"
}

Response:

{
  "id": "uuid",
  "project_id": "uuid",
  "name": "string",
  "role": "string",
  "team": "string",
  "status": "active",
  "last_seen": "timestamp",
  "created_at": "timestamp"
}

GET /api/agents

List agents in a project.

Query Parameters:

  • project_id (uuid, required) - Project ID

Response:

[
  {
    "id": "uuid",
    "project_id": "uuid",
    "name": "string",
    "role": "string",
    "team": "string",
    "status": "string",
    "last_seen": "timestamp",
    "created_at": "timestamp"
  }
]

PUT /api/agents/{id}/status

Update agent status.

URL Parameters:

  • id (uuid) - Agent ID

Request Body:

{
  "status": "string (required)" // "active", "idle", "offline"
}

Response:

{
  "id": "uuid",
  "project_id": "uuid",
  "name": "string",
  "role": "string",
  "team": "string",
  "status": "string",
  "last_seen": "timestamp",
  "created_at": "timestamp"
}

Tasks

POST /api/tasks

Create a new task.

Request Body:

{
  "project_id": "uuid (required)",
  "title": "string (required)",
  "description": "string (optional)",
  "priority": "string (optional)", // "low", "medium", "high"
  "created_by": "uuid (required)", // Agent ID
  "assigned_to": "uuid (optional)" // Agent ID
}

Response:

{
  "id": "uuid",
  "project_id": "uuid",
  "title": "string",
  "description": "string",
  "status": "pending",
  "priority": "string",
  "created_by": "uuid",
  "assigned_to": "uuid",
  "output": "string",
  "created_at": "timestamp",
  "updated_at": "timestamp"
}

GET /api/tasks

List tasks in a project.

Query Parameters:

  • project_id (uuid, required) - Project ID
  • status (string, optional) - Filter by status
  • assigned_to (uuid, optional) - Filter by assigned agent

Response:

[
  {
    "id": "uuid",
    "project_id": "uuid",
    "title": "string",
    "description": "string",
    "status": "string",
    "priority": "string",
    "created_by": "uuid",
    "assigned_to": "uuid",
    "output": "string",
    "created_at": "timestamp",
    "updated_at": "timestamp"
  }
]

GET /api/tasks/{id}

Get a specific task.

URL Parameters:

  • id (uuid) - Task ID

Response:

{
  "id": "uuid",
  "project_id": "uuid",
  "title": "string",
  "description": "string",
  "status": "string",
  "priority": "string",
  "created_by": "uuid",
  "assigned_to": "uuid",
  "output": "string",
  "created_at": "timestamp",
  "updated_at": "timestamp"
}

PUT /api/tasks/{id}

Update a task.

URL Parameters:

  • id (uuid) - Task ID

Request Body:

{
  "status": "string (required)", // "pending", "in_progress", "blocked", "done", "cancelled"
  "output": "string (optional)"  // Result or notes
}

Response:

{
  "id": "uuid",
  "project_id": "uuid",
  "title": "string",
  "description": "string",
  "status": "string",
  "priority": "string",
  "created_by": "uuid",
  "assigned_to": "uuid",
  "output": "string",
  "created_at": "timestamp",
  "updated_at": "timestamp"
}

Contexts (Documentation)

POST /api/contexts

Add documentation.

Request Body:

{
  "project_id": "uuid (required)",
  "agent_id": "uuid (required)",
  "task_id": "uuid (optional)",
  "title": "string (required)",
  "content": "string (optional)", // Markdown format
  "tags": ["string"] // Array of tags
}

Response:

{
  "id": "uuid",
  "project_id": "uuid",
  "agent_id": "uuid",
  "task_id": "uuid",
  "title": "string",
  "content": "string",
  "tags": ["string"],
  "created_at": "timestamp",
  "updated_at": "timestamp"
}

GET /api/contexts

List documentation in a project.

Query Parameters:

  • project_id (uuid, required) - Project ID
  • tags (string, optional) - Comma-separated tags to filter by

Response:

[
  {
    "id": "uuid",
    "project_id": "uuid",
    "agent_id": "uuid",
    "task_id": "uuid",
    "title": "string",
    "content": "string",
    "tags": ["string"],
    "created_at": "timestamp",
    "updated_at": "timestamp"
  }
]

GET /api/contexts/{id}

Get specific documentation.

URL Parameters:

  • id (uuid) - Context ID

Response:

{
  "id": "uuid",
  "project_id": "uuid",
  "agent_id": "uuid",
  "task_id": "uuid",
  "title": "string",
  "content": "string",
  "tags": ["string"],
  "created_at": "timestamp",
  "updated_at": "timestamp"
}

WebSocket

WS /ws

Connect to real-time updates.

Query Parameters:

  • project_id (uuid, required) - Project ID to subscribe to

Message Format:

{
  "type": "string", // "task_update", "agent_update", "context_added"
  "payload": {}     // Entity data
}

Example:

const ws = new WebSocket('ws://localhost:8080/ws?project_id=UUID');

ws.onmessage = (event) => {
  const message = JSON.parse(event.data);
  console.log('Type:', message.type);
  console.log('Payload:', message.payload);
};

Health Check

GET /health

Check server health.

Response:

OK

Status Code: 200 OK


Status Values

Task Status

  • pending - Task is created and waiting to be started
  • in_progress - Task is being worked on
  • blocked - Task is blocked by a dependency
  • done - Task is completed
  • cancelled - Task was cancelled

Task Priority

  • low - Low priority
  • medium - Medium priority (default)
  • high - High priority

Agent Status

  • active - Agent is actively working
  • idle - Agent is idle and waiting for tasks
  • offline - Agent is offline

Project Status

  • active - Project is active (default)

Error Handling

All error responses follow this format:

{
  "error": "Error message description"
}

Common HTTP status codes:

  • 400 Bad Request - Invalid input or missing required fields
  • 404 Not Found - Resource not found
  • 500 Internal Server Error - Server-side error

Rate Limiting

Currently, there are no rate limits. This may change in future versions.

Versioning

The API is currently unversioned. Breaking changes will be communicated in advance.


Mesh-app additions (Phase 1/2/3)

Milestones

POST /api/milestones

Create a milestone.

Request body: { "project_id": "uuid", "title": "string", "description": "string?", "status": "planned|active|done|dropped", "target_date": "YYYY-MM-DD?", "created_by": "uuid" }.

Response: 201 with the created Milestone. Status 409 (milestone_open_tasks) is returned only on transitions to done if any linked task is not in a terminal state.

GET /api/milestones?project_id=...

List milestones for a project, newest first.

PUT /api/milestones/{id}/status

Body: { "status": "planned|active|done|dropped", "description": "string?" }. done is rejected with 409 if linked tasks are still open.

DELETE /api/milestones/{id}

Tasks linked to the deleted milestone are unlinked via ON DELETE SET NULL.

Project repositories

POST /api/project_repos

GET /api/project_repos?project_id=...

GET /api/project_repos/{id}

PUT /api/project_repos/{id}

DELETE /api/project_repos/{id}

Body for create/update: { "project_id": "uuid", "url": "string", "branch": "main?", "role": "code|infra|docs|design?", "agent_id": "uuid?" }.

Deleting a repo does NOT delete its owning agent row.

Global contexts (Phase 3)

POST /api/global_contexts

Body: { "scope": "global|project", "project_id": "uuid? (required when scope=project)", "agent_id": "uuid", "title": "string", "content": "string", "tags": ["string"]? }.

Returns 201 on success. Returns 409 (global_context_conflict) when (scope, title) uniqueness is violated.

GET /api/global_contexts?scope=global|project&project_id=...&tag_prefix=...

Filter by scope, project, and tag prefix. Non-PM callers see only their project-scoped docs unless they explicitly filter by scope=project.

GET /api/global_contexts/{id}

PUT /api/global_contexts/{id}

DELETE /api/global_contexts/{id}

Tasks � extended

POST /api/tasks and PUT /api/tasks/{id} now accept optional milestone_id (UUID, FK to milestones.id) and ags (string[]). Tasks tagged eature: roll up under the Features view in the Nuxt UI.

MCP tools added

Name Role Purpose
egister_self any Create / re-attach an agent row; optionally create its project_repos row
create_milestone pm-only Create a milestone for the connected project
list_milestones any List milestones for the connected project
ssign_task_to_milestone pm-only Link an existing task to a milestone
publish_global_context pm-only Create a global or project playbook
list_global_contexts any List server-wide or project docs
ead_global_context any Read one doc by id, or one global playbook by title
esources/read global://</td> <td>any</td> <td>Read a global playbook as ext/markdown</td> </tr> </tbody> </table> <p>PM gating returns JSON-RPC error -32003 (Forbidden) when the caller is not bound to a pm-role agent.</p> </article><nav class="mt-16 flex items-center justify-between border-t border-slate-200 pt-8 dark:border-slate-800"><a class="group flex items-center gap-3" href="/agent-shaker/docs/agents-page-implementation/"><div class="flex h-10 w-10 items-center justify-center rounded-lg bg-slate-100 transition-colors group-hover:bg-primary-100 dark:bg-slate-800 dark:group-hover:bg-primary-950"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-left h-5 w-5 text-slate-600 group-hover:text-primary-600 dark:text-slate-400 dark:group-hover:text-primary-400"><path d="m12 19-7-7 7-7"></path><path d="M19 12H5"></path></svg></div><div class="text-left"><p class="text-xs text-slate-500 dark:text-slate-400">Previous</p><p class="text-sm font-medium text-slate-900 group-hover:text-primary-600 dark:text-white dark:group-hover:text-primary-400">AGENTS PAGE IMPLEMENTATION</p></div></a><a class="group flex items-center gap-3" href="/agent-shaker/docs/api-fixes-summary/"><div class="text-right"><p class="text-xs text-slate-500 dark:text-slate-400">Next</p><p class="text-sm font-medium text-slate-900 group-hover:text-primary-600 dark:text-white dark:group-hover:text-primary-400">API FIXES SUMMARY</p></div><div class="flex h-10 w-10 items-center justify-center rounded-lg bg-slate-100 transition-colors group-hover:bg-primary-100 dark:bg-slate-800 dark:group-hover:bg-primary-950"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right h-5 w-5 text-slate-600 group-hover:text-primary-600 dark:text-slate-400 dark:group-hover:text-primary-400"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></div></a></nav><div class="mt-8 text-center"><a class="inline-flex items-center gap-2 text-sm font-medium text-primary-600 hover:text-primary-700 dark:text-primary-400 dark:hover:text-primary-300" href="/agent-shaker/docs/"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-left h-4 w-4"><path d="m12 19-7-7 7-7"></path><path d="M19 12H5"></path></svg>Back to all documentation</a></div></div></main><footer class="border-t border-slate-200 bg-slate-50 dark:border-slate-800 dark:bg-slate-900/50"><div class="mx-auto max-w-7xl px-4 py-8 sm:px-6 lg:px-8"><div class="flex flex-col items-center justify-between gap-4 md:flex-row"><div class="flex items-center gap-2 text-sm text-slate-600 dark:text-slate-400"><img alt="Agent Shaker" loading="lazy" width="28" height="28" decoding="async" data-nimg="1" class="h-7 w-7 rounded-md" style="color:transparent" src="/agent-shaker/icon.png"/><span>Agent Shaker</span><span class="text-slate-400">·</span><span>© <!-- -->2026</span></div><nav class="flex items-center gap-6 text-sm"><a class="text-slate-600 transition-colors hover:text-slate-900 dark:text-slate-400 dark:hover:text-white" href="/agent-shaker/">Home</a><a class="text-slate-600 transition-colors hover:text-slate-900 dark:text-slate-400 dark:hover:text-white" href="/agent-shaker/docs/">Docs</a><a class="text-slate-600 transition-colors hover:text-slate-900 dark:text-slate-400 dark:hover:text-white" href="/agent-shaker/screenshots/">Screenshots</a></nav><div class="flex items-center gap-4"><span class="flex items-center gap-1 text-sm text-slate-500 dark:text-slate-500">Made with <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-heart h-3.5 w-3.5 fill-red-500 text-red-500"><path d="M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z"></path></svg> for AI agents</span><a href="https://github.com/techbuzzz/agent-shaker" target="_blank" rel="noopener noreferrer" class="text-slate-500 transition-colors hover:text-slate-900 dark:text-slate-500 dark:hover:text-white" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-github h-5 w-5"><path d="M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4"></path><path d="M9 18c-4.51 2-5-2-7-2"></path></svg></a></div></div></div></footer></div><script src="/agent-shaker/_next/static/chunks/webpack-aaa0b5b3a96b5ef5.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/agent-shaker/_next/static/media/21350d82a1f187e9-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n2:HL[\"/agent-shaker/_next/static/media/e4af272ccee01ff0-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n3:HL[\"/agent-shaker/_next/static/css/1a756a2aaa773791.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"4:I[2846,[],\"\"]\n6:I[2972,[\"972\",\"static/chunks/972-c58a8277eac29595.js\",\"121\",\"static/chunks/app/docs/%5Bslug%5D/page-a666b0c9cb66149d.js\"],\"\"]\n8:I[4707,[],\"\"]\na:I[6423,[],\"\"]\nb:I[8767,[\"972\",\"static/chunks/972-c58a8277eac29595.js\",\"878\",\"static/chunks/878-3a02023cf1f9a5cd.js\",\"185\",\"static/chunks/app/layout-6f0680467063b3ea.js\"],\"Header\"]\nc:I[5878,[\"972\",\"static/chunks/972-c58a8277eac29595.js\",\"878\",\"static/chunks/878-3a02023cf1f9a5cd.js\",\"931\",\"static/chunks/app/page-40073c4068ca6730.js\"],\"Image\"]\ne:I[1060,[],\"\"]\n7:T36f5,"])</script><script>self.__next_f.push([1,"\u003ch1\u003eAPI Reference\u003c/h1\u003e\n\u003ch2\u003eBase URL\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003ehttp://localhost:8080/api\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2\u003eAuthentication\u003c/h2\u003e\n\u003cp\u003eCurrently, no authentication is required. This is intended for internal development environments.\u003c/p\u003e\n\u003ch2\u003eResponse Format\u003c/h2\u003e\n\u003cp\u003eAll API responses return JSON. Success responses include the requested data. Error responses include an error message.\u003c/p\u003e\n\u003ch2\u003eEndpoints\u003c/h2\u003e\n\u003ch3\u003eProjects\u003c/h3\u003e\n\u003ch4\u003ePOST /api/projects\u003c/h4\u003e\n\u003cp\u003eCreate a new project.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eRequest Body:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{\r\n \"name\": \"string (required)\",\r\n \"description\": \"string (optional)\"\r\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eResponse:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{\r\n \"id\": \"uuid\",\r\n \"name\": \"string\",\r\n \"description\": \"string\",\r\n \"status\": \"active\",\r\n \"created_at\": \"timestamp\",\r\n \"updated_at\": \"timestamp\"\r\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eStatus Codes:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e200 OK\u003c/code\u003e - Project created successfully\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e400 Bad Request\u003c/code\u003e - Invalid request body\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e500 Internal Server Error\u003c/code\u003e - Server error\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch4\u003eGET /api/projects\u003c/h4\u003e\n\u003cp\u003eList all projects.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eResponse:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e[\r\n {\r\n \"id\": \"uuid\",\r\n \"name\": \"string\",\r\n \"description\": \"string\",\r\n \"status\": \"string\",\r\n \"created_at\": \"timestamp\",\r\n \"updated_at\": \"timestamp\"\r\n }\r\n]\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch4\u003eGET /api/projects/{id}\u003c/h4\u003e\n\u003cp\u003eGet a specific project.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eURL Parameters:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eid\u003c/code\u003e (uuid) - Project ID\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eResponse:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{\r\n \"id\": \"uuid\",\r\n \"name\": \"string\",\r\n \"description\": \"string\",\r\n \"status\": \"string\",\r\n \"created_at\": \"timestamp\",\r\n \"updated_at\": \"timestamp\"\r\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eStatus Codes:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e200 OK\u003c/code\u003e - Project found\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e400 Bad Request\u003c/code\u003e - Invalid project ID\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e404 Not Found\u003c/code\u003e - Project not found\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3\u003eAgents\u003c/h3\u003e\n\u003ch4\u003ePOST /api/agents\u003c/h4\u003e\n\u003cp\u003eRegister a new agent.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eRequest Body:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{\r\n \"project_id\": \"uuid (required)\",\r\n \"name\": \"string (required)\",\r\n \"role\": \"string (optional)\",\r\n \"team\": \"string (optional)\"\r\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eResponse:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{\r\n \"id\": \"uuid\",\r\n \"project_id\": \"uuid\",\r\n \"name\": \"string\",\r\n \"role\": \"string\",\r\n \"team\": \"string\",\r\n \"status\": \"active\",\r\n \"last_seen\": \"timestamp\",\r\n \"created_at\": \"timestamp\"\r\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch4\u003eGET /api/agents\u003c/h4\u003e\n\u003cp\u003eList agents in a project.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eQuery Parameters:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eproject_id\u003c/code\u003e (uuid, required) - Project ID\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eResponse:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e[\r\n {\r\n \"id\": \"uuid\",\r\n \"project_id\": \"uuid\",\r\n \"name\": \"string\",\r\n \"role\": \"string\",\r\n \"team\": \"string\",\r\n \"status\": \"string\",\r\n \"last_seen\": \"timestamp\",\r\n \"created_at\": \"timestamp\"\r\n }\r\n]\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch4\u003ePUT /api/agents/{id}/status\u003c/h4\u003e\n\u003cp\u003eUpdate agent status.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eURL Parameters:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eid\u003c/code\u003e (uuid) - Agent ID\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eRequest Body:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{\r\n \"status\": \"string (required)\" // \"active\", \"idle\", \"offline\"\r\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eResponse:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{\r\n \"id\": \"uuid\",\r\n \"project_id\": \"uuid\",\r\n \"name\": \"string\",\r\n \"role\": \"string\",\r\n \"team\": \"string\",\r\n \"status\": \"string\",\r\n \"last_seen\": \"timestamp\",\r\n \"created_at\": \"timestamp\"\r\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch3\u003eTasks\u003c/h3\u003e\n\u003ch4\u003ePOST /api/tasks\u003c/h4\u003e\n\u003cp\u003eCreate a new task.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eRequest Body:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{\r\n \"project_id\": \"uuid (required)\",\r\n \"title\": \"string (required)\",\r\n \"description\": \"string (optional)\",\r\n \"priority\": \"string (optional)\", // \"low\", \"medium\", \"high\"\r\n \"created_by\": \"uuid (required)\", // Agent ID\r\n \"assigned_to\": \"uuid (optional)\" // Agent ID\r\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eResponse:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{\r\n \"id\": \"uuid\",\r\n \"project_id\": \"uuid\",\r\n \"title\": \"string\",\r\n \"description\": \"string\",\r\n \"status\": \"pending\",\r\n \"priority\": \"string\",\r\n \"created_by\": \"uuid\",\r\n \"assigned_to\": \"uuid\",\r\n \"output\": \"string\",\r\n \"created_at\": \"timestamp\",\r\n \"updated_at\": \"timestamp\"\r\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch4\u003eGET /api/tasks\u003c/h4\u003e\n\u003cp\u003eList tasks in a project.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eQuery Parameters:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eproject_id\u003c/code\u003e (uuid, required) - Project ID\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatus\u003c/code\u003e (string, optional) - Filter by status\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eassigned_to\u003c/code\u003e (uuid, optional) - Filter by assigned agent\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eResponse:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e[\r\n {\r\n \"id\": \"uuid\",\r\n \"project_id\": \"uuid\",\r\n \"title\": \"string\",\r\n \"description\": \"string\",\r\n \"status\": \"string\",\r\n \"priority\": \"string\",\r\n \"created_by\": \"uuid\",\r\n \"assigned_to\": \"uuid\",\r\n \"output\": \"string\",\r\n \"created_at\": \"timestamp\",\r\n \"updated_at\": \"timestamp\"\r\n }\r\n]\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch4\u003eGET /api/tasks/{id}\u003c/h4\u003e\n\u003cp\u003eGet a specific task.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eURL Parameters:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eid\u003c/code\u003e (uuid) - Task ID\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eResponse:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{\r\n \"id\": \"uuid\",\r\n \"project_id\": \"uuid\",\r\n \"title\": \"string\",\r\n \"description\": \"string\",\r\n \"status\": \"string\",\r\n \"priority\": \"string\",\r\n \"created_by\": \"uuid\",\r\n \"assigned_to\": \"uuid\",\r\n \"output\": \"string\",\r\n \"created_at\": \"timestamp\",\r\n \"updated_at\": \"timestamp\"\r\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch4\u003ePUT /api/tasks/{id}\u003c/h4\u003e\n\u003cp\u003eUpdate a task.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eURL Parameters:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eid\u003c/code\u003e (uuid) - Task ID\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eRequest Body:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{\r\n \"status\": \"string (required)\", // \"pending\", \"in_progress\", \"blocked\", \"done\", \"cancelled\"\r\n \"output\": \"string (optional)\" // Result or notes\r\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eResponse:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{\r\n \"id\": \"uuid\",\r\n \"project_id\": \"uuid\",\r\n \"title\": \"string\",\r\n \"description\": \"string\",\r\n \"status\": \"string\",\r\n \"priority\": \"string\",\r\n \"created_by\": \"uuid\",\r\n \"assigned_to\": \"uuid\",\r\n \"output\": \"string\",\r\n \"created_at\": \"timestamp\",\r\n \"updated_at\": \"timestamp\"\r\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch3\u003eContexts (Documentation)\u003c/h3\u003e\n\u003ch4\u003ePOST /api/contexts\u003c/h4\u003e\n\u003cp\u003eAdd documentation.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eRequest Body:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{\r\n \"project_id\": \"uuid (required)\",\r\n \"agent_id\": \"uuid (required)\",\r\n \"task_id\": \"uuid (optional)\",\r\n \"title\": \"string (required)\",\r\n \"content\": \"string (optional)\", // Markdown format\r\n \"tags\": [\"string\"] // Array of tags\r\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eResponse:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{\r\n \"id\": \"uuid\",\r\n \"project_id\": \"uuid\",\r\n \"agent_id\": \"uuid\",\r\n \"task_id\": \"uuid\",\r\n \"title\": \"string\",\r\n \"content\": \"string\",\r\n \"tags\": [\"string\"],\r\n \"created_at\": \"timestamp\",\r\n \"updated_at\": \"timestamp\"\r\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch4\u003eGET /api/contexts\u003c/h4\u003e\n\u003cp\u003eList documentation in a project.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eQuery Parameters:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eproject_id\u003c/code\u003e (uuid, required) - Project ID\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etags\u003c/code\u003e (string, optional) - Comma-separated tags to filter by\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eResponse:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e[\r\n {\r\n \"id\": \"uuid\",\r\n \"project_id\": \"uuid\",\r\n \"agent_id\": \"uuid\",\r\n \"task_id\": \"uuid\",\r\n \"title\": \"string\",\r\n \"content\": \"string\",\r\n \"tags\": [\"string\"],\r\n \"created_at\": \"timestamp\",\r\n \"updated_at\": \"timestamp\"\r\n }\r\n]\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch4\u003eGET /api/contexts/{id}\u003c/h4\u003e\n\u003cp\u003eGet specific documentation.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eURL Parameters:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eid\u003c/code\u003e (uuid) - Context ID\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eResponse:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{\r\n \"id\": \"uuid\",\r\n \"project_id\": \"uuid\",\r\n \"agent_id\": \"uuid\",\r\n \"task_id\": \"uuid\",\r\n \"title\": \"string\",\r\n \"content\": \"string\",\r\n \"tags\": [\"string\"],\r\n \"created_at\": \"timestamp\",\r\n \"updated_at\": \"timestamp\"\r\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch3\u003eWebSocket\u003c/h3\u003e\n\u003ch4\u003eWS /ws\u003c/h4\u003e\n\u003cp\u003eConnect to real-time updates.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eQuery Parameters:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eproject_id\u003c/code\u003e (uuid, required) - Project ID to subscribe to\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eMessage Format:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{\r\n \"type\": \"string\", // \"task_update\", \"agent_update\", \"context_added\"\r\n \"payload\": {} // Entity data\r\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eExample:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-javascript\"\u003econst ws = new WebSocket('ws://localhost:8080/ws?project_id=UUID');\r\n\r\nws.onmessage = (event) =\u003e {\r\n const message = JSON.parse(event.data);\r\n console.log('Type:', message.type);\r\n console.log('Payload:', message.payload);\r\n};\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003ch3\u003eHealth Check\u003c/h3\u003e\n\u003ch4\u003eGET /health\u003c/h4\u003e\n\u003cp\u003eCheck server health.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eResponse:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eOK\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eStatus Code:\u003c/strong\u003e \u003ccode\u003e200 OK\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2\u003eStatus Values\u003c/h2\u003e\n\u003ch3\u003eTask Status\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003epending\u003c/code\u003e - Task is created and waiting to be started\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ein_progress\u003c/code\u003e - Task is being worked on\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eblocked\u003c/code\u003e - Task is blocked by a dependency\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edone\u003c/code\u003e - Task is completed\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecancelled\u003c/code\u003e - Task was cancelled\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eTask Priority\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003elow\u003c/code\u003e - Low priority\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emedium\u003c/code\u003e - Medium priority (default)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehigh\u003c/code\u003e - High priority\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eAgent Status\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eactive\u003c/code\u003e - Agent is actively working\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eidle\u003c/code\u003e - Agent is idle and waiting for tasks\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eoffline\u003c/code\u003e - Agent is offline\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eProject Status\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eactive\u003c/code\u003e - Project is active (default)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eError Handling\u003c/h2\u003e\n\u003cp\u003eAll error responses follow this format:\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{\r\n \"error\": \"Error message description\"\r\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eCommon HTTP status codes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e400 Bad Request\u003c/code\u003e - Invalid input or missing required fields\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e404 Not Found\u003c/code\u003e - Resource not found\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e500 Internal Server Error\u003c/code\u003e - Server-side error\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eRate Limiting\u003c/h2\u003e\n\u003cp\u003eCurrently, there are no rate limits. This may change in future versions.\u003c/p\u003e\n\u003ch2\u003eVersioning\u003c/h2\u003e\n\u003cp\u003eThe API is currently unversioned. Breaking changes will be communicated in advance.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2\u003eMesh-app additions (Phase 1/2/3)\u003c/h2\u003e\n\u003ch3\u003eMilestones\u003c/h3\u003e\n\u003ch4\u003ePOST /api/milestones\u003c/h4\u003e\n\u003cp\u003eCreate a milestone.\u003c/p\u003e\n\u003cp\u003eRequest body: { \"project_id\": \"uuid\", \"title\": \"string\", \"description\": \"string?\",\n\"status\": \"planned|active|done|dropped\", \"target_date\": \"YYYY-MM-DD?\", \"created_by\": \"uuid\" }.\u003c/p\u003e\n\u003cp\u003eResponse: 201 with the created Milestone. Status 409 (milestone_open_tasks) is\nreturned only on transitions to done if any linked task is not in a terminal state.\u003c/p\u003e\n\u003ch4\u003eGET /api/milestones?project_id=...\u003c/h4\u003e\n\u003cp\u003eList milestones for a project, newest first.\u003c/p\u003e\n\u003ch4\u003ePUT /api/milestones/{id}/status\u003c/h4\u003e\n\u003cp\u003eBody: { \"status\": \"planned|active|done|dropped\", \"description\": \"string?\" }.\ndone is rejected with 409 if linked tasks are still open.\u003c/p\u003e\n\u003ch4\u003eDELETE /api/milestones/{id}\u003c/h4\u003e\n\u003cp\u003eTasks linked to the deleted milestone are unlinked via ON DELETE SET NULL.\u003c/p\u003e\n\u003ch3\u003eProject repositories\u003c/h3\u003e\n\u003ch4\u003ePOST /api/project_repos\u003c/h4\u003e\n\u003ch4\u003eGET /api/project_repos?project_id=...\u003c/h4\u003e\n\u003ch4\u003eGET /api/project_repos/{id}\u003c/h4\u003e\n\u003ch4\u003ePUT /api/project_repos/{id}\u003c/h4\u003e\n\u003ch4\u003eDELETE /api/project_repos/{id}\u003c/h4\u003e\n\u003cp\u003eBody for create/update: { \"project_id\": \"uuid\", \"url\": \"string\", \"branch\": \"main?\",\n\"role\": \"code|infra|docs|design?\", \"agent_id\": \"uuid?\" }.\u003c/p\u003e\n\u003cp\u003eDeleting a repo does NOT delete its owning agent row.\u003c/p\u003e\n\u003ch3\u003eGlobal contexts (Phase 3)\u003c/h3\u003e\n\u003ch4\u003ePOST /api/global_contexts\u003c/h4\u003e\n\u003cp\u003eBody: { \"scope\": \"global|project\", \"project_id\": \"uuid? (required when scope=project)\",\n\"agent_id\": \"uuid\", \"title\": \"string\", \"content\": \"string\", \"tags\": [\"string\"]? }.\u003c/p\u003e\n\u003cp\u003eReturns 201 on success. Returns 409 (global_context_conflict) when\n(scope, title) uniqueness is violated.\u003c/p\u003e\n\u003ch4\u003eGET /api/global_contexts?scope=global|project\u0026#x26;project_id=...\u0026#x26;tag_prefix=...\u003c/h4\u003e\n\u003cp\u003eFilter by scope, project, and tag prefix. Non-PM callers see only their\nproject-scoped docs unless they explicitly filter by scope=project.\u003c/p\u003e\n\u003ch4\u003eGET /api/global_contexts/{id}\u003c/h4\u003e\n\u003ch4\u003ePUT /api/global_contexts/{id}\u003c/h4\u003e\n\u003ch4\u003eDELETE /api/global_contexts/{id}\u003c/h4\u003e\n\u003ch3\u003eTasks � extended\u003c/h3\u003e\n\u003cp\u003ePOST /api/tasks and PUT /api/tasks/{id} now accept optional\nmilestone_id (UUID, FK to milestones.id) and \tags (string[]).\nTasks tagged \feature:\u003cname\u003e roll up under the Features view in the Nuxt UI.\u003c/p\u003e\n\u003ch3\u003eMCP tools added\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eName\u003c/th\u003e\n\u003cth\u003eRole\u003c/th\u003e\n\u003cth\u003ePurpose\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eegister_self\u003c/td\u003e\n\u003ctd\u003eany\u003c/td\u003e\n\u003ctd\u003eCreate / re-attach an agent row; optionally create its project_repos row\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ecreate_milestone\u003c/td\u003e\n\u003ctd\u003epm-only\u003c/td\u003e\n\u003ctd\u003eCreate a milestone for the connected project\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003elist_milestones\u003c/td\u003e\n\u003ctd\u003eany\u003c/td\u003e\n\u003ctd\u003eList milestones for the connected project\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u0007ssign_task_to_milestone\u003c/td\u003e\n\u003ctd\u003epm-only\u003c/td\u003e\n\u003ctd\u003eLink an existing task to a milestone\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003epublish_global_context\u003c/td\u003e\n\u003ctd\u003epm-only\u003c/td\u003e\n\u003ctd\u003eCreate a global or project playbook\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003elist_global_contexts\u003c/td\u003e\n\u003ctd\u003eany\u003c/td\u003e\n\u003ctd\u003eList server-wide or project docs\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eead_global_context\u003c/td\u003e\n\u003ctd\u003eany\u003c/td\u003e\n\u003ctd\u003eRead one doc by id, or one global playbook by title\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eesources/read global://\u003ctitle\u003e\u003c/td\u003e\n\u003ctd\u003eany\u003c/td\u003e\n\u003ctd\u003eRead a global playbook as \text/markdown\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003ePM gating returns JSON-RPC error -32003 (Forbidden) when the caller is\nnot bound to a pm-role agent.\u003c/p\u003e\n"])</script><script>self.__next_f.push([1,"9:[\"slug\",\"api\",\"d\"]\nf:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L4\",null,{\"buildId\":\"SxpD7LTUhlwI4hF15Z4ON\",\"assetPrefix\":\"/agent-shaker\",\"urlParts\":[\"\",\"docs\",\"api\",\"\"],\"initialTree\":[\"\",{\"children\":[\"docs\",{\"children\":[[\"slug\",\"api\",\"d\"],{\"children\":[\"__PAGE__?{\\\"slug\\\":\\\"api\\\"}\",{}]}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"docs\",{\"children\":[[\"slug\",\"api\",\"d\"],{\"children\":[\"__PAGE__\",{},[[\"$L5\",[\"$\",\"div\",null,{\"className\":\"mx-auto max-w-5xl px-4 py-12 sm:px-6 lg:px-8\",\"children\":[[\"$\",\"nav\",null,{\"className\":\"mb-8 flex items-center gap-2 text-sm\",\"children\":[[\"$\",\"$L6\",null,{\"href\":\"/docs/\",\"className\":\"flex items-center gap-1 text-slate-500 transition-colors hover:text-primary-600 dark:text-slate-400 dark:hover:text-primary-400\",\"children\":[[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-folder-open h-4 w-4\",\"children\":[[\"$\",\"path\",\"usdka0\",{\"d\":\"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2\"}],\"$undefined\"]}],\"Documentation\"]}],[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-chevron-right h-4 w-4 text-slate-400\",\"children\":[[\"$\",\"path\",\"mthhwq\",{\"d\":\"m9 18 6-6-6-6\"}],\"$undefined\"]}],[\"$\",\"span\",null,{\"className\":\"rounded-full bg-slate-100 px-2.5 py-0.5 text-xs font-medium text-slate-600 dark:bg-slate-800 dark:text-slate-400\",\"children\":\"General\"}],[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-chevron-right h-4 w-4 text-slate-400\",\"children\":[[\"$\",\"path\",\"mthhwq\",{\"d\":\"m9 18 6-6-6-6\"}],\"$undefined\"]}],[\"$\",\"span\",null,{\"className\":\"font-medium text-slate-900 dark:text-white\",\"children\":\"API\"}]]}],[\"$\",\"header\",null,{\"className\":\"mb-10\",\"children\":[[\"$\",\"div\",null,{\"className\":\"mb-4 flex items-center gap-3\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex h-12 w-12 items-center justify-center rounded-xl bg-primary-100 text-primary-600 dark:bg-primary-950 dark:text-primary-400\",\"children\":[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-file-text h-6 w-6\",\"children\":[[\"$\",\"path\",\"1rqfz7\",{\"d\":\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\"}],[\"$\",\"path\",\"tnqrlb\",{\"d\":\"M14 2v4a2 2 0 0 0 2 2h4\"}],[\"$\",\"path\",\"b1mrlr\",{\"d\":\"M10 9H8\"}],[\"$\",\"path\",\"t4e002\",{\"d\":\"M16 13H8\"}],[\"$\",\"path\",\"z1uh3a\",{\"d\":\"M16 17H8\"}],\"$undefined\"]}]}],[\"$\",\"div\",null,{\"children\":[\"$\",\"p\",null,{\"className\":\"text-sm text-slate-500 dark:text-slate-400\",\"children\":\"API.md\"}]}]]}],[\"$\",\"h1\",null,{\"className\":\"text-4xl font-bold tracking-tight text-slate-900 sm:text-5xl dark:text-white\",\"children\":\"API\"}],\"$undefined\"]}],[\"$\",\"article\",null,{\"className\":\"prose-content\",\"dangerouslySetInnerHTML\":{\"__html\":\"$7\"}}],[\"$\",\"nav\",null,{\"className\":\"mt-16 flex items-center justify-between border-t border-slate-200 pt-8 dark:border-slate-800\",\"children\":[[\"$\",\"$L6\",null,{\"href\":\"/docs/agents-page-implementation/\",\"className\":\"group flex items-center gap-3\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex h-10 w-10 items-center justify-center rounded-lg bg-slate-100 transition-colors group-hover:bg-primary-100 dark:bg-slate-800 dark:group-hover:bg-primary-950\",\"children\":[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-arrow-left h-5 w-5 text-slate-600 group-hover:text-primary-600 dark:text-slate-400 dark:group-hover:text-primary-400\",\"children\":[[\"$\",\"path\",\"1l729n\",{\"d\":\"m12 19-7-7 7-7\"}],[\"$\",\"path\",\"x3x0zl\",{\"d\":\"M19 12H5\"}],\"$undefined\"]}]}],[\"$\",\"div\",null,{\"className\":\"text-left\",\"children\":[[\"$\",\"p\",null,{\"className\":\"text-xs text-slate-500 dark:text-slate-400\",\"children\":\"Previous\"}],[\"$\",\"p\",null,{\"className\":\"text-sm font-medium text-slate-900 group-hover:text-primary-600 dark:text-white dark:group-hover:text-primary-400\",\"children\":\"AGENTS PAGE IMPLEMENTATION\"}]]}]]}],[\"$\",\"$L6\",null,{\"href\":\"/docs/api-fixes-summary/\",\"className\":\"group flex items-center gap-3\",\"children\":[[\"$\",\"div\",null,{\"className\":\"text-right\",\"children\":[[\"$\",\"p\",null,{\"className\":\"text-xs text-slate-500 dark:text-slate-400\",\"children\":\"Next\"}],[\"$\",\"p\",null,{\"className\":\"text-sm font-medium text-slate-900 group-hover:text-primary-600 dark:text-white dark:group-hover:text-primary-400\",\"children\":\"API FIXES SUMMARY\"}]]}],[\"$\",\"div\",null,{\"className\":\"flex h-10 w-10 items-center justify-center rounded-lg bg-slate-100 transition-colors group-hover:bg-primary-100 dark:bg-slate-800 dark:group-hover:bg-primary-950\",\"children\":[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-arrow-right h-5 w-5 text-slate-600 group-hover:text-primary-600 dark:text-slate-400 dark:group-hover:text-primary-400\",\"children\":[[\"$\",\"path\",\"1ays0h\",{\"d\":\"M5 12h14\"}],[\"$\",\"path\",\"xquz4c\",{\"d\":\"m12 5 7 7-7 7\"}],\"$undefined\"]}]}]]}]]}],[\"$\",\"div\",null,{\"className\":\"mt-8 text-center\",\"children\":[\"$\",\"$L6\",null,{\"href\":\"/docs/\",\"className\":\"inline-flex items-center gap-2 text-sm font-medium text-primary-600 hover:text-primary-700 dark:text-primary-400 dark:hover:text-primary-300\",\"children\":[[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-arrow-left h-4 w-4\",\"children\":[[\"$\",\"path\",\"1l729n\",{\"d\":\"m12 19-7-7 7-7\"}],[\"$\",\"path\",\"x3x0zl\",{\"d\":\"M19 12H5\"}],\"$undefined\"]}],\"Back to all documentation\"]}]}]]}],null],null],null]},[null,[\"$\",\"$L8\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"docs\",\"children\",\"$9\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$La\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[null,[\"$\",\"$L8\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"docs\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$La\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/agent-shaker/_next/static/css/1a756a2aaa773791.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"scroll-smooth\",\"children\":[\"$\",\"body\",null,{\"className\":\"__className_6fdf9a bg-white text-slate-900 antialiased dark:bg-slate-950 dark:text-slate-100\",\"children\":[\"$\",\"div\",null,{\"className\":\"flex min-h-screen flex-col\",\"children\":[[\"$\",\"$Lb\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1\",\"children\":[\"$\",\"$L8\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$La\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}],[\"$\",\"footer\",null,{\"className\":\"border-t border-slate-200 bg-slate-50 dark:border-slate-800 dark:bg-slate-900/50\",\"children\":[\"$\",\"div\",null,{\"className\":\"mx-auto max-w-7xl px-4 py-8 sm:px-6 lg:px-8\",\"children\":[\"$\",\"div\",null,{\"className\":\"flex flex-col items-center justify-between gap-4 md:flex-row\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2 text-sm text-slate-600 dark:text-slate-400\",\"children\":[[\"$\",\"$Lc\",null,{\"src\":\"/agent-shaker/icon.png\",\"alt\":\"Agent Shaker\",\"width\":28,\"height\":28,\"className\":\"h-7 w-7 rounded-md\"}],[\"$\",\"span\",null,{\"children\":\"Agent Shaker\"}],[\"$\",\"span\",null,{\"className\":\"text-slate-400\",\"children\":\"·\"}],[\"$\",\"span\",null,{\"children\":[\"© \",2026]}]]}],[\"$\",\"nav\",null,{\"className\":\"flex items-center gap-6 text-sm\",\"children\":[[\"$\",\"$L6\",null,{\"href\":\"/\",\"className\":\"text-slate-600 transition-colors hover:text-slate-900 dark:text-slate-400 dark:hover:text-white\",\"children\":\"Home\"}],[\"$\",\"$L6\",null,{\"href\":\"/docs/\",\"className\":\"text-slate-600 transition-colors hover:text-slate-900 dark:text-slate-400 dark:hover:text-white\",\"children\":\"Docs\"}],[\"$\",\"$L6\",null,{\"href\":\"/screenshots/\",\"className\":\"text-slate-600 transition-colors hover:text-slate-900 dark:text-slate-400 dark:hover:text-white\",\"children\":\"Screenshots\"}]]}],[\"$\",\"div\",null,{\"className\":\"flex items-center gap-4\",\"children\":[[\"$\",\"span\",null,{\"className\":\"flex items-center gap-1 text-sm text-slate-500 dark:text-slate-500\",\"children\":[\"Made with \",[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-heart h-3.5 w-3.5 fill-red-500 text-red-500\",\"children\":[[\"$\",\"path\",\"c3ymky\",{\"d\":\"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z\"}],\"$undefined\"]}],\" for AI agents\"]}],[\"$\",\"a\",null,{\"href\":\"https://github.com/techbuzzz/agent-shaker\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"text-slate-500 transition-colors hover:text-slate-900 dark:text-slate-500 dark:hover:text-white\",\"aria-label\":\"GitHub\",\"children\":[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-github h-5 w-5\",\"children\":[[\"$\",\"path\",\"tonef\",{\"d\":\"M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4\"}],[\"$\",\"path\",\"9comsn\",{\"d\":\"M9 18c-4.51 2-5-2-7-2\"}],\"$undefined\"]}]}]]}]]}]}]}]]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[null,\"$Ld\"],\"globalErrorComponent\":\"$e\",\"missingSlots\":\"$Wf\"}]\n"])</script><script>self.__next_f.push([1,"d:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"name\":\"theme-color\",\"media\":\"(prefers-color-scheme: light)\",\"content\":\"#0f172a\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"media\":\"(prefers-color-scheme: dark)\",\"content\":\"#020617\"}],[\"$\",\"meta\",\"3\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"4\",{\"children\":\"API | Agent Shaker\"}],[\"$\",\"meta\",\"5\",{\"name\":\"description\",\"content\":\"Documentation: API\"}],[\"$\",\"meta\",\"6\",{\"name\":\"author\",\"content\":\"Agent Shaker Team\"}],[\"$\",\"meta\",\"7\",{\"name\":\"keywords\",\"content\":\"Agent Shaker,AI agents,MCP,Model Context Protocol,A2A,task coordination,documentation\"}],[\"$\",\"meta\",\"8\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:title\",\"content\":\"API\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:description\",\"content\":\"Documentation: API\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"$\",\"meta\",\"12\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"13\",{\"name\":\"twitter:title\",\"content\":\"Agent Shaker — AI coordination platform\"}],[\"$\",\"meta\",\"14\",{\"name\":\"twitter:description\",\"content\":\"Task coordination for teams of AI agents. Register agents, assign them real work, and let them coordinate through MCP.\"}],[\"$\",\"meta\",\"15\",{\"name\":\"twitter:image\",\"content\":\"https://techbuzzz.github.io/agent-shaker/social-preview.png\"}],[\"$\",\"link\",\"16\",{\"rel\":\"icon\",\"href\":\"/agent-shaker/icon.svg\",\"type\":\"image/svg+xml\"}],[\"$\",\"link\",\"17\",{\"rel\":\"icon\",\"href\":\"/agent-shaker/favicon-32x32.png\",\"sizes\":\"32x32\",\"type\":\"image/png\"}],[\"$\",\"link\",\"18\",{\"rel\":\"icon\",\"href\":\"/agent-shaker/favicon-16x16.png\",\"sizes\":\"16x16\",\"type\":\"image/png\"}],[\"$\",\"link\",\"19\",{\"rel\":\"icon\",\"href\":\"/agent-shaker/favicon.ico\",\"sizes\":\"any\",\"type\":\"image/x-icon\"}],[\"$\",\"link\",\"20\",{\"rel\":\"apple-touch-icon\",\"href\":\"/agent-shaker/apple-touch-icon.png\",\"sizes\":\"180x180\",\"type\":\"image/png\"}],[\"$\",\"meta\",\"21\",{\"name\":\"next-size-adjust\"}]]\n5:null\n"])</script></body></html>