From b3eeff07a444f68bd6dee825a2d569ef522db2bb Mon Sep 17 00:00:00 2001 From: Operator & Codex Date: Sat, 2 May 2026 18:07:56 +0200 Subject: [PATCH] Make root config defaults explicit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Build: pass | Tests: FAIL — Tests 8 failed | 2088 passed | 4 skipped (2100) --- src/config-identity.test.ts | 22 ++++++++++++++++++++++ src/config.ts | 12 +++++++----- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/config-identity.test.ts b/src/config-identity.test.ts index ee53e4d..152aafb 100644 --- a/src/config-identity.test.ts +++ b/src/config-identity.test.ts @@ -85,6 +85,28 @@ describe('config identity', () => { vi.doUnmock('./env.js'); }); + it('uses explicit root-platform defaults when TENANT_ID is unset', async () => { + process.env.ASSISTANT_NAME = 'Mevy'; + vi.doMock('./env.js', async () => { + const actual = await vi.importActual('./env.js'); + return { + ...actual, + readEnvFile: () => ({}), + }; + }); + + const config = await import('./config.js'); + + expect(config.TENANT_ID).toBe(''); + expect(config.AGENT_CONFIG_DIR).toBe('clawdie-cp'); + expect(config.AGENT_INTERNAL_DOMAIN).toBe('clawdie.home.arpa'); + expect(config.CMS_WEBROOT).toBe('/usr/local/www/clawdie'); + expect(config.ASTRO_SITE_PATH).toBe('/home/clawdie/clawdie-site'); + expect(config.GIT_JAIL_NAME).toBe('git'); + + vi.doUnmock('./env.js'); + }); + // system-namespace: pinned env-driven PLATFORM_RUNTIME_USER / // PLATFORM_RUNTIME_HOME overrides; both are now constants derived // from SERVICE_NAME. Override path will be a bootstrap-config field, diff --git a/src/config.ts b/src/config.ts index 0de7b9a..622b5cb 100644 --- a/src/config.ts +++ b/src/config.ts @@ -267,7 +267,9 @@ export const AGENT_GENDER: AgentGender = (() => { // ── Derived system identifiers ── -export const AGENT_CONFIG_DIR = tenantControlplanePrefix(TENANT_ID); +const RUNTIME_TENANT_ID = TENANT_ID || SERVICE_NAME; + +export const AGENT_CONFIG_DIR = tenantControlplanePrefix(RUNTIME_TENANT_ID); export const AGENT_DOMAIN = process.env.AGENT_DOMAIN || envConfig.AGENT_DOMAIN || @@ -279,7 +281,7 @@ export const AGENT_INTERNAL_DOMAIN = process.env.AGENT_INTERNAL_DOMAIN || envConfig.AGENT_INTERNAL_DOMAIN || registryDefaults?.tenants[TENANT_ID]?.internalDomain || - tenantInternalDomain(TENANT_ID, PLATFORM_INTERNAL_BASE); + tenantInternalDomain(RUNTIME_TENANT_ID, PLATFORM_INTERNAL_BASE); export const CONTROLPLANE_INTERNAL_DOMAIN = PLATFORM_INTERNAL_DOMAIN; export const CONTROLPLANE_HOST_LABEL = CONTROLPLANE_INTERNAL_DOMAIN.split('.')[0] || 'ai'; @@ -703,11 +705,11 @@ export const CMS_JAIL_IP = export const CMS_WEBROOT = process.env.CMS_WEBROOT || envConfig.CMS_WEBROOT || - `/usr/local/www/${TENANT_ID}`; + `/usr/local/www/${RUNTIME_TENANT_ID}`; export const ASTRO_SITE_PATH = process.env.ASTRO_SITE_PATH || envConfig.ASTRO_SITE_PATH || - tenantSiteRoot(TENANT_ID, PLATFORM_RUNTIME_HOME); + tenantSiteRoot(RUNTIME_TENANT_ID, PLATFORM_RUNTIME_HOME); export const GIT_JAIL_IP = process.env.WARDEN_GIT_IP || envConfig.WARDEN_GIT_IP || @@ -736,7 +738,7 @@ function defaultJailNameForRole(role: string, fallback: string): string { export const GIT_JAIL_NAME = process.env.GIT_JAIL_NAME || envConfig.GIT_JAIL_NAME || - defaultJailNameForRole('git', `${TENANT_ID}-git`); + defaultJailNameForRole('git', TENANT_ID ? `${TENANT_ID}-git` : 'git'); export const GIT_DEFAULT_REPO_NAME = process.env.GIT_DEFAULT_REPO_NAME || envConfig.GIT_DEFAULT_REPO_NAME ||