@assistant-ui/core 0.3.13 → 0.3.14
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/speech.d.ts.map +1 -1
- package/dist/adapters/speech.js +9 -15
- package/dist/adapters/speech.js.map +1 -1
- package/dist/adapters/thread-history.d.ts +2 -0
- package/dist/adapters/thread-history.d.ts.map +1 -1
- package/dist/adapters/voice.d.ts.map +1 -1
- package/dist/adapters/voice.js +27 -15
- package/dist/adapters/voice.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +1 -1
- package/dist/internal.js +6 -6
- package/dist/model-context/frame/host.d.ts.map +1 -1
- package/dist/model-context/frame/host.js +2 -1
- package/dist/model-context/frame/host.js.map +1 -1
- package/dist/model-context/registry.d.ts.map +1 -1
- package/dist/model-context/registry.js +16 -4
- package/dist/model-context/registry.js.map +1 -1
- package/dist/react/RuntimeAdapter.d.ts +8 -1
- package/dist/react/RuntimeAdapter.d.ts.map +1 -1
- package/dist/react/RuntimeAdapter.js +23 -18
- package/dist/react/RuntimeAdapter.js.map +1 -1
- package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
- package/dist/react/adapters/LocalStorageThreadListAdapter.js +28 -12
- package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
- package/dist/react/client/AdaptedRemoteThread.d.ts +11 -0
- package/dist/react/client/AdaptedRemoteThread.d.ts.map +1 -0
- package/dist/react/client/AdaptedRemoteThread.js +27 -0
- package/dist/react/client/AdaptedRemoteThread.js.map +1 -0
- package/dist/react/client/InMemoryThreadList.d.ts +19 -0
- package/dist/react/client/InMemoryThreadList.d.ts.map +1 -0
- package/dist/react/client/InMemoryThreadList.js +418 -0
- package/dist/react/client/InMemoryThreadList.js.map +1 -0
- package/dist/react/client/Interactables.d.ts.map +1 -1
- package/dist/react/client/Interactables.js +159 -102
- package/dist/react/client/Interactables.js.map +1 -1
- package/dist/react/client/RemoteThreadList.d.ts +34 -0
- package/dist/react/client/RemoteThreadList.d.ts.map +1 -0
- package/dist/react/client/RemoteThreadList.js +826 -0
- package/dist/react/client/RemoteThreadList.js.map +1 -0
- package/dist/react/client/Tools.d.ts.map +1 -1
- package/dist/react/client/Tools.js +38 -27
- package/dist/react/client/Tools.js.map +1 -1
- package/dist/react/index.d.ts +7 -2
- package/dist/react/index.js +5 -2
- package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
- package/dist/react/interactables-legacy/Interactables.js +145 -110
- package/dist/react/interactables-legacy/Interactables.js.map +1 -1
- package/dist/react/primitive-hooks/useActionBarCopy.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useActionBarCopy.js +13 -18
- package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
- package/dist/react/primitive-hooks/useActionBarEdit.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useActionBarEdit.js +2 -4
- package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
- package/dist/react/primitive-hooks/useActionBarReload.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useActionBarReload.js +2 -4
- package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
- package/dist/react/primitive-hooks/useBranchPickerNext.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useBranchPickerNext.js +2 -6
- package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
- package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useBranchPickerPrevious.js +2 -6
- package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
- package/dist/react/primitive-hooks/useComposerCancel.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useComposerCancel.js +2 -4
- package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
- package/dist/react/primitive-hooks/useComposerSend.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useComposerSend.js +2 -4
- package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
- package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useSuggestionTrigger.js +6 -2
- package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
- package/dist/react/primitives/message/MessageParts.d.ts +13 -0
- package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
- package/dist/react/primitives/message/MessageParts.js.map +1 -1
- package/dist/react/primitives/thread/ThreadMessages.d.ts.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/runtimes/RemoteThreadListHookInstanceManager.d.ts +22 -10
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +109 -71
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +8 -2
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +40 -13
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadResource.d.ts +30 -0
- package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -0
- package/dist/react/runtimes/RemoteThreadResource.js +134 -0
- package/dist/react/runtimes/RemoteThreadResource.js.map +1 -0
- package/dist/react/runtimes/RuntimeAdapterProvider.d.ts +3 -10
- package/dist/react/runtimes/RuntimeAdapterProvider.d.ts.map +1 -1
- package/dist/react/runtimes/RuntimeAdapterProvider.js +3 -6
- package/dist/react/runtimes/RuntimeAdapterProvider.js.map +1 -1
- package/dist/react/runtimes/assistant-transport/commandQueue.d.ts +17 -0
- package/dist/react/runtimes/assistant-transport/commandQueue.d.ts.map +1 -0
- package/dist/react/runtimes/assistant-transport/commandQueue.js +55 -0
- package/dist/react/runtimes/assistant-transport/commandQueue.js.map +1 -0
- package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts +11 -0
- package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts.map +1 -0
- package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js +165 -0
- package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js.map +1 -0
- package/dist/react/runtimes/assistant-transport/runManager.d.ts +15 -0
- package/dist/react/runtimes/assistant-transport/runManager.d.ts.map +1 -0
- package/dist/react/runtimes/assistant-transport/runManager.js +86 -0
- package/dist/react/runtimes/assistant-transport/runManager.js.map +1 -0
- package/dist/react/runtimes/assistant-transport/types.d.ts +130 -0
- package/dist/react/runtimes/assistant-transport/types.d.ts.map +1 -0
- package/dist/react/runtimes/assistant-transport/types.js +0 -0
- package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts +14 -0
- package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -0
- package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js +296 -0
- package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js.map +1 -0
- package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts +7 -0
- package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts.map +1 -0
- package/dist/react/runtimes/assistant-transport/useConvertedState.js +25 -0
- package/dist/react/runtimes/assistant-transport/useConvertedState.js.map +1 -0
- package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts +7 -0
- package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts.map +1 -0
- package/dist/react/runtimes/assistant-transport/useLatestRef.js +27 -0
- package/dist/react/runtimes/assistant-transport/useLatestRef.js.map +1 -0
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +39 -13
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
- package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +2 -1
- package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +3 -3
- package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
- package/dist/react/runtimes/cloud/auiV0.d.ts +4 -0
- package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/auiV0.js +7 -0
- package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +22 -12
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
- package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts +16 -0
- package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts.map +1 -0
- package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js +36 -0
- package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js.map +1 -0
- package/dist/react/runtimes/external-message-converter.js +14 -14
- package/dist/react/runtimes/external-message-converter.js.map +1 -1
- package/dist/react/runtimes/useExternalStoreRuntime.d.ts.map +1 -1
- package/dist/react/runtimes/useExternalStoreRuntime.js +44 -28
- package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
- package/dist/react/runtimes/useExternalStoreSharedOptions.js.map +1 -1
- package/dist/react/runtimes/useLocalRuntime.js +1 -1
- package/dist/react/runtimes/useRuntimeAdapters.d.ts +9 -0
- package/dist/react/runtimes/useRuntimeAdapters.d.ts.map +1 -0
- package/dist/react/runtimes/useRuntimeAdapters.js +20 -0
- package/dist/react/runtimes/useRuntimeAdapters.js.map +1 -0
- package/dist/runtime/api/composer-runtime.d.ts +5 -0
- package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
- package/dist/runtime/api/composer-runtime.js.map +1 -1
- package/dist/runtime/api/message-runtime.js +1 -1
- package/dist/runtime/api/thread-list-runtime.d.ts +1 -0
- package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
- package/dist/runtime/api/thread-list-runtime.js +4 -2
- package/dist/runtime/api/thread-list-runtime.js.map +1 -1
- package/dist/runtime/api/thread-runtime.d.ts +12 -2
- package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
- package/dist/runtime/api/thread-runtime.js +8 -2
- package/dist/runtime/api/thread-runtime.js.map +1 -1
- package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/base-composer-runtime-core.js +8 -7
- package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
- package/dist/runtime/base/base-thread-runtime-core.d.ts +1 -0
- package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/base-thread-runtime-core.js +3 -3
- package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
- package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +0 -1
- package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/default-thread-composer-runtime-core.js +10 -4
- package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
- package/dist/runtime/interfaces/thread-runtime-core.d.ts +6 -0
- package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
- package/dist/runtime/internal.js +5 -5
- package/dist/runtime/queue/message-queue.d.ts.map +1 -1
- package/dist/runtime/queue/message-queue.js +2 -1
- package/dist/runtime/queue/message-queue.js.map +1 -1
- package/dist/runtime/utils/thread-runtime-lifecycle.d.ts +8 -0
- package/dist/runtime/utils/thread-runtime-lifecycle.d.ts.map +1 -0
- package/dist/runtime/utils/thread-runtime-lifecycle.js +11 -0
- package/dist/runtime/utils/thread-runtime-lifecycle.js.map +1 -0
- package/dist/runtimes/external-store/external-store-shared-options.js.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +4 -1
- package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +8 -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 +35 -13
- package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
- package/dist/runtimes/internal.d.ts +1 -1
- package/dist/runtimes/local/local-thread-runtime-core.d.ts +3 -0
- package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/local/local-thread-runtime-core.js +53 -13
- package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
- package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +1 -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.js +3 -0
- package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
- package/dist/runtimes/remote-thread-list/types.d.ts +29 -1
- package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
- package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +1 -12
- package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
- package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +67 -38
- package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
- package/dist/store/clients/suggestions.js +2 -2
- package/dist/store/clients/suggestions.js.map +1 -1
- package/dist/store/clients/thread-selection-events.d.ts +10 -0
- package/dist/store/clients/thread-selection-events.d.ts.map +1 -0
- package/dist/store/clients/thread-selection-events.js +40 -0
- package/dist/store/clients/thread-selection-events.js.map +1 -0
- package/dist/store/env.d.ts +5 -0
- package/dist/store/env.d.ts.map +1 -0
- package/dist/store/env.js +12 -0
- package/dist/store/env.js.map +1 -0
- package/dist/store/index.d.ts +5 -3
- package/dist/store/index.js +4 -2
- package/dist/store/internal.d.ts +4 -1
- package/dist/store/internal.js +4 -1
- package/dist/store/primitive-predicates.d.ts +19 -0
- package/dist/store/primitive-predicates.d.ts.map +1 -0
- package/dist/store/primitive-predicates.js +19 -0
- package/dist/store/primitive-predicates.js.map +1 -0
- package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/attachment-runtime-client.js +18 -11
- package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/handle-runtime-action.d.ts +5 -0
- package/dist/store/runtime-clients/handle-runtime-action.d.ts.map +1 -0
- package/dist/store/runtime-clients/handle-runtime-action.js +12 -0
- package/dist/store/runtime-clients/handle-runtime-action.js.map +1 -0
- package/dist/store/runtime-clients/handle-thread-list-action.d.ts +5 -0
- package/dist/store/runtime-clients/handle-thread-list-action.d.ts.map +1 -0
- package/dist/store/runtime-clients/handle-thread-list-action.js +7 -0
- package/dist/store/runtime-clients/handle-thread-list-action.js.map +1 -0
- 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 +62 -29
- 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 +5 -6
- package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
- package/dist/store/scopes/composer.d.ts +9 -4
- package/dist/store/scopes/composer.d.ts.map +1 -1
- package/dist/store/scopes/thread-list-item.d.ts +7 -6
- package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
- package/dist/store/scopes/thread.d.ts +8 -7
- package/dist/store/scopes/thread.d.ts.map +1 -1
- package/dist/store/scopes/threads.d.ts +17 -1
- package/dist/store/scopes/threads.d.ts.map +1 -1
- package/dist/subscribable/subscribable.d.ts +2 -1
- package/dist/subscribable/subscribable.d.ts.map +1 -1
- package/dist/subscribable/subscribable.js +23 -18
- package/dist/subscribable/subscribable.js.map +1 -1
- package/dist/utils/composite-context-provider.d.ts +1 -0
- package/dist/utils/composite-context-provider.d.ts.map +1 -1
- package/dist/utils/composite-context-provider.js +25 -9
- package/dist/utils/composite-context-provider.js.map +1 -1
- package/dist/utils/notify-event-listeners.d.ts +2 -2
- package/dist/utils/notify-event-listeners.d.ts.map +1 -1
- package/dist/utils/notify-event-listeners.js +2 -2
- package/dist/utils/notify-event-listeners.js.map +1 -1
- package/package.json +7 -7
- package/src/adapters/speech.test.ts +118 -1
- package/src/adapters/speech.ts +21 -22
- package/src/adapters/thread-history.ts +2 -0
- package/src/adapters/voice.test.ts +69 -0
- package/src/adapters/voice.ts +27 -27
- package/src/index.ts +1 -0
- package/src/model-context/frame/host.test.ts +23 -0
- package/src/model-context/frame/host.ts +2 -1
- package/src/model-context/registry.test.ts +131 -0
- package/src/model-context/registry.ts +16 -6
- package/src/react/RuntimeAdapter.test.ts +2 -0
- package/src/react/RuntimeAdapter.ts +20 -8
- package/src/react/adapters/LocalStorageThreadListAdapter.tsx +34 -17
- package/src/react/client/AdaptedRemoteThread.ts +41 -0
- package/src/react/client/InMemoryThreadList.test.tsx +148 -0
- package/src/react/client/InMemoryThreadList.ts +290 -0
- package/src/react/client/Interactables.test.ts +326 -2
- package/src/react/client/Interactables.ts +227 -110
- package/src/react/client/RemoteThreadList.test.ts +1026 -0
- package/src/react/client/RemoteThreadList.ts +1067 -0
- package/src/react/client/Tools.ts +36 -29
- package/src/react/index.ts +13 -0
- package/src/react/interactables-legacy/Interactables.test.ts +317 -0
- package/src/react/interactables-legacy/Interactables.ts +204 -128
- package/src/react/primitive-hooks/useActionBarCopy.ts +2 -7
- package/src/react/primitive-hooks/useActionBarEdit.ts +2 -1
- package/src/react/primitive-hooks/useActionBarReload.ts +2 -6
- package/src/react/primitive-hooks/useBranchPickerNext.ts +2 -7
- package/src/react/primitive-hooks/useBranchPickerPrevious.ts +2 -7
- package/src/react/primitive-hooks/useComposerCancel.ts +2 -1
- package/src/react/primitive-hooks/useComposerSend.ts +2 -5
- package/src/react/primitive-hooks/useSuggestionTrigger.test.ts +11 -0
- package/src/react/primitive-hooks/useSuggestionTrigger.ts +4 -5
- package/src/react/primitives/message/MessageParts.tsx +0 -1
- package/src/react/primitives/thread/ThreadMessages.tsx +2 -1
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.retry.test.tsx +116 -0
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +1 -1
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +57 -6
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.title.test.tsx +272 -0
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +159 -124
- package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +59 -20
- package/src/react/runtimes/RemoteThreadResource.test.ts +141 -0
- package/src/react/runtimes/RemoteThreadResource.ts +231 -0
- package/src/react/runtimes/RuntimeAdapterProvider.tsx +8 -20
- package/src/react/runtimes/assistant-transport/commandQueue.ts +68 -0
- package/src/react/runtimes/assistant-transport/replayBoundaryStream.test.ts +455 -0
- package/src/react/runtimes/assistant-transport/replayBoundaryStream.ts +172 -0
- package/src/react/runtimes/assistant-transport/runManager.ts +124 -0
- package/src/react/runtimes/assistant-transport/transport-delivery.test.tsx +79 -0
- package/src/react/runtimes/assistant-transport/transport-parentid.test.tsx +97 -0
- package/src/react/runtimes/assistant-transport/transport-scheduling.test.ts +414 -0
- package/src/react/runtimes/assistant-transport/types.ts +170 -0
- package/src/react/runtimes/assistant-transport/useAssistantTransport.spec.md +141 -0
- package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.test.tsx +625 -0
- package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts +481 -0
- package/src/react/runtimes/assistant-transport/useConvertedState.ts +20 -0
- package/src/react/runtimes/assistant-transport/useLatestRef.ts +9 -0
- package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +131 -6
- package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +61 -15
- package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +6 -4
- package/src/react/runtimes/cloud/auiV0.ts +17 -1
- package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +36 -21
- package/src/react/runtimes/cloud/useCloudThreadListRuntime.test.tsx +56 -0
- package/src/react/runtimes/cloud/useCloudThreadListRuntime.ts +31 -0
- package/src/react/runtimes/external-message-converter.test.ts +143 -0
- package/src/react/runtimes/external-message-converter.ts +41 -41
- package/src/react/runtimes/remote-thread-hook-on-tap.test.ts +58 -0
- package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +83 -0
- package/src/react/runtimes/useExternalStoreRuntime.suggestions.test.tsx +13 -3
- package/src/react/runtimes/useExternalStoreRuntime.ts +7 -0
- package/src/react/runtimes/useExternalStoreSharedOptions.ts +3 -1
- package/src/react/runtimes/useLocalRuntime.test.tsx +130 -4
- package/src/react/runtimes/useRuntimeAdapters.test.tsx +62 -0
- package/src/react/runtimes/useRuntimeAdapters.ts +28 -0
- package/src/runtime/api/composer-runtime.ts +5 -0
- package/src/runtime/api/thread-list-runtime.ts +3 -1
- package/src/runtime/api/thread-runtime.ts +20 -2
- package/src/runtime/base/base-composer-runtime-core.ts +6 -5
- package/src/runtime/base/base-thread-runtime-core.test.ts +191 -0
- package/src/runtime/base/base-thread-runtime-core.ts +11 -2
- package/src/runtime/base/default-thread-composer-runtime-core.ts +12 -4
- package/src/runtime/interfaces/thread-runtime-core.ts +6 -0
- package/src/runtime/queue/message-queue.ts +2 -1
- package/src/runtime/utils/thread-runtime-lifecycle.ts +18 -0
- package/src/runtimes/external-store/external-store-shared-options.ts +3 -1
- package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +4 -1
- package/src/runtimes/external-store/external-store-thread-runtime-core.ts +99 -34
- package/src/runtimes/local/local-thread-runtime-core.test.ts +373 -4
- package/src/runtimes/local/local-thread-runtime-core.ts +79 -14
- package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +4 -0
- package/src/runtimes/remote-thread-list/empty-thread-core.ts +4 -0
- package/src/runtimes/remote-thread-list/types.ts +30 -0
- package/src/runtimes/tool-invocations/EDGE_CASES.md +17 -6
- package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +243 -0
- package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +127 -61
- package/src/store/clients/model-context-client.test.ts +16 -8
- package/src/store/clients/suggestions.ts +2 -2
- package/src/store/clients/thread-selection-events.ts +21 -0
- package/src/store/env.ts +11 -0
- package/src/store/index.ts +14 -1
- package/src/store/internal.ts +13 -0
- package/src/store/primitive-predicates.test.ts +184 -0
- package/src/store/primitive-predicates.ts +43 -0
- package/src/store/runtime-clients/attachment-runtime-client.test.ts +41 -0
- package/src/store/runtime-clients/attachment-runtime-client.ts +2 -1
- package/src/store/runtime-clients/handle-runtime-action.ts +11 -0
- package/src/store/runtime-clients/handle-thread-list-action.test.ts +69 -0
- package/src/store/runtime-clients/handle-thread-list-action.ts +6 -0
- package/src/store/runtime-clients/thread-list-item-runtime-client.ts +15 -7
- package/src/store/runtime-clients/thread-list-runtime-client.ts +9 -6
- package/src/store/scopes/composer.ts +9 -4
- package/src/store/scopes/thread-list-item.ts +7 -6
- package/src/store/scopes/thread.ts +8 -7
- package/src/store/scopes/threads.ts +14 -0
- package/src/subscribable/subscribable.test.ts +77 -1
- package/src/subscribable/subscribable.ts +38 -23
- package/src/tests/RemoteThreadListThreadListRuntimeCore-switchToThread-unarchive.test.ts +25 -0
- package/src/tests/auiV0Encode.test.ts +66 -0
- package/src/tests/base-composer-runtime-core-send.test.ts +30 -0
- package/src/tests/base-composer-runtime-core.test.ts +28 -0
- package/src/tests/composer-can-cancel.test.ts +101 -0
- package/src/tests/external-store-thread-list-runtime-core.test.ts +101 -0
- package/src/tests/external-store-thread-runtime-core-adapter.test.ts +191 -1
- package/src/tests/external-store-thread-runtime-core.test.ts +124 -0
- package/src/tests/interactables-toolui-migration.test.tsx +66 -0
- package/src/tests/message-queue.test.ts +28 -0
- package/src/tests/session-reset-notification.test.ts +145 -0
- package/src/tests/thread-switch-events.test.tsx +99 -1
- package/src/tests/tools-scope-migration.test.tsx +58 -0
- package/src/utils/composite-context-provider.test.ts +139 -0
- package/src/utils/composite-context-provider.ts +26 -8
- package/src/utils/notify-event-listeners.ts +10 -5
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { InMemoryThreadListAdapter } from "../../../runtimes/remote-thread-list/adapter/in-memory.js";
|
|
3
|
+
import { createRequestHeaders } from "../../../runtimes/assistant-transport/utils.js";
|
|
4
|
+
import { useExternalStoreRuntime } from "../useExternalStoreRuntime.js";
|
|
5
|
+
import { useRemoteThreadListRuntime } from "../useRemoteThreadListRuntime.js";
|
|
6
|
+
import { useCommandQueue } from "./commandQueue.js";
|
|
7
|
+
import { createReplayBoundaryStream, useReplayRenderWait } from "./replayBoundaryStream.js";
|
|
8
|
+
import { useRunManager } from "./runManager.js";
|
|
9
|
+
import { useConvertedState } from "./useConvertedState.js";
|
|
10
|
+
import { AssistantMessageAccumulator, AssistantTransportDecoder, DataStreamDecoder, toToolsJSONSchema, unstable_createInitialMessage } from "assistant-stream";
|
|
11
|
+
import { asAsyncIterableStream } from "assistant-stream/utils";
|
|
12
|
+
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
13
|
+
import { useMemo, useRef, useState } from "@assistant-ui/tap/react-shim";
|
|
14
|
+
import { useAui, useAuiState } from "@assistant-ui/store";
|
|
15
|
+
//#region src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts
|
|
16
|
+
const convertAppendMessageToCommand = (message) => {
|
|
17
|
+
if (message.role !== "user") throw new Error("Only user messages are supported");
|
|
18
|
+
const parts = [];
|
|
19
|
+
const content = [...message.content, ...message.attachments?.flatMap((a) => a.content) ?? []];
|
|
20
|
+
for (const contentPart of content) if (contentPart.type === "text") parts.push({
|
|
21
|
+
type: "text",
|
|
22
|
+
text: contentPart.text
|
|
23
|
+
});
|
|
24
|
+
else if (contentPart.type === "image") parts.push({
|
|
25
|
+
type: "image",
|
|
26
|
+
image: contentPart.image
|
|
27
|
+
});
|
|
28
|
+
if (parts.length === 0) return null;
|
|
29
|
+
return {
|
|
30
|
+
type: "add-message",
|
|
31
|
+
message: {
|
|
32
|
+
role: "user",
|
|
33
|
+
parts
|
|
34
|
+
},
|
|
35
|
+
parentId: message.parentId,
|
|
36
|
+
sourceId: message.sourceId
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
const readResumeState = async (response) => {
|
|
40
|
+
if (response.status === 204) return null;
|
|
41
|
+
if (!response.ok) throw new Error(`Resume state request failed with status ${response.status}: ${await response.text()}`);
|
|
42
|
+
let value;
|
|
43
|
+
try {
|
|
44
|
+
value = await response.json();
|
|
45
|
+
} catch {
|
|
46
|
+
throw new Error("Resume state response was not valid JSON");
|
|
47
|
+
}
|
|
48
|
+
if (typeof value !== "object" || value === null || !("state" in value) || !("runId" in value) || typeof value.runId !== "string") throw new Error("Resume state response must contain state and runId");
|
|
49
|
+
return {
|
|
50
|
+
runId: value.runId,
|
|
51
|
+
state: value.state
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
const symbolAssistantTransportExtras = Symbol("assistant-transport-extras");
|
|
55
|
+
const asAssistantTransportExtras = (extras) => {
|
|
56
|
+
if (typeof extras !== "object" || extras == null || !(symbolAssistantTransportExtras in extras)) throw new Error("This method can only be called when you are using useAssistantTransportRuntime");
|
|
57
|
+
return extras;
|
|
58
|
+
};
|
|
59
|
+
const useAssistantTransportSendCommand = () => {
|
|
60
|
+
const $ = c(2);
|
|
61
|
+
const aui = useAui();
|
|
62
|
+
let t0;
|
|
63
|
+
if ($[0] !== aui.thread) {
|
|
64
|
+
t0 = (command) => {
|
|
65
|
+
const extras = aui.thread.getState().extras;
|
|
66
|
+
asAssistantTransportExtras(extras).sendCommand(command);
|
|
67
|
+
};
|
|
68
|
+
$[0] = aui.thread;
|
|
69
|
+
$[1] = t0;
|
|
70
|
+
} else t0 = $[1];
|
|
71
|
+
return t0;
|
|
72
|
+
};
|
|
73
|
+
function useAssistantTransportState(selector = (t) => t) {
|
|
74
|
+
return useAuiState((s) => selector(asAssistantTransportExtras(s.thread.extras).state));
|
|
75
|
+
}
|
|
76
|
+
const useAssistantTransportThreadRuntime = (options) => {
|
|
77
|
+
const agentStateRef = useRef(options.initialState);
|
|
78
|
+
const [, rerender] = useState(0);
|
|
79
|
+
const resumeFlagRef = useRef(false);
|
|
80
|
+
const [isReplaying, setIsReplaying] = useState(false);
|
|
81
|
+
const waitForReplayRender = useReplayRenderWait();
|
|
82
|
+
const parentIdRef = useRef(void 0);
|
|
83
|
+
const commandQueue = useCommandQueue({ onQueue: () => runManager.schedule() });
|
|
84
|
+
const enqueueAppendMessage = (message) => {
|
|
85
|
+
const command = convertAppendMessageToCommand(message);
|
|
86
|
+
if (!command) {
|
|
87
|
+
console.warn("[assistant-ui] Skipped add-message command with no supported parts");
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
parentIdRef.current = message.parentId;
|
|
91
|
+
commandQueue.enqueue(command, { schedule: message.startRun ?? message.role === "user" });
|
|
92
|
+
};
|
|
93
|
+
const threadId = useAuiState((s) => s.threadListItem.remoteId);
|
|
94
|
+
const runManager = useRunManager({
|
|
95
|
+
onRun: async (signal) => {
|
|
96
|
+
const isResume = resumeFlagRef.current;
|
|
97
|
+
resumeFlagRef.current = false;
|
|
98
|
+
setIsReplaying(false);
|
|
99
|
+
const commands = isResume ? [] : commandQueue.flush();
|
|
100
|
+
if (commands.length === 0 && !isResume) return;
|
|
101
|
+
const parentId = isResume ? void 0 : parentIdRef.current;
|
|
102
|
+
if (!isResume) parentIdRef.current = void 0;
|
|
103
|
+
const headers = await createRequestHeaders(options.headers);
|
|
104
|
+
let resumeState;
|
|
105
|
+
if (isResume && options.resumeStateApi) {
|
|
106
|
+
const resumeStateResponse = await fetch(options.resumeStateApi, {
|
|
107
|
+
method: "POST",
|
|
108
|
+
headers,
|
|
109
|
+
body: JSON.stringify({ threadId }),
|
|
110
|
+
signal
|
|
111
|
+
});
|
|
112
|
+
const retained = await readResumeState(resumeStateResponse);
|
|
113
|
+
if (retained === null) {
|
|
114
|
+
if (commandQueue.state.queued.length > 0) runManager.schedule();
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
resumeState = retained;
|
|
118
|
+
}
|
|
119
|
+
const bodyValue = typeof options.body === "function" ? await options.body() : options.body;
|
|
120
|
+
const context = runtime.thread.getModelContext();
|
|
121
|
+
let requestBody = {
|
|
122
|
+
commands,
|
|
123
|
+
...resumeState === void 0 && { state: agentStateRef.current },
|
|
124
|
+
system: context.system,
|
|
125
|
+
tools: context.tools ? toToolsJSONSchema(context.tools) : void 0,
|
|
126
|
+
threadId,
|
|
127
|
+
...parentId !== void 0 && { parentId },
|
|
128
|
+
callSettings: context.callSettings,
|
|
129
|
+
config: context.config,
|
|
130
|
+
...context.callSettings,
|
|
131
|
+
...context.config,
|
|
132
|
+
...bodyValue ?? {}
|
|
133
|
+
};
|
|
134
|
+
if (options.prepareSendCommandsRequest) requestBody = await options.prepareSendCommandsRequest(requestBody);
|
|
135
|
+
if (resumeState !== void 0) {
|
|
136
|
+
requestBody = {
|
|
137
|
+
...requestBody,
|
|
138
|
+
runId: resumeState.runId
|
|
139
|
+
};
|
|
140
|
+
delete requestBody["state"];
|
|
141
|
+
}
|
|
142
|
+
const response = await fetch(isResume ? options.resumeApi : options.api, {
|
|
143
|
+
method: "POST",
|
|
144
|
+
headers,
|
|
145
|
+
body: JSON.stringify(requestBody),
|
|
146
|
+
signal
|
|
147
|
+
});
|
|
148
|
+
try {
|
|
149
|
+
await options.onResponse?.(response);
|
|
150
|
+
} catch (error) {
|
|
151
|
+
response.body?.cancel().catch(() => {});
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
if (!response.ok) throw new Error(`Status ${response.status}: ${await response.text()}`);
|
|
155
|
+
if (!response.body) throw new Error("Response body is null");
|
|
156
|
+
if (resumeState !== void 0) {
|
|
157
|
+
agentStateRef.current = resumeState.state;
|
|
158
|
+
rerender((prev) => prev + 1);
|
|
159
|
+
}
|
|
160
|
+
const body = await createReplayBoundaryStream(response, {
|
|
161
|
+
setReplaying: setIsReplaying,
|
|
162
|
+
waitForRender: waitForReplayRender
|
|
163
|
+
});
|
|
164
|
+
const protocol = options.protocol ?? "data-stream";
|
|
165
|
+
const strict = isResume ? false : options.strict ?? true;
|
|
166
|
+
const decoder = protocol === "assistant-transport" ? new AssistantTransportDecoder({ strict }) : new DataStreamDecoder({ strict });
|
|
167
|
+
let err;
|
|
168
|
+
const stream = body.pipeThrough(decoder).pipeThrough(new AssistantMessageAccumulator({
|
|
169
|
+
initialMessage: unstable_createInitialMessage({ unstable_state: agentStateRef.current ?? null }),
|
|
170
|
+
throttle: isResume,
|
|
171
|
+
strict,
|
|
172
|
+
onError: (error_0) => {
|
|
173
|
+
err = error_0;
|
|
174
|
+
}
|
|
175
|
+
}));
|
|
176
|
+
let markedDelivered = false;
|
|
177
|
+
for await (const chunk of asAsyncIterableStream(stream)) {
|
|
178
|
+
if (chunk.metadata.unstable_state === agentStateRef.current) continue;
|
|
179
|
+
if (!markedDelivered) {
|
|
180
|
+
commandQueue.markDelivered();
|
|
181
|
+
markedDelivered = true;
|
|
182
|
+
}
|
|
183
|
+
agentStateRef.current = chunk.metadata.unstable_state;
|
|
184
|
+
rerender((prev) => prev + 1);
|
|
185
|
+
}
|
|
186
|
+
if (err) throw new Error(err);
|
|
187
|
+
if (!markedDelivered) commandQueue.markDelivered();
|
|
188
|
+
if (isResume && commandQueue.state.queued.length > 0) runManager.schedule();
|
|
189
|
+
},
|
|
190
|
+
onFinish: options.onFinish,
|
|
191
|
+
onCancel: () => {
|
|
192
|
+
setIsReplaying(false);
|
|
193
|
+
const cmds = [...commandQueue.state.inTransit, ...commandQueue.state.queued];
|
|
194
|
+
commandQueue.reset();
|
|
195
|
+
options.onCancel?.({
|
|
196
|
+
commands: cmds,
|
|
197
|
+
updateState: (updater) => {
|
|
198
|
+
agentStateRef.current = updater(agentStateRef.current);
|
|
199
|
+
rerender((prev_0) => prev_0 + 1);
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
},
|
|
203
|
+
onError: async (error_1) => {
|
|
204
|
+
resumeFlagRef.current = false;
|
|
205
|
+
setIsReplaying(false);
|
|
206
|
+
const inTransitCmds = [...commandQueue.state.inTransit];
|
|
207
|
+
const queuedCmds = [...commandQueue.state.queued];
|
|
208
|
+
commandQueue.reset();
|
|
209
|
+
try {
|
|
210
|
+
await options.onError?.(error_1, {
|
|
211
|
+
commands: inTransitCmds,
|
|
212
|
+
updateState: (updater) => {
|
|
213
|
+
agentStateRef.current = updater(agentStateRef.current);
|
|
214
|
+
rerender((prev) => prev + 1);
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
} finally {
|
|
218
|
+
options.onCancel?.({
|
|
219
|
+
commands: queuedCmds,
|
|
220
|
+
updateState: (updater) => {
|
|
221
|
+
agentStateRef.current = updater(agentStateRef.current);
|
|
222
|
+
rerender((prev) => prev + 1);
|
|
223
|
+
},
|
|
224
|
+
error: error_1
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
const [toolStatuses, setToolStatuses] = useState({});
|
|
230
|
+
const pendingCommands = useMemo(() => [...commandQueue.state.inTransit, ...commandQueue.state.queued], [commandQueue.state]);
|
|
231
|
+
const converted = useConvertedState(options.converter, agentStateRef.current, pendingCommands, runManager.isRunning, toolStatuses);
|
|
232
|
+
const runtime = useExternalStoreRuntime({
|
|
233
|
+
messages: converted.messages,
|
|
234
|
+
state: converted.state,
|
|
235
|
+
isRunning: converted.isRunning,
|
|
236
|
+
isLoading: isReplaying,
|
|
237
|
+
adapters: options.adapters,
|
|
238
|
+
unstable_enableToolInvocations: true,
|
|
239
|
+
setToolStatuses,
|
|
240
|
+
extras: {
|
|
241
|
+
[symbolAssistantTransportExtras]: true,
|
|
242
|
+
sendCommand: (command_0) => {
|
|
243
|
+
commandQueue.enqueue(command_0);
|
|
244
|
+
},
|
|
245
|
+
state: agentStateRef.current
|
|
246
|
+
},
|
|
247
|
+
onNew: async (message_0) => enqueueAppendMessage(message_0),
|
|
248
|
+
...options.capabilities?.edit && { onEdit: async (message_1) => enqueueAppendMessage(message_1) },
|
|
249
|
+
...commandQueue.state.queued.length > 0 && { onReload: async (parentId_0) => {
|
|
250
|
+
parentIdRef.current = parentId_0;
|
|
251
|
+
runManager.schedule();
|
|
252
|
+
} },
|
|
253
|
+
onCancel: async () => {
|
|
254
|
+
resumeFlagRef.current = false;
|
|
255
|
+
runManager.cancel();
|
|
256
|
+
},
|
|
257
|
+
onResume: async () => {
|
|
258
|
+
if (!options.resumeApi) throw new Error("Must pass resumeApi to options to resume runs");
|
|
259
|
+
resumeFlagRef.current = true;
|
|
260
|
+
runManager.schedule();
|
|
261
|
+
},
|
|
262
|
+
onAddToolResult: async (toolOptions) => {
|
|
263
|
+
const command_1 = {
|
|
264
|
+
type: "add-tool-result",
|
|
265
|
+
toolCallId: toolOptions.toolCallId,
|
|
266
|
+
result: toolOptions.result,
|
|
267
|
+
toolName: toolOptions.toolName,
|
|
268
|
+
isError: toolOptions.isError,
|
|
269
|
+
...toolOptions.artifact && { artifact: toolOptions.artifact },
|
|
270
|
+
...toolOptions.modelContent !== void 0 && { modelContent: toolOptions.modelContent }
|
|
271
|
+
};
|
|
272
|
+
commandQueue.enqueue(command_1);
|
|
273
|
+
},
|
|
274
|
+
onLoadExternalState: async (state) => {
|
|
275
|
+
agentStateRef.current = state;
|
|
276
|
+
rerender((prev_1) => prev_1 + 1);
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
return runtime;
|
|
280
|
+
};
|
|
281
|
+
/**
|
|
282
|
+
* @alpha This is an experimental API that is subject to change.
|
|
283
|
+
*/
|
|
284
|
+
const useAssistantTransportRuntime = (options) => {
|
|
285
|
+
return useRemoteThreadListRuntime({
|
|
286
|
+
runtimeHook: function RuntimeHook() {
|
|
287
|
+
return useAssistantTransportThreadRuntime(options);
|
|
288
|
+
},
|
|
289
|
+
adapter: new InMemoryThreadListAdapter(),
|
|
290
|
+
allowNesting: true
|
|
291
|
+
});
|
|
292
|
+
};
|
|
293
|
+
//#endregion
|
|
294
|
+
export { useAssistantTransportRuntime, useAssistantTransportSendCommand, useAssistantTransportState };
|
|
295
|
+
|
|
296
|
+
//# sourceMappingURL=useAssistantTransportRuntime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAssistantTransportRuntime.js","names":["c","_c","AppendMessage","ReadonlyJSONObject","ReadonlyJSONValue","asAsyncIterableStream","useExternalStoreRuntime","AssistantRuntime","AddToolResultOptions","useMemo","useRef","useState","AssistantMessageAccumulator","DataStreamDecoder","AssistantTransportDecoder","unstable_createInitialMessage","createInitialMessage","toToolsJSONSchema","AssistantTransportOptions","AddMessageCommand","AddToolResultCommand","UserMessagePart","QueuedCommand","AssistantTransportCommand","SendCommandsRequestBody","useCommandQueue","createReplayBoundaryStream","useReplayRenderWait","useRunManager","useConvertedState","ToolExecutionStatus","createRequestHeaders","useRemoteThreadListRuntime","InMemoryThreadListAdapter","useAui","useAuiState","UserExternalState","convertAppendMessageToCommand","message","role","Error","parts","content","attachments","flatMap","a","contentPart","type","push","text","image","length","parentId","sourceId","readResumeState","response","Response","Promise","runId","state","T","status","ok","value","json","symbolAssistantTransportExtras","Symbol","AssistantTransportExtras","sendCommand","command","asAssistantTransportExtras","extras","useAssistantTransportSendCommand","$","aui","t0","thread","getState","transportExtras","useAssistantTransportState","selector","t","s","useAssistantTransportThreadRuntime","options","agentStateRef","initialState","rerender","resumeFlagRef","isReplaying","setIsReplaying","waitForReplayRender","parentIdRef","undefined","commandQueue","onQueue","runManager","schedule","enqueueAppendMessage","console","warn","current","enqueue","startRun","threadId","threadListItem","remoteId","onRun","signal","AbortSignal","isResume","commands","flush","headers","resumeState","resumeStateApi","resumeStateResponse","fetch","method","body","JSON","stringify","retained","queued","bodyValue","context","runtime","getModelContext","requestBody","Record","system","tools","callSettings","config","prepareSendCommandsRequest","resumeApi","api","onResponse","error","cancel","catch","prev","setReplaying","waitForRender","protocol","strict","decoder","err","stream","pipeThrough","initialMessage","unstable_state","throttle","onError","markedDelivered","chunk","metadata","markDelivered","onFinish","onCancel","cmds","inTransit","reset","updateState","updater","inTransitCmds","queuedCmds","toolStatuses","setToolStatuses","pendingCommands","converted","converter","isRunning","messages","isLoading","adapters","unstable_enableToolInvocations","onNew","capabilities","edit","onEdit","onReload","onResume","onAddToolResult","toolOptions","toolCallId","result","toolName","isError","artifact","modelContent","onLoadExternalState","useAssistantTransportRuntime","runtimeHook","RuntimeHook","adapter","allowNesting"],"sources":["../../../../src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts"],"sourcesContent":["\"use client\";\n\nimport type { AppendMessage } from \"../../../types/message\";\nimport {\n type ReadonlyJSONObject,\n type ReadonlyJSONValue,\n asAsyncIterableStream,\n} from \"assistant-stream/utils\";\nimport { useExternalStoreRuntime } from \"../useExternalStoreRuntime\";\nimport type { AssistantRuntime } from \"../../../runtime/api/assistant-runtime\";\nimport type { AddToolResultOptions } from \"../../../runtime/interfaces/thread-runtime-core\";\nimport { useMemo, useRef, useState } from \"react\";\nimport {\n AssistantMessageAccumulator,\n DataStreamDecoder,\n AssistantTransportDecoder,\n unstable_createInitialMessage as createInitialMessage,\n toToolsJSONSchema,\n} from \"assistant-stream\";\nimport type {\n AssistantTransportOptions,\n AddMessageCommand,\n AddToolResultCommand,\n UserMessagePart,\n QueuedCommand,\n AssistantTransportCommand,\n SendCommandsRequestBody,\n} from \"./types\";\nimport { useCommandQueue } from \"./commandQueue\";\nimport {\n createReplayBoundaryStream,\n useReplayRenderWait,\n} from \"./replayBoundaryStream\";\nimport { useRunManager } from \"./runManager\";\nimport { useConvertedState } from \"./useConvertedState\";\nimport type { ToolExecutionStatus } from \"../../../runtimes/tool-invocations/ToolInvocationTracker\";\nimport { createRequestHeaders } from \"../../../runtimes/assistant-transport/utils\";\nimport { useRemoteThreadListRuntime } from \"../useRemoteThreadListRuntime\";\nimport { InMemoryThreadListAdapter } from \"../../../runtimes/remote-thread-list/adapter/in-memory\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\nimport type { UserExternalState } from \"../../../types/augmentations\";\n\nconst convertAppendMessageToCommand = (\n message: AppendMessage,\n): AddMessageCommand | null => {\n if (message.role !== \"user\")\n throw new Error(\"Only user messages are supported\");\n\n const parts: UserMessagePart[] = [];\n const content = [\n ...message.content,\n ...(message.attachments?.flatMap((a) => a.content) ?? []),\n ];\n for (const contentPart of content) {\n if (contentPart.type === \"text\") {\n parts.push({ type: \"text\", text: contentPart.text });\n } else if (contentPart.type === \"image\") {\n parts.push({ type: \"image\", image: contentPart.image });\n }\n }\n\n if (parts.length === 0) return null;\n\n return {\n type: \"add-message\",\n message: {\n role: \"user\",\n parts,\n },\n parentId: message.parentId,\n sourceId: message.sourceId,\n };\n};\n\nconst readResumeState = async <T>(\n response: Response,\n): Promise<{ runId: string; state: T } | null> => {\n if (response.status === 204) return null;\n if (!response.ok) {\n throw new Error(\n `Resume state request failed with status ${response.status}: ${await response.text()}`,\n );\n }\n\n let value: unknown;\n try {\n value = await response.json();\n } catch {\n throw new Error(\"Resume state response was not valid JSON\");\n }\n\n if (\n typeof value !== \"object\" ||\n value === null ||\n !(\"state\" in value) ||\n !(\"runId\" in value) ||\n typeof value.runId !== \"string\"\n ) {\n throw new Error(\"Resume state response must contain state and runId\");\n }\n\n return { runId: value.runId, state: value.state as T };\n};\n\nconst symbolAssistantTransportExtras = Symbol(\"assistant-transport-extras\");\ntype AssistantTransportExtras = {\n [symbolAssistantTransportExtras]: true;\n sendCommand: (command: AssistantTransportCommand) => void;\n state: UserExternalState;\n};\n\nconst asAssistantTransportExtras = (\n extras: unknown,\n): AssistantTransportExtras => {\n if (\n typeof extras !== \"object\" ||\n extras == null ||\n !(symbolAssistantTransportExtras in extras)\n )\n throw new Error(\n \"This method can only be called when you are using useAssistantTransportRuntime\",\n );\n\n return extras as AssistantTransportExtras;\n};\n\nexport const useAssistantTransportSendCommand = () => {\n const aui = useAui();\n\n return (command: AssistantTransportCommand) => {\n const extras = aui.thread.getState().extras;\n const transportExtras = asAssistantTransportExtras(extras);\n transportExtras.sendCommand(command);\n };\n};\n\nexport function useAssistantTransportState(): UserExternalState;\nexport function useAssistantTransportState<T>(\n selector: (state: UserExternalState) => T,\n): T;\nexport function useAssistantTransportState<T>(\n selector: (state: UserExternalState) => T = (t) => t as T,\n): T | UserExternalState {\n return useAuiState((s) =>\n selector(asAssistantTransportExtras(s.thread.extras).state),\n );\n}\n\nconst useAssistantTransportThreadRuntime = <T>(\n options: AssistantTransportOptions<T>,\n): AssistantRuntime => {\n const agentStateRef = useRef(options.initialState);\n const [, rerender] = useState(0);\n const resumeFlagRef = useRef(false);\n const [isReplaying, setIsReplaying] = useState(false);\n const waitForReplayRender = useReplayRenderWait();\n const parentIdRef = useRef<string | null | undefined>(undefined);\n const commandQueue = useCommandQueue({\n onQueue: () => runManager.schedule(),\n });\n\n const enqueueAppendMessage = (message: AppendMessage) => {\n const command = convertAppendMessageToCommand(message);\n if (!command) {\n console.warn(\n \"[assistant-ui] Skipped add-message command with no supported parts\",\n );\n return;\n }\n parentIdRef.current = message.parentId;\n commandQueue.enqueue(command, {\n schedule: message.startRun ?? message.role === \"user\",\n });\n };\n\n const threadId = useAuiState((s) => s.threadListItem.remoteId);\n\n const runManager = useRunManager({\n onRun: async (signal: AbortSignal) => {\n const isResume = resumeFlagRef.current;\n resumeFlagRef.current = false;\n setIsReplaying(false);\n const commands: QueuedCommand[] = isResume ? [] : commandQueue.flush();\n if (commands.length === 0 && !isResume) return;\n\n // The flushed batch consumes the parentId; read it alongside the flush\n // (before any awaits) so a mid-run append keeps its own value. Resume\n // runs send no commands, so they neither send nor consume it.\n const parentId = isResume ? undefined : parentIdRef.current;\n if (!isResume) parentIdRef.current = undefined;\n\n const headers = await createRequestHeaders(options.headers);\n let resumeState: { runId: string; state: T } | undefined;\n if (isResume && options.resumeStateApi) {\n const resumeStateResponse = await fetch(options.resumeStateApi, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ threadId }),\n signal,\n });\n const retained = await readResumeState<T>(resumeStateResponse);\n if (retained === null) {\n if (commandQueue.state.queued.length > 0) {\n runManager.schedule();\n }\n return;\n }\n resumeState = retained;\n }\n\n const bodyValue =\n typeof options.body === \"function\"\n ? await options.body()\n : options.body;\n const context = runtime.thread.getModelContext();\n\n let requestBody: Record<string, unknown> = {\n commands,\n ...(resumeState === undefined && { state: agentStateRef.current }),\n system: context.system,\n tools: context.tools ? toToolsJSONSchema(context.tools) : undefined,\n threadId,\n ...(parentId !== undefined && {\n parentId,\n }),\n // nested (new format, aligned with AssistantChatTransport)\n callSettings: context.callSettings,\n config: context.config,\n // @deprecated spread at top level — use nested `callSettings`/`config` instead. Will be removed in a future version.\n ...context.callSettings,\n ...context.config,\n ...(bodyValue ?? {}),\n };\n\n if (options.prepareSendCommandsRequest) {\n requestBody = await options.prepareSendCommandsRequest(\n requestBody as SendCommandsRequestBody,\n );\n }\n\n if (resumeState !== undefined) {\n // The server replays a resume from the snapshot it retained for this\n // runId. Body overrides and prepare hooks can neither substitute a\n // state nor drop the ID the server validates against.\n requestBody = { ...requestBody, runId: resumeState.runId };\n delete requestBody[\"state\"];\n }\n\n const response = await fetch(\n isResume ? options.resumeApi! : options.api,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(requestBody),\n signal,\n },\n );\n\n try {\n await options.onResponse?.(response);\n } catch (error) {\n void response.body?.cancel().catch(() => {});\n throw error;\n }\n\n if (!response.ok) {\n throw new Error(`Status ${response.status}: ${await response.text()}`);\n }\n\n if (!response.body) {\n throw new Error(\"Response body is null\");\n }\n\n if (resumeState !== undefined) {\n agentStateRef.current = resumeState.state;\n rerender((prev) => prev + 1);\n }\n\n const body = await createReplayBoundaryStream(response, {\n setReplaying: setIsReplaying,\n waitForRender: waitForReplayRender,\n });\n\n // Select decoder based on protocol option\n const protocol = options.protocol ?? \"data-stream\";\n // Resume replays a best-effort buffer; always reconcile leniently.\n const strict = isResume ? false : (options.strict ?? true);\n const decoder =\n protocol === \"assistant-transport\"\n ? new AssistantTransportDecoder({ strict })\n : new DataStreamDecoder({ strict });\n\n let err: string | undefined;\n const stream = body.pipeThrough(decoder).pipeThrough(\n new AssistantMessageAccumulator({\n initialMessage: createInitialMessage({\n unstable_state:\n (agentStateRef.current as ReadonlyJSONValue) ?? null,\n }),\n throttle: isResume,\n strict,\n onError: (error) => {\n err = error;\n },\n }),\n );\n\n let markedDelivered = false;\n\n for await (const chunk of asAsyncIterableStream(stream)) {\n if (chunk.metadata.unstable_state === agentStateRef.current) continue;\n\n if (!markedDelivered) {\n commandQueue.markDelivered();\n markedDelivered = true;\n }\n\n agentStateRef.current = chunk.metadata.unstable_state as T;\n rerender((prev) => prev + 1);\n }\n\n if (err) {\n throw new Error(err);\n }\n\n // A successful run confirms delivery even when no state-changing\n // chunk was observed.\n if (!markedDelivered) {\n commandQueue.markDelivered();\n }\n\n // commands that coalesced into this resume run must not starve\n if (isResume && commandQueue.state.queued.length > 0) {\n runManager.schedule();\n }\n },\n onFinish: options.onFinish,\n onCancel: () => {\n setIsReplaying(false);\n const cmds = [\n ...commandQueue.state.inTransit,\n ...commandQueue.state.queued,\n ];\n\n commandQueue.reset();\n\n options.onCancel?.({\n commands: cmds,\n updateState: (updater) => {\n agentStateRef.current = updater(agentStateRef.current);\n rerender((prev) => prev + 1);\n },\n });\n },\n onError: async (error) => {\n resumeFlagRef.current = false;\n setIsReplaying(false);\n const inTransitCmds = [...commandQueue.state.inTransit];\n const queuedCmds = [...commandQueue.state.queued];\n\n commandQueue.reset();\n\n try {\n await options.onError?.(error as Error, {\n commands: inTransitCmds,\n updateState: (updater) => {\n agentStateRef.current = updater(agentStateRef.current);\n rerender((prev) => prev + 1);\n },\n });\n } finally {\n options.onCancel?.({\n commands: queuedCmds,\n updateState: (updater) => {\n agentStateRef.current = updater(agentStateRef.current);\n rerender((prev) => prev + 1);\n },\n error: error as Error,\n });\n }\n },\n });\n\n // Tool execution status state\n const [toolStatuses, setToolStatuses] = useState<\n Record<string, ToolExecutionStatus>\n >({});\n\n // Reactive conversion of agent state + connection metadata → UI state\n const pendingCommands = useMemo(\n () => [...commandQueue.state.inTransit, ...commandQueue.state.queued],\n [commandQueue.state],\n );\n const converted = useConvertedState(\n options.converter,\n agentStateRef.current,\n pendingCommands,\n runManager.isRunning,\n toolStatuses,\n );\n\n // Create runtime\n const runtime = useExternalStoreRuntime({\n messages: converted.messages,\n state: converted.state,\n isRunning: converted.isRunning,\n isLoading: isReplaying,\n adapters: options.adapters,\n unstable_enableToolInvocations: true,\n setToolStatuses,\n extras: {\n [symbolAssistantTransportExtras]: true,\n sendCommand: (command: AssistantTransportCommand) => {\n commandQueue.enqueue(command);\n },\n state: agentStateRef.current as UserExternalState,\n } satisfies AssistantTransportExtras,\n onNew: async (message: AppendMessage): Promise<void> =>\n enqueueAppendMessage(message),\n ...(options.capabilities?.edit && {\n onEdit: async (message: AppendMessage): Promise<void> =>\n enqueueAppendMessage(message),\n }),\n ...(commandQueue.state.queued.length > 0 && {\n onReload: async (parentId: string | null) => {\n parentIdRef.current = parentId;\n runManager.schedule();\n },\n }),\n onCancel: async () => {\n resumeFlagRef.current = false;\n runManager.cancel();\n },\n onResume: async () => {\n if (!options.resumeApi)\n throw new Error(\"Must pass resumeApi to options to resume runs\");\n\n resumeFlagRef.current = true;\n runManager.schedule();\n },\n onAddToolResult: async (\n toolOptions: AddToolResultOptions,\n ): Promise<void> => {\n const command: AddToolResultCommand = {\n type: \"add-tool-result\",\n toolCallId: toolOptions.toolCallId,\n result: toolOptions.result as ReadonlyJSONObject,\n toolName: toolOptions.toolName,\n isError: toolOptions.isError,\n ...(toolOptions.artifact && { artifact: toolOptions.artifact }),\n ...(toolOptions.modelContent !== undefined && {\n modelContent: toolOptions.modelContent,\n }),\n };\n\n commandQueue.enqueue(command);\n },\n onLoadExternalState: async (state) => {\n agentStateRef.current = state as T;\n rerender((prev) => prev + 1);\n },\n });\n\n return runtime;\n};\n\n/**\n * @alpha This is an experimental API that is subject to change.\n */\nexport const useAssistantTransportRuntime = <T>(\n options: AssistantTransportOptions<T>,\n): AssistantRuntime => {\n const runtime = useRemoteThreadListRuntime({\n runtimeHook: function RuntimeHook() {\n return useAssistantTransportThreadRuntime(options);\n },\n adapter: new InMemoryThreadListAdapter(),\n allowNesting: true,\n });\n return runtime;\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ToolExecutionStatus } from "../../../runtimes/tool-invocations/ToolInvocationTracker.js";
|
|
2
|
+
import { AssistantTransportCommand, AssistantTransportState, AssistantTransportStateConverter } from "./types.js";
|
|
3
|
+
//#region src/react/runtimes/assistant-transport/useConvertedState.d.ts
|
|
4
|
+
declare function useConvertedState<T>(converter: AssistantTransportStateConverter<T>, agentState: T, pendingCommands: AssistantTransportCommand[], isSending: boolean, toolStatuses: Record<string, ToolExecutionStatus>): AssistantTransportState;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { useConvertedState };
|
|
7
|
+
//# sourceMappingURL=useConvertedState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useConvertedState.d.ts","names":[],"sources":["../../../../src/react/runtimes/assistant-transport/useConvertedState.ts"],"mappings":";;;iBAQgB,kBAAkB,GAChC,WAAW,iCAAiC,IAC5C,YAAY,GACZ,iBAAiB,6BACjB,oBACA,cAAc,eAAe,uBAC5B"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
2
|
+
import "@assistant-ui/tap/react-shim";
|
|
3
|
+
//#region src/react/runtimes/assistant-transport/useConvertedState.ts
|
|
4
|
+
function useConvertedState(converter, agentState, pendingCommands, isSending, toolStatuses) {
|
|
5
|
+
const $ = c(6);
|
|
6
|
+
let t0;
|
|
7
|
+
if ($[0] !== agentState || $[1] !== converter || $[2] !== isSending || $[3] !== pendingCommands || $[4] !== toolStatuses) {
|
|
8
|
+
t0 = converter(agentState, {
|
|
9
|
+
pendingCommands,
|
|
10
|
+
isSending,
|
|
11
|
+
toolStatuses
|
|
12
|
+
});
|
|
13
|
+
$[0] = agentState;
|
|
14
|
+
$[1] = converter;
|
|
15
|
+
$[2] = isSending;
|
|
16
|
+
$[3] = pendingCommands;
|
|
17
|
+
$[4] = toolStatuses;
|
|
18
|
+
$[5] = t0;
|
|
19
|
+
} else t0 = $[5];
|
|
20
|
+
return t0;
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
export { useConvertedState };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=useConvertedState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useConvertedState.js","names":["useMemo","AssistantTransportCommand","AssistantTransportState","AssistantTransportStateConverter","ToolExecutionStatus","useConvertedState","converter","agentState","pendingCommands","isSending","toolStatuses","$","_c","t0"],"sources":["../../../../src/react/runtimes/assistant-transport/useConvertedState.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport type {\n AssistantTransportCommand,\n AssistantTransportState,\n AssistantTransportStateConverter,\n} from \"./types\";\nimport type { ToolExecutionStatus } from \"../../../runtimes/tool-invocations/ToolInvocationTracker\";\n\nexport function useConvertedState<T>(\n converter: AssistantTransportStateConverter<T>,\n agentState: T,\n pendingCommands: AssistantTransportCommand[],\n isSending: boolean,\n toolStatuses: Record<string, ToolExecutionStatus>,\n): AssistantTransportState {\n return useMemo(\n () => converter(agentState, { pendingCommands, isSending, toolStatuses }),\n [converter, agentState, pendingCommands, isSending, toolStatuses],\n );\n}\n"],"mappings":";;;AAQA,SAAOK,kBAAAC,WAAAC,YAAAC,iBAAAC,WAAAC,cAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAA,IAAAC;CAAA,IAAAF,EAAA,OAAAJ,cAAAI,EAAA,OAAAL,aAAAK,EAAA,OAAAF,aAAAE,EAAA,OAAAH,mBAAAG,EAAA,OAAAD,cAAA;EAQGG,KAAAP,UAAUC,YAAY;GAAAC;GAAAC;GAAAC;EAA2C,CAAC;EAACC,EAAA,KAAAJ;EAAAI,EAAA,KAAAL;EAAAK,EAAA,KAAAF;EAAAE,EAAA,KAAAH;EAAAG,EAAA,KAAAD;EAAAC,EAAA,KAAAE;CAAA,OAAAA,KAAAF,EAAA;CAAA,OAAnEE;AAAmE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLatestRef.d.ts","names":[],"sources":["../../../../src/react/runtimes/assistant-transport/useLatestRef.ts"],"mappings":";iBAEgB,aAAa,GAAG,OAAO;EAKrB,SAAS"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
2
|
+
import { useEffect, useRef } from "@assistant-ui/tap/react-shim";
|
|
3
|
+
//#region src/react/runtimes/assistant-transport/useLatestRef.ts
|
|
4
|
+
function useLatestRef(value) {
|
|
5
|
+
const $ = c(3);
|
|
6
|
+
const ref = useRef(value);
|
|
7
|
+
let t0;
|
|
8
|
+
let t1;
|
|
9
|
+
if ($[0] !== value) {
|
|
10
|
+
t0 = () => {
|
|
11
|
+
ref.current = value;
|
|
12
|
+
};
|
|
13
|
+
t1 = [value];
|
|
14
|
+
$[0] = value;
|
|
15
|
+
$[1] = t0;
|
|
16
|
+
$[2] = t1;
|
|
17
|
+
} else {
|
|
18
|
+
t0 = $[1];
|
|
19
|
+
t1 = $[2];
|
|
20
|
+
}
|
|
21
|
+
useEffect(t0, t1);
|
|
22
|
+
return ref;
|
|
23
|
+
}
|
|
24
|
+
//#endregion
|
|
25
|
+
export { useLatestRef };
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=useLatestRef.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLatestRef.js","names":["useEffect","useRef","useLatestRef","value","$","_c","ref","t0","t1","current","T"],"sources":["../../../../src/react/runtimes/assistant-transport/useLatestRef.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\n\nexport function useLatestRef<T>(value: T) {\n const ref = useRef(value);\n useEffect(() => {\n ref.current = value;\n }, [value]);\n return ref as { current: T };\n}\n"],"mappings":";;;AAEA,SAAOE,aAAAC,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CACL,MAAAC,MAAYL,OAAOE,KAAK;CAAE,IAAAI;CAAA,IAAAC;CAAA,IAAAJ,EAAA,OAAAD,OAAA;EAChBI,WAAA;GACRD,IAAGG,UAAWN;EAAH;EACVK,KAAA,CAACL,KAAK;EAACC,EAAA,KAAAD;EAAAC,EAAA,KAAAG;EAAAH,EAAA,KAAAI;CAAA,OAAA;EAAAD,KAAAH,EAAA;EAAAI,KAAAJ,EAAA;CAAA;CAFVJ,UAAUO,IAEPC,EAAO;CAAC,OACJF;AAAqB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantCloudThreadHistoryAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"AssistantCloudThreadHistoryAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"mappings":";;;;KA8RK;EACH;EACA;EACA;EACA;EACA;;KAoDG;EACH;EACA;EACA;EACA;EACA,aAAa;EACb;EACA;;KAmBG;EACH;EACA,YAAY;EACZ;EACA;EACA;EACA;EACA;EACA;EACA,WAAW;EACX,QAAQ;EACR;;iBAiCc,aAAa,GAAG,SAAS,IAAI;iBA+b7B,sCACd,UAAU,UAAU,kBACnB"}
|
|
@@ -14,35 +14,61 @@ var AssistantCloudThreadHistoryAdapter = class {
|
|
|
14
14
|
get aui() {
|
|
15
15
|
return this.getAui();
|
|
16
16
|
}
|
|
17
|
-
|
|
18
|
-
const key = getClientId(
|
|
17
|
+
getPersistence(threadListItem = this.aui.threadListItem) {
|
|
18
|
+
const key = getClientId(threadListItem);
|
|
19
19
|
if (!globalPersistence.has(key)) globalPersistence.set(key, new CloudMessagePersistence(() => this.cloudRef.current));
|
|
20
20
|
return globalPersistence.get(key);
|
|
21
21
|
}
|
|
22
|
+
get _persistence() {
|
|
23
|
+
return this.getPersistence();
|
|
24
|
+
}
|
|
25
|
+
tryGetKeyedThreadListItem() {
|
|
26
|
+
const live = this.aui.threadListItem;
|
|
27
|
+
if (!live.source) return void 0;
|
|
28
|
+
const id = live.getState().id;
|
|
29
|
+
if (id === void 0) return void 0;
|
|
30
|
+
return this.aui.threads.item({ id });
|
|
31
|
+
}
|
|
22
32
|
withFormat(formatAdapter) {
|
|
23
33
|
const adapter = this;
|
|
24
|
-
|
|
34
|
+
let threadListItem;
|
|
35
|
+
const pinCurrent = () => {
|
|
36
|
+
const next = adapter.tryGetKeyedThreadListItem();
|
|
37
|
+
if (next) threadListItem = next;
|
|
38
|
+
return threadListItem;
|
|
39
|
+
};
|
|
40
|
+
const resolvePinned = () => threadListItem ?? pinCurrent();
|
|
41
|
+
const getFormatted = () => createFormattedPersistence(adapter._persistence, formatAdapter);
|
|
42
|
+
const getTargetFormatted = (item) => createFormattedPersistence(adapter.getPersistence(item), formatAdapter);
|
|
25
43
|
return {
|
|
44
|
+
pin() {
|
|
45
|
+
pinCurrent();
|
|
46
|
+
},
|
|
26
47
|
async append(item) {
|
|
27
|
-
const
|
|
28
|
-
|
|
48
|
+
const pinned = resolvePinned();
|
|
49
|
+
if (!pinned) throw new Error("Cannot persist cloud history without a thread list item.");
|
|
50
|
+
const remoteId = pinned.getState().remoteId ?? (await pinned.initialize()).remoteId;
|
|
51
|
+
await getTargetFormatted(pinned).append(remoteId, item);
|
|
29
52
|
},
|
|
30
53
|
async update(item, localMessageId) {
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
54
|
+
const pinned = resolvePinned();
|
|
55
|
+
const remoteId = pinned?.getState().remoteId;
|
|
56
|
+
if (!remoteId || !pinned) return;
|
|
57
|
+
await getTargetFormatted(pinned).update?.(remoteId, item, localMessageId);
|
|
34
58
|
},
|
|
35
59
|
async delete() {
|
|
36
60
|
throw new Error("Assistant Cloud does not support deleting thread messages yet.");
|
|
37
61
|
},
|
|
38
62
|
reportTelemetry(items, options) {
|
|
39
63
|
const encodedRunMessages = items.map((item) => formatAdapter.encode(item));
|
|
40
|
-
adapter._reportRunTelemetry(formatAdapter.format, encodedRunMessages, options);
|
|
64
|
+
adapter._reportRunTelemetry(formatAdapter.format, encodedRunMessages, options, resolvePinned());
|
|
41
65
|
},
|
|
42
66
|
async load() {
|
|
43
|
-
|
|
67
|
+
pinCurrent();
|
|
68
|
+
const live = adapter.aui.threadListItem;
|
|
69
|
+
const remoteId = live.source ? live.getState().remoteId : void 0;
|
|
44
70
|
if (!remoteId) return { messages: [] };
|
|
45
|
-
return
|
|
71
|
+
return getFormatted().load(remoteId);
|
|
46
72
|
}
|
|
47
73
|
};
|
|
48
74
|
}
|
|
@@ -69,9 +95,9 @@ var AssistantCloudThreadHistoryAdapter = class {
|
|
|
69
95
|
if (!remoteId) return { messages: [] };
|
|
70
96
|
return { messages: (await this._persistence.load(remoteId, "aui/v0")).filter((m) => m.format === "aui/v0").map(auiV0Decode).reverse() };
|
|
71
97
|
}
|
|
72
|
-
_reportRunTelemetry(format, runMessages, options) {
|
|
98
|
+
_reportRunTelemetry(format, runMessages, options, threadListItem) {
|
|
73
99
|
if (!this.cloudRef.current.telemetry.enabled) return;
|
|
74
|
-
const remoteId = this.aui.threadListItem.getState().remoteId;
|
|
100
|
+
const remoteId = (threadListItem ?? this.aui.threadListItem).getState().remoteId;
|
|
75
101
|
if (!remoteId) return;
|
|
76
102
|
const extracted = extractRunTelemetry(format, runMessages);
|
|
77
103
|
if (!extracted) return;
|