From 572ccdbd3bc416d4f4c9b9a923ced567266636b2 Mon Sep 17 00:00:00 2001 From: tanmay11k Date: Thu, 19 Feb 2026 02:38:50 -0500 Subject: [PATCH] feat: wire OpenCode as selectable agent backend via AGENT_BACKEND env var - Add AGENT_BACKEND config ('container' default, 'opencode' to use OpenCode runtime) - Wire OpenCodeRuntime into runAgent() with fallback to container runner - Skip container system check when using OpenCode backend - Update README and CLAUDE.md with AGENT_BACKEND docs --- README.md | 2 +- assets/logo.jpeg | Bin 0 -> 64640 bytes src/config.ts | 6 ++ src/index.ts | 133 +++++++++++++++++++++++++++++++++- src/opencode/test-opencode.ts | 31 ++++++++ 5 files changed, 169 insertions(+), 3 deletions(-) create mode 100644 assets/logo.jpeg create mode 100644 src/opencode/test-opencode.ts diff --git a/README.md b/README.md index 423d756..607075f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- Regolith + Regolith

diff --git a/assets/logo.jpeg b/assets/logo.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..3dab15a499551d5aa4f56bbcdbb4410b3079a02d GIT binary patch literal 64640 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 literal 0 HcmV?d00001 diff --git a/src/config.ts b/src/config.ts index 219b0c9..5f91a6a 100644 --- a/src/config.ts +++ b/src/config.ts @@ -10,6 +10,7 @@ const envConfig = readEnvFile([ 'ASSISTANT_HAS_OWN_NUMBER', 'DISCORD_BOT_TOKEN', 'DISCORD_ONLY', + 'AGENT_BACKEND', ]); export const ASSISTANT_NAME = @@ -20,6 +21,11 @@ export const DISCORD_BOT_TOKEN = process.env.DISCORD_BOT_TOKEN || envConfig.DISCORD_BOT_TOKEN || ''; export const DISCORD_ONLY = (process.env.DISCORD_ONLY || envConfig.DISCORD_ONLY) === 'true'; + +// Agent backend: 'container' (Claude Agent SDK in containers) or 'opencode' (OpenCode CLI/SDK) +export const AGENT_BACKEND = + (process.env.AGENT_BACKEND || envConfig.AGENT_BACKEND || 'container').toLowerCase() as 'container' | 'opencode'; + export const POLL_INTERVAL = 2000; export const SCHEDULER_POLL_INTERVAL = 60000; diff --git a/src/index.ts b/src/index.ts index d61b832..99d7e53 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,6 +3,7 @@ import fs from 'fs'; import path from 'path'; import { + AGENT_BACKEND, ASSISTANT_NAME, DATA_DIR, DISCORD_BOT_TOKEN, @@ -16,7 +17,107 @@ import { DiscordChannel } from './channels/discord.js'; import { WhatsAppChannel } from './channels/whatsapp.js'; import { ContainerOutput, - runContainerAgent, + async function runAgent( + group: RegisteredGroup, + prompt: string, + chatJid: string, + onOutput?: (output: ContainerOutput) => Promise, + ): Promise<'success' | 'error'> { + // --- OpenCode backend --- + if (opencode) { + try { + const response = await opencode.chat(prompt, chatJid); + if (response.error) { + logger.error({ group: group.name, error: response.error }, 'OpenCode agent error'); + if (onOutput) { + await onOutput({ status: 'error', error: response.error, result: null, newSessionId: response.sessionId }); + } + return 'error'; + } + if (onOutput && response.text) { + await onOutput({ status: 'success', result: response.text, error: null, newSessionId: response.sessionId }); + } + return 'success'; + } catch (err) { + logger.error({ group: group.name, err }, 'OpenCode agent error'); + return 'error'; + } + } + + // --- Container backend (Claude Agent SDK) --- + const isMain = group.folder === MAIN_GROUP_FOLDER; + const sessionId = sessions[group.folder]; + + // Update tasks snapshot for container to read (filtered by group) + const tasks = getAllTasks(); + writeTasksSnapshot( + group.folder, + isMain, + tasks.map((t) => ({ + id: t.id, + groupFolder: t.group_folder, + prompt: t.prompt, + schedule_type: t.schedule_type, + schedule_value: t.schedule_value, + status: t.status, + next_run: t.next_run, + })), + ); + + // Update available groups snapshot (main group only can see all groups) + const availableGroups = getAvailableGroups(); + writeGroupsSnapshot( + group.folder, + isMain, + availableGroups, + new Set(Object.keys(registeredGroups)), + ); + + // Wrap onOutput to track session ID from streamed results + const wrappedOnOutput = onOutput + ? async (output: ContainerOutput) => { + if (output.newSessionId) { + sessions[group.folder] = output.newSessionId; + setSession(group.folder, output.newSessionId); + } + await onOutput(output); + } + : undefined; + + try { + const output = await runContainerAgent( + group, + { + prompt, + sessionId, + groupFolder: group.folder, + chatJid, + isMain, + }, + (proc, containerName) => queue.registerProcess(chatJid, proc, containerName, group.folder), + wrappedOnOutput, + ); + + if (output.newSessionId) { + sessions[group.folder] = output.newSessionId; + setSession(group.folder, output.newSessionId); + } + + if (output.status === 'error') { + logger.error( + { group: group.name, error: output.error }, + 'Container agent error', + ); + return 'error'; + } + + return 'success'; + } catch (err) { + logger.error({ group: group.name, err }, 'Agent error'); + return 'error'; + } + } +, writeGroupsSnapshot, writeTasksSnapshot, } from './container-runner.js'; @@ -41,6 +142,7 @@ import { findChannel, formatMessages, formatOutbound } from './router.js'; import { startSchedulerLoop } from './task-scheduler.js'; import { Channel, NewMessage, RegisteredGroup } from './types.js'; import { logger } from './logger.js'; +import { OpenCodeRuntime } from './opencode/runtime.js'; // Re-export for backwards compatibility during refactor export { escapeXml, formatMessages } from './router.js'; @@ -54,6 +156,7 @@ let messageLoopRunning = false; let whatsapp: WhatsAppChannel; const channels: Channel[] = []; const queue = new GroupQueue(); +const opencode = AGENT_BACKEND === 'opencode' ? new OpenCodeRuntime() : null; function loadState(): void { lastTimestamp = getRouterState('last_timestamp') || ''; @@ -221,6 +324,28 @@ async function runAgent( chatJid: string, onOutput?: (output: ContainerOutput) => Promise, ): Promise<'success' | 'error'> { + // --- OpenCode backend --- + if (opencode) { + try { + const response = await opencode.chat(prompt, chatJid); + if (response.error) { + logger.error({ group: group.name, error: response.error }, 'OpenCode agent error'); + if (onOutput) { + await onOutput({ status: 'error', error: response.error, result: null, newSessionId: response.sessionId }); + } + return 'error'; + } + if (onOutput && response.text) { + await onOutput({ status: 'success', result: response.text, error: null, newSessionId: response.sessionId }); + } + return 'success'; + } catch (err) { + logger.error({ group: group.name, err }, 'OpenCode agent error'); + return 'error'; + } + } + + // --- Container backend (Claude Agent SDK) --- const isMain = group.folder === MAIN_GROUP_FOLDER; const sessionId = sessions[group.folder]; @@ -464,7 +589,11 @@ function ensureContainerSystemRunning(): void { } async function main(): Promise { - ensureContainerSystemRunning(); + if (AGENT_BACKEND === 'container') { + ensureContainerSystemRunning(); + } else { + logger.info({ backend: AGENT_BACKEND }, 'Using OpenCode agent backend, skipping container system check'); + } initDatabase(); logger.info('Database initialized'); loadState(); diff --git a/src/opencode/test-opencode.ts b/src/opencode/test-opencode.ts new file mode 100644 index 0000000..cc9c741 --- /dev/null +++ b/src/opencode/test-opencode.ts @@ -0,0 +1,31 @@ +import { OpenCodeRuntime } from './runtime.js'; + +async function main() { + const runtime = new OpenCodeRuntime({ + mode: 'cli', + timeoutMs: 30_000, + }); + + console.log('Status:', runtime.getStatus()); + + // Test 1: Empty message rejection + const empty = await runtime.chat(' '); + console.log('\nEmpty message test:', empty); + + // Test 2: Actual chat (requires opencode binary installed) + try { + const response = await runtime.chat('Say hello in one sentence.', 'test-conv-1'); + console.log('\nChat response:', response); + } catch (err) { + console.log('\nChat failed (opencode binary probably not installed):', err); + } + + // Test 3: Session status after chat + console.log('\nStatus after chat:', runtime.getStatus()); + + // Cleanup + runtime.closeSession('test-conv-1'); + console.log('\nSession closed. Final status:', runtime.getStatus()); +} + +main().catch(console.error);