@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
|
@@ -475,6 +475,17 @@ export class ExternalStoreThreadRuntimeCore
|
|
|
475
475
|
this._messages = messagesSnapshot;
|
|
476
476
|
}
|
|
477
477
|
|
|
478
|
+
if (this._voiceMessages.length > 0) {
|
|
479
|
+
const hostIds = new Set(this._messages.map((message) => message.id));
|
|
480
|
+
const remaining = this._voiceMessages.filter(
|
|
481
|
+
(message) => !hostIds.has(message.id),
|
|
482
|
+
);
|
|
483
|
+
if (remaining.length !== this._voiceMessages.length) {
|
|
484
|
+
this._voiceMessages = remaining;
|
|
485
|
+
this._markVoiceMessagesDirty();
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
|
|
478
489
|
if (repositoryChanged) {
|
|
479
490
|
this._runTrackerUpdate(() => this._toolInvocations?.reset());
|
|
480
491
|
}
|
|
@@ -637,23 +648,31 @@ export class ExternalStoreThreadRuntimeCore
|
|
|
637
648
|
}
|
|
638
649
|
|
|
639
650
|
public async append(rawMessage: AppendMessage): Promise<void> {
|
|
640
|
-
|
|
651
|
+
let message = {
|
|
652
|
+
...rawMessage,
|
|
653
|
+
parentId: this._resolveAppendParent(rawMessage.parentId),
|
|
654
|
+
};
|
|
655
|
+
if (this.voice)
|
|
656
|
+
throw new Error(
|
|
657
|
+
"Cannot send a text message while a voice session is connected",
|
|
658
|
+
);
|
|
659
|
+
if (this._isVoiceMessage(message.sourceId))
|
|
641
660
|
throw new Error("Voice transcript messages cannot be edited");
|
|
642
661
|
// sourceId marks an edit send; the parent may coincide with the head
|
|
643
662
|
// after a resync (e.g. cancelRun dropped the edited message).
|
|
644
663
|
const isEdit =
|
|
645
|
-
|
|
646
|
-
|
|
664
|
+
message.sourceId != null ||
|
|
665
|
+
message.parentId !== (this._getBaseMessages().at(-1)?.id ?? null);
|
|
647
666
|
|
|
648
667
|
// A transformed-queue send is stamped at flush; any other queue's
|
|
649
668
|
// transform would gate against its own thread's messages, so those stamp
|
|
650
669
|
// at send.
|
|
651
|
-
|
|
670
|
+
message =
|
|
652
671
|
!isEdit &&
|
|
653
672
|
this._store.queue &&
|
|
654
673
|
this._store.queue === this._transformedQueue
|
|
655
|
-
?
|
|
656
|
-
: this.enrichAppendMetadata(
|
|
674
|
+
? message
|
|
675
|
+
: this.enrichAppendMetadata(message);
|
|
657
676
|
|
|
658
677
|
const generation = captureThreadRuntimeGeneration(this);
|
|
659
678
|
this.ensureInitialized();
|
|
@@ -707,6 +726,10 @@ export class ExternalStoreThreadRuntimeCore
|
|
|
707
726
|
}
|
|
708
727
|
}
|
|
709
728
|
|
|
729
|
+
protected override _commitVoiceMessage(message: ThreadMessage): void {
|
|
730
|
+
this._store.onVoiceTranscript?.(message);
|
|
731
|
+
}
|
|
732
|
+
|
|
710
733
|
public async deleteMessage(messageId: string): Promise<void> {
|
|
711
734
|
if (this._store.onDelete) {
|
|
712
735
|
// The host owns deletion here, and it may decline (fail a server call,
|
|
@@ -763,7 +786,14 @@ export class ExternalStoreThreadRuntimeCore
|
|
|
763
786
|
}
|
|
764
787
|
|
|
765
788
|
this.repository.deleteMessage(messageId);
|
|
766
|
-
this.
|
|
789
|
+
this._publishRepositoryMessages();
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
// Notifies even when the visible messages are unchanged: deleting an
|
|
793
|
+
// off-branch message still changes the branch counts subscribers read.
|
|
794
|
+
private _publishRepositoryMessages() {
|
|
795
|
+
const messages = this.repository.getMessages();
|
|
796
|
+
if (!shallowArrayEqual(this._messages, messages)) this._messages = messages;
|
|
767
797
|
this._notifySubscribers();
|
|
768
798
|
}
|
|
769
799
|
|
|
@@ -788,6 +818,8 @@ export class ExternalStoreThreadRuntimeCore
|
|
|
788
818
|
public async startRun(config: StartRunConfig): Promise<void> {
|
|
789
819
|
if (!this._store.onReload)
|
|
790
820
|
throw new Error("Runtime does not support reloading messages.");
|
|
821
|
+
if (this.voice)
|
|
822
|
+
throw new Error("Cannot start a run while a voice session is connected");
|
|
791
823
|
if (this._isVoiceMessage(config.sourceId))
|
|
792
824
|
throw new Error("Voice transcript messages cannot be reloaded");
|
|
793
825
|
|
|
@@ -804,6 +836,8 @@ export class ExternalStoreThreadRuntimeCore
|
|
|
804
836
|
public async resumeRun(config: ResumeRunConfig): Promise<void> {
|
|
805
837
|
if (!this._store.onResume)
|
|
806
838
|
throw new Error("Runtime does not support resuming runs.");
|
|
839
|
+
if (this.voice)
|
|
840
|
+
throw new Error("Cannot start a run while a voice session is connected");
|
|
807
841
|
if (this._isVoiceMessage(config.sourceId))
|
|
808
842
|
throw new Error("Voice transcript messages cannot be reloaded");
|
|
809
843
|
|
|
@@ -898,7 +932,7 @@ export class ExternalStoreThreadRuntimeCore
|
|
|
898
932
|
movedLeaf = { id: trailingUserLeaf.id, draft };
|
|
899
933
|
}
|
|
900
934
|
}
|
|
901
|
-
|
|
935
|
+
this._publishRepositoryMessages();
|
|
902
936
|
|
|
903
937
|
// The resync commits what the cancel left (a kept optimistic message, the
|
|
904
938
|
// restored branch) back to the store a macrotask later. The store may move
|
|
@@ -920,7 +954,8 @@ export class ExternalStoreThreadRuntimeCore
|
|
|
920
954
|
this.composer.retractDraft(movedLeaf.draft);
|
|
921
955
|
}
|
|
922
956
|
}
|
|
923
|
-
this.
|
|
957
|
+
this._publishRepositoryMessages();
|
|
958
|
+
this.updateMessages(this._messages);
|
|
924
959
|
}, 0);
|
|
925
960
|
}
|
|
926
961
|
|
|
@@ -6,6 +6,7 @@ import type {
|
|
|
6
6
|
ChatModelRunResult,
|
|
7
7
|
} from "../../runtime/utils/chat-model-adapter";
|
|
8
8
|
import type { AppendMessage, ToolCallMessagePart } from "../../types/message";
|
|
9
|
+
import type { ThreadHistoryAdapter } from "../../adapters/thread-history";
|
|
9
10
|
import type { LocalRuntimeOptionsBase } from "./local-runtime-options";
|
|
10
11
|
import {
|
|
11
12
|
ExportedMessageRepository,
|
|
@@ -407,6 +408,76 @@ describe("LocalThreadRuntimeCore human-in-the-loop tools", () => {
|
|
|
407
408
|
});
|
|
408
409
|
});
|
|
409
410
|
|
|
411
|
+
describe("LocalThreadRuntimeCore addToolResult content", () => {
|
|
412
|
+
it("stores modelContent and forwards it to the resumed adapter", async () => {
|
|
413
|
+
const { thread, runs } = createApprovalThread(toolCallResult("send_email"));
|
|
414
|
+
|
|
415
|
+
await thread.append(userMessage("send an email"));
|
|
416
|
+
await flush();
|
|
417
|
+
|
|
418
|
+
thread.addToolResult({
|
|
419
|
+
messageId: thread.messages.at(-1)!.id,
|
|
420
|
+
toolCallId: "call-send_email",
|
|
421
|
+
toolName: "send_email",
|
|
422
|
+
result: { approved: true },
|
|
423
|
+
isError: false,
|
|
424
|
+
modelContent: [{ type: "text", text: "Email sent." }],
|
|
425
|
+
});
|
|
426
|
+
await flush();
|
|
427
|
+
|
|
428
|
+
const resumedToolCall = runs[1]!
|
|
429
|
+
.unstable_getMessage()
|
|
430
|
+
.content.find((part) => part.type === "tool-call");
|
|
431
|
+
expect(resumedToolCall?.modelContent).toEqual([
|
|
432
|
+
{ type: "text", text: "Email sent." },
|
|
433
|
+
]);
|
|
434
|
+
|
|
435
|
+
const storedToolCall = thread.messages
|
|
436
|
+
.at(-1)!
|
|
437
|
+
.content.find((part) => part.type === "tool-call");
|
|
438
|
+
expect(storedToolCall?.modelContent).toEqual([
|
|
439
|
+
{ type: "text", text: "Email sent." },
|
|
440
|
+
]);
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
it("keeps a stored artifact when a later result omits it", async () => {
|
|
444
|
+
const { thread } = createApprovalThread(toolCallResult("send_email"));
|
|
445
|
+
|
|
446
|
+
await thread.append(userMessage("send an email"));
|
|
447
|
+
await flush();
|
|
448
|
+
|
|
449
|
+
const messageId = thread.messages.at(-1)!.id;
|
|
450
|
+
thread.addToolResult({
|
|
451
|
+
messageId,
|
|
452
|
+
toolCallId: "call-send_email",
|
|
453
|
+
toolName: "send_email",
|
|
454
|
+
result: { approved: true },
|
|
455
|
+
isError: false,
|
|
456
|
+
artifact: { draftId: "d-1" },
|
|
457
|
+
});
|
|
458
|
+
await flush();
|
|
459
|
+
|
|
460
|
+
thread.addToolResult({
|
|
461
|
+
messageId,
|
|
462
|
+
toolCallId: "call-send_email",
|
|
463
|
+
toolName: "send_email",
|
|
464
|
+
result: { approved: true, sent: true },
|
|
465
|
+
isError: false,
|
|
466
|
+
});
|
|
467
|
+
await flush();
|
|
468
|
+
|
|
469
|
+
const storedToolCall = thread.messages
|
|
470
|
+
.map((message) =>
|
|
471
|
+
message.content.find(
|
|
472
|
+
(part): part is ToolCallMessagePart =>
|
|
473
|
+
part.type === "tool-call" && part.toolCallId === "call-send_email",
|
|
474
|
+
),
|
|
475
|
+
)
|
|
476
|
+
.find((part): part is ToolCallMessagePart => part !== undefined);
|
|
477
|
+
expect(storedToolCall?.artifact).toEqual({ draftId: "d-1" });
|
|
478
|
+
});
|
|
479
|
+
});
|
|
480
|
+
|
|
410
481
|
describe("LocalThreadRuntimeCore state", () => {
|
|
411
482
|
it.each([
|
|
412
483
|
["false", false],
|
|
@@ -856,7 +927,7 @@ describe("LocalThreadRuntimeCore cancellation", () => {
|
|
|
856
927
|
const toolCall = thread.messages
|
|
857
928
|
.find((item) => item.id === messageId)
|
|
858
929
|
?.content.find(
|
|
859
|
-
(part) =>
|
|
930
|
+
(part): part is ToolCallMessagePart =>
|
|
860
931
|
part.type === "tool-call" && part.toolCallId === "call-send_email",
|
|
861
932
|
);
|
|
862
933
|
expect(toolCall?.result).toEqual({ approved: true });
|
|
@@ -864,9 +935,10 @@ describe("LocalThreadRuntimeCore cancellation", () => {
|
|
|
864
935
|
|
|
865
936
|
resolveSecond({ content: [{ type: "text", text: "replacement" }] });
|
|
866
937
|
await vi.waitFor(() => {
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
938
|
+
const message = thread.messages.find((item) => item.id === messageId);
|
|
939
|
+
if (message?.role !== "assistant")
|
|
940
|
+
throw new Error("expected assistant message");
|
|
941
|
+
expect(message.status.type).toBe("complete");
|
|
870
942
|
});
|
|
871
943
|
});
|
|
872
944
|
|
|
@@ -915,16 +987,19 @@ describe("LocalThreadRuntimeCore cancellation", () => {
|
|
|
915
987
|
await appendPromise;
|
|
916
988
|
|
|
917
989
|
const message = thread.messages.find((item) => item.id === messageId);
|
|
918
|
-
|
|
919
|
-
(
|
|
990
|
+
if (message?.role !== "assistant")
|
|
991
|
+
throw new Error("expected assistant message");
|
|
992
|
+
const sendEmail = message.content.find(
|
|
993
|
+
(part): part is ToolCallMessagePart =>
|
|
920
994
|
part.type === "tool-call" && part.toolCallId === "call-send_email",
|
|
921
995
|
);
|
|
922
|
-
const deploy = message
|
|
923
|
-
(part)
|
|
996
|
+
const deploy = message.content.find(
|
|
997
|
+
(part): part is ToolCallMessagePart =>
|
|
998
|
+
part.type === "tool-call" && part.toolCallId === "call-deploy",
|
|
924
999
|
);
|
|
925
1000
|
expect(sendEmail?.result).toEqual({ approved: true });
|
|
926
1001
|
expect(deploy?.approval).toEqual({ id: "approval-1" });
|
|
927
|
-
expect(message
|
|
1002
|
+
expect(message.status.type).toBe("requires-action");
|
|
928
1003
|
});
|
|
929
1004
|
|
|
930
1005
|
it("ignores a superseded result after its message is removed", async () => {
|
|
@@ -1851,7 +1926,7 @@ describe("LocalThreadRuntimeCore runs", () => {
|
|
|
1851
1926
|
],
|
|
1852
1927
|
status: { type: "requires-action", reason: "tool-calls" },
|
|
1853
1928
|
metadata: {
|
|
1854
|
-
steps: [{ usage: {
|
|
1929
|
+
steps: [{ usage: { inputTokens: 10, outputTokens: 5 } }],
|
|
1855
1930
|
},
|
|
1856
1931
|
}));
|
|
1857
1932
|
const thread = createPlainThread({ run }, { maxSteps: 1 });
|
|
@@ -1913,7 +1988,7 @@ describe("LocalThreadRuntimeCore runs", () => {
|
|
|
1913
1988
|
run: async () => ({ content: [] }),
|
|
1914
1989
|
};
|
|
1915
1990
|
const thread = createPlainThread(adapter);
|
|
1916
|
-
const load = vi.fn(async () => ({
|
|
1991
|
+
const load = vi.fn<ThreadHistoryAdapter["load"]>(async () => ({
|
|
1917
1992
|
headId: "restored",
|
|
1918
1993
|
messages: [
|
|
1919
1994
|
{
|
|
@@ -1922,6 +1997,7 @@ describe("LocalThreadRuntimeCore runs", () => {
|
|
|
1922
1997
|
id: "restored",
|
|
1923
1998
|
role: "user" as const,
|
|
1924
1999
|
content: [{ type: "text" as const, text: "hello" }],
|
|
2000
|
+
attachments: [],
|
|
1925
2001
|
createdAt: new Date(0),
|
|
1926
2002
|
metadata: { custom: {} },
|
|
1927
2003
|
},
|
|
@@ -1950,7 +2026,7 @@ describe("LocalThreadRuntimeCore runs", () => {
|
|
|
1950
2026
|
run: async () => ({ content: [] }),
|
|
1951
2027
|
};
|
|
1952
2028
|
const thread = createPlainThread(adapter);
|
|
1953
|
-
const load = vi.fn(async () => ({
|
|
2029
|
+
const load = vi.fn<ThreadHistoryAdapter["load"]>(async () => ({
|
|
1954
2030
|
headId: "restored",
|
|
1955
2031
|
messages: [
|
|
1956
2032
|
{
|
|
@@ -1959,6 +2035,7 @@ describe("LocalThreadRuntimeCore runs", () => {
|
|
|
1959
2035
|
id: "restored",
|
|
1960
2036
|
role: "user" as const,
|
|
1961
2037
|
content: [{ type: "text" as const, text: "hello" }],
|
|
2038
|
+
attachments: [],
|
|
1962
2039
|
createdAt: new Date(0),
|
|
1963
2040
|
metadata: { custom: {} },
|
|
1964
2041
|
},
|
|
@@ -2220,3 +2297,82 @@ describe("LocalThreadRuntimeCore imported approvals", () => {
|
|
|
2220
2297
|
expect(thread.messages.at(-1)?.status?.type).toBe("complete");
|
|
2221
2298
|
});
|
|
2222
2299
|
});
|
|
2300
|
+
|
|
2301
|
+
describe("LocalThreadRuntimeCore message queue", () => {
|
|
2302
|
+
const createQueuedThread = () => {
|
|
2303
|
+
const dispatched: string[] = [];
|
|
2304
|
+
let release!: () => void;
|
|
2305
|
+
let gate = new Promise<void>((resolve) => (release = resolve));
|
|
2306
|
+
|
|
2307
|
+
const core = new LocalRuntimeCore(
|
|
2308
|
+
{
|
|
2309
|
+
adapters: {
|
|
2310
|
+
chatModel: {
|
|
2311
|
+
async run(options) {
|
|
2312
|
+
const last = options.messages.at(-1);
|
|
2313
|
+
const text = last?.content
|
|
2314
|
+
.filter((part) => part.type === "text")
|
|
2315
|
+
.map((part) => (part as { text: string }).text)
|
|
2316
|
+
.join("");
|
|
2317
|
+
dispatched.push(text ?? "");
|
|
2318
|
+
await gate;
|
|
2319
|
+
return { content: [{ type: "text", text: "ok" }] };
|
|
2320
|
+
},
|
|
2321
|
+
},
|
|
2322
|
+
},
|
|
2323
|
+
unstable_enableMessageQueue: true,
|
|
2324
|
+
},
|
|
2325
|
+
undefined,
|
|
2326
|
+
);
|
|
2327
|
+
|
|
2328
|
+
// the in-flight run already awaits the current gate, so the next gate has
|
|
2329
|
+
// to be installed before releasing it or the run dispatched next resolves
|
|
2330
|
+
// against an already-settled promise
|
|
2331
|
+
const releaseRun = async () => {
|
|
2332
|
+
const releaseCurrent = release;
|
|
2333
|
+
gate = new Promise<void>((resolve) => (release = resolve));
|
|
2334
|
+
releaseCurrent();
|
|
2335
|
+
await flush();
|
|
2336
|
+
};
|
|
2337
|
+
|
|
2338
|
+
return {
|
|
2339
|
+
thread: core.threads.getMainThreadRuntimeCore(),
|
|
2340
|
+
dispatched,
|
|
2341
|
+
releaseRun,
|
|
2342
|
+
};
|
|
2343
|
+
};
|
|
2344
|
+
|
|
2345
|
+
it("keeps the steer lane for implicit sends during back-to-back queued runs", async () => {
|
|
2346
|
+
const { thread, dispatched, releaseRun } = createQueuedThread();
|
|
2347
|
+
// the queue lane is only taken for a message appended onto the tail
|
|
2348
|
+
const appendToTail = (text: string, steer?: boolean) =>
|
|
2349
|
+
void thread.append({
|
|
2350
|
+
...userMessage(text),
|
|
2351
|
+
parentId: thread.messages.at(-1)?.id ?? null,
|
|
2352
|
+
...(steer !== undefined && { steer }),
|
|
2353
|
+
});
|
|
2354
|
+
|
|
2355
|
+
appendToTail("first");
|
|
2356
|
+
await flush();
|
|
2357
|
+
expect(dispatched).toEqual(["first"]);
|
|
2358
|
+
|
|
2359
|
+
// buffers behind the running dispatch, so releasing "first" dispatches it
|
|
2360
|
+
appendToTail("second", false);
|
|
2361
|
+
await flush();
|
|
2362
|
+
await releaseRun();
|
|
2363
|
+
expect(dispatched).toEqual(["first", "second"]);
|
|
2364
|
+
|
|
2365
|
+
// "second" is a queue-dispatched run in flight, so an implicit send steers
|
|
2366
|
+
// ahead of a bulk item even though it is appended after it
|
|
2367
|
+
appendToTail("bulk", false);
|
|
2368
|
+
appendToTail("implicit");
|
|
2369
|
+
await flush();
|
|
2370
|
+
await releaseRun();
|
|
2371
|
+
|
|
2372
|
+
expect(dispatched).toEqual(["first", "second", "implicit"]);
|
|
2373
|
+
|
|
2374
|
+
await releaseRun();
|
|
2375
|
+
expect(dispatched).toEqual(["first", "second", "implicit", "bulk"]);
|
|
2376
|
+
await releaseRun();
|
|
2377
|
+
});
|
|
2378
|
+
});
|
|
@@ -114,7 +114,10 @@ export class LocalThreadRuntimeCore
|
|
|
114
114
|
private abortController: AbortController | null = null;
|
|
115
115
|
|
|
116
116
|
private _queue: MessageQueueController | null = null;
|
|
117
|
-
|
|
117
|
+
// Identifies the dispatch in flight, not merely that one is: consecutive
|
|
118
|
+
// queue runs overlap, and the previous dispatch settles after the next one
|
|
119
|
+
// has already started.
|
|
120
|
+
private _queueRunInFlight: object | null = null;
|
|
118
121
|
private _activeRun: { cancelled: boolean } | null = null;
|
|
119
122
|
private _runGeneration = 0;
|
|
120
123
|
|
|
@@ -255,22 +258,29 @@ export class LocalThreadRuntimeCore
|
|
|
255
258
|
run: (message) => {
|
|
256
259
|
// release the queue when the dispatch settles, even if it rejects
|
|
257
260
|
// before reaching startRun's finally, so a failure can't deadlock it
|
|
258
|
-
|
|
261
|
+
const dispatch = {};
|
|
262
|
+
this._queueRunInFlight = dispatch;
|
|
259
263
|
const generation = this._runGeneration;
|
|
260
264
|
// the tail may have moved since the message was enqueued
|
|
261
265
|
void this._runAppend({
|
|
262
266
|
...message,
|
|
263
|
-
parentId: this.
|
|
267
|
+
parentId: this._resolveAppendParent(
|
|
268
|
+
this.messages.at(-1)?.id ?? null,
|
|
269
|
+
),
|
|
264
270
|
})
|
|
265
271
|
.finally(() => {
|
|
266
|
-
this._queueRunInFlight
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
272
|
+
if (this._queueRunInFlight === dispatch) {
|
|
273
|
+
this._queueRunInFlight = null;
|
|
274
|
+
// A dispatch that failed before starting a run settles here;
|
|
275
|
+
// runs that did start release from _runLoop.
|
|
276
|
+
if (this._runGeneration === generation)
|
|
277
|
+
this._queue?.notifyIdle();
|
|
278
|
+
}
|
|
270
279
|
})
|
|
271
280
|
.catch(() => {});
|
|
272
281
|
},
|
|
273
282
|
});
|
|
283
|
+
if (this.voice) this._queue.hold();
|
|
274
284
|
this._queue.subscribe(() => this._notifySubscribers());
|
|
275
285
|
} else if (!canQueue && this._queue) {
|
|
276
286
|
this._queue = null;
|
|
@@ -342,12 +352,20 @@ export class LocalThreadRuntimeCore
|
|
|
342
352
|
}
|
|
343
353
|
|
|
344
354
|
public async append(message: AppendMessage): Promise<void> {
|
|
355
|
+
message = {
|
|
356
|
+
...message,
|
|
357
|
+
parentId: this._resolveAppendParent(message.parentId),
|
|
358
|
+
};
|
|
359
|
+
if (this.voice)
|
|
360
|
+
throw new Error(
|
|
361
|
+
"Cannot send a text message while a voice session is connected",
|
|
362
|
+
);
|
|
345
363
|
if (this._isVoiceMessage(message.sourceId))
|
|
346
364
|
throw new Error("Voice transcript messages cannot be edited");
|
|
347
365
|
const isTail = message.parentId === (this.messages.at(-1)?.id ?? null);
|
|
348
366
|
const willRun = message.startRun ?? message.role === "user";
|
|
349
367
|
if (this._queue && willRun && isTail) {
|
|
350
|
-
if (message.steer ?? this._queueRunInFlight)
|
|
368
|
+
if (message.steer ?? this._queueRunInFlight !== null)
|
|
351
369
|
this._queue.adapter.steer(message);
|
|
352
370
|
else this._queue.adapter.enqueue(message);
|
|
353
371
|
return;
|
|
@@ -361,6 +379,28 @@ export class LocalThreadRuntimeCore
|
|
|
361
379
|
return this._runAppend(message);
|
|
362
380
|
}
|
|
363
381
|
|
|
382
|
+
protected override _commitVoiceMessage(message: ThreadMessage): void {
|
|
383
|
+
const parentId = this.repository.headId;
|
|
384
|
+
this.repository.addOrUpdateMessage(parentId, message);
|
|
385
|
+
this.repository.resetHead(message.id);
|
|
386
|
+
void this._options.adapters.history
|
|
387
|
+
?.append({ parentId, message })
|
|
388
|
+
.catch(() => {});
|
|
389
|
+
const index = this._voiceMessages.findIndex(
|
|
390
|
+
(voiceMessage) => voiceMessage.id === message.id,
|
|
391
|
+
);
|
|
392
|
+
if (index !== -1) this._voiceMessages.splice(index, 1);
|
|
393
|
+
this._markVoiceMessagesDirty();
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
protected override _onVoiceConnected(): void {
|
|
397
|
+
this._queue?.hold();
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
protected override _onVoiceDisconnected(): void {
|
|
401
|
+
this._queue?.release();
|
|
402
|
+
}
|
|
403
|
+
|
|
364
404
|
public getQueueItems(): readonly QueueItemState[] {
|
|
365
405
|
// Reads can arrive during base-thread construction, before the queue field
|
|
366
406
|
// is assigned, so guard against the unset field.
|
|
@@ -388,7 +428,22 @@ export class LocalThreadRuntimeCore
|
|
|
388
428
|
this._notifySubscribers();
|
|
389
429
|
}
|
|
390
430
|
|
|
431
|
+
private _pendingAppends = 0;
|
|
432
|
+
|
|
433
|
+
protected override _isRunActive(): boolean {
|
|
434
|
+
return this._pendingAppends > 0 || super._isRunActive();
|
|
435
|
+
}
|
|
436
|
+
|
|
391
437
|
private async _runAppend(rawMessage: AppendMessage): Promise<void> {
|
|
438
|
+
this._pendingAppends += 1;
|
|
439
|
+
try {
|
|
440
|
+
await this._runAppendInner(rawMessage);
|
|
441
|
+
} finally {
|
|
442
|
+
this._pendingAppends -= 1;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
private async _runAppendInner(rawMessage: AppendMessage): Promise<void> {
|
|
392
447
|
// Stamped here rather than in `append` so a queued message is gated after
|
|
393
448
|
// the flush re-pointed its parentId at the current tail.
|
|
394
449
|
const generation = captureThreadRuntimeGeneration(this);
|
|
@@ -494,6 +549,8 @@ export class LocalThreadRuntimeCore
|
|
|
494
549
|
runCallback?: ChatModelAdapter["run"],
|
|
495
550
|
): Promise<void> {
|
|
496
551
|
this.ensureInitialized();
|
|
552
|
+
if (this.voice)
|
|
553
|
+
throw new Error("Cannot start a run while a voice session is connected");
|
|
497
554
|
if (this._isVoiceMessage(sourceId))
|
|
498
555
|
throw new Error("Voice transcript messages cannot be reloaded");
|
|
499
556
|
|
|
@@ -523,6 +580,8 @@ export class LocalThreadRuntimeCore
|
|
|
523
580
|
runConfig: RunConfig | undefined,
|
|
524
581
|
runCallback?: ChatModelAdapter["run"],
|
|
525
582
|
): Promise<void> {
|
|
583
|
+
if (this.voice)
|
|
584
|
+
throw new Error("Cannot start a run while a voice session is connected");
|
|
526
585
|
this._notifyEventSubscribers("runStart", {});
|
|
527
586
|
|
|
528
587
|
// A run entered on a requires-action message resumes a pause an
|
|
@@ -849,7 +908,12 @@ export class LocalThreadRuntimeCore
|
|
|
849
908
|
result,
|
|
850
909
|
isError,
|
|
851
910
|
artifact,
|
|
911
|
+
modelContent,
|
|
852
912
|
}: AddToolResultOptions) {
|
|
913
|
+
if (this.voice)
|
|
914
|
+
throw new Error(
|
|
915
|
+
"Cannot add a tool result while a voice session is connected",
|
|
916
|
+
);
|
|
853
917
|
const messageData = this.repository.getMessage(messageId);
|
|
854
918
|
const { parentId } = messageData;
|
|
855
919
|
let { message } = messageData;
|
|
@@ -864,11 +928,14 @@ export class LocalThreadRuntimeCore
|
|
|
864
928
|
if (c.toolCallId !== toolCallId) return c;
|
|
865
929
|
found = true;
|
|
866
930
|
if (c.result === undefined) added = true;
|
|
931
|
+
// artifact and modelContent are optional; only override when supplied so
|
|
932
|
+
// a later result that omits them does not clobber a stored value.
|
|
867
933
|
return {
|
|
868
934
|
...c,
|
|
869
935
|
result,
|
|
870
|
-
artifact,
|
|
871
936
|
isError,
|
|
937
|
+
...(artifact !== undefined && { artifact }),
|
|
938
|
+
...(modelContent !== undefined && { modelContent }),
|
|
872
939
|
};
|
|
873
940
|
});
|
|
874
941
|
|
|
@@ -907,6 +974,10 @@ export class LocalThreadRuntimeCore
|
|
|
907
974
|
text,
|
|
908
975
|
reason,
|
|
909
976
|
}: RespondToToolApprovalOptions): Promise<void> {
|
|
977
|
+
if (this.voice)
|
|
978
|
+
throw new Error(
|
|
979
|
+
"Cannot respond to a tool approval while a voice session is connected",
|
|
980
|
+
);
|
|
910
981
|
let message = this.repository
|
|
911
982
|
.getMessages()
|
|
912
983
|
.findLast(
|
|
@@ -142,8 +142,13 @@ type MessageClientProps = {
|
|
|
142
142
|
onAddToolResult?: ((options: AddToolResultOptions) => void) | undefined;
|
|
143
143
|
onResumeToolCall?: ((options: ResumeToolCallOptions) => void) | undefined;
|
|
144
144
|
attachmentAdapter?: AttachmentAdapter | undefined;
|
|
145
|
-
submittedFeedback:
|
|
146
|
-
|
|
145
|
+
submittedFeedback:
|
|
146
|
+
| { type: "positive" | "negative"; comment?: string }
|
|
147
|
+
| undefined;
|
|
148
|
+
onSubmitFeedback: (feedback: {
|
|
149
|
+
type: "positive" | "negative";
|
|
150
|
+
comment?: string;
|
|
151
|
+
}) => void;
|
|
147
152
|
speech: SpeechState | undefined;
|
|
148
153
|
onSpeak: () => void;
|
|
149
154
|
onStopSpeaking: () => void;
|
|
@@ -236,7 +241,7 @@ const useMessageClient = ({
|
|
|
236
241
|
...message,
|
|
237
242
|
metadata: {
|
|
238
243
|
...message.metadata,
|
|
239
|
-
submittedFeedback
|
|
244
|
+
submittedFeedback,
|
|
240
245
|
},
|
|
241
246
|
}
|
|
242
247
|
: message;
|
|
@@ -931,16 +936,24 @@ const useExternalThread = ({
|
|
|
931
936
|
Record<
|
|
932
937
|
string,
|
|
933
938
|
{
|
|
934
|
-
type: "positive" | "negative";
|
|
935
|
-
external:
|
|
939
|
+
feedback: { type: "positive" | "negative"; comment?: string };
|
|
940
|
+
external:
|
|
941
|
+
| {
|
|
942
|
+
readonly type: "positive" | "negative";
|
|
943
|
+
readonly comment?: string;
|
|
944
|
+
}
|
|
945
|
+
| undefined;
|
|
936
946
|
}
|
|
937
947
|
>
|
|
938
948
|
>({});
|
|
939
949
|
|
|
940
950
|
const feedbackFor = (msg: ExternalThreadMessage) => {
|
|
941
951
|
const entry = submittedFeedback[msg.id];
|
|
942
|
-
|
|
943
|
-
|
|
952
|
+
const external = msg.metadata.submittedFeedback;
|
|
953
|
+
return entry &&
|
|
954
|
+
external?.type === entry.external?.type &&
|
|
955
|
+
external?.comment === entry.external?.comment
|
|
956
|
+
? entry.feedback
|
|
944
957
|
: undefined;
|
|
945
958
|
};
|
|
946
959
|
|
|
@@ -952,7 +965,11 @@ const useExternalThread = ({
|
|
|
952
965
|
setSubmittedFeedback((prev) => {
|
|
953
966
|
const live = Object.entries(prev).filter(([id, entry]) => {
|
|
954
967
|
const msg = messages.find((m) => m.id === id);
|
|
955
|
-
return
|
|
968
|
+
return (
|
|
969
|
+
!!msg &&
|
|
970
|
+
msg.metadata.submittedFeedback?.type === entry.external?.type &&
|
|
971
|
+
msg.metadata.submittedFeedback?.comment === entry.external?.comment
|
|
972
|
+
);
|
|
956
973
|
});
|
|
957
974
|
return live.length === Object.keys(prev).length
|
|
958
975
|
? prev
|
|
@@ -962,17 +979,21 @@ const useExternalThread = ({
|
|
|
962
979
|
|
|
963
980
|
const handleSubmitFeedback = (
|
|
964
981
|
message: ExternalThreadMessage,
|
|
965
|
-
|
|
982
|
+
feedback: { type: "positive" | "negative"; comment?: string },
|
|
966
983
|
) => {
|
|
967
|
-
|
|
968
|
-
|
|
984
|
+
const comment = feedback.comment?.trim();
|
|
985
|
+
const submittedFeedback = {
|
|
986
|
+
type: feedback.type,
|
|
987
|
+
...(comment ? { comment } : undefined),
|
|
988
|
+
};
|
|
989
|
+
feedbackAdapter?.submit({ message, ...submittedFeedback });
|
|
969
990
|
|
|
970
991
|
if (message.role === "assistant") {
|
|
971
992
|
setSubmittedFeedback((prev) => ({
|
|
972
993
|
...prev,
|
|
973
994
|
[message.id]: {
|
|
974
|
-
|
|
975
|
-
external: message.metadata.submittedFeedback
|
|
995
|
+
feedback: submittedFeedback,
|
|
996
|
+
external: message.metadata.submittedFeedback,
|
|
976
997
|
},
|
|
977
998
|
}));
|
|
978
999
|
}
|
|
@@ -61,6 +61,14 @@ describe("primitive predicates", () => {
|
|
|
61
61
|
state({ thread, message: { role: "assistant" } }),
|
|
62
62
|
),
|
|
63
63
|
).toBe(false);
|
|
64
|
+
expect(
|
|
65
|
+
actionBarReloadDisabled(
|
|
66
|
+
state({
|
|
67
|
+
thread: { ...thread, voice: {} },
|
|
68
|
+
message: { role: "assistant" },
|
|
69
|
+
}),
|
|
70
|
+
),
|
|
71
|
+
).toBe(true);
|
|
64
72
|
expect(
|
|
65
73
|
actionBarReloadDisabled(state({ thread, message: { role: "user" } })),
|
|
66
74
|
).toBe(true);
|
|
@@ -202,6 +210,14 @@ describe("primitive predicates", () => {
|
|
|
202
210
|
state({ ...editable, composer: { isEditing: false } }),
|
|
203
211
|
),
|
|
204
212
|
).toBe(false);
|
|
213
|
+
expect(
|
|
214
|
+
actionBarEditDisabled(
|
|
215
|
+
state({
|
|
216
|
+
optional: { thread: { capabilities: { edit: true }, voice: {} } },
|
|
217
|
+
composer: { isEditing: false },
|
|
218
|
+
}),
|
|
219
|
+
),
|
|
220
|
+
).toBe(true);
|
|
205
221
|
expect(
|
|
206
222
|
actionBarEditDisabled(
|
|
207
223
|
state({ ...editable, composer: { isEditing: true } }),
|