@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":"Interactables.js","names":["useState","useEffect","useCallback","useRef","useMemo","resource","useAssistantClientRef","ClientOutput","attachTransformScopes","useAssistantScopeEffect","InteractablesState","InteractableRegistration","InteractableStateSchema","InteractablePersistedState","InteractablePersistenceAdapter","toJSONSchema","toPartialJSONSchema","ModelContext","buildInteractableModelContext","notifySubscribers","notifyStateSubscribers","useInteractablePersistenceQueue","useInteractables","state","setState","definitions","persistence","clientRef","stateRef","setStateAndRef","updater","prev","next","current","subscribersRef","Set","partialSchemaCacheRef","Map","detachedStateRef","adapterRef","undefined","exportState","result","id","def","Object","entries","name","updatePersistenceStatus","flushIfPending","schedulePersistence","flush","snapshot","importState","saved","entry","set","changed","setPersistenceAdapter","adapter","setDefState","existing","setDefSelected","selected","provider","getModelContext","defs","subscribe","callback","add","delete","modelContext","register","jsonSchema","stateSchema","e","console","warn","detached","get","description","initialState","_","rest","__","restPersistence","getState","setSelected","Interactables","scopes","parent","source"],"sources":["../../../src/react/interactables-legacy/Interactables.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useRef, useMemo } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport {\n useAssistantClientRef,\n type ClientOutput,\n attachTransformScopes,\n} from \"@assistant-ui/store\";\nimport { useAssistantScopeEffect } from \"@assistant-ui/store/client\";\nimport type {\n InteractablesState,\n InteractableRegistration,\n InteractableStateSchema,\n InteractablePersistedState,\n InteractablePersistenceAdapter,\n} from \"./scopes\";\nimport { toJSONSchema, toPartialJSONSchema } from \"assistant-stream\";\nimport { ModelContext } from \"../../store\";\nimport { buildInteractableModelContext } from \"./interactable-model-context\";\nimport { notifySubscribers as notifyStateSubscribers } from \"../../subscribable/subscribable\";\nimport { useInteractablePersistenceQueue } from \"../interactables-shared/useInteractablePersistenceQueue\";\n\nconst useInteractables = (): ClientOutput<\"interactables\"> => {\n const [state, setState] = useState<InteractablesState>(() => ({\n definitions: {},\n persistence: {},\n }));\n\n const clientRef = useAssistantClientRef();\n\n const stateRef = useRef(state);\n\n const setStateAndRef = useCallback(\n (updater: (prev: InteractablesState) => InteractablesState) => {\n const next = updater(stateRef.current);\n stateRef.current = next;\n setState(next);\n },\n [],\n );\n\n const subscribersRef = useRef(new Set<() => void>());\n const partialSchemaCacheRef = useRef(\n new Map<string, InteractableStateSchema>(),\n );\n const detachedStateRef = useRef(new Map<string, unknown>());\n\n const adapterRef = useRef<InteractablePersistenceAdapter | undefined>(\n undefined,\n );\n\n const exportState = useCallback((): InteractablePersistedState => {\n const result: InteractablePersistedState = {};\n for (const [id, def] of Object.entries(stateRef.current.definitions)) {\n result[id] = { name: def.name, state: def.state };\n }\n return result;\n }, []);\n\n const updatePersistenceStatus = useCallback(\n (\n updater: (\n prev: InteractablesState[\"persistence\"],\n ) => InteractablesState[\"persistence\"],\n ) => {\n setStateAndRef((prev) => {\n const persistence = updater(prev.persistence);\n return persistence === prev.persistence\n ? prev\n : { ...prev, persistence };\n });\n },\n [setStateAndRef],\n );\n\n const { flushIfPending, schedulePersistence, flush } =\n useInteractablePersistenceQueue({\n adapterRef,\n snapshot: exportState,\n updatePersistenceStatus,\n });\n\n const importState = useCallback(\n (saved: InteractablePersistedState) => {\n for (const [id, entry] of Object.entries(saved)) {\n detachedStateRef.current.set(id, entry.state);\n }\n setStateAndRef((prev) => {\n let changed = false;\n const definitions = { ...prev.definitions };\n for (const [id, entry] of Object.entries(saved)) {\n if (definitions[id]) {\n definitions[id] = { ...definitions[id], state: entry.state };\n changed = true;\n }\n }\n return changed ? { ...prev, definitions } : prev;\n });\n },\n [setStateAndRef],\n );\n\n const setPersistenceAdapter = useCallback(\n (adapter: InteractablePersistenceAdapter | undefined) => {\n if (adapterRef.current !== adapter) flushIfPending();\n adapterRef.current = adapter;\n },\n [flushIfPending],\n );\n\n const setDefState = useCallback(\n (id: string, updater: (prev: unknown) => unknown) => {\n setStateAndRef((prev) => {\n const existing = prev.definitions[id];\n if (!existing) return prev;\n return {\n ...prev,\n definitions: {\n ...prev.definitions,\n [id]: { ...existing, state: updater(existing.state) },\n },\n };\n });\n if (stateRef.current.definitions[id]) schedulePersistence(id);\n },\n [schedulePersistence, setStateAndRef],\n );\n\n const setDefSelected = useCallback(\n (id: string, selected: boolean) => {\n setStateAndRef((prev) => {\n const existing = prev.definitions[id];\n if (!existing) return prev;\n return {\n ...prev,\n definitions: {\n ...prev.definitions,\n [id]: { ...existing, selected },\n },\n };\n });\n },\n [setStateAndRef],\n );\n\n const provider = useMemo(\n () => ({\n getModelContext: () => {\n const defs = stateRef.current.definitions;\n return (\n buildInteractableModelContext(\n defs,\n partialSchemaCacheRef.current,\n setDefState,\n ) ?? {}\n );\n },\n subscribe: (callback: () => void) => {\n subscribersRef.current.add(callback);\n return () => {\n subscribersRef.current.delete(callback);\n };\n },\n }),\n [setDefState],\n );\n\n useEffect(() => {\n notifyStateSubscribers(subscribersRef.current);\n }, [state]);\n\n useAssistantScopeEffect(\n \"modelContext\",\n () => clientRef.current!.modelContext().register(provider),\n [provider],\n );\n\n const register = useCallback(\n (def: InteractableRegistration) => {\n try {\n const jsonSchema = toJSONSchema(def.stateSchema);\n partialSchemaCacheRef.current.set(\n def.id,\n toPartialJSONSchema(jsonSchema),\n );\n } catch (e) {\n console.warn(\n `[Interactables] Failed to create partial schema for \"${def.name}\". The update tool will require all fields.`,\n e,\n );\n }\n\n const detached = detachedStateRef.current.get(def.id);\n detachedStateRef.current.delete(def.id);\n\n setStateAndRef((prev) => ({\n ...prev,\n definitions: {\n ...prev.definitions,\n [def.id]: {\n id: def.id,\n name: def.name,\n description: def.description,\n stateSchema: def.stateSchema,\n state:\n prev.definitions[def.id]?.state ?? detached ?? def.initialState,\n selected: def.selected,\n },\n },\n }));\n\n return () => {\n flushIfPending();\n setStateAndRef((prev) => {\n const existing = prev.definitions[def.id];\n if (existing) {\n detachedStateRef.current.set(def.id, existing.state);\n }\n partialSchemaCacheRef.current.delete(def.id);\n const { [def.id]: _, ...rest } = prev.definitions;\n const { [def.id]: __, ...restPersistence } = prev.persistence;\n return { ...prev, definitions: rest, persistence: restPersistence };\n });\n };\n },\n [flushIfPending, setStateAndRef],\n );\n\n return {\n getState: () => state,\n register,\n setState: setDefState,\n setSelected: setDefSelected,\n exportState,\n importState,\n setPersistenceAdapter,\n flush,\n };\n};\n\n/**\n * @deprecated Since 2026-06-14 — migrate to the Unstable / Experimental API.\n * Scheduled for removal on/after 2026-09-14. See\n * {@link https://www.assistant-ui.com/docs/tools/interactables#migrating-from-the-previous-api | Interactables migration guide}.\n */\nexport const Interactables = resource(useInteractables);\n\nattachTransformScopes(useInteractables, (scopes, parent) => {\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Interactables.js","names":["useState","useEffect","useCallback","useRef","useMemo","resource","useAssistantClientRef","ClientOutput","attachTransformScopes","useAssistantScopeEffect","InteractablesState","InteractableRegistration","InteractableStateSchema","InteractablePersistedState","InteractablePersistenceAdapter","toJSONSchema","toPartialJSONSchema","ModelContext","buildInteractableModelContext","notifySubscribers","notifyStateSubscribers","useInteractablePersistenceQueue","nullProtoRecord","useInteractables","$","_c","state","setState","_temp","clientRef","stateRef","t0","Symbol","for","updater","next","current","setStateAndRef","t1","Set","subscribersRef","t2","Map","partialSchemaCacheRef","t3","detachedStateRef","adapterRef","undefined","t4","result","id","def","Object","entries","definitions","name","exportState","t5","updater_0","prev","persistence","updatePersistenceStatus","t6","snapshot","flushIfPending","schedulePersistence","flush","t7","saved","id_0","entry","set","prev_0","changed","id_1","entry_0","importState","t8","adapter","setPersistenceAdapter","t9","id_2","updater_1","prev_1","existing","setDefState","t10","id_3","selected","prev_2","existing_0","setDefSelected","t11","defs","t12","callback","add","delete","t13","getModelContext","subscribe","provider","t14","t15","t16","modelContext","register","t17","t18","def_0","jsonSchema","stateSchema","t19","e","console","warn","detached","get","prev_3","description","initialState","prev_4","existing_1","definitions_0","persistence_0","t20","getState","setSelected","Interactables","scopes","parent","source"],"sources":["../../../src/react/interactables-legacy/Interactables.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useRef, useMemo } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport {\n useAssistantClientRef,\n type ClientOutput,\n attachTransformScopes,\n} from \"@assistant-ui/store\";\nimport { useAssistantScopeEffect } from \"@assistant-ui/store/client\";\nimport type {\n InteractablesState,\n InteractableRegistration,\n InteractableStateSchema,\n InteractablePersistedState,\n InteractablePersistenceAdapter,\n} from \"./scopes\";\nimport { toJSONSchema, toPartialJSONSchema } from \"assistant-stream\";\nimport { ModelContext } from \"../../store\";\nimport { buildInteractableModelContext } from \"./interactable-model-context\";\nimport { notifySubscribers as notifyStateSubscribers } from \"../../subscribable/subscribable\";\nimport { useInteractablePersistenceQueue } from \"../interactables-shared/useInteractablePersistenceQueue\";\nimport { nullProtoRecord } from \"../../utils/record\";\n\nconst useInteractables = (): ClientOutput<\"interactables\"> => {\n const [state, setState] = useState<InteractablesState>(() => ({\n definitions: nullProtoRecord(),\n persistence: nullProtoRecord(),\n }));\n\n const clientRef = useAssistantClientRef();\n\n const stateRef = useRef(state);\n\n const setStateAndRef = useCallback(\n (updater: (prev: InteractablesState) => InteractablesState) => {\n const next = updater(stateRef.current);\n stateRef.current = next;\n setState(next);\n },\n [],\n );\n\n const subscribersRef = useRef(new Set<() => void>());\n const partialSchemaCacheRef = useRef(\n new Map<string, InteractableStateSchema>(),\n );\n const detachedStateRef = useRef(new Map<string, unknown>());\n\n const adapterRef = useRef<InteractablePersistenceAdapter | undefined>(\n undefined,\n );\n\n const exportState = useCallback((): InteractablePersistedState => {\n const result = nullProtoRecord<InteractablePersistedState[string]>();\n for (const [id, def] of Object.entries(stateRef.current.definitions)) {\n result[id] = { name: def.name, state: def.state };\n }\n return result;\n }, []);\n\n const updatePersistenceStatus = useCallback(\n (\n updater: (\n prev: InteractablesState[\"persistence\"],\n ) => InteractablesState[\"persistence\"],\n ) => {\n setStateAndRef((prev) => {\n const persistence = updater(prev.persistence);\n return persistence === prev.persistence\n ? prev\n : { ...prev, persistence };\n });\n },\n [setStateAndRef],\n );\n\n const { flushIfPending, schedulePersistence, flush } =\n useInteractablePersistenceQueue({\n adapterRef,\n snapshot: exportState,\n updatePersistenceStatus,\n });\n\n const importState = useCallback(\n (saved: InteractablePersistedState) => {\n for (const [id, entry] of Object.entries(saved)) {\n detachedStateRef.current.set(id, entry.state);\n }\n setStateAndRef((prev) => {\n let changed = false;\n const definitions = nullProtoRecord(prev.definitions);\n for (const [id, entry] of Object.entries(saved)) {\n if (definitions[id]) {\n definitions[id] = { ...definitions[id], state: entry.state };\n changed = true;\n }\n }\n return changed ? { ...prev, definitions } : prev;\n });\n },\n [setStateAndRef],\n );\n\n const setPersistenceAdapter = useCallback(\n (adapter: InteractablePersistenceAdapter | undefined) => {\n if (adapterRef.current !== adapter) flushIfPending();\n adapterRef.current = adapter;\n },\n [flushIfPending],\n );\n\n const setDefState = useCallback(\n (id: string, updater: (prev: unknown) => unknown) => {\n setStateAndRef((prev) => {\n const existing = prev.definitions[id];\n if (!existing) return prev;\n return {\n ...prev,\n definitions: nullProtoRecord(prev.definitions, {\n [id]: { ...existing, state: updater(existing.state) },\n }),\n };\n });\n if (stateRef.current.definitions[id]) schedulePersistence(id);\n },\n [schedulePersistence, setStateAndRef],\n );\n\n const setDefSelected = useCallback(\n (id: string, selected: boolean) => {\n setStateAndRef((prev) => {\n const existing = prev.definitions[id];\n if (!existing) return prev;\n return {\n ...prev,\n definitions: nullProtoRecord(prev.definitions, {\n [id]: { ...existing, selected },\n }),\n };\n });\n },\n [setStateAndRef],\n );\n\n const provider = useMemo(\n () => ({\n getModelContext: () => {\n const defs = stateRef.current.definitions;\n return (\n buildInteractableModelContext(\n defs,\n partialSchemaCacheRef.current,\n setDefState,\n ) ?? {}\n );\n },\n subscribe: (callback: () => void) => {\n subscribersRef.current.add(callback);\n return () => {\n subscribersRef.current.delete(callback);\n };\n },\n }),\n [setDefState],\n );\n\n useEffect(() => {\n notifyStateSubscribers(subscribersRef.current);\n }, [state]);\n\n useAssistantScopeEffect(\n \"modelContext\",\n () => clientRef.current!.modelContext().register(provider),\n [provider],\n );\n\n const register = useCallback(\n (def: InteractableRegistration) => {\n try {\n const jsonSchema = toJSONSchema(def.stateSchema);\n partialSchemaCacheRef.current.set(\n def.id,\n toPartialJSONSchema(jsonSchema),\n );\n } catch (e) {\n console.warn(\n `[Interactables] Failed to create partial schema for \"${def.name}\". The update tool will require all fields.`,\n e,\n );\n }\n\n const detached = detachedStateRef.current.get(def.id);\n detachedStateRef.current.delete(def.id);\n\n setStateAndRef((prev) => ({\n ...prev,\n definitions: nullProtoRecord(prev.definitions, {\n [def.id]: {\n id: def.id,\n name: def.name,\n description: def.description,\n stateSchema: def.stateSchema,\n state:\n prev.definitions[def.id]?.state ?? detached ?? def.initialState,\n selected: def.selected,\n },\n }),\n }));\n\n return () => {\n flushIfPending();\n setStateAndRef((prev) => {\n const existing = prev.definitions[def.id];\n if (existing) {\n detachedStateRef.current.set(def.id, existing.state);\n }\n partialSchemaCacheRef.current.delete(def.id);\n const definitions = nullProtoRecord(prev.definitions);\n const persistence = nullProtoRecord(prev.persistence);\n delete definitions[def.id];\n delete persistence[def.id];\n return { ...prev, definitions, persistence };\n });\n };\n },\n [flushIfPending, setStateAndRef],\n );\n\n return {\n getState: () => state,\n register,\n setState: setDefState,\n setSelected: setDefSelected,\n exportState,\n importState,\n setPersistenceAdapter,\n flush,\n };\n};\n\n/**\n * @deprecated Since 2026-06-14 — migrate to the Unstable / Experimental API.\n * Scheduled for removal on/after 2026-09-14. See\n * {@link https://www.assistant-ui.com/docs/tools/interactables#migrating-from-the-previous-api | Interactables migration guide}.\n */\nexport const Interactables = resource(useInteractables);\n\nattachTransformScopes(useInteractables, (scopes, parent) => {\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n});\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAssistantInteractable.d.ts","names":[],"sources":["../../../src/react/interactables-legacy/useAssistantInteractable.ts"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"useAssistantInteractable.d.ts","names":[],"sources":["../../../src/react/interactables-legacy/useAssistantInteractable.ts"],"mappings":";;;;;;;KAUY;EACV;EACA,aAAa;EACb;EACA;EACA;;;;;;;;;;;;;;cAeW,2BACX,cACA,QAAQ"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { useJSONSchemaDependency } from "../utils/useJSONSchemaDependency.js";
|
|
1
2
|
import { useEffect, useId, useRef } from "@assistant-ui/tap/react-shim";
|
|
2
3
|
import { useAui } from "@assistant-ui/store";
|
|
3
4
|
//#region src/react/interactables-legacy/useAssistantInteractable.ts
|
|
@@ -19,6 +20,7 @@ const useAssistantInteractable = (name, config) => {
|
|
|
19
20
|
const id = config.id ?? autoId;
|
|
20
21
|
const stateSchemaRef = useRef(config.stateSchema);
|
|
21
22
|
stateSchemaRef.current = config.stateSchema;
|
|
23
|
+
const normalizedStateSchema = useJSONSchemaDependency(config.stateSchema);
|
|
22
24
|
const initialStateRef = useRef(config.initialState);
|
|
23
25
|
initialStateRef.current = config.initialState;
|
|
24
26
|
useEffect(() => {
|
|
@@ -35,6 +37,7 @@ const useAssistantInteractable = (name, config) => {
|
|
|
35
37
|
id,
|
|
36
38
|
name,
|
|
37
39
|
config.description,
|
|
40
|
+
normalizedStateSchema,
|
|
38
41
|
config.selected
|
|
39
42
|
]);
|
|
40
43
|
return id;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAssistantInteractable.js","names":["useEffect","useId","useRef","useAui","InteractableStateSchema","AssistantInteractableProps","description","stateSchema","initialState","id","selected","useAssistantInteractable","name","config","aui","autoId","replace","stateSchemaRef","current","initialStateRef","interactables","register"],"sources":["../../../src/react/interactables-legacy/useAssistantInteractable.ts"],"sourcesContent":["import { useEffect, useId, useRef } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type { InteractableStateSchema } from \"./scopes\";\n\n/**\n * @deprecated Since 2026-06-14 — migrate to the Unstable / Experimental API.\n * Scheduled for removal on/after 2026-09-14. See\n * {@link https://www.assistant-ui.com/docs/tools/interactables#migrating-from-the-previous-api | Interactables migration guide}.\n */\nexport type AssistantInteractableProps = {\n description: string;\n stateSchema: InteractableStateSchema;\n initialState: unknown;\n id?: string;\n selected?: boolean;\n};\n\n/**\n * @deprecated Since 2026-06-14 — migrate to the Unstable / Experimental API.\n * Scheduled for removal on/after 2026-09-14. See\n * {@link https://www.assistant-ui.com/docs/tools/interactables#migrating-from-the-previous-api | Interactables migration guide}.\n *\n * Registers an interactable with the AI assistant.\n *\n * This hook handles registration only. To read and write the interactable's\n * state, use {@link useInteractableState} with the returned id.\n *\n * @returns The interactable instance id.\n */\nexport const useAssistantInteractable = (\n name: string,\n config: AssistantInteractableProps,\n): string => {\n const aui = useAui();\n\n const autoId = useId().replace(/[^a-zA-Z0-9]/g, \"\");\n const id = config.id ?? autoId;\n\n const stateSchemaRef = useRef(config.stateSchema);\n stateSchemaRef.current = config.stateSchema;\n const initialStateRef = useRef(config.initialState);\n initialStateRef.current = config.initialState;\n\n useEffect(() => {\n return aui.interactables.register({\n id,\n name,\n description: config.description,\n stateSchema: stateSchemaRef.current,\n initialState: initialStateRef.current,\n selected: config.selected,\n });\n }, [aui
|
|
1
|
+
{"version":3,"file":"useAssistantInteractable.js","names":["useEffect","useId","useRef","useAui","useJSONSchemaDependency","InteractableStateSchema","AssistantInteractableProps","description","stateSchema","initialState","id","selected","useAssistantInteractable","name","config","aui","autoId","replace","stateSchemaRef","current","normalizedStateSchema","initialStateRef","interactables","register"],"sources":["../../../src/react/interactables-legacy/useAssistantInteractable.ts"],"sourcesContent":["import { useEffect, useId, useRef } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { useJSONSchemaDependency } from \"../utils/useJSONSchemaDependency\";\nimport type { InteractableStateSchema } from \"./scopes\";\n\n/**\n * @deprecated Since 2026-06-14 — migrate to the Unstable / Experimental API.\n * Scheduled for removal on/after 2026-09-14. See\n * {@link https://www.assistant-ui.com/docs/tools/interactables#migrating-from-the-previous-api | Interactables migration guide}.\n */\nexport type AssistantInteractableProps = {\n description: string;\n stateSchema: InteractableStateSchema;\n initialState: unknown;\n id?: string;\n selected?: boolean;\n};\n\n/**\n * @deprecated Since 2026-06-14 — migrate to the Unstable / Experimental API.\n * Scheduled for removal on/after 2026-09-14. See\n * {@link https://www.assistant-ui.com/docs/tools/interactables#migrating-from-the-previous-api | Interactables migration guide}.\n *\n * Registers an interactable with the AI assistant.\n *\n * This hook handles registration only. To read and write the interactable's\n * state, use {@link useInteractableState} with the returned id.\n *\n * @returns The interactable instance id.\n */\nexport const useAssistantInteractable = (\n name: string,\n config: AssistantInteractableProps,\n): string => {\n const aui = useAui();\n\n const autoId = useId().replace(/[^a-zA-Z0-9]/g, \"\");\n const id = config.id ?? autoId;\n\n const stateSchemaRef = useRef(config.stateSchema);\n stateSchemaRef.current = config.stateSchema;\n const normalizedStateSchema = useJSONSchemaDependency(config.stateSchema);\n const initialStateRef = useRef(config.initialState);\n initialStateRef.current = config.initialState;\n\n useEffect(() => {\n return aui.interactables.register({\n id,\n name,\n description: config.description,\n stateSchema: stateSchemaRef.current,\n initialState: initialStateRef.current,\n selected: config.selected,\n });\n }, [\n aui,\n id,\n name,\n config.description,\n normalizedStateSchema,\n config.selected,\n ]);\n\n return id;\n};\n"],"mappings":";;;;;;;;;;;;;;;;AA8BA,MAAaY,4BACXC,MACAC,WACW;CACX,MAAMC,MAAMZ,OAAO;CAEnB,MAAMa,SAASf,MAAM,CAAC,CAACgB,QAAQ,iBAAiB,EAAE;CAClD,MAAMP,KAAKI,OAAOJ,MAAMM;CAExB,MAAME,iBAAiBhB,OAAOY,OAAON,WAAW;CAChDU,eAAeC,UAAUL,OAAON;CAChC,MAAMY,wBAAwBhB,wBAAwBU,OAAON,WAAW;CACxE,MAAMa,kBAAkBnB,OAAOY,OAAOL,YAAY;CAClDY,gBAAgBF,UAAUL,OAAOL;CAEjCT,gBAAgB;EACd,OAAOe,IAAIO,cAAcC,SAAS;GAChCb;GACAG;GACAN,aAAaO,OAAOP;GACpBC,aAAaU,eAAeC;GAC5BV,cAAcY,gBAAgBF;GAC9BR,UAAUG,OAAOH;EACnB,CAAC;CACH,GAAG;EACDI;EACAL;EACAG;EACAC,OAAOP;EACPa;EACAN,OAAOH;CAAQ,CAChB;CAED,OAAOD;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInteractablePersistenceQueue.d.ts","names":[],"sources":["../../../src/react/interactables-shared/useInteractablePersistenceQueue.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"useInteractablePersistenceQueue.d.ts","names":[],"sources":["../../../src/react/interactables-shared/useInteractablePersistenceQueue.ts"],"mappings":";;KAKK,mBAAmB;EACtB,KAAK,OAAO,eAAe;;KAGxB;EACH;EACA;;KAGG,uBAAuB,eAAe;KAEtC,4BACH,UAAU,MAAM,yBAAyB;KAGtC,uCAAuC;EAC1C,YAAY,UAAU,mBAAmB;EACzC,gBAAgB;EAChB,yBAAyB;;cAGd,kCAAmC,SAAO,YAAA,UAAA,2BAIpD,uCAAuC;;EAuIjC,sBAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { nullProtoRecord } from "../../utils/record.js";
|
|
1
2
|
import { useCallback, useRef } from "@assistant-ui/tap/react-shim";
|
|
2
3
|
//#region src/react/interactables-shared/useInteractablePersistenceQueue.ts
|
|
3
4
|
const PERSISTENCE_DEBOUNCE_MS = 500;
|
|
@@ -40,13 +41,14 @@ const useInteractablePersistenceQueue = ({ adapterRef, snapshot, updatePersisten
|
|
|
40
41
|
}
|
|
41
42
|
const { adapter: adapter_1, payload, dirtyIds: dirtyIds_0, seq: seq_0 } = resolved;
|
|
42
43
|
inFlightPersistenceRef.current += 1;
|
|
43
|
-
updatePersistenceStatus((prev) =>
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
updatePersistenceStatus((prev) => {
|
|
45
|
+
const persistence = nullProtoRecord(prev);
|
|
46
|
+
for (const id_0 of dirtyIds_0) persistence[id_0] = {
|
|
46
47
|
isPending: true,
|
|
47
48
|
error: void 0
|
|
48
|
-
}
|
|
49
|
-
|
|
49
|
+
};
|
|
50
|
+
return persistence;
|
|
51
|
+
});
|
|
50
52
|
const settleBatch = (status) => {
|
|
51
53
|
const settledIds = [];
|
|
52
54
|
for (const id_1 of dirtyIds_0) {
|
|
@@ -57,14 +59,14 @@ const useInteractablePersistenceQueue = ({ adapterRef, snapshot, updatePersisten
|
|
|
57
59
|
if (settledIds.length === 0) return;
|
|
58
60
|
updatePersistenceStatus((prev_0) => {
|
|
59
61
|
let changed = false;
|
|
60
|
-
const
|
|
62
|
+
const persistence_0 = nullProtoRecord(prev_0);
|
|
61
63
|
for (const id_2 of settledIds) {
|
|
62
64
|
if (prev_0[id_2] === void 0) continue;
|
|
63
|
-
if (status === void 0) delete
|
|
64
|
-
else
|
|
65
|
+
if (status === void 0) delete persistence_0[id_2];
|
|
66
|
+
else persistence_0[id_2] = status;
|
|
65
67
|
changed = true;
|
|
66
68
|
}
|
|
67
|
-
return changed ?
|
|
69
|
+
return changed ? persistence_0 : prev_0;
|
|
68
70
|
});
|
|
69
71
|
};
|
|
70
72
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInteractablePersistenceQueue.js","names":["useCallback","useRef","RefObject","PERSISTENCE_DEBOUNCE_MS","PersistenceAdapter","save","state","State","Promise","PersistenceStatus","isPending","error","PersistenceStatusMap","Record","PersistenceStatusUpdater","updater","prev","UseInteractablePersistenceQueueOptions","adapterRef","snapshot","updatePersistenceStatus","useInteractablePersistenceQueue","debounceTimerRef","ReturnType","setTimeout","undefined","syncSeqRef","latestSyncSeqByIdRef","Map","inFlightPersistenceRef","flushResolversRef","Array","dirtyIdsRef","Set","PersistenceBatch","adapter","payload","dirtyIds","seq","outgoingQueueRef","runPersistenceRef","batch","takeDirtyBatch","current","size","clear","id","set","enqueuePersistence","push","runPersistence","resolved","resolve","Object","fromEntries","map","settleBatch","status","settledIds","get","has","delete","length","changed","persistence","e","next","shift","clearTimeout","nextBatch","flushIfPending","schedulePersistence","add","flush","hasWork","p"],"sources":["../../../src/react/interactables-shared/useInteractablePersistenceQueue.ts"],"sourcesContent":["import { useCallback, useRef, type RefObject } from \"react\";\n\nconst PERSISTENCE_DEBOUNCE_MS = 500;\n\ntype PersistenceAdapter<State> = {\n save(state: State): void | Promise<void>;\n};\n\ntype PersistenceStatus = {\n isPending: boolean;\n error: unknown;\n};\n\ntype PersistenceStatusMap = Record<string, PersistenceStatus>;\n\ntype PersistenceStatusUpdater = (\n updater: (prev: PersistenceStatusMap) => PersistenceStatusMap,\n) => void;\n\ntype UseInteractablePersistenceQueueOptions<State> = {\n adapterRef: RefObject<PersistenceAdapter<State> | undefined>;\n snapshot: () => State;\n updatePersistenceStatus: PersistenceStatusUpdater;\n};\n\nexport const useInteractablePersistenceQueue = <State>({\n adapterRef,\n snapshot,\n updatePersistenceStatus,\n}: UseInteractablePersistenceQueueOptions<State>) => {\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(\n undefined,\n );\n const syncSeqRef = useRef(0);\n const latestSyncSeqByIdRef = useRef(new Map<string, number>());\n const inFlightPersistenceRef = useRef(0);\n const flushResolversRef = useRef<Array<() => void>>([]);\n const dirtyIdsRef = useRef(new Set<string>());\n\n type PersistenceBatch = {\n adapter: PersistenceAdapter<State>;\n payload: State;\n dirtyIds: Set<string>;\n seq: number;\n };\n\n const outgoingQueueRef = useRef<PersistenceBatch[]>([]);\n const runPersistenceRef = useRef<(batch?: PersistenceBatch) => void>(\n () => {},\n );\n\n const takeDirtyBatch = useCallback(\n (adapter: PersistenceAdapter<State>): PersistenceBatch | undefined => {\n if (dirtyIdsRef.current.size === 0) return;\n const dirtyIds = new Set(dirtyIdsRef.current);\n dirtyIdsRef.current.clear();\n const seq = ++syncSeqRef.current;\n for (const id of dirtyIds) latestSyncSeqByIdRef.current.set(id, seq);\n return { adapter, payload: snapshot(), dirtyIds, seq };\n },\n [snapshot],\n );\n\n const enqueuePersistence = useCallback(\n (adapter: PersistenceAdapter<State>) => {\n const batch = takeDirtyBatch(adapter);\n if (!batch) return;\n if (inFlightPersistenceRef.current === 0) {\n runPersistenceRef.current(batch);\n } else {\n outgoingQueueRef.current.push(batch);\n }\n },\n [takeDirtyBatch],\n );\n\n const runPersistence = useCallback(\n async (batch?: PersistenceBatch) => {\n const resolved =\n batch ??\n (adapterRef.current ? takeDirtyBatch(adapterRef.current) : undefined);\n if (!resolved) {\n if (inFlightPersistenceRef.current === 0) {\n for (const resolve of flushResolversRef.current) resolve();\n flushResolversRef.current = [];\n }\n return;\n }\n\n const { adapter, payload, dirtyIds, seq } = resolved;\n inFlightPersistenceRef.current += 1;\n\n updatePersistenceStatus((prev) => ({\n ...prev,\n ...Object.fromEntries(\n [...dirtyIds].map((id) => [\n id,\n { isPending: true, error: undefined },\n ]),\n ),\n }));\n\n const settleBatch = (status: PersistenceStatus | undefined) => {\n const settledIds: string[] = [];\n for (const id of dirtyIds) {\n if (\n latestSyncSeqByIdRef.current.get(id) !== seq ||\n dirtyIdsRef.current.has(id)\n )\n continue;\n latestSyncSeqByIdRef.current.delete(id);\n settledIds.push(id);\n }\n if (settledIds.length === 0) return;\n updatePersistenceStatus((prev) => {\n let changed = false;\n const persistence = { ...prev };\n for (const id of settledIds) {\n if (prev[id] === undefined) continue;\n if (status === undefined) delete persistence[id];\n else persistence[id] = status;\n changed = true;\n }\n return changed ? persistence : prev;\n });\n };\n\n try {\n await adapter.save(payload);\n settleBatch(undefined);\n } catch (e) {\n settleBatch({ isPending: false, error: e });\n } finally {\n inFlightPersistenceRef.current -= 1;\n const next =\n outgoingQueueRef.current.shift() ??\n (adapterRef.current && dirtyIdsRef.current.size > 0\n ? takeDirtyBatch(adapterRef.current)\n : undefined);\n if (next) {\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n runPersistenceRef.current(next);\n } else if (inFlightPersistenceRef.current === 0) {\n for (const resolve of flushResolversRef.current) resolve();\n flushResolversRef.current = [];\n }\n }\n },\n [adapterRef, takeDirtyBatch, updatePersistenceStatus],\n );\n runPersistenceRef.current = (nextBatch) => {\n void runPersistence(nextBatch);\n };\n\n const flushIfPending = useCallback(() => {\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n if (adapterRef.current) enqueuePersistence(adapterRef.current);\n }, [adapterRef, enqueuePersistence]);\n\n const schedulePersistence = useCallback(\n (id: string) => {\n if (!adapterRef.current) return;\n dirtyIdsRef.current.add(id);\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n }\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = undefined;\n if (inFlightPersistenceRef.current === 0 && adapterRef.current) {\n enqueuePersistence(adapterRef.current);\n } else {\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = undefined;\n if (adapterRef.current) enqueuePersistence(adapterRef.current);\n }, PERSISTENCE_DEBOUNCE_MS);\n }\n }, PERSISTENCE_DEBOUNCE_MS);\n },\n [adapterRef, enqueuePersistence],\n );\n\n const flush = useCallback(async () => {\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n const hasWork =\n inFlightPersistenceRef.current > 0 ||\n dirtyIdsRef.current.size > 0 ||\n outgoingQueueRef.current.length > 0;\n if (!hasWork) return;\n const p = new Promise<void>((resolve) => {\n flushResolversRef.current.push(resolve);\n });\n if (adapterRef.current) enqueuePersistence(adapterRef.current);\n return p;\n }, [adapterRef, enqueuePersistence]);\n\n return { flushIfPending, schedulePersistence, flush };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useInteractablePersistenceQueue.js","names":["useCallback","useRef","RefObject","nullProtoRecord","PERSISTENCE_DEBOUNCE_MS","PersistenceAdapter","save","state","State","Promise","PersistenceStatus","isPending","error","PersistenceStatusMap","Record","PersistenceStatusUpdater","updater","prev","UseInteractablePersistenceQueueOptions","adapterRef","snapshot","updatePersistenceStatus","useInteractablePersistenceQueue","debounceTimerRef","ReturnType","setTimeout","undefined","syncSeqRef","latestSyncSeqByIdRef","Map","inFlightPersistenceRef","flushResolversRef","Array","dirtyIdsRef","Set","PersistenceBatch","adapter","payload","dirtyIds","seq","outgoingQueueRef","runPersistenceRef","batch","takeDirtyBatch","current","size","clear","id","set","enqueuePersistence","push","runPersistence","resolved","resolve","persistence","settleBatch","status","settledIds","get","has","delete","length","changed","e","next","shift","clearTimeout","nextBatch","flushIfPending","schedulePersistence","add","flush","hasWork","p"],"sources":["../../../src/react/interactables-shared/useInteractablePersistenceQueue.ts"],"sourcesContent":["import { useCallback, useRef, type RefObject } from \"react\";\nimport { nullProtoRecord } from \"../../utils/record\";\n\nconst PERSISTENCE_DEBOUNCE_MS = 500;\n\ntype PersistenceAdapter<State> = {\n save(state: State): void | Promise<void>;\n};\n\ntype PersistenceStatus = {\n isPending: boolean;\n error: unknown;\n};\n\ntype PersistenceStatusMap = Record<string, PersistenceStatus>;\n\ntype PersistenceStatusUpdater = (\n updater: (prev: PersistenceStatusMap) => PersistenceStatusMap,\n) => void;\n\ntype UseInteractablePersistenceQueueOptions<State> = {\n adapterRef: RefObject<PersistenceAdapter<State> | undefined>;\n snapshot: () => State;\n updatePersistenceStatus: PersistenceStatusUpdater;\n};\n\nexport const useInteractablePersistenceQueue = <State>({\n adapterRef,\n snapshot,\n updatePersistenceStatus,\n}: UseInteractablePersistenceQueueOptions<State>) => {\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(\n undefined,\n );\n const syncSeqRef = useRef(0);\n const latestSyncSeqByIdRef = useRef(new Map<string, number>());\n const inFlightPersistenceRef = useRef(0);\n const flushResolversRef = useRef<Array<() => void>>([]);\n const dirtyIdsRef = useRef(new Set<string>());\n\n type PersistenceBatch = {\n adapter: PersistenceAdapter<State>;\n payload: State;\n dirtyIds: Set<string>;\n seq: number;\n };\n\n const outgoingQueueRef = useRef<PersistenceBatch[]>([]);\n const runPersistenceRef = useRef<(batch?: PersistenceBatch) => void>(\n () => {},\n );\n\n const takeDirtyBatch = useCallback(\n (adapter: PersistenceAdapter<State>): PersistenceBatch | undefined => {\n if (dirtyIdsRef.current.size === 0) return;\n const dirtyIds = new Set(dirtyIdsRef.current);\n dirtyIdsRef.current.clear();\n const seq = ++syncSeqRef.current;\n for (const id of dirtyIds) latestSyncSeqByIdRef.current.set(id, seq);\n return { adapter, payload: snapshot(), dirtyIds, seq };\n },\n [snapshot],\n );\n\n const enqueuePersistence = useCallback(\n (adapter: PersistenceAdapter<State>) => {\n const batch = takeDirtyBatch(adapter);\n if (!batch) return;\n if (inFlightPersistenceRef.current === 0) {\n runPersistenceRef.current(batch);\n } else {\n outgoingQueueRef.current.push(batch);\n }\n },\n [takeDirtyBatch],\n );\n\n const runPersistence = useCallback(\n async (batch?: PersistenceBatch) => {\n const resolved =\n batch ??\n (adapterRef.current ? takeDirtyBatch(adapterRef.current) : undefined);\n if (!resolved) {\n if (inFlightPersistenceRef.current === 0) {\n for (const resolve of flushResolversRef.current) resolve();\n flushResolversRef.current = [];\n }\n return;\n }\n\n const { adapter, payload, dirtyIds, seq } = resolved;\n inFlightPersistenceRef.current += 1;\n\n updatePersistenceStatus((prev) => {\n const persistence = nullProtoRecord(prev);\n for (const id of dirtyIds) {\n persistence[id] = { isPending: true, error: undefined };\n }\n return persistence;\n });\n\n const settleBatch = (status: PersistenceStatus | undefined) => {\n const settledIds: string[] = [];\n for (const id of dirtyIds) {\n if (\n latestSyncSeqByIdRef.current.get(id) !== seq ||\n dirtyIdsRef.current.has(id)\n )\n continue;\n latestSyncSeqByIdRef.current.delete(id);\n settledIds.push(id);\n }\n if (settledIds.length === 0) return;\n updatePersistenceStatus((prev) => {\n let changed = false;\n const persistence = nullProtoRecord(prev);\n for (const id of settledIds) {\n if (prev[id] === undefined) continue;\n if (status === undefined) delete persistence[id];\n else persistence[id] = status;\n changed = true;\n }\n return changed ? persistence : prev;\n });\n };\n\n try {\n await adapter.save(payload);\n settleBatch(undefined);\n } catch (e) {\n settleBatch({ isPending: false, error: e });\n } finally {\n inFlightPersistenceRef.current -= 1;\n const next =\n outgoingQueueRef.current.shift() ??\n (adapterRef.current && dirtyIdsRef.current.size > 0\n ? takeDirtyBatch(adapterRef.current)\n : undefined);\n if (next) {\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n runPersistenceRef.current(next);\n } else if (inFlightPersistenceRef.current === 0) {\n for (const resolve of flushResolversRef.current) resolve();\n flushResolversRef.current = [];\n }\n }\n },\n [adapterRef, takeDirtyBatch, updatePersistenceStatus],\n );\n runPersistenceRef.current = (nextBatch) => {\n void runPersistence(nextBatch);\n };\n\n const flushIfPending = useCallback(() => {\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n if (adapterRef.current) enqueuePersistence(adapterRef.current);\n }, [adapterRef, enqueuePersistence]);\n\n const schedulePersistence = useCallback(\n (id: string) => {\n if (!adapterRef.current) return;\n dirtyIdsRef.current.add(id);\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n }\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = undefined;\n if (inFlightPersistenceRef.current === 0 && adapterRef.current) {\n enqueuePersistence(adapterRef.current);\n } else {\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = undefined;\n if (adapterRef.current) enqueuePersistence(adapterRef.current);\n }, PERSISTENCE_DEBOUNCE_MS);\n }\n }, PERSISTENCE_DEBOUNCE_MS);\n },\n [adapterRef, enqueuePersistence],\n );\n\n const flush = useCallback(async () => {\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n const hasWork =\n inFlightPersistenceRef.current > 0 ||\n dirtyIdsRef.current.size > 0 ||\n outgoingQueueRef.current.length > 0;\n if (!hasWork) return;\n const p = new Promise<void>((resolve) => {\n flushResolversRef.current.push(resolve);\n });\n if (adapterRef.current) enqueuePersistence(adapterRef.current);\n return p;\n }, [adapterRef, enqueuePersistence]);\n\n return { flushIfPending, schedulePersistence, flush };\n};\n"],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ import { FC } from "react";
|
|
|
8
8
|
* subtree.
|
|
9
9
|
*
|
|
10
10
|
* @deprecated Use a toolkit with `Tools({ toolkit })` and register it via
|
|
11
|
-
* `
|
|
11
|
+
* `AuiConfig({ tools: Tools({ toolkit }) })` on the provider's `config` prop instead. See
|
|
12
12
|
* https://assistant-ui.com/docs/migrations/toolkit-tools.
|
|
13
13
|
*/
|
|
14
14
|
type AssistantTool = FC & {
|
|
@@ -24,7 +24,7 @@ type AssistantTool = FC & {
|
|
|
24
24
|
* @param tool - Tool definition and name to register.
|
|
25
25
|
*
|
|
26
26
|
* @deprecated Use a toolkit with `Tools({ toolkit })` and register it via
|
|
27
|
-
* `
|
|
27
|
+
* `AuiConfig({ tools: Tools({ toolkit }) })` on the provider's `config` prop instead. See
|
|
28
28
|
* https://assistant-ui.com/docs/migrations/toolkit-tools.
|
|
29
29
|
*/
|
|
30
30
|
declare const makeAssistantTool: <TArgs extends Record<string, unknown>, TResult>(tool: AssistantToolProps<TArgs, TResult>) => AssistantTool;
|
|
@@ -9,7 +9,7 @@ import { useAssistantTool } from "./useAssistantTool.js";
|
|
|
9
9
|
* @param tool - Tool definition and name to register.
|
|
10
10
|
*
|
|
11
11
|
* @deprecated Use a toolkit with `Tools({ toolkit })` and register it via
|
|
12
|
-
* `
|
|
12
|
+
* `AuiConfig({ tools: Tools({ toolkit }) })` on the provider's `config` prop instead. See
|
|
13
13
|
* https://assistant-ui.com/docs/migrations/toolkit-tools.
|
|
14
14
|
*/
|
|
15
15
|
const makeAssistantTool = (tool) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"makeAssistantTool.js","names":["FC","AssistantToolProps","useAssistantTool","AssistantTool","unstable_tool","makeAssistantTool","Record","tool","TArgs","TResult","Tool"],"sources":["../../../src/react/model-context/makeAssistantTool.ts"],"sourcesContent":["import type { FC } from \"react\";\nimport { type AssistantToolProps, useAssistantTool } from \"./useAssistantTool\";\n\n/**\n * Component returned by {@link makeAssistantTool}.\n *\n * Rendering the component registers its tool for the lifetime of that render\n * subtree.\n *\n * @deprecated Use a toolkit with `Tools({ toolkit })` and register it via\n * `
|
|
1
|
+
{"version":3,"file":"makeAssistantTool.js","names":["FC","AssistantToolProps","useAssistantTool","AssistantTool","unstable_tool","makeAssistantTool","Record","tool","TArgs","TResult","Tool"],"sources":["../../../src/react/model-context/makeAssistantTool.ts"],"sourcesContent":["import type { FC } from \"react\";\nimport { type AssistantToolProps, useAssistantTool } from \"./useAssistantTool\";\n\n/**\n * Component returned by {@link makeAssistantTool}.\n *\n * Rendering the component registers its tool for the lifetime of that render\n * subtree.\n *\n * @deprecated Use a toolkit with `Tools({ toolkit })` and register it via\n * `AuiConfig({ tools: Tools({ toolkit }) })` on the provider's `config` prop instead. See\n * https://assistant-ui.com/docs/migrations/toolkit-tools.\n */\nexport type AssistantTool = FC & {\n /** Tool definition registered by this component. */\n unstable_tool: AssistantToolProps<any, any>;\n};\n\n/**\n * Creates a React component that registers an assistant tool when rendered.\n *\n * Use this when exporting reusable tool modules that can be included in JSX\n * rather than calling {@link useAssistantTool} directly.\n *\n * @param tool - Tool definition and name to register.\n *\n * @deprecated Use a toolkit with `Tools({ toolkit })` and register it via\n * `AuiConfig({ tools: Tools({ toolkit }) })` on the provider's `config` prop instead. See\n * https://assistant-ui.com/docs/migrations/toolkit-tools.\n */\nexport const makeAssistantTool = <\n TArgs extends Record<string, unknown>,\n TResult,\n>(\n tool: AssistantToolProps<TArgs, TResult>,\n) => {\n const Tool: AssistantTool = () => {\n useAssistantTool(tool);\n return null;\n };\n Tool.unstable_tool = tool;\n return Tool;\n};\n"],"mappings":";;;;;;;;;;;;;;AA8BA,MAAaK,qBAIXE,SACG;CACH,MAAMG,aAAsB;EAC1BR,iBAAiBK,IAAI;EAAC,OACf;CAAI;CAEbG,KAAKN,gBAAgBG;CACrB,OAAOG;AACT"}
|
|
@@ -7,7 +7,7 @@ import "../../index.js";
|
|
|
7
7
|
* Props used to register a tool from React.
|
|
8
8
|
*
|
|
9
9
|
* @deprecated Use a toolkit with `Tools({ toolkit })` and register it via
|
|
10
|
-
* `
|
|
10
|
+
* `AuiConfig({ tools: Tools({ toolkit }) })` on the provider's `config` prop instead. See
|
|
11
11
|
* https://assistant-ui.com/docs/migrations/toolkit-tools.
|
|
12
12
|
*/
|
|
13
13
|
type AssistantToolProps<TArgs extends Record<string, unknown>, TResult> = AssistantToolProps$1<TArgs, TResult> & {
|
|
@@ -30,7 +30,7 @@ type AssistantToolProps<TArgs extends Record<string, unknown>, TResult> = Assist
|
|
|
30
30
|
* @param tool - Tool definition and name to register.
|
|
31
31
|
*
|
|
32
32
|
* @deprecated Use a toolkit with `Tools({ toolkit })` and register it via
|
|
33
|
-
* `
|
|
33
|
+
* `AuiConfig({ tools: Tools({ toolkit }) })` on the provider's `config` prop instead. See
|
|
34
34
|
* https://assistant-ui.com/docs/migrations/toolkit-tools.
|
|
35
35
|
*
|
|
36
36
|
* @example
|
|
@@ -17,7 +17,7 @@ import { useAui } from "@assistant-ui/store";
|
|
|
17
17
|
* @param tool - Tool definition and name to register.
|
|
18
18
|
*
|
|
19
19
|
* @deprecated Use a toolkit with `Tools({ toolkit })` and register it via
|
|
20
|
-
* `
|
|
20
|
+
* `AuiConfig({ tools: Tools({ toolkit }) })` on the provider's `config` prop instead. See
|
|
21
21
|
* https://assistant-ui.com/docs/migrations/toolkit-tools.
|
|
22
22
|
*
|
|
23
23
|
* @example
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAssistantTool.js","names":["useEffect","useMemo","useAui","ToolCallMessagePartComponent","AssistantToolProps","CoreAssistantToolProps","isStandaloneToolDisplay","makeToolCallTextComponent","ToolCallText","Record","TArgs","TResult","render","renderText","useAssistantTool","tool","$","_c","aui","t0","standalone","t1","undefined","renderTextComponent","t2","tools","toolName","setToolUI","t3","t4","modelContext","render_0","display","rest","context","register","getModelContext","t5"],"sources":["../../../src/react/model-context/useAssistantTool.ts"],"sourcesContent":["import { useEffect, useMemo } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type { ToolCallMessagePartComponent } from \"../types/MessagePartComponentTypes\";\nimport type { AssistantToolProps as CoreAssistantToolProps } from \"../..\";\nimport {\n isStandaloneToolDisplay,\n makeToolCallTextComponent,\n type ToolCallText,\n} from \"./toolbox\";\n\n/**\n * Props used to register a tool from React.\n *\n * @deprecated Use a toolkit with `Tools({ toolkit })` and register it via\n * `
|
|
1
|
+
{"version":3,"file":"useAssistantTool.js","names":["useEffect","useMemo","useAui","ToolCallMessagePartComponent","AssistantToolProps","CoreAssistantToolProps","isStandaloneToolDisplay","makeToolCallTextComponent","ToolCallText","Record","TArgs","TResult","render","renderText","useAssistantTool","tool","$","_c","aui","t0","standalone","t1","undefined","renderTextComponent","t2","tools","toolName","setToolUI","t3","t4","modelContext","render_0","display","rest","context","register","getModelContext","t5"],"sources":["../../../src/react/model-context/useAssistantTool.ts"],"sourcesContent":["import { useEffect, useMemo } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type { ToolCallMessagePartComponent } from \"../types/MessagePartComponentTypes\";\nimport type { AssistantToolProps as CoreAssistantToolProps } from \"../..\";\nimport {\n isStandaloneToolDisplay,\n makeToolCallTextComponent,\n type ToolCallText,\n} from \"./toolbox\";\n\n/**\n * Props used to register a tool from React.\n *\n * @deprecated Use a toolkit with `Tools({ toolkit })` and register it via\n * `AuiConfig({ tools: Tools({ toolkit }) })` on the provider's `config` prop instead. See\n * https://assistant-ui.com/docs/migrations/toolkit-tools.\n */\nexport type AssistantToolProps<\n TArgs extends Record<string, unknown>,\n TResult,\n> = CoreAssistantToolProps<TArgs, TResult> & {\n /** Component used to render calls to this tool in assistant messages. */\n render?: ToolCallMessagePartComponent<TArgs, TResult> | undefined;\n /** Lightweight text rendered while a tool call is running or complete. */\n renderText?: ToolCallText<TArgs, TResult> | undefined;\n};\n\n/**\n * Registers a tool with the assistant model context while the component is\n * mounted.\n *\n * If `render` is provided, it is also installed as the renderer for matching\n * tool-call message parts. The registration is removed automatically when the\n * component unmounts or the tool definition changes.\n *\n * Pass a referentially stable tool object, such as one declared at module\n * scope or memoized with `useMemo`, to avoid re-registering on every render.\n *\n * @param tool - Tool definition and name to register.\n *\n * @deprecated Use a toolkit with `Tools({ toolkit })` and register it via\n * `AuiConfig({ tools: Tools({ toolkit }) })` on the provider's `config` prop instead. See\n * https://assistant-ui.com/docs/migrations/toolkit-tools.\n *\n * @example\n * ```tsx\n * const weatherTool = {\n * toolName: \"get_weather\",\n * type: \"frontend\",\n * description: \"Get the weather for a city.\",\n * parameters: weatherSchema,\n * execute: async ({ city }: { city: string }) => fetchWeather(city),\n * render: WeatherToolUI,\n * } satisfies AssistantToolProps<{ city: string }, Weather>;\n *\n * function WeatherToolRegistration() {\n * useAssistantTool(weatherTool);\n * return null;\n * }\n * ```\n */\nexport const useAssistantTool = <\n TArgs extends Record<string, unknown>,\n TResult,\n>(\n tool: AssistantToolProps<TArgs, TResult>,\n) => {\n const aui = useAui();\n\n const standalone = isStandaloneToolDisplay(tool);\n const renderTextComponent = useMemo(\n () =>\n tool.renderText ? makeToolCallTextComponent(tool.renderText) : undefined,\n [tool.renderText],\n );\n const render = tool.render ?? renderTextComponent;\n\n useEffect(() => {\n if (!render) return undefined;\n return aui.tools.setToolUI(tool.toolName, render, { standalone });\n }, [aui, tool.toolName, render, standalone]);\n\n useEffect(() => {\n // `render`, `renderText`, and `display` are client-only presentation\n // concerns and never reach the model.\n const { toolName, render, renderText, display, ...rest } = tool;\n const context = {\n tools: {\n [toolName]: rest,\n },\n };\n return aui.modelContext.register({\n getModelContext: () => context,\n });\n }, [aui, tool]);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DA,MAAac,oBAAmBC,SAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAM9B,MAAAC,MAAYhB,OAAO;CAAE,IAAAiB;CAAA,IAAAH,EAAA,OAAAD,MAAA;EAEFI,KAAAb,wBAAwBS,IAAI;EAACC,EAAA,KAAAD;EAAAC,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAhD,MAAAI,aAAmBD;CAA8B,IAAAE;CAAA,IAAAL,EAAA,OAAAD,KAAAF,YAAA;EAG7CQ,KAAAN,KAAIF,aAAcN,0BAA0BQ,KAAIF,UAAuB,IAAvES,KAAAA;EAAwEN,EAAA,KAAAD,KAAAF;EAAAG,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAF5E,MAAAO,sBAEIF;CAGJ,MAAAT,SAAeG,KAAIH,UAAJW;CAAmC,IAAAC;CAAA,IAAAR,EAAA,OAAAE,IAAAO,SAAAT,EAAA,OAAAJ,UAAAI,EAAA,OAAAI,cAAAJ,EAAA,OAAAD,KAAAW,UAAA;EAExCF,WAAA;GACR,IAAI,CAACZ,QAAM;GAAmB,OACvBM,IAAGO,MAAME,UAAWZ,KAAIW,UAAWd,QAAQ,EAAAQ,WAAa,CAAC;EAAC;EAClEJ,EAAA,KAAAE,IAAAO;EAAAT,EAAA,KAAAJ;EAAAI,EAAA,KAAAI;EAAAJ,EAAA,KAAAD,KAAAW;EAAAV,EAAA,KAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAAA,IAAAY;CAAA,IAAAZ,EAAA,OAAAE,OAAAF,EAAA,QAAAJ,UAAAI,EAAA,QAAAI,cAAAJ,EAAA,QAAAD,KAAAW,UAAA;EAAEE,KAAA;GAACV;GAAKH,KAAIW;GAAWd;GAAQQ;EAAU;EAACJ,EAAA,KAAAE;EAAAF,EAAA,MAAAJ;EAAAI,EAAA,MAAAI;EAAAJ,EAAA,MAAAD,KAAAW;EAAAV,EAAA,MAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAH3ChB,UAAUwB,IAGPI,EAAwC;CAAC,IAAAC;CAAA,IAAAb,EAAA,QAAAE,IAAAY,gBAAAd,EAAA,QAAAD,MAAA;EAElCc,WAAA;GAGR,MAAA,EAAAH,UAAAd,QAAAmB,UAAAlB,YAAAmB,SAAA,GAAAC,SAA2DlB;GAC3D,MAAAmB,UAAgB,EAAAT,OACP,GACJC,WAAWO,KACd,EACF;GAAE,OACKf,IAAGY,aAAaK,SAAU,EAAAC,uBACRF,QACzB,CAAC;EAAC;EACHlB,EAAA,MAAAE,IAAAY;EAAAd,EAAA,MAAAD;EAAAC,EAAA,MAAAa;CAAA,OAAAA,KAAAb,EAAA;CAAA,IAAAqB;CAAA,IAAArB,EAAA,QAAAE,OAAAF,EAAA,QAAAD,MAAA;EAAEsB,KAAA,CAACnB,KAAKH,IAAI;EAACC,EAAA,MAAAE;EAAAF,EAAA,MAAAD;EAAAC,EAAA,MAAAqB;CAAA,OAAAA,KAAArB,EAAA;CAZdhB,UAAU6B,IAYPQ,EAAW;AAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInteractable.d.ts","names":[],"sources":["../../../src/react/model-context/useInteractable.ts"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"useInteractable.d.ts","names":[],"sources":["../../../src/react/model-context/useInteractable.ts"],"mappings":";;;;;;;;KAmBY,gCAAgC,WAAW;EACrD;IAAe;MAAU,cAAc;;;IAErC;;;;;;KAQQ,iCAAiC;;EAE3C,OAAO;;EAEP;;EAEA;;;;;;KAOU,4BACV,gBAAgB;EAEhB;EACA,aAAa;EACb,cAAc,gCAAgC;;EAE9C;;;;;;;;EAQA,eAAe;;;;;;;;;;;;;;;;;;;;cAoJJ,2BACX,gBAAgB,kCAEhB,cACA,QAAQ,4BAA4B,uBAEpC,gCAAgC;EAE9B;EACA,SACI,iCACE,gCAAgC;EAGtC,WACE,SACI,gCAAgC,aAE9B,MAAM,gCAAgC,aACnC,gCAAgC;EAE3C;EACA;EACA,aAAa"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { interactableToolName, unstable_getInteractableVersions } from "../../model-context/interactable-composer-metadata.js";
|
|
3
|
-
import { unstable_useInteractableState } from "./useInteractableState.js";
|
|
4
3
|
import { useJSONEqual } from "../utils/useJSONEqual.js";
|
|
4
|
+
import { useJSONSchemaDependency } from "../utils/useJSONSchemaDependency.js";
|
|
5
|
+
import { unstable_useInteractableState } from "./useInteractableState.js";
|
|
5
6
|
import { useEffect, useId, useMemo, useRef } from "@assistant-ui/tap/react-shim";
|
|
6
7
|
import { useAui, useAuiState } from "@assistant-ui/store";
|
|
7
8
|
//#region src/react/model-context/useInteractable.ts
|
|
@@ -26,6 +27,7 @@ const useInteractable = (name, config) => {
|
|
|
26
27
|
const internalScope = part?.toolName === name || part?.toolName === updateToolName ? "thread" : void 0;
|
|
27
28
|
const stateSchemaRef = useRef(config.stateSchema);
|
|
28
29
|
stateSchemaRef.current = config.stateSchema;
|
|
30
|
+
const normalizedStateSchema = useJSONSchemaDependency(config.stateSchema);
|
|
29
31
|
const initialStateRef = useRef(config.initialState);
|
|
30
32
|
initialStateRef.current = config.initialState;
|
|
31
33
|
const interactables = useAuiState(() => aui.unstable_interactables);
|
|
@@ -44,6 +46,7 @@ const useInteractable = (name, config) => {
|
|
|
44
46
|
id,
|
|
45
47
|
name,
|
|
46
48
|
config.description,
|
|
49
|
+
normalizedStateSchema,
|
|
47
50
|
internalScope,
|
|
48
51
|
config.updateRender
|
|
49
52
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInteractable.js","names":["useEffect","useId","useMemo","useRef","useAui","useAuiState","Unstable_InteractableStateSchema","ToolCallMessagePartComponent","unstable_getInteractableVersions","getInteractableVersions","interactableToolName","unstable_useInteractableState","useInteractableState","useJSONEqual","Unstable_InferInteractableState","TSchema","types","output","TOutput","Unstable_InteractableVersionInfo","state","TState","isLatest","restore","Unstable_InteractableConfig","description","stateSchema","initialState","id","updateRender","useInteractable","name","config","version","setState","updater","prev","isPending","error","flush","Promise","aui","autoId","replace","updateToolName","part","s","p","optional","type","undefined","inferredId","toolName","result","Record","args","success","internalScope","stateSchemaRef","current","initialStateRef","interactables","unstable_interactables","register","scope","Parameters","myToolCallId","toolCallId","registeredState","methods","versionValue","versions","thread","messages","some","v","origin","mine","find","latestToolCallId","findLast","const","unstable_useInteractable"],"sources":["../../../src/react/model-context/useInteractable.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useId, useMemo, useRef } from \"react\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\nimport type { Unstable_InteractableStateSchema } from \"../types/scopes/interactables\";\nimport type { ToolCallMessagePartComponent } from \"../types/MessagePartComponentTypes\";\nimport {\n unstable_getInteractableVersions as getInteractableVersions,\n interactableToolName,\n} from \"../../model-context/interactable-composer-metadata\";\nimport { unstable_useInteractableState as useInteractableState } from \"./useInteractableState\";\nimport { useJSONEqual } from \"../utils/useJSONEqual\";\n\n/**\n * The state type described by an interactable's `stateSchema`. Resolves the\n * output type of a StandardSchemaV1 schema (e.g. Zod); plain JSON Schema\n * falls back to `unknown`.\n */\nexport type Unstable_InferInteractableState<TSchema> = TSchema extends {\n \"~standard\": { types?: { output: infer TOutput } | undefined };\n}\n ? TOutput\n : unknown;\n\n/**\n * One message's version of an interactable, for components rendered inside\n * tool-call parts. Show `state` to display history; call `restore()` to set\n * the live instance back to it.\n */\nexport type Unstable_InteractableVersionInfo<TState> = {\n /** The interactable's state as it was at this message. */\n state: TState;\n /** Whether this message holds the instance's most recent tool-driven version. */\n isLatest: boolean;\n /** Sets the live state back to this version. */\n restore: () => void;\n};\n\n/**\n * Unstable / Experimental — the interactables API is still evolving and may change in any release.\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport type Unstable_InteractableConfig<\n TSchema extends Unstable_InteractableStateSchema,\n> = {\n description: string;\n stateSchema: TSchema;\n initialState: Unstable_InferInteractableState<TSchema>;\n /** Unique instance ID; required to address this instance when multiple interactables share a name. Auto-generated if omitted. */\n id?: string | undefined;\n /**\n * Component installed as the tool UI for this interactable's `update_{name}`\n * tool calls, so a model edit re-renders the interactable at the message\n * that made it instead of only mutating an earlier one. Prefer\n * `unstable_interactableTool`, which wires this up. Pass a stable component reference;\n * changing identity re-registers the tool UI.\n */\n updateRender?: ToolCallMessagePartComponent | undefined;\n};\n\nconst useInteractable = <TSchema extends Unstable_InteractableStateSchema>(\n name: string,\n config: Unstable_InteractableConfig<TSchema>,\n): readonly [\n Unstable_InferInteractableState<TSchema>,\n {\n id: string;\n /**\n * This message's version of the instance, when rendered inside a\n * tool-created interactable message part; `undefined` elsewhere.\n */\n version:\n | Unstable_InteractableVersionInfo<\n Unstable_InferInteractableState<TSchema>\n >\n | undefined;\n setState: (\n updater:\n | Unstable_InferInteractableState<TSchema>\n | ((\n prev: Unstable_InferInteractableState<TSchema>,\n ) => Unstable_InferInteractableState<TSchema>),\n ) => void;\n isPending: boolean;\n error: unknown;\n flush: () => Promise<void>;\n },\n] => {\n const aui = useAui();\n\n const autoId = useId().replace(/[^a-zA-Z0-9]/g, \"\");\n\n const updateToolName = interactableToolName(name);\n const part = useAuiState((s) => {\n const p = s.optional.part;\n return p?.type === \"tool-call\" ? p : undefined;\n });\n\n // Inside an update_{name} part, the instance id comes from the call itself:\n // the result's resolved id (covers id-less calls), or the id argument.\n let inferredId: string | undefined;\n if (part?.toolName === updateToolName) {\n const result = part.result as Record<string, unknown> | undefined;\n const args = part.args as Record<string, unknown> | undefined;\n if (result?.success !== false) {\n if (typeof result?.id === \"string\") inferredId = result.id;\n else if (typeof args?.id === \"string\") inferredId = args.id;\n }\n }\n\n const id = config.id ?? inferredId ?? autoId;\n const internalScope =\n part?.toolName === name || part?.toolName === updateToolName\n ? \"thread\"\n : undefined;\n\n const stateSchemaRef = useRef(config.stateSchema);\n stateSchemaRef.current = config.stateSchema;\n const initialStateRef = useRef(config.initialState);\n initialStateRef.current = config.initialState;\n\n const interactables = useAuiState(() => aui.unstable_interactables);\n\n useEffect(() => {\n return interactables.register({\n id,\n name,\n description: config.description,\n stateSchema: stateSchemaRef.current,\n initialState: initialStateRef.current,\n updateRender: config.updateRender,\n ...(internalScope ? { scope: internalScope } : {}),\n } as Parameters<typeof interactables.register>[0] & {\n scope?: \"thread\" | undefined;\n });\n }, [\n interactables,\n id,\n name,\n config.description,\n internalScope,\n config.updateRender,\n ]);\n\n const myToolCallId = part?.toolCallId;\n\n const [registeredState, methods] =\n useInteractableState<Unstable_InferInteractableState<TSchema>>(id);\n const { setState } = methods;\n\n const versionValue = useAuiState(\n useJSONEqual((s) => {\n if (!internalScope || !myToolCallId) return undefined;\n const versions = getInteractableVersions(s.thread.messages, id, name);\n if (!versions.some((v) => v.origin === \"create\" && v.toolCallId === id)) {\n return undefined;\n }\n const mine = versions.find((v) => v.toolCallId === myToolCallId);\n if (!mine) return undefined;\n const latestToolCallId = versions.findLast(\n (v) => v.toolCallId !== undefined,\n )?.toolCallId;\n return { state: mine.state, isLatest: latestToolCallId === myToolCallId };\n }),\n );\n\n const version = useMemo(\n () =>\n versionValue && {\n state: versionValue.state as Unstable_InferInteractableState<TSchema>,\n isLatest: versionValue.isLatest,\n restore: () =>\n setState(\n versionValue.state as Unstable_InferInteractableState<TSchema>,\n ),\n },\n [versionValue, setState],\n );\n\n const state =\n registeredState === undefined ? config.initialState : registeredState;\n\n return [state, { id, version, ...methods }] as const;\n};\n\n/**\n * Registers an interactable with the AI assistant and returns its live state,\n * like `useState` that the model can also read and update.\n *\n * Call this once per place that shows the interactable. Other components can\n * read and write the same instance by passing its `id` to\n * `unstable_useInteractableState`.\n *\n * For tool-created interactables rendered inside tool-call message parts,\n * `version` carries this message's version of the instance — its state as of\n * that point in the conversation, whether it is the most recent tool-driven\n * version, and a `restore()` back to it. Whether older messages render frozen history or stay\n * live-editable is the component's choice. Inside an `update_{name}` part the\n * instance `id` is inferred from the call, so the same component works at the\n * creating call and at update calls.\n *\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport const unstable_useInteractable: <\n TSchema extends Unstable_InteractableStateSchema,\n>(\n name: string,\n config: Unstable_InteractableConfig<TSchema>,\n) => readonly [\n Unstable_InferInteractableState<TSchema>,\n {\n id: string;\n version:\n | Unstable_InteractableVersionInfo<\n Unstable_InferInteractableState<TSchema>\n >\n | undefined;\n setState: (\n updater:\n | Unstable_InferInteractableState<TSchema>\n | ((\n prev: Unstable_InferInteractableState<TSchema>,\n ) => Unstable_InferInteractableState<TSchema>),\n ) => void;\n isPending: boolean;\n error: unknown;\n flush: () => Promise<void>;\n },\n] = useInteractable;\n"],"mappings":";;;;;;;AA4DA,MAAM8B,mBACJC,MACAC,WAyBG;CACH,MAAMS,MAAMrC,OAAO;CAEnB,MAAMsC,SAASzC,MAAM,CAAC,CAAC0C,QAAQ,iBAAiB,EAAE;CAElD,MAAMC,iBAAiBlC,qBAAqBqB,IAAI;CAChD,MAAMc,OAAOxC,aAAayC,MAAM;EAC9B,MAAMC,IAAID,EAAEE,SAASH;EACrB,OAAOE,GAAGE,SAAS,cAAcF,IAAIG,KAAAA;CACvC,CAAC;CAID,IAAIC;CACJ,IAAIN,MAAMO,aAAaR,gBAAgB;EACrC,MAAMS,SAASR,KAAKQ;EACpB,MAAME,OAAOV,KAAKU;EAClB,IAAIF,QAAQG,YAAY,OAAO;GAC7B,IAAI,OAAOH,QAAQzB,OAAO,UAAUuB,aAAaE,OAAOzB;QACnD,IAAI,OAAO2B,MAAM3B,OAAO,UAAUuB,aAAaI,KAAK3B;EAC3D;CACF;CAEA,MAAMA,KAAKI,OAAOJ,MAAMuB,cAAcT;CACtC,MAAMe,gBACJZ,MAAMO,aAAarB,QAAQc,MAAMO,aAAaR,iBAC1C,WACAM,KAAAA;CAEN,MAAMQ,iBAAiBvD,OAAO6B,OAAON,WAAW;CAChDgC,eAAeC,UAAU3B,OAAON;CAChC,MAAMkC,kBAAkBzD,OAAO6B,OAAOL,YAAY;CAClDiC,gBAAgBD,UAAU3B,OAAOL;CAEjC,MAAMkC,gBAAgBxD,kBAAkBoC,IAAIqB,sBAAsB;CAElE9D,gBAAgB;EACd,OAAO6D,cAAcE,SAAS;GAC5BnC;GACAG;GACAN,aAAaO,OAAOP;GACpBC,aAAagC,eAAeC;GAC5BhC,cAAciC,gBAAgBD;GAC9B9B,cAAcG,OAAOH;GACrB,GAAI4B,gBAAgB,EAAEO,OAAOP,cAAc,IAAI,CAAC;EAClD,CAEC;CACH,GAAG;EACDI;EACAjC;EACAG;EACAC,OAAOP;EACPgC;EACAzB,OAAOH;CAAY,CACpB;CAED,MAAMqC,eAAerB,MAAMsB;CAE3B,MAAM,CAACC,iBAAiBC,WACtBzD,8BAA+DgB,EAAE;CACnE,MAAM,EAAEM,aAAamC;CAErB,MAAMC,eAAejE,YACnBQ,cAAciC,QAAM;EAClB,IAAI,CAACW,iBAAiB,CAACS,cAAc,OAAOhB,KAAAA;EAC5C,MAAMqB,WAAW9D,iCAAwBqC,IAAE0B,OAAOC,UAAU7C,IAAIG,IAAI;EACpE,IAAI,CAACwC,SAASG,MAAMC,MAAMA,EAAEC,WAAW,YAAYD,EAAER,eAAevC,EAAE,GACpE;EAEF,MAAMiD,OAAON,SAASO,MAAMH,QAAMA,IAAER,eAAeD,YAAY;EAC/D,IAAI,CAACW,MAAM,OAAO3B,KAAAA;EAClB,MAAM6B,mBAAmBR,SAASS,UAC/BL,QAAMA,IAAER,eAAejB,KAAAA,CAC1B,CAAC,EAAEiB;EACH,OAAO;GAAE/C,OAAOyD,KAAKzD;GAAOE,UAAUyD,qBAAqBb;EAAa;CAC1E,CAAC,CACH;CAEA,MAAMjC,UAAU/B,cAEZoE,gBAAgB;EACdlD,OAAOkD,aAAalD;EACpBE,UAAUgD,aAAahD;EACvBC,eACEW,SACEoC,aAAalD,KACf;CACJ,GACF,CAACkD,cAAcpC,QAAQ,CACzB;CAKA,OAAO,CAFLkC,oBAAoBlB,KAAAA,IAAYlB,OAAOL,eAAeyC,iBAEzC;EAAExC;EAAIK;EAAS,GAAGoC;CAAQ,CAAC;AAC5C;;;;;;;;;;;;;;;;;;;AAoBA,MAAaa,2BAyBTpD"}
|
|
1
|
+
{"version":3,"file":"useInteractable.js","names":["useEffect","useId","useMemo","useRef","useAui","useAuiState","Unstable_InteractableStateSchema","ToolCallMessagePartComponent","unstable_getInteractableVersions","getInteractableVersions","interactableToolName","unstable_useInteractableState","useInteractableState","useJSONEqual","useJSONSchemaDependency","Unstable_InferInteractableState","TSchema","types","output","TOutput","Unstable_InteractableVersionInfo","state","TState","isLatest","restore","Unstable_InteractableConfig","description","stateSchema","initialState","id","updateRender","useInteractable","name","config","version","setState","updater","prev","isPending","error","flush","Promise","aui","autoId","replace","updateToolName","part","s","p","optional","type","undefined","inferredId","toolName","result","Record","args","success","internalScope","stateSchemaRef","current","normalizedStateSchema","initialStateRef","interactables","unstable_interactables","register","scope","Parameters","myToolCallId","toolCallId","registeredState","methods","versionValue","versions","thread","messages","some","v","origin","mine","find","latestToolCallId","findLast","const","unstable_useInteractable"],"sources":["../../../src/react/model-context/useInteractable.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useId, useMemo, useRef } from \"react\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\nimport type { Unstable_InteractableStateSchema } from \"../types/scopes/interactables\";\nimport type { ToolCallMessagePartComponent } from \"../types/MessagePartComponentTypes\";\nimport {\n unstable_getInteractableVersions as getInteractableVersions,\n interactableToolName,\n} from \"../../model-context/interactable-composer-metadata\";\nimport { unstable_useInteractableState as useInteractableState } from \"./useInteractableState\";\nimport { useJSONEqual } from \"../utils/useJSONEqual\";\nimport { useJSONSchemaDependency } from \"../utils/useJSONSchemaDependency\";\n\n/**\n * The state type described by an interactable's `stateSchema`. Resolves the\n * output type of a StandardSchemaV1 schema (e.g. Zod); plain JSON Schema\n * falls back to `unknown`.\n */\nexport type Unstable_InferInteractableState<TSchema> = TSchema extends {\n \"~standard\": { types?: { output: infer TOutput } | undefined };\n}\n ? TOutput\n : unknown;\n\n/**\n * One message's version of an interactable, for components rendered inside\n * tool-call parts. Show `state` to display history; call `restore()` to set\n * the live instance back to it.\n */\nexport type Unstable_InteractableVersionInfo<TState> = {\n /** The interactable's state as it was at this message. */\n state: TState;\n /** Whether this message holds the instance's most recent tool-driven version. */\n isLatest: boolean;\n /** Sets the live state back to this version. */\n restore: () => void;\n};\n\n/**\n * Unstable / Experimental — the interactables API is still evolving and may change in any release.\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport type Unstable_InteractableConfig<\n TSchema extends Unstable_InteractableStateSchema,\n> = {\n description: string;\n stateSchema: TSchema;\n initialState: Unstable_InferInteractableState<TSchema>;\n /** Unique instance ID; required to address this instance when multiple interactables share a name. Auto-generated if omitted. */\n id?: string | undefined;\n /**\n * Component installed as the tool UI for this interactable's `update_{name}`\n * tool calls, so a model edit re-renders the interactable at the message\n * that made it instead of only mutating an earlier one. Prefer\n * `unstable_interactableTool`, which wires this up. Pass a stable component reference;\n * changing identity re-registers the tool UI.\n */\n updateRender?: ToolCallMessagePartComponent | undefined;\n};\n\nconst useInteractable = <TSchema extends Unstable_InteractableStateSchema>(\n name: string,\n config: Unstable_InteractableConfig<TSchema>,\n): readonly [\n Unstable_InferInteractableState<TSchema>,\n {\n id: string;\n /**\n * This message's version of the instance, when rendered inside a\n * tool-created interactable message part; `undefined` elsewhere.\n */\n version:\n | Unstable_InteractableVersionInfo<\n Unstable_InferInteractableState<TSchema>\n >\n | undefined;\n setState: (\n updater:\n | Unstable_InferInteractableState<TSchema>\n | ((\n prev: Unstable_InferInteractableState<TSchema>,\n ) => Unstable_InferInteractableState<TSchema>),\n ) => void;\n isPending: boolean;\n error: unknown;\n flush: () => Promise<void>;\n },\n] => {\n const aui = useAui();\n\n const autoId = useId().replace(/[^a-zA-Z0-9]/g, \"\");\n\n const updateToolName = interactableToolName(name);\n const part = useAuiState((s) => {\n const p = s.optional.part;\n return p?.type === \"tool-call\" ? p : undefined;\n });\n\n // Inside an update_{name} part, the instance id comes from the call itself:\n // the result's resolved id (covers id-less calls), or the id argument.\n let inferredId: string | undefined;\n if (part?.toolName === updateToolName) {\n const result = part.result as Record<string, unknown> | undefined;\n const args = part.args as Record<string, unknown> | undefined;\n if (result?.success !== false) {\n if (typeof result?.id === \"string\") inferredId = result.id;\n else if (typeof args?.id === \"string\") inferredId = args.id;\n }\n }\n\n const id = config.id ?? inferredId ?? autoId;\n const internalScope =\n part?.toolName === name || part?.toolName === updateToolName\n ? \"thread\"\n : undefined;\n\n const stateSchemaRef = useRef(config.stateSchema);\n stateSchemaRef.current = config.stateSchema;\n const normalizedStateSchema = useJSONSchemaDependency(config.stateSchema);\n const initialStateRef = useRef(config.initialState);\n initialStateRef.current = config.initialState;\n\n const interactables = useAuiState(() => aui.unstable_interactables);\n\n useEffect(() => {\n return interactables.register({\n id,\n name,\n description: config.description,\n stateSchema: stateSchemaRef.current,\n initialState: initialStateRef.current,\n updateRender: config.updateRender,\n ...(internalScope ? { scope: internalScope } : {}),\n } as Parameters<typeof interactables.register>[0] & {\n scope?: \"thread\" | undefined;\n });\n }, [\n interactables,\n id,\n name,\n config.description,\n normalizedStateSchema,\n internalScope,\n config.updateRender,\n ]);\n\n const myToolCallId = part?.toolCallId;\n\n const [registeredState, methods] =\n useInteractableState<Unstable_InferInteractableState<TSchema>>(id);\n const { setState } = methods;\n\n const versionValue = useAuiState(\n useJSONEqual((s) => {\n if (!internalScope || !myToolCallId) return undefined;\n const versions = getInteractableVersions(s.thread.messages, id, name);\n if (!versions.some((v) => v.origin === \"create\" && v.toolCallId === id)) {\n return undefined;\n }\n const mine = versions.find((v) => v.toolCallId === myToolCallId);\n if (!mine) return undefined;\n const latestToolCallId = versions.findLast(\n (v) => v.toolCallId !== undefined,\n )?.toolCallId;\n return { state: mine.state, isLatest: latestToolCallId === myToolCallId };\n }),\n );\n\n const version = useMemo(\n () =>\n versionValue && {\n state: versionValue.state as Unstable_InferInteractableState<TSchema>,\n isLatest: versionValue.isLatest,\n restore: () =>\n setState(\n versionValue.state as Unstable_InferInteractableState<TSchema>,\n ),\n },\n [versionValue, setState],\n );\n\n const state =\n registeredState === undefined ? config.initialState : registeredState;\n\n return [state, { id, version, ...methods }] as const;\n};\n\n/**\n * Registers an interactable with the AI assistant and returns its live state,\n * like `useState` that the model can also read and update.\n *\n * Call this once per place that shows the interactable. Other components can\n * read and write the same instance by passing its `id` to\n * `unstable_useInteractableState`.\n *\n * For tool-created interactables rendered inside tool-call message parts,\n * `version` carries this message's version of the instance — its state as of\n * that point in the conversation, whether it is the most recent tool-driven\n * version, and a `restore()` back to it. Whether older messages render frozen history or stay\n * live-editable is the component's choice. Inside an `update_{name}` part the\n * instance `id` is inferred from the call, so the same component works at the\n * creating call and at update calls.\n *\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport const unstable_useInteractable: <\n TSchema extends Unstable_InteractableStateSchema,\n>(\n name: string,\n config: Unstable_InteractableConfig<TSchema>,\n) => readonly [\n Unstable_InferInteractableState<TSchema>,\n {\n id: string;\n version:\n | Unstable_InteractableVersionInfo<\n Unstable_InferInteractableState<TSchema>\n >\n | undefined;\n setState: (\n updater:\n | Unstable_InferInteractableState<TSchema>\n | ((\n prev: Unstable_InferInteractableState<TSchema>,\n ) => Unstable_InferInteractableState<TSchema>),\n ) => void;\n isPending: boolean;\n error: unknown;\n flush: () => Promise<void>;\n },\n] = useInteractable;\n"],"mappings":";;;;;;;;AA6DA,MAAM+B,mBACJC,MACAC,WAyBG;CACH,MAAMS,MAAMtC,OAAO;CAEnB,MAAMuC,SAAS1C,MAAM,CAAC,CAAC2C,QAAQ,iBAAiB,EAAE;CAElD,MAAMC,iBAAiBnC,qBAAqBsB,IAAI;CAChD,MAAMc,OAAOzC,aAAa0C,MAAM;EAC9B,MAAMC,IAAID,EAAEE,SAASH;EACrB,OAAOE,GAAGE,SAAS,cAAcF,IAAIG,KAAAA;CACvC,CAAC;CAID,IAAIC;CACJ,IAAIN,MAAMO,aAAaR,gBAAgB;EACrC,MAAMS,SAASR,KAAKQ;EACpB,MAAME,OAAOV,KAAKU;EAClB,IAAIF,QAAQG,YAAY,OAAO;GAC7B,IAAI,OAAOH,QAAQzB,OAAO,UAAUuB,aAAaE,OAAOzB;QACnD,IAAI,OAAO2B,MAAM3B,OAAO,UAAUuB,aAAaI,KAAK3B;EAC3D;CACF;CAEA,MAAMA,KAAKI,OAAOJ,MAAMuB,cAAcT;CACtC,MAAMe,gBACJZ,MAAMO,aAAarB,QAAQc,MAAMO,aAAaR,iBAC1C,WACAM,KAAAA;CAEN,MAAMQ,iBAAiBxD,OAAO8B,OAAON,WAAW;CAChDgC,eAAeC,UAAU3B,OAAON;CAChC,MAAMkC,wBAAwB/C,wBAAwBmB,OAAON,WAAW;CACxE,MAAMmC,kBAAkB3D,OAAO8B,OAAOL,YAAY;CAClDkC,gBAAgBF,UAAU3B,OAAOL;CAEjC,MAAMmC,gBAAgB1D,kBAAkBqC,IAAIsB,sBAAsB;CAElEhE,gBAAgB;EACd,OAAO+D,cAAcE,SAAS;GAC5BpC;GACAG;GACAN,aAAaO,OAAOP;GACpBC,aAAagC,eAAeC;GAC5BhC,cAAckC,gBAAgBF;GAC9B9B,cAAcG,OAAOH;GACrB,GAAI4B,gBAAgB,EAAEQ,OAAOR,cAAc,IAAI,CAAC;EAClD,CAEC;CACH,GAAG;EACDK;EACAlC;EACAG;EACAC,OAAOP;EACPmC;EACAH;EACAzB,OAAOH;CAAY,CACpB;CAED,MAAMsC,eAAetB,MAAMuB;CAE3B,MAAM,CAACC,iBAAiBC,WACtB3D,8BAA+DiB,EAAE;CACnE,MAAM,EAAEM,aAAaoC;CAErB,MAAMC,eAAenE,YACnBQ,cAAckC,QAAM;EAClB,IAAI,CAACW,iBAAiB,CAACU,cAAc,OAAOjB,KAAAA;EAC5C,MAAMsB,WAAWhE,iCAAwBsC,IAAE2B,OAAOC,UAAU9C,IAAIG,IAAI;EACpE,IAAI,CAACyC,SAASG,MAAMC,MAAMA,EAAEC,WAAW,YAAYD,EAAER,eAAexC,EAAE,GACpE;EAEF,MAAMkD,OAAON,SAASO,MAAMH,QAAMA,IAAER,eAAeD,YAAY;EAC/D,IAAI,CAACW,MAAM,OAAO5B,KAAAA;EAClB,MAAM8B,mBAAmBR,SAASS,UAC/BL,QAAMA,IAAER,eAAelB,KAAAA,CAC1B,CAAC,EAAEkB;EACH,OAAO;GAAEhD,OAAO0D,KAAK1D;GAAOE,UAAU0D,qBAAqBb;EAAa;CAC1E,CAAC,CACH;CAEA,MAAMlC,UAAUhC,cAEZsE,gBAAgB;EACdnD,OAAOmD,aAAanD;EACpBE,UAAUiD,aAAajD;EACvBC,eACEW,SACEqC,aAAanD,KACf;CACJ,GACF,CAACmD,cAAcrC,QAAQ,CACzB;CAKA,OAAO,CAFLmC,oBAAoBnB,KAAAA,IAAYlB,OAAOL,eAAe0C,iBAEzC;EAAEzC;EAAIK;EAAS,GAAGqC;CAAQ,CAAC;AAC5C;;;;;;;;;;;;;;;;;;;AAoBA,MAAaa,2BAyBTrD"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { unstable_getInteractableVersions } from "../../model-context/interactable-composer-metadata.js";
|
|
2
|
-
import { unstable_useInteractableState } from "./useInteractableState.js";
|
|
3
2
|
import { useJSONEqual } from "../utils/useJSONEqual.js";
|
|
3
|
+
import { unstable_useInteractableState } from "./useInteractableState.js";
|
|
4
4
|
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
5
5
|
import "@assistant-ui/tap/react-shim";
|
|
6
6
|
import { useAuiState } from "@assistant-ui/store";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useToolArgsStatus.d.ts","names":[],"sources":["../../../src/react/model-context/useToolArgsStatus.ts"],"mappings":";
|
|
1
|
+
{"version":3,"file":"useToolArgsStatus.d.ts","names":[],"sources":["../../../src/react/model-context/useToolArgsStatus.ts"],"mappings":";KAQK;;;;KAKO,eACV,cAAc,0BAA0B;;EAGxC;;EAEA,YAAY,QAAQ,aAAa,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;cA2B7B,oBACX,cAAc,0BAA0B,8BACrC,eAAe"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { nullProtoRecord } from "../../utils/record.js";
|
|
1
2
|
import { getPartialJsonObjectFieldState, getPartialJsonObjectMeta } from "assistant-stream/utils";
|
|
2
3
|
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
3
4
|
import "@assistant-ui/tap/react-shim";
|
|
@@ -45,7 +46,7 @@ const useToolArgsStatus = () => {
|
|
|
45
46
|
const meta = t2;
|
|
46
47
|
let propStatus;
|
|
47
48
|
if ($[2] !== args || $[3] !== isStreaming || $[4] !== meta) {
|
|
48
|
-
propStatus =
|
|
49
|
+
propStatus = nullProtoRecord();
|
|
49
50
|
for (const key of Object.keys(args)) if (meta) {
|
|
50
51
|
const fieldState = getPartialJsonObjectFieldState(args, [key]);
|
|
51
52
|
propStatus[key] = fieldState === "complete" || !isStreaming ? "complete" : "streaming";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useToolArgsStatus.js","names":["useMemo","useAuiState","getPartialJsonObjectFieldState","getPartialJsonObjectMeta","PropFieldStatus","ToolArgsStatus","Record","status","propStatus","Partial","TArgs","useToolArgsStatus","$","_c","part","_temp","t0","statusType","type","Error","isStreaming","args","t1","t2","meta","key","Object","keys","fieldState","t3","t4","s"],"sources":["../../../src/react/model-context/useToolArgsStatus.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useAuiState } from \"@assistant-ui/store\";\nimport {\n getPartialJsonObjectFieldState,\n getPartialJsonObjectMeta,\n} from \"assistant-stream/utils\";\n\ntype PropFieldStatus = \"streaming\" | \"complete\";\n\n/**\n * Streaming completion status for the arguments of the current tool call.\n */\nexport type ToolArgsStatus<\n TArgs extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /** Overall lifecycle state of the tool-call part. */\n status: \"running\" | \"complete\" | \"incomplete\" | \"requires-action\";\n /** Per-argument status keyed by argument name. */\n propStatus: Partial<Record<keyof TArgs, PropFieldStatus>>;\n};\n\n/**\n * Reads whether each argument field for the current tool-call message part is\n * still streaming or complete.\n *\n * Use inside a tool-call renderer to avoid showing incomplete argument values\n * as final.\n *\n * @throws If called outside a tool-call message part.\n *\n * @example\n * ```tsx\n * function WeatherToolUI({\n * args,\n * }: ToolCallMessagePartProps<{ city: string }>) {\n * const { propStatus } = useToolArgsStatus<{ city: string }>();\n *\n * return (\n * <span>\n * {propStatus.city === \"streaming\" ? \"Reading city...\" : args.city}\n * </span>\n * );\n * }\n * ```\n */\nexport const useToolArgsStatus = <\n TArgs extends Record<string, unknown> = Record<string, unknown>,\n>(): ToolArgsStatus<TArgs> => {\n const part = useAuiState((s) => s.part);\n\n return useMemo(() => {\n const statusType = part.status.type;\n\n if (part.type !== \"tool-call\") {\n throw new Error(\n \"useToolArgsStatus can only be used inside tool-call message parts\",\n );\n }\n\n const isStreaming = statusType === \"running\";\n const args = part.args as Record<string, unknown>;\n const meta = getPartialJsonObjectMeta(args as Record<symbol, unknown>);\n const propStatus
|
|
1
|
+
{"version":3,"file":"useToolArgsStatus.js","names":["useMemo","useAuiState","getPartialJsonObjectFieldState","getPartialJsonObjectMeta","nullProtoRecord","PropFieldStatus","ToolArgsStatus","Record","status","propStatus","Partial","TArgs","useToolArgsStatus","$","_c","part","_temp","t0","statusType","type","Error","isStreaming","args","t1","t2","meta","key","Object","keys","fieldState","t3","t4","s"],"sources":["../../../src/react/model-context/useToolArgsStatus.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useAuiState } from \"@assistant-ui/store\";\nimport {\n getPartialJsonObjectFieldState,\n getPartialJsonObjectMeta,\n} from \"assistant-stream/utils\";\nimport { nullProtoRecord } from \"../../utils/record\";\n\ntype PropFieldStatus = \"streaming\" | \"complete\";\n\n/**\n * Streaming completion status for the arguments of the current tool call.\n */\nexport type ToolArgsStatus<\n TArgs extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /** Overall lifecycle state of the tool-call part. */\n status: \"running\" | \"complete\" | \"incomplete\" | \"requires-action\";\n /** Per-argument status keyed by argument name. */\n propStatus: Partial<Record<keyof TArgs, PropFieldStatus>>;\n};\n\n/**\n * Reads whether each argument field for the current tool-call message part is\n * still streaming or complete.\n *\n * Use inside a tool-call renderer to avoid showing incomplete argument values\n * as final.\n *\n * @throws If called outside a tool-call message part.\n *\n * @example\n * ```tsx\n * function WeatherToolUI({\n * args,\n * }: ToolCallMessagePartProps<{ city: string }>) {\n * const { propStatus } = useToolArgsStatus<{ city: string }>();\n *\n * return (\n * <span>\n * {propStatus.city === \"streaming\" ? \"Reading city...\" : args.city}\n * </span>\n * );\n * }\n * ```\n */\nexport const useToolArgsStatus = <\n TArgs extends Record<string, unknown> = Record<string, unknown>,\n>(): ToolArgsStatus<TArgs> => {\n const part = useAuiState((s) => s.part);\n\n return useMemo(() => {\n const statusType = part.status.type;\n\n if (part.type !== \"tool-call\") {\n throw new Error(\n \"useToolArgsStatus can only be used inside tool-call message parts\",\n );\n }\n\n const isStreaming = statusType === \"running\";\n const args = part.args as Record<string, unknown>;\n const meta = getPartialJsonObjectMeta(args as Record<symbol, unknown>);\n const propStatus = nullProtoRecord<PropFieldStatus>();\n\n for (const key of Object.keys(args)) {\n if (meta) {\n const fieldState = getPartialJsonObjectFieldState(args, [key]);\n propStatus[key] =\n fieldState === \"complete\" || !isStreaming ? \"complete\" : \"streaming\";\n } else {\n propStatus[key] = isStreaming ? \"streaming\" : \"complete\";\n }\n }\n\n return {\n status: statusType,\n propStatus: propStatus as Partial<Record<keyof TArgs, PropFieldStatus>>,\n };\n }, [part]);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CA,MAAaY,0BAAoB;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAG/B,MAAAC,OAAad,YAAYe,KAAa;CAAE,IAAAC;CAGtC,MAAAC,aAAmBH,KAAIP,OAAOW;CAE9B,IAAIJ,KAAII,SAAU,aAChB,MAAM,IAAIC,MACR,mEACF;CAGF,MAAAC,cAAoBH,eAAe;CACnC,MAAAI,OAAaP,KAAIO;CACqB,MAAAC,KAAAD;CAA+B,IAAAE;CAAA,IAAAX,EAAA,OAAAU,IAAA;EAAxDC,KAAArB,yBAAyBoB,EAA+B;EAACV,EAAA,KAAAU;EAAAV,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAtE,MAAAY,OAAaD;CAA0D,IAAAf;CAAA,IAAAI,EAAA,OAAAS,QAAAT,EAAA,OAAAQ,eAAAR,EAAA,OAAAY,MAAA;EACvEhB,aAAmBL,gBAAiC;EAEpD,KAAK,MAAAsB,OAAaC,OAAMC,KAAMN,IAAI,GAChC,IAAIG,MAAI;GACN,MAAAI,aAAmB3B,+BAA+BoB,MAAM,CAACI,GAAG,CAAC;GAC7DjB,WAAWiB,OACTG,eAAe,cAAf,CAA8BR,cAA9B,aAAA;EADa,OAGfZ,WAAWiB,OAAOL,cAAA,cAAA;EAErBR,EAAA,KAAAS;EAAAT,EAAA,KAAAQ;EAAAR,EAAA,KAAAY;EAAAZ,EAAA,KAAAJ;CAAA,OAAAA,aAAAI,EAAA;CAIa,MAAAiB,KAAArB;CAA2D,IAAAsB;CAAA,IAAAlB,EAAA,OAAAK,cAAAL,EAAA,OAAAiB,IAAA;EAFlEC,KAAA;GAAAvB,QACGU;GAAUT,YACNqB;EACd;EAACjB,EAAA,KAAAK;EAAAL,EAAA,KAAAiB;EAAAjB,EAAA,KAAAkB;CAAA,OAAAA,KAAAlB,EAAA;CAHDI,KAAOc;CAGL,OA3BGd;AA4BG;AAjCqB,SAAAD,MAAAgB,GAAA;CAAA,OAGCA,EAACjB;AAAK"}
|
|
@@ -5,6 +5,13 @@ import { GroupByContext } from "../../utils/groupParts.js";
|
|
|
5
5
|
import { ReactNode } from "react";
|
|
6
6
|
//#region src/react/primitives/message/MessageGroupedParts.d.ts
|
|
7
7
|
declare namespace MessagePrimitiveGroupedParts {
|
|
8
|
+
/** Per status tallies over the group's `indices`; they sum to `indices.length`. */
|
|
9
|
+
type GroupCounts = {
|
|
10
|
+
readonly running: number;
|
|
11
|
+
readonly complete: number;
|
|
12
|
+
readonly incomplete: number;
|
|
13
|
+
readonly requiresAction: number;
|
|
14
|
+
};
|
|
8
15
|
/**
|
|
9
16
|
* A coalesced group of adjacent parts. Surfaced through the same
|
|
10
17
|
* `{ part }` channel as a leaf {@link EnrichedPartState} so consumers
|
|
@@ -15,6 +22,8 @@ declare namespace MessagePrimitiveGroupedParts {
|
|
|
15
22
|
type GroupPart<TKey extends `group-${string}` = `group-${string}`> = {
|
|
16
23
|
readonly type: TKey;
|
|
17
24
|
readonly status: MessagePartStatus | ToolCallMessagePartStatus;
|
|
25
|
+
/** Per status tallies over `indices`. */
|
|
26
|
+
readonly counts: GroupCounts;
|
|
18
27
|
readonly indices: readonly number[];
|
|
19
28
|
};
|
|
20
29
|
/**
|
|
@@ -68,10 +77,10 @@ declare namespace MessagePrimitiveGroupedParts {
|
|
|
68
77
|
* `switch (part.type)` can tell groups apart from real part types.
|
|
69
78
|
*
|
|
70
79
|
* **Prefer {@link groupPartByType}** for the common case of mapping by
|
|
71
|
-
* `part.type` — it ships a stable memo fingerprint so the tree
|
|
80
|
+
* `part.type` or tool name — it ships a stable memo fingerprint so the tree
|
|
72
81
|
* survives unrelated re-renders. Use an inline function only when
|
|
73
82
|
* the helper isn't expressive enough (e.g. branching on
|
|
74
|
-
* `part.
|
|
83
|
+
* `part.parentId` or part metadata).
|
|
75
84
|
*
|
|
76
85
|
* The second argument is a {@link GroupByContext} carrying the tool-UI
|
|
77
86
|
* registry, for grouping that depends on it (e.g. standalone tool calls).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageGroupedParts.d.ts","names":[],"sources":["../../../../src/react/primitives/message/MessageGroupedParts.tsx"],"mappings":";;;;;;kBAmBiB
|
|
1
|
+
{"version":3,"file":"MessageGroupedParts.d.ts","names":[],"sources":["../../../../src/react/primitives/message/MessageGroupedParts.tsx"],"mappings":";;;;;;kBAmBiB;;OAEH;aACD;aACA;aACA;aACA;;;;;;;;;OAUC,UAAU;aACX,MAAM;aACN,QAAQ,oBAAoB;;aAE5B,QAAQ;aACR;;;;;;;;;;;;OAaC;aACD;;;;;;;;;;;;;OAcC;OAEA,WAAW;;;;;;;aAOZ,MAAM,UAAU,QAAQ,oBAAoB;;;;;;;aAO5C,UAAU;;OAGT,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA8BP,UACP,MAAM,WACN,SAAS,4BACG;;;;;;;;;aAUL,YAAY;;;;;;;;;;;;aAaZ,WAAW,MAAM,WAAW,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAoHtC;GAAgC,kCAA8B,SAAA,WAAA,YAIxE,6BAA6B,MAAM,QAAQ"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
2
|
+
import { getGroupSummary } from "../../../utils/getGroupStatus.js";
|
|
3
3
|
import { MessagePartChildren } from "./MessageParts.js";
|
|
4
4
|
import { GROUPBY_MEMO_KEY, buildGroupTree } from "../../utils/groupParts.js";
|
|
5
5
|
import { Fragment, useMemo } from "@assistant-ui/tap/react-shim";
|
|
@@ -36,10 +36,11 @@ const renderNode = (node, parts, render) => {
|
|
|
36
36
|
children: /* @__PURE__ */ jsx(PartChildrenSentinel, {})
|
|
37
37
|
})
|
|
38
38
|
}, node.idKey ? `part-${node.idKey}` : `part-${node.index}`);
|
|
39
|
-
const status =
|
|
39
|
+
const { status, counts } = getGroupSummary(parts, node.indices);
|
|
40
40
|
const groupPart = {
|
|
41
41
|
type: node.key,
|
|
42
42
|
status,
|
|
43
|
+
counts,
|
|
43
44
|
indices: node.indices
|
|
44
45
|
};
|
|
45
46
|
return /* @__PURE__ */ jsx(Fragment, { children: render({
|