mirror of
https://github.com/openclaw/openclaw.git
synced 2026-07-13 17:26:06 +00:00
* feat(chat-ui): native macOS chat window shell with sessions sidebar, context usage, and slash commands * feat(macos): host redesigned chat window shell and complete gateway chat transport * fix(chat-ui): gate slash panel on catalog support and register window shell shortcuts outside menus * fix(chat-ui): make sidebar selection tags optional and sync programmatic composer text into the focused NSTextView * fix(macos): track in-window session switches for chat window reuse * fix(chat-ui): re-bootstrap in place when deleting the active main session * docs(macos): describe the redesigned native chat window * fix(macos): scope bare global session RPCs to the routing default agent * style(chat-ui): restore blank line between rebased helpers * fix(macos): scope selected global session actions * fix(macos): refresh chat routing identity * fix(chat-ui): hide delete for main sessions * fix(macos): remove duplicate session patch path * fix(chat-ui): resolve sidebar session aliases * fix(chat-ui): isolate sidebar alias resolution * fix(chat-ui): reconcile active session aliases * fix(chat-ui): prefer selected session aliases * chore(i18n): refresh chat window inventory * fix(chat-ui): return sidebar filter result * refactor(chat-ui): split session actions
36 lines
1.6 KiB
Swift
36 lines
1.6 KiB
Swift
#if os(macOS)
|
|
import AppKit
|
|
import Testing
|
|
@testable import OpenClawChatUI
|
|
|
|
@Suite
|
|
@MainActor
|
|
struct ChatComposerTextViewTests {
|
|
@Test func configuredComposerTextViewEnablesUndo() {
|
|
let textView = ChatComposerTextViewFactory.makeConfiguredTextView()
|
|
|
|
#expect(textView.allowsUndo)
|
|
}
|
|
}
|
|
|
|
@Suite
|
|
struct ChatComposerKeyRoutingTests {
|
|
@Test func mapsInterceptableNavigationKeys() {
|
|
#expect(ChatComposerKeyRouting.command(keyCode: 126, modifierFlags: [], hasMarkedText: false) == .moveUp)
|
|
#expect(ChatComposerKeyRouting.command(keyCode: 125, modifierFlags: [], hasMarkedText: false) == .moveDown)
|
|
#expect(ChatComposerKeyRouting.command(keyCode: 48, modifierFlags: [], hasMarkedText: false) == .tab)
|
|
#expect(ChatComposerKeyRouting.command(keyCode: 53, modifierFlags: [], hasMarkedText: false) == .escape)
|
|
#expect(ChatComposerKeyRouting.command(keyCode: 36, modifierFlags: [], hasMarkedText: false) == .returnKey)
|
|
}
|
|
|
|
@Test func ignoresModifiedKeysAndIMEComposition() {
|
|
// Shift-Return must stay a newline and Cmd-arrows must stay text
|
|
// navigation; IME composition owns Return while marked text exists.
|
|
#expect(ChatComposerKeyRouting.command(keyCode: 36, modifierFlags: [.shift], hasMarkedText: false) == nil)
|
|
#expect(ChatComposerKeyRouting.command(keyCode: 126, modifierFlags: [.command], hasMarkedText: false) == nil)
|
|
#expect(ChatComposerKeyRouting.command(keyCode: 36, modifierFlags: [], hasMarkedText: true) == nil)
|
|
#expect(ChatComposerKeyRouting.command(keyCode: 0, modifierFlags: [], hasMarkedText: false) == nil)
|
|
}
|
|
}
|
|
#endif
|