@assistant-ui/core 0.3.17 → 0.3.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/attachment.d.ts.map +1 -1
- package/dist/adapters/attachment.js +5 -4
- package/dist/adapters/attachment.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +3 -2
- package/dist/internal.js +3 -2
- package/dist/model-context/frame/host.d.ts.map +1 -1
- package/dist/model-context/frame/host.js +10 -4
- package/dist/model-context/frame/host.js.map +1 -1
- package/dist/model-context/frame/provider.d.ts +2 -0
- package/dist/model-context/frame/provider.d.ts.map +1 -1
- package/dist/model-context/frame/provider.js +30 -7
- package/dist/model-context/frame/provider.js.map +1 -1
- package/dist/model-context/interactable-composer-metadata.d.ts.map +1 -1
- package/dist/model-context/interactable-composer-metadata.js +16 -9
- package/dist/model-context/interactable-composer-metadata.js.map +1 -1
- package/dist/model-context/registry.d.ts.map +1 -1
- package/dist/model-context/registry.js +3 -5
- package/dist/model-context/registry.js.map +1 -1
- package/dist/model-context/types.d.ts.map +1 -1
- package/dist/model-context/types.js +5 -4
- package/dist/model-context/types.js.map +1 -1
- package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
- package/dist/react/client/InMemoryThreadList.js +62 -56
- package/dist/react/client/InMemoryThreadList.js.map +1 -1
- package/dist/react/client/Interactables.d.ts.map +1 -1
- package/dist/react/client/Interactables.js +24 -27
- package/dist/react/client/Interactables.js.map +1 -1
- package/dist/react/client/RemoteThreadList.d.ts +1 -0
- package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
- package/dist/react/client/RemoteThreadList.js +151 -141
- package/dist/react/client/RemoteThreadList.js.map +1 -1
- package/dist/react/client/Tools.d.ts.map +1 -1
- package/dist/react/client/Tools.js +18 -16
- package/dist/react/client/Tools.js.map +1 -1
- package/dist/react/interactables-legacy/Interactables.js +242 -121
- package/dist/react/interactables-legacy/Interactables.js.map +1 -1
- package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -1
- package/dist/react/interactables-shared/useInteractablePersistenceQueue.js +11 -9
- package/dist/react/interactables-shared/useInteractablePersistenceQueue.js.map +1 -1
- package/dist/react/model-context/makeAssistantTool.d.ts +2 -2
- package/dist/react/model-context/makeAssistantTool.js +1 -1
- package/dist/react/model-context/makeAssistantTool.js.map +1 -1
- package/dist/react/model-context/useAssistantTool.d.ts +2 -2
- package/dist/react/model-context/useAssistantTool.js +1 -1
- package/dist/react/model-context/useAssistantTool.js.map +1 -1
- package/dist/react/model-context/useToolArgsStatus.d.ts.map +1 -1
- package/dist/react/model-context/useToolArgsStatus.js +2 -1
- package/dist/react/model-context/useToolArgsStatus.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +16 -8
- package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +5 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +103 -103
- package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
- package/dist/react/runtimes/RemoteThreadResource.d.ts +1 -0
- package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
- package/dist/react/runtimes/RemoteThreadResource.js +13 -11
- package/dist/react/runtimes/RemoteThreadResource.js.map +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +4 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +401 -34
- package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
- package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts.map +1 -1
- package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js +2 -1
- package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js.map +1 -1
- package/dist/react/runtimes/useExternalStoreRuntime.js +75 -46
- package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
- package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
- package/dist/react/runtimes/useRemoteThreadListRuntime.js +63 -23
- package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
- package/dist/runtime/api/thread-list-item-runtime.d.ts +7 -3
- package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
- package/dist/runtime/api/thread-list-item-runtime.js +2 -2
- package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
- package/dist/runtime/api/thread-list-runtime.d.ts +3 -0
- package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
- package/dist/runtime/api/thread-list-runtime.js +18 -14
- package/dist/runtime/api/thread-list-runtime.js.map +1 -1
- package/dist/runtime/api/thread-runtime.d.ts +4 -0
- package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
- package/dist/runtime/api/thread-runtime.js +1 -1
- package/dist/runtime/api/thread-runtime.js.map +1 -1
- package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/base-composer-runtime-core.js +16 -12
- package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
- package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/base-thread-runtime-core.js +6 -5
- package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
- package/dist/runtime/interfaces/composer-runtime-core.d.ts +12 -5
- package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +4 -1
- package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
- package/dist/runtime/utils/external-message-conversion.js +1 -1
- package/dist/runtime/utils/external-message-conversion.js.map +1 -1
- package/dist/runtime/utils/message-repository.d.ts +1 -0
- package/dist/runtime/utils/message-repository.d.ts.map +1 -1
- package/dist/runtime/utils/message-repository.js +15 -6
- package/dist/runtime/utils/message-repository.js.map +1 -1
- package/dist/runtime/utils/thread-message-like.js +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.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +21 -27
- package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
- package/dist/runtimes/internal.d.ts +2 -2
- package/dist/runtimes/internal.js +2 -2
- package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +18 -1
- package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/remote-thread-state.js +130 -42
- package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
- package/dist/runtimes/remote-thread-list/title-generation.d.ts +49 -0
- package/dist/runtimes/remote-thread-list/title-generation.d.ts.map +1 -0
- package/dist/runtimes/remote-thread-list/title-generation.js +197 -0
- package/dist/runtimes/remote-thread-list/title-generation.js.map +1 -0
- package/dist/runtimes/remote-thread-list/title.d.ts +3 -1
- package/dist/runtimes/remote-thread-list/title.d.ts.map +1 -1
- package/dist/runtimes/remote-thread-list/title.js +9 -1
- package/dist/runtimes/remote-thread-list/title.js.map +1 -1
- package/dist/runtimes/remote-thread-list/types.d.ts +10 -0
- package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
- package/dist/store/clients/external-thread.d.ts.map +1 -1
- package/dist/store/clients/external-thread.js +19 -3
- package/dist/store/clients/external-thread.js.map +1 -1
- package/dist/store/clients/model-context-client.d.ts.map +1 -1
- package/dist/store/clients/model-context-client.js +2 -1
- package/dist/store/clients/model-context-client.js.map +1 -1
- package/dist/store/clients/single-thread-list.d.ts.map +1 -1
- package/dist/store/clients/single-thread-list.js +1 -0
- package/dist/store/clients/single-thread-list.js.map +1 -1
- package/dist/store/clients/suggestions.d.ts.map +1 -1
- package/dist/store/clients/suggestions.js +5 -4
- package/dist/store/clients/suggestions.js.map +1 -1
- package/dist/store/runtime-clients/composer-runtime-client.d.ts +1 -0
- package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/composer-runtime-client.js +97 -61
- package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/message-runtime-client.d.ts +1 -0
- package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/message-runtime-client.js +221 -144
- package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/thread-list-item-runtime-client.js +1 -1
- package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/thread-list-runtime-client.js +54 -52
- package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/thread-runtime-client.js +193 -121
- package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
- package/dist/store/scopes/composer.d.ts +10 -2
- package/dist/store/scopes/composer.d.ts.map +1 -1
- package/dist/store/scopes/message.d.ts +30 -1
- package/dist/store/scopes/message.d.ts.map +1 -1
- package/dist/store/scopes/thread-list-item.d.ts +2 -2
- package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
- package/dist/store/scopes/thread.d.ts +8 -0
- package/dist/store/scopes/thread.d.ts.map +1 -1
- package/dist/store/scopes/threads.d.ts +1 -0
- package/dist/store/scopes/threads.d.ts.map +1 -1
- package/dist/types/attachment.d.ts +2 -1
- package/dist/types/attachment.d.ts.map +1 -1
- package/dist/types/attachment.js +2 -1
- package/dist/types/attachment.js.map +1 -1
- package/dist/utils/abortable-iterable.d.ts +19 -0
- package/dist/utils/abortable-iterable.d.ts.map +1 -0
- package/dist/utils/abortable-iterable.js +72 -0
- package/dist/utils/abortable-iterable.js.map +1 -0
- package/dist/utils/composite-context-provider.d.ts.map +1 -1
- package/dist/utils/composite-context-provider.js +20 -2
- package/dist/utils/composite-context-provider.js.map +1 -1
- package/dist/utils/record.d.ts +11 -0
- package/dist/utils/record.d.ts.map +1 -0
- package/dist/utils/record.js +12 -0
- package/dist/utils/record.js.map +1 -0
- package/package.json +10 -10
- package/src/adapters/attachment.test.ts +50 -1
- package/src/adapters/attachment.ts +7 -4
- package/src/index.ts +1 -0
- package/src/internal.ts +4 -0
- package/src/model-context/frame/host.test.ts +24 -0
- package/src/model-context/frame/host.ts +10 -4
- package/src/model-context/frame/provider.test.ts +71 -0
- package/src/model-context/frame/provider.ts +37 -7
- package/src/model-context/interactable-composer-metadata.test.ts +28 -0
- package/src/model-context/interactable-composer-metadata.ts +9 -3
- package/src/model-context/registry.test.ts +12 -0
- package/src/model-context/registry.ts +3 -2
- package/src/model-context/types.test.ts +25 -0
- package/src/model-context/types.ts +9 -4
- package/src/react/RuntimeAdapter.test.ts +34 -0
- package/src/react/client/InMemoryThreadList.ts +1 -0
- package/src/react/client/Interactables.test.ts +28 -0
- package/src/react/client/Interactables.ts +15 -13
- package/src/react/client/RemoteThreadList.background.test.ts +148 -6
- package/src/react/client/RemoteThreadList.concurrent.test.tsx +42 -1
- package/src/react/client/RemoteThreadList.test.ts +345 -3
- package/src/react/client/RemoteThreadList.ts +166 -110
- package/src/react/client/Tools.ts +22 -11
- package/src/react/interactables-legacy/Interactables.ts +16 -16
- package/src/react/interactables-shared/useInteractablePersistenceQueue.ts +9 -10
- package/src/react/model-context/makeAssistantTool.ts +2 -2
- package/src/react/model-context/useAssistantTool.ts +2 -2
- package/src/react/model-context/useToolArgsStatus.test.tsx +30 -0
- package/src/react/model-context/useToolArgsStatus.ts +2 -1
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.destroy.test.tsx +172 -0
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +33 -0
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +7 -1
- package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +28 -5
- package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.load-error.test.ts +132 -0
- package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.switch-delete.test.ts +105 -0
- package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +136 -111
- package/src/react/runtimes/RemoteThreadResource.test.ts +9 -0
- package/src/react/runtimes/RemoteThreadResource.ts +19 -12
- package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +483 -6
- package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +504 -68
- package/src/react/runtimes/cloud/createCloudThreadListAdapter.test.ts +15 -0
- package/src/react/runtimes/cloud/createCloudThreadListAdapter.ts +1 -0
- package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +41 -0
- package/src/react/runtimes/useExternalStoreRuntime.ts +10 -4
- package/src/react/runtimes/useLocalRuntime.test.tsx +20 -0
- package/src/react/runtimes/useRemoteThreadListRuntime.load-error.test.tsx +108 -0
- package/src/react/runtimes/useRemoteThreadListRuntime.ts +33 -0
- package/src/runtime/api/message-runtime.test.ts +75 -0
- package/src/runtime/api/thread-list-item-runtime.ts +10 -3
- package/src/runtime/api/thread-list-runtime.ts +21 -11
- package/src/runtime/api/thread-runtime.test.ts +78 -0
- package/src/runtime/api/thread-runtime.ts +8 -1
- package/src/runtime/base/base-composer-runtime-core.ts +36 -8
- package/src/runtime/base/base-thread-runtime-core.test.ts +55 -1
- package/src/runtime/base/base-thread-runtime-core.ts +6 -4
- package/src/runtime/interfaces/composer-runtime-core.ts +10 -5
- package/src/runtime/interfaces/thread-list-runtime-core.ts +5 -1
- package/src/runtime/utils/external-message-conversion.test.ts +68 -0
- package/src/runtime/utils/external-message-conversion.ts +1 -1
- package/src/runtime/utils/message-repository.ts +29 -17
- package/src/runtime/utils/thread-message-like.ts +1 -1
- package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +18 -13
- package/src/runtimes/internal.ts +1 -0
- package/src/runtimes/remote-thread-list/remote-thread-state.test.ts +128 -2
- package/src/runtimes/remote-thread-list/remote-thread-state.ts +182 -42
- package/src/runtimes/remote-thread-list/title-generation.test.ts +602 -0
- package/src/runtimes/remote-thread-list/title-generation.ts +329 -0
- package/src/runtimes/remote-thread-list/title.test.ts +62 -0
- package/src/runtimes/remote-thread-list/title.ts +13 -0
- package/src/runtimes/remote-thread-list/types.ts +10 -0
- package/src/store/clients/external-thread.ts +48 -3
- package/src/store/clients/model-context-client.ts +5 -1
- package/src/store/clients/single-thread-list.ts +1 -0
- package/src/store/clients/suggestions.test.ts +40 -0
- package/src/store/clients/suggestions.ts +13 -10
- package/src/store/runtime-clients/composer-runtime-client.ts +42 -9
- package/src/store/runtime-clients/message-runtime-client.ts +54 -6
- package/src/store/runtime-clients/thread-list-item-runtime-client.ts +4 -2
- package/src/store/runtime-clients/thread-list-runtime-client.ts +1 -0
- package/src/store/runtime-clients/thread-runtime-client.ts +58 -10
- package/src/store/scopes/composer.ts +16 -4
- package/src/store/scopes/message.ts +14 -0
- package/src/store/scopes/thread-list-item.ts +5 -2
- package/src/store/scopes/thread.ts +4 -0
- package/src/store/scopes/threads.ts +1 -0
- package/src/tests/MessageRepository.test.ts +116 -0
- package/src/tests/OptimisticState-list-race.test.ts +1 -0
- package/src/tests/RemoteThreadListThreadListRuntimeCore-initialize-adapter-change.test.ts +38 -0
- package/src/tests/RemoteThreadListThreadListRuntimeCore-load-race.test.ts +47 -0
- package/src/tests/RemoteThreadListThreadListRuntimeCore-title-race.test.ts +89 -0
- package/src/tests/attachment-adapters.test.ts +14 -0
- package/src/tests/base-composer-runtime-core.test.ts +39 -0
- package/src/tests/external-store-thread-list-runtime-core.test.ts +83 -0
- package/src/tests/external-store-thread-runtime-core-adapter.test.ts +27 -18
- package/src/tests/external-thread-attachments.test.tsx +139 -0
- package/src/tests/external-thread-parity.test.tsx +23 -0
- package/src/tests/remote-thread-list-isLoading.test.ts +1 -0
- package/src/tests/thread-list-runtime-getLoadThreadsPromise.test.ts +1 -0
- package/src/tests/thread-switch-events.test.tsx +78 -0
- package/src/tests/tools-scope-migration.test.tsx +28 -0
- package/src/types/attachment.ts +4 -0
- package/src/utils/abortable-iterable.test.ts +213 -0
- package/src/utils/abortable-iterable.ts +93 -0
- package/src/utils/composite-context-provider.test.ts +25 -0
- package/src/utils/composite-context-provider.ts +23 -2
- package/src/utils/record.test.ts +48 -0
- package/src/utils/record.ts +11 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { nullProtoRecord } from "../../utils/record.js";
|
|
1
2
|
import { findModelKnownState, interactableToolName } from "../../model-context/interactable-composer-metadata.js";
|
|
2
3
|
import { notifySubscribers } from "../../subscribable/subscribable.js";
|
|
3
4
|
import { ModelContext } from "../../store/clients/model-context-client.js";
|
|
@@ -15,8 +16,8 @@ const hasInteractableCreateCall = (messages, id, name) => messages.some((message
|
|
|
15
16
|
}));
|
|
16
17
|
const useInteractablesResource = ({ persistence } = {}) => {
|
|
17
18
|
const [state, setState] = useState(() => ({
|
|
18
|
-
definitions:
|
|
19
|
-
persistence:
|
|
19
|
+
definitions: nullProtoRecord(),
|
|
20
|
+
persistence: nullProtoRecord()
|
|
20
21
|
}));
|
|
21
22
|
const clientRef = useAssistantClientRef();
|
|
22
23
|
const stateRef = useRef(state);
|
|
@@ -36,7 +37,7 @@ const useInteractablesResource = ({ persistence } = {}) => {
|
|
|
36
37
|
setState(next);
|
|
37
38
|
}, []);
|
|
38
39
|
const exportState = useCallback(() => {
|
|
39
|
-
const result =
|
|
40
|
+
const result = nullProtoRecord();
|
|
40
41
|
for (const [id, def] of Object.entries(stateRef.current.definitions)) {
|
|
41
42
|
if (def.scope === "thread") continue;
|
|
42
43
|
result[id] = {
|
|
@@ -66,7 +67,7 @@ const useInteractablesResource = ({ persistence } = {}) => {
|
|
|
66
67
|
for (const [id_0, entry] of Object.entries(saved)) if (shouldStash(id_0)) options.stash.set(id_0, entry.state);
|
|
67
68
|
setStateAndRef((prev_0) => {
|
|
68
69
|
let changed = false;
|
|
69
|
-
const definitions =
|
|
70
|
+
const definitions = nullProtoRecord(prev_0.definitions);
|
|
70
71
|
for (const [id_1, entry_0] of Object.entries(saved)) {
|
|
71
72
|
const def_0 = definitions[id_1];
|
|
72
73
|
if (!def_0 || !shouldApply(id_1, def_0)) continue;
|
|
@@ -130,13 +131,10 @@ const useInteractablesResource = ({ persistence } = {}) => {
|
|
|
130
131
|
if (!existing) return prev_1;
|
|
131
132
|
return {
|
|
132
133
|
...prev_1,
|
|
133
|
-
definitions: {
|
|
134
|
-
...
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
state: updater_1(existing.state)
|
|
138
|
-
}
|
|
139
|
-
}
|
|
134
|
+
definitions: nullProtoRecord(prev_1.definitions, { [id_4]: {
|
|
135
|
+
...existing,
|
|
136
|
+
state: updater_1(existing.state)
|
|
137
|
+
} })
|
|
140
138
|
};
|
|
141
139
|
});
|
|
142
140
|
if (stateRef.current.definitions[id_4]?.scope !== "thread") schedulePersistence(id_4);
|
|
@@ -220,18 +218,15 @@ const useInteractablesResource = ({ persistence } = {}) => {
|
|
|
220
218
|
const known = scope === "thread" ? findModelKnownState(threadMessages, def_2.id, def_2.name) : void 0;
|
|
221
219
|
setStateAndRef((prev_2) => ({
|
|
222
220
|
...prev_2,
|
|
223
|
-
definitions: {
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
state: prev_2.definitions[def_2.id]?.state ?? detached ?? known?.state ?? loaded ?? def_2.initialState
|
|
233
|
-
}
|
|
234
|
-
}
|
|
221
|
+
definitions: nullProtoRecord(prev_2.definitions, { [def_2.id]: {
|
|
222
|
+
id: def_2.id,
|
|
223
|
+
name: def_2.name,
|
|
224
|
+
description: def_2.description,
|
|
225
|
+
stateSchema: def_2.stateSchema,
|
|
226
|
+
initialState: def_2.initialState,
|
|
227
|
+
scope,
|
|
228
|
+
state: prev_2.definitions[def_2.id]?.state ?? detached ?? known?.state ?? loaded ?? def_2.initialState
|
|
229
|
+
} })
|
|
235
230
|
}));
|
|
236
231
|
return () => {
|
|
237
232
|
releaseUpdateToolUI?.();
|
|
@@ -258,12 +253,14 @@ const useInteractablesResource = ({ persistence } = {}) => {
|
|
|
258
253
|
} else detachedAppStateRef.current.set(def_2.id, existing_1.state);
|
|
259
254
|
}
|
|
260
255
|
partialSchemaCacheRef.current.delete(def_2.id);
|
|
261
|
-
const
|
|
262
|
-
const
|
|
256
|
+
const definitions_0 = nullProtoRecord(prev_3.definitions);
|
|
257
|
+
const persistence_1 = nullProtoRecord(prev_3.persistence);
|
|
258
|
+
delete definitions_0[def_2.id];
|
|
259
|
+
delete persistence_1[def_2.id];
|
|
263
260
|
return {
|
|
264
261
|
...prev_3,
|
|
265
|
-
definitions:
|
|
266
|
-
persistence:
|
|
262
|
+
definitions: definitions_0,
|
|
263
|
+
persistence: persistence_1
|
|
267
264
|
};
|
|
268
265
|
});
|
|
269
266
|
};
|
|
@@ -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","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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"}
|
|
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","nullProtoRecord","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","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\";\nimport { nullProtoRecord } from \"../../utils/record\";\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: nullProtoRecord(),\n persistence: nullProtoRecord(),\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 =\n nullProtoRecord<Unstable_InteractablePersistedState[string]>();\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 = nullProtoRecord(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: nullProtoRecord(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: nullProtoRecord(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 definitions = nullProtoRecord(prev.definitions);\n const persistence = nullProtoRecord(prev.persistence);\n delete definitions[def.id];\n delete persistence[def.id];\n return { ...prev, definitions, persistence };\n });\n };\n },\n [\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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"}
|
|
@@ -18,6 +18,7 @@ type RemoteThreadListProps = {
|
|
|
18
18
|
onThreadIdChange?: ((threadId: string | undefined) => void) | undefined;
|
|
19
19
|
onSwitchToThread?: ((threadId: string) => void) | undefined;
|
|
20
20
|
onSwitchToNewThread?: (() => void) | undefined;
|
|
21
|
+
/** Called after the backing adapter successfully deletes the thread. */
|
|
21
22
|
onDelete?: ((threadId: string) => void) | undefined;
|
|
22
23
|
/**
|
|
23
24
|
* Keeps every thread the session switched to mounted, so a run continues
|
|
@@ -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":";;;;KAgEY;;;;EAIV,SAAS;;;;;;;EAOT,QAAQ;EACR;EACA,qBAAqB;EACrB,qBAAqB;EACrB;;EAEA,aAAa;;;;;;;;;;;;EAYb;;;;;;;;;;;;;cA0vCW,8CAAgB,SAAA,0BAAA,OAAA"}
|