@assistant-ui/core 0.3.17 → 0.3.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/attachment.d.ts.map +1 -1
- package/dist/adapters/attachment.js +5 -4
- package/dist/adapters/attachment.js.map +1 -1
- package/dist/adapters/speech.d.ts.map +1 -1
- package/dist/adapters/speech.js +13 -3
- package/dist/adapters/speech.js.map +1 -1
- package/dist/adapters/thread-history.d.ts +4 -0
- package/dist/adapters/thread-history.d.ts.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +4 -3
- package/dist/internal.js +3 -2
- package/dist/model-context/frame/host.d.ts.map +1 -1
- package/dist/model-context/frame/host.js +35 -14
- package/dist/model-context/frame/host.js.map +1 -1
- package/dist/model-context/frame/provider.d.ts +2 -0
- package/dist/model-context/frame/provider.d.ts.map +1 -1
- package/dist/model-context/frame/provider.js +30 -7
- package/dist/model-context/frame/provider.js.map +1 -1
- package/dist/model-context/interactable-composer-metadata.d.ts.map +1 -1
- package/dist/model-context/interactable-composer-metadata.js +27 -18
- package/dist/model-context/interactable-composer-metadata.js.map +1 -1
- package/dist/model-context/registry.d.ts.map +1 -1
- package/dist/model-context/registry.js +3 -5
- package/dist/model-context/registry.js.map +1 -1
- package/dist/model-context/types.d.ts.map +1 -1
- package/dist/model-context/types.js +5 -4
- package/dist/model-context/types.js.map +1 -1
- package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
- package/dist/react/adapters/LocalStorageThreadListAdapter.js +45 -7
- package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
- package/dist/react/client/DataRenderers.d.ts.map +1 -1
- package/dist/react/client/DataRenderers.js +20 -15
- package/dist/react/client/DataRenderers.js.map +1 -1
- package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
- package/dist/react/client/InMemoryThreadList.js +62 -56
- 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 +35 -32
- package/dist/react/client/Interactables.js.map +1 -1
- package/dist/react/client/RemoteThreadList.d.ts +1 -0
- package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
- package/dist/react/client/RemoteThreadList.js +154 -143
- package/dist/react/client/RemoteThreadList.js.map +1 -1
- package/dist/react/client/Tools.d.ts.map +1 -1
- package/dist/react/client/Tools.js +18 -16
- package/dist/react/client/Tools.js.map +1 -1
- package/dist/react/client/interactable-model-context.d.ts.map +1 -1
- package/dist/react/client/interactable-model-context.js +3 -2
- package/dist/react/client/interactable-model-context.js.map +1 -1
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.js +2 -2
- package/dist/react/interactables-legacy/Interactables.js +242 -121
- package/dist/react/interactables-legacy/Interactables.js.map +1 -1
- package/dist/react/interactables-legacy/useAssistantInteractable.d.ts.map +1 -1
- package/dist/react/interactables-legacy/useAssistantInteractable.js +3 -0
- package/dist/react/interactables-legacy/useAssistantInteractable.js.map +1 -1
- package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -1
- package/dist/react/interactables-shared/useInteractablePersistenceQueue.js +11 -9
- package/dist/react/interactables-shared/useInteractablePersistenceQueue.js.map +1 -1
- package/dist/react/model-context/makeAssistantTool.d.ts +2 -2
- package/dist/react/model-context/makeAssistantTool.js +1 -1
- package/dist/react/model-context/makeAssistantTool.js.map +1 -1
- package/dist/react/model-context/useAssistantTool.d.ts +2 -2
- package/dist/react/model-context/useAssistantTool.js +1 -1
- package/dist/react/model-context/useAssistantTool.js.map +1 -1
- package/dist/react/model-context/useInteractable.d.ts.map +1 -1
- package/dist/react/model-context/useInteractable.js +4 -1
- package/dist/react/model-context/useInteractable.js.map +1 -1
- package/dist/react/model-context/useInteractableVersions.js +1 -1
- package/dist/react/model-context/useToolArgsStatus.d.ts.map +1 -1
- package/dist/react/model-context/useToolArgsStatus.js +2 -1
- package/dist/react/model-context/useToolArgsStatus.js.map +1 -1
- package/dist/react/primitives/message/MessageGroupedParts.d.ts +11 -2
- package/dist/react/primitives/message/MessageGroupedParts.d.ts.map +1 -1
- package/dist/react/primitives/message/MessageGroupedParts.js +3 -2
- package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
- package/dist/react/primitives/part/PartMessages.d.ts +1 -0
- package/dist/react/primitives/part/PartMessages.d.ts.map +1 -1
- package/dist/react/primitives/part/PartMessages.js +1 -0
- package/dist/react/primitives/part/PartMessages.js.map +1 -1
- package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
- package/dist/react/primitives/thread/ThreadMessages.js +6 -5
- package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +16 -8
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +5 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +105 -104
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadResource.d.ts +1 -0
- package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadResource.js +13 -11
- package/dist/react/runtimes/RemoteThreadResource.js.map +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +5 -24
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +354 -226
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
- package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +1 -0
- package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +22 -2
- package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
- package/dist/react/runtimes/cloud/auiV0.d.ts +40 -15
- package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/auiV0.js +62 -15
- package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
- package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts +2 -1
- package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js +6 -1
- package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js.map +1 -1
- package/dist/react/runtimes/cloud/sdkIdentity.d.ts +6 -0
- package/dist/react/runtimes/cloud/sdkIdentity.d.ts.map +1 -0
- package/dist/react/runtimes/cloud/sdkIdentity.js +9 -0
- package/dist/react/runtimes/cloud/sdkIdentity.js.map +1 -0
- package/dist/react/runtimes/external-message-converter.d.ts +12 -2
- package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
- package/dist/react/runtimes/external-message-converter.js +26 -61
- package/dist/react/runtimes/external-message-converter.js.map +1 -1
- package/dist/react/runtimes/useExternalStoreRuntime.js +75 -46
- package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
- package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
- package/dist/react/runtimes/useRemoteThreadListRuntime.js +64 -24
- package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
- package/dist/react/utils/groupParts.d.ts +6 -1
- package/dist/react/utils/groupParts.d.ts.map +1 -1
- package/dist/react/utils/groupParts.js +6 -0
- package/dist/react/utils/groupParts.js.map +1 -1
- package/dist/react/utils/useJSONEqual.d.ts +3 -1
- package/dist/react/utils/useJSONEqual.d.ts.map +1 -1
- package/dist/react/utils/useJSONEqual.js +6 -1
- package/dist/react/utils/useJSONEqual.js.map +1 -1
- package/dist/react/utils/useJSONSchemaDependency.d.ts +7 -0
- package/dist/react/utils/useJSONSchemaDependency.d.ts.map +1 -0
- package/dist/react/utils/useJSONSchemaDependency.js +20 -0
- package/dist/react/utils/useJSONSchemaDependency.js.map +1 -0
- package/dist/runtime/api/thread-list-item-runtime.d.ts +7 -3
- package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
- package/dist/runtime/api/thread-list-item-runtime.js +2 -2
- package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
- package/dist/runtime/api/thread-list-runtime.d.ts +3 -0
- package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
- package/dist/runtime/api/thread-list-runtime.js +18 -14
- package/dist/runtime/api/thread-list-runtime.js.map +1 -1
- package/dist/runtime/api/thread-runtime.d.ts +4 -0
- package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
- package/dist/runtime/api/thread-runtime.js +3 -6
- package/dist/runtime/api/thread-runtime.js.map +1 -1
- package/dist/runtime/base/base-composer-runtime-core.d.ts +1 -0
- package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/base-composer-runtime-core.js +62 -22
- package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
- package/dist/runtime/base/base-thread-runtime-core.d.ts +2 -0
- package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/base-thread-runtime-core.js +161 -69
- package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
- package/dist/runtime/interfaces/composer-runtime-core.d.ts +12 -5
- package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +4 -1
- package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
- package/dist/runtime/interfaces/thread-runtime-core.d.ts +6 -0
- package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
- package/dist/runtime/queue/message-queue.d.ts +5 -0
- package/dist/runtime/queue/message-queue.d.ts.map +1 -1
- package/dist/runtime/queue/message-queue.js +61 -6
- package/dist/runtime/queue/message-queue.js.map +1 -1
- package/dist/runtime/utils/auto-status.d.ts +6 -2
- package/dist/runtime/utils/auto-status.d.ts.map +1 -1
- package/dist/runtime/utils/auto-status.js +12 -4
- package/dist/runtime/utils/auto-status.js.map +1 -1
- package/dist/runtime/utils/external-message-conversion.d.ts +16 -4
- package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -1
- package/dist/runtime/utils/external-message-conversion.js +49 -13
- package/dist/runtime/utils/external-message-conversion.js.map +1 -1
- package/dist/runtime/utils/message-repository.d.ts +1 -0
- package/dist/runtime/utils/message-repository.d.ts.map +1 -1
- package/dist/runtime/utils/message-repository.js +18 -9
- package/dist/runtime/utils/message-repository.js.map +1 -1
- 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 +5 -3
- package/dist/runtime/utils/thread-message-like.js.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +21 -27
- 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.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-runtime-core.js +8 -1
- package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
- package/dist/runtimes/internal.d.ts +3 -3
- package/dist/runtimes/internal.js +2 -2
- package/dist/runtimes/local/local-thread-runtime-core.d.ts +1 -1
- package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/local/local-thread-runtime-core.js +4 -1
- package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
- package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +18 -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 +130 -42
- package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
- package/dist/runtimes/remote-thread-list/title-generation.d.ts +49 -0
- package/dist/runtimes/remote-thread-list/title-generation.d.ts.map +1 -0
- package/dist/runtimes/remote-thread-list/title-generation.js +197 -0
- package/dist/runtimes/remote-thread-list/title-generation.js.map +1 -0
- package/dist/runtimes/remote-thread-list/title.d.ts +3 -1
- package/dist/runtimes/remote-thread-list/title.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/title.js +9 -1
- package/dist/runtimes/remote-thread-list/title.js.map +1 -1
- package/dist/runtimes/remote-thread-list/types.d.ts +10 -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 -1
- 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 +260 -203
- package/dist/store/clients/external-thread.js.map +1 -1
- package/dist/store/clients/model-context-client.d.ts.map +1 -1
- package/dist/store/clients/model-context-client.js +2 -1
- package/dist/store/clients/model-context-client.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 -0
- 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 +5 -4
- package/dist/store/clients/suggestions.js.map +1 -1
- package/dist/store/clients/thread-tasks.d.ts +13 -0
- package/dist/store/clients/thread-tasks.d.ts.map +1 -0
- package/dist/store/clients/thread-tasks.js +69 -0
- package/dist/store/clients/thread-tasks.js.map +1 -0
- package/dist/store/index.d.ts +3 -2
- package/dist/store/index.js +3 -3
- package/dist/store/primitive-predicates.d.ts.map +1 -1
- package/dist/store/primitive-predicates.js +4 -4
- package/dist/store/primitive-predicates.js.map +1 -1
- package/dist/store/runtime-clients/composer-runtime-client.d.ts +1 -0
- package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/composer-runtime-client.js +97 -61
- package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/message-runtime-client.d.ts +1 -0
- package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/message-runtime-client.js +221 -144
- package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/thread-list-item-runtime-client.js +1 -1
- package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/thread-list-runtime-client.js +54 -52
- package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/thread-runtime-client.js +246 -126
- package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
- package/dist/store/scope-registration.d.ts +2 -0
- package/dist/store/scope-registration.d.ts.map +1 -1
- package/dist/store/scopes/composer.d.ts +10 -2
- package/dist/store/scopes/composer.d.ts.map +1 -1
- package/dist/store/scopes/message.d.ts +30 -1
- package/dist/store/scopes/message.d.ts.map +1 -1
- package/dist/store/scopes/task.d.ts +36 -0
- package/dist/store/scopes/task.d.ts.map +1 -0
- package/dist/store/scopes/task.js +0 -0
- package/dist/store/scopes/thread-list-item.d.ts +2 -2
- package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
- package/dist/store/scopes/thread.d.ts +28 -0
- package/dist/store/scopes/thread.d.ts.map +1 -1
- package/dist/store/scopes/threads.d.ts +1 -0
- package/dist/store/scopes/threads.d.ts.map +1 -1
- package/dist/subscribable/subscribable.d.ts +2 -1
- package/dist/subscribable/subscribable.d.ts.map +1 -1
- package/dist/subscribable/subscribable.js +23 -15
- package/dist/subscribable/subscribable.js.map +1 -1
- package/dist/types/attachment.d.ts +2 -1
- package/dist/types/attachment.d.ts.map +1 -1
- package/dist/types/attachment.js +2 -1
- package/dist/types/attachment.js.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/message.d.ts +8 -1
- package/dist/types/message.d.ts.map +1 -1
- package/dist/types/message.js.map +1 -1
- package/dist/utils/abortable-iterable.d.ts +19 -0
- package/dist/utils/abortable-iterable.d.ts.map +1 -0
- package/dist/utils/abortable-iterable.js +88 -0
- package/dist/utils/abortable-iterable.js.map +1 -0
- package/dist/utils/composite-context-provider.d.ts.map +1 -1
- package/dist/utils/composite-context-provider.js +20 -2
- package/dist/utils/composite-context-provider.js.map +1 -1
- package/dist/utils/getGroupStatus.d.ts +18 -2
- package/dist/utils/getGroupStatus.d.ts.map +1 -1
- package/dist/utils/getGroupStatus.js +32 -7
- package/dist/utils/getGroupStatus.js.map +1 -1
- package/dist/utils/record.d.ts +11 -0
- package/dist/utils/record.d.ts.map +1 -0
- package/dist/utils/record.js +12 -0
- package/dist/utils/record.js.map +1 -0
- package/dist/utils/wire-media.d.ts.map +1 -1
- package/dist/utils/wire-media.js +2 -2
- package/dist/utils/wire-media.js.map +1 -1
- package/package.json +11 -11
- package/src/adapters/attachment.test.ts +50 -1
- package/src/adapters/attachment.ts +7 -4
- package/src/adapters/speech.test.ts +236 -0
- package/src/adapters/speech.ts +17 -10
- package/src/adapters/thread-history.ts +3 -0
- package/src/index.ts +2 -0
- package/src/internal.ts +4 -0
- package/src/model-context/frame/host.test.ts +137 -1
- package/src/model-context/frame/host.ts +49 -16
- package/src/model-context/frame/provider.test.ts +71 -0
- package/src/model-context/frame/provider.ts +37 -7
- package/src/model-context/interactable-composer-metadata.test.ts +58 -0
- package/src/model-context/interactable-composer-metadata.ts +19 -13
- package/src/model-context/registry.test.ts +12 -0
- package/src/model-context/registry.ts +3 -2
- package/src/model-context/types.test.ts +25 -0
- package/src/model-context/types.ts +9 -4
- package/src/react/RuntimeAdapter.test.ts +34 -0
- package/src/react/adapters/LocalStorageThreadListAdapter.test.ts +244 -0
- package/src/react/adapters/LocalStorageThreadListAdapter.tsx +104 -7
- package/src/react/client/DataRenderers.test.tsx +45 -0
- package/src/react/client/DataRenderers.ts +13 -9
- package/src/react/client/InMemoryThreadList.ts +1 -0
- package/src/react/client/Interactables.test.ts +72 -1
- package/src/react/client/Interactables.ts +22 -14
- package/src/react/client/RemoteThreadList.background.test.ts +148 -6
- package/src/react/client/RemoteThreadList.concurrent.test.tsx +42 -1
- package/src/react/client/RemoteThreadList.test.ts +386 -4
- package/src/react/client/RemoteThreadList.ts +181 -112
- package/src/react/client/Tools.ts +22 -11
- package/src/react/client/interactable-model-context.test.ts +44 -0
- package/src/react/client/interactable-model-context.ts +3 -2
- package/src/react/index.ts +5 -1
- package/src/react/interactables-legacy/Interactables.ts +16 -16
- package/src/react/interactables-legacy/useAssistantInteractable.test.tsx +132 -0
- package/src/react/interactables-legacy/useAssistantInteractable.ts +10 -1
- package/src/react/interactables-shared/useInteractablePersistenceQueue.ts +9 -10
- package/src/react/model-context/makeAssistantTool.ts +2 -2
- package/src/react/model-context/useAssistantTool.ts +2 -2
- package/src/react/model-context/useInteractable.test.tsx +177 -0
- package/src/react/model-context/useInteractable.ts +3 -0
- package/src/react/model-context/useToolArgsStatus.test.tsx +30 -0
- package/src/react/model-context/useToolArgsStatus.ts +2 -1
- package/src/react/primitive-hooks/useActionBarCopy.test.ts +0 -1
- package/src/react/primitive-hooks/useSuggestionTrigger.test.ts +0 -1
- package/src/react/primitives/message/MessageGroupedParts.test.tsx +96 -0
- package/src/react/primitives/message/MessageGroupedParts.tsx +15 -4
- package/src/react/primitives/part/PartMessages.test.tsx +104 -1
- package/src/react/primitives/part/PartMessages.tsx +1 -0
- package/src/react/primitives/thread/ThreadMessages.test.tsx +142 -0
- package/src/react/primitives/thread/ThreadMessages.tsx +8 -5
- package/src/react/providers/ReadonlyThreadProvider.test.tsx +56 -0
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.destroy.test.tsx +172 -0
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +33 -0
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +7 -1
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +28 -5
- package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.load-error.test.ts +132 -0
- package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.switch-delete.test.ts +105 -0
- package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +143 -112
- package/src/react/runtimes/RemoteThreadResource.test.ts +9 -0
- package/src/react/runtimes/RemoteThreadResource.ts +19 -12
- package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.ts +20 -14
- package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +703 -6
- package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +492 -402
- package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.test.ts +77 -0
- package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +27 -1
- package/src/react/runtimes/cloud/auiV0.ts +160 -25
- package/src/react/runtimes/cloud/createCloudThreadListAdapter.test.ts +36 -0
- package/src/react/runtimes/cloud/createCloudThreadListAdapter.ts +8 -1
- package/src/react/runtimes/cloud/sdkIdentity.ts +9 -0
- package/src/react/runtimes/cloud/useCloudThreadListAdapter.test.tsx +18 -4
- package/src/react/runtimes/external-message-converter.test.ts +136 -1
- package/src/react/runtimes/external-message-converter.ts +39 -93
- package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +41 -0
- package/src/react/runtimes/useExternalStoreRuntime.ts +10 -4
- package/src/react/runtimes/useLocalRuntime.test.tsx +20 -0
- package/src/react/runtimes/useRemoteThreadListRuntime.load-error.test.tsx +108 -0
- package/src/react/runtimes/useRemoteThreadListRuntime.ts +34 -1
- package/src/react/utils/groupParts.ts +12 -1
- package/src/react/utils/useJSONEqual.ts +9 -0
- package/src/react/utils/useJSONSchemaDependency.ts +22 -0
- package/src/runtime/api/message-runtime.test.ts +75 -0
- package/src/runtime/api/thread-list-item-runtime.ts +10 -3
- package/src/runtime/api/thread-list-runtime.ts +21 -11
- package/src/runtime/api/thread-runtime.test.ts +136 -0
- package/src/runtime/api/thread-runtime.ts +10 -5
- package/src/runtime/base/base-composer-runtime-core.ts +105 -24
- package/src/runtime/base/base-thread-runtime-core.test.ts +1063 -2
- package/src/runtime/base/base-thread-runtime-core.ts +228 -87
- package/src/runtime/interfaces/composer-runtime-core.ts +10 -5
- package/src/runtime/interfaces/thread-list-runtime-core.ts +5 -1
- package/src/runtime/interfaces/thread-runtime-core.ts +6 -0
- package/src/runtime/queue/message-queue.ts +68 -6
- package/src/runtime/utils/auto-status.test.ts +112 -1
- package/src/runtime/utils/auto-status.ts +31 -5
- package/src/runtime/utils/external-message-conversion.test.ts +202 -0
- package/src/runtime/utils/external-message-conversion.ts +123 -32
- package/src/runtime/utils/message-repository.test.ts +49 -0
- package/src/runtime/utils/message-repository.ts +32 -20
- package/src/runtime/utils/thread-message-like.test.ts +52 -0
- package/src/runtime/utils/thread-message-like.ts +5 -1
- package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +18 -13
- package/src/runtimes/external-store/external-store-thread-runtime-core.ts +31 -1
- package/src/runtimes/internal.ts +1 -0
- package/src/runtimes/local/local-thread-runtime-core.test.ts +21 -0
- package/src/runtimes/local/local-thread-runtime-core.ts +11 -1
- package/src/runtimes/remote-thread-list/remote-thread-state.test.ts +128 -2
- package/src/runtimes/remote-thread-list/remote-thread-state.ts +182 -42
- package/src/runtimes/remote-thread-list/title-generation.test.ts +602 -0
- package/src/runtimes/remote-thread-list/title-generation.ts +329 -0
- package/src/runtimes/remote-thread-list/title.test.ts +62 -0
- package/src/runtimes/remote-thread-list/title.ts +13 -0
- package/src/runtimes/remote-thread-list/types.ts +10 -0
- package/src/runtimes/tool-invocations/EDGE_CASES.md +2 -6
- package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +133 -0
- package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +10 -6
- package/src/store/clients/external-thread.ts +67 -4
- package/src/store/clients/model-context-client.ts +5 -1
- package/src/store/clients/single-thread-list.ts +1 -0
- package/src/store/clients/suggestions.test.ts +40 -0
- package/src/store/clients/suggestions.ts +13 -10
- package/src/store/clients/thread-tasks.test.ts +274 -0
- package/src/store/clients/thread-tasks.ts +138 -0
- package/src/store/index.ts +8 -0
- package/src/store/primitive-predicates.test.ts +48 -5
- package/src/store/primitive-predicates.ts +7 -2
- package/src/store/runtime-clients/composer-runtime-client.ts +42 -9
- package/src/store/runtime-clients/message-runtime-client.ts +54 -6
- package/src/store/runtime-clients/thread-list-item-runtime-client.ts +4 -2
- package/src/store/runtime-clients/thread-list-runtime-client.ts +1 -0
- package/src/store/runtime-clients/thread-runtime-client.ts +89 -11
- package/src/store/scope-registration.ts +2 -0
- package/src/store/scopes/composer.ts +16 -4
- package/src/store/scopes/message.ts +14 -0
- package/src/store/scopes/task.ts +34 -0
- package/src/store/scopes/thread-list-item.ts +5 -2
- package/src/store/scopes/thread.ts +20 -0
- package/src/store/scopes/threads.ts +1 -0
- package/src/store/thread-tasks.test.tsx +209 -0
- package/src/subscribable/subscribable.test.ts +156 -1
- package/src/subscribable/subscribable.ts +25 -15
- package/src/tests/MessageRepository.test.ts +117 -5
- package/src/tests/OptimisticState-list-race.test.ts +1 -0
- package/src/tests/RemoteThreadListThreadListRuntimeCore-initialize-adapter-change.test.ts +38 -0
- package/src/tests/RemoteThreadListThreadListRuntimeCore-load-race.test.ts +47 -0
- package/src/tests/RemoteThreadListThreadListRuntimeCore-title-race.test.ts +89 -0
- package/src/tests/attachment-adapters.test.ts +14 -0
- package/src/tests/auiV0Encode.test.ts +300 -0
- package/src/tests/base-composer-runtime-core-send.test.ts +51 -0
- package/src/tests/base-composer-runtime-core.test.ts +353 -2
- package/src/tests/external-store-thread-list-runtime-core.test.ts +83 -0
- package/src/tests/external-store-thread-runtime-core-adapter.test.ts +178 -18
- package/src/tests/external-thread-attachments.test.tsx +208 -0
- package/src/tests/external-thread-parity.test.tsx +57 -0
- package/src/tests/groupParts.test.ts +71 -0
- package/src/tests/message-queue.test.ts +253 -0
- package/src/tests/remote-thread-list-isLoading.test.ts +1 -0
- package/src/tests/remote-thread-list-reactive-threadId.test.ts +51 -0
- package/src/tests/thread-list-runtime-getLoadThreadsPromise.test.ts +1 -0
- package/src/tests/thread-switch-events.test.tsx +78 -0
- package/src/tests/tools-scope-migration.test.tsx +28 -0
- package/src/tests/useRemoteThreadListRuntime-controlled.test.tsx +43 -0
- package/src/types/attachment.ts +4 -0
- package/src/types/index.ts +1 -0
- package/src/types/message.ts +8 -0
- package/src/utils/abortable-iterable.test.ts +328 -0
- package/src/utils/abortable-iterable.ts +104 -0
- package/src/utils/composite-context-provider.test.ts +25 -0
- package/src/utils/composite-context-provider.ts +23 -2
- package/src/utils/getGroupStatus.test.ts +70 -4
- package/src/utils/getGroupStatus.ts +35 -12
- package/src/utils/record.test.ts +48 -0
- package/src/utils/record.ts +11 -0
- package/src/utils/wire-media.test.ts +10 -0
- package/src/utils/wire-media.ts +6 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantCloudThreadHistoryAdapter.js","names":["RefObject","useEffect","useRef","useState","GenericThreadHistoryAdapter","ThreadHistoryAdapter","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","ExportedMessageRepositoryItem","AssistantCloud","AssistantCloudRunReportToolCall","CloudMessagePersistence","createFormattedPersistence","createRunTelemetryToolCall","normalizeRunTelemetryUsage","RunTelemetryUsageInit","truncateRunTelemetryText","auiV0Decode","auiV0Encode","AssistantClient","getClientId","useAui","ThreadListItemMethods","CloudThreadListItem","Pick","globalPersistence","WeakMap","ClientId","AssistantCloudThreadHistoryAdapter","cloudRef","getAui","constructor","aui","getPersistence","threadListItem","key","has","set","current","get","_persistence","tryGetKeyedThreadListItem","live","source","undefined","id","getState","listed","threads","threadItems","some","item","remoteId","withFormat","Record","formatAdapter","TMessage","TStorageFormat","adapter","pinCurrent","next","resolvePinned","getTargetFormatted","pin","append","pinned","Error","initialize","update","localMessageId","delete","reportTelemetry","items","options","durationMs","stepTimestamps","StepTimestamp","encodedRunMessages","map","encode","_reportRunTelemetry","format","load","Promise","messages","parentId","message","encoded","telemetry","enabled","_maybeReportRun","isPersisted","filter","m","reverse","runMessages","T","extracted","extractRunTelemetry","_sendReport","content","extractTelemetry","data","TelemetryData","mergedSteps","mergeStepTimestamps","steps","initial","Parameters","this","runs","report","thread_id","status","totalSteps","total_steps","toolCalls","tool_calls","inputTokens","input_tokens","outputTokens","output_tokens","reasoningTokens","reasoning_tokens","cachedInputTokens","cached_input_tokens","duration_ms","outputText","output_text","metadata","modelId","model_id","beforeReport","catch","TelemetryStepData","start_ms","end_ms","timestamps","t","len","Math","min","length","s","i","extractAuiV0","extractAiSdkV6","aggregateAiSdkV6RunSteps","result","AUI_STATUS_MAP","error","incomplete","msg","role","type","text","toolName","toolCallId","args","argsText","usage","custom","p","textParts","join","totalInput","totalOutput","totalReasoning","totalCachedInput","hasInput","hasOutput","hasReasoning","hasCachedInput","step","statusType","telemetrySteps","AiSdkV6Part","input","output","AiSdkV6Message","parts","isToolCallPart","startsWith","isDynamicToolPart","partToToolCall","toolSource","slice","collectAiSdkV6Parts","stepsData","currentStepToolCalls","push","tc","extractModelId","buildAiSdkV6Result","hasText","extractAiSdkV6Usage","normalized","hasAny","n","stepMessages","allTextParts","allToolCalls","allStepsData","hasAssistant","useAssistantCloudThreadHistoryAdapter","auiRef"],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"sourcesContent":["import { type RefObject, useEffect, useRef, useState } from \"react\";\nimport type {\n GenericThreadHistoryAdapter,\n ThreadHistoryAdapter,\n MessageFormatAdapter,\n MessageFormatItem,\n MessageFormatRepository,\n} from \"../../../adapters/thread-history\";\nimport type { ExportedMessageRepositoryItem } from \"../../../runtime/utils/message-repository\";\nimport {\n type AssistantCloud,\n type AssistantCloudRunReportToolCall,\n CloudMessagePersistence,\n createFormattedPersistence,\n createRunTelemetryToolCall,\n normalizeRunTelemetryUsage,\n type RunTelemetryUsageInit,\n truncateRunTelemetryText,\n} from \"assistant-cloud\";\nimport { auiV0Decode, auiV0Encode } from \"./auiV0\";\nimport { type AssistantClient, getClientId, useAui } from \"@assistant-ui/store\";\nimport type { ThreadListItemMethods } from \"../../../store/scopes/thread-list-item\";\n\ntype CloudThreadListItem = Pick<\n ThreadListItemMethods,\n \"getState\" | \"initialize\"\n>;\n\nconst globalPersistence = new WeakMap<\n getClientId.ClientId,\n CloudMessagePersistence\n>();\n\nclass AssistantCloudThreadHistoryAdapter implements ThreadHistoryAdapter {\n private cloudRef: RefObject<AssistantCloud>;\n private getAui: () => AssistantClient;\n\n constructor(\n cloudRef: RefObject<AssistantCloud>,\n getAui: () => AssistantClient,\n ) {\n this.cloudRef = cloudRef;\n this.getAui = getAui;\n }\n\n private get aui(): AssistantClient {\n return this.getAui();\n }\n\n private getPersistence(\n threadListItem: CloudThreadListItem = this.aui.threadListItem,\n ): CloudMessagePersistence {\n const key = getClientId(threadListItem);\n if (!globalPersistence.has(key)) {\n globalPersistence.set(\n key,\n new CloudMessagePersistence(() => this.cloudRef.current),\n );\n }\n return globalPersistence.get(key)!;\n }\n\n private get _persistence(): CloudMessagePersistence {\n return this.getPersistence();\n }\n\n private tryGetKeyedThreadListItem(): CloudThreadListItem | undefined {\n const live = this.aui.threadListItem;\n if (!live.source) return undefined;\n const id = live.getState().id;\n if (id === undefined) return undefined;\n // A body can resolve before the list's committed items include its\n // thread; the live item is already the per-thread anchor in that window.\n const listed = this.aui.threads\n .getState()\n .threadItems.some((item) => item.id === id || item.remoteId === id);\n return listed ? this.aui.threads.item({ id }) : live;\n }\n\n withFormat<TMessage, TStorageFormat extends Record<string, unknown>>(\n formatAdapter: MessageFormatAdapter<TMessage, TStorageFormat>,\n ): GenericThreadHistoryAdapter<TMessage> {\n const adapter = this;\n let threadListItem: CloudThreadListItem | undefined;\n const pinCurrent = () => {\n const next = adapter.tryGetKeyedThreadListItem();\n if (next) threadListItem = next;\n return threadListItem;\n };\n const resolvePinned = () => threadListItem ?? pinCurrent();\n const getTargetFormatted = (item: CloudThreadListItem) =>\n createFormattedPersistence(adapter.getPersistence(item), formatAdapter);\n return {\n pin() {\n pinCurrent();\n },\n async append(item: MessageFormatItem<TMessage>) {\n const pinned = resolvePinned();\n if (!pinned) {\n throw new Error(\n \"Cannot persist cloud history without a thread list item.\",\n );\n }\n const remoteId =\n pinned.getState().remoteId ?? (await pinned.initialize()).remoteId;\n await getTargetFormatted(pinned).append(remoteId, item);\n },\n async update(item: MessageFormatItem<TMessage>, localMessageId: string) {\n const pinned = resolvePinned();\n const remoteId = pinned?.getState().remoteId;\n if (!remoteId || !pinned) return;\n await getTargetFormatted(pinned).update?.(\n remoteId,\n item,\n localMessageId,\n );\n },\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n },\n reportTelemetry(\n items: MessageFormatItem<TMessage>[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n ) {\n const encodedRunMessages = items.map((item) =>\n formatAdapter.encode(item),\n );\n adapter._reportRunTelemetry(\n formatAdapter.format,\n encodedRunMessages,\n options,\n resolvePinned(),\n );\n },\n async load(): Promise<MessageFormatRepository<TMessage>> {\n // Loads re-pin and resolve through the pinned item, so the id mapping\n // they populate lives on the same persistence instance later writes\n // resolve, whichever of the list item or the live graft won the pin.\n const pinned = pinCurrent();\n const live = adapter.aui.threadListItem;\n const remoteId = live.source ? live.getState().remoteId : undefined;\n if (!remoteId) return { messages: [] };\n return getTargetFormatted(pinned ?? live).load(remoteId);\n },\n };\n }\n\n async append({ parentId, message }: ExportedMessageRepositoryItem) {\n const { remoteId } = await this.aui.threadListItem.initialize();\n const encoded = auiV0Encode(message);\n await this._persistence.append(\n remoteId,\n message.id,\n parentId,\n \"aui/v0\",\n encoded,\n );\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(remoteId, \"aui/v0\", encoded);\n }\n }\n\n async update(item: ExportedMessageRepositoryItem) {\n if (!this._persistence.isPersisted(item.message.id)) {\n return this.append(item);\n }\n const { message } = item;\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return;\n const encoded = auiV0Encode(message);\n await this._persistence.update(remoteId, message.id, \"aui/v0\", encoded);\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(remoteId, \"aui/v0\", encoded);\n }\n }\n\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n }\n\n async load() {\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return { messages: [] };\n const messages = await this._persistence.load(remoteId, \"aui/v0\");\n return {\n messages: messages\n .filter(\n (m): m is typeof m & { format: \"aui/v0\" } => m.format === \"aui/v0\",\n )\n .map(auiV0Decode)\n .reverse(),\n };\n }\n\n private _reportRunTelemetry<T>(\n format: string,\n runMessages: T[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n threadListItem?: CloudThreadListItem,\n ) {\n if (!this.cloudRef.current.telemetry.enabled) return;\n\n const remoteId = (threadListItem ?? this.aui.threadListItem).getState()\n .remoteId;\n if (!remoteId) return;\n\n const extracted = extractRunTelemetry(format, runMessages);\n if (!extracted) return;\n\n this._sendReport(\n remoteId,\n extracted,\n options?.durationMs,\n options?.stepTimestamps,\n );\n }\n\n private _maybeReportRun<T>(remoteId: string, format: string, content: T) {\n const extracted = extractTelemetry(format, content);\n if (!extracted) return;\n\n this._sendReport(remoteId, extracted);\n }\n\n private _sendReport(\n remoteId: string,\n data: TelemetryData,\n durationMs?: number,\n stepTimestamps?: StepTimestamp[],\n ) {\n const mergedSteps = mergeStepTimestamps(data.steps, stepTimestamps);\n // Keep in sync with assistant-cloud createRunSchema\n // (apps/aui-cloud-api/src/endpoints/runs/create.ts).\n const initial: Parameters<typeof this.cloudRef.current.runs.report>[0] = {\n thread_id: remoteId,\n status: data.status,\n ...(data.totalSteps != null\n ? { total_steps: data.totalSteps }\n : undefined),\n ...(data.toolCalls ? { tool_calls: data.toolCalls } : undefined),\n ...(mergedSteps ? { steps: mergedSteps } : undefined),\n ...(data.inputTokens != null\n ? { input_tokens: data.inputTokens }\n : undefined),\n ...(data.outputTokens != null\n ? { output_tokens: data.outputTokens }\n : undefined),\n ...(data.reasoningTokens != null\n ? { reasoning_tokens: data.reasoningTokens }\n : undefined),\n ...(data.cachedInputTokens != null\n ? { cached_input_tokens: data.cachedInputTokens }\n : undefined),\n ...(durationMs != null ? { duration_ms: durationMs } : undefined),\n ...(data.outputText != null\n ? { output_text: data.outputText }\n : undefined),\n ...(data.metadata ? { metadata: data.metadata } : undefined),\n ...(data.modelId ? { model_id: data.modelId } : undefined),\n };\n\n const { beforeReport } = this.cloudRef.current.telemetry;\n const report = beforeReport ? beforeReport(initial) : initial;\n if (!report) return;\n\n this.cloudRef.current.runs.report(report).catch(() => {});\n }\n}\n\ntype TelemetryStepData = {\n input_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n tool_calls?: AssistantCloudRunReportToolCall[];\n start_ms?: number;\n end_ms?: number;\n};\n\ntype StepTimestamp = { start_ms: number; end_ms: number };\n\nfunction mergeStepTimestamps(\n steps: TelemetryStepData[] | undefined,\n timestamps: StepTimestamp[] | undefined,\n): TelemetryStepData[] | undefined {\n if (!timestamps) return steps;\n if (!steps) return timestamps.map((t) => ({ ...t }));\n\n const len = Math.min(steps.length, timestamps.length);\n return steps.map((s, i) => ({\n ...s,\n ...(i < len ? timestamps[i] : undefined),\n }));\n}\n\ntype TelemetryData = {\n status: \"completed\" | \"incomplete\" | \"error\";\n toolCalls?: AssistantCloudRunReportToolCall[];\n totalSteps?: number;\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n outputText?: string;\n metadata?: Record<string, unknown>;\n steps?: TelemetryStepData[];\n modelId?: string;\n};\n\nfunction extractTelemetry<T>(format: string, content: T): TelemetryData | null {\n switch (format) {\n case \"aui/v0\":\n return extractAuiV0(content);\n case \"ai-sdk/v6\":\n return extractAiSdkV6(content);\n default:\n return null;\n }\n}\n\nfunction extractRunTelemetry<T>(\n format: string,\n runMessages: T[],\n): TelemetryData | null {\n if (format === \"ai-sdk/v6\") {\n return aggregateAiSdkV6RunSteps(runMessages);\n }\n for (let i = runMessages.length - 1; i >= 0; i--) {\n const result = extractTelemetry(format, runMessages[i]!);\n if (result) return result;\n }\n return null;\n}\n\nconst AUI_STATUS_MAP: Record<string, TelemetryData[\"status\"]> = {\n error: \"error\",\n incomplete: \"incomplete\",\n};\n\nexport function extractAuiV0<T>(content: T): TelemetryData | null {\n const msg = content as {\n role?: string;\n status?: { type: string };\n content?: readonly {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n argsText?: string;\n result?: unknown;\n }[];\n metadata?: {\n modelId?: string;\n steps?: readonly { usage?: RunTelemetryUsageInit }[];\n custom?: Record<string, unknown> & { modelId?: string };\n };\n };\n\n if (msg.role !== \"assistant\") return null;\n // A paused (requires-action) write is not a finished run; reporting it would\n // mislabel it \"completed\" and double-count steps once the terminal write reports.\n if (msg.status?.type === \"requires-action\") return null;\n\n const toolCalls = msg.content\n ?.filter((p) => p.type === \"tool-call\" && p.toolName && p.toolCallId)\n .map((p) =>\n createRunTelemetryToolCall({\n toolName: p.toolName!,\n toolCallId: p.toolCallId!,\n args: p.args,\n result: p.result,\n argsText: p.argsText,\n }),\n );\n\n const textParts = msg.content?.filter((p) => p.type === \"text\" && p.text);\n const outputText =\n textParts && textParts.length > 0\n ? truncateRunTelemetryText(textParts.map((p) => p.text).join(\"\"))\n : undefined;\n\n const steps = msg.metadata?.steps;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let reasoningTokens: number | undefined;\n let cachedInputTokens: number | undefined;\n if (steps && steps.length > 0) {\n let totalInput = 0;\n let totalOutput = 0;\n let totalReasoning = 0;\n let totalCachedInput = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n for (const step of steps) {\n if (!step.usage) continue;\n const usage = normalizeRunTelemetryUsage(step.usage);\n if (!usage) continue;\n if (usage.inputTokens != null) {\n totalInput += usage.inputTokens;\n hasInput = true;\n }\n if (usage.outputTokens != null) {\n totalOutput += usage.outputTokens;\n hasOutput = true;\n }\n if (usage.reasoningTokens != null) {\n totalReasoning += usage.reasoningTokens;\n hasReasoning = true;\n }\n if (usage.cachedInputTokens != null) {\n totalCachedInput += usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n inputTokens = hasInput ? totalInput : undefined;\n outputTokens = hasOutput ? totalOutput : undefined;\n reasoningTokens = hasReasoning ? totalReasoning : undefined;\n cachedInputTokens = hasCachedInput ? totalCachedInput : undefined;\n }\n\n const statusType = msg.status?.type;\n const status: TelemetryData[\"status\"] =\n (statusType && AUI_STATUS_MAP[statusType]) || \"completed\";\n\n const metadata = msg.metadata?.custom as Record<string, unknown> | undefined;\n const modelId =\n msg.metadata?.modelId ??\n (typeof msg.metadata?.custom?.modelId === \"string\"\n ? msg.metadata.custom.modelId\n : undefined);\n\n const telemetrySteps: TelemetryStepData[] | undefined =\n steps && steps.length > 1\n ? steps.map((s) => {\n const usage = s.usage\n ? normalizeRunTelemetryUsage(s.usage)\n : undefined;\n return {\n ...(usage?.inputTokens != null\n ? { input_tokens: usage.inputTokens }\n : undefined),\n ...(usage?.outputTokens != null\n ? { output_tokens: usage.outputTokens }\n : undefined),\n ...(usage?.reasoningTokens != null\n ? { reasoning_tokens: usage.reasoningTokens }\n : undefined),\n ...(usage?.cachedInputTokens != null\n ? { cached_input_tokens: usage.cachedInputTokens }\n : undefined),\n };\n })\n : undefined;\n\n return {\n status,\n ...(toolCalls && toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(steps?.length ? { totalSteps: steps.length } : undefined),\n ...(inputTokens != null ? { inputTokens } : undefined),\n ...(outputTokens != null ? { outputTokens } : undefined),\n ...(reasoningTokens != null ? { reasoningTokens } : undefined),\n ...(cachedInputTokens != null ? { cachedInputTokens } : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(telemetrySteps ? { steps: telemetrySteps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\ntype AiSdkV6Part = {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n result?: unknown;\n input?: unknown;\n output?: unknown;\n};\n\ntype AiSdkV6Message = {\n role?: string;\n parts?: readonly AiSdkV6Part[];\n metadata?: Record<string, unknown>;\n};\n\nfunction isToolCallPart(p: AiSdkV6Part): boolean {\n if (!p.toolCallId) return false;\n if (p.type === \"tool-call\" || p.type === \"dynamic-tool\") return !!p.toolName;\n return p.type.startsWith(\"tool-\") || p.type.startsWith(\"dynamic-tool-\");\n}\n\nfunction isDynamicToolPart(p: AiSdkV6Part): boolean {\n return p.type === \"dynamic-tool\" || p.type.startsWith(\"dynamic-tool-\");\n}\n\nfunction partToToolCall(p: AiSdkV6Part): AssistantCloudRunReportToolCall {\n const toolSource: \"mcp\" | \"frontend\" = isDynamicToolPart(p)\n ? \"mcp\"\n : \"frontend\";\n return createRunTelemetryToolCall({\n toolName: p.toolName ?? p.type.slice(5),\n toolCallId: p.toolCallId!,\n args: p.args ?? p.input,\n result: p.result ?? p.output,\n toolSource,\n });\n}\n\nfunction collectAiSdkV6Parts(parts: readonly AiSdkV6Part[]): {\n textParts: string[];\n toolCalls: AssistantCloudRunReportToolCall[];\n stepsData: { tool_calls: AssistantCloudRunReportToolCall[] }[];\n} {\n const textParts: string[] = [];\n const toolCalls: AssistantCloudRunReportToolCall[] = [];\n const stepsData: { tool_calls: AssistantCloudRunReportToolCall[] }[] = [];\n let currentStepToolCalls: AssistantCloudRunReportToolCall[] | null = null;\n\n for (const p of parts) {\n if (p.type === \"step-start\") {\n if (currentStepToolCalls !== null) {\n stepsData.push({ tool_calls: currentStepToolCalls });\n }\n currentStepToolCalls = [];\n } else if (p.type === \"text\" && p.text) {\n textParts.push(p.text);\n } else if (isToolCallPart(p)) {\n const tc = partToToolCall(p);\n toolCalls.push(tc);\n if (currentStepToolCalls !== null) {\n currentStepToolCalls.push(tc);\n }\n }\n }\n\n if (currentStepToolCalls !== null) {\n stepsData.push({ tool_calls: currentStepToolCalls });\n }\n\n return { textParts, toolCalls, stepsData };\n}\n\nfunction extractModelId(\n metadata?: Record<string, unknown>,\n): string | undefined {\n if (!metadata) return undefined;\n if (typeof metadata.modelId === \"string\") return metadata.modelId;\n const custom = metadata.custom as Record<string, unknown> | undefined;\n if (typeof custom?.modelId === \"string\") return custom.modelId;\n return undefined;\n}\n\nfunction buildAiSdkV6Result(\n textParts: string[],\n toolCalls: AssistantCloudRunReportToolCall[],\n totalSteps: number,\n metadata?: Record<string, unknown>,\n stepsData?: { tool_calls: AssistantCloudRunReportToolCall[] }[],\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n },\n): TelemetryData {\n const hasText = textParts.length > 0;\n const outputText = hasText\n ? truncateRunTelemetryText(textParts.join(\"\"))\n : undefined;\n const modelId = extractModelId(metadata);\n\n const steps: TelemetryStepData[] | undefined =\n stepsData && stepsData.length > 1\n ? stepsData.map((s) => ({\n ...(s.tool_calls.length > 0\n ? { tool_calls: s.tool_calls }\n : undefined),\n }))\n : undefined;\n\n return {\n status: hasText ? \"completed\" : \"incomplete\",\n ...(toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(totalSteps > 0 ? { totalSteps } : undefined),\n ...(usage?.inputTokens != null\n ? { inputTokens: usage.inputTokens }\n : undefined),\n ...(usage?.outputTokens != null\n ? { outputTokens: usage.outputTokens }\n : undefined),\n ...(usage?.reasoningTokens != null\n ? { reasoningTokens: usage.reasoningTokens }\n : undefined),\n ...(usage?.cachedInputTokens != null\n ? { cachedInputTokens: usage.cachedInputTokens }\n : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(steps ? { steps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\nfunction extractAiSdkV6Usage(metadata?: Record<string, unknown>):\n | {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n }\n | undefined {\n // Try top-level metadata.usage\n const usage = metadata?.usage as RunTelemetryUsageInit | undefined;\n if (usage) {\n const normalized = normalizeRunTelemetryUsage(usage);\n if (normalized) return normalized;\n }\n\n // Try aggregating from metadata.steps[].usage\n const steps = metadata?.steps as\n | readonly { usage?: RunTelemetryUsageInit }[]\n | undefined;\n if (steps && steps.length > 0) {\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens = 0;\n let cachedInputTokens = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n let hasAny = false;\n for (const s of steps) {\n if (!s.usage) continue;\n const n = normalizeRunTelemetryUsage(s.usage);\n if (n) {\n if (n.inputTokens != null) {\n inputTokens += n.inputTokens;\n hasInput = true;\n }\n if (n.outputTokens != null) {\n outputTokens += n.outputTokens;\n hasOutput = true;\n }\n if (n.reasoningTokens != null) {\n reasoningTokens += n.reasoningTokens;\n hasReasoning = true;\n }\n if (n.cachedInputTokens != null) {\n cachedInputTokens += n.cachedInputTokens;\n hasCachedInput = true;\n }\n hasAny = true;\n }\n }\n if (hasAny) {\n return {\n ...(hasInput ? { inputTokens } : undefined),\n ...(hasOutput ? { outputTokens } : undefined),\n ...(hasReasoning ? { reasoningTokens } : undefined),\n ...(hasCachedInput ? { cachedInputTokens } : undefined),\n };\n }\n }\n\n return undefined;\n}\n\nfunction extractAiSdkV6<T>(content: T): TelemetryData | null {\n const msg = content as AiSdkV6Message;\n if (msg.role !== \"assistant\") return null;\n\n const { textParts, toolCalls, stepsData } = collectAiSdkV6Parts(\n msg.parts ?? [],\n );\n return buildAiSdkV6Result(\n textParts,\n toolCalls,\n stepsData.length,\n msg.metadata,\n stepsData,\n extractAiSdkV6Usage(msg.metadata),\n );\n}\n\nfunction aggregateAiSdkV6RunSteps<T>(stepMessages: T[]): TelemetryData | null {\n const allTextParts: string[] = [];\n const allToolCalls: AssistantCloudRunReportToolCall[] = [];\n const allStepsData: { tool_calls: AssistantCloudRunReportToolCall[] }[] = [];\n let hasAssistant = false;\n let metadata: Record<string, unknown> | undefined;\n let inputTokens = 0;\n let outputTokens = 0;\n let reasoningTokens = 0;\n let cachedInputTokens = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n\n for (const content of stepMessages) {\n const msg = content as AiSdkV6Message;\n if (msg.role !== \"assistant\") continue;\n hasAssistant = true;\n\n const { textParts, toolCalls, stepsData } = collectAiSdkV6Parts(\n msg.parts ?? [],\n );\n allTextParts.push(...textParts);\n allToolCalls.push(...toolCalls);\n allStepsData.push(...stepsData);\n if (msg.metadata) metadata = msg.metadata;\n\n const usage = extractAiSdkV6Usage(msg.metadata);\n if (usage) {\n if (usage.inputTokens != null) {\n inputTokens += usage.inputTokens;\n hasInput = true;\n }\n if (usage.outputTokens != null) {\n outputTokens += usage.outputTokens;\n hasOutput = true;\n }\n if (usage.reasoningTokens != null) {\n reasoningTokens += usage.reasoningTokens;\n hasReasoning = true;\n }\n if (usage.cachedInputTokens != null) {\n cachedInputTokens += usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n }\n\n if (!hasAssistant) return null;\n return buildAiSdkV6Result(\n allTextParts,\n allToolCalls,\n allStepsData.length,\n metadata,\n allStepsData,\n {\n ...(hasInput ? { inputTokens } : undefined),\n ...(hasOutput ? { outputTokens } : undefined),\n ...(hasReasoning ? { reasoningTokens } : undefined),\n ...(hasCachedInput ? { cachedInputTokens } : undefined),\n },\n );\n}\n\nexport function useAssistantCloudThreadHistoryAdapter(\n cloudRef: RefObject<AssistantCloud>,\n): ThreadHistoryAdapter {\n const aui = useAui();\n // Not useEffectEvent: history adapter methods run during render (SSR load).\n const auiRef = useRef(aui);\n useEffect(() => {\n auiRef.current = aui;\n });\n const [adapter] = useState(\n () =>\n new AssistantCloudThreadHistoryAdapter(cloudRef, () => auiRef.current),\n );\n return adapter;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AssistantCloudThreadHistoryAdapter.js","names":["RefObject","useEffect","useRef","useState","GenericThreadHistoryAdapter","ThreadHistoryAdapter","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","ExportedMessageRepositoryItem","ThreadMessage","AssistantCloud","AssistantCloudEvent","CloudEngagementReporter","CloudMessagePersistence","CloudRunReporter","createFormattedPersistence","createRunTelemetryToolCall","deriveRunOutcome","describeRunError","extractRunTelemetryModelId","normalizeRunTelemetryUsage","RunMessageTelemetry","RunReportOutcome","RunReportStepInit","RunTelemetryUsageInit","truncateRunTelemetryText","extractAISDKRunTelemetry","AISDKMessageLike","auiV0Decode","auiV0Encode","AssistantClient","getClientId","useAui","ThreadListItemMethods","FeedbackAdapter","CloudThreadListItem","Pick","globalPersistence","WeakMap","ClientId","AssistantCloudThreadHistoryAdapter","cloudRef","getAui","runReporter","engagementReporter","constructor","current","threadId","messageId","options","resolveEngagementEventIds","aui","getPersistence","threadListItem","key","has","set","get","_persistence","awaitThread","Promise","getThreadListItem","remoteThreadId","getState","remoteId","initialize","then","result","catch","undefined","remoteMessageId","getResolvedRemoteId","thread_id","message_id","feedback","submit","message","type","tryGetKeyedThreadListItem","console","warn","id","cloudMessageId","getRemoteId","threads","messages","error","live","source","listed","threadItems","some","item","currentState","find","withFormat","Record","formatAdapter","TMessage","TStorageFormat","adapter","pinCurrent","next","resolvePinned","getTargetFormatted","pin","append","pinned","Error","update","localMessageId","delete","reportTelemetry","items","durationMs","stepTimestamps","StepTimestamp","encodedRunMessages","map","encode","_reportRunTelemetry","format","mergeRunMessageInfo","extractLastRunMessageInfo","extractRunMessageInfo","load","parentId","encoded","telemetry","enabled","_maybeReportRun","isPersisted","filter","m","reverse","runMessages","T","messageInfo","RunMessageInfo","extracted","extractRunTelemetry","status","const","_sendReport","content","extractTelemetry","data","persistence","mergedSteps","mergeStepTimestamps","steps","report","outcome","outcomeType","errorCode","traceId","modelId","provider","usage","totalSteps","toolCalls","firstTokenMs","outputText","metadata","start_ms","end_ms","timestamps","startMs","endMs","len","Math","min","length","step","index","i","info","getId","stored","observed","_observedId","isRecord","role","custom","timing","firstTokenTime","Number","isFinite","round","finishReason","reason","failed","isError","runStatus","failure","value","extractAuiV0","msg","text","toolName","toolCallId","args","argsText","p","textParts","join","inputTokens","outputTokens","reasoningTokens","cachedInputTokens","totalInput","totalOutput","totalReasoning","totalCachedInput","hasInput","hasOutput","hasReasoning","hasCachedInput","telemetrySteps","useAssistantCloudThreadHistoryAdapter","auiRef","useAssistantCloudEngagementEvents","RootEngagementTracker","count","dispose","rootEngagementTrackers","useRootEngagementEvents","$","_c","t0","tracker","created","_temp","on","scope","event","payload","threadSwitched","active","t1","reporter","unsubscribers","messageEdited","chars","messageSent","attachments","suggestion","suggestionClicked","payload_0","attachmentAdded","contentType","payload_1","attachmentFailed","payload_2","runStopped","payload_3","runStarted","payload_4","runEnded","payload_5","payload_6","voiceStarted","payload_7","messageRegenerated","payload_8","branchSwitched","payload_9","messageCopied","payload_10","approved","toolApproved","toolRejected","payload_11","speechStarted","payload_12","errorShown","unsubscribe","t2","reportSuggestions","mainThreadId","isEmpty","suggestions","thread","suggestionsShown","subscribe","t3"],"sources":["../../../../src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts"],"sourcesContent":["import { type RefObject, useEffect, useRef, useState } from \"react\";\nimport type {\n GenericThreadHistoryAdapter,\n ThreadHistoryAdapter,\n MessageFormatAdapter,\n MessageFormatItem,\n MessageFormatRepository,\n} from \"../../../adapters/thread-history\";\nimport type { ExportedMessageRepositoryItem } from \"../../../runtime/utils/message-repository\";\nimport type { ThreadMessage } from \"../../../types\";\nimport {\n type AssistantCloud,\n type AssistantCloudEvent,\n CloudEngagementReporter,\n CloudMessagePersistence,\n CloudRunReporter,\n createFormattedPersistence,\n createRunTelemetryToolCall,\n deriveRunOutcome,\n describeRunError,\n extractRunTelemetryModelId,\n normalizeRunTelemetryUsage,\n type RunMessageTelemetry,\n type RunReportOutcome,\n type RunReportStepInit,\n type RunTelemetryUsageInit,\n truncateRunTelemetryText,\n} from \"assistant-cloud\";\nimport {\n extractAISDKRunTelemetry,\n type AISDKMessageLike,\n} from \"assistant-cloud/ai-sdk\";\nimport { auiV0Decode, auiV0Encode } from \"./auiV0\";\nimport { type AssistantClient, getClientId, useAui } from \"@assistant-ui/store\";\nimport type { ThreadListItemMethods } from \"../../../store/scopes/thread-list-item\";\nimport type { FeedbackAdapter } from \"../../../adapters/feedback\";\n\ntype CloudThreadListItem = Pick<\n ThreadListItemMethods,\n \"getState\" | \"initialize\"\n>;\n\nconst globalPersistence = new WeakMap<\n getClientId.ClientId,\n CloudMessagePersistence\n>();\n\nclass AssistantCloudThreadHistoryAdapter implements ThreadHistoryAdapter {\n private cloudRef: RefObject<AssistantCloud>;\n private getAui: () => AssistantClient;\n private runReporter: CloudRunReporter;\n public readonly engagementReporter: CloudEngagementReporter;\n\n constructor(\n cloudRef: RefObject<AssistantCloud>,\n getAui: () => AssistantClient,\n ) {\n this.cloudRef = cloudRef;\n this.getAui = getAui;\n this.runReporter = new CloudRunReporter(() => this.cloudRef.current);\n this.engagementReporter = new CloudEngagementReporter(\n () => this.cloudRef.current,\n (threadId, messageId, options) =>\n this.resolveEngagementEventIds(threadId, messageId, options),\n );\n }\n\n private get aui(): AssistantClient {\n return this.getAui();\n }\n\n private getPersistence(\n threadListItem: CloudThreadListItem = this.aui.threadListItem,\n ): CloudMessagePersistence {\n const key = getClientId(threadListItem);\n if (!globalPersistence.has(key)) {\n globalPersistence.set(\n key,\n new CloudMessagePersistence(() => this.cloudRef.current),\n );\n }\n return globalPersistence.get(key)!;\n }\n\n private get _persistence(): CloudMessagePersistence {\n return this.getPersistence();\n }\n\n /**\n * A send is the moment the runtime creates the remote thread, so that one\n * event waits for the id; every other event reads the id that already\n * exists, because initializing a thread nobody has written to would create\n * an empty remote thread just to attribute an event.\n */\n public async resolveEngagementEventIds(\n threadId: string,\n messageId?: string,\n options?: { awaitThread?: boolean },\n ): Promise<Pick<AssistantCloudEvent, \"thread_id\" | \"message_id\">> {\n const threadListItem = this.getThreadListItem(threadId);\n if (!threadListItem) return {};\n\n let remoteThreadId = threadListItem.getState().remoteId;\n if (!remoteThreadId && options?.awaitThread) {\n remoteThreadId = await threadListItem\n .initialize()\n .then((result) => result.remoteId)\n .catch(() => undefined);\n }\n const remoteMessageId = messageId\n ? this.getPersistence(threadListItem).getResolvedRemoteId(messageId)\n : undefined;\n return {\n ...(remoteThreadId ? { thread_id: remoteThreadId } : undefined),\n ...(remoteMessageId ? { message_id: remoteMessageId } : undefined),\n };\n }\n\n public readonly feedback: FeedbackAdapter = {\n submit: ({ message, type }) => {\n void (async () => {\n const threadListItem = this.tryGetKeyedThreadListItem();\n const remoteThreadId = threadListItem?.getState().remoteId;\n if (!threadListItem || !remoteThreadId) {\n console.warn(\n `[assistant-ui] Skipping feedback for message ${message.id}: the thread has no remote id.`,\n );\n return;\n }\n\n const cloudMessageId = await this.getPersistence(\n threadListItem,\n ).getRemoteId(message.id);\n if (!cloudMessageId) {\n console.warn(\n `[assistant-ui] Skipping feedback for message ${message.id}: no cloud message id is mapped.`,\n );\n return;\n }\n\n await this.cloudRef.current.threads.messages.feedback(\n remoteThreadId,\n cloudMessageId,\n { type },\n );\n })().catch((error: unknown) => {\n console.error(\n \"[assistant-ui] Cloud feedback submission failed:\",\n error,\n );\n });\n },\n };\n\n private tryGetKeyedThreadListItem(): CloudThreadListItem | undefined {\n const live = this.aui.threadListItem;\n if (!live.source) return undefined;\n const id = live.getState().id;\n if (id === undefined) return undefined;\n // A body can resolve before the list's committed items include its\n // thread; the live item is already the per-thread anchor in that window.\n const listed = this.aui.threads\n .getState()\n .threadItems.some((item) => item.id === id || item.remoteId === id);\n return listed ? this.aui.threads.item({ id }) : live;\n }\n\n private getThreadListItem(threadId: string): CloudThreadListItem | undefined {\n const current = this.aui.threadListItem;\n const currentState = current.getState();\n if (currentState.id === threadId || currentState.remoteId === threadId) {\n return current;\n }\n\n const listed = this.aui.threads\n .getState()\n .threadItems.find(\n (item) => item.id === threadId || item.remoteId === threadId,\n );\n return listed ? this.aui.threads.item({ id: listed.id }) : undefined;\n }\n\n withFormat<TMessage, TStorageFormat extends Record<string, unknown>>(\n formatAdapter: MessageFormatAdapter<TMessage, TStorageFormat>,\n ): GenericThreadHistoryAdapter<TMessage> {\n const adapter = this;\n let threadListItem: CloudThreadListItem | undefined;\n const pinCurrent = () => {\n const next = adapter.tryGetKeyedThreadListItem();\n if (next) threadListItem = next;\n return threadListItem;\n };\n const resolvePinned = () => threadListItem ?? pinCurrent();\n const getTargetFormatted = (item: CloudThreadListItem) =>\n createFormattedPersistence(adapter.getPersistence(item), formatAdapter);\n return {\n pin() {\n pinCurrent();\n },\n async append(item: MessageFormatItem<TMessage>) {\n const pinned = resolvePinned();\n if (!pinned) {\n throw new Error(\n \"Cannot persist cloud history without a thread list item.\",\n );\n }\n const remoteId =\n pinned.getState().remoteId ?? (await pinned.initialize()).remoteId;\n await getTargetFormatted(pinned).append(remoteId, item);\n },\n async update(item: MessageFormatItem<TMessage>, localMessageId: string) {\n const pinned = resolvePinned();\n const remoteId = pinned?.getState().remoteId;\n if (!remoteId || !pinned) return;\n await getTargetFormatted(pinned).update?.(\n remoteId,\n item,\n localMessageId,\n );\n },\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n },\n reportTelemetry(\n items: MessageFormatItem<TMessage>[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n message?: ThreadMessage;\n },\n ) {\n const encodedRunMessages = items.map((item) =>\n formatAdapter.encode(item),\n );\n adapter._reportRunTelemetry(\n formatAdapter.format,\n encodedRunMessages,\n options,\n resolvePinned(),\n mergeRunMessageInfo(\n extractLastRunMessageInfo(items, formatAdapter),\n options?.message\n ? extractRunMessageInfo(options.message, \"aui/v0\")\n : undefined,\n ),\n );\n },\n async load(): Promise<MessageFormatRepository<TMessage>> {\n // Loads re-pin and resolve through the pinned item, so the id mapping\n // they populate lives on the same persistence instance later writes\n // resolve, whichever of the list item or the live graft won the pin.\n const pinned = pinCurrent();\n const live = adapter.aui.threadListItem;\n const remoteId = live.source ? live.getState().remoteId : undefined;\n if (!remoteId) return { messages: [] };\n return getTargetFormatted(pinned ?? live).load(remoteId);\n },\n };\n }\n\n async append({ parentId, message }: ExportedMessageRepositoryItem) {\n const { remoteId } = await this.aui.threadListItem.initialize();\n const encoded = auiV0Encode(message);\n await this._persistence.append(\n remoteId,\n message.id,\n parentId,\n \"aui/v0\",\n encoded,\n );\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(\n remoteId,\n \"aui/v0\",\n encoded,\n extractRunMessageInfo(message, \"aui/v0\"),\n );\n }\n }\n\n async update(item: ExportedMessageRepositoryItem) {\n if (!this._persistence.isPersisted(item.message.id)) {\n return this.append(item);\n }\n const { message } = item;\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return;\n const encoded = auiV0Encode(message);\n await this._persistence.update(remoteId, message.id, \"aui/v0\", encoded);\n\n if (this.cloudRef.current.telemetry.enabled) {\n this._maybeReportRun(\n remoteId,\n \"aui/v0\",\n encoded,\n extractRunMessageInfo(message, \"aui/v0\"),\n );\n }\n }\n\n async delete() {\n throw new Error(\n \"Assistant Cloud does not support deleting thread messages yet.\",\n );\n }\n\n async load() {\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return { messages: [] };\n const messages = await this._persistence.load(remoteId, \"aui/v0\");\n return {\n messages: messages\n .filter(\n (m): m is typeof m & { format: \"aui/v0\" } => m.format === \"aui/v0\",\n )\n .map(auiV0Decode)\n .reverse(),\n };\n }\n\n private _reportRunTelemetry<T>(\n format: string,\n runMessages: T[],\n options?: {\n durationMs?: number;\n stepTimestamps?: StepTimestamp[];\n },\n threadListItem?: CloudThreadListItem,\n messageInfo?: RunMessageInfo,\n ) {\n const item = threadListItem ?? this.aui.threadListItem;\n const remoteId = item.getState().remoteId;\n if (!remoteId) return;\n\n const extracted =\n extractRunTelemetry(format, runMessages) ??\n (messageInfo?.status !== undefined\n ? { status: \"incomplete\" as const }\n : undefined);\n if (!extracted) return;\n\n this._sendReport(\n remoteId,\n extracted,\n options?.durationMs,\n options?.stepTimestamps,\n messageInfo,\n this.getPersistence(item),\n );\n }\n\n private _maybeReportRun<T>(\n remoteId: string,\n format: string,\n content: T,\n messageInfo?: RunMessageInfo,\n ) {\n const extracted = extractTelemetry(format, content);\n if (!extracted) return;\n\n this._sendReport(remoteId, extracted, undefined, undefined, messageInfo);\n }\n\n private _sendReport(\n remoteId: string,\n data: RunMessageTelemetry,\n durationMs?: number,\n stepTimestamps?: StepTimestamp[],\n messageInfo?: RunMessageInfo,\n persistence = this._persistence,\n ) {\n const mergedSteps = mergeStepTimestamps(data.steps, stepTimestamps);\n const messageId = messageInfo?.localMessageId\n ? persistence.getResolvedRemoteId(messageInfo.localMessageId)\n : undefined;\n void this.runReporter.report({\n threadId: remoteId,\n status: messageInfo?.status ?? data.status,\n outcome: messageInfo?.outcomeType,\n error: messageInfo?.error,\n errorCode: messageInfo?.errorCode,\n messageId,\n traceId: messageInfo?.traceId,\n modelId: data.modelId,\n provider: messageInfo?.provider,\n usage: data.usage,\n steps: mergedSteps,\n totalSteps: data.totalSteps,\n toolCalls: data.toolCalls,\n durationMs,\n firstTokenMs: messageInfo?.firstTokenMs,\n outputText: data.outputText,\n metadata: data.metadata,\n });\n }\n}\n\ntype StepTimestamp = { start_ms: number; end_ms: number };\n\nfunction mergeStepTimestamps(\n steps: RunReportStepInit[] | undefined,\n timestamps: StepTimestamp[] | undefined,\n): RunReportStepInit[] | undefined {\n if (!timestamps) return steps;\n if (!steps) {\n return timestamps.map(({ start_ms, end_ms }) => ({\n startMs: start_ms,\n endMs: end_ms,\n }));\n }\n\n const len = Math.min(steps.length, timestamps.length);\n return steps.map((step, index) => ({\n ...step,\n ...(index < len\n ? {\n startMs: timestamps[index]!.start_ms,\n endMs: timestamps[index]!.end_ms,\n }\n : undefined),\n }));\n}\n\ntype RunMessageInfo = {\n localMessageId?: string;\n status?: \"completed\" | \"incomplete\" | \"error\";\n outcomeType?: RunReportOutcome;\n error?: string;\n errorCode?: string;\n firstTokenMs?: number;\n traceId?: string;\n provider?: string;\n};\n\nfunction extractLastRunMessageInfo<\n TMessage,\n TStorageFormat extends Record<string, unknown>,\n>(\n items: MessageFormatItem<TMessage>[],\n formatAdapter: MessageFormatAdapter<TMessage, TStorageFormat>,\n): RunMessageInfo | undefined {\n for (let i = items.length - 1; i >= 0; i--) {\n const item = items[i]!;\n const info = extractRunMessageInfo(\n item.message,\n formatAdapter.format,\n formatAdapter.getId(item.message),\n );\n if (info) return info;\n }\n return undefined;\n}\n\nfunction mergeRunMessageInfo(\n stored: RunMessageInfo | undefined,\n observed: RunMessageInfo | undefined,\n): RunMessageInfo | undefined {\n if (!observed) return stored;\n const { localMessageId: _observedId, ...outcome } = observed;\n return { ...stored, ...outcome };\n}\n\nfunction extractRunMessageInfo(\n message: unknown,\n format: string,\n localMessageId?: string,\n): RunMessageInfo | undefined {\n if (!isRecord(message) || message.role !== \"assistant\") return undefined;\n\n const status = isRecord(message.status) ? message.status : undefined;\n const metadata = isRecord(message.metadata) ? message.metadata : undefined;\n const custom = isRecord(metadata?.custom) ? metadata.custom : undefined;\n const timing = isRecord(metadata?.timing) ? metadata.timing : undefined;\n const firstTokenTime = timing?.firstTokenTime;\n const firstTokenMs =\n typeof firstTokenTime === \"number\" && Number.isFinite(firstTokenTime)\n ? Math.round(firstTokenTime)\n : undefined;\n const finishReason =\n status?.type === \"incomplete\"\n ? typeof status.reason === \"string\"\n ? status.reason\n : undefined\n : typeof metadata?.finishReason === \"string\"\n ? metadata.finishReason\n : undefined;\n const failed = status?.type === \"incomplete\" && status.reason === \"error\";\n const outcome = deriveRunOutcome({ finishReason, isError: failed });\n const outcomeType = outcome.outcome;\n const runStatus =\n outcome.status === \"error\"\n ? \"error\"\n : status?.type === \"incomplete\"\n ? \"incomplete\"\n : finishReason !== undefined\n ? outcome.status\n : undefined;\n const failure = failed ? describeRunError(status.error) : {};\n const messageId =\n localMessageId ?? (typeof message.id === \"string\" ? message.id : undefined);\n const traceId =\n format === \"aui/v0\"\n ? custom?.traceId\n : format === \"ai-sdk/v6\"\n ? metadata?.traceId\n : undefined;\n const provider =\n typeof custom?.provider === \"string\"\n ? custom.provider\n : typeof metadata?.provider === \"string\"\n ? metadata.provider\n : undefined;\n\n return {\n ...(messageId ? { localMessageId: messageId } : undefined),\n ...(runStatus !== undefined ? { status: runStatus } : undefined),\n ...(outcomeType ? { outcomeType } : undefined),\n ...failure,\n ...(firstTokenMs != null && firstTokenMs >= 0\n ? { firstTokenMs }\n : undefined),\n ...(typeof traceId === \"string\" ? { traceId } : undefined),\n ...(provider !== undefined ? { provider } : undefined),\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\";\n}\n\nfunction extractTelemetry<T>(\n format: string,\n content: T,\n): RunMessageTelemetry | null {\n switch (format) {\n case \"aui/v0\":\n return extractAuiV0(content);\n case \"ai-sdk/v6\":\n return extractAISDKRunTelemetry([content as AISDKMessageLike]);\n default:\n return null;\n }\n}\n\nfunction extractRunTelemetry<T>(\n format: string,\n runMessages: T[],\n): RunMessageTelemetry | null {\n if (format === \"ai-sdk/v6\") {\n return extractAISDKRunTelemetry(runMessages as AISDKMessageLike[]);\n }\n for (let i = runMessages.length - 1; i >= 0; i--) {\n const result = extractTelemetry(format, runMessages[i]!);\n if (result) return result;\n }\n return null;\n}\n\nexport function extractAuiV0<T>(content: T): RunMessageTelemetry | null {\n const msg = content as {\n role?: string;\n status?: { type: string; reason?: string };\n content?: readonly {\n type: string;\n text?: string;\n toolName?: string;\n toolCallId?: string;\n args?: unknown;\n argsText?: string;\n result?: unknown;\n }[];\n metadata?: {\n modelId?: string;\n steps?: readonly { usage?: RunTelemetryUsageInit }[];\n custom?: Record<string, unknown> & { modelId?: string };\n };\n };\n\n if (msg.role !== \"assistant\") return null;\n // A paused (requires-action) write is not a finished run; reporting it would\n // mislabel it \"completed\" and double-count steps once the terminal write reports.\n if (msg.status?.type === \"requires-action\") return null;\n\n const toolCalls = msg.content\n ?.filter((p) => p.type === \"tool-call\" && p.toolName && p.toolCallId)\n .map((p) =>\n createRunTelemetryToolCall({\n toolName: p.toolName!,\n toolCallId: p.toolCallId!,\n args: p.args,\n result: p.result,\n argsText: p.argsText,\n }),\n );\n\n const textParts = msg.content?.filter((p) => p.type === \"text\" && p.text);\n const outputText =\n textParts && textParts.length > 0\n ? truncateRunTelemetryText(textParts.map((p) => p.text).join(\"\"))\n : undefined;\n\n const steps = msg.metadata?.steps;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let reasoningTokens: number | undefined;\n let cachedInputTokens: number | undefined;\n if (steps && steps.length > 0) {\n let totalInput = 0;\n let totalOutput = 0;\n let totalReasoning = 0;\n let totalCachedInput = 0;\n let hasInput = false;\n let hasOutput = false;\n let hasReasoning = false;\n let hasCachedInput = false;\n for (const step of steps) {\n if (!step.usage) continue;\n const usage = normalizeRunTelemetryUsage(step.usage);\n if (!usage) continue;\n if (usage.inputTokens != null) {\n totalInput += usage.inputTokens;\n hasInput = true;\n }\n if (usage.outputTokens != null) {\n totalOutput += usage.outputTokens;\n hasOutput = true;\n }\n if (usage.reasoningTokens != null) {\n totalReasoning += usage.reasoningTokens;\n hasReasoning = true;\n }\n if (usage.cachedInputTokens != null) {\n totalCachedInput += usage.cachedInputTokens;\n hasCachedInput = true;\n }\n }\n inputTokens = hasInput ? totalInput : undefined;\n outputTokens = hasOutput ? totalOutput : undefined;\n reasoningTokens = hasReasoning ? totalReasoning : undefined;\n cachedInputTokens = hasCachedInput ? totalCachedInput : undefined;\n }\n\n const status = msg.status?.type === \"incomplete\" ? \"incomplete\" : \"completed\";\n\n const metadata = msg.metadata?.custom as Record<string, unknown> | undefined;\n const modelId = extractRunTelemetryModelId(\n msg.metadata as Record<string, unknown> | undefined,\n );\n\n const telemetrySteps: RunReportStepInit[] | undefined =\n steps && steps.length > 0\n ? steps.map((step) => (step.usage ? { usage: step.usage } : {}))\n : undefined;\n\n return {\n status,\n ...(toolCalls && toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(steps?.length ? { totalSteps: steps.length } : undefined),\n ...(inputTokens != null ||\n outputTokens != null ||\n reasoningTokens != null ||\n cachedInputTokens != null\n ? {\n usage: {\n ...(inputTokens != null ? { inputTokens } : undefined),\n ...(outputTokens != null ? { outputTokens } : undefined),\n ...(reasoningTokens != null ? { reasoningTokens } : undefined),\n ...(cachedInputTokens != null ? { cachedInputTokens } : undefined),\n },\n }\n : undefined),\n ...(outputText != null ? { outputText } : undefined),\n ...(metadata ? { metadata } : undefined),\n ...(telemetrySteps ? { steps: telemetrySteps } : undefined),\n ...(modelId ? { modelId } : undefined),\n };\n}\n\nexport function useAssistantCloudThreadHistoryAdapter(\n cloudRef: RefObject<AssistantCloud>,\n): ThreadHistoryAdapter & { readonly feedback: FeedbackAdapter } {\n const aui = useAui();\n // Not useEffectEvent: history adapter methods run during render (SSR load).\n const auiRef = useRef(aui);\n useEffect(() => {\n auiRef.current = aui;\n });\n const [adapter] = useState(\n () =>\n new AssistantCloudThreadHistoryAdapter(cloudRef, () => auiRef.current),\n );\n useAssistantCloudEngagementEvents(adapter, aui);\n return adapter;\n}\n\ntype RootEngagementTracker = {\n count: number;\n engagementReporter: CloudEngagementReporter;\n dispose: () => void;\n};\n\nconst rootEngagementTrackers = new WeakMap<\n AssistantClient,\n RootEngagementTracker\n>();\n\n/**\n * Thread switches are a thread list event, so one subscription per assistant\n * client reports them; every thread runtime mounted under it shares the\n * subscription and the last one to unmount removes it.\n */\nconst useRootEngagementEvents = (\n adapter: AssistantCloudThreadHistoryAdapter,\n aui: AssistantClient,\n) => {\n useEffect(() => {\n let tracker = rootEngagementTrackers.get(aui);\n if (!tracker) {\n const created: RootEngagementTracker = {\n count: 0,\n engagementReporter: adapter.engagementReporter,\n dispose: () => {},\n };\n created.dispose = aui.on(\n { scope: \"*\", event: \"threads.selectionChanged\" },\n (payload) => {\n created.engagementReporter.threadSwitched(payload.threadId);\n },\n );\n rootEngagementTrackers.set(aui, created);\n tracker = created;\n }\n const active = tracker;\n active.engagementReporter = adapter.engagementReporter;\n active.count += 1;\n return () => {\n active.count -= 1;\n if (active.count === 0) {\n active.dispose();\n rootEngagementTrackers.delete(aui);\n }\n };\n }, [adapter, aui]);\n};\n\nconst useAssistantCloudEngagementEvents = (\n adapter: AssistantCloudThreadHistoryAdapter,\n aui: AssistantClient,\n) => {\n useRootEngagementEvents(adapter, aui);\n\n useEffect(() => {\n const reporter = adapter.engagementReporter;\n\n const unsubscribers = [\n aui.on({ scope: \"thread\", event: \"composer.send\" }, (payload) => {\n if (payload.messageId) {\n reporter.messageEdited(payload.threadId, {\n messageId: payload.messageId,\n chars: payload.chars,\n });\n } else {\n reporter.messageSent(payload.threadId, {\n chars: payload.chars,\n attachments: payload.attachments,\n });\n }\n if (payload.suggestion) {\n reporter.suggestionClicked(payload.threadId);\n }\n }),\n aui.on(\n { scope: \"thread\", event: \"composer.attachmentAdd\" },\n (payload) => {\n reporter.attachmentAdded(payload.threadId, {\n messageId: payload.messageId,\n contentType: payload.contentType,\n });\n },\n ),\n aui.on(\n { scope: \"thread\", event: \"composer.attachmentAddError\" },\n (payload) => {\n reporter.attachmentFailed(payload.threadId, {\n messageId: payload.messageId,\n contentType: payload.contentType,\n });\n },\n ),\n aui.on({ scope: \"thread\", event: \"composer.cancel\" }, (payload) => {\n reporter.runStopped(payload.threadId);\n }),\n aui.on({ scope: \"thread\", event: \"thread.runStart\" }, (payload) => {\n reporter.runStarted(payload.threadId);\n }),\n aui.on({ scope: \"thread\", event: \"thread.runEnd\" }, (payload) => {\n reporter.runEnded(payload.threadId);\n }),\n aui.on({ scope: \"thread\", event: \"thread.cancelRun\" }, (payload) => {\n reporter.runStopped(payload.threadId);\n }),\n aui.on({ scope: \"thread\", event: \"thread.voiceStarted\" }, (payload) => {\n reporter.voiceStarted(payload.threadId);\n }),\n aui.on({ scope: \"thread\", event: \"message.reload\" }, (payload) => {\n reporter.messageRegenerated(payload.threadId, payload.messageId);\n }),\n aui.on(\n { scope: \"thread\", event: \"message.branchSwitched\" },\n (payload) => {\n reporter.branchSwitched(payload.threadId, payload.messageId);\n },\n ),\n aui.on({ scope: \"thread\", event: \"message.copied\" }, (payload) => {\n reporter.messageCopied(payload.threadId, payload.messageId);\n }),\n aui.on(\n { scope: \"thread\", event: \"thread.toolApprovalAnswered\" },\n (payload) => {\n if (payload.approved) {\n reporter.toolApproved(\n payload.threadId,\n payload.messageId,\n payload.toolCallId,\n payload.toolName,\n );\n } else {\n reporter.toolRejected(\n payload.threadId,\n payload.messageId,\n payload.toolCallId,\n payload.toolName,\n );\n }\n },\n ),\n aui.on({ scope: \"thread\", event: \"message.speak\" }, (payload) => {\n reporter.speechStarted(payload.threadId, payload.messageId);\n }),\n aui.on({ scope: \"thread\", event: \"message.error\" }, (payload) => {\n reporter.errorShown(payload.threadId, {\n messageId: payload.messageId,\n reason: payload.reason,\n });\n }),\n ];\n\n return () => {\n for (const unsubscribe of unsubscribers) unsubscribe();\n };\n }, [adapter, aui]);\n\n useEffect(() => {\n const reportSuggestions = () => {\n const { mainThreadId } = aui.threads.getState();\n if (aui.threadListItem.getState().id !== mainThreadId) return;\n const { isEmpty, suggestions } = aui.thread.getState();\n if (!isEmpty || suggestions.length === 0) return;\n adapter.engagementReporter.suggestionsShown(\n mainThreadId,\n suggestions.length,\n );\n };\n\n reportSuggestions();\n return aui.subscribe(reportSuggestions);\n }, [adapter, aui]);\n};\n"],"mappings":";;;;;;;AA0CA,MAAMsC,oCAAoB,IAAIC,QAG5B;AAEF,IAAME,qCAAN,MAAyE;CACvE;CACA;CACA;CACA;CAEAK,YACEJ,UACAC,QACA;EACA,KAAKD,WAAWA;EAChB,KAAKC,SAASA;EACd,KAAKC,cAAc,IAAI7B,uBAAuB,KAAK2B,SAASK,OAAO;EACnE,KAAKF,qBAAqB,IAAIhC,8BACtB,KAAK6B,SAASK,UACnBC,UAAUC,WAAWC,YACpB,KAAKC,0BAA0BH,UAAUC,WAAWC,OAAO,CAC/D;CACF;CAEA,IAAYE,MAAuB;EACjC,OAAO,KAAKT,OAAO;CACrB;CAEA,eACEW,iBAAsC,KAAKF,IAAIE,gBACtB;EACzB,MAAMC,MAAMvB,YAAYsB,cAAc;EACtC,IAAI,CAAChB,kBAAkBkB,IAAID,GAAG,GAC5BjB,kBAAkBmB,IAChBF,KACA,IAAIzC,8BAA8B,KAAK4B,SAASK,OAAO,CACzD;EAEF,OAAOT,kBAAkBoB,IAAIH,GAAG;CAClC;CAEA,IAAYI,eAAwC;EAClD,OAAO,KAAKN,eAAe;CAC7B;;;;;;;CAQA,MAAaF,0BACXH,UACAC,WACAC,SACgE;EAChE,MAAMI,iBAAiB,KAAKQ,kBAAkBd,QAAQ;EACtD,IAAI,CAACM,gBAAgB,OAAO,CAAC;EAE7B,IAAIS,iBAAiBT,eAAeU,SAAS,CAAC,CAACC;EAC/C,IAAI,CAACF,kBAAkBb,SAASU,aAC9BG,iBAAiB,MAAMT,eACpBY,WAAW,CAAC,CACZC,MAAMC,WAAWA,OAAOH,QAAQ,CAAC,CACjCI,YAAYC,KAAAA,CAAS;EAE1B,MAAMC,kBAAkBtB,YACpB,KAAKI,eAAeC,cAAc,CAAC,CAACkB,oBAAoBvB,SAAS,IACjEqB,KAAAA;EACJ,OAAO;GACL,GAAIP,iBAAiB,EAAEU,WAAWV,eAAe,IAAIO,KAAAA;GACrD,GAAIC,kBAAkB,EAAEG,YAAYH,gBAAgB,IAAID,KAAAA;EAC1D;CACF;CAEA,WAA4C,EAC1CM,SAAS,EAAEC,SAASC,WAAW;EAC7B,CAAM,YAAY;GAChB,MAAMxB,iBAAiB,KAAKyB,0BAA0B;GACtD,MAAMhB,iBAAiBT,gBAAgBU,SAAS,CAAC,CAACC;GAClD,IAAI,CAACX,kBAAkB,CAACS,gBAAgB;IACtCiB,QAAQC,KACN,gDAAgDJ,QAAQK,GAAE,+BAC5D;IACA;GACF;GAEA,MAAMC,iBAAiB,MAAM,KAAK9B,eAChCC,cACF,CAAC,CAAC8B,YAAYP,QAAQK,EAAE;GACxB,IAAI,CAACC,gBAAgB;IACnBH,QAAQC,KACN,gDAAgDJ,QAAQK,GAAE,iCAC5D;IACA;GACF;GAEA,MAAM,KAAKxC,SAASK,QAAQsC,QAAQC,SAASX,SAC3CZ,gBACAoB,gBACA,EAAEL,KAAK,CACT;EACF,EAAA,CAAG,CAAC,CAACT,OAAOkB,UAAmB;GAC7BP,QAAQO,MACN,oDACAA,KACF;EACF,CAAC;CACH,EACF;CAEA,4BAAqE;EACnE,MAAMC,OAAO,KAAKpC,IAAIE;EACtB,IAAI,CAACkC,KAAKC,QAAQ,OAAOnB,KAAAA;EACzB,MAAMY,KAAKM,KAAKxB,SAAS,CAAC,CAACkB;EAC3B,IAAIA,OAAOZ,KAAAA,GAAW,OAAOA,KAAAA;EAM7B,OAHe,KAAKlB,IAAIiC,QACrBrB,SAAS,CAAC,CACV2B,YAAYC,MAAMC,SAASA,KAAKX,OAAOA,MAAMW,KAAK5B,aAAaiB,EAC3DQ,IAAS,KAAKtC,IAAIiC,QAAQQ,KAAK,EAAEX,GAAG,CAAC,IAAIM;CAClD;CAEA,kBAA0BxC,UAAmD;EAC3E,MAAMD,UAAU,KAAKK,IAAIE;EACzB,MAAMwC,eAAe/C,QAAQiB,SAAS;EACtC,IAAI8B,aAAaZ,OAAOlC,YAAY8C,aAAa7B,aAAajB,UAC5D,OAAOD;EAGT,MAAM2C,SAAS,KAAKtC,IAAIiC,QACrBrB,SAAS,CAAC,CACV2B,YAAYI,MACVF,SAASA,KAAKX,OAAOlC,YAAY6C,KAAK5B,aAAajB,QACtD;EACF,OAAO0C,SAAS,KAAKtC,IAAIiC,QAAQQ,KAAK,EAAEX,IAAIQ,OAAOR,GAAG,CAAC,IAAIZ,KAAAA;CAC7D;CAEA0B,WACEE,eACuC;EACvC,MAAMG,UAAU;EAChB,IAAI/C;EACJ,MAAMgD,mBAAmB;GACvB,MAAMC,OAAOF,QAAQtB,0BAA0B;GAC/C,IAAIwB,MAAMjD,iBAAiBiD;GAC3B,OAAOjD;EACT;EACA,MAAMkD,sBAAsBlD,kBAAkBgD,WAAW;EACzD,MAAMG,sBAAsBZ,SAC1B7E,2BAA2BqF,QAAQhD,eAAewC,IAAI,GAAGK,aAAa;EACxE,OAAO;GACLQ,MAAM;IACJJ,WAAW;GACb;GACA,MAAMK,OAAOd,MAAmC;IAC9C,MAAMe,SAASJ,cAAc;IAC7B,IAAI,CAACI,QACH,MAAM,IAAIC,MACR,0DACF;IAEF,MAAM5C,WACJ2C,OAAO5C,SAAS,CAAC,CAACC,aAAa,MAAM2C,OAAO1C,WAAW,EAAA,CAAGD;IAC5D,MAAMwC,mBAAmBG,MAAM,CAAC,CAACD,OAAO1C,UAAU4B,IAAI;GACxD;GACA,MAAMiB,OAAOjB,MAAmCkB,gBAAwB;IACtE,MAAMH,SAASJ,cAAc;IAC7B,MAAMvC,WAAW2C,QAAQ5C,SAAS,CAAC,CAACC;IACpC,IAAI,CAACA,YAAY,CAAC2C,QAAQ;IAC1B,MAAMH,mBAAmBG,MAAM,CAAC,CAACE,SAC/B7C,UACA4B,MACAkB,cACF;GACF;GACA,MAAMC,SAAS;IACb,MAAM,IAAIH,MACR,gEACF;GACF;GACAI,gBACEC,OACAhE,SAKA;IACA,MAAMoE,qBAAqBJ,MAAMK,KAAK1B,SACpCK,cAAcsB,OAAO3B,IAAI,CAC3B;IACAQ,QAAQoB,oBACNvB,cAAcwB,QACdJ,oBACApE,SACAsD,cAAc,GACdmB,oBACEC,0BAA0BV,OAAOhB,aAAa,GAC9ChD,SAAS2B,UACLgD,sBAAsB3E,QAAQ2B,SAAS,QAAQ,IAC/CP,KAAAA,CACN,CACF;GACF;GACA,MAAMwD,OAAmD;IAIvD,MAAMlB,SAASN,WAAW;IAC1B,MAAMd,OAAOa,QAAQjD,IAAIE;IACzB,MAAMW,WAAWuB,KAAKC,SAASD,KAAKxB,SAAS,CAAC,CAACC,WAAWK,KAAAA;IAC1D,IAAI,CAACL,UAAU,OAAO,EAAEqB,UAAU,CAAA,EAAG;IACrC,OAAOmB,mBAAmBG,UAAUpB,IAAI,CAAC,CAACsC,KAAK7D,QAAQ;GACzD;EACF;CACF;CAEA,MAAM0C,OAAO,EAAEoB,UAAUlD,WAA0C;EACjE,MAAM,EAAEZ,aAAa,MAAM,KAAKb,IAAIE,eAAeY,WAAW;EAC9D,MAAM8D,UAAUlG,YAAY+C,OAAO;EACnC,MAAM,KAAKlB,aAAagD,OACtB1C,UACAY,QAAQK,IACR6C,UACA,UACAC,OACF;EAEA,IAAI,KAAKtF,SAASK,QAAQkF,UAAUC,SAClC,KAAKC,gBACHlE,UACA,UACA+D,SACAH,sBAAsBhD,SAAS,QAAQ,CACzC;CAEJ;CAEA,MAAMiC,OAAOjB,MAAqC;EAChD,IAAI,CAAC,KAAKlC,aAAayE,YAAYvC,KAAKhB,QAAQK,EAAE,GAChD,OAAO,KAAKyB,OAAOd,IAAI;EAEzB,MAAM,EAAEhB,YAAYgB;EACpB,MAAM5B,WAAW,KAAKb,IAAIE,eAAeU,SAAS,CAAC,CAACC;EACpD,IAAI,CAACA,UAAU;EACf,MAAM+D,UAAUlG,YAAY+C,OAAO;EACnC,MAAM,KAAKlB,aAAamD,OAAO7C,UAAUY,QAAQK,IAAI,UAAU8C,OAAO;EAEtE,IAAI,KAAKtF,SAASK,QAAQkF,UAAUC,SAClC,KAAKC,gBACHlE,UACA,UACA+D,SACAH,sBAAsBhD,SAAS,QAAQ,CACzC;CAEJ;CAEA,MAAMmC,SAAS;EACb,MAAM,IAAIH,MACR,gEACF;CACF;CAEA,MAAMiB,OAAO;EACX,MAAM7D,WAAW,KAAKb,IAAIE,eAAeU,SAAS,CAAC,CAACC;EACpD,IAAI,CAACA,UAAU,OAAO,EAAEqB,UAAU,CAAA,EAAG;EAErC,OAAO,EACLA,WAAUA,MAFW,KAAK3B,aAAamE,KAAK7D,UAAU,QAAQ,EAAA,CAG3DoE,QACEC,MAA4CA,EAAEZ,WAAW,QAC5D,CAAC,CACAH,IAAI1F,WAAW,CAAC,CAChB0G,QAAQ,EACb;CACF;CAEA,oBACEb,QACAc,aACAtF,SAIAI,gBACAoF,aACA;EACA,MAAM7C,OAAOvC,kBAAkB,KAAKF,IAAIE;EACxC,MAAMW,WAAW4B,KAAK7B,SAAS,CAAC,CAACC;EACjC,IAAI,CAACA,UAAU;EAEf,MAAM2E,YACJC,oBAAoBnB,QAAQc,WAAW,MACtCE,aAAaI,WAAWxE,KAAAA,IACrB,EAAEwE,QAAQ,aAAsB,IAChCxE,KAAAA;EACN,IAAI,CAACsE,WAAW;EAEhB,KAAKI,YACH/E,UACA2E,WACA1F,SAASiE,YACTjE,SAASkE,gBACTsB,aACA,KAAKrF,eAAewC,IAAI,CAC1B;CACF;CAEA,gBACE5B,UACAyD,QACAuB,SACAP,aACA;EACA,MAAME,YAAYM,iBAAiBxB,QAAQuB,OAAO;EAClD,IAAI,CAACL,WAAW;EAEhB,KAAKI,YAAY/E,UAAU2E,WAAWtE,KAAAA,GAAWA,KAAAA,GAAWoE,WAAW;CACzE;CAEA,YACEzE,UACAkF,MACAhC,YACAC,gBACAsB,aACAU,cAAc,KAAKzF,cACnB;EACA,MAAM0F,cAAcC,oBAAoBH,KAAKI,OAAOnC,cAAc;EAClE,MAAMnE,YAAYyF,aAAa3B,iBAC3BqC,YAAY5E,oBAAoBkE,YAAY3B,cAAc,IAC1DzC,KAAAA;EACJ,KAAU1B,YAAY4G,OAAO;GAC3BxG,UAAUiB;GACV6E,QAAQJ,aAAaI,UAAUK,KAAKL;GACpCW,SAASf,aAAagB;GACtBnE,OAAOmD,aAAanD;GACpBoE,WAAWjB,aAAaiB;GACxB1G;GACA2G,SAASlB,aAAakB;GACtBC,SAASV,KAAKU;GACdC,UAAUpB,aAAaoB;GACvBC,OAAOZ,KAAKY;GACZR,OAAOF;GACPW,YAAYb,KAAKa;GACjBC,WAAWd,KAAKc;GAChB9C;GACA+C,cAAcxB,aAAawB;GAC3BC,YAAYhB,KAAKgB;GACjBC,UAAUjB,KAAKiB;EACjB,CAAC;CACH;AACF;AAIA,SAASd,oBACPC,OACAgB,YACiC;CACjC,IAAI,CAACA,YAAY,OAAOhB;CACxB,IAAI,CAACA,OACH,OAAOgB,WAAWhD,KAAK,EAAE8C,UAAUC,cAAc;EAC/CE,SAASH;EACTI,OAAOH;CACT,EAAE;CAGJ,MAAMI,MAAMC,KAAKC,IAAIrB,MAAMsB,QAAQN,WAAWM,MAAM;CACpD,OAAOtB,MAAMhC,KAAKuD,MAAMC,WAAW;EACjC,GAAGD;EACH,GAAIC,QAAQL,MACR;GACEF,SAASD,WAAWQ,MAAM,CAAEV;GAC5BI,OAAOF,WAAWQ,MAAM,CAAET;EAC5B,IACAhG,KAAAA;CACN,EAAE;AACJ;AAaA,SAASsD,0BAIPV,OACAhB,eAC4B;CAC5B,KAAK,IAAI8E,IAAI9D,MAAM2D,SAAS,GAAGG,KAAK,GAAGA,KAAK;EAC1C,MAAMnF,OAAOqB,MAAM8D;EACnB,MAAMC,OAAOpD,sBACXhC,KAAKhB,SACLqB,cAAcwB,QACdxB,cAAcgF,MAAMrF,KAAKhB,OAAO,CAClC;EACA,IAAIoG,MAAM,OAAOA;CACnB;AAEF;AAEA,SAAStD,oBACPwD,QACAC,UAC4B;CAC5B,IAAI,CAACA,UAAU,OAAOD;CACtB,MAAM,EAAEpE,gBAAgBsE,aAAa,GAAG5B,YAAY2B;CACpD,OAAO;EAAE,GAAGD;EAAQ,GAAG1B;CAAQ;AACjC;AAEA,SAAS5B,sBACPhD,SACA6C,QACAX,gBAC4B;CAC5B,IAAI,CAACuE,SAASzG,OAAO,KAAKA,QAAQ0G,SAAS,aAAa,OAAOjH,KAAAA;CAE/D,MAAMwE,SAASwC,SAASzG,QAAQiE,MAAM,IAAIjE,QAAQiE,SAASxE,KAAAA;CAC3D,MAAM8F,WAAWkB,SAASzG,QAAQuF,QAAQ,IAAIvF,QAAQuF,WAAW9F,KAAAA;CACjE,MAAMkH,SAASF,SAASlB,UAAUoB,MAAM,IAAIpB,SAASoB,SAASlH,KAAAA;CAE9D,MAAMoH,kBADSJ,SAASlB,UAAUqB,MAAM,IAAIrB,SAASqB,SAASnH,KAAAA,EAAAA,EAC/BoH;CAC/B,MAAMxB,eACJ,OAAOwB,mBAAmB,YAAYC,OAAOC,SAASF,cAAc,IAChEf,KAAKkB,MAAMH,cAAc,IACzBpH,KAAAA;CACN,MAAMwH,eACJhD,QAAQhE,SAAS,eACb,OAAOgE,OAAOiD,WAAW,WACvBjD,OAAOiD,SACPzH,KAAAA,IACF,OAAO8F,UAAU0B,iBAAiB,WAChC1B,SAAS0B,eACTxH,KAAAA;CACR,MAAM0H,SAASlD,QAAQhE,SAAS,gBAAgBgE,OAAOiD,WAAW;CAClE,MAAMtC,UAAUvI,iBAAiB;EAAE4K;EAAcG,SAASD;CAAO,CAAC;CAClE,MAAMtC,cAAcD,QAAQA;CAC5B,MAAMyC,YACJzC,QAAQX,WAAW,UACf,UACAA,QAAQhE,SAAS,eACf,eACAgH,iBAAiBxH,KAAAA,IACfmF,QAAQX,SACRxE,KAAAA;CACV,MAAM6H,UAAUH,SAAS7K,iBAAiB2H,OAAOvD,KAAK,IAAI,CAAC;CAC3D,MAAMtC,YACJ8D,mBAAmB,OAAOlC,QAAQK,OAAO,WAAWL,QAAQK,KAAKZ,KAAAA;CACnE,MAAMsF,UACJlC,WAAW,WACP8D,QAAQ5B,UACRlC,WAAW,cACT0C,UAAUR,UACVtF,KAAAA;CACR,MAAMwF,WACJ,OAAO0B,QAAQ1B,aAAa,WACxB0B,OAAO1B,WACP,OAAOM,UAAUN,aAAa,WAC5BM,SAASN,WACTxF,KAAAA;CAER,OAAO;EACL,GAAIrB,YAAY,EAAE8D,gBAAgB9D,UAAU,IAAIqB,KAAAA;EAChD,GAAI4H,cAAc5H,KAAAA,IAAY,EAAEwE,QAAQoD,UAAU,IAAI5H,KAAAA;EACtD,GAAIoF,cAAc,EAAEA,YAAY,IAAIpF,KAAAA;EACpC,GAAG6H;EACH,GAAIjC,gBAAgB,QAAQA,gBAAgB,IACxC,EAAEA,aAAa,IACf5F,KAAAA;EACJ,GAAI,OAAOsF,YAAY,WAAW,EAAEA,QAAQ,IAAItF,KAAAA;EAChD,GAAIwF,aAAaxF,KAAAA,IAAY,EAAEwF,SAAS,IAAIxF,KAAAA;CAC9C;AACF;AAEA,SAASgH,SAASc,OAAkD;CAClE,OAAOA,UAAU,QAAQ,OAAOA,UAAU;AAC5C;AAEA,SAASlD,iBACPxB,QACAuB,SAC4B;CAC5B,QAAQvB,QAAR;EACE,KAAK,UACH,OAAO2E,aAAapD,OAAO;EAC7B,KAAK,aACH,OAAOtH,yBAAyB,CAACsH,OAA2B,CAAC;EAC/D,SACE,OAAO;CACX;AACF;AAEA,SAASJ,oBACPnB,QACAc,aAC4B;CAC5B,IAAId,WAAW,aACb,OAAO/F,yBAAyB6G,WAAiC;CAEnE,KAAK,IAAIwC,IAAIxC,YAAYqC,SAAS,GAAGG,KAAK,GAAGA,KAAK;EAChD,MAAM5G,SAAS8E,iBAAiBxB,QAAQc,YAAYwC,EAAG;EACvD,IAAI5G,QAAQ,OAAOA;CACrB;CACA,OAAO;AACT;AAEA,SAAgBiI,aAAgBpD,SAAwC;CACtE,MAAMqD,MAAMrD;CAmBZ,IAAIqD,IAAIf,SAAS,aAAa,OAAO;CAGrC,IAAIe,IAAIxD,QAAQhE,SAAS,mBAAmB,OAAO;CAEnD,MAAMmF,YAAYqC,IAAIrD,SAClBZ,QAAQuE,MAAMA,EAAE9H,SAAS,eAAe8H,EAAEJ,YAAYI,EAAEH,UAAU,CAAC,CACpElF,KAAKqF,MACJ3L,2BAA2B;EACzBuL,UAAUI,EAAEJ;EACZC,YAAYG,EAAEH;EACdC,MAAME,EAAEF;EACRtI,QAAQwI,EAAExI;EACVuI,UAAUC,EAAED;CACd,CAAC,CACH;CAEF,MAAME,YAAYP,IAAIrD,SAASZ,QAAQuE,MAAMA,EAAE9H,SAAS,UAAU8H,EAAEL,IAAI;CACxE,MAAMpC,aACJ0C,aAAaA,UAAUhC,SAAS,IAC5BnJ,yBAAyBmL,UAAUtF,KAAKqF,MAAMA,EAAEL,IAAI,CAAC,CAACO,KAAK,EAAE,CAAC,IAC9DxI,KAAAA;CAEN,MAAMiF,QAAQ+C,IAAIlC,UAAUb;CAC5B,IAAIwD;CACJ,IAAIC;CACJ,IAAIC;CACJ,IAAIC;CACJ,IAAI3D,SAASA,MAAMsB,SAAS,GAAG;EAC7B,IAAIsC,aAAa;EACjB,IAAIC,cAAc;EAClB,IAAIC,iBAAiB;EACrB,IAAIC,mBAAmB;EACvB,IAAIC,WAAW;EACf,IAAIC,YAAY;EAChB,IAAIC,eAAe;EACnB,IAAIC,iBAAiB;EACrB,KAAK,MAAM5C,QAAQvB,OAAO;GACxB,IAAI,CAACuB,KAAKf,OAAO;GACjB,MAAMA,QAAQ1I,2BAA2ByJ,KAAKf,KAAK;GACnD,IAAI,CAACA,OAAO;GACZ,IAAIA,MAAMgD,eAAe,MAAM;IAC7BI,cAAcpD,MAAMgD;IACpBQ,WAAW;GACb;GACA,IAAIxD,MAAMiD,gBAAgB,MAAM;IAC9BI,eAAerD,MAAMiD;IACrBQ,YAAY;GACd;GACA,IAAIzD,MAAMkD,mBAAmB,MAAM;IACjCI,kBAAkBtD,MAAMkD;IACxBQ,eAAe;GACjB;GACA,IAAI1D,MAAMmD,qBAAqB,MAAM;IACnCI,oBAAoBvD,MAAMmD;IAC1BQ,iBAAiB;GACnB;EACF;EACAX,cAAcQ,WAAWJ,aAAa7I,KAAAA;EACtC0I,eAAeQ,YAAYJ,cAAc9I,KAAAA;EACzC2I,kBAAkBQ,eAAeJ,iBAAiB/I,KAAAA;EAClD4I,oBAAoBQ,iBAAiBJ,mBAAmBhJ,KAAAA;CAC1D;CAEA,MAAMwE,SAASwD,IAAIxD,QAAQhE,SAAS,eAAe,eAAe;CAElE,MAAMsF,WAAWkC,IAAIlC,UAAUoB;CAC/B,MAAM3B,UAAUzI,2BACdkL,IAAIlC,QACN;CAEA,MAAMuD,iBACJpE,SAASA,MAAMsB,SAAS,IACpBtB,MAAMhC,KAAKuD,SAAUA,KAAKf,QAAQ,EAAEA,OAAOe,KAAKf,MAAM,IAAI,CAAC,CAAE,IAC7DzF,KAAAA;CAEN,OAAO;EACLwE;EACA,GAAImB,aAAaA,UAAUY,SAAS,IAAI,EAAEZ,UAAU,IAAI3F,KAAAA;EACxD,GAAIiF,OAAOsB,SAAS,EAAEb,YAAYT,MAAMsB,OAAO,IAAIvG,KAAAA;EACnD,GAAIyI,eAAe,QACnBC,gBAAgB,QAChBC,mBAAmB,QACnBC,qBAAqB,OACjB,EACEnD,OAAO;GACL,GAAIgD,eAAe,OAAO,EAAEA,YAAY,IAAIzI,KAAAA;GAC5C,GAAI0I,gBAAgB,OAAO,EAAEA,aAAa,IAAI1I,KAAAA;GAC9C,GAAI2I,mBAAmB,OAAO,EAAEA,gBAAgB,IAAI3I,KAAAA;GACpD,GAAI4I,qBAAqB,OAAO,EAAEA,kBAAkB,IAAI5I,KAAAA;EAC1D,EACF,IACAA,KAAAA;EACJ,GAAI6F,cAAc,OAAO,EAAEA,WAAW,IAAI7F,KAAAA;EAC1C,GAAI8F,WAAW,EAAEA,SAAS,IAAI9F,KAAAA;EAC9B,GAAIqJ,iBAAiB,EAAEpE,OAAOoE,eAAe,IAAIrJ,KAAAA;EACjD,GAAIuF,UAAU,EAAEA,QAAQ,IAAIvF,KAAAA;CAC9B;AACF;AAEA,SAAgBsJ,sCACdlL,UAC+D;CAC/D,MAAMU,MAAMnB,OAAO;CAEnB,MAAM4L,SAAS3N,OAAOkD,GAAG;CACzBnD,gBAAgB;EACd4N,OAAO9K,UAAUK;CACnB,CAAC;CACD,MAAM,CAACiD,WAAWlG,eAEd,IAAIsC,mCAAmCC,gBAAgBmL,OAAO9K,OAAO,CACzE;CACA+K,kCAAkCzH,SAASjD,GAAG;CAC9C,OAAOiD;AACT;AAQA,MAAM6H,yCAAyB,IAAI3L,QAGjC;;;;;;AAOF,MAAM4L,2BAA0B9H,SAAAjD,QAAA;CAAA,MAAAgL,IAAAC,EAAA,CAAA;CAAA,IAAAC;CAAA,IAAAF,EAAA,OAAA/H,QAAAxD,sBAAAuL,EAAA,OAAAhL,KAAA;EAIpBkL,WAAA;GACR,IAAAC,UAAcL,uBAAsBxK,IAAKN,GAAG;GAC5C,IAAI,CAACmL,SAAO;IACV,MAAAC,UAAuC;KAAAR,OAC9B;KAACnL,oBACYwD,QAAOxD;KAAmBoL,SACrCQ;IACX;IACAD,QAAOP,UAAW7K,IAAGsL,GACnB;KAAAC,OAAS;KAAGC,OAAS;IAA2B,IAChDC,YAAA;KACEL,QAAO3L,mBAAmBiM,eAAgBD,QAAO7L,QAAS;IAAC,CAE/D;IACAkL,uBAAsBzK,IAAKL,KAAKoL,OAAO;IACvCD,UAAUC;GAAH;GAET,MAAAO,SAAeR;GACfQ,OAAMlM,qBAAsBwD,QAAOxD;GACnCkM,OAAMf,QAANe,OAAMf,QAAU;GAAJ,aACL;IACLe,OAAMf,QAANe,OAAMf,QAAU;IAChB,IAAIe,OAAMf,UAAW,GAAC;KACpBe,OAAMd,QAAS;KACfC,uBAAsBlH,OAAQ5D,GAAG;IAAC;GACnC;EACF;EACFgL,EAAA,KAAA/H,QAAAxD;EAAAuL,EAAA,KAAAhL;EAAAgL,EAAA,KAAAE;CAAA,OAAAA,KAAAF,EAAA;CAAA,IAAAY;CAAA,IAAAZ,EAAA,OAAA/H,WAAA+H,EAAA,OAAAhL,KAAA;EAAE4L,KAAA,CAAC3I,SAASjD,GAAG;EAACgL,EAAA,KAAA/H;EAAA+H,EAAA,KAAAhL;EAAAgL,EAAA,KAAAY;CAAA,OAAAA,KAAAZ,EAAA;CA3BjBnO,UAAUqO,IA2BPU,EAAc;AAAC;AAGpB,MAAMlB,qCAAoCzH,SAAAjD,QAAA;CAAA,MAAAgL,IAAAC,EAAA,EAAA;CAIxCF,wBAAwB9H,SAASjD,GAAG;CAAC,IAAAkL;CAAA,IAAAF,EAAA,OAAA/H,QAAAxD,sBAAAuL,EAAA,OAAAhL,KAAA;EAE3BkL,WAAA;GACR,MAAAW,WAAiB5I,QAAOxD;GAExB,MAAAqM,gBAAsB;IACpB9L,IAAGsL,GAAI;KAAAC,OAAS;KAAQC,OAAS;IAAgB,IAAGC,YAAA;KAClD,IAAIA,QAAO5L,WACTgM,SAAQE,cAAeN,QAAO7L,UAAW;MAAAC,WAC5B4L,QAAO5L;MAAUmM,OACrBP,QAAOO;KAChB,CAAC;UAEDH,SAAQI,YAAaR,QAAO7L,UAAW;MAAAoM,OAC9BP,QAAOO;MAAME,aACPT,QAAOS;KACtB,CAAC;KAEH,IAAIT,QAAOU,YACTN,SAAQO,kBAAmBX,QAAO7L,QAAS;IAC5C,CACF;IACDI,IAAGsL,GACD;KAAAC,OAAS;KAAQC,OAAS;IAAyB,IACnDa,cAAA;KACER,SAAQS,gBAAiBb,UAAO7L,UAAW;MAAAC,WAC9B4L,UAAO5L;MAAU0M,aACfd,UAAOc;KACtB,CAAC;IAAC,CAEN;IACAvM,IAAGsL,GACD;KAAAC,OAAS;KAAQC,OAAS;IAA8B,IACxDgB,cAAA;KACEX,SAAQY,iBAAkBhB,UAAO7L,UAAW;MAAAC,WAC/B4L,UAAO5L;MAAU0M,aACfd,UAAOc;KACtB,CAAC;IAAC,CAEN;IACAvM,IAAGsL,GAAI;KAAAC,OAAS;KAAQC,OAAS;IAAkB,IAAGkB,cAAA;KACpDb,SAAQc,WAAYlB,UAAO7L,QAAS;IAAC,CACtC;IACDI,IAAGsL,GAAI;KAAAC,OAAS;KAAQC,OAAS;IAAkB,IAAGoB,cAAA;KACpDf,SAAQgB,WAAYpB,UAAO7L,QAAS;IAAC,CACtC;IACDI,IAAGsL,GAAI;KAAAC,OAAS;KAAQC,OAAS;IAAgB,IAAGsB,cAAA;KAClDjB,SAAQkB,SAAUtB,UAAO7L,QAAS;IAAC,CACpC;IACDI,IAAGsL,GAAI;KAAAC,OAAS;KAAQC,OAAS;IAAmB,IAAGwB,cAAA;KACrDnB,SAAQc,WAAYlB,UAAO7L,QAAS;IAAC,CACtC;IACDI,IAAGsL,GAAI;KAAAC,OAAS;KAAQC,OAAS;IAAsB,IAAGyB,cAAA;KACxDpB,SAAQqB,aAAczB,UAAO7L,QAAS;IAAC,CACxC;IACDI,IAAGsL,GAAI;KAAAC,OAAS;KAAQC,OAAS;IAAiB,IAAG2B,cAAA;KACnDtB,SAAQuB,mBAAoB3B,UAAO7L,UAAW6L,UAAO5L,SAAU;IAAC,CACjE;IACDG,IAAGsL,GACD;KAAAC,OAAS;KAAQC,OAAS;IAAyB,IACnD6B,cAAA;KACExB,SAAQyB,eAAgB7B,UAAO7L,UAAW6L,UAAO5L,SAAU;IAAC,CAEhE;IACAG,IAAGsL,GAAI;KAAAC,OAAS;KAAQC,OAAS;IAAiB,IAAG+B,cAAA;KACnD1B,SAAQ2B,cAAe/B,UAAO7L,UAAW6L,UAAO5L,SAAU;IAAC,CAC5D;IACDG,IAAGsL,GACD;KAAAC,OAAS;KAAQC,OAAS;IAA8B,IACxDiC,eAAA;KACE,IAAIhC,WAAOiC,UACT7B,SAAQ8B,aACNlC,WAAO7L,UACP6L,WAAO5L,WACP4L,WAAOpC,YACPoC,WAAOrC,QACT;UAEAyC,SAAQ+B,aACNnC,WAAO7L,UACP6L,WAAO5L,WACP4L,WAAOpC,YACPoC,WAAOrC,QACT;IACD,CAEL;IACApJ,IAAGsL,GAAI;KAAAC,OAAS;KAAQC,OAAS;IAAgB,IAAGqC,eAAA;KAClDhC,SAAQiC,cAAerC,WAAO7L,UAAW6L,WAAO5L,SAAU;IAAC,CAC5D;IACDG,IAAGsL,GAAI;KAAAC,OAAS;KAAQC,OAAS;IAAgB,IAAGuC,eAAA;KAClDlC,SAAQmC,WAAYvC,WAAO7L,UAAW;MAAAC,WACzB4L,WAAO5L;MAAU8I,QACpB8C,WAAO9C;KACjB,CAAC;IAAC,CACH;GAAC;GACF,aAEK;IACL,KAAK,MAAAsF,eAAqBnC,eAAemC,YAAY;GAAE;EACxD;EACFjD,EAAA,KAAA/H,QAAAxD;EAAAuL,EAAA,KAAAhL;EAAAgL,EAAA,KAAAE;CAAA,OAAAA,KAAAF,EAAA;CAAA,IAAAY;CAAA,IAAAZ,EAAA,OAAA/H,WAAA+H,EAAA,OAAAhL,KAAA;EAAE4L,KAAA,CAAC3I,SAASjD,GAAG;EAACgL,EAAA,KAAA/H;EAAA+H,EAAA,KAAAhL;EAAAgL,EAAA,KAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAnGjBnO,UAAUqO,IAmGPU,EAAc;CAAC,IAAAsC;CAAA,IAAAlD,EAAA,OAAA/H,QAAAxD,sBAAAuL,EAAA,OAAAhL,KAAA;EAERkO,WAAA;GACR,MAAAC,0BAA0B;IACxB,MAAA,EAAAC,iBAAyBpO,IAAGiC,QAAQrB,SAAU;IAC9C,IAAIZ,IAAGE,eAAeU,SAAU,CAAC,CAAAkB,OAAQsM,cAAY;IACrD,MAAA,EAAAC,SAAAC,gBAAiCtO,IAAGuO,OAAO3N,SAAU;IACrD,IAAI,CAACyN,WAAWC,YAAW7G,WAAY,GAAC;IACxCxE,QAAOxD,mBAAmB+O,iBACxBJ,cACAE,YAAW7G,MACb;GAAC;GAGH0G,kBAAkB;GAAC,OACZnO,IAAGyO,UAAWN,iBAAiB;EAAC;EACxCnD,EAAA,KAAA/H,QAAAxD;EAAAuL,EAAA,KAAAhL;EAAAgL,EAAA,KAAAkD;CAAA,OAAAA,KAAAlD,EAAA;CAAA,IAAA0D;CAAA,IAAA1D,EAAA,OAAA/H,WAAA+H,EAAA,QAAAhL,KAAA;EAAE0O,KAAA,CAACzL,SAASjD,GAAG;EAACgL,EAAA,KAAA/H;EAAA+H,EAAA,MAAAhL;EAAAgL,EAAA,MAAA0D;CAAA,OAAAA,KAAA1D,EAAA;CAdjBnO,UAAUqR,IAcPQ,EAAc;AAAC;AA3JY,SAAArD,QAAA,CAAA"}
|
|
@@ -8,6 +8,7 @@ declare class CloudFileAttachmentAdapter implements AttachmentAdapter {
|
|
|
8
8
|
constructor(cloud: AssistantCloud);
|
|
9
9
|
constructor(getCloud: () => AssistantCloud);
|
|
10
10
|
private uploadedUrls;
|
|
11
|
+
private activeUploads;
|
|
11
12
|
add({ file }: {
|
|
12
13
|
file: File;
|
|
13
14
|
}): AsyncGenerator<PendingAttachment, void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CloudFileAttachmentAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts"],"mappings":";;;;cAkBa,sCAAsC;EAC1C;UAEC;EAEI,YAAA,OAAO;EACP,YAAA,gBAAgB;UAKpB;
|
|
1
|
+
{"version":3,"file":"CloudFileAttachmentAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts"],"mappings":";;;;cAkBa,sCAAsC;EAC1C;UAEC;EAEI,YAAA,OAAO;EACP,YAAA,gBAAgB;UAKpB;UACA;EAKM,MACZ;IAEA,MAAM;MACJ,eAAe;EAmEN,OAAO,YAAY,aAAa;EAUhC,KACX,YAAY,oBACX,QAAQ"}
|
|
@@ -12,6 +12,7 @@ var CloudFileAttachmentAdapter = class {
|
|
|
12
12
|
this.getCloud = typeof cloud === "function" ? cloud : () => cloud;
|
|
13
13
|
}
|
|
14
14
|
uploadedUrls = /* @__PURE__ */ new Map();
|
|
15
|
+
activeUploads = /* @__PURE__ */ new Map();
|
|
15
16
|
async *add({ file }) {
|
|
16
17
|
const id = generateId();
|
|
17
18
|
let attachment = {
|
|
@@ -26,15 +27,25 @@ var CloudFileAttachmentAdapter = class {
|
|
|
26
27
|
progress: 0
|
|
27
28
|
}
|
|
28
29
|
};
|
|
29
|
-
|
|
30
|
+
const controller = new AbortController();
|
|
31
|
+
const upload = {
|
|
32
|
+
cancelled: false,
|
|
33
|
+
controller
|
|
34
|
+
};
|
|
35
|
+
this.activeUploads.set(id, upload);
|
|
30
36
|
try {
|
|
37
|
+
yield attachment;
|
|
38
|
+
if (upload.cancelled) return;
|
|
31
39
|
const { signedUrl, publicUrl } = await this.getCloud().files.generatePresignedUploadUrl({ filename: file.name });
|
|
40
|
+
if (upload.cancelled) return;
|
|
32
41
|
const res = await fetch(signedUrl, {
|
|
33
42
|
method: "PUT",
|
|
34
43
|
body: file,
|
|
35
44
|
headers: { "Content-Type": file.type },
|
|
36
|
-
mode: "cors"
|
|
45
|
+
mode: "cors",
|
|
46
|
+
signal: controller.signal
|
|
37
47
|
});
|
|
48
|
+
if (upload.cancelled) return;
|
|
38
49
|
if (!res.ok) throw new Error(`Failed to upload file: ${res.status} ${res.statusText}`);
|
|
39
50
|
this.uploadedUrls.set(id, publicUrl);
|
|
40
51
|
attachment = {
|
|
@@ -46,6 +57,7 @@ var CloudFileAttachmentAdapter = class {
|
|
|
46
57
|
};
|
|
47
58
|
yield attachment;
|
|
48
59
|
} catch (error) {
|
|
60
|
+
if (upload.cancelled) return;
|
|
49
61
|
console.error("[assistant-ui] Failed to upload attachment:", error);
|
|
50
62
|
attachment = {
|
|
51
63
|
...attachment,
|
|
@@ -56,9 +68,17 @@ var CloudFileAttachmentAdapter = class {
|
|
|
56
68
|
}
|
|
57
69
|
};
|
|
58
70
|
yield attachment;
|
|
71
|
+
} finally {
|
|
72
|
+
if (this.activeUploads.get(id) === upload) this.activeUploads.delete(id);
|
|
59
73
|
}
|
|
60
74
|
}
|
|
61
75
|
async remove(attachment) {
|
|
76
|
+
const upload = this.activeUploads.get(attachment.id);
|
|
77
|
+
if (upload) {
|
|
78
|
+
upload.cancelled = true;
|
|
79
|
+
upload.controller.abort();
|
|
80
|
+
this.activeUploads.delete(attachment.id);
|
|
81
|
+
}
|
|
62
82
|
this.uploadedUrls.delete(attachment.id);
|
|
63
83
|
}
|
|
64
84
|
async send(attachment) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CloudFileAttachmentAdapter.js","names":["AssistantCloud","Attachment","PendingAttachment","CompleteAttachment","ThreadUserMessagePart","AttachmentAdapter","generateId","guessAttachmentType","contentType","startsWith","CloudFileAttachmentAdapter","accept","getCloud","constructor","cloud","uploadedUrls","Map","add","file","File","AsyncGenerator","id","type","attachment","name","status","reason","progress","signedUrl","publicUrl","files","generatePresignedUploadUrl","filename","res","fetch","method","body","headers","mode","ok","Error","statusText","
|
|
1
|
+
{"version":3,"file":"CloudFileAttachmentAdapter.js","names":["AssistantCloud","Attachment","PendingAttachment","CompleteAttachment","ThreadUserMessagePart","AttachmentAdapter","generateId","guessAttachmentType","contentType","startsWith","CloudFileAttachmentAdapter","accept","getCloud","constructor","cloud","uploadedUrls","Map","activeUploads","cancelled","controller","AbortController","add","file","File","AsyncGenerator","id","type","attachment","name","status","reason","progress","upload","set","signedUrl","publicUrl","files","generatePresignedUploadUrl","filename","res","fetch","method","body","headers","mode","signal","ok","Error","statusText","error","console","message","String","get","delete","remove","Promise","abort","send","url","content","image","data","mimeType"],"sources":["../../../../src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts"],"sourcesContent":["import type { AssistantCloud } from \"assistant-cloud\";\nimport type {\n Attachment,\n PendingAttachment,\n CompleteAttachment,\n} from \"../../../types/attachment\";\nimport type { ThreadUserMessagePart } from \"../../../types/message\";\nimport type { AttachmentAdapter } from \"../../../adapters/attachment\";\nimport { generateId } from \"../../../utils/id\";\n\nconst guessAttachmentType = (\n contentType: string,\n): \"image\" | \"document\" | \"file\" => {\n if (contentType.startsWith(\"image/\")) return \"image\";\n if (contentType.startsWith(\"text/\")) return \"document\";\n return \"file\";\n};\n\nexport class CloudFileAttachmentAdapter implements AttachmentAdapter {\n public accept = \"*\";\n\n private getCloud: () => AssistantCloud;\n\n constructor(cloud: AssistantCloud);\n constructor(getCloud: () => AssistantCloud);\n constructor(cloud: AssistantCloud | (() => AssistantCloud)) {\n this.getCloud = typeof cloud === \"function\" ? cloud : () => cloud;\n }\n\n private uploadedUrls = new Map<string, string>();\n private activeUploads = new Map<\n string,\n { cancelled: boolean; controller: AbortController }\n >();\n\n public async *add({\n file,\n }: {\n file: File;\n }): AsyncGenerator<PendingAttachment, void> {\n const id = generateId();\n const type = guessAttachmentType(file.type);\n let attachment: PendingAttachment = {\n id,\n type,\n name: file.name,\n contentType: file.type,\n file,\n status: { type: \"running\", reason: \"uploading\", progress: 0 },\n };\n const controller = new AbortController();\n const upload = { cancelled: false, controller };\n this.activeUploads.set(id, upload);\n\n try {\n yield attachment;\n if (upload.cancelled) return;\n\n const { signedUrl, publicUrl } =\n await this.getCloud().files.generatePresignedUploadUrl({\n filename: file.name,\n });\n if (upload.cancelled) return;\n\n const res = await fetch(signedUrl, {\n method: \"PUT\",\n body: file,\n headers: {\n \"Content-Type\": file.type,\n },\n mode: \"cors\",\n signal: controller.signal,\n });\n if (upload.cancelled) return;\n\n if (!res.ok) {\n throw new Error(\n `Failed to upload file: ${res.status} ${res.statusText}`,\n );\n }\n this.uploadedUrls.set(id, publicUrl);\n attachment = {\n ...attachment,\n status: { type: \"requires-action\", reason: \"composer-send\" },\n };\n yield attachment;\n } catch (error) {\n if (upload.cancelled) return;\n\n console.error(\"[assistant-ui] Failed to upload attachment:\", error);\n attachment = {\n ...attachment,\n status: {\n type: \"incomplete\",\n reason: \"error\",\n message: error instanceof Error ? error.message : String(error),\n },\n };\n yield attachment;\n } finally {\n if (this.activeUploads.get(id) === upload) {\n this.activeUploads.delete(id);\n }\n }\n }\n\n public async remove(attachment: Attachment): Promise<void> {\n const upload = this.activeUploads.get(attachment.id);\n if (upload) {\n upload.cancelled = true;\n upload.controller.abort();\n this.activeUploads.delete(attachment.id);\n }\n this.uploadedUrls.delete(attachment.id);\n }\n\n public async send(\n attachment: PendingAttachment,\n ): Promise<CompleteAttachment> {\n const url = this.uploadedUrls.get(attachment.id);\n if (!url) throw new Error(\"Attachment not uploaded\");\n this.uploadedUrls.delete(attachment.id);\n\n let content: ThreadUserMessagePart[];\n if (attachment.type === \"image\") {\n content = [{ type: \"image\", image: url, filename: attachment.name }];\n } else {\n content = [\n {\n type: \"file\",\n data: url,\n mimeType: attachment.contentType ?? \"\",\n filename: attachment.name,\n },\n ];\n }\n\n return {\n ...attachment,\n status: { type: \"complete\" },\n content,\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MessageStatus, SourceProviderMetadata, ThreadMessage, ToolApprovalDisplay, ToolApprovalOption } from "../../../types/message.js";
|
|
1
|
+
import { MessageStatus, ReasoningMessagePart, SourceProviderMetadata, ThreadMessage, ToolApprovalDisplay, ToolApprovalOption, ToolCallMessagePartMcpMetadata, ToolCallTiming } from "../../../types/message.js";
|
|
2
2
|
import { CompleteAttachment } from "../../../types/attachment.js";
|
|
3
3
|
import { ExportedMessageRepositoryItem } from "../../../runtime/utils/message-repository.js";
|
|
4
4
|
import { ReadonlyJSONObject, ReadonlyJSONValue } from "assistant-stream/utils";
|
|
@@ -20,10 +20,13 @@ type AuiV0ToolApproval = {
|
|
|
20
20
|
type AuiV0MessagePart = {
|
|
21
21
|
readonly type: "text";
|
|
22
22
|
readonly text: string;
|
|
23
|
+
readonly parentId?: string;
|
|
23
24
|
} | {
|
|
24
25
|
readonly type: "reasoning";
|
|
25
26
|
readonly text: string;
|
|
26
27
|
readonly unstable_summary?: string;
|
|
28
|
+
readonly providerMetadata?: NonNullable<ReasoningMessagePart["providerMetadata"]>;
|
|
29
|
+
readonly parentId?: string;
|
|
27
30
|
} | {
|
|
28
31
|
readonly type: "source";
|
|
29
32
|
readonly sourceType: "url";
|
|
@@ -31,6 +34,7 @@ type AuiV0MessagePart = {
|
|
|
31
34
|
readonly url: string;
|
|
32
35
|
readonly title?: string;
|
|
33
36
|
readonly providerMetadata?: SourceProviderMetadata;
|
|
37
|
+
readonly parentId?: string;
|
|
34
38
|
} | {
|
|
35
39
|
readonly type: "source";
|
|
36
40
|
readonly sourceType: "document";
|
|
@@ -39,23 +43,12 @@ type AuiV0MessagePart = {
|
|
|
39
43
|
readonly mediaType: string;
|
|
40
44
|
readonly filename?: string;
|
|
41
45
|
readonly providerMetadata?: SourceProviderMetadata;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
readonly toolCallId: string;
|
|
45
|
-
readonly toolName: string;
|
|
46
|
+
readonly parentId?: string;
|
|
47
|
+
} | (AuiV0ToolCallPart & ({
|
|
46
48
|
readonly args: ReadonlyJSONObject;
|
|
47
|
-
readonly result?: ReadonlyJSONValue;
|
|
48
|
-
readonly isError?: true;
|
|
49
|
-
readonly approval?: AuiV0ToolApproval;
|
|
50
49
|
} | {
|
|
51
|
-
readonly type: "tool-call";
|
|
52
|
-
readonly toolCallId: string;
|
|
53
|
-
readonly toolName: string;
|
|
54
50
|
readonly argsText: string;
|
|
55
|
-
|
|
56
|
-
readonly isError?: true;
|
|
57
|
-
readonly approval?: AuiV0ToolApproval;
|
|
58
|
-
} | {
|
|
51
|
+
})) | {
|
|
59
52
|
readonly type: "image";
|
|
60
53
|
readonly image: string;
|
|
61
54
|
} | {
|
|
@@ -64,14 +57,43 @@ type AuiV0MessagePart = {
|
|
|
64
57
|
readonly mimeType: string;
|
|
65
58
|
readonly filename?: string;
|
|
66
59
|
readonly sourceType?: "url" | "id";
|
|
60
|
+
readonly parentId?: string;
|
|
67
61
|
} | {
|
|
68
62
|
readonly type: "data";
|
|
69
63
|
readonly name: string;
|
|
70
64
|
readonly data: ReadonlyJSONValue;
|
|
65
|
+
} | {
|
|
66
|
+
readonly type: "audio";
|
|
67
|
+
readonly audio: {
|
|
68
|
+
readonly data: string;
|
|
69
|
+
readonly format: "mp3" | "wav";
|
|
70
|
+
};
|
|
71
|
+
} | {
|
|
72
|
+
readonly type: "generative-ui";
|
|
73
|
+
readonly spec: ReadonlyJSONObject;
|
|
74
|
+
readonly id?: string;
|
|
75
|
+
readonly parentId?: string;
|
|
76
|
+
};
|
|
77
|
+
type AuiV0ToolCallPart = {
|
|
78
|
+
readonly type: "tool-call";
|
|
79
|
+
readonly toolCallId: string;
|
|
80
|
+
readonly toolName: string;
|
|
81
|
+
readonly result?: ReadonlyJSONValue;
|
|
82
|
+
readonly isError?: true;
|
|
83
|
+
readonly interrupt?: {
|
|
84
|
+
readonly type: "human";
|
|
85
|
+
readonly payload: ReadonlyJSONValue;
|
|
86
|
+
};
|
|
87
|
+
readonly timing?: ToolCallTiming;
|
|
88
|
+
readonly mcp?: ToolCallMessagePartMcpMetadata;
|
|
89
|
+
readonly approval?: AuiV0ToolApproval;
|
|
90
|
+
readonly parentId?: string;
|
|
91
|
+
readonly messages?: readonly AuiV0Message[];
|
|
71
92
|
};
|
|
72
93
|
type AuiV0AttachmentPart = {
|
|
73
94
|
readonly type: "text";
|
|
74
95
|
readonly text: string;
|
|
96
|
+
readonly parentId?: string;
|
|
75
97
|
} | {
|
|
76
98
|
readonly type: "image";
|
|
77
99
|
readonly image: string;
|
|
@@ -82,6 +104,7 @@ type AuiV0AttachmentPart = {
|
|
|
82
104
|
readonly mimeType: string;
|
|
83
105
|
readonly filename?: string;
|
|
84
106
|
readonly sourceType?: "url" | "id";
|
|
107
|
+
readonly parentId?: string;
|
|
85
108
|
} | {
|
|
86
109
|
readonly type: "audio";
|
|
87
110
|
readonly audio: {
|
|
@@ -102,6 +125,8 @@ type AuiV0Attachment = {
|
|
|
102
125
|
readonly content: readonly AuiV0AttachmentPart[];
|
|
103
126
|
};
|
|
104
127
|
type AuiV0Message = {
|
|
128
|
+
readonly id?: string;
|
|
129
|
+
readonly createdAt?: string;
|
|
105
130
|
readonly role: "assistant" | "user" | "system";
|
|
106
131
|
readonly status?: MessageStatus;
|
|
107
132
|
readonly content: readonly AuiV0MessagePart[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auiV0.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/auiV0.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"auiV0.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/auiV0.ts"],"mappings":";;;;;;KAuBK;WACM;WACA;WACA,UAAU;WACV;WACA;WACA;WACA;WACA,mBAAmB;WACnB;WACA;WACA;;KAGN;WAEU;WACA;WACA;;WAGA;WACA;WACA;WACA,mBAAmB,YAC1B;WAEO;;WAGA;WACA;WACA;WACA;WACA;WACA,mBAAmB;WACnB;;WAGA;WACA;WACA;WACA;WACA;WACA;WACA,mBAAmB;WACnB;KAEV;WACa,MAAM;;WAAkC;;WAE3C;WACA;;WAGA;WACA;WACA;WACA;WACA;WACA;;WAGA;WACA;WACA,MAAM;;WAGN;WACA;aACE;aACA;;;WAIF;WACA,MAAM;WACN;WACA;;KAGV;WACM;WACA;WACA;WACA,SAAS;WACT;WACA;aACE;aACA,SAAS;;WAEX,SAAS;WACT,MAAM;WACN,WAAW;WACX;WACA,oBAAoB;;KAG1B;WAEU;WACA;WACA;;WAGA;WACA;WACA;;WAGA;WACA;WACA;WACA;WACA;WACA;;WAGA;WACA;aACE;aACA;;;WAIF;WACA;WACA,MAAM;;KAGhB;WACM;WACA,MAAM;WACN;WACA;WACA,QAAQ;WACR,kBAAkB;;KAGxB;WACM;WACA;WACA;WACA,SAAS;WACT,kBAAkB;WAClB,uBAAuB;WACvB;aACE,iBAAiB;aACjB,+BAA+B;aAC/B,wBAAwB;aACxB;eACE;iBACE;iBACA;;;aAGJ,QAAQ;;;iBAoFL,YAAY,SAAS,gBAAgB;iBAsKrC,YACd,cAAc;EAAiB;IAC9B"}
|
|
@@ -6,7 +6,8 @@ const encodeAttachmentPart = (part) => {
|
|
|
6
6
|
switch (type) {
|
|
7
7
|
case "text": return {
|
|
8
8
|
type: "text",
|
|
9
|
-
text: part.text
|
|
9
|
+
text: part.text,
|
|
10
|
+
...part.parentId !== void 0 ? { parentId: part.parentId } : void 0
|
|
10
11
|
};
|
|
11
12
|
case "image": return {
|
|
12
13
|
type: "image",
|
|
@@ -18,7 +19,8 @@ const encodeAttachmentPart = (part) => {
|
|
|
18
19
|
data: part.data,
|
|
19
20
|
mimeType: part.mimeType,
|
|
20
21
|
...part.filename != null ? { filename: part.filename } : void 0,
|
|
21
|
-
...part.sourceType != null ? { sourceType: part.sourceType } : void 0
|
|
22
|
+
...part.sourceType != null ? { sourceType: part.sourceType } : void 0,
|
|
23
|
+
...part.parentId !== void 0 ? { parentId: part.parentId } : void 0
|
|
22
24
|
};
|
|
23
25
|
case "audio": return {
|
|
24
26
|
type: "audio",
|
|
@@ -61,12 +63,15 @@ function auiV0Encode(message) {
|
|
|
61
63
|
switch (type) {
|
|
62
64
|
case "text": return {
|
|
63
65
|
type: "text",
|
|
64
|
-
text: part.text
|
|
66
|
+
text: part.text,
|
|
67
|
+
...part.parentId !== void 0 ? { parentId: part.parentId } : void 0
|
|
65
68
|
};
|
|
66
69
|
case "reasoning": return {
|
|
67
70
|
type: "reasoning",
|
|
68
71
|
text: part.text,
|
|
69
|
-
...part.unstable_summary !== void 0 ? { unstable_summary: part.unstable_summary } : void 0
|
|
72
|
+
...part.unstable_summary !== void 0 ? { unstable_summary: part.unstable_summary } : void 0,
|
|
73
|
+
...part.providerMetadata !== void 0 ? { providerMetadata: part.providerMetadata } : void 0,
|
|
74
|
+
...part.parentId !== void 0 ? { parentId: part.parentId } : void 0
|
|
70
75
|
};
|
|
71
76
|
case "source":
|
|
72
77
|
if (part.sourceType === "url") return {
|
|
@@ -75,7 +80,8 @@ function auiV0Encode(message) {
|
|
|
75
80
|
id: part.id,
|
|
76
81
|
url: part.url,
|
|
77
82
|
...part.title != null ? { title: part.title } : void 0,
|
|
78
|
-
...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : void 0
|
|
83
|
+
...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : void 0,
|
|
84
|
+
...part.parentId !== void 0 ? { parentId: part.parentId } : void 0
|
|
79
85
|
};
|
|
80
86
|
return {
|
|
81
87
|
type: "source",
|
|
@@ -84,7 +90,8 @@ function auiV0Encode(message) {
|
|
|
84
90
|
title: part.title,
|
|
85
91
|
mediaType: part.mediaType,
|
|
86
92
|
...part.filename != null ? { filename: part.filename } : void 0,
|
|
87
|
-
...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : void 0
|
|
93
|
+
...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : void 0,
|
|
94
|
+
...part.parentId !== void 0 ? { parentId: part.parentId } : void 0
|
|
88
95
|
};
|
|
89
96
|
case "tool-call":
|
|
90
97
|
if (part.result !== void 0 && !isJSONValue(part.result)) console.warn(`tool-call result is not JSON! ${JSON.stringify(part)}`);
|
|
@@ -95,7 +102,15 @@ function auiV0Encode(message) {
|
|
|
95
102
|
...JSON.stringify(part.args) === part.argsText ? { args: part.args } : { argsText: part.argsText },
|
|
96
103
|
...part.result !== void 0 ? { result: part.result } : void 0,
|
|
97
104
|
...part.isError ? { isError: true } : void 0,
|
|
98
|
-
...part.
|
|
105
|
+
...part.interrupt !== void 0 ? { interrupt: {
|
|
106
|
+
type: part.interrupt.type,
|
|
107
|
+
payload: part.interrupt.payload
|
|
108
|
+
} } : void 0,
|
|
109
|
+
...part.timing !== void 0 ? { timing: part.timing } : void 0,
|
|
110
|
+
...part.mcp !== void 0 ? { mcp: part.mcp } : void 0,
|
|
111
|
+
...part.approval ? { approval: part.approval } : void 0,
|
|
112
|
+
...part.parentId !== void 0 ? { parentId: part.parentId } : void 0,
|
|
113
|
+
...part.messages !== void 0 ? { messages: part.messages.map(encodeNestedMessage) } : void 0
|
|
99
114
|
};
|
|
100
115
|
case "image": return {
|
|
101
116
|
type: "image",
|
|
@@ -106,7 +121,8 @@ function auiV0Encode(message) {
|
|
|
106
121
|
data: part.data,
|
|
107
122
|
mimeType: part.mimeType,
|
|
108
123
|
...part.filename ? { filename: part.filename } : void 0,
|
|
109
|
-
...part.sourceType ? { sourceType: part.sourceType } : void 0
|
|
124
|
+
...part.sourceType ? { sourceType: part.sourceType } : void 0,
|
|
125
|
+
...part.parentId !== void 0 ? { parentId: part.parentId } : void 0
|
|
110
126
|
};
|
|
111
127
|
case "data":
|
|
112
128
|
if (!isJSONValue(part.data)) console.warn(`data part is not JSON! ${JSON.stringify(part)}`);
|
|
@@ -115,6 +131,19 @@ function auiV0Encode(message) {
|
|
|
115
131
|
name: part.name,
|
|
116
132
|
data: part.data
|
|
117
133
|
};
|
|
134
|
+
case "audio": return {
|
|
135
|
+
type: "audio",
|
|
136
|
+
audio: {
|
|
137
|
+
data: part.audio.data,
|
|
138
|
+
format: part.audio.format
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
case "generative-ui": return {
|
|
142
|
+
type: "generative-ui",
|
|
143
|
+
spec: part.spec,
|
|
144
|
+
...part.id !== void 0 ? { id: part.id } : void 0,
|
|
145
|
+
...part.parentId !== void 0 ? { parentId: part.parentId } : void 0
|
|
146
|
+
};
|
|
118
147
|
default: throw new Error(`Message part type not supported by aui/v0: ${type}`);
|
|
119
148
|
}
|
|
120
149
|
}),
|
|
@@ -125,19 +154,37 @@ function auiV0Encode(message) {
|
|
|
125
154
|
}
|
|
126
155
|
function auiV0Decode(cloudMessage) {
|
|
127
156
|
const payload = cloudMessage.content;
|
|
128
|
-
const message =
|
|
157
|
+
const message = decodeAuiV0Message({
|
|
158
|
+
...payload,
|
|
129
159
|
id: cloudMessage.id,
|
|
130
|
-
createdAt: cloudMessage.created_at
|
|
131
|
-
|
|
132
|
-
}, cloudMessage.id, {
|
|
133
|
-
type: "complete",
|
|
134
|
-
reason: "unknown"
|
|
135
|
-
});
|
|
160
|
+
createdAt: cloudMessage.created_at
|
|
161
|
+
}, cloudMessage.id);
|
|
136
162
|
return {
|
|
137
163
|
parentId: cloudMessage.parent_id,
|
|
138
164
|
message
|
|
139
165
|
};
|
|
140
166
|
}
|
|
167
|
+
const encodeNestedMessage = (message) => ({
|
|
168
|
+
...auiV0Encode(message),
|
|
169
|
+
id: message.id,
|
|
170
|
+
createdAt: message.createdAt.toISOString()
|
|
171
|
+
});
|
|
172
|
+
const decodeAuiV0Message = (payload, fallbackId) => fromThreadMessageLike({
|
|
173
|
+
...payload,
|
|
174
|
+
content: payload.content.map((part, index) => {
|
|
175
|
+
if (part.type !== "tool-call" || part.messages === void 0) return part;
|
|
176
|
+
return {
|
|
177
|
+
...part,
|
|
178
|
+
messages: part.messages.map((message, nestedIndex) => decodeAuiV0Message({
|
|
179
|
+
...message,
|
|
180
|
+
createdAt: message.createdAt !== void 0 ? new Date(message.createdAt) : payload.createdAt
|
|
181
|
+
}, message.id ?? `${fallbackId}-${part.toolCallId}-${index}-${nestedIndex}`))
|
|
182
|
+
};
|
|
183
|
+
})
|
|
184
|
+
}, fallbackId, {
|
|
185
|
+
type: "complete",
|
|
186
|
+
reason: "unknown"
|
|
187
|
+
});
|
|
141
188
|
//#endregion
|
|
142
189
|
export { auiV0Decode, auiV0Encode };
|
|
143
190
|
|