fix: pass assistantName to container agent instead of hardcoding 'Andy'

The container agent-runner had 'Andy' hardcoded as the sender name in
archived conversation transcripts. This ignored the configurable
ASSISTANT_NAME setting, so users who changed their assistant's name
(via .env or config) would still see 'Andy' in transcripts.

- Add assistantName field to ContainerInput interface (both host and
  container copies)
- Pass ASSISTANT_NAME from config through to container in index.ts
  and task-scheduler.ts
- Thread assistantName through createPreCompactHook and
  formatTranscriptMarkdown in the agent-runner
- Use 'AssistantNameMissing' as fallback instead of 'Andy' so a
  missing name is visible rather than silently wrong

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dan Shapiro
2026-02-22 12:22:07 -08:00
parent 1980d97d90
commit 107aff850c
4 changed files with 10 additions and 5 deletions

View File

@@ -26,6 +26,7 @@ interface ContainerInput {
chatJid: string; chatJid: string;
isMain: boolean; isMain: boolean;
isScheduledTask?: boolean; isScheduledTask?: boolean;
assistantName?: string;
secrets?: Record<string, string>; secrets?: Record<string, string>;
} }
@@ -142,7 +143,7 @@ function getSessionSummary(sessionId: string, transcriptPath: string): string |
/** /**
* Archive the full transcript to conversations/ before compaction. * Archive the full transcript to conversations/ before compaction.
*/ */
function createPreCompactHook(): HookCallback { function createPreCompactHook(assistantName?: string): HookCallback {
return async (input, _toolUseId, _context) => { return async (input, _toolUseId, _context) => {
const preCompact = input as PreCompactHookInput; const preCompact = input as PreCompactHookInput;
const transcriptPath = preCompact.transcript_path; const transcriptPath = preCompact.transcript_path;
@@ -172,7 +173,7 @@ function createPreCompactHook(): HookCallback {
const filename = `${date}-${name}.md`; const filename = `${date}-${name}.md`;
const filePath = path.join(conversationsDir, filename); const filePath = path.join(conversationsDir, filename);
const markdown = formatTranscriptMarkdown(messages, summary); const markdown = formatTranscriptMarkdown(messages, summary, assistantName);
fs.writeFileSync(filePath, markdown); fs.writeFileSync(filePath, markdown);
log(`Archived conversation to ${filePath}`); log(`Archived conversation to ${filePath}`);
@@ -252,7 +253,7 @@ function parseTranscript(content: string): ParsedMessage[] {
return messages; return messages;
} }
function formatTranscriptMarkdown(messages: ParsedMessage[], title?: string | null): string { function formatTranscriptMarkdown(messages: ParsedMessage[], title?: string | null, assistantName?: string): string {
const now = new Date(); const now = new Date();
const formatDateTime = (d: Date) => d.toLocaleString('en-US', { const formatDateTime = (d: Date) => d.toLocaleString('en-US', {
month: 'short', month: 'short',
@@ -271,7 +272,7 @@ function formatTranscriptMarkdown(messages: ParsedMessage[], title?: string | nu
lines.push(''); lines.push('');
for (const msg of messages) { for (const msg of messages) {
const sender = msg.role === 'user' ? 'User' : 'Andy'; const sender = msg.role === 'user' ? 'User' : (assistantName || 'AssistantNameMissing');
const content = msg.content.length > 2000 const content = msg.content.length > 2000
? msg.content.slice(0, 2000) + '...' ? msg.content.slice(0, 2000) + '...'
: msg.content; : msg.content;
@@ -449,7 +450,7 @@ async function runQuery(
}, },
}, },
hooks: { hooks: {
PreCompact: [{ hooks: [createPreCompactHook()] }], PreCompact: [{ hooks: [createPreCompactHook(containerInput.assistantName)] }],
PreToolUse: [{ matcher: 'Bash', hooks: [createSanitizeBashHook()] }], PreToolUse: [{ matcher: 'Bash', hooks: [createSanitizeBashHook()] }],
}, },
} }

View File

@@ -42,6 +42,7 @@ export interface ContainerInput {
chatJid: string; chatJid: string;
isMain: boolean; isMain: boolean;
isScheduledTask?: boolean; isScheduledTask?: boolean;
assistantName?: string;
secrets?: Record<string, string>; secrets?: Record<string, string>;
} }

View File

@@ -270,6 +270,7 @@ async function runAgent(
groupFolder: group.folder, groupFolder: group.folder,
chatJid, chatJid,
isMain, isMain,
assistantName: ASSISTANT_NAME,
}, },
(proc, containerName) => queue.registerProcess(chatJid, proc, containerName, group.folder), (proc, containerName) => queue.registerProcess(chatJid, proc, containerName, group.folder),
wrappedOnOutput, wrappedOnOutput,

View File

@@ -4,6 +4,7 @@ import fs from 'fs';
import path from 'path'; import path from 'path';
import { import {
ASSISTANT_NAME,
GROUPS_DIR, GROUPS_DIR,
IDLE_TIMEOUT, IDLE_TIMEOUT,
MAIN_GROUP_FOLDER, MAIN_GROUP_FOLDER,
@@ -113,6 +114,7 @@ async function runTask(
chatJid: task.chat_jid, chatJid: task.chat_jid,
isMain, isMain,
isScheduledTask: true, isScheduledTask: true,
assistantName: ASSISTANT_NAME,
}, },
(proc, containerName) => deps.onProcess(task.chat_jid, proc, containerName, task.group_folder), (proc, containerName) => deps.onProcess(task.chat_jid, proc, containerName, task.group_folder),
async (streamedOutput: ContainerOutput) => { async (streamedOutput: ContainerOutput) => {