diff --git a/AgentCompany-New/src/main/database/migrations/044-mention-wake-state.ts b/AgentCompany-New/src/main/database/migrations/044-mention-wake-state.ts new file mode 100644 index 00000000..dd21712d --- /dev/null +++ b/AgentCompany-New/src/main/database/migrations/044-mention-wake-state.ts @@ -0,0 +1,3 @@ +export const mentionWakeStateSchema = ` + alter table chat_mentions add column wake_state text not null default 'none'; +`; diff --git a/AgentCompany-New/src/main/database/schema.ts b/AgentCompany-New/src/main/database/schema.ts index 456720b5..f3dce9ad 100644 --- a/AgentCompany-New/src/main/database/schema.ts +++ b/AgentCompany-New/src/main/database/schema.ts @@ -42,6 +42,7 @@ import { documentsKnowledgeAutomationSchema } from "./migrations/040-documents-k import { taskSubtasksDeleteSchema } from "./migrations/041-task-subtasks-delete"; import { approvalNotesMeetingsSprintsSchema } from "./migrations/042-approval-notes-meetings-sprints"; import { composioIntegrationSchema } from "./migrations/043-composio-integration"; +import { mentionWakeStateSchema } from "./migrations/044-mention-wake-state"; interface Migration { version: number; @@ -93,6 +94,7 @@ const MIGRATIONS: Migration[] = [ { version: 41, name: "task_subtasks_delete", sql: taskSubtasksDeleteSchema }, { version: 42, name: "approval_notes_meetings_sprints", sql: approvalNotesMeetingsSprintsSchema }, { version: 43, name: "composio_integration", sql: composioIntegrationSchema }, + { version: 44, name: "mention_wake_state", sql: mentionWakeStateSchema }, ]; const SCHEMA_VERSION = MIGRATIONS[MIGRATIONS.length - 1].version; diff --git a/AgentCompany-New/src/main/services/chat-service.ts b/AgentCompany-New/src/main/services/chat-service.ts index fe782598..a410795a 100644 --- a/AgentCompany-New/src/main/services/chat-service.ts +++ b/AgentCompany-New/src/main/services/chat-service.ts @@ -209,14 +209,17 @@ export class ChatService { (m) => m.target.type === "agent" && !(input.senderType === "agent" && input.senderId === m.target.id), ); if (agentMentions.length === 0) return; - // An agent's own message must not keep waking teammates once the thread has - // run its autonomous budget; only a human re-entering the thread can. if (input.senderType === "agent" && this.autonomousThreadTurnsExhausted(input.orgId, threadId)) return; for (const mention of agentMentions) { try { this.agentWake.wakeFromMention(input, mention.target.id, messageId, threadId, now); - } catch { - // Mentions remain delivery metadata even when the target has no runtime. + this.db.prepare( + "update chat_mentions set wake_state = 'woken' where message_id = ? and target_type = 'agent' and target_id = ?", + ).run(messageId, mention.target.id); + } catch (error) { + this.db.prepare( + "update chat_mentions set wake_state = 'failed' where message_id = ? and target_type = 'agent' and target_id = ?", + ).run(messageId, mention.target.id); } } } diff --git a/AgentCompany-New/src/renderer/src/pages/chat/ChatMessageRow.tsx b/AgentCompany-New/src/renderer/src/pages/chat/ChatMessageRow.tsx index ffa751ce..b695376a 100644 --- a/AgentCompany-New/src/renderer/src/pages/chat/ChatMessageRow.tsx +++ b/AgentCompany-New/src/renderer/src/pages/chat/ChatMessageRow.tsx @@ -145,10 +145,19 @@ function renderBody(body: string, mentions: ChatMentionRecord[], context: Messag if (!token.startsWith("@")) throw new Error("Message mention token is invalid."); if (mention.offsetStart > lastIndex) parts.push(...formatInline(body.slice(lastIndex, mention.offsetStart), `s${lastIndex}`)); const label = mentionLabel(mention, context); + const failed = mention.wakeState === "failed"; parts.push( @{label} , diff --git a/AgentCompany-New/src/shared/chat-domain.ts b/AgentCompany-New/src/shared/chat-domain.ts index 4bdcefff..f0847011 100644 --- a/AgentCompany-New/src/shared/chat-domain.ts +++ b/AgentCompany-New/src/shared/chat-domain.ts @@ -62,6 +62,7 @@ export interface ChatMentionRecord { targetId: string; offsetStart: number; offsetEnd: number; + wakeState: "none" | "woken" | "failed"; } export interface ChatSlashInvocationRecord {