@vibesdotdev/chat 1.0.0-rc.1 → 1.0.0-rc.7

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 (154) hide show
  1. package/dist/chat.plugin.d.ts.map +1 -1
  2. package/dist/chat.plugin.js +4 -4
  3. package/dist/chat.plugin.js.map +1 -1
  4. package/dist/client/runtime-client.d.ts.map +1 -1
  5. package/dist/client/runtime-client.js +10 -2
  6. package/dist/client/runtime-client.js.map +1 -1
  7. package/dist/docs/chat.sessions.docs.descriptor.js +2 -2
  8. package/dist/schemas/session-report.d.ts.map +1 -1
  9. package/dist/schemas/session-report.js +10 -9
  10. package/dist/schemas/session-report.js.map +1 -1
  11. package/dist/storage/chat-rooms.storage.d.ts +3 -3
  12. package/dist/storage/chat-rooms.storage.descriptor.d.ts.map +1 -1
  13. package/dist/storage/chat-rooms.storage.descriptor.js +13 -5
  14. package/dist/storage/chat-rooms.storage.descriptor.js.map +1 -1
  15. package/dist/storage/chat-rooms.storage.js +3 -3
  16. package/dist/svelte/ai/ImageGenerationDialog.svelte.d.ts.map +1 -1
  17. package/dist/svelte/augmentations/AddAgentsDialog.svelte.d.ts.map +1 -1
  18. package/dist/svelte/augmentations/ManageAgentsDialog.svelte.d.ts.map +1 -1
  19. package/dist/svelte/augmentations/agent.composer.svelte.d.ts.map +1 -1
  20. package/dist/svelte/augmentations/compaction.composer.svelte.d.ts.map +1 -1
  21. package/dist/svelte/augmentations/folders.composer.svelte.d.ts.map +1 -1
  22. package/dist/svelte/augmentations/models.composer.svelte.d.ts.map +1 -1
  23. package/dist/svelte/augmentations/modes.composer.svelte.d.ts.map +1 -1
  24. package/dist/svelte/augmentations/permissions.composer.svelte.d.ts.map +1 -1
  25. package/dist/svelte/augmentations/response-length.composer.svelte.d.ts.map +1 -1
  26. package/dist/svelte/augmentations/visibility.composer.svelte.d.ts.map +1 -1
  27. package/dist/svelte/augmentations/workspaces.composer.svelte.d.ts.map +1 -1
  28. package/dist/svelte/chat-runtime-plugins.browser.d.ts +16 -0
  29. package/dist/svelte/chat-runtime-plugins.browser.d.ts.map +1 -0
  30. package/dist/svelte/chat-runtime-plugins.browser.js +15 -0
  31. package/dist/svelte/chat-svelte.vessel.plugin.d.ts +12 -8
  32. package/dist/svelte/chat-svelte.vessel.plugin.d.ts.map +1 -1
  33. package/dist/svelte/chat-svelte.vessel.plugin.js +3 -0
  34. package/dist/svelte/command-palette/chat-source.plugin.d.ts +1 -1
  35. package/dist/svelte/components/ChatBackgroundPanel.svelte.d.ts.map +1 -1
  36. package/dist/svelte/components/ChatExperienceHost.svelte.d.ts.map +1 -1
  37. package/dist/svelte/components/ChatFolderTreeView.svelte.d.ts.map +1 -1
  38. package/dist/svelte/components/ChatLayout.svelte.d.ts.map +1 -1
  39. package/dist/svelte/components/ChatLoader.svelte.d.ts.map +1 -1
  40. package/dist/svelte/components/ChatMessage.svelte.d.ts.map +1 -1
  41. package/dist/svelte/components/ChatMessageAttachments.svelte.d.ts.map +1 -1
  42. package/dist/svelte/components/ChatMessageBubble.svelte.d.ts.map +1 -1
  43. package/dist/svelte/components/ChatMessageContent.svelte.d.ts.map +1 -1
  44. package/dist/svelte/components/ChatMessageReactions.svelte.d.ts.map +1 -1
  45. package/dist/svelte/components/ChatMessageSkeleton.svelte.d.ts.map +1 -1
  46. package/dist/svelte/components/ChatMessageStatusBadge.svelte.d.ts.map +1 -1
  47. package/dist/svelte/components/ChatMessageTimestamp.svelte.d.ts.map +1 -1
  48. package/dist/svelte/components/ChatMessageToolCalls.svelte.d.ts.map +1 -1
  49. package/dist/svelte/components/ChatModeSelector.svelte.d.ts.map +1 -1
  50. package/dist/svelte/components/ChatResponseStopButton.svelte.d.ts.map +1 -1
  51. package/dist/svelte/components/ChatRoom.svelte.d.ts.map +1 -1
  52. package/dist/svelte/components/ChatSessionStatus.svelte.d.ts.map +1 -1
  53. package/dist/svelte/components/ChatToolCallRenderer.svelte.d.ts.map +1 -1
  54. package/dist/svelte/components/ChatWorkspace.svelte.d.ts.map +1 -1
  55. package/dist/svelte/components/ChatWorkspaceContent.svelte +1 -0
  56. package/dist/svelte/components/ChatWorkspaceContent.svelte.d.ts.map +1 -1
  57. package/dist/svelte/components/ImageGenerationToolCard.svelte.d.ts.map +1 -1
  58. package/dist/svelte/components/InboxMixedFeed.svelte.d.ts.map +1 -1
  59. package/dist/svelte/components/InboxSourceConversation.svelte.d.ts.map +1 -1
  60. package/dist/svelte/components/MissingToolCard.svelte.d.ts.map +1 -1
  61. package/dist/svelte/components/ParticipantUserList.svelte.d.ts.map +1 -1
  62. package/dist/svelte/components/RoomStageChatInterface.svelte.d.ts.map +1 -1
  63. package/dist/svelte/components/conversations/ConversationNodes.svelte +36 -17
  64. package/dist/svelte/components/conversations/ConversationNodes.svelte.d.ts +2 -0
  65. package/dist/svelte/components/conversations/ConversationNodes.svelte.d.ts.map +1 -1
  66. package/dist/svelte/components/conversations/ConversationsTree.svelte +127 -0
  67. package/dist/svelte/components/conversations/ConversationsTree.svelte.d.ts.map +1 -1
  68. package/dist/svelte/components/conversations/CreateFolderDialog.svelte.d.ts.map +1 -1
  69. package/dist/svelte/components/index.d.ts +2 -0
  70. package/dist/svelte/components/index.d.ts.map +1 -1
  71. package/dist/svelte/components/index.js +2 -0
  72. package/dist/svelte/components/indicators/ChatConnectionStatus.svelte.d.ts.map +1 -1
  73. package/dist/svelte/components/indicators/NextStepSkeleton.svelte.d.ts.map +1 -1
  74. package/dist/svelte/components/indicators/StreamingIndicator.svelte.d.ts.map +1 -1
  75. package/dist/svelte/components/indicators/TypingIndicator.svelte.d.ts.map +1 -1
  76. package/dist/svelte/components/runtime/MessageSegments.svelte.d.ts.map +1 -1
  77. package/dist/svelte/components/runtime/RuntimeChatActionBar.svelte.d.ts.map +1 -1
  78. package/dist/svelte/components/runtime/RuntimeChatAttachments.svelte.d.ts.map +1 -1
  79. package/dist/svelte/components/runtime/RuntimeChatCommandMenu.svelte.d.ts +1 -1
  80. package/dist/svelte/components/runtime/RuntimeChatCommandMenu.svelte.d.ts.map +1 -1
  81. package/dist/svelte/components/runtime/RuntimeChatComposer.svelte.d.ts.map +1 -1
  82. package/dist/svelte/components/runtime/RuntimeChatDialogHost.svelte.d.ts.map +1 -1
  83. package/dist/svelte/components/runtime/RuntimeChatInput.svelte.d.ts.map +1 -1
  84. package/dist/svelte/components/runtime/RuntimeChatMessageRow.svelte +97 -9
  85. package/dist/svelte/components/runtime/RuntimeChatMessageRow.svelte.d.ts +4 -0
  86. package/dist/svelte/components/runtime/RuntimeChatMessageRow.svelte.d.ts.map +1 -1
  87. package/dist/svelte/components/runtime/RuntimeChatMessages.svelte +34 -3
  88. package/dist/svelte/components/runtime/RuntimeChatMessages.svelte.d.ts +4 -0
  89. package/dist/svelte/components/runtime/RuntimeChatMessages.svelte.d.ts.map +1 -1
  90. package/dist/svelte/components/runtime/RuntimeChatModeControl.svelte.d.ts.map +1 -1
  91. package/dist/svelte/components/runtime/RuntimeChatPermissionControl.svelte.d.ts.map +1 -1
  92. package/dist/svelte/components/surface/ChatApprovalBar.svelte.d.ts.map +1 -1
  93. package/dist/svelte/components/surface/ChatComposerAugmentBar.svelte.d.ts.map +1 -1
  94. package/dist/svelte/components/surface/ChatComposerPanel.svelte.d.ts.map +1 -1
  95. package/dist/svelte/components/surface/ChatConversationPane.svelte +18 -1
  96. package/dist/svelte/components/surface/ChatConversationPane.svelte.d.ts +5 -0
  97. package/dist/svelte/components/surface/ChatConversationPane.svelte.d.ts.map +1 -1
  98. package/dist/svelte/components/surface/ChatConversationSidebar.svelte +66 -24
  99. package/dist/svelte/components/surface/ChatConversationSidebar.svelte.d.ts.map +1 -1
  100. package/dist/svelte/components/surface/ChatConversationSplit.svelte.d.ts.map +1 -1
  101. package/dist/svelte/components/surface/ChatMessageViewport.svelte +12 -2
  102. package/dist/svelte/components/surface/ChatMessageViewport.svelte.d.ts +5 -0
  103. package/dist/svelte/components/surface/ChatMessageViewport.svelte.d.ts.map +1 -1
  104. package/dist/svelte/components/surface/ChatNewConversationEmptyState.svelte.d.ts.map +1 -1
  105. package/dist/svelte/components/surface/ChatParticipantsPanel.svelte.d.ts.map +1 -1
  106. package/dist/svelte/components/surface/ChatRoomHeader.svelte.d.ts.map +1 -1
  107. package/dist/svelte/components/surface/ChatRuntimeLoader.svelte.d.ts.map +1 -1
  108. package/dist/svelte/components/surface/ChatSurfaceBoundary.svelte.d.ts.map +1 -1
  109. package/dist/svelte/components/surface/ChatSurfaceFrame.svelte.d.ts.map +1 -1
  110. package/dist/svelte/components/surface/ChatSurfaceSkeleton.svelte.d.ts.map +1 -1
  111. package/dist/svelte/components/surface/ChatWorkspaceFrame.svelte.d.ts.map +1 -1
  112. package/dist/svelte/components/surface/ChatWorkspaceFrameContent.svelte.d.ts.map +1 -1
  113. package/dist/svelte/components/utils/retry-content.d.ts +25 -0
  114. package/dist/svelte/components/utils/retry-content.d.ts.map +1 -0
  115. package/dist/svelte/components/utils/retry-content.js +21 -0
  116. package/dist/svelte/context/components/ContextBuilder.svelte.d.ts.map +1 -1
  117. package/dist/svelte/context/components/ContextBuilderProviderActions.svelte.d.ts.map +1 -1
  118. package/dist/svelte/context/components/ContextBuilderProviderStatus.svelte.d.ts.map +1 -1
  119. package/dist/svelte/messenger/MessengerConversationTitle.svelte.d.ts.map +1 -1
  120. package/dist/svelte/messenger/MessengerPanel.svelte.d.ts.map +1 -1
  121. package/dist/svelte/messenger/MessengerToggle.svelte +51 -53
  122. package/dist/svelte/messenger/MessengerToggle.svelte.d.ts.map +1 -1
  123. package/dist/svelte/messenger/MessengerWidget.svelte.d.ts.map +1 -1
  124. package/dist/svelte/messenger/messenger-store.svelte.d.ts +1 -1
  125. package/dist/svelte/runtime.d.ts +2 -0
  126. package/dist/svelte/runtime.d.ts.map +1 -1
  127. package/dist/svelte/runtime.js +22 -8
  128. package/dist/svelte/state.svelte.d.ts +53 -53
  129. package/dist/svelte/state.svelte.d.ts.map +1 -1
  130. package/dist/svelte/state.svelte.js +1 -7
  131. package/dist/svelte/stores/chatMessagesStore.svelte.d.ts +7 -7
  132. package/dist/svelte/stores/chatParticipantsStore.svelte.d.ts +2 -2
  133. package/dist/svelte/stores/chatRoomStore.svelte.d.ts +8 -8
  134. package/dist/svelte/stores/chatSessionStore.svelte.d.ts +7 -7
  135. package/dist/svelte/stores/chatStore.svelte.d.ts +1 -1
  136. package/dist/svelte/stores/index.d.ts +1 -0
  137. package/dist/svelte/stores/index.d.ts.map +1 -1
  138. package/dist/svelte/stores/index.js +1 -0
  139. package/dist/svelte/stores/interfaceTypeStore.svelte.d.ts +1 -1
  140. package/dist/svelte/surface-context.d.ts.map +1 -1
  141. package/dist/svelte/surface-context.js +11 -4
  142. package/dist/svelte/tool-widgets/ChatMessageToolCard.svelte.d.ts.map +1 -1
  143. package/dist/svelte/tool-widgets/ChatRoomToolCard.svelte.d.ts.map +1 -1
  144. package/dist/svelte/tool-widgets/ChatSessionReportToolCard.svelte.d.ts.map +1 -1
  145. package/dist/svelte/tools/ManageRoomToolsDialog.svelte.d.ts.map +1 -1
  146. package/dist/svelte/ui/ChatMessagesAction.svelte.d.ts.map +1 -1
  147. package/dist/svelte/ui/ChatMessagesBadge.svelte.d.ts.map +1 -1
  148. package/dist/svelte/ui/ChatMessagesForm.svelte.d.ts.map +1 -1
  149. package/dist/tools/chat-room/schemas.js +6 -6
  150. package/dist/tools/chat-room/schemas.js.map +1 -1
  151. package/dist/tools/session-report/session-report.tool.descriptor.d.ts.map +1 -1
  152. package/dist/tools/session-report/session-report.tool.descriptor.js +5 -4
  153. package/dist/tools/session-report/session-report.tool.descriptor.js.map +1 -1
  154. package/package.json +69 -36
@@ -6,6 +6,8 @@
6
6
  import ChatMessageToolCalls from '../ChatMessageToolCalls.svelte';
7
7
  import { Button } from '@vibesdotdev/kit/components/ui/button';
8
8
  import { Icon } from '@vibesdotdev/kit/components/icon';
9
+ import * as ContextMenu from '@vibesdotdev/kit/components/ui/context-menu';
10
+ import type { ContextMenuAction } from '@vibesdotdev/kit/components/ui/context-menu';
9
11
 
10
12
  import ChatMessageContent from '../ChatMessageContent.svelte';
11
13
  import ChatMessageStatusBadge from '../ChatMessageStatusBadge.svelte';
@@ -25,7 +27,9 @@
25
27
  message,
26
28
  currentUserId = null,
27
29
  onEdit,
28
- onReact
30
+ onReact,
31
+ onRetry,
32
+ onDismiss
29
33
  }: {
30
34
  message: ChatMessage;
31
35
  /** Viewer id — enables the Edit control on the viewer's own user messages. */
@@ -38,6 +42,10 @@
38
42
  * counts a room already has stay visible even before interaction is wired.
39
43
  */
40
44
  onReact?: (messageId: string, type: 'up' | 'down') => void;
45
+ /** Wired by the surface to retry the user turn behind a failed reply. */
46
+ onRetry?: (messageId: string) => void;
47
+ /** Wired by the surface to remove a failed reply from the transcript. */
48
+ onDismiss?: (messageId: string) => void;
41
49
  } = $props();
42
50
 
43
51
  function initials(label: string) {
@@ -105,6 +113,72 @@
105
113
  const canEdit = $derived(
106
114
  message.senderType === 'user' && !!onEdit && !!currentUserId && message.userId === currentUserId
107
115
  );
116
+ const failedTurn = $derived(
117
+ message.senderType === 'agent' && (message.status === 'failed' || failureNotice !== null)
118
+ );
119
+
120
+ async function copyMessage(): Promise<void> {
121
+ await navigator.clipboard.writeText(message.content ?? '');
122
+ }
123
+
124
+ const messageMenuActions = $derived.by<ContextMenuAction[]>(() => {
125
+ const actions: ContextMenuAction[] = [];
126
+ if (message.content?.trim()) {
127
+ actions.push({
128
+ id: 'copy-message',
129
+ label: 'Copy message',
130
+ icon: 'lucide:copy',
131
+ group: 'Copy',
132
+ run: copyMessage
133
+ });
134
+ }
135
+ if (canEdit) {
136
+ actions.push({
137
+ id: 'edit-message',
138
+ label: 'Edit message',
139
+ icon: 'lucide:pencil',
140
+ group: 'Edit',
141
+ run: () => onEdit?.(message.id)
142
+ });
143
+ }
144
+ if (onReact) {
145
+ actions.push(
146
+ {
147
+ id: 'react-up',
148
+ label: 'Thumbs up',
149
+ icon: 'lucide:thumbs-up',
150
+ group: 'React',
151
+ run: () => onReact?.(message.id, 'up')
152
+ },
153
+ {
154
+ id: 'react-down',
155
+ label: 'Thumbs down',
156
+ icon: 'lucide:thumbs-down',
157
+ group: 'React',
158
+ run: () => onReact?.(message.id, 'down')
159
+ }
160
+ );
161
+ }
162
+ if (failedTurn && onRetry) {
163
+ actions.push({
164
+ id: 'retry-response',
165
+ label: 'Retry response',
166
+ icon: 'lucide:refresh-cw',
167
+ group: 'Failed turn',
168
+ run: () => onRetry?.(message.id)
169
+ });
170
+ }
171
+ if (failedTurn && onDismiss) {
172
+ actions.push({
173
+ id: 'dismiss-failed-reply',
174
+ label: 'Dismiss failed reply',
175
+ icon: 'lucide:x',
176
+ group: 'Failed turn',
177
+ run: () => onDismiss?.(message.id)
178
+ });
179
+ }
180
+ return actions;
181
+ });
108
182
 
109
183
  const label = $derived(resolveRuntimeChatSenderLabel(message, chatParticipantsStore));
110
184
  const toolCalls = $derived(
@@ -259,13 +333,17 @@
259
333
  );
260
334
  </script>
261
335
 
262
- <article
263
- class={[
264
- 'grid grid-cols-[2rem_minmax(0,1fr)] gap-3 py-2',
265
- message.senderType === 'system' && 'opacity-80'
266
- ]}
267
- data-message-id={message.id}
268
- >
336
+ <ContextMenu.Root>
337
+ <ContextMenu.Trigger disabled={messageMenuActions.length === 0}>
338
+ {#snippet child({ props })}
339
+ <article
340
+ {...props}
341
+ class={[
342
+ 'grid grid-cols-[2rem_minmax(0,1fr)] gap-3 py-2',
343
+ message.senderType === 'system' && 'opacity-80'
344
+ ]}
345
+ data-message-id={message.id}
346
+ >
269
347
  <div
270
348
  class="grid size-8 place-items-center rounded-full bg-muted text-caption font-bold text-muted-foreground"
271
349
  aria-hidden="true"
@@ -402,4 +480,14 @@
402
480
  </div>
403
481
  {/if}
404
482
  </div>
405
- </article>
483
+ </article>
484
+ {/snippet}
485
+ </ContextMenu.Trigger>
486
+ <ContextMenu.Content class="min-w-56" data-chat-message-menu>
487
+ <ContextMenu.ActionList
488
+ label={label}
489
+ description={failedTurn ? 'Failed reply' : 'Message'}
490
+ actions={messageMenuActions}
491
+ />
492
+ </ContextMenu.Content>
493
+ </ContextMenu.Root>
@@ -11,6 +11,10 @@ type $$ComponentProps = {
11
11
  * counts a room already has stay visible even before interaction is wired.
12
12
  */
13
13
  onReact?: (messageId: string, type: 'up' | 'down') => void;
14
+ /** Wired by the surface to retry the user turn behind a failed reply. */
15
+ onRetry?: (messageId: string) => void;
16
+ /** Wired by the surface to remove a failed reply from the transcript. */
17
+ onDismiss?: (messageId: string) => void;
14
18
  };
15
19
  declare const RuntimeChatMessageRow: import("svelte").Component<$$ComponentProps, {}, "">;
16
20
  type RuntimeChatMessageRow = ReturnType<typeof RuntimeChatMessageRow>;
@@ -1 +1 @@
1
- {"version":3,"file":"RuntimeChatMessageRow.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/runtime/RuntimeChatMessageRow.svelte.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,kCAAkC,CAAC;AAKnF,KAAK,gBAAgB,GAAI;IACxB,OAAO,EAAE,WAAW,CAAC;IACrB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,4EAA4E;IAC5E,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC;CAC3D,CAAC;AAiVH,QAAA,MAAM,qBAAqB,sDAAwC,CAAC;AACpE,KAAK,qBAAqB,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACtE,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"RuntimeChatMessageRow.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/runtime/RuntimeChatMessageRow.svelte"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,kCAAkC,CAAC;AAKnF,KAAK,gBAAgB,GAAI;IACxB,OAAO,EAAE,WAAW,CAAC;IACrB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,4EAA4E;IAC5E,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC;IAC3D,yEAAyE;IACzE,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,yEAAyE;IACzE,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,CAAC;AAgaH,QAAA,MAAM,qBAAqB,sDAAwC,CAAC;AACpE,KAAK,qBAAqB,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACtE,eAAe,qBAAqB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { useChatSurface } from '../../surface-context.js';
3
- const { chatMessagesStore, chatParticipantsStore, chatRoomStore, chatRealtimeStore } = useChatSurface();
3
+ const { chatMessagesStore, chatParticipantsStore, chatRoomStore, chatRealtimeStore, runtimeChatStore } = useChatSurface();
4
4
 
5
5
  import { onMount, tick } from 'svelte';
6
6
  import { fly } from 'svelte/transition';
@@ -12,6 +12,7 @@
12
12
  import TypingIndicator from '../indicators/TypingIndicator.svelte';
13
13
  import RuntimeChatMessageRow from './RuntimeChatMessageRow.svelte';
14
14
  import type { ChatTypingParticipant } from '../utils/types';
15
+ import { resolveRetryUserContent } from '../utils/retry-content.js';
15
16
 
16
17
  let {
17
18
  roomId = null,
@@ -21,7 +22,9 @@
21
22
  listFooter,
22
23
  currentUserId = null,
23
24
  onEdit,
24
- onReact
25
+ onReact,
26
+ onRetry,
27
+ onDismiss
25
28
  }: {
26
29
  roomId?: string | null;
27
30
  emptyState?: Snippet;
@@ -45,6 +48,10 @@
45
48
  onEdit?: (messageId: string) => void;
46
49
  /** Forwarded to each row to add/remove a reaction. */
47
50
  onReact?: (messageId: string, type: 'up' | 'down') => void;
51
+ /** Forwarded to each row to retry the user turn behind a failed reply. */
52
+ onRetry?: (messageId: string) => void;
53
+ /** Forwarded to each row to remove a failed reply from the transcript. */
54
+ onDismiss?: (messageId: string) => void;
48
55
  } = $props();
49
56
 
50
57
  let containerEl = $state<HTMLDivElement | null>(null);
@@ -162,6 +169,23 @@
162
169
  lastCount = count;
163
170
  lastStreamingLength = tail;
164
171
  });
172
+
173
+ function retryFailedReply(messageId: string): void {
174
+ const content = resolveRetryUserContent(messageId, {
175
+ full: (id) => chatMessagesStore.data.get(id),
176
+ excerpt: (id) => chatMessagesStore.refs.get(id)?.excerpt
177
+ });
178
+ if (!content) return;
179
+ // The composer owns send state, Stop, queueing, and error notices. Retry
180
+ // re-enters that same path instead of starting a second ad-hoc send.
181
+ window.dispatchEvent(new CustomEvent('chat:retry-message', { detail: { content } }));
182
+ }
183
+
184
+ async function dismissFailedReply(messageId: string): Promise<void> {
185
+ const room = runtimeChatStore.activeRoom;
186
+ if (!room) return;
187
+ await room.messages.remove(messageId);
188
+ }
165
189
  </script>
166
190
 
167
191
  <div
@@ -186,7 +210,14 @@
186
210
  {#if messageRow}
187
211
  {@render messageRow(message, index)}
188
212
  {:else}
189
- <RuntimeChatMessageRow {message} {currentUserId} {onEdit} {onReact} />
213
+ <RuntimeChatMessageRow
214
+ {message}
215
+ {currentUserId}
216
+ {onEdit}
217
+ {onReact}
218
+ onRetry={onRetry ?? retryFailedReply}
219
+ onDismiss={onDismiss ?? dismissFailedReply}
220
+ />
190
221
  {/if}
191
222
  {/each}
192
223
  {#if typingParticipants.length > 0}
@@ -23,6 +23,10 @@ type $$ComponentProps = {
23
23
  onEdit?: (messageId: string) => void;
24
24
  /** Forwarded to each row to add/remove a reaction. */
25
25
  onReact?: (messageId: string, type: 'up' | 'down') => void;
26
+ /** Forwarded to each row to retry the user turn behind a failed reply. */
27
+ onRetry?: (messageId: string) => void;
28
+ /** Forwarded to each row to remove a failed reply from the transcript. */
29
+ onDismiss?: (messageId: string) => void;
26
30
  };
27
31
  declare const RuntimeChatMessages: import("svelte").Component<$$ComponentProps, {}, "">;
28
32
  type RuntimeChatMessages = ReturnType<typeof RuntimeChatMessages>;
@@ -1 +1 @@
1
- {"version":3,"file":"RuntimeChatMessages.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/runtime/RuntimeChatMessages.svelte.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAQnE,KAAK,gBAAgB,GAAI;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,6EAA6E;IAC7E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wEAAwE;IACxE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,mDAAmD;IACnD,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,sDAAsD;IACtD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC;CAC3D,CAAC;AAuLH,QAAA,MAAM,mBAAmB,sDAAwC,CAAC;AAClE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"RuntimeChatMessages.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/runtime/RuntimeChatMessages.svelte"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AASnE,KAAK,gBAAgB,GAAI;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,6EAA6E;IAC7E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wEAAwE;IACxE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,mDAAmD;IACnD,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,sDAAsD;IACtD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC;IAC3D,0EAA0E;IAC1E,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,0EAA0E;IAC1E,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,CAAC;AA2MH,QAAA,MAAM,mBAAmB,sDAAwC,CAAC;AAClE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAe,mBAAmB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"RuntimeChatModeControl.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/runtime/RuntimeChatModeControl.svelte.ts"],"names":[],"mappings":"AAWC,KAAK,KAAK,GAAG;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC,CAAC;AAsDH,QAAA,MAAM,sBAAsB,2CAAwC,CAAC;AACrE,KAAK,sBAAsB,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACxE,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"RuntimeChatModeControl.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/runtime/RuntimeChatModeControl.svelte"],"names":[],"mappings":"AAWC,KAAK,KAAK,GAAG;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC,CAAC;AAsDH,QAAA,MAAM,sBAAsB,2CAAwC,CAAC;AACrE,KAAK,sBAAsB,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACxE,eAAe,sBAAsB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"RuntimeChatPermissionControl.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/runtime/RuntimeChatPermissionControl.svelte.ts"],"names":[],"mappings":"AAWC,KAAK,gBAAgB,GAAI;IAAE,YAAY,CAAC,EAAE,UAAU,GAAG,OAAO,CAAA;CAAE,CAAC;AAsGlE,QAAA,MAAM,4BAA4B,sDAAwC,CAAC;AAC3E,KAAK,4BAA4B,GAAG,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC;AACpF,eAAe,4BAA4B,CAAC"}
1
+ {"version":3,"file":"RuntimeChatPermissionControl.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/runtime/RuntimeChatPermissionControl.svelte"],"names":[],"mappings":"AAWC,KAAK,gBAAgB,GAAI;IAAE,YAAY,CAAC,EAAE,UAAU,GAAG,OAAO,CAAA;CAAE,CAAC;AAsGlE,QAAA,MAAM,4BAA4B,sDAAwC,CAAC;AAC3E,KAAK,4BAA4B,GAAG,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC;AACpF,eAAe,4BAA4B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatApprovalBar.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatApprovalBar.svelte.ts"],"names":[],"mappings":"AAyEA,QAAA,MAAM,eAAe,2DAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"ChatApprovalBar.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatApprovalBar.svelte"],"names":[],"mappings":"AAyEA,QAAA,MAAM,eAAe,2DAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatComposerAugmentBar.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatComposerAugmentBar.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAMxC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAA4B,KAAK,+BAA+B,EAAiE,MAAM,4BAA4B,CAAC;AAE3K,OAAO,EAA0H,KAAK,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAE1N,KAAK,gBAAgB,GAAI;IACxB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,kBAAkB,CAAC,EAAE,qBAAqB,CAAC;IAC3C,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,+BAA+B,CAAC;IAC/C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAuJH,QAAA,MAAM,sBAAsB,qCAAwC,CAAC;AACrE,KAAK,sBAAsB,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACxE,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"ChatComposerAugmentBar.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatComposerAugmentBar.svelte"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAMxC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAA4B,KAAK,+BAA+B,EAAiE,MAAM,4BAA4B,CAAC;AAE3K,OAAO,EAA0H,KAAK,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAE1N,KAAK,gBAAgB,GAAI;IACxB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,kBAAkB,CAAC,EAAE,qBAAqB,CAAC;IAC3C,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,+BAA+B,CAAC;IAC/C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAuJH,QAAA,MAAM,sBAAsB,qCAAwC,CAAC;AACrE,KAAK,sBAAsB,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACxE,eAAe,sBAAsB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatComposerPanel.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatComposerPanel.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAChG,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAExF,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,MAAM,sCAAsC,CAAC;AAC/C,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAEvE,KAAK,gBAAgB,GAAI;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,iBAAiB,CAAC,EAAE,2BAA2B,CAAC;IAChD,MAAM,CAAC,EAAE,4BAA4B,EAAE,CAAC;IACxC,KAAK,CAAC,EAAE,4BAA4B,EAAE,CAAC;IACvC,UAAU,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;IACxC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,aAAa,CAAC,EAAE,2BAA2B,CAAC;IAC5C,YAAY,CAAC,EAAE,wBAAwB,CAAC,cAAc,CAAC,CAAC;IACxD,YAAY,CAAC,EAAE,wBAAwB,CAAC,cAAc,CAAC,CAAC;IACxD,cAAc,CAAC,EAAE,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC,CAAC;AAgDH,QAAA,MAAM,iBAAiB,mEAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"ChatComposerPanel.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatComposerPanel.svelte"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAChG,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAExF,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,MAAM,sCAAsC,CAAC;AAC/C,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAEvE,KAAK,gBAAgB,GAAI;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,iBAAiB,CAAC,EAAE,2BAA2B,CAAC;IAChD,MAAM,CAAC,EAAE,4BAA4B,EAAE,CAAC;IACxC,KAAK,CAAC,EAAE,4BAA4B,EAAE,CAAC;IACvC,UAAU,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;IACxC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,aAAa,CAAC,EAAE,2BAA2B,CAAC;IAC5C,YAAY,CAAC,EAAE,wBAAwB,CAAC,cAAc,CAAC,CAAC;IACxD,YAAY,CAAC,EAAE,wBAAwB,CAAC,cAAc,CAAC,CAAC;IACxD,cAAc,CAAC,EAAE,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC,CAAC;AAgDH,QAAA,MAAM,iBAAiB,mEAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
@@ -55,6 +55,11 @@
55
55
  onSendStart,
56
56
  onSendBlocked,
57
57
  onAttachFiles,
58
+ currentUserId = null,
59
+ onEdit,
60
+ onReact,
61
+ onRetry,
62
+ onDismiss,
58
63
  onNotice = (_message: string) => {},
59
64
  onError = (_message: string) => {}
60
65
  }: {
@@ -96,6 +101,11 @@
96
101
  onSendStart?: () => void;
97
102
  onSendBlocked?: RuntimeChatSendBlocked;
98
103
  onAttachFiles?: (files: FileList, roomId: string | null) => void | Promise<void>;
104
+ currentUserId?: string | null;
105
+ onEdit?: (messageId: string) => void;
106
+ onReact?: (messageId: string, type: 'up' | 'down') => void;
107
+ onRetry?: (messageId: string) => void;
108
+ onDismiss?: (messageId: string) => void;
99
109
  onNotice?: (message: string) => void;
100
110
  onError?: (message: string) => void;
101
111
  } = $props();
@@ -125,7 +135,14 @@
125
135
  {onInvite}
126
136
  {onManageTools}
127
137
  />
128
- <ChatMessageViewport roomId={activeRoomId} />
138
+ <ChatMessageViewport
139
+ roomId={activeRoomId}
140
+ {currentUserId}
141
+ {onEdit}
142
+ {onReact}
143
+ {onRetry}
144
+ {onDismiss}
145
+ />
129
146
  <ChatApprovalBar />
130
147
  {:else}
131
148
  <div class="chat-conversation-pane__empty">
@@ -43,6 +43,11 @@ type $$ComponentProps = {
43
43
  onSendStart?: () => void;
44
44
  onSendBlocked?: RuntimeChatSendBlocked;
45
45
  onAttachFiles?: (files: FileList, roomId: string | null) => void | Promise<void>;
46
+ currentUserId?: string | null;
47
+ onEdit?: (messageId: string) => void;
48
+ onReact?: (messageId: string, type: 'up' | 'down') => void;
49
+ onRetry?: (messageId: string) => void;
50
+ onDismiss?: (messageId: string) => void;
46
51
  onNotice?: (message: string) => void;
47
52
  onError?: (message: string) => void;
48
53
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ChatConversationPane.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatConversationPane.svelte.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChatConversationPane.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatConversationPane.svelte"],"names":[],"mappings":"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"}
@@ -18,6 +18,8 @@
18
18
 
19
19
  import { Button } from '@vibesdotdev/kit/components/ui/button';
20
20
  import { Icon } from '@vibesdotdev/kit/components/icon';
21
+ import * as ContextMenu from '@vibesdotdev/kit/components/ui/context-menu';
22
+ import type { ContextMenuAction } from '@vibesdotdev/kit/components/ui/context-menu';
21
23
  import ConversationsTree from '../conversations/ConversationsTree.svelte';
22
24
 
23
25
 
@@ -67,6 +69,29 @@
67
69
  if (Number.isNaN(date.getTime())) return null;
68
70
  return `Updated ${date.toLocaleDateString(undefined, { month: 'short', day: 'numeric' })}`;
69
71
  }
72
+
73
+ const sidebarMenuActions = $derived.by<ContextMenuAction[]>(() => [
74
+ {
75
+ id: 'new-chat',
76
+ label: newConversationLabel,
77
+ icon: 'lucide:message-square-plus',
78
+ group: 'Create',
79
+ run: onNew
80
+ },
81
+ {
82
+ id: 'new-folder',
83
+ label: 'New folder…',
84
+ icon: 'lucide:folder-plus',
85
+ group: 'Create',
86
+ disabled: Boolean(providedRooms) || conversationsStore.busy,
87
+ reason: providedRooms
88
+ ? 'This host supplies its own conversation list.'
89
+ : conversationsStore.busy
90
+ ? 'Conversations are busy.'
91
+ : undefined,
92
+ run: () => void tree?.newFolder()
93
+ }
94
+ ]);
70
95
  </script>
71
96
 
72
97
  <section class="chat-conversation-sidebar flex h-full min-h-0 flex-col bg-background">
@@ -105,30 +130,47 @@
105
130
  </Button>
106
131
  </div>
107
132
  </header>
108
- <nav class="chat-conversation-sidebar__list grid min-h-0 content-start gap-1 overflow-y-auto p-2" aria-label="Conversations">
109
- {#if !providedRooms}
110
- <ConversationsTree bind:this={tree} compact onSelectRoom={(id) => void selectRoom(id)} />
111
- {:else if rooms.length === 0}
112
- <div class="chat-conversation-sidebar__empty grid justify-items-center gap-3 p-4 text-center text-sm text-muted-foreground">
113
- <p>Your conversations will appear here.</p>
114
- </div>
115
- {:else}
116
- {#each rooms as room (room.id)}
117
- <button
118
- type="button"
119
- class="chat-conversation-sidebar__item grid w-full gap-1 rounded-md px-2.5 py-2 text-left hover:bg-accent data-[active=true]:bg-accent"
120
- class:chat-conversation-sidebar__item--active={room.id === activeRoomId}
121
- data-active={room.id === activeRoomId ? 'true' : 'false'}
122
- aria-current={room.id === activeRoomId ? 'page' : undefined}
123
- title={roomTitle(room)}
124
- onclick={() => void selectRoom(room.id)}
133
+ <ContextMenu.Root>
134
+ <ContextMenu.Trigger>
135
+ {#snippet child({ props })}
136
+ <nav
137
+ {...props}
138
+ class="chat-conversation-sidebar__list grid min-h-0 content-start gap-1 overflow-y-auto p-2"
139
+ aria-label="Conversations"
125
140
  >
126
- <span class="chat-conversation-sidebar__item-title block truncate">{roomTitle(room)}</span>
127
- {#if roomMeta(room)}
128
- <span class="chat-conversation-sidebar__item-meta block truncate text-xs text-muted-foreground">{roomMeta(room)}</span>
141
+ {#if !providedRooms}
142
+ <ConversationsTree bind:this={tree} compact onSelectRoom={(id) => void selectRoom(id)} />
143
+ {:else if rooms.length === 0}
144
+ <div class="chat-conversation-sidebar__empty grid justify-items-center gap-3 p-4 text-center text-sm text-muted-foreground">
145
+ <p>Your conversations will appear here.</p>
146
+ </div>
147
+ {:else}
148
+ {#each rooms as room (room.id)}
149
+ <button
150
+ type="button"
151
+ class="chat-conversation-sidebar__item grid w-full gap-1 rounded-md px-2.5 py-2 text-left hover:bg-accent data-[active=true]:bg-accent"
152
+ class:chat-conversation-sidebar__item--active={room.id === activeRoomId}
153
+ data-active={room.id === activeRoomId ? 'true' : 'false'}
154
+ aria-current={room.id === activeRoomId ? 'page' : undefined}
155
+ title={roomTitle(room)}
156
+ onclick={() => void selectRoom(room.id)}
157
+ >
158
+ <span class="chat-conversation-sidebar__item-title block truncate">{roomTitle(room)}</span>
159
+ {#if roomMeta(room)}
160
+ <span class="chat-conversation-sidebar__item-meta block truncate text-xs text-muted-foreground">{roomMeta(room)}</span>
161
+ {/if}
162
+ </button>
163
+ {/each}
129
164
  {/if}
130
- </button>
131
- {/each}
132
- {/if}
133
- </nav>
165
+ </nav>
166
+ {/snippet}
167
+ </ContextMenu.Trigger>
168
+ <ContextMenu.Content class="min-w-56" data-chat-conversation-menu>
169
+ <ContextMenu.ActionList
170
+ label={title}
171
+ description="Conversation list"
172
+ actions={sidebarMenuActions}
173
+ />
174
+ </ContextMenu.Content>
175
+ </ContextMenu.Root>
134
176
  </section>
@@ -1 +1 @@
1
- {"version":3,"file":"ChatConversationSidebar.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatConversationSidebar.svelte.ts"],"names":[],"mappings":"AAGC,MAAM,WAAW,2BAA2B;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AASD,KAAK,gBAAgB,GAAI;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,2BAA2B,EAAE,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AA+FH,QAAA,MAAM,uBAAuB,sDAAwC,CAAC;AACtE,KAAK,uBAAuB,GAAG,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAC1E,eAAe,uBAAuB,CAAC"}
1
+ {"version":3,"file":"ChatConversationSidebar.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatConversationSidebar.svelte"],"names":[],"mappings":"AAGC,MAAM,WAAW,2BAA2B;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAWD,KAAK,gBAAgB,GAAI;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,2BAA2B,EAAE,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAiIH,QAAA,MAAM,uBAAuB,sDAAwC,CAAC;AACtE,KAAK,uBAAuB,GAAG,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAC1E,eAAe,uBAAuB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatConversationSplit.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatConversationSplit.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGrC,KAAK,gBAAgB,GAAI;IACxB,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAqCH,QAAA,MAAM,qBAAqB,sDAAwC,CAAC;AACpE,KAAK,qBAAqB,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACtE,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"ChatConversationSplit.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatConversationSplit.svelte"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGrC,KAAK,gBAAgB,GAAI;IACxB,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAqCH,QAAA,MAAM,qBAAqB,sDAAwC,CAAC;AACpE,KAAK,qBAAqB,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACtE,eAAe,qBAAqB,CAAC"}
@@ -4,15 +4,25 @@
4
4
 
5
5
  let {
6
6
  roomId = null,
7
- emptyState
7
+ emptyState,
8
+ currentUserId = null,
9
+ onEdit,
10
+ onReact,
11
+ onRetry,
12
+ onDismiss
8
13
  }: {
9
14
  roomId?: string | null;
10
15
  emptyState?: Snippet;
16
+ currentUserId?: string | null;
17
+ onEdit?: (messageId: string) => void;
18
+ onReact?: (messageId: string, type: 'up' | 'down') => void;
19
+ onRetry?: (messageId: string) => void;
20
+ onDismiss?: (messageId: string) => void;
11
21
  } = $props();
12
22
  </script>
13
23
 
14
24
  <div class="chat-message-viewport">
15
- <RuntimeChatMessages {roomId} {emptyState} />
25
+ <RuntimeChatMessages {roomId} {emptyState} {currentUserId} {onEdit} {onReact} {onRetry} {onDismiss} />
16
26
  </div>
17
27
 
18
28
  <style>
@@ -2,6 +2,11 @@ import type { Snippet } from 'svelte';
2
2
  type $$ComponentProps = {
3
3
  roomId?: string | null;
4
4
  emptyState?: Snippet;
5
+ currentUserId?: string | null;
6
+ onEdit?: (messageId: string) => void;
7
+ onReact?: (messageId: string, type: 'up' | 'down') => void;
8
+ onRetry?: (messageId: string) => void;
9
+ onDismiss?: (messageId: string) => void;
5
10
  };
6
11
  declare const ChatMessageViewport: import("svelte").Component<$$ComponentProps, {}, "">;
7
12
  type ChatMessageViewport = ReturnType<typeof ChatMessageViewport>;
@@ -1 +1 @@
1
- {"version":3,"file":"ChatMessageViewport.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatMessageViewport.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGrC,KAAK,gBAAgB,GAAI;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAmBH,QAAA,MAAM,mBAAmB,sDAAwC,CAAC;AAClE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"ChatMessageViewport.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatMessageViewport.svelte"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGrC,KAAK,gBAAgB,GAAI;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC;IAC3D,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,CAAC;AAwBH,QAAA,MAAM,mBAAmB,sDAAwC,CAAC;AAClE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAe,mBAAmB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatNewConversationEmptyState.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatNewConversationEmptyState.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAatC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,KAAK,gBAAgB,GAAI;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC7C,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;IACxC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC/C,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B,CAAC;AA2HH,QAAA,MAAM,6BAA6B,sDAAwC,CAAC;AAC5E,KAAK,6BAA6B,GAAG,UAAU,CAAC,OAAO,6BAA6B,CAAC,CAAC;AACtF,eAAe,6BAA6B,CAAC"}
1
+ {"version":3,"file":"ChatNewConversationEmptyState.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatNewConversationEmptyState.svelte"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAatC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,KAAK,gBAAgB,GAAI;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC7C,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;IACxC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC/C,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B,CAAC;AA2HH,QAAA,MAAM,6BAA6B,sDAAwC,CAAC;AAC5E,KAAK,6BAA6B,GAAG,UAAU,CAAC,OAAO,6BAA6B,CAAC,CAAC;AACtF,eAAe,6BAA6B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatParticipantsPanel.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatParticipantsPanel.svelte.ts"],"names":[],"mappings":"AASC,KAAK,gBAAgB,GAAI;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAqEH,QAAA,MAAM,qBAAqB,sDAAwC,CAAC;AACpE,KAAK,qBAAqB,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACtE,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"ChatParticipantsPanel.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatParticipantsPanel.svelte"],"names":[],"mappings":"AASC,KAAK,gBAAgB,GAAI;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAqEH,QAAA,MAAM,qBAAqB,sDAAwC,CAAC;AACpE,KAAK,qBAAqB,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACtE,eAAe,qBAAqB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatRoomHeader.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatRoomHeader.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAIrC,KAAK,gBAAgB,GAAI;IACxB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C,CAAC;AAgEH,QAAA,MAAM,cAAc,sDAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"ChatRoomHeader.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatRoomHeader.svelte"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAIrC,KAAK,gBAAgB,GAAI;IACxB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C,CAAC;AAgEH,QAAA,MAAM,cAAc,sDAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatRuntimeLoader.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatRuntimeLoader.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,EAAsB,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAU1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mDAAmD,CAAC;AAE5F,KAAK,gBAAgB,GAAI;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACvD,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACjC,CAAC;AAsIH,QAAA,MAAM,iBAAiB,sDAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"ChatRuntimeLoader.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatRuntimeLoader.svelte"],"names":[],"mappings":"AAKA,OAAO,EAAsB,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAU1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mDAAmD,CAAC;AAE5F,KAAK,gBAAgB,GAAI;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACvD,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACjC,CAAC;AAsIH,QAAA,MAAM,iBAAiB,sDAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatSurfaceBoundary.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatSurfaceBoundary.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAW,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAM9C,KAAK,gBAAgB,GAAI;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAmChD,QAAA,MAAM,mBAAmB,sDAAwC,CAAC;AAClE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"ChatSurfaceBoundary.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatSurfaceBoundary.svelte"],"names":[],"mappings":"AAGA,OAAO,EAAW,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAM9C,KAAK,gBAAgB,GAAI;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAmChD,QAAA,MAAM,mBAAmB,sDAAwC,CAAC;AAClE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAe,mBAAmB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatSurfaceFrame.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatSurfaceFrame.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,EAAW,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAK/C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE1D,KAAK,gBAAgB,GAAI;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAC9C,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAiIH,QAAA,MAAM,gBAAgB,sDAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"ChatSurfaceFrame.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatSurfaceFrame.svelte"],"names":[],"mappings":"AAKA,OAAO,EAAW,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAK/C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE1D,KAAK,gBAAgB,GAAI;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAC9C,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAiIH,QAAA,MAAM,gBAAgB,sDAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatSurfaceSkeleton.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatSurfaceSkeleton.svelte.ts"],"names":[],"mappings":"AAGC,KAAK,gBAAgB,GAAI;IACxB,oFAAoF;IACpF,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CACzB,CAAC;AA+EH,QAAA,MAAM,mBAAmB,sDAAwC,CAAC;AAClE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"ChatSurfaceSkeleton.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatSurfaceSkeleton.svelte"],"names":[],"mappings":"AAGC,KAAK,gBAAgB,GAAI;IACxB,oFAAoF;IACpF,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CACzB,CAAC;AA+EH,QAAA,MAAM,mBAAmB,sDAAwC,CAAC;AAClE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAe,mBAAmB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatWorkspaceFrame.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatWorkspaceFrame.svelte.ts"],"names":[],"mappings":"AAqBA,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;UAAwC,CAAC;AACjE,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAChE,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"ChatWorkspaceFrame.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatWorkspaceFrame.svelte"],"names":[],"mappings":"AAqBA,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;UAAwC,CAAC;AACjE,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAChE,eAAe,kBAAkB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatWorkspaceFrameContent.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatWorkspaceFrameContent.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,EAAW,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAS/C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE1D,KAAK,gBAAgB,GAAI;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAC9C,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACnD,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAmPH,QAAA,MAAM,yBAAyB,sDAAwC,CAAC;AACxE,KAAK,yBAAyB,GAAG,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC9E,eAAe,yBAAyB,CAAC"}
1
+ {"version":3,"file":"ChatWorkspaceFrameContent.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/surface/ChatWorkspaceFrameContent.svelte"],"names":[],"mappings":"AAKA,OAAO,EAAW,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAS/C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE1D,KAAK,gBAAgB,GAAI;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAC9C,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACnD,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAmPH,QAAA,MAAM,yBAAyB,sDAAwC,CAAC;AACxE,KAAK,yBAAyB,GAAG,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC9E,eAAe,yBAAyB,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Resolve the user text to re-send when retrying a failed reply.
3
+ *
4
+ * A failed assistant reply points at the user message that started the turn via
5
+ * `replyToId`. The live store may only have a lightweight ref for that message,
6
+ * so accept both the full row and its excerpt. Pure and dependency-free so the
7
+ * context menu can prove the retry target without the Svelte surface.
8
+ */
9
+ import type { ChatMessageMetadata } from '../../../schemas/common.ts';
10
+ export type RetryLookupMessage = {
11
+ replyToId?: string | null;
12
+ content?: string | null;
13
+ metadata?: ChatMessageMetadata | null;
14
+ };
15
+ export type RetryMessageLookup = {
16
+ /** Full message row by id, if expanded. */
17
+ full: (id: string) => RetryLookupMessage | undefined;
18
+ /** Lightweight ref excerpt by id, if present. */
19
+ excerpt: (id: string) => string | undefined;
20
+ };
21
+ /** The id of the user message a failed reply was replying to, or null. */
22
+ export declare function resolveOriginUserMessageId(failed: RetryLookupMessage | undefined): string | null;
23
+ /** The text to re-send for a failed reply, or null when it cannot be recovered. */
24
+ export declare function resolveRetryUserContent(failedMessageId: string, lookup: RetryMessageLookup): string | null;
25
+ //# sourceMappingURL=retry-content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-content.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/utils/retry-content.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAKtE,MAAM,MAAM,kBAAkB,GAAG;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAChC,2CAA2C;IAC3C,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;IACrD,iDAAiD;IACjD,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAC5C,CAAC;AAEF,0EAA0E;AAC1E,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,kBAAkB,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAMhG;AAED,mFAAmF;AACnF,wBAAgB,uBAAuB,CACtC,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,kBAAkB,GACxB,MAAM,GAAG,IAAI,CAMf"}