@assistant-ui/core 0.3.14 → 0.3.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/voice.js +11 -0
- package/dist/adapters/voice.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/internal.d.ts +8 -2
- package/dist/internal.js +9 -3
- package/dist/model-context/frame/host.d.ts +1 -1
- package/dist/model-context/frame/host.d.ts.map +1 -1
- package/dist/model-context/frame/host.js +20 -5
- package/dist/model-context/frame/host.js.map +1 -1
- package/dist/model-context/frame/provider.d.ts +6 -0
- package/dist/model-context/frame/provider.d.ts.map +1 -1
- package/dist/model-context/frame/provider.js +126 -16
- package/dist/model-context/frame/provider.js.map +1 -1
- package/dist/model-context/frame/types.d.ts +4 -1
- package/dist/model-context/frame/types.d.ts.map +1 -1
- package/dist/model-context/frame/types.js.map +1 -1
- package/dist/model-context/interactable-composer-metadata.d.ts +1 -1
- package/dist/model-context/interactable-composer-metadata.js +1 -1
- package/dist/model-context/interactable-composer-metadata.js.map +1 -1
- package/dist/model-context/registry.d.ts +2 -2
- package/dist/model-context/registry.d.ts.map +1 -1
- package/dist/model-context/registry.js +9 -28
- package/dist/model-context/registry.js.map +1 -1
- package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
- package/dist/react/client/InMemoryThreadList.js +24 -20
- package/dist/react/client/InMemoryThreadList.js.map +1 -1
- package/dist/react/client/Interactables.d.ts.map +1 -1
- package/dist/react/client/Interactables.js +59 -177
- package/dist/react/client/Interactables.js.map +1 -1
- package/dist/react/client/RemoteThreadList.d.ts +1 -1
- package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
- package/dist/react/client/RemoteThreadList.js +117 -78
- package/dist/react/client/RemoteThreadList.js.map +1 -1
- package/dist/react/index.d.ts +2 -1
- package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
- package/dist/react/interactables-legacy/Interactables.js +56 -174
- package/dist/react/interactables-legacy/Interactables.js.map +1 -1
- package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts +24 -0
- package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -0
- package/dist/react/interactables-shared/useInteractablePersistenceQueue.js +138 -0
- package/dist/react/interactables-shared/useInteractablePersistenceQueue.js.map +1 -0
- package/dist/react/primitive-hooks/useActionBarCopy.js +7 -1
- package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
- package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts +3 -0
- package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadIsEmpty.js +3 -0
- package/dist/react/primitive-hooks/useThreadIsEmpty.js.map +1 -1
- package/dist/react/primitive-hooks/useThreadIsRunning.d.ts +3 -0
- package/dist/react/primitive-hooks/useThreadIsRunning.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadIsRunning.js +3 -0
- package/dist/react/primitive-hooks/useThreadIsRunning.js.map +1 -1
- package/dist/react/primitives/composer/ComposerIf.js.map +1 -1
- package/dist/react/primitives/composer/ComposerQueue.d.ts +2 -1
- package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
- package/dist/react/primitives/message/MessageParts.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +3 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +6 -0
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +7 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +174 -64
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadResource.js +2 -0
- package/dist/react/runtimes/RemoteThreadResource.js.map +1 -1
- package/dist/react/runtimes/assistant-transport/runManager.d.ts.map +1 -1
- package/dist/react/runtimes/assistant-transport/runManager.js +2 -12
- package/dist/react/runtimes/assistant-transport/runManager.js.map +1 -1
- package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
- package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js +1 -1
- package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js.map +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +3 -10
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +20 -67
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
- package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts +12 -0
- package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts.map +1 -0
- package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.js +10 -0
- package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.js.map +1 -0
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +38 -5
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
- package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js.map +1 -1
- package/dist/react/runtimes/createMessageConverter.d.ts +2 -1
- package/dist/react/runtimes/createMessageConverter.d.ts.map +1 -1
- package/dist/react/runtimes/external-message-converter.d.ts +6 -25
- package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
- package/dist/react/runtimes/external-message-converter.js +33 -233
- package/dist/react/runtimes/external-message-converter.js.map +1 -1
- package/dist/runtime/api/composer-runtime.d.ts +1 -1
- package/dist/runtime/api/composer-runtime.js.map +1 -1
- package/dist/runtime/api/thread-runtime.d.ts +1 -2
- package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
- package/dist/runtime/base/base-composer-runtime-core.d.ts +1 -1
- package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/base-composer-runtime-core.js +14 -29
- package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
- package/dist/runtime/base/base-thread-runtime-core.d.ts +2 -4
- package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/base-thread-runtime-core.js +3 -9
- package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
- package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +1 -1
- package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/default-thread-composer-runtime-core.js +1 -1
- package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
- package/dist/runtime/interfaces/composer-runtime-core.d.ts +1 -1
- package/dist/runtime/interfaces/thread-runtime-core.d.ts +1 -1
- package/dist/runtime/internal.d.ts +2 -1
- package/dist/runtime/internal.js +2 -1
- package/dist/runtime/queue/external-thread-queue-adapter.d.ts +1 -1
- package/dist/runtime/queue/message-queue.d.ts.map +1 -1
- package/dist/runtime/queue/message-queue.js +1 -1
- package/dist/runtime/queue/message-queue.js.map +1 -1
- package/dist/runtime/queue/queue-item.d.ts +12 -0
- package/dist/runtime/queue/queue-item.d.ts.map +1 -0
- package/dist/runtime/queue/queue-item.js +6 -0
- package/dist/runtime/queue/queue-item.js.map +1 -0
- package/dist/runtime/utils/abortable-thread-load.d.ts +15 -0
- package/dist/runtime/utils/abortable-thread-load.d.ts.map +1 -0
- package/dist/runtime/utils/abortable-thread-load.js +35 -0
- package/dist/runtime/utils/abortable-thread-load.js.map +1 -0
- package/dist/runtime/utils/attachment-add-operations.d.ts +18 -0
- package/dist/runtime/utils/attachment-add-operations.d.ts.map +1 -0
- package/dist/runtime/utils/attachment-add-operations.js +43 -0
- package/dist/runtime/utils/attachment-add-operations.js.map +1 -0
- package/dist/runtime/utils/auto-status.d.ts +6 -1
- package/dist/runtime/utils/auto-status.d.ts.map +1 -1
- package/dist/runtime/utils/auto-status.js +7 -1
- package/dist/runtime/utils/auto-status.js.map +1 -1
- package/dist/runtime/utils/external-message-conversion.d.ts +47 -0
- package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -0
- package/dist/runtime/utils/external-message-conversion.js +221 -0
- package/dist/runtime/utils/external-message-conversion.js.map +1 -0
- package/dist/runtime/utils/external-store-message.d.ts +2 -1
- package/dist/runtime/utils/external-store-message.d.ts.map +1 -1
- package/dist/runtime/utils/external-store-message.js +2 -1
- package/dist/runtime/utils/external-store-message.js.map +1 -1
- package/dist/runtime/utils/message-repository-session.d.ts +30 -0
- package/dist/runtime/utils/message-repository-session.d.ts.map +1 -0
- package/dist/runtime/utils/message-repository-session.js +130 -0
- package/dist/runtime/utils/message-repository-session.js.map +1 -0
- package/dist/runtime/utils/message-repository.d.ts.map +1 -1
- package/dist/runtime/utils/message-repository.js +30 -22
- package/dist/runtime/utils/message-repository.js.map +1 -1
- package/dist/runtime/utils/pending-tool-calls.d.ts +20 -0
- package/dist/runtime/utils/pending-tool-calls.d.ts.map +1 -0
- package/dist/runtime/utils/pending-tool-calls.js +22 -0
- package/dist/runtime/utils/pending-tool-calls.js.map +1 -0
- package/dist/runtime/utils/thread-message-like.d.ts +2 -1
- package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
- package/dist/runtime/utils/thread-message-like.js.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +2 -5
- package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +3 -10
- package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +19 -1
- package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-runtime-core.js +124 -20
- package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
- package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts +102 -0
- package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts.map +1 -0
- package/dist/runtimes/inert/InertThreadRuntimeCore.js +156 -0
- package/dist/runtimes/inert/InertThreadRuntimeCore.js.map +1 -0
- package/dist/runtimes/local/local-thread-runtime-core.d.ts +3 -1
- package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/local/local-thread-runtime-core.js +45 -8
- package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
- package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +12 -60
- package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
- package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +10 -145
- package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
- package/dist/runtimes/remote-thread-list/adapter-changed.d.ts +9 -0
- package/dist/runtimes/remote-thread-list/adapter-changed.d.ts.map +1 -0
- package/dist/runtimes/remote-thread-list/adapter-changed.js +13 -0
- package/dist/runtimes/remote-thread-list/adapter-changed.js.map +1 -0
- package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/empty-thread-core.js +16 -155
- package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
- package/dist/runtimes/remote-thread-list/optimistic-state.d.ts +2 -0
- package/dist/runtimes/remote-thread-list/optimistic-state.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/optimistic-state.js +11 -0
- package/dist/runtimes/remote-thread-list/optimistic-state.js.map +1 -1
- package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +12 -1
- package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/remote-thread-state.js +77 -1
- package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
- package/dist/runtimes/remote-thread-list/types.d.ts +3 -0
- package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
- package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
- package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +2 -0
- package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
- package/dist/store/clients/external-thread.d.ts.map +1 -1
- package/dist/store/clients/external-thread.js +75 -100
- package/dist/store/clients/external-thread.js.map +1 -1
- package/dist/store/clients/single-thread-list.d.ts.map +1 -1
- package/dist/store/clients/single-thread-list.js +1 -1
- package/dist/store/clients/single-thread-list.js.map +1 -1
- package/dist/store/clients/suggestions.d.ts.map +1 -1
- package/dist/store/clients/suggestions.js +16 -7
- package/dist/store/clients/suggestions.js.map +1 -1
- package/dist/store/index.d.ts +4 -2
- package/dist/store/runtime-clients/handle-runtime-action.d.ts.map +1 -1
- package/dist/store/runtime-clients/handle-runtime-action.js +2 -0
- package/dist/store/runtime-clients/handle-runtime-action.js.map +1 -1
- package/dist/store/scope-registration.d.ts +1 -1
- package/dist/store/scopes/composer.d.ts +2 -1
- package/dist/store/scopes/composer.d.ts.map +1 -1
- package/dist/store/scopes/message.d.ts +1 -1
- package/dist/store/scopes/queue-item.d.ts +2 -9
- package/dist/store/scopes/queue-item.d.ts.map +1 -1
- package/dist/store/scopes/queue-item.js +0 -6
- package/dist/types/message.d.ts +8 -4
- package/dist/types/message.d.ts.map +1 -1
- package/dist/types/message.js.map +1 -1
- package/dist/utils/data-url.d.ts +14 -1
- package/dist/utils/data-url.d.ts.map +1 -1
- package/dist/utils/data-url.js +13 -1
- package/dist/utils/data-url.js.map +1 -1
- package/dist/utils/invoke-user-callback.d.ts +5 -0
- package/dist/utils/invoke-user-callback.d.ts.map +1 -0
- package/dist/utils/invoke-user-callback.js +19 -0
- package/dist/utils/invoke-user-callback.js.map +1 -0
- package/dist/utils/normalizePartStatus.js.map +1 -1
- package/dist/utils/silent-runtime-action.d.ts +6 -0
- package/dist/utils/silent-runtime-action.d.ts.map +1 -0
- package/dist/utils/silent-runtime-action.js +7 -0
- package/dist/utils/silent-runtime-action.js.map +1 -0
- package/package.json +10 -10
- package/src/adapters/voice.test.ts +66 -1
- package/src/adapters/voice.ts +8 -0
- package/src/internal.ts +13 -0
- package/src/model-context/frame/host.test.ts +152 -9
- package/src/model-context/frame/host.ts +23 -5
- package/src/model-context/frame/provider.test.ts +601 -19
- package/src/model-context/frame/provider.ts +158 -20
- package/src/model-context/frame/types.ts +5 -0
- package/src/model-context/interactable-composer-metadata.ts +1 -1
- package/src/model-context/registry.test.ts +44 -0
- package/src/model-context/registry.ts +13 -35
- package/src/react/client/InMemoryThreadList.test.tsx +49 -0
- package/src/react/client/InMemoryThreadList.ts +7 -1
- package/src/react/client/Interactables.ts +19 -178
- package/src/react/client/RemoteThreadList.test.ts +292 -0
- package/src/react/client/RemoteThreadList.ts +119 -82
- package/src/react/interactables-legacy/Interactables.ts +20 -177
- package/src/react/interactables-shared/useInteractablePersistenceQueue.test.tsx +161 -0
- package/src/react/interactables-shared/useInteractablePersistenceQueue.ts +206 -0
- package/src/react/primitive-hooks/useActionBarCopy.test.ts +15 -0
- package/src/react/primitive-hooks/useActionBarCopy.ts +13 -3
- package/src/react/primitive-hooks/useThreadIsEmpty.ts +3 -0
- package/src/react/primitive-hooks/useThreadIsRunning.ts +3 -0
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +12 -0
- package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.republish.test.ts +87 -0
- package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +251 -76
- package/src/react/runtimes/RemoteThreadResource.ts +2 -0
- package/src/react/runtimes/assistant-transport/runManager.ts +4 -17
- package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.test.tsx +58 -0
- package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts +3 -1
- package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +92 -0
- package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +40 -141
- package/src/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.test.ts +37 -0
- package/src/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.ts +18 -0
- package/src/react/runtimes/cloud/useCloudThreadListAdapter.test.tsx +98 -3
- package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +68 -6
- package/src/react/runtimes/external-message-converter.test.ts +0 -14
- package/src/react/runtimes/external-message-converter.test.tsx +77 -0
- package/src/react/runtimes/external-message-converter.ts +58 -481
- package/src/react/runtimes/useLocalRuntime.test.tsx +5 -5
- package/src/runtime/api/composer-runtime.ts +1 -1
- package/src/runtime/api/message-runtime.test.ts +28 -1
- package/src/runtime/base/base-composer-runtime-core.ts +20 -40
- package/src/runtime/base/base-thread-runtime-core.test.ts +16 -0
- package/src/runtime/base/base-thread-runtime-core.ts +6 -11
- package/src/runtime/base/default-thread-composer-runtime-core.ts +1 -4
- package/src/runtime/interfaces/composer-runtime-core.ts +1 -1
- package/src/runtime/interfaces/thread-runtime-core.ts +1 -1
- package/src/runtime/internal.ts +5 -0
- package/src/runtime/queue/external-thread-queue-adapter.ts +1 -1
- package/src/runtime/queue/message-queue.ts +1 -4
- package/src/runtime/queue/queue-item.ts +10 -0
- package/src/runtime/utils/abortable-thread-load.test.ts +87 -0
- package/src/runtime/utils/abortable-thread-load.ts +53 -0
- package/src/runtime/utils/attachment-add-operations.ts +59 -0
- package/src/runtime/utils/auto-status.ts +33 -0
- package/src/runtime/utils/external-message-conversion.test.ts +113 -0
- package/src/runtime/utils/external-message-conversion.ts +494 -0
- package/src/runtime/utils/external-store-message.ts +2 -0
- package/src/runtime/utils/message-repository-session.test.ts +195 -0
- package/src/runtime/utils/message-repository-session.ts +176 -0
- package/src/runtime/utils/message-repository.ts +33 -22
- package/src/runtime/utils/pending-tool-calls.test.ts +57 -0
- package/src/runtime/utils/pending-tool-calls.ts +35 -0
- package/src/runtime/utils/thread-message-like.ts +2 -0
- package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +6 -14
- package/src/runtimes/external-store/external-store-thread-runtime-core.ts +179 -28
- package/src/runtimes/inert/InertThreadRuntimeCore.test.ts +253 -0
- package/src/runtimes/inert/InertThreadRuntimeCore.ts +232 -0
- package/src/runtimes/local/local-thread-runtime-core.test.ts +491 -1
- package/src/runtimes/local/local-thread-runtime-core.ts +86 -11
- package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +17 -209
- package/src/runtimes/remote-thread-list/adapter-changed.ts +10 -0
- package/src/runtimes/remote-thread-list/empty-thread-core.ts +28 -221
- package/src/runtimes/remote-thread-list/optimistic-state.test.ts +18 -0
- package/src/runtimes/remote-thread-list/optimistic-state.ts +13 -0
- package/src/runtimes/remote-thread-list/remote-thread-state.test.ts +37 -0
- package/src/runtimes/remote-thread-list/remote-thread-state.ts +123 -0
- package/src/runtimes/remote-thread-list/types.ts +4 -0
- package/src/runtimes/tool-invocations/EDGE_CASES.md +17 -0
- package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +140 -0
- package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +3 -0
- package/src/store/clients/external-thread.ts +17 -62
- package/src/store/clients/single-thread-list.ts +4 -1
- package/src/store/clients/suggestions.test.ts +31 -0
- package/src/store/clients/suggestions.ts +18 -19
- package/src/store/runtime-clients/handle-runtime-action.test.ts +40 -0
- package/src/store/runtime-clients/handle-runtime-action.ts +3 -0
- package/src/store/scopes/message.ts +1 -1
- package/src/store/scopes/queue-item.ts +2 -9
- package/src/tests/MessageRepository.test.ts +125 -0
- package/src/tests/RemoteThreadListThreadListRuntimeCore-errors.test.ts +2 -2
- package/src/tests/RemoteThreadListThreadListRuntimeCore-load-race.test.ts +194 -0
- package/src/tests/RemoteThreadListThreadListRuntimeCore-loadMore.test.ts +8 -6
- package/src/tests/RemoteThreadListThreadListRuntimeCore-title-race.test.ts +158 -0
- package/src/tests/empty-thread-core.test.ts +6 -0
- package/src/tests/external-store-thread-runtime-core-adapter.test.ts +184 -0
- package/src/tests/external-store-thread-runtime-core.test.ts +642 -0
- package/src/tests/external-thread-attachments.test.tsx +173 -0
- package/src/tests/external-thread-isEmpty.test.tsx +100 -0
- package/src/tests/remote-thread-list-adapter-switch.test.ts +383 -0
- package/src/tests/single-thread-list-item.test.tsx +47 -0
- package/src/tests/thread-message-like.test.ts +39 -1
- package/src/tests/useRemoteThreadListRuntime-controlled.test.tsx +67 -0
- package/src/types/message.ts +9 -4
- package/src/utils/data-url.test.ts +52 -1
- package/src/utils/data-url.ts +21 -0
- package/src/utils/invoke-user-callback.test.ts +82 -0
- package/src/utils/invoke-user-callback.ts +31 -0
- package/src/utils/normalizePartStatus.ts +1 -1
- package/src/utils/silent-runtime-action.ts +6 -0
- package/dist/store/scopes/queue-item.js.map +0 -1
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { findModelKnownState, interactableToolName } from "../../model-context/interactable-composer-metadata.js";
|
|
2
2
|
import { notifySubscribers } from "../../subscribable/subscribable.js";
|
|
3
3
|
import { ModelContext } from "../../store/clients/model-context-client.js";
|
|
4
|
+
import { useInteractablePersistenceQueue } from "../interactables-shared/useInteractablePersistenceQueue.js";
|
|
4
5
|
import { buildInteractableModelContext } from "./interactable-model-context.js";
|
|
5
6
|
import { toJSONSchema, toPartialJSONSchema } from "assistant-stream";
|
|
6
7
|
import { useCallback, useEffect, useMemo, useRef, useState } from "@assistant-ui/tap/react-shim";
|
|
7
8
|
import { resource } from "@assistant-ui/tap";
|
|
8
9
|
import { attachTransformScopes, useAssistantClientRef, useAssistantScopeEffect } from "@assistant-ui/store/client";
|
|
9
10
|
//#region src/react/client/Interactables.ts
|
|
10
|
-
const PERSISTENCE_DEBOUNCE_MS = 500;
|
|
11
11
|
const hasInteractableCreateCall = (messages, id, name) => messages.some((message) => message.role === "assistant" && message.content?.some((part) => {
|
|
12
12
|
if (!part || typeof part !== "object") return false;
|
|
13
13
|
const p = part;
|
|
@@ -30,14 +30,6 @@ const useInteractablesResource = ({ persistence } = {}) => {
|
|
|
30
30
|
const loadedStateRef = useRef(/* @__PURE__ */ new Map());
|
|
31
31
|
const touchedIdsRef = useRef(/* @__PURE__ */ new Set());
|
|
32
32
|
const adapterRef = useRef(void 0);
|
|
33
|
-
const debounceTimerRef = useRef(void 0);
|
|
34
|
-
const syncSeqRef = useRef(0);
|
|
35
|
-
const latestSyncSeqByIdRef = useRef(/* @__PURE__ */ new Map());
|
|
36
|
-
const inFlightPersistenceRef = useRef(0);
|
|
37
|
-
const flushResolversRef = useRef([]);
|
|
38
|
-
const dirtyIdsRef = useRef(/* @__PURE__ */ new Set());
|
|
39
|
-
const outgoingQueueRef = useRef([]);
|
|
40
|
-
const runPersistenceRef = useRef(() => {});
|
|
41
33
|
const setStateAndRef = useCallback((updater) => {
|
|
42
34
|
const next = updater(stateRef.current);
|
|
43
35
|
stateRef.current = next;
|
|
@@ -54,137 +46,39 @@ const useInteractablesResource = ({ persistence } = {}) => {
|
|
|
54
46
|
}
|
|
55
47
|
return result;
|
|
56
48
|
}, []);
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const batch = takeDirtyBatch(adapter_0);
|
|
72
|
-
if (!batch) return;
|
|
73
|
-
if (inFlightPersistenceRef.current === 0) runPersistenceRef.current(batch);
|
|
74
|
-
else outgoingQueueRef.current.push(batch);
|
|
75
|
-
}, [takeDirtyBatch]);
|
|
76
|
-
const runPersistence = useCallback(async (batch_0) => {
|
|
77
|
-
const resolved = batch_0 ?? (adapterRef.current ? takeDirtyBatch(adapterRef.current) : void 0);
|
|
78
|
-
if (!resolved) {
|
|
79
|
-
if (inFlightPersistenceRef.current === 0) {
|
|
80
|
-
for (const resolve of flushResolversRef.current) resolve();
|
|
81
|
-
flushResolversRef.current = [];
|
|
82
|
-
}
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
const { adapter: adapter_1, payload, dirtyIds: dirtyIds_0, seq: seq_0 } = resolved;
|
|
86
|
-
inFlightPersistenceRef.current += 1;
|
|
87
|
-
setStateAndRef((prev) => ({
|
|
88
|
-
...prev,
|
|
89
|
-
persistence: {
|
|
90
|
-
...prev.persistence,
|
|
91
|
-
...Object.fromEntries([...dirtyIds_0].map((id_1) => [id_1, {
|
|
92
|
-
isPending: true,
|
|
93
|
-
error: void 0
|
|
94
|
-
}]))
|
|
95
|
-
}
|
|
96
|
-
}));
|
|
97
|
-
try {
|
|
98
|
-
await adapter_1.save(payload);
|
|
99
|
-
setStateAndRef((prev_1) => {
|
|
100
|
-
let changed_0 = false;
|
|
101
|
-
const persistence_1 = { ...prev_1.persistence };
|
|
102
|
-
for (const id_3 of dirtyIds_0) {
|
|
103
|
-
if (latestSyncSeqByIdRef.current.get(id_3) !== seq_0 || dirtyIdsRef.current.has(id_3)) continue;
|
|
104
|
-
latestSyncSeqByIdRef.current.delete(id_3);
|
|
105
|
-
delete persistence_1[id_3];
|
|
106
|
-
changed_0 = true;
|
|
107
|
-
}
|
|
108
|
-
return changed_0 ? {
|
|
109
|
-
...prev_1,
|
|
110
|
-
persistence: persistence_1
|
|
111
|
-
} : prev_1;
|
|
112
|
-
});
|
|
113
|
-
} catch (e) {
|
|
114
|
-
setStateAndRef((prev_0) => {
|
|
115
|
-
let changed = false;
|
|
116
|
-
const persistence_0 = { ...prev_0.persistence };
|
|
117
|
-
for (const id_2 of dirtyIds_0) {
|
|
118
|
-
if (latestSyncSeqByIdRef.current.get(id_2) !== seq_0 || dirtyIdsRef.current.has(id_2)) continue;
|
|
119
|
-
latestSyncSeqByIdRef.current.delete(id_2);
|
|
120
|
-
persistence_0[id_2] = {
|
|
121
|
-
isPending: false,
|
|
122
|
-
error: e
|
|
123
|
-
};
|
|
124
|
-
changed = true;
|
|
125
|
-
}
|
|
126
|
-
return changed ? {
|
|
127
|
-
...prev_0,
|
|
128
|
-
persistence: persistence_0
|
|
129
|
-
} : prev_0;
|
|
130
|
-
});
|
|
131
|
-
} finally {
|
|
132
|
-
inFlightPersistenceRef.current -= 1;
|
|
133
|
-
const next = outgoingQueueRef.current.shift() ?? (adapterRef.current && dirtyIdsRef.current.size > 0 ? takeDirtyBatch(adapterRef.current) : void 0);
|
|
134
|
-
if (next) {
|
|
135
|
-
if (debounceTimerRef.current !== void 0) {
|
|
136
|
-
clearTimeout(debounceTimerRef.current);
|
|
137
|
-
debounceTimerRef.current = void 0;
|
|
138
|
-
}
|
|
139
|
-
runPersistenceRef.current(next);
|
|
140
|
-
} else if (inFlightPersistenceRef.current === 0) {
|
|
141
|
-
for (const resolve of flushResolversRef.current) resolve();
|
|
142
|
-
flushResolversRef.current = [];
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}, [setStateAndRef, takeDirtyBatch]);
|
|
146
|
-
runPersistenceRef.current = (nextBatch) => {
|
|
147
|
-
runPersistence(nextBatch);
|
|
148
|
-
};
|
|
149
|
-
const flushIfPending = useCallback(() => {
|
|
150
|
-
if (debounceTimerRef.current !== void 0) {
|
|
151
|
-
clearTimeout(debounceTimerRef.current);
|
|
152
|
-
debounceTimerRef.current = void 0;
|
|
153
|
-
}
|
|
154
|
-
if (adapterRef.current) enqueuePersistence(adapterRef.current);
|
|
155
|
-
}, [enqueuePersistence]);
|
|
156
|
-
const schedulePersistence = useCallback((id_4) => {
|
|
157
|
-
if (!adapterRef.current) return;
|
|
158
|
-
dirtyIdsRef.current.add(id_4);
|
|
159
|
-
if (debounceTimerRef.current !== void 0) clearTimeout(debounceTimerRef.current);
|
|
160
|
-
debounceTimerRef.current = setTimeout(() => {
|
|
161
|
-
debounceTimerRef.current = void 0;
|
|
162
|
-
if (inFlightPersistenceRef.current === 0 && adapterRef.current) enqueuePersistence(adapterRef.current);
|
|
163
|
-
else debounceTimerRef.current = setTimeout(() => {
|
|
164
|
-
debounceTimerRef.current = void 0;
|
|
165
|
-
if (adapterRef.current) enqueuePersistence(adapterRef.current);
|
|
166
|
-
}, PERSISTENCE_DEBOUNCE_MS);
|
|
167
|
-
}, PERSISTENCE_DEBOUNCE_MS);
|
|
168
|
-
}, [enqueuePersistence]);
|
|
49
|
+
const updatePersistenceStatus = useCallback((updater_0) => {
|
|
50
|
+
setStateAndRef((prev) => {
|
|
51
|
+
const persistence_0 = updater_0(prev.persistence);
|
|
52
|
+
return persistence_0 === prev.persistence ? prev : {
|
|
53
|
+
...prev,
|
|
54
|
+
persistence: persistence_0
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
}, [setStateAndRef]);
|
|
58
|
+
const { flushIfPending, schedulePersistence, flush } = useInteractablePersistenceQueue({
|
|
59
|
+
adapterRef,
|
|
60
|
+
snapshot: exportState,
|
|
61
|
+
updatePersistenceStatus
|
|
62
|
+
});
|
|
169
63
|
const restorePersistedState = useCallback((saved, options) => {
|
|
170
64
|
const shouldStash = options.shouldStash ?? (() => true);
|
|
171
65
|
const shouldApply = options.shouldApply ?? (() => true);
|
|
172
|
-
for (const [
|
|
173
|
-
setStateAndRef((
|
|
174
|
-
let
|
|
175
|
-
const definitions = { ...
|
|
176
|
-
for (const [
|
|
177
|
-
const def_0 = definitions[
|
|
178
|
-
if (!def_0 || !shouldApply(
|
|
179
|
-
definitions[
|
|
66
|
+
for (const [id_0, entry] of Object.entries(saved)) if (shouldStash(id_0)) options.stash.set(id_0, entry.state);
|
|
67
|
+
setStateAndRef((prev_0) => {
|
|
68
|
+
let changed = false;
|
|
69
|
+
const definitions = { ...prev_0.definitions };
|
|
70
|
+
for (const [id_1, entry_0] of Object.entries(saved)) {
|
|
71
|
+
const def_0 = definitions[id_1];
|
|
72
|
+
if (!def_0 || !shouldApply(id_1, def_0)) continue;
|
|
73
|
+
definitions[id_1] = {
|
|
180
74
|
...def_0,
|
|
181
75
|
state: entry_0.state
|
|
182
76
|
};
|
|
183
|
-
|
|
77
|
+
changed = true;
|
|
184
78
|
}
|
|
185
|
-
if (!
|
|
79
|
+
if (!changed) return prev_0;
|
|
186
80
|
return {
|
|
187
|
-
...
|
|
81
|
+
...prev_0,
|
|
188
82
|
definitions
|
|
189
83
|
};
|
|
190
84
|
});
|
|
@@ -195,24 +89,24 @@ const useInteractablesResource = ({ persistence } = {}) => {
|
|
|
195
89
|
const applyLoadedState = useCallback((saved_1) => {
|
|
196
90
|
restorePersistedState(saved_1, {
|
|
197
91
|
stash: loadedStateRef.current,
|
|
198
|
-
shouldStash: (
|
|
199
|
-
shouldApply: (
|
|
92
|
+
shouldStash: (id_2) => !touchedIdsRef.current.has(id_2),
|
|
93
|
+
shouldApply: (id_3, def_1) => !touchedIdsRef.current.has(id_3) && def_1.scope !== "thread"
|
|
200
94
|
});
|
|
201
95
|
}, [restorePersistedState]);
|
|
202
|
-
const loadFromAdapter = useCallback(async (
|
|
203
|
-
if (!
|
|
96
|
+
const loadFromAdapter = useCallback(async (adapter) => {
|
|
97
|
+
if (!adapter.load) return;
|
|
204
98
|
try {
|
|
205
|
-
const saved_2 = await
|
|
206
|
-
if (!saved_2 || adapterRef.current !==
|
|
99
|
+
const saved_2 = await adapter.load();
|
|
100
|
+
if (!saved_2 || adapterRef.current !== adapter) return;
|
|
207
101
|
applyLoadedState(saved_2);
|
|
208
|
-
} catch (
|
|
209
|
-
console.warn("[Interactables] Persistence load failed.",
|
|
102
|
+
} catch (e) {
|
|
103
|
+
console.warn("[Interactables] Persistence load failed.", e);
|
|
210
104
|
}
|
|
211
105
|
}, [applyLoadedState]);
|
|
212
|
-
const setPersistenceAdapter = useCallback((
|
|
213
|
-
if (adapterRef.current !==
|
|
214
|
-
adapterRef.current =
|
|
215
|
-
if (
|
|
106
|
+
const setPersistenceAdapter = useCallback((adapter_0) => {
|
|
107
|
+
if (adapterRef.current !== adapter_0) flushIfPending();
|
|
108
|
+
adapterRef.current = adapter_0;
|
|
109
|
+
if (adapter_0) loadFromAdapter(adapter_0);
|
|
216
110
|
}, [flushIfPending, loadFromAdapter]);
|
|
217
111
|
const getCurrentThreadId = useCallback(() => {
|
|
218
112
|
const client = clientRef.current;
|
|
@@ -229,35 +123,23 @@ const useInteractablesResource = ({ persistence } = {}) => {
|
|
|
229
123
|
if (adapterRef.current === persistence) setPersistenceAdapter(void 0);
|
|
230
124
|
};
|
|
231
125
|
}, [persistence, setPersistenceAdapter]);
|
|
232
|
-
const
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
if (!(inFlightPersistenceRef.current > 0 || dirtyIdsRef.current.size > 0 || outgoingQueueRef.current.length > 0)) return;
|
|
238
|
-
const p = new Promise((resolve_0) => {
|
|
239
|
-
flushResolversRef.current.push(resolve_0);
|
|
240
|
-
});
|
|
241
|
-
if (adapterRef.current) enqueuePersistence(adapterRef.current);
|
|
242
|
-
return p;
|
|
243
|
-
}, [enqueuePersistence]);
|
|
244
|
-
const setDefState = useCallback((id_9, updater_0) => {
|
|
245
|
-
touchedIdsRef.current.add(id_9);
|
|
246
|
-
setStateAndRef((prev_3) => {
|
|
247
|
-
const existing = prev_3.definitions[id_9];
|
|
248
|
-
if (!existing) return prev_3;
|
|
126
|
+
const setDefState = useCallback((id_4, updater_1) => {
|
|
127
|
+
touchedIdsRef.current.add(id_4);
|
|
128
|
+
setStateAndRef((prev_1) => {
|
|
129
|
+
const existing = prev_1.definitions[id_4];
|
|
130
|
+
if (!existing) return prev_1;
|
|
249
131
|
return {
|
|
250
|
-
...
|
|
132
|
+
...prev_1,
|
|
251
133
|
definitions: {
|
|
252
|
-
...
|
|
253
|
-
[
|
|
134
|
+
...prev_1.definitions,
|
|
135
|
+
[id_4]: {
|
|
254
136
|
...existing,
|
|
255
|
-
state:
|
|
137
|
+
state: updater_1(existing.state)
|
|
256
138
|
}
|
|
257
139
|
}
|
|
258
140
|
};
|
|
259
141
|
});
|
|
260
|
-
if (stateRef.current.definitions[
|
|
142
|
+
if (stateRef.current.definitions[id_4]?.scope !== "thread") schedulePersistence(id_4);
|
|
261
143
|
}, [schedulePersistence, setStateAndRef]);
|
|
262
144
|
const provider = useMemo(() => ({
|
|
263
145
|
getModelContext: () => {
|
|
@@ -326,8 +208,8 @@ const useInteractablesResource = ({ persistence } = {}) => {
|
|
|
326
208
|
if (!partialSchemaCacheRef.current.has(def_2.id)) try {
|
|
327
209
|
const jsonSchema = toJSONSchema(def_2.stateSchema);
|
|
328
210
|
partialSchemaCacheRef.current.set(def_2.id, toPartialJSONSchema(jsonSchema));
|
|
329
|
-
} catch (
|
|
330
|
-
console.warn(`[Interactables] Failed to create partial schema for "${def_2.name}". The update tool will accept arbitrary fields without validation.`,
|
|
211
|
+
} catch (e_0) {
|
|
212
|
+
console.warn(`[Interactables] Failed to create partial schema for "${def_2.name}". The update tool will accept arbitrary fields without validation.`, e_0);
|
|
331
213
|
}
|
|
332
214
|
const threadId = scope === "thread" ? getCurrentThreadId() : void 0;
|
|
333
215
|
const detached = scope === "thread" ? threadId ? detachedThreadStateRef.current.get(threadId)?.get(def_2.id) : void 0 : detachedAppStateRef.current.get(def_2.id);
|
|
@@ -336,10 +218,10 @@ const useInteractablesResource = ({ persistence } = {}) => {
|
|
|
336
218
|
} else detachedAppStateRef.current.delete(def_2.id);
|
|
337
219
|
const loaded = scope === "thread" ? void 0 : loadedStateRef.current.get(def_2.id);
|
|
338
220
|
const known = scope === "thread" ? findModelKnownState(threadMessages, def_2.id, def_2.name) : void 0;
|
|
339
|
-
setStateAndRef((
|
|
340
|
-
...
|
|
221
|
+
setStateAndRef((prev_2) => ({
|
|
222
|
+
...prev_2,
|
|
341
223
|
definitions: {
|
|
342
|
-
...
|
|
224
|
+
...prev_2.definitions,
|
|
343
225
|
[def_2.id]: {
|
|
344
226
|
id: def_2.id,
|
|
345
227
|
name: def_2.name,
|
|
@@ -347,7 +229,7 @@ const useInteractablesResource = ({ persistence } = {}) => {
|
|
|
347
229
|
stateSchema: def_2.stateSchema,
|
|
348
230
|
initialState: def_2.initialState,
|
|
349
231
|
scope,
|
|
350
|
-
state:
|
|
232
|
+
state: prev_2.definitions[def_2.id]?.state ?? detached ?? known?.state ?? loaded ?? def_2.initialState
|
|
351
233
|
}
|
|
352
234
|
}
|
|
353
235
|
}));
|
|
@@ -360,8 +242,8 @@ const useInteractablesResource = ({ persistence } = {}) => {
|
|
|
360
242
|
}
|
|
361
243
|
registrationCountsRef.current.delete(def_2.id);
|
|
362
244
|
flushIfPending();
|
|
363
|
-
setStateAndRef((
|
|
364
|
-
const existing_1 =
|
|
245
|
+
setStateAndRef((prev_3) => {
|
|
246
|
+
const existing_1 = prev_3.definitions[def_2.id];
|
|
365
247
|
if (existing_1) {
|
|
366
248
|
if (existing_1.scope === "thread") {
|
|
367
249
|
const threadId_0 = getCurrentThreadId();
|
|
@@ -376,10 +258,10 @@ const useInteractablesResource = ({ persistence } = {}) => {
|
|
|
376
258
|
} else detachedAppStateRef.current.set(def_2.id, existing_1.state);
|
|
377
259
|
}
|
|
378
260
|
partialSchemaCacheRef.current.delete(def_2.id);
|
|
379
|
-
const { [def_2.id]: _, ...rest } =
|
|
380
|
-
const { [def_2.id]: __, ...restPersistence } =
|
|
261
|
+
const { [def_2.id]: _, ...rest } = prev_3.definitions;
|
|
262
|
+
const { [def_2.id]: __, ...restPersistence } = prev_3.persistence;
|
|
381
263
|
return {
|
|
382
|
-
...
|
|
264
|
+
...prev_3,
|
|
383
265
|
definitions: rest,
|
|
384
266
|
persistence: restPersistence
|
|
385
267
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Interactables.js","names":["useState","useEffect","useCallback","useRef","useMemo","resource","ClientOutput","attachTransformScopes","useAssistantClientRef","useAssistantScopeEffect","Unstable_InteractablesState","Unstable_InteractableRegistration","Unstable_InteractablePersistedState","Unstable_InteractablePersistenceAdapter","Unstable_InteractablesConfig","toJSONSchema","toPartialJSONSchema","ModelContext","buildInteractableModelContext","PartialJSONSchema","findModelKnownState","interactableToolName","notifySubscribers","notifyStateSubscribers","PERSISTENCE_DEBOUNCE_MS","RestorePersistedStateOptions","stash","Map","shouldStash","id","shouldApply","def","ToolCallLikePart","type","toolCallId","toolName","MessageLike","role","content","InternalInteractableRegistration","scope","UpdateToolUIEntry","count","render","NonNullable","unsubscribe","hasInteractableCreateCall","messages","name","some","message","part","p","useInteractablesResource","persistence","state","setState","definitions","clientRef","stateRef","subscribersRef","Set","partialSchemaCacheRef","streamBaselinesRef","targetId","detachedAppStateRef","detachedThreadStateRef","registrationCountsRef","updateToolUIsRef","loadedStateRef","touchedIdsRef","adapterRef","undefined","debounceTimerRef","ReturnType","setTimeout","syncSeqRef","latestSyncSeqByIdRef","inFlightPersistenceRef","flushResolversRef","Array","dirtyIdsRef","PersistenceBatch","adapter","payload","dirtyIds","seq","outgoingQueueRef","runPersistenceRef","batch","setStateAndRef","updater","prev","next","current","exportState","result","Object","entries","takeDirtyBatch","size","clear","set","enqueuePersistence","push","runPersistence","resolved","resolve","fromEntries","map","isPending","error","save","changed","get","has","delete","e","shift","clearTimeout","nextBatch","flushIfPending","schedulePersistence","add","restorePersistedState","saved","options","entry","importState","applyLoadedState","loadFromAdapter","load","console","warn","setPersistenceAdapter","getCurrentThreadId","client","threadListItem","source","getState","threads","mainThreadId","flush","hasWork","length","Promise","setDefState","existing","provider","getModelContext","defs","subscribe","callback","modelContext","register","installUpdateToolUI","toolsAccessor","tools","setToolUI","standalone","values","threadAccessor","thread","threadMessages","process","env","NODE_ENV","releaseUpdateToolUI","updateRender","jsonSchema","stateSchema","threadId","detached","loaded","known","description","initialState","remaining","stateById","_","rest","__","restPersistence","unstable_Interactables","scopes","parent"],"sources":["../../../src/react/client/Interactables.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useRef, useMemo } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type { ClientOutput } from \"@assistant-ui/store\";\nimport {\n attachTransformScopes,\n useAssistantClientRef,\n useAssistantScopeEffect,\n} from \"@assistant-ui/store/client\";\nimport type {\n Unstable_InteractablesState,\n Unstable_InteractableRegistration,\n Unstable_InteractablePersistedState,\n Unstable_InteractablePersistenceAdapter,\n Unstable_InteractablesConfig,\n} from \"../types/scopes/interactables\";\nimport { toJSONSchema, toPartialJSONSchema } from \"assistant-stream\";\nimport { ModelContext } from \"../../store/clients/model-context-client\";\nimport {\n buildInteractableModelContext,\n type PartialJSONSchema,\n} from \"./interactable-model-context\";\nimport {\n findModelKnownState,\n interactableToolName,\n} from \"../../model-context/interactable-composer-metadata\";\nimport { notifySubscribers as notifyStateSubscribers } from \"../../subscribable/subscribable\";\n\nconst PERSISTENCE_DEBOUNCE_MS = 500;\n\ntype RestorePersistedStateOptions = {\n stash: Map<string, unknown>;\n shouldStash?: (id: string) => boolean;\n shouldApply?: (\n id: string,\n def: Unstable_InteractablesState[\"definitions\"][string],\n ) => boolean;\n};\n\ntype ToolCallLikePart = {\n type?: string;\n toolCallId?: string;\n toolName?: string;\n};\n\ntype MessageLike = {\n role?: string;\n content?: readonly unknown[] | undefined;\n};\n\ntype InternalInteractableRegistration = Unstable_InteractableRegistration & {\n scope?: \"thread\" | undefined;\n};\n\ntype UpdateToolUIEntry = {\n count: number;\n render: NonNullable<Unstable_InteractableRegistration[\"updateRender\"]>;\n unsubscribe: (() => void) | undefined;\n};\n\nconst hasInteractableCreateCall = (\n messages: readonly MessageLike[],\n id: string,\n name: string,\n) =>\n messages.some(\n (message) =>\n message.role === \"assistant\" &&\n message.content?.some((part) => {\n if (!part || typeof part !== \"object\") return false;\n const p = part as ToolCallLikePart;\n return (\n p.type === \"tool-call\" && p.toolCallId === id && p.toolName === name\n );\n }),\n );\n\nconst useInteractablesResource = ({\n persistence,\n}: Unstable_InteractablesConfig = {}): ClientOutput<\"unstable_interactables\"> => {\n const [state, setState] = useState<Unstable_InteractablesState>(() => ({\n definitions: {},\n persistence: {},\n }));\n\n const clientRef = useAssistantClientRef();\n\n const stateRef = useRef(state);\n\n const subscribersRef = useRef(new Set<() => void>());\n const partialSchemaCacheRef = useRef(new Map<string, PartialJSONSchema>());\n const streamBaselinesRef = useRef(\n new Map<string, { targetId: string; state: unknown }>(),\n );\n const detachedAppStateRef = useRef(new Map<string, unknown>());\n const detachedThreadStateRef = useRef(\n new Map<string, Map<string, unknown>>(),\n );\n // An instance may be registered from several anchors (its creating tool\n // call plus update_* calls); the definition lives until the last one leaves.\n const registrationCountsRef = useRef(new Map<string, number>());\n // One update-tool UI per interactable name, alive while any registrant\n // that supplied an updateRender is mounted.\n const updateToolUIsRef = useRef(new Map<string, UpdateToolUIEntry>());\n // App-scoped state restored via adapter.load(), consumed as components register.\n const loadedStateRef = useRef(new Map<string, unknown>());\n // Ids edited locally this session — a local edit always wins over a slow load.\n const touchedIdsRef = useRef(new Set<string>());\n\n const adapterRef = useRef<\n Unstable_InteractablePersistenceAdapter | undefined\n >(undefined);\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: Unstable_InteractablePersistenceAdapter;\n payload: Unstable_InteractablePersistedState;\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 setStateAndRef = useCallback(\n (\n updater: (\n prev: Unstable_InteractablesState,\n ) => Unstable_InteractablesState,\n ) => {\n const next = updater(stateRef.current);\n stateRef.current = next;\n setState(next);\n },\n [],\n );\n\n const exportState = useCallback((): Unstable_InteractablePersistedState => {\n const result: Unstable_InteractablePersistedState = {};\n for (const [id, def] of Object.entries(stateRef.current.definitions)) {\n if (def.scope === \"thread\") continue; // thread items persist via snapshot, not the adapter\n result[id] = { name: def.name, state: def.state };\n }\n return result;\n }, []);\n\n const takeDirtyBatch = useCallback(\n (\n adapter: Unstable_InteractablePersistenceAdapter,\n ): 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: exportState(), dirtyIds, seq };\n },\n [exportState],\n );\n\n const enqueuePersistence = useCallback(\n (adapter: Unstable_InteractablePersistenceAdapter) => {\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 setStateAndRef((prev) => ({\n ...prev,\n persistence: {\n ...prev.persistence,\n ...Object.fromEntries(\n [...dirtyIds].map((id) => [\n id,\n { isPending: true, error: undefined },\n ]),\n ),\n },\n }));\n\n try {\n await adapter.save(payload);\n setStateAndRef((prev) => {\n let changed = false;\n const persistence = { ...prev.persistence };\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 delete persistence[id];\n changed = true;\n }\n return changed ? { ...prev, persistence } : prev;\n });\n } catch (e) {\n setStateAndRef((prev) => {\n let changed = false;\n const persistence = { ...prev.persistence };\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 persistence[id] = { isPending: false, error: e };\n changed = true;\n }\n return changed ? { ...prev, persistence } : prev;\n });\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 [setStateAndRef, takeDirtyBatch],\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 }, [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 [enqueuePersistence],\n );\n\n const restorePersistedState = useCallback(\n (\n saved: Unstable_InteractablePersistedState,\n options: RestorePersistedStateOptions,\n ) => {\n const shouldStash = options.shouldStash ?? (() => true);\n const shouldApply = options.shouldApply ?? (() => true);\n\n for (const [id, entry] of Object.entries(saved)) {\n if (shouldStash(id)) options.stash.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 const def = definitions[id];\n if (!def || !shouldApply(id, def)) continue;\n definitions[id] = { ...def, state: entry.state };\n changed = true;\n }\n if (!changed) return prev;\n return { ...prev, definitions };\n });\n },\n [setStateAndRef],\n );\n\n const importState = useCallback(\n (saved: Unstable_InteractablePersistedState) => {\n restorePersistedState(saved, { stash: detachedAppStateRef.current });\n },\n [restorePersistedState],\n );\n\n // Applies adapter.load() output: a local edit made while the load was in\n // flight wins, and thread-scoped items never restore from the adapter.\n const applyLoadedState = useCallback(\n (saved: Unstable_InteractablePersistedState) => {\n restorePersistedState(saved, {\n stash: loadedStateRef.current,\n shouldStash: (id) => !touchedIdsRef.current.has(id),\n shouldApply: (id, def) =>\n !touchedIdsRef.current.has(id) && def.scope !== \"thread\",\n });\n },\n [restorePersistedState],\n );\n\n const loadFromAdapter = useCallback(\n async (adapter: Unstable_InteractablePersistenceAdapter) => {\n if (!adapter.load) return;\n try {\n const saved = await adapter.load();\n if (!saved || adapterRef.current !== adapter) return;\n applyLoadedState(saved);\n } catch (e) {\n console.warn(\"[Interactables] Persistence load failed.\", e);\n }\n },\n [applyLoadedState],\n );\n\n const setPersistenceAdapter = useCallback(\n (adapter: Unstable_InteractablePersistenceAdapter | undefined) => {\n if (adapterRef.current !== adapter) flushIfPending();\n adapterRef.current = adapter;\n if (adapter) void loadFromAdapter(adapter);\n },\n [flushIfPending, loadFromAdapter],\n );\n\n const getCurrentThreadId = useCallback((): string | undefined => {\n const client = clientRef.current;\n if (!client) return undefined;\n\n const threadListItem = client.threadListItem;\n if (threadListItem.source != null) {\n return threadListItem().getState().id;\n }\n\n const threads = client.threads;\n if (threads.source != null) {\n return threads().getState().mainThreadId;\n }\n\n return undefined;\n }, [clientRef]);\n\n useEffect(() => {\n if (!persistence) return;\n setPersistenceAdapter(persistence);\n return () => {\n if (adapterRef.current === persistence) {\n setPersistenceAdapter(undefined);\n }\n };\n }, [persistence, setPersistenceAdapter]);\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 }, [enqueuePersistence]);\n\n const setDefState = useCallback(\n (id: string, updater: (prev: unknown) => unknown) => {\n touchedIdsRef.current.add(id);\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]?.scope !== \"thread\") {\n schedulePersistence(id);\n }\n },\n [schedulePersistence, 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 streamBaselinesRef.current,\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 installUpdateToolUI = useCallback(\n (name: string, entry: UpdateToolUIEntry) => {\n const toolsAccessor = clientRef.current?.tools;\n if (!toolsAccessor || toolsAccessor.source == null) return false;\n entry.unsubscribe = toolsAccessor().setToolUI(\n interactableToolName(name),\n entry.render,\n { standalone: true },\n );\n return true;\n },\n [clientRef],\n );\n\n // register() installs update-tool UIs against the tools instance bound at\n // call time; this re-applies the retained entries when that instance is\n // structurally replaced and installs entries recorded while no tools\n // scope was available. Each re-apply releases the entry's previous\n // install first, so it is an orphaned no-op against a replaced instance\n // and an idempotent replacement against a live one.\n useAssistantScopeEffect(\n \"tools\",\n () => {\n for (const [name, entry] of updateToolUIsRef.current) {\n entry.unsubscribe?.();\n entry.unsubscribe = undefined;\n installUpdateToolUI(name, entry);\n }\n return () => {\n for (const entry of updateToolUIsRef.current.values()) {\n entry.unsubscribe?.();\n entry.unsubscribe = undefined;\n }\n };\n },\n [installUpdateToolUI],\n );\n\n const register = useCallback(\n (def: InternalInteractableRegistration) => {\n const threadAccessor = clientRef.current?.thread;\n const threadMessages =\n threadAccessor && threadAccessor.source != null\n ? (threadAccessor().getState().messages ?? [])\n : [];\n const scope =\n def.scope ??\n (hasInteractableCreateCall(threadMessages, def.id, def.name)\n ? \"thread\"\n : \"app\");\n\n if (\n process.env.NODE_ENV !== \"production\" &&\n stateRef.current.definitions[def.id] &&\n scope !== \"thread\"\n ) {\n console.warn(\n `[Interactables] \"${def.name}\" (${def.id}) is already registered. ` +\n `Register an app-scoped interactable once (unstable_useInteractable) and ` +\n `read it from other components with unstable_useInteractableState.`,\n );\n }\n\n registrationCountsRef.current.set(\n def.id,\n (registrationCountsRef.current.get(def.id) ?? 0) + 1,\n );\n\n let releaseUpdateToolUI: (() => void) | undefined;\n if (def.updateRender) {\n const existing = updateToolUIsRef.current.get(def.name);\n const entry = existing ?? {\n count: 0,\n render: def.updateRender,\n unsubscribe: undefined,\n };\n entry.count++;\n if (!existing) updateToolUIsRef.current.set(def.name, entry);\n\n if (\n !entry.unsubscribe &&\n !installUpdateToolUI(def.name, entry) &&\n process.env.NODE_ENV !== \"production\"\n ) {\n console.warn(\n `[Interactables] \"${def.name}\" supplied an updateRender, but no ` +\n `tools scope is available yet; it will be installed once one appears.`,\n );\n }\n\n releaseUpdateToolUI = () => {\n const entry = updateToolUIsRef.current.get(def.name);\n if (!entry) return;\n if (--entry.count === 0) {\n updateToolUIsRef.current.delete(def.name);\n entry.unsubscribe?.();\n entry.unsubscribe = undefined;\n }\n };\n }\n\n // The same id re-registers once per anchor (its create call + each update_*).\n if (!partialSchemaCacheRef.current.has(def.id)) {\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 accept arbitrary fields without validation.`,\n e,\n );\n }\n }\n\n const threadId = scope === \"thread\" ? getCurrentThreadId() : undefined;\n const detached =\n scope === \"thread\"\n ? threadId\n ? detachedThreadStateRef.current.get(threadId)?.get(def.id)\n : undefined\n : detachedAppStateRef.current.get(def.id);\n if (scope === \"thread\") {\n if (threadId)\n detachedThreadStateRef.current.get(threadId)?.delete(def.id);\n } else {\n detachedAppStateRef.current.delete(def.id);\n }\n const loaded =\n scope === \"thread\" ? undefined : loadedStateRef.current.get(def.id);\n\n // Tool-created items restore from what the model already knows in this\n // thread (the creating call's args, sent snapshots, and the model's own\n // update_* calls) on a fresh reload; detached (in-session remount) still\n // wins so an unsent edit survives a scroll/virtualization cycle.\n const known =\n scope === \"thread\"\n ? findModelKnownState(threadMessages, def.id, def.name)\n : undefined;\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 initialState: def.initialState,\n scope,\n state:\n prev.definitions[def.id]?.state ??\n detached ??\n known?.state ??\n loaded ??\n def.initialState,\n },\n },\n }));\n\n return () => {\n releaseUpdateToolUI?.();\n\n const remaining = (registrationCountsRef.current.get(def.id) ?? 1) - 1;\n if (remaining > 0) {\n registrationCountsRef.current.set(def.id, remaining);\n return;\n }\n registrationCountsRef.current.delete(def.id);\n\n flushIfPending();\n setStateAndRef((prev) => {\n const existing = prev.definitions[def.id];\n if (existing) {\n if (existing.scope === \"thread\") {\n const threadId = getCurrentThreadId();\n if (threadId) {\n let stateById = detachedThreadStateRef.current.get(threadId);\n if (!stateById) {\n stateById = new Map();\n detachedThreadStateRef.current.set(threadId, stateById);\n }\n stateById.set(def.id, existing.state);\n }\n } else {\n detachedAppStateRef.current.set(def.id, existing.state);\n }\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 [\n flushIfPending,\n clientRef,\n getCurrentThreadId,\n installUpdateToolUI,\n setStateAndRef,\n ],\n );\n\n return {\n getState: () => stateRef.current,\n register,\n setState: setDefState,\n exportState,\n importState,\n setPersistenceAdapter,\n flush,\n };\n};\n\n/**\n * Registers the unstable interactables store scope.\n *\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport const unstable_Interactables = resource(useInteractablesResource);\n\nattachTransformScopes(useInteractablesResource, (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","ClientOutput","attachTransformScopes","useAssistantClientRef","useAssistantScopeEffect","Unstable_InteractablesState","Unstable_InteractableRegistration","Unstable_InteractablePersistedState","Unstable_InteractablePersistenceAdapter","Unstable_InteractablesConfig","toJSONSchema","toPartialJSONSchema","ModelContext","buildInteractableModelContext","PartialJSONSchema","findModelKnownState","interactableToolName","notifySubscribers","notifyStateSubscribers","useInteractablePersistenceQueue","RestorePersistedStateOptions","stash","Map","shouldStash","id","shouldApply","def","ToolCallLikePart","type","toolCallId","toolName","MessageLike","role","content","InternalInteractableRegistration","scope","UpdateToolUIEntry","count","render","NonNullable","unsubscribe","hasInteractableCreateCall","messages","name","some","message","part","p","useInteractablesResource","persistence","state","setState","definitions","clientRef","stateRef","subscribersRef","Set","partialSchemaCacheRef","streamBaselinesRef","targetId","detachedAppStateRef","detachedThreadStateRef","registrationCountsRef","updateToolUIsRef","loadedStateRef","touchedIdsRef","adapterRef","undefined","setStateAndRef","updater","prev","next","current","exportState","result","Object","entries","updatePersistenceStatus","flushIfPending","schedulePersistence","flush","snapshot","restorePersistedState","saved","options","entry","set","changed","importState","applyLoadedState","has","loadFromAdapter","adapter","load","e","console","warn","setPersistenceAdapter","getCurrentThreadId","client","threadListItem","source","getState","threads","mainThreadId","setDefState","add","existing","provider","getModelContext","defs","subscribe","callback","delete","modelContext","register","installUpdateToolUI","toolsAccessor","tools","setToolUI","standalone","values","threadAccessor","thread","threadMessages","process","env","NODE_ENV","get","releaseUpdateToolUI","updateRender","jsonSchema","stateSchema","threadId","detached","loaded","known","description","initialState","remaining","stateById","_","rest","__","restPersistence","unstable_Interactables","scopes","parent"],"sources":["../../../src/react/client/Interactables.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useRef, useMemo } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type { ClientOutput } from \"@assistant-ui/store\";\nimport {\n attachTransformScopes,\n useAssistantClientRef,\n useAssistantScopeEffect,\n} from \"@assistant-ui/store/client\";\nimport type {\n Unstable_InteractablesState,\n Unstable_InteractableRegistration,\n Unstable_InteractablePersistedState,\n Unstable_InteractablePersistenceAdapter,\n Unstable_InteractablesConfig,\n} from \"../types/scopes/interactables\";\nimport { toJSONSchema, toPartialJSONSchema } from \"assistant-stream\";\nimport { ModelContext } from \"../../store/clients/model-context-client\";\nimport {\n buildInteractableModelContext,\n type PartialJSONSchema,\n} from \"./interactable-model-context\";\nimport {\n findModelKnownState,\n interactableToolName,\n} from \"../../model-context/interactable-composer-metadata\";\nimport { notifySubscribers as notifyStateSubscribers } from \"../../subscribable/subscribable\";\nimport { useInteractablePersistenceQueue } from \"../interactables-shared/useInteractablePersistenceQueue\";\n\ntype RestorePersistedStateOptions = {\n stash: Map<string, unknown>;\n shouldStash?: (id: string) => boolean;\n shouldApply?: (\n id: string,\n def: Unstable_InteractablesState[\"definitions\"][string],\n ) => boolean;\n};\n\ntype ToolCallLikePart = {\n type?: string;\n toolCallId?: string;\n toolName?: string;\n};\n\ntype MessageLike = {\n role?: string;\n content?: readonly unknown[] | undefined;\n};\n\ntype InternalInteractableRegistration = Unstable_InteractableRegistration & {\n scope?: \"thread\" | undefined;\n};\n\ntype UpdateToolUIEntry = {\n count: number;\n render: NonNullable<Unstable_InteractableRegistration[\"updateRender\"]>;\n unsubscribe: (() => void) | undefined;\n};\n\nconst hasInteractableCreateCall = (\n messages: readonly MessageLike[],\n id: string,\n name: string,\n) =>\n messages.some(\n (message) =>\n message.role === \"assistant\" &&\n message.content?.some((part) => {\n if (!part || typeof part !== \"object\") return false;\n const p = part as ToolCallLikePart;\n return (\n p.type === \"tool-call\" && p.toolCallId === id && p.toolName === name\n );\n }),\n );\n\nconst useInteractablesResource = ({\n persistence,\n}: Unstable_InteractablesConfig = {}): ClientOutput<\"unstable_interactables\"> => {\n const [state, setState] = useState<Unstable_InteractablesState>(() => ({\n definitions: {},\n persistence: {},\n }));\n\n const clientRef = useAssistantClientRef();\n\n const stateRef = useRef(state);\n\n const subscribersRef = useRef(new Set<() => void>());\n const partialSchemaCacheRef = useRef(new Map<string, PartialJSONSchema>());\n const streamBaselinesRef = useRef(\n new Map<string, { targetId: string; state: unknown }>(),\n );\n const detachedAppStateRef = useRef(new Map<string, unknown>());\n const detachedThreadStateRef = useRef(\n new Map<string, Map<string, unknown>>(),\n );\n // An instance may be registered from several anchors (its creating tool\n // call plus update_* calls); the definition lives until the last one leaves.\n const registrationCountsRef = useRef(new Map<string, number>());\n // One update-tool UI per interactable name, alive while any registrant\n // that supplied an updateRender is mounted.\n const updateToolUIsRef = useRef(new Map<string, UpdateToolUIEntry>());\n // App-scoped state restored via adapter.load(), consumed as components register.\n const loadedStateRef = useRef(new Map<string, unknown>());\n // Ids edited locally this session — a local edit always wins over a slow load.\n const touchedIdsRef = useRef(new Set<string>());\n\n const adapterRef = useRef<\n Unstable_InteractablePersistenceAdapter | undefined\n >(undefined);\n\n const setStateAndRef = useCallback(\n (\n updater: (\n prev: Unstable_InteractablesState,\n ) => Unstable_InteractablesState,\n ) => {\n const next = updater(stateRef.current);\n stateRef.current = next;\n setState(next);\n },\n [],\n );\n\n const exportState = useCallback((): Unstable_InteractablePersistedState => {\n const result: Unstable_InteractablePersistedState = {};\n for (const [id, def] of Object.entries(stateRef.current.definitions)) {\n if (def.scope === \"thread\") continue; // thread items persist via snapshot, not the adapter\n result[id] = { name: def.name, state: def.state };\n }\n return result;\n }, []);\n\n const updatePersistenceStatus = useCallback(\n (\n updater: (\n prev: Unstable_InteractablesState[\"persistence\"],\n ) => Unstable_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 restorePersistedState = useCallback(\n (\n saved: Unstable_InteractablePersistedState,\n options: RestorePersistedStateOptions,\n ) => {\n const shouldStash = options.shouldStash ?? (() => true);\n const shouldApply = options.shouldApply ?? (() => true);\n\n for (const [id, entry] of Object.entries(saved)) {\n if (shouldStash(id)) options.stash.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 const def = definitions[id];\n if (!def || !shouldApply(id, def)) continue;\n definitions[id] = { ...def, state: entry.state };\n changed = true;\n }\n if (!changed) return prev;\n return { ...prev, definitions };\n });\n },\n [setStateAndRef],\n );\n\n const importState = useCallback(\n (saved: Unstable_InteractablePersistedState) => {\n restorePersistedState(saved, { stash: detachedAppStateRef.current });\n },\n [restorePersistedState],\n );\n\n // Applies adapter.load() output: a local edit made while the load was in\n // flight wins, and thread-scoped items never restore from the adapter.\n const applyLoadedState = useCallback(\n (saved: Unstable_InteractablePersistedState) => {\n restorePersistedState(saved, {\n stash: loadedStateRef.current,\n shouldStash: (id) => !touchedIdsRef.current.has(id),\n shouldApply: (id, def) =>\n !touchedIdsRef.current.has(id) && def.scope !== \"thread\",\n });\n },\n [restorePersistedState],\n );\n\n const loadFromAdapter = useCallback(\n async (adapter: Unstable_InteractablePersistenceAdapter) => {\n if (!adapter.load) return;\n try {\n const saved = await adapter.load();\n if (!saved || adapterRef.current !== adapter) return;\n applyLoadedState(saved);\n } catch (e) {\n console.warn(\"[Interactables] Persistence load failed.\", e);\n }\n },\n [applyLoadedState],\n );\n\n const setPersistenceAdapter = useCallback(\n (adapter: Unstable_InteractablePersistenceAdapter | undefined) => {\n if (adapterRef.current !== adapter) flushIfPending();\n adapterRef.current = adapter;\n if (adapter) void loadFromAdapter(adapter);\n },\n [flushIfPending, loadFromAdapter],\n );\n\n const getCurrentThreadId = useCallback((): string | undefined => {\n const client = clientRef.current;\n if (!client) return undefined;\n\n const threadListItem = client.threadListItem;\n if (threadListItem.source != null) {\n return threadListItem().getState().id;\n }\n\n const threads = client.threads;\n if (threads.source != null) {\n return threads().getState().mainThreadId;\n }\n\n return undefined;\n }, [clientRef]);\n\n useEffect(() => {\n if (!persistence) return;\n setPersistenceAdapter(persistence);\n return () => {\n if (adapterRef.current === persistence) {\n setPersistenceAdapter(undefined);\n }\n };\n }, [persistence, setPersistenceAdapter]);\n\n const setDefState = useCallback(\n (id: string, updater: (prev: unknown) => unknown) => {\n touchedIdsRef.current.add(id);\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]?.scope !== \"thread\") {\n schedulePersistence(id);\n }\n },\n [schedulePersistence, 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 streamBaselinesRef.current,\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 installUpdateToolUI = useCallback(\n (name: string, entry: UpdateToolUIEntry) => {\n const toolsAccessor = clientRef.current?.tools;\n if (!toolsAccessor || toolsAccessor.source == null) return false;\n entry.unsubscribe = toolsAccessor().setToolUI(\n interactableToolName(name),\n entry.render,\n { standalone: true },\n );\n return true;\n },\n [clientRef],\n );\n\n // register() installs update-tool UIs against the tools instance bound at\n // call time; this re-applies the retained entries when that instance is\n // structurally replaced and installs entries recorded while no tools\n // scope was available. Each re-apply releases the entry's previous\n // install first, so it is an orphaned no-op against a replaced instance\n // and an idempotent replacement against a live one.\n useAssistantScopeEffect(\n \"tools\",\n () => {\n for (const [name, entry] of updateToolUIsRef.current) {\n entry.unsubscribe?.();\n entry.unsubscribe = undefined;\n installUpdateToolUI(name, entry);\n }\n return () => {\n for (const entry of updateToolUIsRef.current.values()) {\n entry.unsubscribe?.();\n entry.unsubscribe = undefined;\n }\n };\n },\n [installUpdateToolUI],\n );\n\n const register = useCallback(\n (def: InternalInteractableRegistration) => {\n const threadAccessor = clientRef.current?.thread;\n const threadMessages =\n threadAccessor && threadAccessor.source != null\n ? (threadAccessor().getState().messages ?? [])\n : [];\n const scope =\n def.scope ??\n (hasInteractableCreateCall(threadMessages, def.id, def.name)\n ? \"thread\"\n : \"app\");\n\n if (\n process.env.NODE_ENV !== \"production\" &&\n stateRef.current.definitions[def.id] &&\n scope !== \"thread\"\n ) {\n console.warn(\n `[Interactables] \"${def.name}\" (${def.id}) is already registered. ` +\n `Register an app-scoped interactable once (unstable_useInteractable) and ` +\n `read it from other components with unstable_useInteractableState.`,\n );\n }\n\n registrationCountsRef.current.set(\n def.id,\n (registrationCountsRef.current.get(def.id) ?? 0) + 1,\n );\n\n let releaseUpdateToolUI: (() => void) | undefined;\n if (def.updateRender) {\n const existing = updateToolUIsRef.current.get(def.name);\n const entry = existing ?? {\n count: 0,\n render: def.updateRender,\n unsubscribe: undefined,\n };\n entry.count++;\n if (!existing) updateToolUIsRef.current.set(def.name, entry);\n\n if (\n !entry.unsubscribe &&\n !installUpdateToolUI(def.name, entry) &&\n process.env.NODE_ENV !== \"production\"\n ) {\n console.warn(\n `[Interactables] \"${def.name}\" supplied an updateRender, but no ` +\n `tools scope is available yet; it will be installed once one appears.`,\n );\n }\n\n releaseUpdateToolUI = () => {\n const entry = updateToolUIsRef.current.get(def.name);\n if (!entry) return;\n if (--entry.count === 0) {\n updateToolUIsRef.current.delete(def.name);\n entry.unsubscribe?.();\n entry.unsubscribe = undefined;\n }\n };\n }\n\n // The same id re-registers once per anchor (its create call + each update_*).\n if (!partialSchemaCacheRef.current.has(def.id)) {\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 accept arbitrary fields without validation.`,\n e,\n );\n }\n }\n\n const threadId = scope === \"thread\" ? getCurrentThreadId() : undefined;\n const detached =\n scope === \"thread\"\n ? threadId\n ? detachedThreadStateRef.current.get(threadId)?.get(def.id)\n : undefined\n : detachedAppStateRef.current.get(def.id);\n if (scope === \"thread\") {\n if (threadId)\n detachedThreadStateRef.current.get(threadId)?.delete(def.id);\n } else {\n detachedAppStateRef.current.delete(def.id);\n }\n const loaded =\n scope === \"thread\" ? undefined : loadedStateRef.current.get(def.id);\n\n // Tool-created items restore from what the model already knows in this\n // thread (the creating call's args, sent snapshots, and the model's own\n // update_* calls) on a fresh reload; detached (in-session remount) still\n // wins so an unsent edit survives a scroll/virtualization cycle.\n const known =\n scope === \"thread\"\n ? findModelKnownState(threadMessages, def.id, def.name)\n : undefined;\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 initialState: def.initialState,\n scope,\n state:\n prev.definitions[def.id]?.state ??\n detached ??\n known?.state ??\n loaded ??\n def.initialState,\n },\n },\n }));\n\n return () => {\n releaseUpdateToolUI?.();\n\n const remaining = (registrationCountsRef.current.get(def.id) ?? 1) - 1;\n if (remaining > 0) {\n registrationCountsRef.current.set(def.id, remaining);\n return;\n }\n registrationCountsRef.current.delete(def.id);\n\n flushIfPending();\n setStateAndRef((prev) => {\n const existing = prev.definitions[def.id];\n if (existing) {\n if (existing.scope === \"thread\") {\n const threadId = getCurrentThreadId();\n if (threadId) {\n let stateById = detachedThreadStateRef.current.get(threadId);\n if (!stateById) {\n stateById = new Map();\n detachedThreadStateRef.current.set(threadId, stateById);\n }\n stateById.set(def.id, existing.state);\n }\n } else {\n detachedAppStateRef.current.set(def.id, existing.state);\n }\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 [\n flushIfPending,\n clientRef,\n getCurrentThreadId,\n installUpdateToolUI,\n setStateAndRef,\n ],\n );\n\n return {\n getState: () => stateRef.current,\n register,\n setState: setDefState,\n exportState,\n importState,\n setPersistenceAdapter,\n flush,\n };\n};\n\n/**\n * Registers the unstable interactables store scope.\n *\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport const unstable_Interactables = resource(useInteractablesResource);\n\nattachTransformScopes(useInteractablesResource, (scopes, parent) => {\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n});\n"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { ClientOutput } from "@assistant-ui/store";
|
|
|
4
4
|
//#region src/react/client/RemoteThreadList.d.ts
|
|
5
5
|
type RemoteThreadListProps = {
|
|
6
6
|
/**
|
|
7
|
-
* Swapping this to a different backing store does not reload the list. Call `reload()` after a genuine swap. A recreated object for the same store is a no-op.
|
|
7
|
+
* Swapping this to a different backing store does not reload the list. Call `reload()` after a genuine swap. A recreated object for the same store is a no-op. `reload()` after a different adapter instance resets selection and cached records before loading.
|
|
8
8
|
*/
|
|
9
9
|
adapter: RemoteThreadListAdapter;
|
|
10
10
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoteThreadList.d.ts","names":[],"sources":["../../../src/react/client/RemoteThreadList.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"RemoteThreadList.d.ts","names":[],"sources":["../../../src/react/client/RemoteThreadList.ts"],"mappings":";;;;KA+CY;;;;EAIV,SAAS;;;;;;;EAOT,QAAQ;EACR;EACA,qBAAqB;EACrB,qBAAqB;EACrB;EACA,aAAa;;;;;;;;;;cA8gCF,8CAAgB,SAAA,0BAAA,OAAA"}
|