@tutti-os/agent-gui 0.0.40 → 0.0.41

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 (40) hide show
  1. package/dist/{AgentMessageMarkdown-GDgLA-im.d.ts → AgentMessageMarkdown-Cts0dAIm.d.ts} +1 -0
  2. package/dist/agent-conversation/index.d.ts +1 -1
  3. package/dist/agent-conversation/index.js +4 -4
  4. package/dist/agent-message-center/index.js +6 -6
  5. package/dist/agent-message-center/index.js.map +1 -1
  6. package/dist/app/renderer/agentactivity.css +298 -21
  7. package/dist/{chunk-UUM2GZXH.js → chunk-3PVSIL3H.js} +4 -4
  8. package/dist/{chunk-RE3AHBX6.js → chunk-3WZWZHAJ.js} +2 -2
  9. package/dist/{chunk-Y2DQJPTL.js → chunk-42WP3P5C.js} +2 -2
  10. package/dist/{chunk-Y5SE2XMU.js → chunk-5LVFYNIP.js} +5 -2
  11. package/dist/{chunk-Y5SE2XMU.js.map → chunk-5LVFYNIP.js.map} +1 -1
  12. package/dist/{chunk-EQ4RSPQE.js → chunk-5U4SXENC.js} +4 -4
  13. package/dist/{chunk-WJPEKD3F.js → chunk-LKOPLDPM.js} +5 -1
  14. package/dist/chunk-LKOPLDPM.js.map +1 -0
  15. package/dist/{chunk-DO7D7OOL.js → chunk-MUJYJDZH.js} +11 -10
  16. package/dist/chunk-MUJYJDZH.js.map +1 -0
  17. package/dist/{chunk-WC34LVH6.js → chunk-OLZP2EFK.js} +230 -45
  18. package/dist/chunk-OLZP2EFK.js.map +1 -0
  19. package/dist/{chunk-R7XH3C4Y.js → chunk-QIPMH6XO.js} +135 -35
  20. package/dist/chunk-QIPMH6XO.js.map +1 -0
  21. package/dist/context-mention-palette/index.js +5 -5
  22. package/dist/i18n/index.d.ts +4 -0
  23. package/dist/i18n/index.js +1 -1
  24. package/dist/index.d.ts +12 -2
  25. package/dist/index.js +136 -102
  26. package/dist/index.js.map +1 -1
  27. package/dist/workbench/contribution.d.ts +4 -0
  28. package/dist/workbench/contribution.js +1 -1
  29. package/dist/workbench/index.d.ts +10 -3
  30. package/dist/workbench/index.js +1 -1
  31. package/dist/workspace-agent-generated-files.js +2 -2
  32. package/package.json +12 -12
  33. package/dist/chunk-DO7D7OOL.js.map +0 -1
  34. package/dist/chunk-R7XH3C4Y.js.map +0 -1
  35. package/dist/chunk-WC34LVH6.js.map +0 -1
  36. package/dist/chunk-WJPEKD3F.js.map +0 -1
  37. /package/dist/{chunk-UUM2GZXH.js.map → chunk-3PVSIL3H.js.map} +0 -0
  38. /package/dist/{chunk-RE3AHBX6.js.map → chunk-3WZWZHAJ.js.map} +0 -0
  39. /package/dist/{chunk-Y2DQJPTL.js.map → chunk-42WP3P5C.js.map} +0 -0
  40. /package/dist/{chunk-EQ4RSPQE.js.map → chunk-5U4SXENC.js.map} +0 -0
package/dist/index.js CHANGED
@@ -23,7 +23,7 @@ import {
23
23
  AgentInteractivePromptSurface,
24
24
  approvalOptionDisplayLabel,
25
25
  formatAgentSessionMentionText
26
- } from "./chunk-UUM2GZXH.js";
26
+ } from "./chunk-3PVSIL3H.js";
27
27
  import {
28
28
  PLAN_IMPLEMENTATION_ACTION_FEEDBACK,
29
29
  PLAN_IMPLEMENTATION_ACTION_IMPLEMENT,
@@ -47,14 +47,13 @@ import {
47
47
  skillDescriptionForDisplay,
48
48
  skillTriggerForPrefix,
49
49
  useProjectedAgentConversation
50
- } from "./chunk-DO7D7OOL.js";
50
+ } from "./chunk-MUJYJDZH.js";
51
51
  import {
52
52
  AgentMessageMarkdown,
53
- ConversationImageContextMenu,
54
53
  ZoomableImage,
55
54
  cn,
56
55
  resolveWorkspaceLinkAction
57
- } from "./chunk-WC34LVH6.js";
56
+ } from "./chunk-OLZP2EFK.js";
58
57
  import {
59
58
  AGENT_MENTION_FILTER_TAB_ORDER,
60
59
  AgentFileMentionPalette,
@@ -62,7 +61,7 @@ import {
62
61
  DEFAULT_AGENT_MENTION_FILTER,
63
62
  agentMentionItemKey,
64
63
  preloadAgentMentionBrowse
65
- } from "./chunk-EQ4RSPQE.js";
64
+ } from "./chunk-5U4SXENC.js";
66
65
  import {
67
66
  WORKSPACE_AGENT_ACTIVITY_RUNTIME_SESSION_ORIGIN,
68
67
  buildWorkspaceAgentActivityListViewModel,
@@ -72,13 +71,13 @@ import {
72
71
  isWorkspaceAgentUntitledTask,
73
72
  mergeWorkspaceAgentActivityDurableAndOverlayMessages,
74
73
  selectWorkspaceAgentActivityOverlayMessages
75
- } from "./chunk-Y5SE2XMU.js";
74
+ } from "./chunk-5LVFYNIP.js";
76
75
  import {
77
76
  MANAGED_AGENT_ICON_FALLBACK_URL,
78
77
  MANAGED_AGENT_ICON_URLS,
79
78
  Spinner,
80
79
  normalizeManagedAgentProvider
81
- } from "./chunk-Y2DQJPTL.js";
80
+ } from "./chunk-42WP3P5C.js";
82
81
  import "./chunk-MTFSQWZ6.js";
83
82
  import {
84
83
  resolveWorkspaceAgentSessionSortTimeUnixMs
@@ -89,7 +88,7 @@ import {
89
88
  mentionItemToAttrs,
90
89
  normalizeAgentSessionMentionTitle,
91
90
  parseMentionItemFromHref
92
- } from "./chunk-RE3AHBX6.js";
91
+ } from "./chunk-3WZWZHAJ.js";
93
92
  import "./chunk-Y35GDLP2.js";
94
93
  import {
95
94
  AgentActivityHostProvider,
@@ -118,7 +117,7 @@ import {
118
117
  getActiveUiLanguage,
119
118
  translate,
120
119
  useTranslation
121
- } from "./chunk-WJPEKD3F.js";
120
+ } from "./chunk-LKOPLDPM.js";
122
121
  import "./chunk-LUGELG5V.js";
123
122
  import "./chunk-PJP5BUU6.js";
124
123
 
@@ -2075,6 +2074,7 @@ function WorkspaceNodeWindow({
2075
2074
  const resolvedStyle = sizeStyle ?? style;
2076
2075
  const renderedChildren = typeof children === "function" ? children(renderedFrame) : children;
2077
2076
  const rootStyle = appearance === "embedded" ? {
2077
+ "--node-header-padding-x": "16px",
2078
2078
  ...resolvedStyle,
2079
2079
  width: "100%",
2080
2080
  height: "100%",
@@ -2085,6 +2085,7 @@ function WorkspaceNodeWindow({
2085
2085
  backdropFilter: "none",
2086
2086
  WebkitBackdropFilter: "none"
2087
2087
  } : {
2088
+ "--node-header-padding-x": "16px",
2088
2089
  ...resolvedStyle,
2089
2090
  background: "transparent",
2090
2091
  border: "1px solid var(--node-window-border)",
@@ -2140,7 +2141,7 @@ function WorkspaceNodeWindow({
2140
2141
  /* @__PURE__ */ jsxs3(
2141
2142
  "div",
2142
2143
  {
2143
- className: "workspace-node-window__title flex min-w-0 flex-1 items-center gap-1 text-[13px] leading-[18px] font-semibold text-foreground",
2144
+ className: "workspace-node-window__title flex min-w-0 max-w-[280px] flex-1 items-center gap-2 text-[13px] leading-[18px] font-semibold text-foreground",
2144
2145
  "data-workspace-node-window-title": "true",
2145
2146
  title,
2146
2147
  children: [
@@ -2152,7 +2153,7 @@ function WorkspaceNodeWindow({
2152
2153
  children: titleIcon
2153
2154
  }
2154
2155
  ) : null,
2155
- /* @__PURE__ */ jsx11("span", { className: "min-w-0 overflow-hidden text-ellipsis whitespace-nowrap", children: title }),
2156
+ /* @__PURE__ */ jsx11("span", { className: "block min-w-0 flex-1 overflow-hidden text-ellipsis whitespace-nowrap", children: title }),
2156
2157
  titleAccessory ? /* @__PURE__ */ jsx11(
2157
2158
  "span",
2158
2159
  {
@@ -2843,6 +2844,7 @@ function conversationSummaryFromActivity(activity, session, options) {
2843
2844
  pinnedAtUnixMs: session?.pinnedAtUnixMs ?? null,
2844
2845
  sortTimeUnixMs: activity.sortTimeUnixMs,
2845
2846
  updatedAtUnixMs: session?.updatedAtUnixMs || activity.sortTimeUnixMs || 0,
2847
+ ...isImportedWorkspaceAgentSession(session) ? { isImported: true } : {},
2846
2848
  syncState: session?.syncState
2847
2849
  };
2848
2850
  }
@@ -2856,6 +2858,9 @@ function isExternalImportNoProjectSession(session) {
2856
2858
  const runtimeContext = session && "runtimeContext" in session ? session.runtimeContext : void 0;
2857
2859
  return runtimeContext?.externalImportNoProject === true;
2858
2860
  }
2861
+ function isImportedWorkspaceAgentSession(session) {
2862
+ return session?.runtimeContext?.imported === true;
2863
+ }
2859
2864
  function isSameAgentGUIConversationProject(left, right) {
2860
2865
  if (!left && !right) {
2861
2866
  return true;
@@ -3517,7 +3522,7 @@ function projectWorkspaceAgentMessagesToTimelineItems(messages) {
3517
3522
  const seq = index + 1;
3518
3523
  const eventId = message.messageId.trim() || `message:${id}`;
3519
3524
  const turnId = message.turnId?.trim() || void 0;
3520
- const occurredAtUnixMs = message.occurredAtUnixMs ?? message.completedAtUnixMs ?? message.startedAtUnixMs;
3525
+ const occurredAtUnixMs = messageDisplayOrderTime(message);
3521
3526
  if (kind === "tool_call") {
3522
3527
  const callId = firstNonEmptyString(
3523
3528
  messagePayloadString(message, "callId"),
@@ -3691,7 +3696,7 @@ function workspaceTimelineFields(workspaceId) {
3691
3696
  };
3692
3697
  }
3693
3698
  function compareMessagesByDisplayOrder(left, right) {
3694
- return normalizedPositiveNumber(left.version) - normalizedPositiveNumber(right.version) || messageOrderTime(left) - messageOrderTime(right) || normalizedPositiveNumber(left.id) - normalizedPositiveNumber(right.id) || (left.version ?? 0) - (right.version ?? 0) || left.messageId.localeCompare(right.messageId);
3699
+ return messageDisplayOrderTime(left) - messageDisplayOrderTime(right) || normalizedPositiveNumber(left.version) - normalizedPositiveNumber(right.version) || normalizedPositiveNumber(left.id) - normalizedPositiveNumber(right.id) || (left.version ?? 0) - (right.version ?? 0) || left.messageId.localeCompare(right.messageId);
3695
3700
  }
3696
3701
  function normalizedMessageId(id, index) {
3697
3702
  const normalizedId = typeof id === "number" ? id : 0;
@@ -3700,8 +3705,8 @@ function normalizedMessageId(id, index) {
3700
3705
  function normalizedPositiveNumber(value) {
3701
3706
  return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : 0;
3702
3707
  }
3703
- function messageOrderTime(message) {
3704
- return normalizedPositiveNumber(message.occurredAtUnixMs) || normalizedPositiveNumber(message.startedAtUnixMs) || normalizedPositiveNumber(message.completedAtUnixMs);
3708
+ function messageDisplayOrderTime(message) {
3709
+ return normalizedPositiveNumber(message.startedAtUnixMs) || normalizedPositiveNumber(message.occurredAtUnixMs) || normalizedPositiveNumber(message.completedAtUnixMs);
3705
3710
  }
3706
3711
  function toolCallItemType(status) {
3707
3712
  switch (normalizeToken(status)) {
@@ -3832,7 +3837,30 @@ import {
3832
3837
  mergeAgentActivityMessages
3833
3838
  } from "@tutti-os/agent-activity-core";
3834
3839
  function mergeWorkspaceAgentMessages(previous, incoming) {
3835
- return mergeAgentActivityMessages(previous, incoming);
3840
+ const previousDurableMessages = previous.filter(
3841
+ (message) => !isWorkspaceAgentActivityOptimisticMessage(message)
3842
+ );
3843
+ const incomingDurableMessages = incoming.filter(
3844
+ (message) => !isWorkspaceAgentActivityOptimisticMessage(message)
3845
+ );
3846
+ const durableMessages = mergeAgentActivityMessages(
3847
+ previousDurableMessages,
3848
+ incomingDurableMessages
3849
+ );
3850
+ const previousOptimisticMessages = previous.filter(
3851
+ isWorkspaceAgentActivityOptimisticMessage
3852
+ );
3853
+ const incomingOptimisticMessages = incoming.filter(
3854
+ isWorkspaceAgentActivityOptimisticMessage
3855
+ );
3856
+ const localMessages = mergeAgentActivityMessages(
3857
+ previousOptimisticMessages,
3858
+ incomingOptimisticMessages
3859
+ );
3860
+ return mergeWorkspaceAgentActivityDurableAndOverlayMessages({
3861
+ durableMessages,
3862
+ localMessages
3863
+ });
3836
3864
  }
3837
3865
 
3838
3866
  // host/agentHostAccountStore.ts
@@ -4115,7 +4143,6 @@ function subscribeCoalesced(type, options, callback) {
4115
4143
 
4116
4144
  // contexts/workspace/presentation/renderer/agentSessions/agentSessionViewStore.ts
4117
4145
  import { useSyncExternalStore } from "react";
4118
- import { mergeAgentActivityMessages as mergeAgentActivityMessages2 } from "@tutti-os/agent-activity-core";
4119
4146
  var STREAM_LINGER_MS = 15e3;
4120
4147
  var EMPTY_AGENT_SESSION_VIEW_STORE_SNAPSHOT = {
4121
4148
  sessionViewsBySessionKey: {}
@@ -4710,7 +4737,7 @@ function createEmptySessionView(ref) {
4710
4737
  };
4711
4738
  }
4712
4739
  function mergeMessages(left, right) {
4713
- return mergeAgentActivityMessages2(left, right);
4740
+ return mergeWorkspaceAgentMessages(left, right);
4714
4741
  }
4715
4742
  function sameMessages(left, right) {
4716
4743
  if (left.length !== right.length) {
@@ -4840,7 +4867,7 @@ function useWatchAgentSessions(input) {
4840
4867
  }
4841
4868
 
4842
4869
  // contexts/workspace/presentation/renderer/agentGuiConversationList/agentGuiConversationListStore.ts
4843
- import { mergeAgentActivityMessages as mergeAgentActivityMessages3 } from "@tutti-os/agent-activity-core";
4870
+ import { mergeAgentActivityMessages as mergeAgentActivityMessages2 } from "@tutti-os/agent-activity-core";
4844
4871
 
4845
4872
  // contexts/workspace/presentation/renderer/agentGuiConversationList/agentGuiConversationListPendingState.ts
4846
4873
  var pendingCreateConversationIdsByQueryKey = /* @__PURE__ */ new Map();
@@ -5244,6 +5271,7 @@ function mergeLoadedConversation(current, incoming) {
5244
5271
  const merged = {
5245
5272
  ...incoming,
5246
5273
  ...mergeLoadedConversationTitleFields(current, incoming, preferCurrent),
5274
+ ...incoming.isImported === true || current?.isImported === true ? { isImported: true } : {},
5247
5275
  hasUnreadCompletion: incoming.hasUnreadCompletion || (preferCurrent ? current?.hasUnreadCompletion : false),
5248
5276
  unreadCompletionKey: incoming.unreadCompletionKey ?? (preferCurrent ? current?.unreadCompletionKey : null),
5249
5277
  pinnedAtUnixMs,
@@ -5282,7 +5310,7 @@ function areConversationProjectsEqual(left, right) {
5282
5310
  return left.id === right.id && left.path === right.path && left.label === right.label && left.createdAtUnixMs === right.createdAtUnixMs && left.updatedAtUnixMs === right.updatedAtUnixMs && left.lastUsedAtUnixMs === right.lastUsedAtUnixMs;
5283
5311
  }
5284
5312
  function areConversationsEqual(left, right) {
5285
- return left.id === right.id && left.userId === right.userId && left.provider === right.provider && left.title === right.title && left.status === right.status && left.cwd === right.cwd && areConversationProjectsEqual(left.project, right.project) && left.sortTimeUnixMs === right.sortTimeUnixMs && left.updatedAtUnixMs === right.updatedAtUnixMs && (left.pinnedAtUnixMs ?? 0) === (right.pinnedAtUnixMs ?? 0) && left.hasUnreadCompletion === right.hasUnreadCompletion && left.unreadCompletionKey === right.unreadCompletionKey && areConversationTitleFallbacksEqual(
5313
+ return left.id === right.id && left.userId === right.userId && left.provider === right.provider && left.title === right.title && left.status === right.status && left.cwd === right.cwd && areConversationProjectsEqual(left.project, right.project) && left.sortTimeUnixMs === right.sortTimeUnixMs && left.updatedAtUnixMs === right.updatedAtUnixMs && (left.pinnedAtUnixMs ?? 0) === (right.pinnedAtUnixMs ?? 0) && left.isImported === right.isImported && left.hasUnreadCompletion === right.hasUnreadCompletion && left.unreadCompletionKey === right.unreadCompletionKey && areConversationTitleFallbacksEqual(
5286
5314
  left.titleFallback,
5287
5315
  right.titleFallback
5288
5316
  ) && areConversationSyncStatesEqual(left.syncState, right.syncState);
@@ -5365,6 +5393,9 @@ function describeConversationListChange(previous, next) {
5365
5393
  "pinnedAtUnixMs"
5366
5394
  );
5367
5395
  }
5396
+ if (left.isImported !== right.isImported) {
5397
+ addChangedConversationField(fields, changedIds, right.id, "isImported");
5398
+ }
5368
5399
  if (left.hasUnreadCompletion !== right.hasUnreadCompletion) {
5369
5400
  addChangedConversationField(
5370
5401
  fields,
@@ -5558,7 +5589,7 @@ function nonEmptySessionMessagesById(durableMessagesBySessionId, sessionViewData
5558
5589
  function mergeSessionMessagesById(left, right) {
5559
5590
  const next = { ...left };
5560
5591
  for (const [agentSessionId, messages] of Object.entries(right)) {
5561
- next[agentSessionId] = mergeAgentActivityMessages3(
5592
+ next[agentSessionId] = mergeAgentActivityMessages2(
5562
5593
  next[agentSessionId] ?? [],
5563
5594
  messages
5564
5595
  );
@@ -5637,7 +5668,7 @@ function decorateConversationForRefresh(input) {
5637
5668
  messages: input.mergedMessages
5638
5669
  });
5639
5670
  const hasUnreadCompletion = Boolean(
5640
- completionKey && !isCompletedRead(input.readState, completionKey) && !hasActiveConversationOwner(input.queryKey, input.conversation.id)
5671
+ completionKey && input.conversation.isImported !== true && !isCompletedRead(input.readState, completionKey) && !hasActiveConversationOwner(input.queryKey, input.conversation.id)
5641
5672
  );
5642
5673
  const nextConversation = {
5643
5674
  ...input.conversation,
@@ -6047,7 +6078,7 @@ function markAgentGUIConversationCompletionObserved(input) {
6047
6078
  updateCompletedReadState(queryState, completionKey);
6048
6079
  }
6049
6080
  const canShowCompletion = conversation.status === "completed" || input.allowReadyStatus === true;
6050
- const hasUnreadCompletion = canShowCompletion && shouldMarkUnread && !isCompletedRead(
6081
+ const hasUnreadCompletion = canShowCompletion && conversation.isImported !== true && shouldMarkUnread && !isCompletedRead(
6051
6082
  readStateByQueryKey.get(queryState.queryKey) ?? emptyWorkspaceAgentReadState(),
6052
6083
  completionKey
6053
6084
  );
@@ -6655,6 +6686,22 @@ var AGENT_PROVIDER_SESSION_NOT_FOUND_FALLBACK_MESSAGE = "The previous agent sess
6655
6686
  var AGENT_RESUME_SESSION_NOT_LOCAL_FALLBACK_MESSAGE = "The previous agent session is not available on this machine.";
6656
6687
  var AGENT_GUI_CAUGHT_ERROR_STACK_LIMIT = 4e3;
6657
6688
  var SELECTED_SESSION_NOT_FOUND_RETRY_DELAY_MS = 150;
6689
+ function composerDefaultsFromSettings(settings) {
6690
+ const defaults = {};
6691
+ const model = normalizeOptionalText2(settings.model);
6692
+ const permissionModeId = normalizeOptionalText2(settings.permissionModeId);
6693
+ const reasoningEffort = normalizeOptionalText2(settings.reasoningEffort);
6694
+ if (model) {
6695
+ defaults.model = model;
6696
+ }
6697
+ if (permissionModeId) {
6698
+ defaults.permissionModeId = permissionModeId;
6699
+ }
6700
+ if (reasoningEffort) {
6701
+ defaults.reasoningEffort = reasoningEffort;
6702
+ }
6703
+ return Object.keys(defaults).length > 0 ? defaults : null;
6704
+ }
6658
6705
  function reportAgentGUIRuntimeError(input) {
6659
6706
  const reportDiagnostic = input.runtime.reportDiagnostic;
6660
6707
  if (!reportDiagnostic) {
@@ -7329,7 +7376,7 @@ function conversationSummariesRenderEqual(left, right) {
7329
7376
  return left.id === right.id && left.userId === right.userId && left.provider === right.provider && left.title === right.title && conversationTitleFallbacksRenderEqual(
7330
7377
  left.titleFallback,
7331
7378
  right.titleFallback
7332
- ) && left.status === right.status && left.cwd === right.cwd && left.pinnedAtUnixMs === right.pinnedAtUnixMs && left.sortTimeUnixMs === right.sortTimeUnixMs && left.updatedAtUnixMs === right.updatedAtUnixMs && left.hasUnreadCompletion === right.hasUnreadCompletion && left.unreadCompletionKey === right.unreadCompletionKey && conversationProjectsRenderEqual(left.project, right.project) && conversationSyncStatesEqual(left.syncState, right.syncState);
7379
+ ) && left.status === right.status && left.cwd === right.cwd && left.pinnedAtUnixMs === right.pinnedAtUnixMs && left.sortTimeUnixMs === right.sortTimeUnixMs && left.updatedAtUnixMs === right.updatedAtUnixMs && left.isImported === right.isImported && left.hasUnreadCompletion === right.hasUnreadCompletion && left.unreadCompletionKey === right.unreadCompletionKey && conversationProjectsRenderEqual(left.project, right.project) && conversationSyncStatesEqual(left.syncState, right.syncState);
7333
7380
  }
7334
7381
  function conversationTitleFallbacksRenderEqual(left, right) {
7335
7382
  return left === right || JSON.stringify(left ?? null) === JSON.stringify(right ?? null);
@@ -8488,6 +8535,7 @@ function useAgentGUINodeController({
8488
8535
  prefillPromptRequest = null,
8489
8536
  previewMode = false,
8490
8537
  onDataChange,
8538
+ onRememberComposerDefaults,
8491
8539
  onShowMessage
8492
8540
  }) {
8493
8541
  const agentActivityRuntime = useAgentActivityRuntime();
@@ -8879,6 +8927,7 @@ function useAgentGUINodeController({
8879
8927
  selectedProviderTargetIsExplicitRef.current = selectedProviderTargetIsExplicit;
8880
8928
  const draftSettingsBySessionIdRef = useRef4(draftSettingsBySessionId);
8881
8929
  const onDataChangeRef = useRef4(onDataChange);
8930
+ const onRememberComposerDefaultsRef = useRef4(onRememberComposerDefaults);
8882
8931
  const onShowMessageRef = useRef4(onShowMessage);
8883
8932
  const handledPrefillPromptSequenceRef = useRef4(null);
8884
8933
  const pendingAutoSubmitPromptRef = useRef4(null);
@@ -9151,6 +9200,9 @@ function useAgentGUINodeController({
9151
9200
  useEffect4(() => {
9152
9201
  onDataChangeRef.current = onDataChange;
9153
9202
  }, [onDataChange]);
9203
+ useEffect4(() => {
9204
+ onRememberComposerDefaultsRef.current = onRememberComposerDefaults;
9205
+ }, [onRememberComposerDefaults]);
9154
9206
  useEffect4(() => {
9155
9207
  onShowMessageRef.current = onShowMessage;
9156
9208
  }, [onShowMessage]);
@@ -10591,20 +10643,30 @@ function useAgentGUINodeController({
10591
10643
  }
10592
10644
  const currentMessages = getAgentSessionView(sessionViewRef(agentSessionId))?.overlayMessages ?? [];
10593
10645
  const currentDetailMessages = getAgentSessionView(sessionViewRef(agentSessionId))?.detailMessages ?? [];
10646
+ const currentDurableDetailMessages = currentDetailMessages.filter(
10647
+ (message) => !isWorkspaceAgentActivityOptimisticMessage(message)
10648
+ );
10649
+ const detailWindowScopeMessages = currentMessages.length > 0 ? mergeWorkspaceAgentMessages(
10650
+ currentDurableDetailMessages,
10651
+ currentMessages
10652
+ ) : currentDurableDetailMessages;
10594
10653
  const durableSnapshotMessages = agentActivitySnapshot.sessionMessagesById[agentSessionId] ?? [];
10595
10654
  const detailWindowMessages = filterMessagesForDetailWindowOverlay({
10596
- detailMessages: currentDetailMessages,
10655
+ detailMessages: detailWindowScopeMessages,
10597
10656
  durableMessages: durableSnapshotMessages,
10598
10657
  localMessages: nextMessages
10599
10658
  });
10600
- const nextDetailMessages = detailWindowMessages.length > 0 ? mergeWorkspaceAgentMessages(
10601
- currentDetailMessages,
10602
- detailWindowMessages
10603
- ) : currentDetailMessages;
10604
- if (detailWindowMessages.length > 0) {
10659
+ const durableDetailWindowMessages = detailWindowMessages.filter(
10660
+ (message) => !isWorkspaceAgentActivityOptimisticMessage(message)
10661
+ );
10662
+ const nextDetailMessages = durableDetailWindowMessages.length > 0 ? mergeWorkspaceAgentMessages(
10663
+ currentDurableDetailMessages,
10664
+ durableDetailWindowMessages
10665
+ ) : currentDurableDetailMessages;
10666
+ if (durableDetailWindowMessages.length > 0) {
10605
10667
  mergeAgentSessionViewDetailMessages(
10606
10668
  sessionViewRef(agentSessionId),
10607
- detailWindowMessages
10669
+ durableDetailWindowMessages
10608
10670
  );
10609
10671
  }
10610
10672
  const durableMessages = nextDetailMessages.length > 0 ? nextDetailMessages : durableSnapshotMessages;
@@ -11132,9 +11194,6 @@ function useAgentGUINodeController({
11132
11194
  content: [...normalizedInitialContent],
11133
11195
  occurredAtUnixMs: createdAtUnixMs
11134
11196
  });
11135
- mergeAgentSessionViewDetailMessages(sessionViewRef(agentSessionId), [
11136
- optimisticPromptMessage
11137
- ]);
11138
11197
  mergeAgentSessionViewOverlayMessages(sessionViewRef(agentSessionId), [
11139
11198
  optimisticPromptMessage
11140
11199
  ]);
@@ -12370,17 +12429,7 @@ function useAgentGUINodeController({
12370
12429
  }, []);
12371
12430
  const flushQueuedComposerSettingsUpdate = useCallback4(
12372
12431
  (input) => {
12373
- const { agentSessionId, nextNodeDefaults, sessionSettingsPatch } = input;
12374
- const persistNodeDefaults = () => {
12375
- const defaultDraftKey = nodeDefaultDraftKey(dataRef.current.provider);
12376
- setDraftSettingsBySessionId((current) => ({
12377
- ...current,
12378
- [defaultDraftKey]: nextNodeDefaults
12379
- }));
12380
- onDataChangeRef.current(
12381
- (current) => nodeDataFromComposerSettings(current, nextNodeDefaults)
12382
- );
12383
- };
12432
+ const { agentSessionId, sessionSettingsPatch } = input;
12384
12433
  void agentActivityRuntime.updateSessionSettings({
12385
12434
  workspaceId,
12386
12435
  agentSessionId,
@@ -12409,7 +12458,6 @@ function useAgentGUINodeController({
12409
12458
  } : existing
12410
12459
  );
12411
12460
  if (queuedUpdate === null) {
12412
- persistNodeDefaults();
12413
12461
  if (sessionSettingsPatch.model !== void 0 && dataRef.current.provider === "claude-code") {
12414
12462
  void loadSessionState(agentSessionId, {
12415
12463
  source: "settings-update",
@@ -12444,8 +12492,7 @@ function useAgentGUINodeController({
12444
12492
  delete queuedComposerSettingsUpdatesRef.current[agentSessionId];
12445
12493
  flushQueuedComposerSettingsUpdate({
12446
12494
  agentSessionId,
12447
- sessionSettingsPatch: queuedUpdate.sessionSettingsPatch,
12448
- nextNodeDefaults: queuedUpdate.nextNodeDefaults
12495
+ sessionSettingsPatch: queuedUpdate.sessionSettingsPatch
12449
12496
  });
12450
12497
  return;
12451
12498
  }
@@ -12495,6 +12542,10 @@ function useAgentGUINodeController({
12495
12542
  onDataChangeRef.current(
12496
12543
  (current) => nodeDataFromComposerSettings(current, merged)
12497
12544
  );
12545
+ void onRememberComposerDefaultsRef.current?.({
12546
+ provider: dataRef.current.provider,
12547
+ defaults: composerDefaultsFromSettings(merged)
12548
+ });
12498
12549
  void agentActivityRuntime.trackDraftComposerSettingsChange?.({
12499
12550
  workspaceId,
12500
12551
  provider: dataRef.current.provider,
@@ -12510,43 +12561,7 @@ function useAgentGUINodeController({
12510
12561
  const sessionSettings2 = cloneComposerSettings(
12511
12562
  activeSessionState2?.settings ?? null
12512
12563
  );
12513
- const currentDefaults = readNodeDefaultDraftSettings({
12514
- data: dataRef.current,
12515
- defaultReasoningEffort,
12516
- drafts: draftSettingsBySessionIdRef.current
12517
- });
12518
- const baseDefaultsFromSession = {
12519
- ...currentDefaults,
12520
- model: sessionSettings2?.model ?? currentDefaults.model,
12521
- reasoningEffort: sessionSettings2?.reasoningEffort ?? currentDefaults.reasoningEffort,
12522
- speed: sessionSettings2?.speed ?? currentDefaults.speed,
12523
- planMode: sessionSettings2?.planMode ?? currentDefaults.planMode,
12524
- browserUse: sessionSettings2?.browserUse ?? currentDefaults.browserUse,
12525
- computerUse: sessionSettings2?.computerUse ?? currentDefaults.computerUse,
12526
- permissionModeId: sessionSettings2?.permissionModeId ?? currentDefaults.permissionModeId
12527
- };
12528
- const nextNodeDefaults = {
12529
- ...baseDefaultsFromSession,
12530
- model: supportedNextSettings.model !== void 0 ? supportedNextSettings.model : baseDefaultsFromSession.model,
12531
- reasoningEffort: supportedNextSettings.reasoningEffort !== void 0 ? supportedNextSettings.reasoningEffort : baseDefaultsFromSession.reasoningEffort,
12532
- speed: supportedNextSettings.speed !== void 0 ? supportedNextSettings.speed : baseDefaultsFromSession.speed,
12533
- planMode: supportedNextSettings.planMode ?? baseDefaultsFromSession.planMode,
12534
- browserUse: supportedNextSettings.browserUse ?? baseDefaultsFromSession.browserUse,
12535
- permissionModeId: supportedNextSettings.permissionModeId !== void 0 ? supportedNextSettings.permissionModeId : baseDefaultsFromSession.permissionModeId
12536
- };
12537
- const persistNodeDefaults = () => {
12538
- const defaultDraftKey = nodeDefaultDraftKey(dataRef.current.provider);
12539
- setDraftSettingsBySessionId((current) => ({
12540
- ...current,
12541
- [defaultDraftKey]: nextNodeDefaults
12542
- }));
12543
- onDataChangeRef.current(
12544
- (current) => nodeDataFromComposerSettings(current, nextNodeDefaults)
12545
- );
12546
- };
12547
- const nextPermission = normalizeOptionalText2(
12548
- nextSettings.permissionModeId ?? sessionSettings2?.permissionModeId ?? currentDefaults.permissionModeId
12549
- );
12564
+ const nextPermission = supportedNextSettings.permissionModeId !== void 0 ? normalizeOptionalText2(supportedNextSettings.permissionModeId) : void 0;
12550
12565
  const currentPermission = normalizeOptionalText2(
12551
12566
  sessionSettings2?.permissionModeId
12552
12567
  );
@@ -12581,11 +12596,10 @@ function useAgentGUINodeController({
12581
12596
  if (nextComputerUse !== void 0 && nextComputerUse !== currentComputerUse) {
12582
12597
  sessionSettingsPatch.computerUse = nextComputerUse;
12583
12598
  }
12584
- if (nextPermission && nextPermission !== currentPermission && activeSessionState2 !== null) {
12599
+ if (nextPermission !== void 0 && nextPermission && nextPermission !== currentPermission && activeSessionState2 !== null) {
12585
12600
  sessionSettingsPatch.permissionModeId = normalizePermissionModeId(nextPermission);
12586
12601
  }
12587
12602
  if (Object.keys(sessionSettingsPatch).length > 0 && activeSessionState2 !== null) {
12588
- persistNodeDefaults();
12589
12603
  updateAgentSessionViewControlState(
12590
12604
  sessionViewRef(agentSessionId),
12591
12605
  (existing) => existing ? {
@@ -12608,20 +12622,17 @@ function useAgentGUINodeController({
12608
12622
  sessionSettingsPatch: {
12609
12623
  ...queuedUpdate?.sessionSettingsPatch ?? {},
12610
12624
  ...sessionSettingsPatch
12611
- },
12612
- nextNodeDefaults
12625
+ }
12613
12626
  };
12614
12627
  } else {
12615
12628
  markSessionSettingsRequestState(agentSessionId, true);
12616
12629
  flushQueuedComposerSettingsUpdate({
12617
12630
  agentSessionId,
12618
- sessionSettingsPatch,
12619
- nextNodeDefaults
12631
+ sessionSettingsPatch
12620
12632
  });
12621
12633
  }
12622
12634
  return;
12623
12635
  }
12624
- persistNodeDefaults();
12625
12636
  },
12626
12637
  [
12627
12638
  defaultReasoningEffort,
@@ -16438,9 +16449,7 @@ function AgentQueuedPromptPanel({
16438
16449
  }
16439
16450
  const measure = () => {
16440
16451
  const viewportCap = typeof window === "undefined" ? 280 : Math.round(window.innerHeight * 0.38);
16441
- setExpandedListMaxHeightPx(
16442
- Math.max(32, Math.min(280, viewportCap, element.scrollHeight))
16443
- );
16452
+ setExpandedListMaxHeightPx(Math.max(32, Math.min(280, viewportCap)));
16444
16453
  };
16445
16454
  measure();
16446
16455
  const resizeObserver = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(measure);
@@ -21192,7 +21201,7 @@ function AgentComposer({
21192
21201
  className: cn(
21193
21202
  AgentGUINode_styles_default.composerMenuTrigger,
21194
21203
  AgentGUINode_styles_default.composerReferenceTrigger,
21195
- "w-auto justify-center px-1 text-[var(--agent-gui-text-secondary)] [&_svg]:shrink-0"
21204
+ "w-auto justify-center text-[var(--agent-gui-text-secondary)] [&_svg]:shrink-0"
21196
21205
  ),
21197
21206
  children: /* @__PURE__ */ jsx27(
21198
21207
  AddIcon,
@@ -21228,7 +21237,7 @@ function AgentComposer({
21228
21237
  className: cn(
21229
21238
  AgentGUINode_styles_default.composerMenuTrigger,
21230
21239
  AgentGUINode_styles_default.composerReferenceTrigger,
21231
- "w-auto justify-center px-1 text-[var(--agent-gui-text-secondary)] [&>svg:last-child]:hidden [&_svg]:shrink-0"
21240
+ "w-auto justify-center text-[var(--agent-gui-text-secondary)] [&>svg:last-child]:hidden [&_svg]:shrink-0"
21232
21241
  ),
21233
21242
  children: /* @__PURE__ */ jsx27(
21234
21243
  AddIcon,
@@ -21470,13 +21479,14 @@ function AgentComposerDraftImagePreview({
21470
21479
  "data-upload-error": image.uploadError ? "true" : void 0,
21471
21480
  style: previewStyle,
21472
21481
  children: [
21473
- /* @__PURE__ */ jsx27(ConversationImageContextMenu, { src: image.previewUrl, children: /* @__PURE__ */ jsx27(
21482
+ /* @__PURE__ */ jsx27(
21474
21483
  ZoomableImage,
21475
21484
  {
21476
21485
  src: image.previewUrl,
21477
21486
  alt: image.name,
21478
21487
  className: "size-full object-contain",
21479
21488
  draggable: false,
21489
+ downloadName: image.name || "image.png",
21480
21490
  onLoad: (event) => {
21481
21491
  const element = event.currentTarget;
21482
21492
  const width = element.naturalWidth;
@@ -21491,7 +21501,7 @@ function AgentComposerDraftImagePreview({
21491
21501
  setAspectRatio(nextRatio);
21492
21502
  }
21493
21503
  }
21494
- ) }),
21504
+ ),
21495
21505
  image.uploading ? /* @__PURE__ */ jsx27(
21496
21506
  "div",
21497
21507
  {
@@ -23911,7 +23921,7 @@ function stabilizeConversationSectionItems(previous, next) {
23911
23921
  return changed ? stable : previous;
23912
23922
  }
23913
23923
  function conversationSummariesRenderEqual2(left, right) {
23914
- return left.id === right.id && left.provider === right.provider && left.title === right.title && left.titleFallback === right.titleFallback && left.status === right.status && left.cwd === right.cwd && left.pinnedAtUnixMs === right.pinnedAtUnixMs && left.sortTimeUnixMs === right.sortTimeUnixMs && left.updatedAtUnixMs === right.updatedAtUnixMs && left.hasUnreadCompletion === right.hasUnreadCompletion && left.unreadCompletionKey === right.unreadCompletionKey && conversationProjectsRenderEqual2(left.project, right.project) && conversationSyncStatesRenderEqual(left.syncState, right.syncState);
23924
+ return left.id === right.id && left.provider === right.provider && left.title === right.title && left.titleFallback === right.titleFallback && left.status === right.status && left.cwd === right.cwd && left.pinnedAtUnixMs === right.pinnedAtUnixMs && left.sortTimeUnixMs === right.sortTimeUnixMs && left.updatedAtUnixMs === right.updatedAtUnixMs && left.isImported === right.isImported && left.hasUnreadCompletion === right.hasUnreadCompletion && left.unreadCompletionKey === right.unreadCompletionKey && conversationProjectsRenderEqual2(left.project, right.project) && conversationSyncStatesRenderEqual(left.syncState, right.syncState);
23915
23925
  }
23916
23926
  function conversationSyncStatesRenderEqual(left, right) {
23917
23927
  return left === right || (!left || !right ? (left ?? null) === (right ?? null) : left.workspaceId === right.workspaceId && left.agentSessionId === right.agentSessionId && left.status === right.status && left.pendingTimelineItemCount === right.pendingTimelineItemCount && left.pendingStatePatchCount === right.pendingStatePatchCount && left.attemptCount === right.attemptCount && left.failedReportCount === right.failedReportCount && left.lastError === right.lastError && left.lastAttemptAtUnixMs === right.lastAttemptAtUnixMs && left.lastSyncedAtUnixMs === right.lastSyncedAtUnixMs && left.updatedAtUnixMs === right.updatedAtUnixMs);
@@ -25517,7 +25527,7 @@ function composerOverridesByProviderEqual(left, right) {
25517
25527
  return true;
25518
25528
  }
25519
25529
  function areAgentGUINodePropsEqual(previous, next) {
25520
- return previous.nodeId === next.nodeId && previous.workspaceId === next.workspaceId && previous.currentUserId === next.currentUserId && previous.workspacePath === next.workspacePath && previous.workspaceFileReferenceAdapter === next.workspaceFileReferenceAdapter && previous.selectProjectDirectory === next.selectProjectDirectory && previous.referenceSourceAggregator === next.referenceSourceAggregator && previous.resolveMentionReferenceTarget === next.resolveMentionReferenceTarget && previous.resolveWorkspaceReferenceInitialTarget === next.resolveWorkspaceReferenceInitialTarget && previous.onWorkspaceFileReferencesAdded === next.onWorkspaceFileReferencesAdded && previous.agentSettings.avoidGroupingEdits === next.agentSettings.avoidGroupingEdits && previous.title === next.title && agentGuiStateEquals(previous.state, next.state) && previous.position.x === next.position.x && previous.position.y === next.position.y && previous.width === next.width && previous.height === next.height && previous.desktopSize.width === next.desktopSize.width && previous.desktopSize.height === next.desktopSize.height && previous.onLinkAction === next.onLinkAction && previous.onCapabilitySettingsRequest === next.onCapabilitySettingsRequest && previous.onAgentProviderLogin === next.onAgentProviderLogin && previous.providerTargets === next.providerTargets && previous.defaultProviderTargetId === next.defaultProviderTargetId && previous.onClose === next.onClose && previous.onResize === next.onResize && previous.onUpdateNode === next.onUpdateNode && previous.onOpenConversationWindow === next.onOpenConversationWindow && previous.isMaximized === next.isMaximized && previous.isMuted === next.isMuted && previous.onMinimize === next.onMinimize && previous.onToggleMaximize === next.onToggleMaximize && previous.onShowMessage === next.onShowMessage && workspaceAgentProbeRenderStateEqualsForProvider(
25530
+ return previous.nodeId === next.nodeId && previous.workspaceId === next.workspaceId && previous.currentUserId === next.currentUserId && previous.workspacePath === next.workspacePath && previous.workspaceFileReferenceAdapter === next.workspaceFileReferenceAdapter && previous.selectProjectDirectory === next.selectProjectDirectory && previous.referenceSourceAggregator === next.referenceSourceAggregator && previous.resolveMentionReferenceTarget === next.resolveMentionReferenceTarget && previous.resolveWorkspaceReferenceInitialTarget === next.resolveWorkspaceReferenceInitialTarget && previous.onWorkspaceFileReferencesAdded === next.onWorkspaceFileReferencesAdded && previous.agentSettings.avoidGroupingEdits === next.agentSettings.avoidGroupingEdits && previous.title === next.title && agentGuiStateEquals(previous.state, next.state) && previous.position.x === next.position.x && previous.position.y === next.position.y && previous.width === next.width && previous.height === next.height && previous.desktopSize.width === next.desktopSize.width && previous.desktopSize.height === next.desktopSize.height && previous.onLinkAction === next.onLinkAction && previous.onCapabilitySettingsRequest === next.onCapabilitySettingsRequest && previous.onAgentProviderLogin === next.onAgentProviderLogin && previous.providerTargets === next.providerTargets && previous.defaultProviderTargetId === next.defaultProviderTargetId && previous.onClose === next.onClose && previous.onResize === next.onResize && previous.onUpdateNode === next.onUpdateNode && previous.onRememberComposerDefaults === next.onRememberComposerDefaults && previous.onOpenConversationWindow === next.onOpenConversationWindow && previous.isMaximized === next.isMaximized && previous.isMuted === next.isMuted && previous.onMinimize === next.onMinimize && previous.onToggleMaximize === next.onToggleMaximize && previous.onShowMessage === next.onShowMessage && workspaceAgentProbeRenderStateEqualsForProvider(
25521
25531
  previous.workspaceAgentProbes,
25522
25532
  next.workspaceAgentProbes,
25523
25533
  previous.state.provider
@@ -25552,6 +25562,7 @@ var AgentGUINode = memo2(function AgentGUINode2({
25552
25562
  onClose,
25553
25563
  onResize,
25554
25564
  onUpdateNode,
25565
+ onRememberComposerDefaults,
25555
25566
  isMaximized = false,
25556
25567
  isActive,
25557
25568
  composerFocusRequestSequence = null,
@@ -25707,8 +25718,31 @@ var AgentGUINode = memo2(function AgentGUINode2({
25707
25718
  defaultProviderTargetId,
25708
25719
  previewMode,
25709
25720
  onDataChange: handleDataChange,
25721
+ onRememberComposerDefaults,
25710
25722
  onShowMessage
25711
25723
  });
25724
+ const handleCreateConversation = useCallback13(
25725
+ (...args) => {
25726
+ if (!previewMode) {
25727
+ onUpdateNode(
25728
+ (current) => current.lastActiveAgentSessionId === null && (current.lastActiveConversationTitle ?? null) === null ? current : {
25729
+ ...current,
25730
+ lastActiveAgentSessionId: null,
25731
+ lastActiveConversationTitle: null
25732
+ }
25733
+ );
25734
+ }
25735
+ actions.createConversation(...args);
25736
+ },
25737
+ [actions, onUpdateNode, previewMode]
25738
+ );
25739
+ const viewActions = useMemo11(
25740
+ () => ({
25741
+ ...actions,
25742
+ createConversation: handleCreateConversation
25743
+ }),
25744
+ [actions, handleCreateConversation]
25745
+ );
25712
25746
  const fallbackAgentTitle = t("sidebar.fallbackAgentLabel");
25713
25747
  const activeProvider = viewModel.activeConversation?.provider ?? state.provider;
25714
25748
  const selectedProviderTargetLabel = viewModel.selectedProviderTarget?.label ?? resolveAgentGUIProviderDisplayLabel(state.provider, fallbackAgentTitle);
@@ -26289,7 +26323,7 @@ var AgentGUINode = memo2(function AgentGUINode2({
26289
26323
  AgentGUINodeView,
26290
26324
  {
26291
26325
  viewModel,
26292
- actions,
26326
+ actions: viewActions,
26293
26327
  isActive,
26294
26328
  composerFocusRequestSequence,
26295
26329
  newConversationRequestSequence,