diff --git a/Termind/Features/AI/ConversationModel.swift b/Termind/Features/AI/ConversationModel.swift index d7a4f528..5d7e53bb 100644 --- a/Termind/Features/AI/ConversationModel.swift +++ b/Termind/Features/AI/ConversationModel.swift @@ -2478,7 +2478,16 @@ extension ConversationModel { state: .completed ) } - let conversation = ConversationModel(messages: [user, answer]) + let conversation = ConversationModel( + messages: [user, answer], + runs: [ + AgentRunSummary( + id: runID, state: .completed, + startedAt: now.addingTimeInterval(-15), + finishedAt: now.addingTimeInterval(-3) + ) + ] + ) conversation.customTitle = text("Diagnose 502 responses", "诊断 502 响应") conversation.messages = [ user, answer, diff --git a/Termind/Features/Workspaces/WorkspaceContentView.swift b/Termind/Features/Workspaces/WorkspaceContentView.swift index c5401a62..8d8d91a4 100644 --- a/Termind/Features/Workspaces/WorkspaceContentView.swift +++ b/Termind/Features/Workspaces/WorkspaceContentView.swift @@ -397,6 +397,14 @@ private struct PaneView: View { @FocusState private var titleFieldFocused: Bool private var isFocused: Bool { workspace.focusedPaneID == pane.id } + private var showsHoverControls: Bool { + #if DEBUG + if ScreenshotDemoConfiguration.active?.scene == .workspace, isFocused { + return true + } + #endif + return isHovering + } /// A pane accepts a drop when it is something a Workspace may hold, or an /// unfilled slot waiting to be filled. A chat, a form, or a manager page @@ -658,7 +666,7 @@ private struct PaneView: View { // The close button appears only under the pointer, the same rule the // workspace bar follows: identity is what you want while scanning, the // close button only once you are aiming at something. - if isHovering { + if showsHoverControls { Button { window.closePane(pane.id) } label: { @@ -694,7 +702,7 @@ private struct PaneView: View { private var broadcastToggle: some View { if pane.kind == .sshSession, workspace.canBroadcast { let isOn = workspace.broadcastsInput - if isHovering { + if showsHoverControls { Button { withAnimation(Motion.workspaceSwitch) { window.toggleBroadcastInput(in: workspace) diff --git a/Termind/Resources/Localizable.xcstrings b/Termind/Resources/Localizable.xcstrings index b0466f97..dda035d1 100644 --- a/Termind/Resources/Localizable.xcstrings +++ b/Termind/Resources/Localizable.xcstrings @@ -8181,6 +8181,7 @@ } }, "Permission denied" : { + "extractionState" : "stale", "localizations" : { "zh-Hans" : { "stringUnit" : { @@ -10846,7 +10847,7 @@ "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "SSH、SFTP,助手随时相伴。" + "value" : "SSH、SFTP,助手随行。" } } } @@ -14270,7 +14271,7 @@ "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "工作了%@" + "value" : "已工作%@" } } } @@ -14501,11 +14502,11 @@ "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "你的终端,也有判断力。" + "value" : "你的终端,自有判断。" } } } } }, "version" : "1.2" -} +} \ No newline at end of file