@assistant-ui/core 0.3.14 → 0.3.16
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/voice.js +11 -0
- package/dist/adapters/voice.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/internal.d.ts +8 -2
- package/dist/internal.js +9 -3
- package/dist/model-context/frame/host.d.ts +1 -1
- package/dist/model-context/frame/host.d.ts.map +1 -1
- package/dist/model-context/frame/host.js +20 -5
- package/dist/model-context/frame/host.js.map +1 -1
- package/dist/model-context/frame/provider.d.ts +6 -0
- package/dist/model-context/frame/provider.d.ts.map +1 -1
- package/dist/model-context/frame/provider.js +126 -16
- package/dist/model-context/frame/provider.js.map +1 -1
- package/dist/model-context/frame/types.d.ts +4 -1
- package/dist/model-context/frame/types.d.ts.map +1 -1
- package/dist/model-context/frame/types.js.map +1 -1
- package/dist/model-context/interactable-composer-metadata.d.ts +1 -1
- package/dist/model-context/interactable-composer-metadata.js +1 -1
- package/dist/model-context/interactable-composer-metadata.js.map +1 -1
- package/dist/model-context/registry.d.ts +2 -2
- package/dist/model-context/registry.d.ts.map +1 -1
- package/dist/model-context/registry.js +9 -28
- package/dist/model-context/registry.js.map +1 -1
- package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
- package/dist/react/client/InMemoryThreadList.js +24 -20
- package/dist/react/client/InMemoryThreadList.js.map +1 -1
- package/dist/react/client/Interactables.d.ts.map +1 -1
- package/dist/react/client/Interactables.js +59 -177
- package/dist/react/client/Interactables.js.map +1 -1
- package/dist/react/client/RemoteThreadList.d.ts +1 -1
- package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
- package/dist/react/client/RemoteThreadList.js +117 -78
- package/dist/react/client/RemoteThreadList.js.map +1 -1
- package/dist/react/index.d.ts +2 -1
- package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
- package/dist/react/interactables-legacy/Interactables.js +56 -174
- package/dist/react/interactables-legacy/Interactables.js.map +1 -1
- package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts +24 -0
- package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -0
- package/dist/react/interactables-shared/useInteractablePersistenceQueue.js +138 -0
- package/dist/react/interactables-shared/useInteractablePersistenceQueue.js.map +1 -0
- package/dist/react/primitive-hooks/useActionBarCopy.js +7 -1
- package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
- package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts +3 -0
- package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadIsEmpty.js +3 -0
- package/dist/react/primitive-hooks/useThreadIsEmpty.js.map +1 -1
- package/dist/react/primitive-hooks/useThreadIsRunning.d.ts +3 -0
- package/dist/react/primitive-hooks/useThreadIsRunning.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadIsRunning.js +3 -0
- package/dist/react/primitive-hooks/useThreadIsRunning.js.map +1 -1
- package/dist/react/primitives/composer/ComposerIf.js.map +1 -1
- package/dist/react/primitives/composer/ComposerQueue.d.ts +2 -1
- package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
- package/dist/react/primitives/message/MessageParts.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +3 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +6 -0
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +7 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +174 -64
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadResource.js +2 -0
- package/dist/react/runtimes/RemoteThreadResource.js.map +1 -1
- package/dist/react/runtimes/assistant-transport/runManager.d.ts.map +1 -1
- package/dist/react/runtimes/assistant-transport/runManager.js +2 -12
- package/dist/react/runtimes/assistant-transport/runManager.js.map +1 -1
- package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
- package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js +1 -1
- package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js.map +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +3 -10
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +20 -67
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
- package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts +12 -0
- package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts.map +1 -0
- package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.js +10 -0
- package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.js.map +1 -0
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +38 -5
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
- package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js.map +1 -1
- package/dist/react/runtimes/createMessageConverter.d.ts +2 -1
- package/dist/react/runtimes/createMessageConverter.d.ts.map +1 -1
- package/dist/react/runtimes/external-message-converter.d.ts +6 -25
- package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
- package/dist/react/runtimes/external-message-converter.js +33 -233
- package/dist/react/runtimes/external-message-converter.js.map +1 -1
- package/dist/runtime/api/composer-runtime.d.ts +1 -1
- package/dist/runtime/api/composer-runtime.js.map +1 -1
- package/dist/runtime/api/thread-runtime.d.ts +1 -2
- package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
- package/dist/runtime/base/base-composer-runtime-core.d.ts +1 -1
- package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/base-composer-runtime-core.js +14 -29
- package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
- package/dist/runtime/base/base-thread-runtime-core.d.ts +2 -4
- package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/base-thread-runtime-core.js +3 -9
- package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
- package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +1 -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 +1 -1
- package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
- package/dist/runtime/interfaces/composer-runtime-core.d.ts +1 -1
- package/dist/runtime/interfaces/thread-runtime-core.d.ts +1 -1
- package/dist/runtime/internal.d.ts +2 -1
- package/dist/runtime/internal.js +2 -1
- package/dist/runtime/queue/external-thread-queue-adapter.d.ts +1 -1
- package/dist/runtime/queue/message-queue.d.ts.map +1 -1
- package/dist/runtime/queue/message-queue.js +1 -1
- package/dist/runtime/queue/message-queue.js.map +1 -1
- package/dist/runtime/queue/queue-item.d.ts +12 -0
- package/dist/runtime/queue/queue-item.d.ts.map +1 -0
- package/dist/runtime/queue/queue-item.js +6 -0
- package/dist/runtime/queue/queue-item.js.map +1 -0
- package/dist/runtime/utils/abortable-thread-load.d.ts +15 -0
- package/dist/runtime/utils/abortable-thread-load.d.ts.map +1 -0
- package/dist/runtime/utils/abortable-thread-load.js +35 -0
- package/dist/runtime/utils/abortable-thread-load.js.map +1 -0
- package/dist/runtime/utils/attachment-add-operations.d.ts +18 -0
- package/dist/runtime/utils/attachment-add-operations.d.ts.map +1 -0
- package/dist/runtime/utils/attachment-add-operations.js +43 -0
- package/dist/runtime/utils/attachment-add-operations.js.map +1 -0
- package/dist/runtime/utils/auto-status.d.ts +6 -1
- package/dist/runtime/utils/auto-status.d.ts.map +1 -1
- package/dist/runtime/utils/auto-status.js +7 -1
- package/dist/runtime/utils/auto-status.js.map +1 -1
- package/dist/runtime/utils/external-message-conversion.d.ts +47 -0
- package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -0
- package/dist/runtime/utils/external-message-conversion.js +221 -0
- package/dist/runtime/utils/external-message-conversion.js.map +1 -0
- package/dist/runtime/utils/external-store-message.d.ts +2 -1
- package/dist/runtime/utils/external-store-message.d.ts.map +1 -1
- package/dist/runtime/utils/external-store-message.js +2 -1
- package/dist/runtime/utils/external-store-message.js.map +1 -1
- package/dist/runtime/utils/message-repository-session.d.ts +30 -0
- package/dist/runtime/utils/message-repository-session.d.ts.map +1 -0
- package/dist/runtime/utils/message-repository-session.js +130 -0
- package/dist/runtime/utils/message-repository-session.js.map +1 -0
- package/dist/runtime/utils/message-repository.d.ts.map +1 -1
- package/dist/runtime/utils/message-repository.js +30 -22
- package/dist/runtime/utils/message-repository.js.map +1 -1
- package/dist/runtime/utils/pending-tool-calls.d.ts +20 -0
- package/dist/runtime/utils/pending-tool-calls.d.ts.map +1 -0
- package/dist/runtime/utils/pending-tool-calls.js +22 -0
- package/dist/runtime/utils/pending-tool-calls.js.map +1 -0
- package/dist/runtime/utils/thread-message-like.d.ts +2 -1
- package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
- package/dist/runtime/utils/thread-message-like.js.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +2 -5
- 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 +3 -10
- 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 +19 -1
- 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 +124 -20
- package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
- package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts +102 -0
- package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts.map +1 -0
- package/dist/runtimes/inert/InertThreadRuntimeCore.js +156 -0
- package/dist/runtimes/inert/InertThreadRuntimeCore.js.map +1 -0
- package/dist/runtimes/local/local-thread-runtime-core.d.ts +3 -1
- package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/local/local-thread-runtime-core.js +45 -8
- package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
- package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +12 -60
- package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
- package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +10 -145
- package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
- package/dist/runtimes/remote-thread-list/adapter-changed.d.ts +9 -0
- package/dist/runtimes/remote-thread-list/adapter-changed.d.ts.map +1 -0
- package/dist/runtimes/remote-thread-list/adapter-changed.js +13 -0
- package/dist/runtimes/remote-thread-list/adapter-changed.js.map +1 -0
- package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/empty-thread-core.js +16 -155
- package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
- package/dist/runtimes/remote-thread-list/optimistic-state.d.ts +2 -0
- package/dist/runtimes/remote-thread-list/optimistic-state.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/optimistic-state.js +11 -0
- package/dist/runtimes/remote-thread-list/optimistic-state.js.map +1 -1
- package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +12 -1
- package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/remote-thread-state.js +77 -1
- package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
- package/dist/runtimes/remote-thread-list/types.d.ts +3 -0
- package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
- package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
- package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +2 -0
- package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
- package/dist/store/clients/external-thread.d.ts.map +1 -1
- package/dist/store/clients/external-thread.js +75 -100
- package/dist/store/clients/external-thread.js.map +1 -1
- package/dist/store/clients/single-thread-list.d.ts.map +1 -1
- package/dist/store/clients/single-thread-list.js +1 -1
- package/dist/store/clients/single-thread-list.js.map +1 -1
- package/dist/store/clients/suggestions.d.ts.map +1 -1
- package/dist/store/clients/suggestions.js +16 -7
- package/dist/store/clients/suggestions.js.map +1 -1
- package/dist/store/index.d.ts +4 -2
- package/dist/store/runtime-clients/handle-runtime-action.d.ts.map +1 -1
- package/dist/store/runtime-clients/handle-runtime-action.js +2 -0
- package/dist/store/runtime-clients/handle-runtime-action.js.map +1 -1
- package/dist/store/scope-registration.d.ts +1 -1
- package/dist/store/scopes/composer.d.ts +2 -1
- package/dist/store/scopes/composer.d.ts.map +1 -1
- package/dist/store/scopes/message.d.ts +1 -1
- package/dist/store/scopes/queue-item.d.ts +2 -9
- package/dist/store/scopes/queue-item.d.ts.map +1 -1
- package/dist/store/scopes/queue-item.js +0 -6
- package/dist/types/message.d.ts +8 -4
- package/dist/types/message.d.ts.map +1 -1
- package/dist/types/message.js.map +1 -1
- package/dist/utils/data-url.d.ts +14 -1
- package/dist/utils/data-url.d.ts.map +1 -1
- package/dist/utils/data-url.js +13 -1
- package/dist/utils/data-url.js.map +1 -1
- package/dist/utils/invoke-user-callback.d.ts +5 -0
- package/dist/utils/invoke-user-callback.d.ts.map +1 -0
- package/dist/utils/invoke-user-callback.js +19 -0
- package/dist/utils/invoke-user-callback.js.map +1 -0
- package/dist/utils/normalizePartStatus.js.map +1 -1
- package/dist/utils/silent-runtime-action.d.ts +6 -0
- package/dist/utils/silent-runtime-action.d.ts.map +1 -0
- package/dist/utils/silent-runtime-action.js +7 -0
- package/dist/utils/silent-runtime-action.js.map +1 -0
- package/package.json +10 -10
- package/src/adapters/voice.test.ts +66 -1
- package/src/adapters/voice.ts +8 -0
- package/src/internal.ts +13 -0
- package/src/model-context/frame/host.test.ts +152 -9
- package/src/model-context/frame/host.ts +23 -5
- package/src/model-context/frame/provider.test.ts +601 -19
- package/src/model-context/frame/provider.ts +158 -20
- package/src/model-context/frame/types.ts +5 -0
- package/src/model-context/interactable-composer-metadata.ts +1 -1
- package/src/model-context/registry.test.ts +44 -0
- package/src/model-context/registry.ts +13 -35
- package/src/react/client/InMemoryThreadList.test.tsx +49 -0
- package/src/react/client/InMemoryThreadList.ts +7 -1
- package/src/react/client/Interactables.ts +19 -178
- package/src/react/client/RemoteThreadList.test.ts +292 -0
- package/src/react/client/RemoteThreadList.ts +119 -82
- package/src/react/interactables-legacy/Interactables.ts +20 -177
- package/src/react/interactables-shared/useInteractablePersistenceQueue.test.tsx +161 -0
- package/src/react/interactables-shared/useInteractablePersistenceQueue.ts +206 -0
- package/src/react/primitive-hooks/useActionBarCopy.test.ts +15 -0
- package/src/react/primitive-hooks/useActionBarCopy.ts +13 -3
- package/src/react/primitive-hooks/useThreadIsEmpty.ts +3 -0
- package/src/react/primitive-hooks/useThreadIsRunning.ts +3 -0
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +12 -0
- package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.republish.test.ts +87 -0
- package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +251 -76
- package/src/react/runtimes/RemoteThreadResource.ts +2 -0
- package/src/react/runtimes/assistant-transport/runManager.ts +4 -17
- package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.test.tsx +58 -0
- package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts +3 -1
- package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +92 -0
- package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +40 -141
- package/src/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.test.ts +37 -0
- package/src/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.ts +18 -0
- package/src/react/runtimes/cloud/useCloudThreadListAdapter.test.tsx +98 -3
- package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +68 -6
- package/src/react/runtimes/external-message-converter.test.ts +0 -14
- package/src/react/runtimes/external-message-converter.test.tsx +77 -0
- package/src/react/runtimes/external-message-converter.ts +58 -481
- package/src/react/runtimes/useLocalRuntime.test.tsx +5 -5
- package/src/runtime/api/composer-runtime.ts +1 -1
- package/src/runtime/api/message-runtime.test.ts +28 -1
- package/src/runtime/base/base-composer-runtime-core.ts +20 -40
- package/src/runtime/base/base-thread-runtime-core.test.ts +16 -0
- package/src/runtime/base/base-thread-runtime-core.ts +6 -11
- package/src/runtime/base/default-thread-composer-runtime-core.ts +1 -4
- package/src/runtime/interfaces/composer-runtime-core.ts +1 -1
- package/src/runtime/interfaces/thread-runtime-core.ts +1 -1
- package/src/runtime/internal.ts +5 -0
- package/src/runtime/queue/external-thread-queue-adapter.ts +1 -1
- package/src/runtime/queue/message-queue.ts +1 -4
- package/src/runtime/queue/queue-item.ts +10 -0
- package/src/runtime/utils/abortable-thread-load.test.ts +87 -0
- package/src/runtime/utils/abortable-thread-load.ts +53 -0
- package/src/runtime/utils/attachment-add-operations.ts +59 -0
- package/src/runtime/utils/auto-status.ts +33 -0
- package/src/runtime/utils/external-message-conversion.test.ts +113 -0
- package/src/runtime/utils/external-message-conversion.ts +494 -0
- package/src/runtime/utils/external-store-message.ts +2 -0
- package/src/runtime/utils/message-repository-session.test.ts +195 -0
- package/src/runtime/utils/message-repository-session.ts +176 -0
- package/src/runtime/utils/message-repository.ts +33 -22
- package/src/runtime/utils/pending-tool-calls.test.ts +57 -0
- package/src/runtime/utils/pending-tool-calls.ts +35 -0
- package/src/runtime/utils/thread-message-like.ts +2 -0
- package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +6 -14
- package/src/runtimes/external-store/external-store-thread-runtime-core.ts +179 -28
- package/src/runtimes/inert/InertThreadRuntimeCore.test.ts +253 -0
- package/src/runtimes/inert/InertThreadRuntimeCore.ts +232 -0
- package/src/runtimes/local/local-thread-runtime-core.test.ts +491 -1
- package/src/runtimes/local/local-thread-runtime-core.ts +86 -11
- package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +17 -209
- package/src/runtimes/remote-thread-list/adapter-changed.ts +10 -0
- package/src/runtimes/remote-thread-list/empty-thread-core.ts +28 -221
- package/src/runtimes/remote-thread-list/optimistic-state.test.ts +18 -0
- package/src/runtimes/remote-thread-list/optimistic-state.ts +13 -0
- package/src/runtimes/remote-thread-list/remote-thread-state.test.ts +37 -0
- package/src/runtimes/remote-thread-list/remote-thread-state.ts +123 -0
- package/src/runtimes/remote-thread-list/types.ts +4 -0
- package/src/runtimes/tool-invocations/EDGE_CASES.md +17 -0
- package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +140 -0
- package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +3 -0
- package/src/store/clients/external-thread.ts +17 -62
- package/src/store/clients/single-thread-list.ts +4 -1
- package/src/store/clients/suggestions.test.ts +31 -0
- package/src/store/clients/suggestions.ts +18 -19
- package/src/store/runtime-clients/handle-runtime-action.test.ts +40 -0
- package/src/store/runtime-clients/handle-runtime-action.ts +3 -0
- package/src/store/scopes/message.ts +1 -1
- package/src/store/scopes/queue-item.ts +2 -9
- package/src/tests/MessageRepository.test.ts +125 -0
- package/src/tests/RemoteThreadListThreadListRuntimeCore-errors.test.ts +2 -2
- package/src/tests/RemoteThreadListThreadListRuntimeCore-load-race.test.ts +194 -0
- package/src/tests/RemoteThreadListThreadListRuntimeCore-loadMore.test.ts +8 -6
- package/src/tests/RemoteThreadListThreadListRuntimeCore-title-race.test.ts +158 -0
- package/src/tests/empty-thread-core.test.ts +6 -0
- package/src/tests/external-store-thread-runtime-core-adapter.test.ts +184 -0
- package/src/tests/external-store-thread-runtime-core.test.ts +642 -0
- package/src/tests/external-thread-attachments.test.tsx +173 -0
- package/src/tests/external-thread-isEmpty.test.tsx +100 -0
- package/src/tests/remote-thread-list-adapter-switch.test.ts +383 -0
- package/src/tests/single-thread-list-item.test.tsx +47 -0
- package/src/tests/thread-message-like.test.ts +39 -1
- package/src/tests/useRemoteThreadListRuntime-controlled.test.tsx +67 -0
- package/src/types/message.ts +9 -4
- package/src/utils/data-url.test.ts +52 -1
- package/src/utils/data-url.ts +21 -0
- package/src/utils/invoke-user-callback.test.ts +82 -0
- package/src/utils/invoke-user-callback.ts +31 -0
- package/src/utils/normalizePartStatus.ts +1 -1
- package/src/utils/silent-runtime-action.ts +6 -0
- package/dist/store/scopes/queue-item.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoteThreadListThreadListRuntimeCore.js","names":["ThreadListRuntimeCore","generateId","BaseSubscribable","OptimisticState","EMPTY_THREAD_CORE","RemoteThreadData","RemoteThreadState","classifyThreads","createThreadMappingId","getThreadData","normalizeCursor","updateStatusReducer","RemoteThreadListAdapter","RemoteThreadListOptions","RemoteThreadListHookInstanceManager","isTitleSourceMessage","ComponentType","FC","Fragment","PropsWithChildren","useEffect","useId","useAui","create","AssistantMessageStream","ModelContextProvider","RuntimeAdapterProvider","useStableRuntimeAdapters","threadNotFoundError","threadIdOrRemoteId","action","Error","threadStatusError","status","RemoteThreadListThreadListRuntimeCore","_options","_hookManager","_runtimeAdapters","modelContext","_loadThreadsPromise","Promise","_loadMorePromise","_loadGeneration","_switchGeneration","_switchTask","_mainThreadId","_state","isLoading","isLoadingMore","cursor","undefined","newThreadId","threadIds","archivedThreadIds","threadIdMap","threadData","_useAdaptersProvider","children","useAdapters","adapter","unstable_useAdapters","_SynthesizedAdapters","NonNullable","adapters","resolveProvider","unstable_Provider","threadItems","value","getLoadThreadsPromise","generation","optimisticUpdate","execute","list","loading","state","then","l","fresh","threads","nextCursor","catch","error","console","update","baseValue","loadMore","initialState","resolve","dedup","after","appended","constructor","options","contextProvider","subscribe","_notifySubscribers","_notifyThreadIdChange","runtimeHook","__internal_setDefaultAdapters","__internal_subscribeRunningChanged","useProvider","Provider","__internal_setOptions","switchToNewThread","_initialThreadLoaded","adapterChanged","controlledThreadIdChanged","threadId","getState","setState","setRuntimeHook","_switchToThreadFromProp","__internal_load","startThreadId","initialThreadId","switchTask","switchToThread","reloadMainThread","getItemById","runtimeCore","getThreadRuntimeCore","unstable_refetchThread","__internal_restartThreadRuntime","reload","hasMore","mainThreadId","_mainThreadRemoteId","remoteId","_lastNotifiedThreadId","emit","onThreadIdChange","getMainThreadRuntimeCore","result","data","id","unstable_isThreadRunning","__internal_isThreadRunning","unarchive","_startSwitchToThread","emitThreadIdChange","task","_switchToThread","remoteMetadata","fetch","mappingId","newThreadData","initializeTask","externalId","title","lastMessageAt","custom","newThreadIdMap","wasInTarget","includes","threadIdsWithoutRemote","filter","archivedThreadIdsWithoutRemote","newThreadIds","newArchivedThreadIds","startThreadRuntime","_startSwitchToNewThread","_switchToNewThread","waitForUpdate","initialize","optimistic","generateTitle","messages","stream","messageStream","fromAssistantStream","newTitle","parts","c","type","text","currentData","rename","updateCustom","Record","_ensureThreadIsNotMain","lastAwaitedTask","startedFallback","archive","delete","stopThreadRuntime","__internal_dispose","detach","useBoundIds","__internal_RenderComponent","s","i","boundIds","aui","enabled","length"],"sources":["../../../src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx"],"sourcesContent":["import type { ThreadListRuntimeCore } from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport { generateId } from \"../../utils/id\";\nimport { BaseSubscribable } from \"../../subscribable/subscribable\";\nimport { OptimisticState } from \"../../runtimes/remote-thread-list/optimistic-state\";\nimport { EMPTY_THREAD_CORE } from \"../../runtimes/remote-thread-list/empty-thread-core\";\nimport type {\n RemoteThreadData,\n RemoteThreadState,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport {\n classifyThreads,\n createThreadMappingId,\n getThreadData,\n normalizeCursor,\n updateStatusReducer,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport type {\n RemoteThreadListAdapter,\n RemoteThreadListOptions,\n} from \"../../runtimes/remote-thread-list/types\";\nimport { RemoteThreadListHookInstanceManager } from \"./RemoteThreadListHookInstanceManager\";\nimport { isTitleSourceMessage } from \"./RemoteThreadResource\";\nimport {\n type ComponentType,\n type FC,\n Fragment,\n type PropsWithChildren,\n useEffect,\n useId,\n} from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { create } from \"zustand\";\nimport { AssistantMessageStream } from \"assistant-stream\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport { RuntimeAdapterProvider } from \"./RuntimeAdapterProvider\";\nimport { useStableRuntimeAdapters } from \"./useRuntimeAdapters\";\n\nconst threadNotFoundError = (threadIdOrRemoteId: string, action: string) =>\n new Error(`Thread \"${threadIdOrRemoteId}\" not found while ${action}.`);\n\nconst threadStatusError = (\n threadIdOrRemoteId: string,\n status: RemoteThreadData[\"status\"],\n action: string,\n) =>\n new Error(\n `Thread \"${threadIdOrRemoteId}\" has status \"${status}\", so it cannot ${action}.`,\n );\n\nexport class RemoteThreadListThreadListRuntimeCore\n extends BaseSubscribable\n implements ThreadListRuntimeCore\n{\n private _options!: RemoteThreadListOptions;\n private readonly _hookManager: RemoteThreadListHookInstanceManager;\n private readonly _runtimeAdapters: { modelContext: ModelContextProvider };\n\n private _loadThreadsPromise: Promise<void> | undefined;\n private _loadMorePromise: Promise<void> | undefined;\n private _loadGeneration = 0;\n private _switchGeneration = 0;\n private _switchTask: Promise<void> | undefined;\n\n private _mainThreadId!: string;\n private readonly _state = new OptimisticState<RemoteThreadState>({\n isLoading: true,\n isLoadingMore: false,\n cursor: undefined,\n newThreadId: undefined,\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n private readonly _useAdaptersProvider: FC<PropsWithChildren> = ({\n children,\n }) => {\n const useAdapters = this._options.adapter.unstable_useAdapters;\n if (useAdapters === undefined) return children;\n return (\n <this._SynthesizedAdapters useAdapters={useAdapters}>\n {children}\n </this._SynthesizedAdapters>\n );\n };\n\n private readonly _SynthesizedAdapters: FC<\n PropsWithChildren<{\n useAdapters: NonNullable<RemoteThreadListAdapter[\"unstable_useAdapters\"]>;\n }>\n > = ({ useAdapters, children }) => {\n const adapters = useStableRuntimeAdapters(useAdapters());\n if (adapters == null) return children;\n return (\n <RuntimeAdapterProvider adapters={adapters}>\n {children}\n </RuntimeAdapterProvider>\n );\n };\n\n private resolveProvider(\n adapter: RemoteThreadListAdapter,\n ): ComponentType<PropsWithChildren> {\n if (adapter.unstable_Provider !== undefined) {\n return adapter.unstable_Provider as ComponentType<PropsWithChildren>;\n }\n if (adapter.unstable_useAdapters === undefined) return Fragment;\n return this._useAdaptersProvider;\n }\n\n public get threadItems() {\n return this._state.value.threadData;\n }\n\n public getLoadThreadsPromise() {\n // TODO this needs to be cached in case this promise is loaded during suspense\n if (!this._loadThreadsPromise) {\n const generation = this._loadGeneration;\n this._loadThreadsPromise = this._state\n .optimisticUpdate({\n execute: () => this._options.adapter.list(),\n loading: (state) => {\n return {\n ...state,\n isLoading: true,\n };\n },\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n const fresh = classifyThreads(l.threads, {\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n return {\n ...state,\n isLoading: false,\n cursor: normalizeCursor(l.nextCursor),\n threadIds: fresh.threadIds,\n archivedThreadIds: fresh.archivedThreadIds,\n threadIdMap: {\n ...state.threadIdMap,\n ...fresh.threadIdMap,\n },\n threadData: {\n ...state.threadData,\n ...fresh.threadData,\n },\n };\n },\n })\n .catch((error: unknown) => {\n if (generation !== this._loadGeneration) return;\n console.error(\"[assistant-ui] thread list load failed:\", error);\n this._loadThreadsPromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n isLoading: false,\n });\n })\n .then(() => {});\n }\n\n return this._loadThreadsPromise;\n }\n\n public loadMore(): Promise<void> {\n if (this._loadMorePromise) return this._loadMorePromise;\n\n const initialState = this._state.value;\n if (initialState.cursor === undefined || initialState.isLoading) {\n return Promise.resolve();\n }\n\n const generation = this._loadGeneration;\n const adapter = this._options.adapter;\n const cursor = initialState.cursor;\n\n const dedup = this._state\n .optimisticUpdate({\n execute: () => adapter.list({ after: cursor }),\n loading: (state) => ({ ...state, isLoadingMore: true }),\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n if (adapter !== this._options.adapter) return state;\n\n const appended = classifyThreads(l.threads, {\n threadIds: [...state.threadIds],\n archivedThreadIds: [...state.archivedThreadIds],\n threadIdMap: { ...state.threadIdMap },\n threadData: { ...state.threadData },\n });\n\n return {\n ...state,\n isLoadingMore: false,\n cursor: normalizeCursor(l.nextCursor),\n threadIds: appended.threadIds,\n archivedThreadIds: appended.archivedThreadIds,\n threadIdMap: appended.threadIdMap,\n threadData: appended.threadData,\n };\n },\n })\n .catch((error: unknown) => {\n console.error(\"[assistant-ui] thread list loadMore failed:\", error);\n })\n .then(() => {\n if (this._loadMorePromise === dedup) {\n this._loadMorePromise = undefined;\n }\n });\n\n this._loadMorePromise = dedup;\n return dedup;\n }\n\n constructor(\n options: RemoteThreadListOptions,\n contextProvider: ModelContextProvider,\n ) {\n super();\n\n this._state.subscribe(() => {\n this._notifySubscribers();\n this._notifyThreadIdChange();\n });\n this._runtimeAdapters = { modelContext: contextProvider };\n this._hookManager = new RemoteThreadListHookInstanceManager(\n options.runtimeHook,\n this,\n );\n this._hookManager.__internal_setDefaultAdapters(this._runtimeAdapters);\n this._hookManager.__internal_subscribeRunningChanged(() =>\n this._notifySubscribers(),\n );\n this.useProvider = create(() => ({\n Provider: this.resolveProvider(options.adapter),\n }));\n this.__internal_setOptions(options);\n this.switchToNewThread();\n }\n\n private _initialThreadLoaded = false;\n private useProvider;\n\n public __internal_setOptions(options: RemoteThreadListOptions) {\n if (this._options === options) return;\n\n const adapterChanged =\n this._options !== undefined && this._options.adapter !== options.adapter;\n const controlledThreadIdChanged =\n this._initialThreadLoaded &&\n this._options !== undefined &&\n this._options.threadId !== options.threadId;\n\n this._options = options;\n\n const Provider = this.resolveProvider(options.adapter);\n if (Provider !== this.useProvider.getState().Provider) {\n this.useProvider.setState({ Provider }, true);\n }\n\n this._hookManager.setRuntimeHook(options.runtimeHook);\n\n if (adapterChanged) {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n }\n\n if (controlledThreadIdChanged) {\n this._switchToThreadFromProp(options.threadId).catch(() => {});\n }\n }\n\n public __internal_load() {\n this.getLoadThreadsPromise(); // begin loading on initial bind\n if (this._initialThreadLoaded) return;\n this._initialThreadLoaded = true;\n\n const startThreadId =\n this._options.threadId ?? this._options.initialThreadId;\n if (startThreadId !== undefined) {\n const switchTask =\n this._options.threadId !== undefined\n ? this._switchToThreadFromProp(startThreadId)\n : this.switchToThread(startThreadId);\n switchTask.catch(() => {});\n }\n }\n\n public async reloadMainThread(): Promise<void> {\n const threadId = this._mainThreadId;\n if (threadId === undefined) return;\n\n // An unsent thread holds no remote state, so a refetch would only discard\n // what the user has typed.\n if (this.getItemById(threadId)?.status === \"new\") return;\n\n const runtimeCore = this._hookManager.getThreadRuntimeCore(threadId);\n\n try {\n if (runtimeCore?.unstable_refetchThread) {\n // Called on the core so class-method implementations keep `this`.\n await runtimeCore.unstable_refetchThread();\n } else {\n await this._hookManager.__internal_restartThreadRuntime(threadId);\n }\n } catch (error) {\n // delete and detach switch the main thread away before stopping the\n // runtime, so a rejection once that has happened belongs to them.\n if (threadId !== this._mainThreadId) return;\n throw error;\n }\n\n if (threadId !== this._mainThreadId) return;\n this._notifySubscribers();\n }\n\n public reload() {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n return this.getLoadThreadsPromise();\n }\n\n public get isLoading() {\n return this._state.value.isLoading;\n }\n\n public get isLoadingMore() {\n return this._state.value.isLoadingMore;\n }\n\n public get hasMore() {\n return this._state.value.cursor !== undefined;\n }\n\n public get threadIds() {\n return this._state.value.threadIds;\n }\n\n public get archivedThreadIds() {\n return this._state.value.archivedThreadIds;\n }\n\n public get newThreadId() {\n return this._state.value.newThreadId;\n }\n\n public get mainThreadId(): string {\n return this._mainThreadId;\n }\n\n // The settled remote ID of the active thread, or undefined while it is still\n // a new/optimistic thread. This is the value surfaced to `onThreadIdChange`.\n private get _mainThreadRemoteId(): string | undefined {\n if (this._mainThreadId === undefined) return undefined;\n return getThreadData(this._state.value, this._mainThreadId)?.remoteId;\n }\n\n private _lastNotifiedThreadId: string | undefined = undefined;\n\n private _notifyThreadIdChange(emit = true) {\n const threadId = this._mainThreadRemoteId;\n if (this._lastNotifiedThreadId === threadId) return;\n this._lastNotifiedThreadId = threadId;\n if (emit) {\n this._options.onThreadIdChange?.(threadId);\n }\n }\n\n public getMainThreadRuntimeCore() {\n const result = this._hookManager.getThreadRuntimeCore(this._mainThreadId);\n if (!result) return EMPTY_THREAD_CORE;\n return result;\n }\n\n public getThreadRuntimeCore(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data)\n throw threadNotFoundError(threadIdOrRemoteId, \"getting its runtime\");\n\n const result = this._hookManager.getThreadRuntimeCore(data.id);\n if (!result)\n throw new Error(\n `Runtime for thread \"${threadIdOrRemoteId}\" not found while getting its runtime.`,\n );\n return result;\n }\n\n public unstable_isThreadRunning(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) return false;\n return this._hookManager.__internal_isThreadRunning(data.id);\n }\n\n public getItemById(threadIdOrRemoteId: string) {\n return getThreadData(this._state.value, threadIdOrRemoteId);\n }\n\n public switchToThread(\n threadIdOrRemoteId: string,\n options?: { unarchive?: boolean },\n ): Promise<void> {\n return this._startSwitchToThread(threadIdOrRemoteId, options, true);\n }\n\n private _startSwitchToThread(\n threadIdOrRemoteId: string,\n options: { unarchive?: boolean } | undefined,\n emitThreadIdChange: boolean,\n ): Promise<void> {\n const generation = ++this._switchGeneration;\n const task = this._switchToThread(\n threadIdOrRemoteId,\n options,\n generation,\n emitThreadIdChange,\n );\n this._switchTask = task;\n return task;\n }\n\n private async _switchToThread(\n threadIdOrRemoteId: string,\n options: { unarchive?: boolean } | undefined,\n generation: number,\n emitThreadIdChange: boolean,\n ): Promise<void> {\n let data = this.getItemById(threadIdOrRemoteId);\n\n if (!data) {\n const remoteMetadata =\n await this._options.adapter.fetch(threadIdOrRemoteId);\n if (generation !== this._switchGeneration) return;\n\n const state = this._state.value;\n const mappingId = createThreadMappingId(remoteMetadata.remoteId);\n\n const newThreadData = {\n ...state.threadData,\n [mappingId]: {\n id: mappingId,\n initializeTask: Promise.resolve({\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n }),\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n status: remoteMetadata.status,\n title: remoteMetadata.title,\n lastMessageAt: remoteMetadata.lastMessageAt,\n custom: remoteMetadata.custom,\n } as RemoteThreadData,\n };\n\n const newThreadIdMap = {\n ...state.threadIdMap,\n [remoteMetadata.remoteId]: mappingId,\n };\n\n // A concurrent `list()` may already have placed this thread; keep that\n // position and only merge metadata. A genuinely absent thread stays\n // appended: it may live on an unloaded page, and a prepend would pin it\n // above newer threads permanently since `classifyThreads` skips ids it\n // has already seen. Filtering both arrays first still prevents\n // duplication or a wrong-status entry from `list()`.\n const remoteId = remoteMetadata.remoteId;\n const wasInTarget =\n remoteMetadata.status === \"regular\"\n ? state.threadIds.includes(remoteId)\n : state.archivedThreadIds.includes(remoteId);\n\n const threadIdsWithoutRemote = state.threadIds.filter(\n (id) => id !== remoteId,\n );\n const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter(\n (id) => id !== remoteId,\n );\n\n const newThreadIds =\n remoteMetadata.status === \"regular\"\n ? wasInTarget\n ? state.threadIds\n : [...threadIdsWithoutRemote, remoteId]\n : threadIdsWithoutRemote;\n const newArchivedThreadIds =\n remoteMetadata.status === \"archived\"\n ? wasInTarget\n ? state.archivedThreadIds\n : [...archivedThreadIdsWithoutRemote, remoteId]\n : archivedThreadIdsWithoutRemote;\n\n this._state.update({\n ...state,\n threadIds: newThreadIds,\n archivedThreadIds: newArchivedThreadIds,\n threadIdMap: newThreadIdMap,\n threadData: newThreadData,\n });\n\n data = this.getItemById(threadIdOrRemoteId);\n }\n\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"switching to it\");\n if (this._mainThreadId === data.id) return;\n\n const task = this._hookManager.startThreadRuntime(data.id);\n if (this.mainThreadId !== undefined) {\n await task;\n } else {\n void task.then(\n () => this._notifySubscribers(),\n () => undefined,\n );\n }\n\n if (generation !== this._switchGeneration) return;\n\n if (data.status === \"archived\" && options?.unarchive !== false) {\n await this.unarchive(data.id);\n if (generation !== this._switchGeneration) return;\n }\n this._mainThreadId = data.id;\n\n this._notifySubscribers();\n this._notifyThreadIdChange(emitThreadIdChange);\n }\n\n public switchToNewThread(): Promise<void> {\n return this._startSwitchToNewThread(true);\n }\n\n private _switchToThreadFromProp(threadId: string | undefined): Promise<void> {\n return threadId !== undefined\n ? this._startSwitchToThread(threadId, undefined, false)\n : this._startSwitchToNewThread(false);\n }\n\n private _startSwitchToNewThread(emitThreadIdChange: boolean): Promise<void> {\n const generation = ++this._switchGeneration;\n const task = this._switchToNewThread(generation, emitThreadIdChange);\n this._switchTask = task;\n return task;\n }\n\n private async _switchToNewThread(\n generation: number,\n emitThreadIdChange: boolean,\n ): Promise<void> {\n // an initialization transaction is in progress, wait for it to settle\n while (\n this._state.baseValue.newThreadId !== undefined &&\n this._state.value.newThreadId === undefined\n ) {\n await this._state.waitForUpdate();\n if (generation !== this._switchGeneration) return;\n }\n\n const state = this._state.baseValue;\n let id: string | undefined = this._state.value.newThreadId;\n if (id === undefined) {\n do {\n id = `__LOCALID_${generateId()}`;\n } while (state.threadIdMap[id]);\n\n const mappingId = createThreadMappingId(id);\n this._state.update({\n ...state,\n newThreadId: id,\n threadIdMap: {\n ...state.threadIdMap,\n [id]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n status: \"new\",\n id,\n remoteId: undefined,\n externalId: undefined,\n title: undefined,\n custom: undefined,\n } satisfies RemoteThreadData,\n },\n });\n }\n\n return this._switchToThread(id, undefined, generation, emitThreadIdChange);\n }\n\n public initialize = async (threadId: string) => {\n if (this._state.value.newThreadId !== threadId) {\n const data = this.getItemById(threadId);\n if (!data) throw threadNotFoundError(threadId, \"initializing it\");\n if (data.status === \"new\")\n throw threadStatusError(threadId, data.status, \"be initialized here\");\n const { remoteId, externalId } = await data.initializeTask;\n return { remoteId, externalId };\n }\n\n const { remoteId, externalId } = await this._state.optimisticUpdate({\n execute: () => {\n return this._options.adapter.initialize(threadId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, threadId, \"regular\");\n },\n loading: (state, task) => {\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...state.threadData[mappingId],\n initializeTask: task,\n },\n },\n };\n },\n then: (state, { remoteId, externalId }) => {\n const data = getThreadData(state, threadId);\n if (!data) return state;\n\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadIdMap: {\n ...state.threadIdMap,\n [remoteId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...data,\n initializeTask: Promise.resolve({ remoteId, externalId }),\n remoteId,\n externalId,\n },\n },\n };\n },\n });\n return { remoteId, externalId };\n };\n\n public generateTitle = async (threadId: string) => {\n const data = this.getItemById(threadId);\n if (!data) throw threadNotFoundError(threadId, \"generating its title\");\n if (data.status === \"new\")\n throw threadStatusError(threadId, data.status, \"generate a title\");\n\n const { remoteId } = await data.initializeTask;\n\n const runtimeCore = this._hookManager.getThreadRuntimeCore(data.id);\n if (!runtimeCore) return; // thread is no longer running\n\n // Incomplete assistant turns (running status, possibly empty content)\n // would make the payload race-dependent; the title reads settled\n // messages only, matching the trigger's readiness gate.\n const messages = runtimeCore.messages.filter(isTitleSourceMessage);\n const stream = await this._options.adapter.generateTitle(\n remoteId,\n messages,\n );\n const messageStream = AssistantMessageStream.fromAssistantStream(stream);\n for await (const result of messageStream) {\n const newTitle = result.parts.filter((c) => c.type === \"text\")[0]?.text;\n const state = this._state.baseValue;\n const currentData = getThreadData(state, data.id);\n if (!currentData) continue;\n this._state.update({\n ...state,\n threadData: {\n ...state.threadData,\n [currentData.id]: {\n ...currentData,\n title: newTitle,\n },\n },\n });\n }\n };\n\n public rename(threadIdOrRemoteId: string, newTitle: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"renaming it\");\n if (data.status === \"new\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be renamed\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.rename(remoteId, newTitle);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n title: newTitle,\n },\n },\n };\n },\n });\n }\n\n public updateCustom(\n threadIdOrRemoteId: string,\n custom: Record<string, unknown> | undefined,\n ): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data)\n throw threadNotFoundError(\n threadIdOrRemoteId,\n \"updating its custom metadata\",\n );\n if (data.status === \"new\")\n throw threadStatusError(\n threadIdOrRemoteId,\n data.status,\n \"update custom metadata\",\n );\n\n if (!this._options.adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n const adapter = this._options.adapter;\n if (!adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n return adapter.updateCustom(remoteId, custom);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n custom,\n },\n },\n };\n },\n });\n }\n\n private async _ensureThreadIsNotMain(threadId: string) {\n if (threadId === this.newThreadId)\n throw new Error(\"Cannot ensure new thread is not main\");\n\n let lastAwaitedTask: Promise<void> | undefined;\n\n while (threadId === this._mainThreadId) {\n let switchTask = this._switchTask;\n const startedFallback = !switchTask || switchTask === lastAwaitedTask;\n if (startedFallback) switchTask = this.switchToNewThread();\n lastAwaitedTask = switchTask;\n\n try {\n await switchTask;\n } catch (error) {\n if (startedFallback && this._switchTask === switchTask) {\n throw error;\n }\n }\n }\n }\n\n public async archive(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"archiving it\");\n if (data.status !== \"regular\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be archived\");\n\n await this._ensureThreadIsNotMain(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.archive(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"archived\");\n },\n });\n }\n\n public unarchive(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"unarchiving it\");\n if (data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be unarchived\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n try {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.unarchive(remoteId);\n } catch (error) {\n await this._ensureThreadIsNotMain(data.id);\n throw error;\n }\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"regular\");\n },\n });\n }\n\n public async delete(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"deleting it\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be deleted\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.delete(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"deleted\");\n },\n });\n }\n\n public __internal_dispose() {\n this._hookManager.__internal_dispose();\n }\n\n public async detach(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"detaching it\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be detached\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n }\n\n private useBoundIds = create<string[]>(() => []);\n\n public __internal_RenderComponent: FC = () => {\n const id = useId();\n useEffect(() => {\n this.useBoundIds.setState((s) => [...s, id], true);\n return () => {\n this.useBoundIds.setState((s) => s.filter((i) => i !== id), true);\n };\n }, [id]);\n\n const boundIds = this.useBoundIds();\n const { Provider } = this.useProvider();\n const aui = useAui();\n const enabled = boundIds.length === 0 || boundIds[0] === id;\n\n return (\n enabled && (\n <RuntimeAdapterProvider adapters={this._runtimeAdapters}>\n <this._hookManager.__internal_RenderThreadRuntimes\n provider={Provider}\n />\n <this._hookManager.__internal_Host parentClient={aui} />\n </RuntimeAdapterProvider>\n )\n );\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RemoteThreadListThreadListRuntimeCore.js","names":["ThreadListRuntimeCore","BaseSubscribable","OptimisticState","EMPTY_THREAD_CORE","RemoteThreadData","RemoteThreadState","classifyThreads","createEmptyRemoteThreadState","createThreadMappingId","getThreadData","normalizeCursor","updateStatusReducer","preserveMidLoadTransitions","seedNewThread","statusSnapshot","RemoteThreadListAdapter","RemoteThreadListOptions","RemoteThreadMetadata","ThreadListAdapterChangedError","RemoteThreadListHookInstanceManager","isTitleSourceMessage","ComponentType","FC","Fragment","PropsWithChildren","useEffect","useId","useAui","create","AssistantMessageStream","ModelContextProvider","RuntimeAdapterProvider","useStableRuntimeAdapters","threadNotFoundError","threadIdOrRemoteId","action","Error","threadStatusError","status","EMPTY_REMOTE_STATE","RemoteThreadListThreadListRuntimeCore","_options","_hookManager","_runtimeAdapters","modelContext","_loadThreadsPromise","Promise","_loadMorePromise","_loadGeneration","_adapterGeneration","_replaceListOnNextLoad","_staleThreadIdsOnReplace","ReadonlySet","_switchGeneration","_switchTask","_mainThreadId","_state","_useAdaptersProvider","children","useAdapters","adapter","unstable_useAdapters","undefined","_SynthesizedAdapters","NonNullable","adapters","resolveProvider","unstable_Provider","threadItems","value","threadData","getLoadThreadsPromise","generation","replacedList","statusAtRequest","baseValue","optimisticUpdate","execute","list","loading","state","isLoading","then","l","replaceList","_replaceWithThreads","threads","nextCursor","fresh","threadIds","archivedThreadIds","threadIdMap","merged","cursor","catch","error","console","update","threadId","getItemById","id","_switchToThreadFromProp","loadMore","initialState","resolve","dedup","after","isLoadingMore","appended","constructor","options","contextProvider","subscribe","_notifySubscribers","_notifyThreadIdChange","runtimeHook","__internal_setDefaultAdapters","__internal_subscribeRunningChanged","__internal_subscribeRuntimeReplaced","queueMicrotask","useProvider","Provider","__internal_setOptions","switchToNewThread","_initialThreadLoaded","adapterChanged","controlledThreadIdChanged","getState","setState","setRuntimeHook","Set","Object","values","filter","item","map","_requireAdapterGeneration","_requireAdapterSettled","newThreadId","mappingId","draft","stale","has","remoteId","includes","push","nextState","preservedDraft","seeded","_lastNotifiedThreadId","nextIds","stopThreadRuntime","startThreadRuntime","__internal_load","startThreadId","initialThreadId","switchTask","switchToThread","reloadMainThread","runtimeCore","getThreadRuntimeCore","unstable_refetchThread","__internal_restartThreadRuntime","reload","hasMore","mainThreadId","_mainThreadRemoteId","emit","onThreadIdChange","getMainThreadRuntimeCore","result","data","unstable_isThreadRunning","__internal_isThreadRunning","unarchive","_startSwitchToThread","emitThreadIdChange","task","_switchToThread","remoteMetadata","fetch","newThreadData","initializeTask","externalId","title","lastMessageAt","custom","newThreadIdMap","wasInTarget","threadIdsWithoutRemote","archivedThreadIdsWithoutRemote","newThreadIds","newArchivedThreadIds","_startSwitchToNewThread","_switchToNewThread","waitForUpdate","next","initialize","adapterGeneration","optimistic","generateTitle","messages","stream","messageStream","fromAssistantStream","newTitle","parts","c","type","text","currentData","rename","updateCustom","Record","_ensureThreadIsNotMain","lastAwaitedTask","startedFallback","archive","delete","__internal_dispose","detach","useBoundIds","__internal_RenderComponent","s","i","boundIds","aui","enabled","length"],"sources":["../../../src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx"],"sourcesContent":["import type { ThreadListRuntimeCore } from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport { BaseSubscribable } from \"../../subscribable/subscribable\";\nimport { OptimisticState } from \"../../runtimes/remote-thread-list/optimistic-state\";\nimport { EMPTY_THREAD_CORE } from \"../../runtimes/remote-thread-list/empty-thread-core\";\nimport type {\n RemoteThreadData,\n RemoteThreadState,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport {\n classifyThreads,\n createEmptyRemoteThreadState,\n createThreadMappingId,\n getThreadData,\n normalizeCursor,\n updateStatusReducer,\n preserveMidLoadTransitions,\n seedNewThread,\n statusSnapshot,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport type {\n RemoteThreadListAdapter,\n RemoteThreadListOptions,\n RemoteThreadMetadata,\n} from \"../../runtimes/remote-thread-list/types\";\nimport { ThreadListAdapterChangedError } from \"../../runtimes/remote-thread-list/adapter-changed\";\nimport { RemoteThreadListHookInstanceManager } from \"./RemoteThreadListHookInstanceManager\";\nimport { isTitleSourceMessage } from \"./RemoteThreadResource\";\nimport {\n type ComponentType,\n type FC,\n Fragment,\n type PropsWithChildren,\n useEffect,\n useId,\n} from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { create } from \"zustand\";\nimport { AssistantMessageStream } from \"assistant-stream\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport { RuntimeAdapterProvider } from \"./RuntimeAdapterProvider\";\nimport { useStableRuntimeAdapters } from \"./useRuntimeAdapters\";\n\nconst threadNotFoundError = (threadIdOrRemoteId: string, action: string) =>\n new Error(`Thread \"${threadIdOrRemoteId}\" not found while ${action}.`);\n\nconst threadStatusError = (\n threadIdOrRemoteId: string,\n status: RemoteThreadData[\"status\"],\n action: string,\n) =>\n new Error(\n `Thread \"${threadIdOrRemoteId}\" has status \"${status}\", so it cannot ${action}.`,\n );\n\nconst EMPTY_REMOTE_STATE = createEmptyRemoteThreadState();\n\nexport class RemoteThreadListThreadListRuntimeCore\n extends BaseSubscribable\n implements ThreadListRuntimeCore\n{\n private _options!: RemoteThreadListOptions;\n private readonly _hookManager: RemoteThreadListHookInstanceManager;\n private readonly _runtimeAdapters: { modelContext: ModelContextProvider };\n\n private _loadThreadsPromise: Promise<void> | undefined;\n private _loadMorePromise: Promise<void> | undefined;\n private _loadGeneration = 0;\n private _adapterGeneration = 0;\n private _replaceListOnNextLoad = false;\n private _staleThreadIdsOnReplace: ReadonlySet<string> | undefined;\n private _switchGeneration = 0;\n private _switchTask: Promise<void> | undefined;\n\n private _mainThreadId!: string;\n private readonly _state = new OptimisticState<RemoteThreadState>(\n EMPTY_REMOTE_STATE,\n );\n\n private readonly _useAdaptersProvider: FC<PropsWithChildren> = ({\n children,\n }) => {\n const useAdapters = this._options.adapter.unstable_useAdapters;\n if (useAdapters === undefined) return children;\n return (\n <this._SynthesizedAdapters useAdapters={useAdapters}>\n {children}\n </this._SynthesizedAdapters>\n );\n };\n\n private readonly _SynthesizedAdapters: FC<\n PropsWithChildren<{\n useAdapters: NonNullable<RemoteThreadListAdapter[\"unstable_useAdapters\"]>;\n }>\n > = ({ useAdapters, children }) => {\n const adapters = useStableRuntimeAdapters(useAdapters());\n if (adapters == null) return children;\n return (\n <RuntimeAdapterProvider adapters={adapters}>\n {children}\n </RuntimeAdapterProvider>\n );\n };\n\n private resolveProvider(\n adapter: RemoteThreadListAdapter,\n ): ComponentType<PropsWithChildren> {\n if (adapter.unstable_Provider !== undefined) {\n return adapter.unstable_Provider as ComponentType<PropsWithChildren>;\n }\n if (adapter.unstable_useAdapters === undefined) return Fragment;\n return this._useAdaptersProvider;\n }\n\n public get threadItems() {\n return this._state.value.threadData;\n }\n\n public getLoadThreadsPromise() {\n // TODO this needs to be cached in case this promise is loaded during suspense\n if (!this._loadThreadsPromise) {\n const generation = this._loadGeneration;\n let replacedList = false;\n const statusAtRequest = statusSnapshot(this._state.baseValue);\n this._loadThreadsPromise = this._state\n .optimisticUpdate({\n execute: () => this._options.adapter.list(),\n loading: (state) => {\n return {\n ...state,\n isLoading: true,\n };\n },\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n const replaceList = this._replaceListOnNextLoad;\n if (replaceList) {\n this._replaceListOnNextLoad = false;\n replacedList = true;\n return this._replaceWithThreads(\n state,\n l.threads,\n normalizeCursor(l.nextCursor),\n );\n }\n\n const fresh = classifyThreads(l.threads, {\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n const merged = {\n ...state,\n isLoading: false,\n cursor: normalizeCursor(l.nextCursor),\n threadIds: fresh.threadIds,\n archivedThreadIds: fresh.archivedThreadIds,\n threadIdMap: { ...state.threadIdMap, ...fresh.threadIdMap },\n threadData: { ...state.threadData, ...fresh.threadData },\n };\n return preserveMidLoadTransitions(merged, state, statusAtRequest);\n },\n })\n .catch((error: unknown) => {\n if (generation !== this._loadGeneration) return;\n console.error(\"[assistant-ui] thread list load failed:\", error);\n this._loadThreadsPromise = undefined;\n if (!this._replaceListOnNextLoad) {\n this._state.update({\n ...this._state.baseValue,\n isLoading: false,\n });\n return;\n }\n this._replaceListOnNextLoad = false;\n replacedList = true;\n this._state.update(\n this._replaceWithThreads(this._state.baseValue, [], undefined),\n );\n })\n .then(() => {\n if (!replacedList) return;\n const threadId = this._options.threadId;\n if (threadId === undefined) return;\n if (this.getItemById(threadId)?.id === this._mainThreadId) return;\n this._switchToThreadFromProp(threadId).catch(() => {});\n });\n }\n\n return this._loadThreadsPromise;\n }\n\n public loadMore(): Promise<void> {\n if (this._loadMorePromise) return this._loadMorePromise;\n\n const initialState = this._state.value;\n if (initialState.cursor === undefined || initialState.isLoading) {\n return Promise.resolve();\n }\n\n const generation = this._loadGeneration;\n const adapter = this._options.adapter;\n const cursor = initialState.cursor;\n\n const dedup = this._state\n .optimisticUpdate({\n execute: () => adapter.list({ after: cursor }),\n loading: (state) => ({ ...state, isLoadingMore: true }),\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n if (adapter !== this._options.adapter) return state;\n\n const appended = classifyThreads(l.threads, {\n threadIds: [...state.threadIds],\n archivedThreadIds: [...state.archivedThreadIds],\n threadIdMap: { ...state.threadIdMap },\n threadData: { ...state.threadData },\n });\n\n return {\n ...state,\n isLoadingMore: false,\n cursor: normalizeCursor(l.nextCursor),\n threadIds: appended.threadIds,\n archivedThreadIds: appended.archivedThreadIds,\n threadIdMap: appended.threadIdMap,\n threadData: appended.threadData,\n };\n },\n })\n .catch((error: unknown) => {\n if (generation !== this._loadGeneration) return;\n console.error(\"[assistant-ui] thread list loadMore failed:\", error);\n })\n .then(() => {\n if (this._loadMorePromise === dedup) {\n this._loadMorePromise = undefined;\n }\n });\n\n this._loadMorePromise = dedup;\n return dedup;\n }\n\n constructor(\n options: RemoteThreadListOptions,\n contextProvider: ModelContextProvider,\n ) {\n super();\n\n this._state.subscribe(() => {\n this._notifySubscribers();\n this._notifyThreadIdChange();\n });\n this._runtimeAdapters = { modelContext: contextProvider };\n this._hookManager = new RemoteThreadListHookInstanceManager(\n options.runtimeHook,\n this,\n );\n this._hookManager.__internal_setDefaultAdapters(this._runtimeAdapters);\n this._hookManager.__internal_subscribeRunningChanged(() =>\n this._notifySubscribers(),\n );\n this._hookManager.__internal_subscribeRuntimeReplaced(() => {\n // A republish can land during the thread resource's render, where a\n // synchronous notify would re-enter store consumers mid-render.\n queueMicrotask(() => this._notifySubscribers());\n });\n this.useProvider = create(() => ({\n Provider: this.resolveProvider(options.adapter),\n }));\n this.__internal_setOptions(options);\n this.switchToNewThread();\n }\n\n private _initialThreadLoaded = false;\n private useProvider;\n\n public __internal_setOptions(options: RemoteThreadListOptions) {\n if (this._options === options) return;\n\n const adapterChanged =\n this._options !== undefined && this._options.adapter !== options.adapter;\n const controlledThreadIdChanged =\n this._initialThreadLoaded &&\n this._options !== undefined &&\n this._options.threadId !== options.threadId;\n\n this._options = options;\n\n const Provider = this.resolveProvider(options.adapter);\n if (Provider !== this.useProvider.getState().Provider) {\n this.useProvider.setState({ Provider }, true);\n }\n\n this._hookManager.setRuntimeHook(options.runtimeHook);\n\n if (adapterChanged) {\n this._loadGeneration++;\n this._adapterGeneration++;\n this._switchGeneration++;\n this._switchTask = undefined;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._replaceListOnNextLoad = true;\n this._staleThreadIdsOnReplace = new Set(\n Object.values(this._state.baseValue.threadData)\n .filter((item) => item.status !== \"new\")\n .map((item) => item.id),\n );\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n }\n\n if (controlledThreadIdChanged) {\n this._switchToThreadFromProp(options.threadId).catch(() => {});\n }\n }\n\n private _requireAdapterGeneration(generation: number) {\n if (generation !== this._adapterGeneration) {\n throw new ThreadListAdapterChangedError();\n }\n }\n\n private _requireAdapterSettled() {\n if (this._replaceListOnNextLoad) {\n throw new ThreadListAdapterChangedError();\n }\n }\n\n private _replaceWithThreads(\n state: RemoteThreadState,\n threads: readonly RemoteThreadMetadata[],\n cursor: string | undefined,\n ): RemoteThreadState {\n const fresh = classifyThreads(threads, {\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n const threadIdMap = { ...fresh.threadIdMap };\n const threadData = { ...fresh.threadData };\n const threadIds = [...fresh.threadIds];\n const archivedThreadIds = [...fresh.archivedThreadIds];\n\n if (state.newThreadId) {\n const mappingId = state.threadIdMap[state.newThreadId];\n const draft = mappingId ? state.threadData[mappingId] : undefined;\n if (draft?.status === \"new\") {\n threadIdMap[state.newThreadId] = mappingId!;\n threadData[mappingId!] = draft;\n }\n }\n\n const stale = this._staleThreadIdsOnReplace;\n if (stale) {\n for (const item of Object.values(state.threadData)) {\n if (stale.has(item.id)) continue;\n if (item.status !== \"new\" && item.remoteId === undefined) continue;\n const mappingId = createThreadMappingId(item.id);\n if (threadData[mappingId]) continue;\n threadIdMap[item.id] = mappingId;\n if (item.remoteId !== undefined) {\n threadIdMap[item.remoteId] = mappingId;\n }\n threadData[mappingId] = item;\n if (item.remoteId === undefined) continue;\n if (item.status === \"regular\" && !threadIds.includes(item.remoteId)) {\n threadIds.push(item.remoteId);\n } else if (\n item.status === \"archived\" &&\n !archivedThreadIds.includes(item.remoteId)\n ) {\n archivedThreadIds.push(item.remoteId);\n }\n }\n }\n this._staleThreadIdsOnReplace = undefined;\n\n let nextState: RemoteThreadState = {\n ...state,\n isLoading: false,\n cursor,\n threadIds,\n archivedThreadIds,\n threadIdMap,\n threadData,\n newThreadId:\n state.newThreadId !== undefined &&\n threadIdMap[state.newThreadId] === undefined\n ? undefined\n : state.newThreadId,\n };\n\n if (getThreadData(nextState, this._mainThreadId) === undefined) {\n const preservedDraft = nextState.newThreadId;\n if (preservedDraft !== undefined) {\n this._mainThreadId = preservedDraft;\n } else {\n const seeded = seedNewThread(nextState);\n this._mainThreadId = seeded.id;\n nextState = seeded.state;\n }\n if (this._options.threadId === undefined) {\n this._notifyThreadIdChange();\n } else {\n this._lastNotifiedThreadId = undefined;\n }\n }\n\n const nextIds = new Set(\n Object.values(nextState.threadData).map((item) => item.id),\n );\n for (const item of Object.values(state.threadData)) {\n if (!nextIds.has(item.id)) {\n this._hookManager.stopThreadRuntime(item.id);\n }\n }\n void this._hookManager.startThreadRuntime(this._mainThreadId).then(\n () => this._notifySubscribers(),\n () => undefined,\n );\n\n return nextState;\n }\n\n public __internal_load() {\n this.getLoadThreadsPromise(); // begin loading on initial bind\n if (this._initialThreadLoaded) return;\n this._initialThreadLoaded = true;\n\n const startThreadId =\n this._options.threadId ?? this._options.initialThreadId;\n if (startThreadId !== undefined) {\n const switchTask =\n this._options.threadId !== undefined\n ? this._switchToThreadFromProp(startThreadId)\n : this.switchToThread(startThreadId);\n switchTask.catch(() => {});\n }\n }\n\n public async reloadMainThread(): Promise<void> {\n const threadId = this._mainThreadId;\n if (threadId === undefined) return;\n\n // An unsent thread holds no remote state, so a refetch would only discard\n // what the user has typed.\n if (this.getItemById(threadId)?.status === \"new\") return;\n\n const runtimeCore = this._hookManager.getThreadRuntimeCore(threadId);\n\n try {\n if (runtimeCore?.unstable_refetchThread) {\n // Called on the core so class-method implementations keep `this`.\n await runtimeCore.unstable_refetchThread();\n } else {\n await this._hookManager.__internal_restartThreadRuntime(threadId);\n }\n } catch (error) {\n // delete and detach switch the main thread away before stopping the\n // runtime, so a rejection once that has happened belongs to them.\n if (threadId !== this._mainThreadId) return;\n throw error;\n }\n\n if (threadId !== this._mainThreadId) return;\n this._notifySubscribers();\n }\n\n public reload() {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n return this.getLoadThreadsPromise();\n }\n\n public get isLoading() {\n return this._state.value.isLoading;\n }\n\n public get isLoadingMore() {\n return this._state.value.isLoadingMore;\n }\n\n public get hasMore() {\n return this._state.value.cursor !== undefined;\n }\n\n public get threadIds() {\n return this._state.value.threadIds;\n }\n\n public get archivedThreadIds() {\n return this._state.value.archivedThreadIds;\n }\n\n public get newThreadId() {\n return this._state.value.newThreadId;\n }\n\n public get mainThreadId(): string {\n return this._mainThreadId;\n }\n\n // The settled remote ID of the active thread, or undefined while it is still\n // a new/optimistic thread. This is the value surfaced to `onThreadIdChange`.\n private get _mainThreadRemoteId(): string | undefined {\n if (this._mainThreadId === undefined) return undefined;\n return getThreadData(this._state.value, this._mainThreadId)?.remoteId;\n }\n\n private _lastNotifiedThreadId: string | undefined = undefined;\n\n private _notifyThreadIdChange(emit = true) {\n const threadId = this._mainThreadRemoteId;\n if (this._lastNotifiedThreadId === threadId) return;\n this._lastNotifiedThreadId = threadId;\n if (emit) {\n this._options.onThreadIdChange?.(threadId);\n }\n }\n\n public getMainThreadRuntimeCore() {\n const result = this._hookManager.getThreadRuntimeCore(this._mainThreadId);\n if (!result) return EMPTY_THREAD_CORE;\n return result;\n }\n\n public getThreadRuntimeCore(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data)\n throw threadNotFoundError(threadIdOrRemoteId, \"getting its runtime\");\n\n const result = this._hookManager.getThreadRuntimeCore(data.id);\n if (!result)\n throw new Error(\n `Runtime for thread \"${threadIdOrRemoteId}\" not found while getting its runtime.`,\n );\n return result;\n }\n\n public unstable_isThreadRunning(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) return false;\n return this._hookManager.__internal_isThreadRunning(data.id);\n }\n\n public getItemById(threadIdOrRemoteId: string) {\n return getThreadData(this._state.value, threadIdOrRemoteId);\n }\n\n public switchToThread(\n threadIdOrRemoteId: string,\n options?: { unarchive?: boolean },\n ): Promise<void> {\n return this._startSwitchToThread(threadIdOrRemoteId, options, true);\n }\n\n private _startSwitchToThread(\n threadIdOrRemoteId: string,\n options: { unarchive?: boolean } | undefined,\n emitThreadIdChange: boolean,\n ): Promise<void> {\n const generation = ++this._switchGeneration;\n const task = this._switchToThread(\n threadIdOrRemoteId,\n options,\n generation,\n emitThreadIdChange,\n );\n this._switchTask = task;\n return task;\n }\n\n private async _switchToThread(\n threadIdOrRemoteId: string,\n options: { unarchive?: boolean } | undefined,\n generation: number,\n emitThreadIdChange: boolean,\n ): Promise<void> {\n if (\n this._replaceListOnNextLoad &&\n threadIdOrRemoteId !== this._state.value.newThreadId\n ) {\n throw new ThreadListAdapterChangedError();\n }\n let data = this.getItemById(threadIdOrRemoteId);\n\n if (!data) {\n const remoteMetadata =\n await this._options.adapter.fetch(threadIdOrRemoteId);\n if (generation !== this._switchGeneration) return;\n\n const state = this._state.value;\n const mappingId = createThreadMappingId(remoteMetadata.remoteId);\n\n const newThreadData = {\n ...state.threadData,\n [mappingId]: {\n id: mappingId,\n initializeTask: Promise.resolve({\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n }),\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n status: remoteMetadata.status,\n title: remoteMetadata.title,\n lastMessageAt: remoteMetadata.lastMessageAt,\n custom: remoteMetadata.custom,\n } as RemoteThreadData,\n };\n\n const newThreadIdMap = {\n ...state.threadIdMap,\n [remoteMetadata.remoteId]: mappingId,\n };\n\n // A concurrent `list()` may already have placed this thread; keep that\n // position and only merge metadata. A genuinely absent thread stays\n // appended: it may live on an unloaded page, and a prepend would pin it\n // above newer threads permanently since `classifyThreads` skips ids it\n // has already seen. Filtering both arrays first still prevents\n // duplication or a wrong-status entry from `list()`.\n const remoteId = remoteMetadata.remoteId;\n const wasInTarget =\n remoteMetadata.status === \"regular\"\n ? state.threadIds.includes(remoteId)\n : state.archivedThreadIds.includes(remoteId);\n\n const threadIdsWithoutRemote = state.threadIds.filter(\n (id) => id !== remoteId,\n );\n const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter(\n (id) => id !== remoteId,\n );\n\n const newThreadIds =\n remoteMetadata.status === \"regular\"\n ? wasInTarget\n ? state.threadIds\n : [...threadIdsWithoutRemote, remoteId]\n : threadIdsWithoutRemote;\n const newArchivedThreadIds =\n remoteMetadata.status === \"archived\"\n ? wasInTarget\n ? state.archivedThreadIds\n : [...archivedThreadIdsWithoutRemote, remoteId]\n : archivedThreadIdsWithoutRemote;\n\n this._state.update({\n ...state,\n threadIds: newThreadIds,\n archivedThreadIds: newArchivedThreadIds,\n threadIdMap: newThreadIdMap,\n threadData: newThreadData,\n });\n\n data = this.getItemById(threadIdOrRemoteId);\n }\n\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"switching to it\");\n if (this._mainThreadId === data.id) return;\n\n const task = this._hookManager.startThreadRuntime(data.id);\n if (this.mainThreadId !== undefined) {\n await task;\n } else {\n void task.then(\n () => this._notifySubscribers(),\n () => undefined,\n );\n }\n\n if (generation !== this._switchGeneration) return;\n\n if (data.status === \"archived\" && options?.unarchive !== false) {\n await this.unarchive(data.id);\n if (generation !== this._switchGeneration) return;\n }\n this._mainThreadId = data.id;\n\n this._notifySubscribers();\n this._notifyThreadIdChange(emitThreadIdChange);\n }\n\n public switchToNewThread(): Promise<void> {\n return this._startSwitchToNewThread(true);\n }\n\n private _switchToThreadFromProp(threadId: string | undefined): Promise<void> {\n return threadId !== undefined\n ? this._startSwitchToThread(threadId, undefined, false)\n : this._startSwitchToNewThread(false);\n }\n\n private _startSwitchToNewThread(emitThreadIdChange: boolean): Promise<void> {\n const generation = ++this._switchGeneration;\n const task = this._switchToNewThread(generation, emitThreadIdChange);\n this._switchTask = task;\n return task;\n }\n\n private async _switchToNewThread(\n generation: number,\n emitThreadIdChange: boolean,\n ): Promise<void> {\n // an initialization transaction is in progress, wait for it to settle\n while (\n this._state.baseValue.newThreadId !== undefined &&\n this._state.value.newThreadId === undefined\n ) {\n await this._state.waitForUpdate();\n if (generation !== this._switchGeneration) return;\n }\n\n const state = this._state.baseValue;\n let id: string | undefined = this._state.value.newThreadId;\n if (id === undefined) {\n const next = seedNewThread(state);\n id = next.id;\n this._state.update(next.state);\n }\n\n return this._switchToThread(id, undefined, generation, emitThreadIdChange);\n }\n\n public initialize = async (threadId: string) => {\n const adapter = this._options.adapter;\n const adapterGeneration = this._adapterGeneration;\n if (this._state.value.newThreadId !== threadId) {\n this._requireAdapterSettled();\n const data = this.getItemById(threadId);\n if (!data) throw threadNotFoundError(threadId, \"initializing it\");\n if (data.status === \"new\")\n throw threadStatusError(threadId, data.status, \"be initialized here\");\n const { remoteId, externalId } = await data.initializeTask;\n this._requireAdapterGeneration(adapterGeneration);\n return { remoteId, externalId };\n }\n\n const { remoteId, externalId } = await this._state.optimisticUpdate({\n execute: () => {\n this._requireAdapterGeneration(adapterGeneration);\n return adapter.initialize(threadId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, threadId, \"regular\");\n },\n loading: (state, task) => {\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...state.threadData[mappingId],\n initializeTask: task,\n },\n },\n };\n },\n then: (state, { remoteId, externalId }) => {\n if (adapterGeneration !== this._adapterGeneration) return state;\n const data = getThreadData(state, threadId);\n if (!data) return state;\n\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadIdMap: {\n ...state.threadIdMap,\n [remoteId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...data,\n initializeTask: Promise.resolve({ remoteId, externalId }),\n remoteId,\n externalId,\n },\n },\n };\n },\n });\n this._requireAdapterGeneration(adapterGeneration);\n return { remoteId, externalId };\n };\n\n public generateTitle = async (threadId: string) => {\n this._requireAdapterSettled();\n const adapter = this._options.adapter;\n const adapterGeneration = this._adapterGeneration;\n const data = this.getItemById(threadId);\n if (!data) throw threadNotFoundError(threadId, \"generating its title\");\n if (data.status === \"new\")\n throw threadStatusError(threadId, data.status, \"generate a title\");\n\n const { remoteId } = await data.initializeTask;\n this._requireAdapterGeneration(adapterGeneration);\n\n const runtimeCore = this._hookManager.getThreadRuntimeCore(data.id);\n if (!runtimeCore) return; // thread is no longer running\n\n // Incomplete assistant turns (running status, possibly empty content)\n // would make the payload race-dependent; the title reads settled\n // messages only, matching the trigger's readiness gate.\n const messages = runtimeCore.messages.filter(isTitleSourceMessage);\n const stream = await adapter.generateTitle(remoteId, messages);\n const messageStream = AssistantMessageStream.fromAssistantStream(stream);\n for await (const result of messageStream) {\n if (adapterGeneration !== this._adapterGeneration) return;\n const newTitle = result.parts.filter((c) => c.type === \"text\")[0]?.text;\n await this._state.optimisticUpdate({\n execute: async () => {},\n optimistic: (state) => {\n if (adapterGeneration !== this._adapterGeneration) return state;\n const currentData = getThreadData(state, data.id);\n if (!currentData) return state;\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [currentData.id]: {\n ...currentData,\n title: newTitle,\n },\n },\n };\n },\n });\n }\n };\n\n public async rename(\n threadIdOrRemoteId: string,\n newTitle: string,\n ): Promise<void> {\n this._requireAdapterSettled();\n const adapter = this._options.adapter;\n const adapterGeneration = this._adapterGeneration;\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"renaming it\");\n if (data.status === \"new\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be renamed\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n this._requireAdapterGeneration(adapterGeneration);\n return adapter.rename(remoteId, newTitle);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n title: newTitle,\n },\n },\n };\n },\n });\n }\n\n public async updateCustom(\n threadIdOrRemoteId: string,\n custom: Record<string, unknown> | undefined,\n ): Promise<void> {\n this._requireAdapterSettled();\n const adapter = this._options.adapter;\n const adapterGeneration = this._adapterGeneration;\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data)\n throw threadNotFoundError(\n threadIdOrRemoteId,\n \"updating its custom metadata\",\n );\n if (data.status === \"new\")\n throw threadStatusError(\n threadIdOrRemoteId,\n data.status,\n \"update custom metadata\",\n );\n\n if (!adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n this._requireAdapterGeneration(adapterGeneration);\n if (!adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n return adapter.updateCustom(remoteId, custom);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n custom,\n },\n },\n };\n },\n });\n }\n\n private async _ensureThreadIsNotMain(threadId: string) {\n if (threadId === this.newThreadId)\n throw new Error(\"Cannot ensure new thread is not main\");\n\n let lastAwaitedTask: Promise<void> | undefined;\n\n while (threadId === this._mainThreadId) {\n let switchTask = this._switchTask;\n const startedFallback = !switchTask || switchTask === lastAwaitedTask;\n if (startedFallback) switchTask = this.switchToNewThread();\n lastAwaitedTask = switchTask;\n\n try {\n await switchTask;\n } catch (error) {\n if (startedFallback && this._switchTask === switchTask) {\n throw error;\n }\n }\n }\n }\n\n public async archive(threadIdOrRemoteId: string) {\n this._requireAdapterSettled();\n const adapter = this._options.adapter;\n const adapterGeneration = this._adapterGeneration;\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"archiving it\");\n if (data.status !== \"regular\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be archived\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._requireAdapterGeneration(adapterGeneration);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n this._requireAdapterGeneration(adapterGeneration);\n return adapter.archive(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"archived\");\n },\n });\n }\n\n public async unarchive(threadIdOrRemoteId: string): Promise<void> {\n this._requireAdapterSettled();\n const adapter = this._options.adapter;\n const adapterGeneration = this._adapterGeneration;\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"unarchiving it\");\n if (data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be unarchived\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n try {\n const { remoteId } = await data.initializeTask;\n this._requireAdapterGeneration(adapterGeneration);\n return await adapter.unarchive(remoteId);\n } catch (error) {\n if (adapterGeneration === this._adapterGeneration) {\n await this._ensureThreadIsNotMain(data.id);\n }\n throw error;\n }\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"regular\");\n },\n });\n }\n\n public async delete(threadIdOrRemoteId: string) {\n this._requireAdapterSettled();\n const adapter = this._options.adapter;\n const adapterGeneration = this._adapterGeneration;\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"deleting it\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be deleted\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._requireAdapterGeneration(adapterGeneration);\n this._hookManager.stopThreadRuntime(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n this._requireAdapterGeneration(adapterGeneration);\n return await adapter.delete(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"deleted\");\n },\n });\n }\n\n public __internal_dispose() {\n this._hookManager.__internal_dispose();\n }\n\n public async detach(threadIdOrRemoteId: string): Promise<void> {\n const adapterGeneration = this._adapterGeneration;\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"detaching it\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be detached\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._requireAdapterGeneration(adapterGeneration);\n this._hookManager.stopThreadRuntime(data.id);\n }\n\n private useBoundIds = create<string[]>(() => []);\n\n public __internal_RenderComponent: FC = () => {\n const id = useId();\n useEffect(() => {\n this.useBoundIds.setState((s) => [...s, id], true);\n return () => {\n this.useBoundIds.setState((s) => s.filter((i) => i !== id), true);\n };\n }, [id]);\n\n const boundIds = this.useBoundIds();\n const { Provider } = this.useProvider();\n const aui = useAui();\n const enabled = boundIds.length === 0 || boundIds[0] === id;\n\n return (\n enabled && (\n <RuntimeAdapterProvider adapters={this._runtimeAdapters}>\n <this._hookManager.__internal_RenderThreadRuntimes\n provider={Provider}\n />\n <this._hookManager.__internal_Host parentClient={aui} />\n </RuntimeAdapterProvider>\n )\n );\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoteThreadResource.d.ts","names":[],"sources":["../../../src/react/runtimes/RemoteThreadResource.ts"],"mappings":";;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"RemoteThreadResource.d.ts","names":[],"sources":["../../../src/react/runtimes/RemoteThreadResource.ts"],"mappings":";;;;;;;;;;KAyBY,6BAA6B;KAE7B;EACV;EACA;EACA,YAAY;EACZ,aAAa;EACb,cAAc,kBAAkB;EAChC,UAAU;EACV,UACE,kBACA,SAAS,mBACT;;cAIS,uBAAwB;EACnC;IAAW;;;cAGA,6BACX,eAAe,4BACf,aAAa,0BAAA;cAyLF,kDAAoB,SAAA,mBAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { SKIP_UPDATE, ShallowMemoizeSubject } from "../../subscribable/subscribable.js";
|
|
2
2
|
import { ThreadListItemRuntimeImpl } from "../../runtime/api/thread-list-item-runtime.js";
|
|
3
|
+
import { isSilentRuntimeAction } from "../../utils/silent-runtime-action.js";
|
|
3
4
|
import { ThreadListItemClient } from "../../store/runtime-clients/thread-list-item-runtime-client.js";
|
|
4
5
|
import { useRuntimeAdaptersProvider } from "./useRuntimeAdapters.js";
|
|
5
6
|
import { useCallback, useEffect, useEffectEvent, useMemo, useRef } from "@assistant-ui/tap/react-shim";
|
|
@@ -9,6 +10,7 @@ import { useAssistantContextProvider, useConfiguredAui } from "@assistant-ui/sto
|
|
|
9
10
|
const isTitleSourceMessage = (message) => message.status?.type !== "running";
|
|
10
11
|
const subscribeToTitleGeneration = (threadRuntime, itemRuntime) => {
|
|
11
12
|
const generate = () => void itemRuntime.generateTitle().catch((error) => {
|
|
13
|
+
if (isSilentRuntimeAction(error)) return;
|
|
12
14
|
console.error("[assistant-ui] Thread title generation failed", error);
|
|
13
15
|
});
|
|
14
16
|
const hasTitleSource = () => threadRuntime.getState().messages.some(isTitleSourceMessage);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoteThreadResource.js","names":["useCallback","useEffect","useEffectEvent","useMemo","useRef","resource","useAssistantContextProvider","useConfiguredAui","ThreadListItemClient","AssistantRuntime","ThreadListRuntimeCore","ThreadRuntimeCore","ThreadRuntimeImpl","ThreadListItemRuntimeImpl","ThreadListItemRuntime","SKIP_UPDATE","ShallowMemoizeSubject","useRuntimeAdaptersProvider","RuntimeAdapters","RemoteThreadListHook","RemoteThreadResourceProps","threadId","generation","parentList","runtimeHook","parentClient","Parameters","adapters","publish","runtime","isTitleSourceMessage","message","status","type","subscribeToTitleGeneration","threadRuntime","itemRuntime","generate","generateTitle","catch","error","console","hasTitleSource","getState","messages","some","unsubscribe","subscribe","useRemoteThreadBinder","threadBinding","thread","__internal_threadBinding","updateRuntime","isMounted","current","undefined","outerSubscribe","initPromiseRef","Promise","hasInitializedRef","titleDisposeRef","titleAliveRef","handleInitialize","state","initPromise","initialize","then","getInitializePromise","runtimeCore","setGetInitializePromise","Record","__internal_setGetInitializePromise","call","threads","main","unstable_on","useRemoteThreadResource","path","ref","threadSelector","data","getItemById","id","remoteId","externalId","title","lastMessageAt","custom","isMain","mainThreadId","isRunning","unstable_isThreadRunning","callback","client","threadListItem","useThreadClient","useBoundRuntime","RemoteThreadResource"],"sources":["../../../src/react/runtimes/RemoteThreadResource.ts"],"sourcesContent":["import { useCallback, useEffect, useEffectEvent, useMemo, useRef } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport {\n useAssistantContextProvider,\n useConfiguredAui,\n} from \"@assistant-ui/store/client\";\nimport { ThreadListItemClient } from \"../../store/internal\";\nimport type { AssistantRuntime } from \"../../runtime/api/assistant-runtime\";\nimport type { ThreadListRuntimeCore } from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport type { ThreadRuntimeCore } from \"../../runtime/interfaces/thread-runtime-core\";\nimport type { ThreadRuntimeImpl } from \"../../runtime/api/thread-runtime\";\nimport {\n ThreadListItemRuntimeImpl,\n type ThreadListItemRuntime,\n} from \"../../runtime/api/thread-list-item-runtime\";\nimport {\n SKIP_UPDATE,\n ShallowMemoizeSubject,\n} from \"../../subscribable/subscribable\";\nimport {\n useRuntimeAdaptersProvider,\n type RuntimeAdapters,\n} from \"./RuntimeAdapterProvider\";\n\nexport type RemoteThreadListHook = () => AssistantRuntime;\n\nexport type RemoteThreadResourceProps = {\n threadId: string;\n generation: number;\n parentList: ThreadListRuntimeCore;\n runtimeHook: RemoteThreadListHook;\n parentClient: Parameters<typeof useConfiguredAui>[0];\n adapters: RuntimeAdapters | null;\n publish: (\n threadId: string,\n runtime: ThreadRuntimeCore,\n generation: number,\n ) => void;\n};\n\nexport const isTitleSourceMessage = (message: {\n status?: { type: string } | undefined;\n}) => message.status?.type !== \"running\";\n\nexport const subscribeToTitleGeneration = (\n threadRuntime: AssistantRuntime[\"thread\"],\n itemRuntime: ThreadListItemRuntime,\n) => {\n const generate = () =>\n void itemRuntime.generateTitle().catch((error: unknown) => {\n console.error(\"[assistant-ui] Thread title generation failed\", error);\n });\n\n const hasTitleSource = () =>\n threadRuntime.getState().messages.some(isTitleSourceMessage);\n\n if (hasTitleSource()) {\n generate();\n return () => {};\n }\n\n const unsubscribe = threadRuntime.subscribe(() => {\n if (!hasTitleSource()) return;\n unsubscribe();\n generate();\n });\n return unsubscribe;\n};\n\nconst useRemoteThreadBinder = ({\n threadId,\n generation,\n runtimeHook,\n publish,\n itemRuntime,\n}: {\n threadId: string;\n generation: number;\n runtimeHook: RemoteThreadListHook;\n publish: RemoteThreadResourceProps[\"publish\"];\n itemRuntime: ThreadListItemRuntime;\n}) => {\n const runtime = runtimeHook();\n const threadBinding = (runtime?.thread as ThreadRuntimeImpl | undefined)\n ?.__internal_threadBinding;\n\n const updateRuntime = useCallback(() => {\n if (!threadBinding) return;\n publish(threadId, threadBinding.getState(), generation);\n }, [threadId, generation, threadBinding, publish]);\n\n const isMounted = useRef(false);\n if (!isMounted.current) {\n updateRuntime();\n }\n\n useEffect(() => {\n if (!threadBinding) return undefined;\n isMounted.current = true;\n updateRuntime();\n return threadBinding.outerSubscribe(updateRuntime);\n }, [threadBinding, updateRuntime]);\n\n const initPromiseRef = useRef<Promise<unknown> | undefined>(undefined);\n const hasInitializedRef = useRef(false);\n const titleDisposeRef = useRef<(() => void) | undefined>(undefined);\n const titleAliveRef = useRef(false);\n\n const handleInitialize = useEffectEvent(() => {\n if (hasInitializedRef.current) return;\n\n const state = itemRuntime.getState();\n if (state.status !== \"new\") return;\n hasInitializedRef.current = true;\n\n const initPromise = itemRuntime.initialize();\n initPromiseRef.current = initPromise;\n\n // The title needs the thread to exist and its first message, so it arms\n // when initialization resolves rather than at the first runEnd; waiting\n // for the run would leave the thread on \"New Chat\" for the whole\n // response, and forever when the run never completes.\n void initPromise.then(\n () => {\n if (!titleAliveRef.current) return;\n titleDisposeRef.current?.();\n titleDisposeRef.current = subscribeToTitleGeneration(\n runtime.thread,\n itemRuntime,\n );\n },\n () => {\n if (initPromiseRef.current === initPromise) {\n initPromiseRef.current = undefined;\n hasInitializedRef.current = false;\n }\n },\n );\n });\n\n const getInitializePromise = useEffectEvent(() => {\n handleInitialize();\n return initPromiseRef.current;\n });\n\n useEffect(() => {\n if (!threadBinding) return;\n const runtimeCore = threadBinding.getState();\n const setGetInitializePromise = (runtimeCore as Record<string, unknown>)\n .__internal_setGetInitializePromise;\n if (typeof setGetInitializePromise === \"function\") {\n setGetInitializePromise.call(runtimeCore, getInitializePromise);\n }\n }, [threadBinding]);\n useEffect(() => {\n if (!runtime?.threads?.main) return undefined;\n hasInitializedRef.current = false;\n titleAliveRef.current = true;\n const unsubscribe = runtime.threads.main.unstable_on(\n \"initialize\",\n handleInitialize,\n );\n return () => {\n titleAliveRef.current = false;\n unsubscribe();\n titleDisposeRef.current?.();\n titleDisposeRef.current = undefined;\n };\n }, [runtime]);\n\n return runtime;\n};\n\nconst useRemoteThreadResource = ({\n threadId,\n generation,\n parentList,\n runtimeHook,\n parentClient,\n adapters,\n publish,\n}: RemoteThreadResourceProps) => {\n const itemRuntime = useMemo(\n () =>\n new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `threadItems[threadId=${threadId}]`,\n threadSelector: { type: \"threadId\", threadId },\n },\n getState: () => {\n const data = parentList.getItemById(threadId);\n if (!data) return SKIP_UPDATE;\n return {\n id: data.id,\n remoteId: data.remoteId,\n externalId: data.externalId,\n title: data.title,\n lastMessageAt: data.lastMessageAt,\n custom: data.custom,\n status: data.status,\n isMain: data.id === parentList.mainThreadId,\n isRunning:\n parentList.unstable_isThreadRunning?.(data.id) ?? false,\n };\n },\n subscribe: (callback) => parentList.subscribe(callback),\n }),\n parentList,\n ),\n [parentList, threadId],\n );\n\n const { client } = useConfiguredAui(parentClient, {\n threadListItem: ThreadListItemClient({ runtime: itemRuntime }),\n });\n\n return useAssistantContextProvider(client, function useThreadClient() {\n return useRuntimeAdaptersProvider(adapters, function useBoundRuntime() {\n return useRemoteThreadBinder({\n threadId,\n generation,\n runtimeHook,\n publish,\n itemRuntime,\n });\n });\n });\n};\n\nexport const RemoteThreadResource = resource(useRemoteThreadResource);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RemoteThreadResource.js","names":["useCallback","useEffect","useEffectEvent","useMemo","useRef","resource","useAssistantContextProvider","useConfiguredAui","ThreadListItemClient","AssistantRuntime","ThreadListRuntimeCore","ThreadRuntimeCore","ThreadRuntimeImpl","ThreadListItemRuntimeImpl","ThreadListItemRuntime","SKIP_UPDATE","ShallowMemoizeSubject","useRuntimeAdaptersProvider","RuntimeAdapters","isSilentRuntimeAction","RemoteThreadListHook","RemoteThreadResourceProps","threadId","generation","parentList","runtimeHook","parentClient","Parameters","adapters","publish","runtime","isTitleSourceMessage","message","status","type","subscribeToTitleGeneration","threadRuntime","itemRuntime","generate","generateTitle","catch","error","console","hasTitleSource","getState","messages","some","unsubscribe","subscribe","useRemoteThreadBinder","threadBinding","thread","__internal_threadBinding","updateRuntime","isMounted","current","undefined","outerSubscribe","initPromiseRef","Promise","hasInitializedRef","titleDisposeRef","titleAliveRef","handleInitialize","state","initPromise","initialize","then","getInitializePromise","runtimeCore","setGetInitializePromise","Record","__internal_setGetInitializePromise","call","threads","main","unstable_on","useRemoteThreadResource","path","ref","threadSelector","data","getItemById","id","remoteId","externalId","title","lastMessageAt","custom","isMain","mainThreadId","isRunning","unstable_isThreadRunning","callback","client","threadListItem","useThreadClient","useBoundRuntime","RemoteThreadResource"],"sources":["../../../src/react/runtimes/RemoteThreadResource.ts"],"sourcesContent":["import { useCallback, useEffect, useEffectEvent, useMemo, useRef } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport {\n useAssistantContextProvider,\n useConfiguredAui,\n} from \"@assistant-ui/store/client\";\nimport { ThreadListItemClient } from \"../../store/internal\";\nimport type { AssistantRuntime } from \"../../runtime/api/assistant-runtime\";\nimport type { ThreadListRuntimeCore } from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport type { ThreadRuntimeCore } from \"../../runtime/interfaces/thread-runtime-core\";\nimport type { ThreadRuntimeImpl } from \"../../runtime/api/thread-runtime\";\nimport {\n ThreadListItemRuntimeImpl,\n type ThreadListItemRuntime,\n} from \"../../runtime/api/thread-list-item-runtime\";\nimport {\n SKIP_UPDATE,\n ShallowMemoizeSubject,\n} from \"../../subscribable/subscribable\";\nimport {\n useRuntimeAdaptersProvider,\n type RuntimeAdapters,\n} from \"./RuntimeAdapterProvider\";\nimport { isSilentRuntimeAction } from \"../../utils/silent-runtime-action\";\n\nexport type RemoteThreadListHook = () => AssistantRuntime;\n\nexport type RemoteThreadResourceProps = {\n threadId: string;\n generation: number;\n parentList: ThreadListRuntimeCore;\n runtimeHook: RemoteThreadListHook;\n parentClient: Parameters<typeof useConfiguredAui>[0];\n adapters: RuntimeAdapters | null;\n publish: (\n threadId: string,\n runtime: ThreadRuntimeCore,\n generation: number,\n ) => void;\n};\n\nexport const isTitleSourceMessage = (message: {\n status?: { type: string } | undefined;\n}) => message.status?.type !== \"running\";\n\nexport const subscribeToTitleGeneration = (\n threadRuntime: AssistantRuntime[\"thread\"],\n itemRuntime: ThreadListItemRuntime,\n) => {\n const generate = () =>\n void itemRuntime.generateTitle().catch((error: unknown) => {\n if (isSilentRuntimeAction(error)) return;\n console.error(\"[assistant-ui] Thread title generation failed\", error);\n });\n\n const hasTitleSource = () =>\n threadRuntime.getState().messages.some(isTitleSourceMessage);\n\n if (hasTitleSource()) {\n generate();\n return () => {};\n }\n\n const unsubscribe = threadRuntime.subscribe(() => {\n if (!hasTitleSource()) return;\n unsubscribe();\n generate();\n });\n return unsubscribe;\n};\n\nconst useRemoteThreadBinder = ({\n threadId,\n generation,\n runtimeHook,\n publish,\n itemRuntime,\n}: {\n threadId: string;\n generation: number;\n runtimeHook: RemoteThreadListHook;\n publish: RemoteThreadResourceProps[\"publish\"];\n itemRuntime: ThreadListItemRuntime;\n}) => {\n const runtime = runtimeHook();\n const threadBinding = (runtime?.thread as ThreadRuntimeImpl | undefined)\n ?.__internal_threadBinding;\n\n const updateRuntime = useCallback(() => {\n if (!threadBinding) return;\n publish(threadId, threadBinding.getState(), generation);\n }, [threadId, generation, threadBinding, publish]);\n\n const isMounted = useRef(false);\n if (!isMounted.current) {\n updateRuntime();\n }\n\n useEffect(() => {\n if (!threadBinding) return undefined;\n isMounted.current = true;\n updateRuntime();\n return threadBinding.outerSubscribe(updateRuntime);\n }, [threadBinding, updateRuntime]);\n\n const initPromiseRef = useRef<Promise<unknown> | undefined>(undefined);\n const hasInitializedRef = useRef(false);\n const titleDisposeRef = useRef<(() => void) | undefined>(undefined);\n const titleAliveRef = useRef(false);\n\n const handleInitialize = useEffectEvent(() => {\n if (hasInitializedRef.current) return;\n\n const state = itemRuntime.getState();\n if (state.status !== \"new\") return;\n hasInitializedRef.current = true;\n\n const initPromise = itemRuntime.initialize();\n initPromiseRef.current = initPromise;\n\n // The title needs the thread to exist and its first message, so it arms\n // when initialization resolves rather than at the first runEnd; waiting\n // for the run would leave the thread on \"New Chat\" for the whole\n // response, and forever when the run never completes.\n void initPromise.then(\n () => {\n if (!titleAliveRef.current) return;\n titleDisposeRef.current?.();\n titleDisposeRef.current = subscribeToTitleGeneration(\n runtime.thread,\n itemRuntime,\n );\n },\n () => {\n if (initPromiseRef.current === initPromise) {\n initPromiseRef.current = undefined;\n hasInitializedRef.current = false;\n }\n },\n );\n });\n\n const getInitializePromise = useEffectEvent(() => {\n handleInitialize();\n return initPromiseRef.current;\n });\n\n useEffect(() => {\n if (!threadBinding) return;\n const runtimeCore = threadBinding.getState();\n const setGetInitializePromise = (runtimeCore as Record<string, unknown>)\n .__internal_setGetInitializePromise;\n if (typeof setGetInitializePromise === \"function\") {\n setGetInitializePromise.call(runtimeCore, getInitializePromise);\n }\n }, [threadBinding]);\n useEffect(() => {\n if (!runtime?.threads?.main) return undefined;\n hasInitializedRef.current = false;\n titleAliveRef.current = true;\n const unsubscribe = runtime.threads.main.unstable_on(\n \"initialize\",\n handleInitialize,\n );\n return () => {\n titleAliveRef.current = false;\n unsubscribe();\n titleDisposeRef.current?.();\n titleDisposeRef.current = undefined;\n };\n }, [runtime]);\n\n return runtime;\n};\n\nconst useRemoteThreadResource = ({\n threadId,\n generation,\n parentList,\n runtimeHook,\n parentClient,\n adapters,\n publish,\n}: RemoteThreadResourceProps) => {\n const itemRuntime = useMemo(\n () =>\n new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `threadItems[threadId=${threadId}]`,\n threadSelector: { type: \"threadId\", threadId },\n },\n getState: () => {\n const data = parentList.getItemById(threadId);\n if (!data) return SKIP_UPDATE;\n return {\n id: data.id,\n remoteId: data.remoteId,\n externalId: data.externalId,\n title: data.title,\n lastMessageAt: data.lastMessageAt,\n custom: data.custom,\n status: data.status,\n isMain: data.id === parentList.mainThreadId,\n isRunning:\n parentList.unstable_isThreadRunning?.(data.id) ?? false,\n };\n },\n subscribe: (callback) => parentList.subscribe(callback),\n }),\n parentList,\n ),\n [parentList, threadId],\n );\n\n const { client } = useConfiguredAui(parentClient, {\n threadListItem: ThreadListItemClient({ runtime: itemRuntime }),\n });\n\n return useAssistantContextProvider(client, function useThreadClient() {\n return useRuntimeAdaptersProvider(adapters, function useBoundRuntime() {\n return useRemoteThreadBinder({\n threadId,\n generation,\n runtimeHook,\n publish,\n itemRuntime,\n });\n });\n });\n};\n\nexport const RemoteThreadResource = resource(useRemoteThreadResource);\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runManager.d.ts","names":[],"sources":["../../../../src/react/runtimes/assistant-transport/runManager.ts"],"mappings":";
|
|
1
|
+
{"version":3,"file":"runManager.d.ts","names":[],"sources":["../../../../src/react/runtimes/assistant-transport/runManager.ts"],"mappings":";KAIY,aAAa;EACvB;EACA;EACA;;iBAac,cAAc;EAC5B,QAAQ,QAAQ,gBAAgB;EAChC;EACA;EACA,YAAY,OAAO,iBAAiB;IAClC"}
|
|
@@ -1,19 +1,9 @@
|
|
|
1
|
+
import { invokeUserCallback } from "../../../utils/invoke-user-callback.js";
|
|
1
2
|
import { useLatestRef } from "./useLatestRef.js";
|
|
2
3
|
import { useCallback, useEffect, useRef, useState } from "@assistant-ui/tap/react-shim";
|
|
3
4
|
//#region src/react/runtimes/assistant-transport/runManager.ts
|
|
4
5
|
const disposeReason = Symbol("assistant-transport-dispose");
|
|
5
|
-
const
|
|
6
|
-
console.error(`[assistant-ui] Assistant transport ${name} callback threw an error`, error);
|
|
7
|
-
};
|
|
8
|
-
const invokeCallback = async (name, callback) => {
|
|
9
|
-
try {
|
|
10
|
-
await callback?.();
|
|
11
|
-
} catch (error) {
|
|
12
|
-
try {
|
|
13
|
-
reportCallbackError(name, error);
|
|
14
|
-
} catch {}
|
|
15
|
-
}
|
|
16
|
-
};
|
|
6
|
+
const invokeCallback = (name, callback) => invokeUserCallback("assistant-ui", `Assistant transport ${name}`, callback);
|
|
17
7
|
function useRunManager(config) {
|
|
18
8
|
const [isRunning, setIsRunning] = useState(false);
|
|
19
9
|
const stateRef = useRef({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runManager.js","names":["useCallback","useEffect","useRef","useState","useLatestRef","RunManager","Readonly","isRunning","schedule","cancel","disposeReason","Symbol","LifecycleCallbackName","
|
|
1
|
+
{"version":3,"file":"runManager.js","names":["useCallback","useEffect","useRef","useState","invokeUserCallback","useLatestRef","RunManager","Readonly","isRunning","schedule","cancel","disposeReason","Symbol","LifecycleCallbackName","invokeCallback","name","callback","useRunManager","config","onRun","signal","AbortSignal","Promise","onFinish","onCancel","onError","error","Error","setIsRunning","stateRef","pending","disposed","abortController","AbortController","onRunRef","onFinishRef","onCancelRef","onErrorRef","startRun","current","ac","disposeAborted","reason","queueMicrotask","aborted","abort"],"sources":["../../../../src/react/runtimes/assistant-transport/runManager.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { invokeUserCallback } from \"../../../utils/invoke-user-callback\";\nimport { useLatestRef } from \"./useLatestRef\";\n\nexport type RunManager = Readonly<{\n isRunning: boolean;\n schedule: () => void;\n cancel: () => void;\n}>;\n\nconst disposeReason = Symbol(\"assistant-transport-dispose\");\n\ntype LifecycleCallbackName = \"onCancel\" | \"onError\" | \"onFinish\";\n\nconst invokeCallback = (\n name: LifecycleCallbackName,\n callback: (() => unknown) | undefined,\n) =>\n invokeUserCallback(\"assistant-ui\", `Assistant transport ${name}`, callback);\n\nexport function useRunManager(config: {\n onRun: (signal: AbortSignal) => Promise<void>;\n onFinish?: (() => void) | undefined;\n onCancel?: (() => void) | undefined;\n onError?: ((error: Error) => void | Promise<void>) | undefined;\n}): RunManager {\n const [isRunning, setIsRunning] = useState(false);\n const stateRef = useRef({\n pending: false,\n disposed: false,\n abortController: null as AbortController | null,\n });\n const onRunRef = useLatestRef(config.onRun);\n const onFinishRef = useLatestRef(config.onFinish);\n const onCancelRef = useLatestRef(config.onCancel);\n const onErrorRef = useLatestRef(config.onError);\n\n const startRun = useCallback(() => {\n setIsRunning(true);\n stateRef.current.pending = false;\n const ac = new AbortController();\n stateRef.current.abortController = ac;\n\n // The dispose marker rides on the abort reason so a settling run detects\n // its own disposal even after an effect cycle re-arms the manager.\n const disposeAborted = () => ac.signal.reason === disposeReason;\n\n queueMicrotask(async () => {\n try {\n if (!disposeAborted()) {\n await onRunRef.current(ac.signal);\n }\n } catch (error) {\n if (!disposeAborted() && !stateRef.current.disposed) {\n stateRef.current.pending = false;\n if (ac.signal.aborted) {\n void invokeCallback(\"onCancel\", onCancelRef.current);\n } else {\n await invokeCallback(\"onError\", () =>\n onErrorRef.current?.(error as Error),\n );\n }\n }\n } finally {\n if (!disposeAborted() && !stateRef.current.disposed) {\n void invokeCallback(\"onFinish\", onFinishRef.current);\n }\n if (!stateRef.current.disposed && stateRef.current.pending) {\n startRun();\n } else {\n setIsRunning(false);\n if (stateRef.current.abortController === ac) {\n stateRef.current.abortController = null;\n }\n }\n }\n });\n }, [onRunRef, onFinishRef, onErrorRef, onCancelRef]);\n\n const schedule = useCallback(() => {\n if (stateRef.current.disposed) return;\n if (stateRef.current.abortController) {\n // Coalesce multiple schedules while running into a single follow-up run.\n stateRef.current.pending = true;\n return;\n }\n startRun();\n }, [startRun]);\n\n // Strict-mode effects run setup / cleanup / setup on the same instance;\n // arming on setup undoes the cleanup's dispose.\n useEffect(() => {\n stateRef.current.disposed = false;\n return () => {\n stateRef.current.disposed = true;\n stateRef.current.pending = false;\n stateRef.current.abortController?.abort(disposeReason);\n };\n }, []);\n\n const cancel = useCallback(() => {\n stateRef.current.pending = false;\n stateRef.current.abortController?.abort();\n }, []);\n\n return {\n isRunning,\n schedule,\n cancel,\n };\n}\n"],"mappings":";;;;AAUA,MAAMW,gBAAgBC,OAAO,6BAA6B;AAI1D,MAAME,kBACJC,MACAC,aAEAZ,mBAAmB,gBAAgB,uBAAuBW,QAAQC,QAAQ;AAE5E,SAAgBC,cAAcC,QAKf;CACb,MAAM,CAACV,WAAWoB,gBAAgBzB,SAAS,KAAK;CAChD,MAAM0B,WAAW3B,OAAO;EACtB4B,SAAS;EACTC,UAAU;EACVC,iBAAiB;CACnB,CAAC;CACD,MAAME,WAAW7B,aAAaa,OAAOC,KAAK;CAC1C,MAAMgB,cAAc9B,aAAaa,OAAOK,QAAQ;CAChD,MAAMa,cAAc/B,aAAaa,OAAOM,QAAQ;CAChD,MAAMa,aAAahC,aAAaa,OAAOO,OAAO;CAE9C,MAAMa,WAAWtC,kBAAkB;EACjC4B,aAAa,IAAI;EACjBC,SAASU,QAAQT,UAAU;EAC3B,MAAMU,KAAK,IAAIP,gBAAgB;EAC/BJ,SAASU,QAAQP,kBAAkBQ;EAInC,MAAMC,uBAAuBD,GAAGpB,OAAOsB,WAAW/B;EAElDgC,eAAe,YAAY;GACzB,IAAI;IACF,IAAI,CAACF,eAAe,GAClB,MAAMP,SAASK,QAAQC,GAAGpB,MAAM;GAEpC,SAASM,OAAO;IACd,IAAI,CAACe,eAAe,KAAK,CAACZ,SAASU,QAAQR,UAAU;KACnDF,SAASU,QAAQT,UAAU;KAC3B,IAAIU,GAAGpB,OAAOwB,SACZ,eAAoB,YAAYR,YAAYG,OAAO;UAEnD,MAAMzB,eAAe,iBACnBuB,WAAWE,UAAUb,KAAc,CACrC;IAEJ;GACF,UAAU;IACR,IAAI,CAACe,eAAe,KAAK,CAACZ,SAASU,QAAQR,UACzC,eAAoB,YAAYI,YAAYI,OAAO;IAErD,IAAI,CAACV,SAASU,QAAQR,YAAYF,SAASU,QAAQT,SACjDQ,SAAS;SACJ;KACLV,aAAa,KAAK;KAClB,IAAIC,SAASU,QAAQP,oBAAoBQ,IACvCX,SAASU,QAAQP,kBAAkB;IAEvC;GACF;EACF,CAAC;CACH,GAAG;EAACE;EAAUC;EAAaE;EAAYD;CAAW,CAAC;CAEnD,MAAM3B,WAAWT,kBAAkB;EACjC,IAAI6B,SAASU,QAAQR,UAAU;EAC/B,IAAIF,SAASU,QAAQP,iBAAiB;GAEpCH,SAASU,QAAQT,UAAU;GAC3B;EACF;EACAQ,SAAS;CACX,GAAG,CAACA,QAAQ,CAAC;CAIbrC,gBAAgB;EACd4B,SAASU,QAAQR,WAAW;EAC5B,aAAa;GACXF,SAASU,QAAQR,WAAW;GAC5BF,SAASU,QAAQT,UAAU;GAC3BD,SAASU,QAAQP,iBAAiBa,MAAMlC,aAAa;EACvD;CACF,GAAG,CAAA,CAAE;CAOL,OAAO;EACLH;EACAC;EACAC,QARaV,kBAAkB;GAC/B6B,SAASU,QAAQT,UAAU;GAC3BD,SAASU,QAAQP,iBAAiBa,MAAM;EAC1C,GAAG,CAAA,CAKDnC;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAssistantTransportRuntime.d.ts","names":[],"sources":["../../../../src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts"],"mappings":";;;;cA8Ha,yCAGH,SAAS;iBAOH,8BAA8B;iBAC9B,2BAA2B,GACzC,WAAW,OAAO,sBAAsB,IACvC;;;;
|
|
1
|
+
{"version":3,"file":"useAssistantTransportRuntime.d.ts","names":[],"sources":["../../../../src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts"],"mappings":";;;;cA8Ha,yCAGH,SAAS;iBAOH,8BAA8B;iBAC9B,2BAA2B,GACzC,WAAW,OAAO,sBAAsB,IACvC;;;;cA4UU,+BAAgC,GAC3C,SAAS,0BAA0B,OAClC"}
|
|
@@ -266,7 +266,7 @@ const useAssistantTransportThreadRuntime = (options) => {
|
|
|
266
266
|
result: toolOptions.result,
|
|
267
267
|
toolName: toolOptions.toolName,
|
|
268
268
|
isError: toolOptions.isError,
|
|
269
|
-
...toolOptions.artifact && { artifact: toolOptions.artifact },
|
|
269
|
+
...toolOptions.artifact !== void 0 && { artifact: toolOptions.artifact },
|
|
270
270
|
...toolOptions.modelContent !== void 0 && { modelContent: toolOptions.modelContent }
|
|
271
271
|
};
|
|
272
272
|
commandQueue.enqueue(command_1);
|
|
@@ -1 +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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"}
|
|
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 !== undefined && {\n artifact: toolOptions.artifact,\n }),\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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"}
|