{"record":{"id":"268fe2c3209575da","repo":"tinyhumansai/openhuman","slug":"core-rejected-the-meet-agent-get-call-detail-reque","errorCode":null,"errorMessage":"Core rejected the meet_agent_get_call_detail request.","messagePattern":"Core rejected the meet_agent_get_call_detail request\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/src/services/meetCallService.ts","lineNumber":133,"sourceCode":"  if (!result?.ok) {\n    throw new Error('Core rejected the meet_agent_list_calls request.');\n  }\n  return result.calls ?? [];\n}\n\n/**\n * Fetch the transcript + summary for one completed call. Lazy-loaded when the\n * user expands a recent-call row. Returns `null` when the core has no detail\n * for this call (older calls recorded before the feature, or a failed write) —\n * the panel renders a \"no transcript yet\" state in that case.\n */\nexport async function getMeetCallDetail(requestId: string): Promise<MeetCallDetail | null> {\n  const result = await callCoreRpc<CoreGetCallDetailResponse>({\n    method: 'openhuman.meet_agent_get_call_detail',\n    params: { request_id: requestId },\n  });\n  if (!result?.ok) {\n    throw new Error('Core rejected the meet_agent_get_call_detail request.');\n  }\n  return result.detail ?? null;\n}\n\n// ---------------------------------------------------------------------------\n// Transcript parsing\n// ---------------------------------------------------------------------------\n\n/** A transcript line with its parsed timestamp/speaker prefix stripped out. */\ninterface ParsedTranscriptLine {\n  timestamp: string | null;\n  speaker: string | null;\n  text: string;\n  role: string;\n}\n\nconst TRANSCRIPT_PREFIX_RE = /^\\[(\\d{1,2}:\\d{2})\\]\\s*\\[([^\\]]+)\\]\\s*(.*)/s;\n","sourceCodeStart":115,"sourceCodeEnd":151,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/app/src/services/meetCallService.ts#L115-L151","documentation":"Same application-level rejection pattern as list calls: openhuman.meet_agent_get_call_detail returned ok:false for the given request_id. This is distinct from the designed 'no detail' case — the function returns null when ok:true and detail is absent (older calls recorded before the feature, or a failed transcript write), and only throws when the core explicitly rejects the request.","triggerScenarios":"Calling getMeetCallDetail(requestId) with a malformed/unresolvable request_id that the handler rejects outright; the detail store being unreadable; a request_id from a different workspace/core instance.","commonSituations":"Expanding a history row after switching workspaces; stale request IDs persisted in UI state across core restarts; corrupt detail files on disk.","solutions":["Catch this error where the row expands and render the same 'no transcript yet' state used for a null detail — the user experience is identical","Confirm the request_id came from listMeetCalls in the same session/workspace","Check core logs for why the handler rejected (read error vs unknown id)","Update the core if the handler predates tolerant get-detail semantics"],"exampleFix":"// before\nconst detail = await getMeetCallDetail(requestId);\n\n// after\nlet detail: MeetCallDetail | null = null;\ntry { detail = await getMeetCallDetail(requestId); }\ncatch { detail = null; } // panel already renders a 'no transcript yet' state for null\nsetDetail(detail);","handlingStrategy":"fallback","validationCode":"function isExpandableRequestId(id: string, calls: MeetCallRecord[]): boolean {\n  return calls.some(c => c.requestId === id); // only expand IDs from the current list\n}","typeGuard":"function isMeetDetailRejected(err: unknown): boolean {\n  return err instanceof Error && err.message.includes('meet_agent_get_call_detail');\n}","tryCatchPattern":"try {\n  setDetail(await getMeetCallDetail(requestId));\n} catch {\n  setDetail(null); // same UI state as 'no transcript yet'\n}","preventionTips":["Design the row UI around detail: MeetCallDetail | null from the start so rejection and absence share one state","Pass request IDs straight from listMeetCalls — don't persist them across workspace switches"],"tags":["meet","rpc","ok-flag","transcript","lazy-load"],"backgroundTag":"rpc-ok-false-rejection","analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}