Remove hardcoded mevy runtime identity

Replace remaining executable-code mevy assumptions with config-derived values. This updates operator messaging, runtime prompts, agent-task role defaults, inspect-system fallbacks, and OpenRouter metadata headers to follow PLATFORM_SERVICE_NAME, PLATFORM_ID, TENANT_ID, and PROJECT_ROOT instead of the live example tenant.

---
Build: pass | Tests: FAIL — Tests  3 failed | 2089 passed (2092)
This commit is contained in:
Operator & Codex 2026-05-02 07:16:30 +02:00
parent d1746cf3e5
commit 8c4b8a88ef
6 changed files with 16 additions and 9 deletions

View file

@ -1,4 +1,4 @@
import { CONTROLPLANE_INTERNAL_DOMAIN } from '../src/config.js';
import { CONTROLPLANE_INTERNAL_DOMAIN, TENANT_ID } from '../src/config.js';
const API_PORT = parseInt(process.env.CONTROLPLANE_PORT ?? '3100', 10);
const API_HOST = process.env.CONTROLPLANE_BIND_HOST ?? '127.0.0.1';
@ -9,7 +9,7 @@ const KNOWN_ROLES = new Set([
'sysadmin',
'db-admin',
'git-admin',
'mevy',
TENANT_ID,
]);
const arg1 = process.argv[2];

View file

@ -155,14 +155,19 @@ HOSTNAME_VALUE="$(hostname 2>/dev/null || echo unknown)"
FREEBSD_VERSION="$(tr -d '\r' <"$OUTPUT_DIR/freebsd-version.txt" | head -n 1 || true)"
UNAME_VALUE="$(tr -d '\r' <"$OUTPUT_DIR/uname.txt" | head -n 1 || true)"
PLATFORM_ID_VALUE="${PLATFORM_ID:-$(read_env_value PLATFORM_ID 2>/dev/null || true)}"
if [ -z "$PLATFORM_ID_VALUE" ]; then
PLATFORM_ID_VALUE="clawdie"
fi
PLATFORM_SERVICE_NAME="${PLATFORM_SERVICE_NAME:-$(read_env_value PLATFORM_SERVICE_NAME 2>/dev/null || true)}"
if [ -z "$PLATFORM_SERVICE_NAME" ]; then
PLATFORM_SERVICE_NAME="mevy"
PLATFORM_SERVICE_NAME="$PLATFORM_ID_VALUE"
fi
PLATFORM_RUNTIME_USER="${PLATFORM_RUNTIME_USER:-$(read_env_value PLATFORM_RUNTIME_USER 2>/dev/null || true)}"
if [ -z "$PLATFORM_RUNTIME_USER" ]; then
PLATFORM_RUNTIME_USER="mevy"
PLATFORM_RUNTIME_USER="$PLATFORM_SERVICE_NAME"
fi
ZFS_PREFIX_VALUE="${ZFS_PREFIX:-$(read_env_value ZFS_PREFIX 2>/dev/null || true)}"

View file

@ -419,9 +419,9 @@ export async function runJailAgent(
`State this accurately if asked — do not guess or substitute another model name.\n` +
(modelGuide ? `Rule: ${modelGuide}\n` : '') +
`Rule: Do not end your reply with a promise of future inspection or follow-up unless you are actually providing that follow-up in the same message. If there is no real async job, answer directly now.\n` +
`Rule: The Mevy service runs as a FreeBSD rc.d service and executes \`node dist/index.js\` (not \`node src/index.ts\`). ` +
`Rule: The platform service runs as a FreeBSD rc.d service and executes \`node dist/index.js\` (not \`node src/index.ts\`). ` +
`Do not tell the operator to run \`just dev\` or start the service manually unless explicitly asked; instead, instruct to check \`sudo service ${PLATFORM_SERVICE_NAME} status\` and use \`sudo service ${PLATFORM_SERVICE_NAME} restart\` when needed.\n` +
`Rule: Text-to-speech uses the \`edge-tts\` CLI provided by the repo wrapper at \`/home/mevy/mevy-ai/bin/edge-tts\`, which runs from a persistent uv venv at \`/home/mevy/mevy-ai/.venv-edge-tts\`. ` +
`Rule: Text-to-speech uses the \`edge-tts\` CLI provided by the repo wrapper at \`${path.join(PROJECT_ROOT, 'bin', 'edge-tts')}\`, which runs from a persistent uv venv at \`${path.join(PROJECT_ROOT, '.venv-edge-tts')}\`. ` +
`Do NOT suggest installing \`edge-tts\` via pip/pkg unless explicitly asked to change the installation method.`;
const lowBudgetInfo = input.lowBudget
? 'Rule: Budget is low for this chat. Keep responses concise (<= 200 words), avoid long lists, and ask for clarification rather than speculating.'

View file

@ -287,7 +287,7 @@ async function requireAdmin(ctxArg: any): Promise<boolean> {
const id = ctxArg.from?.id;
await replyAuthFailure(
ctxArg,
`Admin IDs not configured. Run /whoami and set TELEGRAM_ADMIN_IDS=${id ?? '<your-id>'} in .env, then restart mevy.`,
`Admin IDs not configured. Run /whoami and set TELEGRAM_ADMIN_IDS=${id ?? '<your-id>'} in .env, then restart ${PLATFORM_SERVICE_NAME}.`,
);
return false;
}

View file

@ -1,6 +1,7 @@
import { logger } from './logger.js';
import OpenAI from 'openai';
import fs from 'fs';
import { TENANT_ID } from './config.js';
let openaiClient: OpenAI | null = null;
let transcriptionReady = false;
@ -122,7 +123,7 @@ export function initTranscription(
baseURL: 'https://openrouter.ai/api/v1',
defaultHeaders: {
'HTTP-Referer': 'https://codeberg.org/Clawdie/Clawdie-AI',
'X-Title': 'mevy-ai',
'X-Title': `${TENANT_ID}-ai`,
},
});
transcriptionReady = true;

View file

@ -3,6 +3,7 @@ import path from 'path';
import { readEnvFile } from './env.js';
import {
TENANT_ID,
TMP_DIR,
VISION_MAX_CHARS_PER_IMAGE,
VISION_MAX_IMAGES,
@ -89,7 +90,7 @@ async function describeImageOpenRouter(imagePath: string): Promise<string> {
Authorization: `Bearer ${key}`,
'Content-Type': 'application/json',
'HTTP-Referer': 'https://codeberg.org/Clawdie/Clawdie-AI',
'X-Title': 'mevy-ai',
'X-Title': `${TENANT_ID}-ai`,
},
body: JSON.stringify(body),
});