feat: add persistent desktop assistant workspace

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
This commit is contained in:
lofyer
2026-07-31 22:33:03 +08:00
co-authored by factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
parent 698a15ad14
commit 6ef1795b81
101 changed files with 31866 additions and 1176 deletions
+71 -16
View File
@@ -1,23 +1,56 @@
import { BigtokenAgentRuntime } from './bigtoken-runtime'
import { ModelAgentRuntime } from './model-runtime'
import { ContinueAgentRuntime } from './continue-runtime'
import { DemoAgentRuntime } from './demo-runtime'
import { OpenCodeRuntime } from './opencode-runtime'
import type { AgentRuntime } from './runtime'
import { UnconfiguredAgentRuntime } from './unconfigured-runtime'
import type { ResolvedRuntimeSettings } from '../runtime-settings-store'
import { defaultRuntimeSettings } from '../../shared/contracts'
import type { ResolvedMcpServer } from '../capabilities/capability-service'
import type { BundledRuntimePaths } from './bundled-runtimes'
import type { ContinueHostLauncher } from './continue-host-adapter'
export type AgentCapabilityContext = {
skillInstructions?: string
mcpServers?: ResolvedMcpServer[]
continueHostCacheRoot?: string
bundledRuntimePaths?: BundledRuntimePaths
continueHostLauncher?: ContinueHostLauncher
}
export function createAgentRuntime(
defaultWorkspace: string,
settings?: ResolvedRuntimeSettings
settings?: ResolvedRuntimeSettings,
capabilities: AgentCapabilityContext = {}
): AgentRuntime {
const baseUrl = process.env.GOODBUDDY_OPENCODE_URL
const embedded = process.env.GOODBUDDY_OPENCODE_EMBEDDED === 'true'
const baseUrl =
settings?.opencodeBaseUrl || process.env.GOODBUDDY_OPENCODE_URL
const embedded =
settings?.opencodeEmbedded ??
process.env.GOODBUDDY_OPENCODE_EMBEDDED === 'true'
const workspace = settings?.workspacePath || defaultWorkspace
const provider = settings?.provider ?? 'auto'
if (provider === 'continue') {
return new ContinueAgentRuntime({
command: process.env.GOODBUDDY_CONTINUE_COMMAND ?? 'cn',
defaultWorkspace
binaryPath:
settings?.continueBinaryPath ??
process.env.GOODBUDDY_CONTINUE_BINARY?.trim() ??
process.env.GOODBUDDY_CONTINUE_COMMAND?.trim() ??
'',
bundledBinaryPath: capabilities.bundledRuntimePaths?.continue,
configPath:
settings?.continueConfigPath ??
process.env.GOODBUDDY_CONTINUE_CONFIG?.trim() ??
'',
mode: settings?.continueMode ?? defaultRuntimeSettings.continueMode,
modelProfile: settings?.continueModelProfile,
skillInstructions: capabilities.skillInstructions,
defaultWorkspace: workspace,
hostCacheRoot:
capabilities.continueHostCacheRoot ??
process.env.GOODBUDDY_CONTINUE_HOST_CACHE?.trim() ??
'',
launchHost: capabilities.continueHostLauncher
})
}
@@ -25,20 +58,42 @@ export function createAgentRuntime(
return new OpenCodeRuntime({
baseUrl,
embedded,
defaultWorkspace
binaryPath:
settings?.opencodeBinaryPath ??
process.env.GOODBUDDY_OPENCODE_BINARY?.trim() ??
'',
bundledBinaryPath: capabilities.bundledRuntimePaths?.opencode,
configPath:
settings?.opencodeConfigPath ??
process.env.GOODBUDDY_OPENCODE_CONFIG?.trim() ??
'',
modelProfile: settings?.opencodeModelProfile,
skillInstructions: capabilities.skillInstructions,
mcpServers: capabilities.mcpServers,
defaultWorkspace: workspace
})
}
const bigtokenApiKey =
settings?.apiKey ?? process.env.GOODBUDDY_BIGTOKEN_API_KEY?.trim()
if (provider === 'bigtoken' || (provider === 'auto' && bigtokenApiKey)) {
return new BigtokenAgentRuntime({
apiKey: bigtokenApiKey ?? '',
const modelApiKey =
settings?.apiKey ||
process.env.GOODBUDDY_MODEL_API_KEY?.trim() ||
process.env.GOODBUDDY_BIGTOKEN_API_KEY?.trim()
if (provider === 'model' || (provider === 'auto' && modelApiKey)) {
return new ModelAgentRuntime({
apiKey: modelApiKey ?? '',
baseUrl:
settings?.bigtokenBaseUrl ?? defaultRuntimeSettings.bigtokenBaseUrl,
model: settings?.bigtokenModel ?? defaultRuntimeSettings.bigtokenModel
settings?.modelBaseUrl ||
process.env.GOODBUDDY_MODEL_BASE_URL?.trim() ||
process.env.GOODBUDDY_BIGTOKEN_BASE_URL?.trim() ||
defaultRuntimeSettings.modelBaseUrl,
model:
settings?.modelName ||
process.env.GOODBUDDY_MODEL_NAME?.trim() ||
process.env.GOODBUDDY_BIGTOKEN_MODEL?.trim() ||
defaultRuntimeSettings.modelName,
skillInstructions: capabilities.skillInstructions
})
}
return new DemoAgentRuntime()
return new UnconfiguredAgentRuntime()
}