{"record":{"id":"9116dfe82b38138a","repo":"jackwener/OpenCLI","slug":"no-job-seeker-side-chat-sessions-were-returned","errorCode":null,"errorMessage":"No job-seeker-side chat sessions were returned.","messagePattern":"No job-seeker-side chat sessions were returned\\.","errorType":"exception","errorClass":"EmptyResultError","httpStatus":null,"severity":"info","filePath":"clis/boss/chatlist.js","lineNumber":90,"sourceCode":"        const pageNum = readPositiveInteger(kwargs.page, 'chatlist --page', 1);\n        const side = kwargs.side || 'auto';\n\n        if (side === 'boss') {\n            await navigateToChat(page);\n            const friends = await fetchFriendList(page, {\n                pageNum,\n                jobId: kwargs['job-id'] || '0',\n            });\n            if (friends.length === 0)\n                throw new EmptyResultError('boss chatlist', 'No recruiter-side chat sessions were returned.');\n            return friends.slice(0, limit).map(mapBossRow);\n        }\n\n        if (side === 'geek') {\n            await navigateToGeekChat(page);\n            const rows = await buildGeekRows(page, limit);\n            if (rows.length === 0)\n                throw new EmptyResultError('boss chatlist', 'No job-seeker-side chat sessions were returned.');\n            return rows;\n        }\n\n        // auto: try recruiter first, fall back to geek on identity mismatch\n        await navigateToChat(page);\n        const bossResult = await fetchFriendList(page, {\n            pageNum,\n            jobId: kwargs['job-id'] || '0',\n            allowNonZero: true,\n        });\n        if (Array.isArray(bossResult)) {\n            if (bossResult.length === 0)\n                throw new EmptyResultError('boss chatlist', 'No recruiter-side chat sessions were returned.');\n            return bossResult.slice(0, limit).map(mapBossRow);\n        }\n        if (bossResult.code === IDENTITY_MISMATCH_CODE) {\n            await navigateToGeekChat(page);\n            const rows = await buildGeekRows(page, limit);","sourceCodeStart":72,"sourceCodeEnd":108,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/boss/chatlist.js#L72-L108","documentation":"When side=geek, the command navigates to the job-seeker chat page, builds rows via buildGeekRows (label list + friend info enrichment), and throws EmptyResultError('boss chatlist') when zero rows are produced. It means the identity is geek-side and the flow ran, but there are no chat sessions (or label groups) to return.","triggerScenarios":"Running `boss chatlist --side geek` when the job-seeker account has no conversations, has no chat labels/groups, or the friend-info enrichment empties everything at the requested page/limit.","commonSituations":"New seeker account that never chatted with recruiters; account actually is recruiter-side (wrong --side choice); zhipin.com changed the geek friend-label API so lists come back empty while UI works.","solutions":["Use --side auto to let the command detect the account side and fall back automatically","Verify in the zhipin.com web UI that the geek chat list shows conversations","Confirm the logged-in account is actually a job-seeker account, not a recruiter account","If the UI shows chats, check fetchGeekFriendLabelList/fetchGeekFriendInfoList endpoints in clis/boss/utils.js for API changes"],"exampleFix":"// before\nboss chatlist --side geek  // account is actually recruiter-side\n// after\nboss chatlist --side auto  // detects side and returns recruiter rows","handlingStrategy":"fallback","validationCode":"// Verify account side before forcing --side geek\nconst identity = await bossVerify(page);\nif (identity.user_type !== 'geek') {\n  console.warn('account is ' + identity.user_type + '; --side geek will be empty');\n}","typeGuard":"function isNonEmptyGeekRows(v) {\n  return Array.isArray(v) && v.length > 0;\n}","tryCatchPattern":"try {\n  rows = await bossChatlist({ side: 'geek' });\n} catch (err) {\n  if (err instanceof EmptyResultError && err.message.includes('job-seeker-side')) {\n    return []; // no seeker chats\n  }\n  throw err;\n}","preventionTips":["Confirm the logged-in account is a job-seeker before --side geek","Prefer --side auto to avoid hard-coding the wrong side","Check the geek chat UI in the same profile if you suspect API drift","Treat empty results as data state, not crashes, in downstream pipelines"],"tags":["empty-result","chatlist","zhipin","side-selection"],"backgroundTag":"empty-result-set","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}