@assistant-ui/core 0.3.15 → 0.3.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/dist/internal.d.ts +7 -2
  2. package/dist/internal.js +8 -3
  3. package/dist/model-context/frame/host.d.ts.map +1 -1
  4. package/dist/model-context/frame/host.js +3 -2
  5. package/dist/model-context/frame/host.js.map +1 -1
  6. package/dist/model-context/frame/provider.d.ts +2 -0
  7. package/dist/model-context/frame/provider.d.ts.map +1 -1
  8. package/dist/model-context/frame/provider.js +88 -25
  9. package/dist/model-context/frame/provider.js.map +1 -1
  10. package/dist/model-context/interactable-composer-metadata.d.ts +1 -1
  11. package/dist/model-context/interactable-composer-metadata.js +1 -1
  12. package/dist/model-context/interactable-composer-metadata.js.map +1 -1
  13. package/dist/model-context/registry.d.ts +2 -2
  14. package/dist/model-context/registry.d.ts.map +1 -1
  15. package/dist/model-context/registry.js +9 -28
  16. package/dist/model-context/registry.js.map +1 -1
  17. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
  18. package/dist/react/client/InMemoryThreadList.js +24 -20
  19. package/dist/react/client/InMemoryThreadList.js.map +1 -1
  20. package/dist/react/client/Interactables.d.ts.map +1 -1
  21. package/dist/react/client/Interactables.js +59 -177
  22. package/dist/react/client/Interactables.js.map +1 -1
  23. package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
  24. package/dist/react/client/RemoteThreadList.js +23 -56
  25. package/dist/react/client/RemoteThreadList.js.map +1 -1
  26. package/dist/react/index.d.ts +2 -1
  27. package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
  28. package/dist/react/interactables-legacy/Interactables.js +56 -174
  29. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  30. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts +24 -0
  31. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -0
  32. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js +138 -0
  33. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js.map +1 -0
  34. package/dist/react/primitives/composer/ComposerIf.js.map +1 -1
  35. package/dist/react/primitives/composer/ComposerQueue.d.ts +2 -1
  36. package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
  37. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  38. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +1 -1
  39. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +1 -1
  40. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  41. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +23 -55
  42. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  43. package/dist/react/runtimes/assistant-transport/runManager.d.ts.map +1 -1
  44. package/dist/react/runtimes/assistant-transport/runManager.js +2 -12
  45. package/dist/react/runtimes/assistant-transport/runManager.js.map +1 -1
  46. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +3 -10
  47. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  48. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +20 -67
  49. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  50. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts +12 -0
  51. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts.map +1 -0
  52. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.js +10 -0
  53. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.js.map +1 -0
  54. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js.map +1 -1
  55. package/dist/react/runtimes/createMessageConverter.d.ts +2 -1
  56. package/dist/react/runtimes/createMessageConverter.d.ts.map +1 -1
  57. package/dist/react/runtimes/external-message-converter.d.ts +6 -25
  58. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  59. package/dist/react/runtimes/external-message-converter.js +33 -233
  60. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  61. package/dist/runtime/api/composer-runtime.d.ts +1 -1
  62. package/dist/runtime/api/composer-runtime.js.map +1 -1
  63. package/dist/runtime/api/thread-runtime.d.ts +1 -2
  64. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  65. package/dist/runtime/base/base-composer-runtime-core.d.ts +1 -1
  66. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  67. package/dist/runtime/base/base-composer-runtime-core.js +14 -29
  68. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  69. package/dist/runtime/base/base-thread-runtime-core.d.ts +2 -4
  70. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  71. package/dist/runtime/base/base-thread-runtime-core.js +3 -9
  72. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  73. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +1 -1
  74. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  75. package/dist/runtime/base/default-thread-composer-runtime-core.js +1 -1
  76. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  77. package/dist/runtime/interfaces/composer-runtime-core.d.ts +1 -1
  78. package/dist/runtime/interfaces/thread-runtime-core.d.ts +1 -1
  79. package/dist/runtime/internal.d.ts +2 -1
  80. package/dist/runtime/internal.js +2 -1
  81. package/dist/runtime/queue/external-thread-queue-adapter.d.ts +1 -1
  82. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  83. package/dist/runtime/queue/message-queue.js +1 -1
  84. package/dist/runtime/queue/message-queue.js.map +1 -1
  85. package/dist/runtime/queue/queue-item.d.ts +12 -0
  86. package/dist/runtime/queue/queue-item.d.ts.map +1 -0
  87. package/dist/runtime/queue/queue-item.js +6 -0
  88. package/dist/runtime/queue/queue-item.js.map +1 -0
  89. package/dist/runtime/utils/abortable-thread-load.d.ts +15 -0
  90. package/dist/runtime/utils/abortable-thread-load.d.ts.map +1 -0
  91. package/dist/runtime/utils/abortable-thread-load.js +35 -0
  92. package/dist/runtime/utils/abortable-thread-load.js.map +1 -0
  93. package/dist/runtime/utils/attachment-add-operations.d.ts +18 -0
  94. package/dist/runtime/utils/attachment-add-operations.d.ts.map +1 -0
  95. package/dist/runtime/utils/attachment-add-operations.js +43 -0
  96. package/dist/runtime/utils/attachment-add-operations.js.map +1 -0
  97. package/dist/runtime/utils/auto-status.d.ts +6 -1
  98. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  99. package/dist/runtime/utils/auto-status.js +7 -1
  100. package/dist/runtime/utils/auto-status.js.map +1 -1
  101. package/dist/runtime/utils/external-message-conversion.d.ts +47 -0
  102. package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -0
  103. package/dist/runtime/utils/external-message-conversion.js +221 -0
  104. package/dist/runtime/utils/external-message-conversion.js.map +1 -0
  105. package/dist/runtime/utils/external-store-message.d.ts +2 -1
  106. package/dist/runtime/utils/external-store-message.d.ts.map +1 -1
  107. package/dist/runtime/utils/external-store-message.js +2 -1
  108. package/dist/runtime/utils/external-store-message.js.map +1 -1
  109. package/dist/runtime/utils/message-repository-session.d.ts +30 -0
  110. package/dist/runtime/utils/message-repository-session.d.ts.map +1 -0
  111. package/dist/runtime/utils/message-repository-session.js +130 -0
  112. package/dist/runtime/utils/message-repository-session.js.map +1 -0
  113. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  114. package/dist/runtime/utils/message-repository.js +3 -4
  115. package/dist/runtime/utils/message-repository.js.map +1 -1
  116. package/dist/runtime/utils/pending-tool-calls.d.ts +20 -0
  117. package/dist/runtime/utils/pending-tool-calls.d.ts.map +1 -0
  118. package/dist/runtime/utils/pending-tool-calls.js +22 -0
  119. package/dist/runtime/utils/pending-tool-calls.js.map +1 -0
  120. package/dist/runtime/utils/thread-message-like.d.ts +2 -1
  121. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  122. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  123. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +2 -5
  124. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  125. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +3 -10
  126. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  127. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +19 -1
  128. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  129. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +122 -20
  130. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  131. package/dist/runtimes/local/local-thread-runtime-core.d.ts +3 -1
  132. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  133. package/dist/runtimes/local/local-thread-runtime-core.js +20 -2
  134. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  135. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +12 -1
  136. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  137. package/dist/runtimes/remote-thread-list/remote-thread-state.js +77 -1
  138. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  139. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  140. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +2 -0
  141. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  142. package/dist/store/clients/external-thread.d.ts.map +1 -1
  143. package/dist/store/clients/external-thread.js +74 -99
  144. package/dist/store/clients/external-thread.js.map +1 -1
  145. package/dist/store/clients/single-thread-list.d.ts.map +1 -1
  146. package/dist/store/clients/single-thread-list.js +1 -1
  147. package/dist/store/clients/single-thread-list.js.map +1 -1
  148. package/dist/store/clients/suggestions.d.ts.map +1 -1
  149. package/dist/store/clients/suggestions.js +16 -7
  150. package/dist/store/clients/suggestions.js.map +1 -1
  151. package/dist/store/index.d.ts +4 -2
  152. package/dist/store/scope-registration.d.ts +1 -1
  153. package/dist/store/scopes/composer.d.ts +2 -1
  154. package/dist/store/scopes/composer.d.ts.map +1 -1
  155. package/dist/store/scopes/message.d.ts +1 -1
  156. package/dist/store/scopes/queue-item.d.ts +2 -9
  157. package/dist/store/scopes/queue-item.d.ts.map +1 -1
  158. package/dist/store/scopes/queue-item.js +0 -6
  159. package/dist/types/message.d.ts +7 -3
  160. package/dist/types/message.d.ts.map +1 -1
  161. package/dist/types/message.js.map +1 -1
  162. package/dist/utils/data-url.d.ts +14 -1
  163. package/dist/utils/data-url.d.ts.map +1 -1
  164. package/dist/utils/data-url.js +13 -1
  165. package/dist/utils/data-url.js.map +1 -1
  166. package/dist/utils/invoke-user-callback.d.ts +5 -0
  167. package/dist/utils/invoke-user-callback.d.ts.map +1 -0
  168. package/dist/utils/invoke-user-callback.js +19 -0
  169. package/dist/utils/invoke-user-callback.js.map +1 -0
  170. package/dist/utils/normalizePartStatus.js.map +1 -1
  171. package/package.json +10 -10
  172. package/src/internal.ts +12 -0
  173. package/src/model-context/frame/host.test.ts +91 -7
  174. package/src/model-context/frame/host.ts +7 -2
  175. package/src/model-context/frame/provider.test.ts +267 -12
  176. package/src/model-context/frame/provider.ts +113 -31
  177. package/src/model-context/interactable-composer-metadata.ts +1 -1
  178. package/src/model-context/registry.test.ts +44 -0
  179. package/src/model-context/registry.ts +13 -35
  180. package/src/react/client/InMemoryThreadList.test.tsx +49 -0
  181. package/src/react/client/InMemoryThreadList.ts +7 -1
  182. package/src/react/client/Interactables.ts +19 -178
  183. package/src/react/client/RemoteThreadList.test.ts +96 -0
  184. package/src/react/client/RemoteThreadList.ts +27 -59
  185. package/src/react/interactables-legacy/Interactables.ts +20 -177
  186. package/src/react/interactables-shared/useInteractablePersistenceQueue.test.tsx +161 -0
  187. package/src/react/interactables-shared/useInteractablePersistenceQueue.ts +206 -0
  188. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +26 -56
  189. package/src/react/runtimes/assistant-transport/runManager.ts +4 -17
  190. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +92 -0
  191. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +40 -141
  192. package/src/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.test.ts +37 -0
  193. package/src/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.ts +18 -0
  194. package/src/react/runtimes/external-message-converter.test.ts +0 -14
  195. package/src/react/runtimes/external-message-converter.test.tsx +77 -0
  196. package/src/react/runtimes/external-message-converter.ts +58 -481
  197. package/src/runtime/api/composer-runtime.ts +1 -1
  198. package/src/runtime/api/message-runtime.test.ts +28 -1
  199. package/src/runtime/base/base-composer-runtime-core.ts +20 -40
  200. package/src/runtime/base/base-thread-runtime-core.test.ts +16 -0
  201. package/src/runtime/base/base-thread-runtime-core.ts +6 -11
  202. package/src/runtime/base/default-thread-composer-runtime-core.ts +1 -4
  203. package/src/runtime/interfaces/composer-runtime-core.ts +1 -1
  204. package/src/runtime/interfaces/thread-runtime-core.ts +1 -1
  205. package/src/runtime/internal.ts +5 -0
  206. package/src/runtime/queue/external-thread-queue-adapter.ts +1 -1
  207. package/src/runtime/queue/message-queue.ts +1 -4
  208. package/src/runtime/queue/queue-item.ts +10 -0
  209. package/src/runtime/utils/abortable-thread-load.test.ts +87 -0
  210. package/src/runtime/utils/abortable-thread-load.ts +53 -0
  211. package/src/runtime/utils/attachment-add-operations.ts +59 -0
  212. package/src/runtime/utils/auto-status.ts +33 -0
  213. package/src/runtime/utils/external-message-conversion.test.ts +113 -0
  214. package/src/runtime/utils/external-message-conversion.ts +494 -0
  215. package/src/runtime/utils/external-store-message.ts +2 -0
  216. package/src/runtime/utils/message-repository-session.test.ts +195 -0
  217. package/src/runtime/utils/message-repository-session.ts +176 -0
  218. package/src/runtime/utils/message-repository.ts +7 -4
  219. package/src/runtime/utils/pending-tool-calls.test.ts +57 -0
  220. package/src/runtime/utils/pending-tool-calls.ts +35 -0
  221. package/src/runtime/utils/thread-message-like.ts +2 -0
  222. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +6 -14
  223. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +175 -28
  224. package/src/runtimes/local/local-thread-runtime-core.test.ts +172 -1
  225. package/src/runtimes/local/local-thread-runtime-core.ts +48 -3
  226. package/src/runtimes/remote-thread-list/remote-thread-state.test.ts +37 -0
  227. package/src/runtimes/remote-thread-list/remote-thread-state.ts +123 -0
  228. package/src/runtimes/tool-invocations/EDGE_CASES.md +17 -0
  229. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +140 -0
  230. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +3 -0
  231. package/src/store/clients/external-thread.ts +16 -61
  232. package/src/store/clients/single-thread-list.ts +4 -1
  233. package/src/store/clients/suggestions.test.ts +31 -0
  234. package/src/store/clients/suggestions.ts +18 -19
  235. package/src/store/scopes/message.ts +1 -1
  236. package/src/store/scopes/queue-item.ts +2 -9
  237. package/src/tests/MessageRepository.test.ts +77 -0
  238. package/src/tests/RemoteThreadListThreadListRuntimeCore-load-race.test.ts +194 -0
  239. package/src/tests/RemoteThreadListThreadListRuntimeCore-title-race.test.ts +158 -0
  240. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +164 -0
  241. package/src/tests/external-store-thread-runtime-core.test.ts +642 -0
  242. package/src/tests/external-thread-attachments.test.tsx +173 -0
  243. package/src/tests/single-thread-list-item.test.tsx +47 -0
  244. package/src/tests/thread-message-like.test.ts +39 -1
  245. package/src/types/message.ts +8 -3
  246. package/src/utils/data-url.test.ts +52 -1
  247. package/src/utils/data-url.ts +21 -0
  248. package/src/utils/invoke-user-callback.test.ts +82 -0
  249. package/src/utils/invoke-user-callback.ts +31 -0
  250. package/src/utils/normalizePartStatus.ts +1 -1
  251. package/dist/store/scopes/queue-item.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Interactables.js","names":["useState","useEffect","useCallback","useRef","useMemo","resource","ClientOutput","attachTransformScopes","useAssistantClientRef","useAssistantScopeEffect","Unstable_InteractablesState","Unstable_InteractableRegistration","Unstable_InteractablePersistedState","Unstable_InteractablePersistenceAdapter","Unstable_InteractablesConfig","toJSONSchema","toPartialJSONSchema","ModelContext","buildInteractableModelContext","PartialJSONSchema","findModelKnownState","interactableToolName","notifySubscribers","notifyStateSubscribers","PERSISTENCE_DEBOUNCE_MS","RestorePersistedStateOptions","stash","Map","shouldStash","id","shouldApply","def","ToolCallLikePart","type","toolCallId","toolName","MessageLike","role","content","InternalInteractableRegistration","scope","UpdateToolUIEntry","count","render","NonNullable","unsubscribe","hasInteractableCreateCall","messages","name","some","message","part","p","useInteractablesResource","persistence","state","setState","definitions","clientRef","stateRef","subscribersRef","Set","partialSchemaCacheRef","streamBaselinesRef","targetId","detachedAppStateRef","detachedThreadStateRef","registrationCountsRef","updateToolUIsRef","loadedStateRef","touchedIdsRef","adapterRef","undefined","debounceTimerRef","ReturnType","setTimeout","syncSeqRef","latestSyncSeqByIdRef","inFlightPersistenceRef","flushResolversRef","Array","dirtyIdsRef","PersistenceBatch","adapter","payload","dirtyIds","seq","outgoingQueueRef","runPersistenceRef","batch","setStateAndRef","updater","prev","next","current","exportState","result","Object","entries","takeDirtyBatch","size","clear","set","enqueuePersistence","push","runPersistence","resolved","resolve","fromEntries","map","isPending","error","save","changed","get","has","delete","e","shift","clearTimeout","nextBatch","flushIfPending","schedulePersistence","add","restorePersistedState","saved","options","entry","importState","applyLoadedState","loadFromAdapter","load","console","warn","setPersistenceAdapter","getCurrentThreadId","client","threadListItem","source","getState","threads","mainThreadId","flush","hasWork","length","Promise","setDefState","existing","provider","getModelContext","defs","subscribe","callback","modelContext","register","installUpdateToolUI","toolsAccessor","tools","setToolUI","standalone","values","threadAccessor","thread","threadMessages","process","env","NODE_ENV","releaseUpdateToolUI","updateRender","jsonSchema","stateSchema","threadId","detached","loaded","known","description","initialState","remaining","stateById","_","rest","__","restPersistence","unstable_Interactables","scopes","parent"],"sources":["../../../src/react/client/Interactables.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useRef, useMemo } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type { ClientOutput } from \"@assistant-ui/store\";\nimport {\n attachTransformScopes,\n useAssistantClientRef,\n useAssistantScopeEffect,\n} from \"@assistant-ui/store/client\";\nimport type {\n Unstable_InteractablesState,\n Unstable_InteractableRegistration,\n Unstable_InteractablePersistedState,\n Unstable_InteractablePersistenceAdapter,\n Unstable_InteractablesConfig,\n} from \"../types/scopes/interactables\";\nimport { toJSONSchema, toPartialJSONSchema } from \"assistant-stream\";\nimport { ModelContext } from \"../../store/clients/model-context-client\";\nimport {\n buildInteractableModelContext,\n type PartialJSONSchema,\n} from \"./interactable-model-context\";\nimport {\n findModelKnownState,\n interactableToolName,\n} from \"../../model-context/interactable-composer-metadata\";\nimport { notifySubscribers as notifyStateSubscribers } from \"../../subscribable/subscribable\";\n\nconst PERSISTENCE_DEBOUNCE_MS = 500;\n\ntype RestorePersistedStateOptions = {\n stash: Map<string, unknown>;\n shouldStash?: (id: string) => boolean;\n shouldApply?: (\n id: string,\n def: Unstable_InteractablesState[\"definitions\"][string],\n ) => boolean;\n};\n\ntype ToolCallLikePart = {\n type?: string;\n toolCallId?: string;\n toolName?: string;\n};\n\ntype MessageLike = {\n role?: string;\n content?: readonly unknown[] | undefined;\n};\n\ntype InternalInteractableRegistration = Unstable_InteractableRegistration & {\n scope?: \"thread\" | undefined;\n};\n\ntype UpdateToolUIEntry = {\n count: number;\n render: NonNullable<Unstable_InteractableRegistration[\"updateRender\"]>;\n unsubscribe: (() => void) | undefined;\n};\n\nconst hasInteractableCreateCall = (\n messages: readonly MessageLike[],\n id: string,\n name: string,\n) =>\n messages.some(\n (message) =>\n message.role === \"assistant\" &&\n message.content?.some((part) => {\n if (!part || typeof part !== \"object\") return false;\n const p = part as ToolCallLikePart;\n return (\n p.type === \"tool-call\" && p.toolCallId === id && p.toolName === name\n );\n }),\n );\n\nconst useInteractablesResource = ({\n persistence,\n}: Unstable_InteractablesConfig = {}): ClientOutput<\"unstable_interactables\"> => {\n const [state, setState] = useState<Unstable_InteractablesState>(() => ({\n definitions: {},\n persistence: {},\n }));\n\n const clientRef = useAssistantClientRef();\n\n const stateRef = useRef(state);\n\n const subscribersRef = useRef(new Set<() => void>());\n const partialSchemaCacheRef = useRef(new Map<string, PartialJSONSchema>());\n const streamBaselinesRef = useRef(\n new Map<string, { targetId: string; state: unknown }>(),\n );\n const detachedAppStateRef = useRef(new Map<string, unknown>());\n const detachedThreadStateRef = useRef(\n new Map<string, Map<string, unknown>>(),\n );\n // An instance may be registered from several anchors (its creating tool\n // call plus update_* calls); the definition lives until the last one leaves.\n const registrationCountsRef = useRef(new Map<string, number>());\n // One update-tool UI per interactable name, alive while any registrant\n // that supplied an updateRender is mounted.\n const updateToolUIsRef = useRef(new Map<string, UpdateToolUIEntry>());\n // App-scoped state restored via adapter.load(), consumed as components register.\n const loadedStateRef = useRef(new Map<string, unknown>());\n // Ids edited locally this session — a local edit always wins over a slow load.\n const touchedIdsRef = useRef(new Set<string>());\n\n const adapterRef = useRef<\n Unstable_InteractablePersistenceAdapter | undefined\n >(undefined);\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(\n undefined,\n );\n const syncSeqRef = useRef(0);\n const latestSyncSeqByIdRef = useRef(new Map<string, number>());\n const inFlightPersistenceRef = useRef(0);\n const flushResolversRef = useRef<Array<() => void>>([]);\n const dirtyIdsRef = useRef(new Set<string>());\n\n type PersistenceBatch = {\n adapter: Unstable_InteractablePersistenceAdapter;\n payload: Unstable_InteractablePersistedState;\n dirtyIds: Set<string>;\n seq: number;\n };\n\n const outgoingQueueRef = useRef<PersistenceBatch[]>([]);\n const runPersistenceRef = useRef<(batch?: PersistenceBatch) => void>(\n () => {},\n );\n\n const setStateAndRef = useCallback(\n (\n updater: (\n prev: Unstable_InteractablesState,\n ) => Unstable_InteractablesState,\n ) => {\n const next = updater(stateRef.current);\n stateRef.current = next;\n setState(next);\n },\n [],\n );\n\n const exportState = useCallback((): Unstable_InteractablePersistedState => {\n const result: Unstable_InteractablePersistedState = {};\n for (const [id, def] of Object.entries(stateRef.current.definitions)) {\n if (def.scope === \"thread\") continue; // thread items persist via snapshot, not the adapter\n result[id] = { name: def.name, state: def.state };\n }\n return result;\n }, []);\n\n const takeDirtyBatch = useCallback(\n (\n adapter: Unstable_InteractablePersistenceAdapter,\n ): PersistenceBatch | undefined => {\n if (dirtyIdsRef.current.size === 0) return;\n const dirtyIds = new Set(dirtyIdsRef.current);\n dirtyIdsRef.current.clear();\n const seq = ++syncSeqRef.current;\n for (const id of dirtyIds) latestSyncSeqByIdRef.current.set(id, seq);\n return { adapter, payload: exportState(), dirtyIds, seq };\n },\n [exportState],\n );\n\n const enqueuePersistence = useCallback(\n (adapter: Unstable_InteractablePersistenceAdapter) => {\n const batch = takeDirtyBatch(adapter);\n if (!batch) return;\n if (inFlightPersistenceRef.current === 0) {\n runPersistenceRef.current(batch);\n } else {\n outgoingQueueRef.current.push(batch);\n }\n },\n [takeDirtyBatch],\n );\n\n const runPersistence = useCallback(\n async (batch?: PersistenceBatch) => {\n const resolved =\n batch ??\n (adapterRef.current ? takeDirtyBatch(adapterRef.current) : undefined);\n if (!resolved) {\n if (inFlightPersistenceRef.current === 0) {\n for (const resolve of flushResolversRef.current) resolve();\n flushResolversRef.current = [];\n }\n return;\n }\n\n const { adapter, payload, dirtyIds, seq } = resolved;\n inFlightPersistenceRef.current += 1;\n\n setStateAndRef((prev) => ({\n ...prev,\n persistence: {\n ...prev.persistence,\n ...Object.fromEntries(\n [...dirtyIds].map((id) => [\n id,\n { isPending: true, error: undefined },\n ]),\n ),\n },\n }));\n\n try {\n await adapter.save(payload);\n setStateAndRef((prev) => {\n let changed = false;\n const persistence = { ...prev.persistence };\n for (const id of dirtyIds) {\n if (\n latestSyncSeqByIdRef.current.get(id) !== seq ||\n dirtyIdsRef.current.has(id)\n )\n continue;\n latestSyncSeqByIdRef.current.delete(id);\n delete persistence[id];\n changed = true;\n }\n return changed ? { ...prev, persistence } : prev;\n });\n } catch (e) {\n setStateAndRef((prev) => {\n let changed = false;\n const persistence = { ...prev.persistence };\n for (const id of dirtyIds) {\n if (\n latestSyncSeqByIdRef.current.get(id) !== seq ||\n dirtyIdsRef.current.has(id)\n )\n continue;\n latestSyncSeqByIdRef.current.delete(id);\n persistence[id] = { isPending: false, error: e };\n changed = true;\n }\n return changed ? { ...prev, persistence } : prev;\n });\n } finally {\n inFlightPersistenceRef.current -= 1;\n const next =\n outgoingQueueRef.current.shift() ??\n (adapterRef.current && dirtyIdsRef.current.size > 0\n ? takeDirtyBatch(adapterRef.current)\n : undefined);\n if (next) {\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n runPersistenceRef.current(next);\n } else if (inFlightPersistenceRef.current === 0) {\n for (const resolve of flushResolversRef.current) resolve();\n flushResolversRef.current = [];\n }\n }\n },\n [setStateAndRef, takeDirtyBatch],\n );\n runPersistenceRef.current = (nextBatch) => {\n void runPersistence(nextBatch);\n };\n\n const flushIfPending = useCallback(() => {\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n if (adapterRef.current) enqueuePersistence(adapterRef.current);\n }, [enqueuePersistence]);\n\n const schedulePersistence = useCallback(\n (id: string) => {\n if (!adapterRef.current) return;\n dirtyIdsRef.current.add(id);\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n }\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = undefined;\n if (inFlightPersistenceRef.current === 0 && adapterRef.current) {\n enqueuePersistence(adapterRef.current);\n } else {\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = undefined;\n if (adapterRef.current) enqueuePersistence(adapterRef.current);\n }, PERSISTENCE_DEBOUNCE_MS);\n }\n }, PERSISTENCE_DEBOUNCE_MS);\n },\n [enqueuePersistence],\n );\n\n const restorePersistedState = useCallback(\n (\n saved: Unstable_InteractablePersistedState,\n options: RestorePersistedStateOptions,\n ) => {\n const shouldStash = options.shouldStash ?? (() => true);\n const shouldApply = options.shouldApply ?? (() => true);\n\n for (const [id, entry] of Object.entries(saved)) {\n if (shouldStash(id)) options.stash.set(id, entry.state);\n }\n setStateAndRef((prev) => {\n let changed = false;\n const definitions = { ...prev.definitions };\n for (const [id, entry] of Object.entries(saved)) {\n const def = definitions[id];\n if (!def || !shouldApply(id, def)) continue;\n definitions[id] = { ...def, state: entry.state };\n changed = true;\n }\n if (!changed) return prev;\n return { ...prev, definitions };\n });\n },\n [setStateAndRef],\n );\n\n const importState = useCallback(\n (saved: Unstable_InteractablePersistedState) => {\n restorePersistedState(saved, { stash: detachedAppStateRef.current });\n },\n [restorePersistedState],\n );\n\n // Applies adapter.load() output: a local edit made while the load was in\n // flight wins, and thread-scoped items never restore from the adapter.\n const applyLoadedState = useCallback(\n (saved: Unstable_InteractablePersistedState) => {\n restorePersistedState(saved, {\n stash: loadedStateRef.current,\n shouldStash: (id) => !touchedIdsRef.current.has(id),\n shouldApply: (id, def) =>\n !touchedIdsRef.current.has(id) && def.scope !== \"thread\",\n });\n },\n [restorePersistedState],\n );\n\n const loadFromAdapter = useCallback(\n async (adapter: Unstable_InteractablePersistenceAdapter) => {\n if (!adapter.load) return;\n try {\n const saved = await adapter.load();\n if (!saved || adapterRef.current !== adapter) return;\n applyLoadedState(saved);\n } catch (e) {\n console.warn(\"[Interactables] Persistence load failed.\", e);\n }\n },\n [applyLoadedState],\n );\n\n const setPersistenceAdapter = useCallback(\n (adapter: Unstable_InteractablePersistenceAdapter | undefined) => {\n if (adapterRef.current !== adapter) flushIfPending();\n adapterRef.current = adapter;\n if (adapter) void loadFromAdapter(adapter);\n },\n [flushIfPending, loadFromAdapter],\n );\n\n const getCurrentThreadId = useCallback((): string | undefined => {\n const client = clientRef.current;\n if (!client) return undefined;\n\n const threadListItem = client.threadListItem;\n if (threadListItem.source != null) {\n return threadListItem().getState().id;\n }\n\n const threads = client.threads;\n if (threads.source != null) {\n return threads().getState().mainThreadId;\n }\n\n return undefined;\n }, [clientRef]);\n\n useEffect(() => {\n if (!persistence) return;\n setPersistenceAdapter(persistence);\n return () => {\n if (adapterRef.current === persistence) {\n setPersistenceAdapter(undefined);\n }\n };\n }, [persistence, setPersistenceAdapter]);\n\n const flush = useCallback(async () => {\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n const hasWork =\n inFlightPersistenceRef.current > 0 ||\n dirtyIdsRef.current.size > 0 ||\n outgoingQueueRef.current.length > 0;\n if (!hasWork) return;\n const p = new Promise<void>((resolve) => {\n flushResolversRef.current.push(resolve);\n });\n if (adapterRef.current) enqueuePersistence(adapterRef.current);\n return p;\n }, [enqueuePersistence]);\n\n const setDefState = useCallback(\n (id: string, updater: (prev: unknown) => unknown) => {\n touchedIdsRef.current.add(id);\n setStateAndRef((prev) => {\n const existing = prev.definitions[id];\n if (!existing) return prev;\n return {\n ...prev,\n definitions: {\n ...prev.definitions,\n [id]: { ...existing, state: updater(existing.state) },\n },\n };\n });\n if (stateRef.current.definitions[id]?.scope !== \"thread\") {\n schedulePersistence(id);\n }\n },\n [schedulePersistence, setStateAndRef],\n );\n\n const provider = useMemo(\n () => ({\n getModelContext: () => {\n const defs = stateRef.current.definitions;\n return (\n buildInteractableModelContext(\n defs,\n partialSchemaCacheRef.current,\n setDefState,\n streamBaselinesRef.current,\n ) ?? {}\n );\n },\n subscribe: (callback: () => void) => {\n subscribersRef.current.add(callback);\n return () => {\n subscribersRef.current.delete(callback);\n };\n },\n }),\n [setDefState],\n );\n\n useEffect(() => {\n notifyStateSubscribers(subscribersRef.current);\n }, [state]);\n\n useAssistantScopeEffect(\n \"modelContext\",\n () => clientRef.current!.modelContext().register(provider),\n [provider],\n );\n\n const installUpdateToolUI = useCallback(\n (name: string, entry: UpdateToolUIEntry) => {\n const toolsAccessor = clientRef.current?.tools;\n if (!toolsAccessor || toolsAccessor.source == null) return false;\n entry.unsubscribe = toolsAccessor().setToolUI(\n interactableToolName(name),\n entry.render,\n { standalone: true },\n );\n return true;\n },\n [clientRef],\n );\n\n // register() installs update-tool UIs against the tools instance bound at\n // call time; this re-applies the retained entries when that instance is\n // structurally replaced and installs entries recorded while no tools\n // scope was available. Each re-apply releases the entry's previous\n // install first, so it is an orphaned no-op against a replaced instance\n // and an idempotent replacement against a live one.\n useAssistantScopeEffect(\n \"tools\",\n () => {\n for (const [name, entry] of updateToolUIsRef.current) {\n entry.unsubscribe?.();\n entry.unsubscribe = undefined;\n installUpdateToolUI(name, entry);\n }\n return () => {\n for (const entry of updateToolUIsRef.current.values()) {\n entry.unsubscribe?.();\n entry.unsubscribe = undefined;\n }\n };\n },\n [installUpdateToolUI],\n );\n\n const register = useCallback(\n (def: InternalInteractableRegistration) => {\n const threadAccessor = clientRef.current?.thread;\n const threadMessages =\n threadAccessor && threadAccessor.source != null\n ? (threadAccessor().getState().messages ?? [])\n : [];\n const scope =\n def.scope ??\n (hasInteractableCreateCall(threadMessages, def.id, def.name)\n ? \"thread\"\n : \"app\");\n\n if (\n process.env.NODE_ENV !== \"production\" &&\n stateRef.current.definitions[def.id] &&\n scope !== \"thread\"\n ) {\n console.warn(\n `[Interactables] \"${def.name}\" (${def.id}) is already registered. ` +\n `Register an app-scoped interactable once (unstable_useInteractable) and ` +\n `read it from other components with unstable_useInteractableState.`,\n );\n }\n\n registrationCountsRef.current.set(\n def.id,\n (registrationCountsRef.current.get(def.id) ?? 0) + 1,\n );\n\n let releaseUpdateToolUI: (() => void) | undefined;\n if (def.updateRender) {\n const existing = updateToolUIsRef.current.get(def.name);\n const entry = existing ?? {\n count: 0,\n render: def.updateRender,\n unsubscribe: undefined,\n };\n entry.count++;\n if (!existing) updateToolUIsRef.current.set(def.name, entry);\n\n if (\n !entry.unsubscribe &&\n !installUpdateToolUI(def.name, entry) &&\n process.env.NODE_ENV !== \"production\"\n ) {\n console.warn(\n `[Interactables] \"${def.name}\" supplied an updateRender, but no ` +\n `tools scope is available yet; it will be installed once one appears.`,\n );\n }\n\n releaseUpdateToolUI = () => {\n const entry = updateToolUIsRef.current.get(def.name);\n if (!entry) return;\n if (--entry.count === 0) {\n updateToolUIsRef.current.delete(def.name);\n entry.unsubscribe?.();\n entry.unsubscribe = undefined;\n }\n };\n }\n\n // The same id re-registers once per anchor (its create call + each update_*).\n if (!partialSchemaCacheRef.current.has(def.id)) {\n try {\n const jsonSchema = toJSONSchema(def.stateSchema);\n partialSchemaCacheRef.current.set(\n def.id,\n toPartialJSONSchema(jsonSchema),\n );\n } catch (e) {\n console.warn(\n `[Interactables] Failed to create partial schema for \"${def.name}\". The update tool will accept arbitrary fields without validation.`,\n e,\n );\n }\n }\n\n const threadId = scope === \"thread\" ? getCurrentThreadId() : undefined;\n const detached =\n scope === \"thread\"\n ? threadId\n ? detachedThreadStateRef.current.get(threadId)?.get(def.id)\n : undefined\n : detachedAppStateRef.current.get(def.id);\n if (scope === \"thread\") {\n if (threadId)\n detachedThreadStateRef.current.get(threadId)?.delete(def.id);\n } else {\n detachedAppStateRef.current.delete(def.id);\n }\n const loaded =\n scope === \"thread\" ? undefined : loadedStateRef.current.get(def.id);\n\n // Tool-created items restore from what the model already knows in this\n // thread (the creating call's args, sent snapshots, and the model's own\n // update_* calls) on a fresh reload; detached (in-session remount) still\n // wins so an unsent edit survives a scroll/virtualization cycle.\n const known =\n scope === \"thread\"\n ? findModelKnownState(threadMessages, def.id, def.name)\n : undefined;\n\n setStateAndRef((prev) => ({\n ...prev,\n definitions: {\n ...prev.definitions,\n [def.id]: {\n id: def.id,\n name: def.name,\n description: def.description,\n stateSchema: def.stateSchema,\n initialState: def.initialState,\n scope,\n state:\n prev.definitions[def.id]?.state ??\n detached ??\n known?.state ??\n loaded ??\n def.initialState,\n },\n },\n }));\n\n return () => {\n releaseUpdateToolUI?.();\n\n const remaining = (registrationCountsRef.current.get(def.id) ?? 1) - 1;\n if (remaining > 0) {\n registrationCountsRef.current.set(def.id, remaining);\n return;\n }\n registrationCountsRef.current.delete(def.id);\n\n flushIfPending();\n setStateAndRef((prev) => {\n const existing = prev.definitions[def.id];\n if (existing) {\n if (existing.scope === \"thread\") {\n const threadId = getCurrentThreadId();\n if (threadId) {\n let stateById = detachedThreadStateRef.current.get(threadId);\n if (!stateById) {\n stateById = new Map();\n detachedThreadStateRef.current.set(threadId, stateById);\n }\n stateById.set(def.id, existing.state);\n }\n } else {\n detachedAppStateRef.current.set(def.id, existing.state);\n }\n }\n partialSchemaCacheRef.current.delete(def.id);\n const { [def.id]: _, ...rest } = prev.definitions;\n const { [def.id]: __, ...restPersistence } = prev.persistence;\n return { ...prev, definitions: rest, persistence: restPersistence };\n });\n };\n },\n [\n flushIfPending,\n clientRef,\n getCurrentThreadId,\n installUpdateToolUI,\n setStateAndRef,\n ],\n );\n\n return {\n getState: () => stateRef.current,\n register,\n setState: setDefState,\n exportState,\n importState,\n setPersistenceAdapter,\n flush,\n };\n};\n\n/**\n * Registers the unstable interactables store scope.\n *\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport const unstable_Interactables = resource(useInteractablesResource);\n\nattachTransformScopes(useInteractablesResource, (scopes, parent) => {\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"Interactables.js","names":["useState","useEffect","useCallback","useRef","useMemo","resource","ClientOutput","attachTransformScopes","useAssistantClientRef","useAssistantScopeEffect","Unstable_InteractablesState","Unstable_InteractableRegistration","Unstable_InteractablePersistedState","Unstable_InteractablePersistenceAdapter","Unstable_InteractablesConfig","toJSONSchema","toPartialJSONSchema","ModelContext","buildInteractableModelContext","PartialJSONSchema","findModelKnownState","interactableToolName","notifySubscribers","notifyStateSubscribers","useInteractablePersistenceQueue","RestorePersistedStateOptions","stash","Map","shouldStash","id","shouldApply","def","ToolCallLikePart","type","toolCallId","toolName","MessageLike","role","content","InternalInteractableRegistration","scope","UpdateToolUIEntry","count","render","NonNullable","unsubscribe","hasInteractableCreateCall","messages","name","some","message","part","p","useInteractablesResource","persistence","state","setState","definitions","clientRef","stateRef","subscribersRef","Set","partialSchemaCacheRef","streamBaselinesRef","targetId","detachedAppStateRef","detachedThreadStateRef","registrationCountsRef","updateToolUIsRef","loadedStateRef","touchedIdsRef","adapterRef","undefined","setStateAndRef","updater","prev","next","current","exportState","result","Object","entries","updatePersistenceStatus","flushIfPending","schedulePersistence","flush","snapshot","restorePersistedState","saved","options","entry","set","changed","importState","applyLoadedState","has","loadFromAdapter","adapter","load","e","console","warn","setPersistenceAdapter","getCurrentThreadId","client","threadListItem","source","getState","threads","mainThreadId","setDefState","add","existing","provider","getModelContext","defs","subscribe","callback","delete","modelContext","register","installUpdateToolUI","toolsAccessor","tools","setToolUI","standalone","values","threadAccessor","thread","threadMessages","process","env","NODE_ENV","get","releaseUpdateToolUI","updateRender","jsonSchema","stateSchema","threadId","detached","loaded","known","description","initialState","remaining","stateById","_","rest","__","restPersistence","unstable_Interactables","scopes","parent"],"sources":["../../../src/react/client/Interactables.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useRef, useMemo } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type { ClientOutput } from \"@assistant-ui/store\";\nimport {\n attachTransformScopes,\n useAssistantClientRef,\n useAssistantScopeEffect,\n} from \"@assistant-ui/store/client\";\nimport type {\n Unstable_InteractablesState,\n Unstable_InteractableRegistration,\n Unstable_InteractablePersistedState,\n Unstable_InteractablePersistenceAdapter,\n Unstable_InteractablesConfig,\n} from \"../types/scopes/interactables\";\nimport { toJSONSchema, toPartialJSONSchema } from \"assistant-stream\";\nimport { ModelContext } from \"../../store/clients/model-context-client\";\nimport {\n buildInteractableModelContext,\n type PartialJSONSchema,\n} from \"./interactable-model-context\";\nimport {\n findModelKnownState,\n interactableToolName,\n} from \"../../model-context/interactable-composer-metadata\";\nimport { notifySubscribers as notifyStateSubscribers } from \"../../subscribable/subscribable\";\nimport { useInteractablePersistenceQueue } from \"../interactables-shared/useInteractablePersistenceQueue\";\n\ntype RestorePersistedStateOptions = {\n stash: Map<string, unknown>;\n shouldStash?: (id: string) => boolean;\n shouldApply?: (\n id: string,\n def: Unstable_InteractablesState[\"definitions\"][string],\n ) => boolean;\n};\n\ntype ToolCallLikePart = {\n type?: string;\n toolCallId?: string;\n toolName?: string;\n};\n\ntype MessageLike = {\n role?: string;\n content?: readonly unknown[] | undefined;\n};\n\ntype InternalInteractableRegistration = Unstable_InteractableRegistration & {\n scope?: \"thread\" | undefined;\n};\n\ntype UpdateToolUIEntry = {\n count: number;\n render: NonNullable<Unstable_InteractableRegistration[\"updateRender\"]>;\n unsubscribe: (() => void) | undefined;\n};\n\nconst hasInteractableCreateCall = (\n messages: readonly MessageLike[],\n id: string,\n name: string,\n) =>\n messages.some(\n (message) =>\n message.role === \"assistant\" &&\n message.content?.some((part) => {\n if (!part || typeof part !== \"object\") return false;\n const p = part as ToolCallLikePart;\n return (\n p.type === \"tool-call\" && p.toolCallId === id && p.toolName === name\n );\n }),\n );\n\nconst useInteractablesResource = ({\n persistence,\n}: Unstable_InteractablesConfig = {}): ClientOutput<\"unstable_interactables\"> => {\n const [state, setState] = useState<Unstable_InteractablesState>(() => ({\n definitions: {},\n persistence: {},\n }));\n\n const clientRef = useAssistantClientRef();\n\n const stateRef = useRef(state);\n\n const subscribersRef = useRef(new Set<() => void>());\n const partialSchemaCacheRef = useRef(new Map<string, PartialJSONSchema>());\n const streamBaselinesRef = useRef(\n new Map<string, { targetId: string; state: unknown }>(),\n );\n const detachedAppStateRef = useRef(new Map<string, unknown>());\n const detachedThreadStateRef = useRef(\n new Map<string, Map<string, unknown>>(),\n );\n // An instance may be registered from several anchors (its creating tool\n // call plus update_* calls); the definition lives until the last one leaves.\n const registrationCountsRef = useRef(new Map<string, number>());\n // One update-tool UI per interactable name, alive while any registrant\n // that supplied an updateRender is mounted.\n const updateToolUIsRef = useRef(new Map<string, UpdateToolUIEntry>());\n // App-scoped state restored via adapter.load(), consumed as components register.\n const loadedStateRef = useRef(new Map<string, unknown>());\n // Ids edited locally this session — a local edit always wins over a slow load.\n const touchedIdsRef = useRef(new Set<string>());\n\n const adapterRef = useRef<\n Unstable_InteractablePersistenceAdapter | undefined\n >(undefined);\n\n const setStateAndRef = useCallback(\n (\n updater: (\n prev: Unstable_InteractablesState,\n ) => Unstable_InteractablesState,\n ) => {\n const next = updater(stateRef.current);\n stateRef.current = next;\n setState(next);\n },\n [],\n );\n\n const exportState = useCallback((): Unstable_InteractablePersistedState => {\n const result: Unstable_InteractablePersistedState = {};\n for (const [id, def] of Object.entries(stateRef.current.definitions)) {\n if (def.scope === \"thread\") continue; // thread items persist via snapshot, not the adapter\n result[id] = { name: def.name, state: def.state };\n }\n return result;\n }, []);\n\n const updatePersistenceStatus = useCallback(\n (\n updater: (\n prev: Unstable_InteractablesState[\"persistence\"],\n ) => Unstable_InteractablesState[\"persistence\"],\n ) => {\n setStateAndRef((prev) => {\n const persistence = updater(prev.persistence);\n return persistence === prev.persistence\n ? prev\n : { ...prev, persistence };\n });\n },\n [setStateAndRef],\n );\n\n const { flushIfPending, schedulePersistence, flush } =\n useInteractablePersistenceQueue({\n adapterRef,\n snapshot: exportState,\n updatePersistenceStatus,\n });\n\n const restorePersistedState = useCallback(\n (\n saved: Unstable_InteractablePersistedState,\n options: RestorePersistedStateOptions,\n ) => {\n const shouldStash = options.shouldStash ?? (() => true);\n const shouldApply = options.shouldApply ?? (() => true);\n\n for (const [id, entry] of Object.entries(saved)) {\n if (shouldStash(id)) options.stash.set(id, entry.state);\n }\n setStateAndRef((prev) => {\n let changed = false;\n const definitions = { ...prev.definitions };\n for (const [id, entry] of Object.entries(saved)) {\n const def = definitions[id];\n if (!def || !shouldApply(id, def)) continue;\n definitions[id] = { ...def, state: entry.state };\n changed = true;\n }\n if (!changed) return prev;\n return { ...prev, definitions };\n });\n },\n [setStateAndRef],\n );\n\n const importState = useCallback(\n (saved: Unstable_InteractablePersistedState) => {\n restorePersistedState(saved, { stash: detachedAppStateRef.current });\n },\n [restorePersistedState],\n );\n\n // Applies adapter.load() output: a local edit made while the load was in\n // flight wins, and thread-scoped items never restore from the adapter.\n const applyLoadedState = useCallback(\n (saved: Unstable_InteractablePersistedState) => {\n restorePersistedState(saved, {\n stash: loadedStateRef.current,\n shouldStash: (id) => !touchedIdsRef.current.has(id),\n shouldApply: (id, def) =>\n !touchedIdsRef.current.has(id) && def.scope !== \"thread\",\n });\n },\n [restorePersistedState],\n );\n\n const loadFromAdapter = useCallback(\n async (adapter: Unstable_InteractablePersistenceAdapter) => {\n if (!adapter.load) return;\n try {\n const saved = await adapter.load();\n if (!saved || adapterRef.current !== adapter) return;\n applyLoadedState(saved);\n } catch (e) {\n console.warn(\"[Interactables] Persistence load failed.\", e);\n }\n },\n [applyLoadedState],\n );\n\n const setPersistenceAdapter = useCallback(\n (adapter: Unstable_InteractablePersistenceAdapter | undefined) => {\n if (adapterRef.current !== adapter) flushIfPending();\n adapterRef.current = adapter;\n if (adapter) void loadFromAdapter(adapter);\n },\n [flushIfPending, loadFromAdapter],\n );\n\n const getCurrentThreadId = useCallback((): string | undefined => {\n const client = clientRef.current;\n if (!client) return undefined;\n\n const threadListItem = client.threadListItem;\n if (threadListItem.source != null) {\n return threadListItem().getState().id;\n }\n\n const threads = client.threads;\n if (threads.source != null) {\n return threads().getState().mainThreadId;\n }\n\n return undefined;\n }, [clientRef]);\n\n useEffect(() => {\n if (!persistence) return;\n setPersistenceAdapter(persistence);\n return () => {\n if (adapterRef.current === persistence) {\n setPersistenceAdapter(undefined);\n }\n };\n }, [persistence, setPersistenceAdapter]);\n\n const setDefState = useCallback(\n (id: string, updater: (prev: unknown) => unknown) => {\n touchedIdsRef.current.add(id);\n setStateAndRef((prev) => {\n const existing = prev.definitions[id];\n if (!existing) return prev;\n return {\n ...prev,\n definitions: {\n ...prev.definitions,\n [id]: { ...existing, state: updater(existing.state) },\n },\n };\n });\n if (stateRef.current.definitions[id]?.scope !== \"thread\") {\n schedulePersistence(id);\n }\n },\n [schedulePersistence, setStateAndRef],\n );\n\n const provider = useMemo(\n () => ({\n getModelContext: () => {\n const defs = stateRef.current.definitions;\n return (\n buildInteractableModelContext(\n defs,\n partialSchemaCacheRef.current,\n setDefState,\n streamBaselinesRef.current,\n ) ?? {}\n );\n },\n subscribe: (callback: () => void) => {\n subscribersRef.current.add(callback);\n return () => {\n subscribersRef.current.delete(callback);\n };\n },\n }),\n [setDefState],\n );\n\n useEffect(() => {\n notifyStateSubscribers(subscribersRef.current);\n }, [state]);\n\n useAssistantScopeEffect(\n \"modelContext\",\n () => clientRef.current!.modelContext().register(provider),\n [provider],\n );\n\n const installUpdateToolUI = useCallback(\n (name: string, entry: UpdateToolUIEntry) => {\n const toolsAccessor = clientRef.current?.tools;\n if (!toolsAccessor || toolsAccessor.source == null) return false;\n entry.unsubscribe = toolsAccessor().setToolUI(\n interactableToolName(name),\n entry.render,\n { standalone: true },\n );\n return true;\n },\n [clientRef],\n );\n\n // register() installs update-tool UIs against the tools instance bound at\n // call time; this re-applies the retained entries when that instance is\n // structurally replaced and installs entries recorded while no tools\n // scope was available. Each re-apply releases the entry's previous\n // install first, so it is an orphaned no-op against a replaced instance\n // and an idempotent replacement against a live one.\n useAssistantScopeEffect(\n \"tools\",\n () => {\n for (const [name, entry] of updateToolUIsRef.current) {\n entry.unsubscribe?.();\n entry.unsubscribe = undefined;\n installUpdateToolUI(name, entry);\n }\n return () => {\n for (const entry of updateToolUIsRef.current.values()) {\n entry.unsubscribe?.();\n entry.unsubscribe = undefined;\n }\n };\n },\n [installUpdateToolUI],\n );\n\n const register = useCallback(\n (def: InternalInteractableRegistration) => {\n const threadAccessor = clientRef.current?.thread;\n const threadMessages =\n threadAccessor && threadAccessor.source != null\n ? (threadAccessor().getState().messages ?? [])\n : [];\n const scope =\n def.scope ??\n (hasInteractableCreateCall(threadMessages, def.id, def.name)\n ? \"thread\"\n : \"app\");\n\n if (\n process.env.NODE_ENV !== \"production\" &&\n stateRef.current.definitions[def.id] &&\n scope !== \"thread\"\n ) {\n console.warn(\n `[Interactables] \"${def.name}\" (${def.id}) is already registered. ` +\n `Register an app-scoped interactable once (unstable_useInteractable) and ` +\n `read it from other components with unstable_useInteractableState.`,\n );\n }\n\n registrationCountsRef.current.set(\n def.id,\n (registrationCountsRef.current.get(def.id) ?? 0) + 1,\n );\n\n let releaseUpdateToolUI: (() => void) | undefined;\n if (def.updateRender) {\n const existing = updateToolUIsRef.current.get(def.name);\n const entry = existing ?? {\n count: 0,\n render: def.updateRender,\n unsubscribe: undefined,\n };\n entry.count++;\n if (!existing) updateToolUIsRef.current.set(def.name, entry);\n\n if (\n !entry.unsubscribe &&\n !installUpdateToolUI(def.name, entry) &&\n process.env.NODE_ENV !== \"production\"\n ) {\n console.warn(\n `[Interactables] \"${def.name}\" supplied an updateRender, but no ` +\n `tools scope is available yet; it will be installed once one appears.`,\n );\n }\n\n releaseUpdateToolUI = () => {\n const entry = updateToolUIsRef.current.get(def.name);\n if (!entry) return;\n if (--entry.count === 0) {\n updateToolUIsRef.current.delete(def.name);\n entry.unsubscribe?.();\n entry.unsubscribe = undefined;\n }\n };\n }\n\n // The same id re-registers once per anchor (its create call + each update_*).\n if (!partialSchemaCacheRef.current.has(def.id)) {\n try {\n const jsonSchema = toJSONSchema(def.stateSchema);\n partialSchemaCacheRef.current.set(\n def.id,\n toPartialJSONSchema(jsonSchema),\n );\n } catch (e) {\n console.warn(\n `[Interactables] Failed to create partial schema for \"${def.name}\". The update tool will accept arbitrary fields without validation.`,\n e,\n );\n }\n }\n\n const threadId = scope === \"thread\" ? getCurrentThreadId() : undefined;\n const detached =\n scope === \"thread\"\n ? threadId\n ? detachedThreadStateRef.current.get(threadId)?.get(def.id)\n : undefined\n : detachedAppStateRef.current.get(def.id);\n if (scope === \"thread\") {\n if (threadId)\n detachedThreadStateRef.current.get(threadId)?.delete(def.id);\n } else {\n detachedAppStateRef.current.delete(def.id);\n }\n const loaded =\n scope === \"thread\" ? undefined : loadedStateRef.current.get(def.id);\n\n // Tool-created items restore from what the model already knows in this\n // thread (the creating call's args, sent snapshots, and the model's own\n // update_* calls) on a fresh reload; detached (in-session remount) still\n // wins so an unsent edit survives a scroll/virtualization cycle.\n const known =\n scope === \"thread\"\n ? findModelKnownState(threadMessages, def.id, def.name)\n : undefined;\n\n setStateAndRef((prev) => ({\n ...prev,\n definitions: {\n ...prev.definitions,\n [def.id]: {\n id: def.id,\n name: def.name,\n description: def.description,\n stateSchema: def.stateSchema,\n initialState: def.initialState,\n scope,\n state:\n prev.definitions[def.id]?.state ??\n detached ??\n known?.state ??\n loaded ??\n def.initialState,\n },\n },\n }));\n\n return () => {\n releaseUpdateToolUI?.();\n\n const remaining = (registrationCountsRef.current.get(def.id) ?? 1) - 1;\n if (remaining > 0) {\n registrationCountsRef.current.set(def.id, remaining);\n return;\n }\n registrationCountsRef.current.delete(def.id);\n\n flushIfPending();\n setStateAndRef((prev) => {\n const existing = prev.definitions[def.id];\n if (existing) {\n if (existing.scope === \"thread\") {\n const threadId = getCurrentThreadId();\n if (threadId) {\n let stateById = detachedThreadStateRef.current.get(threadId);\n if (!stateById) {\n stateById = new Map();\n detachedThreadStateRef.current.set(threadId, stateById);\n }\n stateById.set(def.id, existing.state);\n }\n } else {\n detachedAppStateRef.current.set(def.id, existing.state);\n }\n }\n partialSchemaCacheRef.current.delete(def.id);\n const { [def.id]: _, ...rest } = prev.definitions;\n const { [def.id]: __, ...restPersistence } = prev.persistence;\n return { ...prev, definitions: rest, persistence: restPersistence };\n });\n };\n },\n [\n flushIfPending,\n clientRef,\n getCurrentThreadId,\n installUpdateToolUI,\n setStateAndRef,\n ],\n );\n\n return {\n getState: () => stateRef.current,\n register,\n setState: setDefState,\n exportState,\n importState,\n setPersistenceAdapter,\n flush,\n };\n};\n\n/**\n * Registers the unstable interactables store scope.\n *\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport const unstable_Interactables = resource(useInteractablesResource);\n\nattachTransformScopes(useInteractablesResource, (scopes, parent) => {\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n});\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteThreadList.d.ts","names":[],"sources":["../../../src/react/client/RemoteThreadList.ts"],"mappings":";;;;KAqDY;;;;EAIV,SAAS;;;;;;;EAOT,QAAQ;EACR;EACA,qBAAqB;EACrB,qBAAqB;EACrB;EACA,aAAa;;;;;;;;;;cAwiCF,8CAAgB,SAAA,0BAAA,OAAA"}
1
+ {"version":3,"file":"RemoteThreadList.d.ts","names":[],"sources":["../../../src/react/client/RemoteThreadList.ts"],"mappings":";;;;KA+CY;;;;EAIV,SAAS;;;;;;;EAOT,QAAQ;EACR;EACA,qBAAqB;EACrB,qBAAqB;EACrB;EACA,aAAa;;;;;;;;;;cA8gCF,8CAAgB,SAAA,0BAAA,OAAA"}
@@ -1,6 +1,5 @@
1
- import { generateId } from "../../utils/id.js";
2
1
  import { OptimisticState } from "../../runtimes/remote-thread-list/optimistic-state.js";
3
- import { classifyThreads, createThreadMappingId, getThreadData, normalizeCursor, updateStatusReducer } from "../../runtimes/remote-thread-list/remote-thread-state.js";
2
+ import { classifyThreads, createEmptyRemoteThreadState, createThreadMappingId, getThreadData, normalizeCursor, preserveMidLoadTransitions, seedNewThread, statusSnapshot, updateStatusReducer } from "../../runtimes/remote-thread-list/remote-thread-state.js";
4
3
  import { handleThreadListAction } from "../../store/runtime-clients/handle-thread-list-action.js";
5
4
  import { useThreadSelectionEvents } from "../../store/clients/thread-selection-events.js";
6
5
  import { isDevelopment } from "../../store/env.js";
@@ -14,16 +13,7 @@ import { resource, withKey } from "@assistant-ui/tap";
14
13
  import { attachTransformScopes, useClientLookup, useClientResource } from "@assistant-ui/store/client";
15
14
  //#region src/react/client/RemoteThreadList.ts
16
15
  const RESOLVED_PROMISE = Promise.resolve();
17
- const EMPTY_LIST = {
18
- isLoading: true,
19
- isLoadingMore: false,
20
- cursor: void 0,
21
- newThreadId: void 0,
22
- threadIds: [],
23
- archivedThreadIds: [],
24
- threadIdMap: {},
25
- threadData: {}
26
- };
16
+ const EMPTY_LIST = createEmptyRemoteThreadState();
27
17
  const threadNotFoundError = (threadIdOrRemoteId, action) => /* @__PURE__ */ new Error(`Thread "${threadIdOrRemoteId}" was not found while ${action}.`);
28
18
  const threadStatusError = (threadIdOrRemoteId, status, action) => /* @__PURE__ */ new Error(`Thread "${threadIdOrRemoteId}" has status "${status}", so it cannot ${action}.`);
29
19
  const toInitializeResult = (result) => ({
@@ -32,36 +22,7 @@ const toInitializeResult = (result) => ({
32
22
  });
33
23
  const applyTitleStream = async (stream, onTitle) => {
34
24
  const messageStream = AssistantMessageStream.fromAssistantStream(stream);
35
- for await (const result of messageStream) onTitle(result.parts.filter((part) => part.type === "text")[0]?.text);
36
- };
37
- const seedNewThread = (state) => {
38
- let id;
39
- do
40
- id = `__LOCALID_${generateId()}`;
41
- while (state.threadIdMap[id]);
42
- const mappingId = createThreadMappingId(id);
43
- return {
44
- id,
45
- state: {
46
- ...state,
47
- newThreadId: id,
48
- threadIdMap: {
49
- ...state.threadIdMap,
50
- [id]: mappingId
51
- },
52
- threadData: {
53
- ...state.threadData,
54
- [mappingId]: {
55
- status: "new",
56
- id,
57
- remoteId: void 0,
58
- externalId: void 0,
59
- title: void 0,
60
- custom: void 0
61
- }
62
- }
63
- }
64
- };
25
+ for await (const result of messageStream) await onTitle(result.parts.filter((part) => part.type === "text")[0]?.text);
65
26
  };
66
27
  const useThreadListItemClient = (props) => {
67
28
  const $ = c(22);
@@ -304,6 +265,7 @@ const useRemoteThreadList = (props) => {
304
265
  if (session.loadPromise) return session.loadPromise;
305
266
  const generation = session.loadGeneration;
306
267
  const adapter_0 = session.adapter;
268
+ const statusAtRequest = statusSnapshot(store.baseValue);
307
269
  session.loadPromise = store.optimisticUpdate({
308
270
  execute: () => adapter_0.list(),
309
271
  loading: (state) => ({
@@ -319,7 +281,7 @@ const useRemoteThreadList = (props) => {
319
281
  threadIdMap: {},
320
282
  threadData: {}
321
283
  });
322
- return {
284
+ const merged = {
323
285
  ...state_0,
324
286
  isLoading: false,
325
287
  cursor: normalizeCursor(page.nextCursor),
@@ -334,6 +296,7 @@ const useRemoteThreadList = (props) => {
334
296
  ...fresh.threadData
335
297
  }
336
298
  };
299
+ return preserveMidLoadTransitions(merged, state_0, statusAtRequest);
337
300
  }
338
301
  }).catch((error) => {
339
302
  if (generation !== session.loadGeneration) return;
@@ -762,19 +725,23 @@ const useRemoteThreadList = (props) => {
762
725
  if (!messages) return;
763
726
  const stream = await currentAdapter_6.generateTitle(remoteId_7, messages);
764
727
  requireAdapterGeneration(adapterGeneration_5);
765
- await applyTitleStream(stream, (newTitle_0) => {
766
- if (adapterGeneration_5 !== session.adapterGeneration) return;
767
- const state_13 = store.baseValue;
768
- const current_2 = getThreadData(state_13, data_7.id);
769
- if (!current_2) return;
770
- store.update({
771
- ...state_13,
772
- threadData: {
773
- ...state_13.threadData,
774
- [current_2.id]: {
775
- ...current_2,
776
- title: newTitle_0
777
- }
728
+ await applyTitleStream(stream, async (newTitle_0) => {
729
+ await store.optimisticUpdate({
730
+ execute: async () => {},
731
+ optimistic: (state_13) => {
732
+ if (adapterGeneration_5 !== session.adapterGeneration) return state_13;
733
+ const current_2 = getThreadData(state_13, data_7.id);
734
+ if (!current_2) return state_13;
735
+ return {
736
+ ...state_13,
737
+ threadData: {
738
+ ...state_13.threadData,
739
+ [current_2.id]: {
740
+ ...current_2,
741
+ title: newTitle_0
742
+ }
743
+ }
744
+ };
778
745
  }
779
746
  });
780
747
  });
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteThreadList.js","names":["useCallback","useEffect","useMemo","useState","useSyncExternalStore","resource","withKey","ClientOutput","attachTransformScopes","useClientLookup","useClientResource","isDevelopment","useThreadSelectionEvents","generateId","OptimisticState","classifyThreads","createThreadMappingId","getThreadData","normalizeCursor","updateStatusReducer","RemoteThreadData","RemoteThreadState","RemoteThreadInitializeResponse","RemoteThreadListAdapter","ThreadListAdapterChangedError","ThreadMessage","AssistantMessageStream","handleThreadListAction","inMemoryThreadListTransformScopes","InMemoryThreadListProps","AdaptedRemoteThread","RESOLVED_PROMISE","Promise","resolve","EMPTY_LIST","isLoading","isLoadingMore","cursor","undefined","newThreadId","threadIds","archivedThreadIds","threadIdMap","threadData","RemoteThreadListProps","adapter","thread","threadId","onThreadIdChange","onSwitchToThread","onSwitchToNewThread","onDelete","threadNotFoundError","threadIdOrRemoteId","action","Error","threadStatusError","status","toInitializeResult","result","remoteId","externalId","applyTitleStream","stream","Parameters","fromAssistantStream","onTitle","title","messageStream","parts","filter","part","type","text","seedNewThread","state","id","mappingId","custom","useThreadListItemClient","props","$","_c","data","isRunning","onSwitchTo","onRename","onUpdateCustom","onArchive","onUnarchive","onGenerateTitle","onInitialize","onDetach","t0","lastMessageAt","t1","t2","t3","getState","switchTo","rename","updateCustom","archive","unarchive","delete","generateTitle","initialize","detach","ThreadListItemClient","collectItemOrder","listState","mainThreadId","ids","seenIds","Set","seenRemoteIds","items","has","add","push","itemMatchesId","item","isSameThread","left","right","useRemoteThreadListView","threadFactory","useAdapters","wrapped","key","mainThreadClient","itemOrder","t4","t5","options","messages","map","threadListItems","useRemoteThreadList","store","initialMainId","session","seeded","adapterAtLoad","adapterGeneration","loadGeneration","switchGeneration","loadPromise","loadMorePromise","lastNotifiedRemoteId","lastControlledThreadId","switchTask","isFirstThreadIdEffect","onStoreChange","subscribe","value","setMainThreadId","assignMainThreadId","notifyRemoteId","emit","getLoadThreadsPromise","generation","optimisticUpdate","execute","list","loading","then","page","fresh","threads","nextCursor","catch","error","console","update","baseValue","reload","adapterChanged","reset","unstable_useAdapters","unstable_Provider","warn","loadMore","snapshot","currentAdapter","task","after","appended","startSwitch","run","settle","reject","switchToThread","emitThreadIdChange","remoteMetadata","fetch","wasInTarget","includes","threadIdsWithoutRemote","archivedThreadIdsWithoutRemote","initializeTask","current","optimistic","switchToNewThread","waitForUpdate","existing","existingId","ensureNotMain","lastAwaitedTask","startedFallback","requireAdapterGeneration","newTitle","Record","deleteThread","mainRemoteId","Object","is","hasMore","threadItems","main","reloadMainThread","methods","unstable_refetchThread","selector","index","findIndex","get","archived","RemoteThreadList"],"sources":["../../../src/react/client/RemoteThreadList.ts"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport { resource, withKey } from \"@assistant-ui/tap\";\nimport type { ClientOutput } from \"@assistant-ui/store\";\nimport {\n attachTransformScopes,\n useClientLookup,\n useClientResource,\n} from \"@assistant-ui/store/client\";\nimport { isDevelopment, useThreadSelectionEvents } from \"../../store/internal\";\nimport { generateId } from \"../../utils/id\";\nimport { OptimisticState } from \"../../runtimes/remote-thread-list/optimistic-state\";\nimport {\n classifyThreads,\n createThreadMappingId,\n getThreadData,\n normalizeCursor,\n updateStatusReducer,\n type RemoteThreadData,\n type RemoteThreadState,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport type {\n RemoteThreadInitializeResponse,\n RemoteThreadListAdapter,\n} from \"../../runtimes/remote-thread-list/types\";\nimport { ThreadListAdapterChangedError } from \"../../runtimes/remote-thread-list/adapter-changed\";\nimport type { ThreadMessage } from \"../../types/message\";\nimport { AssistantMessageStream } from \"assistant-stream\";\nimport { handleThreadListAction } from \"../../store/runtime-clients/handle-thread-list-action\";\nimport {\n inMemoryThreadListTransformScopes,\n type InMemoryThreadListProps,\n} from \"./InMemoryThreadList\";\nimport { AdaptedRemoteThread } from \"./AdaptedRemoteThread\";\n\nconst RESOLVED_PROMISE = Promise.resolve();\n\nconst EMPTY_LIST: RemoteThreadState = {\n isLoading: true,\n isLoadingMore: false,\n cursor: undefined,\n newThreadId: undefined,\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n};\n\nexport type RemoteThreadListProps = {\n /**\n * Swapping this to a different backing store does not reload the list. Call `reload()` after a genuine swap. A recreated object for the same store is a no-op. `reload()` after a different adapter instance resets selection and cached records before loading.\n */\n adapter: RemoteThreadListAdapter;\n /**\n * Factory for the visible thread. Per-thread history reload requires a\n * resource keyed by thread id (`withKey(id, thread(...))`). An unkeyed\n * factory keeps one instance across switches, so a mount-once history\n * loader will not fetch the next thread.\n */\n thread: InMemoryThreadListProps[\"thread\"];\n threadId?: string | undefined;\n onThreadIdChange?: ((threadId: string | undefined) => void) | undefined;\n onSwitchToThread?: ((threadId: string) => void) | undefined;\n onSwitchToNewThread?: (() => void) | undefined;\n onDelete?: ((threadId: string) => void) | undefined;\n};\n\nconst threadNotFoundError = (threadIdOrRemoteId: string, action: string) =>\n new Error(`Thread \"${threadIdOrRemoteId}\" was not found while ${action}.`);\n\nconst threadStatusError = (\n threadIdOrRemoteId: string,\n status: RemoteThreadData[\"status\"],\n action: string,\n) =>\n new Error(\n `Thread \"${threadIdOrRemoteId}\" has status \"${status}\", so it cannot ${action}.`,\n );\n\nconst toInitializeResult = (\n result: RemoteThreadInitializeResponse,\n): { remoteId: string; externalId: string | undefined } => ({\n remoteId: result.remoteId,\n externalId: result.externalId,\n});\n\nconst applyTitleStream = async (\n stream: Parameters<typeof AssistantMessageStream.fromAssistantStream>[0],\n onTitle: (title: string | undefined) => void,\n) => {\n const messageStream = AssistantMessageStream.fromAssistantStream(stream);\n for await (const result of messageStream) {\n onTitle(result.parts.filter((part) => part.type === \"text\")[0]?.text);\n }\n};\n\nconst seedNewThread = (\n state: RemoteThreadState,\n): { id: string; state: RemoteThreadState } => {\n let id: string;\n do {\n id = `__LOCALID_${generateId()}`;\n } while (state.threadIdMap[id]);\n const mappingId = createThreadMappingId(id);\n return {\n id,\n state: {\n ...state,\n newThreadId: id,\n threadIdMap: {\n ...state.threadIdMap,\n [id]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n status: \"new\",\n id,\n remoteId: undefined,\n externalId: undefined,\n title: undefined,\n custom: undefined,\n },\n },\n },\n };\n};\n\nconst useThreadListItemClient = (props: {\n data: RemoteThreadData;\n isRunning: boolean;\n onSwitchTo: (options?: { unarchive?: boolean }) => void;\n onRename: (title: string) => void;\n onUpdateCustom: (custom: Record<string, unknown> | undefined) => void;\n onArchive: () => void;\n onUnarchive: () => void;\n onDelete: () => void;\n onGenerateTitle: () => void;\n onInitialize: () => Promise<{\n remoteId: string;\n externalId: string | undefined;\n }>;\n onDetach: () => void;\n}): ClientOutput<\"threadListItem\"> => {\n const {\n data,\n isRunning,\n onSwitchTo,\n onRename,\n onUpdateCustom,\n onArchive,\n onUnarchive,\n onDelete,\n onGenerateTitle,\n onInitialize,\n onDetach,\n } = props;\n const state = useMemo(\n () => ({\n id: data.id,\n remoteId: data.remoteId,\n externalId: data.externalId,\n title: data.title,\n lastMessageAt: \"lastMessageAt\" in data ? data.lastMessageAt : undefined,\n status: data.status,\n custom: data.custom,\n isRunning,\n }),\n [data, isRunning],\n );\n\n return {\n getState: () => state,\n switchTo: onSwitchTo,\n rename: onRename,\n updateCustom: onUpdateCustom,\n archive: onArchive,\n unarchive: onUnarchive,\n delete: onDelete,\n generateTitle: onGenerateTitle,\n initialize: onInitialize,\n detach: onDetach,\n };\n};\n\nconst ThreadListItemClient = resource(useThreadListItemClient);\n\nconst collectItemOrder = (\n listState: RemoteThreadState,\n mainThreadId: string,\n): RemoteThreadData[] => {\n const ids = [\n listState.newThreadId,\n ...listState.threadIds,\n ...listState.archivedThreadIds,\n mainThreadId,\n ].filter((id): id is string => id !== undefined);\n const seenIds = new Set<string>();\n const seenRemoteIds = new Set<string>();\n const items: RemoteThreadData[] = [];\n for (const id of ids) {\n const data = getThreadData(listState, id);\n if (!data || seenIds.has(data.id)) continue;\n if (data.remoteId !== undefined && seenRemoteIds.has(data.remoteId)) {\n continue;\n }\n seenIds.add(data.id);\n if (data.remoteId !== undefined) seenRemoteIds.add(data.remoteId);\n items.push(data);\n }\n return items;\n};\n\nconst itemMatchesId = (\n item: RemoteThreadData,\n listState: RemoteThreadState,\n id: string,\n) => {\n const data = getThreadData(listState, id);\n return (\n item.id === id ||\n item.id === data?.id ||\n (data?.remoteId !== undefined &&\n (item.id === data.remoteId || item.remoteId === data.remoteId))\n );\n};\n\nconst isSameThread = (\n listState: RemoteThreadState,\n left: string,\n right: string,\n) => {\n if (left === right) return true;\n const data = getThreadData(listState, left);\n return data !== undefined && itemMatchesId(data, listState, right);\n};\n\nconst useRemoteThreadListView = ({\n listState,\n mainThreadId,\n threadFactory,\n useAdapters,\n onSwitchTo,\n onRename,\n onUpdateCustom,\n onArchive,\n onUnarchive,\n onDelete,\n onGenerateTitle,\n onInitialize,\n onDetach,\n}: {\n listState: RemoteThreadState;\n mainThreadId: string;\n threadFactory: RemoteThreadListProps[\"thread\"];\n useAdapters: RemoteThreadListAdapter[\"unstable_useAdapters\"];\n onSwitchTo: (\n threadId: string,\n options?: { unarchive?: boolean },\n ) => Promise<void>;\n onRename: (threadId: string, title: string) => Promise<void>;\n onUpdateCustom: (\n threadId: string,\n custom: Record<string, unknown> | undefined,\n ) => Promise<void>;\n onArchive: (threadId: string) => Promise<void>;\n onUnarchive: (threadId: string) => Promise<void>;\n onDelete: (threadId: string) => Promise<void>;\n onGenerateTitle: (\n threadId: string,\n messages: readonly ThreadMessage[] | undefined,\n ) => Promise<void>;\n onInitialize: (threadId: string) => Promise<{\n remoteId: string;\n externalId: string | undefined;\n }>;\n onDetach: (threadId: string) => Promise<void>;\n}) => {\n const thread = threadFactory(mainThreadId);\n const wrapped =\n useAdapters === undefined\n ? thread\n : AdaptedRemoteThread({\n useAdapters,\n thread,\n });\n const mainThreadClient = useClientResource(\n thread.key === undefined ? wrapped : withKey(thread.key, wrapped),\n );\n const itemOrder = useMemo(\n () => collectItemOrder(listState, mainThreadId),\n [listState, mainThreadId],\n );\n const threadListItems = useClientLookup(\n itemOrder.map((data) =>\n withKey(\n data.id,\n ThreadListItemClient({\n data,\n isRunning:\n itemMatchesId(data, listState, mainThreadId) &&\n mainThreadClient.state.isRunning,\n onSwitchTo: (options) =>\n handleThreadListAction(\"switch\", () =>\n onSwitchTo(data.id, options),\n ),\n onRename: (title) =>\n handleThreadListAction(\"rename\", () => onRename(data.id, title)),\n onUpdateCustom: (custom) =>\n handleThreadListAction(\"update custom metadata\", () =>\n onUpdateCustom(data.id, custom),\n ),\n onArchive: () =>\n handleThreadListAction(\"archive\", () => onArchive(data.id)),\n onUnarchive: () =>\n handleThreadListAction(\"unarchive\", () => onUnarchive(data.id)),\n onDelete: () =>\n handleThreadListAction(\"delete\", () => onDelete(data.id)),\n onGenerateTitle: () =>\n handleThreadListAction(\"generate title\", () =>\n onGenerateTitle(\n data.id,\n mainThreadClient.state.messages as\n | readonly ThreadMessage[]\n | undefined,\n ),\n ),\n onInitialize: () => onInitialize(data.id),\n onDetach: () =>\n handleThreadListAction(\"detach\", () => onDetach(data.id)),\n }),\n ),\n ),\n );\n return { mainThreadClient, itemOrder, threadListItems };\n};\n\nconst useRemoteThreadList = (\n props: RemoteThreadListProps,\n): ClientOutput<\"threads\"> => {\n const {\n adapter,\n thread: threadFactory,\n threadId,\n onThreadIdChange,\n onSwitchToThread,\n onSwitchToNewThread,\n onDelete,\n } = props;\n\n const [{ store, initialMainId, session }] = useState(() => {\n const seeded = seedNewThread(EMPTY_LIST);\n return {\n store: new OptimisticState(seeded.state),\n initialMainId: seeded.id,\n session: {\n adapter,\n adapterAtLoad: adapter,\n adapterGeneration: 0,\n loadGeneration: 0,\n switchGeneration: 0,\n loadPromise: undefined as Promise<void> | undefined,\n loadMorePromise: undefined as Promise<void> | undefined,\n lastNotifiedRemoteId: undefined as string | undefined,\n lastControlledThreadId: undefined as string | undefined,\n switchTask: undefined as Promise<void> | undefined,\n mainThreadId: seeded.id,\n isFirstThreadIdEffect: true,\n onThreadIdChange,\n onSwitchToThread,\n onSwitchToNewThread,\n },\n };\n });\n\n // Config updates can invoke `reload()` in the same turn as the re-render, before the effect below runs.\n session.adapter = adapter;\n\n const listState = useSyncExternalStore(\n (onStoreChange) => store.subscribe(onStoreChange),\n () => store.value,\n () => store.value,\n );\n\n const [mainThreadId, setMainThreadId] = useState(initialMainId);\n const assignMainThreadId = useCallback(\n (id: string) => {\n session.mainThreadId = id;\n setMainThreadId(id);\n },\n [session],\n );\n useThreadSelectionEvents(mainThreadId);\n useEffect(() => {\n session.adapter = adapter;\n session.mainThreadId = mainThreadId;\n session.onThreadIdChange = onThreadIdChange;\n session.onSwitchToThread = onSwitchToThread;\n session.onSwitchToNewThread = onSwitchToNewThread;\n }, [\n adapter,\n mainThreadId,\n onSwitchToNewThread,\n onSwitchToThread,\n onThreadIdChange,\n session,\n ]);\n\n const notifyRemoteId = useCallback(\n (remoteId: string | undefined, emit: boolean) => {\n if (session.lastNotifiedRemoteId === remoteId) return;\n session.lastNotifiedRemoteId = remoteId;\n if (emit) session.onThreadIdChange?.(remoteId);\n },\n [session],\n );\n\n const getLoadThreadsPromise = useCallback(() => {\n if (session.loadPromise) return session.loadPromise;\n const generation = session.loadGeneration;\n const adapter = session.adapter;\n session.loadPromise = store\n .optimisticUpdate({\n execute: () => adapter.list(),\n loading: (state) => ({ ...state, isLoading: true }),\n then: (state, page) => {\n if (generation !== session.loadGeneration) return state;\n session.adapterAtLoad = adapter;\n const fresh = classifyThreads(page.threads, {\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n return {\n ...state,\n isLoading: false,\n cursor: normalizeCursor(page.nextCursor),\n threadIds: fresh.threadIds,\n archivedThreadIds: fresh.archivedThreadIds,\n threadIdMap: {\n ...state.threadIdMap,\n ...fresh.threadIdMap,\n },\n threadData: {\n ...state.threadData,\n ...fresh.threadData,\n },\n };\n },\n })\n .catch((error: unknown) => {\n if (generation !== session.loadGeneration) return;\n console.error(\"[assistant-ui] thread list load failed:\", error);\n session.loadPromise = undefined;\n store.update({\n ...store.baseValue,\n isLoading: false,\n });\n })\n .then(() => {});\n return session.loadPromise;\n }, [session, store]);\n\n const reload = useCallback(() => {\n const adapterChanged = adapter !== session.adapterAtLoad;\n session.loadGeneration++;\n session.loadPromise = undefined;\n session.loadMorePromise = undefined;\n if (adapterChanged) {\n session.adapterGeneration++;\n session.switchGeneration++;\n session.switchTask = undefined;\n session.adapterAtLoad = adapter;\n const seeded = seedNewThread(EMPTY_LIST);\n store.reset({ ...seeded.state, isLoading: true });\n assignMainThreadId(seeded.id);\n notifyRemoteId(undefined, true);\n } else {\n store.update({\n ...store.baseValue,\n cursor: undefined,\n });\n }\n return getLoadThreadsPromise();\n }, [\n adapter,\n assignMainThreadId,\n getLoadThreadsPromise,\n notifyRemoteId,\n session,\n store,\n ]);\n\n useEffect(() => {\n void getLoadThreadsPromise();\n }, [getLoadThreadsPromise]);\n\n useEffect(() => {\n if (!isDevelopment) return;\n if (adapter.unstable_useAdapters !== undefined) return;\n if (adapter.unstable_Provider === undefined) return;\n console.warn(\n \"[assistant-ui] RemoteThreadList ignores RemoteThreadListAdapter.unstable_Provider. Expose unstable_useAdapters so per-thread history loads on this entry. useRemoteThreadListRuntime still honors unstable_Provider.\",\n );\n }, [adapter]);\n\n const loadMore = useCallback(() => {\n if (session.loadMorePromise) return session.loadMorePromise;\n const snapshot = store.value;\n if (snapshot.cursor === undefined || snapshot.isLoading) {\n return RESOLVED_PROMISE;\n }\n const generation = session.loadGeneration;\n const cursor = snapshot.cursor;\n const currentAdapter = session.adapter;\n const task = store\n .optimisticUpdate({\n execute: () => currentAdapter.list({ after: cursor }),\n loading: (state) => ({ ...state, isLoadingMore: true }),\n then: (state, page) => {\n if (generation !== session.loadGeneration) return state;\n const appended = classifyThreads(page.threads, {\n threadIds: [...state.threadIds],\n archivedThreadIds: [...state.archivedThreadIds],\n threadIdMap: { ...state.threadIdMap },\n threadData: { ...state.threadData },\n });\n return {\n ...state,\n isLoadingMore: false,\n cursor: normalizeCursor(page.nextCursor),\n threadIds: appended.threadIds,\n archivedThreadIds: appended.archivedThreadIds,\n threadIdMap: appended.threadIdMap,\n threadData: appended.threadData,\n };\n },\n })\n .catch((error: unknown) => {\n if (generation !== session.loadGeneration) return;\n console.error(\"[assistant-ui] thread list loadMore failed:\", error);\n })\n .then(() => {\n if (session.loadMorePromise === task) {\n session.loadMorePromise = undefined;\n }\n });\n session.loadMorePromise = task;\n return task;\n }, [session, store]);\n\n const startSwitch = useCallback(\n (run: (generation: number) => Promise<void>) => {\n const generation = ++session.switchGeneration;\n let settle!: (error?: unknown) => void;\n const task = new Promise<void>((resolve, reject) => {\n settle = (error) => {\n if (error === undefined) resolve();\n else reject(error);\n };\n });\n session.switchTask = task;\n void run(generation).then(\n () => settle(),\n (error: unknown) => settle(error),\n );\n return task;\n },\n [session],\n );\n\n const switchToThread = useCallback(\n (\n threadIdOrRemoteId: string,\n options?: { unarchive?: boolean },\n emitThreadIdChange = true,\n ) =>\n startSwitch(async (generation) => {\n let data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) {\n const remoteMetadata =\n await session.adapter.fetch(threadIdOrRemoteId);\n if (generation !== session.switchGeneration) return;\n const state = store.value;\n const mappingId = createThreadMappingId(remoteMetadata.remoteId);\n const wasInTarget =\n remoteMetadata.status === \"regular\"\n ? state.threadIds.includes(remoteMetadata.remoteId)\n : state.archivedThreadIds.includes(remoteMetadata.remoteId);\n const threadIdsWithoutRemote = state.threadIds.filter(\n (id) => id !== remoteMetadata.remoteId,\n );\n const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter(\n (id) => id !== remoteMetadata.remoteId,\n );\n store.update({\n ...state,\n threadIds:\n remoteMetadata.status === \"regular\"\n ? wasInTarget\n ? state.threadIds\n : [...threadIdsWithoutRemote, remoteMetadata.remoteId]\n : threadIdsWithoutRemote,\n archivedThreadIds:\n remoteMetadata.status === \"archived\"\n ? wasInTarget\n ? state.archivedThreadIds\n : [...archivedThreadIdsWithoutRemote, remoteMetadata.remoteId]\n : archivedThreadIdsWithoutRemote,\n threadIdMap: {\n ...state.threadIdMap,\n [remoteMetadata.remoteId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n id: mappingId,\n initializeTask: Promise.resolve({\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n }),\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n status: remoteMetadata.status,\n title: remoteMetadata.title,\n lastMessageAt: remoteMetadata.lastMessageAt,\n custom: remoteMetadata.custom,\n },\n },\n });\n data = getThreadData(store.value, threadIdOrRemoteId);\n }\n if (!data) {\n throw threadNotFoundError(threadIdOrRemoteId, \"switching to it\");\n }\n if (isSameThread(store.value, data.id, session.mainThreadId)) return;\n if (data.status === \"archived\" && options?.unarchive !== false) {\n const current = data;\n const { remoteId } = await current.initializeTask;\n if (generation !== session.switchGeneration) return;\n await store.optimisticUpdate({\n execute: () => session.adapter.unarchive(remoteId),\n optimistic: (state) =>\n updateStatusReducer(state, current.id, \"regular\"),\n });\n if (generation !== session.switchGeneration) return;\n data = getThreadData(store.value, current.id) ?? current;\n }\n if (generation !== session.switchGeneration) return;\n assignMainThreadId(data.id);\n notifyRemoteId(data.remoteId, emitThreadIdChange);\n session.onSwitchToThread?.(data.id);\n }),\n [assignMainThreadId, notifyRemoteId, session, startSwitch, store],\n );\n\n const switchToNewThread = useCallback(\n (emitThreadIdChange = true) =>\n startSwitch(async (generation) => {\n while (\n store.baseValue.newThreadId !== undefined &&\n store.value.newThreadId === undefined\n ) {\n await store.waitForUpdate();\n if (generation !== session.switchGeneration) return;\n }\n const existing = store.value.newThreadId;\n if (existing !== undefined) {\n const existingId =\n getThreadData(store.value, existing)?.id ?? existing;\n if (isSameThread(store.value, existingId, session.mainThreadId)) {\n return;\n }\n assignMainThreadId(existingId);\n notifyRemoteId(undefined, emitThreadIdChange);\n session.onSwitchToNewThread?.();\n return;\n }\n const seeded = seedNewThread(store.baseValue);\n store.update(seeded.state);\n if (generation !== session.switchGeneration) return;\n assignMainThreadId(seeded.id);\n notifyRemoteId(undefined, emitThreadIdChange);\n session.onSwitchToNewThread?.();\n }),\n [assignMainThreadId, notifyRemoteId, session, startSwitch, store],\n );\n\n const ensureNotMain = useCallback(\n async (threadId: string) => {\n if (threadId === store.value.newThreadId) {\n throw new Error(\"Cannot ensure new thread is not main\");\n }\n let lastAwaitedTask: Promise<void> | undefined;\n while (isSameThread(store.value, threadId, session.mainThreadId)) {\n let switchTask = session.switchTask;\n const startedFallback = !switchTask || switchTask === lastAwaitedTask;\n if (startedFallback) {\n switchTask = switchToNewThread();\n }\n lastAwaitedTask = switchTask;\n try {\n await switchTask;\n } catch (error) {\n if (startedFallback && session.switchTask === switchTask) {\n throw error;\n }\n }\n }\n },\n [session, store, switchToNewThread],\n );\n\n const requireAdapterGeneration = useCallback(\n (generation: number) => {\n if (generation !== session.adapterGeneration) {\n throw new ThreadListAdapterChangedError();\n }\n },\n [session],\n );\n\n const initialize = useCallback(\n async (threadId: string) => {\n const currentAdapter = session.adapter;\n const adapterGeneration = session.adapterGeneration;\n if (store.value.newThreadId !== threadId) {\n const data = getThreadData(store.value, threadId);\n if (!data) throw threadNotFoundError(threadId, \"initializing it\");\n if (data.status === \"new\") {\n throw threadStatusError(threadId, data.status, \"be initialized here\");\n }\n const result = toInitializeResult(await data.initializeTask);\n requireAdapterGeneration(adapterGeneration);\n return result;\n }\n const result = await store.optimisticUpdate({\n execute: () => {\n requireAdapterGeneration(adapterGeneration);\n return currentAdapter.initialize(threadId);\n },\n optimistic: (state) => updateStatusReducer(state, threadId, \"regular\"),\n loading: (state, task) => {\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...state.threadData[mappingId],\n initializeTask: task,\n },\n },\n };\n },\n then: (state, { remoteId, externalId }) => {\n if (adapterGeneration !== session.adapterGeneration) return state;\n const data = getThreadData(state, threadId);\n if (!data) return state;\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadIdMap: {\n ...state.threadIdMap,\n [remoteId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...data,\n initializeTask: Promise.resolve({ remoteId, externalId }),\n remoteId,\n externalId,\n },\n },\n };\n },\n });\n requireAdapterGeneration(adapterGeneration);\n if (threadId === session.mainThreadId) {\n notifyRemoteId(result.remoteId, true);\n }\n return toInitializeResult(result);\n },\n [notifyRemoteId, requireAdapterGeneration, session, store],\n );\n\n const rename = useCallback(\n (threadIdOrRemoteId: string, newTitle: string) => {\n const currentAdapter = session.adapter;\n const adapterGeneration = session.adapterGeneration;\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"renaming it\");\n if (data.status === \"new\") {\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be renamed\");\n }\n return store.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n requireAdapterGeneration(adapterGeneration);\n return currentAdapter.rename(remoteId, newTitle);\n },\n optimistic: (state) => {\n const current = getThreadData(state, threadIdOrRemoteId);\n if (!current) return state;\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [current.id]: {\n ...current,\n title: newTitle,\n },\n },\n };\n },\n });\n },\n [requireAdapterGeneration, session, store],\n );\n\n const updateCustom = useCallback(\n (\n threadIdOrRemoteId: string,\n custom: Record<string, unknown> | undefined,\n ) => {\n const currentAdapter = session.adapter;\n const adapterGeneration = session.adapterGeneration;\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) {\n throw threadNotFoundError(\n threadIdOrRemoteId,\n \"updating its custom metadata\",\n );\n }\n if (data.status === \"new\") {\n throw threadStatusError(\n threadIdOrRemoteId,\n data.status,\n \"update custom metadata\",\n );\n }\n if (!currentAdapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n return store.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n requireAdapterGeneration(adapterGeneration);\n if (!currentAdapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n return currentAdapter.updateCustom(remoteId, custom);\n },\n optimistic: (state) => {\n const current = getThreadData(state, threadIdOrRemoteId);\n if (!current) return state;\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [current.id]: {\n ...current,\n custom,\n },\n },\n };\n },\n });\n },\n [requireAdapterGeneration, session, store],\n );\n\n const archive = useCallback(\n async (threadIdOrRemoteId: string) => {\n const currentAdapter = session.adapter;\n const adapterGeneration = session.adapterGeneration;\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"archiving it\");\n if (data.status !== \"regular\") {\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be archived\");\n }\n await ensureNotMain(data.id);\n requireAdapterGeneration(adapterGeneration);\n return store.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n requireAdapterGeneration(adapterGeneration);\n return currentAdapter.archive(remoteId);\n },\n optimistic: (state) => updateStatusReducer(state, data.id, \"archived\"),\n });\n },\n [ensureNotMain, requireAdapterGeneration, session, store],\n );\n\n const unarchive = useCallback(\n (threadIdOrRemoteId: string) => {\n const currentAdapter = session.adapter;\n const adapterGeneration = session.adapterGeneration;\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data)\n throw threadNotFoundError(threadIdOrRemoteId, \"unarchiving it\");\n if (data.status !== \"archived\") {\n throw threadStatusError(\n threadIdOrRemoteId,\n data.status,\n \"be unarchived\",\n );\n }\n return store.optimisticUpdate({\n execute: async () => {\n try {\n const { remoteId } = await data.initializeTask;\n requireAdapterGeneration(adapterGeneration);\n return await currentAdapter.unarchive(remoteId);\n } catch (error) {\n if (adapterGeneration === session.adapterGeneration) {\n await ensureNotMain(data.id);\n }\n throw error;\n }\n },\n optimistic: (state) => updateStatusReducer(state, data.id, \"regular\"),\n });\n },\n [ensureNotMain, requireAdapterGeneration, session, store],\n );\n\n const deleteThread = useCallback(\n async (threadIdOrRemoteId: string) => {\n const currentAdapter = session.adapter;\n const adapterGeneration = session.adapterGeneration;\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"deleting it\");\n if (data.status !== \"regular\" && data.status !== \"archived\") {\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be deleted\");\n }\n await ensureNotMain(data.id);\n requireAdapterGeneration(adapterGeneration);\n onDelete?.(data.id);\n return store.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n requireAdapterGeneration(adapterGeneration);\n return currentAdapter.delete(remoteId);\n },\n optimistic: (state) => updateStatusReducer(state, data.id, \"deleted\"),\n });\n },\n [ensureNotMain, onDelete, requireAdapterGeneration, session, store],\n );\n\n const generateTitle = useCallback(\n async (\n threadIdOrRemoteId: string,\n messages: readonly ThreadMessage[] | undefined,\n ) => {\n const currentAdapter = session.adapter;\n const adapterGeneration = session.adapterGeneration;\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) {\n throw threadNotFoundError(threadIdOrRemoteId, \"generating its title\");\n }\n if (data.status === \"new\") {\n throw threadStatusError(\n threadIdOrRemoteId,\n data.status,\n \"generate a title\",\n );\n }\n const { remoteId } = await data.initializeTask;\n requireAdapterGeneration(adapterGeneration);\n if (!isSameThread(store.value, data.id, session.mainThreadId)) return;\n if (!messages) return;\n const stream = await currentAdapter.generateTitle(remoteId, messages);\n requireAdapterGeneration(adapterGeneration);\n await applyTitleStream(stream, (newTitle) => {\n if (adapterGeneration !== session.adapterGeneration) return;\n const state = store.baseValue;\n const current = getThreadData(state, data.id);\n if (!current) return;\n store.update({\n ...state,\n threadData: {\n ...state.threadData,\n [current.id]: {\n ...current,\n title: newTitle,\n },\n },\n });\n });\n },\n [requireAdapterGeneration, session, store],\n );\n\n const { mainThreadClient, itemOrder, threadListItems } =\n useRemoteThreadListView({\n listState,\n mainThreadId,\n threadFactory,\n useAdapters: adapter.unstable_useAdapters,\n onSwitchTo: (id, options) => switchToThread(id, options),\n onRename: (id, title) => rename(id, title),\n onUpdateCustom: (id, custom) => updateCustom(id, custom),\n onArchive: (id) => archive(id),\n onUnarchive: (id) => unarchive(id),\n onDelete: (id) => deleteThread(id),\n onGenerateTitle: (id, messages) => generateTitle(id, messages),\n onInitialize: async (id) => toInitializeResult(await initialize(id)),\n onDetach: (id) => ensureNotMain(id),\n });\n\n const mainRemoteId = getThreadData(listState, mainThreadId)?.remoteId;\n useEffect(() => {\n if (session.lastNotifiedRemoteId === mainRemoteId) return;\n session.lastNotifiedRemoteId = mainRemoteId;\n onThreadIdChange?.(mainRemoteId);\n }, [mainRemoteId, onThreadIdChange, session]);\n\n useEffect(() => {\n if (session.isFirstThreadIdEffect) {\n session.isFirstThreadIdEffect = false;\n session.lastControlledThreadId = threadId;\n if (threadId === undefined) return;\n handleThreadListAction(\"switch\", () =>\n switchToThread(threadId, undefined, false),\n );\n return;\n }\n if (Object.is(session.lastControlledThreadId, threadId)) return;\n session.lastControlledThreadId = threadId;\n if (threadId === undefined) {\n handleThreadListAction(\"create\", () => switchToNewThread(false));\n return;\n }\n handleThreadListAction(\"switch\", () =>\n switchToThread(threadId, undefined, false),\n );\n }, [session, switchToNewThread, switchToThread, threadId]);\n\n const state = useMemo(\n () => ({\n mainThreadId,\n newThreadId: listState.newThreadId ?? null,\n isLoading: listState.isLoading,\n isLoadingMore: listState.isLoadingMore,\n hasMore: listState.cursor !== undefined,\n threadIds: listState.threadIds,\n archivedThreadIds: listState.archivedThreadIds,\n threadItems: threadListItems.state,\n main: mainThreadClient.state,\n }),\n [\n listState.archivedThreadIds,\n listState.cursor,\n listState.isLoading,\n listState.isLoadingMore,\n listState.newThreadId,\n listState.threadIds,\n mainThreadClient.state,\n mainThreadId,\n threadListItems.state,\n ],\n );\n\n return {\n getState: () => state,\n switchToThread: (id, options) => {\n handleThreadListAction(\"switch\", () => switchToThread(id, options));\n },\n switchToNewThread: () => {\n handleThreadListAction(\"create\", () => switchToNewThread());\n },\n getLoadThreadsPromise,\n reload,\n reloadMainThread: () => {\n if (getThreadData(store.value, mainThreadId)?.status === \"new\") {\n return RESOLVED_PROMISE;\n }\n return (\n mainThreadClient.methods.unstable_refetchThread?.() ?? RESOLVED_PROMISE\n );\n },\n loadMore,\n item: (selector) => {\n if (selector === \"main\") {\n const index = itemOrder.findIndex((item) =>\n itemMatchesId(item, listState, mainThreadId),\n );\n return threadListItems.get({ index });\n }\n if (\"id\" in selector) {\n const index = itemOrder.findIndex((item) =>\n itemMatchesId(item, listState, selector.id),\n );\n return threadListItems.get({ index });\n }\n const ids = selector.archived\n ? listState.archivedThreadIds\n : listState.threadIds;\n const id = ids[selector.index];\n if (id === undefined) {\n return threadListItems.get({ index: -1 });\n }\n const index = itemOrder.findIndex((item) =>\n itemMatchesId(item, listState, id),\n );\n return threadListItems.get({ index });\n },\n thread: () => mainThreadClient.methods,\n };\n};\n\n/**\n * `AuiConfig` `threads` entry backed by a `RemoteThreadListAdapter`. Thread\n * bodies are born from the `thread` factory inside the client tree, so any\n * `AssistantClient` host can run a remote or cloud list. Per-thread history\n * and attachments come from `unstable_useAdapters`. `useRemoteThreadListRuntime`\n * uses the same hook when `unstable_Provider` is omitted. Key the factory\n * with `withKey` so history reloads when the visible thread changes.\n */\nexport const RemoteThreadList = resource(useRemoteThreadList);\n\nattachTransformScopes(useRemoteThreadList, inMemoryThreadListTransformScopes);\n"],"mappings":"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"}
1
+ {"version":3,"file":"RemoteThreadList.js","names":["useCallback","useEffect","useMemo","useState","useSyncExternalStore","resource","withKey","ClientOutput","attachTransformScopes","useClientLookup","useClientResource","isDevelopment","useThreadSelectionEvents","OptimisticState","classifyThreads","createEmptyRemoteThreadState","createThreadMappingId","getThreadData","normalizeCursor","updateStatusReducer","RemoteThreadData","RemoteThreadState","preserveMidLoadTransitions","seedNewThread","statusSnapshot","RemoteThreadInitializeResponse","RemoteThreadListAdapter","ThreadListAdapterChangedError","ThreadMessage","AssistantMessageStream","handleThreadListAction","inMemoryThreadListTransformScopes","InMemoryThreadListProps","AdaptedRemoteThread","RESOLVED_PROMISE","Promise","resolve","EMPTY_LIST","RemoteThreadListProps","adapter","thread","threadId","onThreadIdChange","onSwitchToThread","onSwitchToNewThread","onDelete","threadNotFoundError","threadIdOrRemoteId","action","Error","threadStatusError","status","toInitializeResult","result","remoteId","externalId","applyTitleStream","stream","Parameters","fromAssistantStream","onTitle","title","messageStream","parts","filter","part","type","text","useThreadListItemClient","props","$","_c","data","isRunning","onSwitchTo","onRename","onUpdateCustom","onArchive","onUnarchive","onGenerateTitle","onInitialize","onDetach","t0","lastMessageAt","undefined","t1","custom","id","state","t2","t3","getState","switchTo","rename","updateCustom","archive","unarchive","delete","generateTitle","initialize","detach","ThreadListItemClient","collectItemOrder","listState","mainThreadId","ids","newThreadId","threadIds","archivedThreadIds","seenIds","Set","seenRemoteIds","items","has","add","push","itemMatchesId","item","isSameThread","left","right","useRemoteThreadListView","threadFactory","useAdapters","wrapped","key","mainThreadClient","itemOrder","t4","t5","options","messages","map","threadListItems","useRemoteThreadList","store","initialMainId","session","seeded","adapterAtLoad","adapterGeneration","loadGeneration","switchGeneration","loadPromise","loadMorePromise","lastNotifiedRemoteId","lastControlledThreadId","switchTask","isFirstThreadIdEffect","onStoreChange","subscribe","value","setMainThreadId","assignMainThreadId","notifyRemoteId","emit","getLoadThreadsPromise","generation","statusAtRequest","baseValue","optimisticUpdate","execute","list","loading","isLoading","then","page","fresh","threads","threadIdMap","threadData","merged","cursor","nextCursor","catch","error","console","update","reload","adapterChanged","reset","unstable_useAdapters","unstable_Provider","warn","loadMore","snapshot","currentAdapter","task","after","isLoadingMore","appended","startSwitch","run","settle","reject","switchToThread","emitThreadIdChange","remoteMetadata","fetch","mappingId","wasInTarget","includes","threadIdsWithoutRemote","archivedThreadIdsWithoutRemote","initializeTask","current","optimistic","switchToNewThread","waitForUpdate","existing","existingId","ensureNotMain","lastAwaitedTask","startedFallback","requireAdapterGeneration","newTitle","Record","deleteThread","mainRemoteId","Object","is","hasMore","threadItems","main","reloadMainThread","methods","unstable_refetchThread","selector","index","findIndex","get","archived","RemoteThreadList"],"sources":["../../../src/react/client/RemoteThreadList.ts"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport { resource, withKey } from \"@assistant-ui/tap\";\nimport type { ClientOutput } from \"@assistant-ui/store\";\nimport {\n attachTransformScopes,\n useClientLookup,\n useClientResource,\n} from \"@assistant-ui/store/client\";\nimport { isDevelopment, useThreadSelectionEvents } from \"../../store/internal\";\nimport { OptimisticState } from \"../../runtimes/remote-thread-list/optimistic-state\";\nimport {\n classifyThreads,\n createEmptyRemoteThreadState,\n createThreadMappingId,\n getThreadData,\n normalizeCursor,\n updateStatusReducer,\n type RemoteThreadData,\n type RemoteThreadState,\n preserveMidLoadTransitions,\n seedNewThread,\n statusSnapshot,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport type {\n RemoteThreadInitializeResponse,\n RemoteThreadListAdapter,\n} from \"../../runtimes/remote-thread-list/types\";\nimport { ThreadListAdapterChangedError } from \"../../runtimes/remote-thread-list/adapter-changed\";\nimport type { ThreadMessage } from \"../../types/message\";\nimport { AssistantMessageStream } from \"assistant-stream\";\nimport { handleThreadListAction } from \"../../store/runtime-clients/handle-thread-list-action\";\nimport {\n inMemoryThreadListTransformScopes,\n type InMemoryThreadListProps,\n} from \"./InMemoryThreadList\";\nimport { AdaptedRemoteThread } from \"./AdaptedRemoteThread\";\n\nconst RESOLVED_PROMISE = Promise.resolve();\n\nconst EMPTY_LIST = createEmptyRemoteThreadState();\n\nexport type RemoteThreadListProps = {\n /**\n * Swapping this to a different backing store does not reload the list. Call `reload()` after a genuine swap. A recreated object for the same store is a no-op. `reload()` after a different adapter instance resets selection and cached records before loading.\n */\n adapter: RemoteThreadListAdapter;\n /**\n * Factory for the visible thread. Per-thread history reload requires a\n * resource keyed by thread id (`withKey(id, thread(...))`). An unkeyed\n * factory keeps one instance across switches, so a mount-once history\n * loader will not fetch the next thread.\n */\n thread: InMemoryThreadListProps[\"thread\"];\n threadId?: string | undefined;\n onThreadIdChange?: ((threadId: string | undefined) => void) | undefined;\n onSwitchToThread?: ((threadId: string) => void) | undefined;\n onSwitchToNewThread?: (() => void) | undefined;\n onDelete?: ((threadId: string) => void) | undefined;\n};\n\nconst threadNotFoundError = (threadIdOrRemoteId: string, action: string) =>\n new Error(`Thread \"${threadIdOrRemoteId}\" was not found while ${action}.`);\n\nconst threadStatusError = (\n threadIdOrRemoteId: string,\n status: RemoteThreadData[\"status\"],\n action: string,\n) =>\n new Error(\n `Thread \"${threadIdOrRemoteId}\" has status \"${status}\", so it cannot ${action}.`,\n );\n\nconst toInitializeResult = (\n result: RemoteThreadInitializeResponse,\n): { remoteId: string; externalId: string | undefined } => ({\n remoteId: result.remoteId,\n externalId: result.externalId,\n});\n\nconst applyTitleStream = async (\n stream: Parameters<typeof AssistantMessageStream.fromAssistantStream>[0],\n onTitle: (title: string | undefined) => Promise<void>,\n) => {\n const messageStream = AssistantMessageStream.fromAssistantStream(stream);\n for await (const result of messageStream) {\n await onTitle(result.parts.filter((part) => part.type === \"text\")[0]?.text);\n }\n};\n\nconst useThreadListItemClient = (props: {\n data: RemoteThreadData;\n isRunning: boolean;\n onSwitchTo: (options?: { unarchive?: boolean }) => void;\n onRename: (title: string) => void;\n onUpdateCustom: (custom: Record<string, unknown> | undefined) => void;\n onArchive: () => void;\n onUnarchive: () => void;\n onDelete: () => void;\n onGenerateTitle: () => void;\n onInitialize: () => Promise<{\n remoteId: string;\n externalId: string | undefined;\n }>;\n onDetach: () => void;\n}): ClientOutput<\"threadListItem\"> => {\n const {\n data,\n isRunning,\n onSwitchTo,\n onRename,\n onUpdateCustom,\n onArchive,\n onUnarchive,\n onDelete,\n onGenerateTitle,\n onInitialize,\n onDetach,\n } = props;\n const state = useMemo(\n () => ({\n id: data.id,\n remoteId: data.remoteId,\n externalId: data.externalId,\n title: data.title,\n lastMessageAt: \"lastMessageAt\" in data ? data.lastMessageAt : undefined,\n status: data.status,\n custom: data.custom,\n isRunning,\n }),\n [data, isRunning],\n );\n\n return {\n getState: () => state,\n switchTo: onSwitchTo,\n rename: onRename,\n updateCustom: onUpdateCustom,\n archive: onArchive,\n unarchive: onUnarchive,\n delete: onDelete,\n generateTitle: onGenerateTitle,\n initialize: onInitialize,\n detach: onDetach,\n };\n};\n\nconst ThreadListItemClient = resource(useThreadListItemClient);\n\nconst collectItemOrder = (\n listState: RemoteThreadState,\n mainThreadId: string,\n): RemoteThreadData[] => {\n const ids = [\n listState.newThreadId,\n ...listState.threadIds,\n ...listState.archivedThreadIds,\n mainThreadId,\n ].filter((id): id is string => id !== undefined);\n const seenIds = new Set<string>();\n const seenRemoteIds = new Set<string>();\n const items: RemoteThreadData[] = [];\n for (const id of ids) {\n const data = getThreadData(listState, id);\n if (!data || seenIds.has(data.id)) continue;\n if (data.remoteId !== undefined && seenRemoteIds.has(data.remoteId)) {\n continue;\n }\n seenIds.add(data.id);\n if (data.remoteId !== undefined) seenRemoteIds.add(data.remoteId);\n items.push(data);\n }\n return items;\n};\n\nconst itemMatchesId = (\n item: RemoteThreadData,\n listState: RemoteThreadState,\n id: string,\n) => {\n const data = getThreadData(listState, id);\n return (\n item.id === id ||\n item.id === data?.id ||\n (data?.remoteId !== undefined &&\n (item.id === data.remoteId || item.remoteId === data.remoteId))\n );\n};\n\nconst isSameThread = (\n listState: RemoteThreadState,\n left: string,\n right: string,\n) => {\n if (left === right) return true;\n const data = getThreadData(listState, left);\n return data !== undefined && itemMatchesId(data, listState, right);\n};\n\nconst useRemoteThreadListView = ({\n listState,\n mainThreadId,\n threadFactory,\n useAdapters,\n onSwitchTo,\n onRename,\n onUpdateCustom,\n onArchive,\n onUnarchive,\n onDelete,\n onGenerateTitle,\n onInitialize,\n onDetach,\n}: {\n listState: RemoteThreadState;\n mainThreadId: string;\n threadFactory: RemoteThreadListProps[\"thread\"];\n useAdapters: RemoteThreadListAdapter[\"unstable_useAdapters\"];\n onSwitchTo: (\n threadId: string,\n options?: { unarchive?: boolean },\n ) => Promise<void>;\n onRename: (threadId: string, title: string) => Promise<void>;\n onUpdateCustom: (\n threadId: string,\n custom: Record<string, unknown> | undefined,\n ) => Promise<void>;\n onArchive: (threadId: string) => Promise<void>;\n onUnarchive: (threadId: string) => Promise<void>;\n onDelete: (threadId: string) => Promise<void>;\n onGenerateTitle: (\n threadId: string,\n messages: readonly ThreadMessage[] | undefined,\n ) => Promise<void>;\n onInitialize: (threadId: string) => Promise<{\n remoteId: string;\n externalId: string | undefined;\n }>;\n onDetach: (threadId: string) => Promise<void>;\n}) => {\n const thread = threadFactory(mainThreadId);\n const wrapped =\n useAdapters === undefined\n ? thread\n : AdaptedRemoteThread({\n useAdapters,\n thread,\n });\n const mainThreadClient = useClientResource(\n thread.key === undefined ? wrapped : withKey(thread.key, wrapped),\n );\n const itemOrder = useMemo(\n () => collectItemOrder(listState, mainThreadId),\n [listState, mainThreadId],\n );\n const threadListItems = useClientLookup(\n itemOrder.map((data) =>\n withKey(\n data.id,\n ThreadListItemClient({\n data,\n isRunning:\n itemMatchesId(data, listState, mainThreadId) &&\n mainThreadClient.state.isRunning,\n onSwitchTo: (options) =>\n handleThreadListAction(\"switch\", () =>\n onSwitchTo(data.id, options),\n ),\n onRename: (title) =>\n handleThreadListAction(\"rename\", () => onRename(data.id, title)),\n onUpdateCustom: (custom) =>\n handleThreadListAction(\"update custom metadata\", () =>\n onUpdateCustom(data.id, custom),\n ),\n onArchive: () =>\n handleThreadListAction(\"archive\", () => onArchive(data.id)),\n onUnarchive: () =>\n handleThreadListAction(\"unarchive\", () => onUnarchive(data.id)),\n onDelete: () =>\n handleThreadListAction(\"delete\", () => onDelete(data.id)),\n onGenerateTitle: () =>\n handleThreadListAction(\"generate title\", () =>\n onGenerateTitle(\n data.id,\n mainThreadClient.state.messages as\n | readonly ThreadMessage[]\n | undefined,\n ),\n ),\n onInitialize: () => onInitialize(data.id),\n onDetach: () =>\n handleThreadListAction(\"detach\", () => onDetach(data.id)),\n }),\n ),\n ),\n );\n return { mainThreadClient, itemOrder, threadListItems };\n};\n\nconst useRemoteThreadList = (\n props: RemoteThreadListProps,\n): ClientOutput<\"threads\"> => {\n const {\n adapter,\n thread: threadFactory,\n threadId,\n onThreadIdChange,\n onSwitchToThread,\n onSwitchToNewThread,\n onDelete,\n } = props;\n\n const [{ store, initialMainId, session }] = useState(() => {\n const seeded = seedNewThread(EMPTY_LIST);\n return {\n store: new OptimisticState(seeded.state),\n initialMainId: seeded.id,\n session: {\n adapter,\n adapterAtLoad: adapter,\n adapterGeneration: 0,\n loadGeneration: 0,\n switchGeneration: 0,\n loadPromise: undefined as Promise<void> | undefined,\n loadMorePromise: undefined as Promise<void> | undefined,\n lastNotifiedRemoteId: undefined as string | undefined,\n lastControlledThreadId: undefined as string | undefined,\n switchTask: undefined as Promise<void> | undefined,\n mainThreadId: seeded.id,\n isFirstThreadIdEffect: true,\n onThreadIdChange,\n onSwitchToThread,\n onSwitchToNewThread,\n },\n };\n });\n\n // Config updates can invoke `reload()` in the same turn as the re-render, before the effect below runs.\n session.adapter = adapter;\n\n const listState = useSyncExternalStore(\n (onStoreChange) => store.subscribe(onStoreChange),\n () => store.value,\n () => store.value,\n );\n\n const [mainThreadId, setMainThreadId] = useState(initialMainId);\n const assignMainThreadId = useCallback(\n (id: string) => {\n session.mainThreadId = id;\n setMainThreadId(id);\n },\n [session],\n );\n useThreadSelectionEvents(mainThreadId);\n useEffect(() => {\n session.adapter = adapter;\n session.mainThreadId = mainThreadId;\n session.onThreadIdChange = onThreadIdChange;\n session.onSwitchToThread = onSwitchToThread;\n session.onSwitchToNewThread = onSwitchToNewThread;\n }, [\n adapter,\n mainThreadId,\n onSwitchToNewThread,\n onSwitchToThread,\n onThreadIdChange,\n session,\n ]);\n\n const notifyRemoteId = useCallback(\n (remoteId: string | undefined, emit: boolean) => {\n if (session.lastNotifiedRemoteId === remoteId) return;\n session.lastNotifiedRemoteId = remoteId;\n if (emit) session.onThreadIdChange?.(remoteId);\n },\n [session],\n );\n\n const getLoadThreadsPromise = useCallback(() => {\n if (session.loadPromise) return session.loadPromise;\n const generation = session.loadGeneration;\n const adapter = session.adapter;\n const statusAtRequest = statusSnapshot(store.baseValue);\n session.loadPromise = store\n .optimisticUpdate({\n execute: () => adapter.list(),\n loading: (state) => ({ ...state, isLoading: true }),\n then: (state, page) => {\n if (generation !== session.loadGeneration) return state;\n session.adapterAtLoad = adapter;\n const fresh = classifyThreads(page.threads, {\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n const merged = {\n ...state,\n isLoading: false,\n cursor: normalizeCursor(page.nextCursor),\n threadIds: fresh.threadIds,\n archivedThreadIds: fresh.archivedThreadIds,\n threadIdMap: {\n ...state.threadIdMap,\n ...fresh.threadIdMap,\n },\n threadData: {\n ...state.threadData,\n ...fresh.threadData,\n },\n };\n return preserveMidLoadTransitions(merged, state, statusAtRequest);\n },\n })\n .catch((error: unknown) => {\n if (generation !== session.loadGeneration) return;\n console.error(\"[assistant-ui] thread list load failed:\", error);\n session.loadPromise = undefined;\n store.update({\n ...store.baseValue,\n isLoading: false,\n });\n })\n .then(() => {});\n return session.loadPromise;\n }, [session, store]);\n\n const reload = useCallback(() => {\n const adapterChanged = adapter !== session.adapterAtLoad;\n session.loadGeneration++;\n session.loadPromise = undefined;\n session.loadMorePromise = undefined;\n if (adapterChanged) {\n session.adapterGeneration++;\n session.switchGeneration++;\n session.switchTask = undefined;\n session.adapterAtLoad = adapter;\n const seeded = seedNewThread(EMPTY_LIST);\n store.reset({ ...seeded.state, isLoading: true });\n assignMainThreadId(seeded.id);\n notifyRemoteId(undefined, true);\n } else {\n store.update({\n ...store.baseValue,\n cursor: undefined,\n });\n }\n return getLoadThreadsPromise();\n }, [\n adapter,\n assignMainThreadId,\n getLoadThreadsPromise,\n notifyRemoteId,\n session,\n store,\n ]);\n\n useEffect(() => {\n void getLoadThreadsPromise();\n }, [getLoadThreadsPromise]);\n\n useEffect(() => {\n if (!isDevelopment) return;\n if (adapter.unstable_useAdapters !== undefined) return;\n if (adapter.unstable_Provider === undefined) return;\n console.warn(\n \"[assistant-ui] RemoteThreadList ignores RemoteThreadListAdapter.unstable_Provider. Expose unstable_useAdapters so per-thread history loads on this entry. useRemoteThreadListRuntime still honors unstable_Provider.\",\n );\n }, [adapter]);\n\n const loadMore = useCallback(() => {\n if (session.loadMorePromise) return session.loadMorePromise;\n const snapshot = store.value;\n if (snapshot.cursor === undefined || snapshot.isLoading) {\n return RESOLVED_PROMISE;\n }\n const generation = session.loadGeneration;\n const cursor = snapshot.cursor;\n const currentAdapter = session.adapter;\n const task = store\n .optimisticUpdate({\n execute: () => currentAdapter.list({ after: cursor }),\n loading: (state) => ({ ...state, isLoadingMore: true }),\n then: (state, page) => {\n if (generation !== session.loadGeneration) return state;\n const appended = classifyThreads(page.threads, {\n threadIds: [...state.threadIds],\n archivedThreadIds: [...state.archivedThreadIds],\n threadIdMap: { ...state.threadIdMap },\n threadData: { ...state.threadData },\n });\n return {\n ...state,\n isLoadingMore: false,\n cursor: normalizeCursor(page.nextCursor),\n threadIds: appended.threadIds,\n archivedThreadIds: appended.archivedThreadIds,\n threadIdMap: appended.threadIdMap,\n threadData: appended.threadData,\n };\n },\n })\n .catch((error: unknown) => {\n if (generation !== session.loadGeneration) return;\n console.error(\"[assistant-ui] thread list loadMore failed:\", error);\n })\n .then(() => {\n if (session.loadMorePromise === task) {\n session.loadMorePromise = undefined;\n }\n });\n session.loadMorePromise = task;\n return task;\n }, [session, store]);\n\n const startSwitch = useCallback(\n (run: (generation: number) => Promise<void>) => {\n const generation = ++session.switchGeneration;\n let settle!: (error?: unknown) => void;\n const task = new Promise<void>((resolve, reject) => {\n settle = (error) => {\n if (error === undefined) resolve();\n else reject(error);\n };\n });\n session.switchTask = task;\n void run(generation).then(\n () => settle(),\n (error: unknown) => settle(error),\n );\n return task;\n },\n [session],\n );\n\n const switchToThread = useCallback(\n (\n threadIdOrRemoteId: string,\n options?: { unarchive?: boolean },\n emitThreadIdChange = true,\n ) =>\n startSwitch(async (generation) => {\n let data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) {\n const remoteMetadata =\n await session.adapter.fetch(threadIdOrRemoteId);\n if (generation !== session.switchGeneration) return;\n const state = store.value;\n const mappingId = createThreadMappingId(remoteMetadata.remoteId);\n const wasInTarget =\n remoteMetadata.status === \"regular\"\n ? state.threadIds.includes(remoteMetadata.remoteId)\n : state.archivedThreadIds.includes(remoteMetadata.remoteId);\n const threadIdsWithoutRemote = state.threadIds.filter(\n (id) => id !== remoteMetadata.remoteId,\n );\n const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter(\n (id) => id !== remoteMetadata.remoteId,\n );\n store.update({\n ...state,\n threadIds:\n remoteMetadata.status === \"regular\"\n ? wasInTarget\n ? state.threadIds\n : [...threadIdsWithoutRemote, remoteMetadata.remoteId]\n : threadIdsWithoutRemote,\n archivedThreadIds:\n remoteMetadata.status === \"archived\"\n ? wasInTarget\n ? state.archivedThreadIds\n : [...archivedThreadIdsWithoutRemote, remoteMetadata.remoteId]\n : archivedThreadIdsWithoutRemote,\n threadIdMap: {\n ...state.threadIdMap,\n [remoteMetadata.remoteId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n id: mappingId,\n initializeTask: Promise.resolve({\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n }),\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n status: remoteMetadata.status,\n title: remoteMetadata.title,\n lastMessageAt: remoteMetadata.lastMessageAt,\n custom: remoteMetadata.custom,\n },\n },\n });\n data = getThreadData(store.value, threadIdOrRemoteId);\n }\n if (!data) {\n throw threadNotFoundError(threadIdOrRemoteId, \"switching to it\");\n }\n if (isSameThread(store.value, data.id, session.mainThreadId)) return;\n if (data.status === \"archived\" && options?.unarchive !== false) {\n const current = data;\n const { remoteId } = await current.initializeTask;\n if (generation !== session.switchGeneration) return;\n await store.optimisticUpdate({\n execute: () => session.adapter.unarchive(remoteId),\n optimistic: (state) =>\n updateStatusReducer(state, current.id, \"regular\"),\n });\n if (generation !== session.switchGeneration) return;\n data = getThreadData(store.value, current.id) ?? current;\n }\n if (generation !== session.switchGeneration) return;\n assignMainThreadId(data.id);\n notifyRemoteId(data.remoteId, emitThreadIdChange);\n session.onSwitchToThread?.(data.id);\n }),\n [assignMainThreadId, notifyRemoteId, session, startSwitch, store],\n );\n\n const switchToNewThread = useCallback(\n (emitThreadIdChange = true) =>\n startSwitch(async (generation) => {\n while (\n store.baseValue.newThreadId !== undefined &&\n store.value.newThreadId === undefined\n ) {\n await store.waitForUpdate();\n if (generation !== session.switchGeneration) return;\n }\n const existing = store.value.newThreadId;\n if (existing !== undefined) {\n const existingId =\n getThreadData(store.value, existing)?.id ?? existing;\n if (isSameThread(store.value, existingId, session.mainThreadId)) {\n return;\n }\n assignMainThreadId(existingId);\n notifyRemoteId(undefined, emitThreadIdChange);\n session.onSwitchToNewThread?.();\n return;\n }\n const seeded = seedNewThread(store.baseValue);\n store.update(seeded.state);\n if (generation !== session.switchGeneration) return;\n assignMainThreadId(seeded.id);\n notifyRemoteId(undefined, emitThreadIdChange);\n session.onSwitchToNewThread?.();\n }),\n [assignMainThreadId, notifyRemoteId, session, startSwitch, store],\n );\n\n const ensureNotMain = useCallback(\n async (threadId: string) => {\n if (threadId === store.value.newThreadId) {\n throw new Error(\"Cannot ensure new thread is not main\");\n }\n let lastAwaitedTask: Promise<void> | undefined;\n while (isSameThread(store.value, threadId, session.mainThreadId)) {\n let switchTask = session.switchTask;\n const startedFallback = !switchTask || switchTask === lastAwaitedTask;\n if (startedFallback) {\n switchTask = switchToNewThread();\n }\n lastAwaitedTask = switchTask;\n try {\n await switchTask;\n } catch (error) {\n if (startedFallback && session.switchTask === switchTask) {\n throw error;\n }\n }\n }\n },\n [session, store, switchToNewThread],\n );\n\n const requireAdapterGeneration = useCallback(\n (generation: number) => {\n if (generation !== session.adapterGeneration) {\n throw new ThreadListAdapterChangedError();\n }\n },\n [session],\n );\n\n const initialize = useCallback(\n async (threadId: string) => {\n const currentAdapter = session.adapter;\n const adapterGeneration = session.adapterGeneration;\n if (store.value.newThreadId !== threadId) {\n const data = getThreadData(store.value, threadId);\n if (!data) throw threadNotFoundError(threadId, \"initializing it\");\n if (data.status === \"new\") {\n throw threadStatusError(threadId, data.status, \"be initialized here\");\n }\n const result = toInitializeResult(await data.initializeTask);\n requireAdapterGeneration(adapterGeneration);\n return result;\n }\n const result = await store.optimisticUpdate({\n execute: () => {\n requireAdapterGeneration(adapterGeneration);\n return currentAdapter.initialize(threadId);\n },\n optimistic: (state) => updateStatusReducer(state, threadId, \"regular\"),\n loading: (state, task) => {\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...state.threadData[mappingId],\n initializeTask: task,\n },\n },\n };\n },\n then: (state, { remoteId, externalId }) => {\n if (adapterGeneration !== session.adapterGeneration) return state;\n const data = getThreadData(state, threadId);\n if (!data) return state;\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadIdMap: {\n ...state.threadIdMap,\n [remoteId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...data,\n initializeTask: Promise.resolve({ remoteId, externalId }),\n remoteId,\n externalId,\n },\n },\n };\n },\n });\n requireAdapterGeneration(adapterGeneration);\n if (threadId === session.mainThreadId) {\n notifyRemoteId(result.remoteId, true);\n }\n return toInitializeResult(result);\n },\n [notifyRemoteId, requireAdapterGeneration, session, store],\n );\n\n const rename = useCallback(\n (threadIdOrRemoteId: string, newTitle: string) => {\n const currentAdapter = session.adapter;\n const adapterGeneration = session.adapterGeneration;\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"renaming it\");\n if (data.status === \"new\") {\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be renamed\");\n }\n return store.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n requireAdapterGeneration(adapterGeneration);\n return currentAdapter.rename(remoteId, newTitle);\n },\n optimistic: (state) => {\n const current = getThreadData(state, threadIdOrRemoteId);\n if (!current) return state;\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [current.id]: {\n ...current,\n title: newTitle,\n },\n },\n };\n },\n });\n },\n [requireAdapterGeneration, session, store],\n );\n\n const updateCustom = useCallback(\n (\n threadIdOrRemoteId: string,\n custom: Record<string, unknown> | undefined,\n ) => {\n const currentAdapter = session.adapter;\n const adapterGeneration = session.adapterGeneration;\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) {\n throw threadNotFoundError(\n threadIdOrRemoteId,\n \"updating its custom metadata\",\n );\n }\n if (data.status === \"new\") {\n throw threadStatusError(\n threadIdOrRemoteId,\n data.status,\n \"update custom metadata\",\n );\n }\n if (!currentAdapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n return store.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n requireAdapterGeneration(adapterGeneration);\n if (!currentAdapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n return currentAdapter.updateCustom(remoteId, custom);\n },\n optimistic: (state) => {\n const current = getThreadData(state, threadIdOrRemoteId);\n if (!current) return state;\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [current.id]: {\n ...current,\n custom,\n },\n },\n };\n },\n });\n },\n [requireAdapterGeneration, session, store],\n );\n\n const archive = useCallback(\n async (threadIdOrRemoteId: string) => {\n const currentAdapter = session.adapter;\n const adapterGeneration = session.adapterGeneration;\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"archiving it\");\n if (data.status !== \"regular\") {\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be archived\");\n }\n await ensureNotMain(data.id);\n requireAdapterGeneration(adapterGeneration);\n return store.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n requireAdapterGeneration(adapterGeneration);\n return currentAdapter.archive(remoteId);\n },\n optimistic: (state) => updateStatusReducer(state, data.id, \"archived\"),\n });\n },\n [ensureNotMain, requireAdapterGeneration, session, store],\n );\n\n const unarchive = useCallback(\n (threadIdOrRemoteId: string) => {\n const currentAdapter = session.adapter;\n const adapterGeneration = session.adapterGeneration;\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data)\n throw threadNotFoundError(threadIdOrRemoteId, \"unarchiving it\");\n if (data.status !== \"archived\") {\n throw threadStatusError(\n threadIdOrRemoteId,\n data.status,\n \"be unarchived\",\n );\n }\n return store.optimisticUpdate({\n execute: async () => {\n try {\n const { remoteId } = await data.initializeTask;\n requireAdapterGeneration(adapterGeneration);\n return await currentAdapter.unarchive(remoteId);\n } catch (error) {\n if (adapterGeneration === session.adapterGeneration) {\n await ensureNotMain(data.id);\n }\n throw error;\n }\n },\n optimistic: (state) => updateStatusReducer(state, data.id, \"regular\"),\n });\n },\n [ensureNotMain, requireAdapterGeneration, session, store],\n );\n\n const deleteThread = useCallback(\n async (threadIdOrRemoteId: string) => {\n const currentAdapter = session.adapter;\n const adapterGeneration = session.adapterGeneration;\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"deleting it\");\n if (data.status !== \"regular\" && data.status !== \"archived\") {\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be deleted\");\n }\n await ensureNotMain(data.id);\n requireAdapterGeneration(adapterGeneration);\n onDelete?.(data.id);\n return store.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n requireAdapterGeneration(adapterGeneration);\n return currentAdapter.delete(remoteId);\n },\n optimistic: (state) => updateStatusReducer(state, data.id, \"deleted\"),\n });\n },\n [ensureNotMain, onDelete, requireAdapterGeneration, session, store],\n );\n\n const generateTitle = useCallback(\n async (\n threadIdOrRemoteId: string,\n messages: readonly ThreadMessage[] | undefined,\n ) => {\n const currentAdapter = session.adapter;\n const adapterGeneration = session.adapterGeneration;\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) {\n throw threadNotFoundError(threadIdOrRemoteId, \"generating its title\");\n }\n if (data.status === \"new\") {\n throw threadStatusError(\n threadIdOrRemoteId,\n data.status,\n \"generate a title\",\n );\n }\n const { remoteId } = await data.initializeTask;\n requireAdapterGeneration(adapterGeneration);\n if (!isSameThread(store.value, data.id, session.mainThreadId)) return;\n if (!messages) return;\n const stream = await currentAdapter.generateTitle(remoteId, messages);\n requireAdapterGeneration(adapterGeneration);\n await applyTitleStream(stream, async (newTitle) => {\n await store.optimisticUpdate({\n execute: async () => {},\n optimistic: (state) => {\n if (adapterGeneration !== session.adapterGeneration) return state;\n const current = getThreadData(state, data.id);\n if (!current) return state;\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [current.id]: {\n ...current,\n title: newTitle,\n },\n },\n };\n },\n });\n });\n },\n [requireAdapterGeneration, session, store],\n );\n\n const { mainThreadClient, itemOrder, threadListItems } =\n useRemoteThreadListView({\n listState,\n mainThreadId,\n threadFactory,\n useAdapters: adapter.unstable_useAdapters,\n onSwitchTo: (id, options) => switchToThread(id, options),\n onRename: (id, title) => rename(id, title),\n onUpdateCustom: (id, custom) => updateCustom(id, custom),\n onArchive: (id) => archive(id),\n onUnarchive: (id) => unarchive(id),\n onDelete: (id) => deleteThread(id),\n onGenerateTitle: (id, messages) => generateTitle(id, messages),\n onInitialize: async (id) => toInitializeResult(await initialize(id)),\n onDetach: (id) => ensureNotMain(id),\n });\n\n const mainRemoteId = getThreadData(listState, mainThreadId)?.remoteId;\n useEffect(() => {\n if (session.lastNotifiedRemoteId === mainRemoteId) return;\n session.lastNotifiedRemoteId = mainRemoteId;\n onThreadIdChange?.(mainRemoteId);\n }, [mainRemoteId, onThreadIdChange, session]);\n\n useEffect(() => {\n if (session.isFirstThreadIdEffect) {\n session.isFirstThreadIdEffect = false;\n session.lastControlledThreadId = threadId;\n if (threadId === undefined) return;\n handleThreadListAction(\"switch\", () =>\n switchToThread(threadId, undefined, false),\n );\n return;\n }\n if (Object.is(session.lastControlledThreadId, threadId)) return;\n session.lastControlledThreadId = threadId;\n if (threadId === undefined) {\n handleThreadListAction(\"create\", () => switchToNewThread(false));\n return;\n }\n handleThreadListAction(\"switch\", () =>\n switchToThread(threadId, undefined, false),\n );\n }, [session, switchToNewThread, switchToThread, threadId]);\n\n const state = useMemo(\n () => ({\n mainThreadId,\n newThreadId: listState.newThreadId ?? null,\n isLoading: listState.isLoading,\n isLoadingMore: listState.isLoadingMore,\n hasMore: listState.cursor !== undefined,\n threadIds: listState.threadIds,\n archivedThreadIds: listState.archivedThreadIds,\n threadItems: threadListItems.state,\n main: mainThreadClient.state,\n }),\n [\n listState.archivedThreadIds,\n listState.cursor,\n listState.isLoading,\n listState.isLoadingMore,\n listState.newThreadId,\n listState.threadIds,\n mainThreadClient.state,\n mainThreadId,\n threadListItems.state,\n ],\n );\n\n return {\n getState: () => state,\n switchToThread: (id, options) => {\n handleThreadListAction(\"switch\", () => switchToThread(id, options));\n },\n switchToNewThread: () => {\n handleThreadListAction(\"create\", () => switchToNewThread());\n },\n getLoadThreadsPromise,\n reload,\n reloadMainThread: () => {\n if (getThreadData(store.value, mainThreadId)?.status === \"new\") {\n return RESOLVED_PROMISE;\n }\n return (\n mainThreadClient.methods.unstable_refetchThread?.() ?? RESOLVED_PROMISE\n );\n },\n loadMore,\n item: (selector) => {\n if (selector === \"main\") {\n const index = itemOrder.findIndex((item) =>\n itemMatchesId(item, listState, mainThreadId),\n );\n return threadListItems.get({ index });\n }\n if (\"id\" in selector) {\n const index = itemOrder.findIndex((item) =>\n itemMatchesId(item, listState, selector.id),\n );\n return threadListItems.get({ index });\n }\n const ids = selector.archived\n ? listState.archivedThreadIds\n : listState.threadIds;\n const id = ids[selector.index];\n if (id === undefined) {\n return threadListItems.get({ index: -1 });\n }\n const index = itemOrder.findIndex((item) =>\n itemMatchesId(item, listState, id),\n );\n return threadListItems.get({ index });\n },\n thread: () => mainThreadClient.methods,\n };\n};\n\n/**\n * `AuiConfig` `threads` entry backed by a `RemoteThreadListAdapter`. Thread\n * bodies are born from the `thread` factory inside the client tree, so any\n * `AssistantClient` host can run a remote or cloud list. Per-thread history\n * and attachments come from `unstable_useAdapters`. `useRemoteThreadListRuntime`\n * uses the same hook when `unstable_Provider` is omitted. Key the factory\n * with `withKey` so history reloads when the visible thread changes.\n */\nexport const RemoteThreadList = resource(useRemoteThreadList);\n\nattachTransformScopes(useRemoteThreadList, inMemoryThreadListTransformScopes);\n"],"mappings":";;;;;;;;;;;;;;AA2CA,MAAMkC,mBAAmBC,QAAQC,QAAQ;AAEzC,MAAMC,aAAatB,6BAA6B;AAqBhD,MAAM+B,uBAAuBC,oBAA4BC,2BACvD,IAAIC,MAAM,WAAWF,mBAAkB,wBAAyBC,OAAM,EAAG;AAE3E,MAAME,qBACJH,oBACAI,QACAH,2BAEA,IAAIC,MACF,WAAWF,mBAAkB,gBAAiBI,OAAM,kBAAmBH,OAAM,EAC/E;AAEF,MAAMI,sBACJC,YAC0D;CAC1DC,UAAUD,OAAOC;CACjBC,YAAYF,OAAOE;AACrB;AAEA,MAAMC,mBAAmB,OACvBC,QACAG,YACG;CACH,MAAME,gBAAgBjC,uBAAuB8B,oBAAoBF,MAAM;CACvE,WAAW,MAAMJ,UAAUS,eACzB,MAAMF,QAAQP,OAAOU,MAAMC,QAAQC,SAASA,KAAKC,SAAS,MAAM,CAAC,CAAC,EAAE,EAAEC,IAAI;AAE9E;AAEA,MAAMC,2BAA0BC,UAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAgB9B,MAAA,EAAAC,MAAAC,WAAAC,YAAAC,UAAAC,gBAAAC,WAAAC,aAAAjC,UAAAkC,iBAAAC,cAAAC,aAYIZ;CAOe,MAAAa,KAAA,mBAAmBV,OAAOA,KAAIW,gBAA9BC,KAAAA;CAAwD,IAAAC;CAAA,IAAAf,EAAA,OAAAE,KAAAc,UAAAhB,EAAA,OAAAE,KAAAjB,cAAAe,EAAA,OAAAE,KAAAe,MAAAjB,EAAA,OAAAE,KAAAlB,YAAAgB,EAAA,OAAAE,KAAArB,UAAAmB,EAAA,OAAAE,KAAAX,SAAAS,EAAA,OAAAG,aAAAH,EAAA,OAAAY,IAAA;EALlEG,KAAA;GAAAE,IACDf,KAAIe;GAAGjC,UACDkB,KAAIlB;GAASC,YACXiB,KAAIjB;GAAWM,OACpBW,KAAIX;GAAMsB,eACFD;GAAwD/B,QAC/DqB,KAAIrB;GAAOmC,QACXd,KAAIc;GAAOb;EAErB;EAACH,EAAA,KAAAE,KAAAc;EAAAhB,EAAA,KAAAE,KAAAjB;EAAAe,EAAA,KAAAE,KAAAe;EAAAjB,EAAA,KAAAE,KAAAlB;EAAAgB,EAAA,KAAAE,KAAArB;EAAAmB,EAAA,KAAAE,KAAAX;EAAAS,EAAA,KAAAG;EAAAH,EAAA,KAAAY;EAAAZ,EAAA,KAAAe;CAAA,OAAAA,KAAAf,EAAA;CAVH,MAAAkB,QACSH;CAWP,IAAAI;CAAA,IAAAnB,EAAA,OAAAkB,OAAA;EAGUC,WAAMD;EAAKlB,EAAA,KAAAkB;EAAAlB,EAAA,MAAAmB;CAAA,OAAAA,KAAAnB,EAAA;CAAA,IAAAoB;CAAA,IAAApB,EAAA,QAAAO,aAAAP,EAAA,QAAAzB,YAAAyB,EAAA,QAAAW,YAAAX,EAAA,QAAAS,mBAAAT,EAAA,QAAAU,gBAAAV,EAAA,QAAAK,YAAAL,EAAA,QAAAI,cAAAJ,EAAA,QAAAQ,eAAAR,EAAA,QAAAM,kBAAAN,EAAA,QAAAmB,IAAA;EADhBC,KAAA;GAAAC,UACKF;GAAWG,UACXlB;GAAUmB,QACZlB;GAAQmB,cACFlB;GAAcmB,SACnBlB;GAASmB,WACPlB;GAAWmB,QACdpD;GAAQqD,eACDnB;GAAeoB,YAClBnB;GAAYoB,QAChBnB;EACV;EAACX,EAAA,MAAAO;EAAAP,EAAA,MAAAzB;EAAAyB,EAAA,MAAAW;EAAAX,EAAA,MAAAS;EAAAT,EAAA,MAAAU;EAAAV,EAAA,MAAAK;EAAAL,EAAA,MAAAI;EAAAJ,EAAA,MAAAQ;EAAAR,EAAA,MAAAM;EAAAN,EAAA,MAAAmB;EAAAnB,EAAA,MAAAoB;CAAA,OAAAA,KAAApB,EAAA;CAAA,OAXMoB;AAWN;AAGH,MAAMW,uBAAuBhG,SAAS+D,uBAAuB;AAE7D,MAAMkC,oBACJC,WACAC,iBACuB;CACvB,MAAMC,MAAM;EACVF,UAAUG;EACV,GAAGH,UAAUI;EACb,GAAGJ,UAAUK;EACbJ;CAAY,CACb,CAACxC,QAAQuB,OAAqBA,OAAOH,KAAAA,CAAS;CAC/C,MAAMyB,0BAAU,IAAIC,IAAY;CAChC,MAAMC,gCAAgB,IAAID,IAAY;CACtC,MAAME,QAA4B,CAAA;CAClC,KAAK,MAAMzB,MAAMkB,KAAK;EACpB,MAAMjC,OAAOvD,cAAcsF,WAAWhB,EAAE;EACxC,IAAI,CAACf,QAAQqC,QAAQI,IAAIzC,KAAKe,EAAE,GAAG;EACnC,IAAIf,KAAKlB,aAAa8B,KAAAA,KAAa2B,cAAcE,IAAIzC,KAAKlB,QAAQ,GAChE;EAEFuD,QAAQK,IAAI1C,KAAKe,EAAE;EACnB,IAAIf,KAAKlB,aAAa8B,KAAAA,GAAW2B,cAAcG,IAAI1C,KAAKlB,QAAQ;EAChE0D,MAAMG,KAAK3C,IAAI;CACjB;CACA,OAAOwC;AACT;AAEA,MAAMI,iBACJC,MACAd,WACAhB,OACG;CACH,MAAMf,OAAOvD,cAAcsF,WAAWhB,EAAE;CACxC,OACE8B,KAAK9B,OAAOA,MACZ8B,KAAK9B,OAAOf,MAAMe,MACjBf,MAAMlB,aAAa8B,KAAAA,MACjBiC,KAAK9B,OAAOf,KAAKlB,YAAY+D,KAAK/D,aAAakB,KAAKlB;AAE3D;AAEA,MAAMgE,gBACJf,WACAgB,MACAC,UACG;CACH,IAAID,SAASC,OAAO,OAAO;CAC3B,MAAMhD,OAAOvD,cAAcsF,WAAWgB,IAAI;CAC1C,OAAO/C,SAASY,KAAAA,KAAagC,cAAc5C,MAAM+B,WAAWiB,KAAK;AACnE;AAEA,MAAMC,2BAA0BvC,OAAA;CAAA,MAAAZ,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAgC,WAAAC,cAAAkB,eAAAC,aAAAjD,YAAAC,UAAAC,gBAAAC,WAAAC,aAAAjC,UAAAkC,iBAAAC,cAAAC,aAAAC;CAwChC,IAAAG;CAAA,IAAAI;CAAA,IAAAnB,EAAA,OAAAkC,gBAAAlC,EAAA,OAAAoD,iBAAApD,EAAA,OAAAqD,aAAA;EACC,MAAAnF,SAAekF,cAAclB,YAAY;EACzC,MAAAoB,UACED,gBAAgBvC,KAAAA,IAAhB5C,SAEIP,oBAAoB;GAAA0F;GAAAnF;EAGpB,CAAC;EACkB9B,KAAAA;EACvB+E,KAAAjD,OAAMqF,QAASzC,KAAAA,IAAfwC,UAAqCtH,QAAQkC,OAAMqF,KAAMD,OAAO;EAACtD,EAAA,KAAAkC;EAAAlC,EAAA,KAAAoD;EAAApD,EAAA,KAAAqD;EAAArD,EAAA,KAAAe;EAAAf,EAAA,KAAAmB;CAAA,OAAA;EAAAJ,KAAAf,EAAA;EAAAmB,KAAAnB,EAAA;CAAA;CADnE,MAAAwD,mBAAyBpH,GACvB+E,EACF;CAAE,IAAAC;CAAA,IAAApB,EAAA,OAAAiC,aAAAjC,EAAA,OAAAkC,cAAA;EAEMd,KAAAY,iBAAiBC,WAAWC,YAAY;EAAClC,EAAA,KAAAiC;EAAAjC,EAAA,KAAAkC;EAAAlC,EAAA,KAAAoB;CAAA,OAAAA,KAAApB,EAAA;CADjD,MAAAyD,YACQrC;CAEN,IAAAsC;CAAA,IAAA1D,EAAA,OAAAyD,aAAAzD,EAAA,OAAAiC,aAAAjC,EAAA,QAAAwD,oBAAAxD,EAAA,QAAAkC,gBAAAlC,EAAA,QAAAO,aAAAP,EAAA,QAAAzB,YAAAyB,EAAA,QAAAW,YAAAX,EAAA,QAAAS,mBAAAT,EAAA,QAAAU,gBAAAV,EAAA,QAAAK,YAAAL,EAAA,QAAAI,cAAAJ,EAAA,QAAAQ,eAAAR,EAAA,QAAAM,gBAAA;EAAA,IAAAqD;EAAA,IAAA3D,EAAA,QAAAiC,aAAAjC,EAAA,QAAAwD,oBAAAxD,EAAA,QAAAkC,gBAAAlC,EAAA,QAAAO,aAAAP,EAAA,QAAAzB,YAAAyB,EAAA,QAAAW,YAAAX,EAAA,QAAAS,mBAAAT,EAAA,QAAAU,gBAAAV,EAAA,QAAAK,YAAAL,EAAA,QAAAI,cAAAJ,EAAA,QAAAQ,eAAAR,EAAA,QAAAM,gBAAA;GAEcqD,MAAAzD,SACZlE,QACEkE,KAAIe,IACJc,qBAAqB;IAAA7B;IAAAC,WAGjB2C,cAAc5C,MAAM+B,WAAWC,YACA,KAA/BsB,iBAAgBtC,MAAMf;IAAUC,aACtBwD,YACVpG,uBAAuB,gBACrB4C,WAAWF,KAAIe,IAAK2C,OAAO,CAC7B;IAACvD,WACOd,UACR/B,uBAAuB,gBAAgB6C,SAASH,KAAIe,IAAK1B,KAAK,CAAC;IAACe,iBAClDU,WACdxD,uBAAuB,gCACrB8C,eAAeJ,KAAIe,IAAKD,MAAM,CAChC;IAACT,iBAED/C,uBAAuB,iBAAiB+C,UAAUL,KAAIe,EAAG,CAAC;IAACT,mBAE3DhD,uBAAuB,mBAAmBgD,YAAYN,KAAIe,EAAG,CAAC;IAAC1C,gBAE/Df,uBAAuB,gBAAgBe,SAAS2B,KAAIe,EAAG,CAAC;IAACR,uBAEzDjD,uBAAuB,wBACrBiD,gBACEP,KAAIe,IACJuC,iBAAgBtC,MAAM2C,QAGxB,CACF;IAACnD,oBACiBA,aAAaR,KAAIe,EAAG;IAACN,gBAEvCnD,uBAAuB,gBAAgBmD,SAAST,KAAIe,EAAG,CAAC;GAC5D,CAAC,CACH;GAACjB,EAAA,MAAAiC;GAAAjC,EAAA,MAAAwD;GAAAxD,EAAA,MAAAkC;GAAAlC,EAAA,MAAAO;GAAAP,EAAA,MAAAzB;GAAAyB,EAAA,MAAAW;GAAAX,EAAA,MAAAS;GAAAT,EAAA,MAAAU;GAAAV,EAAA,MAAAK;GAAAL,EAAA,MAAAI;GAAAJ,EAAA,MAAAQ;GAAAR,EAAA,MAAAM;GAAAN,EAAA,MAAA2D;EAAA,OAAAA,KAAA3D,EAAA;EArCH0D,KAAAD,UAASK,IAAKH,EAsCd;EAAC3D,EAAA,KAAAyD;EAAAzD,EAAA,KAAAiC;EAAAjC,EAAA,MAAAwD;EAAAxD,EAAA,MAAAkC;EAAAlC,EAAA,MAAAO;EAAAP,EAAA,MAAAzB;EAAAyB,EAAA,MAAAW;EAAAX,EAAA,MAAAS;EAAAT,EAAA,MAAAU;EAAAV,EAAA,MAAAK;EAAAL,EAAA,MAAAI;EAAAJ,EAAA,MAAAQ;EAAAR,EAAA,MAAAM;EAAAN,EAAA,MAAA0D;CAAA,OAAAA,KAAA1D,EAAA;CAvCH,MAAA+D,kBAAwB5H,gBACtBuH,EAuCF;CAAE,IAAAC;CAAA,IAAA3D,EAAA,QAAAyD,aAAAzD,EAAA,QAAAwD,oBAAAxD,EAAA,QAAA+D,iBAAA;EACKJ,KAAA;GAAAH;GAAAC;GAAAM;EAA+C;EAAC/D,EAAA,MAAAyD;EAAAzD,EAAA,MAAAwD;EAAAxD,EAAA,MAAA+D;EAAA/D,EAAA,MAAA2D;CAAA,OAAAA,KAAA3D,EAAA;CAAA,OAAhD2D;AAAgD;AAGzD,MAAMK,uBACJjE,UAC4B;CAC5B,MAAM,EACJ9B,SACAC,QAAQkF,eACRjF,UACAC,kBACAC,kBACAC,qBACAC,aACEwB;CAEJ,MAAM,CAAC,EAAEkE,OAAOC,eAAeC,aAAatI,eAAe;EACzD,MAAMuI,SAASnH,cAAcc,UAAU;EACvC,OAAO;GACLkG,OAAO,IAAI1H,gBAAgB6H,OAAOlD,KAAK;GACvCgD,eAAeE,OAAOnD;GACtBkD,SAAS;IACPlG;IACAoG,eAAepG;IACfqG,mBAAmB;IACnBC,gBAAgB;IAChBC,kBAAkB;IAClBC,aAAa3D,KAAAA;IACb4D,iBAAiB5D,KAAAA;IACjB6D,sBAAsB7D,KAAAA;IACtB8D,wBAAwB9D,KAAAA;IACxB+D,YAAY/D,KAAAA;IACZoB,cAAckC,OAAOnD;IACrB6D,uBAAuB;IACvB1G;IACAC;IACAC;GACF;EACF;CACF,CAAC;CAGD6F,QAAQlG,UAAUA;CAElB,MAAMgE,YAAYnG,sBACfiJ,kBAAkBd,MAAMe,UAAUD,aAAa,SAC1Cd,MAAMgB,aACNhB,MAAMgB,KACd;CAEA,MAAM,CAAC/C,cAAcgD,mBAAmBrJ,SAASqI,aAAa;CAC9D,MAAMiB,qBAAqBzJ,aACxBuF,OAAe;EACdkD,QAAQjC,eAAejB;EACvBiE,gBAAgBjE,EAAE;CACpB,GACA,CAACkD,OAAO,CACV;CACA7H,yBAAyB4F,YAAY;CACrCvG,gBAAgB;EACdwI,QAAQlG,UAAUA;EAClBkG,QAAQjC,eAAeA;EACvBiC,QAAQ/F,mBAAmBA;EAC3B+F,QAAQ9F,mBAAmBA;EAC3B8F,QAAQ7F,sBAAsBA;CAChC,GAAG;EACDL;EACAiE;EACA5D;EACAD;EACAD;EACA+F;CAAO,CACR;CAED,MAAMiB,iBAAiB1J,aACpBsD,UAA8BqG,SAAkB;EAC/C,IAAIlB,QAAQQ,yBAAyB3F,UAAU;EAC/CmF,QAAQQ,uBAAuB3F;EAC/B,IAAIqG,MAAMlB,QAAQ/F,mBAAmBY,QAAQ;CAC/C,GACA,CAACmF,OAAO,CACV;CAEA,MAAMmB,wBAAwB5J,kBAAkB;EAC9C,IAAIyI,QAAQM,aAAa,OAAON,QAAQM;EACxC,MAAMc,aAAapB,QAAQI;EAC3B,MAAMtG,YAAUkG,QAAQlG;EACxB,MAAMuH,kBAAkBtI,eAAe+G,MAAMwB,SAAS;EACtDtB,QAAQM,cAAcR,MACnByB,iBAAiB;GAChBC,eAAe1H,UAAQ2H,KAAK;GAC5BC,UAAU3E,WAAW;IAAE,GAAGA;IAAO4E,WAAW;GAAK;GACjDC,OAAO7E,SAAO8E,SAAS;IACrB,IAAIT,eAAepB,QAAQI,gBAAgB,OAAOrD;IAClDiD,QAAQE,gBAAgBpG;IACxB,MAAMgI,QAAQzJ,gBAAgBwJ,KAAKE,SAAS;KAC1C7D,WAAW,CAAA;KACXC,mBAAmB,CAAA;KACnB6D,aAAa,CAAC;KACdC,YAAY,CAAC;IACf,CAAC;IACD,MAAMC,SAAS;KACb,GAAGnF;KACH4E,WAAW;KACXQ,QAAQ1J,gBAAgBoJ,KAAKO,UAAU;KACvClE,WAAW4D,MAAM5D;KACjBC,mBAAmB2D,MAAM3D;KACzB6D,aAAa;MACX,GAAGjF,QAAMiF;MACT,GAAGF,MAAME;KACX;KACAC,YAAY;MACV,GAAGlF,QAAMkF;MACT,GAAGH,MAAMG;KACX;IACF;IACA,OAAOpJ,2BAA2BqJ,QAAQnF,SAAOsE,eAAe;GAClE;EACF,CAAC,CAAC,CACDgB,OAAOC,UAAmB;GACzB,IAAIlB,eAAepB,QAAQI,gBAAgB;GAC3CmC,QAAQD,MAAM,2CAA2CA,KAAK;GAC9DtC,QAAQM,cAAc3D,KAAAA;GACtBmD,MAAM0C,OAAO;IACX,GAAG1C,MAAMwB;IACTK,WAAW;GACb,CAAC;EACH,CAAC,CAAC,CACDC,WAAW,CAAC,CAAC;EAChB,OAAO5B,QAAQM;CACjB,GAAG,CAACN,SAASF,KAAK,CAAC;CAEnB,MAAM2C,SAASlL,kBAAkB;EAC/B,MAAMmL,iBAAiB5I,YAAYkG,QAAQE;EAC3CF,QAAQI;EACRJ,QAAQM,cAAc3D,KAAAA;EACtBqD,QAAQO,kBAAkB5D,KAAAA;EAC1B,IAAI+F,gBAAgB;GAClB1C,QAAQG;GACRH,QAAQK;GACRL,QAAQU,aAAa/D,KAAAA;GACrBqD,QAAQE,gBAAgBpG;GACxB,MAAMmG,WAASnH,cAAcc,UAAU;GACvCkG,MAAM6C,MAAM;IAAE,GAAG1C,SAAOlD;IAAO4E,WAAW;GAAK,CAAC;GAChDX,mBAAmBf,SAAOnD,EAAE;GAC5BmE,eAAetE,KAAAA,GAAW,IAAI;EAChC,OACEmD,MAAM0C,OAAO;GACX,GAAG1C,MAAMwB;GACTa,QAAQxF,KAAAA;EACV,CAAC;EAEH,OAAOwE,sBAAsB;CAC/B,GAAG;EACDrH;EACAkH;EACAG;EACAF;EACAjB;EACAF;CAAK,CACN;CAEDtI,gBAAgB;EACd,sBAA2B;CAC7B,GAAG,CAAC2J,qBAAqB,CAAC;CAE1B3J,gBAAgB;EACd,IAAI,CAACU,eAAe;EACpB,IAAI4B,QAAQ8I,yBAAyBjG,KAAAA,GAAW;EAChD,IAAI7C,QAAQ+I,sBAAsBlG,KAAAA,GAAW;EAC7C4F,QAAQO,KACN,sNACF;CACF,GAAG,CAAChJ,OAAO,CAAC;CAEZ,MAAMiJ,WAAWxL,kBAAkB;EACjC,IAAIyI,QAAQO,iBAAiB,OAAOP,QAAQO;EAC5C,MAAMyC,WAAWlD,MAAMgB;EACvB,IAAIkC,SAASb,WAAWxF,KAAAA,KAAaqG,SAASrB,WAC5C,OAAOlI;EAET,MAAM2H,eAAapB,QAAQI;EAC3B,MAAM+B,SAASa,SAASb;EACxB,MAAMc,iBAAiBjD,QAAQlG;EAC/B,MAAMoJ,OAAOpD,MACVyB,iBAAiB;GAChBC,eAAeyB,eAAexB,KAAK,EAAE0B,OAAOhB,OAAO,CAAC;GACpDT,UAAU3E,aAAW;IAAE,GAAGA;IAAOqG,eAAe;GAAK;GACrDxB,OAAO7E,SAAO8E,WAAS;IACrB,IAAIT,iBAAepB,QAAQI,gBAAgB,OAAOrD;IAClD,MAAMsG,WAAWhL,gBAAgBwJ,OAAKE,SAAS;KAC7C7D,WAAW,CAAC,GAAGnB,QAAMmB,SAAS;KAC9BC,mBAAmB,CAAC,GAAGpB,QAAMoB,iBAAiB;KAC9C6D,aAAa,EAAE,GAAGjF,QAAMiF,YAAY;KACpCC,YAAY,EAAE,GAAGlF,QAAMkF,WAAW;IACpC,CAAC;IACD,OAAO;KACL,GAAGlF;KACHqG,eAAe;KACfjB,QAAQ1J,gBAAgBoJ,OAAKO,UAAU;KACvClE,WAAWmF,SAASnF;KACpBC,mBAAmBkF,SAASlF;KAC5B6D,aAAaqB,SAASrB;KACtBC,YAAYoB,SAASpB;IACvB;GACF;EACF,CAAC,CAAC,CACDI,OAAOC,YAAmB;GACzB,IAAIlB,iBAAepB,QAAQI,gBAAgB;GAC3CmC,QAAQD,MAAM,+CAA+CA,OAAK;EACpE,CAAC,CAAC,CACDV,WAAW;GACV,IAAI5B,QAAQO,oBAAoB2C,MAC9BlD,QAAQO,kBAAkB5D,KAAAA;EAE9B,CAAC;EACHqD,QAAQO,kBAAkB2C;EAC1B,OAAOA;CACT,GAAG,CAAClD,SAASF,KAAK,CAAC;CAEnB,MAAMwD,cAAc/L,aACjBgM,QAA+C;EAC9C,MAAMnC,eAAa,EAAEpB,QAAQK;EAC7B,IAAImD;EACJ,MAAMN,SAAO,IAAIxJ,SAAeC,SAAS8J,WAAW;GAClDD,UAAUlB,YAAU;IAClB,IAAIA,YAAU3F,KAAAA,GAAWhD,QAAQ;SAC5B8J,OAAOnB,OAAK;GACnB;EACF,CAAC;EACDtC,QAAQU,aAAawC;EACrB,IAAS9B,YAAU,CAAC,CAACQ,WACb4B,OAAO,IACZlB,YAAmBkB,OAAOlB,OAAK,CAClC;EACA,OAAOY;CACT,GACA,CAAClD,OAAO,CACV;CAEA,MAAM0D,iBAAiBnM,aAEnB+C,oBACAmF,SACAkE,qBAAqB,SAErBL,YAAY,OAAOlC,iBAAe;EAChC,IAAIrF,OAAOvD,cAAcsH,MAAMgB,OAAOxG,kBAAkB;EACxD,IAAI,CAACyB,MAAM;GACT,MAAM6H,iBACJ,MAAM5D,QAAQlG,QAAQ+J,MAAMvJ,kBAAkB;GAChD,IAAI8G,iBAAepB,QAAQK,kBAAkB;GAC7C,MAAMtD,UAAQ+C,MAAMgB;GACpB,MAAMgD,YAAYvL,sBAAsBqL,eAAe/I,QAAQ;GAC/D,MAAMkJ,cACJH,eAAelJ,WAAW,YACtBqC,QAAMmB,UAAU8F,SAASJ,eAAe/I,QAAQ,IAChDkC,QAAMoB,kBAAkB6F,SAASJ,eAAe/I,QAAQ;GAC9D,MAAMoJ,yBAAyBlH,QAAMmB,UAAU3C,QAC5CuB,SAAOA,SAAO8G,eAAe/I,QAChC;GACA,MAAMqJ,iCAAiCnH,QAAMoB,kBAAkB5C,QAC5DuB,SAAOA,SAAO8G,eAAe/I,QAChC;GACAiF,MAAM0C,OAAO;IACX,GAAGzF;IACHmB,WACE0F,eAAelJ,WAAW,YACtBqJ,cACEhH,QAAMmB,YACN,CAAC,GAAG+F,wBAAwBL,eAAe/I,QAAQ,IACrDoJ;IACN9F,mBACEyF,eAAelJ,WAAW,aACtBqJ,cACEhH,QAAMoB,oBACN,CAAC,GAAG+F,gCAAgCN,eAAe/I,QAAQ,IAC7DqJ;IACNlC,aAAa;KACX,GAAGjF,QAAMiF;MACR4B,eAAe/I,WAAWiJ;IAC7B;IACA7B,YAAY;KACV,GAAGlF,QAAMkF;MACR6B,YAAY;MACXhH,IAAIgH;MACJK,gBAAgBzK,QAAQC,QAAQ;OAC9BkB,UAAU+I,eAAe/I;OACzBC,YAAY8I,eAAe9I;MAC7B,CAAC;MACDD,UAAU+I,eAAe/I;MACzBC,YAAY8I,eAAe9I;MAC3BJ,QAAQkJ,eAAelJ;MACvBU,OAAOwI,eAAexI;MACtBsB,eAAekH,eAAelH;MAC9BG,QAAQ+G,eAAe/G;KACzB;IACF;GACF,CAAC;GACDd,OAAOvD,cAAcsH,MAAMgB,OAAOxG,kBAAkB;EACtD;EACA,IAAI,CAACyB,MACH,MAAM1B,oBAAoBC,oBAAoB,iBAAiB;EAEjE,IAAIuE,aAAaiB,MAAMgB,OAAO/E,KAAKe,IAAIkD,QAAQjC,YAAY,GAAG;EAC9D,IAAIhC,KAAKrB,WAAW,cAAc+E,SAASlC,cAAc,OAAO;GAC9D,MAAM6G,UAAUrI;GAChB,MAAM,EAAElB,UAAAA,eAAa,MAAMuJ,QAAQD;GACnC,IAAI/C,iBAAepB,QAAQK,kBAAkB;GAC7C,MAAMP,MAAMyB,iBAAiB;IAC3BC,eAAexB,QAAQlG,QAAQyD,UAAU1C,UAAQ;IACjDwJ,aAAatH,YACXrE,oBAAoBqE,SAAOqH,QAAQtH,IAAI,SAAS;GACpD,CAAC;GACD,IAAIsE,iBAAepB,QAAQK,kBAAkB;GAC7CtE,OAAOvD,cAAcsH,MAAMgB,OAAOsD,QAAQtH,EAAE,KAAKsH;EACnD;EACA,IAAIhD,iBAAepB,QAAQK,kBAAkB;EAC7CW,mBAAmBjF,KAAKe,EAAE;EAC1BmE,eAAelF,KAAKlB,UAAU8I,kBAAkB;EAChD3D,QAAQ9F,mBAAmB6B,KAAKe,EAAE;CACpC,CAAC,GACH;EAACkE;EAAoBC;EAAgBjB;EAASsD;EAAaxD;CAAK,CAClE;CAEA,MAAMwE,oBAAoB/M,aACvBoM,uBAAqB,SACpBL,YAAY,OAAOlC,iBAAe;EAChC,OACEtB,MAAMwB,UAAUrD,gBAAgBtB,KAAAA,KAChCmD,MAAMgB,MAAM7C,gBAAgBtB,KAAAA,GAC5B;GACA,MAAMmD,MAAMyE,cAAc;GAC1B,IAAInD,iBAAepB,QAAQK,kBAAkB;EAC/C;EACA,MAAMmE,WAAW1E,MAAMgB,MAAM7C;EAC7B,IAAIuG,aAAa7H,KAAAA,GAAW;GAC1B,MAAM8H,aACJjM,cAAcsH,MAAMgB,OAAO0D,QAAQ,CAAC,EAAE1H,MAAM0H;GAC9C,IAAI3F,aAAaiB,MAAMgB,OAAO2D,YAAYzE,QAAQjC,YAAY,GAC5D;GAEFiD,mBAAmByD,UAAU;GAC7BxD,eAAetE,KAAAA,GAAWgH,oBAAkB;GAC5C3D,QAAQ7F,sBAAsB;GAC9B;EACF;EACA,MAAM8F,WAASnH,cAAcgH,MAAMwB,SAAS;EAC5CxB,MAAM0C,OAAOvC,SAAOlD,KAAK;EACzB,IAAIqE,iBAAepB,QAAQK,kBAAkB;EAC7CW,mBAAmBf,SAAOnD,EAAE;EAC5BmE,eAAetE,KAAAA,GAAWgH,oBAAkB;EAC5C3D,QAAQ7F,sBAAsB;CAChC,CAAC,GACH;EAAC6G;EAAoBC;EAAgBjB;EAASsD;EAAaxD;CAAK,CAClE;CAEA,MAAM4E,gBAAgBnN,YACpB,OAAOyC,eAAqB;EAC1B,IAAIA,eAAa8F,MAAMgB,MAAM7C,aAC3B,MAAM,IAAIzD,MAAM,sCAAsC;EAExD,IAAImK;EACJ,OAAO9F,aAAaiB,MAAMgB,OAAO9G,YAAUgG,QAAQjC,YAAY,GAAG;GAChE,IAAI2C,aAAaV,QAAQU;GACzB,MAAMkE,kBAAkB,CAAClE,cAAcA,eAAeiE;GACtD,IAAIC,iBACFlE,aAAa4D,kBAAkB;GAEjCK,kBAAkBjE;GAClB,IAAI;IACF,MAAMA;GACR,SAAS4B,SAAO;IACd,IAAIsC,mBAAmB5E,QAAQU,eAAeA,YAC5C,MAAM4B;GAEV;EACF;CACF,GACA;EAACtC;EAASF;EAAOwE;CAAiB,CACpC;CAEA,MAAMO,2BAA2BtN,aAC9B6J,iBAAuB;EACtB,IAAIA,iBAAepB,QAAQG,mBACzB,MAAM,IAAIjH,8BAA8B;CAE5C,GACA,CAAC8G,OAAO,CACV;CAEA,MAAMtC,aAAanG,YACjB,OAAOyC,eAAqB;EAC1B,MAAMiJ,mBAAiBjD,QAAQlG;EAC/B,MAAMqG,oBAAoBH,QAAQG;EAClC,IAAIL,MAAMgB,MAAM7C,gBAAgBjE,YAAU;GACxC,MAAM+B,SAAOvD,cAAcsH,MAAMgB,OAAO9G,UAAQ;GAChD,IAAI,CAAC+B,QAAM,MAAM1B,oBAAoBL,YAAU,iBAAiB;GAChE,IAAI+B,OAAKrB,WAAW,OAClB,MAAMD,kBAAkBT,YAAU+B,OAAKrB,QAAQ,qBAAqB;GAEtE,MAAME,SAASD,mBAAmB,MAAMoB,OAAKoI,cAAc;GAC3DU,yBAAyB1E,iBAAiB;GAC1C,OAAOvF;EACT;EACA,MAAMA,WAAS,MAAMkF,MAAMyB,iBAAiB;GAC1CC,eAAe;IACbqD,yBAAyB1E,iBAAiB;IAC1C,OAAO8C,iBAAevF,WAAW1D,UAAQ;GAC3C;GACAqK,aAAatH,YAAUrE,oBAAoBqE,SAAO/C,YAAU,SAAS;GACrE0H,UAAU3E,SAAOmG,WAAS;IACxB,MAAMY,cAAYvL,sBAAsByB,UAAQ;IAChD,OAAO;KACL,GAAG+C;KACHkF,YAAY;MACV,GAAGlF,QAAMkF;OACR6B,cAAY;OACX,GAAG/G,QAAMkF,WAAW6B;OACpBK,gBAAgBjB;MAClB;KACF;IACF;GACF;GACAtB,OAAO7E,SAAO,EAAElC,UAAAA,YAAUC,iBAAiB;IACzC,IAAIqF,sBAAsBH,QAAQG,mBAAmB,OAAOpD;IAC5D,MAAMhB,SAAOvD,cAAcuE,SAAO/C,UAAQ;IAC1C,IAAI,CAAC+B,QAAM,OAAOgB;IAClB,MAAM+G,cAAYvL,sBAAsByB,UAAQ;IAChD,OAAO;KACL,GAAG+C;KACHiF,aAAa;MACX,GAAGjF,QAAMiF;OACRnH,aAAWiJ;KACd;KACA7B,YAAY;MACV,GAAGlF,QAAMkF;OACR6B,cAAY;OACX,GAAG/H;OACHoI,gBAAgBzK,QAAQC,QAAQ;QAAEkB,UAAAA;QAAUC;OAAW,CAAC;OACxDD,UAAAA;OACAC;MACF;KACF;IACF;GACF;EACF,CAAC;EACD+J,yBAAyB1E,iBAAiB;EAC1C,IAAInG,eAAagG,QAAQjC,cACvBkD,eAAerG,SAAOC,UAAU,IAAI;EAEtC,OAAOF,mBAAmBC,QAAM;CAClC,GACA;EAACqG;EAAgB4D;EAA0B7E;EAASF;CAAK,CAC3D;CAEA,MAAM1C,SAAS7F,aACZ+C,sBAA4BwK,aAAqB;EAChD,MAAM7B,mBAAiBjD,QAAQlG;EAC/B,MAAMqG,sBAAoBH,QAAQG;EAClC,MAAMpE,SAAOvD,cAAcsH,MAAMgB,OAAOxG,oBAAkB;EAC1D,IAAI,CAACyB,QAAM,MAAM1B,oBAAoBC,sBAAoB,aAAa;EACtE,IAAIyB,OAAKrB,WAAW,OAClB,MAAMD,kBAAkBH,sBAAoByB,OAAKrB,QAAQ,YAAY;EAEvE,OAAOoF,MAAMyB,iBAAiB;GAC5BC,SAAS,YAAY;IACnB,MAAM,EAAE3G,UAAAA,eAAa,MAAMkB,OAAKoI;IAChCU,yBAAyB1E,mBAAiB;IAC1C,OAAO8C,iBAAe7F,OAAOvC,YAAUiK,QAAQ;GACjD;GACAT,aAAatH,YAAU;IACrB,MAAMqH,YAAU5L,cAAcuE,SAAOzC,oBAAkB;IACvD,IAAI,CAAC8J,WAAS,OAAOrH;IACrB,OAAO;KACL,GAAGA;KACHkF,YAAY;MACV,GAAGlF,QAAMkF;OACRmC,UAAQtH,KAAK;OACZ,GAAGsH;OACHhJ,OAAO0J;MACT;KACF;IACF;GACF;EACF,CAAC;CACH,GACA;EAACD;EAA0B7E;EAASF;CAAK,CAC3C;CAEA,MAAMzC,eAAe9F,aAEjB+C,sBACAuC,WACG;EACH,MAAMoG,mBAAiBjD,QAAQlG;EAC/B,MAAMqG,sBAAoBH,QAAQG;EAClC,MAAMpE,SAAOvD,cAAcsH,MAAMgB,OAAOxG,oBAAkB;EAC1D,IAAI,CAACyB,QACH,MAAM1B,oBACJC,sBACA,8BACF;EAEF,IAAIyB,OAAKrB,WAAW,OAClB,MAAMD,kBACJH,sBACAyB,OAAKrB,QACL,wBACF;EAEF,IAAI,CAACuI,iBAAe5F,cAClB,MAAM,IAAI7C,MACR,sEACF;EAEF,OAAOsF,MAAMyB,iBAAiB;GAC5BC,SAAS,YAAY;IACnB,MAAM,EAAE3G,UAAAA,eAAa,MAAMkB,OAAKoI;IAChCU,yBAAyB1E,mBAAiB;IAC1C,IAAI,CAAC8C,iBAAe5F,cAClB,MAAM,IAAI7C,MACR,sEACF;IAEF,OAAOyI,iBAAe5F,aAAaxC,YAAUgC,MAAM;GACrD;GACAwH,aAAatH,YAAU;IACrB,MAAMqH,YAAU5L,cAAcuE,SAAOzC,oBAAkB;IACvD,IAAI,CAAC8J,WAAS,OAAOrH;IACrB,OAAO;KACL,GAAGA;KACHkF,YAAY;MACV,GAAGlF,QAAMkF;OACRmC,UAAQtH,KAAK;OACZ,GAAGsH;OACHvH;MACF;KACF;IACF;GACF;EACF,CAAC;CACH,GACA;EAACgI;EAA0B7E;EAASF;CAAK,CAC3C;CAEA,MAAMxC,UAAU/F,YACd,OAAO+C,yBAA+B;EACpC,MAAM2I,mBAAiBjD,QAAQlG;EAC/B,MAAMqG,sBAAoBH,QAAQG;EAClC,MAAMpE,SAAOvD,cAAcsH,MAAMgB,OAAOxG,oBAAkB;EAC1D,IAAI,CAACyB,QAAM,MAAM1B,oBAAoBC,sBAAoB,cAAc;EACvE,IAAIyB,OAAKrB,WAAW,WAClB,MAAMD,kBAAkBH,sBAAoByB,OAAKrB,QAAQ,aAAa;EAExE,MAAMgK,cAAc3I,OAAKe,EAAE;EAC3B+H,yBAAyB1E,mBAAiB;EAC1C,OAAOL,MAAMyB,iBAAiB;GAC5BC,SAAS,YAAY;IACnB,MAAM,EAAE3G,UAAAA,eAAa,MAAMkB,OAAKoI;IAChCU,yBAAyB1E,mBAAiB;IAC1C,OAAO8C,iBAAe3F,QAAQzC,UAAQ;GACxC;GACAwJ,aAAatH,aAAUrE,oBAAoBqE,UAAOhB,OAAKe,IAAI,UAAU;EACvE,CAAC;CACH,GACA;EAAC4H;EAAeG;EAA0B7E;EAASF;CAAK,CAC1D;CAEA,MAAMvC,YAAYhG,aACf+C,yBAA+B;EAC9B,MAAM2I,mBAAiBjD,QAAQlG;EAC/B,MAAMqG,sBAAoBH,QAAQG;EAClC,MAAMpE,SAAOvD,cAAcsH,MAAMgB,OAAOxG,oBAAkB;EAC1D,IAAI,CAACyB,QACH,MAAM1B,oBAAoBC,sBAAoB,gBAAgB;EAChE,IAAIyB,OAAKrB,WAAW,YAClB,MAAMD,kBACJH,sBACAyB,OAAKrB,QACL,eACF;EAEF,OAAOoF,MAAMyB,iBAAiB;GAC5BC,SAAS,YAAY;IACnB,IAAI;KACF,MAAM,EAAE3G,UAAAA,eAAa,MAAMkB,OAAKoI;KAChCU,yBAAyB1E,mBAAiB;KAC1C,OAAO,MAAM8C,iBAAe1F,UAAU1C,UAAQ;IAChD,SAASyH,SAAO;KACd,IAAInC,wBAAsBH,QAAQG,mBAChC,MAAMuE,cAAc3I,OAAKe,EAAE;KAE7B,MAAMwF;IACR;GACF;GACA+B,aAAatH,aAAUrE,oBAAoBqE,UAAOhB,OAAKe,IAAI,SAAS;EACtE,CAAC;CACH,GACA;EAAC4H;EAAeG;EAA0B7E;EAASF;CAAK,CAC1D;CAEA,MAAMkF,eAAezN,YACnB,OAAO+C,yBAA+B;EACpC,MAAM2I,mBAAiBjD,QAAQlG;EAC/B,MAAMqG,sBAAoBH,QAAQG;EAClC,MAAMpE,SAAOvD,cAAcsH,MAAMgB,OAAOxG,oBAAkB;EAC1D,IAAI,CAACyB,QAAM,MAAM1B,oBAAoBC,sBAAoB,aAAa;EACtE,IAAIyB,OAAKrB,WAAW,aAAaqB,OAAKrB,WAAW,YAC/C,MAAMD,kBAAkBH,sBAAoByB,OAAKrB,QAAQ,YAAY;EAEvE,MAAMgK,cAAc3I,OAAKe,EAAE;EAC3B+H,yBAAyB1E,mBAAiB;EAC1C/F,WAAW2B,OAAKe,EAAE;EAClB,OAAOgD,MAAMyB,iBAAiB;GAC5BC,SAAS,YAAY;IACnB,MAAM,EAAE3G,UAAAA,eAAa,MAAMkB,OAAKoI;IAChCU,yBAAyB1E,mBAAiB;IAC1C,OAAO8C,iBAAezF,OAAO3C,UAAQ;GACvC;GACAwJ,aAAatH,aAAUrE,oBAAoBqE,UAAOhB,OAAKe,IAAI,SAAS;EACtE,CAAC;CACH,GACA;EAAC4H;EAAetK;EAAUyK;EAA0B7E;EAASF;CAAK,CACpE;CAEA,MAAMrC,gBAAgBlG,YACpB,OACE+C,sBACAoF,aACG;EACH,MAAMuD,mBAAiBjD,QAAQlG;EAC/B,MAAMqG,sBAAoBH,QAAQG;EAClC,MAAMpE,SAAOvD,cAAcsH,MAAMgB,OAAOxG,oBAAkB;EAC1D,IAAI,CAACyB,QACH,MAAM1B,oBAAoBC,sBAAoB,sBAAsB;EAEtE,IAAIyB,OAAKrB,WAAW,OAClB,MAAMD,kBACJH,sBACAyB,OAAKrB,QACL,kBACF;EAEF,MAAM,EAAEG,UAAAA,eAAa,MAAMkB,OAAKoI;EAChCU,yBAAyB1E,mBAAiB;EAC1C,IAAI,CAACtB,aAAaiB,MAAMgB,OAAO/E,OAAKe,IAAIkD,QAAQjC,YAAY,GAAG;EAC/D,IAAI,CAAC2B,UAAU;EACf,MAAM1E,SAAS,MAAMiI,iBAAexF,cAAc5C,YAAU6E,QAAQ;EACpEmF,yBAAyB1E,mBAAiB;EAC1C,MAAMpF,iBAAiBC,QAAQ,OAAO8J,eAAa;GACjD,MAAMhF,MAAMyB,iBAAiB;IAC3BC,SAAS,YAAY,CAAC;IACtB6C,aAAatH,aAAU;KACrB,IAAIoD,wBAAsBH,QAAQG,mBAAmB,OAAOpD;KAC5D,MAAMqH,YAAU5L,cAAcuE,UAAOhB,OAAKe,EAAE;KAC5C,IAAI,CAACsH,WAAS,OAAOrH;KACrB,OAAO;MACL,GAAGA;MACHkF,YAAY;OACV,GAAGlF,SAAMkF;QACRmC,UAAQtH,KAAK;QACZ,GAAGsH;QACHhJ,OAAO0J;OACT;MACF;KACF;IACF;GACF,CAAC;EACH,CAAC;CACH,GACA;EAACD;EAA0B7E;EAASF;CAAK,CAC3C;CAEA,MAAM,EAAET,kBAAkBC,WAAWM,oBACnCZ,wBAAwB;EACtBlB;EACAC;EACAkB;EACAC,aAAapF,QAAQ8I;EACrB3G,aAAaa,MAAI2C,cAAYiE,eAAe5G,MAAI2C,SAAO;EACvDvD,WAAWY,MAAI1B,UAAUgC,OAAON,MAAI1B,KAAK;EACzCe,iBAAiBW,MAAID,aAAWQ,aAAaP,MAAID,QAAM;EACvDT,YAAYU,SAAOQ,QAAQR,IAAE;EAC7BT,cAAcS,SAAOS,UAAUT,IAAE;EACjC1C,WAAW0C,SAAOkI,aAAalI,IAAE;EACjCR,kBAAkBQ,MAAI4C,eAAajC,cAAcX,MAAI4C,UAAQ;EAC7DnD,cAAc,OAAOO,SAAOnC,mBAAmB,MAAM+C,WAAWZ,IAAE,CAAC;EACnEN,WAAWM,UAAO4H,cAAc5H,KAAE;CACpC,CAAC;CAEH,MAAMmI,eAAezM,cAAcsF,WAAWC,YAAY,CAAC,EAAElD;CAC7DrD,gBAAgB;EACd,IAAIwI,QAAQQ,yBAAyByE,cAAc;EACnDjF,QAAQQ,uBAAuByE;EAC/BhL,mBAAmBgL,YAAY;CACjC,GAAG;EAACA;EAAchL;EAAkB+F;CAAO,CAAC;CAE5CxI,gBAAgB;EACd,IAAIwI,QAAQW,uBAAuB;GACjCX,QAAQW,wBAAwB;GAChCX,QAAQS,yBAAyBzG;GACjC,IAAIA,aAAa2C,KAAAA,GAAW;GAC5BtD,uBAAuB,gBACrBqK,eAAe1J,UAAU2C,KAAAA,GAAW,KAAK,CAC3C;GACA;EACF;EACA,IAAIuI,OAAOC,GAAGnF,QAAQS,wBAAwBzG,QAAQ,GAAG;EACzDgG,QAAQS,yBAAyBzG;EACjC,IAAIA,aAAa2C,KAAAA,GAAW;GAC1BtD,uBAAuB,gBAAgBiL,kBAAkB,KAAK,CAAC;GAC/D;EACF;EACAjL,uBAAuB,gBACrBqK,eAAe1J,UAAU2C,KAAAA,GAAW,KAAK,CAC3C;CACF,GAAG;EAACqD;EAASsE;EAAmBZ;EAAgB1J;CAAQ,CAAC;CAEzD,MAAM+C,WAAQtF,eACL;EACLsG;EACAE,aAAaH,UAAUG,eAAe;EACtC0D,WAAW7D,UAAU6D;EACrByB,eAAetF,UAAUsF;EACzBgC,SAAStH,UAAUqE,WAAWxF,KAAAA;EAC9BuB,WAAWJ,UAAUI;EACrBC,mBAAmBL,UAAUK;EAC7BkH,aAAazF,gBAAgB7C;EAC7BuI,MAAMjG,iBAAiBtC;CACzB,IACA;EACEe,UAAUK;EACVL,UAAUqE;EACVrE,UAAU6D;EACV7D,UAAUsF;EACVtF,UAAUG;EACVH,UAAUI;EACVmB,iBAAiBtC;EACjBgB;EACA6B,gBAAgB7C;CAAK,CAEzB;CAEA,OAAO;EACLG,gBAAgBH;EAChB2G,iBAAiB5G,OAAI2C,cAAY;GAC/BpG,uBAAuB,gBAAgBqK,eAAe5G,OAAI2C,SAAO,CAAC;EACpE;EACA6E,yBAAyB;GACvBjL,uBAAuB,gBAAgBiL,kBAAkB,CAAC;EAC5D;EACAnD;EACAsB;EACA8C,wBAAwB;GACtB,IAAI/M,cAAcsH,MAAMgB,OAAO/C,YAAY,CAAC,EAAErD,WAAW,OACvD,OAAOjB;GAET,OACE4F,iBAAiBmG,QAAQC,yBAAyB,KAAKhM;EAE3D;EACAsJ;EACAnE,OAAO8G,aAAa;GAClB,IAAIA,aAAa,QAAQ;IACvB,MAAMC,QAAQrG,UAAUsG,WAAWhH,SACjCD,cAAcC,MAAMd,WAAWC,YAAY,CAC7C;IACA,OAAO6B,gBAAgBiG,IAAI,EAAEF,MAAM,CAAC;GACtC;GACA,IAAI,QAAQD,UAAU;IACpB,MAAMC,UAAQrG,UAAUsG,WAAWhH,WACjCD,cAAcC,QAAMd,WAAW4H,SAAS5I,EAAE,CAC5C;IACA,OAAO8C,gBAAgBiG,IAAI,EAAEF,OAAAA,QAAM,CAAC;GACtC;GAIA,MAAM7I,SAHM4I,SAASI,WACjBhI,UAAUK,oBACVL,UAAUI,UAAAA,CACCwH,SAASC;GACxB,IAAI7I,UAAOH,KAAAA,GACT,OAAOiD,gBAAgBiG,IAAI,EAAEF,OAAO,GAAG,CAAC;GAE1C,MAAMA,UAAQrG,UAAUsG,WAAWhH,WACjCD,cAAcC,QAAMd,WAAWhB,KAAE,CACnC;GACA,OAAO8C,gBAAgBiG,IAAI,EAAEF,OAAAA,QAAM,CAAC;EACtC;EACA5L,cAAcsF,iBAAiBmG;CACjC;AACF;;;;;;;;;AAUA,MAAaO,mBAAmBnO,SAASiI,mBAAmB;AAE5D9H,sBAAsB8H,qBAAqBvG,iCAAiC"}