fix(opencode): keep Go credentials private and resolve backend keys (#24615)

Preserve the complete credential storage, migration, IPC, Settings and rate-limit refresh change alongside standalone GLM plans, current-main database diagnostics and the reviewed unknown-backend environment correction. Keep native discovery cancellation third and selected environment fourth.

Original-topic-commit: 7903f1cddb
Original-topic-commit: 588117b5cf
Original-topic-commit: dedd4f8c86
Original-topic-commit: 6645dae104
Original-topic-commit: a25b80c02c1af7830b0e6a65e72d965b3ad98276
Restacked-from: a25b80c02c1af7830b0e6a65e72d965b3ad98276
Restacked-onto: b032867021

Co-authored-by: kespineira <kespineira@users.noreply.github.com>
Co-authored-by: kevimux <kevimux@users.noreply.github.com>
Reported-by: pullfrog
Reviewed-full-source: 849fe093073f4c1606bd65d79a0c725d955d0d1f
Native-helper-source: 80dbe23237


Reviewed-full-current-source: 36acb57d44adb3d378c0289c8c15f7da0fda214c
This commit is contained in:
Neil
2026-10-02 23:21:27 -07:00
committed by GitHub
co-authored by kespineira kevimux
parent e8402b4619
commit 53f9ea7839
55 changed files with 2271 additions and 301 deletions
@@ -10,8 +10,11 @@ type OpenCodeDatabaseOverride = {
path: string | null
}
function getOpenCodeDatabaseOverride(dataDirectory: string): OpenCodeDatabaseOverride {
const raw = process.env.OPENCODE_DB?.trim()
function getOpenCodeDatabaseOverride(
dataDirectory: string,
environment: NodeJS.ProcessEnv
): OpenCodeDatabaseOverride {
const raw = environment.OPENCODE_DB?.trim()
if (!raw) {
return { isConfigured: false, path: null }
}
@@ -32,31 +35,44 @@ export async function listOpenCodeDatabases(
* "OpenCode not used" rather than "we could not look". */
onRefusal?: (path: string, error: WslTranscriptFsError) => void,
/** Every other stat/readdir failure, including ENOENT; also read as an empty list. */
onFsError?: (path: string, error: unknown) => void
onFsError?: (path: string, error: unknown) => void,
signal?: AbortSignal,
environment: NodeJS.ProcessEnv = process.env
): Promise<string[]> {
const dataDirectory = resolveOpenCodeDataDirectory()
const databaseOverride = getOpenCodeDatabaseOverride(dataDirectory)
const dataDirectory = resolveOpenCodeDataDirectory(environment)
const databaseOverride = getOpenCodeDatabaseOverride(dataDirectory, environment)
if (databaseOverride.isConfigured) {
if (!databaseOverride.path) {
return []
}
try {
return (await wslGatedStat(databaseOverride.path, 'scan')).isFile()
return (await wslGatedStat(databaseOverride.path, 'scan', signal)).isFile()
? [databaseOverride.path]
: []
} catch (error) {
signal?.throwIfAborted()
reportFailure(databaseOverride.path, error, onRefusal, onFsError)
return []
}
}
return listOpenCodeDatabasesInDirectory(dataDirectory, onRefusal, signal, onFsError)
}
export async function listOpenCodeDatabasesInDirectory(
dataDirectory: string,
onRefusal?: (path: string, error: WslTranscriptFsError) => void,
signal?: AbortSignal,
onFsError?: (path: string, error: unknown) => void
): Promise<string[]> {
try {
const entries = await wslGatedReaddir(dataDirectory, 'scan')
const entries = await wslGatedReaddir(dataDirectory, 'scan', signal)
return entries
.filter((entry) => entry.isFile() && /^opencode(?:-[A-Za-z0-9_.-]+)?\.db$/.test(entry.name))
.map((entry) => join(dataDirectory, entry.name))
.sort()
} catch (error) {
signal?.throwIfAborted()
reportFailure(dataDirectory, error, onRefusal, onFsError)
return []
}