@assistant-ui/core 0.3.16 → 0.3.17
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/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +2 -1
- package/dist/internal.js +2 -1
- package/dist/model-context/frame/provider.d.ts +3 -0
- package/dist/model-context/frame/provider.d.ts.map +1 -1
- package/dist/model-context/frame/provider.js +71 -21
- package/dist/model-context/frame/provider.js.map +1 -1
- package/dist/model-context/tool-call-text.d.ts +26 -0
- package/dist/model-context/tool-call-text.d.ts.map +1 -0
- package/dist/model-context/tool-call-text.js +18 -0
- package/dist/model-context/tool-call-text.js.map +1 -0
- package/dist/react/RuntimeAdapter.js +1 -1
- package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
- package/dist/react/adapters/LocalStorageThreadListAdapter.js +1 -1
- package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
- package/dist/react/client/AdaptedRemoteThread.js +1 -1
- package/dist/react/client/InMemoryThreadList.js +1 -1
- package/dist/react/client/Interactables.js +1 -1
- package/dist/react/client/RemoteThreadList.d.ts +15 -0
- package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
- package/dist/react/client/RemoteThreadList.js +240 -138
- 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 +6 -2
- package/dist/react/client/Tools.js.map +1 -1
- package/dist/react/index.d.ts +2 -1
- package/dist/react/index.js +2 -1
- package/dist/react/interactables-legacy/Interactables.js +4 -4
- package/dist/react/interactables-legacy/Interactables.js.map +1 -1
- package/dist/react/model-context/toolbox.d.ts +2 -14
- package/dist/react/model-context/toolbox.d.ts.map +1 -1
- package/dist/react/model-context/toolbox.js +1 -13
- package/dist/react/model-context/toolbox.js.map +1 -1
- package/dist/react/model-context/useAssistantContext.js +37 -7
- package/dist/react/model-context/useAssistantContext.js.map +1 -1
- package/dist/react/model-context/useAuiToolOverrides.js +31 -5
- package/dist/react/model-context/useAuiToolOverrides.js.map +1 -1
- package/dist/react/model-context/useInlineRender.d.ts.map +1 -1
- package/dist/react/model-context/useInlineRender.js +10 -36
- package/dist/react/model-context/useInlineRender.js.map +1 -1
- package/dist/react/primitive-hooks/useMessageError.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useMessageError.js +2 -8
- package/dist/react/primitive-hooks/useMessageError.js.map +1 -1
- package/dist/react/primitive-hooks/useThreadListLoadMore.d.ts.map +1 -1
- package/dist/react/primitive-hooks/useThreadListLoadMore.js +2 -4
- package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
- package/dist/react/primitives/composer/ComposerAttachments.d.ts.map +1 -1
- package/dist/react/primitives/composer/ComposerAttachments.js +4 -3
- package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
- package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
- package/dist/react/primitives/composer/ComposerQueue.js +4 -3
- package/dist/react/primitives/composer/ComposerQueue.js.map +1 -1
- package/dist/react/primitives/message/MessageAttachments.d.ts.map +1 -1
- package/dist/react/primitives/message/MessageAttachments.js +7 -6
- package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
- package/dist/react/primitives/message/MessageGroupedParts.js +2 -2
- package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
- package/dist/react/primitives/message/MessageParts.js +3 -3
- package/dist/react/primitives/message/MessageParts.js.map +1 -1
- package/dist/react/primitives/threadList/ThreadListItems.d.ts.map +1 -1
- package/dist/react/primitives/threadList/ThreadListItems.js +5 -4
- package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +6 -4
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +44 -22
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +6 -5
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +79 -62
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadResource.d.ts +1 -6
- package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadResource.js +3 -3
- package/dist/react/runtimes/RemoteThreadResource.js.map +1 -1
- package/dist/react/runtimes/assistant-transport/useLatestRef.js +2 -2
- package/dist/react/runtimes/assistant-transport/useLatestRef.js.map +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +23 -18
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
- package/dist/react/runtimes/cloud/auiV0.d.ts +5 -1
- package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
- package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts +29 -0
- package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts.map +1 -0
- package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js +159 -0
- package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js.map +1 -0
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts +1 -9
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +16 -153
- package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
- package/dist/react/runtimes/external-message-converter.js +1 -1
- package/dist/react/runtimes/external-message-converter.js.map +1 -1
- package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
- package/dist/react/runtimes/useRemoteThreadListRuntime.js +14 -6
- package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
- package/dist/react/types/MessagePartComponentTypes.d.ts +7 -3
- package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
- package/dist/react/types/scopes/tools.d.ts +2 -0
- package/dist/react/types/scopes/tools.d.ts.map +1 -1
- package/dist/runtime/api/message-part-runtime.d.ts +2 -2
- package/dist/runtime/api/message-part-runtime.d.ts.map +1 -1
- package/dist/runtime/api/message-part-runtime.js +1 -1
- package/dist/runtime/api/message-part-runtime.js.map +1 -1
- package/dist/runtime/api/thread-list-runtime.d.ts +9 -1
- package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
- package/dist/runtime/api/thread-list-runtime.js +5 -0
- package/dist/runtime/api/thread-list-runtime.js.map +1 -1
- package/dist/runtime/api/thread-runtime.d.ts +1 -1
- package/dist/runtime/base/base-thread-runtime-core.d.ts +2 -2
- package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/base-thread-runtime-core.js +2 -2
- package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
- package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +14 -2
- package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
- package/dist/runtime/interfaces/thread-runtime-core.d.ts +15 -1
- package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
- package/dist/runtime/utils/auto-status.d.ts +1 -1
- package/dist/runtime/utils/auto-status.d.ts.map +1 -1
- package/dist/runtime/utils/auto-status.js +6 -2
- package/dist/runtime/utils/auto-status.js.map +1 -1
- package/dist/runtime/utils/external-message-conversion.d.ts +3 -2
- package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -1
- package/dist/runtime/utils/external-message-conversion.js +4 -3
- package/dist/runtime/utils/external-message-conversion.js.map +1 -1
- package/dist/runtime/utils/resolveToolApprovalResponse.d.ts +6 -3
- package/dist/runtime/utils/resolveToolApprovalResponse.d.ts.map +1 -1
- package/dist/runtime/utils/resolveToolApprovalResponse.js +12 -3
- package/dist/runtime/utils/resolveToolApprovalResponse.js.map +1 -1
- package/dist/runtime/utils/thread-message-like.d.ts +2 -10
- 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/runtime/utils/tool-call-tree.d.ts +39 -0
- package/dist/runtime/utils/tool-call-tree.d.ts.map +1 -0
- package/dist/runtime/utils/tool-call-tree.js +85 -0
- package/dist/runtime/utils/tool-call-tree.js.map +1 -0
- package/dist/runtimes/external-store/external-store-adapter.d.ts +29 -2
- package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +2 -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 +34 -28
- package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
- package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts +1 -1
- package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts.map +1 -1
- package/dist/runtimes/inert/InertThreadRuntimeCore.js.map +1 -1
- 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 +3 -1
- package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
- package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +1 -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 +30 -13
- package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
- package/dist/runtimes/remote-thread-list/title.d.ts +9 -0
- package/dist/runtimes/remote-thread-list/title.d.ts.map +1 -0
- package/dist/runtimes/remote-thread-list/title.js +6 -0
- package/dist/runtimes/remote-thread-list/title.js.map +1 -0
- package/dist/runtimes/remote-thread-list/types.d.ts +6 -5
- package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
- package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +31 -8
- package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
- package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +97 -60
- package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
- package/dist/store/clients/external-thread.d.ts +1 -1
- package/dist/store/clients/external-thread.d.ts.map +1 -1
- package/dist/store/clients/external-thread.js +11 -4
- package/dist/store/clients/external-thread.js.map +1 -1
- package/dist/store/clients/single-thread-list.js +1 -1
- package/dist/store/clients/suggestions.d.ts.map +1 -1
- package/dist/store/clients/suggestions.js +18 -6
- package/dist/store/clients/suggestions.js.map +1 -1
- package/dist/store/clients/thread-message-client.js +1 -1
- package/dist/store/clients/thread-selection-events.js +1 -1
- package/dist/store/index.d.ts +2 -1
- package/dist/store/index.js +2 -1
- package/dist/store/internal.d.ts +2 -2
- package/dist/store/internal.js +2 -2
- package/dist/store/primitive-predicates.d.ts +4 -1
- package/dist/store/primitive-predicates.d.ts.map +1 -1
- package/dist/store/primitive-predicates.js +9 -1
- package/dist/store/primitive-predicates.js.map +1 -1
- package/dist/store/runtime-clients/composer-runtime-client.js +1 -1
- package/dist/store/runtime-clients/message-runtime-client.js +1 -1
- package/dist/store/runtime-clients/thread-list-item-runtime-client.js +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 +124 -105
- package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/thread-runtime-client.js +1 -1
- package/dist/store/runtime-clients/useSubscribable.d.ts +3 -1
- package/dist/store/runtime-clients/useSubscribable.d.ts.map +1 -1
- package/dist/store/runtime-clients/useSubscribable.js +1 -1
- package/dist/store/runtime-clients/useSubscribable.js.map +1 -1
- package/dist/store/scopes/part.d.ts +6 -3
- package/dist/store/scopes/part.d.ts.map +1 -1
- package/dist/subscribable/subscribable.d.ts +8 -1
- package/dist/subscribable/subscribable.d.ts.map +1 -1
- package/dist/subscribable/subscribable.js +24 -16
- package/dist/subscribable/subscribable.js.map +1 -1
- package/dist/types/message.d.ts +40 -1
- package/dist/types/message.d.ts.map +1 -1
- package/dist/types/message.js +7 -1
- package/dist/types/message.js.map +1 -1
- package/package.json +12 -17
- package/src/index.ts +6 -1
- package/src/internal.ts +8 -0
- package/src/model-context/frame/provider.test.ts +217 -1
- package/src/model-context/frame/provider.ts +111 -23
- package/src/model-context/tool-call-text.test.ts +67 -0
- package/src/model-context/tool-call-text.ts +67 -0
- package/src/react/AssistantRuntimeProvider.test.tsx +66 -2
- package/src/react/adapters/LocalStorageThreadListAdapter.tsx +1 -3
- package/src/react/client/RemoteThreadList.background.test.ts +384 -0
- package/src/react/client/RemoteThreadList.concurrent.test.tsx +274 -0
- package/src/react/client/RemoteThreadList.test.ts +273 -1
- package/src/react/client/RemoteThreadList.ts +293 -83
- package/src/react/client/Tools.ts +7 -1
- package/src/react/index.ts +4 -0
- package/src/react/model-context/modelContextHooks.test.tsx +131 -0
- package/src/react/model-context/toolbox.test.ts +9 -9
- package/src/react/model-context/toolbox.ts +9 -36
- package/src/react/model-context/useAssistantContext.ts +4 -2
- package/src/react/model-context/useAuiToolOverrides.ts +4 -2
- package/src/react/model-context/useInlineRender.test.tsx +48 -0
- package/src/react/model-context/useInlineRender.ts +14 -10
- package/src/react/primitive-hooks/useMessageError.ts +2 -19
- package/src/react/primitive-hooks/useThreadListLoadMore.ts +2 -3
- package/src/react/primitives/composer/ComposerAttachments.test.tsx +76 -0
- package/src/react/primitives/composer/ComposerAttachments.tsx +9 -4
- package/src/react/primitives/composer/ComposerQueue.test.tsx +72 -0
- package/src/react/primitives/composer/ComposerQueue.tsx +7 -4
- package/src/react/primitives/message/MessageAttachments.test.tsx +107 -37
- package/src/react/primitives/message/MessageAttachments.tsx +10 -7
- package/src/react/primitives/message/MessageGroupedParts.tsx +2 -2
- package/src/react/primitives/message/MessageParts.tsx +3 -3
- package/src/react/primitives/threadList/ThreadListItems.test.tsx +99 -0
- package/src/react/primitives/threadList/ThreadListItems.tsx +8 -5
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +94 -1
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +72 -31
- package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.switch-delete.test.ts +169 -0
- package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +114 -68
- package/src/react/runtimes/RemoteThreadResource.ts +1 -4
- package/src/react/runtimes/assistant-transport/transport-scheduling.test.ts +51 -2
- package/src/react/runtimes/assistant-transport/useLatestRef.ts +2 -2
- package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.ts +45 -0
- package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +65 -1
- package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +42 -35
- package/src/react/runtimes/cloud/auiV0.ts +5 -0
- package/src/react/runtimes/cloud/createCloudThreadListAdapter.test.ts +88 -0
- package/src/react/runtimes/cloud/createCloudThreadListAdapter.ts +236 -0
- package/src/react/runtimes/cloud/useCloudThreadListAdapter.test.tsx +90 -1
- package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +33 -238
- package/src/react/runtimes/external-message-converter.ts +1 -0
- package/src/react/runtimes/useRemoteThreadListRuntime.concurrent.test.tsx +216 -0
- package/src/react/runtimes/useRemoteThreadListRuntime.ts +24 -6
- package/src/react/types/MessagePartComponentTypes.ts +7 -3
- package/src/react/types/scopes/tools.ts +2 -0
- package/src/runtime/api/message-part-runtime.ts +3 -3
- package/src/runtime/api/thread-list-runtime.ts +25 -1
- package/src/runtime/base/base-thread-runtime-core.test.ts +94 -3
- package/src/runtime/base/base-thread-runtime-core.ts +10 -4
- package/src/runtime/interfaces/thread-list-runtime-core.ts +20 -1
- package/src/runtime/interfaces/thread-runtime-core.ts +17 -1
- package/src/runtime/utils/auto-status.test.ts +57 -0
- package/src/runtime/utils/auto-status.ts +13 -1
- package/src/runtime/utils/external-message-conversion.test.ts +97 -0
- package/src/runtime/utils/external-message-conversion.ts +17 -1
- package/src/runtime/utils/resolveToolApprovalResponse.test.ts +73 -0
- package/src/runtime/utils/resolveToolApprovalResponse.ts +27 -6
- package/src/runtime/utils/thread-message-like.ts +2 -10
- package/src/runtime/utils/tool-call-tree.test.ts +191 -0
- package/src/runtime/utils/tool-call-tree.ts +97 -0
- package/src/runtimes/external-store/external-store-adapter.ts +38 -2
- package/src/runtimes/external-store/external-store-thread-runtime-core.ts +56 -33
- package/src/runtimes/inert/InertThreadRuntimeCore.ts +1 -1
- package/src/runtimes/local/local-thread-runtime-core.test.ts +29 -3
- package/src/runtimes/local/local-thread-runtime-core.ts +5 -1
- package/src/runtimes/remote-thread-list/remote-thread-state.test.ts +112 -0
- package/src/runtimes/remote-thread-list/remote-thread-state.ts +55 -16
- package/src/runtimes/remote-thread-list/title.ts +3 -0
- package/src/runtimes/remote-thread-list/types.ts +6 -5
- package/src/runtimes/tool-invocations/EDGE_CASES.md +110 -5
- package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +750 -136
- package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +144 -91
- package/src/store/clients/external-thread.ts +14 -8
- package/src/store/clients/suggestions.test.ts +155 -1
- package/src/store/clients/suggestions.ts +42 -34
- package/src/store/index.ts +4 -0
- package/src/store/internal.ts +2 -0
- package/src/store/primitive-predicates.ts +35 -0
- package/src/store/runtime-clients/thread-list-runtime-client.ts +16 -2
- package/src/store/runtime-clients/useSubscribable.ts +8 -2
- package/src/store/scopes/part.ts +6 -3
- package/src/subscribable/subscribable.test.ts +50 -0
- package/src/subscribable/subscribable.ts +33 -21
- package/src/tests/RemoteThreadListThreadListRuntimeCore-load-race.test.ts +111 -0
- package/src/tests/RemoteThreadListThreadListRuntimeCore-loadMore.test.ts +78 -0
- package/src/tests/RemoteThreadListThreadListRuntimeCore-reload.test.ts +52 -0
- package/src/tests/external-store-optimistic-id.test.ts +79 -0
- package/src/tests/external-store-repository-instance.test.ts +166 -0
- package/src/tests/external-store-thread-runtime-core-adapter.test.ts +22 -16
- package/src/tests/external-thread-attachments.test.tsx +85 -1
- package/src/tests/remote-thread-list-adapter-switch.test.ts +66 -1
- package/src/tests/thread-switch-events.test.tsx +397 -2
- package/src/types/message.ts +50 -2
|
@@ -5,10 +5,14 @@ import { describe, expect, it, vi } from "vitest";
|
|
|
5
5
|
import { AuiProvider, useAui, useAuiEvent } from "@assistant-ui/store";
|
|
6
6
|
import { AssistantRuntimeProvider } from "../react/AssistantRuntimeProvider";
|
|
7
7
|
import { useExternalStoreRuntime } from "../react/runtimes/useExternalStoreRuntime";
|
|
8
|
+
import { useLocalRuntime } from "../react/runtimes/useLocalRuntime";
|
|
8
9
|
import { useRemoteThreadListRuntime } from "../react/runtimes/useRemoteThreadListRuntime";
|
|
9
|
-
import { makeAdapter } from "./remote-thread-list-test-helpers";
|
|
10
|
+
import { deferred, makeAdapter } from "./remote-thread-list-test-helpers";
|
|
10
11
|
import { RuntimeAdapter } from "../react/RuntimeAdapter";
|
|
11
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
AssistantRuntimeImpl,
|
|
14
|
+
type AssistantRuntime,
|
|
15
|
+
} from "../runtime/api/assistant-runtime";
|
|
12
16
|
import { ExternalStoreRuntimeCore } from "../runtimes/external-store/external-store-runtime-core";
|
|
13
17
|
import type { ExternalStoreAdapter } from "../runtimes/external-store/external-store-adapter";
|
|
14
18
|
|
|
@@ -232,3 +236,394 @@ describe("thread switch events", () => {
|
|
|
232
236
|
expect(payload.previousThreadId).toMatch(/^__LOCALID_/);
|
|
233
237
|
});
|
|
234
238
|
});
|
|
239
|
+
|
|
240
|
+
const createExternalStoreRuntime = (
|
|
241
|
+
runningByThreadId: Map<string, boolean>,
|
|
242
|
+
) => {
|
|
243
|
+
const threads = [
|
|
244
|
+
{ id: "t1", title: "one" },
|
|
245
|
+
{ id: "t2", title: "two" },
|
|
246
|
+
];
|
|
247
|
+
let currentId = "t1";
|
|
248
|
+
const makeStoreAdapter = (): ExternalStoreAdapter<DemoMessage> => ({
|
|
249
|
+
messages: EMPTY_MESSAGES,
|
|
250
|
+
isRunning: runningByThreadId.get(currentId) ?? false,
|
|
251
|
+
convertMessage: (m) => ({
|
|
252
|
+
id: m.id,
|
|
253
|
+
role: m.role,
|
|
254
|
+
content: [{ type: "text", text: m.text }],
|
|
255
|
+
}),
|
|
256
|
+
onNew: async () => {},
|
|
257
|
+
adapters: {
|
|
258
|
+
threadList: {
|
|
259
|
+
threadId: currentId,
|
|
260
|
+
threads: threads.map((t) => ({
|
|
261
|
+
status: "regular" as const,
|
|
262
|
+
id: t.id,
|
|
263
|
+
title: t.title,
|
|
264
|
+
})),
|
|
265
|
+
onSwitchToThread: (threadId: string) => {
|
|
266
|
+
currentId = threadId;
|
|
267
|
+
sync();
|
|
268
|
+
},
|
|
269
|
+
onSwitchToNewThread: () => {},
|
|
270
|
+
},
|
|
271
|
+
},
|
|
272
|
+
});
|
|
273
|
+
const core = new ExternalStoreRuntimeCore(makeStoreAdapter());
|
|
274
|
+
const runtime = new AssistantRuntimeImpl(core);
|
|
275
|
+
const sync = () => core.setAdapter(makeStoreAdapter());
|
|
276
|
+
return { runtime, sync };
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
const listAdapter = () =>
|
|
280
|
+
makeAdapter({
|
|
281
|
+
list: vi.fn(async () => ({
|
|
282
|
+
threads: [
|
|
283
|
+
{ status: "regular" as const, remoteId: "thread-a", title: "A" },
|
|
284
|
+
{ status: "regular" as const, remoteId: "thread-b", title: "B" },
|
|
285
|
+
],
|
|
286
|
+
})),
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
const renderRemoteList = (
|
|
290
|
+
adapter: ReturnType<typeof makeAdapter>,
|
|
291
|
+
run: () => Promise<{ content: [] }>,
|
|
292
|
+
) => {
|
|
293
|
+
const globalRunStart = vi.fn();
|
|
294
|
+
const globalRunEnd = vi.fn();
|
|
295
|
+
const globalInitialize = vi.fn();
|
|
296
|
+
const globalModelContextUpdate = vi.fn();
|
|
297
|
+
const selectedRunStart = vi.fn();
|
|
298
|
+
const selectedRunEnd = vi.fn();
|
|
299
|
+
const selectedInitialize = vi.fn();
|
|
300
|
+
const selectedModelContextUpdate = vi.fn();
|
|
301
|
+
let runtime!: AssistantRuntime;
|
|
302
|
+
|
|
303
|
+
const Listener = () => {
|
|
304
|
+
useAuiEvent({ scope: "*", event: "thread.runStart" }, globalRunStart);
|
|
305
|
+
useAuiEvent({ scope: "*", event: "thread.runEnd" }, globalRunEnd);
|
|
306
|
+
useAuiEvent({ scope: "*", event: "thread.initialize" }, globalInitialize);
|
|
307
|
+
useAuiEvent(
|
|
308
|
+
{ scope: "*", event: "thread.modelContextUpdate" },
|
|
309
|
+
globalModelContextUpdate,
|
|
310
|
+
);
|
|
311
|
+
useAuiEvent("thread.runStart", selectedRunStart);
|
|
312
|
+
useAuiEvent("thread.runEnd", selectedRunEnd);
|
|
313
|
+
useAuiEvent("thread.initialize", selectedInitialize);
|
|
314
|
+
useAuiEvent("thread.modelContextUpdate", selectedModelContextUpdate);
|
|
315
|
+
return null;
|
|
316
|
+
};
|
|
317
|
+
const Harness = () => {
|
|
318
|
+
runtime = useRemoteThreadListRuntime({
|
|
319
|
+
adapter,
|
|
320
|
+
initialThreadId: "thread-a",
|
|
321
|
+
runtimeHook: function RuntimeHook() {
|
|
322
|
+
return useLocalRuntime({ run });
|
|
323
|
+
},
|
|
324
|
+
});
|
|
325
|
+
return (
|
|
326
|
+
<AssistantRuntimeProvider runtime={runtime}>
|
|
327
|
+
<Listener />
|
|
328
|
+
</AssistantRuntimeProvider>
|
|
329
|
+
);
|
|
330
|
+
};
|
|
331
|
+
render(<Harness />);
|
|
332
|
+
|
|
333
|
+
return {
|
|
334
|
+
getRuntime: () => runtime,
|
|
335
|
+
globalRunStart,
|
|
336
|
+
globalRunEnd,
|
|
337
|
+
globalInitialize,
|
|
338
|
+
globalModelContextUpdate,
|
|
339
|
+
selectedRunStart,
|
|
340
|
+
selectedRunEnd,
|
|
341
|
+
selectedInitialize,
|
|
342
|
+
selectedModelContextUpdate,
|
|
343
|
+
};
|
|
344
|
+
};
|
|
345
|
+
|
|
346
|
+
const switchTo = async (runtime: AssistantRuntime, remoteId: string) => {
|
|
347
|
+
await act(async () => {
|
|
348
|
+
await runtime.threads.switchToThread(remoteId);
|
|
349
|
+
});
|
|
350
|
+
await waitFor(() => {
|
|
351
|
+
expect(runtime.threads.mainItem.getState().remoteId).toBe(remoteId);
|
|
352
|
+
});
|
|
353
|
+
};
|
|
354
|
+
|
|
355
|
+
describe("background thread run events", () => {
|
|
356
|
+
it("delivers runEnd globally after the running thread is switched away", async () => {
|
|
357
|
+
const runA = deferred<{ content: [] }>();
|
|
358
|
+
const harness = renderRemoteList(listAdapter(), () => runA.promise);
|
|
359
|
+
const runtime = harness.getRuntime();
|
|
360
|
+
|
|
361
|
+
await waitFor(() => {
|
|
362
|
+
expect(runtime.threads.mainItem.getState().remoteId).toBe("thread-a");
|
|
363
|
+
});
|
|
364
|
+
const threadAId = runtime.threads.mainItem.getState().id;
|
|
365
|
+
|
|
366
|
+
await act(async () => {
|
|
367
|
+
runtime.thread.startRun({ parentId: null });
|
|
368
|
+
});
|
|
369
|
+
await waitFor(() => expect(runtime.thread.getState().isRunning).toBe(true));
|
|
370
|
+
await waitFor(() => {
|
|
371
|
+
expect(harness.globalRunStart).toHaveBeenCalledExactlyOnceWith({
|
|
372
|
+
threadId: threadAId,
|
|
373
|
+
});
|
|
374
|
+
expect(harness.selectedRunStart).toHaveBeenCalledExactlyOnceWith({
|
|
375
|
+
threadId: threadAId,
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
await switchTo(runtime, "thread-b");
|
|
380
|
+
await act(async () => {
|
|
381
|
+
runA.resolve({ content: [] });
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
await waitFor(() => {
|
|
385
|
+
expect(harness.globalRunEnd).toHaveBeenCalledExactlyOnceWith({
|
|
386
|
+
threadId: threadAId,
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
expect(harness.selectedRunEnd).not.toHaveBeenCalled();
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
it("does not duplicate run events while the running thread is switched back and forth", async () => {
|
|
393
|
+
const runA = deferred<{ content: [] }>();
|
|
394
|
+
const harness = renderRemoteList(listAdapter(), () => runA.promise);
|
|
395
|
+
const runtime = harness.getRuntime();
|
|
396
|
+
|
|
397
|
+
await waitFor(() => {
|
|
398
|
+
expect(runtime.threads.mainItem.getState().remoteId).toBe("thread-a");
|
|
399
|
+
});
|
|
400
|
+
const threadAId = runtime.threads.mainItem.getState().id;
|
|
401
|
+
|
|
402
|
+
await act(async () => {
|
|
403
|
+
runtime.thread.startRun({ parentId: null });
|
|
404
|
+
});
|
|
405
|
+
await waitFor(() => expect(runtime.thread.getState().isRunning).toBe(true));
|
|
406
|
+
|
|
407
|
+
await switchTo(runtime, "thread-b");
|
|
408
|
+
await switchTo(runtime, "thread-a");
|
|
409
|
+
await switchTo(runtime, "thread-b");
|
|
410
|
+
await switchTo(runtime, "thread-a");
|
|
411
|
+
await switchTo(runtime, "thread-b");
|
|
412
|
+
|
|
413
|
+
await act(async () => {
|
|
414
|
+
runA.resolve({ content: [] });
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
await waitFor(() => {
|
|
418
|
+
expect(harness.globalRunEnd).toHaveBeenCalledExactlyOnceWith({
|
|
419
|
+
threadId: threadAId,
|
|
420
|
+
});
|
|
421
|
+
});
|
|
422
|
+
expect(harness.globalRunStart).toHaveBeenCalledExactlyOnceWith({
|
|
423
|
+
threadId: threadAId,
|
|
424
|
+
});
|
|
425
|
+
expect(harness.selectedRunStart).toHaveBeenCalledExactlyOnceWith({
|
|
426
|
+
threadId: threadAId,
|
|
427
|
+
});
|
|
428
|
+
expect(harness.selectedRunEnd).not.toHaveBeenCalled();
|
|
429
|
+
});
|
|
430
|
+
|
|
431
|
+
it("leaves the run to the selected client when its thread is re-selected", async () => {
|
|
432
|
+
const runA = deferred<{ content: [] }>();
|
|
433
|
+
const harness = renderRemoteList(listAdapter(), () => runA.promise);
|
|
434
|
+
const runtime = harness.getRuntime();
|
|
435
|
+
|
|
436
|
+
await waitFor(() => {
|
|
437
|
+
expect(runtime.threads.mainItem.getState().remoteId).toBe("thread-a");
|
|
438
|
+
});
|
|
439
|
+
const threadAId = runtime.threads.mainItem.getState().id;
|
|
440
|
+
|
|
441
|
+
await act(async () => {
|
|
442
|
+
runtime.thread.startRun({ parentId: null });
|
|
443
|
+
});
|
|
444
|
+
await waitFor(() => expect(runtime.thread.getState().isRunning).toBe(true));
|
|
445
|
+
|
|
446
|
+
await switchTo(runtime, "thread-b");
|
|
447
|
+
await switchTo(runtime, "thread-a");
|
|
448
|
+
|
|
449
|
+
await act(async () => {
|
|
450
|
+
runA.resolve({ content: [] });
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
await waitFor(() => {
|
|
454
|
+
expect(harness.selectedRunEnd).toHaveBeenCalledExactlyOnceWith({
|
|
455
|
+
threadId: threadAId,
|
|
456
|
+
});
|
|
457
|
+
});
|
|
458
|
+
expect(harness.globalRunEnd).toHaveBeenCalledExactlyOnceWith({
|
|
459
|
+
threadId: threadAId,
|
|
460
|
+
});
|
|
461
|
+
expect(harness.globalRunStart).toHaveBeenCalledExactlyOnceWith({
|
|
462
|
+
threadId: threadAId,
|
|
463
|
+
});
|
|
464
|
+
expect(harness.selectedRunStart).toHaveBeenCalledExactlyOnceWith({
|
|
465
|
+
threadId: threadAId,
|
|
466
|
+
});
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
it("reports the start and end of a run that is never selected", async () => {
|
|
470
|
+
const backgroundRun = deferred<{ content: [] }>();
|
|
471
|
+
const harness = renderRemoteList(
|
|
472
|
+
listAdapter(),
|
|
473
|
+
() => backgroundRun.promise,
|
|
474
|
+
);
|
|
475
|
+
const runtime = harness.getRuntime();
|
|
476
|
+
|
|
477
|
+
await waitFor(() => {
|
|
478
|
+
expect(runtime.threads.mainItem.getState().remoteId).toBe("thread-a");
|
|
479
|
+
});
|
|
480
|
+
await switchTo(runtime, "thread-b");
|
|
481
|
+
const threadBId = runtime.threads.mainItem.getState().id;
|
|
482
|
+
const threadB = runtime.threads.getById(threadBId);
|
|
483
|
+
await switchTo(runtime, "thread-a");
|
|
484
|
+
|
|
485
|
+
await act(async () => {
|
|
486
|
+
threadB.startRun({ parentId: null });
|
|
487
|
+
});
|
|
488
|
+
await waitFor(() => {
|
|
489
|
+
expect(harness.globalRunStart).toHaveBeenCalledExactlyOnceWith({
|
|
490
|
+
threadId: threadBId,
|
|
491
|
+
});
|
|
492
|
+
});
|
|
493
|
+
|
|
494
|
+
await act(async () => {
|
|
495
|
+
backgroundRun.resolve({ content: [] });
|
|
496
|
+
});
|
|
497
|
+
await waitFor(() => {
|
|
498
|
+
expect(harness.globalRunEnd).toHaveBeenCalledExactlyOnceWith({
|
|
499
|
+
threadId: threadBId,
|
|
500
|
+
});
|
|
501
|
+
});
|
|
502
|
+
expect(harness.selectedRunStart).not.toHaveBeenCalled();
|
|
503
|
+
expect(harness.selectedRunEnd).not.toHaveBeenCalled();
|
|
504
|
+
});
|
|
505
|
+
|
|
506
|
+
it("reports lifecycle events from a thread that is never selected", async () => {
|
|
507
|
+
const backgroundRun = deferred<{ content: [] }>();
|
|
508
|
+
const harness = renderRemoteList(
|
|
509
|
+
listAdapter(),
|
|
510
|
+
() => backgroundRun.promise,
|
|
511
|
+
);
|
|
512
|
+
const runtime = harness.getRuntime();
|
|
513
|
+
|
|
514
|
+
await waitFor(() => {
|
|
515
|
+
expect(runtime.threads.mainItem.getState().remoteId).toBe("thread-a");
|
|
516
|
+
});
|
|
517
|
+
await switchTo(runtime, "thread-b");
|
|
518
|
+
const threadBId = runtime.threads.mainItem.getState().id;
|
|
519
|
+
const threadB = runtime.threads.getById(threadBId);
|
|
520
|
+
await switchTo(runtime, "thread-a");
|
|
521
|
+
|
|
522
|
+
let updateModelContext!: () => void;
|
|
523
|
+
const unregisterModelContext = runtime.registerModelContextProvider({
|
|
524
|
+
getModelContext: () => ({}),
|
|
525
|
+
subscribe: (callback) => {
|
|
526
|
+
updateModelContext = callback;
|
|
527
|
+
return () => {};
|
|
528
|
+
},
|
|
529
|
+
});
|
|
530
|
+
vi.clearAllMocks();
|
|
531
|
+
|
|
532
|
+
await act(async () => {
|
|
533
|
+
threadB.startRun({ parentId: null });
|
|
534
|
+
});
|
|
535
|
+
await waitFor(() => {
|
|
536
|
+
expect(harness.globalInitialize).toHaveBeenCalledExactlyOnceWith({
|
|
537
|
+
threadId: threadBId,
|
|
538
|
+
});
|
|
539
|
+
});
|
|
540
|
+
|
|
541
|
+
await act(async () => {
|
|
542
|
+
updateModelContext();
|
|
543
|
+
});
|
|
544
|
+
await waitFor(() => {
|
|
545
|
+
expect(harness.globalModelContextUpdate).toHaveBeenCalledWith({
|
|
546
|
+
threadId: threadBId,
|
|
547
|
+
});
|
|
548
|
+
});
|
|
549
|
+
|
|
550
|
+
expect(harness.selectedInitialize).not.toHaveBeenCalled();
|
|
551
|
+
unregisterModelContext();
|
|
552
|
+
|
|
553
|
+
await act(async () => {
|
|
554
|
+
backgroundRun.resolve({ content: [] });
|
|
555
|
+
});
|
|
556
|
+
});
|
|
557
|
+
|
|
558
|
+
it.each([
|
|
559
|
+
{ operation: "delete", state: "deleted" },
|
|
560
|
+
{ operation: "detach", state: "detached" },
|
|
561
|
+
] as const)(
|
|
562
|
+
"stops reporting a background run once its thread is $state",
|
|
563
|
+
async ({ operation }) => {
|
|
564
|
+
const runA = deferred<{ content: [] }>();
|
|
565
|
+
const runSettled = vi.fn();
|
|
566
|
+
const harness = renderRemoteList(listAdapter(), async () => {
|
|
567
|
+
const result = await runA.promise;
|
|
568
|
+
runSettled();
|
|
569
|
+
return result;
|
|
570
|
+
});
|
|
571
|
+
const runtime = harness.getRuntime();
|
|
572
|
+
|
|
573
|
+
await waitFor(() => {
|
|
574
|
+
expect(runtime.threads.mainItem.getState().remoteId).toBe("thread-a");
|
|
575
|
+
});
|
|
576
|
+
const threadAId = runtime.threads.mainItem.getState().id;
|
|
577
|
+
|
|
578
|
+
await act(async () => {
|
|
579
|
+
runtime.thread.startRun({ parentId: null });
|
|
580
|
+
});
|
|
581
|
+
await waitFor(() =>
|
|
582
|
+
expect(runtime.thread.getState().isRunning).toBe(true),
|
|
583
|
+
);
|
|
584
|
+
await switchTo(runtime, "thread-b");
|
|
585
|
+
|
|
586
|
+
await act(async () => {
|
|
587
|
+
const item = runtime.threads.getItemById(threadAId);
|
|
588
|
+
if (operation === "delete") await item.delete();
|
|
589
|
+
else item.detach();
|
|
590
|
+
});
|
|
591
|
+
await act(async () => {
|
|
592
|
+
runA.resolve({ content: [] });
|
|
593
|
+
});
|
|
594
|
+
|
|
595
|
+
await waitFor(() => expect(runSettled).toHaveBeenCalledExactlyOnceWith());
|
|
596
|
+
expect(harness.globalRunEnd).not.toHaveBeenCalled();
|
|
597
|
+
},
|
|
598
|
+
);
|
|
599
|
+
|
|
600
|
+
it("emits nothing for a thread list that keeps only the main runtime", async () => {
|
|
601
|
+
const runningByThreadId = new Map<string, boolean>();
|
|
602
|
+
const { runtime, sync } = createExternalStoreRuntime(runningByThreadId);
|
|
603
|
+
const globalRunEnd = vi.fn();
|
|
604
|
+
const Listener = () => {
|
|
605
|
+
useAuiEvent({ scope: "*", event: "thread.runEnd" }, globalRunEnd);
|
|
606
|
+
return null;
|
|
607
|
+
};
|
|
608
|
+
const Harness = () => {
|
|
609
|
+
const aui = useAui({ threads: RuntimeAdapter(runtime) } as never);
|
|
610
|
+
return (
|
|
611
|
+
<AuiProvider value={aui}>
|
|
612
|
+
<Listener />
|
|
613
|
+
</AuiProvider>
|
|
614
|
+
);
|
|
615
|
+
};
|
|
616
|
+
render(<Harness />);
|
|
617
|
+
await act(async () => {});
|
|
618
|
+
|
|
619
|
+
runningByThreadId.set("t1", true);
|
|
620
|
+
await act(async () => sync());
|
|
621
|
+
await waitFor(() => expect(runtime.thread.getState().isRunning).toBe(true));
|
|
622
|
+
|
|
623
|
+
await act(async () => {
|
|
624
|
+
await runtime.threads.switchToThread("t2");
|
|
625
|
+
});
|
|
626
|
+
expect(runtime.threads.getState().mainThreadId).toBe("t2");
|
|
627
|
+
expect(globalRunEnd).not.toHaveBeenCalled();
|
|
628
|
+
});
|
|
629
|
+
});
|
package/src/types/message.ts
CHANGED
|
@@ -182,12 +182,48 @@ export type ToolApprovalOption = {
|
|
|
182
182
|
readonly confirm?: boolean | { title?: string; description?: string };
|
|
183
183
|
};
|
|
184
184
|
|
|
185
|
+
/**
|
|
186
|
+
* How an approval request should be presented, and which answers it accepts.
|
|
187
|
+
* Absent: `"decision"`.
|
|
188
|
+
*
|
|
189
|
+
* The approval seam carries a host-owned request addressed by its own id and
|
|
190
|
+
* resolved once; a request wanting an answer these modes cannot express stays
|
|
191
|
+
* on the `interrupt` seam, which hands the tool an arbitrary payload instead.
|
|
192
|
+
* Unlike {@link ToolApprovalOptionKind} the set is closed, because a renderer
|
|
193
|
+
* that cannot cover every mode exhaustively is back to guessing the affordance.
|
|
194
|
+
*/
|
|
195
|
+
export type ToolApprovalDisplay = "decision" | "select" | "text";
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Whether the request asks for a free-form answer, on its own or alongside its
|
|
199
|
+
* options. Renderers read this to decide whether to offer a text affordance,
|
|
200
|
+
* and the runtime reads it to reject a `text` response the host cannot record.
|
|
201
|
+
*/
|
|
202
|
+
export const toolApprovalAcceptsText = (approval: {
|
|
203
|
+
readonly display?: ToolApprovalDisplay;
|
|
204
|
+
readonly allowFreeform?: boolean;
|
|
205
|
+
}): boolean => approval.display === "text" || approval.allowFreeform === true;
|
|
206
|
+
|
|
185
207
|
export type ToolApprovalResponse =
|
|
186
|
-
| {
|
|
187
|
-
|
|
208
|
+
| {
|
|
209
|
+
readonly approved: boolean;
|
|
210
|
+
readonly text?: string;
|
|
211
|
+
readonly reason?: string;
|
|
212
|
+
}
|
|
213
|
+
| {
|
|
214
|
+
readonly optionId: string;
|
|
215
|
+
readonly text?: string;
|
|
216
|
+
readonly reason?: string;
|
|
217
|
+
}
|
|
188
218
|
| {
|
|
189
219
|
readonly approved: boolean;
|
|
190
220
|
readonly optionId: string;
|
|
221
|
+
readonly text?: string;
|
|
222
|
+
readonly reason?: string;
|
|
223
|
+
}
|
|
224
|
+
| {
|
|
225
|
+
/** Answer to a request that asks a question rather than for a decision. */
|
|
226
|
+
readonly text: string;
|
|
191
227
|
readonly reason?: string;
|
|
192
228
|
};
|
|
193
229
|
|
|
@@ -228,6 +264,16 @@ export type ToolCallMessagePart<
|
|
|
228
264
|
/** Server-side approval gate. `respondToApproval` may only be called while `approved` is undefined and no `resolution` is recorded. */
|
|
229
265
|
readonly approval?: {
|
|
230
266
|
readonly id: string;
|
|
267
|
+
/**
|
|
268
|
+
* The question put to the user. A request that asks for something other
|
|
269
|
+
* than permission carries it here, so a renderer can show the question
|
|
270
|
+
* rather than inferring a decision from the tool name.
|
|
271
|
+
*/
|
|
272
|
+
readonly prompt?: string;
|
|
273
|
+
/** How the request should be presented. Absent: a plain decision. */
|
|
274
|
+
readonly display?: ToolApprovalDisplay;
|
|
275
|
+
/** Whether a free-form answer is accepted alongside the options. */
|
|
276
|
+
readonly allowFreeform?: boolean;
|
|
231
277
|
readonly approved?: boolean;
|
|
232
278
|
readonly reason?: string;
|
|
233
279
|
readonly isAutomatic?: boolean;
|
|
@@ -235,6 +281,8 @@ export type ToolCallMessagePart<
|
|
|
235
281
|
readonly options?: readonly ToolApprovalOption[];
|
|
236
282
|
/** The option chosen at resolution, when options were present. */
|
|
237
283
|
readonly optionId?: string;
|
|
284
|
+
/** The free-form answer recorded at resolution, when one was given. */
|
|
285
|
+
readonly text?: string;
|
|
238
286
|
/** Terminal non-decision state: the request was cancelled or expired without a user decision. Set by the host. */
|
|
239
287
|
readonly resolution?: "cancelled" | "expired";
|
|
240
288
|
};
|