@assistant-ui/core 0.3.19 → 0.3.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.
- package/dist/adapters/attachment.d.ts +9 -10
- package/dist/adapters/attachment.d.ts.map +1 -1
- package/dist/adapters/attachment.js +2 -1
- package/dist/adapters/attachment.js.map +1 -1
- package/dist/adapters/directive-formatter.d.ts +1 -2
- package/dist/adapters/directive-formatter.d.ts.map +1 -1
- package/dist/adapters/feedback.d.ts +2 -2
- package/dist/adapters/feedback.d.ts.map +1 -1
- package/dist/adapters/speech.d.ts +6 -7
- package/dist/adapters/speech.d.ts.map +1 -1
- package/dist/adapters/suggestion.d.ts +5 -6
- package/dist/adapters/suggestion.d.ts.map +1 -1
- package/dist/adapters/thread-history.d.ts +6 -7
- package/dist/adapters/thread-history.d.ts.map +1 -1
- package/dist/adapters/trigger.d.ts +1 -2
- package/dist/adapters/trigger.d.ts.map +1 -1
- package/dist/adapters/voice.d.ts +5 -6
- package/dist/adapters/voice.d.ts.map +1 -1
- package/dist/internal/duplicate-detection.d.ts +1 -2
- package/dist/internal/duplicate-detection.d.ts.map +1 -1
- package/dist/model-context/frame/host.d.ts +1 -2
- package/dist/model-context/frame/host.d.ts.map +1 -1
- package/dist/model-context/frame/provider.d.ts +1 -2
- package/dist/model-context/frame/provider.d.ts.map +1 -1
- package/dist/model-context/frame/types.d.ts +5 -6
- package/dist/model-context/frame/types.d.ts.map +1 -1
- package/dist/model-context/interactable-composer-metadata.d.ts +9 -10
- package/dist/model-context/interactable-composer-metadata.d.ts.map +1 -1
- package/dist/model-context/registry-handles.d.ts +3 -4
- package/dist/model-context/registry-handles.d.ts.map +1 -1
- package/dist/model-context/registry.d.ts +1 -2
- package/dist/model-context/registry.d.ts.map +1 -1
- package/dist/model-context/tool-call-text.d.ts +2 -3
- package/dist/model-context/tool-call-text.d.ts.map +1 -1
- package/dist/model-context/tool.d.ts +2 -3
- package/dist/model-context/tool.d.ts.map +1 -1
- package/dist/model-context/types.d.ts +8 -9
- package/dist/model-context/types.d.ts.map +1 -1
- package/dist/react/AssistantProvider.d.ts +3 -4
- package/dist/react/AssistantProvider.d.ts.map +1 -1
- package/dist/react/AssistantRuntimeProvider.d.ts +1 -2
- package/dist/react/AssistantRuntimeProvider.d.ts.map +1 -1
- package/dist/react/RuntimeAdapter.d.ts +2 -3
- package/dist/react/RuntimeAdapter.d.ts.map +1 -1
- package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts +4 -5
- package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
- package/dist/react/adapters/LocalStorageThreadListAdapter.js +20 -34
- package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
- package/dist/react/adapters/TitleGenerationAdapter.d.ts +2 -3
- package/dist/react/adapters/TitleGenerationAdapter.d.ts.map +1 -1
- package/dist/react/client/AdaptedRemoteThread.d.ts +1 -2
- package/dist/react/client/AdaptedRemoteThread.d.ts.map +1 -1
- package/dist/react/client/DataRenderers.d.ts +1 -2
- package/dist/react/client/DataRenderers.d.ts.map +1 -1
- package/dist/react/client/InMemoryThreadList.d.ts +3 -4
- package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
- package/dist/react/client/Interactables.d.ts +1 -2
- package/dist/react/client/Interactables.d.ts.map +1 -1
- package/dist/react/client/RemoteThreadList.d.ts +2 -3
- package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
- package/dist/react/client/Tools.d.ts +2 -2
- package/dist/react/client/Tools.d.ts.map +1 -1
- package/dist/react/client/interactable-model-context.d.ts +2 -3
- package/dist/react/client/interactable-model-context.d.ts.map +1 -1
- package/dist/react/interactables-legacy/Interactables.d.ts +1 -2
- package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
- package/dist/react/interactables-legacy/interactable-model-context.d.ts +2 -3
- package/dist/react/interactables-legacy/interactable-model-context.d.ts.map +1 -1
- package/dist/react/interactables-legacy/scopes.d.ts +9 -10
- package/dist/react/interactables-legacy/scopes.d.ts.map +1 -1
- package/dist/react/interactables-legacy/useAssistantInteractable.d.ts +2 -3
- package/dist/react/interactables-legacy/useAssistantInteractable.d.ts.map +1 -1
- package/dist/react/interactables-legacy/useInteractableState.d.ts +1 -2
- package/dist/react/interactables-legacy/useInteractableState.d.ts.map +1 -1
- package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts +1 -2
- package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -1
- package/dist/react/model-context/define-mcp-toolkit.d.ts +4 -5
- package/dist/react/model-context/define-mcp-toolkit.d.ts.map +1 -1
- package/dist/react/model-context/define-toolkit.d.ts +2 -3
- package/dist/react/model-context/define-toolkit.d.ts.map +1 -1
- package/dist/react/model-context/external-tool.d.ts +1 -2
- package/dist/react/model-context/external-tool.d.ts.map +1 -1
- package/dist/react/model-context/human-tool.d.ts +3 -4
- package/dist/react/model-context/human-tool.d.ts.map +1 -1
- package/dist/react/model-context/interactableTool.d.ts +3 -4
- package/dist/react/model-context/interactableTool.d.ts.map +1 -1
- package/dist/react/model-context/makeAssistantDataUI.d.ts +2 -3
- package/dist/react/model-context/makeAssistantDataUI.d.ts.map +1 -1
- package/dist/react/model-context/makeAssistantTool.d.ts +2 -3
- package/dist/react/model-context/makeAssistantTool.d.ts.map +1 -1
- package/dist/react/model-context/makeAssistantToolUI.d.ts +2 -3
- package/dist/react/model-context/makeAssistantToolUI.d.ts.map +1 -1
- package/dist/react/model-context/provider-tool.d.ts +2 -3
- package/dist/react/model-context/provider-tool.d.ts.map +1 -1
- package/dist/react/model-context/stub-tool.d.ts +1 -2
- package/dist/react/model-context/stub-tool.d.ts.map +1 -1
- package/dist/react/model-context/toolbox.d.ts +9 -10
- package/dist/react/model-context/toolbox.d.ts.map +1 -1
- package/dist/react/model-context/useAssistantContext.d.ts +2 -2
- package/dist/react/model-context/useAssistantContext.d.ts.map +1 -1
- package/dist/react/model-context/useAssistantDataUI.d.ts +2 -3
- package/dist/react/model-context/useAssistantDataUI.d.ts.map +1 -1
- package/dist/react/model-context/useAssistantInstructions.d.ts +2 -2
- package/dist/react/model-context/useAssistantInstructions.d.ts.map +1 -1
- package/dist/react/model-context/useAssistantTool.d.ts +2 -3
- package/dist/react/model-context/useAssistantTool.d.ts.map +1 -1
- package/dist/react/model-context/useAssistantToolUI.d.ts +2 -3
- package/dist/react/model-context/useAssistantToolUI.d.ts.map +1 -1
- package/dist/react/model-context/useAuiToolOverrides.d.ts +1 -2
- package/dist/react/model-context/useAuiToolOverrides.d.ts.map +1 -1
- package/dist/react/model-context/useInlineRender.d.ts +1 -2
- package/dist/react/model-context/useInlineRender.d.ts.map +1 -1
- package/dist/react/model-context/useInteractable.d.ts +4 -5
- package/dist/react/model-context/useInteractable.d.ts.map +1 -1
- package/dist/react/model-context/useInteractableState.d.ts +1 -2
- package/dist/react/model-context/useInteractableState.d.ts.map +1 -1
- package/dist/react/model-context/useInteractableVersions.d.ts +1 -2
- package/dist/react/model-context/useInteractableVersions.d.ts.map +1 -1
- package/dist/react/model-context/useToolArgsStatus.d.ts +2 -3
- package/dist/react/model-context/useToolArgsStatus.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useActionBarCopy.d.ts +2 -3
- package/dist/react/primitive-hooks/useActionBarCopy.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useActionBarEdit.d.ts +1 -2
- package/dist/react/primitive-hooks/useActionBarEdit.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useActionBarFeedback.d.ts +2 -3
- package/dist/react/primitive-hooks/useActionBarFeedback.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useActionBarReload.d.ts +1 -2
- package/dist/react/primitive-hooks/useActionBarReload.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useActionBarSpeak.d.ts +1 -2
- package/dist/react/primitive-hooks/useActionBarSpeak.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useActionBarStopSpeaking.d.ts +1 -2
- package/dist/react/primitive-hooks/useActionBarStopSpeaking.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useBranchPickerNext.d.ts +1 -2
- package/dist/react/primitive-hooks/useBranchPickerNext.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts +1 -2
- package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useComposerAddAttachment.d.ts +1 -2
- package/dist/react/primitive-hooks/useComposerAddAttachment.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useComposerCancel.d.ts +1 -2
- package/dist/react/primitive-hooks/useComposerCancel.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useComposerDictate.d.ts +1 -2
- package/dist/react/primitive-hooks/useComposerDictate.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useComposerSend.d.ts +1 -2
- package/dist/react/primitive-hooks/useComposerSend.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useEditComposerCancel.d.ts +1 -2
- package/dist/react/primitive-hooks/useEditComposerCancel.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useEditComposerSend.d.ts +1 -2
- package/dist/react/primitive-hooks/useEditComposerSend.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useMessageBranching.d.ts +1 -2
- package/dist/react/primitive-hooks/useMessageBranching.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useMessageError.d.ts +1 -2
- package/dist/react/primitive-hooks/useMessageError.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useMessageReload.d.ts +1 -2
- package/dist/react/primitive-hooks/useMessageReload.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts +2 -3
- package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts +1 -2
- package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadIsRunning.d.ts +1 -2
- package/dist/react/primitive-hooks/useThreadIsRunning.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadListItemArchive.d.ts +1 -2
- package/dist/react/primitive-hooks/useThreadListItemArchive.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadListItemDelete.d.ts +1 -2
- package/dist/react/primitive-hooks/useThreadListItemDelete.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadListItemTrigger.d.ts +1 -2
- package/dist/react/primitive-hooks/useThreadListItemTrigger.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadListItemUnarchive.d.ts +1 -2
- package/dist/react/primitive-hooks/useThreadListItemUnarchive.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadListLoadMore.d.ts +1 -2
- package/dist/react/primitive-hooks/useThreadListLoadMore.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadListNew.d.ts +1 -2
- package/dist/react/primitive-hooks/useThreadListNew.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadMessageIds.d.ts +1 -2
- package/dist/react/primitive-hooks/useThreadMessageIds.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadMessages.d.ts +1 -2
- package/dist/react/primitive-hooks/useThreadMessages.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useVoice.d.ts +3 -4
- package/dist/react/primitive-hooks/useVoice.d.ts.map +1 -1
- package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts +2 -3
- package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts.map +1 -1
- package/dist/react/primitives/composer/ComposerAttachments.d.ts +4 -5
- package/dist/react/primitives/composer/ComposerAttachments.d.ts.map +1 -1
- package/dist/react/primitives/composer/ComposerIf.d.ts +4 -5
- package/dist/react/primitives/composer/ComposerIf.d.ts.map +1 -1
- package/dist/react/primitives/composer/ComposerQueue.d.ts +2 -3
- package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
- package/dist/react/primitives/generativeUI/GenerativeUI.d.ts +4 -5
- package/dist/react/primitives/generativeUI/GenerativeUI.d.ts.map +1 -1
- package/dist/react/primitives/generativeUI/GenerativeUI.js +27 -28
- package/dist/react/primitives/generativeUI/GenerativeUI.js.map +1 -1
- package/dist/react/primitives/message/MessageAttachments.d.ts +4 -5
- package/dist/react/primitives/message/MessageAttachments.d.ts.map +1 -1
- package/dist/react/primitives/message/MessageGroupedParts.d.ts +2 -3
- package/dist/react/primitives/message/MessageGroupedParts.d.ts.map +1 -1
- package/dist/react/primitives/message/MessageParts.d.ts +10 -10
- package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
- package/dist/react/primitives/message/MessageQuote.d.ts +2 -3
- package/dist/react/primitives/message/MessageQuote.d.ts.map +1 -1
- package/dist/react/primitives/messagePart/MessagePartInProgress.d.ts +2 -3
- package/dist/react/primitives/messagePart/MessagePartInProgress.d.ts.map +1 -1
- package/dist/react/primitives/part/PartMessages.d.ts +3 -4
- package/dist/react/primitives/part/PartMessages.d.ts.map +1 -1
- package/dist/react/primitives/thread/ThreadMessages.d.ts +7 -8
- package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
- package/dist/react/primitives/thread/ThreadSuggestions.d.ts +5 -6
- package/dist/react/primitives/thread/ThreadSuggestions.d.ts.map +1 -1
- package/dist/react/primitives/threadList/ThreadListItems.d.ts +4 -5
- package/dist/react/primitives/threadList/ThreadListItems.d.ts.map +1 -1
- package/dist/react/primitives/threadListItem/ThreadListItemTitle.d.ts +2 -3
- package/dist/react/primitives/threadListItem/ThreadListItemTitle.d.ts.map +1 -1
- package/dist/react/providers/AttachmentByIndexProvider.d.ts +2 -3
- package/dist/react/providers/AttachmentByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts +1 -2
- package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts.map +1 -1
- package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts +1 -2
- package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/MessageByIdProvider.d.ts +1 -2
- package/dist/react/providers/MessageByIdProvider.d.ts.map +1 -1
- package/dist/react/providers/MessageByIndexProvider.d.ts +1 -2
- package/dist/react/providers/MessageByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/PartByIndexProvider.d.ts +1 -2
- package/dist/react/providers/PartByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/QueueItemByIndexProvider.d.ts +2 -3
- package/dist/react/providers/QueueItemByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/ReadonlyThreadProvider.d.ts +2 -3
- package/dist/react/providers/ReadonlyThreadProvider.d.ts.map +1 -1
- package/dist/react/providers/SuggestionByIndexProvider.d.ts +2 -3
- package/dist/react/providers/SuggestionByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/TextMessagePartProvider.d.ts +1 -2
- package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
- package/dist/react/providers/ThreadListItemByIndexProvider.d.ts +1 -2
- package/dist/react/providers/ThreadListItemByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/ThreadListItemRuntimeProvider.d.ts +1 -2
- package/dist/react/providers/ThreadListItemRuntimeProvider.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +3 -2
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +17 -7
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +1 -2
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadResource.d.ts +4 -5
- package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
- package/dist/react/runtimes/RuntimeAdapterProvider.d.ts +3 -3
- package/dist/react/runtimes/RuntimeAdapterProvider.d.ts.map +1 -1
- package/dist/react/runtimes/assistant-transport/commandQueue.d.ts +2 -3
- package/dist/react/runtimes/assistant-transport/commandQueue.d.ts.map +1 -1
- package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts +3 -4
- package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts.map +1 -1
- package/dist/react/runtimes/assistant-transport/runManager.d.ts +2 -3
- package/dist/react/runtimes/assistant-transport/runManager.d.ts.map +1 -1
- package/dist/react/runtimes/assistant-transport/types.d.ts +17 -18
- package/dist/react/runtimes/assistant-transport/types.d.ts.map +1 -1
- package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts +4 -5
- package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
- package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts +1 -2
- package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts.map +1 -1
- package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts +1 -2
- package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +2 -3
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +17 -4
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
- package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +1 -2
- package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/auiV0.d.ts +11 -3
- package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/auiV0.js +63 -2
- package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
- package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts +4 -5
- package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts +1 -2
- package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/sdkIdentity.d.ts +1 -2
- package/dist/react/runtimes/cloud/sdkIdentity.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/sdkIdentity.js +1 -1
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts +1 -2
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts +1 -2
- package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts.map +1 -1
- package/dist/react/runtimes/createMessageConverter.d.ts +1 -2
- package/dist/react/runtimes/createMessageConverter.d.ts.map +1 -1
- package/dist/react/runtimes/createRuntimeExtras.d.ts +3 -4
- package/dist/react/runtimes/createRuntimeExtras.d.ts.map +1 -1
- package/dist/react/runtimes/external-message-converter.d.ts +6 -6
- package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
- package/dist/react/runtimes/useExternalStoreRuntime.d.ts +1 -2
- package/dist/react/runtimes/useExternalStoreRuntime.d.ts.map +1 -1
- package/dist/react/runtimes/useExternalStoreSharedOptions.d.ts +1 -2
- package/dist/react/runtimes/useExternalStoreSharedOptions.d.ts.map +1 -1
- package/dist/react/runtimes/useLocalRuntime.d.ts +3 -4
- package/dist/react/runtimes/useLocalRuntime.d.ts.map +1 -1
- package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts +1 -2
- package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
- package/dist/react/runtimes/useRemoteThreadListRuntime.js +2 -2
- package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
- package/dist/react/runtimes/useRuntimeAdapters.d.ts +4 -4
- package/dist/react/runtimes/useRuntimeAdapters.d.ts.map +1 -1
- package/dist/react/runtimes/useStreamingTiming.d.ts +2 -2
- package/dist/react/runtimes/useStreamingTiming.d.ts.map +1 -1
- package/dist/react/types/MessagePartComponentTypes.d.ts +26 -27
- package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
- package/dist/react/types/scopes/dataRenderers.d.ts +3 -4
- package/dist/react/types/scopes/dataRenderers.d.ts.map +1 -1
- package/dist/react/types/scopes/interactables.d.ts +10 -11
- package/dist/react/types/scopes/interactables.d.ts.map +1 -1
- package/dist/react/types/scopes/tools.d.ts +4 -5
- package/dist/react/types/scopes/tools.d.ts.map +1 -1
- package/dist/react/utils/getMessageQuote.d.ts +1 -2
- package/dist/react/utils/getMessageQuote.d.ts.map +1 -1
- package/dist/react/utils/groupParts.d.ts +7 -8
- package/dist/react/utils/groupParts.d.ts.map +1 -1
- package/dist/react/utils/useJSONEqual.d.ts +2 -3
- package/dist/react/utils/useJSONEqual.d.ts.map +1 -1
- package/dist/react/utils/useJSONSchemaDependency.d.ts +1 -2
- package/dist/react/utils/useJSONSchemaDependency.d.ts.map +1 -1
- package/dist/runtime/api/assistant-runtime.d.ts +2 -3
- package/dist/runtime/api/assistant-runtime.d.ts.map +1 -1
- package/dist/runtime/api/attachment-runtime.d.ts +6 -7
- package/dist/runtime/api/attachment-runtime.d.ts.map +1 -1
- package/dist/runtime/api/bindings.d.ts +5 -6
- package/dist/runtime/api/bindings.d.ts.map +1 -1
- package/dist/runtime/api/composer-runtime.d.ts +10 -10
- package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
- package/dist/runtime/api/message-part-runtime.d.ts +3 -4
- package/dist/runtime/api/message-part-runtime.d.ts.map +1 -1
- package/dist/runtime/api/message-part-runtime.js +3 -2
- package/dist/runtime/api/message-part-runtime.js.map +1 -1
- package/dist/runtime/api/message-runtime.d.ts +8 -6
- package/dist/runtime/api/message-runtime.d.ts.map +1 -1
- package/dist/runtime/api/message-runtime.js +3 -2
- package/dist/runtime/api/message-runtime.js.map +1 -1
- package/dist/runtime/api/paths.d.ts +6 -7
- package/dist/runtime/api/paths.d.ts.map +1 -1
- package/dist/runtime/api/thread-list-item-runtime.d.ts +8 -8
- package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
- package/dist/runtime/api/thread-list-runtime.d.ts +4 -5
- package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
- package/dist/runtime/api/thread-runtime.d.ts +10 -11
- package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
- package/dist/runtime/base/base-assistant-runtime-core.d.ts +1 -2
- package/dist/runtime/base/base-assistant-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/base-composer-runtime-core.d.ts +1 -2
- package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/base-thread-runtime-core.d.ts +8 -3
- package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/base-thread-runtime-core.js +71 -27
- package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
- package/dist/runtime/base/default-edit-composer-runtime-core.d.ts +1 -2
- package/dist/runtime/base/default-edit-composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/default-edit-composer-runtime-core.js +12 -2
- package/dist/runtime/base/default-edit-composer-runtime-core.js.map +1 -1
- package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +1 -2
- package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/default-thread-composer-runtime-core.js +7 -1
- package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
- package/dist/runtime/branch/external-thread-branch-adapter.d.ts +1 -2
- package/dist/runtime/branch/external-thread-branch-adapter.d.ts.map +1 -1
- package/dist/runtime/interfaces/assistant-runtime-core.d.ts +1 -2
- package/dist/runtime/interfaces/assistant-runtime-core.d.ts.map +1 -1
- package/dist/runtime/interfaces/composer-runtime-core.d.ts +10 -11
- package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +4 -5
- package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
- package/dist/runtime/interfaces/thread-runtime-core.d.ts +17 -16
- package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
- package/dist/runtime/queue/external-thread-queue-adapter.d.ts +2 -3
- package/dist/runtime/queue/external-thread-queue-adapter.d.ts.map +1 -1
- package/dist/runtime/queue/message-queue.d.ts +5 -4
- package/dist/runtime/queue/message-queue.d.ts.map +1 -1
- package/dist/runtime/queue/message-queue.js +9 -1
- package/dist/runtime/queue/message-queue.js.map +1 -1
- package/dist/runtime/queue/queue-item.d.ts +2 -3
- package/dist/runtime/queue/queue-item.d.ts.map +1 -1
- package/dist/runtime/utils/abortable-thread-load.d.ts +2 -3
- package/dist/runtime/utils/abortable-thread-load.d.ts.map +1 -1
- package/dist/runtime/utils/attachment-add-operations.d.ts +3 -4
- package/dist/runtime/utils/attachment-add-operations.d.ts.map +1 -1
- package/dist/runtime/utils/auto-status.d.ts +7 -8
- package/dist/runtime/utils/auto-status.d.ts.map +1 -1
- package/dist/runtime/utils/chat-model-adapter.d.ts +5 -6
- package/dist/runtime/utils/chat-model-adapter.d.ts.map +1 -1
- package/dist/runtime/utils/external-message-conversion.d.ts +15 -16
- package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -1
- package/dist/runtime/utils/external-message-conversion.js +3 -2
- package/dist/runtime/utils/external-message-conversion.js.map +1 -1
- package/dist/runtime/utils/external-store-message.d.ts +4 -5
- package/dist/runtime/utils/external-store-message.d.ts.map +1 -1
- package/dist/runtime/utils/message-repository-session.d.ts +3 -4
- package/dist/runtime/utils/message-repository-session.d.ts.map +1 -1
- package/dist/runtime/utils/message-repository.d.ts +4 -5
- package/dist/runtime/utils/message-repository.d.ts.map +1 -1
- package/dist/runtime/utils/pending-tool-calls.d.ts +2 -3
- package/dist/runtime/utils/pending-tool-calls.d.ts.map +1 -1
- package/dist/runtime/utils/resolveToolApprovalResponse.d.ts +1 -2
- package/dist/runtime/utils/resolveToolApprovalResponse.d.ts.map +1 -1
- package/dist/runtime/utils/runtime-extras-brand.d.ts +2 -3
- package/dist/runtime/utils/runtime-extras-brand.d.ts.map +1 -1
- package/dist/runtime/utils/stored-message-parts.d.ts +21 -0
- package/dist/runtime/utils/stored-message-parts.d.ts.map +1 -0
- package/dist/runtime/utils/stored-message-parts.js +83 -0
- package/dist/runtime/utils/stored-message-parts.js.map +1 -0
- package/dist/runtime/utils/streaming-timing.d.ts +4 -5
- package/dist/runtime/utils/streaming-timing.d.ts.map +1 -1
- package/dist/runtime/utils/thread-message-like.d.ts +5 -5
- package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
- package/dist/runtime/utils/thread-message-like.js.map +1 -1
- package/dist/runtime/utils/thread-runtime-lifecycle.d.ts +3 -4
- package/dist/runtime/utils/thread-runtime-lifecycle.d.ts.map +1 -1
- package/dist/runtime/utils/tool-call-tree.d.ts +4 -5
- package/dist/runtime/utils/tool-call-tree.d.ts.map +1 -1
- package/dist/runtimes/assistant-transport/utils.d.ts +1 -2
- package/dist/runtimes/assistant-transport/utils.d.ts.map +1 -1
- package/dist/runtimes/external-store/external-store-adapter.d.ts +9 -6
- package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
- package/dist/runtimes/external-store/external-store-runtime-core.d.ts +1 -2
- package/dist/runtimes/external-store/external-store-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/external-store/external-store-shared-options.d.ts +2 -3
- package/dist/runtimes/external-store/external-store-shared-options.d.ts.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +2 -3
- package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +4 -3
- package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-runtime-core.js +29 -6
- package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
- package/dist/runtimes/external-store/thread-message-converter.d.ts +2 -3
- package/dist/runtimes/external-store/thread-message-converter.d.ts.map +1 -1
- package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts +2 -3
- package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts.map +1 -1
- package/dist/runtimes/local/local-runtime-core.d.ts +1 -2
- package/dist/runtimes/local/local-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/local/local-runtime-options.d.ts +1 -2
- package/dist/runtimes/local/local-runtime-options.d.ts.map +1 -1
- package/dist/runtimes/local/local-thread-list-runtime-core.d.ts +2 -3
- package/dist/runtimes/local/local-thread-list-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/local/local-thread-runtime-core.d.ts +9 -4
- package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/local/local-thread-runtime-core.js +53 -9
- package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
- package/dist/runtimes/local/should-continue.d.ts +1 -2
- package/dist/runtimes/local/should-continue.d.ts.map +1 -1
- package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +1 -2
- package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts +1 -2
- package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/adapter-changed.d.ts +1 -2
- package/dist/runtimes/remote-thread-list/adapter-changed.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts +1 -2
- package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/optimistic-state.d.ts +1 -2
- package/dist/runtimes/remote-thread-list/optimistic-state.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +16 -17
- package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/title-generation.d.ts +7 -8
- package/dist/runtimes/remote-thread-list/title-generation.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/title.d.ts +2 -3
- package/dist/runtimes/remote-thread-list/title.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/types.d.ts +8 -9
- package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
- package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +4 -5
- package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
- package/dist/store/clients/chain-of-thought-client.d.ts +1 -2
- package/dist/store/clients/chain-of-thought-client.d.ts.map +1 -1
- package/dist/store/clients/external-thread.d.ts +3 -4
- package/dist/store/clients/external-thread.d.ts.map +1 -1
- package/dist/store/clients/external-thread.js +15 -11
- package/dist/store/clients/external-thread.js.map +1 -1
- package/dist/store/clients/model-context-client.d.ts +1 -2
- package/dist/store/clients/model-context-client.d.ts.map +1 -1
- package/dist/store/clients/no-op-composer-client.d.ts +1 -2
- package/dist/store/clients/no-op-composer-client.d.ts.map +1 -1
- package/dist/store/clients/runtime-adapter.d.ts +1 -2
- package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
- package/dist/store/clients/single-thread-list.d.ts +1 -2
- package/dist/store/clients/single-thread-list.d.ts.map +1 -1
- package/dist/store/clients/suggestions.d.ts +3 -4
- package/dist/store/clients/suggestions.d.ts.map +1 -1
- package/dist/store/clients/thread-message-client.d.ts +2 -3
- package/dist/store/clients/thread-message-client.d.ts.map +1 -1
- package/dist/store/clients/thread-selection-events.d.ts +1 -2
- package/dist/store/clients/thread-selection-events.d.ts.map +1 -1
- package/dist/store/clients/thread-tasks.d.ts +3 -4
- package/dist/store/clients/thread-tasks.d.ts.map +1 -1
- package/dist/store/env.d.ts +1 -2
- package/dist/store/env.d.ts.map +1 -1
- package/dist/store/primitive-predicates.d.ts +11 -12
- package/dist/store/primitive-predicates.d.ts.map +1 -1
- package/dist/store/primitive-predicates.js +2 -2
- package/dist/store/primitive-predicates.js.map +1 -1
- package/dist/store/runtime-clients/attachment-runtime-client.d.ts +1 -2
- package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/composer-runtime-client.d.ts +1 -2
- package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/handle-runtime-action.d.ts +1 -2
- package/dist/store/runtime-clients/handle-runtime-action.d.ts.map +1 -1
- package/dist/store/runtime-clients/handle-thread-list-action.d.ts +1 -2
- package/dist/store/runtime-clients/handle-thread-list-action.d.ts.map +1 -1
- package/dist/store/runtime-clients/liveRef.d.ts +1 -2
- package/dist/store/runtime-clients/liveRef.d.ts.map +1 -1
- package/dist/store/runtime-clients/message-part-runtime-client.d.ts +1 -2
- package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/message-runtime-client.d.ts +1 -2
- package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts +1 -2
- package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/thread-list-runtime-client.d.ts +1 -2
- package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/thread-runtime-client.d.ts +1 -2
- package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/useSubscribable.d.ts +1 -2
- package/dist/store/runtime-clients/useSubscribable.d.ts.map +1 -1
- package/dist/store/scopes/attachment.d.ts +4 -5
- package/dist/store/scopes/attachment.d.ts.map +1 -1
- package/dist/store/scopes/chain-of-thought.d.ts +5 -6
- package/dist/store/scopes/chain-of-thought.d.ts.map +1 -1
- package/dist/store/scopes/composer.d.ts +6 -7
- package/dist/store/scopes/composer.d.ts.map +1 -1
- package/dist/store/scopes/message.d.ts +6 -6
- package/dist/store/scopes/message.d.ts.map +1 -1
- package/dist/store/scopes/model-context.d.ts +3 -4
- package/dist/store/scopes/model-context.d.ts.map +1 -1
- package/dist/store/scopes/part.d.ts +4 -5
- package/dist/store/scopes/part.d.ts.map +1 -1
- package/dist/store/scopes/queue-item.d.ts +4 -4
- package/dist/store/scopes/queue-item.d.ts.map +1 -1
- package/dist/store/scopes/suggestion.d.ts +4 -5
- package/dist/store/scopes/suggestion.d.ts.map +1 -1
- package/dist/store/scopes/suggestions.d.ts +5 -6
- package/dist/store/scopes/suggestions.d.ts.map +1 -1
- package/dist/store/scopes/task.d.ts +4 -5
- package/dist/store/scopes/task.d.ts.map +1 -1
- package/dist/store/scopes/thread-list-item.d.ts +5 -6
- package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
- package/dist/store/scopes/thread.d.ts +5 -6
- package/dist/store/scopes/thread.d.ts.map +1 -1
- package/dist/store/scopes/threads.d.ts +4 -5
- package/dist/store/scopes/threads.d.ts.map +1 -1
- package/dist/subscribable/subscribable.d.ts +15 -16
- package/dist/subscribable/subscribable.d.ts.map +1 -1
- package/dist/tests/remote-thread-list-test-helpers.d.ts +5 -6
- package/dist/tests/remote-thread-list-test-helpers.d.ts.map +1 -1
- package/dist/types/attachment.d.ts +9 -10
- package/dist/types/attachment.d.ts.map +1 -1
- package/dist/types/augmentations.d.ts +3 -4
- package/dist/types/augmentations.d.ts.map +1 -1
- package/dist/types/directive.d.ts +2 -3
- package/dist/types/directive.d.ts.map +1 -1
- package/dist/types/error.d.ts +8 -9
- package/dist/types/error.d.ts.map +1 -1
- package/dist/types/message.d.ts +48 -46
- package/dist/types/message.d.ts.map +1 -1
- package/dist/types/message.js.map +1 -1
- package/dist/types/quote.d.ts +1 -2
- package/dist/types/quote.d.ts.map +1 -1
- package/dist/types/trigger.d.ts +2 -3
- package/dist/types/trigger.d.ts.map +1 -1
- package/dist/types/unsubscribe.d.ts +1 -2
- package/dist/types/unsubscribe.d.ts.map +1 -1
- package/dist/utils/abortable-iterable.d.ts +2 -3
- package/dist/utils/abortable-iterable.d.ts.map +1 -1
- package/dist/utils/composite-context-provider.d.ts +1 -2
- package/dist/utils/composite-context-provider.d.ts.map +1 -1
- package/dist/utils/data-url.d.ts +6 -7
- package/dist/utils/data-url.d.ts.map +1 -1
- package/dist/utils/getGroupStatus.d.ts +2 -3
- package/dist/utils/getGroupStatus.d.ts.map +1 -1
- package/dist/utils/id.d.ts +3 -4
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/image-media-type.d.ts +1 -2
- package/dist/utils/image-media-type.d.ts.map +1 -1
- package/dist/utils/invoke-user-callback.d.ts +1 -2
- package/dist/utils/invoke-user-callback.d.ts.map +1 -1
- package/dist/utils/json/is-json-equal.d.ts +1 -2
- package/dist/utils/json/is-json-equal.d.ts.map +1 -1
- package/dist/utils/json/is-json.d.ts +4 -5
- package/dist/utils/json/is-json.d.ts.map +1 -1
- package/dist/utils/json/stable-stringify-tool-args.d.ts +2 -3
- package/dist/utils/json/stable-stringify-tool-args.d.ts.map +1 -1
- package/dist/utils/normalizePartStatus.d.ts +4 -5
- package/dist/utils/normalizePartStatus.d.ts.map +1 -1
- package/dist/utils/notify-event-listeners.d.ts +1 -2
- package/dist/utils/notify-event-listeners.d.ts.map +1 -1
- package/dist/utils/record.d.ts +1 -2
- package/dist/utils/record.d.ts.map +1 -1
- package/dist/utils/silent-runtime-action.d.ts +2 -3
- package/dist/utils/silent-runtime-action.d.ts.map +1 -1
- package/dist/utils/text.d.ts +1 -2
- package/dist/utils/text.d.ts.map +1 -1
- package/dist/utils/wire-media.d.ts +3 -4
- package/dist/utils/wire-media.d.ts.map +1 -1
- package/package.json +14 -13
- package/src/adapters/attachment.ts +8 -1
- package/src/adapters/feedback.ts +1 -0
- package/src/model-context/frame/provider.test.ts +45 -20
- package/src/react/RuntimeAdapter.test.ts +4 -1
- package/src/react/adapters/LocalStorageThreadListAdapter.test.ts +117 -0
- package/src/react/adapters/LocalStorageThreadListAdapter.tsx +27 -74
- package/src/react/client/Interactables.test.ts +12 -7
- package/src/react/client/RemoteThreadList.concurrent.test.tsx +9 -3
- package/src/react/client/RemoteThreadList.test.ts +5 -6
- package/src/react/interactables-legacy/Interactables.test.ts +9 -3
- package/src/react/interactables-legacy/useAssistantInteractable.test.tsx +40 -22
- package/src/react/model-context/useInteractable.test.tsx +56 -29
- package/src/react/primitive-hooks/useActionBarCopy.test.ts +5 -5
- package/src/react/primitives/generativeUI/GenerativeUI.test.tsx +54 -0
- package/src/react/primitives/generativeUI/GenerativeUI.tsx +13 -18
- package/src/react/primitives/message/MessageGroupedParts.test.tsx +4 -1
- package/src/react/primitives/thread/ThreadMessages.test.tsx +25 -7
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.layout.test.tsx +62 -0
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.retry.test.tsx +2 -2
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +23 -20
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.title.test.tsx +24 -17
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +39 -24
- package/src/react/runtimes/assistant-transport/transport-scheduling.test.ts +73 -46
- package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.test.tsx +66 -1
- package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +102 -0
- package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +24 -11
- package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.test.ts +8 -4
- package/src/react/runtimes/cloud/auiV0.ts +121 -1
- package/src/react/runtimes/cloud/auiV0DecodeSafely.test.ts +522 -0
- package/src/react/runtimes/external-message-converter.test.ts +7 -3
- package/src/react/runtimes/remote-thread-hook-on-tap.test.ts +2 -1
- package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +8 -2
- package/src/react/runtimes/useExternalStoreRuntime.suggestions.test.tsx +6 -2
- package/src/react/runtimes/useRemoteThreadListRuntime.concurrent.test.tsx +84 -4
- package/src/react/runtimes/useRemoteThreadListRuntime.ts +5 -1
- package/src/runtime/api/message-part-runtime.ts +4 -1
- package/src/runtime/api/message-runtime.ts +15 -2
- package/src/runtime/base/base-thread-runtime-core.test.ts +761 -18
- package/src/runtime/base/base-thread-runtime-core.ts +89 -26
- package/src/runtime/base/default-edit-composer-runtime-core.ts +12 -2
- package/src/runtime/base/default-thread-composer-runtime-core.ts +12 -1
- package/src/runtime/interfaces/thread-runtime-core.ts +2 -0
- package/src/runtime/queue/message-queue.ts +11 -1
- package/src/runtime/utils/external-message-conversion.test.ts +43 -0
- package/src/runtime/utils/external-message-conversion.ts +6 -2
- package/src/runtime/utils/stored-message-parts.ts +174 -0
- package/src/runtime/utils/thread-message-like.ts +7 -2
- package/src/runtimes/external-store/external-store-adapter.ts +4 -0
- package/src/runtimes/external-store/external-store-thread-runtime-core.ts +44 -9
- package/src/runtimes/local/local-thread-runtime-core.test.ts +168 -12
- package/src/runtimes/local/local-thread-runtime-core.ts +80 -9
- package/src/store/clients/external-thread.ts +34 -13
- package/src/store/primitive-predicates.test.ts +16 -0
- package/src/store/primitive-predicates.ts +4 -1
- package/src/store/runtime-clients/thread-runtime-client.test.tsx +110 -0
- package/src/store/scopes/message.ts +4 -1
- package/src/subscribable/subscribable.test.ts +7 -2
- package/src/tests/attachment-adapters.test.ts +16 -1
- package/src/tests/auiV0Encode.test.ts +4 -0
- package/src/tests/base-composer-runtime-core-addAttachment.test.ts +6 -6
- package/src/tests/base-composer-runtime-core.test.ts +16 -5
- package/src/tests/composer-can-cancel.test.ts +35 -6
- package/src/tests/composer-can-send.test.ts +22 -0
- package/src/tests/default-edit-composer-runtime-core.test.ts +47 -0
- package/src/tests/external-store-thread-runtime-core-adapter.test.ts +229 -27
- package/src/tests/external-store-thread-runtime-core.test.ts +31 -0
- package/src/tests/external-thread-attachments.test.tsx +22 -23
- package/src/tests/external-thread-feedback.test.tsx +20 -7
- package/src/tests/external-thread-parity.test.tsx +1 -1
- package/src/tests/message-queue.test.ts +45 -10
- package/src/tests/thread-switch-events.test.tsx +11 -7
- package/src/tests/useRemoteThreadListRuntime-controlled.test.tsx +2 -1
- package/src/types/message.test.ts +19 -0
- package/src/types/message.ts +16 -8
|
@@ -92,6 +92,8 @@ export abstract class BaseThreadRuntimeCore
|
|
|
92
92
|
return this.repository.getMessages();
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
+
protected _commitVoiceMessage(_message: ThreadMessage): void {}
|
|
96
|
+
|
|
95
97
|
public get messages(): readonly ThreadMessage[] {
|
|
96
98
|
if (this._voiceMessages.length === 0) {
|
|
97
99
|
return this._getBaseMessages();
|
|
@@ -101,7 +103,13 @@ export abstract class BaseThreadRuntimeCore
|
|
|
101
103
|
this._cachedVoiceGeneration !== this._voiceGeneration ||
|
|
102
104
|
this._cachedMergedBase !== base
|
|
103
105
|
) {
|
|
104
|
-
|
|
106
|
+
const baseMessageIds = new Set(base.map((message) => message.id));
|
|
107
|
+
this._cachedMergedMessages = [
|
|
108
|
+
...base,
|
|
109
|
+
...this._voiceMessages.filter(
|
|
110
|
+
(message) => !baseMessageIds.has(message.id),
|
|
111
|
+
),
|
|
112
|
+
];
|
|
105
113
|
this._cachedVoiceGeneration = this._voiceGeneration;
|
|
106
114
|
this._cachedMergedBase = base;
|
|
107
115
|
}
|
|
@@ -177,7 +185,17 @@ export abstract class BaseThreadRuntimeCore
|
|
|
177
185
|
);
|
|
178
186
|
}
|
|
179
187
|
|
|
188
|
+
protected _resolveAppendParent(parentId: string | null): string | null {
|
|
189
|
+
return this._isVoiceMessage(parentId)
|
|
190
|
+
? (this._getBaseMessages().at(-1)?.id ?? null)
|
|
191
|
+
: parentId;
|
|
192
|
+
}
|
|
193
|
+
|
|
180
194
|
public beginEdit(messageId: string) {
|
|
195
|
+
if (this.voice)
|
|
196
|
+
throw new Error(
|
|
197
|
+
"Cannot edit a message while a voice session is connected",
|
|
198
|
+
);
|
|
181
199
|
if (this._isVoiceMessage(messageId)) {
|
|
182
200
|
throw new Error("Voice transcript messages cannot be edited");
|
|
183
201
|
}
|
|
@@ -253,21 +271,21 @@ export abstract class BaseThreadRuntimeCore
|
|
|
253
271
|
});
|
|
254
272
|
}
|
|
255
273
|
|
|
256
|
-
public submitFeedback({ messageId, type }: SubmitFeedbackOptions) {
|
|
274
|
+
public submitFeedback({ messageId, type, comment }: SubmitFeedbackOptions) {
|
|
257
275
|
const adapter = this.adapters?.feedback;
|
|
258
|
-
if (!adapter) throw new Error("Feedback adapter not configured");
|
|
259
|
-
|
|
260
276
|
const entry = this.getMessageById(messageId);
|
|
261
277
|
if (!entry) throw new Error(`Message not found: ${messageId}`);
|
|
262
278
|
const { message, parentId } = entry;
|
|
263
|
-
|
|
279
|
+
const trimmed = comment?.trim();
|
|
280
|
+
const feedback = { type, ...(trimmed ? { comment: trimmed } : undefined) };
|
|
281
|
+
adapter?.submit({ message, ...feedback });
|
|
264
282
|
|
|
265
283
|
if (message.role === "assistant") {
|
|
266
284
|
const updatedMessage: ThreadMessage = {
|
|
267
285
|
...message,
|
|
268
286
|
metadata: {
|
|
269
287
|
...message.metadata,
|
|
270
|
-
submittedFeedback:
|
|
288
|
+
submittedFeedback: feedback,
|
|
271
289
|
},
|
|
272
290
|
};
|
|
273
291
|
const voiceIdx = this._voiceMessages.findIndex(
|
|
@@ -384,12 +402,31 @@ export abstract class BaseThreadRuntimeCore
|
|
|
384
402
|
return () => this._voiceVolumeSubscribers.delete(callback);
|
|
385
403
|
};
|
|
386
404
|
|
|
405
|
+
protected _onVoiceConnected(): void {}
|
|
406
|
+
|
|
407
|
+
protected _onVoiceDisconnected(): void {}
|
|
408
|
+
|
|
409
|
+
protected _isRunActive(): boolean {
|
|
410
|
+
const runtime: ThreadRuntimeCore = this;
|
|
411
|
+
if (runtime.isRunning) return true;
|
|
412
|
+
const last = this._getBaseMessages().at(-1);
|
|
413
|
+
return (
|
|
414
|
+
last?.role === "assistant" &&
|
|
415
|
+
(last.status.type === "running" || last.status.type === "requires-action")
|
|
416
|
+
);
|
|
417
|
+
}
|
|
418
|
+
|
|
387
419
|
public connectVoice() {
|
|
388
420
|
const adapter = this.adapters?.voice;
|
|
389
421
|
if (!adapter) throw new Error("Voice adapter not configured");
|
|
422
|
+
if (this._isRunActive())
|
|
423
|
+
throw new Error(
|
|
424
|
+
"Cannot start a voice session while a run is in progress or paused on a pending tool action",
|
|
425
|
+
);
|
|
426
|
+
const replacing = this._voiceSession !== undefined;
|
|
390
427
|
|
|
391
428
|
try {
|
|
392
|
-
this.
|
|
429
|
+
this._disconnectVoice(false);
|
|
393
430
|
} catch (error) {
|
|
394
431
|
console.error(
|
|
395
432
|
"[assistant-ui] Voice cleanup threw before reconnect",
|
|
@@ -397,7 +434,14 @@ export abstract class BaseThreadRuntimeCore
|
|
|
397
434
|
);
|
|
398
435
|
}
|
|
399
436
|
|
|
400
|
-
|
|
437
|
+
let session: RealtimeVoiceAdapter.Session;
|
|
438
|
+
try {
|
|
439
|
+
session = adapter.connect({});
|
|
440
|
+
} catch (error) {
|
|
441
|
+
if (replacing && this._voiceSession === undefined)
|
|
442
|
+
this._onVoiceDisconnected();
|
|
443
|
+
throw error;
|
|
444
|
+
}
|
|
401
445
|
this._voiceSession = session;
|
|
402
446
|
const unsubs: Array<() => void> = [];
|
|
403
447
|
this._voiceUnsubs = unsubs;
|
|
@@ -433,10 +477,12 @@ export abstract class BaseThreadRuntimeCore
|
|
|
433
477
|
|
|
434
478
|
unsubs.push(
|
|
435
479
|
session.onStatusChange((status) => {
|
|
480
|
+
if (this._voiceSession !== session) return;
|
|
436
481
|
if (status.type === "ended") {
|
|
437
482
|
this._finishVoiceAssistantMessage();
|
|
438
483
|
this._voiceSession = undefined;
|
|
439
484
|
this.voice = undefined;
|
|
485
|
+
this._onVoiceDisconnected();
|
|
440
486
|
} else {
|
|
441
487
|
this.voice = {
|
|
442
488
|
status,
|
|
@@ -477,17 +523,19 @@ export abstract class BaseThreadRuntimeCore
|
|
|
477
523
|
this._handleVoiceTranscript(transcript);
|
|
478
524
|
}),
|
|
479
525
|
);
|
|
480
|
-
finishDetachedSetup();
|
|
526
|
+
if (!finishDetachedSetup()) this._onVoiceConnected();
|
|
481
527
|
} catch (error) {
|
|
482
528
|
if (this._voiceSession === session && this._voiceUnsubs === unsubs) {
|
|
483
529
|
try {
|
|
484
|
-
this.
|
|
530
|
+
this._disconnectVoice(false);
|
|
485
531
|
} catch (cleanupError) {
|
|
486
532
|
console.error(
|
|
487
533
|
"[assistant-ui] Voice rollback cleanup threw",
|
|
488
534
|
cleanupError,
|
|
489
535
|
);
|
|
490
536
|
}
|
|
537
|
+
if (replacing && this._voiceSession === undefined)
|
|
538
|
+
this._onVoiceDisconnected();
|
|
491
539
|
} else {
|
|
492
540
|
finishDetachedSetup();
|
|
493
541
|
}
|
|
@@ -507,7 +555,7 @@ export abstract class BaseThreadRuntimeCore
|
|
|
507
555
|
this._currentAssistantMsg = null;
|
|
508
556
|
|
|
509
557
|
if (transcript.isFinal) {
|
|
510
|
-
|
|
558
|
+
const message: ThreadMessage = {
|
|
511
559
|
id: generateId(),
|
|
512
560
|
role: "user",
|
|
513
561
|
content: [{ type: "text", text: transcript.text }],
|
|
@@ -515,7 +563,9 @@ export abstract class BaseThreadRuntimeCore
|
|
|
515
563
|
createdAt: new Date(),
|
|
516
564
|
status: { type: "complete", reason: "unknown" },
|
|
517
565
|
attachments: [],
|
|
518
|
-
}
|
|
566
|
+
};
|
|
567
|
+
this._voiceMessages.push(message);
|
|
568
|
+
this._commitVoiceMessage(message);
|
|
519
569
|
this._markVoiceMessagesDirty();
|
|
520
570
|
this._notifySubscribers();
|
|
521
571
|
}
|
|
@@ -554,6 +604,7 @@ export abstract class BaseThreadRuntimeCore
|
|
|
554
604
|
}
|
|
555
605
|
|
|
556
606
|
if (transcript.isFinal) {
|
|
607
|
+
this._commitVoiceMessage(this._currentAssistantMsg);
|
|
557
608
|
this._currentAssistantMsg = null;
|
|
558
609
|
}
|
|
559
610
|
|
|
@@ -562,7 +613,7 @@ export abstract class BaseThreadRuntimeCore
|
|
|
562
613
|
}
|
|
563
614
|
}
|
|
564
615
|
|
|
565
|
-
private _finishVoiceAssistantMessage() {
|
|
616
|
+
private _finishVoiceAssistantMessage(notify = true) {
|
|
566
617
|
const last = this._voiceMessages.at(-1);
|
|
567
618
|
if (last?.role === "assistant" && last.status.type === "running") {
|
|
568
619
|
const idx = this._voiceMessages.length - 1;
|
|
@@ -570,12 +621,19 @@ export abstract class BaseThreadRuntimeCore
|
|
|
570
621
|
...(last as ThreadAssistantMessage),
|
|
571
622
|
status: { type: "complete", reason: "stop" },
|
|
572
623
|
};
|
|
624
|
+
this._commitVoiceMessage(this._voiceMessages[idx]!);
|
|
625
|
+
this._currentAssistantMsg = null;
|
|
573
626
|
this._markVoiceMessagesDirty();
|
|
574
|
-
this._notifySubscribers();
|
|
627
|
+
if (notify) this._notifySubscribers();
|
|
575
628
|
}
|
|
576
629
|
}
|
|
577
630
|
|
|
578
631
|
public disconnectVoice() {
|
|
632
|
+
this._disconnectVoice(true);
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
private _disconnectVoice(fireHook: boolean) {
|
|
636
|
+
this._finishVoiceAssistantMessage(false);
|
|
579
637
|
this._currentAssistantMsg = null;
|
|
580
638
|
// Drain the shared list in place so reentrant setup cannot release the same handles again.
|
|
581
639
|
const unsubs = this._voiceUnsubs.splice(0);
|
|
@@ -591,18 +649,23 @@ export abstract class BaseThreadRuntimeCore
|
|
|
591
649
|
this._voiceMessages = [];
|
|
592
650
|
this._markVoiceMessagesDirty();
|
|
593
651
|
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
652
|
+
try {
|
|
653
|
+
notifySubscribers([
|
|
654
|
+
...unsubs,
|
|
655
|
+
...(stopSpeaking ? [stopSpeaking] : []),
|
|
656
|
+
...(session ? [() => session.disconnect()] : []),
|
|
657
|
+
() =>
|
|
658
|
+
notifyEventListeners(
|
|
659
|
+
this._voiceVolumeSubscribers,
|
|
660
|
+
undefined,
|
|
661
|
+
"Voice volume",
|
|
662
|
+
),
|
|
663
|
+
() => this._notifySubscribers(),
|
|
664
|
+
]);
|
|
665
|
+
} finally {
|
|
666
|
+
if (fireHook && session && this._voiceSession === undefined)
|
|
667
|
+
this._onVoiceDisconnected();
|
|
668
|
+
}
|
|
606
669
|
}
|
|
607
670
|
|
|
608
671
|
public muteVoice() {
|
|
@@ -14,7 +14,7 @@ export class DefaultEditComposerRuntimeCore extends BaseComposerRuntimeCore {
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
public get canSend() {
|
|
17
|
-
return !this.isEmpty && !this._isSending;
|
|
17
|
+
return !this.isEmpty && !this.runtime.voice && !this._isSending;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
protected getAttachmentAdapter() {
|
|
@@ -52,7 +52,17 @@ export class DefaultEditComposerRuntimeCore extends BaseComposerRuntimeCore {
|
|
|
52
52
|
) {
|
|
53
53
|
super();
|
|
54
54
|
this.runtime = runtime;
|
|
55
|
-
|
|
55
|
+
let lastHasVoice = runtime.voice !== undefined;
|
|
56
|
+
const unsubscribe = runtime.subscribe(() => {
|
|
57
|
+
const hasVoice = runtime.voice !== undefined;
|
|
58
|
+
if (hasVoice === lastHasVoice) return;
|
|
59
|
+
lastHasVoice = hasVoice;
|
|
60
|
+
this._notifySubscribers();
|
|
61
|
+
});
|
|
62
|
+
this.endEditCallback = () => {
|
|
63
|
+
unsubscribe();
|
|
64
|
+
endEditCallback();
|
|
65
|
+
};
|
|
56
66
|
this._parentId = parentId;
|
|
57
67
|
this._sourceId = message.id;
|
|
58
68
|
this.setText(getThreadMessageText(message));
|
|
@@ -26,7 +26,12 @@ export class DefaultThreadComposerRuntimeCore
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
public get canSend() {
|
|
29
|
-
return
|
|
29
|
+
return (
|
|
30
|
+
!this.isEmpty &&
|
|
31
|
+
!this.runtime.isSendDisabled &&
|
|
32
|
+
!this.runtime.voice &&
|
|
33
|
+
!this._isSending
|
|
34
|
+
);
|
|
30
35
|
}
|
|
31
36
|
|
|
32
37
|
private _queueCache:
|
|
@@ -99,6 +104,7 @@ export class DefaultThreadComposerRuntimeCore
|
|
|
99
104
|
public connect() {
|
|
100
105
|
let lastCanCancel = false;
|
|
101
106
|
let lastIsSendDisabled = this.runtime.isSendDisabled;
|
|
107
|
+
let lastHasVoice = this.runtime.voice !== undefined;
|
|
102
108
|
let lastQueue = this.queue;
|
|
103
109
|
return this.runtime.subscribe(() => {
|
|
104
110
|
let changed = false;
|
|
@@ -111,6 +117,11 @@ export class DefaultThreadComposerRuntimeCore
|
|
|
111
117
|
lastIsSendDisabled = this.runtime.isSendDisabled;
|
|
112
118
|
changed = true;
|
|
113
119
|
}
|
|
120
|
+
const hasVoice = this.runtime.voice !== undefined;
|
|
121
|
+
if (lastHasVoice !== hasVoice) {
|
|
122
|
+
lastHasVoice = hasVoice;
|
|
123
|
+
changed = true;
|
|
124
|
+
}
|
|
114
125
|
if (lastQueue !== this.queue) {
|
|
115
126
|
lastQueue = this.queue;
|
|
116
127
|
changed = true;
|
|
@@ -71,6 +71,7 @@ export type RespondToToolApprovalOptions = {
|
|
|
71
71
|
export type SubmitFeedbackOptions = {
|
|
72
72
|
messageId: string;
|
|
73
73
|
type: "negative" | "positive";
|
|
74
|
+
comment?: string;
|
|
74
75
|
};
|
|
75
76
|
|
|
76
77
|
export type ThreadSuggestion = {
|
|
@@ -95,6 +96,7 @@ export type VoiceSessionState = {
|
|
|
95
96
|
|
|
96
97
|
export type SubmittedFeedback = {
|
|
97
98
|
readonly type: "negative" | "positive";
|
|
99
|
+
readonly comment?: string;
|
|
98
100
|
};
|
|
99
101
|
|
|
100
102
|
export type ThreadRuntimeEventPayload = {
|
|
@@ -25,6 +25,8 @@ export type MessageQueueDriver = {
|
|
|
25
25
|
|
|
26
26
|
export type MessageQueueController = {
|
|
27
27
|
readonly adapter: ExternalThreadQueueAdapter;
|
|
28
|
+
hold: () => void;
|
|
29
|
+
release: () => void;
|
|
28
30
|
/** Mark a run as in flight so concurrent sends buffer; call on the rising edge. */
|
|
29
31
|
notifyBusy: () => void;
|
|
30
32
|
/** Advances to the next pending message; call on the run's falling edge. */
|
|
@@ -88,6 +90,7 @@ export const createMessageQueue = (
|
|
|
88
90
|
|
|
89
91
|
let running = false;
|
|
90
92
|
let paused = false;
|
|
93
|
+
let held = false;
|
|
91
94
|
let dispatchTransform: (message: AppendMessage) => AppendMessage = (m) => m;
|
|
92
95
|
// swallow the cancelled run's settle when steering so it does not double-advance
|
|
93
96
|
let suppressIdle = 0;
|
|
@@ -133,7 +136,7 @@ export const createMessageQueue = (
|
|
|
133
136
|
};
|
|
134
137
|
|
|
135
138
|
const advance = () => {
|
|
136
|
-
if (running || paused) return;
|
|
139
|
+
if (running || paused || held) return;
|
|
137
140
|
const lane: Lane = lanes.steer.length > 0 ? "steer" : "queue";
|
|
138
141
|
const head = lanes[lane][0];
|
|
139
142
|
if (!head) return;
|
|
@@ -334,6 +337,13 @@ export const createMessageQueue = (
|
|
|
334
337
|
|
|
335
338
|
return {
|
|
336
339
|
adapter,
|
|
340
|
+
hold: () => {
|
|
341
|
+
held = true;
|
|
342
|
+
},
|
|
343
|
+
release: () => {
|
|
344
|
+
held = false;
|
|
345
|
+
advance();
|
|
346
|
+
},
|
|
337
347
|
notifyBusy: () => {
|
|
338
348
|
paused = false;
|
|
339
349
|
// a cancelled run's settle that is still outstanding belongs to a run
|
|
@@ -152,6 +152,49 @@ describe("chunkExternalMessages", () => {
|
|
|
152
152
|
]);
|
|
153
153
|
expect(chunks[1]?.inputs).toEqual([answer]);
|
|
154
154
|
});
|
|
155
|
+
|
|
156
|
+
it("keeps a voice assistant transcript out of the neighbouring assistant chunks", () => {
|
|
157
|
+
const typed = {};
|
|
158
|
+
const spoken = {};
|
|
159
|
+
const spokenAgain = {};
|
|
160
|
+
const typedAgain = {};
|
|
161
|
+
const callbackResults: ExternalMessageConverterCallbackResult<object>[] = [
|
|
162
|
+
{ input: typed, outputs: [{ role: "assistant", content: "typed" }] },
|
|
163
|
+
{
|
|
164
|
+
input: spoken,
|
|
165
|
+
outputs: [
|
|
166
|
+
{
|
|
167
|
+
role: "assistant",
|
|
168
|
+
content: "spoken",
|
|
169
|
+
metadata: { modality: "voice" },
|
|
170
|
+
},
|
|
171
|
+
],
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
input: spokenAgain,
|
|
175
|
+
outputs: [
|
|
176
|
+
{
|
|
177
|
+
role: "assistant",
|
|
178
|
+
content: "spoken again",
|
|
179
|
+
metadata: { modality: "voice" },
|
|
180
|
+
},
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
input: typedAgain,
|
|
185
|
+
outputs: [{ role: "assistant", content: "typed again" }],
|
|
186
|
+
},
|
|
187
|
+
];
|
|
188
|
+
|
|
189
|
+
const chunks = chunkExternalMessages(callbackResults);
|
|
190
|
+
|
|
191
|
+
expect(chunks.map((chunk) => chunk.inputs)).toEqual([
|
|
192
|
+
[typed],
|
|
193
|
+
[spoken],
|
|
194
|
+
[spokenAgain],
|
|
195
|
+
[typedAgain],
|
|
196
|
+
]);
|
|
197
|
+
});
|
|
155
198
|
});
|
|
156
199
|
|
|
157
200
|
describe("convertExternalMessageChunk", () => {
|
|
@@ -348,11 +348,14 @@ export const chunkExternalMessages = <T>(
|
|
|
348
348
|
|
|
349
349
|
for (const callbackResult of callbackResults) {
|
|
350
350
|
for (const output of callbackResult.outputs) {
|
|
351
|
+
const isVoice =
|
|
352
|
+
output.role === "assistant" && output.metadata?.modality === "voice";
|
|
351
353
|
if (
|
|
352
354
|
(pendingNone && output.role !== "tool") ||
|
|
353
355
|
!isAssistant ||
|
|
354
356
|
output.role === "user" ||
|
|
355
|
-
output.role === "system"
|
|
357
|
+
output.role === "system" ||
|
|
358
|
+
isVoice
|
|
356
359
|
) {
|
|
357
360
|
flush();
|
|
358
361
|
}
|
|
@@ -365,7 +368,8 @@ export const chunkExternalMessages = <T>(
|
|
|
365
368
|
|
|
366
369
|
if (
|
|
367
370
|
output.role === "assistant" &&
|
|
368
|
-
(
|
|
371
|
+
(isVoice ||
|
|
372
|
+
output.convertConfig?.joinStrategy === "none" ||
|
|
369
373
|
joinStrategy === "none")
|
|
370
374
|
) {
|
|
371
375
|
pendingNone = true;
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import type { CompleteAttachment } from "../../types/attachment";
|
|
2
|
+
import type {
|
|
3
|
+
ThreadAssistantMessagePart,
|
|
4
|
+
ThreadMessage,
|
|
5
|
+
ThreadUserMessagePart,
|
|
6
|
+
} from "../../types/message";
|
|
7
|
+
import { isRecord } from "../../utils/json/is-json";
|
|
8
|
+
|
|
9
|
+
export const MAX_STORED_MESSAGE_DEPTH = 100;
|
|
10
|
+
|
|
11
|
+
type StoredPartGuard = (part: Record<string, unknown>) => boolean;
|
|
12
|
+
|
|
13
|
+
export type StoredMessagePart = Record<string, unknown> & { type: string };
|
|
14
|
+
|
|
15
|
+
export const parseStoredDate = (value: unknown): Date | null => {
|
|
16
|
+
if (value instanceof Date && !Number.isNaN(value.getTime())) return value;
|
|
17
|
+
if (typeof value !== "string" && typeof value !== "number") return null;
|
|
18
|
+
|
|
19
|
+
const date = new Date(value);
|
|
20
|
+
return Number.isNaN(date.getTime()) ? null : date;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export const isStoredMessageRole = (
|
|
24
|
+
value: unknown,
|
|
25
|
+
): value is ThreadMessage["role"] =>
|
|
26
|
+
value === "system" || value === "user" || value === "assistant";
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Builds the readability predicate for a persistence boundary. A stored part is
|
|
30
|
+
* readable when it passes the guard for its known type, or when its type is
|
|
31
|
+
* unknown and the boundary can still read it.
|
|
32
|
+
*
|
|
33
|
+
* Unknown types are where the boundaries part: local storage hands its rows to
|
|
34
|
+
* the runtime untouched, so a type written by a newer release still loads,
|
|
35
|
+
* while the aui/v0 decoder converts a `data-` prefix and throws on anything
|
|
36
|
+
* else unknown. Per-type differences ride in `overrides`.
|
|
37
|
+
*/
|
|
38
|
+
const makeIsStoredMessagePart = (
|
|
39
|
+
overrides: Partial<
|
|
40
|
+
Record<
|
|
41
|
+
(ThreadUserMessagePart | ThreadAssistantMessagePart)["type"],
|
|
42
|
+
StoredPartGuard
|
|
43
|
+
>
|
|
44
|
+
>,
|
|
45
|
+
isReadableUnknownType: (type: string) => boolean,
|
|
46
|
+
) => {
|
|
47
|
+
const storedPartGuards = {
|
|
48
|
+
text: (part) => typeof part.text === "string",
|
|
49
|
+
reasoning: (part) =>
|
|
50
|
+
typeof part.text === "string" ||
|
|
51
|
+
typeof part.unstable_summary === "string",
|
|
52
|
+
image: (part) => typeof part.image === "string",
|
|
53
|
+
file: (part) =>
|
|
54
|
+
typeof part.data === "string" && typeof part.mimeType === "string",
|
|
55
|
+
audio: (part) =>
|
|
56
|
+
isRecord(part.audio) &&
|
|
57
|
+
typeof part.audio.data === "string" &&
|
|
58
|
+
typeof part.audio.format === "string",
|
|
59
|
+
data: (part) => typeof part.name === "string",
|
|
60
|
+
source: (part) =>
|
|
61
|
+
typeof part.id === "string" &&
|
|
62
|
+
(part.sourceType === "url"
|
|
63
|
+
? typeof part.url === "string"
|
|
64
|
+
: part.sourceType === "document" &&
|
|
65
|
+
typeof part.title === "string" &&
|
|
66
|
+
typeof part.mediaType === "string"),
|
|
67
|
+
"generative-ui": (part) => isRecord(part.spec),
|
|
68
|
+
"tool-call": (part) =>
|
|
69
|
+
typeof part.toolCallId === "string" &&
|
|
70
|
+
typeof part.toolName === "string" &&
|
|
71
|
+
isRecord(part.args) &&
|
|
72
|
+
typeof part.argsText === "string",
|
|
73
|
+
} satisfies Record<
|
|
74
|
+
(ThreadUserMessagePart | ThreadAssistantMessagePart)["type"],
|
|
75
|
+
StoredPartGuard
|
|
76
|
+
>;
|
|
77
|
+
const guards: Record<string, StoredPartGuard> = {
|
|
78
|
+
...storedPartGuards,
|
|
79
|
+
...overrides,
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
return (value: unknown): value is StoredMessagePart =>
|
|
83
|
+
isRecord(value) &&
|
|
84
|
+
typeof value.type === "string" &&
|
|
85
|
+
(Object.hasOwn(guards, value.type)
|
|
86
|
+
? guards[value.type]!(value)
|
|
87
|
+
: isReadableUnknownType(value.type));
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export const isStoredMessagePart = makeIsStoredMessagePart({}, () => true);
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* The aui/v0 decoder dereferences each present field rather than reading only
|
|
94
|
+
* the one it needs, so this boundary checks every field it will touch, while
|
|
95
|
+
* local storage stays no stricter than what the runtime itself writes.
|
|
96
|
+
*/
|
|
97
|
+
const isStoredAuiV0Part = makeIsStoredMessagePart(
|
|
98
|
+
{
|
|
99
|
+
reasoning: (part) =>
|
|
100
|
+
(part.text === undefined || typeof part.text === "string") &&
|
|
101
|
+
(part.unstable_summary === undefined ||
|
|
102
|
+
typeof part.unstable_summary === "string") &&
|
|
103
|
+
(typeof part.text === "string" ||
|
|
104
|
+
typeof part.unstable_summary === "string"),
|
|
105
|
+
"tool-call": (part) =>
|
|
106
|
+
typeof part.toolCallId === "string" &&
|
|
107
|
+
typeof part.toolName === "string" &&
|
|
108
|
+
(part.args === undefined || isRecord(part.args)) &&
|
|
109
|
+
(part.argsText === undefined || typeof part.argsText === "string") &&
|
|
110
|
+
(part.args !== undefined || part.argsText !== undefined),
|
|
111
|
+
},
|
|
112
|
+
(type) => type.startsWith("data-"),
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
const rolePartTypes = {
|
|
116
|
+
user: {
|
|
117
|
+
text: true,
|
|
118
|
+
image: true,
|
|
119
|
+
file: true,
|
|
120
|
+
data: true,
|
|
121
|
+
audio: true,
|
|
122
|
+
} satisfies Record<ThreadUserMessagePart["type"], true>,
|
|
123
|
+
assistant: {
|
|
124
|
+
text: true,
|
|
125
|
+
reasoning: true,
|
|
126
|
+
"tool-call": true,
|
|
127
|
+
source: true,
|
|
128
|
+
file: true,
|
|
129
|
+
image: true,
|
|
130
|
+
data: true,
|
|
131
|
+
"generative-ui": true,
|
|
132
|
+
} satisfies Record<ThreadAssistantMessagePart["type"], true>,
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* `fromThreadMessageLike` converts each part through its role's branch and
|
|
137
|
+
* throws on a part that branch does not carry, which would cost the whole
|
|
138
|
+
* stored row. The aui/v0 boundary decodes through that converter, so it filters
|
|
139
|
+
* by role as well as by shape. A part type unknown to this table is left to the
|
|
140
|
+
* boundary predicate, which keeps the `data-` prefixes the converter handles.
|
|
141
|
+
*/
|
|
142
|
+
export const isStoredAuiV0RolePart = (
|
|
143
|
+
role: ThreadMessage["role"],
|
|
144
|
+
value: unknown,
|
|
145
|
+
): value is StoredMessagePart =>
|
|
146
|
+
isStoredAuiV0Part(value) &&
|
|
147
|
+
(role === "system"
|
|
148
|
+
? value.type === "text"
|
|
149
|
+
: Object.hasOwn(rolePartTypes.assistant, value.type) ||
|
|
150
|
+
Object.hasOwn(rolePartTypes.user, value.type)
|
|
151
|
+
? Object.hasOwn(rolePartTypes[role], value.type)
|
|
152
|
+
: true);
|
|
153
|
+
|
|
154
|
+
export const parseStoredAttachment = (
|
|
155
|
+
value: unknown,
|
|
156
|
+
isPart: (value: unknown) => value is StoredMessagePart,
|
|
157
|
+
): CompleteAttachment | null => {
|
|
158
|
+
if (
|
|
159
|
+
!isRecord(value) ||
|
|
160
|
+
typeof value.id !== "string" ||
|
|
161
|
+
typeof value.type !== "string" ||
|
|
162
|
+
typeof value.name !== "string" ||
|
|
163
|
+
!isRecord(value.status) ||
|
|
164
|
+
value.status.type !== "complete" ||
|
|
165
|
+
!Array.isArray(value.content)
|
|
166
|
+
) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return {
|
|
171
|
+
...value,
|
|
172
|
+
content: value.content.filter(isPart),
|
|
173
|
+
} as CompleteAttachment;
|
|
174
|
+
};
|
|
@@ -80,14 +80,19 @@ export type ThreadMessageLike = {
|
|
|
80
80
|
| undefined;
|
|
81
81
|
readonly metadata?:
|
|
82
82
|
| {
|
|
83
|
-
readonly unstable_state?: ReadonlyJSONValue;
|
|
83
|
+
readonly unstable_state?: ReadonlyJSONValue | undefined;
|
|
84
84
|
readonly unstable_annotations?:
|
|
85
85
|
| readonly ReadonlyJSONValue[]
|
|
86
86
|
| undefined;
|
|
87
87
|
readonly unstable_data?: readonly ReadonlyJSONValue[] | undefined;
|
|
88
88
|
readonly steps?: readonly ThreadStep[] | undefined;
|
|
89
89
|
readonly timing?: MessageTiming | undefined;
|
|
90
|
-
readonly submittedFeedback?:
|
|
90
|
+
readonly submittedFeedback?:
|
|
91
|
+
| {
|
|
92
|
+
readonly type: "positive" | "negative";
|
|
93
|
+
readonly comment?: string;
|
|
94
|
+
}
|
|
95
|
+
| undefined;
|
|
91
96
|
readonly isOptimistic?: boolean | undefined;
|
|
92
97
|
readonly modality?: MessageModality | undefined;
|
|
93
98
|
readonly custom?: Record<string, unknown> | undefined;
|
|
@@ -133,6 +133,10 @@ type ExternalStoreAdapterBase<T> = {
|
|
|
133
133
|
* back, because the runtime cannot see a removal it did not make.
|
|
134
134
|
*/
|
|
135
135
|
setMessages?: ((messages: readonly T[]) => void) | undefined;
|
|
136
|
+
/**
|
|
137
|
+
* Called with each finalized voice transcript message. The host appends it to its own messages under the same id, which is how the runtime knows the host carries it. A host that does not implement this callback keeps transcripts for the session only.
|
|
138
|
+
*/
|
|
139
|
+
onVoiceTranscript?: ((message: ThreadMessage) => void) | undefined;
|
|
136
140
|
/**
|
|
137
141
|
* Fires when the user explicitly switches branches via the runtime's
|
|
138
142
|
* `switchToBranch` action (e.g. a BranchPicker click). It does not fire on
|