@assistant-ui/core 0.2.20 → 0.2.21
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 +2 -2
- package/dist/adapters/attachment.d.ts.map +1 -1
- package/dist/adapters/attachment.js +14 -7
- package/dist/adapters/attachment.js.map +1 -1
- package/dist/adapters/directive-formatter.d.ts +0 -1
- package/dist/adapters/directive-formatter.d.ts.map +1 -1
- package/dist/adapters/feedback.d.ts +0 -1
- package/dist/adapters/feedback.d.ts.map +1 -1
- package/dist/adapters/index.d.ts +2 -2
- package/dist/adapters/index.js +2 -1
- package/dist/adapters/speech.d.ts +0 -1
- package/dist/adapters/speech.d.ts.map +1 -1
- package/dist/adapters/suggestion.d.ts +16 -2
- package/dist/adapters/suggestion.d.ts.map +1 -1
- package/dist/adapters/suggestion.js +36 -0
- package/dist/adapters/suggestion.js.map +1 -0
- package/dist/adapters/thread-history.d.ts +2 -2
- package/dist/adapters/thread-history.d.ts.map +1 -1
- package/dist/adapters/trigger.d.ts +5 -3
- package/dist/adapters/trigger.d.ts.map +1 -1
- package/dist/adapters/voice.d.ts +0 -1
- package/dist/adapters/voice.d.ts.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/duplicate-detection.d.ts.map +1 -1
- package/dist/internal.d.ts +7 -1
- package/dist/internal.js +6 -2
- package/dist/model-context/frame/host.d.ts +0 -1
- package/dist/model-context/frame/host.d.ts.map +1 -1
- package/dist/model-context/frame/provider.d.ts +0 -1
- package/dist/model-context/frame/provider.d.ts.map +1 -1
- package/dist/model-context/frame/types.d.ts.map +1 -1
- package/dist/model-context/interactable-composer-metadata.d.ts +4 -2
- package/dist/model-context/interactable-composer-metadata.d.ts.map +1 -1
- package/dist/model-context/registry-handles.d.ts +0 -1
- package/dist/model-context/registry-handles.d.ts.map +1 -1
- package/dist/model-context/registry.d.ts +0 -1
- package/dist/model-context/registry.d.ts.map +1 -1
- package/dist/model-context/tool.d.ts +23 -9
- package/dist/model-context/tool.d.ts.map +1 -1
- package/dist/model-context/tool.js +0 -25
- package/dist/model-context/tool.js.map +1 -1
- package/dist/model-context/types.d.ts +0 -1
- package/dist/model-context/types.d.ts.map +1 -1
- package/dist/react/AssistantProvider.d.ts +0 -1
- package/dist/react/AssistantProvider.d.ts.map +1 -1
- package/dist/react/AssistantRuntimeProvider.d.ts +1 -6
- package/dist/react/AssistantRuntimeProvider.d.ts.map +1 -1
- package/dist/react/RuntimeAdapter.d.ts +1 -0
- package/dist/react/RuntimeAdapter.d.ts.map +1 -1
- package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts +13 -2
- package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
- package/dist/react/adapters/LocalStorageThreadListAdapter.js +122 -7
- package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
- package/dist/react/adapters/TitleGenerationAdapter.d.ts +0 -1
- package/dist/react/adapters/TitleGenerationAdapter.d.ts.map +1 -1
- package/dist/react/client/DataRenderers.d.ts +0 -1
- package/dist/react/client/DataRenderers.d.ts.map +1 -1
- package/dist/react/client/Interactables.d.ts +0 -1
- package/dist/react/client/Interactables.d.ts.map +1 -1
- package/dist/react/client/Tools.d.ts +3 -2
- package/dist/react/client/Tools.d.ts.map +1 -1
- package/dist/react/client/interactable-model-context.d.ts +0 -1
- package/dist/react/client/interactable-model-context.d.ts.map +1 -1
- package/dist/react/index.d.ts +2 -2
- package/dist/react/interactables-legacy/Interactables.d.ts +0 -1
- package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
- package/dist/react/interactables-legacy/interactable-model-context.d.ts +0 -1
- package/dist/react/interactables-legacy/interactable-model-context.d.ts.map +1 -1
- package/dist/react/interactables-legacy/scopes.d.ts +4 -2
- package/dist/react/interactables-legacy/scopes.d.ts.map +1 -1
- package/dist/react/interactables-legacy/useAssistantInteractable.d.ts +0 -1
- package/dist/react/interactables-legacy/useAssistantInteractable.d.ts.map +1 -1
- package/dist/react/interactables-legacy/useInteractableState.d.ts.map +1 -1
- package/dist/react/model-context/define-mcp-toolkit.d.ts +19 -4
- package/dist/react/model-context/define-mcp-toolkit.d.ts.map +1 -1
- package/dist/react/model-context/define-mcp-toolkit.js +17 -5
- package/dist/react/model-context/define-mcp-toolkit.js.map +1 -1
- package/dist/react/model-context/define-toolkit.d.ts +1 -2
- package/dist/react/model-context/define-toolkit.d.ts.map +1 -1
- package/dist/react/model-context/external-tool.d.ts.map +1 -1
- package/dist/react/model-context/human-tool.d.ts.map +1 -1
- package/dist/react/model-context/interactableTool.d.ts +2 -2
- package/dist/react/model-context/interactableTool.d.ts.map +1 -1
- package/dist/react/model-context/makeAssistantDataUI.d.ts +2 -2
- package/dist/react/model-context/makeAssistantDataUI.d.ts.map +1 -1
- package/dist/react/model-context/makeAssistantTool.d.ts +2 -2
- package/dist/react/model-context/makeAssistantTool.d.ts.map +1 -1
- package/dist/react/model-context/makeAssistantToolUI.d.ts +2 -2
- package/dist/react/model-context/makeAssistantToolUI.d.ts.map +1 -1
- package/dist/react/model-context/provider-tool.d.ts +0 -1
- package/dist/react/model-context/provider-tool.d.ts.map +1 -1
- package/dist/react/model-context/stub-tool.d.ts.map +1 -1
- package/dist/react/model-context/toolbox.d.ts +5 -5
- package/dist/react/model-context/toolbox.d.ts.map +1 -1
- package/dist/react/model-context/useAssistantContext.d.ts +1 -0
- package/dist/react/model-context/useAssistantContext.d.ts.map +1 -1
- package/dist/react/model-context/useAssistantDataUI.d.ts +3 -2
- package/dist/react/model-context/useAssistantDataUI.d.ts.map +1 -1
- package/dist/react/model-context/useAssistantInstructions.d.ts +1 -0
- package/dist/react/model-context/useAssistantInstructions.d.ts.map +1 -1
- package/dist/react/model-context/useAssistantTool.d.ts +4 -2
- package/dist/react/model-context/useAssistantTool.d.ts.map +1 -1
- package/dist/react/model-context/useAssistantToolUI.d.ts +3 -2
- package/dist/react/model-context/useAssistantToolUI.d.ts.map +1 -1
- package/dist/react/model-context/useAuiToolOverrides.d.ts +0 -1
- package/dist/react/model-context/useAuiToolOverrides.d.ts.map +1 -1
- package/dist/react/model-context/useInlineRender.d.ts +0 -1
- package/dist/react/model-context/useInlineRender.d.ts.map +1 -1
- package/dist/react/model-context/useInteractable.d.ts +7 -4
- package/dist/react/model-context/useInteractable.d.ts.map +1 -1
- package/dist/react/model-context/useInteractableState.d.ts.map +1 -1
- package/dist/react/model-context/useInteractableVersions.d.ts +0 -1
- package/dist/react/model-context/useInteractableVersions.d.ts.map +1 -1
- package/dist/react/model-context/useToolArgsStatus.d.ts +3 -1
- package/dist/react/model-context/useToolArgsStatus.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useActionBarCopy.d.ts +1 -4
- package/dist/react/primitive-hooks/useActionBarCopy.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useActionBarEdit.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useActionBarFeedback.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useActionBarReload.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useActionBarSpeak.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useActionBarStopSpeaking.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useBranchPickerNext.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useComposerAddAttachment.d.ts +0 -1
- package/dist/react/primitive-hooks/useComposerAddAttachment.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useComposerCancel.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useComposerDictate.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useComposerSend.d.ts +0 -1
- package/dist/react/primitive-hooks/useComposerSend.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useEditComposerCancel.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useEditComposerSend.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useMessageBranching.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useMessageError.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useMessageError.js +5 -1
- package/dist/react/primitive-hooks/useMessageError.js.map +1 -1
- package/dist/react/primitive-hooks/useMessageReload.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts +1 -5
- package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadIsRunning.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadListItemArchive.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadListItemDelete.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadListItemTrigger.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadListItemUnarchive.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadListLoadMore.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadListNew.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadMessageIds.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadMessages.d.ts +0 -1
- package/dist/react/primitive-hooks/useThreadMessages.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useVoice.d.ts +0 -1
- package/dist/react/primitive-hooks/useVoice.d.ts.map +1 -1
- package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts +7 -4
- package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts.map +1 -1
- package/dist/react/primitives/composer/ComposerAttachments.d.ts +4 -3
- package/dist/react/primitives/composer/ComposerAttachments.d.ts.map +1 -1
- package/dist/react/primitives/composer/ComposerIf.d.ts +4 -3
- package/dist/react/primitives/composer/ComposerIf.d.ts.map +1 -1
- package/dist/react/primitives/composer/ComposerQueue.d.ts +2 -2
- package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
- package/dist/react/primitives/generativeUI/GenerativeUI.d.ts +2 -2
- package/dist/react/primitives/generativeUI/GenerativeUI.d.ts.map +1 -1
- package/dist/react/primitives/message/MessageAttachments.d.ts +4 -3
- package/dist/react/primitives/message/MessageAttachments.d.ts.map +1 -1
- package/dist/react/primitives/message/MessageGroupedParts.d.ts +1 -6
- package/dist/react/primitives/message/MessageGroupedParts.d.ts.map +1 -1
- package/dist/react/primitives/message/MessageParts.d.ts +42 -24
- package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
- package/dist/react/primitives/message/MessageParts.js +2 -1
- package/dist/react/primitives/message/MessageParts.js.map +1 -1
- package/dist/react/primitives/message/MessageQuote.d.ts +2 -2
- package/dist/react/primitives/message/MessageQuote.d.ts.map +1 -1
- package/dist/react/primitives/messagePart/MessagePartInProgress.d.ts +0 -1
- package/dist/react/primitives/messagePart/MessagePartInProgress.d.ts.map +1 -1
- package/dist/react/primitives/part/PartMessages.d.ts +2 -2
- package/dist/react/primitives/part/PartMessages.d.ts.map +1 -1
- package/dist/react/primitives/thread/ThreadMessages.d.ts +35 -17
- package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
- package/dist/react/primitives/thread/ThreadSuggestions.d.ts +6 -4
- package/dist/react/primitives/thread/ThreadSuggestions.d.ts.map +1 -1
- package/dist/react/primitives/threadList/ThreadListItems.d.ts +4 -3
- package/dist/react/primitives/threadList/ThreadListItems.d.ts.map +1 -1
- package/dist/react/primitives/threadListItem/ThreadListItemTitle.d.ts +0 -1
- package/dist/react/primitives/threadListItem/ThreadListItemTitle.d.ts.map +1 -1
- package/dist/react/providers/AttachmentByIndexProvider.d.ts +0 -1
- package/dist/react/providers/AttachmentByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts +0 -1
- package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts.map +1 -1
- package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts +0 -1
- package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/MessageByIdProvider.d.ts +0 -1
- package/dist/react/providers/MessageByIdProvider.d.ts.map +1 -1
- package/dist/react/providers/MessageByIndexProvider.d.ts +0 -1
- package/dist/react/providers/MessageByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/PartByIndexProvider.d.ts +0 -1
- package/dist/react/providers/PartByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/QueueItemByIndexProvider.d.ts +0 -1
- package/dist/react/providers/QueueItemByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/ReadonlyThreadProvider.d.ts +0 -1
- package/dist/react/providers/ReadonlyThreadProvider.d.ts.map +1 -1
- package/dist/react/providers/SuggestionByIndexProvider.d.ts +0 -1
- package/dist/react/providers/SuggestionByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/TextMessagePartProvider.d.ts +0 -1
- package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
- package/dist/react/providers/ThreadListItemByIndexProvider.d.ts +0 -1
- package/dist/react/providers/ThreadListItemByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/ThreadListItemRuntimeProvider.d.ts +1 -1
- package/dist/react/providers/ThreadListItemRuntimeProvider.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +2 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +1 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +3 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +21 -19
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
- package/dist/react/runtimes/RuntimeAdapterProvider.d.ts +0 -1
- package/dist/react/runtimes/RuntimeAdapterProvider.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +0 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +1 -4
- package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +6 -3
- package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
- package/dist/react/runtimes/cloud/auiV0.d.ts +12 -2
- package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/auiV0.js +30 -1
- package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts +0 -1
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/createMessageConverter.d.ts +1 -7
- package/dist/react/runtimes/createMessageConverter.d.ts.map +1 -1
- package/dist/react/runtimes/createRuntimeExtras.d.ts +0 -1
- package/dist/react/runtimes/createRuntimeExtras.d.ts.map +1 -1
- package/dist/react/runtimes/external-message-converter.d.ts +1 -8
- package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
- package/dist/react/runtimes/external-message-converter.js +42 -44
- package/dist/react/runtimes/external-message-converter.js.map +1 -1
- package/dist/react/runtimes/useExternalStoreRuntime.d.ts +0 -1
- package/dist/react/runtimes/useExternalStoreRuntime.d.ts.map +1 -1
- package/dist/react/runtimes/useExternalStoreSharedOptions.d.ts +0 -1
- package/dist/react/runtimes/useExternalStoreSharedOptions.d.ts.map +1 -1
- package/dist/react/runtimes/useLocalRuntime.d.ts +2 -5
- package/dist/react/runtimes/useLocalRuntime.d.ts.map +1 -1
- package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts +0 -1
- package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
- package/dist/react/runtimes/useStreamingTiming.d.ts +0 -1
- package/dist/react/runtimes/useStreamingTiming.d.ts.map +1 -1
- package/dist/react/types/MessagePartComponentTypes.d.ts +6 -3
- package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
- package/dist/react/types/scopes/dataRenderers.d.ts +1 -1
- package/dist/react/types/scopes/dataRenderers.d.ts.map +1 -1
- package/dist/react/types/scopes/interactables.d.ts +4 -2
- package/dist/react/types/scopes/interactables.d.ts.map +1 -1
- package/dist/react/types/scopes/tools.d.ts +5 -3
- package/dist/react/types/scopes/tools.d.ts.map +1 -1
- package/dist/react/types/store-augmentation.d.ts +1 -2
- package/dist/react/types/store-augmentation.d.ts.map +1 -1
- package/dist/react/utils/getMessageQuote.d.ts +0 -1
- package/dist/react/utils/getMessageQuote.d.ts.map +1 -1
- package/dist/react/utils/groupParts.d.ts +2 -2
- package/dist/react/utils/groupParts.d.ts.map +1 -1
- package/dist/react/utils/useJSONEqual.d.ts.map +1 -1
- package/dist/runtime/api/assistant-runtime.d.ts +0 -1
- package/dist/runtime/api/assistant-runtime.d.ts.map +1 -1
- package/dist/runtime/api/attachment-runtime.d.ts +0 -1
- package/dist/runtime/api/attachment-runtime.d.ts.map +1 -1
- package/dist/runtime/api/bindings.d.ts +0 -1
- package/dist/runtime/api/bindings.d.ts.map +1 -1
- package/dist/runtime/api/composer-runtime.d.ts +6 -4
- package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
- package/dist/runtime/api/message-part-runtime.d.ts +0 -1
- package/dist/runtime/api/message-part-runtime.d.ts.map +1 -1
- package/dist/runtime/api/message-runtime.d.ts +6 -16
- package/dist/runtime/api/message-runtime.d.ts.map +1 -1
- package/dist/runtime/api/message-runtime.js +1 -1
- package/dist/runtime/api/paths.d.ts.map +1 -1
- package/dist/runtime/api/thread-list-item-runtime.d.ts +0 -1
- package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
- package/dist/runtime/api/thread-list-runtime.d.ts +0 -1
- package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
- package/dist/runtime/api/thread-runtime.d.ts +3 -1
- package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
- package/dist/runtime/base/base-assistant-runtime-core.d.ts +0 -1
- package/dist/runtime/base/base-assistant-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/base-composer-runtime-core.d.ts +0 -1
- package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/base-composer-runtime-core.js +17 -3
- package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
- package/dist/runtime/base/base-thread-runtime-core.d.ts +2 -4
- package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/base-thread-runtime-core.js +1 -1
- package/dist/runtime/base/default-edit-composer-runtime-core.d.ts +1 -5
- package/dist/runtime/base/default-edit-composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +1 -0
- package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/branch/external-thread-branch-adapter.d.ts.map +1 -1
- package/dist/runtime/interfaces/assistant-runtime-core.d.ts +0 -1
- package/dist/runtime/interfaces/assistant-runtime-core.d.ts.map +1 -1
- package/dist/runtime/interfaces/composer-runtime-core.d.ts +2 -2
- package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +0 -1
- package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
- package/dist/runtime/interfaces/thread-runtime-core.d.ts +2 -2
- package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
- package/dist/runtime/queue/external-thread-queue-adapter.d.ts +0 -1
- package/dist/runtime/queue/external-thread-queue-adapter.d.ts.map +1 -1
- package/dist/runtime/queue/message-queue.d.ts +6 -4
- package/dist/runtime/queue/message-queue.d.ts.map +1 -1
- package/dist/runtime/queue/message-queue.js +1 -1
- package/dist/runtime/utils/auto-status.d.ts +0 -1
- package/dist/runtime/utils/auto-status.d.ts.map +1 -1
- package/dist/runtime/utils/chat-model-adapter.d.ts +0 -1
- package/dist/runtime/utils/chat-model-adapter.d.ts.map +1 -1
- package/dist/runtime/utils/external-store-message.d.ts +0 -1
- package/dist/runtime/utils/external-store-message.d.ts.map +1 -1
- package/dist/runtime/utils/message-repository.d.ts +1 -5
- package/dist/runtime/utils/message-repository.d.ts.map +1 -1
- package/dist/runtime/utils/message-repository.js +3 -1
- package/dist/runtime/utils/message-repository.js.map +1 -1
- package/dist/runtime/utils/resolveToolApprovalResponse.d.ts +0 -1
- package/dist/runtime/utils/resolveToolApprovalResponse.d.ts.map +1 -1
- package/dist/runtime/utils/streaming-timing.d.ts +5 -3
- package/dist/runtime/utils/streaming-timing.d.ts.map +1 -1
- package/dist/runtime/utils/thread-message-like.d.ts +2 -2
- 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/runtimes/assistant-transport/utils.d.ts.map +1 -1
- package/dist/runtimes/external-store/external-store-adapter.d.ts +2 -2
- package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
- package/dist/runtimes/external-store/external-store-runtime-core.d.ts +0 -1
- 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 +0 -1
- 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 +0 -1
- 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 +2 -0
- 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 +1 -1
- package/dist/runtimes/external-store/thread-message-converter.d.ts +0 -1
- package/dist/runtimes/external-store/thread-message-converter.d.ts.map +1 -1
- package/dist/runtimes/local/local-runtime-core.d.ts +0 -1
- package/dist/runtimes/local/local-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/local/local-runtime-options.d.ts +0 -1
- package/dist/runtimes/local/local-runtime-options.d.ts.map +1 -1
- package/dist/runtimes/local/local-thread-list-runtime-core.d.ts +0 -1
- package/dist/runtimes/local/local-thread-list-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/local/local-thread-runtime-core.d.ts +5 -21
- package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/local/local-thread-runtime-core.js +24 -15
- package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
- package/dist/runtimes/local/should-continue.d.ts +0 -1
- package/dist/runtimes/local/should-continue.d.ts.map +1 -1
- package/dist/runtimes/local/should-continue.js +2 -2
- package/dist/runtimes/local/should-continue.js.map +1 -1
- package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +0 -1
- 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/in-memory.js +5 -3
- package/dist/runtimes/remote-thread-list/adapter/in-memory.js.map +1 -1
- package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts +0 -1
- package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/optimistic-state.d.ts +6 -4
- package/dist/runtimes/remote-thread-list/optimistic-state.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +0 -1
- package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/types.d.ts +0 -1
- package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
- package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +2 -2
- package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
- package/dist/store/clients/chain-of-thought-client.d.ts +0 -1
- package/dist/store/clients/chain-of-thought-client.d.ts.map +1 -1
- package/dist/store/clients/model-context-client.d.ts +0 -1
- package/dist/store/clients/model-context-client.d.ts.map +1 -1
- package/dist/store/clients/no-op-composer-client.d.ts +0 -1
- package/dist/store/clients/no-op-composer-client.d.ts.map +1 -1
- package/dist/store/clients/runtime-adapter.d.ts +0 -1
- package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
- package/dist/store/clients/suggestions.d.ts +0 -1
- package/dist/store/clients/suggestions.d.ts.map +1 -1
- package/dist/store/clients/thread-message-client.d.ts +0 -1
- package/dist/store/clients/thread-message-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/attachment-runtime-client.d.ts +0 -1
- package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/composer-runtime-client.d.ts +0 -1
- package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/liveRef.d.ts.map +1 -1
- package/dist/store/runtime-clients/message-part-runtime-client.d.ts +0 -1
- package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/message-runtime-client.d.ts +0 -1
- 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 +0 -1
- 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 +0 -1
- package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/thread-runtime-client.d.ts +0 -1
- package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/useSubscribable.d.ts +0 -1
- package/dist/store/runtime-clients/useSubscribable.d.ts.map +1 -1
- package/dist/store/scope-registration.d.ts +1 -2
- package/dist/store/scope-registration.d.ts.map +1 -1
- package/dist/store/scopes/attachment.d.ts +0 -1
- package/dist/store/scopes/attachment.d.ts.map +1 -1
- package/dist/store/scopes/chain-of-thought.d.ts +0 -1
- package/dist/store/scopes/chain-of-thought.d.ts.map +1 -1
- package/dist/store/scopes/composer.d.ts +0 -1
- package/dist/store/scopes/composer.d.ts.map +1 -1
- package/dist/store/scopes/message.d.ts +6 -4
- package/dist/store/scopes/message.d.ts.map +1 -1
- package/dist/store/scopes/model-context.d.ts +0 -1
- package/dist/store/scopes/model-context.d.ts.map +1 -1
- package/dist/store/scopes/part.d.ts +0 -1
- package/dist/store/scopes/part.d.ts.map +1 -1
- package/dist/store/scopes/queue-item.d.ts.map +1 -1
- package/dist/store/scopes/suggestion.d.ts.map +1 -1
- package/dist/store/scopes/suggestions.d.ts +0 -1
- package/dist/store/scopes/suggestions.d.ts.map +1 -1
- package/dist/store/scopes/thread-list-item.d.ts +0 -1
- package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
- package/dist/store/scopes/thread.d.ts +4 -3
- package/dist/store/scopes/thread.d.ts.map +1 -1
- package/dist/store/scopes/threads.d.ts +0 -1
- package/dist/store/scopes/threads.d.ts.map +1 -1
- package/dist/subscribable/subscribable.d.ts +0 -1
- package/dist/subscribable/subscribable.d.ts.map +1 -1
- package/dist/tests/remote-thread-list-test-helpers.d.ts +0 -1
- package/dist/tests/remote-thread-list-test-helpers.d.ts.map +1 -1
- package/dist/types/attachment.d.ts +1 -1
- package/dist/types/attachment.d.ts.map +1 -1
- package/dist/types/directive.d.ts +3 -2
- package/dist/types/directive.d.ts.map +1 -1
- package/dist/types/error.d.ts +15 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +46 -0
- package/dist/types/error.js.map +1 -0
- package/dist/types/index.d.ts +2 -2
- package/dist/types/message.d.ts +70 -33
- package/dist/types/message.d.ts.map +1 -1
- package/dist/types/message.js.map +1 -1
- package/dist/types/quote.d.ts.map +1 -1
- package/dist/types/trigger.d.ts +0 -1
- package/dist/types/trigger.d.ts.map +1 -1
- package/dist/types/unsubscribe.d.ts.map +1 -1
- package/dist/utils/composite-context-provider.d.ts +1 -0
- package/dist/utils/composite-context-provider.d.ts.map +1 -1
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/json/is-json-equal.d.ts.map +1 -1
- package/dist/utils/json/is-json.d.ts +0 -1
- package/dist/utils/json/is-json.d.ts.map +1 -1
- package/dist/utils/json/is-json.js +1 -1
- package/dist/utils/json/is-json.js.map +1 -1
- package/dist/utils/json/stable-stringify-tool-args.d.ts +7 -0
- package/dist/utils/json/stable-stringify-tool-args.d.ts.map +1 -0
- package/dist/utils/json/stable-stringify-tool-args.js +32 -0
- package/dist/utils/json/stable-stringify-tool-args.js.map +1 -0
- package/dist/utils/text.d.ts +0 -1
- package/dist/utils/text.d.ts.map +1 -1
- package/package.json +12 -9
- package/src/adapters/attachment.test.ts +107 -0
- package/src/adapters/attachment.ts +20 -10
- package/src/adapters/index.ts +6 -1
- package/src/adapters/suggestion.test.ts +187 -0
- package/src/adapters/suggestion.ts +75 -1
- package/src/index.ts +15 -1
- package/src/internal.ts +16 -0
- package/src/model-context/tool.test.ts +110 -0
- package/src/model-context/tool.ts +31 -9
- package/src/react/adapters/LocalStorageThreadListAdapter.test.ts +222 -0
- package/src/react/adapters/LocalStorageThreadListAdapter.tsx +214 -7
- package/src/react/index.ts +2 -0
- package/src/react/model-context/define-mcp-toolkit.ts +39 -6
- package/src/react/model-context/define-toolkit.test.ts +107 -0
- package/src/react/primitive-hooks/useMessageError.test.ts +64 -0
- package/src/react/primitive-hooks/useMessageError.ts +19 -6
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +3 -1
- package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +48 -19
- package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.test.ts +111 -0
- package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +13 -3
- package/src/react/runtimes/cloud/auiV0.ts +71 -2
- package/src/react/runtimes/external-message-converter.test.tsx +102 -0
- package/src/react/runtimes/external-message-converter.ts +35 -10
- package/src/runtime/base/base-composer-runtime-core.ts +26 -7
- package/src/runtime/utils/message-repository.ts +8 -3
- package/src/runtime/utils/thread-message-like.ts +2 -0
- package/src/runtimes/local/local-thread-runtime-core.test.ts +127 -3
- package/src/runtimes/local/local-thread-runtime-core.ts +25 -23
- package/src/runtimes/local/should-continue.ts +5 -2
- package/src/runtimes/remote-thread-list/adapter/in-memory.test.ts +14 -0
- package/src/runtimes/remote-thread-list/adapter/in-memory.ts +13 -5
- package/src/tests/MessageRepository.test.ts +26 -0
- package/src/tests/RemoteThreadListThreadListRuntimeCore-errors.test.ts +42 -0
- package/src/tests/attachment-adapters.test.ts +14 -2
- package/src/tests/auiV0Encode.test.ts +134 -1
- package/src/tests/base-composer-runtime-core-addAttachment.test.ts +79 -5
- package/src/tests/base-composer-runtime-core-send.test.ts +145 -0
- package/src/tests/thread-message-like.test.ts +40 -0
- package/src/types/attachment.ts +1 -0
- package/src/types/error.test.ts +122 -0
- package/src/types/error.ts +74 -0
- package/src/types/index.ts +1 -0
- package/src/types/message.ts +11 -3
- package/src/utils/json/is-json-equal.test.ts +84 -0
- package/src/utils/json/is-json.test.ts +123 -0
- package/src/utils/json/is-json.ts +1 -1
- package/src/utils/json/stable-stringify-tool-args.test.ts +105 -0
- package/src/utils/json/stable-stringify-tool-args.ts +70 -0
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
import type { Tool } from "assistant-stream";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
type StandardSchemaInput<TSchema> = TSchema extends {
|
|
4
|
+
readonly "~standard": {
|
|
5
|
+
readonly types?: { readonly input: infer TInput } | undefined;
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
? TInput extends Record<string, unknown>
|
|
9
|
+
? TInput
|
|
10
|
+
: Record<string, unknown>
|
|
11
|
+
: Record<string, unknown>;
|
|
12
|
+
|
|
13
|
+
type StandardSchemaParameters = Extract<
|
|
14
|
+
NonNullable<Extract<Tool<any>, { parameters: unknown }>["parameters"]>,
|
|
15
|
+
{ readonly "~standard": unknown }
|
|
16
|
+
>;
|
|
4
17
|
|
|
5
18
|
/**
|
|
6
19
|
* Defines a model tool with its argument schema, execution behavior, and
|
|
@@ -8,25 +21,34 @@ import type { Tool } from "assistant-stream";
|
|
|
8
21
|
*
|
|
9
22
|
* This helper keeps reusable tool definitions type-checked and convenient to
|
|
10
23
|
* export for a {@link Toolkit} registered with {@link Tools}.
|
|
11
|
-
*
|
|
12
|
-
*
|
|
24
|
+
* When `parameters` is a Standard Schema (for example Zod v4), its input type
|
|
25
|
+
* is inferred for `execute`, `streamCall`, and model-output callbacks. Plain
|
|
26
|
+
* JSON Schema objects do not carry TypeScript input types, so provide generic
|
|
27
|
+
* arguments or annotate callbacks when you need precise args for JSON Schema.
|
|
13
28
|
*
|
|
14
29
|
* @param tool - Tool definition to expose to the assistant model.
|
|
15
30
|
*
|
|
16
31
|
* @example
|
|
17
32
|
* ```ts
|
|
18
|
-
*
|
|
33
|
+
* import { z } from "zod";
|
|
34
|
+
*
|
|
35
|
+
* const getWeather = tool({
|
|
19
36
|
* type: "frontend",
|
|
20
37
|
* description: "Get the weather for a city.",
|
|
21
|
-
* parameters: {
|
|
22
|
-
* type: "object",
|
|
23
|
-
* properties: { city: { type: "string" } },
|
|
24
|
-
* required: ["city"],
|
|
25
|
-
* },
|
|
38
|
+
* parameters: z.object({ city: z.string() }),
|
|
26
39
|
* execute: async ({ city }) => `Sunny in ${city}`,
|
|
27
40
|
* });
|
|
28
41
|
* ```
|
|
29
42
|
*/
|
|
43
|
+
export function tool<
|
|
44
|
+
const TSchema extends StandardSchemaParameters,
|
|
45
|
+
TResult = any,
|
|
46
|
+
>(
|
|
47
|
+
tool: Tool<StandardSchemaInput<TSchema>, TResult> & { parameters: TSchema },
|
|
48
|
+
): Tool<StandardSchemaInput<TSchema>, TResult>;
|
|
49
|
+
export function tool<TArgs extends Record<string, unknown>, TResult = any>(
|
|
50
|
+
tool: Tool<TArgs, TResult>,
|
|
51
|
+
): Tool<TArgs, TResult>;
|
|
30
52
|
export function tool<TArgs extends Record<string, unknown>, TResult = any>(
|
|
31
53
|
tool: Tool<TArgs, TResult>,
|
|
32
54
|
): Tool<TArgs, TResult> {
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import type { AsyncStorageLike } from "./LocalStorageThreadListAdapter";
|
|
3
|
+
import {
|
|
4
|
+
createLocalStorageAdapter,
|
|
5
|
+
parseStoredMessageRepository,
|
|
6
|
+
parseStoredThreadMetadata,
|
|
7
|
+
} from "./LocalStorageThreadListAdapter";
|
|
8
|
+
|
|
9
|
+
const storedMessage = (
|
|
10
|
+
id: string,
|
|
11
|
+
role: "user" | "assistant" | "system" = "user",
|
|
12
|
+
) => ({
|
|
13
|
+
id,
|
|
14
|
+
role,
|
|
15
|
+
createdAt: "2026-01-01T00:00:00.000Z",
|
|
16
|
+
content: [],
|
|
17
|
+
metadata: { custom: {} },
|
|
18
|
+
...(role === "user" ? { attachments: [] } : undefined),
|
|
19
|
+
...(role === "assistant"
|
|
20
|
+
? { status: { type: "complete", reason: "stop" } }
|
|
21
|
+
: undefined),
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const createStorage = (
|
|
25
|
+
entries: Record<string, string> = {},
|
|
26
|
+
): AsyncStorageLike & { get(key: string): string | undefined } => {
|
|
27
|
+
const values = new Map(Object.entries(entries));
|
|
28
|
+
return {
|
|
29
|
+
get: (key) => values.get(key),
|
|
30
|
+
getItem: async (key) => values.get(key) ?? null,
|
|
31
|
+
setItem: async (key, value) => {
|
|
32
|
+
values.set(key, value);
|
|
33
|
+
},
|
|
34
|
+
removeItem: async (key) => {
|
|
35
|
+
values.delete(key);
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
describe("parseStoredThreadMetadata", () => {
|
|
41
|
+
it("returns an empty list for invalid JSON", () => {
|
|
42
|
+
expect(parseStoredThreadMetadata("{not-json")).toEqual([]);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("skips malformed thread records while preserving valid records", () => {
|
|
46
|
+
const threads = parseStoredThreadMetadata(
|
|
47
|
+
JSON.stringify([
|
|
48
|
+
{ remoteId: "thread-1", status: "regular", title: "Trip plan" },
|
|
49
|
+
{ remoteId: 123, status: "regular" },
|
|
50
|
+
{ remoteId: "thread-2", status: "archived", custom: { pinned: true } },
|
|
51
|
+
{ remoteId: "thread-3", status: "deleted" },
|
|
52
|
+
]),
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
expect(threads).toEqual([
|
|
56
|
+
{ remoteId: "thread-1", status: "regular", title: "Trip plan" },
|
|
57
|
+
{ remoteId: "thread-2", status: "archived", custom: { pinned: true } },
|
|
58
|
+
]);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it("defaults old thread records without status to regular", () => {
|
|
62
|
+
expect(
|
|
63
|
+
parseStoredThreadMetadata(JSON.stringify([{ remoteId: "old" }])),
|
|
64
|
+
).toEqual([{ remoteId: "old", status: "regular" }]);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
describe("parseStoredMessageRepository", () => {
|
|
69
|
+
it("returns empty history for invalid JSON", () => {
|
|
70
|
+
expect(parseStoredMessageRepository("{not-json")).toEqual({ messages: [] });
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("skips malformed message records", () => {
|
|
74
|
+
const repo = parseStoredMessageRepository(
|
|
75
|
+
JSON.stringify({
|
|
76
|
+
headId: "message-2",
|
|
77
|
+
messages: [
|
|
78
|
+
{
|
|
79
|
+
message: storedMessage("message-1"),
|
|
80
|
+
parentId: null,
|
|
81
|
+
},
|
|
82
|
+
{ message: { role: "user", content: [] }, parentId: null },
|
|
83
|
+
{
|
|
84
|
+
message: storedMessage("message-2", "assistant"),
|
|
85
|
+
parentId: "message-1",
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
}),
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
expect(repo.messages.map((item) => item.message.id)).toEqual([
|
|
92
|
+
"message-1",
|
|
93
|
+
"message-2",
|
|
94
|
+
]);
|
|
95
|
+
expect(repo.headId).toBe("message-2");
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it("drops a head id that points at a skipped message", () => {
|
|
99
|
+
const repo = parseStoredMessageRepository(
|
|
100
|
+
JSON.stringify({
|
|
101
|
+
headId: "missing",
|
|
102
|
+
messages: [
|
|
103
|
+
{
|
|
104
|
+
message: storedMessage("message-1"),
|
|
105
|
+
parentId: null,
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
}),
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
expect(repo.headId).toBeUndefined();
|
|
112
|
+
expect(repo.messages.map((item) => item.message.id)).toEqual(["message-1"]);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it("skips messages missing the required thread message shell", () => {
|
|
116
|
+
const repo = parseStoredMessageRepository(
|
|
117
|
+
JSON.stringify({
|
|
118
|
+
messages: [
|
|
119
|
+
{ message: { id: "missing-role" }, parentId: null },
|
|
120
|
+
{
|
|
121
|
+
message: {
|
|
122
|
+
...storedMessage("missing-content"),
|
|
123
|
+
content: undefined,
|
|
124
|
+
},
|
|
125
|
+
parentId: null,
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
message: { ...storedMessage("missing-metadata"), metadata: {} },
|
|
129
|
+
parentId: null,
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
message: storedMessage("valid"),
|
|
133
|
+
parentId: null,
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
}),
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
expect(repo.messages.map((item) => item.message.id)).toEqual(["valid"]);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it("skips messages whose parent is missing, skipped, or appears later", () => {
|
|
143
|
+
const repo = parseStoredMessageRepository(
|
|
144
|
+
JSON.stringify({
|
|
145
|
+
headId: "child-of-root",
|
|
146
|
+
messages: [
|
|
147
|
+
{
|
|
148
|
+
message: storedMessage("child-of-missing"),
|
|
149
|
+
parentId: "missing",
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
message: storedMessage("child-of-invalid"),
|
|
153
|
+
parentId: "invalid",
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
message: { id: "invalid" },
|
|
157
|
+
parentId: null,
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
message: storedMessage("child-before-parent"),
|
|
161
|
+
parentId: "late-parent",
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
message: storedMessage("late-parent"),
|
|
165
|
+
parentId: null,
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
message: storedMessage("child-of-root"),
|
|
169
|
+
parentId: "late-parent",
|
|
170
|
+
},
|
|
171
|
+
],
|
|
172
|
+
}),
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
expect(
|
|
176
|
+
repo.messages.map((item) => ({
|
|
177
|
+
id: item.message.id,
|
|
178
|
+
parentId: item.parentId,
|
|
179
|
+
})),
|
|
180
|
+
).toEqual([
|
|
181
|
+
{ id: "late-parent", parentId: null },
|
|
182
|
+
{ id: "child-of-root", parentId: "late-parent" },
|
|
183
|
+
]);
|
|
184
|
+
expect(repo.headId).toBe("child-of-root");
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
describe("createLocalStorageAdapter", () => {
|
|
189
|
+
it("lists no threads when the stored thread list is invalid JSON", async () => {
|
|
190
|
+
const storage = createStorage({ "@assistant-ui:threads": "{not-json" });
|
|
191
|
+
const adapter = createLocalStorageAdapter({ storage });
|
|
192
|
+
|
|
193
|
+
await expect(adapter.list()).resolves.toEqual({ threads: [] });
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
it("overwrites malformed thread storage when initializing a thread", async () => {
|
|
197
|
+
const storage = createStorage({ "@assistant-ui:threads": "{not-json" });
|
|
198
|
+
const adapter = createLocalStorageAdapter({ storage });
|
|
199
|
+
|
|
200
|
+
await expect(adapter.initialize("thread-1")).resolves.toEqual({
|
|
201
|
+
remoteId: "thread-1",
|
|
202
|
+
externalId: undefined,
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
expect(JSON.parse(storage.get("@assistant-ui:threads") ?? "")).toEqual([
|
|
206
|
+
{ remoteId: "thread-1", status: "regular" },
|
|
207
|
+
]);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it("includes the thread id when a stored thread cannot be fetched", async () => {
|
|
211
|
+
const storage = createStorage({
|
|
212
|
+
"@assistant-ui:threads": JSON.stringify([
|
|
213
|
+
{ remoteId: "thread-1", status: "regular" },
|
|
214
|
+
]),
|
|
215
|
+
});
|
|
216
|
+
const adapter = createLocalStorageAdapter({ storage });
|
|
217
|
+
|
|
218
|
+
await expect(adapter.fetch("missing-thread")).rejects.toThrow(
|
|
219
|
+
'Stored thread "missing-thread" not found while fetching thread metadata.',
|
|
220
|
+
);
|
|
221
|
+
});
|
|
222
|
+
});
|
|
@@ -8,6 +8,7 @@ import type {
|
|
|
8
8
|
RemoteThreadMetadata,
|
|
9
9
|
ThreadHistoryAdapter,
|
|
10
10
|
ThreadMessage,
|
|
11
|
+
RunConfig,
|
|
11
12
|
} from "../../index";
|
|
12
13
|
import type {
|
|
13
14
|
ExportedMessageRepository,
|
|
@@ -36,6 +37,212 @@ type StoredThreadMetadata = {
|
|
|
36
37
|
custom?: Record<string, unknown> | undefined;
|
|
37
38
|
};
|
|
38
39
|
|
|
40
|
+
type StoredSystemMessage = Extract<ThreadMessage, { role: "system" }>;
|
|
41
|
+
type StoredUserMessage = Extract<ThreadMessage, { role: "user" }>;
|
|
42
|
+
type StoredAssistantMessage = Extract<ThreadMessage, { role: "assistant" }>;
|
|
43
|
+
|
|
44
|
+
const isRecord = (value: unknown): value is Record<string, unknown> =>
|
|
45
|
+
typeof value === "object" && value !== null && !Array.isArray(value);
|
|
46
|
+
|
|
47
|
+
const parseJSON = (raw: string | null): unknown => {
|
|
48
|
+
if (!raw) return undefined;
|
|
49
|
+
try {
|
|
50
|
+
return JSON.parse(raw) as unknown;
|
|
51
|
+
} catch {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const parseStoredThread = (value: unknown): StoredThreadMetadata | null => {
|
|
57
|
+
if (!isRecord(value) || typeof value.remoteId !== "string") return null;
|
|
58
|
+
|
|
59
|
+
const status = value.status ?? "regular";
|
|
60
|
+
if (status !== "regular" && status !== "archived") return null;
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
remoteId: value.remoteId,
|
|
64
|
+
status,
|
|
65
|
+
...(typeof value.externalId === "string"
|
|
66
|
+
? { externalId: value.externalId }
|
|
67
|
+
: undefined),
|
|
68
|
+
...(typeof value.title === "string" ? { title: value.title } : undefined),
|
|
69
|
+
...(isRecord(value.custom) ? { custom: value.custom } : undefined),
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const parseDate = (value: unknown): Date | null => {
|
|
74
|
+
if (value instanceof Date && !Number.isNaN(value.getTime())) return value;
|
|
75
|
+
if (typeof value !== "string" && typeof value !== "number") return null;
|
|
76
|
+
|
|
77
|
+
const date = new Date(value);
|
|
78
|
+
return Number.isNaN(date.getTime()) ? null : date;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const isMessageRole = (value: unknown): value is ThreadMessage["role"] =>
|
|
82
|
+
value === "system" || value === "user" || value === "assistant";
|
|
83
|
+
|
|
84
|
+
const parseStoredThreadMessage = (value: unknown): ThreadMessage | null => {
|
|
85
|
+
if (!isRecord(value) || typeof value.id !== "string") return null;
|
|
86
|
+
if (!isMessageRole(value.role)) return null;
|
|
87
|
+
if (!Array.isArray(value.content)) return null;
|
|
88
|
+
|
|
89
|
+
const createdAt = parseDate(value.createdAt);
|
|
90
|
+
if (!createdAt) return null;
|
|
91
|
+
|
|
92
|
+
const metadata = value.metadata;
|
|
93
|
+
if (!isRecord(metadata) || !isRecord(metadata.custom)) return null;
|
|
94
|
+
|
|
95
|
+
if (value.role === "assistant") {
|
|
96
|
+
const status = value.status;
|
|
97
|
+
if (!isRecord(status) || typeof status.type !== "string") return null;
|
|
98
|
+
|
|
99
|
+
const submittedFeedback = isRecord(metadata.submittedFeedback)
|
|
100
|
+
? metadata.submittedFeedback
|
|
101
|
+
: undefined;
|
|
102
|
+
const submittedFeedbackType = submittedFeedback?.type;
|
|
103
|
+
|
|
104
|
+
return {
|
|
105
|
+
id: value.id,
|
|
106
|
+
role: "assistant",
|
|
107
|
+
content: value.content as StoredAssistantMessage["content"],
|
|
108
|
+
status: status as StoredAssistantMessage["status"],
|
|
109
|
+
createdAt,
|
|
110
|
+
metadata: {
|
|
111
|
+
unstable_state: (metadata.unstable_state ??
|
|
112
|
+
null) as StoredAssistantMessage["metadata"]["unstable_state"],
|
|
113
|
+
unstable_annotations: Array.isArray(metadata.unstable_annotations)
|
|
114
|
+
? (metadata.unstable_annotations as StoredAssistantMessage["metadata"]["unstable_annotations"])
|
|
115
|
+
: [],
|
|
116
|
+
unstable_data: Array.isArray(metadata.unstable_data)
|
|
117
|
+
? (metadata.unstable_data as StoredAssistantMessage["metadata"]["unstable_data"])
|
|
118
|
+
: [],
|
|
119
|
+
steps: Array.isArray(metadata.steps)
|
|
120
|
+
? (metadata.steps as StoredAssistantMessage["metadata"]["steps"])
|
|
121
|
+
: [],
|
|
122
|
+
...(submittedFeedbackType === "positive" ||
|
|
123
|
+
submittedFeedbackType === "negative"
|
|
124
|
+
? {
|
|
125
|
+
submittedFeedback: {
|
|
126
|
+
type: submittedFeedbackType,
|
|
127
|
+
},
|
|
128
|
+
}
|
|
129
|
+
: undefined),
|
|
130
|
+
...(metadata.timing !== undefined
|
|
131
|
+
? {
|
|
132
|
+
timing: metadata.timing as NonNullable<
|
|
133
|
+
StoredAssistantMessage["metadata"]["timing"]
|
|
134
|
+
>,
|
|
135
|
+
}
|
|
136
|
+
: undefined),
|
|
137
|
+
...(metadata.isOptimistic === true
|
|
138
|
+
? { isOptimistic: true }
|
|
139
|
+
: undefined),
|
|
140
|
+
custom: metadata.custom,
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (value.role === "user") {
|
|
146
|
+
return {
|
|
147
|
+
id: value.id,
|
|
148
|
+
role: "user",
|
|
149
|
+
content: value.content as StoredUserMessage["content"],
|
|
150
|
+
attachments: Array.isArray(value.attachments)
|
|
151
|
+
? (value.attachments as StoredUserMessage["attachments"])
|
|
152
|
+
: [],
|
|
153
|
+
createdAt,
|
|
154
|
+
metadata: {
|
|
155
|
+
custom: metadata.custom,
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (value.content.length !== 1) return null;
|
|
161
|
+
|
|
162
|
+
return {
|
|
163
|
+
id: value.id,
|
|
164
|
+
role: "system",
|
|
165
|
+
content: [value.content[0] as StoredSystemMessage["content"][0]],
|
|
166
|
+
createdAt,
|
|
167
|
+
metadata: {
|
|
168
|
+
custom: metadata.custom,
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
export const parseStoredThreadMetadata = (
|
|
174
|
+
raw: string | null,
|
|
175
|
+
): StoredThreadMetadata[] => {
|
|
176
|
+
const parsed = parseJSON(raw);
|
|
177
|
+
if (!Array.isArray(parsed)) return [];
|
|
178
|
+
|
|
179
|
+
return parsed.flatMap((item) => {
|
|
180
|
+
const thread = parseStoredThread(item);
|
|
181
|
+
return thread ? [thread] : [];
|
|
182
|
+
});
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
const parseStoredMessageRepositoryItem = (
|
|
186
|
+
value: unknown,
|
|
187
|
+
): ExportedMessageRepositoryItem | null => {
|
|
188
|
+
if (!isRecord(value)) return null;
|
|
189
|
+
|
|
190
|
+
const message = parseStoredThreadMessage(value.message);
|
|
191
|
+
if (!message) return null;
|
|
192
|
+
|
|
193
|
+
const parentId = value.parentId;
|
|
194
|
+
if (
|
|
195
|
+
parentId !== undefined &&
|
|
196
|
+
parentId !== null &&
|
|
197
|
+
typeof parentId !== "string"
|
|
198
|
+
) {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return {
|
|
203
|
+
message,
|
|
204
|
+
parentId: parentId ?? null,
|
|
205
|
+
...(isRecord(value.runConfig)
|
|
206
|
+
? { runConfig: value.runConfig as RunConfig }
|
|
207
|
+
: undefined),
|
|
208
|
+
};
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
export const parseStoredMessageRepository = (
|
|
212
|
+
raw: string | null,
|
|
213
|
+
): ExportedMessageRepository => {
|
|
214
|
+
const parsed = parseJSON(raw);
|
|
215
|
+
if (!isRecord(parsed) || !Array.isArray(parsed.messages)) {
|
|
216
|
+
return { messages: [] };
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const candidateMessages = parsed.messages.flatMap((item) => {
|
|
220
|
+
const parsedItem = parseStoredMessageRepositoryItem(item);
|
|
221
|
+
return parsedItem ? [parsedItem] : [];
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
const acceptedIds = new Set<string>();
|
|
225
|
+
const messages = candidateMessages.flatMap((item) => {
|
|
226
|
+
if (acceptedIds.has(item.message.id)) return [];
|
|
227
|
+
if (item.parentId !== null && !acceptedIds.has(item.parentId)) return [];
|
|
228
|
+
|
|
229
|
+
acceptedIds.add(item.message.id);
|
|
230
|
+
return [item];
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
const headId =
|
|
234
|
+
parsed.headId === null ||
|
|
235
|
+
(typeof parsed.headId === "string" &&
|
|
236
|
+
messages.some((item) => item.message.id === parsed.headId))
|
|
237
|
+
? parsed.headId
|
|
238
|
+
: undefined;
|
|
239
|
+
|
|
240
|
+
return {
|
|
241
|
+
...(headId !== undefined ? { headId } : undefined),
|
|
242
|
+
messages,
|
|
243
|
+
};
|
|
244
|
+
};
|
|
245
|
+
|
|
39
246
|
class AsyncStorageHistoryAdapter implements ThreadHistoryAdapter {
|
|
40
247
|
constructor(
|
|
41
248
|
private storage: AsyncStorageLike,
|
|
@@ -52,8 +259,7 @@ class AsyncStorageHistoryAdapter implements ThreadHistoryAdapter {
|
|
|
52
259
|
if (!remoteId) return { messages: [] };
|
|
53
260
|
|
|
54
261
|
const raw = await this.storage.getItem(this._messagesKey(remoteId));
|
|
55
|
-
|
|
56
|
-
return JSON.parse(raw) as ExportedMessageRepository;
|
|
262
|
+
return parseStoredMessageRepository(raw);
|
|
57
263
|
}
|
|
58
264
|
|
|
59
265
|
async append(item: ExportedMessageRepositoryItem): Promise<void> {
|
|
@@ -61,9 +267,7 @@ class AsyncStorageHistoryAdapter implements ThreadHistoryAdapter {
|
|
|
61
267
|
|
|
62
268
|
const key = this._messagesKey(remoteId);
|
|
63
269
|
const raw = await this.storage.getItem(key);
|
|
64
|
-
const repo
|
|
65
|
-
? (JSON.parse(raw) as ExportedMessageRepository)
|
|
66
|
-
: { messages: [] };
|
|
270
|
+
const repo = parseStoredMessageRepository(raw);
|
|
67
271
|
|
|
68
272
|
const idx = repo.messages.findIndex(
|
|
69
273
|
(m) => m.message.id === item.message.id,
|
|
@@ -110,7 +314,7 @@ export const createLocalStorageAdapter = (
|
|
|
110
314
|
|
|
111
315
|
const loadThreadMetadata = async (): Promise<StoredThreadMetadata[]> => {
|
|
112
316
|
const raw = await storage.getItem(threadsKey);
|
|
113
|
-
return
|
|
317
|
+
return parseStoredThreadMetadata(raw);
|
|
114
318
|
};
|
|
115
319
|
|
|
116
320
|
const saveThreadMetadata = async (
|
|
@@ -202,7 +406,10 @@ export const createLocalStorageAdapter = (
|
|
|
202
406
|
async fetch(threadId: string): Promise<RemoteThreadMetadata> {
|
|
203
407
|
const threads = await loadThreadMetadata();
|
|
204
408
|
const thread = threads.find((t) => t.remoteId === threadId);
|
|
205
|
-
if (!thread)
|
|
409
|
+
if (!thread)
|
|
410
|
+
throw new Error(
|
|
411
|
+
`Stored thread "${threadId}" not found while fetching thread metadata.`,
|
|
412
|
+
);
|
|
206
413
|
return {
|
|
207
414
|
remoteId: thread.remoteId,
|
|
208
415
|
externalId: thread.externalId,
|
package/src/react/index.ts
CHANGED
|
@@ -50,7 +50,9 @@ export {
|
|
|
50
50
|
} from "./model-context/provider-tool";
|
|
51
51
|
export {
|
|
52
52
|
defineMcpToolkit,
|
|
53
|
+
type McpToolkitEntry,
|
|
53
54
|
type McpToolkitDefinition,
|
|
55
|
+
type McpToolkitToolConfig,
|
|
54
56
|
} from "./model-context/define-mcp-toolkit";
|
|
55
57
|
/**
|
|
56
58
|
* @deprecated Since 2026-06-14 — migrate to the Unstable / Experimental API.
|
|
@@ -1,16 +1,49 @@
|
|
|
1
1
|
import type { McpServerConfig } from "assistant-stream";
|
|
2
2
|
import type { Toolkit } from "./toolbox";
|
|
3
3
|
|
|
4
|
-
export type
|
|
4
|
+
export type McpToolkitEntry =
|
|
5
|
+
| McpServerConfig
|
|
6
|
+
| {
|
|
7
|
+
server: McpServerConfig;
|
|
8
|
+
disabled?: boolean | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Prefix applied to every tool name exposed by this MCP server. Useful
|
|
11
|
+
* when multiple servers publish the same tool name, such as `search`.
|
|
12
|
+
*/
|
|
13
|
+
prefix?: string | undefined;
|
|
14
|
+
tools?: Record<string, McpToolkitToolConfig> | undefined;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export type McpToolkitToolConfig = {
|
|
18
|
+
disabled?: boolean | undefined;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export type McpToolkitDefinition = Record<string, McpToolkitEntry>;
|
|
5
22
|
|
|
6
23
|
/**
|
|
7
|
-
* Defines MCP server tools as a spreadable toolkit fragment.
|
|
24
|
+
* Defines MCP server tools as a spreadable toolkit fragment. Pass a raw
|
|
25
|
+
* `McpServerConfig` for always-on servers, or `{ server, disabled, tools }`
|
|
26
|
+
* when a server should stay configured but not expose all tools for the current
|
|
27
|
+
* request.
|
|
8
28
|
*/
|
|
9
29
|
export function defineMcpToolkit(definition: McpToolkitDefinition): Toolkit {
|
|
10
30
|
return Object.fromEntries(
|
|
11
|
-
Object.entries(definition).map(([name,
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
31
|
+
Object.entries(definition).map(([name, entry]) => {
|
|
32
|
+
const server = "server" in entry ? entry.server : entry;
|
|
33
|
+
const disabled = "server" in entry ? entry.disabled : undefined;
|
|
34
|
+
const prefix = "server" in entry ? entry.prefix : undefined;
|
|
35
|
+
const tools = "server" in entry ? entry.tools : undefined;
|
|
36
|
+
|
|
37
|
+
return [
|
|
38
|
+
name,
|
|
39
|
+
{
|
|
40
|
+
type: "mcp",
|
|
41
|
+
server,
|
|
42
|
+
...(disabled !== undefined && { disabled }),
|
|
43
|
+
...(prefix !== undefined && { prefix }),
|
|
44
|
+
...(tools !== undefined && { tools }),
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
}),
|
|
15
48
|
) as Toolkit;
|
|
16
49
|
}
|