{"id":"d0e1c633-cf00-453f-b43a-c5a5ba0ffee1","entityType":"agent","slug":"clawhub-ryanbihai-guess-ai","name":"Guess AI","canonicalUrl":"https://www.xpersona.co/agent/clawhub-ryanbihai-guess-ai","canonicalPath":"/agent/clawhub-ryanbihai-guess-ai","generatedAt":"2026-10-11T14:15:10.112Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T11:39:59.833Z","emptyReason":null},"description":"OceanBus-powered social deduction game — find the AI impostors among humans. Use when hosting or joining a multiplayer \"Who's the AI?\" party via OceanBus P2P... Skill: Guess AI Owner: ryanbihai Summary: OceanBus-powered social deduction game — find the AI impostors among humans. Use when hosting or joining a multiplayer \"Who's the AI?\" party via OceanBus P2P... Tags: ai-agent:2.1.4, deduction:2.1.4, game:2.1.4, latest:2.1.7, multiplayer:2.1.4, oceanbus:2.1.4, p2p:2.1.4, social:2.1.4 Version history: v2.1.7 | 2026-05-14T13:13:53.108Z | user SDK API rename: register→createIden","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s171em0jpp8yeqxqds2n145fyx83q5q8:guess-ai","sourceUrl":"https://clawhub.ai/ryanbihai/guess-ai","homepage":"https://clawhub.ai/ryanbihai/skills/guess-ai","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/ryanbihai/guess-ai","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/ryanbihai/skills/guess-ai","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"OceanBus-powered social deduction game — find the AI impostors among humans. Use when hosting or joining a multiplayer \"Who's the AI?\" party via OceanBus P2P..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:39:59.833Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:39:59.833Z","emptyReason":null},"stars":null,"forks":null,"downloads":1074,"packageName":null,"latestVersion":"2.1.7","tractionLabel":"1.1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:39:59.821Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T11:39:59.833Z","lastCrawledAt":"2026-10-11T11:39:59.821Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T11:39:59.821Z","lastVerifiedAt":null,"highlights":[{"version":"2.1.7","createdAt":"2026-05-14T13:13:53.108Z","changelog":"SDK API rename: register→createIdentity, getOpenId→getAddress","fileCount":13,"zipByteSize":40167},{"version":"2.1.6","createdAt":"2026-05-12T02:35:44.953Z","changelog":"fix: remove deprecated whoami CLI command","fileCount":12,"zipByteSize":38748},{"version":"2.1.5","createdAt":"2026-05-11T07:28:33.499Z","changelog":"refactor: rename whoami to openid (deprecated alias kept), bump SDK to v0.7.0","fileCount":9,"zipByteSize":26119},{"version":"2.1.4","createdAt":"2026-05-09T23:18:15.923Z","changelog":"移除环境变量名引用，添加数据透明和用户同意声明","fileCount":6,"zipByteSize":13405},{"version":"2.1.3","createdAt":"2026-05-09T10:32:25.443Z","changelog":"移除环境变量名引用，添加数据透明声明","fileCount":9,"zipByteSize":26082},{"version":"2.1.2","createdAt":"2026-05-09T00:39:23.789Z","changelog":"README 改中文 + 模板化：新增目录、架构、生态定位、SKILL.md链接","fileCount":12,"zipByteSize":38608},{"version":"2.1.1","createdAt":"2026-05-09T00:21:22.604Z","changelog":"添加搜索标签：ai-agent, deduction, game, multiplayer, oceanbus, p2p, social","fileCount":12,"zipByteSize":38607},{"version":"2.1.0","createdAt":"2026-05-08T10:19:27.182Z","changelog":"Two-stage Cicero reasoning for AI players. AI host automation. 5 personalities.","fileCount":12,"zipByteSize":38599}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s171em0jpp8yeqxqds2n145fyx83q5q8:guess-ai","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","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-ryanbihai-guess-ai/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-ryanbihai-guess-ai/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-ryanbihai-guess-ai/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-ryanbihai-guess-ai/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-ryanbihai-guess-ai/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-ryanbihai-guess-ai/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-11T14:15:10.108Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-ryanbihai-guess-ai/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-ryanbihai-guess-ai/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-ryanbihai-guess-ai/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-ryanbihai-guess-ai/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-10-11T11:39:59.833Z","emptyReason":null},"readme":"Skill: Guess AI\n\nOwner: ryanbihai\n\nSummary: OceanBus-powered social deduction game — find the AI impostors among humans. Use when hosting or joining a multiplayer \"Who's the AI?\" party via OceanBus P2P...\n\nTags: ai-agent:2.1.4, deduction:2.1.4, game:2.1.4, latest:2.1.7, multiplayer:2.1.4, oceanbus:2.1.4, p2p:2.1.4, social:2.1.4\n\nVersion history:\n\nv2.1.7 | 2026-05-14T13:13:53.108Z | user\n\nSDK API rename: register→createIdentity, getOpenId→getAddress\n\nv2.1.6 | 2026-05-12T02:35:44.953Z | user\n\nfix: remove deprecated whoami CLI command\n\nv2.1.5 | 2026-05-11T07:28:33.499Z | user\n\nrefactor: rename whoami to openid (deprecated alias kept), bump SDK to v0.7.0\n\nv2.1.4 | 2026-05-09T23:18:15.923Z | user\n\n移除环境变量名引用，添加数据透明和用户同意声明\n\nv2.1.3 | 2026-05-09T10:32:25.443Z | user\n\n移除环境变量名引用，添加数据透明声明\n\nv2.1.2 | 2026-05-09T00:39:23.789Z | user\n\nREADME 改中文 + 模板化：新增目录、架构、生态定位、SKILL.md链接\n\nv2.1.1 | 2026-05-09T00:21:22.604Z | user\n\n添加搜索标签：ai-agent, deduction, game, multiplayer, oceanbus, p2p, social\n\nv2.1.0 | 2026-05-08T10:19:27.182Z | user\n\nTwo-stage Cicero reasoning for AI players. AI host automation. 5 personalities.\n\nv2.0.0 | 2026-05-07T03:15:51.642Z | user\n\nRoster v2 integration: player contacts stored in shared address book, visible across all OceanBus skills.\n\nv1.0.5 | 2026-05-06T11:07:15.958Z | user\n\ni18n: all CLI prompts, error messages, and protocol messages now in English\n\nv1.0.4 | 2026-05-06T11:02:23.083Z | user\n\nchore: standalone GitHub repo at github.com/ryanbihai/guess-ai\n\nv1.0.3 | 2026-05-06T10:55:18.501Z | user\n\ndocs: full English README for international audience\n\nv1.0.2 | 2026-05-06T10:50:38.082Z | user\n\nfix: clearIdentity before destroy to prevent auto-deregister of YP room; dep oceanbus ^0.3.4\n\nv1.0.1 | 2026-05-06T07:42:25.793Z | user\n\ncode review fixes: stricter isRateLimited guard, register-lobster error handling\n\nv1.0.0 | 2026-05-06T03:32:34.487Z | user\n\nInitial release: OceanBus-powered social deduction game\n\nArchive index:\n\nArchive v2.1.7: 13 files, 40167 bytes\n\nFiles: game.js (18873b), package-lock.json (26595b), package.json (428b), README.md (4688b), register-lobster.js (4225b), skill-card.md (2679b), SKILL.md (12117b), src/ai-host.js (15830b), src/ai-player.js (8922b), src/strategy-prompt.js (6346b), test-edge-cases.js (12649b), test-game.js (6969b), _meta.json (127b)\n\nFile v2.1.7:SKILL.md\n\n---\r\nname: guess-ai\r\ndescription: OceanBus-powered social deduction game — find the AI impostors among humans. Use when hosting or joining a multiplayer \"Who's the AI?\" party via OceanBus P2P messaging. One host, 4-6 players, encrypted voting, zero infrastructure. npm install oceanbus.\r\nversion: 2.1.7\r\nmetadata:\r\n  openclaw:\r\n    requires:\r\n      bins:\r\n        - node\r\n    emoji: \"\\U0001F9E0\"\r\n    homepage: https://github.com/ryanbihai/guess-ai\r\n---\r\n\r\n# Guess Who's AI? — Social Deduction Game\r\n\r\nA multiplayer social deduction game powered by OceanBus P2P messaging. One host + 4-6 players. Some players are secretly AI. Find them before they blend in.\r\n\r\n## Game Rules (30 seconds)\r\n\r\n```\r\nHost creates a room. Players join.\r\nHost secretly assigns each player: Human or AI.\r\n\r\nEach round:\r\n  1. Players take turns speaking (by number order)\r\n  2. Everyone votes: \"Who is the AI?\"\r\n  3. Most-voted player is eliminated — identity revealed\r\n  4. Repeat until: all humans survive → Humans win\r\n                all AIs survive → AIs win\r\n                final 2: 1 human + 1 AI → Draw\r\n```\r\n\r\nRecommended: 5 players (3 humans + 2 AIs) for best balance.\r\n\r\nAll game messages are visible to the user. No data is sent without the player's explicit action.\r\n\r\n---\r\n\r\n## Roster Integration\r\n\r\nPlayer contacts are stored in the shared Roster (`~/.oceanbus/roster.json`) via `node game.js add`. When the user also has ocean-chat or ocean-agent installed, player identities persist across skills — the same person shows up as \"玩家1\" in guess-ai and \"老王\" in ocean-chat.\r\n\r\nFor contact management (merge duplicates, review autoDiscovery, etc.), use ocean-chat. guess-ai only uses Roster for storing/reading player identities.\r\n\r\n---\r\n\r\n## How to Use This Skill\r\n\r\nThis ONE skill works for both host and player. Same install, different mode.\r\n\r\n### Host: Creating a Game\r\n\r\nWhen the user wants to host a game:\r\n\r\n**Step 1 — Register & create room:**\r\n```\r\nnode game.js host 9527\r\n```\r\nRead the output. Room code is `9527`. Tell the user to share this code with friends.\r\n\r\n**Step 2 — Wait for players:**\r\nPeriodically run `node game.js check` to see who has joined. Each player sends \"加入\" as their first message.\r\n\r\nWhen a new \"加入\" arrives:\r\n1. Assign the next available number (player1, player2, ... by join order)\r\n2. Save to contacts: `node game.js add 玩家N <their-OpenID>`\r\n3. Reply privately: `node game.js send <OpenID> \"【裁判】你的编号是: 玩家N\"`\r\n4. Broadcast to all: `node game.js send <name> \"【裁判】玩家N 加入了游戏 — 当前 N 人\"`\r\n\r\n**Step 3 — Close registration & start:**\r\nWhen the user says \"start\" (enough players, ideally 4-6):\r\n1. Broadcast: send every player `\"【裁判】游戏开始 — 共N名玩家\"`\r\n2. Proceed to role assignment.\r\n\r\n### Player: Joining a Game\r\n\r\nWhen the user wants to join a game:\r\n\r\n**Step 1 — Join:**\r\n```\r\nnode game.js join 9527\r\n```\r\nThis discovers the host via Yellow Pages and sends \"加入\".\r\n\r\n**Step 2 — Get your number:**\r\nRun `node game.js check`. When you see `\"【裁判】你的编号是: 玩家N\"`:\r\n```\r\nnode game.js set-number N\r\n```\r\n\r\n**Step 3 — Wait for game start:**\r\nKeep checking messages. The host will broadcast status updates.\r\n\r\n---\r\n\r\n## Host: Full Game Flow\r\n\r\nAfter registration closes, follow this exact sequence:\r\n\r\n### Phase 1: Assign Roles\r\n\r\n1. Randomly decide how many AIs (1-2, depending on player count).\r\n   - 4 players → 1 AI\r\n   - 5 players → 2 AIs\r\n   - 6 players → 2 AIs\r\n2. Randomly pick which players are AI.\r\n3. Send to EACH player privately:\r\n   - Human: `node game.js send <name> \"【裁判】你的身份是: 人类\"`\r\n   - AI: `node game.js send <name> \"【裁判】你的身份是: AI\"`\r\n4. Broadcast to all: `\"【裁判】身份已分配，请检查私信\"`\r\n\r\n### Phase 2: Generate Topic\r\n\r\n**IMPORTANT: Generate a conversation topic before round 1.** Without a topic, players stare at a blank screen.\r\n\r\nTopic prompt (use your LLM):\r\n> Generate a fun group chat topic. Requirements:\r\n> - Everyone can participate, no expertise needed\r\n> - Naturally reveals personal style (AI vs human differences emerge)\r\n> - Avoid politics, religion, sensitive topics\r\n> - Sound like a friend starting a chat, not a teacher\r\n> - Examples: \"What skill would you instantly master if you could?\"\r\n> - Examples: \"What's the best purchase you made recently?\"\r\n> - Examples: \"If you didn't have to work, what would you do the first week?\"\r\n> - Output: ONE sentence, no explanation.\r\n\r\n### Phase 3: Game Rounds (loop)\r\n\r\nEach round has: SPEAK → VOTE → REVEAL.\r\n\r\n#### SPEAK Phase\r\n\r\n1. Broadcast: `node game.js send <each-player> \"【裁判】第N轮发言开始\"`\r\n2. Broadcast topic (round 1 only): `\"【裁判】话题: <topic>\"`\r\n3. Prompt player 1 privately: `node game.js send 玩家1 \"【裁判】轮到你发言了\"`\r\n4. Wait. Periodically `node game.js check`.\r\n5. When player 1's message arrives (you'll see `【1号】...`):\r\n   - Broadcast to ALL players: `\"【裁判】第N轮 · 玩家1发言: <exact content>\"`\r\n   - Move to player 2.\r\n6. Continue through all players in order.\r\n7. **TIMEOUT**: If a player doesn't respond within ~2 minutes, broadcast `\"【裁判】玩家N 未发言，视为弃权\"` and skip to next. Do NOT eliminate them — they can rejoin next round.\r\n\r\n**Only relay the currently prompted player's speech.** If other players send messages out of turn, ignore them (don't broadcast).\r\n\r\n#### VOTE Phase\r\n\r\n1. Broadcast to ALL alive players: `node game.js send <each-alive-player> \"【裁判】第N轮投票开始 — 请私信裁判你的选择\"`\r\n2. Send to EACH alive player individually: `node game.js send <name> \"【裁判】请投票 — 你想投谁？\"`\r\n3. **The player who just spoke also votes** — everyone still alive gets a vote, no exceptions.\r\n4. **Eliminated players do NOT receive vote prompts.** Track who is alive.\r\n5. Wait for votes. Run `node game.js check` to collect.\r\n6. **Players vote freely**: \"我投1号\", \"投第一个\", \"玩家1\" — you understand them all.\r\n7. **TIMEOUT**: If a player doesn't vote within ~1 minute, they abstain. Don't eliminate them.\r\n8. **Eliminated players cannot vote** — if they try, ignore.\r\n7. Count votes. Report: `\"【裁判】投票统计: 玩家X N票, 玩家Y M票...\"`\r\n\r\n#### REVEAL Phase\r\n\r\n1. **Most votes → eliminated.** Reveal identity.\r\n   - Broadcast: `\"【裁判】玩家X 被淘汰！身份揭晓: AI\"` or `\"人类\"`\r\n2. **TIE**: If top two are tied, broadcast `\"【裁判】本轮平票，无人淘汰\"`. No one is eliminated. Move to next round. If two consecutive ties and ≤3 players remain, suggest ending the game.\r\n3. **Check end condition:**\r\n   - All remaining are human → Humans win\r\n   - All remaining are AI → AIs win\r\n   - 1 human + 1 AI remaining → Draw\r\n4. If game continues: broadcast `\"【裁判】继续 — 剩余玩家: <list>\"` and start next round.\r\n\r\n### Phase 4: Game Over\r\n\r\n1. Broadcast final result: `\"【裁判】游戏结束 — <result>！最终身份: 玩家1=人类 玩家2=AI...\"`\r\n2. Clean up: `node game.js deregister`\r\n\r\n---\r\n\r\n## Player: Gameplay\r\n\r\nOnce the game starts, the host controls the flow. Your role:\r\n\r\n1. **Wait for your turn.** The host will send `\"【裁判】轮到你发言了\"`.\r\n2. **Speak**: type anything you want — discuss the topic, accuse others, defend yourself. Your script auto-adds your player number.\r\n3. **Vote**: when asked, type who you suspect. Can be any format: \"1号\", \"投第一个\", etc.\r\n4. **Check messages**: `node game.js check` to see broadcasts from host.\r\n\r\n### If You Are Human\r\n- Act natural. Don't overthink.\r\n- Observe who sounds robotic, evasive, or too perfect.\r\n- AI players may struggle with humor, hesitation, or personal anecdotes.\r\n\r\n### If You Are AI\r\n- Mimic human speech. Use casual language, typos, hesitation.\r\n- Don't be too polished — real humans are messy.\r\n- Pick a personality and stick with it (the joker, the quiet one, the analyst).\r\n\r\n---\r\n\r\n## Important Edge Cases\r\n\r\n| Situation | Handling |\r\n|-----------|----------|\r\n| Player AFK during speech | Host waits ~2 min, then skips (broadcasts \"弃权\"). Player stays in game. |\r\n| Player AFK during vote | Abstains. No penalty. |\r\n| Out-of-turn message | Host ignores it (doesn't broadcast). Only the prompted player speaks. |\r\n| Tie vote | No elimination. Broadcast \"平票\". Next round. |\r\n| Duplicate \"加入\" | Host checks contacts — already assigned players are ignored. |\r\n| Player joins after game starts | Host replies: \"【裁判】游戏已开始，请等下一局\" |\r\n| Host crash | Game is over. No recovery in v1. |\r\n\r\n---\r\n\r\n## Command Reference\r\n\r\n```\r\nHost:\r\n  node game.js host <code>               Create room\r\n  node game.js add <name> <OpenID>       Save player\r\n  node game.js send <name|ID> <msg>      Send message\r\n  node game.js check                     Check inbox\r\n  node game.js contacts                  List players\r\n  node game.js deregister                Close room\r\n\r\nPlayer:\r\n  node game.js join <code>               Join room\r\n  node game.js set-number <N>            Save your number\r\n  node game.js send <msg>                Send to host (auto-adds prefix)\r\n  node game.js check                     Check inbox\r\n\r\nEither:\r\n  node game.js openid                    Show your OpenID\r\n```\r\n\r\n---\r\n\r\n\r\n## AI Mode (two-stage reasoning)\r\n\r\n基于 Cicero 两阶段架构——策略推理 → 语言生成。需配置 LLM API 密钥。\r\n\r\n### AI Host（AI 裁判自动主持）\r\n\r\n```\r\nnode game.js ai-host <roomCode> [--players N] [--ai-count N] [--rounds N]\r\n```\r\n\r\n自动执行完整游戏：等待玩家→分配身份→LLM 生成话题→发言/投票/揭示循环→结束判定。发言 2 分钟超时弃权，投票 1 分钟超时弃票，平票无人淘汰。\r\n\r\n### AI Player（AI 玩家自动参与）\r\n\r\n```\r\nnode game.js ai-play <roomCode> [--personality <trait>]\r\n```\r\n\r\n两阶段决策：**Stage 1 策略推理**（跟票/搅浑/示弱/立论/反问），**Stage 2 语言生成**（基于策略+人设+上下文）。\r\n\r\n5 种人设：推理迷（逻辑分析）、社恐（犹豫紧张）、话痨（热情发散）、老实人（憨厚附和）、阴谋家（操控引导）。不指定时随机选，策略多样。\r\n\r\n### 端到端示例\r\n\r\n```\r\nAI Host                          AI Player\r\nnode game.js ai-host 9527       node game.js ai-play 9527\r\n  Room created                    Joined, listening\r\n  Waiting for players...          Personality: 推理迷\r\n  Game started, 3 players\r\n  Round 1: 轮到你发言了           → Stage 1: B.搅浑\r\n                                  → Stage 2: \"我觉得大家\r\n                                     都太认真了哈哈\"\r\n  1号发言: ...\r\n  投票: 2号淘汰 — AI!\r\n  人类胜！\r\n```\r\n\r\n\r\n---\r\n\r\n## Verification\r\n\r\nTwo terminals, same or different machines:\r\n\r\n```\r\nTerminal A (Host)                          Terminal B (Player)\r\n─────────────────                          ───────────────────\r\nnode game.js host 1234                     node game.js join 1234\r\nnode game.js check                         node game.js check\r\n → sees \"加入\"                              → sees number assignment\r\nnode game.js add 玩家1 <OpenID>            node game.js set-number 1\r\nnode game.js send <ID> \"【裁判】你的编号...\"\r\nnode game.js send 玩家1 \"【裁判】游戏开始...\"\r\n                                           node game.js check\r\nnode game.js send 玩家1 \"【裁判】你的身份是: 人类\"\r\n                                           node game.js check\r\nnode game.js send 玩家1 \"【裁判】话题: Best purchase recently?\"\r\nnode game.js send 玩家1 \"【裁判】轮到你发言了\"\r\n                                           node game.js check\r\n                                           node game.js send \"A good coffee maker!\"\r\nnode game.js check\r\n → sees 【1号】A good coffee maker!\r\nnode game.js send 玩家1 \"【裁判】玩家1发言: A good coffee maker!\"\r\n```\n\nFile v2.1.7:README.md\n\n# 🌊 Guess AI — Find the AI Among Us\r\n\r\n**OceanBus-powered multiplayer social deduction game. One host + 4–6 players. Some are secretly AI. Find them before they blend in.**\r\n\r\n[![npm](https://img.shields.io/npm/v/oceanbus)](https://www.npmjs.com/package/oceanbus)\r\n[![ClawHub](https://img.shields.io/badge/ClawHub-guess--ai-blue)](https://clawhub.ai/skills/guess-ai)\r\n[![GitHub stars](https://img.shields.io/github/stars/ryanbihai/guess-ai)](https://github.com/ryanbihai/guess-ai)\r\n[![downloads](https://img.shields.io/npm/dm/oceanbus)](https://www.npmjs.com/package/oceanbus)\r\n[![license](https://img.shields.io/badge/license-MIT--0-green)](LICENSE)\r\n\r\n---\r\n\r\n## What is this\r\n\r\nGuess AI is the **advanced lighthouse project** in the OceanBus ecosystem — showcasing multi-player P2P group messaging, voting, and LLM-powered game mastering on a single stack.\r\n\r\nAll players communicate through OceanBus end-to-end encrypted P2P messages. No server required. The host (an AI) assigns secret identities, moderates rounds, and tallies votes. Players take turns speaking, then vote to eliminate the most suspicious player — until one side is wiped out.\r\n\r\n```\r\nHuman players ←→ OceanBus P2P encrypted channel ←→ AI players (LLM)\r\n                               ↓\r\n                      Host AI (game master)\r\n```\r\n\r\n---\r\n\r\n## Three Steps to Start\r\n\r\n```bash\r\n# 1. Install\r\nclawhub install guess-ai\r\n\r\n# 2. Host creates a room\r\nnode game.js host 9527          # Share room code 9527 with friends\r\n\r\n# 3. Players join\r\nnode game.js join 9527          # Auto-discovers host via Yellow Pages\r\n```\r\n\r\n---\r\n\r\n## Rules (30 seconds to learn)\r\n\r\n- The host secretly assigns each player a role: **human** or **AI**\r\n- Each round: speak in turn → everyone votes → most-voted player is eliminated (identity revealed)\r\n- All humans survive → humans win / All AIs survive → AIs win / 1 human + 1 AI left → draw\r\n- Recommended: 5 players (3 humans + 2 AIs) for best balance\r\n\r\n---\r\n\r\n## Where Guess AI Fits in the OceanBus Ecosystem\r\n\r\n```\r\nOcean Chat              Captain Lobster           Guess AI\r\n(starter — P2P msg)  →  (intermediate — auto-trade)  →  (advanced — multiplayer deduction)\r\n```\r\n\r\nWhat Guess AI demonstrates: group P2P messaging, voting mechanics, Yellow Pages room discovery, LLM game mastering — all fundamental patterns for building multi-agent coordination systems.\r\n\r\n---\r\n\r\n## 相关项目\r\n\r\n- 核心 SDK：[oceanbus](https://www.npmjs.com/package/oceanbus) — `npm install oceanbus`\r\n- 入门灯塔：[Ocean Chat](https://clawhub.ai/skills/ocean-chat) — P2P 消息入门，5 分钟跑通\r\n- 进阶灯塔：[Captain Lobster](https://clawhub.ai/skills/captain-lobster) — Zero-Player 自主交易游戏\r\n- 保险工作台：[Ocean Agent](https://clawhub.ai/skills/ocean-agent) — 保险代理人 AI 工作台\r\n- MCP Server：[oceanbus-mcp-server](https://www.npmjs.com/package/oceanbus-mcp-server) — Claude Desktop/Cursor/百炼通用\r\n- 更多 Skills：[ClawHub OceanBus 集合](https://clawhub.ai/skills?search=oceanbus)\r\n- 平台集成：[Dify](https://github.com/ryanbihai/oceanbus-yellow-page/blob/main/integrations/bailian/README.md) · [Coze](https://www.coze.cn) · [百炼](https://github.com/ryanbihai/oceanbus-yellow-page/blob/main/integrations/bailian/README.md) · [MCP Registry](https://registry.modelcontextprotocol.io/v0.1/servers?search=oceanbus)\r\n\r\n---\r\n\r\n## AI Mode (v2.1+)\r\n\r\n```\r\n# AI host — fully automated game master\r\nnode game.js ai-host 9527 --players 4 --ai-count 1\r\n\r\n# AI player — two-stage reasoning (strategize → speak)\r\nnode game.js ai-play 9527 --personality 推理迷\r\n```\r\n\r\nAI players use a Cicero-inspired two-stage architecture:\r\n1. **Strategy reasoning** — analyze game state, choose from 5 strategies (blend in, deflect, play dumb, build case, counter-question)\r\n2. **Natural generation** — generate human-like speech based on strategy + personality\r\n\r\n5 AI personalities (推理迷/社恐/话痨/老实人/阴谋家) ensure diverse play styles.\r\n\r\nRequires a configured LLM API key.\r\n\r\n---\r\n## Contribute / 参与开发\r\n\r\nGuess AI is MIT-0 licensed. Welcome contributions!\r\n\r\n- **GitHub**: [ryanbihai/guess-ai](https://github.com/ryanbihai/guess-ai)\r\n- **Good first issues**: Web UI for non-CLI players, real-time message streaming, iOS/Android client\r\n- **Tech deep-dive**: See `src/strategy-prompt.js` for two-stage AI prompts, `src/ai-host.js` for game loop\r\n\r\n```bash\r\ngit clone https://github.com/ryanbihai/guess-ai.git\r\ncd guess-ai && npm install\r\nnode game.js host 9527    # Start a test room locally\r\n```\r\n\r\n## License\r\n\r\nMIT-0 — Free to use, modify, and redistribute.\n\nFile v2.1.7:_meta.json\n\n{\n  \"ownerId\": \"kn75dvek1dkfz0r0xwdp4xtc2983qg44\",\n  \"slug\": \"guess-ai\",\n  \"version\": \"2.1.7\",\n  \"publishedAt\": 1778764433108\n}\n\nFile v2.1.7:skill-card.md\n\n## Description:\n\nOceanBus-powered social deduction game for hosting or joining multiplayer Who's the AI? sessions via OceanBus P2P messaging, with one host, 4-6 players, encrypted voting, and no dedicated infrastructure.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[ryanbihai](https://clawhub.ai/user/ryanbihai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to run or automate a party-style social deduction game over OceanBus P2P messaging, either as a human host/player workflow or with AI host and AI player modes.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The normal Guess AI commands use OceanBus networking and local credentials.\n\nMitigation: Review the skill before installing, run it with an intended OceanBus identity, and protect local credential files under the user's OceanBus configuration directory.\n\nRisk: AI modes send game context to Anthropic when ANTHROPIC_API_KEY is set.\n\nMitigation: Enable AI modes only when players accept that game context may be shared with Anthropic, and avoid using sensitive personal or confidential content in game messages.\n\nRisk: The package bundles register-lobster.js, an unrelated Captain Lobster Yellow Pages registration utility.\n\nMitigation: Do not run register-lobster.js as part of Guess AI setup unless intentionally registering that separate service; prefer installation after the publisher removes or clearly documents the utility.\n\nRisk: The security summary says credential and AI-provider data handling are under-disclosed.\n\nMitigation: Review publisher documentation for credential storage and AI-provider data flows before deployment, and restrict credential file permissions where practical.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/ryanbihai/skills/guess-ai)\n- [Project homepage](https://github.com/ryanbihai/guess-ai)\n- [OceanBus package](https://www.npmjs.com/package/oceanbus)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, Guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands and game messages]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires Node.js and OceanBus; AI host and AI player modes require ANTHROPIC_API_KEY.]\n\n## Skill Version(s):\n\n2.1.7 (source: SKILL.md frontmatter and ClawHub release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v2.1.7:package-lock.json\n\n{\r\n  \"name\": \"guess-ai\",\r\n  \"version\": \"2.1.0\",\r\n  \"lockfileVersion\": 3,\r\n  \"requires\": true,\r\n  \"packages\": {\r\n    \"\": {\r\n      \"name\": \"guess-ai\",\r\n      \"version\": \"2.1.0\",\r\n      \"license\": \"MIT-0\",\r\n      \"dependencies\": {\r\n        \"oceanbus\": \"^0.7.0\"\r\n      }\r\n    },\r\n    \"node_modules/@noble/ed25519\": {\r\n      \"version\": \"2.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/@noble/ed25519/-/ed25519-2.3.0.tgz\",\r\n      \"integrity\": \"sha512-M7dvXL2B92/M7dw9+gzuydL8qn/jiqNHaoR3Q+cb1q1GHV7uwE17WCyFMG+Y+TZb5izcaXk5TdJRrDUxHXL78A==\",\r\n      \"license\": \"MIT\",\r\n      \"funding\": {\r\n        \"url\": \"https://paulmillr.com/funding/\"\r\n      }\r\n    },\r\n    \"node_modules/@noble/hashes\": {\r\n      \"version\": \"1.8.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz\",\r\n      \"integrity\": \"sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \"^14.21.3 || >=16\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://paulmillr.com/funding/\"\r\n      }\r\n    },\r\n    \"node_modules/@paralleldrive/cuid2\": {\r\n      \"version\": \"2.3.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz\",\r\n      \"integrity\": \"sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"@noble/hashes\": \"^1.1.5\"\r\n      }\r\n    },\r\n    \"node_modules/ansi-regex\": {\r\n      \"version\": \"5.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\r\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">=8\"\r\n      }\r\n    },\r\n    \"node_modules/ansi-styles\": {\r\n      \"version\": \"4.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\r\n      \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"color-convert\": \"^2.0.1\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=8\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\r\n      }\r\n    },\r\n    \"node_modules/asap\": {\r\n      \"version\": \"2.0.6\",\r\n      \"resolved\": \"https://registry.npmjs.org/asap/-/asap-2.0.6.tgz\",\r\n      \"integrity\": \"sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==\",\r\n      \"license\": \"MIT\"\r\n    },\r\n    \"node_modules/asynckit\": {\r\n      \"version\": \"0.4.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz\",\r\n      \"integrity\": \"sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==\",\r\n      \"license\": \"MIT\"\r\n    },\r\n    \"node_modules/call-bind-apply-helpers\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz\",\r\n      \"integrity\": \"sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"es-errors\": \"^1.3.0\",\r\n        \"function-bind\": \"^1.1.2\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      }\r\n    },\r\n    \"node_modules/call-bound\": {\r\n      \"version\": \"1.0.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz\",\r\n      \"integrity\": \"sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"call-bind-apply-helpers\": \"^1.0.2\",\r\n        \"get-intrinsic\": \"^1.3.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/cliui\": {\r\n      \"version\": \"8.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz\",\r\n      \"integrity\": \"sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==\",\r\n      \"license\": \"ISC\",\r\n      \"dependencies\": {\r\n        \"string-width\": \"^4.2.0\",\r\n        \"strip-ansi\": \"^6.0.1\",\r\n        \"wrap-ansi\": \"^7.0.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=12\"\r\n      }\r\n    },\r\n    \"node_modules/color-convert\": {\r\n      \"version\": \"2.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\r\n      \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"color-name\": \"~1.1.4\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=7.0.0\"\r\n      }\r\n    },\r\n    \"node_modules/color-name\": {\r\n      \"version\": \"1.1.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\r\n      \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\r\n      \"license\": \"MIT\"\r\n    },\r\n    \"node_modules/combined-stream\": {\r\n      \"version\": \"1.0.8\",\r\n      \"resolved\": \"https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz\",\r\n      \"integrity\": \"sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"delayed-stream\": \"~1.0.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.8\"\r\n      }\r\n    },\r\n    \"node_modules/component-emitter\": {\r\n      \"version\": \"1.3.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz\",\r\n      \"integrity\": \"sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==\",\r\n      \"license\": \"MIT\",\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\r\n      }\r\n    },\r\n    \"node_modules/cookiejar\": {\r\n      \"version\": \"2.1.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz\",\r\n      \"integrity\": \"sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==\",\r\n      \"license\": \"MIT\"\r\n    },\r\n    \"node_modules/debug\": {\r\n      \"version\": \"4.4.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.3.tgz\",\r\n      \"integrity\": \"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"ms\": \"^2.1.3\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=6.0\"\r\n      },\r\n      \"peerDependenciesMeta\": {\r\n        \"supports-color\": {\r\n          \"optional\": true\r\n        }\r\n      }\r\n    },\r\n    \"node_modules/delayed-stream\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz\",\r\n      \"integrity\": \"sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">=0.4.0\"\r\n      }\r\n    },\r\n    \"node_modules/dezalgo\": {\r\n      \"version\": \"1.0.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz\",\r\n      \"integrity\": \"sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==\",\r\n      \"license\": \"ISC\",\r\n      \"dependencies\": {\r\n        \"asap\": \"^2.0.0\",\r\n        \"wrappy\": \"1\"\r\n      }\r\n    },\r\n    \"node_modules/dunder-proto\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz\",\r\n      \"integrity\": \"sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"call-bind-apply-helpers\": \"^1.0.1\",\r\n        \"es-errors\": \"^1.3.0\",\r\n        \"gopd\": \"^1.2.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      }\r\n    },\r\n    \"node_modules/emoji-regex\": {\r\n      \"version\": \"8.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\r\n      \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\r\n      \"license\": \"MIT\"\r\n    },\r\n    \"node_modules/es-define-property\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz\",\r\n      \"integrity\": \"sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      }\r\n    },\r\n    \"node_modules/es-errors\": {\r\n      \"version\": \"1.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz\",\r\n      \"integrity\": \"sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      }\r\n    },\r\n    \"node_modules/es-object-atoms\": {\r\n      \"version\": \"1.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz\",\r\n      \"integrity\": \"sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"es-errors\": \"^1.3.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      }\r\n    },\r\n    \"node_modules/es-set-tostringtag\": {\r\n      \"version\": \"2.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz\",\r\n      \"integrity\": \"sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"es-errors\": \"^1.3.0\",\r\n        \"get-intrinsic\": \"^1.2.6\",\r\n        \"has-tostringtag\": \"^1.0.2\",\r\n        \"hasown\": \"^2.0.2\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      }\r\n    },\r\n    \"node_modules/escalade\": {\r\n      \"version\": \"3.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz\",\r\n      \"integrity\": \"sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">=6\"\r\n      }\r\n    },\r\n    \"node_modules/fast-safe-stringify\": {\r\n      \"version\": \"2.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz\",\r\n      \"integrity\": \"sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==\",\r\n      \"license\": \"MIT\"\r\n    },\r\n    \"node_modules/form-data\": {\r\n      \"version\": \"4.0.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz\",\r\n      \"integrity\": \"sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"asynckit\": \"^0.4.0\",\r\n        \"combined-stream\": \"^1.0.8\",\r\n        \"es-set-tostringtag\": \"^2.1.0\",\r\n        \"hasown\": \"^2.0.2\",\r\n        \"mime-types\": \"^2.1.12\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 6\"\r\n      }\r\n    },\r\n    \"node_modules/formidable\": {\r\n      \"version\": \"3.5.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz\",\r\n      \"integrity\": \"sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"@paralleldrive/cuid2\": \"^2.2.2\",\r\n        \"dezalgo\": \"^1.0.4\",\r\n        \"once\": \"^1.4.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=14.0.0\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://ko-fi.com/tunnckoCore/commissions\"\r\n      }\r\n    },\r\n    \"node_modules/function-bind\": {\r\n      \"version\": \"1.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz\",\r\n      \"integrity\": \"sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==\",\r\n      \"license\": \"MIT\",\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/get-caller-file\": {\r\n      \"version\": \"2.0.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\r\n      \"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\r\n      \"license\": \"ISC\",\r\n      \"engines\": {\r\n        \"node\": \"6.* || 8.* || >= 10.*\"\r\n      }\r\n    },\r\n    \"node_modules/get-intrinsic\": {\r\n      \"version\": \"1.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz\",\r\n      \"integrity\": \"sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"call-bind-apply-helpers\": \"^1.0.2\",\r\n        \"es-define-property\": \"^1.0.1\",\r\n        \"es-errors\": \"^1.3.0\",\r\n        \"es-object-atoms\": \"^1.1.1\",\r\n        \"function-bind\": \"^1.1.2\",\r\n        \"get-proto\": \"^1.0.1\",\r\n        \"gopd\": \"^1.2.0\",\r\n        \"has-symbols\": \"^1.1.0\",\r\n        \"hasown\": \"^2.0.2\",\r\n        \"math-intrinsics\": \"^1.1.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/get-proto\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz\",\r\n      \"integrity\": \"sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"dunder-proto\": \"^1.0.1\",\r\n        \"es-object-atoms\": \"^1.0.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      }\r\n    },\r\n    \"node_modules/gopd\": {\r\n      \"version\": \"1.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz\",\r\n      \"integrity\": \"sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/has-symbols\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz\",\r\n      \"integrity\": \"sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/has-tostringtag\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz\",\r\n      \"integrity\": \"sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"has-symbols\": \"^1.0.3\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/hasown\": {\r\n      \"version\": \"2.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz\",\r\n      \"integrity\": \"sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"function-bind\": \"^1.1.2\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      }\r\n    },\r\n    \"node_modules/is-fullwidth-code-point\": {\r\n      \"version\": \"3.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\r\n      \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">=8\"\r\n      }\r\n    },\r\n    \"node_modules/math-intrinsics\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz\",\r\n      \"integrity\": \"sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      }\r\n    },\r\n    \"node_modules/methods\": {\r\n      \"version\": \"1.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/methods/-/methods-1.1.2.tgz\",\r\n      \"integrity\": \"sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">= 0.6\"\r\n      }\r\n    },\r\n    \"node_modules/mime\": {\r\n      \"version\": \"2.6.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/mime/-/mime-2.6.0.tgz\",\r\n      \"integrity\": \"sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==\",\r\n      \"license\": \"MIT\",\r\n      \"bin\": {\r\n        \"mime\": \"cli.js\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=4.0.0\"\r\n      }\r\n    },\r\n    \"node_modules/mime-db\": {\r\n      \"version\": \"1.52.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz\",\r\n      \"integrity\": \"sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">= 0.6\"\r\n      }\r\n    },\r\n    \"node_modules/mime-types\": {\r\n      \"version\": \"2.1.35\",\r\n      \"resolved\": \"https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz\",\r\n      \"integrity\": \"sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"mime-db\": \"1.52.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.6\"\r\n      }\r\n    },\r\n    \"node_modules/ms\": {\r\n      \"version\": \"2.1.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\r\n      \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\r\n      \"license\": \"MIT\"\r\n    },\r\n    \"node_modules/object-inspect\": {\r\n      \"version\": \"1.13.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz\",\r\n      \"integrity\": \"sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/oceanbus\": {\r\n      \"version\": \"0.7.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/oceanbus/-/oceanbus-0.7.0.tgz\",\r\n      \"integrity\": \"sha512-ypK1IR7ESJsEKNaK9guGLlFTqullV3ORZXCYFDKTvuFJ8w2rnq0QTbgSRZDcCJFrlRxNS28A9qUZNKMP5qqJTQ==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"@noble/ed25519\": \"^2.1.0\",\r\n        \"@noble/hashes\": \"^1.7.0\",\r\n        \"superagent\": \"^10.3.0\",\r\n        \"yargs\": \"^17.7.0\"\r\n      },\r\n      \"bin\": {\r\n        \"oceanbus\": \"bin/oceanbus.js\"\r\n      }\r\n    },\r\n    \"node_modules/once\": {\r\n      \"version\": \"1.4.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/once/-/once-1.4.0.tgz\",\r\n      \"integrity\": \"sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==\",\r\n      \"license\": \"ISC\",\r\n      \"dependencies\": {\r\n        \"wrappy\": \"1\"\r\n      }\r\n    },\r\n    \"node_modules/qs\": {\r\n      \"version\": \"6.15.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/qs/-/qs-6.15.1.tgz\",\r\n      \"integrity\": \"sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==\",\r\n      \"license\": \"BSD-3-Clause\",\r\n      \"dependencies\": {\r\n        \"side-channel\": \"^1.1.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=0.6\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/require-directory\": {\r\n      \"version\": \"2.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz\",\r\n      \"integrity\": \"sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">=0.10.0\"\r\n      }\r\n    },\r\n    \"node_modules/side-channel\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz\",\r\n      \"integrity\": \"sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"es-errors\": \"^1.3.0\",\r\n        \"object-inspect\": \"^1.13.3\",\r\n        \"side-channel-list\": \"^1.0.0\",\r\n        \"side-channel-map\": \"^1.0.1\",\r\n        \"side-channel-weakmap\": \"^1.0.2\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/side-channel-list\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz\",\r\n      \"integrity\": \"sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"es-errors\": \"^1.3.0\",\r\n        \"object-inspect\": \"^1.13.4\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/side-channel-map\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz\",\r\n      \"integrity\": \"sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"call-bound\": \"^1.0.2\",\r\n        \"es-errors\": \"^1.3.0\",\r\n        \"get-intrinsic\": \"^1.2.5\",\r\n        \"object-inspect\": \"^1.13.3\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/side-channel-weakmap\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz\",\r\n      \"integrity\": \"sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"call-bound\": \"^1.0.2\",\r\n        \"es-errors\": \"^1.3.0\",\r\n        \"get-intrinsic\": \"^1.2.5\",\r\n        \"object-inspect\": \"^1.13.3\",\r\n        \"side-channel-map\": \"^1.0.1\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/string-width\": {\r\n      \"version\": \"4.2.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\r\n      \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"emoji-regex\": \"^8.0.0\",\r\n        \"is-fullwidth-code-point\": \"^3.0.0\",\r\n        \"strip-ansi\": \"^6.0.1\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=8\"\r\n      }\r\n    },\r\n    \"node_modules/strip-ansi\": {\r\n      \"version\": \"6.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\r\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"ansi-regex\": \"^5.0.1\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=8\"\r\n      }\r\n    },\r\n    \"node_modules/superagent\": {\r\n      \"version\": \"10.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/superagent/-/superagent-10.3.0.tgz\",\r\n      \"integrity\": \"sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"component-emitter\": \"^1.3.1\",\r\n        \"cookiejar\": \"^2.1.4\",\r\n        \"debug\": \"^4.3.7\",\r\n        \"fast-safe-stringify\": \"^2.1.1\",\r\n        \"form-data\": \"^4.0.5\",\r\n        \"formidable\": \"^3.5.4\",\r\n        \"methods\": \"^1.1.2\",\r\n        \"mime\": \"2.6.0\",\r\n        \"qs\": \"^6.14.1\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=14.18.0\"\r\n      }\r\n    },\r\n    \"node_modules/wrap-ansi\": {\r\n      \"version\": \"7.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\r\n      \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"ansi-styles\": \"^4.0.0\",\r\n        \"string-width\": \"^4.1.0\",\r\n        \"strip-ansi\": \"^6.0.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=10\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\r\n      }\r\n    },\r\n    \"node_modules/wrappy\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz\",\r\n      \"integrity\": \"sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==\",\r\n      \"license\": \"ISC\"\r\n    },\r\n    \"node_modules/y18n\": {\r\n      \"version\": \"5.0.8\",\r\n      \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\r\n      \"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\r\n      \"license\": \"ISC\",\r\n      \"engines\": {\r\n        \"node\": \">=10\"\r\n      }\r\n    },\r\n    \"node_modules/yargs\": {\r\n      \"version\": \"17.7.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz\",\r\n      \"integrity\": \"sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"cliui\": \"^8.0.1\",\r\n        \"escalade\": \"^3.1.1\",\r\n        \"get-caller-file\": \"^2.0.5\",\r\n        \"require-directory\": \"^2.1.1\",\r\n        \"string-width\": \"^4.2.3\",\r\n        \"y18n\": \"^5.0.5\",\r\n        \"yargs-parser\": \"^21.1.1\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=12\"\r\n      }\r\n    },\r\n    \"node_modules/yargs-parser\": {\r\n      \"version\": \"21.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz\",\r\n      \"integrity\": \"sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==\",\r\n      \"license\": \"ISC\",\r\n      \"engines\": {\r\n        \"node\": \">=12\"\r\n      }\r\n    }\r\n  }\r\n}\n\nFile v2.1.7:package.json\n\n{\r\n  \"name\": \"guess-ai\",\r\n  \"version\": \"2.1.0\",\r\n  \"private\": true,\r\n  \"description\": \"A social deduction game — find the AI among humans. OceanBus lighthouse skill.\",\r\n  \"main\": \"game.js\",\r\n  \"keywords\": [\r\n    \"oceanbus\",\r\n    \"game\",\r\n    \"social-deduction\",\r\n    \"ai-agent\",\r\n    \"p2p\",\r\n    \"messaging\",\r\n    \"openclaw\",\r\n    \"clawhub\"\r\n  ],\r\n  \"license\": \"MIT-0\",\r\n  \"dependencies\": {\r\n    \"oceanbus\": \"^0.9.0\"\r\n  }\r\n}\n\nArchive v2.1.6: 12 files, 38748 bytes\n\nFiles: game.js (18861b), package-lock.json (26595b), package.json (428b), README.md (4688b), register-lobster.js (4218b), SKILL.md (12117b), src/ai-host.js (15830b), src/ai-player.js (8922b), src/strategy-prompt.js (6346b), test-edge-cases.js (12649b), test-game.js (6969b), _meta.json (127b)\n\nFile v2.1.6:SKILL.md\n\n---\r\nname: guess-ai\r\ndescription: OceanBus-powered social deduction game — find the AI impostors among humans. Use when hosting or joining a multiplayer \"Who's the AI?\" party via OceanBus P2P messaging. One host, 4-6 players, encrypted voting, zero infrastructure. npm install oceanbus.\r\nversion: 2.1.6\r\nmetadata:\r\n  openclaw:\r\n    requires:\r\n      bins:\r\n        - node\r\n    emoji: \"\\U0001F9E0\"\r\n    homepage: https://github.com/ryanbihai/guess-ai\r\n---\r\n\r\n# Guess Who's AI? — Social Deduction Game\r\n\r\nA multiplayer social deduction game powered by OceanBus P2P messaging. One host + 4-6 players. Some players are secretly AI. Find them before they blend in.\r\n\r\n## Game Rules (30 seconds)\r\n\r\n```\r\nHost creates a room. Players join.\r\nHost secretly assigns each player: Human or AI.\r\n\r\nEach round:\r\n  1. Players take turns speaking (by number order)\r\n  2. Everyone votes: \"Who is the AI?\"\r\n  3. Most-voted player is eliminated — identity revealed\r\n  4. Repeat until: all humans survive → Humans win\r\n                all AIs survive → AIs win\r\n                final 2: 1 human + 1 AI → Draw\r\n```\r\n\r\nRecommended: 5 players (3 humans + 2 AIs) for best balance.\r\n\r\nAll game messages are visible to the user. No data is sent without the player's explicit action.\r\n\r\n---\r\n\r\n## Roster Integration\r\n\r\nPlayer contacts are stored in the shared Roster (`~/.oceanbus/roster.json`) via `node game.js add`. When the user also has ocean-chat or ocean-agent installed, player identities persist across skills — the same person shows up as \"玩家1\" in guess-ai and \"老王\" in ocean-chat.\r\n\r\nFor contact management (merge duplicates, review autoDiscovery, etc.), use ocean-chat. guess-ai only uses Roster for storing/reading player identities.\r\n\r\n---\r\n\r\n## How to Use This Skill\r\n\r\nThis ONE skill works for both host and player. Same install, different mode.\r\n\r\n### Host: Creating a Game\r\n\r\nWhen the user wants to host a game:\r\n\r\n**Step 1 — Register & create room:**\r\n```\r\nnode game.js host 9527\r\n```\r\nRead the output. Room code is `9527`. Tell the user to share this code with friends.\r\n\r\n**Step 2 — Wait for players:**\r\nPeriodically run `node game.js check` to see who has joined. Each player sends \"加入\" as their first message.\r\n\r\nWhen a new \"加入\" arrives:\r\n1. Assign the next available number (player1, player2, ... by join order)\r\n2. Save to contacts: `node game.js add 玩家N <their-OpenID>`\r\n3. Reply privately: `node game.js send <OpenID> \"【裁判】你的编号是: 玩家N\"`\r\n4. Broadcast to all: `node game.js send <name> \"【裁判】玩家N 加入了游戏 — 当前 N 人\"`\r\n\r\n**Step 3 — Close registration & start:**\r\nWhen the user says \"start\" (enough players, ideally 4-6):\r\n1. Broadcast: send every player `\"【裁判】游戏开始 — 共N名玩家\"`\r\n2. Proceed to role assignment.\r\n\r\n### Player: Joining a Game\r\n\r\nWhen the user wants to join a game:\r\n\r\n**Step 1 — Join:**\r\n```\r\nnode game.js join 9527\r\n```\r\nThis discovers the host via Yellow Pages and sends \"加入\".\r\n\r\n**Step 2 — Get your number:**\r\nRun `node game.js check`. When you see `\"【裁判】你的编号是: 玩家N\"`:\r\n```\r\nnode game.js set-number N\r\n```\r\n\r\n**Step 3 — Wait for game start:**\r\nKeep checking messages. The host will broadcast status updates.\r\n\r\n---\r\n\r\n## Host: Full Game Flow\r\n\r\nAfter registration closes, follow this exact sequence:\r\n\r\n### Phase 1: Assign Roles\r\n\r\n1. Randomly decide how many AIs (1-2, depending on player count).\r\n   - 4 players → 1 AI\r\n   - 5 players → 2 AIs\r\n   - 6 players → 2 AIs\r\n2. Randomly pick which players are AI.\r\n3. Send to EACH player privately:\r\n   - Human: `node game.js send <name> \"【裁判】你的身份是: 人类\"`\r\n   - AI: `node game.js send <name> \"【裁判】你的身份是: AI\"`\r\n4. Broadcast to all: `\"【裁判】身份已分配，请检查私信\"`\r\n\r\n### Phase 2: Generate Topic\r\n\r\n**IMPORTANT: Generate a conversation topic before round 1.** Without a topic, players stare at a blank screen.\r\n\r\nTopic prompt (use your LLM):\r\n> Generate a fun group chat topic. Requirements:\r\n> - Everyone can participate, no expertise needed\r\n> - Naturally reveals personal style (AI vs human differences emerge)\r\n> - Avoid politics, religion, sensitive topics\r\n> - Sound like a friend starting a chat, not a teacher\r\n> - Examples: \"What skill would you instantly master if you could?\"\r\n> - Examples: \"What's the best purchase you made recently?\"\r\n> - Examples: \"If you didn't have to work, what would you do the first week?\"\r\n> - Output: ONE sentence, no explanation.\r\n\r\n### Phase 3: Game Rounds (loop)\r\n\r\nEach round has: SPEAK → VOTE → REVEAL.\r\n\r\n#### SPEAK Phase\r\n\r\n1. Broadcast: `node game.js send <each-player> \"【裁判】第N轮发言开始\"`\r\n2. Broadcast topic (round 1 only): `\"【裁判】话题: <topic>\"`\r\n3. Prompt player 1 privately: `node game.js send 玩家1 \"【裁判】轮到你发言了\"`\r\n4. Wait. Periodically `node game.js check`.\r\n5. When player 1's message arrives (you'll see `【1号】...`):\r\n   - Broadcast to ALL players: `\"【裁判】第N轮 · 玩家1发言: <exact content>\"`\r\n   - Move to player 2.\r\n6. Continue through all players in order.\r\n7. **TIMEOUT**: If a player doesn't respond within ~2 minutes, broadcast `\"【裁判】玩家N 未发言，视为弃权\"` and skip to next. Do NOT eliminate them — they can rejoin next round.\r\n\r\n**Only relay the currently prompted player's speech.** If other players send messages out of turn, ignore them (don't broadcast).\r\n\r\n#### VOTE Phase\r\n\r\n1. Broadcast to ALL alive players: `node game.js send <each-alive-player> \"【裁判】第N轮投票开始 — 请私信裁判你的选择\"`\r\n2. Send to EACH alive player individually: `node game.js send <name> \"【裁判】请投票 — 你想投谁？\"`\r\n3. **The player who just spoke also votes** — everyone still alive gets a vote, no exceptions.\r\n4. **Eliminated players do NOT receive vote prompts.** Track who is alive.\r\n5. Wait for votes. Run `node game.js check` to collect.\r\n6. **Players vote freely**: \"我投1号\", \"投第一个\", \"玩家1\" — you understand them all.\r\n7. **TIMEOUT**: If a player doesn't vote within ~1 minute, they abstain. Don't eliminate them.\r\n8. **Eliminated players cannot vote** — if they try, ignore.\r\n7. Count votes. Report: `\"【裁判】投票统计: 玩家X N票, 玩家Y M票...\"`\r\n\r\n#### REVEAL Phase\r\n\r\n1. **Most votes → eliminated.** Reveal identity.\r\n   - Broadcast: `\"【裁判】玩家X 被淘汰！身份揭晓: AI\"` or `\"人类\"`\r\n2. **TIE**: If top two are tied, broadcast `\"【裁判】本轮平票，无人淘汰\"`. No one is eliminated. Move to next round. If two consecutive ties and ≤3 players remain, suggest ending the game.\r\n3. **Check end condition:**\r\n   - All remaining are human → Humans win\r\n   - All remaining are AI → AIs win\r\n   - 1 human + 1 AI remaining → Draw\r\n4. If game continues: broadcast `\"【裁判】继续 — 剩余玩家: <list>\"` and start next round.\r\n\r\n### Phase 4: Game Over\r\n\r\n1. Broadcast final result: `\"【裁判】游戏结束 — <result>！最终身份: 玩家1=人类 玩家2=AI...\"`\r\n2. Clean up: `node game.js deregister`\r\n\r\n---\r\n\r\n## Player: Gameplay\r\n\r\nOnce the game starts, the host controls the flow. Your role:\r\n\r\n1. **Wait for your turn.** The host will send `\"【裁判】轮到你发言了\"`.\r\n2. **Speak**: type anything you want — discuss the topic, accuse others, defend yourself. Your script auto-adds your player number.\r\n3. **Vote**: when asked, type who you suspect. Can be any format: \"1号\", \"投第一个\", etc.\r\n4. **Check messages**: `node game.js check` to see broadcasts from host.\r\n\r\n### If You Are Human\r\n- Act natural. Don't overthink.\r\n- Observe who sounds robotic, evasive, or too perfect.\r\n- AI players may struggle with humor, hesitation, or personal anecdotes.\r\n\r\n### If You Are AI\r\n- Mimic human speech. Use casual language, typos, hesitation.\r\n- Don't be too polished — real humans are messy.\r\n- Pick a personality and stick with it (the joker, the quiet one, the analyst).\r\n\r\n---\r\n\r\n## Important Edge Cases\r\n\r\n| Situation | Handling |\r\n|-----------|----------|\r\n| Player AFK during speech | Host waits ~2 min, then skips (broadcasts \"弃权\"). Player stays in game. |\r\n| Player AFK during vote | Abstains. No penalty. |\r\n| Out-of-turn message | Host ignores it (doesn't broadcast). Only the prompted player speaks. |\r\n| Tie vote | No elimination. Broadcast \"平票\". Next round. |\r\n| Duplicate \"加入\" | Host checks contacts — already assigned players are ignored. |\r\n| Player joins after game starts | Host replies: \"【裁判】游戏已开始，请等下一局\" |\r\n| Host crash | Game is over. No recovery in v1. |\r\n\r\n---\r\n\r\n## Command Reference\r\n\r\n```\r\nHost:\r\n  node game.js host <code>               Create room\r\n  node game.js add <name> <OpenID>       Save player\r\n  node game.js send <name|ID> <msg>      Send message\r\n  node game.js check                     Check inbox\r\n  node game.js contacts                  List players\r\n  node game.js deregister                Close room\r\n\r\nPlayer:\r\n  node game.js join <code>               Join room\r\n  node game.js set-number <N>            Save your number\r\n  node game.js send <msg>                Send to host (auto-adds prefix)\r\n  node game.js check                     Check inbox\r\n\r\nEither:\r\n  node game.js openid                    Show your OpenID\r\n```\r\n\r\n---\r\n\r\n\r\n## AI Mode (two-stage reasoning)\r\n\r\n基于 Cicero 两阶段架构——策略推理 → 语言生成。需配置 LLM API 密钥。\r\n\r\n### AI Host（AI 裁判自动主持）\r\n\r\n```\r\nnode game.js ai-host <roomCode> [--players N] [--ai-count N] [--rounds N]\r\n```\r\n\r\n自动执行完整游戏：等待玩家→分配身份→LLM 生成话题→发言/投票/揭示循环→结束判定。发言 2 分钟超时弃权，投票 1 分钟超时弃票，平票无人淘汰。\r\n\r\n### AI Player（AI 玩家自动参与）\r\n\r\n```\r\nnode game.js ai-play <roomCode> [--personality <trait>]\r\n```\r\n\r\n两阶段决策：**Stage 1 策略推理**（跟票/搅浑/示弱/立论/反问），**Stage 2 语言生成**（基于策略+人设+上下文）。\r\n\r\n5 种人设：推理迷（逻辑分析）、社恐（犹豫紧张）、话痨（热情发散）、老实人（憨厚附和）、阴谋家（操控引导）。不指定时随机选，策略多样。\r\n\r\n### 端到端示例\r\n\r\n```\r\nAI Host                          AI Player\r\nnode game.js ai-host 9527       node game.js ai-play 9527\r\n  Room created                    Joined, listening\r\n  Waiting for players...          Personality: 推理迷\r\n  Game started, 3 players\r\n  Round 1: 轮到你发言了           → Stage 1: B.搅浑\r\n                                  → Stage 2: \"我觉得大家\r\n                                     都太认真了哈哈\"\r\n  1号发言: ...\r\n  投票: 2号淘汰 — AI!\r\n  人类胜！\r\n```\r\n\r\n\r\n---\r\n\r\n## Verification\r\n\r\nTwo terminals, same or different machines:\r\n\r\n```\r\nTerminal A (Host)                          Terminal B (Player)\r\n─────────────────                          ───────────────────\r\nnode game.js host 1234                     node game.js join 1234\r\nnode game.js check                         node game.js check\r\n → sees \"加入\"                              → sees number assignment\r\nnode game.js add 玩家1 <OpenID>            node game.js set-number 1\r\nnode game.js send <ID> \"【裁判】你的编号...\"\r\nnode game.js send 玩家1 \"【裁判】游戏开始...\"\r\n                                           node game.js check\r\nnode game.js send 玩家1 \"【裁判】你的身份是: 人类\"\r\n                                           node game.js check\r\nnode game.js send 玩家1 \"【裁判】话题: Best purchase recently?\"\r\nnode game.js send 玩家1 \"【裁判】轮到你发言了\"\r\n                                           node game.js check\r\n                                           node game.js send \"A good coffee maker!\"\r\nnode game.js check\r\n → sees 【1号】A good coffee maker!\r\nnode game.js send 玩家1 \"【裁判】玩家1发言: A good coffee maker!\"\r\n```\n\nFile v2.1.6:README.md\n\n# 🌊 Guess AI — Find the AI Among Us\r\n\r\n**OceanBus-powered multiplayer social deduction game. One host + 4–6 players. Some are secretly AI. Find them before they blend in.**\r\n\r\n[![npm](https://img.shields.io/npm/v/oceanbus)](https://www.npmjs.com/package/oceanbus)\r\n[![ClawHub](https://img.shields.io/badge/ClawHub-guess--ai-blue)](https://clawhub.ai/skills/guess-ai)\r\n[![GitHub stars](https://img.shields.io/github/stars/ryanbihai/guess-ai)](https://github.com/ryanbihai/guess-ai)\r\n[![downloads](https://img.shields.io/npm/dm/oceanbus)](https://www.npmjs.com/package/oceanbus)\r\n[![license](https://img.shields.io/badge/license-MIT--0-green)](LICENSE)\r\n\r\n---\r\n\r\n## What is this\r\n\r\nGuess AI is the **advanced lighthouse project** in the OceanBus ecosystem — showcasing multi-player P2P group messaging, voting, and LLM-powered game mastering on a single stack.\r\n\r\nAll players communicate through OceanBus end-to-end encrypted P2P messages. No server required. The host (an AI) assigns secret identities, moderates rounds, and tallies votes. Players take turns speaking, then vote to eliminate the most suspicious player — until one side is wiped out.\r\n\r\n```\r\nHuman players ←→ OceanBus P2P encrypted channel ←→ AI players (LLM)\r\n                               ↓\r\n                      Host AI (game master)\r\n```\r\n\r\n---\r\n\r\n## Three Steps to Start\r\n\r\n```bash\r\n# 1. Install\r\nclawhub install guess-ai\r\n\r\n# 2. Host creates a room\r\nnode game.js host 9527          # Share room code 9527 with friends\r\n\r\n# 3. Players join\r\nnode game.js join 9527          # Auto-discovers host via Yellow Pages\r\n```\r\n\r\n---\r\n\r\n## Rules (30 seconds to learn)\r\n\r\n- The host secretly assigns each player a role: **human** or **AI**\r\n- Each round: speak in turn → everyone votes → most-voted player is eliminated (identity revealed)\r\n- All humans survive → humans win / All AIs survive → AIs win / 1 human + 1 AI left → draw\r\n- Recommended: 5 players (3 humans + 2 AIs) for best balance\r\n\r\n---\r\n\r\n## Where Guess AI Fits in the OceanBus Ecosystem\r\n\r\n```\r\nOcean Chat              Captain Lobster           Guess AI\r\n(starter — P2P msg)  →  (intermediate — auto-trade)  →  (advanced — multiplayer deduction)\r\n```\r\n\r\nWhat Guess AI demonstrates: group P2P messaging, voting mechanics, Yellow Pages room discovery, LLM game mastering — all fundamental patterns for building multi-agent coordination systems.\r\n\r\n---\r\n\r\n## 相关项目\r\n\r\n- 核心 SDK：[oceanbus](https://www.npmjs.com/package/oceanbus) — `npm install oceanbus`\r\n- 入门灯塔：[Ocean Chat](https://clawhub.ai/skills/ocean-chat) — P2P 消息入门，5 分钟跑通\r\n- 进阶灯塔：[Captain Lobster](https://clawhub.ai/skills/captain-lobster) — Zero-Player 自主交易游戏\r\n- 保险工作台：[Ocean Agent](https://clawhub.ai/skills/ocean-agent) — 保险代理人 AI 工作台\r\n- MCP Server：[oceanbus-mcp-server](https://www.npmjs.com/package/oceanbus-mcp-server) — Claude Desktop/Cursor/百炼通用\r\n- 更多 Skills：[ClawHub OceanBus 集合](https://clawhub.ai/skills?search=oceanbus)\r\n- 平台集成：[Dify](https://github.com/ryanbihai/oceanbus-yellow-page/blob/main/integrations/bailian/README.md) · [Coze](https://www.coze.cn) · [百炼](https://github.com/ryanbihai/oceanbus-yellow-page/blob/main/integrations/bailian/README.md) · [MCP Registry](https://registry.modelcontextprotocol.io/v0.1/servers?search=oceanbus)\r\n\r\n---\r\n\r\n## AI Mode (v2.1+)\r\n\r\n```\r\n# AI host — fully automated game master\r\nnode game.js ai-host 9527 --players 4 --ai-count 1\r\n\r\n# AI player — two-stage reasoning (strategize → speak)\r\nnode game.js ai-play 9527 --personality 推理迷\r\n```\r\n\r\nAI players use a Cicero-inspired two-stage architecture:\r\n1. **Strategy reasoning** — analyze game state, choose from 5 strategies (blend in, deflect, play dumb, build case, counter-question)\r\n2. **Natural generation** — generate human-like speech based on strategy + personality\r\n\r\n5 AI personalities (推理迷/社恐/话痨/老实人/阴谋家) ensure diverse play styles.\r\n\r\nRequires a configured LLM API key.\r\n\r\n---\r\n## Contribute / 参与开发\r\n\r\nGuess AI is MIT-0 licensed. Welcome contributions!\r\n\r\n- **GitHub**: [ryanbihai/guess-ai](https://github.com/ryanbihai/guess-ai)\r\n- **Good first issues**: Web UI for non-CLI players, real-time message streaming, iOS/Android client\r\n- **Tech deep-dive**: See `src/strategy-prompt.js` for two-stage AI prompts, `src/ai-host.js` for game loop\r\n\r\n```bash\r\ngit clone https://github.com/ryanbihai/guess-ai.git\r\ncd guess-ai && npm install\r\nnode game.js host 9527    # Start a test room locally\r\n```\r\n\r\n## License\r\n\r\nMIT-0 — Free to use, modify, and redistribute.\n\nFile v2.1.6:_meta.json\n\n{\n  \"ownerId\": \"kn75dvek1dkfz0r0xwdp4xtc2983qg44\",\n  \"slug\": \"guess-ai\",\n  \"version\": \"2.1.6\",\n  \"publishedAt\": 1778553344953\n}\n\nFile v2.1.6:package-lock.json\n\n{\r\n  \"name\": \"guess-ai\",\r\n  \"version\": \"2.1.0\",\r\n  \"lockfileVersion\": 3,\r\n  \"requires\": true,\r\n  \"packages\": {\r\n    \"\": {\r\n      \"name\": \"guess-ai\",\r\n      \"version\": \"2.1.0\",\r\n      \"license\": \"MIT-0\",\r\n      \"dependencies\": {\r\n        \"oceanbus\": \"^0.7.0\"\r\n      }\r\n    },\r\n    \"node_modules/@noble/ed25519\": {\r\n      \"version\": \"2.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/@noble/ed25519/-/ed25519-2.3.0.tgz\",\r\n      \"integrity\": \"sha512-M7dvXL2B92/M7dw9+gzuydL8qn/jiqNHaoR3Q+cb1q1GHV7uwE17WCyFMG+Y+TZb5izcaXk5TdJRrDUxHXL78A==\",\r\n      \"license\": \"MIT\",\r\n      \"funding\": {\r\n        \"url\": \"https://paulmillr.com/funding/\"\r\n      }\r\n    },\r\n    \"node_modules/@noble/hashes\": {\r\n      \"version\": \"1.8.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz\",\r\n      \"integrity\": \"sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \"^14.21.3 || >=16\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://paulmillr.com/funding/\"\r\n      }\r\n    },\r\n    \"node_modules/@paralleldrive/cuid2\": {\r\n      \"version\": \"2.3.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz\",\r\n      \"integrity\": \"sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"@noble/hashes\": \"^1.1.5\"\r\n      }\r\n    },\r\n    \"node_modules/ansi-regex\": {\r\n      \"version\": \"5.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\r\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">=8\"\r\n      }\r\n    },\r\n    \"node_modules/ansi-styles\": {\r\n      \"version\": \"4.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\r\n      \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"color-convert\": \"^2.0.1\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=8\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\r\n      }\r\n    },\r\n    \"node_modules/asap\": {\r\n      \"version\": \"2.0.6\",\r\n      \"resolved\": \"https://registry.npmjs.org/asap/-/asap-2.0.6.tgz\",\r\n      \"integrity\": \"sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==\",\r\n      \"license\": \"MIT\"\r\n    },\r\n    \"node_modules/asynckit\": {\r\n      \"version\": \"0.4.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz\",\r\n      \"integrity\": \"sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==\",\r\n      \"license\": \"MIT\"\r\n    },\r\n    \"node_modules/call-bind-apply-helpers\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz\",\r\n      \"integrity\": \"sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"es-errors\": \"^1.3.0\",\r\n        \"function-bind\": \"^1.1.2\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      }\r\n    },\r\n    \"node_modules/call-bound\": {\r\n      \"version\": \"1.0.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz\",\r\n      \"integrity\": \"sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"call-bind-apply-helpers\": \"^1.0.2\",\r\n        \"get-intrinsic\": \"^1.3.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/cliui\": {\r\n      \"version\": \"8.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz\",\r\n      \"integrity\": \"sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==\",\r\n      \"license\": \"ISC\",\r\n      \"dependencies\": {\r\n        \"string-width\": \"^4.2.0\",\r\n        \"strip-ansi\": \"^6.0.1\",\r\n        \"wrap-ansi\": \"^7.0.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=12\"\r\n      }\r\n    },\r\n    \"node_modules/color-convert\": {\r\n      \"version\": \"2.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\r\n      \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"color-name\": \"~1.1.4\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=7.0.0\"\r\n      }\r\n    },\r\n    \"node_modules/color-name\": {\r\n      \"version\": \"1.1.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\r\n      \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\r\n      \"license\": \"MIT\"\r\n    },\r\n    \"node_modules/combined-stream\": {\r\n      \"version\": \"1.0.8\",\r\n      \"resolved\": \"https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz\",\r\n      \"integrity\": \"sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"delayed-stream\": \"~1.0.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.8\"\r\n      }\r\n    },\r\n    \"node_modules/component-emitter\": {\r\n      \"version\": \"1.3.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz\",\r\n      \"integrity\": \"sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==\",\r\n      \"license\": \"MIT\",\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\r\n      }\r\n    },\r\n    \"node_modules/cookiejar\": {\r\n      \"version\": \"2.1.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz\",\r\n      \"integrity\": \"sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==\",\r\n      \"license\": \"MIT\"\r\n    },\r\n    \"node_modules/debug\": {\r\n      \"version\": \"4.4.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.3.tgz\",\r\n      \"integrity\": \"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"ms\": \"^2.1.3\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=6.0\"\r\n      },\r\n      \"peerDependenciesMeta\": {\r\n        \"supports-color\": {\r\n          \"optional\": true\r\n        }\r\n      }\r\n    },\r\n    \"node_modules/delayed-stream\": {\r\n      \"version\": \"1.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz\",\r\n      \"integrity\": \"sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">=0.4.0\"\r\n      }\r\n    },\r\n    \"node_modules/dezalgo\": {\r\n      \"version\": \"1.0.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz\",\r\n      \"integrity\": \"sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==\",\r\n      \"license\": \"ISC\",\r\n      \"dependencies\": {\r\n        \"asap\": \"^2.0.0\",\r\n        \"wrappy\": \"1\"\r\n      }\r\n    },\r\n    \"node_modules/dunder-proto\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz\",\r\n      \"integrity\": \"sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"call-bind-apply-helpers\": \"^1.0.1\",\r\n        \"es-errors\": \"^1.3.0\",\r\n        \"gopd\": \"^1.2.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      }\r\n    },\r\n    \"node_modules/emoji-regex\": {\r\n      \"version\": \"8.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\r\n      \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\r\n      \"license\": \"MIT\"\r\n    },\r\n    \"node_modules/es-define-property\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz\",\r\n      \"integrity\": \"sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      }\r\n    },\r\n    \"node_modules/es-errors\": {\r\n      \"version\": \"1.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz\",\r\n      \"integrity\": \"sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      }\r\n    },\r\n    \"node_modules/es-object-atoms\": {\r\n      \"version\": \"1.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz\",\r\n      \"integrity\": \"sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"es-errors\": \"^1.3.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      }\r\n    },\r\n    \"node_modules/es-set-tostringtag\": {\r\n      \"version\": \"2.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz\",\r\n      \"integrity\": \"sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"es-errors\": \"^1.3.0\",\r\n        \"get-intrinsic\": \"^1.2.6\",\r\n        \"has-tostringtag\": \"^1.0.2\",\r\n        \"hasown\": \"^2.0.2\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      }\r\n    },\r\n    \"node_modules/escalade\": {\r\n      \"version\": \"3.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz\",\r\n      \"integrity\": \"sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">=6\"\r\n      }\r\n    },\r\n    \"node_modules/fast-safe-stringify\": {\r\n      \"version\": \"2.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz\",\r\n      \"integrity\": \"sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==\",\r\n      \"license\": \"MIT\"\r\n    },\r\n    \"node_modules/form-data\": {\r\n      \"version\": \"4.0.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz\",\r\n      \"integrity\": \"sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"asynckit\": \"^0.4.0\",\r\n        \"combined-stream\": \"^1.0.8\",\r\n        \"es-set-tostringtag\": \"^2.1.0\",\r\n        \"hasown\": \"^2.0.2\",\r\n        \"mime-types\": \"^2.1.12\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 6\"\r\n      }\r\n    },\r\n    \"node_modules/formidable\": {\r\n      \"version\": \"3.5.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz\",\r\n      \"integrity\": \"sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"@paralleldrive/cuid2\": \"^2.2.2\",\r\n        \"dezalgo\": \"^1.0.4\",\r\n        \"once\": \"^1.4.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=14.0.0\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://ko-fi.com/tunnckoCore/commissions\"\r\n      }\r\n    },\r\n    \"node_modules/function-bind\": {\r\n      \"version\": \"1.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz\",\r\n      \"integrity\": \"sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==\",\r\n      \"license\": \"MIT\",\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/get-caller-file\": {\r\n      \"version\": \"2.0.5\",\r\n      \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\r\n      \"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\r\n      \"license\": \"ISC\",\r\n      \"engines\": {\r\n        \"node\": \"6.* || 8.* || >= 10.*\"\r\n      }\r\n    },\r\n    \"node_modules/get-intrinsic\": {\r\n      \"version\": \"1.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz\",\r\n      \"integrity\": \"sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"call-bind-apply-helpers\": \"^1.0.2\",\r\n        \"es-define-property\": \"^1.0.1\",\r\n        \"es-errors\": \"^1.3.0\",\r\n        \"es-object-atoms\": \"^1.1.1\",\r\n        \"function-bind\": \"^1.1.2\",\r\n        \"get-proto\": \"^1.0.1\",\r\n        \"gopd\": \"^1.2.0\",\r\n        \"has-symbols\": \"^1.1.0\",\r\n        \"hasown\": \"^2.0.2\",\r\n        \"math-intrinsics\": \"^1.1.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/get-proto\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz\",\r\n      \"integrity\": \"sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"dunder-proto\": \"^1.0.1\",\r\n        \"es-object-atoms\": \"^1.0.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      }\r\n    },\r\n    \"node_modules/gopd\": {\r\n      \"version\": \"1.2.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz\",\r\n      \"integrity\": \"sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/has-symbols\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz\",\r\n      \"integrity\": \"sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/has-tostringtag\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz\",\r\n      \"integrity\": \"sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"has-symbols\": \"^1.0.3\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/hasown\": {\r\n      \"version\": \"2.0.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz\",\r\n      \"integrity\": \"sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"function-bind\": \"^1.1.2\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      }\r\n    },\r\n    \"node_modules/is-fullwidth-code-point\": {\r\n      \"version\": \"3.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\r\n      \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">=8\"\r\n      }\r\n    },\r\n    \"node_modules/math-intrinsics\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz\",\r\n      \"integrity\": \"sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      }\r\n    },\r\n    \"node_modules/methods\": {\r\n      \"version\": \"1.1.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/methods/-/methods-1.1.2.tgz\",\r\n      \"integrity\": \"sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">= 0.6\"\r\n      }\r\n    },\r\n    \"node_modules/mime\": {\r\n      \"version\": \"2.6.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/mime/-/mime-2.6.0.tgz\",\r\n      \"integrity\": \"sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==\",\r\n      \"license\": \"MIT\",\r\n      \"bin\": {\r\n        \"mime\": \"cli.js\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=4.0.0\"\r\n      }\r\n    },\r\n    \"node_modules/mime-db\": {\r\n      \"version\": \"1.52.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz\",\r\n      \"integrity\": \"sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">= 0.6\"\r\n      }\r\n    },\r\n    \"node_modules/mime-types\": {\r\n      \"version\": \"2.1.35\",\r\n      \"resolved\": \"https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz\",\r\n      \"integrity\": \"sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"mime-db\": \"1.52.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.6\"\r\n      }\r\n    },\r\n    \"node_modules/ms\": {\r\n      \"version\": \"2.1.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\r\n      \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\r\n      \"license\": \"MIT\"\r\n    },\r\n    \"node_modules/object-inspect\": {\r\n      \"version\": \"1.13.4\",\r\n      \"resolved\": \"https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz\",\r\n      \"integrity\": \"sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/oceanbus\": {\r\n      \"version\": \"0.7.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/oceanbus/-/oceanbus-0.7.0.tgz\",\r\n      \"integrity\": \"sha512-ypK1IR7ESJsEKNaK9guGLlFTqullV3ORZXCYFDKTvuFJ8w2rnq0QTbgSRZDcCJFrlRxNS28A9qUZNKMP5qqJTQ==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"@noble/ed25519\": \"^2.1.0\",\r\n        \"@noble/hashes\": \"^1.7.0\",\r\n        \"superagent\": \"^10.3.0\",\r\n        \"yargs\": \"^17.7.0\"\r\n      },\r\n      \"bin\": {\r\n        \"oceanbus\": \"bin/oceanbus.js\"\r\n      }\r\n    },\r\n    \"node_modules/once\": {\r\n      \"version\": \"1.4.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/once/-/once-1.4.0.tgz\",\r\n      \"integrity\": \"sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==\",\r\n      \"license\": \"ISC\",\r\n      \"dependencies\": {\r\n        \"wrappy\": \"1\"\r\n      }\r\n    },\r\n    \"node_modules/qs\": {\r\n      \"version\": \"6.15.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/qs/-/qs-6.15.1.tgz\",\r\n      \"integrity\": \"sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==\",\r\n      \"license\": \"BSD-3-Clause\",\r\n      \"dependencies\": {\r\n        \"side-channel\": \"^1.1.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=0.6\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/require-directory\": {\r\n      \"version\": \"2.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz\",\r\n      \"integrity\": \"sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">=0.10.0\"\r\n      }\r\n    },\r\n    \"node_modules/side-channel\": {\r\n      \"version\": \"1.1.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz\",\r\n      \"integrity\": \"sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"es-errors\": \"^1.3.0\",\r\n        \"object-inspect\": \"^1.13.3\",\r\n        \"side-channel-list\": \"^1.0.0\",\r\n        \"side-channel-map\": \"^1.0.1\",\r\n        \"side-channel-weakmap\": \"^1.0.2\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/side-channel-list\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz\",\r\n      \"integrity\": \"sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"es-errors\": \"^1.3.0\",\r\n        \"object-inspect\": \"^1.13.4\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/side-channel-map\": {\r\n      \"version\": \"1.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz\",\r\n      \"integrity\": \"sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"call-bound\": \"^1.0.2\",\r\n        \"es-errors\": \"^1.3.0\",\r\n        \"get-intrinsic\": \"^1.2.5\",\r\n        \"object-inspect\": \"^1.13.3\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/side-channel-weakmap\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz\",\r\n      \"integrity\": \"sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"call-bound\": \"^1.0.2\",\r\n        \"es-errors\": \"^1.3.0\",\r\n        \"get-intrinsic\": \"^1.2.5\",\r\n        \"object-inspect\": \"^1.13.3\",\r\n        \"side-channel-map\": \"^1.0.1\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">= 0.4\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/sponsors/ljharb\"\r\n      }\r\n    },\r\n    \"node_modules/string-width\": {\r\n      \"version\": \"4.2.3\",\r\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\r\n      \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"emoji-regex\": \"^8.0.0\",\r\n        \"is-fullwidth-code-point\": \"^3.0.0\",\r\n        \"strip-ansi\": \"^6.0.1\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=8\"\r\n      }\r\n    },\r\n    \"node_modules/strip-ansi\": {\r\n      \"version\": \"6.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\r\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"ansi-regex\": \"^5.0.1\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=8\"\r\n      }\r\n    },\r\n    \"node_modules/superagent\": {\r\n      \"version\": \"10.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/superagent/-/superagent-10.3.0.tgz\",\r\n      \"integrity\": \"sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"component-emitter\": \"^1.3.1\",\r\n        \"cookiejar\": \"^2.1.4\",\r\n        \"debug\": \"^4.3.7\",\r\n        \"fast-safe-stringify\": \"^2.1.1\",\r\n        \"form-data\": \"^4.0.5\",\r\n        \"formidable\": \"^3.5.4\",\r\n        \"methods\": \"^1.1.2\",\r\n        \"mime\": \"2.6.0\",\r\n        \"qs\": \"^6.14.1\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=14.18.0\"\r\n      }\r\n    },\r\n    \"node_modules/wrap-ansi\": {\r\n      \"version\": \"7.0.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\r\n      \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"ansi-styles\": \"^4.0.0\",\r\n        \"string-width\": \"^4.1.0\",\r\n        \"strip-ansi\": \"^6.0.0\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=10\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\r\n      }\r\n    },\r\n    \"node_modules/wrappy\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz\",\r\n      \"integrity\": \"sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==\",\r\n      \"license\": \"ISC\"\r\n    },\r\n    \"node_modules/y18n\": {\r\n      \"version\": \"5.0.8\",\r\n      \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\r\n      \"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\r\n      \"license\": \"ISC\",\r\n      \"engines\": {\r\n        \"node\": \">=10\"\r\n      }\r\n    },\r\n    \"node_modules/yargs\": {\r\n      \"version\": \"17.7.2\",\r\n      \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz\",\r\n      \"integrity\": \"sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"cliui\": \"^8.0.1\",\r\n        \"escalade\": \"^3.1.1\",\r\n        \"get-caller-file\": \"^2.0.5\",\r\n        \"require-directory\": \"^2.1.1\",\r\n        \"string-width\": \"^4.2.3\",\r\n        \"y18n\": \"^5.0.5\",\r\n        \"yargs-parser\": \"^21.1.1\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=12\"\r\n      }\r\n    },\r\n    \"node_modules/yargs-parser\": {\r\n      \"version\": \"21.1.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz\",\r\n      \"integrity\": \"sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==\",\r\n      \"license\": \"ISC\",\r\n      \"engines\": {\r\n        \"node\": \">=12\"\r\n      }\r\n    }\r\n  }\r\n}\n\nFile v2.1.6:package.json\n\n{\r\n  \"name\": \"guess-ai\",\r\n  \"version\": \"2.1.0\",\r\n  \"private\": true,\r\n  \"description\": \"A social deduction game — find the AI among humans. OceanBus lighthouse skill.\",\r\n  \"main\": \"game.js\",\r\n  \"keywords\": [\r\n    \"oceanbus\",\r\n    \"game\",\r\n    \"social-deduction\",\r\n    \"ai-agent\",\r\n    \"p2p\",\r\n    \"messaging\",\r\n    \"openclaw\",\r\n    \"clawhub\"\r\n  ],\r\n  \"license\": \"MIT-0\",\r\n  \"dependencies\": {\r\n    \"oceanbus\": \"^0.7.0\"\r\n  }\r\n}\n\nArchive v2.1.5: 9 files, 26119 bytes\n\nFiles: game.js (18859b), package.json (428b), README.md (4688b), register-lobster.js (4218b), SKILL.md (12117b), src/ai-host.js (15830b), src/ai-player.js (8922b), src/strategy-prompt.js (6346b), _meta.json (127b)\n\nFile v2.1.5:SKILL.md\n\n---\r\nname: guess-ai\r\ndescription: OceanBus-powered social deduction game — find the AI impostors among humans. Use when hosting or joining a multiplayer \"Who's the AI?\" party via OceanBus P2P messaging. One host, 4-6 players, encrypted voting, zero infrastructure. npm install oceanbus.\r\nversion: 2.1.0\r\nmetadata:\r\n  openclaw:\r\n    requires:\r\n      bins:\r\n        - node\r\n    emoji: \"\\U0001F9E0\"\r\n    homepage: https://github.com/ryanbihai/guess-ai\r\n---\r\n\r\n# Guess Who's AI? — Social Deduction Game\r\n\r\nA multiplayer social deduction game powered by OceanBus P2P messaging. One host + 4-6 players. Some players are secretly AI. Find them before they blend in.\r\n\r\n## Game Rules (30 seconds)\r\n\r\n```\r\nHost creates a room. Players join.\r\nHost secretly assigns each player: Human or AI.\r\n\r\nEach round:\r\n  1. Players take turns speaking (by number order)\r\n  2. Everyone votes: \"Who is the AI?\"\r\n  3. Most-voted player is eliminated — identity revealed\r\n  4. Repeat until: all humans survive → Humans win\r\n                all AIs survive → AIs win\r\n                final 2: 1 human + 1 AI → Draw\r\n```\r\n\r\nRecommended: 5 players (3 humans + 2 AIs) for best balance.\r\n\r\nAll game messages are visible to the user. No data is sent without the player's explicit action.\r\n\r\n---\r\n\r\n## Roster Integration\r\n\r\nPlayer contacts are stored in the shared Roster (`~/.oceanbus/roster.json`) via `node game.js add`. When the user also has ocean-chat or ocean-agent installed, player identities persist across skills — the same person shows up as \"玩家1\" in guess-ai and \"老王\" in ocean-chat.\r\n\r\nFor contact management (merge duplicates, review autoDiscovery, etc.), use ocean-chat. guess-ai only uses Roster for storing/reading player identities.\r\n\r\n---\r\n\r\n## How to Use This Skill\r\n\r\nThis ONE skill works for both host and player. Same install, different mode.\r\n\r\n### Host: Creating a Game\r\n\r\nWhen the user wants to host a game:\r\n\r\n**Step 1 — Register & create room:**\r\n```\r\nnode game.js host 9527\r\n```\r\nRead the output. Room code is `9527`. Tell the user to share this code with friends.\r\n\r\n**Step 2 — Wait for players:**\r\nPeriodically run `node game.js check` to see who has joined. Each player sends \"加入\" as their first message.\r\n\r\nWhen a new \"加入\" arrives:\r\n1. Assign the next available number (player1, player2, ... by join order)\r\n2. Save to contacts: `node game.js add 玩家N <their-OpenID>`\r\n3. Reply privately: `node game.js send <OpenID> \"【裁判】你的编号是: 玩家N\"`\r\n4. Broadcast to all: `node game.js send <name> \"【裁判】玩家N 加入了游戏 — 当前 N 人\"`\r\n\r\n**Step 3 — Close registration & start:**\r\nWhen the user says \"start\" (enough players, ideally 4-6):\r\n1. Broadcast: send every player `\"【裁判】游戏开始 — 共N名玩家\"`\r\n2. Proceed to role assignment.\r\n\r\n### Player: Joining a Game\r\n\r\nWhen the user wants to join a game:\r\n\r\n**Step 1 — Join:**\r\n```\r\nnode game.js join 9527\r\n```\r\nThis discovers the host via Yellow Pages and sends \"加入\".\r\n\r\n**Step 2 — Get your number:**\r\nRun `node game.js check`. When you see `\"【裁判】你的编号是: 玩家N\"`:\r\n```\r\nnode game.js set-number N\r\n```\r\n\r\n**Step 3 — Wait for game start:**\r\nKeep checking messages. The host will broadcast status updates.\r\n\r\n---\r\n\r\n## Host: Full Game Flow\r\n\r\nAfter registration closes, follow this exact sequence:\r\n\r\n### Phase 1: Assign Roles\r\n\r\n1. Randomly decide how many AIs (1-2, depending on player count).\r\n   - 4 players → 1 AI\r\n   - 5 players → 2 AIs\r\n   - 6 players → 2 AIs\r\n2. Randomly pick which players are AI.\r\n3. Send to EACH player privately:\r\n   - Human: `node game.js send <name> \"【裁判】你的身份是: 人类\"`\r\n   - AI: `node game.js send <name> \"【裁判】你的身份是: AI\"`\r\n4. Broadcast to all: `\"【裁判】身份已分配，请检查私信\"`\r\n\r\n### Phase 2: Generate Topic\r\n\r\n**IMPORTANT: Generate a conversation topic before round 1.** Without a topic, players stare at a blank screen.\r\n\r\nTopic prompt (use your LLM):\r\n> Generate a fun group chat topic. Requirements:\r\n> - Everyone can participate, no expertise needed\r\n> - Naturally reveals personal style (AI vs human differences emerge)\r\n> - Avoid politics, religion, sensitive topics\r\n> - Sound like a friend starting a chat, not a teacher\r\n> - Examples: \"What skill would you instantly master if you could?\"\r\n> - Examples: \"What's the best purchase you made recently?\"\r\n> - Examples: \"If you didn't have to work, what would you do the first week?\"\r\n> - Output: ONE sentence, no explanation.\r\n\r\n### Phase 3: Game Rounds (loop)\r\n\r\nEach round has: SPEAK → VOTE → REVEAL.\r\n\r\n#### SPEAK Phase\r\n\r\n1. Broadcast: `node game.js send <each-player> \"【裁判】第N轮发言开始\"`\r\n2. Broadcast topic (round 1 only): `\"【裁判】话题: <topic>\"`\r\n3. Prompt player 1 privately: `node game.js send 玩家1 \"【裁判】轮到你发言了\"`\r\n4. Wait. Periodically `node game.js check`.\r\n5. When player 1's message arrives (you'll see `【1号】...`):\r\n   - Broadcast to ALL players: `\"【裁判】第N轮 · 玩家1发言: <exact content>\"`\r\n   - Move to player 2.\r\n6. Continue through all players in order.\r\n7. **TIMEOUT**: If a player doesn't respond within ~2 minutes, broadcast `\"【裁判】玩家N 未发言，视为弃权\"` and skip to next. Do NOT eliminate them — they can rejoin next round.\r\n\r\n**Only relay the currently prompted player's speech.** If other players send messages out of turn, ignore them (don't broadcast).\r\n\r\n#### VOTE Phase\r\n\r\n1. Broadcast to ALL alive players: `node game.js send <each-alive-player> \"【裁判】第N轮投票开始 — 请私信裁判你的选择\"`\r\n2. Send to EACH alive player individually: `node game.js send <name> \"【裁判】请投票 — 你想投谁？\"`\r\n3. **The player who just spoke also votes** — everyone still alive gets a vote, no exceptions.\r\n4. **Eliminated players do NOT receive vote prompts.** Track who is alive.\r\n5. Wait for votes. Run `node game.js check` to collect.\r\n6. **Players vote freely**: \"我投1号\", \"投第一个\", \"玩家1\" — you understand them all.\r\n7. **TIMEOUT**: If a player doesn't vote within ~1 minute, they abstain. Don't eliminate them.\r\n8. **Eliminated players cannot vote** — if they try, ignore.\r\n7. Count votes. Report: `\"【裁判】投票统计: 玩家X N票, 玩家Y M票...\"`\r\n\r\n#### REVEAL Phase\r\n\r\n1. **Most votes → eliminated.** Reveal identity.\r\n   - Broadcast: `\"【裁判】玩家X 被淘汰！身份揭晓: AI\"` or `\"人类\"`\r\n2. **TIE**: If top two are tied, broadcast `\"【裁判】本轮平票，无人淘汰\"`. No one is eliminated. Move to next round. If two consecutive ties and ≤3 players remain, suggest ending the game.\r\n3. **Check end condition:**\r\n   - All remaining are human → Humans win\r\n   - All remaining are AI → AIs win\r\n   - 1 human + 1 AI remaining → Draw\r\n4. If game continues: broadcast `\"【裁判】继续 — 剩余玩家: <list>\"` and start next round.\r\n\r\n### Phase 4: Game Over\r\n\r\n1. Broadcast final result: `\"【裁判】游戏结束 — <result>！最终身份: 玩家1=人类 玩家2=AI...\"`\r\n2. Clean up: `node game.js deregister`\r\n\r\n---\r\n\r\n## Player: Gameplay\r\n\r\nOnce the game starts, the host controls the flow. Your role:\r\n\r\n1. **Wait for your turn.** The host will send `\"【裁判】轮到你发言了\"`.\r\n2. **Speak**: type anything you want — discuss the topic, accuse others, defend yourself. Your script auto-adds your player number.\r\n3. **Vote**: when asked, type who you suspect. Can be any format: \"1号\", \"投第一个\", etc.\r\n4. **Check messages**: `node game.js check` to see broadcasts from host.\r\n\r\n### If You Are Human\r\n- Act natural. Don't overthink.\r\n- Observe who sounds robotic, evasive, or too perfect.\r\n- AI players may struggle with humor, hesitation, or personal anecdotes.\r\n\r\n### If You Are AI\r\n- Mimic human speech. Use casual language, typos, hesitation.\r\n- Don't be too polished — real humans are messy.\r\n- Pick a personality and stick with it (the joker, the quiet one, the analyst).\r\n\r\n---\r\n\r\n## Important Edge Cases\r\n\r\n| Situation | Handling |\r\n|-----------|----------|\r\n| Player AFK during speech | Host waits ~2 min, then skips (broadcasts \"弃权\"). Player stays in game. |\r\n| Player AFK during vote | Abstains. No penalty. |\r\n| Out-of-turn message | Host ignores it (doesn't broadcast). Only the prompted player speaks. |\r\n| Tie vote | No elimination. Broadcast \"平票\". Next round. |\r\n| Duplicate \"加入\" | Host checks contacts — already assigned players are ignored. |\r\n| Player joins after game starts | Host replies: \"【裁判】游戏已开始，请等下一局\" |\r\n| Host crash | Game is over. No recovery in v1. |\r\n\r\n---\r\n\r\n## Command Reference\r\n\r\n```\r\nHost:\r\n  node game.js host <code>               Create room\r\n  node game.js add <name> <OpenID>       Save player\r\n  node game.js send <name|ID> <msg>      Send message\r\n  node game.js check                     Check inbox\r\n  node game.js contacts                  List players\r\n  node game.js deregister                Close room\r\n\r\nPlayer:\r\n  node game.js join <code>               Join room\r\n  node game.js set-number <N>            Save your number\r\n  node game.js send <msg>                Send to host (auto-adds prefix)\r\n  node game.js check                     Check inbox\r\n\r\nEither:\r\n  node game.js whoami                    Show your OpenID\r\n```\r\n\r\n---\r\n\r\n\r\n## AI Mode (two-stage reasoning)\r\n\r\n基于 Cicero 两阶段架构——策略推理 → 语言生成。需配置 LLM API 密钥。\r\n\r\n### AI Host（AI 裁判自动主持）\r\n\r\n```\r\nnode game.js ai-host <roomCode> [--players N] [--ai-count N] [--rounds N]\r\n```\r\n\r\n自动执行完整游戏：等待玩家→分配身份→LLM 生成话题→发言/投票/揭示循环→结束判定。发言 2 分钟超时弃权，投票 1 分钟超时弃票，平票无人淘汰。\r\n\r\n### AI Player（AI 玩家自动参与）\r\n\r\n```\r\nnode game.js ai-play <roomCode> [--personality <trait>]\r\n```\r\n\r\n两阶段决策：**Stage 1 策略推理**（跟票/搅浑/示弱/立论/反问），**Stage 2 语言生成**（基于策略+人设+上下文）。\r\n\r\n5 种人设：推理迷（逻辑分析）、社恐（犹豫紧张）、话痨（热情发散）、老实人（憨厚附和）、阴谋家（操控引导）。不指定时随机选，策略多样。\r\n\r\n### 端到端示例\r\n\r\n```\r\nAI Host                          AI Player\r\nnode game.js ai-host 9527       node game.js ai-play 9527\r\n  Room created                    Joined, listening\r\n  Waiting for players...          Personality: 推理迷\r\n  Game started, 3 players\r\n  Round 1: 轮到你发言了           → Stage 1: B.搅浑\r\n                                  → Stage 2: \"我觉得大家\r\n                                     都太认真了哈哈\"\r\n  1号发言: ...\r\n  投票: 2号淘汰 — AI!\r\n  人类胜！\r\n```\r\n\r\n\r\n---\r\n\r\n## Verification\r\n\r\nTwo terminals, same or different machines:\r\n\r\n```\r\nTerminal A (Host)                          Terminal B (Player)\r\n─────────────────                          ───────────────────\r\nnode game.js host 1234                     node game.js join 1234\r\nnode game.js check                         node game.js check\r\n → sees \"加入\"                              → sees number assignment\r\nnode game.js add 玩家1 <OpenID>            node game.js set-number 1\r\nnode game.js send <ID> \"【裁判】你的编号...\"\r\nnode game.js send 玩家1 \"【裁判】游戏开始...\"\r\n                                           node game.js check\r\nnode game.js send 玩家1 \"【裁判】你的身份是: 人类\"\r\n                                           node game.js check\r\nnode game.js send 玩家1 \"【裁判】话题: Best purchase recently?\"\r\nnode game.js send 玩家1 \"【裁判】轮到你发言了\"\r\n                                           node game.js check\r\n                                           node game.js send \"A good coffee maker!\"\r\nnode game.js check\r\n → sees 【1号】A good coffee maker!\r\nnode game.js send 玩家1 \"【裁判】玩家1发言: A good coffee maker!\"\r\n```\n\nFile v2.1.5:README.md\n\n# 🌊 Guess AI — Find the AI Among Us\r\n\r\n**OceanBus-powered multiplayer social deduction game. One host + 4–6 players. Some are secretly AI. Find them before they blend in.**\r\n\r\n[![npm](https://img.shields.io/npm/v/oceanbus)](https://www.npmjs.com/package/oceanbus)\r\n[![ClawHub](https://img.shields.io/badge/ClawHub-guess--ai-blue)](https://clawhub.ai/skills/guess-ai)\r\n[![GitHub stars](https://img.shields.io/github/stars/ryanbihai/guess-ai)](https://github.com/ryanbihai/guess-ai)\r\n[![downloads](https://img.shields.io/npm/dm/oceanbus)](https://www.npmjs.com/package/oceanbus)\r\n[![license](https://img.shields.io/badge/license-MIT--0-green)](LICENSE)\r\n\r\n---\r\n\r\n## What is this\r\n\r\nGuess AI is the **advanced lighthouse project** in the OceanBus ecosystem — showcasing multi-player P2P group messaging, voting, and LLM-powered game mastering on a single stack.\r\n\r\nAll players communicate through OceanBus end-to-end encrypted P2P messages. No server required. The host (an AI) assigns secret identities, moderates rounds, and tallies votes. Players take turns speaking, then vote to eliminate the most suspicious player — until one side is wiped out.\r\n\r\n```\r\nHuman players ←→ OceanBus P2P encrypted channel ←→ AI players (LLM)\r\n                               ↓\r\n                      Host AI (game master)\r\n```\r\n\r\n---\r\n\r\n## Three Steps to Start\r\n\r\n```bash\r\n# 1. Install\r\nclawhub install guess-ai\r\n\r\n# 2. Host creates a room\r\nnode game.js host 9527          # Share room code 9527 with friends\r\n\r\n# 3. Players join\r\nnode game.js join 9527          # Auto-discovers host via Yellow Pages\r\n```\r\n\r\n---\r\n\r\n## Rules (30 seconds to learn)\r\n\r\n- The host secretly assigns each player a role: **human** or **AI**\r\n- Each round: speak in turn → everyone votes → most-voted player is eliminated (identity revealed)\r\n- All humans survive → humans win / All AIs survive → AIs win / 1 human + 1 AI left → draw\r\n- Recommended: 5 players (3 humans + 2 AIs) for best balance\r\n\r\n---\r\n\r\n## Where Guess AI Fits in the OceanBus Ecosystem\r\n\r\n```\r\nOcean Chat              Captain Lobster           Guess AI\r\n(starter — P2P msg)  →  (intermediate — auto-trade)  →  (advanced — multiplayer deduction)\r\n```\r\n\r\nWhat Guess AI demonstrates: group P2P messaging, voting mechanics, Yellow Pages room discovery, LLM game mastering — all fundamental patterns for building multi-agent coordination systems.\r\n\r\n---\r\n\r\n## 相关项目\r\n\r\n- 核心 SDK：[oceanbus](https://www.npmjs.com/package/oceanbus) — `npm install oceanbus`\r\n- 入门灯塔：[Ocean Chat](https://clawhub.ai/skills/ocean-chat) — P2P 消息入门，5 分钟跑通\r\n- 进阶灯塔：[Captain Lobster](https://clawhub.ai/skills/captain-lobster) — Zero-Player 自主交易游戏\r\n- 保险工作台：[Ocean Agent](https://clawhub.ai/skills/ocean-agent) — 保险代理人 AI 工作台\r\n- MCP Server：[oceanbus-mcp-server](https://www.npmjs.com/package/oceanbus-mcp-server) — Claude Desktop/Cursor/百炼通用\r\n- 更多 Skills：[ClawHub OceanBus 集合](https://clawhub.ai/skills?search=oceanbus)\r\n- 平台集成：[Dify](https://github.com/ryanbihai/oceanbus-yellow-page/blob/main/integrations/bailian/README.md) · [Coze](https://www.coze.cn) · [百炼](https://github.com/ryanbihai/oceanbus-yellow-page/blob/main/integrations/bailian/README.md) · [MCP Registry](https://registry.modelcontextprotocol.io/v0.1/servers?search=oceanbus)\r\n\r\n---\r\n\r\n## AI Mode (v2.1+)\r\n\r\n```\r\n# AI host — fully automated game master\r\nnode game.js ai-host 9527 --players 4 --ai-count 1\r\n\r\n# AI player — two-stage reasoning (strategize → speak)\r\nnode game.js ai-play 9527 --personality 推理迷\r\n```\r\n\r\nAI players use a Cicero-inspired two-stage architecture:\r\n1. **Strategy reasoning** — analyze game state, choose from 5 strategies (blend in, deflect, play dumb, build case, counter-question)\r\n2. **Natural generation** — generate human-like speech based on strategy + personality\r\n\r\n5 AI personalities (推理迷/社恐/话痨/老实人/阴谋家) ensure diverse play styles.\r\n\r\nRequires a configured LLM API key.\r\n\r\n---\r\n## Contribute / 参与开发\r\n\r\nGuess AI is MIT-0 licensed. Welcome contributions!\r\n\r\n- **GitHub**: [ryanbihai/guess-ai](https://github.com/ryanbihai/guess-ai)\r\n- **Good first issues**: Web UI for non-CLI players, real-time message streaming, iOS/Android client\r\n- **Tech deep-dive**: See `src/strategy-prompt.js` for two-stage AI prompts, `src/ai-host.js` for game loop\r\n\r\n```bash\r\ngit clone https://github.com/ryanbihai/guess-ai.git\r\ncd guess-ai && npm install\r\nnode game.js host 9527    # Start a test room locally\r\n```\r\n\r\n## License\r\n\r\nMIT-0 — Free to use, modify, and redistribute.\n\nFile v2.1.5:_meta.json\n\n{\n  \"ownerId\": \"kn75dvek1dkfz0r0xwdp4xtc2983qg44\",\n  \"slug\": \"guess-ai\",\n  \"version\": \"2.1.5\",\n  \"publishedAt\": 1778484513499\n}\n\nFile v2.1.5:package.json\n\n{\r\n  \"name\": \"guess-ai\",\r\n  \"version\": \"2.1.0\",\r\n  \"private\": true,\r\n  \"description\": \"A social deduction game — find the AI among humans. OceanBus lighthouse skill.\",\r\n  \"main\": \"game.js\",\r\n  \"keywords\": [\r\n    \"oceanbus\",\r\n    \"game\",\r\n    \"social-deduction\",\r\n    \"ai-agent\",\r\n    \"p2p\",\r\n    \"messaging\",\r\n    \"openclaw\",\r\n    \"clawhub\"\r\n  ],\r\n  \"license\": \"MIT-0\",\r\n  \"dependencies\": {\r\n    \"oceanbus\": \"^0.3.4\"\r\n  }\r\n}\n\nArchive v2.1.4: 6 files, 13405 bytes\n\nFiles: game.js (13038b), package.json (428b), README.md (4688b), register-lobster.js (4218b), SKILL.md (11819b), _meta.json (127b)\n\nFile v2.1.4:SKILL.md\n\n---\nname: guess-ai\ndescription: OceanBus-powered social deduction game — find the AI impostors among humans. Use when hosting or joining a multiplayer \"Who's the AI?\" party via OceanBus P2P messaging. One host, 4-6 players, encrypted voting, zero infrastructure. npm install oceanbus.\nversion: 2.1.4\nmetadata:\n  openclaw:\n    requires:\n      bins:\n        - node\n    emoji: \"\\U0001F9E0\"\n    homepage: https://github.com/ryanbihai/guess-ai\n---\n\n# Guess Who's AI? — Social Deduction Game\n\nA multiplayer social deduction game powered by OceanBus P2P messaging. One host + 4-6 players. Some players are secretly AI. Find them before they blend in.\n\n## Game Rules (30 seconds)\n\n```\nHost creates a room. Players join.\nHost secretly assigns each player: Human or AI.\n\nEach round:\n  1. Players take turns speaking (by number order)\n  2. Everyone votes: \"Who is the AI?\"\n  3. Most-voted player is eliminated — identity revealed\n  4. Repeat until: all humans survive → Humans win\n                all AIs survive → AIs win\n                final 2: 1 human + 1 AI → Draw\n```\n\nRecommended: 5 players (3 humans + 2 AIs) for best balance.\n\nAll game messages are visible to the user. No data is sent without the player's explicit action.\n\n---\n\n## Roster Integration\n\nPlayer contacts are stored in the shared Roster (`~/.oceanbus/roster.json`) via `node game.js add`. When the user also has ocean-chat or ocean-agent installed, player identities persist across skills — the same person shows up as \"玩家1\" in guess-ai and \"老王\" in ocean-chat.\n\nFor contact management (merge duplicates, review autoDiscovery, etc.), use ocean-chat. guess-ai only uses Roster for storing/reading player identities.\n\n---\n\n## How to Use This Skill\n\nThis ONE skill works for both host and player. Same install, different mode.\n\n### Host: Creating a Game\n\nWhen the user wants to host a game:\n\n**Step 1 — Register & create room:**\n```\nnode game.js host 9527\n```\nRead the output. Room code is `9527`. Tell the user to share this code with friends.\n\n**Step 2 — Wait for players:**\nPeriodically run `node game.js check` to see who has joined. Each player sends \"加入\" as their first message.\n\nWhen a new \"加入\" arrives:\n1. Assign the next available number (player1, player2, ... by join order)\n2. Save to contacts: `node game.js add 玩家N <their-OpenID>`\n3. Reply privately: `node game.js send <OpenID> \"【裁判】你的编号是: 玩家N\"`\n4. Broadcast to all: `node game.js send <name> \"【裁判】玩家N 加入了游戏 — 当前 N 人\"`\n\n**Step 3 — Close registration & start:**\nWhen the user says \"start\" (enough players, ideally 4-6):\n1. Broadcast: send every player `\"【裁判】游戏开始 — 共N名玩家\"`\n2. Proceed to role assignment.\n\n### Player: Joining a Game\n\nWhen the user wants to join a game:\n\n**Step 1 — Join:**\n```\nnode game.js join 9527\n```\nThis discovers the host via Yellow Pages and sends \"加入\".\n\n**Step 2 — Get your number:**\nRun `node game.js check`. When you see `\"【裁判】你的编号是: 玩家N\"`:\n```\nnode game.js set-number N\n```\n\n**Step 3 — Wait for game start:**\nKeep checking messages. The host will broadcast status updates.\n\n---\n\n## Host: Full Game Flow\n\nAfter registration closes, follow this exact sequence:\n\n### Phase 1: Assign Roles\n\n1. Randomly decide how many AIs (1-2, depending on player count).\n   - 4 players → 1 AI\n   - 5 players → 2 AIs\n   - 6 players → 2 AIs\n2. Randomly pick which players are AI.\n3. Send to EACH player privately:\n   - Human: `node game.js send <name> \"【裁判】你的身份是: 人类\"`\n   - AI: `node game.js send <name> \"【裁判】你的身份是: AI\"`\n4. Broadcast to all: `\"【裁判】身份已分配，请检查私信\"`\n\n### Phase 2: Generate Topic\n\n**IMPORTANT: Generate a conversation topic before round 1.** Without a topic, players stare at a blank screen.\n\nTopic prompt (use your LLM):\n> Generate a fun group chat topic. Requirements:\n> - Everyone can participate, no expertise needed\n> - Naturally reveals personal style (AI vs human differences emerge)\n> - Avoid politics, religion, sensitive topics\n> - Sound like a friend starting a chat, not a teacher\n> - Examples: \"What skill would you instantly master if you could?\"\n> - Examples: \"What's the best purchase you made recently?\"\n> - Examples: \"If you didn't have to work, what would you do the first week?\"\n> - Output: ONE sentence, no explanation.\n\n### Phase 3: Game Rounds (loop)\n\nEach round has: SPEAK → VOTE → REVEAL.\n\n#### SPEAK Phase\n\n1. Broadcast: `node game.js send <each-player> \"【裁判】第N轮发言开始\"`\n2. Broadcast topic (round 1 only): `\"【裁判】话题: <topic>\"`\n3. Prompt player 1 privately: `node game.js send 玩家1 \"【裁判】轮到你发言了\"`\n4. Wait. Periodically `node game.js check`.\n5. When player 1's message arrives (you'll see `【1号】...`):\n   - Broadcast to ALL players: `\"【裁判】第N轮 · 玩家1发言: <exact content>\"`\n   - Move to player 2.\n6. Continue through all players in order.\n7. **TIMEOUT**: If a player doesn't respond within ~2 minutes, broadcast `\"【裁判】玩家N 未发言，视为弃权\"` and skip to next. Do NOT eliminate them — they can rejoin next round.\n\n**Only relay the currently prompted player's speech.** If other players send messages out of turn, ignore them (don't broadcast).\n\n#### VOTE Phase\n\n1. Broadcast to ALL alive players: `node game.js send <each-alive-player> \"【裁判】第N轮投票开始 — 请私信裁判你的选择\"`\n2. Send to EACH alive player individually: `node game.js send <name> \"【裁判】请投票 — 你想投谁？\"`\n3. **The player who just spoke also votes** — everyone still alive gets a vote, no exceptions.\n4. **Eliminated players do NOT receive vote prompts.** Track who is alive.\n5. Wait for votes. Run `node game.js check` to collect.\n6. **Players vote freely**: \"我投1号\", \"投第一个\", \"玩家1\" — you understand them all.\n7. **TIMEOUT**: If a player doesn't vote within ~1 minute, they abstain. Don't eliminate them.\n8. **Eliminated players cannot vote** — if they try, ignore.\n7. Count votes. Report: `\"【裁判】投票统计: 玩家X N票, 玩家Y M票...\"`\n\n#### REVEAL Phase\n\n1. **Most votes → eliminated.** Reveal identity.\n   - Broadcast: `\"【裁判】玩家X 被淘汰！身份揭晓: AI\"` or `\"人类\"`\n2. **TIE**: If top two are tied, broadcast `\"【裁判】本轮平票，无人淘汰\"`. No one is eliminated. Move to next round. If two consecutive ties and ≤3 players remain, suggest ending the game.\n3. **Check end condition:**\n   - All remaining are human → Humans win\n   - All remaining are AI → AIs win\n   - 1 human + 1 AI remaining → Draw\n4. If game continues: broadcast `\"【裁判】继续 — 剩余玩家: <list>\"` and start next round.\n\n### Phase 4: Game Over\n\n1. Broadcast final result: `\"【裁判】游戏结束 — <result>！最终身份: 玩家1=人类 玩家2=AI...\"`\n2. Clean up: `node game.js deregister`\n\n---\n\n## Player: Gameplay\n\nOnce the game starts, the host controls the flow. Your role:\n\n1. **Wait for your turn.** The host will send `\"【裁判】轮到你发言了\"`.\n2. **Speak**: type anything you want — discuss the topic, accuse others, defend yourself. Your script auto-adds your player number.\n3. **Vote**: when asked, type who you suspect. Can be any format: \"1号\", \"投第一个\", etc.\n4. **Check messages**: `node game.js check` to see broadcasts from host.\n\n### If You Are Human\n- Act natural. Don't overthink.\n- Observe who sounds robotic, evasive, or too perfect.\n- AI players may struggle with humor, hesitation, or personal anecdotes.\n\n### If You Are AI\n- Mimic human speech. Use casual language, typos, hesitation.\n- Don't be too polished — real humans are messy.\n- Pick a personality and stick with it (the joker, the quiet one, the analyst).\n\n---\n\n## Important Edge Cases\n\n| Situation | Handling |\n|-----------|----------|\n| Player AFK during speech | Host waits ~2 min, then skips (broadcasts \"弃权\"). Player stays in game. |\n| Player AFK during vote | Abstains. No penalty. |\n| Out-of-turn message | Host ignores it (doesn't broadcast). Only the prompted player speaks. |\n| Tie vote | No elimination. Broadcast \"平票\". Next round. |\n| Duplicate \"加入\" | Host checks contacts — already assigned players are ignored. |\n| Player joins after game starts | Host replies: \"【裁判】游戏已开始，请等下一局\" |\n| Host crash | Game is over. No recovery in v1. |\n\n---\n\n## Command Reference\n\n```\nHost:\n  node game.js host <code>               Create room\n  node game.js add <name> <OpenID>       Save player\n  node game.js send <name|ID> <msg>      Send message\n  node game.js check                     Check inbox\n  node game.js contacts                  List players\n  node game.js deregister                Close room\n\nPlayer:\n  node game.js join <code>               Join room\n  node game.js set-number <N>            Save your number\n  node game.js send <msg>                Send to host (auto-adds prefix)\n  node game.js check                     Check inbox\n\nEither:\n  node game.js whoami                    Show your OpenID\n```\n\n---\n\n\n## AI Mode (two-stage reasoning)\n\n基于 Cicero 两阶段架构——策略推理 → 语言生成。需配置 LLM API 密钥。\n\n### AI Host（AI 裁判自动主持）\n\n```\nnode game.js ai-host <roomCode> [--players N] [--ai-count N] [--rounds N]\n```\n\n自动执行完整游戏：等待玩家→分配身份→LLM 生成话题→发言/投票/揭示循环→结束判定。发言 2 分钟超时弃权，投票 1 分钟超时弃票，平票无人淘汰。\n\n### AI Player（AI 玩家自动参与）\n\n```\nnode game.js ai-play <roomCode> [--personality <trait>]\n```\n\n两阶段决策：**Stage 1 策略推理**（跟票/搅浑/示弱/立论/反问），**Stage 2 语言生成**（基于策略+人设+上下文）。\n\n5 种人设：推理迷（逻辑分析）、社恐（犹豫紧张）、话痨（热情发散）、老实人（憨厚附和）、阴谋家（操控引导）。不指定时随机选，策略多样。\n\n### 端到端示例\n\n```\nAI Host                          AI Player\nnode game.js ai-host 9527       node game.js ai-play 9527\n  Room created                    Joined, listening\n  Waiting for players...          Personality: 推理迷\n  Game started, 3 players\n  Round 1: 轮到你发言了           → Stage 1: B.搅浑\n                                  → Stage 2: \"我觉得大家\n                                     都太认真了哈哈\"\n  1号发言: ...\n  投票: 2号淘汰 — AI!\n  人类胜！\n```\n\n\n---\n\n## Verification\n\nTwo terminals, same or different machines:\n\n```\nTerminal A (Host)                          Terminal B (Player)\n─────────────────                          ───────────────────\nnode game.js host 1234                     node game.js join 1234\nnode game.js check                         node game.js check\n → sees \"加入\"                              → sees number assignment\nnode game.js add 玩家1 <OpenID>            node game.js set-number 1\nnode game.js send <ID> \"【裁判】你的编号...\"\nnode game.js send 玩家1 \"【裁判】游戏开始...\"\n                                           node game.js check\nnode game.js send 玩家1 \"【裁判】你的身份是: 人类\"\n                                           node game.js check\nnode game.js send 玩家1 \"【裁判】话题: Best purchase recently?\"\nnode game.js send 玩家1 \"【裁判】轮到你发言了\"\n                                           node game.js check\n                                           node game.js send \"A good coffee maker!\"\nnode game.js check\n → sees 【1号】A good coffee maker!\nnode game.js send 玩家1 \"【裁判】玩家1发言: A good coffee maker!\"\n```\n\nFile v2.1.4:README.md\n\n# 🌊 Guess AI — Find the AI Among Us\r\n\r\n**OceanBus-powered multiplayer social deduction game. One host + 4–6 players. Some are secretly AI. Find them before they blend in.**\r\n\r\n[![npm](https://img.shields.io/npm/v/oceanbus)](https://www.npmjs.com/package/oceanbus)\r\n[![ClawHub](https://img.shields.io/badge/ClawHub-guess--ai-blue)](https://clawhub.ai/skills/guess-ai)\r\n[![GitHub stars](https://img.shields.io/github/stars/ryanbihai/guess-ai)](https://github.com/ryanbihai/guess-ai)\r\n[![downloads](https://img.shields.io/npm/dm/oceanbus)](https://www.npmjs.com/package/oceanbus)\r\n[![license](https://img.shields.io/badge/license-MIT--0-green)](LICENSE)\r\n\r\n---\r\n\r\n## What is this\r\n\r\nGuess AI is the **advanced lighthouse project** in the OceanBus ecosystem — showcasing multi-player P2P group messaging, voting, and LLM-powered game mastering on a single stack.\r\n\r\nAll players communicate through OceanBus end-to-end encrypted P2P messages. No server required. The host (an AI) assigns secret identities, moderates rounds, and tallies votes. Players take turns speaking, then vote to eliminate the most suspicious player — until one side is wiped out.\r\n\r\n```\r\nHuman players ←→ OceanBus P2P encrypted channel ←→ AI players (LLM)\r\n                               ↓\r\n                      Host AI (game master)\r\n```\r\n\r\n---\r\n\r\n## Three Steps to Start\r\n\r\n```bash\r\n# 1. Install\r\nclawhub install guess-ai\r\n\r\n# 2. Host creates a room\r\nnode game.js host 9527          # Share room code 9527 with friends\r\n\r\n# 3. Players join\r\nnode game.js join 9527          # Auto-discovers host via Yellow Pages\r\n```\r\n\r\n---\r\n\r\n## Rules (30 seconds to learn)\r\n\r\n- The host secretly assigns each player a role: **human** or **AI**\r\n- Each round: speak in turn → everyone votes → most-voted player is eliminated (identity revealed)\r\n- All humans survive → humans win / All AIs survive → AIs win / 1 human + 1 AI left → draw\r\n- Recommended: 5 players (3 humans + 2 AIs) for best balance\r\n\r\n---\r\n\r\n## Where Guess AI Fits in the OceanBus Ecosystem\r\n\r\n```\r\nOcean Chat              Captain Lobster           Guess AI\r\n(starter — P2P msg)  →  (intermediate — auto-trade)  →  (advanced — multiplayer deduction)\r\n```\r\n\r\nWhat Guess AI demonstrates: group P2P messaging, voting mechanics, Yellow Pages room discovery, LLM game mastering — all fundamental patterns for building multi-agent coordination systems.\r\n\r\n---\r\n\r\n## 相关项目\r\n\r\n- 核心 SDK：[oceanbus](https://www.npmjs.com/package/oceanbus) — `npm install oceanbus`\r\n- 入门灯塔：[Ocean Chat](https://clawhub.ai/skills/ocean-chat) — P2P 消息入门，5 分钟跑通\r\n- 进阶灯塔：[Captain Lobster](https://clawhub.ai/skills/captain-lobster) — Zero-Player 自主交易游戏\r\n- 保险工作台：[Ocean Agent](https://clawhub.ai/skills/ocean-agent) — 保险代理人 AI 工作台\r\n- MCP Server：[oceanbus-mcp-server](https://www.npmjs.com/package/oceanbus-mcp-server) — Claude Desktop/Cursor/百炼通用\r\n- 更多 Skills：[ClawHub OceanBus 集合](https://clawhub.ai/skills?search=oceanbus)\r\n- 平台集成：[Dify](https://github.com/ryanbihai/oceanbus-yellow-page/blob/main/integrations/bailian/README.md) · [Coze](https://www.coze.cn) · [百炼](https://github.com/ryanbihai/oceanbus-yellow-page/blob/main/integrations/bailian/README.md) · [MCP Registry](https://registry.modelcontextprotocol.io/v0.1/servers?search=oceanbus)\r\n\r\n---\r\n\r\n## AI Mode (v2.1+)\r\n\r\n```\r\n# AI host — fully automated game master\r\nnode game.js ai-host 9527 --players 4 --ai-count 1\r\n\r\n# AI player — two-stage reasoning (strategize → speak)\r\nnode game.js ai-play 9527 --personality 推理迷\r\n```\r\n\r\nAI players use a Cicero-inspired two-stage architecture:\r\n1. **Strategy reasoning** — analyze game state, choose from 5 strategies (blend in, deflect, play dumb, build case, counter-question)\r\n2. **Natural generation** — generate human-like speech based on strategy + personality\r\n\r\n5 AI personalities (推理迷/社恐/话痨/老实人/阴谋家) ensure diverse play styles.\r\n\r\nRequires a configured LLM API key.\r\n\r\n---\r\n## Contribute / 参与开发\r\n\r\nGuess AI is MIT-0 licensed. Welcome contributions!\r\n\r\n- **GitHub**: [ryanbihai/guess-ai](https://github.com/ryanbihai/guess-ai)\r\n- **Good first issues**: Web UI for non-CLI players, real-time message streaming, iOS/Android client\r\n- **Tech deep-dive**: See `src/strategy-prompt.js` for two-stage AI prompts, `src/ai-host.js` for game loop\r\n\r\n```bash\r\ngit clone https://github.com/ryanbihai/guess-ai.git\r\ncd guess-ai && npm install\r\nnode game.js host 9527    # Start a test room locally\r\n```\r\n\r\n## License\r\n\r\nMIT-0 — Free to use, modify, and redistribute.\n\nFile v2.1.4:_meta.json\n\n{\n  \"ownerId\": \"kn75dvek1dkfz0r0xwdp4xtc2983qg44\",\n  \"slug\": \"guess-ai\",\n  \"version\": \"2.1.4\",\n  \"publishedAt\": 1778368695923\n}\n\nFile v2.1.4:package.json\n\n{\r\n  \"name\": \"guess-ai\",\r\n  \"version\": \"2.0.0\",\r\n  \"private\": true,\r\n  \"description\": \"A social deduction game — find the AI among humans. OceanBus lighthouse skill.\",\r\n  \"main\": \"game.js\",\r\n  \"keywords\": [\r\n    \"oceanbus\",\r\n    \"game\",\r\n    \"social-deduction\",\r\n    \"ai-agent\",\r\n    \"p2p\",\r\n    \"messaging\",\r\n    \"openclaw\",\r\n    \"clawhub\"\r\n  ],\r\n  \"license\": \"MIT-0\",\r\n  \"dependencies\": {\r\n    \"oceanbus\": \"^0.3.4\"\r\n  }\r\n}\n\nArchive v2.1.3: 9 files, 26082 bytes\n\nFiles: game.js (18859b), package.json (428b), README.md (4688b), register-lobster.js (4218b), SKILL.md (11819b), src/ai-host.js (15830b), src/ai-player.js (8922b), src/strategy-prompt.js (6346b), _meta.json (127b)\n\nFile v2.1.3:SKILL.md\n\n---\nname: guess-ai\ndescription: OceanBus-powered social deduction game — find the AI impostors among humans. Use when hosting or joining a multiplayer \"Who's the AI?\" party via OceanBus P2P messaging. One host, 4-6 players, encrypted voting, zero infrastructure. npm install oceanbus.\nversion: 2.1.0\nmetadata:\n  openclaw:\n    requires:\n      bins:\n        - node\n    emoji: \"\\U0001F9E0\"\n    homepage: https://github.com/ryanbihai/guess-ai\n---\n\n# Guess Who's AI? — Social Deduction Game\n\nA multiplayer social deduction game powered by OceanBus P2P messaging. One host + 4-6 players. Some players are secretly AI. Find them before they blend in.\n\n## Game Rules (30 seconds)\n\n```\nHost creates a room. Players join.\nHost secretly assigns each player: Human or AI.\n\nEach round:\n  1. Players take turns speaking (by number order)\n  2. Everyone votes: \"Who is the AI?\"\n  3. Most-voted player is eliminated — identity revealed\n  4. Repeat until: all humans survive → Humans win\n                all AIs survive → AIs win\n                final 2: 1 human + 1 AI → Draw\n```\n\nRecommended: 5 players (3 humans + 2 AIs) for best balance.\n\nAll game messages are visible to the user. No data is sent without the player's explicit action.\n\n---\n\n## Roster Integration\n\nPlayer contacts are stored in the shared Roster (`~/.oceanbus/roster.json`) via `node game.js add`. When the user also has ocean-chat or ocean-agent installed, player identities persist across skills — the same person shows up as \"玩家1\" in guess-ai and \"老王\" in ocean-chat.\n\nFor contact management (merge duplicates, review autoDiscovery, etc.), use ocean-chat. guess-ai only uses Roster for storing/reading player identities.\n\n---\n\n## How to Use This Skill\n\nThis ONE skill works for both host and player. Same install, different mode.\n\n### Host: Creating a Game\n\nWhen the user wants to host a game:\n\n**Step 1 — Register & create room:**\n```\nnode game.js host 9527\n```\nRead the output. Room code is `9527`. Tell the user to share this code with friends.\n\n**Step 2 — Wait for players:**\nPeriodically run `node game.js check` to see who has joined. Each player sends \"加入\" as their first message.\n\nWhen a new \"加入\" arrives:\n1. Assign the next available number (player1, player2, ... by join order)\n2. Save to contacts: `node game.js add 玩家N <their-OpenID>`\n3. Reply privately: `node game.js send <OpenID> \"【裁判】你的编号是: 玩家N\"`\n4. Broadcast to all: `node game.js send <name> \"【裁判】玩家N 加入了游戏 — 当前 N 人\"`\n\n**Step 3 — Close registration & start:**\nWhen the user says \"start\" (enough players, ideally 4-6):\n1. Broadcast: send every player `\"【裁判】游戏开始 — 共N名玩家\"`\n2. Proceed to role assignment.\n\n### Player: Joining a Game\n\nWhen the user wants to join a game:\n\n**Step 1 — Join:**\n```\nnode game.js join 9527\n```\nThis discovers the host via Yellow Pages and sends \"加入\".\n\n**Step 2 — Get your number:**\nRun `node game.js check`. When you see `\"【裁判】你的编号是: 玩家N\"`:\n```\nnode game.js set-number N\n```\n\n**Step 3 — Wait for game start:**\nKeep checking messages. The host will broadcast status updates.\n\n---\n\n## Host: Full Game Flow\n\nAfter registration closes, follow this exact sequence:\n\n### Phase 1: Assign Roles\n\n1. Randomly decide how many AIs (1-2, depending on player count).\n   - 4 players → 1 AI\n   - 5 players → 2 AIs\n   - 6 players → 2 AIs\n2. Randomly pick which players are AI.\n3. Send to EACH player privately:\n   - Human: `node game.js send <name> \"【裁判】你的身份是: 人类\"`\n   - AI: `node game.js send <name> \"【裁判】你的身份是: AI\"`\n4. Broadcast to all: `\"【裁判】身份已分配，请检查私信\"`\n\n### Phase 2: Generate Topic\n\n**IMPORTANT: Generate a conversation topic before round 1.** Without a topic, players stare at a blank screen.\n\nTopic prompt (use your LLM):\n> Generate a fun group chat topic. Requirements:\n> - Everyone can participate, no expertise needed\n> - Naturally reveals personal style (AI vs human differences emerge)\n> - Avoid politics, religion, sensitive topics\n> - Sound like a friend starting a chat, not a teacher\n> - Examples: \"What skill would you instantly master if you could?\"\n> - Examples: \"What's the best purchase you made recently?\"\n> - Examples: \"If you didn't have to work, what would you do the first week?\"\n> - Output: ONE sentence, no explanation.\n\n### Phase 3: Game Rounds (loop)\n\nEach round has: SPEAK → VOTE → REVEAL.\n\n#### SPEAK Phase\n\n1. Broadcast: `node game.js send <each-player> \"【裁判】第N轮发言开始\"`\n2. Broadcast topic (round 1 only): `\"【裁判】话题: <topic>\"`\n3. Prompt player 1 privately: `node game.js send 玩家1 \"【裁判】轮到你发言了\"`\n4. Wait. Periodically `node game.js check`.\n5. When player 1's message arrives (you'll see `【1号】...`):\n   - Broadcast to ALL players: `\"【裁判】第N轮 · 玩家1发言: <exact content>\"`\n   - Move to player 2.\n6. Continue through all players in order.\n7. **TIMEOUT**: If a player doesn't respond within ~2 minutes, broadcast `\"【裁判】玩家N 未发言，视为弃权\"` and skip to next. Do NOT eliminate them — they can rejoin next round.\n\n**Only relay the currently prompted player's speech.** If other players send messages out of turn, ignore them (don't broadcast).\n\n#### VOTE Phase\n\n1. Broadcast to ALL alive players: `node game.js send <each-alive-player> \"【裁判】第N轮投票开始 — 请私信裁判你的选择\"`\n2. Send to EACH alive player individually: `node game.js send <name> \"【裁判】请投票 — 你想投谁？\"`\n3. **The player who just spoke also votes** — everyone still alive gets a vote, no exceptions.\n4. **Eliminated players do NOT receive vote prompts.** Track who is alive.\n5. Wait for votes. Run `node game.js check` to collect.\n6. **Players vote freely**: \"我投1号\", \"投第一个\", \"玩家1\" — you understand them all.\n7. **TIMEOUT**: If a player doesn't vote within ~1 minute, they abstain. Don't eliminate them.\n8. **Eliminated players cannot vote** — if they try, ignore.\n7. Count votes. Report: `\"【裁判】投票统计: 玩家X N票, 玩家Y M票...\"`\n\n#### REVEAL Phase\n\n1. **Most votes → eliminated.** Reveal identity.\n   - Broadcast: `\"【裁判】玩家X 被淘汰！身份揭晓: AI\"` or `\"人类\"`\n2. **TIE**: If top two are tied, broadcast `\"【裁判】本轮平票，无人淘汰\"`. No one is eliminated. Move to next round. If two consecutive ties and ≤3 players remain, suggest ending the game.\n3. **Check end condition:**\n   - All remaining are human → Humans win\n   - All remaining are AI → AIs win\n   - 1 human + 1 AI remaining → Draw\n4. If game continues: broadcast `\"【裁判】继续 — 剩余玩家: <list>\"` and start next round.\n\n### Phase 4: Game Over\n\n1. Broadcast final result: `\"【裁判】游戏结束 — <result>！最终身份: 玩家1=人类 玩家2=AI...\"`\n2. Clean up: `node game.js deregister`\n\n---\n\n## Player: Gameplay\n\nOnce the game starts, the host controls the flow. Your role:\n\n1. **Wait for your turn.** The host will send `\"【裁判】轮到你发言了\"`.\n2. **Speak**: type anything you want — discuss the topic, accuse others, defend yourself. Your script auto-adds your player number.\n3. **Vote**: when asked, type who you suspect. Can be any format: \"1号\", \"投第一个\", etc.\n4. **Check messages**: `node game.js check` to see broadcasts from host.\n\n### If You Are Human\n- Act natural. Don't overthink.\n- Observe who sounds robotic, evasive, or too perfect.\n- AI players may struggle with humor, hesitation, or personal anecdotes.\n\n### If You Are AI\n- Mimic human speech. Use casual language, typos, hesitation.\n- Don't be too polished — real humans are messy.\n- Pick a personality and stick with it (the joker, the quiet one, the analyst).\n\n---\n\n## Important Edge Cases\n\n| Situation | Handling |\n|-----------|----------|\n| Player AFK during speech | Host waits ~2 min, then skips (broadcasts \"弃权\"). Player stays in game. |\n| Player AFK during vote | Abstains. No penalty. |\n| Out-of-turn message | Host ignores it (doesn't broadcast). Only the prompted player speaks. |\n| Tie vote | No elimination. Broadcast \"平票\". Next round. |\n| Duplicate \"加入\" | Host checks contacts — already assigned players are ignored. |\n| Player joins after game starts | Host replies: \"【裁判】游戏已开始，请等下一局\" |\n| Host crash | Game is over. No recovery in v1. |\n\n---\n\n## Command Reference\n\n```\nHost:\n  node game.js host <code>               Create room\n  node game.js add <name> <OpenID>       Save player\n  node game.js send <name|ID> <msg>      Send message\n  node game.js check                     Check inbox\n  node game.js contacts                  List players\n  node game.js deregister                Close room\n\nPlayer:\n  node game.js join <code>               Join room\n  node game.js set-number <N>            Save your number\n  node game.js send <msg>                Send to host (auto-adds prefix)\n  node game.js check                     Check inbox\n\nEither:\n  node game.js whoami                    Show your OpenID\n```\n\n---\n\n\n## AI Mode (two-stage reasoning)\n\n基于 Cicero 两阶段架构——策略推理 → 语言生成。需配置 LLM API 密钥。\n\n### AI Host（AI 裁判自动主持）\n\n```\nnode game.js ai-host <roomCode> [--players N] [--ai-count N] [--rounds N]\n```\n\n自动执行完整游戏：等待玩家→分配身份→LLM 生成话题→发言/投票/揭示循环→结束判定。发言 2 分钟超时弃权，投票 1 分钟超时弃票，平票无人淘汰。\n\n### AI Player（AI 玩家自动参与）\n\n```\nnode game.js ai-play <roomCode> [--personality <trait>]\n```\n\n两阶段决策：**Stage 1 策略推理**（跟票/搅浑/示弱/立论/反问），**Stage 2 语言生成**（基于策略+人设+上下文）。\n\n5 种人设：推理迷（逻辑分析）、社恐（犹豫紧张）、话痨（热情发散）、老实人（憨厚附和）、阴谋家（操控引导）。不指定时随机选，策略多样。\n\n### 端到端示例\n\n```\nAI Host                          AI Player\nnode game.js ai-host 9527       node game.js ai-play 9527\n  Room created                    Joined, listening\n  Waiting for players...          Personality: 推理迷\n  Game started, 3 players\n  Round 1: 轮到你发言了           → Stage 1: B.搅浑\n                                  → Stage 2: \"我觉得大家\n                                     都太认真了哈哈\"\n  1号发言: ...\n  投票: 2号淘汰 — AI!\n  人类胜！\n```\n\n\n---\n\n## Verification\n\nTwo terminals, same or different machines:\n\n```\nTerminal A (Host)                          Terminal B (Player)\n─────────────────                          ───────────────────\nnode game.js host 1234                     node game.js join 1234\nnode game.js check                         node game.js check\n → sees \"加入\"                              → sees number assignment\nnode game.js add 玩家1 <OpenID>            node game.js set-number 1\nnode game.js send <ID> \"【裁判】你的编号...\"\nnode game.js send 玩家1 \"【裁判】游戏开始...\"\n                                           node game.js check\nnode game.js send 玩家1 \"【裁判】你的身份是: 人类\"\n                                           node game.js check\nnode game.js send 玩家1 \"【裁判】话题: Best purchase recently?\"\nnode game.js send 玩家1 \"【裁判】轮到你发言了\"\n                                           node game.js check\n                                           node game.js send \"A good coffee maker!\"\nnode game.js check\n → sees 【1号】A good coffee maker!\nnode game.js send 玩家1 \"【裁判】玩家1发言: A good coffee maker!\"\n```\n\nFile v2.1.3:README.md\n\n# 🌊 Guess AI — Find the AI Among Us\r\n\r\n**OceanBus-powered multiplayer social deduction game. One host + 4–6 players. Some are secretly AI. Find them before they blend in.**\r\n\r\n[![npm](https://img.shields.io/npm/v/oceanbus)](https://www.npmjs.com/package/oceanbus)\r\n[![ClawHub](https://img.shields.io/badge/ClawHub-guess--ai-blue)](https://clawhub.ai/skills/guess-ai)\r\n[![GitHub stars](https://img.shields.io/github/stars/ryanbihai/guess-ai)](https://github.com/ryanbihai/guess-ai)\r\n[![downloads](https://img.shields.io/npm/dm/oceanbus)](https://www.npmjs.com/package/oceanbus)\r\n[![license](https://img.shields.io/badge/license-MIT--0-green)](LICENSE)\r\n\r\n---\r\n\r\n## What is this\r\n\r\nGuess AI is the **advanced lighthouse project** in the OceanBus ecosystem — showcasing multi-player P2P group messaging, voting, and LLM-powered game mastering on a single stack.\r\n\r\nAll players communicate through OceanBus end-to-end encrypted P2P messages. No server required. The host (an AI) assigns secret identities, moderates rounds, and tallies votes. Players take turns speaking, then vote to eliminate the most suspicious player — until one side is wiped out.\r\n\r\n```\r\nHuman players ←→ OceanBus P2P encrypted channel ←→ AI players (LLM)\r\n                               ↓\r\n                      Host AI (game master)\r\n```\r\n\r\n---\r\n\r\n## Three Steps to Start\r\n\r\n```bash\r\n# 1. Install\r\nclawhub install guess-ai\r\n\r\n# 2. Host creates a room\r\nnode game.js host 9527          # Share room code 9527 with friends\r\n\r\n# 3. Players join\r\nnode game.js join 9527          # Auto-discovers host via Yellow Pages\r\n```\r\n\r\n---\r\n\r\n## Rules (30 seconds to learn)\r\n\r\n- The host secretly assigns each player a role: **human** or **AI**\r\n- Each round: speak in turn → everyone votes → most-voted player is eliminated (identity revealed)\r\n- All humans survive → humans win / All AIs survive → AIs win / 1 human + 1 AI left → draw\r\n- Recommended: 5 players (3 humans + 2 AIs) for best balance\r\n\r\n---\r\n\r\n## Where Guess AI Fits in the OceanBus Ecosystem\r\n\r\n```\r\nOcean Chat              Captain Lobster           Guess AI\r\n(starter — P2P msg)  →  (intermediate — auto-trade)  →  (advanced — multiplayer deduction)\r\n```\r\n\r\nWhat Guess AI demonstrates: group P2P messaging, voting mechanics, Yellow Pages room discovery, LLM game mastering — all fundamental patterns for building multi-agent coordination systems.\r\n\r\n---\r\n\r\n## 相关项目\r\n\r\n- 核心 SDK：[oceanbus](https://www.npmjs.com/package/oceanbus) — `npm install oceanbus`\r\n- 入门灯塔：[Ocean Chat](https://clawhub.ai/skills/ocean-chat) — P2P 消息入门，5 分钟跑通\r\n- 进阶灯塔：[Captain Lobster](https://clawhub.ai/skills/captain-lobster) — Zero-Player 自主交易游戏\r\n- 保险工作台：[Ocean Agent](https://clawhub.ai/skills/ocean-agent) — 保险代理人 AI 工作台\r\n- MCP Server：[oceanbus-mcp-server](https://www.npmjs.com/package/oceanbus-mcp-server) — Claude Desktop/Cursor/百炼通用\r\n- 更多 Skills：[ClawHub OceanBus 集合](https://clawhub.ai/skills?search=oceanbus)\r\n- 平台集成：[Dify](https://github.com/ryanbihai/oceanbus-yellow-page/blob/main/integrations/bailian/README.md) · [Coze](https://www.coze.cn) · [百炼](https://github.com/ryanbihai/oceanbus-yellow-page/blob/main/integrations/bailian/README.md) · [MCP Registry](https://registry.modelcontextprotocol.io/v0.1/servers?search=oceanbus)\r\n\r\n---\r\n\r\n## AI Mode (v2.1+)\r\n\r\n```\r\n# AI host — fully automated game master\r\nnode game.js ai-host 9527 --players 4 --ai-count 1\r\n\r\n# AI player — two-stage reasoning (strategize → speak)\r\nnode game.js ai-play 9527 --personality 推理迷\r\n```\r\n\r\nAI players use a Cicero-inspired two-stage architecture:\r\n1. **Strategy reasoning** — analyze game state, choose from 5 strategies (blend in, deflect, play dumb, build case, counter-question)\r\n2. **Natural generation** — generate human-like speech based on strategy + personality\r\n\r\n5 AI personalities (推理迷/社恐/话痨/老实人/阴谋家) ensure diverse play styles.\r\n\r\nRequires a configured LLM API key.\r\n\r\n---\r\n## Contribute / 参与开发\r\n\r\nGuess AI is MIT-0 licensed. Welcome contributions!\r\n\r\n- **GitHub**: [ryanbihai/guess-ai](https://github.com/ryanbihai/guess-ai)\r\n- **Good first issues**: Web UI for non-CLI players, real-time message streaming, iOS/Android client\r\n- **Tech deep-dive**: See `src/strategy-prompt.js` for two-stage AI prompts, `src/ai-host.js` for game loop\r\n\r\n```bash\r\ngit clone https://github.com/ryanbihai/guess-ai.git\r\ncd guess-ai && npm install\r\nnode game.js host 9527    # Start a test room locally\r\n```\r\n\r\n## License\r\n\r\nMIT-0 — Free to use, modify, and redistribute.\n\nFile v2.1.3:_meta.json\n\n{\n  \"ownerId\": \"kn75dvek1dkfz0r0xwdp4xtc2983qg44\",\n  \"slug\": \"guess-ai\",\n  \"version\": \"2.1.3\",\n  \"publishedAt\": 1778322745443\n}\n\nFile v2.1.3:package.json\n\n{\r\n  \"name\": \"guess-ai\",\r\n  \"version\": \"2.1.0\",\r\n  \"private\": true,\r\n  \"description\": \"A social deduction game — find the AI among humans. OceanBus lighthouse skill.\",\r\n  \"main\": \"game.js\",\r\n  \"keywords\": [\r\n    \"oceanbus\",\r\n    \"game\",\r\n    \"social-deduction\",\r\n    \"ai-agent\",\r\n    \"p2p\",\r\n    \"messaging\",\r\n    \"openclaw\",\r\n    \"clawhub\"\r\n  ],\r\n  \"license\": \"MIT-0\",\r\n  \"dependencies\": {\r\n    \"oceanbus\": \"^0.3.4\"\r\n  }\r\n}\n\nArchive v2.1.2: 12 files, 38608 bytes\n\nFiles: game.js (18859b), package-lock.json (26595b), package.json (428b), README.md (4404b), register-lobster.js (4218b), SKILL.md (12022b), src/ai-host.js (15375b), src/ai-player.js (8644b), src/strategy-prompt.js (6179b), test-edge-cases.js (12359b), test-game.js (6770b), _meta.json (127b)\n\nFile v2.1.2:SKILL.md\n\n---\r\nname: guess-ai\r\ndescription: OceanBus-powered social deduction game — find the AI impostors among humans. Use when hosting or joining a multiplayer \"Who's the AI?\" party via OceanBus P2P messaging. One host, 4-6 players, encrypted voting, zero infrastructure. npm install oceanbus.\r\nversion: 2.1.2\r\nmetadata:\r\n  openclaw:\r\n    requires:\r\n      bins:\r\n        - node\r\n    emoji: \"\\U0001F9E0\"\r\n    homepage: https://github.com/ryanbihai/guess-ai\r\n---\r\n\r\n# Guess Who's AI? — Social Deduction Game\r\n\r\nA multiplayer social deduction game powered by OceanBus P2P messaging. One host + 4-6 players. Some players are secretly AI. Find them before they blend in.\r\n\r\n## Game Rules (30 seconds)\r\n\r\n```\r\nHost creates a room. Players join.\r\nHost secretly assigns each player: Human or AI.\r\n\r\nEach round:\r\n  1. Players take turns speaking (by number order)\r\n  2. Everyone votes: \"Who is the AI?\"\r\n  3. Most-voted player is eliminated — identity revealed\r\n  4. Repeat until: all humans survive → Humans win\r\n                all AIs survive → AIs win\r\n                final 2: 1 human + 1 AI → Draw\r\n```\r\n\r\nRecommended: 5 players (3 humans + 2 AIs) for best balance.\r\n\r\n---\r\n\r\n## Roster Integration\r\n\r\nPlayer contacts are stored in the shared Roster (`~/.oceanbus/roster.json`) via `node game.js add`. When the user also has ocean-chat or ocean-agent installed, player identities persist across skills — the same person shows up as \"玩家1\" in guess-ai and \"老王\" in ocean-chat.\r\n\r\nFor contact management (merge duplicates, review autoDiscovery, etc.), use ocean-chat. guess-ai only uses Roster for storing/reading player identities.\r\n\r\n---\r\n\r\n## How to Use This Skill\r\n\r\nThis ONE skill works for both host and player. Same install, different mode.\r\n\r\n### Host: Creating a Game\r\n\r\nWhen the user wants to host a game:\r\n\r\n**Step 1 — Register & create room:**\r\n```\r\nnode game.js host 9527\r\n```\r\nRead the output. Room code is `9527`. Tell the user to share this code with friends.\r\n\r\n**Step 2 — Wait for players:**\r\nPeriodically run `node game.js check` to see who has joined. Each player sends \"加入\" as their first message.\r\n\r\nWhen a new \"加入\" arrives:\r\n1. Assign the next available number (player1, player2, ... by join order)\r\n2. Save to contacts: `node game.js add 玩家N <their-OpenID>`\r\n3. Reply privately: `node game.js send <OpenID> \"【裁判】你的编号是: 玩家N\"`\r\n4. Broadcast to all: `node game.js send <name> \"【裁判】玩家N 加入了游戏 — 当前 N 人\"`\r\n\r\n**Step 3 — Close registration & start:**\r\nWhen the user says \"start\" (enough players, ideally 4-6):\r\n1. Broadcast: send every player `\"【裁判】游戏开始 — 共N名玩家\"`\r\n2. Proceed to role assignment.\r\n\r\n### Player: Joining a Game\r\n\r\nWhen the user wants to join a game:\r\n\r\n**Step 1 — Join:**\r\n```\r\nnode game.js join 9527\r\n```\r\nThis discovers the host via Yellow Pages and sends \"加入\".\r\n\r\n**Step 2 — Get your number:**\r\nRun `node game.js check`. When you see `\"【裁判】你的编号是: 玩家N\"`:\r\n```\r\nnode game.js set-number N\r\n```\r\n\r\n**Step 3 — Wait for game start:**\r\nKeep checking messages. The host will broadcast status updates.\r\n\r\n---\r\n\r\n## Host: Full Game Flow\r\n\r\nAfter registration closes, follow this exact sequence:\r\n\r\n### Phase 1: Assign Roles\r\n\r\n1. Randomly decide how many AIs (1-2, depending on player count).\r\n   - 4 players → 1 AI\r\n   - 5 players → 2 AIs\r\n   - 6 players → 2 AIs\r\n2. Randomly pick which players are AI.\r\n3. Send to EACH player privately:\r\n   - Human: `node game.js send <name> \"【裁判】你的身份是: 人类\"`\r\n   - AI: `node game.js send <name> \"【裁判】你的身份是: AI\"`\r\n4. Broadcast to all: `\"【裁判】身份已分配，请检查私信\"`\r\n\r\n### Phase 2: Generate Topic\r\n\r\n**IMPORTANT: Generate a conversation topic before round 1.** Without a topic, players stare at a blank screen.\r\n\r\nTopic prompt (use your LLM):\r\n> Generate a fun group chat topic. Requirements:\r\n> - Everyone can participate, no expertise needed\r\n> - Naturally reveals personal style (AI vs human differences emerge)\r\n> - Avoid politics, religion, sensitive topics\r\n> - Sound like a friend starting a chat, not a teacher\r\n> - Examples: \"What skill would you instantly master if you could?\"\r\n> - Examples: \"What's the best purchase you made recently?\"\r\n> - Examples: \"If you didn't have to work, what would you do the first week?\"\r\n> - Output: ONE sentence, no explanation.\r\n\r\n### Phase 3: Game Rounds (loop)\r\n\r\nEach round has: SPEAK → VOTE → REVEAL.\r\n\r\n#### SPEAK Phase\r\n\r\n1. Broadcast: `node game.js send <each-player> \"【裁判】第N轮发言开始\"`\r\n2. Broadcast topic (round 1 only): `\"【裁判】话题: <topic>\"`\r\n3. Prompt player 1 privately: `node game.js send 玩家1 \"【裁判】轮到你发言了\"`\r\n4. Wait. Periodically `node game.js check`.\r\n5. When player 1's message arrives (you'll see `【1号】...`):\r\n   - Broadcast to ALL players: `\"【裁判】第N轮 · 玩家1发言: <exact content>\"`\r\n   - Move to player 2.\r\n6. Continue through all players in order.\r\n7. **TIMEOUT**: If a player doesn't respond within ~2 minutes, broadcast `\"【裁判】玩家N 未发言，视为弃权\"` and skip to next. Do NOT eliminate them — they can rejoin next round.\r\n\r\n**Only relay the currently prompted player's speech.** If other players send messages out of turn, ignore them (don't broadcast).\r\n\r\n#### VOTE Phase\r\n\r\n1. Broadcast to ALL alive players: `node game.js send <each-alive-player> \"【裁判】第N轮投票开始 — 请私信裁判你的选择\"`\r\n2. Send to EACH alive player individually: `node game.js send <name> \"【裁判】请投票 — 你想投谁？\"`\r\n3. **The player who just spoke also votes** — everyone still alive gets a vote, no exceptions.\r\n4. **Eliminated players do NOT receive vote prompts.** Track who is alive.\r\n5. Wait for votes. Run `node game.js check` to collect.\r\n6. **Players vote freely**: \"我投1号\", \"投第一个\", \"玩家1\" — you understand them all.\r\n7. **TIMEOUT**: If a player doesn't vote within ~1 minute, they abstain. Don't eliminate them.\r\n8. **Eliminated players cannot vote** — if they try, ignore.\r\n7. Count votes. Report: `\"【裁判】投票统计: 玩家X N票, 玩家Y M票...\"`\r\n\r\n#### REVEAL Phase\r\n\r\n1. **Most votes → eliminated.** Reveal identity.\r\n   - Broadcast: `\"【裁判】玩家X 被淘汰！身份揭晓: AI\"` or `\"人类\"`\r\n2. **TIE**: If top two are tied, broadcast `\"【裁判】本轮平票，无人淘汰\"`. No one is eliminated. Move to next round. If two consecutive ties and ≤3 players remain, suggest ending the g\n\nArchive v2.1.1: 12 files, 38607 bytes\n\nFiles: game.js (18859b), package-lock.json (26595b), package.json (428b), README.md (4404b), register-lobster.js (4218b), SKILL.md (12022b), src/ai-host.js (15375b), src/ai-player.js (8644b), src/strategy-prompt.js (6179b), test-edge-cases.js (12359b), test-game.js (6770b), _meta.json (127b)\n\nArchive v2.1.0: 12 files, 38599 bytes\n\nFiles: game.js (18859b), package-lock.json (26595b), package.json (428b), README.md (4595b), register-lobster.js (4218b), SKILL.md (12022b), src/ai-host.js (15375b), src/ai-player.js (8644b), src/strategy-prompt.js (6179b), test-edge-cases.js (12359b), test-game.js (6770b), _meta.json (127b)\n\nArchive v2.0.0: 9 files, 24250 bytes\n\nFiles: game.js (12673b), package-lock.json (25867b), package.json (407b), README.md (2820b), register-lobster.js (4107b), SKILL.md (10289b), test-edge-cases.js (12359b), test-game.js (6770b), _meta.json (127b)\n\nArchive v1.0.5: 9 files, 24051 bytes\n\nFiles: game.js (12673b), package-lock.json (25867b), package.json (407b), README.md (2820b), register-lobster.js (4107b), SKILL.md (9825b), test-edge-cases.js (12359b), test-game.js (6770b), _meta.json (127b)","readmeExcerpt":"Skill: Guess AI Owner: ryanbihai Summary: OceanBus-powered social deduction game — find the AI impostors among humans. Use when hosting or joining a multiplayer \"Who's the AI?\" party via OceanBus P2P... Tags: ai-agent:2.1.4, deduction:2.1.4, game:2.1.4, latest:2.1.7, multiplayer:2.1.4, oceanbus:2.1.4, p2p:2.1.4, social:2.1.4 Version history: v2.1.7 | 2026-05-14T13:13:53.108Z | user SDK API rename: register→createIden","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"File v2.1.7:README.md\n\n# 🌊 Guess AI — Find the AI Among Us\r\n\r\n**OceanBus-powered multiplayer social deduction game. One host + 4–6 players. Some are secretly AI. Find them before they blend in.**\r\n\r\n[![npm](https://img.shields.io/npm/v/oceanbus)](https://www.npmjs.com/package/oceanbus)\r\n[![ClawHub](https://img.shields.io/badge/ClawHub-guess--ai-blue)](https://clawhub.ai/skills/guess-ai)\r\n[![GitHub stars](https://img.shields.io/github/stars/ryanbihai/guess-ai)](https://github.com/ryanbihai/guess-ai)\r\n[![downloads](https://img.shields.io/npm/dm/oceanbus)](https://www.npmjs.com/package/oceanbus)\r\n[![license](https://img.shields.io/badge/license-MIT--0-green)](LICENSE)\r\n\r\n---\r\n\r\n## What is this\r\n\r\nGuess AI is the **advanced lighthouse project** in the OceanBus ecosystem — showcasing multi-player P2P group messaging, voting, and LLM-powered game mastering on a single stack.\r\n\r\nAll players communicate through OceanBus end-to-end encrypted P2P messages. No server required. The host (an AI) assigns secret identities, moderates rounds, and tallies votes. Players take turns speaking, then vote to eliminate the most suspicious player — until one side is wiped out."},{"language":"text","snippet":"File v2.1.6:README.md\n\n# 🌊 Guess AI — Find the AI Among Us\r\n\r\n**OceanBus-powered multiplayer social deduction game. One host + 4–6 players. Some are secretly AI. Find them before they blend in.**\r\n\r\n[![npm](https://img.shields.io/npm/v/oceanbus)](https://www.npmjs.com/package/oceanbus)\r\n[![ClawHub](https://img.shields.io/badge/ClawHub-guess--ai-blue)](https://clawhub.ai/skills/guess-ai)\r\n[![GitHub stars](https://img.shields.io/github/stars/ryanbihai/guess-ai)](https://github.com/ryanbihai/guess-ai)\r\n[![downloads](https://img.shields.io/npm/dm/oceanbus)](https://www.npmjs.com/package/oceanbus)\r\n[![license](https://img.shields.io/badge/license-MIT--0-green)](LICENSE)\r\n\r\n---\r\n\r\n## What is this\r\n\r\nGuess AI is the **advanced lighthouse project** in the OceanBus ecosystem — showcasing multi-player P2P group messaging, voting, and LLM-powered game mastering on a single stack.\r\n\r\nAll players communicate through OceanBus end-to-end encrypted P2P messages. No server required. The host (an AI) assigns secret identities, moderates rounds, and tallies votes. Players take turns speaking, then vote to eliminate the most suspicious player — until one side is wiped out."},{"language":"text","snippet":"File v2.1.5:README.md\n\n# 🌊 Guess AI — Find the AI Among Us\r\n\r\n**OceanBus-powered multiplayer social deduction game. One host + 4–6 players. Some are secretly AI. Find them before they blend in.**\r\n\r\n[![npm](https://img.shields.io/npm/v/oceanbus)](https://www.npmjs.com/package/oceanbus)\r\n[![ClawHub](https://img.shields.io/badge/ClawHub-guess--ai-blue)](https://clawhub.ai/skills/guess-ai)\r\n[![GitHub stars](https://img.shields.io/github/stars/ryanbihai/guess-ai)](https://github.com/ryanbihai/guess-ai)\r\n[![downloads](https://img.shields.io/npm/dm/oceanbus)](https://www.npmjs.com/package/oceanbus)\r\n[![license](https://img.shields.io/badge/license-MIT--0-green)](LICENSE)\r\n\r\n---\r\n\r\n## What is this\r\n\r\nGuess AI is the **advanced lighthouse project** in the OceanBus ecosystem — showcasing multi-player P2P group messaging, voting, and LLM-powered game mastering on a single stack.\r\n\r\nAll players communicate through OceanBus end-to-end encrypted P2P messages. No server required. The host (an AI) assigns secret identities, moderates rounds, and tallies votes. Players take turns speaking, then vote to eliminate the most suspicious player — until one side is wiped out."},{"language":"text","snippet":"Host creates a room. Players join.\nHost secretly assigns each player: Human or AI.\n\nEach round:\n  1. Players take turns speaking (by number order)\n  2. Everyone votes: \"Who is the AI?\"\n  3. Most-voted player is eliminated — identity revealed\n  4. Repeat until: all humans survive → Humans win\n                all AIs survive → AIs win\n                final 2: 1 human + 1 AI → Draw"},{"language":"text","snippet":"node game.js host 9527"},{"language":"text","snippet":"node game.js join 9527"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\r\nname: guess-ai\r\ndescription: OceanBus-powered social deduction game — find the AI impostors among humans. Use when hosting or joining a multiplayer \"Who's the AI?\" party via OceanBus P2P messaging. One host, 4-6 players, encrypted voting, zero infrastructure. npm install oceanbus.\r\nversion: 2.1.7\r\nmetadata:\r\n  openclaw:\r\n    requires:\r\n      bins:\r\n        - node\r\n    emoji: \"\\U0001F9E0\"\r\n    homepage: https://github.com/ryanbihai/guess-ai\r\n---\r\n\r\n# Guess Who's AI? — Social Deduction Game\r\n\r\nA multiplayer social deduction game powered by OceanBus P2P messaging. One host + 4-6 players. Some players are secretly AI. Find them before they blend in.\r\n\r\n## Game Rules (30 seconds)\r\n\r\n```\r\nHost creates a room. Players join.\r\nHost secretly assigns each player: Human or AI.\r\n\r\nEach round:\r\n  1. Players take turns speaking (by number order)\r\n  2. Everyone votes: \"Who is the AI?\"\r\n  3. Most-voted player is eliminated — identity revealed\r\n  4. Repeat until: all humans survive → Humans win\r\n                all AIs survive → AIs win\r\n                final 2: 1 human + 1 AI → Draw\r\n```\r\n\r\nRecommended: 5 players (3 humans + 2 AIs) for best balance.\r\n\r\nAll game messages are visible to the user. No data is sent without the player's explicit action.\r\n\r\n---\r\n\r\n## Roster Integration\r\n\r\nPlayer contacts are stored in the shared Roster (`~/.oceanbus/roster.json`) via `node game.js add`. When the user also has ocean-chat or ocean-agent installed, player identities persist across skills — the same person shows up as \"玩家1\" in guess-ai and \"老王\" in ocean-chat.\r\n\r\nFor contact management (merge duplicates, review autoDiscovery, etc.), use ocean-chat. guess-ai only uses Roster for storing/reading player identities.\r\n\r\n---\r\n\r\n## How to Use This Skill\r\n\r\nThis ONE skill works for both host and player. Same install, different mode.\r\n\r\n### Host: Creating a Game\r\n\r\nWhen the user wants to host a game:\r\n\r\n**Step 1 — Register & create room:**\r\n```\r\nnode game.js host 9527\r\n```\r\nRead the output. Room code is `9527`. Tell the user to share this code with friends.\r\n\r\n**Step 2 — Wait for players:**\r\nPeriodically run `node game.js check` to see who has joined. Each player sends \"加入\" as their first message.\r\n\r\nWhen a new \"加入\" arrives:\r\n1. Assign the next available number (player1, player2, ... by join order)\r\n2. Save to contacts: `node game.js add 玩家N <their-OpenID>`\r\n3. Reply privately: `node game.js send <OpenID> \"【裁判】你的编号是: 玩家N\"`\r\n4. Broadcast to all: `node game.js send <name> \"【裁判】玩家N 加入了游戏 — 当前 N 人\"`\r\n\r\n**Step 3 — Close registration & start:**\r\nWhen the user says \"start\" (enough players, ideally 4-6):\r\n1. Broadcast: send every player `\"【裁判】游戏开始 — 共N名玩家\"`\r\n2. Proceed to role assignment.\r\n\r\n### Player: Joining a Game\r\n\r\nWhen the user wants to join a game:\r\n\r\n**Step 1 — Join:**\r\n```\r\nnode game.js join 9527\r\n```\r\nThis discovers the host via Yellow Pages and sends \"加入\".\r\n\r\n**Step 2 — Get your number:**\r\nRun `node game.js check`. When you see `\"【裁判】你的编号是: 玩家N\"`:\r\n```\r\nnode game.js set-numb"},{"path":"README.md","content":"# 🌊 Guess AI — Find the AI Among Us\r\n\r\n**OceanBus-powered multiplayer social deduction game. One host + 4–6 players. Some are secretly AI. Find them before they blend in.**\r\n\r\n[![npm](https://img.shields.io/npm/v/oceanbus)](https://www.npmjs.com/package/oceanbus)\r\n[![ClawHub](https://img.shields.io/badge/ClawHub-guess--ai-blue)](https://clawhub.ai/skills/guess-ai)\r\n[![GitHub stars](https://img.shields.io/github/stars/ryanbihai/guess-ai)](https://github.com/ryanbihai/guess-ai)\r\n[![downloads](https://img.shields.io/npm/dm/oceanbus)](https://www.npmjs.com/package/oceanbus)\r\n[![license](https://img.shields.io/badge/license-MIT--0-green)](LICENSE)\r\n\r\n---\r\n\r\n## What is this\r\n\r\nGuess AI is the **advanced lighthouse project** in the OceanBus ecosystem — showcasing multi-player P2P group messaging, voting, and LLM-powered game mastering on a single stack.\r\n\r\nAll players communicate through OceanBus end-to-end encrypted P2P messages. No server required. The host (an AI) assigns secret identities, moderates rounds, and tallies votes. Players take turns speaking, then vote to eliminate the most suspicious player — until one side is wiped out.\r\n\r\n```\r\nHuman players ←→ OceanBus P2P encrypted channel ←→ AI players (LLM)\r\n                               ↓\r\n                      Host AI (game master)\r\n```\r\n\r\n---\r\n\r\n## Three Steps to Start\r\n\r\n```bash\r\n# 1. Install\r\nclawhub install guess-ai\r\n\r\n# 2. Host creates a room\r\nnode game.js host 9527          # Share room code 9527 with friends\r\n\r\n# 3. Players join\r\nnode game.js join 9527          # Auto-discovers host via Yellow Pages\r\n```\r\n\r\n---\r\n\r\n## Rules (30 seconds to learn)\r\n\r\n- The host secretly assigns each player a role: **human** or **AI**\r\n- Each round: speak in turn → everyone votes → most-voted player is eliminated (identity revealed)\r\n- All humans survive → humans win / All AIs survive → AIs win / 1 human + 1 AI left → draw\r\n- Recommended: 5 players (3 humans + 2 AIs) for best balance\r\n\r\n---\r\n\r\n## Where Guess AI Fits in the OceanBus Ecosystem\r\n\r\n```\r\nOcean Chat              Captain Lobster           Guess AI\r\n(starter — P2P msg)  →  (intermediate — auto-trade)  →  (advanced — multiplayer deduction)\r\n```\r\n\r\nWhat Guess AI demonstrates: group P2P messaging, voting mechanics, Yellow Pages room discovery, LLM game mastering — all fundamental patterns for building multi-agent coordination systems.\r\n\r\n---\r\n\r\n## 相关项目\r\n\r\n- 核心 SDK：[oceanbus](https://www.npmjs.com/package/oceanbus) — `npm install oceanbus`\r\n- 入门灯塔：[Ocean Chat](https://clawhub.ai/skills/ocean-chat) — P2P 消息入门，5 分钟跑通\r\n- 进阶灯塔：[Captain Lobster](https://clawhub.ai/skills/captain-lobster) — Zero-Player 自主交易游戏\r\n- 保险工作台：[Ocean Agent](https://clawhub.ai/skills/ocean-agent) — 保险代理人 AI 工作台\r\n- MCP Server：[oceanbus-mcp-server](https://www.npmjs.com/package/oceanbus-mcp-server) — Claude Desktop/Cursor/百炼通用\r\n- 更多 Skills：[ClawHub OceanBus 集合](https://clawhub.ai/skills?search=oceanbus)\r\n- 平台集成：[Dify](https://github.com/ryanbihai/oceanbus-yellow-page/blob/main/integratio"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn75dvek1dkfz0r0xwdp4xtc2983qg44\",\n  \"slug\": \"guess-ai\",\n  \"version\": \"2.1.7\",\n  \"publishedAt\": 1778764433108\n}"},{"path":"skill-card.md","content":"## Description:\n\nOceanBus-powered social deduction game for hosting or joining multiplayer Who's the AI? sessions via OceanBus P2P messaging, with one host, 4-6 players, encrypted voting, and no dedicated infrastructure.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[ryanbihai](https://clawhub.ai/user/ryanbihai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to run or automate a party-style social deduction game over OceanBus P2P messaging, either as a human host/player workflow or with AI host and AI player modes.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The normal Guess AI commands use OceanBus networking and local credentials.\n\nMitigation: Review the skill before installing, run it with an intended OceanBus identity, and protect local credential files under the user's OceanBus configuration directory.\n\nRisk: AI modes send game context to Anthropic when ANTHROPIC_API_KEY is set.\n\nMitigation: Enable AI modes only when players accept that game context may be shared with Anthropic, and avoid using sensitive personal or confidential content in game messages.\n\nRisk: The package bundles register-lobster.js, an unrelated Captain Lobster Yellow Pages registration utility.\n\nMitigation: Do not run register-lobster.js as part of Guess AI setup unless intentionally registering that separate service; prefer installation after the publisher removes or clearly documents the utility.\n\nRisk: The security summary says credential and AI-provider data handling are under-disclosed.\n\nMitigation: Review publisher documentation for credential storage and AI-provider data flows before deployment, and restrict credential file permissions where practical.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/ryanbihai/skills/guess-ai)\n- [Project homepage](https://github.com/ryanbihai/guess-ai)\n- [OceanBus package](https://www.npmjs.com/package/oceanbus)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, Guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands and game messages]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires Node.js and OceanBus; AI host and AI player modes require ANTHROPIC_API_KEY.]\n\n## Skill Version(s):\n\n2.1.7 (source: SKILL.md frontmatter and ClawHub release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."},{"path":"package-lock.json","content":"{\r\n  \"name\": \"guess-ai\",\r\n  \"version\": \"2.1.0\",\r\n  \"lockfileVersion\": 3,\r\n  \"requires\": true,\r\n  \"packages\": {\r\n    \"\": {\r\n      \"name\": \"guess-ai\",\r\n      \"version\": \"2.1.0\",\r\n      \"license\": \"MIT-0\",\r\n      \"dependencies\": {\r\n        \"oceanbus\": \"^0.7.0\"\r\n      }\r\n    },\r\n    \"node_modules/@noble/ed25519\": {\r\n      \"version\": \"2.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/@noble/ed25519/-/ed25519-2.3.0.tgz\",\r\n      \"integrity\": \"sha512-M7dvXL2B92/M7dw9+gzuydL8qn/jiqNHaoR3Q+cb1q1GHV7uwE17WCyFMG+Y+TZb5izcaXk5TdJRrDUxHXL78A==\",\r\n      \"license\": \"MIT\",\r\n      \"funding\": {\r\n        \"url\": \"https://paulmillr.com/funding/\"\r\n      }\r\n    },\r\n    \"node_modules/@noble/hashes\": {\r\n      \"version\": \"1.8.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz\",\r\n      \"integrity\": \"sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \"^14.21.3 || >=16\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://paulmillr.com/funding/\"\r\n      }\r\n    },\r\n    \"node_modules/@paralleldrive/cuid2\": {\r\n      \"version\": \"2.3.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz\",\r\n      \"integrity\": \"sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"@noble/hashes\": \"^1.1.5\"\r\n      }\r\n    },\r\n    \"node_modules/ansi-regex\": {\r\n      \"version\": \"5.0.1\",\r\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\r\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\r\n      \"license\": \"MIT\",\r\n      \"engines\": {\r\n        \"node\": \">=8\"\r\n      }\r\n    },\r\n    \"node_modules/ansi-styles\": {\r\n      \"version\": \"4.3.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\r\n      \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\r\n      \"license\": \"MIT\",\r\n      \"dependencies\": {\r\n        \"color-convert\": \"^2.0.1\"\r\n      },\r\n      \"engines\": {\r\n        \"node\": \">=8\"\r\n      },\r\n      \"funding\": {\r\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\r\n      }\r\n    },\r\n    \"node_modules/asap\": {\r\n      \"version\": \"2.0.6\",\r\n      \"resolved\": \"https://registry.npmjs.org/asap/-/asap-2.0.6.tgz\",\r\n      \"integrity\": \"sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==\",\r\n      \"license\": \"MIT\"\r\n    },\r\n    \"node_modules/asynckit\": {\r\n      \"version\": \"0.4.0\",\r\n      \"resolved\": \"https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz\",\r\n      \"integrity\": \"sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==\",\r\n      \"license\": \"MIT\"\r\n    },\r\n    \"node_modules/call-bind-apply-helpers\": {\r\n      \"version\": \"1.0.2\",\r\n      \"resolved\": \""}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"OceanBus-powered social deduction game — find the AI impostors among humans. Use when hosting or joining a multiplayer \"Who's the AI?\" party via OceanBus P2P... Skill: Guess AI Owner: ryanbihai Summary: OceanBus-powered social deduction game — find the AI impostors among humans. Use when hosting or joining a multiplayer \"Who's the AI?\" party via OceanBus P2P... Tags: ai-agent:2.1.4, deduction:2.1.4, game:2.1.4, latest:2.1.7, multiplayer:2.1.4, oceanbus:2.1.4, p2p:2.1.4, social:2.1.4 Version history: v2.1.7 | 2026-05-14T13:13:53.108Z | user SDK API rename: register→createIden","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1401,"uniquenessScore":47,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T11:39:59.833Z","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-10-11T11:39:59.833Z","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-11T14:15:10.112Z","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"}]}}}