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:
@@ -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()] }],
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user