feat: paired review system overhaul — unified service, configurable agents, silent output removal
- Remove UNIFIED_MODE legacy: single service manages all 3 Discord bots - Add OWNER_AGENT_TYPE / REVIEWER_AGENT_TYPE env vars for configurable agent selection - Fix Discord channel routing: reviewer output goes through correct bot (discord/discord-review) - Fix channel name assignment: explicit names prevent agentTypeFilter collision - Remove silent output suppression system: harness-level protections replace prompt workarounds - Add reviewer approval detection: DONE marker on first line stops ping-pong - Include user's original message in reviewer prompt for context - Fix round_trip_count auto-reset on new user message - Fix session ID conflict: reviewer doesn't reuse owner's session - Fix pending progress text flush in runner on close sentinel - Promote buffered intermediate text to final result when result event has no text - Remove legacy files: .env.codex.example, .env.codex-review.example, migrate-unify.cjs - Update CLAUDE.md: server-side build deployment, unified architecture docs
This commit is contained in:
@@ -184,11 +184,14 @@ export class DiscordChannel implements Channel {
|
||||
botToken: string,
|
||||
opts: DiscordChannelOpts,
|
||||
agentTypeFilter?: AgentType,
|
||||
channelName?: string,
|
||||
) {
|
||||
this.botToken = botToken;
|
||||
this.opts = opts;
|
||||
this.agentTypeFilter = agentTypeFilter;
|
||||
if (agentTypeFilter) {
|
||||
if (channelName) {
|
||||
this.name = channelName;
|
||||
} else if (agentTypeFilter) {
|
||||
this.name = `discord-${agentTypeFilter}`;
|
||||
}
|
||||
}
|
||||
@@ -723,21 +726,20 @@ registerChannel('discord', (opts: ChannelOpts) => {
|
||||
token,
|
||||
opts,
|
||||
hasCodexBot ? 'claude-code' : undefined,
|
||||
'discord',
|
||||
);
|
||||
});
|
||||
|
||||
// Register the secondary Codex bot channel.
|
||||
// In unified mode all bots register unconditionally; in legacy per-service mode
|
||||
// the codex service uses its own DISCORD_BOT_TOKEN via systemd EnvironmentFile override.
|
||||
registerChannel('discord-codex', (opts: ChannelOpts) => {
|
||||
const token = getEnv('DISCORD_CODEX_BOT_TOKEN') || '';
|
||||
if (!token) return null; // Codex Discord bot is optional
|
||||
return new DiscordChannel(token, opts, 'codex');
|
||||
if (!token) return null;
|
||||
return new DiscordChannel(token, opts, 'codex', 'discord-codex');
|
||||
});
|
||||
|
||||
// Register the review bot channel (codex agent type, separate token).
|
||||
registerChannel('discord-review', (opts: ChannelOpts) => {
|
||||
const token = getEnv('DISCORD_REVIEW_BOT_TOKEN') || '';
|
||||
if (!token) return null; // Review Discord bot is optional
|
||||
return new DiscordChannel(token, opts, 'codex');
|
||||
if (!token) return null;
|
||||
return new DiscordChannel(token, opts, 'codex', 'discord-review');
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user