@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
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
//#region src/utils/abortable-iterable.ts
|
|
2
|
+
const done = () => ({
|
|
3
|
+
done: true,
|
|
4
|
+
value: void 0
|
|
5
|
+
});
|
|
6
|
+
const openAbortableIterable = async (source, signal) => {
|
|
7
|
+
const opened = Promise.resolve(source);
|
|
8
|
+
let release = () => {};
|
|
9
|
+
const aborted = new Promise((resolve) => {
|
|
10
|
+
const onAbort = () => resolve(void 0);
|
|
11
|
+
if (signal.aborted) return onAbort();
|
|
12
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
13
|
+
release = () => signal.removeEventListener("abort", onAbort);
|
|
14
|
+
});
|
|
15
|
+
try {
|
|
16
|
+
const iterable = await Promise.race([opened, aborted]);
|
|
17
|
+
if (!iterable) opened.then((late) => late[Symbol.asyncIterator]().return?.(void 0)).catch(() => {});
|
|
18
|
+
return iterable;
|
|
19
|
+
} finally {
|
|
20
|
+
release();
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Presents a stream as exhausted once the signal aborts, so a consumer stops
|
|
25
|
+
* waiting on it.
|
|
26
|
+
*
|
|
27
|
+
* A caller's stream is free to ignore the abort signal it is handed. One that
|
|
28
|
+
* also stops yielding, because it is awaiting its own work, leaves `for await`
|
|
29
|
+
* parked on `next()` with nothing left to wake it: the run never settles and
|
|
30
|
+
* whatever is serialized behind it never starts. Reporting the stream as
|
|
31
|
+
* exhausted ends the loop at cancellation instead.
|
|
32
|
+
*
|
|
33
|
+
* The source is finalized on the way out, but never awaited, since a stream
|
|
34
|
+
* that is already parked would not settle that either.
|
|
35
|
+
*/
|
|
36
|
+
const abortableIterable = (source, signal) => ({ [Symbol.asyncIterator]: () => {
|
|
37
|
+
const iterator = source[Symbol.asyncIterator]();
|
|
38
|
+
let finished = false;
|
|
39
|
+
const finalize = () => {
|
|
40
|
+
if (finished) return;
|
|
41
|
+
finished = true;
|
|
42
|
+
try {
|
|
43
|
+
iterator.return?.(void 0)?.catch(() => {});
|
|
44
|
+
} catch {}
|
|
45
|
+
};
|
|
46
|
+
return {
|
|
47
|
+
[Symbol.asyncIterator]() {
|
|
48
|
+
return this;
|
|
49
|
+
},
|
|
50
|
+
next: () => {
|
|
51
|
+
if (finished || signal.aborted) {
|
|
52
|
+
finalize();
|
|
53
|
+
return Promise.resolve(done());
|
|
54
|
+
}
|
|
55
|
+
return new Promise((resolve, reject) => {
|
|
56
|
+
const onAbort = () => {
|
|
57
|
+
finalize();
|
|
58
|
+
resolve(done());
|
|
59
|
+
};
|
|
60
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
61
|
+
const release = () => signal.removeEventListener("abort", onAbort);
|
|
62
|
+
const onError = (error) => {
|
|
63
|
+
release();
|
|
64
|
+
finalize();
|
|
65
|
+
reject(error);
|
|
66
|
+
};
|
|
67
|
+
try {
|
|
68
|
+
iterator.next().then((result) => {
|
|
69
|
+
release();
|
|
70
|
+
if (finished) return resolve(done());
|
|
71
|
+
if (result.done) finished = true;
|
|
72
|
+
resolve(result);
|
|
73
|
+
}, onError);
|
|
74
|
+
} catch (error) {
|
|
75
|
+
onError(error);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
},
|
|
79
|
+
return: async () => {
|
|
80
|
+
finalize();
|
|
81
|
+
return done();
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
} });
|
|
85
|
+
//#endregion
|
|
86
|
+
export { abortableIterable, openAbortableIterable };
|
|
87
|
+
|
|
88
|
+
//# sourceMappingURL=abortable-iterable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abortable-iterable.js","names":["done","IteratorResult","T","value","undefined","openAbortableIterable","source","AsyncIterable","Promise","signal","AbortSignal","opened","resolve","release","aborted","onAbort","addEventListener","once","removeEventListener","iterable","race","then","late","Symbol","asyncIterator","return","catch","abortableIterable","iterator","finished","finalize","next","reject","onError","error","result"],"sources":["../../src/utils/abortable-iterable.ts"],"sourcesContent":["const done = <T>(): IteratorResult<T> => ({ done: true, value: undefined });\n\nexport const openAbortableIterable = async <T>(\n source: AsyncIterable<T> | Promise<AsyncIterable<T>>,\n signal: AbortSignal,\n): Promise<AsyncIterable<T> | undefined> => {\n const opened = Promise.resolve(source);\n let release = () => {};\n const aborted = new Promise<undefined>((resolve) => {\n const onAbort = () => resolve(undefined);\n if (signal.aborted) return onAbort();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n release = () => signal.removeEventListener(\"abort\", onAbort);\n });\n try {\n const iterable = await Promise.race([opened, aborted]);\n if (!iterable) {\n void opened\n .then((late) => late[Symbol.asyncIterator]().return?.(undefined))\n .catch(() => {});\n }\n return iterable;\n } finally {\n release();\n }\n};\n\n/**\n * Presents a stream as exhausted once the signal aborts, so a consumer stops\n * waiting on it.\n *\n * A caller's stream is free to ignore the abort signal it is handed. One that\n * also stops yielding, because it is awaiting its own work, leaves `for await`\n * parked on `next()` with nothing left to wake it: the run never settles and\n * whatever is serialized behind it never starts. Reporting the stream as\n * exhausted ends the loop at cancellation instead.\n *\n * The source is finalized on the way out, but never awaited, since a stream\n * that is already parked would not settle that either.\n */\nexport const abortableIterable = <T>(\n source: AsyncIterable<T>,\n signal: AbortSignal,\n): AsyncIterable<T> => ({\n [Symbol.asyncIterator]: () => {\n const iterator = source[Symbol.asyncIterator]();\n let finished = false;\n const finalize = () => {\n if (finished) return;\n finished = true;\n try {\n iterator.return?.(undefined)?.catch(() => {});\n } catch {\n // a source that throws on finalize has nothing left to clean up\n }\n };\n\n return {\n [Symbol.asyncIterator]() {\n return this;\n },\n next: () => {\n if (finished || signal.aborted) {\n finalize();\n return Promise.resolve(done<T>());\n }\n\n return new Promise<IteratorResult<T>>((resolve, reject) => {\n // Registered per chunk and released as soon as the chunk settles, so\n // a long stream does not accumulate one reaction per chunk.\n const onAbort = () => {\n finalize();\n resolve(done<T>());\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n const release = () => signal.removeEventListener(\"abort\", onAbort);\n\n const onError = (error: unknown) => {\n release();\n finalize();\n reject(error);\n };\n try {\n void iterator.next().then((result) => {\n release();\n if (finished) return resolve(done<T>());\n if (result.done) finished = true;\n resolve(result);\n }, onError);\n } catch (error) {\n onError(error);\n }\n });\n },\n // The consumer breaks out of the loop to stop a cancelled run, so this is\n // reached on the same path as an abort and finalizes the same way: a\n // source whose own cleanup parks must not stall the break either.\n return: async () => {\n finalize();\n return done<T>();\n },\n };\n },\n});\n"],"mappings":";AAAA,MAAMA,cAAoC;CAAEA,MAAM;CAAMG,OAAOC,KAAAA;AAAU;AAEzE,MAAaC,wBAAwB,OACnCC,QACAG,WAC0C;CAC1C,MAAME,SAASH,QAAQI,QAAQN,MAAM;CACrC,IAAIO,gBAAgB,CAAC;CACrB,MAAMC,UAAU,IAAIN,SAAoBI,YAAY;EAClD,MAAMG,gBAAgBH,QAAQR,KAAAA,CAAS;EACvC,IAAIK,OAAOK,SAAS,OAAOC,QAAQ;EACnCN,OAAOO,iBAAiB,SAASD,SAAS,EAAEE,MAAM,KAAK,CAAC;EACxDJ,gBAAgBJ,OAAOS,oBAAoB,SAASH,OAAO;CAC7D,CAAC;CACD,IAAI;EACF,MAAMI,WAAW,MAAMX,QAAQY,KAAK,CAACT,QAAQG,OAAO,CAAC;EACrD,IAAI,CAACK,UACH,OACGE,MAAMC,SAASA,KAAKC,OAAOC,cAAc,CAAC,CAAC,CAACC,SAASrB,KAAAA,CAAS,CAAC,CAAC,CAChEsB,YAAY,CAAC,CAAC;EAEnB,OAAOP;CACT,UAAU;EACRN,QAAQ;CACV;AACF;;;;;;;;;;;;;;AAeA,MAAac,qBACXrB,QACAG,YACsB,GACrBc,OAAOC,sBAAsB;CAC5B,MAAMI,WAAWtB,OAAOiB,OAAOC,cAAc,CAAC;CAC9C,IAAIK,WAAW;CACf,MAAMC,iBAAiB;EACrB,IAAID,UAAU;EACdA,WAAW;EACX,IAAI;GACFD,SAASH,SAASrB,KAAAA,CAAS,CAAC,EAAEsB,YAAY,CAAC,CAAC;EAC9C,QAAQ,CACN;CAEJ;CAEA,OAAO;EACL,CAACH,OAAOC,iBAAiB;GACvB,OAAO;EACT;EACAO,YAAY;GACV,IAAIF,YAAYpB,OAAOK,SAAS;IAC9BgB,SAAS;IACT,OAAOtB,QAAQI,QAAQZ,KAAQ,CAAC;GAClC;GAEA,OAAO,IAAIQ,SAA4BI,SAASoB,WAAW;IAGzD,MAAMjB,gBAAgB;KACpBe,SAAS;KACTlB,QAAQZ,KAAQ,CAAC;IACnB;IACAS,OAAOO,iBAAiB,SAASD,SAAS,EAAEE,MAAM,KAAK,CAAC;IACxD,MAAMJ,gBAAgBJ,OAAOS,oBAAoB,SAASH,OAAO;IAEjE,MAAMkB,WAAWC,UAAmB;KAClCrB,QAAQ;KACRiB,SAAS;KACTE,OAAOE,KAAK;IACd;IACA,IAAI;KACF,SAAcH,KAAK,CAAC,CAACV,MAAMc,WAAW;MACpCtB,QAAQ;MACR,IAAIgB,UAAU,OAAOjB,QAAQZ,KAAQ,CAAC;MACtC,IAAImC,OAAOnC,MAAM6B,WAAW;MAC5BjB,QAAQuB,MAAM;KAChB,GAAGF,OAAO;IACZ,SAASC,OAAO;KACdD,QAAQC,KAAK;IACf;GACF,CAAC;EACH;EAIAT,QAAQ,YAAY;GAClBK,SAAS;GACT,OAAO9B,KAAQ;EACjB;CACF;AACF,EACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composite-context-provider.d.ts","names":[],"sources":["../../src/utils/composite-context-provider.ts"],"mappings":";;;cAOa,oCAAoC;UACvC;UACA;EAER,mBAJW;EAQX,6BAA6B,UAAU;
|
|
1
|
+
{"version":3,"file":"composite-context-provider.d.ts","names":[],"sources":["../../src/utils/composite-context-provider.ts"],"mappings":";;;cAOa,oCAAoC;UACvC;UACA;EAER,mBAJW;EAQX,6BAA6B,UAAU;UAiD/B;EAER;EAIA,UAAU"}
|
|
@@ -26,11 +26,29 @@ var CompositeContextProvider = class {
|
|
|
26
26
|
}
|
|
27
27
|
this._providerUnsubscribes.set(id, unsubscribe);
|
|
28
28
|
this.notifySubscribers();
|
|
29
|
+
let released = false;
|
|
29
30
|
return () => {
|
|
31
|
+
if (released) return;
|
|
32
|
+
released = true;
|
|
30
33
|
this._providers.delete(id);
|
|
31
|
-
this._providerUnsubscribes.get(id)
|
|
34
|
+
const unsubscribe = this._providerUnsubscribes.get(id);
|
|
32
35
|
this._providerUnsubscribes.delete(id);
|
|
33
|
-
|
|
36
|
+
let cleanupFailed = false;
|
|
37
|
+
let cleanupError;
|
|
38
|
+
const runCleanup = (cleanup) => {
|
|
39
|
+
try {
|
|
40
|
+
cleanup();
|
|
41
|
+
} catch (error) {
|
|
42
|
+
if (cleanupFailed) console.error(error);
|
|
43
|
+
else {
|
|
44
|
+
cleanupFailed = true;
|
|
45
|
+
cleanupError = error;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
if (unsubscribe) runCleanup(unsubscribe);
|
|
50
|
+
runCleanup(() => this.notifySubscribers());
|
|
51
|
+
if (cleanupFailed) throw cleanupError;
|
|
34
52
|
};
|
|
35
53
|
}
|
|
36
54
|
_subscribers = /* @__PURE__ */ new Set();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composite-context-provider.js","names":["ModelContextProvider","mergeModelContexts","notifySubscribers","notifyStateSubscribers","Unsubscribe","CompositeContextProvider","_providers","Map","_providerUnsubscribes","getModelContext","Set","values","registerModelContextProvider","provider","id","Symbol","set","unsubscribe","subscribe","error","delete","notifyError","console","get","_subscribers","callback","add"],"sources":["../../src/utils/composite-context-provider.ts"],"sourcesContent":["import {\n type ModelContextProvider,\n mergeModelContexts,\n} from \"../model-context/types\";\nimport { notifySubscribers as notifyStateSubscribers } from \"../subscribable/subscribable\";\nimport type { Unsubscribe } from \"../types/unsubscribe\";\n\nexport class CompositeContextProvider implements ModelContextProvider {\n private _providers = new Map<symbol, ModelContextProvider>();\n private _providerUnsubscribes = new Map<symbol, Unsubscribe | undefined>();\n\n getModelContext() {\n return mergeModelContexts(new Set(this._providers.values()));\n }\n\n registerModelContextProvider(provider: ModelContextProvider) {\n const id = Symbol();\n this._providers.set(id, provider);\n let unsubscribe: Unsubscribe | undefined;\n try {\n unsubscribe = provider.subscribe?.(() => {\n this.notifySubscribers();\n });\n } catch (error) {\n this._providers.delete(id);\n try {\n this.notifySubscribers();\n } catch (notifyError) {\n console.error(notifyError);\n }\n throw error;\n }\n this._providerUnsubscribes.set(id, unsubscribe);\n this.notifySubscribers();\n return () => {\n this._providers.delete(id);\n const unsubscribe = this._providerUnsubscribes.get(id);\n
|
|
1
|
+
{"version":3,"file":"composite-context-provider.js","names":["ModelContextProvider","mergeModelContexts","notifySubscribers","notifyStateSubscribers","Unsubscribe","CompositeContextProvider","_providers","Map","_providerUnsubscribes","getModelContext","Set","values","registerModelContextProvider","provider","id","Symbol","set","unsubscribe","subscribe","error","delete","notifyError","console","released","get","cleanupFailed","cleanupError","runCleanup","cleanup","_subscribers","callback","add"],"sources":["../../src/utils/composite-context-provider.ts"],"sourcesContent":["import {\n type ModelContextProvider,\n mergeModelContexts,\n} from \"../model-context/types\";\nimport { notifySubscribers as notifyStateSubscribers } from \"../subscribable/subscribable\";\nimport type { Unsubscribe } from \"../types/unsubscribe\";\n\nexport class CompositeContextProvider implements ModelContextProvider {\n private _providers = new Map<symbol, ModelContextProvider>();\n private _providerUnsubscribes = new Map<symbol, Unsubscribe | undefined>();\n\n getModelContext() {\n return mergeModelContexts(new Set(this._providers.values()));\n }\n\n registerModelContextProvider(provider: ModelContextProvider) {\n const id = Symbol();\n this._providers.set(id, provider);\n let unsubscribe: Unsubscribe | undefined;\n try {\n unsubscribe = provider.subscribe?.(() => {\n this.notifySubscribers();\n });\n } catch (error) {\n this._providers.delete(id);\n try {\n this.notifySubscribers();\n } catch (notifyError) {\n console.error(notifyError);\n }\n throw error;\n }\n this._providerUnsubscribes.set(id, unsubscribe);\n this.notifySubscribers();\n let released = false;\n return () => {\n if (released) return;\n released = true;\n this._providers.delete(id);\n const unsubscribe = this._providerUnsubscribes.get(id);\n this._providerUnsubscribes.delete(id);\n\n let cleanupFailed = false;\n let cleanupError: unknown;\n const runCleanup = (cleanup: () => void) => {\n try {\n cleanup();\n } catch (error) {\n if (cleanupFailed) {\n console.error(error);\n } else {\n cleanupFailed = true;\n cleanupError = error;\n }\n }\n };\n\n if (unsubscribe) runCleanup(unsubscribe);\n runCleanup(() => this.notifySubscribers());\n\n if (cleanupFailed) throw cleanupError;\n };\n }\n\n private _subscribers = new Set<() => void>();\n\n notifySubscribers() {\n notifyStateSubscribers(this._subscribers);\n }\n\n subscribe(callback: () => void) {\n this._subscribers.add(callback);\n return () => {\n this._subscribers.delete(callback);\n };\n }\n}\n"],"mappings":";;;AAOA,IAAaK,2BAAb,MAAsE;CACpE,6BAAqB,IAAIE,IAAkC;CAC3D,wCAAgC,IAAIA,IAAqC;CAEzEE,kBAAkB;EAChB,OAAOR,mBAAmB,IAAIS,IAAI,KAAKJ,WAAWK,OAAO,CAAC,CAAC;CAC7D;CAEAC,6BAA6BC,UAAgC;EAC3D,MAAMC,KAAKC,OAAO;EAClB,KAAKT,WAAWU,IAAIF,IAAID,QAAQ;EAChC,IAAII;EACJ,IAAI;GACFA,cAAcJ,SAASK,kBAAkB;IACvC,KAAKhB,kBAAkB;GACzB,CAAC;EACH,SAASiB,OAAO;GACd,KAAKb,WAAWc,OAAON,EAAE;GACzB,IAAI;IACF,KAAKZ,kBAAkB;GACzB,SAASmB,aAAa;IACpBC,QAAQH,MAAME,WAAW;GAC3B;GACA,MAAMF;EACR;EACA,KAAKX,sBAAsBQ,IAAIF,IAAIG,WAAW;EAC9C,KAAKf,kBAAkB;EACvB,IAAIqB,WAAW;EACf,aAAa;GACX,IAAIA,UAAU;GACdA,WAAW;GACX,KAAKjB,WAAWc,OAAON,EAAE;GACzB,MAAMG,cAAc,KAAKT,sBAAsBgB,IAAIV,EAAE;GACrD,KAAKN,sBAAsBY,OAAON,EAAE;GAEpC,IAAIW,gBAAgB;GACpB,IAAIC;GACJ,MAAMC,cAAcC,YAAwB;IAC1C,IAAI;KACFA,QAAQ;IACV,SAAST,OAAO;KACd,IAAIM,eACFH,QAAQH,MAAMA,KAAK;UACd;MACLM,gBAAgB;MAChBC,eAAeP;KACjB;IACF;GACF;GAEA,IAAIF,aAAaU,WAAWV,WAAW;GACvCU,iBAAiB,KAAKzB,kBAAkB,CAAC;GAEzC,IAAIuB,eAAe,MAAMC;EAC3B;CACF;CAEA,+BAAuB,IAAIhB,IAAgB;CAE3CR,oBAAoB;EAClBC,kBAAuB,KAAK0B,YAAY;CAC1C;CAEAX,UAAUY,UAAsB;EAC9B,KAAKD,aAAaE,IAAID,QAAQ;EAC9B,aAAa;GACX,KAAKD,aAAaT,OAAOU,QAAQ;EACnC;CACF;AACF"}
|
|
@@ -3,7 +3,23 @@ import { MessagePartStatus, ToolCallMessagePartStatus } from "../types/message.j
|
|
|
3
3
|
type PartWithStatus = {
|
|
4
4
|
readonly status: MessagePartStatus | ToolCallMessagePartStatus;
|
|
5
5
|
};
|
|
6
|
-
declare const getGroupStatus: (parts: readonly (PartWithStatus | undefined)[]
|
|
6
|
+
declare const getGroupStatus: (parts: readonly (PartWithStatus | undefined)[]) => MessagePartStatus | ToolCallMessagePartStatus;
|
|
7
|
+
declare const getGroupSummary: (parts: readonly (PartWithStatus | undefined)[], indices: readonly number[]) => {
|
|
8
|
+
status: MessagePartStatus | {
|
|
9
|
+
readonly type: "requires-action";
|
|
10
|
+
readonly reason: "tool-calls" | "interrupt";
|
|
11
|
+
} | {
|
|
12
|
+
readonly type: "incomplete";
|
|
13
|
+
readonly reason: "tool-calls";
|
|
14
|
+
readonly error?: import("assistant-stream/utils").ReadonlyJSONValue;
|
|
15
|
+
};
|
|
16
|
+
counts: {
|
|
17
|
+
running: number;
|
|
18
|
+
complete: number;
|
|
19
|
+
incomplete: number;
|
|
20
|
+
requiresAction: number;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
7
23
|
//#endregion
|
|
8
|
-
export { getGroupStatus };
|
|
24
|
+
export { getGroupStatus, getGroupSummary };
|
|
9
25
|
//# sourceMappingURL=getGroupStatus.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getGroupStatus.d.ts","names":[],"sources":["../../src/utils/getGroupStatus.ts"],"mappings":";;KAMK;WACM,QAAQ,oBAAoB;;cAG1B,iBACX,iBAAiB
|
|
1
|
+
{"version":3,"file":"getGroupStatus.d.ts","names":[],"sources":["../../src/utils/getGroupStatus.ts"],"mappings":";;KAMK;WACM,QAAQ,oBAAoB;;cAG1B,iBACX,iBAAiB,kCAChB,oBAAoB;cAQV,kBACX,iBAAiB,+BACjB;UADiB"}
|
|
@@ -1,15 +1,40 @@
|
|
|
1
1
|
import { COMPLETE_STATUS, RUNNING_STATUS } from "./normalizePartStatus.js";
|
|
2
2
|
//#region src/utils/getGroupStatus.ts
|
|
3
|
-
const getGroupStatus = (parts
|
|
4
|
-
if (indices) {
|
|
5
|
-
for (const index of indices) if (parts[index]?.status.type === "running") return RUNNING_STATUS;
|
|
6
|
-
const lastIndex = indices.at(-1);
|
|
7
|
-
return lastIndex === void 0 ? COMPLETE_STATUS : parts[lastIndex]?.status ?? COMPLETE_STATUS;
|
|
8
|
-
}
|
|
3
|
+
const getGroupStatus = (parts) => {
|
|
9
4
|
for (const part of parts) if (part?.status.type === "running") return RUNNING_STATUS;
|
|
10
5
|
return parts.at(-1)?.status ?? COMPLETE_STATUS;
|
|
11
6
|
};
|
|
7
|
+
const getGroupSummary = (parts, indices) => {
|
|
8
|
+
const counts = {
|
|
9
|
+
running: 0,
|
|
10
|
+
complete: 0,
|
|
11
|
+
incomplete: 0,
|
|
12
|
+
requiresAction: 0
|
|
13
|
+
};
|
|
14
|
+
let status = COMPLETE_STATUS;
|
|
15
|
+
let isRunning = false;
|
|
16
|
+
for (const index of indices) {
|
|
17
|
+
status = parts[index]?.status ?? COMPLETE_STATUS;
|
|
18
|
+
switch (status.type) {
|
|
19
|
+
case "running":
|
|
20
|
+
counts.running++;
|
|
21
|
+
isRunning = true;
|
|
22
|
+
break;
|
|
23
|
+
case "complete":
|
|
24
|
+
counts.complete++;
|
|
25
|
+
break;
|
|
26
|
+
case "incomplete":
|
|
27
|
+
counts.incomplete++;
|
|
28
|
+
break;
|
|
29
|
+
case "requires-action": counts.requiresAction++;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
status: isRunning ? RUNNING_STATUS : status,
|
|
34
|
+
counts
|
|
35
|
+
};
|
|
36
|
+
};
|
|
12
37
|
//#endregion
|
|
13
|
-
export { getGroupStatus };
|
|
38
|
+
export { getGroupStatus, getGroupSummary };
|
|
14
39
|
|
|
15
40
|
//# sourceMappingURL=getGroupStatus.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getGroupStatus.js","names":["MessagePartStatus","ToolCallMessagePartStatus","COMPLETE_STATUS","RUNNING_STATUS","PartWithStatus","status","getGroupStatus","parts","indices","
|
|
1
|
+
{"version":3,"file":"getGroupStatus.js","names":["MessagePartStatus","ToolCallMessagePartStatus","COMPLETE_STATUS","RUNNING_STATUS","PartWithStatus","status","getGroupStatus","parts","part","type","at","getGroupSummary","indices","counts","running","complete","incomplete","requiresAction","isRunning","index"],"sources":["../../src/utils/getGroupStatus.ts"],"sourcesContent":["import type {\n MessagePartStatus,\n ToolCallMessagePartStatus,\n} from \"../types/message\";\nimport { COMPLETE_STATUS, RUNNING_STATUS } from \"./normalizePartStatus\";\n\ntype PartWithStatus = {\n readonly status: MessagePartStatus | ToolCallMessagePartStatus;\n};\n\nexport const getGroupStatus = (\n parts: readonly (PartWithStatus | undefined)[],\n): MessagePartStatus | ToolCallMessagePartStatus => {\n for (const part of parts) {\n if (part?.status.type === \"running\") return RUNNING_STATUS;\n }\n\n return parts.at(-1)?.status ?? COMPLETE_STATUS;\n};\n\nexport const getGroupSummary = (\n parts: readonly (PartWithStatus | undefined)[],\n indices: readonly number[],\n) => {\n const counts = {\n running: 0,\n complete: 0,\n incomplete: 0,\n requiresAction: 0,\n };\n let status: MessagePartStatus | ToolCallMessagePartStatus = COMPLETE_STATUS;\n let isRunning = false;\n\n for (const index of indices) {\n status = parts[index]?.status ?? COMPLETE_STATUS;\n switch (status.type) {\n case \"running\":\n counts.running++;\n isRunning = true;\n break;\n case \"complete\":\n counts.complete++;\n break;\n case \"incomplete\":\n counts.incomplete++;\n break;\n case \"requires-action\":\n counts.requiresAction++;\n break;\n }\n }\n\n return { status: isRunning ? RUNNING_STATUS : status, counts };\n};\n"],"mappings":";;AAUA,MAAaM,kBACXC,UACkD;CAClD,KAAK,MAAMC,QAAQD,OACjB,IAAIC,MAAMH,OAAOI,SAAS,WAAW,OAAON;CAG9C,OAAOI,MAAMG,GAAG,EAAE,CAAC,EAAEL,UAAUH;AACjC;AAEA,MAAaS,mBACXJ,OACAK,YACG;CACH,MAAMC,SAAS;EACbC,SAAS;EACTC,UAAU;EACVC,YAAY;EACZC,gBAAgB;CAClB;CACA,IAAIZ,SAAwDH;CAC5D,IAAIgB,YAAY;CAEhB,KAAK,MAAMC,SAASP,SAAS;EAC3BP,SAASE,MAAMY,MAAM,EAAEd,UAAUH;EACjC,QAAQG,OAAOI,MAAf;GACE,KAAK;IACHI,OAAOC;IACPI,YAAY;IACZ;GACF,KAAK;IACHL,OAAOE;IACP;GACF,KAAK;IACHF,OAAOG;IACP;GACF,KAAK,mBACHH,OAAOI;EAEX;CACF;CAEA,OAAO;EAAEZ,QAAQa,YAAYf,iBAAiBE;EAAQQ;CAAO;AAC/D"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region src/utils/record.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Builds a dictionary with no prototype from the own entries of its arguments.
|
|
4
|
+
* Bracket assignment on a plain object routes a `__proto__` key through the
|
|
5
|
+
* `Object.prototype` setter instead of defining an own property, so a record
|
|
6
|
+
* assigned into by a key the app does not control is built this way.
|
|
7
|
+
*/
|
|
8
|
+
declare const nullProtoRecord: <T>(base?: Readonly<Record<string, T>>, ...rest: readonly (Readonly<Record<string, NoInfer<T>>> | undefined)[]) => Record<string, T>;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { nullProtoRecord };
|
|
11
|
+
//# sourceMappingURL=record.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.d.ts","names":[],"sources":["../../src/utils/record.ts"],"mappings":";;;;;;;cAMa,kBAAmB,GAC9B,OAAO,SAAS,eAAe,QAC5B,gBAAgB,SAAS,eAAe,QAAQ,wBAClD,eAAe"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/utils/record.ts
|
|
2
|
+
/**
|
|
3
|
+
* Builds a dictionary with no prototype from the own entries of its arguments.
|
|
4
|
+
* Bracket assignment on a plain object routes a `__proto__` key through the
|
|
5
|
+
* `Object.prototype` setter instead of defining an own property, so a record
|
|
6
|
+
* assigned into by a key the app does not control is built this way.
|
|
7
|
+
*/
|
|
8
|
+
const nullProtoRecord = (base, ...rest) => Object.assign(Object.create(null), base, ...rest);
|
|
9
|
+
//#endregion
|
|
10
|
+
export { nullProtoRecord };
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.js","names":["nullProtoRecord","base","Readonly","Record","T","rest","NoInfer","Object","assign","create"],"sources":["../../src/utils/record.ts"],"sourcesContent":["/**\n * Builds a dictionary with no prototype from the own entries of its arguments.\n * Bracket assignment on a plain object routes a `__proto__` key through the\n * `Object.prototype` setter instead of defining an own property, so a record\n * assigned into by a key the app does not control is built this way.\n */\nexport const nullProtoRecord = <T>(\n base?: Readonly<Record<string, T>>,\n ...rest: readonly (Readonly<Record<string, NoInfer<T>>> | undefined)[]\n): Record<string, T> =>\n Object.assign(Object.create(null) as Record<string, T>, base, ...rest);\n"],"mappings":";;;;;;;AAMA,MAAaA,mBACXC,MACA,GAAGI,SAEHE,OAAOC,OAAOD,OAAOE,OAAO,IAAI,GAAwBR,MAAM,GAAGI,IAAI"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wire-media.d.ts","names":[],"sources":["../../src/utils/wire-media.ts"],"mappings":";;;;;;;;;;iBAYgB,sBACd,eACA;;;;;;;;
|
|
1
|
+
{"version":3,"file":"wire-media.d.ts","names":[],"sources":["../../src/utils/wire-media.ts"],"mappings":";;;;;;;;;;iBAYgB,sBACd,eACA;;;;;;;;iBA+Bc,qBACd,cACA;;;;;;;;;;;;;iBAiBc,eAAe,iBAAiB"}
|
package/dist/utils/wire-media.js
CHANGED
|
@@ -11,9 +11,9 @@ import { detectImageMediaType } from "./image-media-type.js";
|
|
|
11
11
|
* where a fallback is needed.
|
|
12
12
|
*/
|
|
13
13
|
function resolveImageMediaType(image, contentType) {
|
|
14
|
-
if (contentType?.startsWith("image/")) return contentType;
|
|
14
|
+
if (contentType?.startsWith("image/") && !contentType.includes("*")) return contentType;
|
|
15
15
|
const declared = dataUrlMediaType(image);
|
|
16
|
-
if (declared?.startsWith("image/")) return declared;
|
|
16
|
+
if (declared?.startsWith("image/") && !declared.includes("*")) return declared;
|
|
17
17
|
const payload = parseDataUrl(image)?.data ?? (isParsableUrl(image) ? void 0 : image);
|
|
18
18
|
if (payload !== void 0) {
|
|
19
19
|
const sniffed = detectImageMediaType(payload);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wire-media.js","names":["dataUrlMediaType","isParsableUrl","parseDataUrl","detectImageMediaType","resolveImageMediaType","image","contentType","startsWith","declared","parsed","payload","data","undefined","sniffed","resolveFileMediaType","mimeType","toMediaWireUrl","mediaType"],"sources":["../../src/utils/wire-media.ts"],"sourcesContent":["import { dataUrlMediaType, isParsableUrl, parseDataUrl } from \"./data-url\";\nimport { detectImageMediaType } from \"./image-media-type\";\n\n/**\n * The media type to declare for an `ImageMessagePart`, which carries none of\n * its own: an attachment's content type, then the payload's data URL\n * declaration, then its leading bytes, then `image/png`.\n *\n * The floor cannot be a wildcard. `image/*` is rejected outright by the AI SDK\n * for a url source and whenever inline bytes fail to sniff, so it fails exactly\n * where a fallback is needed.\n */\nexport function resolveImageMediaType(\n image: string,\n contentType?: string | undefined,\n): string {\n if (contentType?.startsWith(\"image/\")) return contentType;\n\n const declared = dataUrlMediaType(image);\n if (declared?.startsWith(\"image/\")) return declared;\n\n // Read through a data URL envelope too, so a generic one such as\n // `application/octet-stream` does not mask the format. A url of any other\n // scheme has no local bytes to read.\n const parsed = parseDataUrl(image);\n const payload = parsed?.data ?? (isParsableUrl(image) ? undefined : image);\n if (payload !== undefined) {\n const sniffed = detectImageMediaType(payload);\n if (sniffed) return sniffed;\n }\n\n return \"image/png\";\n}\n\n/**\n * The media type to declare for a `FileMessagePart`: its own `mimeType`, then\n * the payload's data URL declaration, then `application/octet-stream`.\n *\n * `mimeType` is a plain string, and an adapter reading `file.type` on a file\n * the OS cannot type yields `\"\"`, so the declared value is not always present.\n */\nexport function resolveFileMediaType(\n data: string,\n mimeType?: string | undefined,\n): string {\n return mimeType || dataUrlMediaType(data) || \"application/octet-stream\";\n}\n\n/**\n * A payload placed into a wire field that is contractually a url.\n *\n * Two hazards drive this. A consumer may hand the value to an unguarded\n * `new URL()`, so a payload that is not a url has to be wrapped; and a data\n * URL's own media type wins over a separately declared one downstream, so a\n * base64 envelope that disagrees with `mediaType` is rebuilt around the same\n * bytes. Everything else passes through byte for byte: an envelope that agrees,\n * a url of any other scheme, and a percent-encoded data URL, whose declaration\n * cannot be corrected without transcoding the payload and is authoritative for\n * the bytes it carries anyway.\n */\nexport function toMediaWireUrl(payload: string, mediaType: string): string {\n const parsed = parseDataUrl(payload);\n if (parsed) {\n return parsed.mimeType === mediaType\n ? payload\n : `data:${mediaType};base64,${parsed.data}`;\n }\n if (isParsableUrl(payload)) return payload;\n return `data:${mediaType};base64,${payload}`;\n}\n"],"mappings":";;;;;;;;;;;;AAYA,SAAgBI,sBACdC,OACAC,aACQ;CACR,IAAIA,aAAaC,WAAW,QAAQ,GAAG,
|
|
1
|
+
{"version":3,"file":"wire-media.js","names":["dataUrlMediaType","isParsableUrl","parseDataUrl","detectImageMediaType","resolveImageMediaType","image","contentType","startsWith","includes","declared","parsed","payload","data","undefined","sniffed","resolveFileMediaType","mimeType","toMediaWireUrl","mediaType"],"sources":["../../src/utils/wire-media.ts"],"sourcesContent":["import { dataUrlMediaType, isParsableUrl, parseDataUrl } from \"./data-url\";\nimport { detectImageMediaType } from \"./image-media-type\";\n\n/**\n * The media type to declare for an `ImageMessagePart`, which carries none of\n * its own: an attachment's content type, then the payload's data URL\n * declaration, then its leading bytes, then `image/png`.\n *\n * The floor cannot be a wildcard. `image/*` is rejected outright by the AI SDK\n * for a url source and whenever inline bytes fail to sniff, so it fails exactly\n * where a fallback is needed.\n */\nexport function resolveImageMediaType(\n image: string,\n contentType?: string | undefined,\n): string {\n if (contentType?.startsWith(\"image/\") && !contentType.includes(\"*\")) {\n return contentType;\n }\n\n const declared = dataUrlMediaType(image);\n if (declared?.startsWith(\"image/\") && !declared.includes(\"*\")) {\n return declared;\n }\n\n // Read through a data URL envelope too, so a generic one such as\n // `application/octet-stream` does not mask the format. A url of any other\n // scheme has no local bytes to read.\n const parsed = parseDataUrl(image);\n const payload = parsed?.data ?? (isParsableUrl(image) ? undefined : image);\n if (payload !== undefined) {\n const sniffed = detectImageMediaType(payload);\n if (sniffed) return sniffed;\n }\n\n return \"image/png\";\n}\n\n/**\n * The media type to declare for a `FileMessagePart`: its own `mimeType`, then\n * the payload's data URL declaration, then `application/octet-stream`.\n *\n * `mimeType` is a plain string, and an adapter reading `file.type` on a file\n * the OS cannot type yields `\"\"`, so the declared value is not always present.\n */\nexport function resolveFileMediaType(\n data: string,\n mimeType?: string | undefined,\n): string {\n return mimeType || dataUrlMediaType(data) || \"application/octet-stream\";\n}\n\n/**\n * A payload placed into a wire field that is contractually a url.\n *\n * Two hazards drive this. A consumer may hand the value to an unguarded\n * `new URL()`, so a payload that is not a url has to be wrapped; and a data\n * URL's own media type wins over a separately declared one downstream, so a\n * base64 envelope that disagrees with `mediaType` is rebuilt around the same\n * bytes. Everything else passes through byte for byte: an envelope that agrees,\n * a url of any other scheme, and a percent-encoded data URL, whose declaration\n * cannot be corrected without transcoding the payload and is authoritative for\n * the bytes it carries anyway.\n */\nexport function toMediaWireUrl(payload: string, mediaType: string): string {\n const parsed = parseDataUrl(payload);\n if (parsed) {\n return parsed.mimeType === mediaType\n ? payload\n : `data:${mediaType};base64,${parsed.data}`;\n }\n if (isParsableUrl(payload)) return payload;\n return `data:${mediaType};base64,${payload}`;\n}\n"],"mappings":";;;;;;;;;;;;AAYA,SAAgBI,sBACdC,OACAC,aACQ;CACR,IAAIA,aAAaC,WAAW,QAAQ,KAAK,CAACD,YAAYE,SAAS,GAAG,GAChE,OAAOF;CAGT,MAAMG,WAAWT,iBAAiBK,KAAK;CACvC,IAAII,UAAUF,WAAW,QAAQ,KAAK,CAACE,SAASD,SAAS,GAAG,GAC1D,OAAOC;CAOT,MAAME,UADST,aAAaG,KACZK,CAAM,EAAEE,SAASX,cAAcI,KAAK,IAAIQ,KAAAA,IAAYR;CACpE,IAAIM,YAAYE,KAAAA,GAAW;EACzB,MAAMC,UAAUX,qBAAqBQ,OAAO;EAC5C,IAAIG,SAAS,OAAOA;CACtB;CAEA,OAAO;AACT;;;;;;;;AASA,SAAgBC,qBACdH,MACAI,UACQ;CACR,OAAOA,YAAYhB,iBAAiBY,IAAI,KAAK;AAC/C;;;;;;;;;;;;;AAcA,SAAgBK,eAAeN,SAAiBO,WAA2B;CACzE,MAAMR,SAASR,aAAaS,OAAO;CACnC,IAAID,QACF,OAAOA,OAAOM,aAAaE,YACvBP,UACA,QAAQO,UAAS,UAAWR,OAAOE;CAEzC,IAAIX,cAAcU,OAAO,GAAG,OAAOA;CACnC,OAAO,QAAQO,UAAS,UAAWP;AACrC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@assistant-ui/core",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.19",
|
|
4
4
|
"description": "Framework-agnostic core runtime for assistant-ui",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"assistant",
|
|
@@ -59,18 +59,18 @@
|
|
|
59
59
|
],
|
|
60
60
|
"sideEffects": false,
|
|
61
61
|
"dependencies": {
|
|
62
|
-
"assistant-stream": "^0.3.
|
|
62
|
+
"assistant-stream": "^0.3.43",
|
|
63
63
|
"nanoid": "^6.0.1"
|
|
64
64
|
},
|
|
65
65
|
"optionalDevDependencies": {
|
|
66
66
|
"@assistant-ui/x-generative-compiler": ">=0.0.3"
|
|
67
67
|
},
|
|
68
68
|
"peerDependencies": {
|
|
69
|
-
"@assistant-ui/store": "^0.3.
|
|
70
|
-
"@assistant-ui/tap": "^0.9.
|
|
69
|
+
"@assistant-ui/store": "^0.3.13",
|
|
70
|
+
"@assistant-ui/tap": "^0.9.17",
|
|
71
71
|
"@types/react": "*",
|
|
72
72
|
"react": "^18 || ^19",
|
|
73
|
-
"assistant-cloud": "^0.1
|
|
73
|
+
"assistant-cloud": "^0.2.1"
|
|
74
74
|
},
|
|
75
75
|
"peerDependenciesMeta": {
|
|
76
76
|
"@types/react": {
|
|
@@ -84,17 +84,17 @@
|
|
|
84
84
|
}
|
|
85
85
|
},
|
|
86
86
|
"devDependencies": {
|
|
87
|
-
"@assistant-ui/store": "0.3.
|
|
88
|
-
"@assistant-ui/tap": "0.9.
|
|
89
|
-
"@assistant-ui/vite": "0.0.
|
|
90
|
-
"@assistant-ui/x-buildutils": "0.0.
|
|
87
|
+
"@assistant-ui/store": "0.3.13",
|
|
88
|
+
"@assistant-ui/tap": "0.9.17",
|
|
89
|
+
"@assistant-ui/vite": "0.0.17",
|
|
90
|
+
"@assistant-ui/x-buildutils": "0.0.27",
|
|
91
91
|
"@testing-library/react": "^16.3.3",
|
|
92
92
|
"@types/react": "^19.2.18",
|
|
93
|
-
"assistant-cloud": "0.1
|
|
93
|
+
"assistant-cloud": "0.2.1",
|
|
94
94
|
"jsdom": "^30.0.1",
|
|
95
95
|
"react": "^19.2.8",
|
|
96
96
|
"react-dom": "^19.2.8",
|
|
97
|
-
"vitest": "^
|
|
97
|
+
"vitest": "^5.0.0"
|
|
98
98
|
},
|
|
99
99
|
"publishConfig": {
|
|
100
100
|
"access": "public",
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { afterEach, describe, expect, it } from "vitest";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
type AttachmentAdapter,
|
|
4
|
+
CompositeAttachmentAdapter,
|
|
5
|
+
getFileDataURL,
|
|
6
|
+
SimpleImageAttachmentAdapter,
|
|
7
|
+
} from "./attachment";
|
|
3
8
|
|
|
4
9
|
const originalFileReader = globalThis.FileReader;
|
|
5
10
|
const originalBuffer = globalThis.Buffer;
|
|
@@ -105,3 +110,47 @@ describe("SimpleImageAttachmentAdapter", () => {
|
|
|
105
110
|
);
|
|
106
111
|
});
|
|
107
112
|
});
|
|
113
|
+
|
|
114
|
+
describe("CompositeAttachmentAdapter", () => {
|
|
115
|
+
it.each(["pending", "complete"])(
|
|
116
|
+
"removes a %s attachment through its matching adapter",
|
|
117
|
+
async (status) => {
|
|
118
|
+
const removed: string[] = [];
|
|
119
|
+
const imageAdapter = {
|
|
120
|
+
accept: "image/*",
|
|
121
|
+
async add({ file }) {
|
|
122
|
+
return {
|
|
123
|
+
id: "image-1",
|
|
124
|
+
type: "image",
|
|
125
|
+
name: file.name,
|
|
126
|
+
file,
|
|
127
|
+
status: { type: "requires-action", reason: "composer-send" },
|
|
128
|
+
};
|
|
129
|
+
},
|
|
130
|
+
async send(attachment) {
|
|
131
|
+
return {
|
|
132
|
+
id: attachment.id,
|
|
133
|
+
type: attachment.type,
|
|
134
|
+
name: attachment.name,
|
|
135
|
+
contentType: attachment.file.type,
|
|
136
|
+
status: { type: "complete" },
|
|
137
|
+
content: [],
|
|
138
|
+
};
|
|
139
|
+
},
|
|
140
|
+
async remove(attachment) {
|
|
141
|
+
removed.push(attachment.id);
|
|
142
|
+
},
|
|
143
|
+
} satisfies AttachmentAdapter;
|
|
144
|
+
const composite = new CompositeAttachmentAdapter([imageAdapter]);
|
|
145
|
+
const pending = await imageAdapter.add({
|
|
146
|
+
file: new File(["image bytes"], "photo.png", { type: "image/png" }),
|
|
147
|
+
});
|
|
148
|
+
const attachment =
|
|
149
|
+
status === "pending" ? pending : await composite.send(pending);
|
|
150
|
+
|
|
151
|
+
await composite.remove(attachment);
|
|
152
|
+
|
|
153
|
+
expect(removed).toEqual(["image-1"]);
|
|
154
|
+
},
|
|
155
|
+
);
|
|
156
|
+
});
|
|
@@ -142,11 +142,11 @@ export function fileMatchesAccept(
|
|
|
142
142
|
.split(",")
|
|
143
143
|
.map((type) => type.trim().toLowerCase());
|
|
144
144
|
|
|
145
|
-
const
|
|
145
|
+
const fileName = file.name.toLowerCase();
|
|
146
146
|
const fileMimeType = file.type.split(";", 1)[0]!.trim().toLowerCase();
|
|
147
147
|
|
|
148
148
|
for (const type of allowedTypes) {
|
|
149
|
-
if (type.startsWith(".") && type
|
|
149
|
+
if (type.startsWith(".") && fileName.endsWith(type)) {
|
|
150
150
|
return true;
|
|
151
151
|
}
|
|
152
152
|
|
|
@@ -170,7 +170,10 @@ export function attachmentsEqual(
|
|
|
170
170
|
b: readonly CompleteAttachment[],
|
|
171
171
|
): boolean {
|
|
172
172
|
if (a.length !== b.length) return false;
|
|
173
|
-
|
|
173
|
+
for (let i = 0; i < a.length; i++) {
|
|
174
|
+
if (a[i]?.id !== b[i]?.id) return false;
|
|
175
|
+
}
|
|
176
|
+
return true;
|
|
174
177
|
}
|
|
175
178
|
|
|
176
179
|
export function partToCompleteAttachment(
|
|
@@ -276,7 +279,7 @@ export class CompositeAttachmentAdapter implements AttachmentAdapter {
|
|
|
276
279
|
for (const adapter of adapters) {
|
|
277
280
|
if (
|
|
278
281
|
fileMatchesAccept(
|
|
279
|
-
{
|
|
282
|
+
attachment.file ?? {
|
|
280
283
|
name: attachment.name,
|
|
281
284
|
type: attachment.contentType ?? "",
|
|
282
285
|
},
|