diff --git a/src/container-runner.ts b/src/container-runner.ts index 1700a69..32b486b 100644 --- a/src/container-runner.ts +++ b/src/container-runner.ts @@ -133,12 +133,16 @@ function prepareGroupEnvironment( delete cleanEnv.CLAUDECODE; delete cleanEnv.CLAUDE_CODE_ENTRYPOINT; - // Ensure node is findable by SDK subprocess (cli.js uses #!/usr/bin/env node) + // Ensure node and npm-global binaries (codex, etc.) are findable const nodeBin = path.dirname(process.execPath); + const npmGlobalBin = path.join(os.homedir(), '.npm-global', 'bin'); const currentPath = cleanEnv.PATH || '/usr/local/bin:/usr/bin:/bin'; - const enrichedPath = currentPath.includes(nodeBin) - ? currentPath - : `${nodeBin}:${currentPath}`; + const extraPaths = [nodeBin, npmGlobalBin].filter( + (p) => !currentPath.includes(p) && fs.existsSync(p), + ); + const enrichedPath = extraPaths.length > 0 + ? `${extraPaths.join(':')}:${currentPath}` + : currentPath; const env: Record = { ...cleanEnv, diff --git a/src/index.ts b/src/index.ts index 7548d53..c0667ac 100644 --- a/src/index.ts +++ b/src/index.ts @@ -257,6 +257,9 @@ async function processGroupMessages(chatJid: string): Promise { await channel.sendMessage(chatJid, text); outputSentToUser = true; } + // Clear typing indicator after sending a response — the runner may stay + // alive waiting for IPC messages, but the user shouldn't see "typing..." + await channel.setTyping?.(chatJid, false); // Only reset idle timer on actual results, not session-update markers (result: null) resetIdleTimer(); }