feat: unify 3 bot services into single process
- Add UNIFIED_MODE flag (default on, disable with UNIFIED_MODE=0) - Register all 3 Discord bots in one process (claude, codex, review) - Load all registered groups regardless of agent_type (codex/owner priority) - Start credential proxy and container cleanup at unified startup - shouldServiceProcessChat returns true in unified mode - Add findChannelByName for role-based response routing - Backward compatible: UNIFIED_MODE=0 restores per-service behavior
This commit is contained in:
48
src/db.ts
48
src/db.ts
@@ -1752,7 +1752,7 @@ export function getAllRegisteredGroups(
|
||||
);
|
||||
continue;
|
||||
}
|
||||
result[row.jid] = {
|
||||
const group: RegisteredGroup = {
|
||||
name: row.name,
|
||||
folder: row.folder,
|
||||
trigger: row.trigger_pattern,
|
||||
@@ -1764,6 +1764,17 @@ export function getAllRegisteredGroups(
|
||||
agentType: (row.agent_type as RegisteredGroup['agentType']) || undefined,
|
||||
workDir: row.work_dir || undefined,
|
||||
};
|
||||
// In unified mode (no agentTypeFilter), when the same JID has both
|
||||
// claude-code and codex rows, prefer the codex entry (owner).
|
||||
const existing = result[row.jid];
|
||||
if (existing && !agentTypeFilter) {
|
||||
if (group.agentType === 'codex') {
|
||||
result[row.jid] = group;
|
||||
}
|
||||
// else keep existing (already codex or first-seen)
|
||||
} else {
|
||||
result[row.jid] = group;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -1836,11 +1847,6 @@ export function createPairedTask(task: PairedTask): void {
|
||||
source_ref,
|
||||
plan_notes,
|
||||
review_requested_at,
|
||||
last_finalized_checkpoint,
|
||||
gate_turn_kind,
|
||||
reviewer_verdict,
|
||||
reviewer_verdict_at,
|
||||
reviewer_verdict_note,
|
||||
status,
|
||||
created_at,
|
||||
updated_at
|
||||
@@ -1857,11 +1863,6 @@ export function createPairedTask(task: PairedTask): void {
|
||||
task.source_ref,
|
||||
task.plan_notes,
|
||||
task.review_requested_at,
|
||||
task.last_finalized_checkpoint ?? null,
|
||||
task.gate_turn_kind ?? null,
|
||||
task.reviewer_verdict ?? null,
|
||||
task.reviewer_verdict_at ?? null,
|
||||
task.reviewer_verdict_note ?? null,
|
||||
task.status,
|
||||
task.created_at,
|
||||
task.updated_at,
|
||||
@@ -1916,11 +1917,6 @@ export function updatePairedTask(
|
||||
| 'source_ref'
|
||||
| 'plan_notes'
|
||||
| 'review_requested_at'
|
||||
| 'last_finalized_checkpoint'
|
||||
| 'gate_turn_kind'
|
||||
| 'reviewer_verdict'
|
||||
| 'reviewer_verdict_at'
|
||||
| 'reviewer_verdict_note'
|
||||
| 'status'
|
||||
| 'updated_at'
|
||||
>
|
||||
@@ -1945,26 +1941,6 @@ export function updatePairedTask(
|
||||
fields.push('review_requested_at = ?');
|
||||
values.push(updates.review_requested_at);
|
||||
}
|
||||
if (updates.last_finalized_checkpoint !== undefined) {
|
||||
fields.push('last_finalized_checkpoint = ?');
|
||||
values.push(updates.last_finalized_checkpoint);
|
||||
}
|
||||
if (updates.gate_turn_kind !== undefined) {
|
||||
fields.push('gate_turn_kind = ?');
|
||||
values.push(updates.gate_turn_kind);
|
||||
}
|
||||
if (updates.reviewer_verdict !== undefined) {
|
||||
fields.push('reviewer_verdict = ?');
|
||||
values.push(updates.reviewer_verdict);
|
||||
}
|
||||
if (updates.reviewer_verdict_at !== undefined) {
|
||||
fields.push('reviewer_verdict_at = ?');
|
||||
values.push(updates.reviewer_verdict_at);
|
||||
}
|
||||
if (updates.reviewer_verdict_note !== undefined) {
|
||||
fields.push('reviewer_verdict_note = ?');
|
||||
values.push(updates.reviewer_verdict_note);
|
||||
}
|
||||
if (updates.status !== undefined) {
|
||||
fields.push('status = ?');
|
||||
values.push(updates.status);
|
||||
|
||||
Reference in New Issue
Block a user