{"record":{"id":"7fc6953621f3ab79","repo":"BigPizzaV3/CodexPlusPlus","slug":"codex-rollout","errorCode":null,"errorMessage":"当前分享内容不是可导入的 Codex rollout 会话","messagePattern":"当前分享内容不是可导入的 Codex rollout 会话","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/codex-plus-core/src/session_share.rs","lineNumber":102,"sourceCode":"        .context(\"分享会话不存在、已撤销或已过期\")?\n        .json::<Value>()\n        .await\n        .context(\"分享会话响应格式无效\")?;\n    let encrypted = record\n        .get(\"encrypted\")\n        .context(\"分享会话缺少加密内容\")?;\n    let key_value = parsed\n        .fragment()\n        .and_then(|fragment| {\n            fragment\n                .split('&')\n                .find_map(|pair| pair.strip_prefix(\"k=\"))\n        })\n        .context(\"分享链接缺少解密密钥\")?;\n    let plaintext = decrypt_shared_payload(encrypted, key_value)?;\n    let payload: Value = serde_json::from_slice(&plaintext).context(\"分享会话内容格式无效\")?;\n    if payload.get(\"kind\").and_then(Value::as_str) != Some(\"codex-rollout\") {\n        bail!(\"当前分享内容不是可导入的 Codex rollout 会话\");\n    }\n    import_rollout(home, &payload)\n}\n\nfn validate_share_url(url: &str) -> anyhow::Result<reqwest::Url> {\n    let parsed = reqwest::Url::parse(url.trim()).context(\"分享 URL 格式无效\")?;\n    if parsed.scheme() != \"https\" || !parsed.host_str().is_some_and(|host| SHARE_HOSTS.contains(&host)) {\n        bail!(\"仅支持 Codex++ 分享站点链接\");\n    }\n    if parsed.fragment().is_none() {\n        bail!(\"分享链接缺少解密密钥\");\n    }\n    Ok(parsed)\n}\n\nfn decrypt_shared_payload(encrypted: &Value, key_value: &str) -> anyhow::Result<Vec<u8>> {\n    if encrypted.get(\"v\").and_then(Value::as_u64) != Some(1) {\n        bail!(\"不支持此分享的数据格式\");","sourceCodeStart":84,"sourceCodeEnd":120,"githubUrl":"https://github.com/BigPizzaV3/CodexPlusPlus/blob/f2074595a281bc057525c748175c8eb9805b0673/crates/codex-plus-core/src/session_share.rs#L84-L120","documentation":"Thrown by import_shared_session_url after fetching and decrypting the share record: the payload's kind field is not \"codex-rollout\". The share host may host other content types, but this importer only handles Codex rollout sessions; the offending input is the kind field of the decrypted share payload.","triggerScenarios":"Thrown at crates/codex-plus-core/src/session_share.rs:102 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["使用 Codex++ 分享功能生成的会话分享链接"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"f2074595a281bc057525c748175c8eb9805b0673","analyzedAt":"2026-08-23T12:52:24.489Z","contentChangedAt":"2026-08-23T12:52:24.489Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}