@assistant-ui/react 0.14.18 → 0.14.20

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 (334) hide show
  1. package/dist/client/ExternalThread.d.ts +3 -2
  2. package/dist/client/ExternalThread.d.ts.map +1 -1
  3. package/dist/client/ExternalThread.js +721 -256
  4. package/dist/client/ExternalThread.js.map +1 -1
  5. package/dist/client/InMemoryThreadList.d.ts.map +1 -1
  6. package/dist/client/InMemoryThreadList.js +292 -108
  7. package/dist/client/InMemoryThreadList.js.map +1 -1
  8. package/dist/client/SingleThreadList.js +139 -53
  9. package/dist/client/SingleThreadList.js.map +1 -1
  10. package/dist/context/ReadonlyStore.js.map +1 -1
  11. package/dist/context/providers/MessageProvider.js +38 -5
  12. package/dist/context/providers/MessageProvider.js.map +1 -1
  13. package/dist/context/providers/ThreadViewportProvider.js +76 -20
  14. package/dist/context/providers/ThreadViewportProvider.js.map +1 -1
  15. package/dist/context/react/ThreadViewportContext.js.map +1 -1
  16. package/dist/context/react/utils/createContextHook.js.map +1 -1
  17. package/dist/context/react/utils/createContextStoreHook.js +17 -2
  18. package/dist/context/react/utils/createContextStoreHook.js.map +1 -1
  19. package/dist/context/react/utils/createStateHookForRuntime.js.map +1 -1
  20. package/dist/context/react/utils/ensureBinding.js.map +1 -1
  21. package/dist/context/react/utils/useRuntimeState.js +18 -2
  22. package/dist/context/react/utils/useRuntimeState.js.map +1 -1
  23. package/dist/context/stores/ThreadViewport.js.map +1 -1
  24. package/dist/devtools/DevToolsHooks.js.map +1 -1
  25. package/dist/hooks/useMessageQuote.js.map +1 -1
  26. package/dist/hooks/useMessageTiming.js +4 -1
  27. package/dist/hooks/useMessageTiming.js.map +1 -1
  28. package/dist/hooks/useToolCallElapsed.d.ts +23 -0
  29. package/dist/hooks/useToolCallElapsed.d.ts.map +1 -0
  30. package/dist/hooks/useToolCallElapsed.js +72 -0
  31. package/dist/hooks/useToolCallElapsed.js.map +1 -0
  32. package/dist/index.d.ts +4 -2
  33. package/dist/index.js +3 -1
  34. package/dist/internal.js.map +1 -1
  35. package/dist/legacy-runtime/AssistantRuntimeProvider.js +46 -10
  36. package/dist/legacy-runtime/AssistantRuntimeProvider.js.map +1 -1
  37. package/dist/legacy-runtime/cloud/auiV0.js.map +1 -1
  38. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.js +27 -6
  39. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.js.map +1 -1
  40. package/dist/legacy-runtime/hooks/AssistantContext.js +13 -2
  41. package/dist/legacy-runtime/hooks/AssistantContext.js.map +1 -1
  42. package/dist/legacy-runtime/hooks/AttachmentContext.js +9 -1
  43. package/dist/legacy-runtime/hooks/AttachmentContext.js.map +1 -1
  44. package/dist/legacy-runtime/hooks/ComposerContext.js +9 -1
  45. package/dist/legacy-runtime/hooks/ComposerContext.js.map +1 -1
  46. package/dist/legacy-runtime/hooks/MessageContext.js +12 -2
  47. package/dist/legacy-runtime/hooks/MessageContext.js.map +1 -1
  48. package/dist/legacy-runtime/hooks/MessagePartContext.js +9 -1
  49. package/dist/legacy-runtime/hooks/MessagePartContext.js.map +1 -1
  50. package/dist/legacy-runtime/hooks/ThreadContext.js +33 -5
  51. package/dist/legacy-runtime/hooks/ThreadContext.js.map +1 -1
  52. package/dist/legacy-runtime/hooks/ThreadListItemContext.js +9 -1
  53. package/dist/legacy-runtime/hooks/ThreadListItemContext.js.map +1 -1
  54. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.js +3 -3
  55. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.js.map +1 -1
  56. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.js +71 -31
  57. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.js.map +1 -1
  58. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.js.map +1 -1
  59. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js +24 -16
  60. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js.map +1 -1
  61. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.js +17 -12
  62. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.js.map +1 -1
  63. package/dist/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.js +17 -3
  64. package/dist/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.js.map +1 -1
  65. package/dist/mcp-apps/McpAppRenderer.js +6 -6
  66. package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
  67. package/dist/mcp-apps/McpAppsRemoteHost.js +3 -3
  68. package/dist/mcp-apps/McpAppsRemoteHost.js.map +1 -1
  69. package/dist/mcp-apps/app-frame.js +33 -14
  70. package/dist/mcp-apps/app-frame.js.map +1 -1
  71. package/dist/mcp-apps/bridge.js.map +1 -1
  72. package/dist/mcp-apps/types.js.map +1 -1
  73. package/dist/mcp-apps/utils.js.map +1 -1
  74. package/dist/model-context/frame/useAssistantFrameHost.js +32 -14
  75. package/dist/model-context/frame/useAssistantFrameHost.js.map +1 -1
  76. package/dist/model-context/makeAssistantVisible.js +64 -26
  77. package/dist/model-context/makeAssistantVisible.js.map +1 -1
  78. package/dist/primitives/actionBar/ActionBarCopy.js +94 -20
  79. package/dist/primitives/actionBar/ActionBarCopy.js.map +1 -1
  80. package/dist/primitives/actionBar/ActionBarEdit.js.map +1 -1
  81. package/dist/primitives/actionBar/ActionBarExportMarkdown.js +105 -37
  82. package/dist/primitives/actionBar/ActionBarExportMarkdown.js.map +1 -1
  83. package/dist/primitives/actionBar/ActionBarFeedbackNegative.js +60 -11
  84. package/dist/primitives/actionBar/ActionBarFeedbackNegative.js.map +1 -1
  85. package/dist/primitives/actionBar/ActionBarFeedbackPositive.js +60 -11
  86. package/dist/primitives/actionBar/ActionBarFeedbackPositive.js.map +1 -1
  87. package/dist/primitives/actionBar/ActionBarInteractionContext.js +3 -1
  88. package/dist/primitives/actionBar/ActionBarInteractionContext.js.map +1 -1
  89. package/dist/primitives/actionBar/ActionBarReload.js.map +1 -1
  90. package/dist/primitives/actionBar/ActionBarRoot.js +84 -25
  91. package/dist/primitives/actionBar/ActionBarRoot.js.map +1 -1
  92. package/dist/primitives/actionBar/ActionBarSpeak.js.map +1 -1
  93. package/dist/primitives/actionBar/ActionBarStopSpeaking.js +45 -14
  94. package/dist/primitives/actionBar/ActionBarStopSpeaking.js.map +1 -1
  95. package/dist/primitives/actionBar/useActionBarFloatStatus.js +22 -10
  96. package/dist/primitives/actionBar/useActionBarFloatStatus.js.map +1 -1
  97. package/dist/primitives/actionBar.js.map +1 -1
  98. package/dist/primitives/actionBarMore/ActionBarMoreContent.js +44 -7
  99. package/dist/primitives/actionBarMore/ActionBarMoreContent.js.map +1 -1
  100. package/dist/primitives/actionBarMore/ActionBarMoreItem.js +28 -6
  101. package/dist/primitives/actionBarMore/ActionBarMoreItem.js.map +1 -1
  102. package/dist/primitives/actionBarMore/ActionBarMoreRoot.js +103 -36
  103. package/dist/primitives/actionBarMore/ActionBarMoreRoot.js.map +1 -1
  104. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.js +28 -6
  105. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.js.map +1 -1
  106. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.js +28 -6
  107. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.js.map +1 -1
  108. package/dist/primitives/actionBarMore/scope.js.map +1 -1
  109. package/dist/primitives/actionBarMore.js.map +1 -1
  110. package/dist/primitives/assistantModal/AssistantModalAnchor.js +27 -6
  111. package/dist/primitives/assistantModal/AssistantModalAnchor.js.map +1 -1
  112. package/dist/primitives/assistantModal/AssistantModalContent.js +71 -10
  113. package/dist/primitives/assistantModal/AssistantModalContent.js.map +1 -1
  114. package/dist/primitives/assistantModal/AssistantModalRoot.js +93 -26
  115. package/dist/primitives/assistantModal/AssistantModalRoot.js.map +1 -1
  116. package/dist/primitives/assistantModal/AssistantModalTrigger.js +27 -6
  117. package/dist/primitives/assistantModal/AssistantModalTrigger.js.map +1 -1
  118. package/dist/primitives/assistantModal/scope.js.map +1 -1
  119. package/dist/primitives/assistantModal.js.map +1 -1
  120. package/dist/primitives/attachment/AttachmentName.js +13 -1
  121. package/dist/primitives/attachment/AttachmentName.js.map +1 -1
  122. package/dist/primitives/attachment/AttachmentRemove.js +11 -4
  123. package/dist/primitives/attachment/AttachmentRemove.js.map +1 -1
  124. package/dist/primitives/attachment/AttachmentRoot.js +13 -4
  125. package/dist/primitives/attachment/AttachmentRoot.js.map +1 -1
  126. package/dist/primitives/attachment/AttachmentThumb.js +20 -9
  127. package/dist/primitives/attachment/AttachmentThumb.js.map +1 -1
  128. package/dist/primitives/attachment.js.map +1 -1
  129. package/dist/primitives/branchPicker/BranchPickerCount.js +14 -2
  130. package/dist/primitives/branchPicker/BranchPickerCount.js.map +1 -1
  131. package/dist/primitives/branchPicker/BranchPickerNext.js.map +1 -1
  132. package/dist/primitives/branchPicker/BranchPickerNumber.js +14 -2
  133. package/dist/primitives/branchPicker/BranchPickerNumber.js.map +1 -1
  134. package/dist/primitives/branchPicker/BranchPickerPrevious.js.map +1 -1
  135. package/dist/primitives/branchPicker/BranchPickerRoot.js +34 -6
  136. package/dist/primitives/branchPicker/BranchPickerRoot.js.map +1 -1
  137. package/dist/primitives/branchPicker.js.map +1 -1
  138. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js +16 -5
  139. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js.map +1 -1
  140. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.js +13 -4
  141. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.js.map +1 -1
  142. package/dist/primitives/chainOfThought.js.map +1 -1
  143. package/dist/primitives/composer/ComposerAddAttachment.js +37 -24
  144. package/dist/primitives/composer/ComposerAddAttachment.js.map +1 -1
  145. package/dist/primitives/composer/ComposerAttachmentDropzone.js +124 -49
  146. package/dist/primitives/composer/ComposerAttachmentDropzone.js.map +1 -1
  147. package/dist/primitives/composer/ComposerCancel.js.map +1 -1
  148. package/dist/primitives/composer/ComposerDictate.js.map +1 -1
  149. package/dist/primitives/composer/ComposerDictationTranscript.js +32 -7
  150. package/dist/primitives/composer/ComposerDictationTranscript.js.map +1 -1
  151. package/dist/primitives/composer/ComposerInput.js +26 -26
  152. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  153. package/dist/primitives/composer/ComposerInputPluginContext.js +71 -25
  154. package/dist/primitives/composer/ComposerInputPluginContext.js.map +1 -1
  155. package/dist/primitives/composer/ComposerQuote.js +92 -23
  156. package/dist/primitives/composer/ComposerQuote.js.map +1 -1
  157. package/dist/primitives/composer/ComposerRoot.js +45 -11
  158. package/dist/primitives/composer/ComposerRoot.js.map +1 -1
  159. package/dist/primitives/composer/ComposerSend.js +9 -2
  160. package/dist/primitives/composer/ComposerSend.js.map +1 -1
  161. package/dist/primitives/composer/ComposerStopDictation.js +15 -5
  162. package/dist/primitives/composer/ComposerStopDictation.js.map +1 -1
  163. package/dist/primitives/composer/trigger/TriggerPopover.d.ts.map +1 -1
  164. package/dist/primitives/composer/trigger/TriggerPopover.js +215 -75
  165. package/dist/primitives/composer/trigger/TriggerPopover.js.map +1 -1
  166. package/dist/primitives/composer/trigger/TriggerPopoverAction.js.map +1 -1
  167. package/dist/primitives/composer/trigger/TriggerPopoverBack.js +35 -7
  168. package/dist/primitives/composer/trigger/TriggerPopoverBack.js.map +1 -1
  169. package/dist/primitives/composer/trigger/TriggerPopoverCategories.js +134 -28
  170. package/dist/primitives/composer/trigger/TriggerPopoverCategories.js.map +1 -1
  171. package/dist/primitives/composer/trigger/TriggerPopoverDirective.js.map +1 -1
  172. package/dist/primitives/composer/trigger/TriggerPopoverItems.js +132 -28
  173. package/dist/primitives/composer/trigger/TriggerPopoverItems.js.map +1 -1
  174. package/dist/primitives/composer/trigger/TriggerPopoverResource.js +124 -52
  175. package/dist/primitives/composer/trigger/TriggerPopoverResource.js.map +1 -1
  176. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js +181 -78
  177. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js.map +1 -1
  178. package/dist/primitives/composer/trigger/detectTrigger.js.map +1 -1
  179. package/dist/primitives/composer/trigger/index.js.map +1 -1
  180. package/dist/primitives/composer/trigger/triggerDetectionResource.js +28 -14
  181. package/dist/primitives/composer/trigger/triggerDetectionResource.js.map +1 -1
  182. package/dist/primitives/composer/trigger/triggerKeyboardResource.js +115 -58
  183. package/dist/primitives/composer/trigger/triggerKeyboardResource.js.map +1 -1
  184. package/dist/primitives/composer/trigger/triggerNavigationResource.js +202 -70
  185. package/dist/primitives/composer/trigger/triggerNavigationResource.js.map +1 -1
  186. package/dist/primitives/composer/trigger/triggerSelectionResource.js +49 -13
  187. package/dist/primitives/composer/trigger/triggerSelectionResource.js.map +1 -1
  188. package/dist/primitives/composer.js.map +1 -1
  189. package/dist/primitives/dropdownMenuRenderPrimitives.js.map +1 -1
  190. package/dist/primitives/error/ErrorMessage.js +28 -6
  191. package/dist/primitives/error/ErrorMessage.js.map +1 -1
  192. package/dist/primitives/error/ErrorRoot.js +14 -5
  193. package/dist/primitives/error/ErrorRoot.js.map +1 -1
  194. package/dist/primitives/error.js.map +1 -1
  195. package/dist/primitives/message/MessageError.js +2 -1
  196. package/dist/primitives/message/MessageError.js.map +1 -1
  197. package/dist/primitives/message/MessageIf.js +50 -20
  198. package/dist/primitives/message/MessageIf.js.map +1 -1
  199. package/dist/primitives/message/MessageParts.js +41 -7
  200. package/dist/primitives/message/MessageParts.js.map +1 -1
  201. package/dist/primitives/message/MessagePartsGrouped.js +399 -94
  202. package/dist/primitives/message/MessagePartsGrouped.js.map +1 -1
  203. package/dist/primitives/message/MessageRoot.js +197 -65
  204. package/dist/primitives/message/MessageRoot.js.map +1 -1
  205. package/dist/primitives/message.js.map +1 -1
  206. package/dist/primitives/messagePart/MessagePartImage.js +15 -5
  207. package/dist/primitives/messagePart/MessagePartImage.js.map +1 -1
  208. package/dist/primitives/messagePart/MessagePartText.js +35 -7
  209. package/dist/primitives/messagePart/MessagePartText.js.map +1 -1
  210. package/dist/primitives/messagePart/useMessagePartData.js +5 -4
  211. package/dist/primitives/messagePart/useMessagePartData.js.map +1 -1
  212. package/dist/primitives/messagePart/useMessagePartFile.js +5 -4
  213. package/dist/primitives/messagePart/useMessagePartFile.js.map +1 -1
  214. package/dist/primitives/messagePart/useMessagePartImage.js +5 -4
  215. package/dist/primitives/messagePart/useMessagePartImage.js.map +1 -1
  216. package/dist/primitives/messagePart/useMessagePartReasoning.js +5 -4
  217. package/dist/primitives/messagePart/useMessagePartReasoning.js.map +1 -1
  218. package/dist/primitives/messagePart/useMessagePartSource.js +5 -4
  219. package/dist/primitives/messagePart/useMessagePartSource.js.map +1 -1
  220. package/dist/primitives/messagePart/useMessagePartText.js +5 -4
  221. package/dist/primitives/messagePart/useMessagePartText.js.map +1 -1
  222. package/dist/primitives/messagePart.js.map +1 -1
  223. package/dist/primitives/queueItem/QueueItemRemove.js +11 -4
  224. package/dist/primitives/queueItem/QueueItemRemove.js.map +1 -1
  225. package/dist/primitives/queueItem/QueueItemSteer.js +11 -4
  226. package/dist/primitives/queueItem/QueueItemSteer.js.map +1 -1
  227. package/dist/primitives/queueItem/QueueItemText.js +20 -6
  228. package/dist/primitives/queueItem/QueueItemText.js.map +1 -1
  229. package/dist/primitives/queueItem.js.map +1 -1
  230. package/dist/primitives/reasoning/useScrollLock.js +61 -43
  231. package/dist/primitives/reasoning/useScrollLock.js.map +1 -1
  232. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js +56 -16
  233. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js.map +1 -1
  234. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js +120 -59
  235. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js.map +1 -1
  236. package/dist/primitives/selectionToolbar.js.map +1 -1
  237. package/dist/primitives/suggestion/SuggestionDescription.js +20 -6
  238. package/dist/primitives/suggestion/SuggestionDescription.js.map +1 -1
  239. package/dist/primitives/suggestion/SuggestionTitle.js +20 -6
  240. package/dist/primitives/suggestion/SuggestionTitle.js.map +1 -1
  241. package/dist/primitives/suggestion/SuggestionTrigger.js +39 -26
  242. package/dist/primitives/suggestion/SuggestionTrigger.js.map +1 -1
  243. package/dist/primitives/suggestion.js.map +1 -1
  244. package/dist/primitives/thread/ThreadEmpty.js +6 -2
  245. package/dist/primitives/thread/ThreadEmpty.js.map +1 -1
  246. package/dist/primitives/thread/ThreadIf.js +32 -10
  247. package/dist/primitives/thread/ThreadIf.js.map +1 -1
  248. package/dist/primitives/thread/ThreadRoot.js +13 -4
  249. package/dist/primitives/thread/ThreadRoot.js.map +1 -1
  250. package/dist/primitives/thread/ThreadScrollToBottom.js +24 -6
  251. package/dist/primitives/thread/ThreadScrollToBottom.js.map +1 -1
  252. package/dist/primitives/thread/ThreadSuggestion.js +18 -6
  253. package/dist/primitives/thread/ThreadSuggestion.js.map +1 -1
  254. package/dist/primitives/thread/ThreadViewport.js +185 -47
  255. package/dist/primitives/thread/ThreadViewport.js.map +1 -1
  256. package/dist/primitives/thread/ThreadViewportFooter.js +22 -9
  257. package/dist/primitives/thread/ThreadViewportFooter.js.map +1 -1
  258. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.js.map +1 -1
  259. package/dist/primitives/thread/topAnchor/createReserveObservers.js.map +1 -1
  260. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.js.map +1 -1
  261. package/dist/primitives/thread/topAnchor/topAnchorTurn.js.map +1 -1
  262. package/dist/primitives/thread/topAnchor/topAnchorUtils.js.map +1 -1
  263. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js +19 -4
  264. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js.map +1 -1
  265. package/dist/primitives/thread/useThreadViewportAutoScroll.js +16 -16
  266. package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
  267. package/dist/primitives/thread.js.map +1 -1
  268. package/dist/primitives/threadList/ThreadListLoadMore.js.map +1 -1
  269. package/dist/primitives/threadList/ThreadListNew.js +53 -11
  270. package/dist/primitives/threadList/ThreadListNew.js.map +1 -1
  271. package/dist/primitives/threadList/ThreadListRoot.js +13 -4
  272. package/dist/primitives/threadList/ThreadListRoot.js.map +1 -1
  273. package/dist/primitives/threadList.js.map +1 -1
  274. package/dist/primitives/threadListItem/ThreadListItemArchive.js.map +1 -1
  275. package/dist/primitives/threadListItem/ThreadListItemDelete.js.map +1 -1
  276. package/dist/primitives/threadListItem/ThreadListItemRoot.js +26 -7
  277. package/dist/primitives/threadListItem/ThreadListItemRoot.js.map +1 -1
  278. package/dist/primitives/threadListItem/ThreadListItemTrigger.js.map +1 -1
  279. package/dist/primitives/threadListItem/ThreadListItemUnarchive.js.map +1 -1
  280. package/dist/primitives/threadListItem.js.map +1 -1
  281. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js +44 -7
  282. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js.map +1 -1
  283. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js +28 -6
  284. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js.map +1 -1
  285. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js +25 -5
  286. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js.map +1 -1
  287. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js +28 -6
  288. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js.map +1 -1
  289. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js +28 -6
  290. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js.map +1 -1
  291. package/dist/primitives/threadListItemMore/scope.js.map +1 -1
  292. package/dist/primitives/threadListItemMore.js.map +1 -1
  293. package/dist/sandbox-host/SandboxHost.js.map +1 -1
  294. package/dist/tests/remote-thread-list-test-helpers.js.map +1 -1
  295. package/dist/tests/setup.js.map +1 -1
  296. package/dist/unstable/useComposerInputHistory.js.map +1 -1
  297. package/dist/unstable/useMentionAdapter.js.map +1 -1
  298. package/dist/unstable/useMessageStallDetection.d.ts +29 -0
  299. package/dist/unstable/useMessageStallDetection.d.ts.map +1 -0
  300. package/dist/unstable/useMessageStallDetection.js +69 -0
  301. package/dist/unstable/useMessageStallDetection.js.map +1 -0
  302. package/dist/unstable/useSlashCommandAdapter.js.map +1 -1
  303. package/dist/utils/Primitive.js +57 -12
  304. package/dist/utils/Primitive.js.map +1 -1
  305. package/dist/utils/createActionButton.js +23 -7
  306. package/dist/utils/createActionButton.js.map +1 -1
  307. package/dist/utils/getSelectionMessageId.js.map +1 -1
  308. package/dist/utils/hooks/useManagedRef.js +16 -8
  309. package/dist/utils/hooks/useManagedRef.js.map +1 -1
  310. package/dist/utils/hooks/useMediaQuery.js +25 -10
  311. package/dist/utils/hooks/useMediaQuery.js.map +1 -1
  312. package/dist/utils/hooks/useOnResizeContent.js +29 -19
  313. package/dist/utils/hooks/useOnResizeContent.js.map +1 -1
  314. package/dist/utils/hooks/useOnScrollToBottom.js +20 -4
  315. package/dist/utils/hooks/useOnScrollToBottom.js.map +1 -1
  316. package/dist/utils/hooks/useSizeHandle.js +23 -15
  317. package/dist/utils/hooks/useSizeHandle.js.map +1 -1
  318. package/dist/utils/json/is-json-equal.js.map +1 -1
  319. package/dist/utils/json/is-json.js.map +1 -1
  320. package/dist/utils/smooth/SmoothContext.js +41 -11
  321. package/dist/utils/smooth/SmoothContext.js.map +1 -1
  322. package/dist/utils/smooth/useSmooth.js +5 -5
  323. package/dist/utils/smooth/useSmooth.js.map +1 -1
  324. package/dist/utils/useToolArgsFieldStatus.js +13 -5
  325. package/dist/utils/useToolArgsFieldStatus.js.map +1 -1
  326. package/package.json +9 -9
  327. package/src/client/ExternalThread.ts +81 -52
  328. package/src/client/InMemoryThreadList.ts +12 -14
  329. package/src/hooks/useToolCallElapsed.ts +52 -0
  330. package/src/index.ts +11 -0
  331. package/src/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.test.ts +10 -6
  332. package/src/primitives/composer/trigger/TriggerPopover.tsx +4 -5
  333. package/src/tests/toolCallTiming.test.tsx +221 -0
  334. package/src/unstable/useMessageStallDetection.ts +91 -0
@@ -1,22 +1,36 @@
1
1
  import { detectTrigger } from "./detectTrigger.js";
2
- import { useMemo, useState } from "@assistant-ui/tap/react-shim";
2
+ import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
3
+ import { useState } from "@assistant-ui/tap/react-shim";
3
4
  import { resource } from "@assistant-ui/tap";
4
5
  //#region src/primitives/composer/trigger/triggerDetectionResource.ts
5
6
  /** Tracks cursor position and derives the active trigger + query from composer text. */
6
- const useTriggerDetectionResource = ({ text, triggerChar }) => {
7
+ const useTriggerDetectionResource = (t0) => {
8
+ const $ = c(7);
9
+ const { text, triggerChar } = t0;
7
10
  const [cursorPosition, setCursorPosition] = useState(text.length);
8
- const trigger = useMemo(() => {
9
- return detectTrigger(text, triggerChar, Math.min(cursorPosition, text.length));
10
- }, [
11
- cursorPosition,
12
- text,
13
- triggerChar
14
- ]);
15
- return {
16
- trigger,
17
- query: trigger?.query ?? "",
18
- setCursorPosition
19
- };
11
+ const pos = Math.min(cursorPosition, text.length);
12
+ let t1;
13
+ if ($[0] !== pos || $[1] !== text || $[2] !== triggerChar) {
14
+ t1 = detectTrigger(text, triggerChar, pos);
15
+ $[0] = pos;
16
+ $[1] = text;
17
+ $[2] = triggerChar;
18
+ $[3] = t1;
19
+ } else t1 = $[3];
20
+ const trigger = t1;
21
+ const query = trigger?.query ?? "";
22
+ let t2;
23
+ if ($[4] !== query || $[5] !== trigger) {
24
+ t2 = {
25
+ trigger,
26
+ query,
27
+ setCursorPosition
28
+ };
29
+ $[4] = query;
30
+ $[5] = trigger;
31
+ $[6] = t2;
32
+ } else t2 = $[6];
33
+ return t2;
20
34
  };
21
35
  const TriggerDetectionResource = resource(useTriggerDetectionResource);
22
36
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"triggerDetectionResource.js","names":[],"sources":["../../../../src/primitives/composer/trigger/triggerDetectionResource.ts"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport { detectTrigger } from \"./detectTrigger\";\n\n/** Detected trigger position within the composer text. */\nexport type DetectedTrigger = {\n readonly offset: number;\n readonly query: string;\n};\n\nexport type TriggerDetectionResourceOutput = {\n /** Detected trigger (or `null` when inactive). */\n readonly trigger: DetectedTrigger | null;\n /** Current query string (empty when no trigger active). */\n readonly query: string;\n /** Update the tracked cursor position (wired to composer input). */\n setCursorPosition(pos: number): void;\n};\n\n/** Tracks cursor position and derives the active trigger + query from composer text. */\nconst useTriggerDetectionResource = ({\n text,\n triggerChar,\n}: {\n text: string;\n triggerChar: string;\n}): TriggerDetectionResourceOutput => {\n const [cursorPosition, setCursorPosition] = useState(text.length);\n\n const trigger = useMemo(() => {\n const pos = Math.min(cursorPosition, text.length);\n return detectTrigger(text, triggerChar, pos);\n }, [cursorPosition, text, triggerChar]);\n\n const query = trigger?.query ?? \"\";\n\n return {\n trigger,\n query,\n setCursorPosition,\n };\n};\n\nexport const TriggerDetectionResource = resource(useTriggerDetectionResource);\n"],"mappings":";;;;;AAoBA,MAAM,+BAA+B,EACnC,MACA,kBAIoC;CACpC,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,KAAK,MAAM;CAEhE,MAAM,UAAU,cAAc;EAE5B,OAAO,cAAc,MAAM,aADf,KAAK,IAAI,gBAAgB,KAAK,MACA,CAAC;CAC7C,GAAG;EAAC;EAAgB;EAAM;CAAW,CAAC;CAItC,OAAO;EACL;EACA,OAJY,SAAS,SAAS;EAK9B;CACF;AACF;AAEA,MAAa,2BAA2B,SAAS,2BAA2B"}
1
+ {"version":3,"file":"triggerDetectionResource.js","names":["useMemo","useState","resource","detectTrigger","DetectedTrigger","offset","query","TriggerDetectionResourceOutput","trigger","setCursorPosition","pos","useTriggerDetectionResource","t0","$","_c","text","triggerChar","cursorPosition","length","Math","min","t1","t2","TriggerDetectionResource"],"sources":["../../../../src/primitives/composer/trigger/triggerDetectionResource.ts"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport { detectTrigger } from \"./detectTrigger\";\n\n/** Detected trigger position within the composer text. */\nexport type DetectedTrigger = {\n readonly offset: number;\n readonly query: string;\n};\n\nexport type TriggerDetectionResourceOutput = {\n /** Detected trigger (or `null` when inactive). */\n readonly trigger: DetectedTrigger | null;\n /** Current query string (empty when no trigger active). */\n readonly query: string;\n /** Update the tracked cursor position (wired to composer input). */\n setCursorPosition(pos: number): void;\n};\n\n/** Tracks cursor position and derives the active trigger + query from composer text. */\nconst useTriggerDetectionResource = ({\n text,\n triggerChar,\n}: {\n text: string;\n triggerChar: string;\n}): TriggerDetectionResourceOutput => {\n const [cursorPosition, setCursorPosition] = useState(text.length);\n\n const trigger = useMemo(() => {\n const pos = Math.min(cursorPosition, text.length);\n return detectTrigger(text, triggerChar, pos);\n }, [cursorPosition, text, triggerChar]);\n\n const query = trigger?.query ?? \"\";\n\n return {\n trigger,\n query,\n setCursorPosition,\n };\n};\n\nexport const TriggerDetectionResource = resource(useTriggerDetectionResource);\n"],"mappings":";;;;;;AAoBA,MAAMW,+BAA8BC,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAC,MAAAC,gBAAAJ;CAOnC,MAAA,CAAAK,gBAAAR,qBAA4CR,SAASc,KAAIG,MAAO;CAG9D,MAAAR,MAAYS,KAAIC,IAAKH,gBAAgBF,KAAIG,MAAO;CAAE,IAAAG;CAAA,IAAAR,EAAA,OAAAH,OAAAG,EAAA,OAAAE,QAAAF,EAAA,OAAAG,aAAA;EAC3CK,KAAAlB,cAAcY,MAAMC,aAAaN,GAAG;EAACG,EAAA,KAAAH;EAAAG,EAAA,KAAAE;EAAAF,EAAA,KAAAG;EAAAH,EAAA,KAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAF9C,MAAAL,UAEEa;CAGF,MAAAf,QAAcE,SAAOF,SAAP;CAAqB,IAAAgB;CAAA,IAAAT,EAAA,OAAAP,SAAAO,EAAA,OAAAL,SAAA;EAE5Bc,KAAA;GAAAd;GAAAF;GAAAG;EAIP;EAACI,EAAA,KAAAP;EAAAO,EAAA,KAAAL;EAAAK,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,OAJMS;AAIN;AAGH,MAAaC,2BAA2BrB,SAASS,2BAA2B"}
@@ -1,3 +1,4 @@
1
+ import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
1
2
  import { useEffect, useEffectEvent, useState } from "@assistant-ui/tap/react-shim";
2
3
  import { resource } from "@assistant-ui/tap";
3
4
  //#region src/primitives/composer/trigger/triggerKeyboardResource.ts
@@ -9,69 +10,125 @@ function isTriggerItem(x) {
9
10
  * Owns keyboard-driven highlight state for the popover. Delegates selection,
10
11
  * category drill-in, back, and close to the callbacks supplied by the parent.
11
12
  */
12
- const useTriggerKeyboardResource = ({ navigableList, isSearchMode, activeCategoryId, query, popoverId, open, selectItem, selectCategory, goBack, close }) => {
13
+ const useTriggerKeyboardResource = (t0) => {
14
+ const $ = c(25);
15
+ const { navigableList, isSearchMode, activeCategoryId, query, popoverId, open, selectItem, selectCategory, goBack, close } = t0;
13
16
  const [highlightedIndex, setHighlightedIndex] = useState(0);
14
- useEffect(() => {
15
- setHighlightedIndex(0);
16
- }, [navigableList]);
17
- useEffect(() => {
18
- setHighlightedIndex(0);
19
- }, [isSearchMode, activeCategoryId]);
20
- const highlightIndex = useEffectEvent((index) => {
21
- if (index < 0 || index >= navigableList.length) return;
22
- if (index === highlightedIndex) return;
23
- setHighlightedIndex(index);
24
- });
25
- const handleKeyDown = useEffectEvent((e) => {
26
- if (!open) return false;
27
- switch (e.key) {
28
- case "ArrowDown":
29
- e.preventDefault();
30
- setHighlightedIndex((prev) => {
31
- const len = navigableList.length;
32
- if (len === 0) return 0;
33
- return prev < len - 1 ? prev + 1 : 0;
34
- });
35
- return true;
36
- case "ArrowUp":
37
- e.preventDefault();
38
- setHighlightedIndex((prev) => {
39
- const len = navigableList.length;
40
- if (len === 0) return 0;
41
- return prev > 0 ? prev - 1 : len - 1;
42
- });
43
- return true;
44
- case "Enter":
45
- case "Tab": {
46
- if (e.shiftKey) return false;
47
- e.preventDefault();
48
- const item = navigableList[highlightedIndex];
49
- if (!item) return true;
50
- if (isTriggerItem(item)) selectItem(item);
51
- else selectCategory(item.id);
52
- return true;
53
- }
54
- case "Escape":
55
- e.preventDefault();
56
- close();
57
- return true;
58
- case "Backspace":
59
- if (activeCategoryId && query === "") {
17
+ let t1;
18
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
19
+ t1 = () => {
20
+ setHighlightedIndex(0);
21
+ };
22
+ $[0] = t1;
23
+ } else t1 = $[0];
24
+ let t2;
25
+ if ($[1] !== navigableList) {
26
+ t2 = [navigableList];
27
+ $[1] = navigableList;
28
+ $[2] = t2;
29
+ } else t2 = $[2];
30
+ useEffect(t1, t2);
31
+ let t3;
32
+ if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
33
+ t3 = () => {
34
+ setHighlightedIndex(0);
35
+ };
36
+ $[3] = t3;
37
+ } else t3 = $[3];
38
+ let t4;
39
+ if ($[4] !== activeCategoryId || $[5] !== isSearchMode) {
40
+ t4 = [isSearchMode, activeCategoryId];
41
+ $[4] = activeCategoryId;
42
+ $[5] = isSearchMode;
43
+ $[6] = t4;
44
+ } else t4 = $[6];
45
+ useEffect(t3, t4);
46
+ let t5;
47
+ if ($[7] !== highlightedIndex || $[8] !== navigableList.length) {
48
+ t5 = (index) => {
49
+ if (index < 0 || index >= navigableList.length) return;
50
+ if (index === highlightedIndex) return;
51
+ setHighlightedIndex(index);
52
+ };
53
+ $[7] = highlightedIndex;
54
+ $[8] = navigableList.length;
55
+ $[9] = t5;
56
+ } else t5 = $[9];
57
+ const highlightIndex = useEffectEvent(t5);
58
+ let t6;
59
+ if ($[10] !== activeCategoryId || $[11] !== close || $[12] !== goBack || $[13] !== highlightedIndex || $[14] !== navigableList || $[15] !== open || $[16] !== query || $[17] !== selectCategory || $[18] !== selectItem) {
60
+ t6 = (e) => {
61
+ if (!open) return false;
62
+ switch (e.key) {
63
+ case "ArrowDown":
64
+ e.preventDefault();
65
+ setHighlightedIndex((prev_0) => {
66
+ const len_0 = navigableList.length;
67
+ if (len_0 === 0) return 0;
68
+ return prev_0 < len_0 - 1 ? prev_0 + 1 : 0;
69
+ });
70
+ return true;
71
+ case "ArrowUp":
72
+ e.preventDefault();
73
+ setHighlightedIndex((prev) => {
74
+ const len = navigableList.length;
75
+ if (len === 0) return 0;
76
+ return prev > 0 ? prev - 1 : len - 1;
77
+ });
78
+ return true;
79
+ case "Enter":
80
+ case "Tab": {
81
+ if (e.shiftKey) return false;
60
82
  e.preventDefault();
61
- goBack();
83
+ const item = navigableList[highlightedIndex];
84
+ if (!item) return true;
85
+ if (isTriggerItem(item)) selectItem(item);
86
+ else selectCategory(item.id);
62
87
  return true;
63
88
  }
64
- return false;
65
- default: return false;
66
- }
67
- });
89
+ case "Escape":
90
+ e.preventDefault();
91
+ close();
92
+ return true;
93
+ case "Backspace":
94
+ if (activeCategoryId && query === "") {
95
+ e.preventDefault();
96
+ goBack();
97
+ return true;
98
+ }
99
+ return false;
100
+ default: return false;
101
+ }
102
+ };
103
+ $[10] = activeCategoryId;
104
+ $[11] = close;
105
+ $[12] = goBack;
106
+ $[13] = highlightedIndex;
107
+ $[14] = navigableList;
108
+ $[15] = open;
109
+ $[16] = query;
110
+ $[17] = selectCategory;
111
+ $[18] = selectItem;
112
+ $[19] = t6;
113
+ } else t6 = $[19];
114
+ const handleKeyDown = useEffectEvent(t6);
68
115
  const highlightedEntry = navigableList[highlightedIndex];
69
- return {
70
- highlightedIndex,
71
- highlightedItemId: open && highlightedEntry ? `${popoverId}-option-${highlightedEntry.id}` : void 0,
72
- highlightIndex,
73
- handleKeyDown
74
- };
116
+ const highlightedItemId = open && highlightedEntry ? `${popoverId}-option-${highlightedEntry.id}` : void 0;
117
+ let t7;
118
+ if ($[20] !== handleKeyDown || $[21] !== highlightIndex || $[22] !== highlightedIndex || $[23] !== highlightedItemId) {
119
+ t7 = {
120
+ highlightedIndex,
121
+ highlightedItemId,
122
+ highlightIndex,
123
+ handleKeyDown
124
+ };
125
+ $[20] = handleKeyDown;
126
+ $[21] = highlightIndex;
127
+ $[22] = highlightedIndex;
128
+ $[23] = highlightedItemId;
129
+ $[24] = t7;
130
+ } else t7 = $[24];
131
+ return t7;
75
132
  };
76
133
  const TriggerKeyboardResource = resource(useTriggerKeyboardResource);
77
134
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"triggerKeyboardResource.js","names":[],"sources":["../../../../src/primitives/composer/trigger/triggerKeyboardResource.ts"],"sourcesContent":["import { useEffect, useEffectEvent, useState } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type {\n Unstable_TriggerCategory,\n Unstable_TriggerItem,\n} from \"@assistant-ui/core\";\n\n/** Relies on `Unstable_TriggerCategory` never carrying a `type` field. */\nfunction isTriggerItem(\n x: Unstable_TriggerItem | Unstable_TriggerCategory,\n): x is Unstable_TriggerItem {\n return \"type\" in x;\n}\n\n/** Key event shape accepted by the keyboard handler. */\nexport type TriggerPopoverKeyEvent = {\n readonly key: string;\n readonly shiftKey: boolean;\n preventDefault(): void;\n};\n\nexport type TriggerKeyboardResourceOutput = {\n /** Index of the currently highlighted entry within the navigable list. */\n readonly highlightedIndex: number;\n /** ID of the currently highlighted item (for `aria-activedescendant`). */\n readonly highlightedItemId: string | undefined;\n /** Move the highlight to an entry index (e.g. from pointer hover). Out-of-range values are ignored. */\n highlightIndex(index: number): void;\n /** Handle a key event; returns `true` if it was consumed. */\n handleKeyDown(e: TriggerPopoverKeyEvent): boolean;\n};\n\n/**\n * Owns keyboard-driven highlight state for the popover. Delegates selection,\n * category drill-in, back, and close to the callbacks supplied by the parent.\n */\nconst useTriggerKeyboardResource = ({\n navigableList,\n isSearchMode,\n activeCategoryId,\n query,\n popoverId,\n open,\n selectItem,\n selectCategory,\n goBack,\n close,\n}: {\n navigableList: readonly (Unstable_TriggerCategory | Unstable_TriggerItem)[];\n isSearchMode: boolean;\n activeCategoryId: string | null;\n query: string;\n popoverId: string;\n open: boolean;\n selectItem: (item: Unstable_TriggerItem) => void;\n selectCategory: (categoryId: string) => void;\n goBack: () => void;\n close: () => void;\n}): TriggerKeyboardResourceOutput => {\n const [highlightedIndex, setHighlightedIndex] = useState(0);\n\n useEffect(() => {\n setHighlightedIndex(0);\n }, [navigableList]);\n\n useEffect(() => {\n setHighlightedIndex(0);\n }, [isSearchMode, activeCategoryId]);\n\n const highlightIndex = useEffectEvent((index: number) => {\n if (index < 0 || index >= navigableList.length) return;\n if (index === highlightedIndex) return;\n setHighlightedIndex(index);\n });\n\n const handleKeyDown = useEffectEvent((e: TriggerPopoverKeyEvent): boolean => {\n if (!open) return false;\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n setHighlightedIndex((prev) => {\n const len = navigableList.length;\n if (len === 0) return 0;\n return prev < len - 1 ? prev + 1 : 0;\n });\n return true;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n setHighlightedIndex((prev) => {\n const len = navigableList.length;\n if (len === 0) return 0;\n return prev > 0 ? prev - 1 : len - 1;\n });\n return true;\n }\n case \"Enter\":\n case \"Tab\": {\n if (e.shiftKey) return false;\n e.preventDefault();\n const item = navigableList[highlightedIndex];\n if (!item) return true;\n\n if (isTriggerItem(item)) {\n selectItem(item);\n } else {\n selectCategory(item.id);\n }\n return true;\n }\n case \"Escape\": {\n e.preventDefault();\n close();\n return true;\n }\n case \"Backspace\": {\n if (activeCategoryId && query === \"\") {\n e.preventDefault();\n goBack();\n return true;\n }\n return false;\n }\n default:\n return false;\n }\n });\n\n const highlightedEntry = navigableList[highlightedIndex];\n const highlightedItemId =\n open && highlightedEntry\n ? `${popoverId}-option-${highlightedEntry.id}`\n : undefined;\n\n return {\n highlightedIndex,\n highlightedItemId,\n highlightIndex,\n handleKeyDown,\n };\n};\n\nexport const TriggerKeyboardResource = resource(useTriggerKeyboardResource);\n"],"mappings":";;;;AAQA,SAAS,cACP,GAC2B;CAC3B,OAAO,UAAU;AACnB;;;;;AAwBA,MAAM,8BAA8B,EAClC,eACA,cACA,kBACA,OACA,WACA,MACA,YACA,gBACA,QACA,YAYmC;CACnC,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,CAAC;CAE1D,gBAAgB;EACd,oBAAoB,CAAC;CACvB,GAAG,CAAC,aAAa,CAAC;CAElB,gBAAgB;EACd,oBAAoB,CAAC;CACvB,GAAG,CAAC,cAAc,gBAAgB,CAAC;CAEnC,MAAM,iBAAiB,gBAAgB,UAAkB;EACvD,IAAI,QAAQ,KAAK,SAAS,cAAc,QAAQ;EAChD,IAAI,UAAU,kBAAkB;EAChC,oBAAoB,KAAK;CAC3B,CAAC;CAED,MAAM,gBAAgB,gBAAgB,MAAuC;EAC3E,IAAI,CAAC,MAAM,OAAO;EAElB,QAAQ,EAAE,KAAV;GACE,KAAK;IACH,EAAE,eAAe;IACjB,qBAAqB,SAAS;KAC5B,MAAM,MAAM,cAAc;KAC1B,IAAI,QAAQ,GAAG,OAAO;KACtB,OAAO,OAAO,MAAM,IAAI,OAAO,IAAI;IACrC,CAAC;IACD,OAAO;GAET,KAAK;IACH,EAAE,eAAe;IACjB,qBAAqB,SAAS;KAC5B,MAAM,MAAM,cAAc;KAC1B,IAAI,QAAQ,GAAG,OAAO;KACtB,OAAO,OAAO,IAAI,OAAO,IAAI,MAAM;IACrC,CAAC;IACD,OAAO;GAET,KAAK;GACL,KAAK,OAAO;IACV,IAAI,EAAE,UAAU,OAAO;IACvB,EAAE,eAAe;IACjB,MAAM,OAAO,cAAc;IAC3B,IAAI,CAAC,MAAM,OAAO;IAElB,IAAI,cAAc,IAAI,GACpB,WAAW,IAAI;SAEf,eAAe,KAAK,EAAE;IAExB,OAAO;GACT;GACA,KAAK;IACH,EAAE,eAAe;IACjB,MAAM;IACN,OAAO;GAET,KAAK;IACH,IAAI,oBAAoB,UAAU,IAAI;KACpC,EAAE,eAAe;KACjB,OAAO;KACP,OAAO;IACT;IACA,OAAO;GAET,SACE,OAAO;EACX;CACF,CAAC;CAED,MAAM,mBAAmB,cAAc;CAMvC,OAAO;EACL;EACA,mBANA,QAAQ,mBACJ,GAAG,UAAU,UAAU,iBAAiB,OACxC,KAAA;EAKJ;EACA;CACF;AACF;AAEA,MAAa,0BAA0B,SAAS,0BAA0B"}
1
+ {"version":3,"file":"triggerKeyboardResource.js","names":["useEffect","useEffectEvent","useState","resource","Unstable_TriggerCategory","Unstable_TriggerItem","isTriggerItem","x","TriggerPopoverKeyEvent","key","shiftKey","preventDefault","TriggerKeyboardResourceOutput","highlightedIndex","highlightedItemId","highlightIndex","index","handleKeyDown","e","useTriggerKeyboardResource","t0","$","_c","navigableList","isSearchMode","activeCategoryId","query","popoverId","open","selectItem","selectCategory","goBack","close","setHighlightedIndex","t1","Symbol","for","t2","t3","t4","t5","length","t6","prev_0","len_0","len","prev","item","id","highlightedEntry","undefined","t7","TriggerKeyboardResource"],"sources":["../../../../src/primitives/composer/trigger/triggerKeyboardResource.ts"],"sourcesContent":["import { useEffect, useEffectEvent, useState } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type {\n Unstable_TriggerCategory,\n Unstable_TriggerItem,\n} from \"@assistant-ui/core\";\n\n/** Relies on `Unstable_TriggerCategory` never carrying a `type` field. */\nfunction isTriggerItem(\n x: Unstable_TriggerItem | Unstable_TriggerCategory,\n): x is Unstable_TriggerItem {\n return \"type\" in x;\n}\n\n/** Key event shape accepted by the keyboard handler. */\nexport type TriggerPopoverKeyEvent = {\n readonly key: string;\n readonly shiftKey: boolean;\n preventDefault(): void;\n};\n\nexport type TriggerKeyboardResourceOutput = {\n /** Index of the currently highlighted entry within the navigable list. */\n readonly highlightedIndex: number;\n /** ID of the currently highlighted item (for `aria-activedescendant`). */\n readonly highlightedItemId: string | undefined;\n /** Move the highlight to an entry index (e.g. from pointer hover). Out-of-range values are ignored. */\n highlightIndex(index: number): void;\n /** Handle a key event; returns `true` if it was consumed. */\n handleKeyDown(e: TriggerPopoverKeyEvent): boolean;\n};\n\n/**\n * Owns keyboard-driven highlight state for the popover. Delegates selection,\n * category drill-in, back, and close to the callbacks supplied by the parent.\n */\nconst useTriggerKeyboardResource = ({\n navigableList,\n isSearchMode,\n activeCategoryId,\n query,\n popoverId,\n open,\n selectItem,\n selectCategory,\n goBack,\n close,\n}: {\n navigableList: readonly (Unstable_TriggerCategory | Unstable_TriggerItem)[];\n isSearchMode: boolean;\n activeCategoryId: string | null;\n query: string;\n popoverId: string;\n open: boolean;\n selectItem: (item: Unstable_TriggerItem) => void;\n selectCategory: (categoryId: string) => void;\n goBack: () => void;\n close: () => void;\n}): TriggerKeyboardResourceOutput => {\n const [highlightedIndex, setHighlightedIndex] = useState(0);\n\n useEffect(() => {\n setHighlightedIndex(0);\n }, [navigableList]);\n\n useEffect(() => {\n setHighlightedIndex(0);\n }, [isSearchMode, activeCategoryId]);\n\n const highlightIndex = useEffectEvent((index: number) => {\n if (index < 0 || index >= navigableList.length) return;\n if (index === highlightedIndex) return;\n setHighlightedIndex(index);\n });\n\n const handleKeyDown = useEffectEvent((e: TriggerPopoverKeyEvent): boolean => {\n if (!open) return false;\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n setHighlightedIndex((prev) => {\n const len = navigableList.length;\n if (len === 0) return 0;\n return prev < len - 1 ? prev + 1 : 0;\n });\n return true;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n setHighlightedIndex((prev) => {\n const len = navigableList.length;\n if (len === 0) return 0;\n return prev > 0 ? prev - 1 : len - 1;\n });\n return true;\n }\n case \"Enter\":\n case \"Tab\": {\n if (e.shiftKey) return false;\n e.preventDefault();\n const item = navigableList[highlightedIndex];\n if (!item) return true;\n\n if (isTriggerItem(item)) {\n selectItem(item);\n } else {\n selectCategory(item.id);\n }\n return true;\n }\n case \"Escape\": {\n e.preventDefault();\n close();\n return true;\n }\n case \"Backspace\": {\n if (activeCategoryId && query === \"\") {\n e.preventDefault();\n goBack();\n return true;\n }\n return false;\n }\n default:\n return false;\n }\n });\n\n const highlightedEntry = navigableList[highlightedIndex];\n const highlightedItemId =\n open && highlightedEntry\n ? `${popoverId}-option-${highlightedEntry.id}`\n : undefined;\n\n return {\n highlightedIndex,\n highlightedItemId,\n highlightIndex,\n handleKeyDown,\n };\n};\n\nexport const TriggerKeyboardResource = resource(useTriggerKeyboardResource);\n"],"mappings":";;;;;AAQA,SAASM,cACPC,GAC2B;CAC3B,OAAO,UAAUA;AACnB;;;;;AAwBA,MAAMY,8BAA6BC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAC,eAAAC,cAAAC,kBAAAC,OAAAC,WAAAC,MAAAC,YAAAC,gBAAAC,QAAAC,UAAAZ;CAuBlC,MAAA,CAAAP,kBAAAoB,uBAAgD/B,SAAS,CAAC;CAAE,IAAAgC;CAAA,IAAAb,EAAA,OAAAc,OAAAC,IAAA,2BAAA,GAAA;EAElDF,WAAA;GACRD,oBAAoB,CAAC;EAAC;EACvBZ,EAAA,KAAAa;CAAA,OAAAA,KAAAb,EAAA;CAAA,IAAAgB;CAAA,IAAAhB,EAAA,OAAAE,eAAA;EAAEc,KAAA,CAACd,aAAa;EAACF,EAAA,KAAAE;EAAAF,EAAA,KAAAgB;CAAA,OAAAA,KAAAhB,EAAA;CAFlBrB,UAAUkC,IAEPG,EAAe;CAAC,IAAAC;CAAA,IAAAjB,EAAA,OAAAc,OAAAC,IAAA,2BAAA,GAAA;EAETE,WAAA;GACRL,oBAAoB,CAAC;EAAC;EACvBZ,EAAA,KAAAiB;CAAA,OAAAA,KAAAjB,EAAA;CAAA,IAAAkB;CAAA,IAAAlB,EAAA,OAAAI,oBAAAJ,EAAA,OAAAG,cAAA;EAAEe,KAAA,CAACf,cAAcC,gBAAgB;EAACJ,EAAA,KAAAI;EAAAJ,EAAA,KAAAG;EAAAH,EAAA,KAAAkB;CAAA,OAAAA,KAAAlB,EAAA;CAFnCrB,UAAUsC,IAEPC,EAAgC;CAAC,IAAAC;CAAA,IAAAnB,EAAA,OAAAR,oBAAAQ,EAAA,OAAAE,cAAAkB,QAAA;EAEED,MAAAxB,UAAA;GACpC,IAAIA,QAAQ,KAAKA,SAASO,cAAakB,QAAO;GAC9C,IAAIzB,UAAUH,kBAAgB;GAC9BoB,oBAAoBjB,KAAK;EAAC;EAC3BK,EAAA,KAAAR;EAAAQ,EAAA,KAAAE,cAAAkB;EAAApB,EAAA,KAAAmB;CAAA,OAAAA,KAAAnB,EAAA;CAJD,MAAAN,iBAAuBd,eAAeuC,EAIrC;CAAE,IAAAE;CAAA,IAAArB,EAAA,QAAAI,oBAAAJ,EAAA,QAAAW,SAAAX,EAAA,QAAAU,UAAAV,EAAA,QAAAR,oBAAAQ,EAAA,QAAAE,iBAAAF,EAAA,QAAAO,QAAAP,EAAA,QAAAK,SAAAL,EAAA,QAAAS,kBAAAT,EAAA,QAAAQ,YAAA;EAEkCa,MAAAxB,MAAA;GACnC,IAAI,CAACU,MAAI,OAAS;GAElB,QAAQV,EAACT,KAAT;IAAa,KACN;KACHS,EAACP,eAAgB;KACjBsB,qBAAoBU,WAAA;MAClB,MAAAC,QAAYrB,cAAakB;MACzB,IAAII,UAAQ,GAAC,OAAS;MAAE,OACjBC,SAAOD,QAAM,IAAIC,SAAO,IAAxB;KAA6B,CACrC;KAAC,OACK;IAAI,KAER;KACH5B,EAACP,eAAgB;KACjBsB,qBAAoBa,SAAA;MAClB,MAAAD,MAAYtB,cAAakB;MACzB,IAAII,QAAQ,GAAC,OAAS;MAAE,OACjBC,OAAO,IAAIA,OAAO,IAAID,MAAM;KAAC,CACrC;KAAC,OACK;IAAI,KAER;IAAO,KACP,OAAK;KACR,IAAI3B,EAACR,UAAS,OAAS;KACvBQ,EAACP,eAAgB;KACjB,MAAAoC,OAAaxB,cAAcV;KAC3B,IAAI,CAACkC,MAAI,OAAS;KAElB,IAAIzC,cAAcyC,IAAI,GACpBlB,WAAWkB,IAAI;UAEfjB,eAAeiB,KAAIC,EAAG;KACvB,OACM;IAAI;IAAA,KAER;KACH9B,EAACP,eAAgB;KACjBqB,MAAM;KAAC,OACA;IAAI,KAER;KACH,IAAIP,oBAAoBC,UAAU,IAAE;MAClCR,EAACP,eAAgB;MACjBoB,OAAO;MAAC,OACD;KAAI;KACZ,OACM;IAAK,SAAA,OAGL;GACX;EAAC;EACFV,EAAA,MAAAI;EAAAJ,EAAA,MAAAW;EAAAX,EAAA,MAAAU;EAAAV,EAAA,MAAAR;EAAAQ,EAAA,MAAAE;EAAAF,EAAA,MAAAO;EAAAP,EAAA,MAAAK;EAAAL,EAAA,MAAAS;EAAAT,EAAA,MAAAQ;EAAAR,EAAA,MAAAqB;CAAA,OAAAA,KAAArB,EAAA;CApDD,MAAAJ,gBAAsBhB,eAAeyC,EAoDpC;CAED,MAAAO,mBAAyB1B,cAAcV;CACvC,MAAAC,oBACEc,QAAAqB,mBAAA,GACOtB,UAAS,UAAWsB,iBAAgBD,OAD3CE,KAAAA;CAEc,IAAAC;CAAA,IAAA9B,EAAA,QAAAJ,iBAAAI,EAAA,QAAAN,kBAAAM,EAAA,QAAAR,oBAAAQ,EAAA,QAAAP,mBAAA;EAETqC,KAAA;GAAAtC;GAAAC;GAAAC;GAAAE;EAKP;EAACI,EAAA,MAAAJ;EAAAI,EAAA,MAAAN;EAAAM,EAAA,MAAAR;EAAAQ,EAAA,MAAAP;EAAAO,EAAA,MAAA8B;CAAA,OAAAA,KAAA9B,EAAA;CAAA,OALM8B;AAKN;AAGH,MAAaC,0BAA0BjD,SAASgB,0BAA0B"}
@@ -1,4 +1,5 @@
1
- import { useEffect, useEffectEvent, useMemo, useState } from "@assistant-ui/tap/react-shim";
1
+ import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
2
+ import { useEffect, useEffectEvent, useState } from "@assistant-ui/tap/react-shim";
2
3
  import { resource } from "@assistant-ui/tap";
3
4
  //#region src/primitives/composer/trigger/triggerNavigationResource.ts
4
5
  function matchesQuery(item, lower) {
@@ -8,80 +9,211 @@ function matchesQuery(item, lower) {
8
9
  * Computes categories, items, search results, and navigation state from the
9
10
  * adapter + current query. Pure derivation — no side effects on the composer.
10
11
  */
11
- const useTriggerNavigationResource = ({ adapter, query, open }) => {
12
+ const useTriggerNavigationResource = (t0) => {
13
+ const $ = c(38);
14
+ const { adapter, query, open } = t0;
12
15
  const [activeCategoryId, setActiveCategoryId] = useState(null);
13
- useEffect(() => {
14
- if (!open) setActiveCategoryId(null);
15
- }, [open]);
16
- const categories = useMemo(() => {
17
- if (!open || !adapter) return [];
18
- return adapter.categories();
19
- }, [open, adapter]);
16
+ let t1;
17
+ let t2;
18
+ if ($[0] !== open) {
19
+ t1 = () => {
20
+ if (!open) setActiveCategoryId(null);
21
+ };
22
+ t2 = [open];
23
+ $[0] = open;
24
+ $[1] = t1;
25
+ $[2] = t2;
26
+ } else {
27
+ t1 = $[1];
28
+ t2 = $[2];
29
+ }
30
+ useEffect(t1, t2);
31
+ let t3;
32
+ bb0: {
33
+ if (!open || !adapter) {
34
+ let t4;
35
+ if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
36
+ t4 = [];
37
+ $[3] = t4;
38
+ } else t4 = $[3];
39
+ t3 = t4;
40
+ break bb0;
41
+ }
42
+ let t4;
43
+ if ($[4] !== adapter) {
44
+ t4 = adapter.categories();
45
+ $[4] = adapter;
46
+ $[5] = t4;
47
+ } else t4 = $[5];
48
+ t3 = t4;
49
+ }
50
+ const categories = t3;
20
51
  const effectiveActiveCategoryId = open ? activeCategoryId : null;
21
- const allItems = useMemo(() => {
22
- if (!effectiveActiveCategoryId || !adapter) return [];
23
- return adapter.categoryItems(effectiveActiveCategoryId);
24
- }, [effectiveActiveCategoryId, adapter]);
25
- const searchResults = useMemo(() => {
26
- if (!open || !adapter || effectiveActiveCategoryId) return null;
27
- if (!query && categories.length > 0) return null;
28
- if (adapter.search) return adapter.search(query);
29
- const all = [];
30
- const lower = query.toLowerCase();
31
- for (const cat of categories) for (const item of adapter.categoryItems(cat.id)) if (matchesQuery(item, lower)) all.push(item);
32
- return all;
33
- }, [
34
- open,
35
- adapter,
36
- query,
37
- effectiveActiveCategoryId,
38
- categories
39
- ]);
52
+ let t4;
53
+ bb1: {
54
+ if (!effectiveActiveCategoryId || !adapter) {
55
+ let t5;
56
+ if ($[6] === Symbol.for("react.memo_cache_sentinel")) {
57
+ t5 = [];
58
+ $[6] = t5;
59
+ } else t5 = $[6];
60
+ t4 = t5;
61
+ break bb1;
62
+ }
63
+ let t5;
64
+ if ($[7] !== adapter || $[8] !== effectiveActiveCategoryId) {
65
+ t5 = adapter.categoryItems(effectiveActiveCategoryId);
66
+ $[7] = adapter;
67
+ $[8] = effectiveActiveCategoryId;
68
+ $[9] = t5;
69
+ } else t5 = $[9];
70
+ t4 = t5;
71
+ }
72
+ const allItems = t4;
73
+ let t5;
74
+ bb2: {
75
+ if (!open || !adapter || effectiveActiveCategoryId) {
76
+ t5 = null;
77
+ break bb2;
78
+ }
79
+ if (!query && categories.length > 0) {
80
+ t5 = null;
81
+ break bb2;
82
+ }
83
+ if (adapter.search) {
84
+ let t6;
85
+ if ($[10] !== adapter || $[11] !== query) {
86
+ t6 = adapter.search(query);
87
+ $[10] = adapter;
88
+ $[11] = query;
89
+ $[12] = t6;
90
+ } else t6 = $[12];
91
+ t5 = t6;
92
+ break bb2;
93
+ }
94
+ let all;
95
+ if ($[13] !== adapter || $[14] !== categories || $[15] !== query) {
96
+ all = [];
97
+ const lower = query.toLowerCase();
98
+ for (const cat of categories) for (const item of adapter.categoryItems(cat.id)) if (matchesQuery(item, lower)) all.push(item);
99
+ $[13] = adapter;
100
+ $[14] = categories;
101
+ $[15] = query;
102
+ $[16] = all;
103
+ } else all = $[16];
104
+ t5 = all;
105
+ }
106
+ const searchResults = t5;
40
107
  const isSearchMode = searchResults !== null;
41
- const filteredCategories = useMemo(() => {
42
- if (isSearchMode) return [];
43
- if (!query) return categories;
44
- const lower = query.toLowerCase();
45
- return categories.filter((cat) => cat.label.toLowerCase().includes(lower));
46
- }, [
47
- categories,
48
- query,
49
- isSearchMode
50
- ]);
51
- const filteredItems = useMemo(() => {
52
- if (isSearchMode) return searchResults ?? [];
53
- if (!query) return allItems;
54
- const lower = query.toLowerCase();
55
- return allItems.filter((item) => matchesQuery(item, lower));
56
- }, [
57
- allItems,
58
- query,
59
- isSearchMode,
60
- searchResults
61
- ]);
62
- return {
63
- categories: filteredCategories,
64
- items: filteredItems,
65
- isSearchMode,
66
- activeCategoryId: effectiveActiveCategoryId,
67
- navigableList: useMemo(() => {
68
- if (isSearchMode) return searchResults ?? [];
69
- if (effectiveActiveCategoryId) return filteredItems;
70
- return filteredCategories;
71
- }, [
72
- isSearchMode,
73
- searchResults,
74
- effectiveActiveCategoryId,
75
- filteredItems,
76
- filteredCategories
77
- ]),
78
- selectCategory: useEffectEvent((categoryId) => {
108
+ let t6;
109
+ bb3: {
110
+ if (isSearchMode) {
111
+ let t7;
112
+ if ($[17] === Symbol.for("react.memo_cache_sentinel")) {
113
+ t7 = [];
114
+ $[17] = t7;
115
+ } else t7 = $[17];
116
+ t6 = t7;
117
+ break bb3;
118
+ }
119
+ if (!query) {
120
+ t6 = categories;
121
+ break bb3;
122
+ }
123
+ let t7;
124
+ if ($[18] !== categories || $[19] !== query) {
125
+ const lower_0 = query.toLowerCase();
126
+ t7 = categories.filter((cat_0) => cat_0.label.toLowerCase().includes(lower_0));
127
+ $[18] = categories;
128
+ $[19] = query;
129
+ $[20] = t7;
130
+ } else t7 = $[20];
131
+ t6 = t7;
132
+ }
133
+ const filteredCategories = t6;
134
+ let t7;
135
+ bb4: {
136
+ if (isSearchMode) {
137
+ let t8;
138
+ if ($[21] !== searchResults) {
139
+ t8 = searchResults ?? [];
140
+ $[21] = searchResults;
141
+ $[22] = t8;
142
+ } else t8 = $[22];
143
+ t7 = t8;
144
+ break bb4;
145
+ }
146
+ if (!query) {
147
+ t7 = allItems;
148
+ break bb4;
149
+ }
150
+ let t8;
151
+ if ($[23] !== allItems || $[24] !== query) {
152
+ const lower_1 = query.toLowerCase();
153
+ t8 = allItems.filter((item_0) => matchesQuery(item_0, lower_1));
154
+ $[23] = allItems;
155
+ $[24] = query;
156
+ $[25] = t8;
157
+ } else t8 = $[25];
158
+ t7 = t8;
159
+ }
160
+ const filteredItems = t7;
161
+ let t8;
162
+ bb5: {
163
+ if (isSearchMode) {
164
+ let t9;
165
+ if ($[26] !== searchResults) {
166
+ t9 = searchResults ?? [];
167
+ $[26] = searchResults;
168
+ $[27] = t9;
169
+ } else t9 = $[27];
170
+ t8 = t9;
171
+ break bb5;
172
+ }
173
+ if (effectiveActiveCategoryId) {
174
+ t8 = filteredItems;
175
+ break bb5;
176
+ }
177
+ t8 = filteredCategories;
178
+ }
179
+ const navigableList = t8;
180
+ let t9;
181
+ if ($[28] === Symbol.for("react.memo_cache_sentinel")) {
182
+ t9 = (categoryId) => {
79
183
  setActiveCategoryId(categoryId);
80
- }),
81
- goBack: useEffectEvent(() => {
184
+ };
185
+ $[28] = t9;
186
+ } else t9 = $[28];
187
+ const selectCategory = useEffectEvent(t9);
188
+ let t10;
189
+ if ($[29] === Symbol.for("react.memo_cache_sentinel")) {
190
+ t10 = () => {
82
191
  setActiveCategoryId(null);
83
- })
84
- };
192
+ };
193
+ $[29] = t10;
194
+ } else t10 = $[29];
195
+ const goBack = useEffectEvent(t10);
196
+ let t11;
197
+ if ($[30] !== effectiveActiveCategoryId || $[31] !== filteredCategories || $[32] !== filteredItems || $[33] !== goBack || $[34] !== isSearchMode || $[35] !== navigableList || $[36] !== selectCategory) {
198
+ t11 = {
199
+ categories: filteredCategories,
200
+ items: filteredItems,
201
+ isSearchMode,
202
+ activeCategoryId: effectiveActiveCategoryId,
203
+ navigableList,
204
+ selectCategory,
205
+ goBack
206
+ };
207
+ $[30] = effectiveActiveCategoryId;
208
+ $[31] = filteredCategories;
209
+ $[32] = filteredItems;
210
+ $[33] = goBack;
211
+ $[34] = isSearchMode;
212
+ $[35] = navigableList;
213
+ $[36] = selectCategory;
214
+ $[37] = t11;
215
+ } else t11 = $[37];
216
+ return t11;
85
217
  };
86
218
  const TriggerNavigationResource = resource(useTriggerNavigationResource);
87
219
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"triggerNavigationResource.js","names":[],"sources":["../../../../src/primitives/composer/trigger/triggerNavigationResource.ts"],"sourcesContent":["import { useEffect, useEffectEvent, useMemo, useState } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type {\n Unstable_TriggerAdapter,\n Unstable_TriggerCategory,\n Unstable_TriggerItem,\n} from \"@assistant-ui/core\";\n\nfunction matchesQuery(item: Unstable_TriggerItem, lower: string): boolean {\n return (\n item.id.toLowerCase().includes(lower) ||\n item.label.toLowerCase().includes(lower) ||\n (item.description?.toLowerCase().includes(lower) ?? false)\n );\n}\n\nexport type TriggerNavigationResourceOutput = {\n /** Filtered categories visible in the list (empty in search mode). */\n readonly categories: readonly Unstable_TriggerCategory[];\n /** Filtered items visible in the list. */\n readonly items: readonly Unstable_TriggerItem[];\n /** `true` when the current list is search results rather than categories. */\n readonly isSearchMode: boolean;\n /** Currently drilled-into category id (or `null` for the top level). */\n readonly activeCategoryId: string | null;\n /** Flat list used for keyboard navigation (categories or items). */\n readonly navigableList: readonly (\n | Unstable_TriggerCategory\n | Unstable_TriggerItem\n )[];\n /** Drill into a category. */\n selectCategory(categoryId: string): void;\n /** Return to the top-level category list. */\n goBack(): void;\n};\n\n/**\n * Computes categories, items, search results, and navigation state from the\n * adapter + current query. Pure derivation — no side effects on the composer.\n */\nconst useTriggerNavigationResource = ({\n adapter,\n query,\n open,\n}: {\n adapter: Unstable_TriggerAdapter | undefined;\n query: string;\n open: boolean;\n}): TriggerNavigationResourceOutput => {\n const [activeCategoryId, setActiveCategoryId] = useState<string | null>(null);\n\n useEffect(() => {\n if (!open) setActiveCategoryId(null);\n }, [open]);\n\n const categories = useMemo<readonly Unstable_TriggerCategory[]>(() => {\n if (!open || !adapter) return [];\n return adapter.categories();\n }, [open, adapter]);\n\n const effectiveActiveCategoryId = open ? activeCategoryId : null;\n\n const allItems = useMemo<readonly Unstable_TriggerItem[]>(() => {\n if (!effectiveActiveCategoryId || !adapter) return [];\n return adapter.categoryItems(effectiveActiveCategoryId);\n }, [effectiveActiveCategoryId, adapter]);\n\n const searchResults = useMemo<readonly Unstable_TriggerItem[] | null>(() => {\n if (!open || !adapter || effectiveActiveCategoryId) return null;\n // If categories exist and query is empty, show categories first (not search)\n if (!query && categories.length > 0) return null;\n if (adapter.search) return adapter.search(query);\n\n // fallback: no adapter.search\n const all: Unstable_TriggerItem[] = [];\n const lower = query.toLowerCase();\n for (const cat of categories) {\n for (const item of adapter.categoryItems(cat.id)) {\n if (matchesQuery(item, lower)) {\n all.push(item);\n }\n }\n }\n return all;\n }, [open, adapter, query, effectiveActiveCategoryId, categories]);\n\n const isSearchMode = searchResults !== null;\n\n const filteredCategories = useMemo(() => {\n if (isSearchMode) return [];\n if (!query) return categories;\n const lower = query.toLowerCase();\n return categories.filter((cat) => cat.label.toLowerCase().includes(lower));\n }, [categories, query, isSearchMode]);\n\n const filteredItems = useMemo(() => {\n if (isSearchMode) return searchResults ?? [];\n if (!query) return allItems;\n const lower = query.toLowerCase();\n return allItems.filter((item) => matchesQuery(item, lower));\n }, [allItems, query, isSearchMode, searchResults]);\n\n const navigableList = useMemo(() => {\n if (isSearchMode) return searchResults ?? [];\n if (effectiveActiveCategoryId) return filteredItems;\n return filteredCategories;\n }, [\n isSearchMode,\n searchResults,\n effectiveActiveCategoryId,\n filteredItems,\n filteredCategories,\n ]);\n\n const selectCategory = useEffectEvent((categoryId: string) => {\n setActiveCategoryId(categoryId);\n });\n\n const goBack = useEffectEvent(() => {\n setActiveCategoryId(null);\n });\n\n return {\n categories: filteredCategories,\n items: filteredItems,\n isSearchMode,\n activeCategoryId: effectiveActiveCategoryId,\n navigableList,\n selectCategory,\n goBack,\n };\n};\n\nexport const TriggerNavigationResource = resource(useTriggerNavigationResource);\n"],"mappings":";;;AAQA,SAAS,aAAa,MAA4B,OAAwB;CACxE,OACE,KAAK,GAAG,YAAY,CAAC,CAAC,SAAS,KAAK,KACpC,KAAK,MAAM,YAAY,CAAC,CAAC,SAAS,KAAK,MACtC,KAAK,aAAa,YAAY,CAAC,CAAC,SAAS,KAAK,KAAK;AAExD;;;;;AA0BA,MAAM,gCAAgC,EACpC,SACA,OACA,WAKqC;CACrC,MAAM,CAAC,kBAAkB,uBAAuB,SAAwB,IAAI;CAE5E,gBAAgB;EACd,IAAI,CAAC,MAAM,oBAAoB,IAAI;CACrC,GAAG,CAAC,IAAI,CAAC;CAET,MAAM,aAAa,cAAmD;EACpE,IAAI,CAAC,QAAQ,CAAC,SAAS,OAAO,CAAC;EAC/B,OAAO,QAAQ,WAAW;CAC5B,GAAG,CAAC,MAAM,OAAO,CAAC;CAElB,MAAM,4BAA4B,OAAO,mBAAmB;CAE5D,MAAM,WAAW,cAA+C;EAC9D,IAAI,CAAC,6BAA6B,CAAC,SAAS,OAAO,CAAC;EACpD,OAAO,QAAQ,cAAc,yBAAyB;CACxD,GAAG,CAAC,2BAA2B,OAAO,CAAC;CAEvC,MAAM,gBAAgB,cAAsD;EAC1E,IAAI,CAAC,QAAQ,CAAC,WAAW,2BAA2B,OAAO;EAE3D,IAAI,CAAC,SAAS,WAAW,SAAS,GAAG,OAAO;EAC5C,IAAI,QAAQ,QAAQ,OAAO,QAAQ,OAAO,KAAK;EAG/C,MAAM,MAA8B,CAAC;EACrC,MAAM,QAAQ,MAAM,YAAY;EAChC,KAAK,MAAM,OAAO,YAChB,KAAK,MAAM,QAAQ,QAAQ,cAAc,IAAI,EAAE,GAC7C,IAAI,aAAa,MAAM,KAAK,GAC1B,IAAI,KAAK,IAAI;EAInB,OAAO;CACT,GAAG;EAAC;EAAM;EAAS;EAAO;EAA2B;CAAU,CAAC;CAEhE,MAAM,eAAe,kBAAkB;CAEvC,MAAM,qBAAqB,cAAc;EACvC,IAAI,cAAc,OAAO,CAAC;EAC1B,IAAI,CAAC,OAAO,OAAO;EACnB,MAAM,QAAQ,MAAM,YAAY;EAChC,OAAO,WAAW,QAAQ,QAAQ,IAAI,MAAM,YAAY,CAAC,CAAC,SAAS,KAAK,CAAC;CAC3E,GAAG;EAAC;EAAY;EAAO;CAAY,CAAC;CAEpC,MAAM,gBAAgB,cAAc;EAClC,IAAI,cAAc,OAAO,iBAAiB,CAAC;EAC3C,IAAI,CAAC,OAAO,OAAO;EACnB,MAAM,QAAQ,MAAM,YAAY;EAChC,OAAO,SAAS,QAAQ,SAAS,aAAa,MAAM,KAAK,CAAC;CAC5D,GAAG;EAAC;EAAU;EAAO;EAAc;CAAa,CAAC;CAsBjD,OAAO;EACL,YAAY;EACZ,OAAO;EACP;EACA,kBAAkB;EAClB,eAzBoB,cAAc;GAClC,IAAI,cAAc,OAAO,iBAAiB,CAAC;GAC3C,IAAI,2BAA2B,OAAO;GACtC,OAAO;EACT,GAAG;GACD;GACA;GACA;GACA;GACA;EACF,CAec;EACZ,gBAdqB,gBAAgB,eAAuB;GAC5D,oBAAoB,UAAU;EAChC,CAYe;EACb,QAXa,qBAAqB;GAClC,oBAAoB,IAAI;EAC1B,CASO;CACP;AACF;AAEA,MAAa,4BAA4B,SAAS,4BAA4B"}
1
+ {"version":3,"file":"triggerNavigationResource.js","names":["useEffect","useEffectEvent","useMemo","useState","resource","Unstable_TriggerAdapter","Unstable_TriggerCategory","Unstable_TriggerItem","matchesQuery","item","lower","id","toLowerCase","includes","label","description","TriggerNavigationResourceOutput","categories","items","isSearchMode","activeCategoryId","navigableList","selectCategory","categoryId","goBack","useTriggerNavigationResource","t0","$","_c","adapter","query","open","setActiveCategoryId","t1","t2","t3","bb0","t4","Symbol","for","effectiveActiveCategoryId","bb1","t5","categoryItems","allItems","bb2","length","search","t6","all","cat","push","searchResults","bb3","t7","lower_0","filter","cat_0","filteredCategories","bb4","t8","lower_1","item_0","filteredItems","bb5","t9","t10","t11","TriggerNavigationResource"],"sources":["../../../../src/primitives/composer/trigger/triggerNavigationResource.ts"],"sourcesContent":["import { useEffect, useEffectEvent, useMemo, useState } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type {\n Unstable_TriggerAdapter,\n Unstable_TriggerCategory,\n Unstable_TriggerItem,\n} from \"@assistant-ui/core\";\n\nfunction matchesQuery(item: Unstable_TriggerItem, lower: string): boolean {\n return (\n item.id.toLowerCase().includes(lower) ||\n item.label.toLowerCase().includes(lower) ||\n (item.description?.toLowerCase().includes(lower) ?? false)\n );\n}\n\nexport type TriggerNavigationResourceOutput = {\n /** Filtered categories visible in the list (empty in search mode). */\n readonly categories: readonly Unstable_TriggerCategory[];\n /** Filtered items visible in the list. */\n readonly items: readonly Unstable_TriggerItem[];\n /** `true` when the current list is search results rather than categories. */\n readonly isSearchMode: boolean;\n /** Currently drilled-into category id (or `null` for the top level). */\n readonly activeCategoryId: string | null;\n /** Flat list used for keyboard navigation (categories or items). */\n readonly navigableList: readonly (\n | Unstable_TriggerCategory\n | Unstable_TriggerItem\n )[];\n /** Drill into a category. */\n selectCategory(categoryId: string): void;\n /** Return to the top-level category list. */\n goBack(): void;\n};\n\n/**\n * Computes categories, items, search results, and navigation state from the\n * adapter + current query. Pure derivation — no side effects on the composer.\n */\nconst useTriggerNavigationResource = ({\n adapter,\n query,\n open,\n}: {\n adapter: Unstable_TriggerAdapter | undefined;\n query: string;\n open: boolean;\n}): TriggerNavigationResourceOutput => {\n const [activeCategoryId, setActiveCategoryId] = useState<string | null>(null);\n\n useEffect(() => {\n if (!open) setActiveCategoryId(null);\n }, [open]);\n\n const categories = useMemo<readonly Unstable_TriggerCategory[]>(() => {\n if (!open || !adapter) return [];\n return adapter.categories();\n }, [open, adapter]);\n\n const effectiveActiveCategoryId = open ? activeCategoryId : null;\n\n const allItems = useMemo<readonly Unstable_TriggerItem[]>(() => {\n if (!effectiveActiveCategoryId || !adapter) return [];\n return adapter.categoryItems(effectiveActiveCategoryId);\n }, [effectiveActiveCategoryId, adapter]);\n\n const searchResults = useMemo<readonly Unstable_TriggerItem[] | null>(() => {\n if (!open || !adapter || effectiveActiveCategoryId) return null;\n // If categories exist and query is empty, show categories first (not search)\n if (!query && categories.length > 0) return null;\n if (adapter.search) return adapter.search(query);\n\n // fallback: no adapter.search\n const all: Unstable_TriggerItem[] = [];\n const lower = query.toLowerCase();\n for (const cat of categories) {\n for (const item of adapter.categoryItems(cat.id)) {\n if (matchesQuery(item, lower)) {\n all.push(item);\n }\n }\n }\n return all;\n }, [open, adapter, query, effectiveActiveCategoryId, categories]);\n\n const isSearchMode = searchResults !== null;\n\n const filteredCategories = useMemo(() => {\n if (isSearchMode) return [];\n if (!query) return categories;\n const lower = query.toLowerCase();\n return categories.filter((cat) => cat.label.toLowerCase().includes(lower));\n }, [categories, query, isSearchMode]);\n\n const filteredItems = useMemo(() => {\n if (isSearchMode) return searchResults ?? [];\n if (!query) return allItems;\n const lower = query.toLowerCase();\n return allItems.filter((item) => matchesQuery(item, lower));\n }, [allItems, query, isSearchMode, searchResults]);\n\n const navigableList = useMemo(() => {\n if (isSearchMode) return searchResults ?? [];\n if (effectiveActiveCategoryId) return filteredItems;\n return filteredCategories;\n }, [\n isSearchMode,\n searchResults,\n effectiveActiveCategoryId,\n filteredItems,\n filteredCategories,\n ]);\n\n const selectCategory = useEffectEvent((categoryId: string) => {\n setActiveCategoryId(categoryId);\n });\n\n const goBack = useEffectEvent(() => {\n setActiveCategoryId(null);\n });\n\n return {\n categories: filteredCategories,\n items: filteredItems,\n isSearchMode,\n activeCategoryId: effectiveActiveCategoryId,\n navigableList,\n selectCategory,\n goBack,\n };\n};\n\nexport const TriggerNavigationResource = resource(useTriggerNavigationResource);\n"],"mappings":"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"}