@assistant-ui/core 0.2.10 → 0.2.12
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.map +1 -1
- package/dist/adapters/attachment.js +22 -12
- package/dist/adapters/attachment.js.map +1 -1
- package/dist/adapters/directive-formatter.js.map +1 -1
- package/dist/adapters/speech.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/internal.js +1 -1
- package/dist/model-context/frame/host.js.map +1 -1
- package/dist/model-context/frame/provider.js.map +1 -1
- package/dist/model-context/registry.js.map +1 -1
- package/dist/model-context/types.js.map +1 -1
- package/dist/react/AssistantProvider.js +1 -1
- package/dist/react/AssistantRuntimeProvider.d.ts +1 -1
- package/dist/react/AssistantRuntimeProvider.d.ts.map +1 -1
- package/dist/react/AssistantRuntimeProvider.js +1 -1
- package/dist/react/RuntimeAdapter.js +4 -2
- package/dist/react/RuntimeAdapter.js.map +1 -1
- package/dist/react/adapters/LocalStorageThreadListAdapter.js +1 -1
- package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
- package/dist/react/client/DataRenderers.d.ts.map +1 -1
- package/dist/react/client/DataRenderers.js +6 -5
- package/dist/react/client/DataRenderers.js.map +1 -1
- package/dist/react/client/Interactables.d.ts.map +1 -1
- package/dist/react/client/Interactables.js +30 -29
- package/dist/react/client/Interactables.js.map +1 -1
- package/dist/react/client/Tools.d.ts.map +1 -1
- package/dist/react/client/Tools.js +10 -9
- package/dist/react/client/Tools.js.map +1 -1
- package/dist/react/index.d.ts +5 -4
- package/dist/react/index.js +3 -2
- package/dist/react/model-context/define-mcp-toolkit.js.map +1 -1
- package/dist/react/model-context/define-toolkit.d.ts +9 -12
- package/dist/react/model-context/define-toolkit.d.ts.map +1 -1
- package/dist/react/model-context/define-toolkit.js +1 -1
- package/dist/react/model-context/define-toolkit.js.map +1 -1
- package/dist/react/model-context/external-tool.d.ts +14 -0
- package/dist/react/model-context/external-tool.d.ts.map +1 -0
- package/dist/react/model-context/external-tool.js +17 -0
- package/dist/react/model-context/external-tool.js.map +1 -0
- package/dist/react/model-context/human-tool.d.ts +27 -0
- package/dist/react/model-context/human-tool.d.ts.map +1 -0
- package/dist/react/model-context/human-tool.js +30 -0
- package/dist/react/model-context/human-tool.js.map +1 -0
- package/dist/react/model-context/toolbox.d.ts +3 -3
- package/dist/react/model-context/toolbox.js.map +1 -1
- package/dist/react/model-context/useAssistantContext.js +1 -1
- package/dist/react/model-context/useAssistantContext.js.map +1 -1
- package/dist/react/model-context/useAssistantDataUI.js +1 -1
- package/dist/react/model-context/useAssistantDataUI.js.map +1 -1
- package/dist/react/model-context/useAssistantInstructions.js +1 -1
- package/dist/react/model-context/useAssistantInstructions.js.map +1 -1
- package/dist/react/model-context/useAssistantInteractable.js +1 -1
- package/dist/react/model-context/useAssistantInteractable.js.map +1 -1
- package/dist/react/model-context/useAssistantTool.js +1 -1
- package/dist/react/model-context/useAssistantTool.js.map +1 -1
- package/dist/react/model-context/useAssistantToolUI.js +1 -1
- package/dist/react/model-context/useAssistantToolUI.js.map +1 -1
- package/dist/react/model-context/useAuiToolOverrides.js +1 -1
- package/dist/react/model-context/useAuiToolOverrides.js.map +1 -1
- package/dist/react/model-context/useInlineRender.js +1 -1
- package/dist/react/model-context/useInlineRender.js.map +1 -1
- package/dist/react/model-context/useInteractableState.js +1 -1
- package/dist/react/model-context/useInteractableState.js.map +1 -1
- package/dist/react/model-context/useToolArgsStatus.js +1 -1
- package/dist/react/primitive-hooks/useActionBarCopy.js +1 -1
- package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
- package/dist/react/primitive-hooks/useActionBarEdit.js +1 -1
- package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
- package/dist/react/primitive-hooks/useActionBarFeedback.js +1 -1
- package/dist/react/primitive-hooks/useActionBarFeedback.js.map +1 -1
- package/dist/react/primitive-hooks/useActionBarReload.js +1 -1
- package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
- package/dist/react/primitive-hooks/useActionBarSpeak.js +1 -1
- package/dist/react/primitive-hooks/useActionBarSpeak.js.map +1 -1
- package/dist/react/primitive-hooks/useActionBarStopSpeaking.js +1 -1
- package/dist/react/primitive-hooks/useActionBarStopSpeaking.js.map +1 -1
- package/dist/react/primitive-hooks/useBranchPickerNext.js +1 -1
- package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
- package/dist/react/primitive-hooks/useBranchPickerPrevious.js +1 -1
- package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
- package/dist/react/primitive-hooks/useComposerAddAttachment.js +1 -1
- package/dist/react/primitive-hooks/useComposerAddAttachment.js.map +1 -1
- package/dist/react/primitive-hooks/useComposerCancel.js +1 -1
- package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
- package/dist/react/primitive-hooks/useComposerDictate.js +1 -1
- package/dist/react/primitive-hooks/useComposerDictate.js.map +1 -1
- package/dist/react/primitive-hooks/useComposerSend.js +1 -1
- package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
- package/dist/react/primitive-hooks/useEditComposerCancel.js +1 -1
- package/dist/react/primitive-hooks/useEditComposerCancel.js.map +1 -1
- package/dist/react/primitive-hooks/useEditComposerSend.js +1 -1
- package/dist/react/primitive-hooks/useEditComposerSend.js.map +1 -1
- package/dist/react/primitive-hooks/useMessageBranching.js +1 -1
- package/dist/react/primitive-hooks/useMessageBranching.js.map +1 -1
- package/dist/react/primitive-hooks/useMessageReload.js +1 -1
- package/dist/react/primitive-hooks/useMessageReload.js.map +1 -1
- package/dist/react/primitive-hooks/useSuggestionTrigger.js +1 -1
- package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
- package/dist/react/primitive-hooks/useThreadListItemArchive.js +1 -1
- package/dist/react/primitive-hooks/useThreadListItemArchive.js.map +1 -1
- package/dist/react/primitive-hooks/useThreadListItemDelete.js +1 -1
- package/dist/react/primitive-hooks/useThreadListItemDelete.js.map +1 -1
- package/dist/react/primitive-hooks/useThreadListItemTrigger.js +1 -1
- package/dist/react/primitive-hooks/useThreadListItemTrigger.js.map +1 -1
- package/dist/react/primitive-hooks/useThreadListItemUnarchive.js +1 -1
- package/dist/react/primitive-hooks/useThreadListItemUnarchive.js.map +1 -1
- package/dist/react/primitive-hooks/useThreadListLoadMore.js +1 -1
- package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
- package/dist/react/primitive-hooks/useThreadListNew.js +1 -1
- package/dist/react/primitive-hooks/useThreadListNew.js.map +1 -1
- package/dist/react/primitive-hooks/useVoice.js +1 -1
- package/dist/react/primitive-hooks/useVoice.js.map +1 -1
- package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts +1 -1
- package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js +1 -1
- package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js.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/composer/ComposerQueue.js +1 -1
- package/dist/react/primitives/composer/ComposerQueue.js.map +1 -1
- package/dist/react/primitives/generativeUI/GenerativeUI.js +1 -1
- package/dist/react/primitives/generativeUI/GenerativeUI.js.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/MessageGroupedParts.js +1 -1
- package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
- package/dist/react/primitives/message/MessageParts.d.ts +1 -1
- package/dist/react/primitives/message/MessageParts.js +1 -1
- package/dist/react/primitives/message/MessageParts.js.map +1 -1
- package/dist/react/primitives/message/MessageQuote.js +1 -1
- package/dist/react/primitives/part/PartMessages.d.ts +2 -2
- package/dist/react/primitives/part/PartMessages.js +3 -3
- package/dist/react/primitives/part/PartMessages.js.map +1 -1
- package/dist/react/primitives/thread/ThreadMessages.js +1 -1
- package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
- package/dist/react/primitives/thread/ThreadSuggestions.js +1 -1
- package/dist/react/primitives/thread/ThreadSuggestions.js.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.js.map +1 -1
- package/dist/react/providers/ChainOfThoughtByIndicesProvider.js.map +1 -1
- package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js.map +1 -1
- package/dist/react/providers/MessageByIndexProvider.js.map +1 -1
- package/dist/react/providers/PartByIndexProvider.js.map +1 -1
- package/dist/react/providers/QueueItemByIndexProvider.js.map +1 -1
- package/dist/react/providers/ReadonlyThreadProvider.js +1 -1
- package/dist/react/providers/ReadonlyThreadProvider.js.map +1 -1
- package/dist/react/providers/SuggestionByIndexProvider.js.map +1 -1
- package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
- package/dist/react/providers/TextMessagePartProvider.js +4 -3
- package/dist/react/providers/TextMessagePartProvider.js.map +1 -1
- package/dist/react/providers/ThreadListItemByIndexProvider.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +7 -0
- 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 +7 -0
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +1 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
- package/dist/react/runtimes/RuntimeAdapterProvider.js +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +1 -1
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
- package/dist/react/runtimes/createMessageConverter.d.ts +2 -2
- package/dist/react/runtimes/createMessageConverter.d.ts.map +1 -1
- package/dist/react/runtimes/createMessageConverter.js.map +1 -1
- package/dist/react/runtimes/external-message-converter.d.ts +4 -3
- package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
- package/dist/react/runtimes/external-message-converter.js +1 -1
- package/dist/react/runtimes/external-message-converter.js.map +1 -1
- package/dist/react/runtimes/useExternalStoreRuntime.js +1 -1
- package/dist/react/runtimes/useExternalStoreSharedOptions.js +1 -1
- package/dist/react/runtimes/useLocalRuntime.d.ts +2 -1
- package/dist/react/runtimes/useLocalRuntime.d.ts.map +1 -1
- package/dist/react/runtimes/useLocalRuntime.js +4 -3
- package/dist/react/runtimes/useLocalRuntime.js.map +1 -1
- package/dist/react/runtimes/useRemoteThreadListRuntime.js +1 -1
- package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
- package/dist/react/utils/groupParts.d.ts +1 -1
- package/dist/react/utils/groupParts.js.map +1 -1
- package/dist/runtime/api/attachment-runtime.js.map +1 -1
- package/dist/runtime/api/composer-runtime.d.ts +8 -2
- package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
- package/dist/runtime/api/composer-runtime.js +14 -0
- package/dist/runtime/api/composer-runtime.js.map +1 -1
- package/dist/runtime/api/message-part-runtime.js.map +1 -1
- package/dist/runtime/api/message-runtime.js +1 -1
- package/dist/runtime/api/message-runtime.js.map +1 -1
- package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
- package/dist/runtime/api/thread-runtime.d.ts +7 -0
- package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
- package/dist/runtime/api/thread-runtime.js.map +1 -1
- package/dist/runtime/base/base-composer-runtime-core.d.ts +4 -0
- package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/base-composer-runtime-core.js +7 -1
- package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
- package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
- package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +4 -0
- package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/default-thread-composer-runtime-core.js +17 -1
- package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
- package/dist/runtime/interfaces/composer-runtime-core.d.ts +6 -1
- package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/interfaces/thread-runtime-core.d.ts +4 -0
- package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
- package/dist/runtime/queue/external-thread-queue-adapter.d.ts +20 -0
- package/dist/runtime/queue/external-thread-queue-adapter.d.ts.map +1 -0
- package/dist/runtime/queue/external-thread-queue-adapter.js +0 -0
- package/dist/runtime/queue/message-queue.d.ts +20 -0
- package/dist/runtime/queue/message-queue.d.ts.map +1 -0
- package/dist/runtime/queue/message-queue.js +97 -0
- package/dist/runtime/queue/message-queue.js.map +1 -0
- package/dist/runtime/utils/message-repository.js.map +1 -1
- package/dist/runtime/utils/thread-message-like.js.map +1 -1
- package/dist/runtimes/external-store/external-store-adapter.d.ts +3 -1
- package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
- package/dist/runtimes/external-store/external-store-runtime-core.js.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +4 -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 +20 -2
- package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
- package/dist/runtimes/local/local-runtime-core.js.map +1 -1
- package/dist/runtimes/local/local-runtime-options.d.ts +5 -0
- package/dist/runtimes/local/local-runtime-options.d.ts.map +1 -1
- package/dist/runtimes/local/local-thread-runtime-core.d.ts +7 -0
- package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/local/local-thread-runtime-core.js +45 -0
- package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
- package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +3 -0
- package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
- package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +3 -0
- package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
- package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/empty-thread-core.js +3 -0
- package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
- package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
- package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
- package/dist/store/clients/chain-of-thought-client.d.ts.map +1 -1
- package/dist/store/clients/chain-of-thought-client.js +6 -5
- package/dist/store/clients/chain-of-thought-client.js.map +1 -1
- package/dist/store/clients/model-context-client.d.ts.map +1 -1
- package/dist/store/clients/model-context-client.js +6 -5
- package/dist/store/clients/model-context-client.js.map +1 -1
- package/dist/store/clients/no-op-composer-client.d.ts.map +1 -1
- package/dist/store/clients/no-op-composer-client.js +4 -3
- package/dist/store/clients/no-op-composer-client.js.map +1 -1
- package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
- package/dist/store/clients/runtime-adapter.js +7 -6
- package/dist/store/clients/runtime-adapter.js.map +1 -1
- package/dist/store/clients/suggestions.d.ts.map +1 -1
- package/dist/store/clients/suggestions.js +7 -6
- package/dist/store/clients/suggestions.js.map +1 -1
- package/dist/store/clients/thread-message-client.d.ts.map +1 -1
- package/dist/store/clients/thread-message-client.js +13 -12
- package/dist/store/clients/thread-message-client.js.map +1 -1
- package/dist/store/index.d.ts +1 -1
- package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/attachment-runtime-client.js +3 -3
- package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/composer-runtime-client.d.ts +12 -5
- package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/composer-runtime-client.js +32 -16
- package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/message-part-runtime-client.js +3 -3
- package/dist/store/runtime-clients/message-part-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/message-runtime-client.d.ts +6 -3
- package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/message-runtime-client.js +17 -16
- package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/thread-list-item-runtime-client.js +8 -7
- package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/thread-list-runtime-client.js +11 -10
- package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/thread-runtime-client.js +15 -14
- package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/useSubscribable.d.ts +7 -0
- package/dist/store/runtime-clients/useSubscribable.d.ts.map +1 -0
- package/dist/store/runtime-clients/useSubscribable.js +16 -0
- package/dist/store/runtime-clients/useSubscribable.js.map +1 -0
- package/dist/store/scope-registration.d.ts +1 -1
- package/dist/store/scopes/composer.d.ts +1 -1
- package/dist/store/scopes/queue-item.d.ts +2 -1
- package/dist/store/scopes/queue-item.d.ts.map +1 -1
- package/dist/store/scopes/queue-item.js +6 -0
- package/dist/store/scopes/queue-item.js.map +1 -0
- package/dist/store/scopes/thread.d.ts +1 -1
- package/dist/store/scopes/threads.d.ts +1 -1
- package/dist/types/message.d.ts +2 -1
- package/dist/types/message.d.ts.map +1 -1
- package/dist/types/message.js.map +1 -1
- package/dist/utils/composite-context-provider.d.ts +1 -1
- package/dist/utils/composite-context-provider.js +3 -1
- package/dist/utils/composite-context-provider.js.map +1 -1
- package/dist/utils/json/is-json.js.map +1 -1
- package/dist/utils/text.js.map +1 -1
- package/package.json +14 -10
- package/src/adapters/attachment.ts +24 -4
- package/src/index.ts +8 -0
- package/src/react/RuntimeAdapter.ts +6 -4
- package/src/react/client/DataRenderers.ts +48 -42
- package/src/react/client/Interactables.ts +263 -267
- package/src/react/client/Tools.ts +122 -129
- package/src/react/index.ts +3 -1
- package/src/react/model-context/define-toolkit.test.ts +14 -7
- package/src/react/model-context/define-toolkit.ts +18 -19
- package/src/react/model-context/external-tool.ts +16 -0
- package/src/react/model-context/{hitl.ts → human-tool.ts} +13 -8
- package/src/react/model-context/toolbox.ts +3 -3
- package/src/react/primitives/message/MessageGroupedParts.tsx +1 -1
- package/src/react/primitives/part/PartMessages.tsx +2 -2
- package/src/react/providers/TextMessagePartProvider.tsx +31 -32
- package/src/react/runtimes/createMessageConverter.ts +2 -1
- package/src/react/runtimes/external-message-converter.ts +5 -3
- package/src/react/runtimes/useLocalRuntime.ts +2 -0
- package/src/runtime/api/composer-runtime.ts +26 -0
- package/src/runtime/base/base-composer-runtime-core.ts +11 -0
- package/src/runtime/base/default-thread-composer-runtime-core.ts +22 -0
- package/src/runtime/interfaces/composer-runtime-core.ts +7 -0
- package/src/runtime/interfaces/thread-runtime-core.ts +5 -0
- package/src/runtime/queue/external-thread-queue-adapter.ts +14 -0
- package/src/runtime/queue/message-queue.ts +128 -0
- package/src/runtimes/external-store/external-store-adapter.ts +3 -0
- package/src/runtimes/external-store/external-store-thread-runtime-core.ts +31 -2
- package/src/runtimes/local/local-runtime-options.ts +6 -0
- package/src/runtimes/local/local-thread-runtime-core.ts +70 -0
- package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +4 -0
- package/src/runtimes/remote-thread-list/empty-thread-core.ts +4 -0
- package/src/store/clients/chain-of-thought-client.ts +24 -25
- package/src/store/clients/model-context-client.ts +22 -19
- package/src/store/clients/no-op-composer-client.ts +69 -66
- package/src/store/clients/runtime-adapter.ts +9 -6
- package/src/store/clients/suggestions.ts +41 -40
- package/src/store/clients/thread-message-client.ts +127 -132
- package/src/store/runtime-clients/attachment-runtime-client.ts +7 -3
- package/src/store/runtime-clients/composer-runtime-client.ts +142 -113
- package/src/store/runtime-clients/message-part-runtime-client.ts +16 -14
- package/src/store/runtime-clients/message-runtime-client.ts +124 -122
- package/src/store/runtime-clients/thread-list-item-runtime-client.ts +44 -45
- package/src/store/runtime-clients/thread-list-runtime-client.ts +83 -80
- package/src/store/runtime-clients/thread-runtime-client.ts +113 -119
- package/src/store/runtime-clients/{tap-subscribable.ts → useSubscribable.ts} +4 -4
- package/src/store/scopes/queue-item.ts +2 -0
- package/src/tests/attachment-adapters.test.ts +86 -0
- package/src/tests/external-store-thread-runtime-core.test.ts +125 -0
- package/src/tests/message-queue.test.ts +168 -0
- package/src/types/message.ts +2 -0
- package/src/utils/composite-context-provider.ts +3 -1
- package/dist/react/model-context/hitl.d.ts +0 -23
- package/dist/react/model-context/hitl.d.ts.map +0 -1
- package/dist/react/model-context/hitl.js +0 -26
- package/dist/react/model-context/hitl.js.map +0 -1
- package/dist/store/runtime-clients/tap-subscribable.d.ts +0 -7
- package/dist/store/runtime-clients/tap-subscribable.d.ts.map +0 -1
- package/dist/store/runtime-clients/tap-subscribable.js +0 -16
- package/dist/store/runtime-clients/tap-subscribable.js.map +0 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { EMPTY_QUEUE_ITEMS } from "../../store/scopes/queue-item.js";
|
|
1
2
|
import { BaseComposerRuntimeCore } from "./base-composer-runtime-core.js";
|
|
2
3
|
//#region src/runtime/base/default-thread-composer-runtime-core.ts
|
|
3
4
|
var DefaultThreadComposerRuntimeCore = class extends BaseComposerRuntimeCore {
|
|
@@ -9,6 +10,15 @@ var DefaultThreadComposerRuntimeCore = class extends BaseComposerRuntimeCore {
|
|
|
9
10
|
get canSend() {
|
|
10
11
|
return !this.isEmpty && !this.runtime.isSendDisabled;
|
|
11
12
|
}
|
|
13
|
+
get queue() {
|
|
14
|
+
return this.runtime.getQueueItems?.() ?? EMPTY_QUEUE_ITEMS;
|
|
15
|
+
}
|
|
16
|
+
steerQueueItem(queueItemId) {
|
|
17
|
+
this.runtime.steerQueueItem?.(queueItemId);
|
|
18
|
+
}
|
|
19
|
+
removeQueueItem(queueItemId) {
|
|
20
|
+
this.runtime.removeQueueItem?.(queueItemId);
|
|
21
|
+
}
|
|
12
22
|
getAttachmentAdapter() {
|
|
13
23
|
return this.runtime.adapters?.attachments;
|
|
14
24
|
}
|
|
@@ -22,6 +32,7 @@ var DefaultThreadComposerRuntimeCore = class extends BaseComposerRuntimeCore {
|
|
|
22
32
|
}
|
|
23
33
|
connect() {
|
|
24
34
|
let lastIsSendDisabled = this.runtime.isSendDisabled;
|
|
35
|
+
let lastQueue = this.queue;
|
|
25
36
|
return this.runtime.subscribe(() => {
|
|
26
37
|
let changed = false;
|
|
27
38
|
if (this.canCancel !== this.runtime.capabilities.cancel) {
|
|
@@ -32,6 +43,10 @@ var DefaultThreadComposerRuntimeCore = class extends BaseComposerRuntimeCore {
|
|
|
32
43
|
lastIsSendDisabled = this.runtime.isSendDisabled;
|
|
33
44
|
changed = true;
|
|
34
45
|
}
|
|
46
|
+
if (lastQueue !== this.queue) {
|
|
47
|
+
lastQueue = this.queue;
|
|
48
|
+
changed = true;
|
|
49
|
+
}
|
|
35
50
|
if (changed) this._notifySubscribers();
|
|
36
51
|
});
|
|
37
52
|
}
|
|
@@ -40,7 +55,8 @@ var DefaultThreadComposerRuntimeCore = class extends BaseComposerRuntimeCore {
|
|
|
40
55
|
...message,
|
|
41
56
|
parentId: this.runtime.messages.at(-1)?.id ?? null,
|
|
42
57
|
sourceId: null,
|
|
43
|
-
startRun: options?.startRun
|
|
58
|
+
startRun: options?.startRun,
|
|
59
|
+
steer: options?.steer
|
|
44
60
|
});
|
|
45
61
|
}
|
|
46
62
|
async handleCancel() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-thread-composer-runtime-core.js","names":[],"sources":["../../../src/runtime/base/default-thread-composer-runtime-core.ts"],"sourcesContent":["import type { AppendMessage } from \"../../types/message\";\nimport type { AttachmentAdapter } from \"../../adapters/attachment\";\nimport type { DictationAdapter } from \"../../adapters/speech\";\nimport type {\n SendOptions,\n ThreadComposerRuntimeCore,\n} from \"../interfaces/composer-runtime-core\";\nimport type { ThreadRuntimeCore } from \"../interfaces/thread-runtime-core\";\nimport { BaseComposerRuntimeCore } from \"./base-composer-runtime-core\";\n\nexport class DefaultThreadComposerRuntimeCore\n extends BaseComposerRuntimeCore\n implements ThreadComposerRuntimeCore\n{\n private _canCancel = false;\n public get canCancel() {\n return this._canCancel;\n }\n\n public get canSend() {\n return !this.isEmpty && !this.runtime.isSendDisabled;\n }\n\n protected getAttachmentAdapter() {\n return this.runtime.adapters?.attachments;\n }\n\n protected getDictationAdapter() {\n return this.runtime.adapters?.dictation;\n }\n\n constructor(\n private runtime: Omit<ThreadRuntimeCore, \"composer\"> & {\n adapters?:\n | {\n attachments?: AttachmentAdapter | undefined;\n dictation?: DictationAdapter | undefined;\n }\n | undefined;\n },\n ) {\n super();\n this.connect();\n }\n\n public connect() {\n let lastIsSendDisabled = this.runtime.isSendDisabled;\n return this.runtime.subscribe(() => {\n let changed = false;\n if (this.canCancel !== this.runtime.capabilities.cancel) {\n this._canCancel = this.runtime.capabilities.cancel;\n changed = true;\n }\n if (lastIsSendDisabled !== this.runtime.isSendDisabled) {\n lastIsSendDisabled = this.runtime.isSendDisabled;\n changed = true;\n }\n if (changed) this._notifySubscribers();\n });\n }\n\n public async handleSend(\n message: Omit<AppendMessage, \"parentId\" | \"sourceId\">,\n options?: SendOptions,\n ) {\n this.runtime.append({\n ...(message as AppendMessage),\n parentId: this.runtime.messages.at(-1)?.id ?? null,\n sourceId: null,\n startRun: options?.startRun,\n });\n }\n\n public async handleCancel() {\n this.runtime.cancelRun();\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"default-thread-composer-runtime-core.js","names":[],"sources":["../../../src/runtime/base/default-thread-composer-runtime-core.ts"],"sourcesContent":["import type { AppendMessage } from \"../../types/message\";\nimport type { AttachmentAdapter } from \"../../adapters/attachment\";\nimport type { DictationAdapter } from \"../../adapters/speech\";\nimport type {\n SendOptions,\n ThreadComposerRuntimeCore,\n} from \"../interfaces/composer-runtime-core\";\nimport type { ThreadRuntimeCore } from \"../interfaces/thread-runtime-core\";\nimport {\n EMPTY_QUEUE_ITEMS,\n type QueueItemState,\n} from \"../../store/scopes/queue-item\";\nimport { BaseComposerRuntimeCore } from \"./base-composer-runtime-core\";\n\nexport class DefaultThreadComposerRuntimeCore\n extends BaseComposerRuntimeCore\n implements ThreadComposerRuntimeCore\n{\n private _canCancel = false;\n public get canCancel() {\n return this._canCancel;\n }\n\n public get canSend() {\n return !this.isEmpty && !this.runtime.isSendDisabled;\n }\n\n public override get queue(): readonly QueueItemState[] {\n return this.runtime.getQueueItems?.() ?? EMPTY_QUEUE_ITEMS;\n }\n\n public override steerQueueItem(queueItemId: string): void {\n this.runtime.steerQueueItem?.(queueItemId);\n }\n\n public override removeQueueItem(queueItemId: string): void {\n this.runtime.removeQueueItem?.(queueItemId);\n }\n\n protected getAttachmentAdapter() {\n return this.runtime.adapters?.attachments;\n }\n\n protected getDictationAdapter() {\n return this.runtime.adapters?.dictation;\n }\n\n constructor(\n private runtime: Omit<ThreadRuntimeCore, \"composer\"> & {\n adapters?:\n | {\n attachments?: AttachmentAdapter | undefined;\n dictation?: DictationAdapter | undefined;\n }\n | undefined;\n },\n ) {\n super();\n this.connect();\n }\n\n public connect() {\n let lastIsSendDisabled = this.runtime.isSendDisabled;\n let lastQueue = this.queue;\n return this.runtime.subscribe(() => {\n let changed = false;\n if (this.canCancel !== this.runtime.capabilities.cancel) {\n this._canCancel = this.runtime.capabilities.cancel;\n changed = true;\n }\n if (lastIsSendDisabled !== this.runtime.isSendDisabled) {\n lastIsSendDisabled = this.runtime.isSendDisabled;\n changed = true;\n }\n if (lastQueue !== this.queue) {\n lastQueue = this.queue;\n changed = true;\n }\n if (changed) this._notifySubscribers();\n });\n }\n\n public async handleSend(\n message: Omit<AppendMessage, \"parentId\" | \"sourceId\">,\n options?: SendOptions,\n ) {\n this.runtime.append({\n ...(message as AppendMessage),\n parentId: this.runtime.messages.at(-1)?.id ?? null,\n sourceId: null,\n startRun: options?.startRun,\n steer: options?.steer,\n });\n }\n\n public async handleCancel() {\n this.runtime.cancelRun();\n }\n}\n"],"mappings":";;;AAcA,IAAa,mCAAb,cACU,wBAEV;CA+BY;CA9BV,aAAqB;CACrB,IAAW,YAAY;EACrB,OAAO,KAAK;CACd;CAEA,IAAW,UAAU;EACnB,OAAO,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ;CACxC;CAEA,IAAoB,QAAmC;EACrD,OAAO,KAAK,QAAQ,gBAAgB,KAAK;CAC3C;CAEA,eAA+B,aAA2B;EACxD,KAAK,QAAQ,iBAAiB,WAAW;CAC3C;CAEA,gBAAgC,aAA2B;EACzD,KAAK,QAAQ,kBAAkB,WAAW;CAC5C;CAEA,uBAAiC;EAC/B,OAAO,KAAK,QAAQ,UAAU;CAChC;CAEA,sBAAgC;EAC9B,OAAO,KAAK,QAAQ,UAAU;CAChC;CAEA,YACE,SAQA;EACA,MAAM;EATE,KAAA,UAAA;EAUR,KAAK,QAAQ;CACf;CAEA,UAAiB;EACf,IAAI,qBAAqB,KAAK,QAAQ;EACtC,IAAI,YAAY,KAAK;EACrB,OAAO,KAAK,QAAQ,gBAAgB;GAClC,IAAI,UAAU;GACd,IAAI,KAAK,cAAc,KAAK,QAAQ,aAAa,QAAQ;IACvD,KAAK,aAAa,KAAK,QAAQ,aAAa;IAC5C,UAAU;GACZ;GACA,IAAI,uBAAuB,KAAK,QAAQ,gBAAgB;IACtD,qBAAqB,KAAK,QAAQ;IAClC,UAAU;GACZ;GACA,IAAI,cAAc,KAAK,OAAO;IAC5B,YAAY,KAAK;IACjB,UAAU;GACZ;GACA,IAAI,SAAS,KAAK,mBAAmB;EACvC,CAAC;CACH;CAEA,MAAa,WACX,SACA,SACA;EACA,KAAK,QAAQ,OAAO;GAClB,GAAI;GACJ,UAAU,KAAK,QAAQ,SAAS,GAAG,EAAE,CAAC,EAAE,MAAM;GAC9C,UAAU;GACV,UAAU,SAAS;GACnB,OAAO,SAAS;EAClB,CAAC;CACH;CAEA,MAAa,eAAe;EAC1B,KAAK,QAAQ,UAAU;CACzB;AACF"}
|
|
@@ -3,6 +3,7 @@ import { Attachment, CreateAttachment } from "../../types/attachment.js";
|
|
|
3
3
|
import { Unsubscribe } from "../../types/unsubscribe.js";
|
|
4
4
|
import { DictationAdapter } from "../../adapters/speech.js";
|
|
5
5
|
import { QuoteInfo } from "../../types/quote.js";
|
|
6
|
+
import { QueueItemState } from "../../store/scopes/queue-item.js";
|
|
6
7
|
|
|
7
8
|
//#region src/runtime/interfaces/composer-runtime-core.d.ts
|
|
8
9
|
type AttachmentAddErrorReason = "no-adapter" | "not-accepted" | "adapter-error";
|
|
@@ -33,7 +34,8 @@ type DictationState = {
|
|
|
33
34
|
readonly inputDisabled?: boolean;
|
|
34
35
|
};
|
|
35
36
|
type SendOptions = {
|
|
36
|
-
startRun?: boolean;
|
|
37
|
+
startRun?: boolean; /** Process this message next; only meaningful with the `queue` capability. */
|
|
38
|
+
steer?: boolean;
|
|
37
39
|
};
|
|
38
40
|
type ComposerRuntimeCore = Readonly<{
|
|
39
41
|
isEditing: boolean;
|
|
@@ -56,6 +58,9 @@ type ComposerRuntimeCore = Readonly<{
|
|
|
56
58
|
clearAttachments: () => Promise<void>;
|
|
57
59
|
send: (options?: SendOptions) => void;
|
|
58
60
|
cancel: () => void;
|
|
61
|
+
queue: readonly QueueItemState[];
|
|
62
|
+
steerQueueItem: (queueItemId: string) => void;
|
|
63
|
+
removeQueueItem: (queueItemId: string) => void;
|
|
59
64
|
dictation: DictationState | undefined;
|
|
60
65
|
startDictation: () => void;
|
|
61
66
|
stopDictation: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composer-runtime-core.d.ts","names":[],"sources":["../../../src/runtime/interfaces/composer-runtime-core.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"composer-runtime-core.d.ts","names":[],"sources":["../../../src/runtime/interfaces/composer-runtime-core.ts"],"mappings":";;;;;;;;KAQY,wBAAA;AAAA,KAKA,uBAAA;EAAA,SACD,MAAA,EAAQ,wBAAA;EAAA,SACR,OAAA;EAAA,SACA,YAAA;EAAA,SACA,KAAA,GAAQ,KAAK;AAAA;AAAA,KAGZ,2BAAA;;;;;EAKV,IAAA,EAAM,MAAA;EATG;;;;EAcT,aAAA,EAAe,MAAA;EACf,kBAAA,EAAoB,uBAAA;AAAA;AAAA,KAGV,wBAAA,SAAiC,2BAA2B;AAAA,KAE5D,4BAAA,WAAuC,wBAAA,KACjD,OAAA,EAAS,2BAAA,CAA4B,CAAA;AAAA,KAG3B,cAAA;EAAA,SACD,MAAA,EAAQ,gBAAA,CAAiB,MAAM;EAAA,SAC/B,UAAA;EAAA,SACA,aAAA;AAAA;AAAA,KAGC,WAAA;EACV,QAAA,YAjBe;EAmBf,KAAK;AAAA;AAAA,KAGK,mBAAA,GAAsB,QAAA;EAChC,SAAA;EAEA,SAAA;EACA,OAAA;EACA,OAAA;EAEA,WAAA,WAAsB,UAAA;EACtB,gBAAA;EAEA,aAAA,GAAgB,gBAAA,EAAkB,IAAA,GAAO,gBAAA,KAAqB,OAAA;EAC9D,gBAAA,GAAmB,YAAA,aAAyB,OAAA;EAE5C,IAAA;EACA,OAAA,GAAU,KAAA;EAEV,IAAA,EAAM,WAAA;EACN,OAAA,GAAU,IAAA,EAAM,WAAA;EAEhB,SAAA,EAAW,SAAA;EACX,YAAA,GAAe,SAAA,EAAW,SAAA;EAE1B,KAAA,EAAO,SAAA;EACP,QAAA,GAAW,KAAA,EAAO,SAAA;EAElB,KAAA,QAAa,OAAA;EACb,gBAAA,QAAwB,OAAA;EAExB,IAAA,GAAO,OAAA,GAAU,WAAA;EACjB,MAAA;EAEA,KAAA,WAAgB,cAAA;EAChB,cAAA,GAAiB,WAAA;EACjB,eAAA,GAAkB,WAAA;EAElB,SAAA,EAAW,cAAA;EACX,cAAA;EACA,aAAA;EAEA,SAAA,GAAY,QAAA,iBAAyB,WAAA;EAlDH;;;;AAEZ;EAuDtB,WAAA,aAAwB,wBAAA,EACtB,KAAA,EAAO,CAAA,EACP,QAAA,EAAU,4BAAA,CAA6B,CAAA,MACpC,WAAA;AAAA;AAAA,KAGK,yBAAA,GAA4B,mBAAmB;AAAA,KAE/C,uBAAA,GAA0B,mBAAA,GACpC,QAAQ;EACN,QAAA;EACA,QAAA;AAAA"}
|
|
@@ -6,6 +6,7 @@ import { ModelContext } from "../../model-context/types.js";
|
|
|
6
6
|
import { ChatModelRunOptions, ChatModelRunResult } from "../utils/chat-model-adapter.js";
|
|
7
7
|
import { ThreadMessageLike } from "../utils/thread-message-like.js";
|
|
8
8
|
import { ExportedMessageRepository } from "../utils/message-repository.js";
|
|
9
|
+
import { QueueItemState } from "../../store/scopes/queue-item.js";
|
|
9
10
|
import { EditComposerRuntimeCore, ThreadComposerRuntimeCore } from "./composer-runtime-core.js";
|
|
10
11
|
import { ToolModelContentPart } from "assistant-stream";
|
|
11
12
|
import { ReadonlyJSONValue } from "assistant-stream/utils";
|
|
@@ -134,6 +135,9 @@ type ThreadRuntimeCore = Readonly<{
|
|
|
134
135
|
composer: ThreadComposerRuntimeCore;
|
|
135
136
|
getEditComposer: (messageId: string) => EditComposerRuntimeCore | undefined;
|
|
136
137
|
beginEdit: (messageId: string) => void;
|
|
138
|
+
getQueueItems?: () => readonly QueueItemState[];
|
|
139
|
+
steerQueueItem?: (queueItemId: string) => void;
|
|
140
|
+
removeQueueItem?: (queueItemId: string) => void;
|
|
137
141
|
speech: SpeechState | undefined;
|
|
138
142
|
voice: VoiceSessionState | undefined;
|
|
139
143
|
capabilities: Readonly<RuntimeCapabilities>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtime/interfaces/thread-runtime-core.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtime/interfaces/thread-runtime-core.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { AppendMessage } from "../../types/message.js";
|
|
2
|
+
import { QueueItemState } from "../../store/scopes/queue-item.js";
|
|
3
|
+
|
|
4
|
+
//#region src/runtime/queue/external-thread-queue-adapter.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* The queue surface a runtime exposes so the composer can stay usable during a
|
|
7
|
+
* run and render the pending messages.
|
|
8
|
+
*/
|
|
9
|
+
type ExternalThreadQueueAdapter = {
|
|
10
|
+
items: readonly QueueItemState[];
|
|
11
|
+
enqueue: (message: AppendMessage, options: {
|
|
12
|
+
steer: boolean;
|
|
13
|
+
}) => void;
|
|
14
|
+
steer: (queueItemId: string) => void;
|
|
15
|
+
remove: (queueItemId: string) => void;
|
|
16
|
+
clear: (reason: "edit" | "reload" | "cancel-run") => void;
|
|
17
|
+
};
|
|
18
|
+
//#endregion
|
|
19
|
+
export { ExternalThreadQueueAdapter };
|
|
20
|
+
//# sourceMappingURL=external-thread-queue-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-thread-queue-adapter.d.ts","names":[],"sources":["../../../src/runtime/queue/external-thread-queue-adapter.ts"],"mappings":";;;;;;AAOA;;KAAY,0BAAA;EACV,KAAA,WAAgB,cAAA;EAChB,OAAA,GAAU,OAAA,EAAS,aAAa,EAAE,OAAA;IAAW,KAAA;EAAA;EAC7C,KAAA,GAAQ,WAAA;EACR,MAAA,GAAS,WAAA;EACT,KAAA,GAAQ,MAAA;AAAA"}
|
|
File without changes
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { AppendMessage } from "../../types/message.js";
|
|
2
|
+
import { ExternalThreadQueueAdapter } from "./external-thread-queue-adapter.js";
|
|
3
|
+
|
|
4
|
+
//#region src/runtime/queue/message-queue.d.ts
|
|
5
|
+
type MessageQueueDriver = {
|
|
6
|
+
run: (message: AppendMessage, options: {
|
|
7
|
+
steer: boolean;
|
|
8
|
+
}) => void; /** When omitted, `steer` degrades to "process next" instead of interrupting. */
|
|
9
|
+
cancel?: (() => void) | undefined;
|
|
10
|
+
};
|
|
11
|
+
type MessageQueueController = {
|
|
12
|
+
readonly adapter: ExternalThreadQueueAdapter; /** Mark a run as in flight so concurrent sends buffer; call on the rising edge. */
|
|
13
|
+
notifyBusy: () => void; /** Advances to the next pending message; call on the run's falling edge. */
|
|
14
|
+
notifyIdle: () => void;
|
|
15
|
+
subscribe: (callback: () => void) => () => void;
|
|
16
|
+
};
|
|
17
|
+
declare const createMessageQueue: (driver: MessageQueueDriver) => MessageQueueController;
|
|
18
|
+
//#endregion
|
|
19
|
+
export { MessageQueueController, MessageQueueDriver, createMessageQueue };
|
|
20
|
+
//# sourceMappingURL=message-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-queue.d.ts","names":[],"sources":["../../../src/runtime/queue/message-queue.ts"],"mappings":";;;;KASY,kBAAA;EACV,GAAA,GAAM,OAAA,EAAS,aAAa,EAAE,OAAA;IAAW,KAAA;EAAA;EAEzC,MAAA;AAAA;AAAA,KAGU,sBAAA;EAAA,SACD,OAAA,EAAS,0BAA0B,EANH;EAQzC,UAAA,cANA;EAQA,UAAA;EACA,SAAA,GAAY,QAAA;AAAA;AAAA,cAGD,kBAAA,GACX,MAAA,EAAQ,kBAAA,KACP,sBAqGF"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { generateId } from "../../utils/id.js";
|
|
2
|
+
import { EMPTY_QUEUE_ITEMS } from "../../store/scopes/queue-item.js";
|
|
3
|
+
import { getThreadMessageText } from "../../utils/text.js";
|
|
4
|
+
//#region src/runtime/queue/message-queue.ts
|
|
5
|
+
const createMessageQueue = (driver) => {
|
|
6
|
+
let items = EMPTY_QUEUE_ITEMS;
|
|
7
|
+
const messages = /* @__PURE__ */ new Map();
|
|
8
|
+
const subscribers = /* @__PURE__ */ new Set();
|
|
9
|
+
let running = false;
|
|
10
|
+
let suppressIdle = 0;
|
|
11
|
+
const notify = () => {
|
|
12
|
+
for (const callback of subscribers) callback();
|
|
13
|
+
};
|
|
14
|
+
const setItems = (next) => {
|
|
15
|
+
items = next;
|
|
16
|
+
adapter.items = next;
|
|
17
|
+
notify();
|
|
18
|
+
};
|
|
19
|
+
const advance = () => {
|
|
20
|
+
if (running || items.length === 0) return;
|
|
21
|
+
const head = items[0];
|
|
22
|
+
const message = messages.get(head.id);
|
|
23
|
+
messages.delete(head.id);
|
|
24
|
+
setItems(items.slice(1));
|
|
25
|
+
if (!message) return;
|
|
26
|
+
running = true;
|
|
27
|
+
driver.run(message, { steer: false });
|
|
28
|
+
};
|
|
29
|
+
const enqueue = (message, { steer }) => {
|
|
30
|
+
const id = generateId();
|
|
31
|
+
const prompt = getThreadMessageText(message);
|
|
32
|
+
messages.set(id, message);
|
|
33
|
+
setItems([...items, {
|
|
34
|
+
id,
|
|
35
|
+
prompt
|
|
36
|
+
}]);
|
|
37
|
+
if (steer) steerItem(id);
|
|
38
|
+
else advance();
|
|
39
|
+
};
|
|
40
|
+
const steerItem = (queueItemId) => {
|
|
41
|
+
if (!messages.has(queueItemId)) return;
|
|
42
|
+
if (driver.cancel && running) {
|
|
43
|
+
const message = messages.get(queueItemId);
|
|
44
|
+
messages.delete(queueItemId);
|
|
45
|
+
setItems(items.filter((item) => item.id !== queueItemId));
|
|
46
|
+
suppressIdle++;
|
|
47
|
+
driver.cancel();
|
|
48
|
+
running = true;
|
|
49
|
+
driver.run(message, { steer: true });
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const target = items.find((item) => item.id === queueItemId);
|
|
53
|
+
if (!target) return;
|
|
54
|
+
setItems([target, ...items.filter((item) => item.id !== queueItemId)]);
|
|
55
|
+
advance();
|
|
56
|
+
};
|
|
57
|
+
const remove = (queueItemId) => {
|
|
58
|
+
if (!messages.delete(queueItemId)) return;
|
|
59
|
+
setItems(items.filter((item) => item.id !== queueItemId));
|
|
60
|
+
};
|
|
61
|
+
const clear = () => {
|
|
62
|
+
if (items.length === 0) return;
|
|
63
|
+
messages.clear();
|
|
64
|
+
setItems(EMPTY_QUEUE_ITEMS);
|
|
65
|
+
};
|
|
66
|
+
const adapter = {
|
|
67
|
+
items,
|
|
68
|
+
enqueue,
|
|
69
|
+
steer: steerItem,
|
|
70
|
+
remove,
|
|
71
|
+
clear
|
|
72
|
+
};
|
|
73
|
+
return {
|
|
74
|
+
adapter,
|
|
75
|
+
notifyBusy: () => {
|
|
76
|
+
running = true;
|
|
77
|
+
},
|
|
78
|
+
notifyIdle: () => {
|
|
79
|
+
if (suppressIdle > 0) {
|
|
80
|
+
suppressIdle--;
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
running = false;
|
|
84
|
+
advance();
|
|
85
|
+
},
|
|
86
|
+
subscribe: (callback) => {
|
|
87
|
+
subscribers.add(callback);
|
|
88
|
+
return () => {
|
|
89
|
+
subscribers.delete(callback);
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
//#endregion
|
|
95
|
+
export { createMessageQueue };
|
|
96
|
+
|
|
97
|
+
//# sourceMappingURL=message-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-queue.js","names":[],"sources":["../../../src/runtime/queue/message-queue.ts"],"sourcesContent":["import type { AppendMessage } from \"../../types/message\";\nimport {\n EMPTY_QUEUE_ITEMS,\n type QueueItemState,\n} from \"../../store/scopes/queue-item\";\nimport { generateId } from \"../../utils/id\";\nimport { getThreadMessageText } from \"../../utils/text\";\nimport type { ExternalThreadQueueAdapter } from \"./external-thread-queue-adapter\";\n\nexport type MessageQueueDriver = {\n run: (message: AppendMessage, options: { steer: boolean }) => void;\n /** When omitted, `steer` degrades to \"process next\" instead of interrupting. */\n cancel?: (() => void) | undefined;\n};\n\nexport type MessageQueueController = {\n readonly adapter: ExternalThreadQueueAdapter;\n /** Mark a run as in flight so concurrent sends buffer; call on the rising edge. */\n notifyBusy: () => void;\n /** Advances to the next pending message; call on the run's falling edge. */\n notifyIdle: () => void;\n subscribe: (callback: () => void) => () => void;\n};\n\nexport const createMessageQueue = (\n driver: MessageQueueDriver,\n): MessageQueueController => {\n let items: readonly QueueItemState[] = EMPTY_QUEUE_ITEMS;\n const messages = new Map<string, AppendMessage>();\n const subscribers = new Set<() => void>();\n\n let running = false;\n // swallow the cancelled run's settle when steering so it does not double-advance\n let suppressIdle = 0;\n\n const notify = () => {\n for (const callback of subscribers) callback();\n };\n\n const setItems = (next: readonly QueueItemState[]) => {\n items = next;\n adapter.items = next;\n notify();\n };\n\n const advance = () => {\n if (running || items.length === 0) return;\n const head = items[0]!;\n const message = messages.get(head.id);\n messages.delete(head.id);\n setItems(items.slice(1));\n if (!message) return;\n running = true;\n driver.run(message, { steer: false });\n };\n\n const enqueue = (message: AppendMessage, { steer }: { steer: boolean }) => {\n const id = generateId();\n const prompt = getThreadMessageText(message);\n messages.set(id, message);\n setItems([...items, { id, prompt }]);\n if (steer) {\n steerItem(id);\n } else {\n advance();\n }\n };\n\n const steerItem = (queueItemId: string) => {\n if (!messages.has(queueItemId)) return;\n\n if (driver.cancel && running) {\n const message = messages.get(queueItemId)!;\n messages.delete(queueItemId);\n setItems(items.filter((item) => item.id !== queueItemId));\n suppressIdle++;\n driver.cancel();\n running = true;\n driver.run(message, { steer: true });\n return;\n }\n\n const target = items.find((item) => item.id === queueItemId);\n if (!target) return;\n setItems([target, ...items.filter((item) => item.id !== queueItemId)]);\n advance();\n };\n\n const remove = (queueItemId: string) => {\n if (!messages.delete(queueItemId)) return;\n setItems(items.filter((item) => item.id !== queueItemId));\n };\n\n const clear = () => {\n if (items.length === 0) return;\n messages.clear();\n setItems(EMPTY_QUEUE_ITEMS);\n };\n\n const adapter: ExternalThreadQueueAdapter = {\n items,\n enqueue,\n steer: steerItem,\n remove,\n clear,\n };\n\n return {\n adapter,\n notifyBusy: () => {\n running = true;\n },\n notifyIdle: () => {\n if (suppressIdle > 0) {\n suppressIdle--;\n return;\n }\n running = false;\n advance();\n },\n subscribe: (callback) => {\n subscribers.add(callback);\n return () => {\n subscribers.delete(callback);\n };\n },\n };\n};\n"],"mappings":";;;;AAwBA,MAAa,sBACX,WAC2B;CAC3B,IAAI,QAAmC;CACvC,MAAM,2BAAW,IAAI,IAA2B;CAChD,MAAM,8BAAc,IAAI,IAAgB;CAExC,IAAI,UAAU;CAEd,IAAI,eAAe;CAEnB,MAAM,eAAe;EACnB,KAAK,MAAM,YAAY,aAAa,SAAS;CAC/C;CAEA,MAAM,YAAY,SAAoC;EACpD,QAAQ;EACR,QAAQ,QAAQ;EAChB,OAAO;CACT;CAEA,MAAM,gBAAgB;EACpB,IAAI,WAAW,MAAM,WAAW,GAAG;EACnC,MAAM,OAAO,MAAM;EACnB,MAAM,UAAU,SAAS,IAAI,KAAK,EAAE;EACpC,SAAS,OAAO,KAAK,EAAE;EACvB,SAAS,MAAM,MAAM,CAAC,CAAC;EACvB,IAAI,CAAC,SAAS;EACd,UAAU;EACV,OAAO,IAAI,SAAS,EAAE,OAAO,MAAM,CAAC;CACtC;CAEA,MAAM,WAAW,SAAwB,EAAE,YAAgC;EACzE,MAAM,KAAK,WAAW;EACtB,MAAM,SAAS,qBAAqB,OAAO;EAC3C,SAAS,IAAI,IAAI,OAAO;EACxB,SAAS,CAAC,GAAG,OAAO;GAAE;GAAI;EAAO,CAAC,CAAC;EACnC,IAAI,OACF,UAAU,EAAE;OAEZ,QAAQ;CAEZ;CAEA,MAAM,aAAa,gBAAwB;EACzC,IAAI,CAAC,SAAS,IAAI,WAAW,GAAG;EAEhC,IAAI,OAAO,UAAU,SAAS;GAC5B,MAAM,UAAU,SAAS,IAAI,WAAW;GACxC,SAAS,OAAO,WAAW;GAC3B,SAAS,MAAM,QAAQ,SAAS,KAAK,OAAO,WAAW,CAAC;GACxD;GACA,OAAO,OAAO;GACd,UAAU;GACV,OAAO,IAAI,SAAS,EAAE,OAAO,KAAK,CAAC;GACnC;EACF;EAEA,MAAM,SAAS,MAAM,MAAM,SAAS,KAAK,OAAO,WAAW;EAC3D,IAAI,CAAC,QAAQ;EACb,SAAS,CAAC,QAAQ,GAAG,MAAM,QAAQ,SAAS,KAAK,OAAO,WAAW,CAAC,CAAC;EACrE,QAAQ;CACV;CAEA,MAAM,UAAU,gBAAwB;EACtC,IAAI,CAAC,SAAS,OAAO,WAAW,GAAG;EACnC,SAAS,MAAM,QAAQ,SAAS,KAAK,OAAO,WAAW,CAAC;CAC1D;CAEA,MAAM,cAAc;EAClB,IAAI,MAAM,WAAW,GAAG;EACxB,SAAS,MAAM;EACf,SAAS,iBAAiB;CAC5B;CAEA,MAAM,UAAsC;EAC1C;EACA;EACA,OAAO;EACP;EACA;CACF;CAEA,OAAO;EACL;EACA,kBAAkB;GAChB,UAAU;EACZ;EACA,kBAAkB;GAChB,IAAI,eAAe,GAAG;IACpB;IACA;GACF;GACA,UAAU;GACV,QAAQ;EACV;EACA,YAAY,aAAa;GACvB,YAAY,IAAI,QAAQ;GACxB,aAAa;IACX,YAAY,OAAO,QAAQ;GAC7B;EACF;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-repository.js","names":[],"sources":["../../../src/runtime/utils/message-repository.ts"],"sourcesContent":["import type { ThreadMessage } from \"../../types/message\";\nimport type { RunConfig } from \"../../types/message\";\nimport { generateId } from \"../../utils/id\";\nimport type { ThreadMessageLike } from \"./thread-message-like\";\nimport { getAutoStatus } from \"./auto-status\";\nimport { fromThreadMessageLike } from \"./thread-message-like\";\n\nexport type ExportedMessageRepositoryItem = {\n message: ThreadMessage;\n parentId: string | null;\n runConfig?: RunConfig;\n};\n\nexport type ExportedMessageRepository = {\n headId?: string | null;\n messages: Array<{\n message: ThreadMessage;\n parentId: string | null;\n runConfig?: RunConfig;\n }>;\n};\n\nexport const ExportedMessageRepository = {\n fromArray: (\n messages: readonly ThreadMessageLike[],\n ): ExportedMessageRepository => {\n const conv = messages.map((m) =>\n fromThreadMessageLike(\n m,\n generateId(),\n getAutoStatus(false, false, false, false, undefined),\n ),\n );\n\n return {\n messages: conv.map((m, idx) => ({\n parentId: idx > 0 ? conv[idx - 1]!.id : null,\n message: m,\n })),\n };\n },\n\n fromBranchableArray: (\n items: readonly {\n message: ThreadMessageLike;\n parentId: string | null;\n }[],\n options?: { headId?: string | null },\n ): ExportedMessageRepository => {\n const fallbackStatus = getAutoStatus(false, false, false, false, undefined);\n return {\n ...(options?.headId !== undefined\n ? { headId: options.headId }\n : undefined),\n messages: items.map(({ message, parentId }) => {\n if (!message.id) {\n throw new Error(\n \"ExportedMessageRepository.fromBranchableArray: Each message must have an 'id' field set.\",\n );\n }\n return {\n parentId,\n message: fromThreadMessageLike(message, message.id, fallbackStatus),\n };\n }),\n };\n },\n};\n\ntype RepositoryParent = {\n children: string[];\n next: RepositoryMessage | null;\n};\n\ntype RepositoryMessage = RepositoryParent & {\n prev: RepositoryMessage | null;\n current: ThreadMessage;\n level: number;\n};\n\nconst findHead = (\n message: RepositoryMessage | RepositoryParent,\n): RepositoryMessage | null => {\n if (message.next) return findHead(message.next);\n if (\"current\" in message) return message;\n return null;\n};\n\nclass CachedValue<T> {\n private _value: T | null = null;\n\n constructor(private func: () => T) {}\n\n get value() {\n if (this._value === null) {\n this._value = this.func();\n }\n return this._value;\n }\n\n dirty() {\n this._value = null;\n }\n}\n\nexport class MessageRepository {\n private messages = new Map<string, RepositoryMessage>();\n private head: RepositoryMessage | null = null;\n private root: RepositoryParent = {\n children: [],\n next: null,\n };\n\n private updateLevels(message: RepositoryMessage, newLevel: number) {\n message.level = newLevel;\n for (const childId of message.children) {\n const childMessage = this.messages.get(childId);\n if (childMessage) {\n this.updateLevels(childMessage, newLevel + 1);\n }\n }\n }\n\n private performOp(\n newParent: RepositoryMessage | null,\n child: RepositoryMessage,\n operation: \"cut\" | \"link\" | \"relink\",\n ) {\n const parentOrRoot = child.prev ?? this.root;\n const newParentOrRoot = newParent ?? this.root;\n\n if (operation === \"relink\" && parentOrRoot === newParentOrRoot) return;\n\n if (operation !== \"link\") {\n parentOrRoot.children = parentOrRoot.children.filter(\n (m) => m !== child.current.id,\n );\n\n if (parentOrRoot.next === child) {\n const fallbackId = parentOrRoot.children.at(-1);\n const fallback = fallbackId ? this.messages.get(fallbackId) : null;\n if (fallback === undefined) {\n throw new Error(\n \"MessageRepository(performOp/cut): Fallback sibling message not found. This is likely an internal bug in assistant-ui.\",\n );\n }\n parentOrRoot.next = fallback;\n }\n }\n\n if (operation !== \"cut\") {\n for (\n let current: RepositoryMessage | null = newParent;\n current;\n current = current.prev\n ) {\n if (current.current.id === child.current.id) {\n throw new Error(\n \"MessageRepository(performOp/link): A message with the same id already exists in the parent tree. This error occurs if the same message id is found multiple times. This is likely an internal bug in assistant-ui.\",\n );\n }\n }\n\n newParentOrRoot.children = [\n ...newParentOrRoot.children,\n child.current.id,\n ];\n\n if (findHead(child) === this.head || newParentOrRoot.next === null) {\n newParentOrRoot.next = child;\n }\n\n child.prev = newParent;\n\n const newLevel = newParent ? newParent.level + 1 : 0;\n this.updateLevels(child, newLevel);\n }\n }\n\n private _messages = new CachedValue<readonly ThreadMessage[]>(() => {\n const messages = new Array<ThreadMessage>((this.head?.level ?? -1) + 1);\n for (let current = this.head; current; current = current.prev) {\n messages[current.level] = current.current;\n }\n return messages;\n });\n\n get headId() {\n return this.head?.current.id ?? null;\n }\n\n getMessages(headId?: string) {\n if (headId === undefined || headId === this.head?.current.id) {\n return this._messages.value;\n }\n\n const headMessage = this.messages.get(headId);\n if (!headMessage) {\n throw new Error(\n \"MessageRepository(getMessages): Head message not found. This is likely an internal bug in assistant-ui.\",\n );\n }\n\n const messages = new Array<ThreadMessage>(headMessage.level + 1);\n for (\n let current: RepositoryMessage | null = headMessage;\n current;\n current = current.prev\n ) {\n messages[current.level] = current.current;\n }\n return messages;\n }\n\n addOrUpdateMessage(parentId: string | null, message: ThreadMessage) {\n const existingItem = this.messages.get(message.id);\n const prev = parentId ? this.messages.get(parentId) : null;\n if (prev === undefined)\n throw new Error(\n \"MessageRepository(addOrUpdateMessage): Parent message not found. This is likely an internal bug in assistant-ui.\",\n );\n\n if (existingItem) {\n existingItem.current = message;\n this.performOp(prev, existingItem, \"relink\");\n this._messages.dirty();\n return;\n }\n\n const newItem: RepositoryMessage = {\n prev,\n current: message,\n next: null,\n children: [],\n level: prev ? prev.level + 1 : 0,\n };\n\n this.messages.set(message.id, newItem);\n this.performOp(prev, newItem, \"link\");\n\n if (this.head === prev) {\n this.head = newItem;\n }\n\n this._messages.dirty();\n }\n\n getMessage(messageId: string) {\n const message = this.messages.get(messageId);\n if (!message)\n throw new Error(\n \"MessageRepository(updateMessage): Message not found. This is likely an internal bug in assistant-ui.\",\n );\n\n return {\n parentId: message.prev?.current.id ?? null,\n message: message.current,\n index: message.level,\n };\n }\n\n deleteMessage(messageId: string, replacementId?: string | null | undefined) {\n const message = this.messages.get(messageId);\n\n if (!message)\n throw new Error(\n \"MessageRepository(deleteMessage): Message not found. This is likely an internal bug in assistant-ui.\",\n );\n\n const replacement =\n replacementId === undefined\n ? message.prev\n : replacementId === null\n ? null\n : this.messages.get(replacementId);\n if (replacement === undefined)\n throw new Error(\n \"MessageRepository(deleteMessage): Replacement not found. This is likely an internal bug in assistant-ui.\",\n );\n\n for (const child of message.children) {\n const childMessage = this.messages.get(child);\n if (!childMessage)\n throw new Error(\n \"MessageRepository(deleteMessage): Child message not found. This is likely an internal bug in assistant-ui.\",\n );\n this.performOp(replacement, childMessage, \"relink\");\n }\n\n this.performOp(null, message, \"cut\");\n this.messages.delete(messageId);\n\n if (this.head === message) {\n this.head = findHead(replacement ?? this.root);\n }\n\n this._messages.dirty();\n }\n\n getBranches(messageId: string) {\n const message = this.messages.get(messageId);\n if (!message)\n throw new Error(\n \"MessageRepository(getBranches): Message not found. This is likely an internal bug in assistant-ui.\",\n );\n\n const { children } = message.prev ?? this.root;\n return children;\n }\n\n /**\n * Evicts optimistic messages (`metadata.isOptimistic`) the head just moved\n * away from. Since eviction runs on every head move, the only optimistic\n * messages in the repository live on the branch the head previously pointed\n * at — so we walk just that branch rather than the whole repository. Keeps a\n * client→server id swap from leaving a phantom sibling, and drops off-branch\n * placeholders.\n */\n private evictOffBranchOptimisticMessages(\n previousHead: RepositoryMessage | null,\n currentHead: RepositoryMessage | null,\n ) {\n if (!previousHead) return;\n\n const onHeadBranch = new Set<string>();\n for (let current = currentHead; current; current = current.prev) {\n onHeadBranch.add(current.current.id);\n }\n\n const stale: string[] = [];\n for (\n let current: RepositoryMessage | null = previousHead;\n current;\n current = current.prev\n ) {\n // Stop at the first node shared with the current head branch: every\n // ancestor above it is shared too, so nothing further can be off-branch.\n if (onHeadBranch.has(current.current.id)) break;\n if (current.current.metadata?.isOptimistic) {\n stale.push(current.current.id);\n }\n }\n\n for (const id of stale) {\n // A prior deletion may have already removed this node.\n if (this.messages.has(id)) this.deleteMessage(id);\n }\n }\n\n switchToBranch(messageId: string) {\n const message = this.messages.get(messageId);\n if (!message)\n throw new Error(\n \"MessageRepository(switchToBranch): Branch not found. This is likely an internal bug in assistant-ui.\",\n );\n\n const previousHead = this.head;\n const prevOrRoot = message.prev ?? this.root;\n prevOrRoot.next = message;\n\n this.head = findHead(message);\n\n this.evictOffBranchOptimisticMessages(previousHead, this.head);\n\n this._messages.dirty();\n }\n\n resetHead(messageId: string | null) {\n if (messageId === null) {\n this.clear();\n return;\n }\n\n const message = this.messages.get(messageId);\n if (!message)\n throw new Error(\n \"MessageRepository(resetHead): Branch not found. This is likely an internal bug in assistant-ui.\",\n );\n\n const previousHead = this.head;\n\n if (message.children.length > 0) {\n const deleteDescendants = (msg: RepositoryMessage) => {\n for (const childId of msg.children) {\n const childMessage = this.messages.get(childId);\n if (childMessage) {\n deleteDescendants(childMessage);\n this.messages.delete(childId);\n }\n }\n };\n deleteDescendants(message);\n\n message.children = [];\n message.next = null;\n }\n\n this.head = message;\n for (\n let current: RepositoryMessage | null = message;\n current;\n current = current.prev\n ) {\n if (current.prev) {\n current.prev.next = current;\n } else {\n this.root.next = current;\n }\n }\n\n this.evictOffBranchOptimisticMessages(previousHead, this.head);\n\n this._messages.dirty();\n }\n\n clear(): void {\n this.messages.clear();\n this.head = null;\n this.root = {\n children: [],\n next: null,\n };\n this._messages.dirty();\n }\n\n export(): ExportedMessageRepository {\n const exportItems: ExportedMessageRepository[\"messages\"] = [];\n\n // Optimistic messages are ephemeral and never persisted. They're always\n // leaf nodes, so skipping them can't orphan a persisted child.\n for (const [, message] of this.messages) {\n if (message.current.metadata?.isOptimistic) continue;\n exportItems.push({\n message: message.current,\n parentId: message.prev?.current.id ?? null,\n });\n }\n\n // The head may itself be optimistic; walk up to the nearest persisted ancestor.\n let head = this.head;\n while (head?.current.metadata?.isOptimistic) {\n head = head.prev;\n }\n\n return {\n headId: head?.current.id ?? null,\n messages: exportItems,\n };\n }\n\n import({ headId, messages }: ExportedMessageRepository) {\n for (const { message, parentId } of messages) {\n this.addOrUpdateMessage(parentId, message);\n }\n\n this.resetHead(headId ?? messages.at(-1)?.message.id ?? null);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"message-repository.js","names":[],"sources":["../../../src/runtime/utils/message-repository.ts"],"sourcesContent":["import type { ThreadMessage } from \"../../types/message\";\nimport type { RunConfig } from \"../../types/message\";\nimport { generateId } from \"../../utils/id\";\nimport type { ThreadMessageLike } from \"./thread-message-like\";\nimport { getAutoStatus } from \"./auto-status\";\nimport { fromThreadMessageLike } from \"./thread-message-like\";\n\nexport type ExportedMessageRepositoryItem = {\n message: ThreadMessage;\n parentId: string | null;\n runConfig?: RunConfig;\n};\n\nexport type ExportedMessageRepository = {\n headId?: string | null;\n messages: Array<{\n message: ThreadMessage;\n parentId: string | null;\n runConfig?: RunConfig;\n }>;\n};\n\nexport const ExportedMessageRepository = {\n fromArray: (\n messages: readonly ThreadMessageLike[],\n ): ExportedMessageRepository => {\n const conv = messages.map((m) =>\n fromThreadMessageLike(\n m,\n generateId(),\n getAutoStatus(false, false, false, false, undefined),\n ),\n );\n\n return {\n messages: conv.map((m, idx) => ({\n parentId: idx > 0 ? conv[idx - 1]!.id : null,\n message: m,\n })),\n };\n },\n\n fromBranchableArray: (\n items: readonly {\n message: ThreadMessageLike;\n parentId: string | null;\n }[],\n options?: { headId?: string | null },\n ): ExportedMessageRepository => {\n const fallbackStatus = getAutoStatus(false, false, false, false, undefined);\n return {\n ...(options?.headId !== undefined\n ? { headId: options.headId }\n : undefined),\n messages: items.map(({ message, parentId }) => {\n if (!message.id) {\n throw new Error(\n \"ExportedMessageRepository.fromBranchableArray: Each message must have an 'id' field set.\",\n );\n }\n return {\n parentId,\n message: fromThreadMessageLike(message, message.id, fallbackStatus),\n };\n }),\n };\n },\n};\n\ntype RepositoryParent = {\n children: string[];\n next: RepositoryMessage | null;\n};\n\ntype RepositoryMessage = RepositoryParent & {\n prev: RepositoryMessage | null;\n current: ThreadMessage;\n level: number;\n};\n\nconst findHead = (\n message: RepositoryMessage | RepositoryParent,\n): RepositoryMessage | null => {\n if (message.next) return findHead(message.next);\n if (\"current\" in message) return message;\n return null;\n};\n\nclass CachedValue<T> {\n private _value: T | null = null;\n\n constructor(private func: () => T) {}\n\n get value() {\n if (this._value === null) {\n this._value = this.func();\n }\n return this._value;\n }\n\n dirty() {\n this._value = null;\n }\n}\n\nexport class MessageRepository {\n private messages = new Map<string, RepositoryMessage>();\n private head: RepositoryMessage | null = null;\n private root: RepositoryParent = {\n children: [],\n next: null,\n };\n\n private updateLevels(message: RepositoryMessage, newLevel: number) {\n message.level = newLevel;\n for (const childId of message.children) {\n const childMessage = this.messages.get(childId);\n if (childMessage) {\n this.updateLevels(childMessage, newLevel + 1);\n }\n }\n }\n\n private performOp(\n newParent: RepositoryMessage | null,\n child: RepositoryMessage,\n operation: \"cut\" | \"link\" | \"relink\",\n ) {\n const parentOrRoot = child.prev ?? this.root;\n const newParentOrRoot = newParent ?? this.root;\n\n if (operation === \"relink\" && parentOrRoot === newParentOrRoot) return;\n\n if (operation !== \"link\") {\n parentOrRoot.children = parentOrRoot.children.filter(\n (m) => m !== child.current.id,\n );\n\n if (parentOrRoot.next === child) {\n const fallbackId = parentOrRoot.children.at(-1);\n const fallback = fallbackId ? this.messages.get(fallbackId) : null;\n if (fallback === undefined) {\n throw new Error(\n \"MessageRepository(performOp/cut): Fallback sibling message not found. This is likely an internal bug in assistant-ui.\",\n );\n }\n parentOrRoot.next = fallback;\n }\n }\n\n if (operation !== \"cut\") {\n for (\n let current: RepositoryMessage | null = newParent;\n current;\n current = current.prev\n ) {\n if (current.current.id === child.current.id) {\n throw new Error(\n \"MessageRepository(performOp/link): A message with the same id already exists in the parent tree. This error occurs if the same message id is found multiple times. This is likely an internal bug in assistant-ui.\",\n );\n }\n }\n\n newParentOrRoot.children = [\n ...newParentOrRoot.children,\n child.current.id,\n ];\n\n if (findHead(child) === this.head || newParentOrRoot.next === null) {\n newParentOrRoot.next = child;\n }\n\n child.prev = newParent;\n\n const newLevel = newParent ? newParent.level + 1 : 0;\n this.updateLevels(child, newLevel);\n }\n }\n\n private _messages = new CachedValue<readonly ThreadMessage[]>(() => {\n const messages = new Array<ThreadMessage>((this.head?.level ?? -1) + 1);\n for (let current = this.head; current; current = current.prev) {\n messages[current.level] = current.current;\n }\n return messages;\n });\n\n get headId() {\n return this.head?.current.id ?? null;\n }\n\n getMessages(headId?: string) {\n if (headId === undefined || headId === this.head?.current.id) {\n return this._messages.value;\n }\n\n const headMessage = this.messages.get(headId);\n if (!headMessage) {\n throw new Error(\n \"MessageRepository(getMessages): Head message not found. This is likely an internal bug in assistant-ui.\",\n );\n }\n\n const messages = new Array<ThreadMessage>(headMessage.level + 1);\n for (\n let current: RepositoryMessage | null = headMessage;\n current;\n current = current.prev\n ) {\n messages[current.level] = current.current;\n }\n return messages;\n }\n\n addOrUpdateMessage(parentId: string | null, message: ThreadMessage) {\n const existingItem = this.messages.get(message.id);\n const prev = parentId ? this.messages.get(parentId) : null;\n if (prev === undefined)\n throw new Error(\n \"MessageRepository(addOrUpdateMessage): Parent message not found. This is likely an internal bug in assistant-ui.\",\n );\n\n if (existingItem) {\n existingItem.current = message;\n this.performOp(prev, existingItem, \"relink\");\n this._messages.dirty();\n return;\n }\n\n const newItem: RepositoryMessage = {\n prev,\n current: message,\n next: null,\n children: [],\n level: prev ? prev.level + 1 : 0,\n };\n\n this.messages.set(message.id, newItem);\n this.performOp(prev, newItem, \"link\");\n\n if (this.head === prev) {\n this.head = newItem;\n }\n\n this._messages.dirty();\n }\n\n getMessage(messageId: string) {\n const message = this.messages.get(messageId);\n if (!message)\n throw new Error(\n \"MessageRepository(updateMessage): Message not found. This is likely an internal bug in assistant-ui.\",\n );\n\n return {\n parentId: message.prev?.current.id ?? null,\n message: message.current,\n index: message.level,\n };\n }\n\n deleteMessage(messageId: string, replacementId?: string | null | undefined) {\n const message = this.messages.get(messageId);\n\n if (!message)\n throw new Error(\n \"MessageRepository(deleteMessage): Message not found. This is likely an internal bug in assistant-ui.\",\n );\n\n const replacement =\n replacementId === undefined\n ? message.prev\n : replacementId === null\n ? null\n : this.messages.get(replacementId);\n if (replacement === undefined)\n throw new Error(\n \"MessageRepository(deleteMessage): Replacement not found. This is likely an internal bug in assistant-ui.\",\n );\n\n for (const child of message.children) {\n const childMessage = this.messages.get(child);\n if (!childMessage)\n throw new Error(\n \"MessageRepository(deleteMessage): Child message not found. This is likely an internal bug in assistant-ui.\",\n );\n this.performOp(replacement, childMessage, \"relink\");\n }\n\n this.performOp(null, message, \"cut\");\n this.messages.delete(messageId);\n\n if (this.head === message) {\n this.head = findHead(replacement ?? this.root);\n }\n\n this._messages.dirty();\n }\n\n getBranches(messageId: string) {\n const message = this.messages.get(messageId);\n if (!message)\n throw new Error(\n \"MessageRepository(getBranches): Message not found. This is likely an internal bug in assistant-ui.\",\n );\n\n const { children } = message.prev ?? this.root;\n return children;\n }\n\n /**\n * Evicts optimistic messages (`metadata.isOptimistic`) the head just moved\n * away from. Since eviction runs on every head move, the only optimistic\n * messages in the repository live on the branch the head previously pointed\n * at — so we walk just that branch rather than the whole repository. Keeps a\n * client→server id swap from leaving a phantom sibling, and drops off-branch\n * placeholders.\n */\n private evictOffBranchOptimisticMessages(\n previousHead: RepositoryMessage | null,\n currentHead: RepositoryMessage | null,\n ) {\n if (!previousHead) return;\n\n const onHeadBranch = new Set<string>();\n for (let current = currentHead; current; current = current.prev) {\n onHeadBranch.add(current.current.id);\n }\n\n const stale: string[] = [];\n for (\n let current: RepositoryMessage | null = previousHead;\n current;\n current = current.prev\n ) {\n // Stop at the first node shared with the current head branch: every\n // ancestor above it is shared too, so nothing further can be off-branch.\n if (onHeadBranch.has(current.current.id)) break;\n if (current.current.metadata?.isOptimistic) {\n stale.push(current.current.id);\n }\n }\n\n for (const id of stale) {\n // A prior deletion may have already removed this node.\n if (this.messages.has(id)) this.deleteMessage(id);\n }\n }\n\n switchToBranch(messageId: string) {\n const message = this.messages.get(messageId);\n if (!message)\n throw new Error(\n \"MessageRepository(switchToBranch): Branch not found. This is likely an internal bug in assistant-ui.\",\n );\n\n const previousHead = this.head;\n const prevOrRoot = message.prev ?? this.root;\n prevOrRoot.next = message;\n\n this.head = findHead(message);\n\n this.evictOffBranchOptimisticMessages(previousHead, this.head);\n\n this._messages.dirty();\n }\n\n resetHead(messageId: string | null) {\n if (messageId === null) {\n this.clear();\n return;\n }\n\n const message = this.messages.get(messageId);\n if (!message)\n throw new Error(\n \"MessageRepository(resetHead): Branch not found. This is likely an internal bug in assistant-ui.\",\n );\n\n const previousHead = this.head;\n\n if (message.children.length > 0) {\n const deleteDescendants = (msg: RepositoryMessage) => {\n for (const childId of msg.children) {\n const childMessage = this.messages.get(childId);\n if (childMessage) {\n deleteDescendants(childMessage);\n this.messages.delete(childId);\n }\n }\n };\n deleteDescendants(message);\n\n message.children = [];\n message.next = null;\n }\n\n this.head = message;\n for (\n let current: RepositoryMessage | null = message;\n current;\n current = current.prev\n ) {\n if (current.prev) {\n current.prev.next = current;\n } else {\n this.root.next = current;\n }\n }\n\n this.evictOffBranchOptimisticMessages(previousHead, this.head);\n\n this._messages.dirty();\n }\n\n clear(): void {\n this.messages.clear();\n this.head = null;\n this.root = {\n children: [],\n next: null,\n };\n this._messages.dirty();\n }\n\n export(): ExportedMessageRepository {\n const exportItems: ExportedMessageRepository[\"messages\"] = [];\n\n // Optimistic messages are ephemeral and never persisted. They're always\n // leaf nodes, so skipping them can't orphan a persisted child.\n for (const [, message] of this.messages) {\n if (message.current.metadata?.isOptimistic) continue;\n exportItems.push({\n message: message.current,\n parentId: message.prev?.current.id ?? null,\n });\n }\n\n // The head may itself be optimistic; walk up to the nearest persisted ancestor.\n let head = this.head;\n while (head?.current.metadata?.isOptimistic) {\n head = head.prev;\n }\n\n return {\n headId: head?.current.id ?? null,\n messages: exportItems,\n };\n }\n\n import({ headId, messages }: ExportedMessageRepository) {\n for (const { message, parentId } of messages) {\n this.addOrUpdateMessage(parentId, message);\n }\n\n this.resetHead(headId ?? messages.at(-1)?.message.id ?? null);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-message-like.js","names":["unsupportedRole"],"sources":["../../../src/runtime/utils/thread-message-like.ts"],"sourcesContent":["import { parsePartialJsonObject } from \"assistant-stream/utils\";\nimport { generateId } from \"../../utils/id\";\nimport type {\n ReasoningMessagePart,\n SourceMessagePart,\n ThreadStep,\n MessageStatus,\n ImageMessagePart,\n ThreadMessage,\n ThreadAssistantMessagePart,\n ThreadAssistantMessage,\n ThreadUserMessagePart,\n ThreadUserMessage,\n ThreadSystemMessage,\n FileMessagePart,\n DataMessagePart,\n GenerativeUIMessagePart,\n Unstable_AudioMessagePart,\n} from \"../../types/message\";\nimport type { CompleteAttachment } from \"../../types/attachment\";\nimport type { MessageTiming, TextMessagePart } from \"../../types/message\";\nimport type {\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n} from \"assistant-stream/utils\";\n\ntype DataPrefixedPart = {\n readonly type: `data-${string}`;\n readonly data: any;\n};\n\nexport type ThreadMessageLike = {\n readonly role: \"assistant\" | \"user\" | \"system\";\n readonly content:\n | string\n | readonly (\n | TextMessagePart\n | ReasoningMessagePart\n | SourceMessagePart\n | ImageMessagePart\n | FileMessagePart\n | DataMessagePart\n | GenerativeUIMessagePart\n | Unstable_AudioMessagePart\n | DataPrefixedPart\n | {\n readonly type: \"tool-call\";\n readonly toolCallId?: string;\n readonly toolName: string;\n readonly args?: ReadonlyJSONObject;\n readonly argsText?: string;\n readonly artifact?: any;\n readonly result?: any | undefined;\n readonly isError?: boolean | undefined;\n readonly parentId?: string | undefined;\n readonly messages?: readonly ThreadMessage[] | undefined;\n readonly interrupt?: { type: \"human\"; payload: unknown };\n readonly approval?: {\n readonly id: string;\n readonly approved?: boolean;\n readonly reason?: string;\n readonly isAutomatic?: boolean;\n };\n }\n )[];\n readonly id?: string | undefined;\n readonly createdAt?: Date | undefined;\n readonly status?: MessageStatus | undefined;\n readonly attachments?:\n | readonly (Omit<CompleteAttachment, \"content\"> & {\n readonly content: readonly (ThreadUserMessagePart | DataPrefixedPart)[];\n })[]\n | undefined;\n readonly metadata?:\n | {\n readonly unstable_state?: ReadonlyJSONValue;\n readonly unstable_annotations?:\n | readonly ReadonlyJSONValue[]\n | undefined;\n readonly unstable_data?: readonly ReadonlyJSONValue[] | undefined;\n readonly steps?: readonly ThreadStep[] | undefined;\n readonly timing?: MessageTiming | undefined;\n readonly submittedFeedback?: { readonly type: \"positive\" | \"negative\" };\n readonly isOptimistic?: boolean | undefined;\n readonly custom?: Record<string, unknown> | undefined;\n }\n | undefined;\n};\n\nconst convertDataPrefixedPart = (\n type: string,\n data: unknown,\n): DataMessagePart | undefined => {\n if (!type.startsWith(\"data-\")) return undefined;\n return { type: \"data\", name: type.substring(5), data };\n};\n\nexport const fromThreadMessageLike = (\n like: ThreadMessageLike,\n fallbackId: string,\n fallbackStatus: MessageStatus,\n): ThreadMessage => {\n const { role, id, createdAt, attachments, status, metadata } = like;\n const common = {\n id: id ?? fallbackId,\n createdAt: createdAt ?? new Date(),\n };\n\n const content =\n typeof like.content === \"string\"\n ? [{ type: \"text\" as const, text: like.content }]\n : like.content;\n\n const sanitizeImageContent = ({\n image,\n ...rest\n }: ImageMessagePart): ImageMessagePart | null => {\n const dataUri = image.match(\n /^data:image\\/(png|jpeg|jpg|gif|webp|svg\\+xml);base64,(.*)$/,\n );\n if (dataUri) {\n return { ...rest, image };\n }\n if (/^(https:\\/\\/|blob:)/.test(image)) {\n return { ...rest, image };\n }\n console.warn(`Invalid image data format detected`);\n return null;\n };\n\n if (role !== \"user\" && attachments?.length)\n throw new Error(\"attachments are only supported for user messages\");\n\n if (role !== \"assistant\" && status)\n throw new Error(\"status is only supported for assistant messages\");\n\n if (role !== \"assistant\" && metadata?.steps)\n throw new Error(\"metadata.steps is only supported for assistant messages\");\n\n switch (role) {\n case \"assistant\":\n return {\n ...common,\n role,\n content: content\n .map((part): ThreadAssistantMessagePart | null => {\n const type = part.type;\n switch (type) {\n case \"text\":\n case \"reasoning\":\n if (part.text.trim().length === 0) return null;\n return part;\n\n case \"file\":\n case \"source\":\n return part;\n\n case \"image\":\n return sanitizeImageContent(part);\n\n case \"data\":\n return part;\n\n case \"generative-ui\":\n return part;\n\n case \"tool-call\": {\n const { parentId, messages, ...basePart } = part;\n const commonProps = {\n ...basePart,\n toolCallId: part.toolCallId ?? `tool-${generateId()}`,\n ...(parentId !== undefined && { parentId }),\n ...(messages !== undefined && { messages }),\n };\n\n if (part.args) {\n return {\n ...commonProps,\n args: part.args,\n argsText: part.argsText ?? JSON.stringify(part.args),\n };\n }\n return {\n ...commonProps,\n args: parsePartialJsonObject(part.argsText ?? \"\") ?? {},\n argsText: part.argsText ?? \"\",\n };\n }\n\n default: {\n const converted = convertDataPrefixedPart(\n type,\n (part as DataPrefixedPart).data,\n );\n if (converted) return converted;\n throw new Error(\n `Unsupported assistant message part type: ${type}`,\n );\n }\n }\n })\n .filter((c) => !!c),\n status: status ?? fallbackStatus,\n metadata: {\n unstable_state: metadata?.unstable_state ?? null,\n unstable_annotations: metadata?.unstable_annotations ?? [],\n unstable_data: metadata?.unstable_data ?? [],\n custom: metadata?.custom ?? {},\n steps: metadata?.steps ?? [],\n ...(metadata?.timing && { timing: metadata.timing }),\n ...(metadata?.submittedFeedback && {\n submittedFeedback: metadata.submittedFeedback,\n }),\n ...(metadata?.isOptimistic && { isOptimistic: true }),\n },\n } satisfies ThreadAssistantMessage;\n\n case \"user\":\n return {\n ...common,\n role,\n content: content.map((part): ThreadUserMessagePart => {\n const type = part.type;\n switch (type) {\n case \"text\":\n case \"image\":\n case \"audio\":\n case \"file\":\n case \"data\":\n return part;\n\n default: {\n const converted = convertDataPrefixedPart(\n type,\n (part as DataPrefixedPart).data,\n );\n if (converted) return converted;\n throw new Error(`Unsupported user message part type: ${type}`);\n }\n }\n }),\n attachments: (attachments ?? []).map((att) => ({\n ...att,\n content: att.content.map((part): ThreadUserMessagePart => {\n const converted = convertDataPrefixedPart(\n part.type,\n (part as DataPrefixedPart).data,\n );\n return converted ?? (part as ThreadUserMessagePart);\n }),\n })),\n metadata: {\n custom: metadata?.custom ?? {},\n },\n } satisfies ThreadUserMessage;\n\n case \"system\":\n if (content.length !== 1 || content[0]!.type !== \"text\")\n throw new Error(\n \"System messages must have exactly one text message part.\",\n );\n\n return {\n ...common,\n role,\n content: content as [TextMessagePart],\n metadata: {\n custom: metadata?.custom ?? {},\n },\n } satisfies ThreadSystemMessage;\n\n default: {\n const unsupportedRole: never = role;\n throw new Error(`Unknown message role: ${unsupportedRole}`);\n }\n }\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"thread-message-like.js","names":["unsupportedRole"],"sources":["../../../src/runtime/utils/thread-message-like.ts"],"sourcesContent":["import { parsePartialJsonObject } from \"assistant-stream/utils\";\nimport { generateId } from \"../../utils/id\";\nimport type {\n ReasoningMessagePart,\n SourceMessagePart,\n ThreadStep,\n MessageStatus,\n ImageMessagePart,\n ThreadMessage,\n ThreadAssistantMessagePart,\n ThreadAssistantMessage,\n ThreadUserMessagePart,\n ThreadUserMessage,\n ThreadSystemMessage,\n FileMessagePart,\n DataMessagePart,\n GenerativeUIMessagePart,\n Unstable_AudioMessagePart,\n} from \"../../types/message\";\nimport type { CompleteAttachment } from \"../../types/attachment\";\nimport type { MessageTiming, TextMessagePart } from \"../../types/message\";\nimport type {\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n} from \"assistant-stream/utils\";\n\ntype DataPrefixedPart = {\n readonly type: `data-${string}`;\n readonly data: any;\n};\n\nexport type ThreadMessageLike = {\n readonly role: \"assistant\" | \"user\" | \"system\";\n readonly content:\n | string\n | readonly (\n | TextMessagePart\n | ReasoningMessagePart\n | SourceMessagePart\n | ImageMessagePart\n | FileMessagePart\n | DataMessagePart\n | GenerativeUIMessagePart\n | Unstable_AudioMessagePart\n | DataPrefixedPart\n | {\n readonly type: \"tool-call\";\n readonly toolCallId?: string;\n readonly toolName: string;\n readonly args?: ReadonlyJSONObject;\n readonly argsText?: string;\n readonly artifact?: any;\n readonly result?: any | undefined;\n readonly isError?: boolean | undefined;\n readonly parentId?: string | undefined;\n readonly messages?: readonly ThreadMessage[] | undefined;\n readonly interrupt?: { type: \"human\"; payload: unknown };\n readonly approval?: {\n readonly id: string;\n readonly approved?: boolean;\n readonly reason?: string;\n readonly isAutomatic?: boolean;\n };\n }\n )[];\n readonly id?: string | undefined;\n readonly createdAt?: Date | undefined;\n readonly status?: MessageStatus | undefined;\n readonly attachments?:\n | readonly (Omit<CompleteAttachment, \"content\"> & {\n readonly content: readonly (ThreadUserMessagePart | DataPrefixedPart)[];\n })[]\n | undefined;\n readonly metadata?:\n | {\n readonly unstable_state?: ReadonlyJSONValue;\n readonly unstable_annotations?:\n | readonly ReadonlyJSONValue[]\n | undefined;\n readonly unstable_data?: readonly ReadonlyJSONValue[] | undefined;\n readonly steps?: readonly ThreadStep[] | undefined;\n readonly timing?: MessageTiming | undefined;\n readonly submittedFeedback?: { readonly type: \"positive\" | \"negative\" };\n readonly isOptimistic?: boolean | undefined;\n readonly custom?: Record<string, unknown> | undefined;\n }\n | undefined;\n};\n\nconst convertDataPrefixedPart = (\n type: string,\n data: unknown,\n): DataMessagePart | undefined => {\n if (!type.startsWith(\"data-\")) return undefined;\n return { type: \"data\", name: type.substring(5), data };\n};\n\nexport const fromThreadMessageLike = (\n like: ThreadMessageLike,\n fallbackId: string,\n fallbackStatus: MessageStatus,\n): ThreadMessage => {\n const { role, id, createdAt, attachments, status, metadata } = like;\n const common = {\n id: id ?? fallbackId,\n createdAt: createdAt ?? new Date(),\n };\n\n const content =\n typeof like.content === \"string\"\n ? [{ type: \"text\" as const, text: like.content }]\n : like.content;\n\n const sanitizeImageContent = ({\n image,\n ...rest\n }: ImageMessagePart): ImageMessagePart | null => {\n const dataUri = image.match(\n /^data:image\\/(png|jpeg|jpg|gif|webp|svg\\+xml);base64,(.*)$/,\n );\n if (dataUri) {\n return { ...rest, image };\n }\n if (/^(https:\\/\\/|blob:)/.test(image)) {\n return { ...rest, image };\n }\n console.warn(`Invalid image data format detected`);\n return null;\n };\n\n if (role !== \"user\" && attachments?.length)\n throw new Error(\"attachments are only supported for user messages\");\n\n if (role !== \"assistant\" && status)\n throw new Error(\"status is only supported for assistant messages\");\n\n if (role !== \"assistant\" && metadata?.steps)\n throw new Error(\"metadata.steps is only supported for assistant messages\");\n\n switch (role) {\n case \"assistant\":\n return {\n ...common,\n role,\n content: content\n .map((part): ThreadAssistantMessagePart | null => {\n const type = part.type;\n switch (type) {\n case \"text\":\n case \"reasoning\":\n if (part.text.trim().length === 0) return null;\n return part;\n\n case \"file\":\n case \"source\":\n return part;\n\n case \"image\":\n return sanitizeImageContent(part);\n\n case \"data\":\n return part;\n\n case \"generative-ui\":\n return part;\n\n case \"tool-call\": {\n const { parentId, messages, ...basePart } = part;\n const commonProps = {\n ...basePart,\n toolCallId: part.toolCallId ?? `tool-${generateId()}`,\n ...(parentId !== undefined && { parentId }),\n ...(messages !== undefined && { messages }),\n };\n\n if (part.args) {\n return {\n ...commonProps,\n args: part.args,\n argsText: part.argsText ?? JSON.stringify(part.args),\n };\n }\n return {\n ...commonProps,\n args: parsePartialJsonObject(part.argsText ?? \"\") ?? {},\n argsText: part.argsText ?? \"\",\n };\n }\n\n default: {\n const converted = convertDataPrefixedPart(\n type,\n (part as DataPrefixedPart).data,\n );\n if (converted) return converted;\n throw new Error(\n `Unsupported assistant message part type: ${type}`,\n );\n }\n }\n })\n .filter((c) => !!c),\n status: status ?? fallbackStatus,\n metadata: {\n unstable_state: metadata?.unstable_state ?? null,\n unstable_annotations: metadata?.unstable_annotations ?? [],\n unstable_data: metadata?.unstable_data ?? [],\n custom: metadata?.custom ?? {},\n steps: metadata?.steps ?? [],\n ...(metadata?.timing && { timing: metadata.timing }),\n ...(metadata?.submittedFeedback && {\n submittedFeedback: metadata.submittedFeedback,\n }),\n ...(metadata?.isOptimistic && { isOptimistic: true }),\n },\n } satisfies ThreadAssistantMessage;\n\n case \"user\":\n return {\n ...common,\n role,\n content: content.map((part): ThreadUserMessagePart => {\n const type = part.type;\n switch (type) {\n case \"text\":\n case \"image\":\n case \"audio\":\n case \"file\":\n case \"data\":\n return part;\n\n default: {\n const converted = convertDataPrefixedPart(\n type,\n (part as DataPrefixedPart).data,\n );\n if (converted) return converted;\n throw new Error(`Unsupported user message part type: ${type}`);\n }\n }\n }),\n attachments: (attachments ?? []).map((att) => ({\n ...att,\n content: att.content.map((part): ThreadUserMessagePart => {\n const converted = convertDataPrefixedPart(\n part.type,\n (part as DataPrefixedPart).data,\n );\n return converted ?? (part as ThreadUserMessagePart);\n }),\n })),\n metadata: {\n custom: metadata?.custom ?? {},\n },\n } satisfies ThreadUserMessage;\n\n case \"system\":\n if (content.length !== 1 || content[0]!.type !== \"text\")\n throw new Error(\n \"System messages must have exactly one text message part.\",\n );\n\n return {\n ...common,\n role,\n content: content as [TextMessagePart],\n metadata: {\n custom: metadata?.custom ?? {},\n },\n } satisfies ThreadSystemMessage;\n\n default: {\n const unsupportedRole: never = role;\n throw new Error(`Unknown message role: ${unsupportedRole}`);\n }\n }\n};\n"],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import { ThreadMessageLike } from "../../runtime/utils/thread-message-like.js";
|
|
|
7
7
|
import { ExportedMessageRepository } from "../../runtime/utils/message-repository.js";
|
|
8
8
|
import { AddToolResultOptions, RespondToToolApprovalOptions, ResumeRunConfig, StartRunConfig, ThreadSuggestion } from "../../runtime/interfaces/thread-runtime-core.js";
|
|
9
9
|
import { ToolExecutionStatus } from "../tool-invocations/ToolInvocationTracker.js";
|
|
10
|
+
import { ExternalThreadQueueAdapter } from "../../runtime/queue/external-thread-queue-adapter.js";
|
|
10
11
|
import { ReadonlyJSONValue } from "assistant-stream/utils";
|
|
11
12
|
|
|
12
13
|
//#region src/runtimes/external-store/external-store-adapter.d.ts
|
|
@@ -80,7 +81,8 @@ type ExternalStoreAdapterBase<T> = {
|
|
|
80
81
|
onImport?: ((messages: readonly ThreadMessage[]) => void) | undefined;
|
|
81
82
|
onExportExternalState?: (() => any) | undefined;
|
|
82
83
|
onLoadExternalState?: ((state: any) => void) | undefined;
|
|
83
|
-
onNew: (message: AppendMessage) => Promise<void>;
|
|
84
|
+
onNew: (message: AppendMessage) => Promise<void>; /** Opt in to message queuing. Typically produced by `createMessageQueue`. */
|
|
85
|
+
queue?: ExternalThreadQueueAdapter | undefined;
|
|
84
86
|
onEdit?: ((message: AppendMessage) => Promise<void>) | undefined;
|
|
85
87
|
onReload?: ((parentId: string | null, config: StartRunConfig) => Promise<void>) | undefined;
|
|
86
88
|
onResume?: ((config: ResumeRunConfig) => Promise<void>) | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-store-adapter.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-adapter.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"external-store-adapter.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-adapter.ts"],"mappings":";;;;;;;;;;;;;KAqBY,uBAAA;EACV,MAAA,EAAQ,MAAA;EACR,EAAA;EACA,QAAA;EACA,UAAA;EACA,KAAA;EACA,MAAA,GAAS,MAAM;AAAA;AAAA,KAGL,8BAAA;EAPV;;;EAWA,QAAA;EACA,SAAA;EACA,OAAA,YAAmB,uBAAA;EACnB,eAAA,YAA2B,uBAAA;EAVZ;AAGjB;;EAWE,mBAAA,UAA6B,OAAA;EALV;;;EASnB,gBAAA,KAAqB,QAAA,aAAqB,OAAA;EAC1C,QAAA,IACE,QAAA,UACA,QAAA,cACI,OAAA;EACN,cAAA,KAEM,QAAA,UACA,MAAA,EAAQ,MAAA,kCACL,OAAA;EAET,SAAA,KAAc,QAAA,aAAqB,OAAA;EACnC,WAAA,KAAgB,QAAA,aAAqB,OAAA;EACrC,QAAA,KAAa,QAAA,aAAqB,OAAA;AAAA;AAAA,KAGxB,6BAAA,OACV,OAAA,EAAS,CAAA,EACT,GAAA,aACG,iBAAiB;AAAA,KAEjB,oCAAA;EACH,cAAA,EAAgB,6BAA6B,CAAC,CAAA;AAAA;AAAA,KAG3C,wBAAA;EAlCgB;;;;;;EAyCnB,UAAA;EAhC0C;;;;;;;;EAyC1C,cAAA;EAhCS;;;;;;;;EAyCT,SAAA;EACA,SAAA;EACA,QAAA,YAAoB,CAAA;EACpB,iBAAA,GAAoB,yBAAA;EACpB,WAAA,YAAuB,gBAAA;EACvB,KAAA,GAAQ,iBAAA;EACR,MAAA;EAEA,WAAA,KAAgB,QAAA,WAAmB,CAAA;EACnC,QAAA,KAAa,QAAA,WAAmB,aAAA;EAChC,qBAAA;EACA,mBAAA,KAAwB,KAAA;EACxB,KAAA,GAAQ,OAAA,EAAS,aAAA,KAAkB,OAAA,QA3ChC;EA6CH,KAAA,GAAQ,0BAAA;EACR,MAAA,KAAW,OAAA,EAAS,aAAA,KAAkB,OAAA;EACtC,QAAA,KACM,QAAA,iBAAyB,MAAA,EAAQ,cAAA,KAAmB,OAAA;EAE1D,QAAA,KAAa,MAAA,EAAQ,eAAA,KAAoB,OAAA;EACzC,QAAA,UAAkB,OAAA;EAClB,eAAA,KACM,OAAA,EAAS,oBAAA,KAAyB,OAAA;EAExC,gBAAA,KACM,OAAA;IAAW,UAAA;IAAoB,OAAA;EAAA;EAErC,uBAAA,KACM,OAAA,EAAS,4BAAA,KAAiC,OAAA;EAEhD,cAAA,GAAiB,6BAAA,CAA8B,CAAA;EAC/C,QAAA;IAEM,WAAA,GAAc,iBAAA;IACd,MAAA,GAAS,sBAAA;IACT,SAAA,GAAY,gBAAA;IACZ,KAAA,GAAQ,oBAAA;IACR,QAAA,GAAW,eAAA;IAhCT;;;IAoCF,UAAA,GAAa,8BAAA;EAAA;EAGnB,qBAAA;IAEM,IAAA;EAAA;EA7BiC;;;;;;;;;;;;;;;;;;;EAmDvC,8BAAA;EAWsB;;;;;;;;;EADtB,eAAA,KACM,QAAA,EAAU,MAAA,SAAe,mBAAA;AAAA;AAAA,KAIrB,oBAAA,KAAyB,aAAA,IACnC,wBAAA,CAAyB,CAAA,KACtB,CAAA,SAAU,aAAA,YAEP,oCAAA,CAAqC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-store-runtime-core.js","names":[],"sources":["../../../src/runtimes/external-store/external-store-runtime-core.ts"],"sourcesContent":["import { BaseAssistantRuntimeCore } from \"../../runtime/base/base-assistant-runtime-core\";\nimport { ExternalStoreThreadListRuntimeCore } from \"./external-store-thread-list-runtime-core\";\nimport type { ExternalStoreAdapter } from \"./external-store-adapter\";\nimport { ExternalStoreThreadRuntimeCore } from \"./external-store-thread-runtime-core\";\n\nconst getThreadListAdapter = (store: ExternalStoreAdapter<any>) => {\n return store.adapters?.threadList ?? {};\n};\n\nexport class ExternalStoreRuntimeCore extends BaseAssistantRuntimeCore {\n public readonly threads;\n\n constructor(adapter: ExternalStoreAdapter<any>) {\n super();\n this.threads = new ExternalStoreThreadListRuntimeCore(\n getThreadListAdapter(adapter),\n () => new ExternalStoreThreadRuntimeCore(this._contextProvider, adapter),\n );\n }\n\n public setAdapter(adapter: ExternalStoreAdapter<any>) {\n // Update the thread list adapter and propagate store changes to the main thread\n this.threads.__internal_setAdapter(getThreadListAdapter(adapter));\n this.threads.getMainThreadRuntimeCore().__internal_setAdapter(adapter);\n }\n}\n"],"mappings":";;;;AAKA,MAAM,wBAAwB,UAAqC;CACjE,OAAO,MAAM,UAAU,cAAc,CAAC;AACxC;AAEA,IAAa,2BAAb,cAA8C,yBAAyB;CACrE;CAEA,YAAY,SAAoC;EAC9C,MAAM;EACN,KAAK,UAAU,IAAI,mCACjB,qBAAqB,OAAO,SACtB,IAAI,+BAA+B,KAAK,kBAAkB,OAAO,CACzE;CACF;CAEA,WAAkB,SAAoC;EAEpD,KAAK,QAAQ,sBAAsB,qBAAqB,OAAO,CAAC;EAChE,KAAK,QAAQ,yBAAyB,
|
|
1
|
+
{"version":3,"file":"external-store-runtime-core.js","names":[],"sources":["../../../src/runtimes/external-store/external-store-runtime-core.ts"],"sourcesContent":["import { BaseAssistantRuntimeCore } from \"../../runtime/base/base-assistant-runtime-core\";\nimport { ExternalStoreThreadListRuntimeCore } from \"./external-store-thread-list-runtime-core\";\nimport type { ExternalStoreAdapter } from \"./external-store-adapter\";\nimport { ExternalStoreThreadRuntimeCore } from \"./external-store-thread-runtime-core\";\n\nconst getThreadListAdapter = (store: ExternalStoreAdapter<any>) => {\n return store.adapters?.threadList ?? {};\n};\n\nexport class ExternalStoreRuntimeCore extends BaseAssistantRuntimeCore {\n public readonly threads;\n\n constructor(adapter: ExternalStoreAdapter<any>) {\n super();\n this.threads = new ExternalStoreThreadListRuntimeCore(\n getThreadListAdapter(adapter),\n () => new ExternalStoreThreadRuntimeCore(this._contextProvider, adapter),\n );\n }\n\n public setAdapter(adapter: ExternalStoreAdapter<any>) {\n // Update the thread list adapter and propagate store changes to the main thread\n this.threads.__internal_setAdapter(getThreadListAdapter(adapter));\n this.threads.getMainThreadRuntimeCore().__internal_setAdapter(adapter);\n }\n}\n"],"mappings":";;;;AAKA,MAAM,wBAAwB,UAAqC;CACjE,OAAO,MAAM,UAAU,cAAc,CAAC;AACxC;AAEA,IAAa,2BAAb,cAA8C,yBAAyB;CACrE;CAEA,YAAY,SAAoC;EAC9C,MAAM;EACN,KAAK,UAAU,IAAI,mCACjB,qBAAqB,OAAO,SACtB,IAAI,+BAA+B,KAAK,kBAAkB,OAAO,CACzE;CACF;CAEA,WAAkB,SAAoC;EAEpD,KAAK,QAAQ,sBAAsB,qBAAqB,OAAO,CAAC;EAChE,KAAK,QAAQ,yBAAyB,CAAC,CAAC,sBAAsB,OAAO;CACvE;AACF"}
|
|
@@ -6,6 +6,7 @@ import { RealtimeVoiceAdapter } from "../../adapters/voice.js";
|
|
|
6
6
|
import { ModelContextProvider } from "../../model-context/types.js";
|
|
7
7
|
import { ThreadMessageLike } from "../../runtime/utils/thread-message-like.js";
|
|
8
8
|
import { ExportedMessageRepository } from "../../runtime/utils/message-repository.js";
|
|
9
|
+
import { QueueItemState } from "../../store/scopes/queue-item.js";
|
|
9
10
|
import { AddToolResultOptions, RespondToToolApprovalOptions, ResumeRunConfig, ResumeToolCallOptions, RuntimeCapabilities, StartRunConfig, ThreadRuntimeCore, ThreadSuggestion } from "../../runtime/interfaces/thread-runtime-core.js";
|
|
10
11
|
import { BaseThreadRuntimeCore } from "../../runtime/base/base-thread-runtime-core.js";
|
|
11
12
|
import { ExternalStoreAdapter, ExternalStoreThreadListAdapter } from "./external-store-adapter.js";
|
|
@@ -63,6 +64,9 @@ declare class ExternalStoreThreadRuntimeCore extends BaseThreadRuntimeCore imple
|
|
|
63
64
|
private _findMessageIdForToolCall;
|
|
64
65
|
switchToBranch(branchId: string): void;
|
|
65
66
|
append(message: AppendMessage): Promise<void>;
|
|
67
|
+
getQueueItems(): readonly QueueItemState[];
|
|
68
|
+
steerQueueItem(queueItemId: string): void;
|
|
69
|
+
removeQueueItem(queueItemId: string): void;
|
|
66
70
|
startRun(config: StartRunConfig): Promise<void>;
|
|
67
71
|
resumeRun(config: ResumeRunConfig): Promise<void>;
|
|
68
72
|
exportExternalState(): any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-store-thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-runtime-core.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"external-store-thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-runtime-core.ts"],"mappings":";;;;;;;;;;;;;cA+Ca,kBAAA,GACX,SAAA,WACA,QAAA,WAAmB,aAAa;AAAA,cAKrB,8BAAA,SACH,qBAAA,YACG,iBAAA;EAAA,QAEH,aAAA;EAAA,IAeG,YAAA,IAAY,mBAAA;EAAA,QAIf,SAAA;EACD,UAAA;EACA,cAAA;EAAA,IACI,SAAA;EAAA,IAIA,SAAA;EAAA,UAIQ,gBAAA,aAA6B,aAAA;EAAA,IAI5B,KAAA,iEAAK,kBAAA,oCAAA,iBAAA;EAAA,IAId,QAAA;kBARkD,iBAAA;;;;;;;EAYtD,WAAA,WAAsB,gBAAA;EACtB,MAAA;EAAA,QAEC,UAAA;EAAA,QAEA,MAAA;;;;;UAMA,gBAAA;EAEQ,SAAA,CAAU,SAAA;cAQxB,eAAA,EAAiB,oBAAA,EACjB,KAAA,EAAO,oBAAA;EAMF,qBAAA,CAAsB,KAAA,EAAO,oBAAA;EAAA;;;;;;EAAA,QA2J5B,qBAAA;EAsKyC;;;;EAAA,QAnGzC,oBAAA;EAAA,QACA,yBAAA;EAxSA;;;;;;EAAA,QAgTA,yBAAA;EAmBQ,cAAA,CAAe,QAAA;EAalB,MAAA,CAAO,OAAA,EAAS,aAAA,GAAgB,OAAA;EA8BtC,aAAA,aA9B6C,cAAA;EAoC7C,cAAA,CAAe,WAAA;EAIf,eAAA,CAAgB,WAAA;EAIV,QAAA,CAAS,MAAA,EAAQ,cAAA,GAAiB,OAAA;EAclC,SAAA,CAAU,MAAA,EAAQ,eAAA,GAAkB,OAAA;EAO1C,mBAAA;EAOA,mBAAA,CAAoB,KAAA;EAmBpB,SAAA;EA0CA,aAAA,CAAc,OAAA,EAAS,oBAAA;EAMvB,cAAA,CAAe,OAAA,EAAS,qBAAA;EAoBxB,qBAAA,CAAsB,OAAA,EAAS,4BAAA;EAMtB,KAAA,CAAM,eAAA,YAA2B,iBAAA;EAMjC,MAAA,CAAO,IAAA,EAAM,yBAAA;EAAA,QAQrB,cAAA;AAAA"}
|
|
@@ -3,6 +3,7 @@ import { bindExternalStoreMessage, getExternalStoreMessages } from "../../runtim
|
|
|
3
3
|
import { getAutoStatus, isAutoStatus } from "../../runtime/utils/auto-status.js";
|
|
4
4
|
import { fromThreadMessageLike } from "../../runtime/utils/thread-message-like.js";
|
|
5
5
|
import { ExportedMessageRepository, MessageRepository } from "../../runtime/utils/message-repository.js";
|
|
6
|
+
import { EMPTY_QUEUE_ITEMS } from "../../store/scopes/queue-item.js";
|
|
6
7
|
import { getThreadMessageText } from "../../utils/text.js";
|
|
7
8
|
import { BaseThreadRuntimeCore } from "../../runtime/base/base-thread-runtime-core.js";
|
|
8
9
|
import { ThreadMessageConverter } from "./thread-message-converter.js";
|
|
@@ -93,7 +94,7 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
|
|
|
93
94
|
unstable_copy: this._store.unstable_capabilities?.copy !== false,
|
|
94
95
|
attachments: !!this._store.adapters?.attachments,
|
|
95
96
|
feedback: !!this._store.adapters?.feedback,
|
|
96
|
-
queue:
|
|
97
|
+
queue: this._store.queue !== void 0
|
|
97
98
|
};
|
|
98
99
|
if (!shallowEqual(this._capabilities, newCapabilities)) this._capabilities = newCapabilities;
|
|
99
100
|
let messages;
|
|
@@ -224,14 +225,30 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
|
|
|
224
225
|
this.updateMessages(this.repository.getMessages());
|
|
225
226
|
}
|
|
226
227
|
async append(message) {
|
|
228
|
+
const isEdit = message.parentId !== (this.messages.at(-1)?.id ?? null);
|
|
229
|
+
if (!isEdit && this._store.queue) {
|
|
230
|
+
this._store.queue.enqueue(message, { steer: message.steer ?? false });
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
227
233
|
if (message.startRun ?? message.role === "user") await this._toolInvocations?.abort();
|
|
228
|
-
if (
|
|
234
|
+
if (isEdit) {
|
|
229
235
|
if (!this._store.onEdit) throw new Error("Runtime does not support editing messages.");
|
|
236
|
+
this._store.queue?.clear("edit");
|
|
230
237
|
await this._store.onEdit(message);
|
|
231
238
|
} else await this._store.onNew(message);
|
|
232
239
|
}
|
|
240
|
+
getQueueItems() {
|
|
241
|
+
return this._store?.queue?.items ?? EMPTY_QUEUE_ITEMS;
|
|
242
|
+
}
|
|
243
|
+
steerQueueItem(queueItemId) {
|
|
244
|
+
this._store?.queue?.steer(queueItemId);
|
|
245
|
+
}
|
|
246
|
+
removeQueueItem(queueItemId) {
|
|
247
|
+
this._store?.queue?.remove(queueItemId);
|
|
248
|
+
}
|
|
233
249
|
async startRun(config) {
|
|
234
250
|
if (!this._store.onReload) throw new Error("Runtime does not support reloading messages.");
|
|
251
|
+
this._store.queue?.clear("reload");
|
|
235
252
|
await this._toolInvocations?.abort();
|
|
236
253
|
await this._store.onReload(config.parentId, config);
|
|
237
254
|
}
|
|
@@ -253,6 +270,7 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
|
|
|
253
270
|
}
|
|
254
271
|
cancelRun() {
|
|
255
272
|
if (!this._store.onCancel) throw new Error("Runtime does not support cancelling runs.");
|
|
273
|
+
this._store.queue?.clear("cancel-run");
|
|
256
274
|
this._toolInvocations?.abort();
|
|
257
275
|
this._store.onCancel();
|
|
258
276
|
const head = this.repository.getMessages().at(-1);
|