From 557090a6a8462da5a5d700179ab1a32ab3329116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Mon, 20 Apr 2026 12:29:15 -0400 Subject: [PATCH] Move message-*.ts into messaging/ subdir (N10) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Consolidate the two runtime messaging modules under src/main/messaging/. Storage stays in database/messages.ts — that is the SQL layer and belongs with the other DB modules; messaging/ covers the dispatch/normalize runtime around it. - message-dispatch.ts -> messaging/dispatch.ts - message-normalize.ts -> messaging/normalize.ts - add messaging/index.ts barrel for future consumers (existing call sites import the concrete module path directly) - 10 call sites updated across src/main and tests --- src/main/agent-runtime/inbox-projection.ts | 2 +- src/main/api-server/routes-messages.ts | 2 +- src/main/automation/automation-actions.ts | 2 +- src/main/ipc-agent-coordination-handlers.ts | 2 +- .../{message-dispatch.ts => messaging/dispatch.ts} | 2 +- src/main/messaging/index.ts | 11 +++++++++++ .../{message-normalize.ts => messaging/normalize.ts} | 0 src/main/orchestration/heartbeat.ts | 2 +- src/main/orchestration/initial-user-turn.ts | 2 +- src/main/orchestration/scheduler-housekeeping.ts | 2 +- src/main/orchestration/turn-context.ts | 2 +- src/main/task-quality-gates.ts | 2 +- tests/integration/thread-wait-heartbeat.spec.ts | 2 +- tests/unit/message-dispatch.test.ts | 2 +- 14 files changed, 23 insertions(+), 12 deletions(-) rename src/main/{message-dispatch.ts => messaging/dispatch.ts} (99%) create mode 100644 src/main/messaging/index.ts rename src/main/{message-normalize.ts => messaging/normalize.ts} (100%) diff --git a/src/main/agent-runtime/inbox-projection.ts b/src/main/agent-runtime/inbox-projection.ts index 904dd79f..48fbd543 100644 --- a/src/main/agent-runtime/inbox-projection.ts +++ b/src/main/agent-runtime/inbox-projection.ts @@ -23,7 +23,7 @@ export interface AgentDirectory { /** * Strip control characters (except newlines/tabs) and collapse excessive - * whitespace runs. Mirrors `message-normalize.ts#cleanText` to keep the + * whitespace runs. Mirrors `messaging/normalize.ts#cleanText` to keep the * transcript resilient against garbage from upstream senders. */ function cleanText(text: string): string { diff --git a/src/main/api-server/routes-messages.ts b/src/main/api-server/routes-messages.ts index a3221eb4..55bd7774 100644 --- a/src/main/api-server/routes-messages.ts +++ b/src/main/api-server/routes-messages.ts @@ -1,6 +1,6 @@ import log from "electron-log/main.js"; import { agentMessageInputSchema } from "@shared/contracts"; -import { dispatchAgentMessage } from "../message-dispatch"; +import { dispatchAgentMessage } from "../messaging/dispatch"; import { requireParam, type AgentApiServer } from "./server-core"; export function registerMessageRoutes(server: AgentApiServer) { diff --git a/src/main/automation/automation-actions.ts b/src/main/automation/automation-actions.ts index 1cc28061..d8bacf23 100644 --- a/src/main/automation/automation-actions.ts +++ b/src/main/automation/automation-actions.ts @@ -1,6 +1,6 @@ import type { AppDatabase } from "../database"; import type { AutomationAction, DesktopEvent } from "@shared/types"; -import { dispatchAgentMessage } from "../message-dispatch"; +import { dispatchAgentMessage } from "../messaging/dispatch"; import { validateTaskCreation } from "../task-quality-gates"; import type { AutomationEventContext } from "./types"; import { parseActionConfig, type AutomationActionConfigMap } from "./automation-action-schemas"; diff --git a/src/main/ipc-agent-coordination-handlers.ts b/src/main/ipc-agent-coordination-handlers.ts index 4b156521..86b34b87 100644 --- a/src/main/ipc-agent-coordination-handlers.ts +++ b/src/main/ipc-agent-coordination-handlers.ts @@ -5,7 +5,7 @@ import { searchMessagesSchema, } from "@shared/contracts"; import { fail, ok, type RegisterDomainHandlersDependencies } from "./ipc-domain-common"; -import { dispatchAgentMessage } from "./message-dispatch"; +import { dispatchAgentMessage } from "./messaging/dispatch"; export function registerAgentCoordinationHandlers({ registerHandle, diff --git a/src/main/message-dispatch.ts b/src/main/messaging/dispatch.ts similarity index 99% rename from src/main/message-dispatch.ts rename to src/main/messaging/dispatch.ts index cd5803b6..7b585bde 100644 --- a/src/main/message-dispatch.ts +++ b/src/main/messaging/dispatch.ts @@ -1,4 +1,4 @@ -import type { AppDatabase } from "./database"; +import type { AppDatabase } from "../database"; import type { AgentMessageRecord, DesktopEvent, MessageChannel, MentionResult, SectionId } from "@shared/types"; /** diff --git a/src/main/messaging/index.ts b/src/main/messaging/index.ts new file mode 100644 index 00000000..9232dc99 --- /dev/null +++ b/src/main/messaging/index.ts @@ -0,0 +1,11 @@ +/** + * Barrel for the messaging layer. `dispatch` handles wire-in between + * the API server, thread runtime, and the DB; `normalize` sanitises + * comment bodies before they are projected into a prompt. Storage + * itself lives in `database/messages.ts` and stays there — the + * messaging/ directory covers runtime behaviour around that store, not + * the SQL. + */ + +export * from "./dispatch"; +export * from "./normalize"; diff --git a/src/main/message-normalize.ts b/src/main/messaging/normalize.ts similarity index 100% rename from src/main/message-normalize.ts rename to src/main/messaging/normalize.ts diff --git a/src/main/orchestration/heartbeat.ts b/src/main/orchestration/heartbeat.ts index 91b3f1bc..d5f146ba 100644 --- a/src/main/orchestration/heartbeat.ts +++ b/src/main/orchestration/heartbeat.ts @@ -4,7 +4,7 @@ import type { AgentRecord, ConnectorRecord } from "@shared/types"; import type { OrchestrationDependencies } from "./types"; import type { RunDispatchParams } from "./turn-context"; import { pickModelForAgent } from "../model-dispatch"; -import { HUMAN_SENDER_ID } from "../message-dispatch"; +import { HUMAN_SENDER_ID } from "../messaging/dispatch"; /** * Every reason a heartbeat attempt can be rejected before a run is diff --git a/src/main/orchestration/initial-user-turn.ts b/src/main/orchestration/initial-user-turn.ts index bffe9064..e9e07806 100644 --- a/src/main/orchestration/initial-user-turn.ts +++ b/src/main/orchestration/initial-user-turn.ts @@ -18,7 +18,7 @@ import type { AppDatabase } from "../database"; import type { AgentMessageRecord } from "@shared/types"; -import { HUMAN_SENDER_ID } from "../message-dispatch"; +import { HUMAN_SENDER_ID } from "../messaging/dispatch"; export interface InitialUserTurnDeps { db: AppDatabase; diff --git a/src/main/orchestration/scheduler-housekeeping.ts b/src/main/orchestration/scheduler-housekeeping.ts index d29284a9..8c65bbed 100644 --- a/src/main/orchestration/scheduler-housekeeping.ts +++ b/src/main/orchestration/scheduler-housekeeping.ts @@ -2,7 +2,7 @@ import type { OrchestrationDependencies } from "./types"; import { sweepStaleReviews } from "../task-quality-gates"; import type { SweepStaleReviewsDeps } from "../task-quality-gates"; import { resolveApprovalDecision } from "../approval-policy"; -import { dispatchAgentMessage } from "../message-dispatch"; +import { dispatchAgentMessage } from "../messaging/dispatch"; export function createHousekeepingScheduler( deps: OrchestrationDependencies, diff --git a/src/main/orchestration/turn-context.ts b/src/main/orchestration/turn-context.ts index 22fe7a1f..8a8f14e4 100644 --- a/src/main/orchestration/turn-context.ts +++ b/src/main/orchestration/turn-context.ts @@ -11,7 +11,7 @@ import type { AppDatabase } from "../database"; import type { ProjectedSkill } from "../skill-types"; import type { ConnectorId, ExecutionMode } from "@shared/types"; import type { WorkspaceLockMode, EnqueueRunPayload } from "./types"; -import { normalizeCommentsForPrompt } from "../message-normalize"; +import { normalizeCommentsForPrompt } from "../messaging/normalize"; import { getConnectorModelPolicy, validateConnectorModelSelection } from "../connector-model-policy"; import { resolveInitialUserTurn } from "./initial-user-turn"; diff --git a/src/main/task-quality-gates.ts b/src/main/task-quality-gates.ts index 73ce1234..3e671258 100644 --- a/src/main/task-quality-gates.ts +++ b/src/main/task-quality-gates.ts @@ -9,7 +9,7 @@ import log from "electron-log/main.js"; import type { DesktopEvent } from "@shared/types"; import type { AppDatabase } from "@main/database"; import type { NotificationOptions } from "@main/notification-service"; -import type { dispatchAgentMessage } from "@main/message-dispatch"; +import type { dispatchAgentMessage } from "@main/messaging/dispatch"; import type { resolveApprovalDecision } from "@main/approval-policy"; import { validateTaskRubric } from "@main/task-rubrics"; diff --git a/tests/integration/thread-wait-heartbeat.spec.ts b/tests/integration/thread-wait-heartbeat.spec.ts index 4bb44213..bbf497a9 100644 --- a/tests/integration/thread-wait-heartbeat.spec.ts +++ b/tests/integration/thread-wait-heartbeat.spec.ts @@ -5,7 +5,7 @@ import { afterEach, describe, expect, it } from "vitest"; import { AppDatabase } from "../../src/main/database"; import { createThreadIntegration } from "../../src/main/thread-integration"; import { createCheckpointEngine } from "../../src/main/checkpoint-engine"; -import { dispatchAgentMessage, HUMAN_SENDER_ID } from "../../src/main/message-dispatch"; +import { dispatchAgentMessage, HUMAN_SENDER_ID } from "../../src/main/messaging/dispatch"; const tempDirs: string[] = []; diff --git a/tests/unit/message-dispatch.test.ts b/tests/unit/message-dispatch.test.ts index 61b80775..233a6b28 100644 --- a/tests/unit/message-dispatch.test.ts +++ b/tests/unit/message-dispatch.test.ts @@ -4,7 +4,7 @@ import { tmpdir } from "node:os"; import { afterEach, describe, expect, it, vi } from "vitest"; import { AppDatabase } from "../../src/main/database"; import { createThreadIntegration } from "../../src/main/thread-integration"; -import { dispatchAgentMessage, HUMAN_SENDER_ID } from "../../src/main/message-dispatch"; +import { dispatchAgentMessage, HUMAN_SENDER_ID } from "../../src/main/messaging/dispatch"; const tempDirs: string[] = [];