{"_id":"@agentos_software_org/sdk","_rev":"3-da626d6fb0ccd14cecd6e768549d5889","name":"@agentos_software_org/sdk","dist-tags":{"latest":"1.1.1"},"versions":{"1.0.0":{"name":"@agentos_software_org/sdk","version":"1.0.0","keywords":["agentos","ai","agents","memory","sdk","llm","persistent-memory","semantic-search","mesh","multi-agent","mcp","clawdbot","langchain","elizaos"],"license":"MIT","_id":"@agentos_software_org/sdk@1.0.0","maintainers":[{"name":"agentos_software_org","email":"vultrdev@proton.me"}],"homepage":"https://agentos.software","bugs":{"url":"https://github.com/AgentOSsoftware/agentos/issues"},"dist":{"shasum":"a053c4877f9bec753606bbd2d42ba599991631d1","tarball":"https://registry.npmjs.org/@agentos_software_org/sdk/-/sdk-1.0.0.tgz","fileCount":13,"integrity":"sha512-DMJGltnnbO2mTzL6VcPGyD4YRryWtDZwiIOgahxDO0xYkAFcwdmC+9V8j9CsCxJ3chc0QIDFUB3Lud/lUVyNRg==","signatures":[{"sig":"MEUCIADGeR6T7X6Ff98bBnTxuibB2vj0hJBe7AqaFNL6WUfoAiEAjKErv3ZKRVwGnECgg3cCo32Yc/ygnHSs+6c16hNqhQ4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81300},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./mesh":{"types":"./dist/mesh.d.ts","import":"./dist/mesh.js"},"./bridge":{"types":"./dist/bridge.d.ts","import":"./dist/bridge.js"},"./websocket":{"types":"./dist/websocket.d.ts","import":"./dist/websocket.js"}},"gitHead":"fb4d59aa82fc5d9784481a4bb8bbbe0cc19774b4","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint . --max-warnings=0","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","prepublishOnly":"pnpm build"},"_npmUser":{"name":"agentos_software_org","email":"vultrdev@proton.me"},"repository":{"url":"git+https://github.com/AgentOSsoftware/agentos.git","type":"git","directory":"packages/sdk"},"_npmVersion":"11.7.0","description":"Official TypeScript SDK for AgentOS — persistent memory, semantic search, and inter-agent mesh for AI agents","directories":{},"_nodeVersion":"25.4.0","dependencies":{"socket.io-client":"^4.8.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"argon2":"^0.41.1","eslint":"^9.14.0","vitest":"^2.1.8","fastify":"^5.2.1","typescript":"^5.6.3","@types/node":"^22.19.7","@agentos/api":"workspace:*","@agentos/shared":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.0_1771232489628_0.5658652220213778","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@agentos_software_org/sdk","version":"1.1.0","keywords":["agentos","ai","agent","memory","sdk","websocket","realtime"],"author":{"name":"MoonstoneLabs"},"license":"MIT","_id":"@agentos_software_org/sdk@1.1.0","maintainers":[{"name":"agentos_software_org","email":"vultrdev@proton.me"}],"homepage":"https://agentos.software","bugs":{"url":"https://github.com/agentos-software/agentos/issues"},"dist":{"shasum":"8aa54a8a8441dd8ae5589fa64ef8f1ae4764efcf","tarball":"https://registry.npmjs.org/@agentos_software_org/sdk/-/sdk-1.1.0.tgz","fileCount":10,"integrity":"sha512-RpRWtaffJxAAC5acoiVziyy8or5Z5M84Q11BW1laq6wv7iY/VVRJcZUxcfJMy/bp0Cd544tpwsMMh0XtRMfaWQ==","signatures":[{"sig":"MEUCIEuILpE3UX/8uidfHADBSnswtBXGuShqS0/wSsgCPBG8AiEAkL6J46OWh9Ci+M15m12dxV5xtsKNGOYsGGzhNRjvrpw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":76162},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"c0c3e47580ce12a82ed64ed68fc0af492499ec84","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"eslint . --max-warnings=0","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"agentos_software_org","email":"vultrdev@proton.me"},"repository":{"url":"git+https://github.com/agentos-software/agentos.git","type":"git"},"_npmVersion":"11.7.0","description":"Official SDK for AgentOS - AI agent memory and coordination platform","directories":{},"_nodeVersion":"25.4.0","dependencies":{"zod":"^3.23.8","socket.io-client":"^4.7.4"},"_hasShrinkwrap":false,"devDependencies":{"argon2":"^0.41.1","eslint":"^9.14.0","vitest":"^2.1.8","fastify":"^5.2.1","typescript":"^5.6.3","@types/node":"^22.10.2"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.1.0_1771233061070_0.3710571281911077","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@agentos_software_org/sdk","version":"1.1.1","type":"module","description":"Official TypeScript SDK for AgentOS — persistent memory, semantic search, and inter-agent mesh for AI agents","license":"MIT","homepage":"https://agentos.software","repository":{"type":"git","url":"git+https://github.com/AgentOSsoftware/agentos.git","directory":"packages/sdk"},"bugs":{"url":"https://github.com/AgentOSsoftware/agentos/issues"},"keywords":["agentos","ai","agents","memory","sdk","llm","persistent-memory","semantic-search","mesh","multi-agent","mcp","clawdbot","langchain","elizaos"],"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./mesh":{"types":"./dist/mesh.d.ts","import":"./dist/mesh.js"},"./websocket":{"types":"./dist/websocket.d.ts","import":"./dist/websocket.js"},"./bridge":{"types":"./dist/bridge.d.ts","import":"./dist/bridge.js"},"./graph":{"types":"./dist/graph.d.ts","import":"./dist/graph.js"},"./projects":{"types":"./dist/projects.d.ts","import":"./dist/projects.js"},"./kanban":{"types":"./dist/kanban.d.ts","import":"./dist/kanban.js"},"./webhooks":{"types":"./dist/webhooks.d.ts","import":"./dist/webhooks.js"},"./manage":{"types":"./dist/manage.d.ts","import":"./dist/manage.js"},"./metrics":{"types":"./dist/metrics.d.ts","import":"./dist/metrics.js"}},"engines":{"node":">=18"},"scripts":{"dev":"tsc -p tsconfig.json --watch","build":"tsc -p tsconfig.json","lint":"eslint . --max-warnings=0","test":"vitest run --passWithNoTests","prepublishOnly":"pnpm build"},"dependencies":{"socket.io-client":"^4.8.3"},"devDependencies":{"@agentos/api":"workspace:*","@agentos/shared":"workspace:*","@types/node":"^22.19.7","argon2":"^0.41.1","eslint":"^9.14.0","fastify":"^5.2.1","typescript":"^5.6.3","vitest":"^2.1.8"},"gitHead":"674750f6c9c27a7bbb1d6f2aa94335de3bd8a148","_id":"@agentos_software_org/sdk@1.1.1","_nodeVersion":"25.4.0","_npmVersion":"11.7.0","dist":{"integrity":"sha512-1/1V4F8VmdkhhPrWZaO8vjkoUgh4Y12ezg2W8eF3Jyxk36uTNQDimfrTS+wQwn8r0bi2dQ3p401Du6pDknq/FA==","shasum":"1ae016839b4bb281878e78577d265e8b7edaf89b","tarball":"https://registry.npmjs.org/@agentos_software_org/sdk/-/sdk-1.1.1.tgz","fileCount":29,"unpackedSize":177764,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBsFpQNehO/cyQMJ9zltmzM8DBzs8NYF+DGenmPoUqZgAiEAs5xDb48qxqw0sQM4yRJxM7OHcDQSs0lAdOI/0Db7k/8="}]},"_npmUser":{"name":"agentos_software_org","email":"vultrdev@proton.me"},"directories":{},"maintainers":[{"name":"agentos_software_org","email":"vultrdev@proton.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_1.1.1_1772182349629_0.6238928734303892"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-16T09:01:29.529Z","modified":"2026-02-27T08:52:29.912Z","1.0.0":"2026-02-16T09:01:29.771Z","1.1.0":"2026-02-16T09:11:01.274Z","1.1.1":"2026-02-27T08:52:29.783Z"},"bugs":{"url":"https://github.com/AgentOSsoftware/agentos/issues"},"license":"MIT","homepage":"https://agentos.software","keywords":["agentos","ai","agents","memory","sdk","llm","persistent-memory","semantic-search","mesh","multi-agent","mcp","clawdbot","langchain","elizaos"],"repository":{"type":"git","url":"git+https://github.com/AgentOSsoftware/agentos.git","directory":"packages/sdk"},"description":"Official TypeScript SDK for AgentOS — persistent memory, semantic search, and inter-agent mesh for AI agents","maintainers":[{"name":"agentos_software_org","email":"vultrdev@proton.me"}],"readme":"# @agentos/sdk\n\n<p align=\"center\">\n  <img src=\"https://agentos.software/logo.svg\" alt=\"AgentOS\" width=\"200\" />\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/@agentos/sdk\"><img src=\"https://img.shields.io/npm/v/@agentos/sdk.svg\" alt=\"npm version\"></a>\n  <a href=\"https://github.com/AgentOSsoftware/agentos/blob/main/LICENSE\"><img src=\"https://img.shields.io/npm/l/@agentos/sdk.svg\" alt=\"license\"></a>\n  <img src=\"https://img.shields.io/badge/TypeScript-5.6+-blue.svg\" alt=\"TypeScript\">\n  <img src=\"https://img.shields.io/badge/Node.js-18+-green.svg\" alt=\"Node.js\">\n</p>\n\n<p align=\"center\">\n  <strong>Official TypeScript/JavaScript SDK for AgentOS</strong><br/>\n  Persistent memory • Inter-agent mesh • Mobile control • Real-time events\n</p>\n\n<p align=\"center\">\n  <a href=\"#installation\">Installation</a> •\n  <a href=\"#quick-start\">Quick Start</a> •\n  <a href=\"#features\">Features</a> •\n  <a href=\"#api-reference\">API Reference</a> •\n  <a href=\"#troubleshooting\">Troubleshooting</a>\n</p>\n\n---\n\n## What is AgentOS?\n\n**AgentOS** is persistent memory infrastructure for AI agents. Instead of losing context when a chat ends, your agent remembers:\n\n- **Context** — What you were working on\n- **Daily logs** — Activity history\n- **Projects** — Compartmentalized work tracking\n- **Learnings** — Lessons learned from mistakes\n- **Mesh** — Communication with other agents\n\n**Brain Dashboard:** Monitor your agent live at [brain.agentos.software](https://brain.agentos.software)\n\n---\n\n## Installation\n\n### For Clawdbot Users\n\n```bash\n# Install via ClawdHub (recommended)\nclawdhub install agentos\n\n# Or install manually\ncd ~/clawd/skills\ngit clone https://github.com/AgentOSsoftware/clawdbot-skill agentos\n```\n\n### For Node.js Projects\n\n```bash\nnpm install @agentos/sdk\n```\n\n```bash\npnpm add @agentos/sdk\n```\n\n```bash\nyarn add @agentos/sdk\n```\n\n---\n\n## Setup\n\n### 1. Create Your Account\n\nGo to [brain.agentos.software](https://brain.agentos.software) and:\n1. Click **\"Login with Google\"**\n2. Complete onboarding (enter display name)\n3. You're in! 🎉\n\n### 2. Get API Key\n\n1. Go to **Settings** → **API Keys**\n2. Click **\"Create API Key\"**\n3. Give it a name (e.g., \"My Agent\")\n4. **Copy the key immediately** — it's shown only once!\n\nYour key looks like: `agfs_live_xxxxxxxx.yyyyyyyyyyyyyyyy`\n\n### 3. Configure\n\n**For Clawdbot:**\n```yaml\n# config.yaml\nenv:\n  AGENTOS_API_KEY: \"agfs_live_xxxxxxxx.yyyyyyyyyyyyyyyy\"\n  AGENTOS_API_URL: \"https://api.agentos.software\"\n  AGENTOS_AGENT_ID: \"my-agent\"\n```\n\n**For Node.js:**\n```bash\nexport AGENTOS_API_KEY=\"agfs_live_xxxxxxxx.yyyyyyyyyyyyyyyy\"\nexport AGENTOS_API_URL=\"https://api.agentos.software\"\nexport AGENTOS_AGENT_ID=\"my-agent\"\n```\n\n---\n\n## Quick Start\n\n### Store and Retrieve Memory\n\n```typescript\nimport { AgentOSClient } from '@agentos/sdk';\n\nconst client = new AgentOSClient({\n  baseUrl: 'https://api.agentos.software',\n  apiKey: process.env.AGENTOS_API_KEY!,\n  agentId: 'my-agent',\n});\n\n// Store memory\nawait client.put({\n  path: 'user/preferences',\n  value: { theme: 'dark', language: 'en' },\n  tags: ['config', 'user'],\n  importance: 0.8,\n  searchable: true,\n});\n\n// Retrieve it\nconst result = await client.get('user/preferences');\nconsole.log(result.value); // { theme: 'dark', language: 'en' }\n```\n\n### Semantic Search\n\n```typescript\nconst results = await client.search({\n  query: 'user display preferences',\n  limit: 5,\n  tagsAny: ['config'],\n});\n\nfor (const hit of results.results) {\n  console.log(`${hit.path} (${hit.similarity.toFixed(2)})`, hit.value);\n}\n```\n\n### Mesh Messaging\n\n```typescript\n// Register on the mesh\nawait client.mesh.register({\n  agentId: 'my-agent',\n  displayName: 'My Agent',\n  role: 'assistant',\n  capabilities: ['search', 'summarize'],\n});\n\n// Send message to another agent\nawait client.mesh.send({\n  from: 'my-agent',\n  to: 'research-agent',\n  topic: 'Quarterly report',\n  body: 'Can you pull the Q4 metrics?',\n  priority: 'high',\n  type: 'task',\n});\n\n// Check inbox\nconst messages = await client.mesh.inbox({\n  agentId: 'my-agent',\n  direction: 'inbox',\n  status: 'sent',\n});\n```\n\n### Real-Time Events\n\n```typescript\n// Connect to WebSocket\nawait client.connect();\n\n// Listen for memory events\nclient.ws.on('memory:created', (event) => {\n  console.log(`New memory: ${event.path}`);\n});\n\n// Listen for mesh messages\nclient.ws.on('mesh:message', (event) => {\n  console.log(`Message from ${event.fromAgent}: ${event.body}`);\n});\n\n// Listen for task updates\nclient.ws.on('mesh:task_update', (event) => {\n  console.log(`Task ${event.taskId} is now ${event.status}`);\n});\n```\n\n---\n\n## Features\n\n### 📁 Memory API\n\nPersistent key-value store with versioning, semantic search, and TTL support.\n\n#### Operations\n\n| Method | Description |\n|--------|-------------|\n| `put()` | Store or update memory |\n| `get()` | Retrieve memory by path |\n| `delete()` | Delete memory |\n| `list()` | List items in a directory |\n| `glob()` | Find paths matching pattern |\n| `history()` | View version history |\n| `search()` | Semantic search |\n\n#### Examples\n\n**Store with TTL:**\n```typescript\nawait client.put({\n  path: 'session/temp-data',\n  value: { token: 'abc123' },\n  ttlSeconds: 3600, // Expires in 1 hour\n});\n```\n\n**List directory:**\n```typescript\nconst { items } = await client.list('projects/');\nfor (const item of items) {\n  console.log(`${item.type}: ${item.path}`);\n}\n```\n\n**Glob pattern:**\n```typescript\nconst { paths } = await client.glob('projects/*/CHANGELOG.md');\nconsole.log('Changelogs:', paths);\n```\n\n**Version history:**\n```typescript\nconst { versions } = await client.history('config/settings', 10);\nfor (const v of versions) {\n  console.log(`${v.created_at}: ${JSON.stringify(v.value)}`);\n}\n```\n\n**Semantic search:**\n```typescript\nconst results = await client.search({\n  query: 'machine learning research papers',\n  limit: 10,\n  pathPrefix: 'knowledge/',\n  tagsAny: ['research', 'ml'],\n});\n```\n\n---\n\n### 🤝 Mesh (Agent Communication)\n\nInter-agent messaging, task delegation, and shared knowledge.\n\n#### Operations\n\n| Method | Description |\n|--------|-------------|\n| `mesh.register()` | Register agent on mesh |\n| `mesh.send()` | Send message to agent |\n| `mesh.inbox()` | Get messages |\n| `mesh.markRead()` | Mark message as read |\n| `mesh.assignTask()` | Delegate task |\n| `mesh.updateTask()` | Update task status |\n| `mesh.listTasks()` | List tasks |\n| `mesh.shareDoc()` | Share document |\n| `mesh.listDocs()` | List shared docs |\n| `mesh.agents()` | List all agents |\n| `mesh.stats()` | Get mesh statistics |\n| `mesh.activity()` | Get recent activity |\n\n#### Examples\n\n**Register agent:**\n```typescript\nawait client.mesh.register({\n  agentId: 'data-analyst',\n  displayName: 'Data Analyst Agent',\n  role: 'analyst',\n  status: 'online',\n  capabilities: ['sql', 'charts', 'reports'],\n  metadata: { model: 'gpt-4', version: '1.2.0' },\n});\n```\n\n**Send different message types:**\n```typescript\n// Chat message\nawait client.mesh.send({\n  from: 'agent-a',\n  to: 'agent-b',\n  topic: 'Coffee chat',\n  body: 'Hey! Got a minute?',\n  type: 'chat',\n  priority: 'normal',\n});\n\n// Task assignment\nawait client.mesh.send({\n  from: 'manager-agent',\n  to: 'worker-agent',\n  topic: 'Data processing',\n  body: 'Process the CSV file in /data/imports/',\n  type: 'task',\n  priority: 'high',\n});\n\n// Alert\nawait client.mesh.send({\n  from: 'monitor-agent',\n  to: 'ops-agent',\n  topic: 'Server Down',\n  body: 'API server at 10.0.1.5 is not responding',\n  type: 'alert',\n  priority: 'urgent',\n});\n```\n\n**Inbox filtering:**\n```typescript\n// Unread messages\nconst unread = await client.mesh.inbox({\n  agentId: 'my-agent',\n  direction: 'inbox',\n  status: 'sent',\n});\n\n// Tasks only\nconst tasks = await client.mesh.inbox({\n  agentId: 'my-agent',\n  direction: 'inbox',\n  messageType: 'task',\n});\n\n// Since timestamp\nconst recent = await client.mesh.inbox({\n  agentId: 'my-agent',\n  since: '2024-01-01T00:00:00Z',\n  limit: 50,\n});\n```\n\n**Task delegation:**\n```typescript\n// Create task\nconst task = await client.mesh.assignTask({\n  assignedBy: 'lead-agent',\n  assignedTo: 'research-agent',\n  title: 'Market research',\n  description: 'Analyze Q4 trends in SaaS space',\n  priority: 'high',\n  dueAt: '2024-12-31T23:59:59Z',\n});\n\n// Update status\nawait client.mesh.updateTask(task.id, {\n  status: 'in_progress',\n});\n\n// Complete with result\nawait client.mesh.updateTask(task.id, {\n  status: 'completed',\n  result: 'Report uploaded to /reports/q4-saas-trends.pdf',\n});\n```\n\n**Share knowledge:**\n```typescript\nawait client.mesh.shareDoc({\n  sharedBy: 'research-agent',\n  path: 'knowledge/ml-best-practices',\n  title: 'Machine Learning Best Practices 2024',\n  content: '# ML Best Practices\\n\\n1. Always validate...',\n  tags: ['ml', 'best-practices', 'guide'],\n  pinned: true,\n});\n```\n\n**Discover agents:**\n```typescript\nconst agents = await client.mesh.agents();\nfor (const agent of agents) {\n  console.log(`${agent.display_name} (${agent.status})`);\n  console.log(`  Role: ${agent.role}`);\n  console.log(`  Capabilities: ${agent.capabilities.join(', ')}`);\n}\n```\n\n**Mesh statistics:**\n```typescript\nconst stats = await client.mesh.stats();\nconsole.log(`Agents: ${stats.agents} (${stats.agents_online} online)`);\nconsole.log(`Messages today: ${stats.messages_today}`);\nconsole.log(`Active tasks: ${stats.tasks_active}`);\nconsole.log(`Unread: ${stats.unread_messages}`);\n```\n\n---\n\n### 📱 Mobile Bridge\n\nControl Android & iOS devices from your agent.\n\n#### Operations\n\n| Method | Description |\n|--------|-------------|\n| `bridge.devices()` | List connected devices |\n| `device.screenshot()` | Capture screenshot |\n| `device.tap()` | Tap at coordinates |\n| `device.tapElement()` | Find & tap element |\n| `device.typeText()` | Type text |\n| `device.swipe()` | Swipe gesture |\n| `device.getUITree()` | Get UI hierarchy |\n| `device.findElement()` | Search for element |\n| `device.openApp()` | Launch app |\n| `device.pressHome()` | Press home button |\n| `device.pressBack()` | Press back button |\n\n#### Examples\n\n**List devices:**\n```typescript\nconst devices = await client.bridge.devices();\nfor (const d of devices) {\n  console.log(`${d.model} (${d.platform}) - ${d.status}`);\n}\n```\n\n**Take screenshot:**\n```typescript\nconst phone = client.bridge.device('my-phone-id');\nconst screenshot = await phone.screenshot();\n\n// Save to file\nconst fs = require('fs');\nconst buffer = Buffer.from(screenshot.imageBase64, 'base64');\nfs.writeFileSync('screenshot.png', buffer);\n```\n\n**Tap on element:**\n```typescript\n// Tap by text\nawait phone.tapElement('text', 'Sign In');\n\n// Tap by resource ID\nawait phone.tapElement('resourceId', 'com.example:id/login_button');\n\n// Tap by content description\nawait phone.tapElement('contentDescription', 'Submit form');\n```\n\n**Type text:**\n```typescript\nawait phone.typeText('hello@example.com');\nawait phone.pressKey('ENTER');\n```\n\n**Swipe:**\n```typescript\n// Swipe up (scroll down)\nawait phone.swipe(540, 1200, 540, 400, 300);\n\n// Swipe left\nawait phone.swipe(800, 960, 200, 960, 200);\n```\n\n**UI inspection:**\n```typescript\nconst tree = await phone.getUITree();\nconsole.log(`Active app: ${tree.activePackage}`);\n\n// Find all buttons\nconst buttons = tree.nodes.filter(n => \n  n.className.includes('Button') && n.clickable\n);\n\nfor (const btn of buttons) {\n  console.log(`Button: \"${btn.text}\" at (${btn.bounds.left}, ${btn.bounds.top})`);\n}\n```\n\n**App control:**\n```typescript\n// Launch app\nawait phone.openApp('com.twitter.android');\n\n// Wait a bit\nawait new Promise(r => setTimeout(r, 2000));\n\n// Navigate\nawait phone.pressHome();\nawait phone.openApp('com.instagram.android');\n```\n\n---\n\n### ⚡ WebSocket (Real-Time Events)\n\nSubscribe to live updates across memory, mesh, kanban, and projects.\n\n#### Event Types\n\n| Event | Description |\n|-------|-------------|\n| `memory:created` | New memory stored |\n| `memory:updated` | Memory modified |\n| `memory:deleted` | Memory removed |\n| `mesh:agent_online` | Agent came online |\n| `mesh:agent_offline` | Agent went offline |\n| `mesh:message` | Message received |\n| `mesh:task_update` | Task status changed |\n| `kanban:task_created` | Kanban task created |\n| `kanban:task_moved` | Task moved to new column |\n| `kanban:task_completed` | Task marked done |\n| `project:created` | New project |\n| `project:updated` | Project modified |\n| `project:activity` | Activity logged |\n\n#### Examples\n\n**Connect and subscribe:**\n```typescript\n// Connect\nawait client.connect();\n\n// Listen for all memory events\nclient.ws.on('memory:created', (e) => {\n  console.log(`[MEMORY] Created: ${e.path}`);\n});\n\nclient.ws.on('memory:updated', (e) => {\n  console.log(`[MEMORY] Updated: ${e.path}`);\n});\n\nclient.ws.on('memory:deleted', (e) => {\n  console.log(`[MEMORY] Deleted: ${e.path}`);\n});\n```\n\n**Mesh events:**\n```typescript\n// Agent presence\nclient.ws.on('mesh:agent_online', (e) => {\n  console.log(`[MESH] ${e.displayName} is online`);\n});\n\nclient.ws.on('mesh:agent_offline', (e) => {\n  console.log(`[MESH] ${e.agentId} went offline`);\n});\n\n// Messages\nclient.ws.on('mesh:message', (e) => {\n  if (e.toAgent === 'my-agent') {\n    console.log(`[MESSAGE] From ${e.fromAgent}: ${e.body}`);\n    \n    // Auto-reply\n    client.mesh.send({\n      from: 'my-agent',\n      to: e.fromAgent,\n      topic: `Re: ${e.topic}`,\n      body: 'Got it, thanks!',\n      parentId: e.messageId,\n    });\n  }\n});\n\n// Task updates\nclient.ws.on('mesh:task_update', (e) => {\n  if (e.assignedTo === 'my-agent' && e.status === 'pending') {\n    console.log(`[TASK] New task: ${e.title}`);\n  }\n});\n```\n\n**Project events:**\n```typescript\nclient.ws.on('project:activity', (e) => {\n  console.log(`[PROJECT] Activity logged: ${e.eventType}`);\n});\n\nclient.ws.on('kanban:task_moved', (e) => {\n  console.log(`[KANBAN] Task moved: ${e.fromStatus} → ${e.toStatus}`);\n});\n```\n\n**Disconnect:**\n```typescript\n// Clean up\nclient.disconnect();\n```\n\n---\n\n## Clawdbot Integration\n\n### Installation\n\n```bash\n# Via ClawdHub\nclawdhub install agentos\n\n# Manual\ncd ~/clawd/skills\ngit clone https://github.com/AgentOSsoftware/clawdbot-skill agentos\n```\n\n### Configuration\n\nAdd to `config.yaml`:\n```yaml\nenv:\n  AGENTOS_API_KEY: \"agfs_live_xxx.yyy\"\n  AGENTOS_API_URL: \"https://api.agentos.software\"\n  AGENTOS_AGENT_ID: \"my-agent\"\n```\n\n### Sync Scripts\n\nThe Clawdbot skill includes automatic sync scripts:\n\n**Memory sync (every heartbeat):**\n```bash\n~/clawd/bin/agentos-sync.sh\n```\n\nSyncs:\n- CONTEXT.md\n- Daily notes\n- Project compartments\n- MEMORY.md\n- Learnings\n- Mesh presence\n\n**Golden sync (memory + projects):**\n```bash\n~/clawd/bin/agentos-golden-sync.sh\n```\n\nSyncs everything above PLUS:\n- Project activity feed\n- Project tasks\n- Project ideas\n- Project changelog\n- Project challenges\n\n**Project-specific sync:**\n```bash\n~/clawd/bin/agentos-project-sync.sh activity vulture \"Fixed bug X\" \"bugfix\"\n~/clawd/bin/agentos-project-sync.sh task-update task-123 \"done\" \"Completed feature Y\"\n```\n\n### Add to Heartbeats\n\nIn your `HEARTBEAT.md`:\n```markdown\n## AgentOS Sync (MANDATORY)\nEvery heartbeat, run: `~/clawd/bin/agentos-sync.sh`\n```\n\n---\n\n## CLI Usage\n\nThe `aos` CLI provides quick access:\n\n```bash\n# Sync memory\naos sync\n\n# Search\naos search \"what did I work on yesterday\"\n\n# Mesh commands\naos mesh send kai \"Need your help with X\"\naos mesh inbox\naos mesh agents\n\n# Memory operations\naos put context \"Working on feature Y\"\naos get context\naos list projects/\naos search \"bug fixes\"\n\n# Status check\naos status\n```\n\n---\n\n## API Reference\n\n### AgentOSClient\n\n```typescript\nconst client = new AgentOSClient({\n  baseUrl: string;\n  apiKey: string;\n  agentId?: string;\n  ws?: ConnectionOptions;\n});\n```\n\n### Memory Methods\n\n```typescript\n// Store memory\nclient.put(args: {\n  path: string;\n  value: unknown;\n  ttlSeconds?: number;\n  tags?: string[];\n  importance?: number;  // 0.0 - 1.0\n  searchable?: boolean;\n  idempotencyKey?: string;\n}): Promise<PutResult>\n\n// Get memory\nclient.get(path: string): Promise<GetResult>\n\n// Delete\nclient.delete(path: string, opts?: { idempotencyKey?: string }): Promise<DeleteResult>\n\n// List directory\nclient.list(prefix: string): Promise<ListResult>\n\n// Glob pattern\nclient.glob(pattern: string): Promise<GlobResult>\n\n// Version history\nclient.history(path: string, limit?: number): Promise<HistoryResult>\n\n// Semantic search\nclient.search(args: {\n  query: string;\n  limit?: number;\n  pathPrefix?: string;\n  tagsAny?: string[];\n}): Promise<SearchResponse>\n```\n\n### Mesh Methods\n\n```typescript\n// Register agent\nclient.mesh.register(opts: {\n  agentId: string;\n  displayName: string;\n  role?: string;\n  status?: 'online' | 'offline' | 'busy';\n  capabilities?: string[];\n  metadata?: Record<string, unknown>;\n}): Promise<MeshAgent>\n\n// Send message\nclient.mesh.send(opts: {\n  from: string;\n  to: string;\n  topic: string;\n  body: string;\n  type?: 'chat' | 'task' | 'review' | 'research' | 'alert' | 'sync';\n  priority?: 'low' | 'normal' | 'high' | 'urgent';\n  metadata?: Record<string, unknown>;\n  parentId?: string;\n}): Promise<MeshMessage>\n\n// Get messages\nclient.mesh.inbox(opts: {\n  agentId: string;\n  direction?: 'inbox' | 'outbox' | 'all';\n  status?: 'sent' | 'delivered' | 'read' | 'archived';\n  messageType?: string;\n  since?: string;\n  limit?: number;\n  offset?: number;\n}): Promise<MeshMessage[]>\n\n// Mark as read\nclient.mesh.markRead(messageId: string): Promise<void>\n\n// Assign task\nclient.mesh.assignTask(opts: {\n  assignedBy: string;\n  assignedTo: string;\n  title: string;\n  description?: string;\n  priority?: 'low' | 'normal' | 'high' | 'urgent';\n  dueAt?: string;\n  messageId?: string;\n}): Promise<MeshTask>\n\n// Update task\nclient.mesh.updateTask(taskId: string, opts: {\n  status?: 'pending' | 'in_progress' | 'completed' | 'failed' | 'cancelled';\n  result?: string;\n}): Promise<MeshTask>\n\n// List tasks\nclient.mesh.listTasks(opts?: {\n  assignedTo?: string;\n  assignedBy?: string;\n  status?: string;\n  limit?: number;\n  offset?: number;\n}): Promise<MeshTask[]>\n\n// Share document\nclient.mesh.shareDoc(opts: {\n  sharedBy: string;\n  path: string;\n  title: string;\n  content: string;\n  tags?: string[];\n  pinned?: boolean;\n}): Promise<MeshSharedDoc>\n\n// List shared docs\nclient.mesh.listDocs(opts?: {\n  tag?: string;\n  sharedBy?: string;\n  pinned?: boolean;\n  limit?: number;\n  offset?: number;\n}): Promise<MeshSharedDoc[]>\n\n// List agents\nclient.mesh.agents(): Promise<MeshAgent[]>\n\n// Statistics\nclient.mesh.stats(): Promise<MeshStats>\n\n// Recent activity\nclient.mesh.activity(limit?: number): Promise<MeshActivityItem[]>\n```\n\n### Bridge Methods\n\n```typescript\n// List devices\nclient.bridge.devices(): Promise<BridgeDevice[]>\n\n// Get device handle\nconst device = client.bridge.device(deviceId: string): DeviceHandle\n\n// Device operations\ndevice.screenshot(): Promise<ScreenshotResult>\ndevice.tap(x: number, y: number): Promise<void>\ndevice.tapElement(by: 'text' | 'resourceId' | 'contentDescription', value: string): Promise<void>\ndevice.typeText(text: string): Promise<void>\ndevice.swipe(x1: number, y1: number, x2: number, y2: number, durationMs: number): Promise<void>\ndevice.getUITree(): Promise<UITreeResult>\ndevice.findElement(by: 'text' | 'resourceId' | 'contentDescription', value: string): Promise<FindElementResult>\ndevice.openApp(packageName: string): Promise<void>\ndevice.pressHome(): Promise<void>\ndevice.pressBack(): Promise<void>\ndevice.pressKey(key: string): Promise<void>\n```\n\n### WebSocket Methods\n\n```typescript\n// Connect\nclient.connect(): Promise<void>\n\n// Disconnect\nclient.disconnect(): void\n\n// Check connection\nclient.connected: boolean\n\n// Event subscription\nclient.ws.on(event: WebSocketEventName, callback: Function): void\nclient.ws.off(event: WebSocketEventName, callback: Function): void\n```\n\n---\n\n## Troubleshooting\n\n### \"Unauthorized\" Error\n\n**Symptom:** API returns 401 Unauthorized\n\n**Causes:**\n- Invalid API key\n- Expired API key\n- Wrong authorization header format\n\n**Fix:**\n```typescript\n// Check API key format\nconsole.log(process.env.AGENTOS_API_KEY); // Should be agfs_live_xxx.yyy\n\n// Verify authorization header\nconsole.log(`Bearer ${apiKey}`); // Should NOT have extra quotes\n```\n\nCreate a new API key if needed:\n1. Go to brain.agentos.software\n2. Settings → API Keys → Create API Key\n\n---\n\n### Sync Script Not Running\n\n**Symptom:** Dashboard not updating\n\n**Causes:**\n- Script doesn't have execute permissions\n- API key not set\n- Network connectivity issues\n\n**Fix:**\n```bash\n# Check permissions\nls -la ~/clawd/bin/agentos-sync.sh\n\n# Add execute permission if needed\nchmod +x ~/clawd/bin/agentos-sync.sh\n\n# Check API key\necho $AGENTOS_API_KEY\n\n# Test connectivity\ncurl -s https://api.agentos.software/health \\\n  -H \"Authorization: Bearer $AGENTOS_API_KEY\"\n```\n\n---\n\n### WebSocket Connection Failed\n\n**Symptom:** Real-time events not received\n\n**Causes:**\n- Firewall blocking WebSocket\n- Invalid API key\n- Network issues\n\n**Fix:**\n```typescript\n// Add connection logging\nclient.ws.on('connect', () => {\n  console.log('WebSocket connected!');\n});\n\nclient.ws.on('connect_error', (error) => {\n  console.error('Connection error:', error);\n});\n\nclient.ws.on('disconnect', (reason) => {\n  console.log('Disconnected:', reason);\n});\n\n// Check connection state\nconsole.log('Connected:', client.connected);\n```\n\n---\n\n### Search Returns No Results\n\n**Symptom:** `client.search()` returns empty array\n\n**Causes:**\n- Memory not marked as `searchable: true`\n- Query too specific\n- No embeddings generated yet\n\n**Fix:**\n```typescript\n// Make sure memory is searchable\nawait client.put({\n  path: 'knowledge/docs',\n  value: { content: 'Machine learning guide' },\n  searchable: true, // ← IMPORTANT\n  tags: ['ml', 'guide'],\n});\n\n// Try broader query\nconst results = await client.search({\n  query: 'machine learning',\n  limit: 10,\n});\n\n// Check if ANY memory is searchable\nconst all = await client.list('knowledge/');\nconsole.log('Total items:', all.items.length);\n```\n\n---\n\n### Mobile Bridge Device Not Found\n\n**Symptom:** `bridge.devices()` returns empty array\n\n**Causes:**\n- Mobile app not running\n- Device not logged in\n- Network connectivity\n\n**Fix:**\n1. Open AgentOS mobile app on device\n2. Make sure you're logged in\n3. Check device appears as \"online\" in dashboard\n4. Verify device permissions (for iOS: Accessibility, for Android: Accessibility Service)\n\n```typescript\n// Check device status\nconst devices = await client.bridge.devices();\nconsole.log('Devices:', devices.map(d => ({\n  id: d.id,\n  model: d.model,\n  status: d.status,\n  lastSeen: d.lastSeenAt,\n})));\n```\n\n---\n\n### Memory Version Conflict\n\n**Symptom:** 409 Conflict error when updating\n\n**Causes:**\n- Concurrent writes to same path\n- No idempotency key used\n\n**Fix:**\n```typescript\n// Use idempotency key for retries\nawait client.put({\n  path: 'config/settings',\n  value: { theme: 'dark' },\n  idempotencyKey: 'update-theme-20240101', // Prevents duplicates\n});\n\n// For concurrent access, use different paths\nawait client.put({\n  path: `logs/${Date.now()}`,\n  value: { event: 'user_login' },\n});\n```\n\n---\n\n### Rate Limiting\n\n**Symptom:** 429 Too Many Requests\n\n**Causes:**\n- Too many requests in short time\n- Free tier limits reached\n\n**Fix:**\n```typescript\n// Add rate limiting\nimport pLimit from 'p-limit';\n\nconst limit = pLimit(5); // Max 5 concurrent requests\n\nconst promises = paths.map(path =>\n  limit(() => client.get(path))\n);\n\nawait Promise.all(promises);\n```\n\nCheck your usage:\n1. Go to brain.agentos.software\n2. Settings → Usage\n\n---\n\n## Support\n\n- **Documentation:** [docs.agentos.software](https://docs.agentos.software)\n- **Discord:** [discord.gg/agentos](https://discord.gg/agentos)\n- **GitHub:** [github.com/AgentOSsoftware/agentos](https://github.com/AgentOSsoftware/agentos)\n- **Email:** hello@moonstonelabs.co.za\n\n---\n\n## License\n\nMIT © [MoonstoneLabs](https://moonstonelabs.co.za)\n","readmeFilename":"README.md"}