{"record":{"id":"cbce8fbc08122c51","repo":"tinyhumansai/openhuman","slug":"tiny-place-signer-unavailable-unlock-your-wallet","errorCode":null,"errorMessage":"tiny.place signer unavailable; unlock your wallet","messagePattern":"tiny\\.place signer unavailable; unlock your wallet","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/openhuman/tinyplace/agent_tools/common.rs","lineNumber":222,"sourceCode":"\n/// Process-global tiny.place client, built lazily from the wallet signer.\npub async fn client() -> anyhow::Result<&'static tinyplace::TinyPlaceClient> {\n    super::super::ops::global_state()\n        .client()\n        .await\n        .map_err(|e| anyhow::anyhow!(\"tiny.place client unavailable: {e}\"))\n}\n\n/// The caller's own agent id, resolved from the wallet signer.\n///\n/// Identity is **always** taken from the signer, never from tool arguments —\n/// the agent cannot act as anyone but itself (anti-spoof).\npub fn agent_id(client: &tinyplace::TinyPlaceClient) -> anyhow::Result<String> {\n    client\n        .http()\n        .signer()\n        .map(|s| s.agent_id())\n        .ok_or_else(|| anyhow::anyhow!(\"tiny.place signer unavailable; unlock your wallet\"))\n}\n\n/// The caller's own base64 public (encryption) key, from the wallet signer.\npub fn public_key(client: &tinyplace::TinyPlaceClient) -> anyhow::Result<String> {\n    client\n        .http()\n        .signer()\n        .map(|s| s.public_key_base64())\n        .ok_or_else(|| anyhow::anyhow!(\"tiny.place signer unavailable; unlock your wallet\"))\n}\n\n/// Resolve a `@handle` (or bare handle) to its wallet cryptoId, falling back to\n/// the input unchanged when it is already an id or can't be resolved. Used by\n/// the follow/unfollow flows so the agent can pass a friendly handle.\npub async fn resolve_agent(client: &tinyplace::TinyPlaceClient, target: &str) -> String {\n    let name = target.trim().trim_start_matches('@');\n    if name.is_empty() {\n        return target.trim().to_string();","sourceCodeStart":204,"sourceCodeEnd":240,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/tinyplace/agent_tools/common.rs#L204-L240","documentation":"Sentinel error from the tiny.place agent_id helper: resolving the caller's agent id from the wallet signer failed because the wallet is locked or has no signer configured. Identity is deliberately taken only from the signer (anti-spoof), so no argument can substitute for it.","triggerScenarios":"Thrown at src/openhuman/tinyplace/agent_tools/common.rs:222 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Unlock the wallet in the app","Configure/import a wallet signer, then retry the tool call"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}