{"id":"4a35cdec-2b2d-4866-8cde-9b734e5692ac","entityType":"agent","slug":"clawhub-skills-2manslkh-line-client","name":"line-client","canonicalUrl":"https://www.xpersona.co/agent/clawhub-skills-2manslkh-line-client","canonicalPath":"/agent/clawhub-skills-2manslkh-line-client","generatedAt":"2026-10-09T22:13:23.690Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"description":"LINE messaging integration via Chrome extension gateway. Send/read LINE messages, manage contacts, groups, profile, and reactions. Authenticate with QR code login. Provides HMAC-signed API access through the Chrome extension gateway (line-chrome-gw.line-apps.com). --- name: line-client description: LINE messaging integration via Chrome extension gateway. Send/read LINE messages, manage contacts, groups, profile, and reactions. Authenticate with QR code login. Provides HMAC-signed API access through the Chrome extension gateway (line-chrome-gw.line-apps.com). --- LINE Client Skill Full LINE messaging client via the Chrome extension gateway JSON API. Repo & Files - **Repo:** /da","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. Last updated 4/15/2026.","installCommand":"clawhub skill install skills:2manslkh:line-client","sourceUrl":"https://github.com/openclaw/skills/tree/main/skills/2manslkh/line-client","homepage":null,"primaryLinks":[{"label":"View on ClawHub","url":"https://github.com/openclaw/skills/tree/main/skills/2manslkh/line-client","kind":"source"}],"safetyScore":84,"overallRank":62,"popularityScore":50,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"LINE messaging integration via Chrome extension gateway. Send/read LINE messages, manage contacts, groups, profile, and reactions. Authenticate with QR code log"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[{"label":"qr","status":"self-declared"},{"label":"replies","status":"self-declared"}],"verifiedCount":0,"selfDeclaredCount":3,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"},{"key":"qr","type":"capability","support":"supported","confidenceSource":"profile","notes":"Declared in agent profile metadata"},{"key":"replies","type":"capability","support":"supported","confidenceSource":"profile","notes":"Declared in agent profile metadata"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile capability:qr|supported|profile capability:replies|supported|profile"}},"adoption":{"evidence":{"source":"no-adoption-signals","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"No source adoption metrics were available."},"stars":null,"forks":null,"downloads":null,"packageName":null,"latestVersion":null,"tractionLabel":null},"release":{"evidence":{"source":"agent-index","verified":false,"confidence":"medium","updatedAt":"2026-02-25T05:53:26.782Z","emptyReason":null},"lastUpdatedAt":"2026-04-15T00:45:39.800Z","lastCrawledAt":"2026-02-25T05:53:26.782Z","lastIndexedAt":null,"nextCrawlAt":"2026-02-26T05:53:26.782Z","lastVerifiedAt":null,"highlights":[]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install skills:2manslkh:line-client","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T22:13:23.689Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"readme":"---\nname: line-client\ndescription: LINE messaging integration via Chrome extension gateway. Send/read LINE messages, manage contacts, groups, profile, and reactions. Authenticate with QR code login. Provides HMAC-signed API access through the Chrome extension gateway (line-chrome-gw.line-apps.com).\n---\n\n# LINE Client Skill\n\nFull LINE messaging client via the Chrome extension gateway JSON API.\n\n## Repo & Files\n\n- **Repo:** `/data/workspace/line-client` ([github.com/2manslkh/line-api](https://github.com/2manslkh/line-api))\n- **Main client:** `src/chrome_client.py` → `LineChromeClient`\n- **QR login:** `src/auth/qr_login.py` → `QRLogin`\n- **HMAC signer:** `src/hmac/signer.js` (Node.js, auto-starts on port 18944)\n- **Token storage:** `~/.line-client/tokens.json`\n- **Certificate cache:** `~/.line-client/sqr_cert`\n- **WASM files:** `lstm.wasm` + `lstmSandbox.js` (required, in repo root)\n\n## Quick Start\n\n```python\nimport json\nfrom pathlib import Path\nfrom src.chrome_client import LineChromeClient\n\ntokens = json.loads((Path.home() / \".line-client\" / \"tokens.json\").read_text())\nclient = LineChromeClient(auth_token=tokens[\"auth_token\"])\n\n# Send a message\nclient.send_message(\"U...\", \"Hello!\")\n\n# Get profile\nprofile = client.get_profile()\n```\n\nTokens expire in ~7 days. If expired (`APIError(10051)`), re-run QR login.\n\n## QR Login (Authentication)\n\nQR login requires user interaction: scan QR on phone + enter PIN.\n\n```python\nfrom src.hmac import HmacSigner\nfrom src.auth.qr_login import QRLogin\nimport qrcode\n\nsigner = HmacSigner(mode=\"server\")\nlogin = QRLogin(signer)\nresult = login.run(\n    on_qr=lambda url: send_qr_image_to_user(qrcode.make(url)),\n    on_pin=lambda pin: send_pin_to_user_IMMEDIATELY(pin),  # TIME SENSITIVE!\n    on_status=lambda msg: print(msg),\n)\n# result.auth_token, result.mid, result.refresh_token\n```\n\n**Critical:** The PIN must reach the user within ~60 seconds. Send it the instant `on_pin` fires.\n\n### QR Login State Machine\n1. `createSession` → session ID\n2. `createQrCode` → callback URL (append `?secret={curve25519_pubkey}&e2eeVersion=1`)\n3. `checkQrCodeVerified` — poll until scan (uses `X-Line-Session-ID`, no `origin` header)\n4. **`verifyCertificate`** — MUST be called even if it fails (required state transition!)\n5. `createPinCode` → 6-digit PIN (skip if cert verified in step 4)\n6. `checkPinCodeVerified` — poll until user enters PIN\n7. `qrCodeLoginV2` → JWT token + certificate + refresh token\n\n### Server-Side Login Script\n```bash\npython scripts/qr_login_server.py /tmp/qr.png\n```\nEmits JSON events on stdout: `{\"event\": \"qr\", \"path\": \"...\", \"url\": \"...\"}`, `{\"event\": \"pin\", \"pin\": \"123456\"}`, `{\"event\": \"done\", \"mid\": \"U...\"}`.\n\n## All API Methods\n\n### Contacts & Friends\n\n| Method | Args | Description |\n|--------|------|-------------|\n| `get_profile()` | — | Get your own profile (displayName, mid, statusMessage, etc.) |\n| `get_contact(mid)` | mid: str | Get a single contact's profile |\n| `get_contacts(mids)` | mids: list[str] | Get multiple contacts |\n| `get_all_contact_ids()` | — | List all friend MIDs |\n| `find_contact_by_userid(userid)` | userid: str | Search by LINE ID |\n| `find_and_add_contact_by_mid(mid)` | mid: str | Add friend by MID |\n| `find_contacts_by_phone(phones)` | phones: list[str] | Search by phone numbers |\n| `add_friend_by_mid(mid)` | mid: str | Add friend (RelationService) |\n| `get_blocked_contact_ids()` | — | List blocked MIDs |\n| `get_blocked_recommendation_ids()` | — | List blocked recommendations |\n| `block_contact(mid)` | mid: str | Block a contact |\n| `unblock_contact(mid)` | mid: str | Unblock a contact |\n| `block_recommendation(mid)` | mid: str | Block a friend suggestion |\n| `update_contact_setting(mid, flag, value)` | mid, flag: int, value: str | Update contact setting (e.g. mute) |\n| `get_favorite_mids()` | — | List favorited contact MIDs |\n| `get_recommendation_ids()` | — | List friend suggestions |\n\n### Messages\n\n| Method | Args | Description |\n|--------|------|-------------|\n| `send_message(to, text, ...)` | to: str, text: str, reply_to: str (opt) | Send a text message. Supports replies via `reply_to=message_id` |\n| `unsend_message(message_id)` | message_id: str | Unsend/delete a sent message |\n| `get_recent_messages(chat_id, count=50)` | chat_id: str | Get latest messages in a chat |\n| `get_previous_messages(chat_id, end_seq, count=50)` | chat_id, end_seq: int | Paginated history (older messages) |\n| `get_messages_by_ids(message_ids)` | message_ids: list[str] | Fetch specific messages |\n| `get_message_boxes(count=50)` | — | Get chat list with last message (inbox view) |\n| `get_message_boxes_by_ids(chat_ids)` | chat_ids: list[str] | Get specific chats with last message |\n| `get_message_read_range(chat_ids)` | chat_ids: list[str] | Get read receipt info |\n| `send_chat_checked(chat_id, last_message_id)` | chat_id, last_message_id: str | Mark messages as read |\n| `send_chat_removed(chat_id, last_message_id)` | chat_id, last_message_id: str | Remove chat from inbox |\n| `send_postback(to, postback_data)` | to, postback_data: str | Send postback (bot interactions) |\n\n### Chats & Groups\n\n| Method | Args | Description |\n|--------|------|-------------|\n| `get_chats(chat_ids, with_members=True, with_invitees=True)` | chat_ids: list[str] | Get chat/group details |\n| `get_all_chat_mids()` | — | List all chat MIDs (groups + invites) |\n| `create_chat(name, target_mids)` | name: str, target_mids: list[str] | Create a new group chat |\n| `accept_chat_invitation(chat_id)` | chat_id: str | Accept group invite |\n| `reject_chat_invitation(chat_id)` | chat_id: str | Reject group invite |\n| `invite_into_chat(chat_id, mids)` | chat_id: str, mids: list[str] | Invite users to group |\n| `cancel_chat_invitation(chat_id, mids)` | chat_id: str, mids: list[str] | Cancel pending invites |\n| `delete_other_from_chat(chat_id, mids)` | chat_id: str, mids: list[str] | Kick members from group |\n| `leave_chat(chat_id)` | chat_id: str | Leave a group chat |\n| `update_chat(chat_id, updates)` | chat_id: str, updates: dict | Update group name/settings |\n| `set_chat_hidden_status(chat_id, hidden)` | chat_id: str, hidden: bool | Archive/unarchive a chat |\n| `get_rooms(room_ids)` | room_ids: list[str] | Get legacy room info |\n| `invite_into_room(room_id, mids)` | room_id: str, mids: list[str] | Invite to legacy room |\n| `leave_room(room_id)` | room_id: str | Leave legacy room |\n\n### Reactions\n\n| Method | Args | Description |\n|--------|------|-------------|\n| `react(message_id, reaction_type)` | message_id: str, type: int | React to a message. Types: 2=like, 3=love, 4=laugh, 5=surprised, 6=sad, 7=angry |\n| `cancel_reaction(message_id)` | message_id: str | Remove your reaction |\n\n### Profile & Settings\n\n| Method | Args | Description |\n|--------|------|-------------|\n| `update_profile_attributes(attr, value, meta={})` | attr: int, value: str | Update profile. Attrs: 2=DISPLAY_NAME, 16=STATUS_MESSAGE, 4=PICTURE_STATUS |\n| `update_status_message(message)` | message: str | Shortcut: update status message |\n| `update_display_name(name)` | name: str | Shortcut: update display name |\n| `get_settings()` | — | Get all account settings |\n| `get_settings_attributes(attr_bitset)` | attr_bitset: int | Get specific settings |\n| `update_settings_attributes(attr_bitset, settings)` | attr_bitset: int, settings: dict | Update settings |\n\n### Polling & Events\n\n| Method | Args | Description |\n|--------|------|-------------|\n| `get_last_op_revision()` | — | Get latest operation revision number |\n| `fetch_ops(count=50)` | — | Fetch pending operations (may long-poll) |\n| `poll()` | — | Generator yielding operations as they arrive |\n| `on_message(handler)` | handler: Callable(msg, client) | Start polling thread, calls handler on new messages. Op types: 26=SEND_MESSAGE, 27=RECEIVE_MESSAGE |\n| `stop()` | — | Stop the polling thread |\n\n### Other Services\n\n| Method | Args | Description |\n|--------|------|-------------|\n| `get_server_time()` | — | Get LINE server timestamp |\n| `get_configurations()` | — | Get server configurations |\n| `get_rsa_key_info()` | — | Get RSA key for auth |\n| `issue_channel_token(channel_id)` | channel_id: str | Issue channel token (LINE Login/LIFF) |\n| `get_buddy_detail(mid)` | mid: str | Get official account info |\n| `report_abuse(mid, category=0, reason=\"\")` | mid: str | Report a user |\n| `add_friend_by_mid(mid)` | mid: str | Add friend (RelationService) |\n| `logout()` | — | Logout and invalidate token |\n\n## MID Format\n\nLINE identifies entities by MID:\n- `U...` or `u...` → User (toType=0)\n- `C...` or `c...` → Group chat (toType=2)\n- `R...` or `r...` → Room (toType=1)\n\nThe client auto-detects `toType` from the MID prefix when sending messages.\n\n## HMAC Signing\n\nAll API calls require `X-Hmac` header. The WASM signer handles this automatically:\n- Derives key from version \"3.7.1\" + access token via proprietary KDF (in lstm.wasm)\n- Signs `path + body` → base64 → `X-Hmac`\n- Server mode: ~13ms/sign (Node.js HTTP server on port 18944, auto-started)\n- Subprocess mode: ~2s/sign (fallback)\n\n## Error Handling\n\n```python\nfrom src.chrome_client import APIError\n\ntry:\n    client.send_message(mid, \"test\")\nexcept APIError as e:\n    print(e.code, e.api_message)\n    # 10051 = session expired / invalid\n    # 10052 = HTTP error from backend\n    # 10102 = invalid arguments\n```\n\n## Architecture\n\n```\nUser's Phone (LINE app)\n    ↕ (scan QR / enter PIN)\nLINE Servers (line-chrome-gw.line-apps.com)\n    ↕ (JSON REST + X-Hmac signing)\nLineChromeClient (this repo)\n    ↕ (WASM HMAC via Node.js signer)\nlstm.wasm + lstmSandbox.js\n```\n\nThe Chrome Gateway translates JSON ↔ Thrift internally. We never deal with Thrift binary — everything is clean JSON.\n","readmeExcerpt":"--- name: line-client description: LINE messaging integration via Chrome extension gateway. Send/read LINE messages, manage contacts, groups, profile, and reactions. Authenticate with QR code login. Provides HMAC-signed API access through the Chrome extension gateway (line-chrome-gw.line-apps.com). --- LINE Client Skill Full LINE messaging client via the Chrome extension gateway JSON API. Repo & Files - **Repo:** /da","codeSnippets":[],"executableExamples":[{"language":"python","snippet":"import json\nfrom pathlib import Path\nfrom src.chrome_client import LineChromeClient\n\ntokens = json.loads((Path.home() / \".line-client\" / \"tokens.json\").read_text())\nclient = LineChromeClient(auth_token=tokens[\"auth_token\"])\n\n# Send a message\nclient.send_message(\"U...\", \"Hello!\")\n\n# Get profile\nprofile = client.get_profile()"},{"language":"python","snippet":"from src.hmac import HmacSigner\nfrom src.auth.qr_login import QRLogin\nimport qrcode\n\nsigner = HmacSigner(mode=\"server\")\nlogin = QRLogin(signer)\nresult = login.run(\n    on_qr=lambda url: send_qr_image_to_user(qrcode.make(url)),\n    on_pin=lambda pin: send_pin_to_user_IMMEDIATELY(pin),  # TIME SENSITIVE!\n    on_status=lambda msg: print(msg),\n)\n# result.auth_token, result.mid, result.refresh_token"},{"language":"bash","snippet":"python scripts/qr_login_server.py /tmp/qr.png"},{"language":"python","snippet":"from src.chrome_client import APIError\n\ntry:\n    client.send_message(mid, \"test\")\nexcept APIError as e:\n    print(e.code, e.api_message)\n    # 10051 = session expired / invalid\n    # 10052 = HTTP error from backend\n    # 10102 = invalid arguments"},{"language":"text","snippet":"User's Phone (LINE app)\n    ↕ (scan QR / enter PIN)\nLINE Servers (line-chrome-gw.line-apps.com)\n    ↕ (JSON REST + X-Hmac signing)\nLineChromeClient (this repo)\n    ↕ (WASM HMAC via Node.js signer)\nlstm.wasm + lstmSandbox.js"}],"parameters":{},"dependencies":[],"permissions":[],"extractedFiles":[],"languages":["typescript"],"docsSourceLabel":"CLAWHUB","editorialOverview":"LINE messaging integration via Chrome extension gateway. Send/read LINE messages, manage contacts, groups, profile, and reactions. Authenticate with QR code login. Provides HMAC-signed API access through the Chrome extension gateway (line-chrome-gw.line-apps.com). --- name: line-client description: LINE messaging integration via Chrome extension gateway. Send/read LINE messages, manage contacts, groups, profile, and reactions. Authenticate with QR code login. Provides HMAC-signed API access through the Chrome extension gateway (line-chrome-gw.line-apps.com). --- LINE Client Skill Full LINE messaging client via the Chrome extension gateway JSON API. Repo & Files - **Repo:** /da","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":399,"uniquenessScore":61,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T22:13:23.690Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}