@tutti-os/agent-gui 0.0.45 → 0.0.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/{AgentMentionSearchController-D5ks45fN.d.ts → AgentMentionSearchController-CExFPobz.d.ts} +1 -1
  2. package/dist/AgentMessageMarkdown-DeYPURtF.d.ts +7 -0
  3. package/dist/agent-conversation/index.d.ts +4 -3
  4. package/dist/agent-conversation/index.js +8 -8
  5. package/dist/agent-message-center/index.d.ts +1 -1
  6. package/dist/agent-message-center/index.js +9 -9
  7. package/dist/{agentConversationVM-1QgRwvwZ.d.ts → agentConversationVM-BTMtRteS.d.ts} +14 -0
  8. package/dist/{AgentMessageMarkdown-Cts0dAIm.d.ts → agentGuiNodeTypes-B5Y6yDKy.d.ts} +43 -9
  9. package/dist/app/renderer/agentactivity.css +148 -25
  10. package/dist/{chunk-ZG3WZSMV.js → chunk-2FOBSURO.js} +29 -10
  11. package/dist/chunk-2FOBSURO.js.map +1 -0
  12. package/dist/{chunk-AMNXH4DJ.js → chunk-2RYZ4EBF.js} +2 -2
  13. package/dist/{chunk-EIC7XS3C.js → chunk-5QTC2L52.js} +2 -2
  14. package/dist/{chunk-UGV6JTWM.js → chunk-7NCWSH7U.js} +9 -9
  15. package/dist/{chunk-UGV6JTWM.js.map → chunk-7NCWSH7U.js.map} +1 -1
  16. package/dist/{chunk-62QOR3TC.js → chunk-HCS3HUUX.js} +5 -5
  17. package/dist/{chunk-OL54R6OL.js → chunk-J3SJZMI5.js} +2 -2
  18. package/dist/{chunk-VFQR7AZI.js → chunk-KACBTC7Y.js} +25 -3
  19. package/dist/chunk-KACBTC7Y.js.map +1 -0
  20. package/dist/{chunk-FJG2EH4V.js → chunk-KUCWRSXU.js} +2 -2
  21. package/dist/{chunk-D6IYEVDT.js → chunk-MCH35MAX.js} +2 -2
  22. package/dist/{chunk-NZ2BGOJU.js → chunk-Q4X6Q4E6.js} +2 -2
  23. package/dist/{chunk-EU7RWKHE.js → chunk-R6GOICRO.js} +5 -5
  24. package/dist/chunk-SD56WDSC.js +359 -0
  25. package/dist/chunk-SD56WDSC.js.map +1 -0
  26. package/dist/{chunk-TXXWUG2J.js → chunk-VE6JY2TH.js} +2 -1
  27. package/dist/{chunk-TXXWUG2J.js.map → chunk-VE6JY2TH.js.map} +1 -1
  28. package/dist/{chunk-QT45WUPQ.js → chunk-XJXSR5XI.js} +244 -21
  29. package/dist/chunk-XJXSR5XI.js.map +1 -0
  30. package/dist/{chunk-CZ7PS3DU.js → chunk-ZAF4IVUT.js} +859 -104
  31. package/dist/chunk-ZAF4IVUT.js.map +1 -0
  32. package/dist/context-mention-palette/index.d.ts +3 -3
  33. package/dist/context-mention-palette/index.js +9 -9
  34. package/dist/i18n/index.d.ts +24 -2
  35. package/dist/i18n/index.js +2 -2
  36. package/dist/index.d.ts +22 -6
  37. package/dist/index.js +1011 -825
  38. package/dist/index.js.map +1 -1
  39. package/dist/plan-decision-ops.d.ts +1 -1
  40. package/dist/queued-prompt-runtime.d.ts +97 -0
  41. package/dist/queued-prompt-runtime.js +9 -0
  42. package/dist/queued-prompt-runtime.js.map +1 -0
  43. package/dist/workbench/contribution.js +3 -3
  44. package/dist/workbench/index.js +9 -9
  45. package/dist/workbench/launch.js +2 -2
  46. package/dist/workbench/sessionTitle.js +3 -3
  47. package/dist/workspace-agent-generated-files.js +3 -3
  48. package/package.json +19 -12
  49. package/dist/chunk-CZ7PS3DU.js.map +0 -1
  50. package/dist/chunk-QT45WUPQ.js.map +0 -1
  51. package/dist/chunk-VFQR7AZI.js.map +0 -1
  52. package/dist/chunk-ZG3WZSMV.js.map +0 -1
  53. /package/dist/{chunk-AMNXH4DJ.js.map → chunk-2RYZ4EBF.js.map} +0 -0
  54. /package/dist/{chunk-EIC7XS3C.js.map → chunk-5QTC2L52.js.map} +0 -0
  55. /package/dist/{chunk-62QOR3TC.js.map → chunk-HCS3HUUX.js.map} +0 -0
  56. /package/dist/{chunk-OL54R6OL.js.map → chunk-J3SJZMI5.js.map} +0 -0
  57. /package/dist/{chunk-FJG2EH4V.js.map → chunk-KUCWRSXU.js.map} +0 -0
  58. /package/dist/{chunk-D6IYEVDT.js.map → chunk-MCH35MAX.js.map} +0 -0
  59. /package/dist/{chunk-NZ2BGOJU.js.map → chunk-Q4X6Q4E6.js.map} +0 -0
  60. /package/dist/{chunk-EU7RWKHE.js.map → chunk-R6GOICRO.js.map} +0 -0
@@ -55,7 +55,7 @@ interface AgentMentionWorkspaceAppItem {
55
55
  name: string;
56
56
  description?: string;
57
57
  iconUrl?: string;
58
- /** 应用是否能够提供产物文件(reference),决定 @ 面板行末尾是否展示「查看产物文件」入口。 */
58
+ /** 应用是否能够提供产物文件(reference),决定 @ 面板行末尾是否展示「查看产物」入口。 */
59
59
  referencesListSupported?: boolean;
60
60
  }
61
61
  interface AgentMentionWorkspaceReferenceItem {
@@ -0,0 +1,7 @@
1
+ interface AgentMessageMarkdownWorkspaceAppIcon {
2
+ appId: string;
3
+ iconUrl: string | null;
4
+ workspaceId?: string | null;
5
+ }
6
+
7
+ export type { AgentMessageMarkdownWorkspaceAppIcon as A };
@@ -1,9 +1,10 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode, JSX } from 'react';
3
3
  import { W as WorkspaceLinkAction } from '../workspaceLinkActions-C6POH38D.js';
4
- import { a as AgentGUIProviderSkillOption, f as AgentMessageMarkdownWorkspaceAppIcon } from '../AgentMessageMarkdown-Cts0dAIm.js';
5
- import { c as AgentConversationVM, W as WorkspaceAgentSessionDetailViewModel } from '../agentConversationVM-1QgRwvwZ.js';
6
- export { B as BuildWorkspaceAgentSessionDetailInput, d as buildWorkspaceAgentSessionDetailViewModel } from '../agentConversationVM-1QgRwvwZ.js';
4
+ import { A as AgentMessageMarkdownWorkspaceAppIcon } from '../AgentMessageMarkdown-DeYPURtF.js';
5
+ import { c as AgentConversationVM, W as WorkspaceAgentSessionDetailViewModel } from '../agentConversationVM-BTMtRteS.js';
6
+ export { B as BuildWorkspaceAgentSessionDetailInput, d as buildWorkspaceAgentSessionDetailViewModel } from '../agentConversationVM-BTMtRteS.js';
7
+ import { a as AgentGUIProviderSkillOption } from '../agentGuiNodeTypes-B5Y6yDKy.js';
7
8
  export { W as WorkspaceAgentActivityCard, n as WorkspaceAgentActivitySession, q as WorkspaceAgentActivityTimelineItem } from '../workspaceAgentActivityListViewModel-DLnMBMoh.js';
8
9
  import '@tutti-os/workspace-issue-manager/core';
9
10
  import '@tutti-os/agent-activity-core';
@@ -6,18 +6,18 @@ import {
6
6
  projectAgentConversationVM,
7
7
  reconcileProjectedAgentConversationVM,
8
8
  useProjectedAgentConversation
9
- } from "../chunk-CZ7PS3DU.js";
10
- import "../chunk-QT45WUPQ.js";
11
- import "../chunk-ZG3WZSMV.js";
9
+ } from "../chunk-ZAF4IVUT.js";
10
+ import "../chunk-XJXSR5XI.js";
11
+ import "../chunk-2FOBSURO.js";
12
12
  import "../chunk-Y35GDLP2.js";
13
- import "../chunk-TXXWUG2J.js";
13
+ import "../chunk-LUGELG5V.js";
14
+ import "../chunk-VE6JY2TH.js";
14
15
  import "../chunk-TYGL25EL.js";
16
+ import "../chunk-PJP5BUU6.js";
15
17
  import {
16
18
  translate
17
- } from "../chunk-EIC7XS3C.js";
18
- import "../chunk-VFQR7AZI.js";
19
- import "../chunk-LUGELG5V.js";
20
- import "../chunk-PJP5BUU6.js";
19
+ } from "../chunk-5QTC2L52.js";
20
+ import "../chunk-KACBTC7Y.js";
21
21
 
22
22
  // shared/WorkspaceAgentSessionDetail.tsx
23
23
  import { useMemo } from "react";
@@ -4,7 +4,7 @@ import { I18nRuntime } from '@tutti-os/ui-i18n-runtime';
4
4
  import { useTranslation, AgentGuiI18nLocale, TranslateFn } from '../i18n/index.js';
5
5
  import { W as WorkspaceLinkAction } from '../workspaceLinkActions-C6POH38D.js';
6
6
  import { AgentActivityNeedsAttentionItem, AgentActivitySnapshot } from '@tutti-os/agent-activity-core';
7
- import { b as AgentConversationPromptVM } from '../agentConversationVM-1QgRwvwZ.js';
7
+ import { b as AgentConversationPromptVM } from '../agentConversationVM-BTMtRteS.js';
8
8
  import { o as WorkspaceAgentActivityStatus } from '../workspaceAgentActivityListViewModel-DLnMBMoh.js';
9
9
  export { PLAN_IMPLEMENTATION_ACTION_IMPLEMENT, PLAN_IMPLEMENTATION_PROMPT } from '../plan-decision-ops.js';
10
10
  import '@tutti-os/workspace-issue-manager/core';
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  formatAgentGuiConversationPlainTitle
3
- } from "../chunk-OL54R6OL.js";
3
+ } from "../chunk-J3SJZMI5.js";
4
4
  import {
5
5
  AgentInteractivePromptSurface,
6
6
  approvalOptionDisplayLabel,
7
7
  getPromptToolDetails,
8
8
  isPromptRequestIdTitle
9
- } from "../chunk-62QOR3TC.js";
9
+ } from "../chunk-HCS3HUUX.js";
10
10
  import {
11
11
  PLAN_IMPLEMENTATION_ACTION_IMPLEMENT,
12
12
  PLAN_IMPLEMENTATION_PROMPT,
@@ -15,35 +15,35 @@ import {
15
15
  } from "../chunk-MKHDRIGN.js";
16
16
  import {
17
17
  formatAgentSessionMentionText
18
- } from "../chunk-FJG2EH4V.js";
18
+ } from "../chunk-KUCWRSXU.js";
19
19
  import {
20
20
  AgentMessageMarkdown,
21
21
  CustomScrollArea,
22
22
  cn,
23
23
  extractAgentMcpToolTarget,
24
24
  normalizeAskUserQuestions
25
- } from "../chunk-QT45WUPQ.js";
25
+ } from "../chunk-XJXSR5XI.js";
26
26
  import {
27
27
  managedAgentRoundedIconUrl,
28
28
  userAvatarPlaceholderUrl,
29
29
  workspaceAgentActivityStatusLabel
30
- } from "../chunk-NZ2BGOJU.js";
30
+ } from "../chunk-Q4X6Q4E6.js";
31
31
  import {
32
32
  resolveWorkspaceAgentSessionSortTimeUnixMs
33
33
  } from "../chunk-IBIMGLCD.js";
34
34
  import "../chunk-MTFSQWZ6.js";
35
- import "../chunk-TXXWUG2J.js";
35
+ import "../chunk-VE6JY2TH.js";
36
36
  import {
37
37
  workspaceAgentProviderLabel
38
38
  } from "../chunk-TYGL25EL.js";
39
+ import "../chunk-PJP5BUU6.js";
39
40
  import "../chunk-GCBDIQDX.js";
40
41
  import {
41
42
  AgentGuiI18nProvider,
42
43
  getActiveUiLanguage,
43
44
  useTranslation
44
- } from "../chunk-EIC7XS3C.js";
45
- import "../chunk-VFQR7AZI.js";
46
- import "../chunk-PJP5BUU6.js";
45
+ } from "../chunk-5QTC2L52.js";
46
+ import "../chunk-KACBTC7Y.js";
47
47
 
48
48
  // agent-message-center/WorkspaceAgentMessageCenterPanel.tsx
49
49
  import {
@@ -305,11 +305,25 @@ interface AgentTurnSummaryFileVM {
305
305
  content?: string | null;
306
306
  occurredAtUnixMs: number | null;
307
307
  }
308
+ interface AgentTurnSummaryPatchChangeVM {
309
+ path: string;
310
+ changeType: "modified" | "created" | "deleted";
311
+ unifiedDiff?: string | null;
312
+ oldString?: string | null;
313
+ newString?: string | null;
314
+ content?: string | null;
315
+ }
316
+ interface AgentTurnSummaryPatchBatchVM {
317
+ cwd: string | null;
318
+ toolCallId: string;
319
+ changes: AgentTurnSummaryPatchChangeVM[];
320
+ }
308
321
  interface AgentTurnSummaryRowVM {
309
322
  kind: "turn-summary";
310
323
  id: string;
311
324
  turnId: string;
312
325
  files: AgentTurnSummaryFileVM[];
326
+ patchBatches?: AgentTurnSummaryPatchBatchVM[];
313
327
  fileCount: number;
314
328
  modifiedCount: number;
315
329
  createdCount: number;
@@ -1,7 +1,7 @@
1
1
  import { AgentActivityUsage } from '@tutti-os/agent-activity-core';
2
2
  import { e as AgentHostAgentSessionCommand, f as AgentHostAgentSessionComposerSettings, h as AgentHostAgentSessionReasoningEffort, i as AgentHostAgentSessionSpeed, g as AgentHostAgentSessionPermissionConfig, j as AgentHostAgentSessionState, a as AgentGUIProvider, A as AgentGUINodeData, b as AgentGUIProviderTarget, m as AgentPromptContentBlock } from './types-xMz0lJWt.js';
3
3
  import { A as AgentHostBatchUserInfoInput, a as AgentHostBatchUserInfoResult, b as AgentHostDeleteWorkspaceAgentSessionInput, k as AgentHostWorkspaceAgentSessionSummaryInput, j as AgentHostWorkspaceAgentSessionSummary, e as AgentHostWorkspaceAgentListInput, l as AgentHostWorkspaceAgentSnapshot, i as AgentHostWorkspaceAgentSessionMessagesInput, h as AgentHostWorkspaceAgentSessionMessages, p as WorkspaceAgentActivitySyncState } from './workspaceAgentActivityListViewModel-DLnMBMoh.js';
4
- import { A as AgentApprovalItemVM, a as AgentAskUserQuestionVM, b as AgentConversationPromptVM, c as AgentConversationVM, W as WorkspaceAgentSessionDetailViewModel } from './agentConversationVM-1QgRwvwZ.js';
4
+ import { A as AgentApprovalItemVM, a as AgentAskUserQuestionVM, b as AgentConversationPromptVM, c as AgentConversationVM, W as WorkspaceAgentSessionDetailViewModel } from './agentConversationVM-BTMtRteS.js';
5
5
  import { WorkspaceUserProjectService } from '@tutti-os/workspace-user-project/contracts';
6
6
 
7
7
  declare const APP_ERROR_CODES: readonly ["common.invalid_input", "common.approved_path_required", "common.unavailable", "common.unexpected", "session.not_found", "control_surface.unauthorized", "workspace.select_directory_failed", "workspace.select_files_failed", "workspace.ensure_directory_failed", "workspace.import_files_failed", "workspace.read_file_failed", "workspace.write_file_failed", "workspace.export_file_failed", "workspace.copy_path_failed", "workspace.host_unsupported", "workspace.runtime_artifact_unavailable", "runtime.guest_agent_lane_unavailable", "workspace.room_full", "workspace.room_delete_forbidden", "workspace.room_delete_not_found", "filesystem.create_directory_failed", "filesystem.read_file_bytes_failed", "filesystem.read_file_text_failed", "filesystem.write_file_text_failed", "filesystem.copy_entry_failed", "filesystem.move_entry_failed", "filesystem.rename_entry_failed", "filesystem.delete_entry_failed", "filesystem.read_directory_failed", "filesystem.stat_failed", "terminal.spawn_failed", "terminal.write_failed", "terminal.resize_failed", "terminal.close_failed", "terminal.attach_failed", "terminal.detach_failed", "terminal.snapshot_failed", "agent.list_models_failed", "agent.launch_failed", "agent.read_last_message_failed", "agent.provider_session_not_found", "agent.resume_session_not_local", "agent.resume_session_resolve_failed", "agent.settings_require_new_session", "task.suggest_title_failed", "persistence.unavailable", "persistence.quota_exceeded", "persistence.payload_too_large", "persistence.io_failed", "persistence.invalid_state", "persistence.invalid_node_id", "update.get_state_failed", "update.configure_failed", "update.check_failed", "update.download_failed", "update.install_failed", "PACKAGE_DOWNLOAD_INTERRUPTED", "PACKAGE_DOWNLOAD_HTTP_STATUS", "PACKAGE_DOWNLOAD_INVALID", "PACKAGE_DOWNLOAD_DISK_ERROR"];
@@ -161,6 +161,11 @@ type AgentHostPersistenceApi = AgentHostRecord & {
161
161
  readWorkspaceAgentReadState: (input: ReadWorkspaceAgentReadStateInput) => AgentHostAsyncResult<WorkspaceAgentReadStateSnapshot>;
162
162
  writeWorkspaceAgentReadState: (input: WriteWorkspaceAgentReadStateInput) => AgentHostAsyncResult<PersistWriteResult>;
163
163
  };
164
+ type AgentHostToastApi = AgentHostRecord & {
165
+ error: (title: string, description?: string) => void;
166
+ info?: (title: string, description?: string) => void;
167
+ success?: (title: string, description?: string) => void;
168
+ };
164
169
  interface AgentHostSelectedFile {
165
170
  name?: string;
166
171
  path: string;
@@ -168,14 +173,47 @@ interface AgentHostSelectedFile {
168
173
  interface AgentHostSelectFilesInput {
169
174
  allowDirectories?: boolean;
170
175
  }
176
+ interface AgentHostApplyWorkspaceGitPatchInput {
177
+ allowBinary?: boolean;
178
+ atomic?: boolean;
179
+ cwd: string;
180
+ diff: string;
181
+ revert?: boolean;
182
+ target?: "unstaged" | "staged" | "staged-and-unstaged";
183
+ }
184
+ interface AgentHostApplyWorkspaceGitPatchResult {
185
+ status: "success" | "partial-success" | "error";
186
+ appliedPaths: string[];
187
+ skippedPaths: string[];
188
+ conflictedPaths: string[];
189
+ errorCode?: "not-git-repo" | string;
190
+ execOutput?: {
191
+ command: string;
192
+ stdout: string;
193
+ stderr: string;
194
+ };
195
+ }
196
+ interface AgentHostResolveWorkspaceGitPatchSupportInput {
197
+ cwd: string;
198
+ }
199
+ interface AgentHostResolveWorkspaceGitPatchSupportResult {
200
+ supported: boolean;
201
+ root?: string;
202
+ errorCode?: "not-git-repo" | string;
203
+ }
171
204
  type AgentHostWorkspaceApi = AgentHostRecord & {
205
+ applyGitPatch?: (input: AgentHostApplyWorkspaceGitPatchInput) => AgentHostAsyncResult<AgentHostApplyWorkspaceGitPatchResult>;
206
+ resolveGitPatchSupport?: (input: AgentHostResolveWorkspaceGitPatchSupportInput) => AgentHostAsyncResult<AgentHostResolveWorkspaceGitPatchSupportResult>;
172
207
  copyPath?: (input: {
173
208
  path: string;
174
209
  }) => AgentHostAsyncResult<void>;
175
210
  ensureDirectory: (input: {
176
211
  path: string;
177
212
  }) => AgentHostAsyncResult<void>;
178
- getPathForFile: (file: File) => string;
213
+ getReferenceForFile?: (file: File) => {
214
+ kind: "file" | "folder";
215
+ path: string;
216
+ };
179
217
  readFile: (input: {
180
218
  path: string;
181
219
  }) => AgentHostAsyncResult<ReadWorkspaceFileResult>;
@@ -202,6 +240,7 @@ interface AgentHostInputApi {
202
240
  onHostEvent?: (listener: (event: any) => void) => AgentHostUnsubscribe;
203
241
  persistence?: AgentHostPersistenceApi;
204
242
  runtime?: AgentHostEnvironmentApi;
243
+ toast?: AgentHostToastApi;
205
244
  userProjects?: AgentHostUserProjectsApi;
206
245
  workspace: AgentHostWorkspaceApi;
207
246
  workspaceAgentProbes?: AgentHostWorkspaceAgentProbesApi;
@@ -349,6 +388,7 @@ interface AgentHostRuntimeApi {
349
388
  onHostEvent?: (listener: (event: any) => void) => AgentHostUnsubscribe;
350
389
  persistence?: AgentHostPersistenceApi;
351
390
  runtime?: AgentHostEnvironmentApi;
391
+ toast?: AgentHostToastApi;
352
392
  userProjects?: AgentHostUserProjectsApi;
353
393
  workspace: AgentHostWorkspaceApi;
354
394
  workspaceAgentProbes?: AgentHostWorkspaceAgentProbesApi;
@@ -571,10 +611,4 @@ interface AgentGUINodeViewModel {
571
611
  inlineNotice: AgentGUIInlineNotice | null;
572
612
  }
573
613
 
574
- interface AgentMessageMarkdownWorkspaceAppIcon {
575
- appId: string;
576
- iconUrl: string | null;
577
- workspaceId?: string | null;
578
- }
579
-
580
- export type { AgentGUINodeViewModel as A, PersistWriteResult as P, ReadWorkspaceAgentReadStateInput as R, WorkspaceAgentReadStateSnapshot as W, AgentGUIProviderSkillOption as a, AgentHostApi as b, AgentHostInputApi as c, AgentHostRuntimeApi as d, AgentHostSelectFilesInput as e, AgentMessageMarkdownWorkspaceAppIcon as f, AgentProbeProvider as g, AgentProbeSnapshot as h, AgentProviderProbeListInput as i, AgentProviderProbeListResult as j, AgentUsageQuota as k, AgentUsageSnapshot as l, WriteWorkspaceAgentReadStateInput as m };
614
+ export type { AgentGUINodeViewModel as A, PersistWriteResult as P, ReadWorkspaceAgentReadStateInput as R, WorkspaceAgentReadStateSnapshot as W, AgentGUIProviderSkillOption as a, AgentGUIQueuedPromptVM as b, AgentHostApi as c, AgentHostApplyWorkspaceGitPatchInput as d, AgentHostInputApi as e, AgentHostRuntimeApi as f, AgentHostSelectFilesInput as g, AgentProbeProvider as h, AgentProbeSnapshot as i, AgentProviderProbeListInput as j, AgentProviderProbeListResult as k, AgentUsageQuota as l, AgentUsageSnapshot as m, WriteWorkspaceAgentReadStateInput as n };
@@ -89,12 +89,12 @@
89
89
  }
90
90
 
91
91
  .tsh-zoom-dialog [data-rmiz-modal-overlay="visible"] {
92
- background: color-mix(in srgb, var(--background-panel) 46%, transparent);
92
+ background: rgb(0 0 0 / 60%);
93
93
  backdrop-filter: blur(18px) saturate(1.02);
94
94
  }
95
95
 
96
96
  .tsh-zoom-dialog [data-rmiz-modal-overlay="hidden"] {
97
- background: color-mix(in srgb, var(--background-panel) 0%, transparent);
97
+ background: rgb(0 0 0 / 0%);
98
98
  }
99
99
 
100
100
  .tsh-zoom-dialog [data-rmiz-btn-unzoom] {
@@ -112,6 +112,30 @@
112
112
  gap: 6px;
113
113
  }
114
114
 
115
+ .tsh-zoom-dialog__zoom-controls {
116
+ position: fixed;
117
+ top: max(20px, calc(var(--cove-titlebar-reserve, 0px) + 10px));
118
+ right: 168px;
119
+ z-index: 100301;
120
+ display: flex;
121
+ align-items: center;
122
+ gap: 4px;
123
+ height: 40px;
124
+ padding: 0 6px;
125
+ border-radius: 999px;
126
+ background: color-mix(in srgb, var(--background-panel) 78%, black 22%);
127
+ box-shadow:
128
+ 0 18px 40px color-mix(in srgb, black 26%, transparent),
129
+ 0 0 0 1px color-mix(in srgb, white 12%, transparent);
130
+ color: var(--text-primary);
131
+ -webkit-app-region: no-drag;
132
+ }
133
+
134
+ .tsh-zoom-dialog:not(:has(.tsh-zoom-dialog__image-actions))
135
+ .tsh-zoom-dialog__zoom-controls {
136
+ right: 72px;
137
+ }
138
+
115
139
  .tsh-image-context-menu {
116
140
  position: fixed;
117
141
  z-index: 100302;
@@ -126,6 +150,8 @@
126
150
  -webkit-app-region: no-drag;
127
151
  }
128
152
 
153
+ .tsh-zoom-dialog__image-actions button,
154
+ .tsh-zoom-dialog__zoom-controls button,
129
155
  .tsh-image-context-menu button {
130
156
  display: flex;
131
157
  align-items: center;
@@ -140,12 +166,34 @@
140
166
  line-height: 20px;
141
167
  }
142
168
 
169
+ .tsh-zoom-dialog__zoom-controls button {
170
+ justify-content: center;
171
+ width: 30px;
172
+ height: 30px;
173
+ padding: 0;
174
+ }
175
+
176
+ .tsh-zoom-dialog__zoom-controls button:disabled {
177
+ cursor: default;
178
+ opacity: 0.45;
179
+ }
180
+
181
+ .tsh-zoom-dialog__zoom-controls span {
182
+ min-width: 44px;
183
+ padding: 0 4px;
184
+ text-align: center;
185
+ font-size: 12px;
186
+ line-height: 30px;
187
+ color: var(--text-secondary);
188
+ font-variant-numeric: tabular-nums;
189
+ }
190
+
143
191
  .tsh-zoom-dialog__icon-button,
144
192
  .tsh-zoom-dialog__image-actions button {
145
193
  justify-content: center;
146
194
  width: 32px;
147
195
  height: 32px;
148
- border-radius: 6px;
196
+ border-radius: 999px;
149
197
  background: var(--background-fronted);
150
198
  box-shadow:
151
199
  0 18px 40px color-mix(in srgb, black 26%, transparent),
@@ -160,6 +208,7 @@
160
208
 
161
209
  .tsh-zoom-dialog__icon-button:hover,
162
210
  .tsh-zoom-dialog__image-actions button:hover,
211
+ .tsh-zoom-dialog__zoom-controls button:not(:disabled):hover,
163
212
  .tsh-image-context-menu button:hover {
164
213
  background: color-mix(in srgb, var(--background-panel) 82%, white 12%);
165
214
  }
@@ -2191,6 +2240,8 @@ aside.workspace-agents-status-panel
2191
2240
  display: inline-flex;
2192
2241
  align-items: center;
2193
2242
  gap: 5px;
2243
+ font-size: 13px;
2244
+ line-height: 20px;
2194
2245
  white-space: nowrap;
2195
2246
  }
2196
2247
 
@@ -2199,6 +2250,7 @@ aside.workspace-agents-status-panel
2199
2250
  appearance: none;
2200
2251
  border: 0;
2201
2252
  font: inherit;
2253
+ font-size: 13px;
2202
2254
  cursor: pointer;
2203
2255
  }
2204
2256
 
@@ -3208,15 +3260,38 @@ aside.workspace-agents-status-panel
3208
3260
  }
3209
3261
 
3210
3262
  .agent-gui-conversation__message-group:has(
3211
- > .agent-gui-conversation__message-copy-button
3263
+ > .agent-gui-conversation__message-footer
3212
3264
  ) {
3213
3265
  margin-bottom: 26px;
3214
3266
  }
3215
3267
 
3216
- .agent-gui-conversation__message-copy-button {
3268
+ .agent-gui-conversation__message-footer {
3217
3269
  position: absolute;
3218
3270
  top: calc(100% + 4px);
3219
3271
  z-index: 1;
3272
+ display: flex;
3273
+ gap: 10px;
3274
+ align-items: center;
3275
+ opacity: 0;
3276
+ pointer-events: none;
3277
+ transform: translateY(-2px);
3278
+ transition:
3279
+ opacity 120ms ease,
3280
+ transform 120ms ease;
3281
+ }
3282
+
3283
+ .agent-gui-conversation__message-timestamp {
3284
+ font-size: 11px;
3285
+ line-height: 22px;
3286
+ color: var(
3287
+ --text-secondary,
3288
+ color-mix(in srgb, var(--text-primary) 60%, transparent)
3289
+ );
3290
+ white-space: nowrap;
3291
+ }
3292
+
3293
+ .agent-gui-conversation__message-copy-button {
3294
+ position: static;
3220
3295
  width: 22px;
3221
3296
  min-width: 22px;
3222
3297
  height: 22px;
@@ -3231,18 +3306,29 @@ aside.workspace-agents-status-panel
3231
3306
  }
3232
3307
 
3233
3308
  .agent-gui-conversation__message-group[data-agent-message-speaker="user"]
3234
- > .agent-gui-conversation__message-copy-button {
3309
+ > .agent-gui-conversation__message-footer {
3235
3310
  right: 0;
3236
3311
  }
3237
3312
 
3238
3313
  .agent-gui-conversation__message-group[data-agent-message-speaker="assistant"]
3239
- > .agent-gui-conversation__message-copy-button {
3314
+ > .agent-gui-conversation__message-footer {
3240
3315
  left: 0;
3241
3316
  }
3242
3317
 
3243
3318
  .agent-gui-conversation__message-group:hover
3319
+ > .agent-gui-conversation__message-footer,
3320
+ .agent-gui-conversation__message-group:focus-within
3321
+ > .agent-gui-conversation__message-footer {
3322
+ opacity: 1;
3323
+ pointer-events: auto;
3324
+ transform: translateY(0);
3325
+ }
3326
+
3327
+ .agent-gui-conversation__message-group:hover
3328
+ > .agent-gui-conversation__message-footer
3244
3329
  > .agent-gui-conversation__message-copy-button,
3245
3330
  .agent-gui-conversation__message-group:focus-within
3331
+ > .agent-gui-conversation__message-footer
3246
3332
  > .agent-gui-conversation__message-copy-button {
3247
3333
  opacity: 1;
3248
3334
  pointer-events: auto;
@@ -3763,14 +3849,41 @@ aside.workspace-agents-status-panel
3763
3849
  color: inherit;
3764
3850
  }
3765
3851
 
3766
- .agent-gui-node__composer-textarea [data-slot="mention-pill"],
3852
+ .agent-gui-node__composer-textarea .agent-rich-text-mention-node {
3853
+ display: inline-flex;
3854
+ align-items: center;
3855
+ height: 24px;
3856
+ min-height: 24px;
3857
+ line-height: 24px;
3858
+ vertical-align: middle;
3859
+ }
3860
+
3767
3861
  .agent-gui-node__composer-textarea
3768
- [data-agent-file-mention="true"].tsh-agent-object-token {
3862
+ .agent-rich-text-mention-node[data-agent-file-mention="true"].tsh-agent-object-token,
3863
+ .agent-gui-node__composer-textarea
3864
+ .agent-rich-text-mention-node
3865
+ [data-slot="mention-pill"] {
3866
+ display: inline-flex;
3867
+ align-items: center;
3769
3868
  cursor: pointer;
3869
+ top: 0;
3870
+ height: 24px;
3871
+ min-height: 24px;
3872
+ padding-top: 0;
3770
3873
  padding-right: 4px;
3874
+ padding-bottom: 0;
3771
3875
  padding-left: 4px;
3772
3876
  border-radius: 4px;
3877
+ line-height: 24px;
3878
+ transform: none;
3773
3879
  transition: background-color 140ms ease-in-out;
3880
+ vertical-align: middle;
3881
+ }
3882
+
3883
+ .agent-gui-node__composer-textarea
3884
+ .agent-rich-text-mention-node
3885
+ [data-slot="mention-pill"] {
3886
+ height: 24px;
3774
3887
  }
3775
3888
 
3776
3889
  .agent-gui-node__composer-textarea
@@ -3850,7 +3963,7 @@ aside.workspace-agents-status-panel
3850
3963
 
3851
3964
  .agent-gui-node__composer-textarea
3852
3965
  [data-agent-file-mention="true"].tsh-agent-object-token--file {
3853
- vertical-align: baseline;
3966
+ vertical-align: middle;
3854
3967
  }
3855
3968
 
3856
3969
  .agent-gui-node__shell {
@@ -4163,8 +4276,7 @@ aside.workspace-agents-status-panel
4163
4276
 
4164
4277
  .agent-gui-workbench-header__agent-brand {
4165
4278
  display: inline-flex;
4166
- min-width: 0;
4167
- flex: 0 1 auto;
4279
+ flex: 0 0 auto;
4168
4280
  align-items: center;
4169
4281
  gap: 8px;
4170
4282
  }
@@ -4189,7 +4301,6 @@ aside.workspace-agents-status-panel
4189
4301
  white-space: nowrap;
4190
4302
  }
4191
4303
 
4192
- .agent-gui-workbench-header__agent-name,
4193
4304
  .agent-gui-workbench-header__title-text {
4194
4305
  min-width: 0;
4195
4306
  max-width: 100%;
@@ -4199,8 +4310,7 @@ aside.workspace-agents-status-panel
4199
4310
  }
4200
4311
 
4201
4312
  .agent-gui-workbench-header__agent-name {
4202
- flex: 0 1 auto;
4203
- max-width: 160px;
4313
+ flex: 0 0 auto;
4204
4314
  }
4205
4315
 
4206
4316
  .agent-gui-workbench-header__session-title {
@@ -6205,7 +6315,7 @@ button.agent-gui-node__conversation-section-toggle:hover
6205
6315
  box-sizing: border-box;
6206
6316
  height: var(--agent-gui-composer-input-height, 56px);
6207
6317
  min-height: 56px;
6208
- max-height: var(--agent-gui-composer-input-max-height, 120px);
6318
+ max-height: var(--agent-gui-composer-input-max-height, 110px);
6209
6319
  align-items: center;
6210
6320
  overflow: hidden;
6211
6321
  padding: 0 12px;
@@ -6902,17 +7012,22 @@ html[data-theme="light"] [data-message-center-item-id].agent-gui-edge-glow {
6902
7012
 
6903
7013
  .agent-gui-node__composer textarea,
6904
7014
  .agent-gui-node__composer-textarea {
7015
+ --agent-gui-composer-text-line-height: 24px;
7016
+ --agent-gui-composer-text-max-visible-lines: 3.5;
7017
+ /* prettier-ignore */
7018
+ --agent-gui-composer-text-viewport-height: calc(var(--agent-gui-composer-text-line-height) * var(--agent-gui-composer-text-max-visible-lines));
7019
+
6905
7020
  width: 100%;
6906
7021
  min-width: 0;
6907
7022
  min-height: 46px;
6908
- max-height: 72px;
7023
+ max-height: var(--agent-gui-composer-text-viewport-height);
6909
7024
  overflow-y: auto;
6910
7025
  border: 0;
6911
7026
  background: transparent;
6912
7027
  color: var(--agent-gui-text-primary);
6913
7028
  font: inherit;
6914
7029
  font-size: 13px;
6915
- line-height: 24px;
7030
+ line-height: var(--agent-gui-composer-text-line-height);
6916
7031
  outline: 0;
6917
7032
  padding: 0;
6918
7033
  resize: none;
@@ -6928,7 +7043,7 @@ html[data-theme="light"] [data-message-center-item-id].agent-gui-edge-glow {
6928
7043
  display: block;
6929
7044
  height: auto;
6930
7045
  min-height: 24px;
6931
- max-height: calc(var(--agent-gui-composer-text-height, 56px) - 26px);
7046
+ max-height: var(--agent-gui-composer-text-viewport-height);
6932
7047
  overflow-x: hidden;
6933
7048
  overflow-y: auto;
6934
7049
  overflow-wrap: anywhere;
@@ -6943,12 +7058,18 @@ html[data-theme="light"] [data-message-center-item-id].agent-gui-edge-glow {
6943
7058
  .agent-gui-node__composer[data-layout="dock"]
6944
7059
  .agent-gui-node__composer-prompt-input-area[data-has-draft-images="true"]
6945
7060
  .agent-gui-node__composer-textarea {
6946
- max-height: calc(var(--agent-gui-composer-text-height, 56px) - 26px);
7061
+ max-height: var(--agent-gui-composer-text-viewport-height);
6947
7062
  }
6948
7063
 
7064
+ .agent-gui-node__composer[data-layout="dock"]
7065
+ .agent-gui-node__composer-prompt-input-area:hover
7066
+ textarea,
6949
7067
  .agent-gui-node__composer[data-layout="dock"]
6950
7068
  .agent-gui-node__composer-prompt-input-area:hover
6951
7069
  .agent-gui-node__composer-textarea,
7070
+ .agent-gui-node__composer[data-layout="dock"]
7071
+ .agent-gui-node__composer-prompt-input-area:focus-within
7072
+ textarea,
6952
7073
  .agent-gui-node__composer[data-layout="dock"]
6953
7074
  .agent-gui-node__composer-prompt-input-area:focus-within
6954
7075
  .agent-gui-node__composer-textarea {
@@ -6958,8 +7079,9 @@ html[data-theme="light"] [data-message-center-item-id].agent-gui-edge-glow {
6958
7079
  .agent-gui-node__composer[data-layout="dock"] textarea::-webkit-scrollbar,
6959
7080
  .agent-gui-node__composer[data-layout="dock"]
6960
7081
  .agent-gui-node__composer-textarea::-webkit-scrollbar {
6961
- display: none;
6962
- width: 4px;
7082
+ display: block;
7083
+ width: 0;
7084
+ height: 0;
6963
7085
  }
6964
7086
 
6965
7087
  .agent-gui-node__composer[data-layout="dock"]
@@ -6974,7 +7096,8 @@ html[data-theme="light"] [data-message-center-item-id].agent-gui-edge-glow {
6974
7096
  .agent-gui-node__composer[data-layout="dock"]
6975
7097
  .agent-gui-node__composer-prompt-input-area:focus-within
6976
7098
  .agent-gui-node__composer-textarea::-webkit-scrollbar {
6977
- display: block;
7099
+ width: 4px;
7100
+ height: 4px;
6978
7101
  }
6979
7102
 
6980
7103
  .agent-gui-node__composer textarea::-webkit-scrollbar,
@@ -7057,7 +7180,7 @@ html[data-theme="light"] [data-message-center-item-id].agent-gui-edge-glow {
7057
7180
  height: 0;
7058
7181
  color: var(--agent-gui-text-tertiary);
7059
7182
  font-size: 13px;
7060
- line-height: 1.3;
7183
+ line-height: 24px;
7061
7184
  pointer-events: none;
7062
7185
  }
7063
7186
 
@@ -7077,7 +7200,7 @@ html[data-theme="light"] [data-message-center-item-id].agent-gui-edge-glow {
7077
7200
  .agent-gui-node__composer textarea::placeholder,
7078
7201
  .agent-gui-node__composer-textarea::placeholder {
7079
7202
  color: var(--agent-gui-text-tertiary);
7080
- line-height: 1.3;
7203
+ line-height: 24px;
7081
7204
  }
7082
7205
 
7083
7206
  .agent-gui-node__composer-input-shell:focus-within,