@assistant-ui/core 0.1.13 → 0.1.15
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 +6 -0
- package/dist/adapters/attachment.d.ts.map +1 -1
- package/dist/adapters/attachment.js +54 -9
- package/dist/adapters/attachment.js.map +1 -1
- package/dist/adapters/{mention.d.ts → directive-formatter.d.ts} +2 -4
- package/dist/adapters/directive-formatter.d.ts.map +1 -0
- package/dist/adapters/{mention.js → directive-formatter.js} +4 -9
- package/dist/adapters/directive-formatter.js.map +1 -0
- package/dist/adapters/index.d.ts +1 -3
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +2 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/speech.d.ts.map +1 -1
- package/dist/adapters/speech.js +1 -3
- package/dist/adapters/speech.js.map +1 -1
- package/dist/adapters/thread-history.d.ts +1 -0
- package/dist/adapters/thread-history.d.ts.map +1 -1
- package/dist/adapters/trigger.d.ts +1 -18
- package/dist/adapters/trigger.d.ts.map +1 -1
- package/dist/index.d.ts +2 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/model-context/frame/host.d.ts +1 -1
- package/dist/model-context/frame/host.d.ts.map +1 -1
- package/dist/model-context/frame/host.js +1 -0
- package/dist/model-context/frame/host.js.map +1 -1
- package/dist/model-context/frame/provider.d.ts +1 -1
- package/dist/model-context/frame/provider.d.ts.map +1 -1
- package/dist/model-context/frame/provider.js +1 -0
- package/dist/model-context/frame/provider.js.map +1 -1
- package/dist/model-context/registry.d.ts +2 -2
- package/dist/model-context/registry.d.ts.map +1 -1
- package/dist/model-context/tool.d.ts +1 -1
- package/dist/model-context/tool.d.ts.map +1 -1
- package/dist/model-context/types.d.ts +1 -1
- package/dist/model-context/types.d.ts.map +1 -1
- package/dist/model-context/types.js +0 -3
- package/dist/model-context/types.js.map +1 -1
- package/dist/react/AssistantRuntimeProvider.d.ts +1 -1
- package/dist/react/AssistantRuntimeProvider.d.ts.map +1 -1
- package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
- package/dist/react/client/DataRenderers.d.ts +1 -1
- package/dist/react/client/DataRenderers.d.ts.map +1 -1
- package/dist/react/client/DataRenderers.js +14 -0
- package/dist/react/client/DataRenderers.js.map +1 -1
- package/dist/react/client/Tools.d.ts +1 -1
- package/dist/react/client/Tools.d.ts.map +1 -1
- package/dist/react/client/Tools.js +1 -0
- package/dist/react/client/Tools.js.map +1 -1
- package/dist/react/model-context/makeAssistantTool.d.ts +1 -1
- package/dist/react/model-context/makeAssistantTool.d.ts.map +1 -1
- package/dist/react/model-context/makeAssistantToolUI.d.ts +1 -1
- package/dist/react/model-context/makeAssistantToolUI.d.ts.map +1 -1
- package/dist/react/model-context/useInlineRender.d.ts +2 -2
- package/dist/react/model-context/useInlineRender.d.ts.map +1 -1
- package/dist/react/model-context/useInlineRender.js +1 -0
- package/dist/react/model-context/useInlineRender.js.map +1 -1
- package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts.map +1 -1
- package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js +1 -0
- package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js.map +1 -1
- package/dist/react/primitives/composer/ComposerAttachments.d.ts +1 -1
- package/dist/react/primitives/composer/ComposerAttachments.d.ts.map +1 -1
- package/dist/react/primitives/composer/ComposerAttachments.js +1 -1
- package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
- package/dist/react/primitives/message/MessageAttachments.d.ts +1 -1
- package/dist/react/primitives/message/MessageAttachments.d.ts.map +1 -1
- package/dist/react/primitives/message/MessageAttachments.js +1 -1
- package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
- package/dist/react/primitives/message/MessageParts.d.ts +1 -1
- package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
- package/dist/react/primitives/message/MessageParts.js +16 -17
- package/dist/react/primitives/message/MessageParts.js.map +1 -1
- package/dist/react/primitives/part/PartMessages.d.ts +1 -1
- package/dist/react/primitives/part/PartMessages.d.ts.map +1 -1
- package/dist/react/primitives/thread/ThreadMessages.d.ts +1 -1
- package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
- package/dist/react/primitives/thread/ThreadMessages.js +2 -1
- package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
- package/dist/react/primitives/threadList/ThreadListItems.d.ts +1 -1
- package/dist/react/primitives/threadList/ThreadListItems.d.ts.map +1 -1
- package/dist/react/primitives/threadList/ThreadListItems.js +1 -1
- package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
- package/dist/react/providers/AttachmentByIndexProvider.d.ts +1 -1
- package/dist/react/providers/AttachmentByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts +1 -1
- package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts.map +1 -1
- package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts +1 -1
- package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/MessageByIndexProvider.d.ts +1 -1
- package/dist/react/providers/MessageByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/PartByIndexProvider.d.ts +1 -1
- package/dist/react/providers/PartByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/QueueItemByIndexProvider.d.ts +1 -1
- package/dist/react/providers/QueueItemByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/SuggestionByIndexProvider.d.ts +1 -1
- package/dist/react/providers/SuggestionByIndexProvider.d.ts.map +1 -1
- package/dist/react/providers/TextMessagePartProvider.d.ts +1 -1
- package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
- package/dist/react/providers/ThreadListItemByIndexProvider.d.ts +1 -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 +3 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +2 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +5 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +22 -7
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
- package/dist/react/runtimes/RuntimeAdapterProvider.d.ts +1 -1
- package/dist/react/runtimes/RuntimeAdapterProvider.d.ts.map +1 -1
- package/dist/react/runtimes/RuntimeAdapterProvider.js.map +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +2 -2
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
- package/dist/react/runtimes/cloud/auiV0.d.ts +2 -2
- package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +4 -1
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
- package/dist/react/runtimes/useLocalRuntime.d.ts.map +1 -1
- package/dist/react/runtimes/useLocalRuntime.js +10 -0
- package/dist/react/runtimes/useLocalRuntime.js.map +1 -1
- package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
- package/dist/react/runtimes/useRemoteThreadListRuntime.js +6 -0
- package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
- package/dist/react/runtimes/useToolInvocations.d.ts.map +1 -1
- package/dist/react/runtimes/useToolInvocations.js +2 -0
- package/dist/react/runtimes/useToolInvocations.js.map +1 -1
- package/dist/react/types/MessagePartComponentTypes.d.ts +1 -1
- package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
- package/dist/react/types/scopes/dataRenderers.d.ts +2 -0
- package/dist/react/types/scopes/dataRenderers.d.ts.map +1 -1
- package/dist/runtime/api/assistant-runtime.d.ts +1 -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/attachment-runtime.js +0 -3
- package/dist/runtime/api/attachment-runtime.js.map +1 -1
- package/dist/runtime/api/message-runtime.d.ts +6 -6
- package/dist/runtime/api/message-runtime.d.ts.map +1 -1
- package/dist/runtime/api/thread-list-runtime.d.ts +4 -2
- package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
- package/dist/runtime/api/thread-list-runtime.js +5 -0
- package/dist/runtime/api/thread-list-runtime.js.map +1 -1
- package/dist/runtime/api/thread-runtime.d.ts +10 -9
- package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
- package/dist/runtime/api/thread-runtime.js +4 -3
- package/dist/runtime/api/thread-runtime.js.map +1 -1
- package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
- package/dist/runtime/base/default-edit-composer-runtime-core.d.ts +2 -1
- package/dist/runtime/base/default-edit-composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/default-edit-composer-runtime-core.js +26 -5
- package/dist/runtime/base/default-edit-composer-runtime-core.js.map +1 -1
- package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +1 -0
- package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
- package/dist/runtime/interfaces/thread-runtime-core.d.ts +7 -0
- package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
- package/dist/runtime/internal.d.ts.map +1 -1
- package/dist/runtime/internal.js +1 -4
- package/dist/runtime/internal.js.map +1 -1
- package/dist/runtime/utils/auto-status.d.ts +1 -1
- package/dist/runtime/utils/auto-status.d.ts.map +1 -1
- package/dist/runtime/utils/chat-model-adapter.d.ts +1 -1
- package/dist/runtime/utils/chat-model-adapter.d.ts.map +1 -1
- package/dist/runtime/utils/message-repository.d.ts +6 -0
- package/dist/runtime/utils/message-repository.d.ts.map +1 -1
- package/dist/runtime/utils/message-repository.js +17 -0
- package/dist/runtime/utils/message-repository.js.map +1 -1
- package/dist/runtime/utils/thread-message-like.d.ts +1 -1
- 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 +1 -1
- package/dist/runtimes/assistant-transport/utils.d.ts.map +1 -1
- package/dist/runtimes/assistant-transport/utils.js +1 -1
- package/dist/runtimes/assistant-transport/utils.js.map +1 -1
- package/dist/runtimes/external-store/external-store-adapter.d.ts +8 -0
- package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +1 -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-list-runtime-core.js +27 -25
- package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +1 -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 +4 -0
- package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
- package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts +2 -2
- package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/types.d.ts +1 -1
- package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
- package/dist/store/runtime-clients/attachment-runtime-client.d.ts +2 -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 -1
- package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/message-part-runtime-client.d.ts +2 -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 -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 +1 -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 +2 -2
- package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/thread-list-runtime-client.js +1 -0
- package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/thread-runtime-client.d.ts +1 -1
- package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
- package/dist/store/scopes/threads.d.ts +1 -0
- package/dist/store/scopes/threads.d.ts.map +1 -1
- package/dist/subscribable/subscribable.d.ts.map +1 -1
- package/dist/subscribable/subscribable.js +1 -15
- package/dist/subscribable/subscribable.js.map +1 -1
- package/dist/tests/remote-thread-list-test-helpers.d.ts +12 -0
- package/dist/tests/remote-thread-list-test-helpers.d.ts.map +1 -0
- package/dist/tests/remote-thread-list-test-helpers.js +48 -0
- package/dist/tests/remote-thread-list-test-helpers.js.map +1 -0
- package/dist/types/directive.d.ts +19 -0
- package/dist/types/directive.d.ts.map +1 -0
- package/dist/types/directive.js +2 -0
- package/dist/types/directive.js.map +1 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/message.d.ts.map +1 -1
- package/dist/types/trigger.d.ts +2 -2
- package/dist/types/trigger.d.ts.map +1 -1
- package/dist/utils/json/is-json.d.ts +1 -1
- package/dist/utils/json/is-json.d.ts.map +1 -1
- package/package.json +12 -12
- package/src/adapters/attachment.ts +68 -16
- package/src/adapters/{mention.ts → directive-formatter.ts} +8 -20
- package/src/adapters/index.ts +2 -9
- package/src/adapters/speech.ts +1 -16
- package/src/adapters/thread-history.ts +1 -8
- package/src/adapters/trigger.ts +1 -37
- package/src/index.ts +3 -24
- package/src/model-context/frame/host.ts +6 -5
- package/src/model-context/frame/provider.ts +6 -5
- package/src/model-context/registry.ts +6 -6
- package/src/model-context/tool.ts +1 -1
- package/src/model-context/types.ts +1 -17
- package/src/react/AssistantRuntimeProvider.tsx +1 -1
- package/src/react/adapters/LocalStorageThreadListAdapter.tsx +1 -1
- package/src/react/client/DataRenderers.ts +19 -3
- package/src/react/client/Tools.ts +4 -3
- package/src/react/model-context/makeAssistantTool.ts +1 -1
- package/src/react/model-context/makeAssistantToolUI.ts +1 -1
- package/src/react/model-context/useInlineRender.ts +3 -2
- package/src/react/primitives/chainOfThought/ChainOfThoughtParts.tsx +1 -0
- package/src/react/primitives/composer/ComposerAttachments.tsx +7 -1
- package/src/react/primitives/message/MessageAttachments.tsx +7 -1
- package/src/react/primitives/message/MessageParts.tsx +27 -17
- package/src/react/primitives/part/PartMessages.tsx +1 -1
- package/src/react/primitives/thread/ThreadMessages.tsx +3 -2
- package/src/react/primitives/threadList/ThreadListItems.tsx +7 -1
- package/src/react/providers/AttachmentByIndexProvider.tsx +1 -1
- package/src/react/providers/ChainOfThoughtByIndicesProvider.tsx +1 -1
- package/src/react/providers/ChainOfThoughtPartByIndexProvider.tsx +1 -1
- package/src/react/providers/MessageByIndexProvider.tsx +1 -1
- package/src/react/providers/PartByIndexProvider.tsx +1 -1
- package/src/react/providers/QueueItemByIndexProvider.tsx +1 -1
- package/src/react/providers/SuggestionByIndexProvider.tsx +1 -1
- package/src/react/providers/TextMessagePartProvider.tsx +1 -1
- package/src/react/providers/ThreadListItemByIndexProvider.tsx +1 -1
- package/src/react/providers/ThreadListItemRuntimeProvider.tsx +1 -1
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +7 -8
- package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +28 -8
- package/src/react/runtimes/RuntimeAdapterProvider.tsx +1 -1
- package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +3 -3
- package/src/react/runtimes/cloud/auiV0.ts +5 -2
- package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +6 -3
- package/src/react/runtimes/useLocalRuntime.ts +10 -0
- package/src/react/runtimes/useRemoteThreadListRuntime.ts +6 -0
- package/src/react/runtimes/useToolInvocations.ts +2 -0
- package/src/react/types/MessagePartComponentTypes.ts +1 -1
- package/src/react/types/scopes/dataRenderers.ts +2 -0
- package/src/runtime/api/assistant-runtime.ts +1 -1
- package/src/runtime/api/attachment-runtime.ts +0 -4
- package/src/runtime/api/message-runtime.ts +8 -8
- package/src/runtime/api/thread-list-runtime.ts +13 -5
- package/src/runtime/api/thread-runtime.ts +13 -12
- package/src/runtime/base/base-thread-runtime-core.ts +1 -1
- package/src/runtime/base/default-edit-composer-runtime-core.ts +35 -5
- package/src/runtime/interfaces/thread-list-runtime-core.ts +1 -0
- package/src/runtime/interfaces/thread-runtime-core.ts +7 -0
- package/src/runtime/internal.ts +1 -4
- package/src/runtime/utils/auto-status.ts +1 -1
- package/src/runtime/utils/chat-model-adapter.ts +1 -1
- package/src/runtime/utils/message-repository.ts +26 -0
- package/src/runtime/utils/thread-message-like.ts +4 -1
- package/src/runtimes/assistant-transport/utils.ts +5 -1
- package/src/runtimes/external-store/external-store-adapter.ts +8 -0
- package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +35 -29
- package/src/runtimes/external-store/external-store-thread-runtime-core.ts +4 -0
- package/src/runtimes/remote-thread-list/adapter/in-memory.ts +2 -2
- package/src/runtimes/remote-thread-list/types.ts +1 -1
- package/src/store/runtime-clients/attachment-runtime-client.ts +2 -2
- package/src/store/runtime-clients/composer-runtime-client.ts +2 -2
- package/src/store/runtime-clients/message-part-runtime-client.ts +2 -2
- package/src/store/runtime-clients/message-runtime-client.ts +2 -2
- package/src/store/runtime-clients/thread-list-item-runtime-client.ts +1 -1
- package/src/store/runtime-clients/thread-list-runtime-client.ts +4 -3
- package/src/store/runtime-clients/thread-runtime-client.ts +3 -3
- package/src/store/scopes/threads.ts +1 -0
- package/src/subscribable/subscribable.ts +1 -24
- package/src/tests/MessageRepository.test.ts +141 -0
- package/src/tests/OptimisticState-list-race.test.ts +5 -9
- package/src/tests/RemoteThreadListThreadListRuntimeCore-reload.test.ts +209 -0
- package/src/tests/RemoteThreadListThreadListRuntimeCore-switchToThread-dedupe.test.ts +139 -0
- package/src/tests/attachment.test.ts +180 -0
- package/src/tests/default-edit-composer-runtime-core.test.ts +312 -0
- package/src/tests/{mention-formatter.test.ts → directive-formatter.test.ts} +26 -1
- package/src/tests/external-store-thread-list-runtime-core.test.ts +212 -0
- package/src/tests/get-thread-state-isRunning.test.ts +93 -0
- package/src/tests/remote-thread-list-isLoading.test.ts +6 -10
- package/src/tests/remote-thread-list-test-helpers.ts +70 -0
- package/src/tests/thread-list-runtime-getLoadThreadsPromise.test.ts +17 -1
- package/src/types/directive.ts +19 -0
- package/src/types/index.ts +1 -3
- package/src/types/message.ts +0 -12
- package/src/types/trigger.ts +2 -10
- package/src/utils/json/is-json.ts +1 -1
- package/dist/adapters/mention.d.ts.map +0 -1
- package/dist/adapters/mention.js.map +0 -1
- package/dist/types/mention.d.ts +0 -21
- package/dist/types/mention.d.ts.map +0 -1
- package/dist/types/mention.js +0 -2
- package/dist/types/mention.js.map +0 -1
- package/src/types/mention.ts +0 -39
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { ExternalStoreThreadListRuntimeCore } from "../runtimes/external-store/external-store-thread-list-runtime-core";
|
|
3
|
+
import type { ExternalStoreThreadRuntimeCore } from "../runtimes/external-store/external-store-thread-runtime-core";
|
|
4
|
+
import type { ExternalStoreThreadListAdapter } from "../runtimes/external-store/external-store-adapter";
|
|
5
|
+
import { ThreadListRuntimeImpl } from "../runtime/api/thread-list-runtime";
|
|
6
|
+
|
|
7
|
+
const makeFactory = () =>
|
|
8
|
+
vi.fn(
|
|
9
|
+
() =>
|
|
10
|
+
({
|
|
11
|
+
subscribe: () => () => {},
|
|
12
|
+
}) as unknown as ExternalStoreThreadRuntimeCore,
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
const makeAdapter = (
|
|
16
|
+
overrides: Partial<ExternalStoreThreadListAdapter> = {},
|
|
17
|
+
): ExternalStoreThreadListAdapter => ({ ...overrides });
|
|
18
|
+
|
|
19
|
+
describe("ExternalStoreThreadListRuntimeCore - construction", () => {
|
|
20
|
+
it("assigns a resolvable fallback mainThreadId when adapter has no threadId", () => {
|
|
21
|
+
const core = new ExternalStoreThreadListRuntimeCore(
|
|
22
|
+
makeAdapter(),
|
|
23
|
+
makeFactory(),
|
|
24
|
+
);
|
|
25
|
+
expect(typeof core.mainThreadId).toBe("string");
|
|
26
|
+
expect(core.mainThreadId.length).toBeGreaterThan(0);
|
|
27
|
+
expect(core.getItemById(core.mainThreadId)).toBeDefined();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("picks up mainThreadId from adapter.threadId on construction (regression: #2577)", () => {
|
|
31
|
+
const core = new ExternalStoreThreadListRuntimeCore(
|
|
32
|
+
makeAdapter({ threadId: "thread-alpha" }),
|
|
33
|
+
makeFactory(),
|
|
34
|
+
);
|
|
35
|
+
expect(core.mainThreadId).toBe("thread-alpha");
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("exposes threadIds from adapter.threads on construction", () => {
|
|
39
|
+
const core = new ExternalStoreThreadListRuntimeCore(
|
|
40
|
+
makeAdapter({
|
|
41
|
+
threadId: "thread-alpha",
|
|
42
|
+
threads: [
|
|
43
|
+
{ id: "thread-alpha", status: "regular" },
|
|
44
|
+
{ id: "thread-beta", status: "regular" },
|
|
45
|
+
],
|
|
46
|
+
}),
|
|
47
|
+
makeFactory(),
|
|
48
|
+
);
|
|
49
|
+
expect(core.threadIds).toEqual(["thread-alpha", "thread-beta"]);
|
|
50
|
+
expect(core.mainThreadId).toBe("thread-alpha");
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it("creates the main thread instance exactly once on construction", () => {
|
|
54
|
+
const factory = makeFactory();
|
|
55
|
+
new ExternalStoreThreadListRuntimeCore(
|
|
56
|
+
makeAdapter({ threadId: "thread-alpha" }),
|
|
57
|
+
factory,
|
|
58
|
+
);
|
|
59
|
+
expect(factory).toHaveBeenCalledTimes(1);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("creates the main thread instance exactly once when adapter has no threadId", () => {
|
|
63
|
+
const factory = makeFactory();
|
|
64
|
+
new ExternalStoreThreadListRuntimeCore(makeAdapter(), factory);
|
|
65
|
+
expect(factory).toHaveBeenCalledTimes(1);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("binds getMainThreadRuntimeCore() to the instance produced by the factory", () => {
|
|
69
|
+
const instance = {
|
|
70
|
+
subscribe: () => () => {},
|
|
71
|
+
} as unknown as ExternalStoreThreadRuntimeCore;
|
|
72
|
+
const factory = vi.fn(() => instance);
|
|
73
|
+
const core = new ExternalStoreThreadListRuntimeCore(
|
|
74
|
+
makeAdapter({ threadId: "thread-alpha" }),
|
|
75
|
+
factory,
|
|
76
|
+
);
|
|
77
|
+
expect(core.getMainThreadRuntimeCore()).toBe(instance);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("preserves the frozen threadItems default when the adapter has no threads", () => {
|
|
81
|
+
const a = new ExternalStoreThreadListRuntimeCore(
|
|
82
|
+
makeAdapter(),
|
|
83
|
+
makeFactory(),
|
|
84
|
+
);
|
|
85
|
+
const b = new ExternalStoreThreadListRuntimeCore(
|
|
86
|
+
makeAdapter(),
|
|
87
|
+
makeFactory(),
|
|
88
|
+
);
|
|
89
|
+
// Two empty-adapter constructions should share the frozen DEFAULT_THREAD_DATA
|
|
90
|
+
// singleton rather than each getting a fresh `{ ... }` clone.
|
|
91
|
+
expect(a.threadItems).toBe(b.threadItems);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
describe("ExternalStoreThreadListRuntimeCore - __internal_setAdapter", () => {
|
|
96
|
+
it("updates mainThreadId when adapter.threadId changes", () => {
|
|
97
|
+
const core = new ExternalStoreThreadListRuntimeCore(
|
|
98
|
+
makeAdapter({ threadId: "thread-alpha" }),
|
|
99
|
+
makeFactory(),
|
|
100
|
+
);
|
|
101
|
+
core.__internal_setAdapter(makeAdapter({ threadId: "thread-beta" }));
|
|
102
|
+
expect(core.mainThreadId).toBe("thread-beta");
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it("rebuilds the main thread instance when threadId changes", () => {
|
|
106
|
+
const factory = makeFactory();
|
|
107
|
+
const core = new ExternalStoreThreadListRuntimeCore(
|
|
108
|
+
makeAdapter({ threadId: "thread-alpha" }),
|
|
109
|
+
factory,
|
|
110
|
+
);
|
|
111
|
+
const constructionCalls = factory.mock.calls.length;
|
|
112
|
+
core.__internal_setAdapter(makeAdapter({ threadId: "thread-beta" }));
|
|
113
|
+
expect(factory.mock.calls.length).toBe(constructionCalls + 1);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it("does not rebuild the main thread when only threads array changes", () => {
|
|
117
|
+
const factory = makeFactory();
|
|
118
|
+
const core = new ExternalStoreThreadListRuntimeCore(
|
|
119
|
+
makeAdapter({
|
|
120
|
+
threadId: "thread-alpha",
|
|
121
|
+
threads: [{ id: "thread-alpha", status: "regular" }],
|
|
122
|
+
}),
|
|
123
|
+
factory,
|
|
124
|
+
);
|
|
125
|
+
const constructionCalls = factory.mock.calls.length;
|
|
126
|
+
core.__internal_setAdapter(
|
|
127
|
+
makeAdapter({
|
|
128
|
+
threadId: "thread-alpha",
|
|
129
|
+
threads: [
|
|
130
|
+
{ id: "thread-alpha", status: "regular" },
|
|
131
|
+
{ id: "thread-beta", status: "regular" },
|
|
132
|
+
],
|
|
133
|
+
}),
|
|
134
|
+
);
|
|
135
|
+
expect(factory.mock.calls.length).toBe(constructionCalls);
|
|
136
|
+
expect(core.threadIds).toEqual(["thread-alpha", "thread-beta"]);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it("notifies subscribers on threadId change", () => {
|
|
140
|
+
const core = new ExternalStoreThreadListRuntimeCore(
|
|
141
|
+
makeAdapter({ threadId: "thread-alpha" }),
|
|
142
|
+
makeFactory(),
|
|
143
|
+
);
|
|
144
|
+
const callback = vi.fn();
|
|
145
|
+
core.subscribe(callback);
|
|
146
|
+
core.__internal_setAdapter(makeAdapter({ threadId: "thread-beta" }));
|
|
147
|
+
expect(callback).toHaveBeenCalled();
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
describe("ExternalStoreThreadListRuntimeCore - isMain via ThreadListRuntimeImpl", () => {
|
|
152
|
+
// Stub to avoid constructing the full ThreadRuntimeImpl graph when we only
|
|
153
|
+
// care about ThreadListItemRuntime.getState().isMain.
|
|
154
|
+
class NoopThreadRuntime {}
|
|
155
|
+
|
|
156
|
+
const buildImpl = (adapter: ExternalStoreThreadListAdapter) => {
|
|
157
|
+
const core = new ExternalStoreThreadListRuntimeCore(adapter, makeFactory());
|
|
158
|
+
return new ThreadListRuntimeImpl(
|
|
159
|
+
core,
|
|
160
|
+
NoopThreadRuntime as unknown as Parameters<
|
|
161
|
+
typeof ThreadListRuntimeImpl
|
|
162
|
+
>[1],
|
|
163
|
+
);
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
it("reports isMain=true for adapter.threadId on construction (user-visible regression: #2577)", () => {
|
|
167
|
+
const impl = buildImpl({
|
|
168
|
+
threadId: "thread-alpha",
|
|
169
|
+
threads: [
|
|
170
|
+
{ id: "thread-alpha", status: "regular" },
|
|
171
|
+
{ id: "thread-beta", status: "regular" },
|
|
172
|
+
],
|
|
173
|
+
});
|
|
174
|
+
expect(impl.getItemById("thread-alpha").getState().isMain).toBe(true);
|
|
175
|
+
expect(impl.getItemById("thread-beta").getState().isMain).toBe(false);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
it("reflects the main thread in the aggregated ThreadListState on construction", () => {
|
|
179
|
+
const impl = buildImpl({
|
|
180
|
+
threadId: "thread-alpha",
|
|
181
|
+
threads: [
|
|
182
|
+
{ id: "thread-alpha", status: "regular" },
|
|
183
|
+
{ id: "thread-beta", status: "regular" },
|
|
184
|
+
],
|
|
185
|
+
});
|
|
186
|
+
const state = impl.getState();
|
|
187
|
+
expect(state.mainThreadId).toBe("thread-alpha");
|
|
188
|
+
expect(state.threadIds).toEqual(["thread-alpha", "thread-beta"]);
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
describe("ExternalStoreThreadListRuntimeCore - switchToThread", () => {
|
|
193
|
+
it("invokes onSwitchToThread when the target differs from mainThreadId", async () => {
|
|
194
|
+
const onSwitchToThread = vi.fn(async () => {});
|
|
195
|
+
const core = new ExternalStoreThreadListRuntimeCore(
|
|
196
|
+
makeAdapter({ threadId: "thread-alpha", onSwitchToThread }),
|
|
197
|
+
makeFactory(),
|
|
198
|
+
);
|
|
199
|
+
await core.switchToThread("thread-beta");
|
|
200
|
+
expect(onSwitchToThread).toHaveBeenCalledWith("thread-beta");
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
it("early-returns without calling onSwitchToThread when target equals initial threadId (regression: #2577)", async () => {
|
|
204
|
+
const onSwitchToThread = vi.fn(async () => {});
|
|
205
|
+
const core = new ExternalStoreThreadListRuntimeCore(
|
|
206
|
+
makeAdapter({ threadId: "thread-alpha", onSwitchToThread }),
|
|
207
|
+
makeFactory(),
|
|
208
|
+
);
|
|
209
|
+
await core.switchToThread("thread-alpha");
|
|
210
|
+
expect(onSwitchToThread).not.toHaveBeenCalled();
|
|
211
|
+
});
|
|
212
|
+
});
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { getThreadState } from "../runtime/api/thread-runtime";
|
|
3
|
+
import type { ThreadRuntimeCore } from "../runtime/interfaces/thread-runtime-core";
|
|
4
|
+
import type { ThreadMessage } from "../types/message";
|
|
5
|
+
import type { ThreadListItemState } from "../runtime/api/thread-list-item-runtime";
|
|
6
|
+
|
|
7
|
+
const listItem = { id: "t1" } as unknown as ThreadListItemState;
|
|
8
|
+
|
|
9
|
+
const baseRuntime = (
|
|
10
|
+
overrides: Partial<ThreadRuntimeCore>,
|
|
11
|
+
): ThreadRuntimeCore =>
|
|
12
|
+
({
|
|
13
|
+
messages: [],
|
|
14
|
+
isDisabled: false,
|
|
15
|
+
isLoading: false,
|
|
16
|
+
capabilities: {} as any,
|
|
17
|
+
state: null,
|
|
18
|
+
suggestions: [],
|
|
19
|
+
extras: undefined,
|
|
20
|
+
speech: undefined,
|
|
21
|
+
voice: undefined,
|
|
22
|
+
...overrides,
|
|
23
|
+
}) as unknown as ThreadRuntimeCore;
|
|
24
|
+
|
|
25
|
+
const userMessage: ThreadMessage = {
|
|
26
|
+
id: "u1",
|
|
27
|
+
role: "user",
|
|
28
|
+
content: [],
|
|
29
|
+
createdAt: new Date(),
|
|
30
|
+
attachments: [],
|
|
31
|
+
metadata: { custom: {} },
|
|
32
|
+
} as unknown as ThreadMessage;
|
|
33
|
+
|
|
34
|
+
const completeAssistant: ThreadMessage = {
|
|
35
|
+
id: "a1",
|
|
36
|
+
role: "assistant",
|
|
37
|
+
content: [],
|
|
38
|
+
createdAt: new Date(),
|
|
39
|
+
status: { type: "complete", reason: "stop" },
|
|
40
|
+
metadata: { unstable_state: null, custom: {}, steps: [] },
|
|
41
|
+
} as unknown as ThreadMessage;
|
|
42
|
+
|
|
43
|
+
const runningAssistant: ThreadMessage = {
|
|
44
|
+
...completeAssistant,
|
|
45
|
+
id: "a2",
|
|
46
|
+
status: { type: "running" },
|
|
47
|
+
} as unknown as ThreadMessage;
|
|
48
|
+
|
|
49
|
+
describe("getThreadState.isRunning", () => {
|
|
50
|
+
it("falls back to last-message heuristic when runtime.isRunning is undefined", () => {
|
|
51
|
+
expect(
|
|
52
|
+
getThreadState(baseRuntime({ messages: [runningAssistant] }), listItem)
|
|
53
|
+
.isRunning,
|
|
54
|
+
).toBe(true);
|
|
55
|
+
|
|
56
|
+
expect(
|
|
57
|
+
getThreadState(baseRuntime({ messages: [completeAssistant] }), listItem)
|
|
58
|
+
.isRunning,
|
|
59
|
+
).toBe(false);
|
|
60
|
+
|
|
61
|
+
expect(
|
|
62
|
+
getThreadState(baseRuntime({ messages: [userMessage] }), listItem)
|
|
63
|
+
.isRunning,
|
|
64
|
+
).toBe(false);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("prefers explicit runtime.isRunning=true even when last message is complete", () => {
|
|
68
|
+
expect(
|
|
69
|
+
getThreadState(
|
|
70
|
+
baseRuntime({ isRunning: true, messages: [completeAssistant] }),
|
|
71
|
+
listItem,
|
|
72
|
+
).isRunning,
|
|
73
|
+
).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("prefers explicit runtime.isRunning=true when last message is a user message", () => {
|
|
77
|
+
expect(
|
|
78
|
+
getThreadState(
|
|
79
|
+
baseRuntime({ isRunning: true, messages: [userMessage] }),
|
|
80
|
+
listItem,
|
|
81
|
+
).isRunning,
|
|
82
|
+
).toBe(true);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("prefers explicit runtime.isRunning=false even when last message is running", () => {
|
|
86
|
+
expect(
|
|
87
|
+
getThreadState(
|
|
88
|
+
baseRuntime({ isRunning: false, messages: [runningAssistant] }),
|
|
89
|
+
listItem,
|
|
90
|
+
).isRunning,
|
|
91
|
+
).toBe(false);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
type THREAD_MAPPING_ID,
|
|
7
7
|
createThreadMappingId,
|
|
8
8
|
} from "../runtimes/remote-thread-list/remote-thread-state";
|
|
9
|
+
import { deferred } from "./remote-thread-list-test-helpers";
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* Tests for the isLoading lifecycle of RemoteThreadListThreadListRuntimeCore.
|
|
@@ -70,16 +71,6 @@ const applyListResult = (
|
|
|
70
71
|
};
|
|
71
72
|
};
|
|
72
73
|
|
|
73
|
-
function deferred<T>() {
|
|
74
|
-
let resolve!: (v: T) => void;
|
|
75
|
-
let reject!: (e: unknown) => void;
|
|
76
|
-
const promise = new Promise<T>((res, rej) => {
|
|
77
|
-
resolve = res;
|
|
78
|
-
reject = rej;
|
|
79
|
-
});
|
|
80
|
-
return { promise, resolve, reject };
|
|
81
|
-
}
|
|
82
|
-
|
|
83
74
|
describe("RemoteThreadList isLoading lifecycle", () => {
|
|
84
75
|
it("starts as true before any loading begins", () => {
|
|
85
76
|
const state = new OptimisticState<RemoteThreadState>(INITIAL_STATE);
|
|
@@ -93,6 +84,7 @@ describe("RemoteThreadList isLoading lifecycle", () => {
|
|
|
93
84
|
state.optimisticUpdate({
|
|
94
85
|
execute: () => d.promise,
|
|
95
86
|
loading: (s) => ({ ...s, isLoading: true }),
|
|
87
|
+
// biome-ignore lint/suspicious/noThenProperty: OptimisticState reducer pattern
|
|
96
88
|
then: applyListResult,
|
|
97
89
|
});
|
|
98
90
|
|
|
@@ -106,6 +98,7 @@ describe("RemoteThreadList isLoading lifecycle", () => {
|
|
|
106
98
|
const promise = state.optimisticUpdate({
|
|
107
99
|
execute: () => d.promise,
|
|
108
100
|
loading: (s) => ({ ...s, isLoading: true }),
|
|
101
|
+
// biome-ignore lint/suspicious/noThenProperty: OptimisticState reducer pattern
|
|
109
102
|
then: applyListResult,
|
|
110
103
|
});
|
|
111
104
|
|
|
@@ -122,6 +115,7 @@ describe("RemoteThreadList isLoading lifecycle", () => {
|
|
|
122
115
|
const promise = state.optimisticUpdate({
|
|
123
116
|
execute: () => d.promise,
|
|
124
117
|
loading: (s) => ({ ...s, isLoading: true }),
|
|
118
|
+
// biome-ignore lint/suspicious/noThenProperty: OptimisticState reducer pattern
|
|
125
119
|
then: applyListResult,
|
|
126
120
|
});
|
|
127
121
|
|
|
@@ -146,6 +140,7 @@ describe("RemoteThreadList isLoading lifecycle", () => {
|
|
|
146
140
|
const promise = state.optimisticUpdate({
|
|
147
141
|
execute: () => d.promise,
|
|
148
142
|
loading: (s) => ({ ...s, isLoading: true }),
|
|
143
|
+
// biome-ignore lint/suspicious/noThenProperty: OptimisticState reducer pattern
|
|
149
144
|
then: applyListResult,
|
|
150
145
|
});
|
|
151
146
|
|
|
@@ -169,6 +164,7 @@ describe("RemoteThreadList isLoading error path", () => {
|
|
|
169
164
|
.optimisticUpdate({
|
|
170
165
|
execute: () => d.promise,
|
|
171
166
|
loading: (s) => ({ ...s, isLoading: true }),
|
|
167
|
+
// biome-ignore lint/suspicious/noThenProperty: OptimisticState reducer pattern
|
|
172
168
|
then: applyListResult,
|
|
173
169
|
})
|
|
174
170
|
.catch(() => {
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { vi } from "vitest";
|
|
2
|
+
import { RemoteThreadListThreadListRuntimeCore } from "../react/runtimes/RemoteThreadListThreadListRuntimeCore";
|
|
3
|
+
import type { RemoteThreadListAdapter } from "../runtimes/remote-thread-list/types";
|
|
4
|
+
import type { ModelContextProvider } from "../model-context/types";
|
|
5
|
+
|
|
6
|
+
export function deferred<T>() {
|
|
7
|
+
let resolve!: (value: T) => void;
|
|
8
|
+
let reject!: (reason?: unknown) => void;
|
|
9
|
+
const promise = new Promise<T>((res, rej) => {
|
|
10
|
+
resolve = res;
|
|
11
|
+
reject = rej;
|
|
12
|
+
});
|
|
13
|
+
return { promise, resolve, reject };
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const contextProvider: ModelContextProvider = {
|
|
17
|
+
getModelContext: () => ({}),
|
|
18
|
+
subscribe: () => () => {},
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export function makeAdapter(
|
|
22
|
+
overrides: Partial<RemoteThreadListAdapter> = {},
|
|
23
|
+
): RemoteThreadListAdapter {
|
|
24
|
+
return {
|
|
25
|
+
list: vi.fn(async () => ({ threads: [] })),
|
|
26
|
+
initialize: vi.fn(async (threadId: string) => ({
|
|
27
|
+
remoteId: threadId,
|
|
28
|
+
externalId: threadId,
|
|
29
|
+
})),
|
|
30
|
+
rename: vi.fn(async () => {}),
|
|
31
|
+
archive: vi.fn(async () => {}),
|
|
32
|
+
unarchive: vi.fn(async () => {}),
|
|
33
|
+
delete: vi.fn(async () => {}),
|
|
34
|
+
generateTitle: vi.fn(
|
|
35
|
+
async () =>
|
|
36
|
+
new ReadableStream({
|
|
37
|
+
start(c) {
|
|
38
|
+
c.close();
|
|
39
|
+
},
|
|
40
|
+
}) as never,
|
|
41
|
+
),
|
|
42
|
+
fetch: vi.fn(async (id: string) => ({
|
|
43
|
+
status: "regular" as const,
|
|
44
|
+
remoteId: id,
|
|
45
|
+
externalId: id,
|
|
46
|
+
title: "Test",
|
|
47
|
+
})),
|
|
48
|
+
...overrides,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function createCore(
|
|
53
|
+
adapter: RemoteThreadListAdapter,
|
|
54
|
+
threadId?: string,
|
|
55
|
+
): RemoteThreadListThreadListRuntimeCore {
|
|
56
|
+
const core = new RemoteThreadListThreadListRuntimeCore(
|
|
57
|
+
{ adapter, runtimeHook: () => ({}) as never, threadId },
|
|
58
|
+
contextProvider,
|
|
59
|
+
);
|
|
60
|
+
// `startThreadRuntime` blocks until a React component attaches a runtime;
|
|
61
|
+
// stub it so non-React unit tests don't hang.
|
|
62
|
+
(
|
|
63
|
+
core as unknown as {
|
|
64
|
+
_hookManager: {
|
|
65
|
+
startThreadRuntime: (id: string) => Promise<unknown>;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
)._hookManager.startThreadRuntime = async () => ({});
|
|
69
|
+
return core;
|
|
70
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
2
|
import { ThreadListRuntimeImpl } from "../runtime/api/thread-list-runtime";
|
|
3
3
|
import type { ThreadListRuntimeCore } from "../runtime/interfaces/thread-list-runtime-core";
|
|
4
4
|
import { EMPTY_THREAD_CORE } from "../runtimes/remote-thread-list/empty-thread-core";
|
|
@@ -73,3 +73,19 @@ describe("ThreadListRuntime.getLoadThreadsPromise", () => {
|
|
|
73
73
|
expect(resolved).toBe(true);
|
|
74
74
|
});
|
|
75
75
|
});
|
|
76
|
+
|
|
77
|
+
describe("ThreadListRuntime.reload", () => {
|
|
78
|
+
it("resolves to undefined when core omits reload", async () => {
|
|
79
|
+
const runtime = new ThreadListRuntimeImpl(createMockCore());
|
|
80
|
+
await expect(runtime.reload()).resolves.toBeUndefined();
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it("delegates to core.reload when implemented", async () => {
|
|
84
|
+
const reload = vi.fn<() => Promise<void>>(() => Promise.resolve());
|
|
85
|
+
const core = { ...createMockCore(), reload };
|
|
86
|
+
const runtime = new ThreadListRuntimeImpl(core);
|
|
87
|
+
|
|
88
|
+
await runtime.reload();
|
|
89
|
+
expect(reload).toHaveBeenCalledTimes(1);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Unstable_TriggerItem } from "./trigger";
|
|
2
|
+
|
|
3
|
+
/** Parsed segment from directive text: either literal text or a resolved directive. */
|
|
4
|
+
export type Unstable_DirectiveSegment =
|
|
5
|
+
| { readonly kind: "text"; readonly text: string }
|
|
6
|
+
| {
|
|
7
|
+
readonly kind: "mention";
|
|
8
|
+
readonly type: string;
|
|
9
|
+
readonly label: string;
|
|
10
|
+
readonly id: string;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
/** Configurable formatter for directive serialization and parsing. */
|
|
14
|
+
export type Unstable_DirectiveFormatter = {
|
|
15
|
+
/** Serialize a trigger item to directive text. */
|
|
16
|
+
serialize(item: Unstable_TriggerItem): string;
|
|
17
|
+
/** Parse text into alternating text and directive segments. */
|
|
18
|
+
parse(text: string): readonly Unstable_DirectiveSegment[];
|
|
19
|
+
};
|
package/src/types/index.ts
CHANGED
|
@@ -40,11 +40,9 @@ export type { Unsubscribe } from "./unsubscribe";
|
|
|
40
40
|
export type { QuoteInfo } from "./quote";
|
|
41
41
|
|
|
42
42
|
export type {
|
|
43
|
-
Unstable_MentionItem,
|
|
44
|
-
Unstable_MentionCategory,
|
|
45
43
|
Unstable_DirectiveSegment,
|
|
46
44
|
Unstable_DirectiveFormatter,
|
|
47
|
-
} from "./
|
|
45
|
+
} from "./directive";
|
|
48
46
|
|
|
49
47
|
export type {
|
|
50
48
|
Unstable_TriggerItem,
|
package/src/types/message.ts
CHANGED
|
@@ -4,10 +4,6 @@ import type {
|
|
|
4
4
|
} from "assistant-stream/utils";
|
|
5
5
|
import type { CompleteAttachment } from "./attachment";
|
|
6
6
|
|
|
7
|
-
// =============================================================================
|
|
8
|
-
// Message Parts
|
|
9
|
-
// =============================================================================
|
|
10
|
-
|
|
11
7
|
export type TextMessagePart = {
|
|
12
8
|
readonly type: "text";
|
|
13
9
|
readonly text: string;
|
|
@@ -90,10 +86,6 @@ export type ThreadAssistantMessagePart =
|
|
|
90
86
|
| ImageMessagePart
|
|
91
87
|
| DataMessagePart;
|
|
92
88
|
|
|
93
|
-
// =============================================================================
|
|
94
|
-
// Message Status
|
|
95
|
-
// =============================================================================
|
|
96
|
-
|
|
97
89
|
export type MessagePartStatus =
|
|
98
90
|
| {
|
|
99
91
|
readonly type: "running";
|
|
@@ -143,10 +135,6 @@ export type MessageStatus =
|
|
|
143
135
|
readonly error?: ReadonlyJSONValue;
|
|
144
136
|
};
|
|
145
137
|
|
|
146
|
-
// =============================================================================
|
|
147
|
-
// Thread Messages
|
|
148
|
-
// =============================================================================
|
|
149
|
-
|
|
150
138
|
export type MessageTiming = {
|
|
151
139
|
readonly streamStartTime: number;
|
|
152
140
|
readonly firstTokenTime?: number;
|
package/src/types/trigger.ts
CHANGED
|
@@ -1,24 +1,16 @@
|
|
|
1
1
|
import type { ReadonlyJSONObject } from "assistant-stream/utils";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
// Trigger Item (generic item for any trigger-based popover: @mention, /command)
|
|
5
|
-
// =============================================================================
|
|
6
|
-
|
|
3
|
+
/** A selectable item displayed inside a trigger popover (e.g. mention, slash command). */
|
|
7
4
|
export type Unstable_TriggerItem = {
|
|
8
5
|
readonly id: string;
|
|
9
6
|
readonly type: string;
|
|
10
7
|
readonly label: string;
|
|
11
|
-
readonly icon?: string | undefined;
|
|
12
8
|
readonly description?: string | undefined;
|
|
13
9
|
readonly metadata?: ReadonlyJSONObject | undefined;
|
|
14
10
|
};
|
|
15
11
|
|
|
16
|
-
|
|
17
|
-
// Trigger Category (for hierarchical navigation in trigger popovers)
|
|
18
|
-
// =============================================================================
|
|
19
|
-
|
|
12
|
+
/** A grouping of trigger items shown in a trigger popover. */
|
|
20
13
|
export type Unstable_TriggerCategory = {
|
|
21
14
|
readonly id: string;
|
|
22
15
|
readonly label: string;
|
|
23
|
-
readonly icon?: string | undefined;
|
|
24
16
|
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mention.d.ts","sourceRoot":"","sources":["../../src/adapters/mention.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,2BAA2B,EAC5B,4BAAyB;AAC1B,OAAO,KAAK,EAAE,uBAAuB,EAAE,qBAAkB;AAMzD,MAAM,MAAM,uBAAuB,GAAG,uBAAuB,CAAC;AAQ9D;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,EAAE,2BAmChD,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mention.js","sourceRoot":"","sources":["../../src/adapters/mention.ts"],"names":[],"mappings":"AAaA,gFAAgF;AAChF,8BAA8B;AAC9B,gFAAgF;AAEhF,MAAM,YAAY,GAAG,6CAA6C,CAAC;AAEnE;;;;GAIG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAgC;IAC7E,SAAS,CAAC,IAA0B;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,IAAY;QAChB,MAAM,QAAQ,GAAgC,EAAE,CAAC;QACjD,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC;QAC3B,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAClD,IAAI,KAAK,CAAC,KAAK,GAAG,SAAS,EAAE,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC;iBACzC,CAAC,CAAC;YACL,CAAC;YACD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE;gBACf,KAAK;gBACL,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK;aACtB,CAAC,CAAC;YACH,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC;QACrC,CAAC;QAED,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAC"}
|
package/dist/types/mention.d.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { Unstable_TriggerItem, Unstable_TriggerCategory } from "./trigger.js";
|
|
2
|
-
export type Unstable_MentionItem = Unstable_TriggerItem;
|
|
3
|
-
export type Unstable_MentionCategory = Unstable_TriggerCategory;
|
|
4
|
-
/** Parsed segment from directive text */
|
|
5
|
-
export type Unstable_DirectiveSegment = {
|
|
6
|
-
readonly kind: "text";
|
|
7
|
-
readonly text: string;
|
|
8
|
-
} | {
|
|
9
|
-
readonly kind: "mention";
|
|
10
|
-
readonly type: string;
|
|
11
|
-
readonly label: string;
|
|
12
|
-
readonly id: string;
|
|
13
|
-
};
|
|
14
|
-
/** Configurable formatter for mention directive serialization/parsing */
|
|
15
|
-
export type Unstable_DirectiveFormatter = {
|
|
16
|
-
/** Serialize a mention item to directive text */
|
|
17
|
-
serialize(item: Unstable_MentionItem): string;
|
|
18
|
-
/** Parse text into alternating text and mention segments */
|
|
19
|
-
parse(text: string): readonly Unstable_DirectiveSegment[];
|
|
20
|
-
};
|
|
21
|
-
//# sourceMappingURL=mention.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mention.d.ts","sourceRoot":"","sources":["../../src/types/mention.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,qBAAkB;AAMhF,MAAM,MAAM,oBAAoB,GAAG,oBAAoB,CAAC;AAMxD,MAAM,MAAM,wBAAwB,GAAG,wBAAwB,CAAC;AAMhE,yCAAyC;AACzC,MAAM,MAAM,yBAAyB,GACjC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChD;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB,CAAC;AAMN,yEAAyE;AACzE,MAAM,MAAM,2BAA2B,GAAG;IACxC,iDAAiD;IACjD,SAAS,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAAC;IAC9C,4DAA4D;IAC5D,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,yBAAyB,EAAE,CAAC;CAC3D,CAAC"}
|
package/dist/types/mention.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mention.js","sourceRoot":"","sources":["../../src/types/mention.ts"],"names":[],"mappings":""}
|
package/src/types/mention.ts
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { Unstable_TriggerItem, Unstable_TriggerCategory } from "./trigger";
|
|
2
|
-
|
|
3
|
-
// =============================================================================
|
|
4
|
-
// Mention Item — alias of the generic TriggerItem for backward compatibility
|
|
5
|
-
// =============================================================================
|
|
6
|
-
|
|
7
|
-
export type Unstable_MentionItem = Unstable_TriggerItem;
|
|
8
|
-
|
|
9
|
-
// =============================================================================
|
|
10
|
-
// Mention Category — alias of the generic TriggerCategory
|
|
11
|
-
// =============================================================================
|
|
12
|
-
|
|
13
|
-
export type Unstable_MentionCategory = Unstable_TriggerCategory;
|
|
14
|
-
|
|
15
|
-
// =============================================================================
|
|
16
|
-
// Directive Segment (parsed representation of mention directives in text)
|
|
17
|
-
// =============================================================================
|
|
18
|
-
|
|
19
|
-
/** Parsed segment from directive text */
|
|
20
|
-
export type Unstable_DirectiveSegment =
|
|
21
|
-
| { readonly kind: "text"; readonly text: string }
|
|
22
|
-
| {
|
|
23
|
-
readonly kind: "mention";
|
|
24
|
-
readonly type: string;
|
|
25
|
-
readonly label: string;
|
|
26
|
-
readonly id: string;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
// =============================================================================
|
|
30
|
-
// Directive Formatter (configurable serialization/parsing for mentions)
|
|
31
|
-
// =============================================================================
|
|
32
|
-
|
|
33
|
-
/** Configurable formatter for mention directive serialization/parsing */
|
|
34
|
-
export type Unstable_DirectiveFormatter = {
|
|
35
|
-
/** Serialize a mention item to directive text */
|
|
36
|
-
serialize(item: Unstable_MentionItem): string;
|
|
37
|
-
/** Parse text into alternating text and mention segments */
|
|
38
|
-
parse(text: string): readonly Unstable_DirectiveSegment[];
|
|
39
|
-
};
|