From 3db66c0ced5c088b9a402dac0de84549790237ca Mon Sep 17 00:00:00 2001 From: gavrielc Date: Wed, 22 Apr 2026 15:16:59 +0300 Subject: [PATCH] fix: forward ONECLI_API_KEY to OneCLI SDK for authenticated container config MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ports the v1 fix from PR #1777 (originally 8b5b581 by @johnnyfish). Cherry-pick did not apply cleanly because v2 reformatted the surrounding code and split OneCLI usage into two sites — manual port was needed. v2-specific adaptations: - Also forward apiKey at the second OneCLI call site in src/modules/approvals/onecli-approvals.ts (v2 split the approvals module out of container-runner). - Skipped the companion test-mock commit (38163bc) — it patches src/container-runner.test.ts, which no longer exists in v2 (tests consolidated into host-core.test.ts). Co-Authored-By: Claude Opus 4.7 (1M context) Co-Authored-By: johnnyfish --- src/config.ts | 9 ++++++++- src/container-runner.ts | 4 ++-- src/modules/approvals/onecli-approvals.ts | 4 ++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/config.ts b/src/config.ts index 043a4a2..4a4eef6 100644 --- a/src/config.ts +++ b/src/config.ts @@ -5,7 +5,13 @@ import { readEnvFile } from './env.js'; import { isValidTimezone } from './timezone.js'; // Read config values from .env (falls back to process.env). -const envConfig = readEnvFile(['ASSISTANT_NAME', 'ASSISTANT_HAS_OWN_NUMBER', 'ONECLI_URL', 'TZ']); +const envConfig = readEnvFile([ + 'ASSISTANT_NAME', + 'ASSISTANT_HAS_OWN_NUMBER', + 'ONECLI_URL', + 'ONECLI_API_KEY', + 'TZ', +]); export const ASSISTANT_NAME = process.env.ASSISTANT_NAME || envConfig.ASSISTANT_NAME || 'Andy'; export const ASSISTANT_HAS_OWN_NUMBER = @@ -26,6 +32,7 @@ export const CONTAINER_IMAGE = process.env.CONTAINER_IMAGE || 'nanoclaw-agent:la export const CONTAINER_TIMEOUT = parseInt(process.env.CONTAINER_TIMEOUT || '1800000', 10); export const CONTAINER_MAX_OUTPUT_SIZE = parseInt(process.env.CONTAINER_MAX_OUTPUT_SIZE || '10485760', 10); // 10MB default export const ONECLI_URL = process.env.ONECLI_URL || envConfig.ONECLI_URL; +export const ONECLI_API_KEY = process.env.ONECLI_API_KEY || envConfig.ONECLI_API_KEY; export const MAX_MESSAGES_PER_PROMPT = Math.max(1, parseInt(process.env.MAX_MESSAGES_PER_PROMPT || '10', 10) || 10); export const IDLE_TIMEOUT = parseInt(process.env.IDLE_TIMEOUT || '1800000', 10); // 30min default — how long to keep container alive after last result export const MAX_CONCURRENT_CONTAINERS = Math.max(1, parseInt(process.env.MAX_CONCURRENT_CONTAINERS || '5', 10) || 5); diff --git a/src/container-runner.ts b/src/container-runner.ts index 7425299..4b7964c 100644 --- a/src/container-runner.ts +++ b/src/container-runner.ts @@ -9,7 +9,7 @@ import path from 'path'; import { OneCLI } from '@onecli-sh/sdk'; -import { CONTAINER_IMAGE, DATA_DIR, GROUPS_DIR, ONECLI_URL, TIMEZONE } from './config.js'; +import { CONTAINER_IMAGE, DATA_DIR, GROUPS_DIR, ONECLI_API_KEY, ONECLI_URL, TIMEZONE } from './config.js'; import { readContainerConfig, writeContainerConfig } from './container-config.js'; import { CONTAINER_RUNTIME_BIN, hostGatewayArgs, readonlyMountArgs, stopContainer } from './container-runtime.js'; import { composeGroupClaudeMd } from './claude-md-compose.js'; @@ -30,7 +30,7 @@ import { import { markContainerRunning, markContainerStopped, sessionDir, writeSessionRouting } from './session-manager.js'; import type { AgentGroup, Session } from './types.js'; -const onecli = new OneCLI({ url: ONECLI_URL }); +const onecli = new OneCLI({ url: ONECLI_URL, apiKey: ONECLI_API_KEY }); /** Active containers tracked by session ID. */ const activeContainers = new Map(); diff --git a/src/modules/approvals/onecli-approvals.ts b/src/modules/approvals/onecli-approvals.ts index 1594a82..eec05c0 100644 --- a/src/modules/approvals/onecli-approvals.ts +++ b/src/modules/approvals/onecli-approvals.ts @@ -20,7 +20,7 @@ import { OneCLI, type ApprovalRequest, type ManualApprovalHandle } from '@onecli-sh/sdk'; import { pickApprovalDelivery, pickApprover } from './primitive.js'; -import { ONECLI_URL } from '../../config.js'; +import { ONECLI_API_KEY, ONECLI_URL } from '../../config.js'; import { getAgentGroup } from '../../db/agent-groups.js'; import { createPendingApproval, @@ -36,7 +36,7 @@ export const ONECLI_ACTION = 'onecli_credential'; type Decision = 'approve' | 'deny'; -const onecli = new OneCLI({ url: ONECLI_URL }); +const onecli = new OneCLI({ url: ONECLI_URL, apiKey: ONECLI_API_KEY }); interface PendingState { resolve: (decision: Decision) => void;