@ai-matrx/chat 0.6.6 → 0.7.1

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 (249) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +1 -1
  3. package/dist/agents/components/agent-widgets/AgentChatHistorySidebar.js +16 -55
  4. package/dist/agents/components/chat/chat-door.d.ts +67 -0
  5. package/dist/agents/components/chat/chat-door.js +100 -0
  6. package/dist/agents/components/conversation-history/AgentConversationList.d.ts +83 -0
  7. package/dist/agents/components/conversation-history/AgentConversationList.js +252 -0
  8. package/dist/agents/components/conversation-history/ConversationArchiveSection.d.ts +5 -1
  9. package/dist/agents/components/conversation-history/ConversationArchiveSection.js +22 -4
  10. package/dist/agents/components/conversation-history/ConversationHistorySidebar.js +20 -65
  11. package/dist/agents/components/inputs/input-components/TextareaInput.js +2 -0
  12. package/dist/agents/components/inputs/input-components/VariableInputComponent.js +7 -6
  13. package/dist/agents/components/inputs/smart-input/ConversationCompanionPills.d.ts +3 -0
  14. package/dist/agents/components/inputs/smart-input/ConversationCompanionPills.js +40 -0
  15. package/dist/agents/components/inputs/smart-input/ConversationContextRail.js +6 -29
  16. package/dist/agents/components/inputs/smart-input/DeviceToolsModeRow.d.ts +3 -0
  17. package/dist/agents/components/inputs/smart-input/DeviceToolsModeRow.js +35 -0
  18. package/dist/agents/components/inputs/smart-input/InboxQueueStrip.js +0 -8
  19. package/dist/agents/components/inputs/smart-input/RunToolPicker.js +15 -11
  20. package/dist/agents/components/inputs/smart-input/composer/ComposerPlusMenu.js +22 -0
  21. package/dist/agents/components/inputs/smart-input/rail-pill.d.ts +35 -0
  22. package/dist/agents/components/inputs/smart-input/rail-pill.js +30 -0
  23. package/dist/agents/components/inputs/variable-input-variations/AgentVariableForm.js +52 -48
  24. package/dist/agents/components/run-controls/panels/shared.d.ts +1 -1
  25. package/dist/agents/components/shared/AgentModeController.js +3 -2
  26. package/dist/agents/components/shell/AgentRunSidebarMenu.js +15 -54
  27. package/dist/agents/components/working-document/documents-workspace/DocumentsListRail.js +1 -2
  28. package/dist/agents/engine.d.ts +15 -0
  29. package/dist/agents/engine.js +17 -0
  30. package/dist/agents/hooks/useModelControls.js +3 -175
  31. package/dist/agents/redux/agent-definition/selectors.d.ts +237 -237
  32. package/dist/agents/redux/agent-shortcut-categories/selectors.d.ts +50 -50
  33. package/dist/agents/redux/agent-shortcuts/selectors.d.ts +147 -147
  34. package/dist/agents/redux/conversation-history/thunks.js +6 -18
  35. package/dist/agents/redux/conversation-list/conversation-list.selectors.d.ts +1 -73
  36. package/dist/agents/redux/conversation-list/conversation-list.selectors.js +2 -36
  37. package/dist/agents/redux/conversation-list/conversation-list.slice.d.ts +7 -22
  38. package/dist/agents/redux/conversation-list/conversation-list.slice.js +7 -62
  39. package/dist/agents/redux/conversation-list/conversation-list.thunks.d.ts +0 -25
  40. package/dist/agents/redux/conversation-list/conversation-list.thunks.js +2 -58
  41. package/dist/agents/redux/conversation-list/conversation-list.types.d.ts +0 -5
  42. package/dist/agents/redux/conversation-list/conversation-rows.d.ts +16 -0
  43. package/dist/agents/redux/conversation-list/conversation-rows.js +24 -0
  44. package/dist/agents/redux/conversation-list/conversation-trash.thunks.d.ts +1 -0
  45. package/dist/agents/redux/conversation-list/conversation-trash.thunks.js +13 -18
  46. package/dist/agents/redux/execution-system/active-requests/active-requests.selectors.d.ts +54 -54
  47. package/dist/agents/redux/execution-system/context-state/context-state.selectors.d.ts +14 -14
  48. package/dist/agents/redux/execution-system/conversations/conversations.selectors.d.ts +5 -5
  49. package/dist/agents/redux/execution-system/instance-context/instance-context.selectors.d.ts +3 -3
  50. package/dist/agents/redux/execution-system/instance-resources/instance-resources.selectors.d.ts +8 -8
  51. package/dist/agents/redux/execution-system/instance-ui-state/instance-ui-state.selectors.d.ts +5 -5
  52. package/dist/agents/redux/execution-system/instance-variable-values/instance-variable-values.selectors.d.ts +7 -7
  53. package/dist/agents/redux/execution-system/messages/messages.selectors.d.ts +1 -1
  54. package/dist/agents/redux/execution-system/observability/observability.selectors.d.ts +7 -7
  55. package/dist/agents/redux/execution-system/observational-memory/observational-memory.selectors.d.ts +1 -1
  56. package/dist/agents/redux/execution-system/selectors/aggregate.selectors.d.ts +14 -14
  57. package/dist/agents/redux/execution-system/thunks/create-instance.thunk.d.ts +10 -1
  58. package/dist/agents/redux/execution-system/thunks/create-instance.thunk.js +114 -265
  59. package/dist/agents/redux/execution-system/thunks/dispatch-matrx-extend-tool.thunk.js +18 -2
  60. package/dist/agents/redux/execution-system/thunks/dispatch-surface-client-tool.thunk.js +10 -28
  61. package/dist/agents/redux/execution-system/thunks/dispatch-surface-write.thunk.js +10 -25
  62. package/dist/agents/redux/execution-system/thunks/execute-instance.thunk.js +20 -0
  63. package/dist/agents/redux/execution-system/thunks/execute-manual-instance.thunk.js +6 -1
  64. package/dist/agents/redux/execution-system/thunks/notify-and-play-dispatcher.d.ts +58 -0
  65. package/dist/agents/redux/execution-system/thunks/notify-and-play-dispatcher.js +62 -0
  66. package/dist/agents/redux/execution-system/thunks/post-delegated-tool-outcome.d.ts +23 -0
  67. package/dist/agents/redux/execution-system/thunks/post-delegated-tool-outcome.js +37 -0
  68. package/dist/agents/redux/execution-system/thunks/resume-instance.thunk.js +10 -2
  69. package/dist/agents/redux/execution-system/utils/build-tool-injection.d.ts +7 -0
  70. package/dist/agents/redux/execution-system/utils/build-tool-injection.js +18 -6
  71. package/dist/agents/redux/execution-system/utils/host-turn.d.ts +45 -0
  72. package/dist/agents/redux/execution-system/utils/host-turn.js +119 -0
  73. package/dist/agents/redux/proposed-directives/proposedDirectivesSlice.d.ts +1 -1
  74. package/dist/agents/scribe-tools/dispatcher/dispatch-scribe-tool.thunk.d.ts +50 -20
  75. package/dist/agents/scribe-tools/dispatcher/dispatch-scribe-tool.thunk.js +9 -101
  76. package/dist/agents/types/tool-injection.types.d.ts +18 -2
  77. package/dist/agents/ui-first-tools/redux/agent-lists.selectors.d.ts +2 -2
  78. package/dist/agents/ui-first-tools/redux/pending-asks.slice.d.ts +2 -1
  79. package/dist/agents/ui-first-tools/redux/resolve-asks-with-input.thunk.js +1 -1
  80. package/dist/agents/ui-first-tools/tools/ask-response.d.ts +29 -0
  81. package/dist/agents/ui-first-tools/tools/ask-response.js +15 -0
  82. package/dist/agents/ui-first-tools/tools/schemas.d.ts +3 -25
  83. package/dist/agents/ui-first-tools/tools/schemas.js +1 -12
  84. package/dist/agents/ui-first-tools/ui/ApprovalCard.js +1 -1
  85. package/dist/agents/ui-first-tools/ui/AskWizard.d.ts +1 -1
  86. package/dist/agents/ui-first-tools/ui/AskWizard.js +1 -1
  87. package/dist/cx-chat/_legacy-stubs.d.ts +5 -5
  88. package/dist/cx-chat/components/SsrSidebarChats.js +13 -15
  89. package/dist/cx-chat/components/messages/UserMessage.d.ts +2 -2
  90. package/dist/cx-chat/types/conversation.d.ts +6 -6
  91. package/dist/cx-chat/utils/buildContentBlocksForSave.d.ts +1 -1
  92. package/dist/cx-chat/utils/cx-content-converter.d.ts +1 -1
  93. package/dist/host/bare-host-chrome.js +9 -3
  94. package/dist/host/composer-extensions.d.ts +75 -0
  95. package/dist/host/composer-extensions.js +92 -0
  96. package/dist/host/configure.js +1 -0
  97. package/dist/host/contract.d.ts +105 -13
  98. package/dist/host/defaults/confirm.d.ts +15 -0
  99. package/dist/host/defaults/confirm.js +25 -0
  100. package/dist/host/defaults/files-ui.d.ts +85 -0
  101. package/dist/host/defaults/files-ui.js +158 -0
  102. package/dist/host/defaults/gates.d.ts +27 -0
  103. package/dist/host/defaults/gates.js +72 -0
  104. package/dist/host/defaults/media-client.d.ts +15 -0
  105. package/dist/host/defaults/media-client.js +40 -0
  106. package/dist/host/defaults/voice.d.ts +81 -0
  107. package/dist/host/defaults/voice.js +239 -0
  108. package/dist/host/device-tool-handoff.d.ts +26 -0
  109. package/dist/host/device-tool-handoff.js +45 -0
  110. package/dist/host/index.d.ts +1 -0
  111. package/dist/host/index.js +4 -1
  112. package/dist/host/microphone.d.ts +11 -0
  113. package/dist/host/microphone.js +17 -0
  114. package/dist/host/ui-slots.d.ts +29 -74
  115. package/dist/host/ui-slots.js +40 -42
  116. package/dist/store/create-chat-store.d.ts +2 -2
  117. package/dist/store/middlewares.d.ts +5 -5
  118. package/dist/store/slices.d.ts +1 -1
  119. package/dist/surfaces/redux/selectors.d.ts +2 -2
  120. package/dist/tool-call-visualization/components/ToolCallVisualization.js +3 -2
  121. package/dist/tool-call-visualization/configured-rows/ConfiguredRowRenderer.d.ts +15 -0
  122. package/dist/tool-call-visualization/configured-rows/ConfiguredRowRenderer.js +36 -0
  123. package/dist/tool-call-visualization/configured-rows/ConfiguredToolRow.d.ts +40 -0
  124. package/dist/tool-call-visualization/configured-rows/ConfiguredToolRow.js +296 -0
  125. package/dist/tool-call-visualization/configured-rows/CopyToolButton.d.ts +23 -0
  126. package/dist/tool-call-visualization/configured-rows/CopyToolButton.js +62 -0
  127. package/dist/tool-call-visualization/configured-rows/ToolProgressView.d.ts +23 -0
  128. package/dist/tool-call-visualization/configured-rows/ToolProgressView.js +147 -0
  129. package/dist/tool-call-visualization/configured-rows/field-components.d.ts +15 -0
  130. package/dist/tool-call-visualization/configured-rows/field-components.js +244 -0
  131. package/dist/tool-call-visualization/configured-rows/helpers.d.ts +39 -0
  132. package/dist/tool-call-visualization/configured-rows/helpers.js +110 -0
  133. package/dist/tool-call-visualization/configured-rows/register.d.ts +25 -0
  134. package/dist/tool-call-visualization/configured-rows/register.js +51 -0
  135. package/dist/tool-call-visualization/configured-rows/registries.d.ts +27 -0
  136. package/dist/tool-call-visualization/configured-rows/registries.js +14 -0
  137. package/dist/tool-call-visualization/configured-rows/to-row-entry.d.ts +8 -0
  138. package/dist/tool-call-visualization/configured-rows/to-row-entry.js +38 -0
  139. package/dist/tool-call-visualization/configured-rows/transforms.d.ts +14 -0
  140. package/dist/tool-call-visualization/configured-rows/transforms.js +30 -0
  141. package/dist/tool-call-visualization/configured-rows/types.d.ts +140 -0
  142. package/dist/tool-call-visualization/redux/selectors.d.ts +1 -1
  143. package/dist/tool-call-visualization/registry/registry.d.ts +1 -1
  144. package/dist/tool-call-visualization/registry/registry.js +8 -1
  145. package/dist/tool-call-visualization/types.d.ts +1 -1
  146. package/dist/ui/chat-protocol-types.d.ts +0 -1
  147. package/dist/ui/ownership.d.ts +25 -0
  148. package/dist/ui/ownership.js +18 -0
  149. package/dist/voice-agent/audio/audioCapture.js +11 -6
  150. package/dist/window-panels/windows/agents/AgentRunHistoryWindow.d.ts +1 -2
  151. package/dist/window-panels/windows/agents/AgentRunHistoryWindow.js +21 -181
  152. package/dist/window-panels/windows/agents/AgentRunWindow.js +26 -13
  153. package/package.json +4627 -125
  154. package/dist/agents/components/agent-widgets/chat-assistant/AssistantMessageCard.d.ts +0 -7
  155. package/dist/agents/components/agent-widgets/chat-assistant/AssistantMessageCard.js +0 -33
  156. package/dist/agents/components/agent-widgets/chat-assistant/StatusCard.d.ts +0 -6
  157. package/dist/agents/components/agent-widgets/chat-assistant/StatusCard.js +0 -21
  158. package/dist/agents/components/agent-widgets/chat-assistant/UserMessageCard.d.ts +0 -6
  159. package/dist/agents/components/agent-widgets/chat-assistant/UserMessageCard.js +0 -11
  160. package/dist/agents/components/agent-widgets/chat-assistant/VariableInputCard.d.ts +0 -12
  161. package/dist/agents/components/agent-widgets/chat-assistant/VariableInputCard.js +0 -7
  162. package/dist/agents/components/agent-widgets/execution-gates/PreExecutionCard.d.ts +0 -4
  163. package/dist/agents/components/agent-widgets/execution-gates/PreExecutionCard.js +0 -81
  164. package/dist/agents/components/run/run-sidebar/SidebarHeader.d.ts +0 -21
  165. package/dist/agents/components/run/run-sidebar/SidebarHeader.js +0 -50
  166. package/dist/agents/components/run-controls/AdvancedRunSettings/index.d.ts +0 -6
  167. package/dist/agents/components/run-controls/AdvancedRunSettings/index.js +0 -32
  168. package/dist/agents/components/run-controls/RunSettingsModal.d.ts +0 -5
  169. package/dist/agents/components/run-controls/RunSettingsModal.js +0 -22
  170. package/dist/agents/components/shell/AgentBuildSidebarExtras.d.ts +0 -6
  171. package/dist/agents/components/shell/AgentBuildSidebarExtras.js +0 -30
  172. package/dist/agents/constants/agent-system-competitors.d.ts +0 -9
  173. package/dist/agents/constants/agent-system-competitors.js +0 -125
  174. package/dist/agents/hooks/message-crud/useMessageActions.d.ts +0 -29
  175. package/dist/agents/hooks/message-crud/useMessageActions.js +0 -119
  176. package/dist/agents/hooks/useConversationPendingCalls.d.ts +0 -30
  177. package/dist/agents/hooks/useConversationPendingCalls.js +0 -42
  178. package/dist/agents/model-registry/model-classes.d.ts +0 -1
  179. package/dist/agents/model-registry/model-classes.js +0 -1
  180. package/dist/agents/redux/conversation-history/index.d.ts +0 -18
  181. package/dist/agents/redux/conversation-history/index.js +0 -4
  182. package/dist/agents/redux/execution-system/instance-variable-values/instance-variable-values.thunks.d.ts +0 -38
  183. package/dist/agents/redux/execution-system/instance-variable-values/instance-variable-values.thunks.js +0 -42
  184. package/dist/agents/redux/execution-system/message-crud/server/compact-turns.thunk.d.ts +0 -58
  185. package/dist/agents/redux/execution-system/message-crud/server/compact-turns.thunk.js +0 -50
  186. package/dist/agents/redux/execution-system/message-crud/server/fork-and-run-server.thunk.d.ts +0 -76
  187. package/dist/agents/redux/execution-system/message-crud/server/fork-and-run-server.thunk.js +0 -101
  188. package/dist/agents/redux/execution-system/thunks/attach-workflow-run.d.ts +0 -38
  189. package/dist/agents/redux/execution-system/thunks/attach-workflow-run.js +0 -25
  190. package/dist/agents/redux/execution-system/utils/source-slice-helpers.d.ts +0 -45
  191. package/dist/agents/redux/execution-system/utils/source-slice-helpers.js +0 -50
  192. package/dist/agents/runtime/realtime/launchRealtimeSession.thunk.d.ts +0 -25
  193. package/dist/agents/runtime/realtime/launchRealtimeSession.thunk.js +0 -15
  194. package/dist/agents/services/agentService.d.ts +0 -12
  195. package/dist/agents/services/agentService.js +0 -92
  196. package/dist/agents/utils/escape-code-fences.d.ts +0 -15
  197. package/dist/agents/utils/escape-code-fences.js +0 -9
  198. package/dist/agents/utils/normalize-managed-options.d.ts +0 -30
  199. package/dist/agents/utils/normalize-managed-options.js +0 -29
  200. package/dist/agents/utils/processedDocumentContext.d.ts +0 -51
  201. package/dist/agents/utils/processedDocumentContext.js +0 -51
  202. package/dist/agents/utils/variable-validation.d.ts +0 -28
  203. package/dist/agents/utils/variable-validation.js +0 -54
  204. package/dist/cx-chat/components/ChatConversationSkeleton.d.ts +0 -9
  205. package/dist/cx-chat/components/ChatConversationSkeleton.js +0 -45
  206. package/dist/cx-chat/components/ChatPanelBackButton.d.ts +0 -1
  207. package/dist/cx-chat/components/ChatPanelBackButton.js +0 -26
  208. package/dist/cx-chat/components/messages/MessageErrorBoundary.d.ts +0 -20
  209. package/dist/cx-chat/components/messages/MessageErrorBoundary.js +0 -40
  210. package/dist/cx-chat/components/variable-inputs/CheckboxGroupInput.d.ts +0 -14
  211. package/dist/cx-chat/components/variable-inputs/CheckboxGroupInput.js +0 -160
  212. package/dist/cx-chat/components/variable-inputs/NumberInput.d.ts +0 -15
  213. package/dist/cx-chat/components/variable-inputs/NumberInput.js +0 -79
  214. package/dist/cx-chat/components/variable-inputs/RadioGroupInput.d.ts +0 -14
  215. package/dist/cx-chat/components/variable-inputs/RadioGroupInput.js +0 -125
  216. package/dist/cx-chat/components/variable-inputs/SelectInput.d.ts +0 -14
  217. package/dist/cx-chat/components/variable-inputs/SelectInput.js +0 -92
  218. package/dist/cx-chat/components/variable-inputs/TextareaInput.d.ts +0 -14
  219. package/dist/cx-chat/components/variable-inputs/TextareaInput.js +0 -46
  220. package/dist/cx-chat/components/variable-inputs/ToggleInput.d.ts +0 -14
  221. package/dist/cx-chat/components/variable-inputs/ToggleInput.js +0 -46
  222. package/dist/cx-chat/hooks/useChatPersistence.d.ts +0 -28
  223. package/dist/cx-chat/hooks/useChatPersistence.js +0 -180
  224. package/dist/cx-chat/hooks/useInstanceBootstrap.d.ts +0 -1
  225. package/dist/cx-chat/hooks/useInstanceBootstrap.js +0 -115
  226. package/dist/cx-chat/types/content.d.ts +0 -184
  227. package/dist/cx-chat/types/content.js +0 -91
  228. package/dist/cx-chat/types/cx-tables.d.ts +0 -176
  229. package/dist/cx-chat/utils/settings-diff.d.ts +0 -13
  230. package/dist/cx-chat/utils/settings-diff.js +0 -25
  231. package/dist/public-chat/components/AgentSelector.d.ts +0 -22
  232. package/dist/public-chat/components/AgentSelector.js +0 -80
  233. package/dist/public-chat/components/GuidedVariableInputs.d.ts +0 -25
  234. package/dist/public-chat/components/GuidedVariableInputs.js +0 -623
  235. package/dist/public-chat/components/PublicVariableInputs.d.ts +0 -29
  236. package/dist/public-chat/components/PublicVariableInputs.js +0 -172
  237. package/dist/public-chat/types/content.d.ts +0 -184
  238. package/dist/public-chat/types/content.js +0 -91
  239. package/dist/tool-call-visualization/renderers/_shared-entity/EntityOpenActions.d.ts +0 -15
  240. package/dist/tool-call-visualization/renderers/_shared-entity/EntityOpenActions.js +0 -31
  241. package/dist/tool-call-visualization/utils/toolCallBlockToLifecycleEntry.d.ts +0 -24
  242. package/dist/tool-call-visualization/utils/toolCallBlockToLifecycleEntry.js +0 -26
  243. package/dist/ui/AudioOutputBlockSkeleton.d.ts +0 -17
  244. package/dist/ui/AudioOutputBlockSkeleton.js +0 -78
  245. package/dist/ui/lazy/PublicChatVariableInputs.d.ts +0 -2
  246. package/dist/ui/lazy/PublicChatVariableInputs.js +0 -16
  247. package/dist/utils/xml/readXmlTag.d.ts +0 -12
  248. package/dist/utils/xml/readXmlTag.js +0 -66
  249. /package/dist/{cx-chat/types/cx-tables.js → tool-call-visualization/configured-rows/types.js} +0 -0
@@ -0,0 +1,252 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useMemo, useState } from "react";
4
+ import { ChevronDown, ChevronRight, MessageSquare } from "lucide-react";
5
+ import { Button } from "@ai-matrx/design-system/controls";
6
+ import { ItemRow } from "../../../host/ui-slots.js";
7
+ import { useAppDispatch, useAppSelector } from "../../../store/hooks.js";
8
+ import { selectAgentById } from "../../redux/agent-definition/selectors.js";
9
+ import { fetchAgentConversations } from "../../redux/conversation-list/conversation-list.thunks.js";
10
+ import { makeSelectAgentConversations } from "../../redux/conversation-list/conversation-list.selectors.js";
11
+ import { renameConversation } from "../../redux/conversation-list/conversation-row-actions.thunks.js";
12
+ import { ConversationArchiveSection } from "./ConversationArchiveSection.js";
13
+ import {
14
+ buildConversationMenu
15
+ } from "../conversation-actions/conversationActionRegistry.js";
16
+ function formatConversationDate(iso) {
17
+ if (!iso) return "";
18
+ const d = new Date(iso);
19
+ const now = /* @__PURE__ */ new Date();
20
+ const diffDays = Math.floor((now.getTime() - d.getTime()) / 864e5);
21
+ if (diffDays === 0)
22
+ return d.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
23
+ if (diffDays === 1) return "Yesterday";
24
+ if (diffDays < 7) return `${diffDays}d ago`;
25
+ return d.toLocaleDateString([], { month: "short", day: "numeric" });
26
+ }
27
+ function groupConversationsByVersion(conversations) {
28
+ const map = /* @__PURE__ */ new Map();
29
+ for (const conv of conversations) {
30
+ const v = conv.agentVersionNumber ?? 0;
31
+ const group = map.get(v);
32
+ if (group) group.push(conv);
33
+ else map.set(v, [conv]);
34
+ }
35
+ return Array.from(map.entries()).sort(([a], [b]) => b - a).map(([versionNumber, convs]) => ({
36
+ versionNumber,
37
+ conversations: [...convs].sort(
38
+ (a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()
39
+ )
40
+ }));
41
+ }
42
+ function agentRunHref(agentId, conversationId) {
43
+ return `/agents/go/${agentId}/run?conversationId=${conversationId}`;
44
+ }
45
+ function useAgentConversationList(agentId) {
46
+ const dispatch = useAppDispatch();
47
+ const agentName = useAppSelector(
48
+ (state) => agentId ? selectAgentById(state, agentId)?.name ?? null : null
49
+ );
50
+ const canonicalAgentId = useAppSelector((state) => {
51
+ if (!agentId) return null;
52
+ const agent = selectAgentById(state, agentId);
53
+ return agent?.parentAgentId ?? agent?.id ?? agentId;
54
+ });
55
+ const selectConversations = useMemo(
56
+ () => canonicalAgentId ? makeSelectAgentConversations(canonicalAgentId, null) : null,
57
+ [canonicalAgentId]
58
+ );
59
+ const entry = useAppSelector(
60
+ (state) => selectConversations ? selectConversations(state) : null
61
+ );
62
+ const status = entry?.status ?? "idle";
63
+ const conversations = entry?.conversations ?? EMPTY;
64
+ const archived = entry?.archived ?? EMPTY;
65
+ useEffect(() => {
66
+ if (canonicalAgentId && status === "idle") {
67
+ dispatch(
68
+ fetchAgentConversations({
69
+ agentId: canonicalAgentId,
70
+ versionFilter: null
71
+ })
72
+ );
73
+ }
74
+ }, [canonicalAgentId, status, dispatch]);
75
+ const versionGroups = useMemo(
76
+ () => groupConversationsByVersion(conversations),
77
+ [conversations]
78
+ );
79
+ const archivedGroups = useMemo(
80
+ () => groupConversationsByVersion(archived),
81
+ [archived]
82
+ );
83
+ return {
84
+ canonicalAgentId,
85
+ agentName,
86
+ status,
87
+ error: entry?.error ?? null,
88
+ fetchedAt: entry?.fetchedAt ?? null,
89
+ conversations,
90
+ archived,
91
+ versionGroups,
92
+ archivedGroups
93
+ };
94
+ }
95
+ const EMPTY = [];
96
+ function ConversationListRow({
97
+ conv,
98
+ href,
99
+ sourceFeature,
100
+ active,
101
+ onOpen,
102
+ openInPlace,
103
+ linkRow = false,
104
+ size = "sm",
105
+ surfaceKey,
106
+ entity,
107
+ agent,
108
+ source,
109
+ isFavorite,
110
+ untitled = "Untitled",
111
+ kebabAriaLabel,
112
+ onMutationSuccess,
113
+ secondaryLabel,
114
+ leading,
115
+ trailing,
116
+ className
117
+ }) {
118
+ const dispatch = useAppDispatch();
119
+ const title = conv.title?.trim() || untitled;
120
+ return /* @__PURE__ */ jsx(
121
+ ItemRow,
122
+ {
123
+ sourceFeature,
124
+ entity,
125
+ className,
126
+ size,
127
+ label: title,
128
+ secondaryLabel,
129
+ href: linkRow ? href : void 0,
130
+ active,
131
+ onOpen,
132
+ openInPlace,
133
+ leading,
134
+ kebabAriaLabel,
135
+ menu: () => buildConversationMenu({
136
+ conversationId: conv.conversationId,
137
+ title: conv.title,
138
+ isFavorite: isFavorite ?? conv.isFavorite ?? false,
139
+ isArchived: conv.status === "archived",
140
+ excludeFromKg: conv.excludeFromKg ?? false,
141
+ href,
142
+ ...surfaceKey ? { surfaceKey } : {},
143
+ ...agent ? { agent } : {},
144
+ ...source ? { source } : {},
145
+ ...onMutationSuccess ? { onMutationSuccess } : {},
146
+ dispatch
147
+ }),
148
+ rename: {
149
+ value: conv.title ?? "",
150
+ emptyFallback: untitled,
151
+ onCommit: async (next) => {
152
+ const result = await dispatch(
153
+ renameConversation({
154
+ conversationId: conv.conversationId,
155
+ title: next
156
+ })
157
+ );
158
+ if (renameConversation.fulfilled.match(result)) {
159
+ onMutationSuccess?.();
160
+ }
161
+ }
162
+ },
163
+ trailing
164
+ }
165
+ );
166
+ }
167
+ function VersionGroupRow({
168
+ group,
169
+ agentId,
170
+ selectedId,
171
+ onSelect,
172
+ defaultOpen,
173
+ sourceFeature
174
+ }) {
175
+ const [open, setOpen] = useState(defaultOpen);
176
+ const hasActive = group.conversations.some(
177
+ (c) => c.conversationId === selectedId
178
+ );
179
+ return /* @__PURE__ */ jsxs("div", { children: [
180
+ /* @__PURE__ */ jsxs(
181
+ Button,
182
+ {
183
+ variant: "quiet",
184
+ pressed: hasActive,
185
+ icon: open ? /* @__PURE__ */ jsx(ChevronDown, {}) : /* @__PURE__ */ jsx(ChevronRight, {}),
186
+ onClick: () => setOpen((v) => !v),
187
+ className: "w-full",
188
+ children: [
189
+ /* @__PURE__ */ jsx("span", { className: "text-[11px] font-semibold text-muted-foreground uppercase tracking-wide flex-1 min-w-0 truncate", children: group.versionNumber ? `Version ${group.versionNumber}` : "Latest" }),
190
+ /* @__PURE__ */ jsx("span", { className: "text-[10px] text-muted-foreground/60 shrink-0 ml-1", children: group.conversations.length })
191
+ ]
192
+ }
193
+ ),
194
+ open && /* @__PURE__ */ jsx("div", { className: "pl-2", children: group.conversations.map((conv) => {
195
+ const date = formatConversationDate(conv.updatedAt);
196
+ return /* @__PURE__ */ jsx(
197
+ ConversationListRow,
198
+ {
199
+ conv,
200
+ href: agentRunHref(agentId, conv.conversationId),
201
+ sourceFeature,
202
+ active: conv.conversationId === selectedId,
203
+ onOpen: () => onSelect(conv.conversationId),
204
+ trailing: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1 text-[10px] text-muted-foreground/70", children: [
205
+ /* @__PURE__ */ jsx(MessageSquare, { className: "w-2.5 h-2.5 shrink-0" }),
206
+ conv.messageCount,
207
+ date ? ` \xB7 ${date}` : ""
208
+ ] })
209
+ },
210
+ conv.conversationId
211
+ );
212
+ }) })
213
+ ] });
214
+ }
215
+ function AgentVersionGroupedList({
216
+ agentId,
217
+ list,
218
+ selectedId,
219
+ onSelect,
220
+ sourceFeature
221
+ }) {
222
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
223
+ list.versionGroups.map((group, i) => /* @__PURE__ */ jsx(
224
+ VersionGroupRow,
225
+ {
226
+ group,
227
+ agentId,
228
+ selectedId,
229
+ onSelect,
230
+ defaultOpen: i === 0,
231
+ sourceFeature
232
+ },
233
+ group.versionNumber
234
+ )),
235
+ /* @__PURE__ */ jsx(
236
+ ConversationArchiveSection,
237
+ {
238
+ agentIds: [agentId],
239
+ onOpen: onSelect,
240
+ className: "mt-1"
241
+ }
242
+ )
243
+ ] });
244
+ }
245
+ export {
246
+ AgentVersionGroupedList,
247
+ ConversationListRow,
248
+ agentRunHref,
249
+ formatConversationDate,
250
+ groupConversationsByVersion,
251
+ useAgentConversationList
252
+ };
@@ -1,7 +1,11 @@
1
1
  interface ConversationArchiveSectionProps {
2
2
  /** `"consumer"` matches the comfortable /chat sidebar; `"dense"` the rest. */
3
3
  variant?: "dense" | "consumer";
4
+ /** Only these agents' conversations (a per-agent list). Default: all of mine. */
5
+ agentIds?: string[];
6
+ /** Open a row (an archived conversation is readable). Omit = rows are not links. */
7
+ onOpen?: (conversationId: string) => void;
4
8
  className?: string;
5
9
  }
6
- export declare function ConversationArchiveSection({ variant, className, }: ConversationArchiveSectionProps): import("react").JSX.Element;
10
+ export declare function ConversationArchiveSection({ variant, agentIds, onOpen, className, }: ConversationArchiveSectionProps): import("react").JSX.Element;
7
11
  export default ConversationArchiveSection;
@@ -13,23 +13,29 @@ import { ErrorAlchemyMenu } from "../../../host/ui-slots.js";
13
13
  import { Button, DisclosureHeader } from "@ai-matrx/design-system/controls";
14
14
  function ConversationArchiveSection({
15
15
  variant = "dense",
16
+ agentIds,
17
+ onOpen,
16
18
  className
17
19
  }) {
18
20
  const dispatch = useAppDispatch();
19
21
  const [open, setOpen] = useState(false);
20
22
  const [restoringId, setRestoringId] = useState(null);
21
- const ids = useAppSelector(
23
+ const allIds = useAppSelector(
22
24
  (state) => state.conversationList.trashConversationIds
23
25
  );
24
26
  const bodies = useAppSelector(
25
27
  (state) => state.conversationList.trashByConversationId
26
28
  );
29
+ const ids = agentIds && agentIds.length > 0 ? allIds.filter((id) => {
30
+ const agentId = bodies[id]?.agentId;
31
+ return !!agentId && agentIds.includes(agentId);
32
+ }) : allIds;
27
33
  const status = useAppSelector((state) => state.conversationList.trashStatus);
28
34
  const error = useAppSelector((state) => state.conversationList.trashError);
29
35
  const toggle = () => {
30
36
  const next = !open;
31
37
  setOpen(next);
32
- if (next) void dispatch(fetchArchivedConversations());
38
+ if (next) void dispatch(fetchArchivedConversations({ agentIds }));
33
39
  };
34
40
  const handleRestore = useCallback(
35
41
  async (conversationId) => {
@@ -79,7 +85,19 @@ function ConversationArchiveSection({
79
85
  dense ? "h-6" : "h-8"
80
86
  ),
81
87
  children: [
82
- /* @__PURE__ */ jsx(
88
+ onOpen && !conv.deletedAt ? /* @__PURE__ */ jsx(
89
+ "button",
90
+ {
91
+ type: "button",
92
+ onClick: () => onOpen(id),
93
+ className: cn(
94
+ "min-w-0 flex-1 truncate text-left text-muted-foreground hover:text-foreground",
95
+ dense ? "text-[11px]" : "text-xs"
96
+ ),
97
+ title,
98
+ children: title
99
+ }
100
+ ) : /* @__PURE__ */ jsx(
83
101
  "span",
84
102
  {
85
103
  className: cn(
@@ -90,7 +108,7 @@ function ConversationArchiveSection({
90
108
  children: title
91
109
  }
92
110
  ),
93
- /* @__PURE__ */ jsx(Button, { variant: "quiet", icon: restoringId === id ? /* @__PURE__ */ jsx(Loader2, { className: "animate-spin" }) : /* @__PURE__ */ jsx(Undo2, {}), onClick: () => void handleRestore(id), disabled: restoringId === id, "aria-label": `Restore ${title}`, className: "shrink-0", children: "Restore" })
111
+ /* @__PURE__ */ jsx(Button, { variant: "quiet", icon: restoringId === id ? /* @__PURE__ */ jsx(Loader2, { className: "animate-spin" }) : /* @__PURE__ */ jsx(Undo2, {}), onClick: () => void handleRestore(id), disabled: restoringId === id, "aria-label": `Restore ${title}`, title: "Restore", className: "shrink-0" })
94
112
  ]
95
113
  },
96
114
  id
@@ -54,20 +54,14 @@ import {
54
54
  isLiveConversationRow
55
55
  } from "../../redux/conversation-history/types.js";
56
56
  import { useSurfaceSourceFilter } from "../../redux/conversation-history/useSurfaceSourceFilter.js";
57
- import {
58
- renameConversation,
59
- setConversationFavorite
60
- } from "../../redux/conversation-list/conversation-row-actions.thunks.js";
61
- import {
62
- buildConversationMenu
63
- } from "../conversation-actions/conversationActionRegistry.js";
57
+ import { setConversationFavorite } from "../../redux/conversation-list/conversation-row-actions.thunks.js";
64
58
  import { selectAgentById } from "../../redux/agent-definition/selectors.js";
65
59
  import { EntityDoorControls } from "../../../host/ui-slots.js";
60
+ import { ConversationListRow } from "./AgentConversationList.js";
66
61
  import { ConversationSourceFilterTree } from "./ConversationSourceFilterTree.js";
67
62
  import { AllLanesOffNotice } from "./ConversationLaneToggles.js";
68
63
  import { ConversationArchiveSection } from "./ConversationArchiveSection.js";
69
64
  import { SegmentedControl, Button, DisclosureHeader, SearchField } from "@ai-matrx/design-system/controls";
70
- import { ItemRow } from "../../../host/ui-slots.js";
71
65
  import { toast } from "../../../host/notify.js";
72
66
  import {
73
67
  LoadingTapButton,
@@ -699,6 +693,7 @@ const ConsumerView = ({
699
693
  },
700
694
  placeholder: "Search",
701
695
  "aria-label": "Search conversations",
696
+ width: "xl",
702
697
  className: "min-w-0 flex-1"
703
698
  }
704
699
  ) : /* @__PURE__ */ jsx("span", { className: "flex-1" }),
@@ -893,7 +888,6 @@ const Row = ({
893
888
  getSourceMenuCtx,
894
889
  showAgentHint = true
895
890
  }) => {
896
- const dispatch = useAppDispatch();
897
891
  const title = conv.title?.trim() || untitled(conv);
898
892
  const agentName = useAppSelector(
899
893
  (s) => conv.agentId ? selectAgentById(s, conv.agentId)?.name ?? null : null
@@ -928,45 +922,28 @@ const Row = ({
928
922
  star
929
923
  ] }) : star;
930
924
  return /* @__PURE__ */ jsx(
931
- ItemRow,
925
+ ConversationListRow,
932
926
  {
927
+ conv,
928
+ href: resolveHref(conv),
929
+ linkRow: true,
933
930
  sourceFeature: "conversation",
934
931
  entity: {
935
932
  type: "conversation",
936
933
  id: conv.conversationId,
937
934
  title
938
935
  },
939
- label: title,
940
- size: "sm",
941
936
  active,
942
- href: resolveHref(conv),
943
937
  onOpen: onOpen ? () => onOpen(conv) : void 0,
944
938
  openInPlace,
945
939
  leading: /* @__PURE__ */ jsx(StreamingDot, { conversationId: conv.conversationId }),
946
940
  secondaryLabel: meta || void 0,
947
941
  trailing,
948
- menu: () => buildConversationMenu({
949
- conversationId: conv.conversationId,
950
- title: conv.title,
951
- isFavorite,
952
- isArchived: conv.status === "archived",
953
- excludeFromKg: conv.excludeFromKg ?? false,
954
- href: resolveHref(conv),
955
- surfaceKey,
956
- agent: conv.agentId ? { id: conv.agentId, name: agentName } : void 0,
957
- source: getSourceMenuCtx?.(conv),
958
- dispatch
959
- }),
960
- rename: {
961
- value: conv.title ?? "",
962
- emptyFallback: untitled(conv),
963
- onCommit: (next) => void dispatch(
964
- renameConversation({
965
- conversationId: conv.conversationId,
966
- title: next
967
- })
968
- )
969
- },
942
+ surfaceKey,
943
+ isFavorite,
944
+ agent: conv.agentId ? { id: conv.agentId, name: agentName } : void 0,
945
+ source: getSourceMenuCtx?.(conv),
946
+ untitled: untitled(conv),
970
947
  kebabAriaLabel: `Options for ${title}`
971
948
  }
972
949
  );
@@ -1030,12 +1007,14 @@ const ConsumerRow = ({
1030
1007
  getSourceMenuCtx,
1031
1008
  onMutationSuccess
1032
1009
  }) => {
1033
- const dispatch = useAppDispatch();
1034
1010
  const title = conv.title?.trim() || untitled(conv);
1035
1011
  const isStreaming = useAppSelector(selectIsStreaming(conv.conversationId));
1036
1012
  return /* @__PURE__ */ jsx(
1037
- ItemRow,
1013
+ ConversationListRow,
1038
1014
  {
1015
+ conv,
1016
+ href: resolveHref(conv),
1017
+ linkRow: true,
1039
1018
  sourceFeature: "conversation",
1040
1019
  entity: {
1041
1020
  type: "conversation",
@@ -1043,37 +1022,13 @@ const ConsumerRow = ({
1043
1022
  title
1044
1023
  },
1045
1024
  className: "mx-1",
1046
- label: title,
1025
+ size: "md",
1047
1026
  active,
1048
- href: resolveHref(conv),
1049
1027
  onOpen: onOpen ? () => onOpen(conv) : void 0,
1050
1028
  openInPlace,
1051
- menu: () => buildConversationMenu({
1052
- conversationId: conv.conversationId,
1053
- title: conv.title,
1054
- isFavorite: conv.isFavorite ?? false,
1055
- isArchived: conv.status === "archived",
1056
- excludeFromKg: conv.excludeFromKg ?? false,
1057
- href: resolveHref(conv),
1058
- source: getSourceMenuCtx?.(conv),
1059
- onMutationSuccess,
1060
- dispatch
1061
- }),
1062
- rename: {
1063
- value: conv.title ?? "",
1064
- emptyFallback: untitled(conv),
1065
- onCommit: async (next) => {
1066
- const result = await dispatch(
1067
- renameConversation({
1068
- conversationId: conv.conversationId,
1069
- title: next
1070
- })
1071
- );
1072
- if (renameConversation.fulfilled.match(result)) {
1073
- onMutationSuccess?.();
1074
- }
1075
- }
1076
- },
1029
+ source: getSourceMenuCtx?.(conv),
1030
+ onMutationSuccess,
1031
+ untitled: untitled(conv),
1077
1032
  trailing: isStreaming ? /* @__PURE__ */ jsxs("span", { className: "relative flex h-1.5 w-1.5", "aria-hidden": true, children: [
1078
1033
  /* @__PURE__ */ jsx("span", { className: "absolute inline-flex h-full w-full animate-ping rounded-full bg-primary opacity-60" }),
1079
1034
  /* @__PURE__ */ jsx("span", { className: "relative inline-flex h-1.5 w-1.5 rounded-full bg-primary" })
@@ -36,6 +36,8 @@ function TextareaInput({
36
36
  className: isCompact ? "min-h-[60px] text-xs" : "min-h-[160px] text-sm",
37
37
  rows: isCompact ? 2 : void 0,
38
38
  appendTranscript: true,
39
+ expandable: true,
40
+ auxiliaryControlsLabel: variableName,
39
41
  onEnterKey: onEnterAdvance ? () => onEnterAdvance() : void 0,
40
42
  onRequestClose,
41
43
  protectTranscription: true,
@@ -356,12 +356,13 @@ function VariableInputComponent({
356
356
  /* @__PURE__ */ jsx(Label, { className: "text-sm font-medium", children: formattedName }),
357
357
  shownHelpText && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground mt-0.5", children: shownHelpText })
358
358
  ] }),
359
- !hideLabel && compact && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
360
- /* @__PURE__ */ jsx(Label, { className: "text-xs font-medium pb-1", children: formattedName }),
361
- shownHelpText && /* @__PURE__ */ jsxs("span", { className: "text-[11px] text-muted-foreground", children: [
362
- "\xB7 ",
363
- shownHelpText
364
- ] })
359
+ !hideLabel && compact && // The name stands on its own line; the help sits under it on ONE
360
+ // line (the whole sentence on hover). Side by side, a long help
361
+ // wrapped and centred the name against two lines after a "·"
362
+ // (Arman, 2026-10-08).
363
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 pb-1", children: [
364
+ /* @__PURE__ */ jsx(Label, { className: "block text-xs font-medium", children: formattedName }),
365
+ shownHelpText && /* @__PURE__ */ jsx("p", { className: "truncate text-[11px] text-muted-foreground", title: shownHelpText, children: shownHelpText })
365
366
  ] }),
366
367
  inputComponent,
367
368
  randomAssignmentEnabled && /* @__PURE__ */ jsx("div", { className: "flex justify-end pt-1", children: /* @__PURE__ */ jsxs(
@@ -0,0 +1,3 @@
1
+ export declare function ConversationCompanionPills({ conversationId }: {
2
+ conversationId: string;
3
+ }): import("react").JSX.Element;
@@ -0,0 +1,40 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import {
5
+ useConversationCompanions
6
+ } from "../../../../host/composer-extensions.js";
7
+ import { RailPill } from "./rail-pill.js";
8
+ function ConversationCompanionPills({ conversationId }) {
9
+ const companions = useConversationCompanions();
10
+ return /* @__PURE__ */ jsx(Fragment, { children: companions.map((companion) => /* @__PURE__ */ jsx(CompanionPill, { companion, conversationId }, companion.id)) });
11
+ }
12
+ function CompanionPill({
13
+ companion,
14
+ conversationId
15
+ }) {
16
+ const [open, setOpen] = useState(false);
17
+ const pill = companion.usePill?.(conversationId);
18
+ const Panel = companion.Panel;
19
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
20
+ pill?.hidden ? null : /* @__PURE__ */ jsx(
21
+ RailPill,
22
+ {
23
+ item: {
24
+ id: `companion:${companion.id}`,
25
+ icon: companion.icon,
26
+ label: companion.label,
27
+ word: companion.word,
28
+ detail: pill?.detail,
29
+ hint: "Click: open or close the panel",
30
+ active: open,
31
+ onOpen: () => setOpen((o) => !o)
32
+ }
33
+ }
34
+ ),
35
+ /* @__PURE__ */ jsx(Panel, { conversationId, open, onClose: () => setOpen(false) })
36
+ ] });
37
+ }
38
+ export {
39
+ ConversationCompanionPills
40
+ };
@@ -22,11 +22,6 @@ import {
22
22
  DropdownMenuTrigger
23
23
  } from "@ai-matrx/design-system";
24
24
  import { openAfterCurrentLayerCloses } from "../../../../ui/after-current-layer-closes.js";
25
- import {
26
- Tooltip,
27
- TooltipContent,
28
- TooltipTrigger
29
- } from "@ai-matrx/design-system";
30
25
  import { useChatCanvasOpeners, useChatCanvasView } from "../../../../host/canvas.js";
31
26
  import {
32
27
  conversationDocumentsTabId,
@@ -93,6 +88,9 @@ import { ActiveContextLensChip } from "../../../../context/sources/scopes.js";
93
88
  import { selectActiveScopeIdsByType } from "../../../../context/sources/scopes.js";
94
89
  import { contextEntryLabel } from "../../context-policies-display/contextEntryLabel.js";
95
90
  import { useConversationAbilities } from "../../../redux/execution-system/host-conversations/conversation-abilities.js";
91
+ import { ComposerAttachmentSourceChips } from "../../../../host/composer-extensions.js";
92
+ import { ConversationCompanionPills } from "./ConversationCompanionPills.js";
93
+ import { RailPill } from "./rail-pill.js";
96
94
  function entryHasValue(e) {
97
95
  const v = e.value;
98
96
  if (v === void 0 || v === null) return false;
@@ -370,9 +368,11 @@ function ConversationContextRailBody({
370
368
  inline: true
371
369
  }
372
370
  ),
373
- /* @__PURE__ */ jsx(AttachedDocumentChips, { conversationId, inline: true })
371
+ /* @__PURE__ */ jsx(AttachedDocumentChips, { conversationId, inline: true }),
372
+ /* @__PURE__ */ jsx(ComposerAttachmentSourceChips, { conversationId })
374
373
  ] }) : null,
375
374
  inline.map((item) => /* @__PURE__ */ jsx(RailPill, { item }, item.id)),
375
+ /* @__PURE__ */ jsx(ConversationCompanionPills, { conversationId }),
376
376
  overflow.length > 0 && /* @__PURE__ */ jsxs(DropdownMenu, { children: [
377
377
  /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
378
378
  ComposerChip,
@@ -426,29 +426,6 @@ function ConversationContextRailBody({
426
426
  detailSurfaces
427
427
  ] });
428
428
  }
429
- function RailPill({ item }) {
430
- const Icon = item.icon;
431
- return /* @__PURE__ */ jsxs(Tooltip, { children: [
432
- /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx("span", { "data-rail-entry": "", className: "inline-flex shrink-0", children: /* @__PURE__ */ jsx(
433
- ComposerChip,
434
- {
435
- tone: item.tone === "primary" ? "primary" : "neutral",
436
- pressed: item.active ? true : void 0,
437
- busy: item.busy,
438
- icon: /* @__PURE__ */ jsx(Icon, {}),
439
- label: item.word,
440
- onClick: item.onOpen,
441
- "aria-label": item.label,
442
- remove: item.onRemove ? { label: `Remove ${item.label}`, onRemove: item.onRemove } : void 0
443
- }
444
- ) }) }),
445
- /* @__PURE__ */ jsxs(TooltipContent, { side: "top", className: "max-w-[16rem]", children: [
446
- /* @__PURE__ */ jsx("div", { className: "font-medium text-popover-foreground", children: item.label }),
447
- item.detail && /* @__PURE__ */ jsx("div", { className: "mt-0.5 text-muted-foreground", children: item.detail }),
448
- item.hint && /* @__PURE__ */ jsx("div", { className: "mt-0.5 text-[10px] text-muted-foreground/80", children: item.hint })
449
- ] })
450
- ] });
451
- }
452
429
  function DetailSurfaces({ conversationId }) {
453
430
  return /* @__PURE__ */ jsx(CloudBrowserHandoffCanvasOpener, { conversationId });
454
431
  }
@@ -0,0 +1,3 @@
1
+ export declare function DeviceToolsModeRow({ agentId }: {
2
+ agentId: string | null;
3
+ }): import("react").JSX.Element | null;
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useSyncExternalStore } from "react";
4
+ import { useMaybeChatHost } from "../../../../host/react.js";
5
+ import {
6
+ devicePermissionModeKey,
7
+ readDevicePermissionMode,
8
+ writeDevicePermissionMode
9
+ } from "../../../redux/execution-system/utils/host-turn.js";
10
+ import { PicksSwitchRow } from "./RunPicksSurface.js";
11
+ function DeviceToolsModeRow({ agentId }) {
12
+ const host = useMaybeChatHost();
13
+ const key = devicePermissionModeKey(agentId);
14
+ const mode = useSyncExternalStore(
15
+ (listener) => host?.prefs.subscribe((changed) => {
16
+ if (changed.startsWith("chat.device-tools.permission-mode")) listener();
17
+ }) ?? (() => void 0),
18
+ () => host ? readDevicePermissionMode(agentId) : "ask",
19
+ () => "ask"
20
+ );
21
+ if (!host?.deviceTools) return null;
22
+ return /* @__PURE__ */ jsx(
23
+ PicksSwitchRow,
24
+ {
25
+ label: "Ask before acting",
26
+ detail: "This agent",
27
+ title: `Browser actions ${mode === "ask" ? "wait for your approval" : "run without asking"} (${key})`,
28
+ checked: mode === "ask",
29
+ onCheckedChange: (ask) => writeDevicePermissionMode(agentId, ask ? "ask" : "act")
30
+ }
31
+ );
32
+ }
33
+ export {
34
+ DeviceToolsModeRow
35
+ };