Merge pull request #1145 from wesseljt/fix/opencode-home-env
fix(opencode-local): resolve HOME from os.userInfo() for model discovery
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,
|
||||||
@@ -20,7 +21,7 @@ function resolveOpenCodeCommand(input: unknown): string {
|
|||||||
|
|
||||||
const discoveryCache = new Map<string, { expiresAt: number; models: AdapterModel[] }>();
|
const discoveryCache = new Map<string, { expiresAt: number; models: AdapterModel[] }>();
|
||||||
const VOLATILE_ENV_KEY_PREFIXES = ["PAPERCLIP_", "npm_", "NPM_"] as const;
|
const VOLATILE_ENV_KEY_PREFIXES = ["PAPERCLIP_", "npm_", "NPM_"] as const;
|
||||||
const VOLATILE_ENV_KEY_EXACT = new Set(["PWD", "OLDPWD", "SHLVL", "_", "TERM_SESSION_ID"]);
|
const VOLATILE_ENV_KEY_EXACT = new Set(["PWD", "OLDPWD", "SHLVL", "_", "TERM_SESSION_ID", "HOME"]);
|
||||||
|
|
||||||
function dedupeModels(models: AdapterModel[]): AdapterModel[] {
|
function dedupeModels(models: AdapterModel[]): AdapterModel[] {
|
||||||
const seen = new Set<string>();
|
const seen = new Set<string>();
|
||||||
@@ -107,7 +108,19 @@ 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.
|
||||||
|
let resolvedHome: string | undefined;
|
||||||
|
try {
|
||||||
|
resolvedHome = os.userInfo().homedir || undefined;
|
||||||
|
} catch {
|
||||||
|
// os.userInfo() throws a SystemError when the current UID has no
|
||||||
|
// /etc/passwd entry (e.g. `docker run --user 1234` with a minimal
|
||||||
|
// image). Fall back to process.env.HOME.
|
||||||
|
}
|
||||||
|
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