{"record":{"id":"11b2ce64165cd542","repo":"thedotmack/claude-mem","slug":"adapter-rejected-input-missing-session-id","errorCode":null,"errorMessage":"adapter rejected input: missing_session_id","messagePattern":"adapter rejected input: missing_session_id","errorType":"validation","errorClass":"AdapterRejectedInput","httpStatus":null,"severity":"error","filePath":"src/cli/adapters/codex.ts","lineNumber":85,"sourceCode":"    const hookEventName = eventName(r.hook_event_name);\n    const toolName = stringOrUndefined(r.tool_name);\n    let toolInput = cloneToolInput(r.tool_input);\n\n    if (hookEventName === 'PreToolUse' && toolName) {\n      const filePaths = extractFilePaths(toolName, toolInput, cwd);\n      if (filePaths.length > 0 && toolInput && typeof toolInput === 'object' && !Array.isArray(toolInput)) {\n        toolInput = { ...(toolInput as Record<string, unknown>), filePaths };\n      }\n    }\n\n    const source = r.source;\n    const sessionSource =\n      source === 'startup' || source === 'resume' || source === 'clear'\n        ? source\n        : undefined;\n    const sessionId = stringOrUndefined(r.session_id);\n    if (!sessionId) {\n      throw new AdapterRejectedInput('missing_session_id');\n    }\n\n    return {\n      sessionId,\n      cwd,\n      prompt: stringOrUndefined(r.prompt),\n      toolName,\n      toolInput,\n      toolResponse: r.tool_response,\n      transcriptPath: stringOrUndefined(r.transcript_path),\n      lastAssistantMessage: stringOrUndefined(r.last_assistant_message),\n      turnId: stringOrUndefined(r.turn_id),\n      stopHookActive: booleanOrUndefined(r.stop_hook_active),\n      permissionMode: stringOrUndefined(r.permission_mode),\n      model: stringOrUndefined(r.model),\n      sessionSource,\n    };\n  },","sourceCodeStart":67,"sourceCodeEnd":103,"githubUrl":"https://github.com/thedotmack/claude-mem/blob/d8bc9755e74915e5c3b999181e10a67c889bce2a/src/cli/adapters/codex.ts#L67-L103","documentation":"codexAdapter.normalizeInput throws AdapterRejectedInput('missing_session_id') when r.session_id is absent, empty, or not a string after stringOrUndefined coercion. Codex events always carry a session id, so the adapter treats it as mandatory for correlating hook data with a conversation.","triggerScenarios":"Invoking the codex adapter with a raw payload lacking session_id entirely, or with session_id: '' / null / a non-string. Startup/resume/clear source classification succeeds but the session id check then fails.","commonSituations":"Codex CLI version upgrade that renamed or removed session_id from hook payloads; hand-crafted test payloads forgetting session_id; notify hooks (non-startup events) built from truncated JSON that dropped the field.","solutions":["Include a non-empty session_id string in the codex hook payload","If synthesizing events, generate a stable id (e.g. crypto.randomUUID()) and pass it as session_id","Update/verify the Codex CLI version so hook payloads still contain session_id","Catch AdapterRejectedInput with .reason === 'missing_session_id' and fall back to constructing input with a placeholder id"],"exampleFix":"// before\ncodexAdapter.normalizeInput({ hook_event_name: 'SessionStart' });\n// after\ncodexAdapter.normalizeInput({ hook_event_name: 'SessionStart', session_id: 'abc-123' });","handlingStrategy":"validation","validationCode":"if (typeof raw?.session_id !== 'string' || raw.session_id.length === 0) raw = { ...raw, session_id: crypto.randomUUID() };","typeGuard":"function hasSessionId(v: unknown): v is string { return typeof v === 'string' && v.length > 0; }","tryCatchPattern":"try { adapter.normalizeInput(raw); } catch (e) { if (e instanceof AdapterRejectedInput && e.reason === 'missing_session_id') { /* inject placeholder id or reject event */ } else throw e; }","preventionTips":["Always forward session_id from the Codex hook payload","Generate and pass a UUID for synthetic events","Verify Codex CLI version still includes session_id after upgrades"],"tags":["input-validation","adapter","session-id"],"backgroundTag":"missing-required-argument","analyzedSha":"d8bc9755e74915e5c3b999181e10a67c889bce2a","analyzedAt":"2026-09-17T16:40:26.182Z","contentChangedAt":"2026-09-17T16:40:26.182Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}