fix(opencode-local): resolve HOME from os.userInfo() for model discovery
When Paperclip's server is started via `runuser -u node` (common in Docker/Fly.io deployments), the HOME environment variable retains the parent process's value (e.g. /root) instead of the target user's home directory (/home/node). This causes `opencode models` to miss provider auth credentials stored under the actual user's home, resulting in "Configured OpenCode model is unavailable" errors for providers that require API keys (e.g. zai/zhipuai). Fix: use `os.userInfo().homedir` (reads from /etc/passwd, not env) to ensure the child process always sees the correct HOME, regardless of how the server was launched. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
import { createHash } from "node:crypto";
|
import { createHash } from "node:crypto";
|
||||||
|
import os from "node:os";
|
||||||
import type { AdapterModel } from "@paperclipai/adapter-utils";
|
import type { AdapterModel } from "@paperclipai/adapter-utils";
|
||||||
import {
|
import {
|
||||||
asString,
|
asString,
|
||||||
@@ -107,7 +108,12 @@ export async function discoverOpenCodeModels(input: {
|
|||||||
const command = resolveOpenCodeCommand(input.command);
|
const command = resolveOpenCodeCommand(input.command);
|
||||||
const cwd = asString(input.cwd, process.cwd());
|
const cwd = asString(input.cwd, process.cwd());
|
||||||
const env = normalizeEnv(input.env);
|
const env = normalizeEnv(input.env);
|
||||||
const runtimeEnv = normalizeEnv(ensurePathInEnv({ ...process.env, ...env }));
|
// Ensure HOME points to the actual running user's home directory.
|
||||||
|
// When the server is started via `runuser -u <user>`, HOME may still
|
||||||
|
// reflect the parent process (e.g. /root), causing OpenCode to miss
|
||||||
|
// provider auth credentials stored under the target user's home.
|
||||||
|
const resolvedHome = os.userInfo().homedir;
|
||||||
|
const runtimeEnv = normalizeEnv(ensurePathInEnv({ ...process.env, ...env, ...(resolvedHome ? { HOME: resolvedHome } : {}) }));
|
||||||
|
|
||||||
const result = await runChildProcess(
|
const result = await runChildProcess(
|
||||||
`opencode-models-${Date.now()}-${Math.random().toString(16).slice(2)}`,
|
`opencode-models-${Date.now()}-${Math.random().toString(16).slice(2)}`,
|
||||||
|
|||||||
Reference in New Issue
Block a user