diff --git a/src/features/chat/host/bundles/composer-bundle.ts b/src/features/chat/host/bundles/composer-bundle.ts index fe12e1cb..fc873dcc 100644 --- a/src/features/chat/host/bundles/composer-bundle.ts +++ b/src/features/chat/host/bundles/composer-bundle.ts @@ -5,8 +5,8 @@ import { runtimeSnapshotForChatState } from "../../application/runtime/snapshot" import type { ChatStateStore } from "../../application/state/store"; import { resolveRuntimeControls } from "../../domain/runtime/resolution"; import { ChatComposerController } from "../../panel/composer-controller"; +import type { ChatMessageScrollController } from "../../panel/message-stream-scroll-controller"; import { type ChatPanelComposerSurface, chatPanelComposerProjection } from "../../panel/surface/composer-projection"; -import type { ChatMessageScrollController } from "../../panel/surface/message-stream-scroll"; import type { ChatPanelEnvironment } from "../contracts"; import { createVaultComposerAttachmentHandler } from "../obsidian/composer-attachments.obsidian"; import { VaultComposerContextReferenceProvider } from "../obsidian/vault-composer-context-reference-provider.obsidian"; diff --git a/src/features/chat/host/bundles/shell-bundle.ts b/src/features/chat/host/bundles/shell-bundle.ts index 50da27d5..801543a6 100644 --- a/src/features/chat/host/bundles/shell-bundle.ts +++ b/src/features/chat/host/bundles/shell-bundle.ts @@ -3,10 +3,10 @@ import type { PendingRequestActions } from "../../application/pending-requests/p import type { ChatStateStore } from "../../application/state/store"; import type { HistoryController } from "../../application/threads/history-controller"; import type { ThreadRenameEditorActions } from "../../application/threads/rename-editor-actions"; +import type { ChatMessageScrollController } from "../../panel/message-stream-scroll-controller"; import type { ChatPanelShellParts } from "../../panel/shell.dom"; import type { ChatPanelGoalSurface } from "../../panel/surface/goal-projection"; import { MessageStreamPresenter } from "../../panel/surface/message-stream-presenter"; -import type { ChatMessageScrollController } from "../../panel/surface/message-stream-scroll"; import type { ChatPanelToolbarSurface } from "../../panel/surface/toolbar-projection"; import { createToolbarUiActions, type ToolbarPanelActions } from "../../panel/toolbar-actions"; import { toolbarOutsidePointerHit } from "../../panel/toolbar-hit-test.dom"; diff --git a/src/features/chat/host/session-graph.ts b/src/features/chat/host/session-graph.ts index c876c405..74519361 100644 --- a/src/features/chat/host/session-graph.ts +++ b/src/features/chat/host/session-graph.ts @@ -12,7 +12,7 @@ import type { ChatResumeWorkTracker } from "../application/threads/resume-work"; import { createStructuredSystemItem, createSystemItem } from "../domain/message-stream/factories/system-items"; import type { MessageStreamNoticeSection } from "../domain/message-stream/items"; import type { ChatComposerController } from "../panel/composer-controller"; -import type { ChatMessageScrollController } from "../panel/surface/message-stream-scroll"; +import type { ChatMessageScrollController } from "../panel/message-stream-scroll-controller"; import { createComposerBundle } from "./bundles/composer-bundle"; import { type ChatPanelConnectionBundle, createConnectionBundle } from "./bundles/connection-bundle"; import { createReconnectAction } from "./bundles/reconnect-bundle"; diff --git a/src/features/chat/host/session.ts b/src/features/chat/host/session.ts index dd78f2f4..1dc384dc 100644 --- a/src/features/chat/host/session.ts +++ b/src/features/chat/host/session.ts @@ -7,8 +7,8 @@ import type { ChatState } from "../application/state/root-reducer"; import { type ChatStateStore, createChatStateStore } from "../application/state/store"; import { parseRestoredThreadState, type RestoredThreadPlaceholderState } from "../application/threads/restored-thread-lifecycle"; import { ChatResumeWorkTracker } from "../application/threads/resume-work"; +import { type ChatMessageScrollController, createChatMessageScrollController } from "../panel/message-stream-scroll-controller"; import { renderChatPanelShell, unmountChatPanelShell } from "../panel/shell.dom"; -import { type ChatMessageScrollController, createChatMessageScrollController } from "../panel/surface/message-stream-scroll"; import type { ChatPanelEnvironment, ChatPanelHandle, ChatWorkspacePanelSnapshot, ChatWorkspacePanelTurnLifecycle } from "./contracts"; import { type ChatViewDeferredTasks, createChatViewDeferredTasks } from "./session/deferred-work"; import { type ChatPanelSessionGraph, createChatPanelSessionGraph } from "./session-graph"; diff --git a/src/features/chat/panel/surface/message-stream-scroll.ts b/src/features/chat/panel/message-stream-scroll-controller.ts similarity index 86% rename from src/features/chat/panel/surface/message-stream-scroll.ts rename to src/features/chat/panel/message-stream-scroll-controller.ts index e399627e..8880f99f 100644 --- a/src/features/chat/panel/surface/message-stream-scroll.ts +++ b/src/features/chat/panel/message-stream-scroll-controller.ts @@ -1,9 +1,9 @@ -import type { ComposerBoundaryScrollAction } from "../../application/composer/boundary-scroll"; +import type { ComposerBoundaryScrollAction } from "../application/composer/boundary-scroll"; import type { MessageStreamScrollCommand, MessageStreamScrollControllerBinding, MessageStreamScrollPort, -} from "../../ui/message-stream/flow-scroll.measure"; +} from "../ui/message-stream/flow-scroll.measure"; export interface ChatMessageScrollController extends MessageStreamScrollControllerBinding { showLatest(): void; diff --git a/src/features/chat/ui/message-stream/content-events.ts b/src/features/chat/ui/message-stream/content-rendered-event.dom.ts similarity index 100% rename from src/features/chat/ui/message-stream/content-events.ts rename to src/features/chat/ui/message-stream/content-rendered-event.dom.ts diff --git a/src/features/chat/ui/message-stream/flow-scroll.measure.ts b/src/features/chat/ui/message-stream/flow-scroll.measure.ts index ff546eaa..2d4af5f6 100644 --- a/src/features/chat/ui/message-stream/flow-scroll.measure.ts +++ b/src/features/chat/ui/message-stream/flow-scroll.measure.ts @@ -1,7 +1,7 @@ import { Component, h, type ComponentChild as UiNode } from "preact"; import { disposeDomListeners, listenDomEvent } from "../../../../shared/ui/dom-events.dom"; -import { MESSAGE_CONTENT_RENDERED_EVENT } from "./content-events"; +import { MESSAGE_CONTENT_RENDERED_EVENT } from "./content-rendered-event.dom"; type MessageScrollDirection = -1 | 1; diff --git a/src/features/chat/ui/message-stream/markdown-renderer.obsidian.ts b/src/features/chat/ui/message-stream/markdown-renderer.obsidian.ts index 77044ebb..312d8bb3 100644 --- a/src/features/chat/ui/message-stream/markdown-renderer.obsidian.ts +++ b/src/features/chat/ui/message-stream/markdown-renderer.obsidian.ts @@ -2,7 +2,7 @@ import { micromark } from "micromark"; import { type App, type Component, MarkdownRenderer, Notice } from "obsidian"; import { isAbsoluteFileHref, vaultFileLinkTarget, vaultRelativeFileLinkTarget } from "../../../../shared/obsidian/file-links"; -import { notifyMessageContentRendered } from "./content-events"; +import { notifyMessageContentRendered } from "./content-rendered-event.dom"; interface MarkdownMessageRendererOptions { app: App; diff --git a/src/features/chat/ui/message-stream/message-stream.dom.ts b/src/features/chat/ui/message-stream/pending-request-block.dom.ts similarity index 85% rename from src/features/chat/ui/message-stream/message-stream.dom.ts rename to src/features/chat/ui/message-stream/pending-request-block.dom.ts index 343b7f6b..5d5c846d 100644 --- a/src/features/chat/ui/message-stream/message-stream.dom.ts +++ b/src/features/chat/ui/message-stream/pending-request-block.dom.ts @@ -1,14 +1,8 @@ -import { listenOutsideDomEvent } from "../../../../shared/ui/dom-events.dom"; - export interface McpElicitationValidityMessage { fieldId: string; message: string; } -export function closeMessageRoleMenuOnOutsidePointer(root: HTMLElement, onClose: () => void): () => void { - return listenOutsideDomEvent(root, "pointerdown", onClose, true); -} - export function focusPendingRequestControl(container: HTMLElement | null): void { if (!container) return; for (const selector of [ diff --git a/src/features/chat/ui/message-stream/pending-request-block.tsx b/src/features/chat/ui/message-stream/pending-request-block.tsx index 5f50e5d7..da407ece 100644 --- a/src/features/chat/ui/message-stream/pending-request-block.tsx +++ b/src/features/chat/ui/message-stream/pending-request-block.tsx @@ -11,7 +11,11 @@ import type { PendingUserInputViewModel, } from "../../presentation/pending-requests/view-model"; import type { PendingRequestBlockActions } from "./context"; -import { applyMcpElicitationFormValidity, focusPendingRequestControl, type McpElicitationValidityMessage } from "./message-stream.dom"; +import { + applyMcpElicitationFormValidity, + focusPendingRequestControl, + type McpElicitationValidityMessage, +} from "./pending-request-block.dom"; import { createStatusMessageClassName } from "./status"; export function pendingRequestBlockNode( diff --git a/src/features/chat/ui/message-stream/text-content.dom.tsx b/src/features/chat/ui/message-stream/text-content.dom.tsx index cd30dae5..945c0c7d 100644 --- a/src/features/chat/ui/message-stream/text-content.dom.tsx +++ b/src/features/chat/ui/message-stream/text-content.dom.tsx @@ -3,7 +3,7 @@ import { useEffect, useLayoutEffect, useRef, useState } from "preact/hooks"; import { listenDomEvent, listenOutsideDomEvent } from "../../../../shared/ui/dom-events.dom"; import type { MessageStreamTextView } from "../../presentation/message-stream/text-view"; -import { MESSAGE_CONTENT_RENDERED_EVENT } from "./content-events"; +import { MESSAGE_CONTENT_RENDERED_EVENT } from "./content-rendered-event.dom"; import type { TextItemContentContext } from "./context"; const USER_MESSAGE_COLLAPSE_HEIGHT_PX = 360; diff --git a/src/features/chat/ui/message-stream/text.dom.ts b/src/features/chat/ui/message-stream/text.dom.ts new file mode 100644 index 00000000..46fd93bc --- /dev/null +++ b/src/features/chat/ui/message-stream/text.dom.ts @@ -0,0 +1,5 @@ +import { listenOutsideDomEvent } from "../../../../shared/ui/dom-events.dom"; + +export function closeMessageRoleMenuOnOutsidePointer(root: HTMLElement, onClose: () => void): () => void { + return listenOutsideDomEvent(root, "pointerdown", onClose, true); +} diff --git a/src/features/chat/ui/message-stream/text.tsx b/src/features/chat/ui/message-stream/text.tsx index aa963a43..6b120e2c 100644 --- a/src/features/chat/ui/message-stream/text.tsx +++ b/src/features/chat/ui/message-stream/text.tsx @@ -9,7 +9,7 @@ import type { TextItemDetailSectionView, } from "../../presentation/message-stream/text-view"; import type { TextItemActionContext, TextItemContext, TextItemDetailStateContext, TextItemMetadataContext } from "./context"; -import { closeMessageRoleMenuOnOutsidePointer } from "./message-stream.dom"; +import { closeMessageRoleMenuOnOutsidePointer } from "./text.dom"; import { CollapsibleTextContent, TextContent } from "./text-content.dom"; export function textNode(view: MessageStreamTextView, context: TextItemContext): UiNode { diff --git a/tests/features/chat/host/session-graph.test.ts b/tests/features/chat/host/session-graph.test.ts index f01d4ca0..8c770360 100644 --- a/tests/features/chat/host/session-graph.test.ts +++ b/tests/features/chat/host/session-graph.test.ts @@ -12,8 +12,8 @@ import type { ChatPanelEnvironment } from "../../../../src/features/chat/host/co import { createChatViewDeferredTasks } from "../../../../src/features/chat/host/session/deferred-work"; import { createChatPanelSessionGraph } from "../../../../src/features/chat/host/session-graph"; import { ChatComposerController } from "../../../../src/features/chat/panel/composer-controller"; +import { createChatMessageScrollController } from "../../../../src/features/chat/panel/message-stream-scroll-controller"; import { MessageStreamPresenter } from "../../../../src/features/chat/panel/surface/message-stream-presenter"; -import { createChatMessageScrollController } from "../../../../src/features/chat/panel/surface/message-stream-scroll"; import { type CodexPanelSettings, DEFAULT_SETTINGS } from "../../../../src/settings/model"; import { ConnectionWorkTracker } from "../../../../src/shared/lifecycle/connection-work"; import { installObsidianDomShims } from "../../../support/dom"; diff --git a/tests/features/chat/panel/surface/message-stream-presenter.test.ts b/tests/features/chat/panel/surface/message-stream-presenter.test.ts index 663a88d3..23f773ba 100644 --- a/tests/features/chat/panel/surface/message-stream-presenter.test.ts +++ b/tests/features/chat/panel/surface/message-stream-presenter.test.ts @@ -6,15 +6,15 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; import { type ChatAction, type ChatState, chatReducer } from "../../../../../src/features/chat/application/state/root-reducer"; import { type ChatStateStore, createChatStateStore } from "../../../../../src/features/chat/application/state/store"; +import { + type ChatMessageScrollController, + createChatMessageScrollController, +} from "../../../../../src/features/chat/panel/message-stream-scroll-controller"; import { MessageStreamPresenter } from "../../../../../src/features/chat/panel/surface/message-stream-presenter"; import { type ChatMessageStreamSurfaceContext, messageStreamSurfaceProjectionFromModel, } from "../../../../../src/features/chat/panel/surface/message-stream-projection"; -import { - type ChatMessageScrollController, - createChatMessageScrollController, -} from "../../../../../src/features/chat/panel/surface/message-stream-scroll"; import { MarkdownMessageRenderer } from "../../../../../src/features/chat/ui/message-stream/markdown-renderer.obsidian"; import { MessageStreamViewport } from "../../../../../src/features/chat/ui/message-stream/stream-blocks"; import { renderUiRoot, unmountUiRoot } from "../../../../../src/shared/ui/ui-root.dom"; diff --git a/tests/features/chat/ui/message-stream/blocks-and-messages.test.tsx b/tests/features/chat/ui/message-stream/blocks-and-messages.test.tsx index 48902710..4550668b 100644 --- a/tests/features/chat/ui/message-stream/blocks-and-messages.test.tsx +++ b/tests/features/chat/ui/message-stream/blocks-and-messages.test.tsx @@ -5,7 +5,7 @@ import { act } from "preact/test-utils"; import { describe, expect, it, vi } from "vitest"; import { implementPlanTargetFromState } from "../../../../../src/features/chat/application/conversation/plan-implementation"; import type { MessageStreamItem } from "../../../../../src/features/chat/domain/message-stream/items"; -import { MESSAGE_CONTENT_RENDERED_EVENT } from "../../../../../src/features/chat/ui/message-stream/content-events"; +import { MESSAGE_CONTENT_RENDERED_EVENT } from "../../../../../src/features/chat/ui/message-stream/content-rendered-event.dom"; import { MarkdownMessageRenderer } from "../../../../../src/features/chat/ui/message-stream/markdown-renderer.obsidian"; import { deferred } from "../../../../support/async"; import { attributeValues, textContents, topLevelDetailsSummaries } from "../../../../support/dom"; diff --git a/tests/features/chat/ui/message-stream/flow-scroll.test.ts b/tests/features/chat/ui/message-stream/flow-scroll.test.ts index fecbc5a4..7cb95437 100644 --- a/tests/features/chat/ui/message-stream/flow-scroll.test.ts +++ b/tests/features/chat/ui/message-stream/flow-scroll.test.ts @@ -3,7 +3,7 @@ import { h, type ComponentChild as UiNode } from "preact"; import { act } from "preact/test-utils"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; -import { MESSAGE_CONTENT_RENDERED_EVENT } from "../../../../../src/features/chat/ui/message-stream/content-events"; +import { MESSAGE_CONTENT_RENDERED_EVENT } from "../../../../../src/features/chat/ui/message-stream/content-rendered-event.dom"; import { MessageStreamFlowFrame, type MessageStreamScrollCommand,