@assistant-ui/react 0.11.39 → 0.11.43

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 (161) hide show
  1. package/dist/client/AssistantClient.d.ts.map +1 -1
  2. package/dist/client/AssistantClient.js.map +1 -1
  3. package/dist/client/ModelContext.d.ts +1 -1
  4. package/dist/client/ModelContext.d.ts.map +1 -1
  5. package/dist/client/ModelContext.js.map +1 -1
  6. package/dist/client/ModelContextClient.d.ts +1 -1
  7. package/dist/client/ThreadMessageClient.d.ts +1 -0
  8. package/dist/client/ThreadMessageClient.d.ts.map +1 -1
  9. package/dist/client/ThreadMessageClient.js +3 -1
  10. package/dist/client/ThreadMessageClient.js.map +1 -1
  11. package/dist/client/types/Message.d.ts +2 -0
  12. package/dist/client/types/Message.d.ts.map +1 -1
  13. package/dist/client/types/ModelContext.d.ts +1 -1
  14. package/dist/client/types/ModelContext.d.ts.map +1 -1
  15. package/dist/client/types/Tools.d.ts +1 -2
  16. package/dist/client/types/Tools.d.ts.map +1 -1
  17. package/dist/context/providers/ThreadViewportProvider.d.ts +5 -1
  18. package/dist/context/providers/ThreadViewportProvider.d.ts.map +1 -1
  19. package/dist/context/providers/ThreadViewportProvider.js +17 -6
  20. package/dist/context/providers/ThreadViewportProvider.js.map +1 -1
  21. package/dist/context/react/AssistantApiContext.d.ts +1 -1
  22. package/dist/context/react/AssistantApiContext.d.ts.map +1 -1
  23. package/dist/context/react/AssistantApiContext.js +1 -2
  24. package/dist/context/react/AssistantApiContext.js.map +1 -1
  25. package/dist/context/stores/ThreadViewport.d.ts +33 -3
  26. package/dist/context/stores/ThreadViewport.d.ts.map +1 -1
  27. package/dist/context/stores/ThreadViewport.js +67 -5
  28. package/dist/context/stores/ThreadViewport.js.map +1 -1
  29. package/dist/devtools/DevToolsHooks.d.ts +1 -1
  30. package/dist/devtools/DevToolsHooks.d.ts.map +1 -1
  31. package/dist/devtools/DevToolsHooks.js.map +1 -1
  32. package/dist/legacy-runtime/AssistantRuntimeProvider.d.ts.map +1 -1
  33. package/dist/legacy-runtime/AssistantRuntimeProvider.js +2 -1
  34. package/dist/legacy-runtime/AssistantRuntimeProvider.js.map +1 -1
  35. package/dist/legacy-runtime/client/ComposerRuntimeClient.d.ts +3 -3
  36. package/dist/legacy-runtime/client/ComposerRuntimeClient.d.ts.map +1 -1
  37. package/dist/legacy-runtime/client/ComposerRuntimeClient.js.map +1 -1
  38. package/dist/legacy-runtime/client/EventManagerRuntimeClient.d.ts +1 -1
  39. package/dist/legacy-runtime/client/ThreadRuntimeClient.js.map +1 -1
  40. package/dist/legacy-runtime/runtime/MessageRuntime.d.ts +3 -0
  41. package/dist/legacy-runtime/runtime/MessageRuntime.d.ts.map +1 -1
  42. package/dist/legacy-runtime/runtime/MessageRuntime.js.map +1 -1
  43. package/dist/legacy-runtime/runtime/RuntimeBindings.d.ts +2 -0
  44. package/dist/legacy-runtime/runtime/RuntimeBindings.d.ts.map +1 -1
  45. package/dist/legacy-runtime/runtime/ThreadRuntime.d.ts +1 -0
  46. package/dist/legacy-runtime/runtime/ThreadRuntime.d.ts.map +1 -1
  47. package/dist/legacy-runtime/runtime/ThreadRuntime.js +6 -3
  48. package/dist/legacy-runtime/runtime/ThreadRuntime.js.map +1 -1
  49. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.d.ts +1 -1
  50. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.d.ts.map +1 -1
  51. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.js +1 -1
  52. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.js.map +1 -1
  53. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts +8 -1
  54. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts.map +1 -1
  55. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
  56. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js +23 -11
  57. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js.map +1 -1
  58. package/dist/legacy-runtime/runtime-cores/assistant-transport/useToolInvocations.js +5 -5
  59. package/dist/legacy-runtime/runtime-cores/assistant-transport/useToolInvocations.js.map +1 -1
  60. package/dist/legacy-runtime/runtime-cores/core/BaseThreadRuntimeCore.d.ts +1 -0
  61. package/dist/legacy-runtime/runtime-cores/core/BaseThreadRuntimeCore.d.ts.map +1 -1
  62. package/dist/legacy-runtime/runtime-cores/core/ThreadRuntimeCore.d.ts +1 -0
  63. package/dist/legacy-runtime/runtime-cores/core/ThreadRuntimeCore.d.ts.map +1 -1
  64. package/dist/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListHookInstanceManager.d.ts +2 -0
  65. package/dist/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  66. package/dist/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListThreadListRuntimeCore.d.ts +2 -0
  67. package/dist/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  68. package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.d.ts +1 -0
  69. package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.d.ts.map +1 -1
  70. package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.js +2 -1
  71. package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.js.map +1 -1
  72. package/dist/primitives/composer/ComposerAttachmentDropzone.d.ts +2 -2
  73. package/dist/primitives/composer/ComposerAttachmentDropzone.d.ts.map +1 -1
  74. package/dist/primitives/composer/ComposerAttachmentDropzone.js +31 -11
  75. package/dist/primitives/composer/ComposerAttachmentDropzone.js.map +1 -1
  76. package/dist/primitives/composer/index.d.ts +1 -0
  77. package/dist/primitives/composer/index.d.ts.map +1 -1
  78. package/dist/primitives/composer/index.js +2 -0
  79. package/dist/primitives/composer/index.js.map +1 -1
  80. package/dist/primitives/message/MessageRoot.d.ts +3 -0
  81. package/dist/primitives/message/MessageRoot.d.ts.map +1 -1
  82. package/dist/primitives/message/MessageRoot.js +24 -2
  83. package/dist/primitives/message/MessageRoot.js.map +1 -1
  84. package/dist/primitives/messagePart/useMessagePartData.d.ts.map +1 -1
  85. package/dist/primitives/messagePart/useMessagePartData.js.map +1 -1
  86. package/dist/primitives/thread/ThreadScrollToBottom.d.ts +7 -2
  87. package/dist/primitives/thread/ThreadScrollToBottom.d.ts.map +1 -1
  88. package/dist/primitives/thread/ThreadScrollToBottom.js +7 -4
  89. package/dist/primitives/thread/ThreadScrollToBottom.js.map +1 -1
  90. package/dist/primitives/thread/ThreadViewport.d.ts +17 -3
  91. package/dist/primitives/thread/ThreadViewport.d.ts.map +1 -1
  92. package/dist/primitives/thread/ThreadViewport.js +19 -5
  93. package/dist/primitives/thread/ThreadViewport.js.map +1 -1
  94. package/dist/primitives/thread/ThreadViewportFooter.d.ts +31 -0
  95. package/dist/primitives/thread/ThreadViewportFooter.d.ts.map +1 -0
  96. package/dist/primitives/thread/ThreadViewportFooter.js +27 -0
  97. package/dist/primitives/thread/ThreadViewportFooter.js.map +1 -0
  98. package/dist/primitives/thread/ThreadViewportSlack.d.ts +20 -0
  99. package/dist/primitives/thread/ThreadViewportSlack.d.ts.map +1 -0
  100. package/dist/primitives/thread/ThreadViewportSlack.js +77 -0
  101. package/dist/primitives/thread/ThreadViewportSlack.js.map +1 -0
  102. package/dist/primitives/thread/index.d.ts +3 -0
  103. package/dist/primitives/thread/index.d.ts.map +1 -1
  104. package/dist/primitives/thread/index.js +7 -1
  105. package/dist/primitives/thread/index.js.map +1 -1
  106. package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts +6 -0
  107. package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts.map +1 -1
  108. package/dist/primitives/thread/useThreadViewportAutoScroll.js +17 -8
  109. package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
  110. package/dist/tests/setup.js +14 -14
  111. package/dist/tests/setup.js.map +1 -1
  112. package/dist/utils/hooks/useOnScrollToBottom.d.ts +3 -1
  113. package/dist/utils/hooks/useOnScrollToBottom.d.ts.map +1 -1
  114. package/dist/utils/hooks/useOnScrollToBottom.js.map +1 -1
  115. package/dist/utils/hooks/useSizeHandle.d.ts +11 -0
  116. package/dist/utils/hooks/useSizeHandle.d.ts.map +1 -0
  117. package/dist/utils/hooks/useSizeHandle.js +30 -0
  118. package/dist/utils/hooks/useSizeHandle.js.map +1 -0
  119. package/dist/utils/tap-store/derived-scopes.d.ts +2 -1
  120. package/dist/utils/tap-store/derived-scopes.d.ts.map +1 -1
  121. package/dist/utils/tap-store/derived-scopes.js.map +1 -1
  122. package/dist/utils/tap-store/store.d.ts +2 -1
  123. package/dist/utils/tap-store/store.d.ts.map +1 -1
  124. package/dist/utils/tap-store/store.js.map +1 -1
  125. package/package.json +6 -6
  126. package/src/client/AssistantClient.ts +1 -1
  127. package/src/client/ModelContext.ts +1 -1
  128. package/src/client/ThreadMessageClient.tsx +4 -1
  129. package/src/client/types/Message.ts +3 -0
  130. package/src/client/types/ModelContext.ts +1 -1
  131. package/src/client/types/Tools.ts +1 -2
  132. package/src/context/providers/ThreadViewportProvider.tsx +27 -5
  133. package/src/context/react/AssistantApiContext.tsx +2 -5
  134. package/src/context/stores/ThreadViewport.tsx +125 -7
  135. package/src/devtools/DevToolsHooks.ts +1 -1
  136. package/src/legacy-runtime/AssistantRuntimeProvider.tsx +6 -1
  137. package/src/legacy-runtime/client/ComposerRuntimeClient.ts +3 -3
  138. package/src/legacy-runtime/client/ThreadRuntimeClient.ts +2 -2
  139. package/src/legacy-runtime/runtime/MessageRuntime.ts +2 -0
  140. package/src/legacy-runtime/runtime/RuntimeBindings.ts +2 -0
  141. package/src/legacy-runtime/runtime/ThreadRuntime.ts +6 -3
  142. package/src/legacy-runtime/runtime-cores/assistant-transport/runManager.ts +2 -2
  143. package/src/legacy-runtime/runtime-cores/assistant-transport/types.ts +8 -1
  144. package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.tsx +26 -11
  145. package/src/legacy-runtime/runtime-cores/assistant-transport/useToolInvocations.ts +5 -5
  146. package/src/legacy-runtime/runtime-cores/core/ThreadRuntimeCore.tsx +1 -0
  147. package/src/legacy-runtime/runtime-cores/utils/MessageRepository.tsx +1 -0
  148. package/src/primitives/composer/ComposerAttachmentDropzone.tsx +35 -12
  149. package/src/primitives/composer/index.ts +1 -0
  150. package/src/primitives/message/MessageRoot.tsx +45 -2
  151. package/src/primitives/messagePart/useMessagePartData.tsx +0 -1
  152. package/src/primitives/thread/ThreadScrollToBottom.tsx +12 -3
  153. package/src/primitives/thread/ThreadViewport.tsx +35 -9
  154. package/src/primitives/thread/ThreadViewportFooter.tsx +57 -0
  155. package/src/primitives/thread/ThreadViewportSlack.tsx +109 -0
  156. package/src/primitives/thread/index.ts +3 -0
  157. package/src/primitives/thread/useThreadViewportAutoScroll.tsx +24 -12
  158. package/src/utils/hooks/useOnScrollToBottom.tsx +3 -1
  159. package/src/utils/hooks/useSizeHandle.ts +43 -0
  160. package/src/utils/tap-store/derived-scopes.ts +2 -1
  161. package/src/utils/tap-store/store.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantClient.d.ts","sourceRoot":"","sources":["../../src/client/AssistantClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,eAAe,EAEhB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAYhF,OAAO,EACL,YAAY,EAIb,MAAM,sCAAsC,CAAC;AAG9C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AA4H1E,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,eAAe,CAAC;QACvB,KAAK,EAAE,qBAAqB,CAAC;QAC7B,GAAG,EAAE,mBAAmB,CAAC;KAC1B,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,eAAe,CAAC;QAC7B,KAAK,EAAE,iBAAiB,CAAC;QACzB,GAAG,EAAE,eAAe,CAAC;KACtB,CAAC,CAAC;IACH,KAAK,CAAC,EACF,eAAe,CAAC;QACd,KAAK,EAAE,UAAU,CAAC;QAClB,GAAG,EAAE,QAAQ,CAAC;KACf,CAAC,GACF,SAAS,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,OAAO,oBAAoB,iBAK7D,CAAC"}
1
+ {"version":3,"file":"AssistantClient.d.ts","sourceRoot":"","sources":["../../src/client/AssistantClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,eAAe,EAEhB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAYhF,OAAO,EACL,YAAY,EAIb,MAAM,sCAAsC,CAAC;AAG9C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AA6H1E,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,eAAe,CAAC;QACvB,KAAK,EAAE,qBAAqB,CAAC;QAC7B,GAAG,EAAE,mBAAmB,CAAC;KAC1B,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,eAAe,CAAC;QAC7B,KAAK,EAAE,iBAAiB,CAAC;QACzB,GAAG,EAAE,eAAe,CAAC;KACtB,CAAC,CAAC;IACH,KAAK,CAAC,EACF,eAAe,CAAC;QACd,KAAK,EAAE,UAAU,CAAC;QAClB,GAAG,EAAE,QAAQ,CAAC;KACf,CAAC,GACF,SAAS,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,OAAO,oBAAoB,iBAK7D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/client/AssistantClient.ts"],"sourcesContent":["import {\n tapMemo,\n resource,\n Unsubscribe,\n tapInlineResource,\n ResourceElement,\n tapResource,\n} from \"@assistant-ui/tap\";\nimport { ThreadListClientApi, ThreadListClientState } from \"./types/ThreadList\";\nimport { Tools } from \"../model-context\";\nimport { asStore, Store, tapApi } from \"../utils/tap-store\";\nimport { useResource } from \"@assistant-ui/tap/react\";\nimport { useMemo } from \"react\";\nimport {\n AssistantEvent,\n AssistantEventCallback,\n checkEventScope,\n normalizeEventSelector,\n} from \"../types/EventTypes\";\nimport { EventManager } from \"../legacy-runtime/client/EventManagerRuntimeClient\";\nimport {\n AssistantApi,\n createAssistantApiField,\n useAssistantApiImpl,\n extendApi,\n} from \"../context/react/AssistantApiContext\";\nimport { withEventsProvider } from \"./EventContext\";\nimport { withModelContextProvider } from \"./ModelContext\";\nimport { ToolsApi, ToolsState } from \"./types/Tools\";\nimport { ModelContextApi, ModelContextState } from \"./types/ModelContext\";\nimport { ModelContext as ModelContextResource } from \"./ModelContextClient\";\n\ntype AssistantClientState = {\n readonly threads: ThreadListClientState;\n readonly tools: ToolsState;\n readonly modelContext: ModelContextState;\n};\n\ntype AssistantClientApi = {\n getState(): AssistantClientState;\n\n readonly threads: ThreadListClientApi;\n readonly tools: ToolsApi;\n readonly modelContext: ModelContextApi;\n\n on<TEvent extends AssistantEvent>(\n event: TEvent,\n callback: AssistantEventCallback<TEvent>,\n ): Unsubscribe;\n};\n\nconst AssistantStore = resource(\n ({\n threads: threadsEl,\n modelContext: modelContextEl,\n tools: toolsEl,\n }: AssistantClientProps) => {\n const events = tapInlineResource(EventManager());\n\n const { threads, tools, modelContext } = withEventsProvider(events, () => {\n const modelContextResource = tapResource(\n modelContextEl ?? ModelContextResource(),\n [modelContextEl],\n );\n\n return withModelContextProvider(modelContextResource.api, () => {\n return {\n modelContext: modelContextResource,\n tools: tapResource(toolsEl ?? Tools({}), [toolsEl]),\n threads: tapResource(threadsEl, [threadsEl]),\n };\n });\n });\n\n const state = tapMemo<AssistantClientState>(\n () => ({\n threads: threads.state,\n tools: tools.state,\n modelContext: modelContext.state,\n }),\n [threads.state, tools.state, modelContext.state],\n );\n\n return tapApi<AssistantClientApi>({\n getState: () => state,\n\n threads: threads.api,\n tools: tools.api,\n modelContext: modelContext.api,\n on: events.on,\n });\n },\n);\n\nconst getClientFromStore = (client: Store<{ api: AssistantClientApi }>) => {\n const getItem = () => {\n return client.getState().api.threads.item(\"main\");\n };\n return {\n threads: createAssistantApiField({\n source: \"root\",\n query: {},\n get: () => client.getState().api.threads,\n }),\n tools: createAssistantApiField({\n source: \"root\",\n query: {},\n get: () => client.getState().api.tools,\n }),\n modelContext: createAssistantApiField({\n source: \"root\",\n query: {},\n get: () => client.getState().api.modelContext,\n }),\n thread: createAssistantApiField({\n source: \"threads\",\n query: { type: \"main\" },\n get: () => client.getState().api.threads.thread(\"main\"),\n }),\n threadListItem: createAssistantApiField({\n source: \"threads\",\n query: { type: \"main\" },\n get: () => getItem(),\n }),\n composer: createAssistantApiField({\n source: \"thread\",\n query: {},\n get: () => client.getState().api.threads.thread(\"main\").composer,\n }),\n on(selector, callback) {\n const { event, scope } = normalizeEventSelector(selector);\n if (scope === \"*\") return client.getState().api.on(event, callback);\n\n if (\n checkEventScope(\"thread\", scope, event) ||\n checkEventScope(\"thread-list-item\", scope, event) ||\n checkEventScope(\"composer\", scope, event)\n ) {\n return client.getState().api.on(event, (e) => {\n if (e.threadId !== getItem().getState().id) return;\n callback(e);\n });\n }\n\n throw new Error(\n `Event scope is not available in this component: ${scope}`,\n );\n },\n subscribe: client.subscribe,\n flushSync: client.flushSync,\n } satisfies Partial<AssistantApi>;\n};\n\nexport type AssistantClientProps = {\n threads: ResourceElement<{\n state: ThreadListClientState;\n api: ThreadListClientApi;\n }>;\n modelContext?: ResourceElement<{\n state: ModelContextState;\n api: ModelContextApi;\n }>;\n tools?:\n | ResourceElement<{\n state: ToolsState;\n api: ToolsApi;\n }>\n | undefined;\n};\n\nexport const useAssistantClient = (props: AssistantClientProps) => {\n const api = useAssistantApiImpl();\n const client = useResource(asStore(AssistantStore(props)));\n const clientApi = useMemo(() => getClientFromStore(client), [client]);\n return useMemo(() => extendApi(api, clientApi), [api, clientApi]);\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/client/AssistantClient.ts"],"sourcesContent":["import {\n tapMemo,\n resource,\n tapInlineResource,\n ResourceElement,\n tapResource,\n} from \"@assistant-ui/tap\";\nimport { ThreadListClientApi, ThreadListClientState } from \"./types/ThreadList\";\nimport { Tools } from \"../model-context\";\nimport { asStore, Store, tapApi } from \"../utils/tap-store\";\nimport { useResource } from \"@assistant-ui/tap/react\";\nimport { useMemo } from \"react\";\nimport {\n AssistantEvent,\n AssistantEventCallback,\n checkEventScope,\n normalizeEventSelector,\n} from \"../types/EventTypes\";\nimport { EventManager } from \"../legacy-runtime/client/EventManagerRuntimeClient\";\nimport {\n AssistantApi,\n createAssistantApiField,\n useAssistantApiImpl,\n extendApi,\n} from \"../context/react/AssistantApiContext\";\nimport { withEventsProvider } from \"./EventContext\";\nimport { withModelContextProvider } from \"./ModelContext\";\nimport { ToolsApi, ToolsState } from \"./types/Tools\";\nimport { ModelContextApi, ModelContextState } from \"./types/ModelContext\";\nimport { ModelContext as ModelContextResource } from \"./ModelContextClient\";\nimport { Unsubscribe } from \"../types\";\n\ntype AssistantClientState = {\n readonly threads: ThreadListClientState;\n readonly tools: ToolsState;\n readonly modelContext: ModelContextState;\n};\n\ntype AssistantClientApi = {\n getState(): AssistantClientState;\n\n readonly threads: ThreadListClientApi;\n readonly tools: ToolsApi;\n readonly modelContext: ModelContextApi;\n\n on<TEvent extends AssistantEvent>(\n event: TEvent,\n callback: AssistantEventCallback<TEvent>,\n ): Unsubscribe;\n};\n\nconst AssistantStore = resource(\n ({\n threads: threadsEl,\n modelContext: modelContextEl,\n tools: toolsEl,\n }: AssistantClientProps) => {\n const events = tapInlineResource(EventManager());\n\n const { threads, tools, modelContext } = withEventsProvider(events, () => {\n const modelContextResource = tapResource(\n modelContextEl ?? ModelContextResource(),\n [modelContextEl],\n );\n\n return withModelContextProvider(modelContextResource.api, () => {\n return {\n modelContext: modelContextResource,\n tools: tapResource(toolsEl ?? Tools({}), [toolsEl]),\n threads: tapResource(threadsEl, [threadsEl]),\n };\n });\n });\n\n const state = tapMemo<AssistantClientState>(\n () => ({\n threads: threads.state,\n tools: tools.state,\n modelContext: modelContext.state,\n }),\n [threads.state, tools.state, modelContext.state],\n );\n\n return tapApi<AssistantClientApi>({\n getState: () => state,\n\n threads: threads.api,\n tools: tools.api,\n modelContext: modelContext.api,\n on: events.on,\n });\n },\n);\n\nconst getClientFromStore = (client: Store<{ api: AssistantClientApi }>) => {\n const getItem = () => {\n return client.getState().api.threads.item(\"main\");\n };\n return {\n threads: createAssistantApiField({\n source: \"root\",\n query: {},\n get: () => client.getState().api.threads,\n }),\n tools: createAssistantApiField({\n source: \"root\",\n query: {},\n get: () => client.getState().api.tools,\n }),\n modelContext: createAssistantApiField({\n source: \"root\",\n query: {},\n get: () => client.getState().api.modelContext,\n }),\n thread: createAssistantApiField({\n source: \"threads\",\n query: { type: \"main\" },\n get: () => client.getState().api.threads.thread(\"main\"),\n }),\n threadListItem: createAssistantApiField({\n source: \"threads\",\n query: { type: \"main\" },\n get: () => getItem(),\n }),\n composer: createAssistantApiField({\n source: \"thread\",\n query: {},\n get: () => client.getState().api.threads.thread(\"main\").composer,\n }),\n on(selector, callback) {\n const { event, scope } = normalizeEventSelector(selector);\n if (scope === \"*\") return client.getState().api.on(event, callback);\n\n if (\n checkEventScope(\"thread\", scope, event) ||\n checkEventScope(\"thread-list-item\", scope, event) ||\n checkEventScope(\"composer\", scope, event)\n ) {\n return client.getState().api.on(event, (e) => {\n if (e.threadId !== getItem().getState().id) return;\n callback(e);\n });\n }\n\n throw new Error(\n `Event scope is not available in this component: ${scope}`,\n );\n },\n subscribe: client.subscribe,\n flushSync: client.flushSync,\n } satisfies Partial<AssistantApi>;\n};\n\nexport type AssistantClientProps = {\n threads: ResourceElement<{\n state: ThreadListClientState;\n api: ThreadListClientApi;\n }>;\n modelContext?: ResourceElement<{\n state: ModelContextState;\n api: ModelContextApi;\n }>;\n tools?:\n | ResourceElement<{\n state: ToolsState;\n api: ToolsApi;\n }>\n | undefined;\n};\n\nexport const useAssistantClient = (props: AssistantClientProps) => {\n const api = useAssistantApiImpl();\n const client = useResource(asStore(AssistantStore(props)));\n const clientApi = useMemo(() => getClientFromStore(client), [client]);\n return useMemo(() => extendApi(api, clientApi), [api, clientApi]);\n};\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AAEP,SAAS,aAAa;AACtB,SAAS,SAAgB,cAAc;AACvC,SAAS,mBAAmB;AAC5B,SAAS,eAAe;AACxB;AAAA,EAGE;AAAA,EACA;AAAA,OACK;AACP,SAAS,oBAAoB;AAC7B;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,0BAA0B;AACnC,SAAS,gCAAgC;AAGzC,SAAS,gBAAgB,4BAA4B;AAsBrD,IAAM,iBAAiB;AAAA,EACrB,CAAC;AAAA,IACC,SAAS;AAAA,IACT,cAAc;AAAA,IACd,OAAO;AAAA,EACT,MAA4B;AAC1B,UAAM,SAAS,kBAAkB,aAAa,CAAC;AAE/C,UAAM,EAAE,SAAS,OAAO,aAAa,IAAI,mBAAmB,QAAQ,MAAM;AACxE,YAAM,uBAAuB;AAAA,QAC3B,kBAAkB,qBAAqB;AAAA,QACvC,CAAC,cAAc;AAAA,MACjB;AAEA,aAAO,yBAAyB,qBAAqB,KAAK,MAAM;AAC9D,eAAO;AAAA,UACL,cAAc;AAAA,UACd,OAAO,YAAY,WAAW,MAAM,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;AAAA,UAClD,SAAS,YAAY,WAAW,CAAC,SAAS,CAAC;AAAA,QAC7C;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,UAAM,QAAQ;AAAA,MACZ,OAAO;AAAA,QACL,SAAS,QAAQ;AAAA,QACjB,OAAO,MAAM;AAAA,QACb,cAAc,aAAa;AAAA,MAC7B;AAAA,MACA,CAAC,QAAQ,OAAO,MAAM,OAAO,aAAa,KAAK;AAAA,IACjD;AAEA,WAAO,OAA2B;AAAA,MAChC,UAAU,MAAM;AAAA,MAEhB,SAAS,QAAQ;AAAA,MACjB,OAAO,MAAM;AAAA,MACb,cAAc,aAAa;AAAA,MAC3B,IAAI,OAAO;AAAA,IACb,CAAC;AAAA,EACH;AACF;AAEA,IAAM,qBAAqB,CAAC,WAA+C;AACzE,QAAM,UAAU,MAAM;AACpB,WAAO,OAAO,SAAS,EAAE,IAAI,QAAQ,KAAK,MAAM;AAAA,EAClD;AACA,SAAO;AAAA,IACL,SAAS,wBAAwB;AAAA,MAC/B,QAAQ;AAAA,MACR,OAAO,CAAC;AAAA,MACR,KAAK,MAAM,OAAO,SAAS,EAAE,IAAI;AAAA,IACnC,CAAC;AAAA,IACD,OAAO,wBAAwB;AAAA,MAC7B,QAAQ;AAAA,MACR,OAAO,CAAC;AAAA,MACR,KAAK,MAAM,OAAO,SAAS,EAAE,IAAI;AAAA,IACnC,CAAC;AAAA,IACD,cAAc,wBAAwB;AAAA,MACpC,QAAQ;AAAA,MACR,OAAO,CAAC;AAAA,MACR,KAAK,MAAM,OAAO,SAAS,EAAE,IAAI;AAAA,IACnC,CAAC;AAAA,IACD,QAAQ,wBAAwB;AAAA,MAC9B,QAAQ;AAAA,MACR,OAAO,EAAE,MAAM,OAAO;AAAA,MACtB,KAAK,MAAM,OAAO,SAAS,EAAE,IAAI,QAAQ,OAAO,MAAM;AAAA,IACxD,CAAC;AAAA,IACD,gBAAgB,wBAAwB;AAAA,MACtC,QAAQ;AAAA,MACR,OAAO,EAAE,MAAM,OAAO;AAAA,MACtB,KAAK,MAAM,QAAQ;AAAA,IACrB,CAAC;AAAA,IACD,UAAU,wBAAwB;AAAA,MAChC,QAAQ;AAAA,MACR,OAAO,CAAC;AAAA,MACR,KAAK,MAAM,OAAO,SAAS,EAAE,IAAI,QAAQ,OAAO,MAAM,EAAE;AAAA,IAC1D,CAAC;AAAA,IACD,GAAG,UAAU,UAAU;AACrB,YAAM,EAAE,OAAO,MAAM,IAAI,uBAAuB,QAAQ;AACxD,UAAI,UAAU,IAAK,QAAO,OAAO,SAAS,EAAE,IAAI,GAAG,OAAO,QAAQ;AAElE,UACE,gBAAgB,UAAU,OAAO,KAAK,KACtC,gBAAgB,oBAAoB,OAAO,KAAK,KAChD,gBAAgB,YAAY,OAAO,KAAK,GACxC;AACA,eAAO,OAAO,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM;AAC5C,cAAI,EAAE,aAAa,QAAQ,EAAE,SAAS,EAAE,GAAI;AAC5C,mBAAS,CAAC;AAAA,QACZ,CAAC;AAAA,MACH;AAEA,YAAM,IAAI;AAAA,QACR,mDAAmD,KAAK;AAAA,MAC1D;AAAA,IACF;AAAA,IACA,WAAW,OAAO;AAAA,IAClB,WAAW,OAAO;AAAA,EACpB;AACF;AAmBO,IAAM,qBAAqB,CAAC,UAAgC;AACjE,QAAM,MAAM,oBAAoB;AAChC,QAAM,SAAS,YAAY,QAAQ,eAAe,KAAK,CAAC,CAAC;AACzD,QAAM,YAAY,QAAQ,MAAM,mBAAmB,MAAM,GAAG,CAAC,MAAM,CAAC;AACpE,SAAO,QAAQ,MAAM,UAAU,KAAK,SAAS,GAAG,CAAC,KAAK,SAAS,CAAC;AAClE;","names":[]}
@@ -1,5 +1,5 @@
1
- import { Unsubscribe } from "@assistant-ui/tap";
2
1
  import { ModelContextProvider } from "../model-context/ModelContextTypes";
2
+ import { Unsubscribe } from "../types";
3
3
  export type ModelContextRegistrar = ModelContextProvider & {
4
4
  register: (provider: ModelContextProvider) => Unsubscribe;
5
5
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ModelContext.d.ts","sourceRoot":"","sources":["../../src/client/ModelContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE1E,MAAM,MAAM,qBAAqB,GAAG,oBAAoB,GAAG;IACzD,QAAQ,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,WAAW,CAAC;CAC3D,CAAC;AAIF,eAAO,MAAM,wBAAwB,GAAI,OAAO,EAC9C,cAAc,qBAAqB,EACnC,IAAI,MAAM,OAAO,YAGlB,CAAC;AAEF,eAAO,MAAM,eAAe,6BAM3B,CAAC"}
1
+ {"version":3,"file":"ModelContext.d.ts","sourceRoot":"","sources":["../../src/client/ModelContext.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,MAAM,qBAAqB,GAAG,oBAAoB,GAAG;IACzD,QAAQ,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,WAAW,CAAC;CAC3D,CAAC;AAIF,eAAO,MAAM,wBAAwB,GAAI,OAAO,EAC9C,cAAc,qBAAqB,EACnC,IAAI,MAAM,OAAO,YAGlB,CAAC;AAEF,eAAO,MAAM,eAAe,6BAM3B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/client/ModelContext.ts"],"sourcesContent":["import {\n createContext,\n tapContext,\n withContextProvider,\n Unsubscribe,\n} from \"@assistant-ui/tap\";\nimport { ModelContextProvider } from \"../model-context/ModelContextTypes\";\n\nexport type ModelContextRegistrar = ModelContextProvider & {\n register: (provider: ModelContextProvider) => Unsubscribe;\n};\n\nconst ModelContextContext = createContext<ModelContextRegistrar | null>(null);\n\nexport const withModelContextProvider = <TResult>(\n modelContext: ModelContextRegistrar,\n fn: () => TResult,\n) => {\n return withContextProvider(ModelContextContext, modelContext, fn);\n};\n\nexport const tapModelContext = () => {\n const modelContext = tapContext(ModelContextContext);\n if (!modelContext)\n throw new Error(\"Model context is not available in this context\");\n\n return modelContext;\n};\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAOP,IAAM,sBAAsB,cAA4C,IAAI;AAErE,IAAM,2BAA2B,CACtC,cACA,OACG;AACH,SAAO,oBAAoB,qBAAqB,cAAc,EAAE;AAClE;AAEO,IAAM,kBAAkB,MAAM;AACnC,QAAM,eAAe,WAAW,mBAAmB;AACnD,MAAI,CAAC;AACH,UAAM,IAAI,MAAM,gDAAgD;AAElE,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/client/ModelContext.ts"],"sourcesContent":["import {\n createContext,\n tapContext,\n withContextProvider,\n} from \"@assistant-ui/tap\";\nimport { ModelContextProvider } from \"../model-context/ModelContextTypes\";\nimport { Unsubscribe } from \"../types\";\n\nexport type ModelContextRegistrar = ModelContextProvider & {\n register: (provider: ModelContextProvider) => Unsubscribe;\n};\n\nconst ModelContextContext = createContext<ModelContextRegistrar | null>(null);\n\nexport const withModelContextProvider = <TResult>(\n modelContext: ModelContextRegistrar,\n fn: () => TResult,\n) => {\n return withContextProvider(ModelContextContext, modelContext, fn);\n};\n\nexport const tapModelContext = () => {\n const modelContext = tapContext(ModelContextContext);\n if (!modelContext)\n throw new Error(\"Model context is not available in this context\");\n\n return modelContext;\n};\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAQP,IAAM,sBAAsB,cAA4C,IAAI;AAErE,IAAM,2BAA2B,CACtC,cACA,OACG;AACH,SAAO,oBAAoB,qBAAqB,cAAc,EAAE;AAClE;AAEO,IAAM,kBAAkB,MAAM;AACnC,QAAM,eAAe,WAAW,mBAAmB;AACnD,MAAI,CAAC;AACH,UAAM,IAAI,MAAM,gDAAgD;AAElE,SAAO;AACT;","names":[]}
@@ -1,5 +1,5 @@
1
1
  import type { ModelContextApi } from "./types/ModelContext";
2
- export declare const ModelContext: import("@assistant-ui/tap").Resource<{
2
+ export declare const ModelContext: () => import("@assistant-ui/tap").ResourceElement<{
3
3
  key: string | undefined;
4
4
  state: any;
5
5
  api: ModelContextApi;
@@ -2,6 +2,7 @@ import { MessageClientApi } from "./types/Message";
2
2
  import { ThreadMessage } from "../types";
3
3
  export type ThreadMessageClientProps = {
4
4
  message: ThreadMessage;
5
+ index: number;
5
6
  isLast?: boolean;
6
7
  branchNumber?: number;
7
8
  branchCount?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadMessageClient.d.ts","sourceRoot":"","sources":["../../src/client/ThreadMessageClient.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAsB,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAIvE,OAAO,EAIL,aAAa,EACd,MAAM,UAAU,CAAC;AA8ClB,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AACF,eAAO,MAAM,mBAAmB;;;;4BA2F/B,CAAC"}
1
+ {"version":3,"file":"ThreadMessageClient.d.ts","sourceRoot":"","sources":["../../src/client/ThreadMessageClient.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAsB,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAIvE,OAAO,EAIL,aAAa,EACd,MAAM,UAAU,CAAC;AA8ClB,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,aAAa,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AACF,eAAO,MAAM,mBAAmB;;;;4BA6F/B,CAAC"}
@@ -52,6 +52,7 @@ var ThreadMessageAttachmentClient = resource(
52
52
  var ThreadMessageClient = resource(
53
53
  ({
54
54
  message,
55
+ index,
55
56
  isLast = true,
56
57
  branchNumber = 1,
57
58
  branchCount = 1
@@ -80,6 +81,7 @@ var ThreadMessageClient = resource(
80
81
  parts: parts.state,
81
82
  composer: composerState.state,
82
83
  parentId: null,
84
+ index,
83
85
  isLast,
84
86
  branchNumber,
85
87
  branchCount,
@@ -88,7 +90,7 @@ var ThreadMessageClient = resource(
88
90
  isCopied: isCopiedState,
89
91
  isHovering: isHoveringState
90
92
  };
91
- }, [message, isCopiedState, isHoveringState, isLast]);
93
+ }, [message, index, isCopiedState, isHoveringState, isLast]);
92
94
  return tapApi({
93
95
  getState: () => state,
94
96
  composer: composerState.api,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/client/ThreadMessageClient.tsx"],"sourcesContent":["\"use client\";\nimport {\n resource,\n tapMemo,\n tapState,\n tapInlineResource,\n} from \"@assistant-ui/tap\";\nimport { AttachmentClientApi } from \"./types/Attachment\";\nimport { MessageClientState, MessageClientApi } from \"./types/Message\";\nimport { MessagePartClientState, MessagePartClientApi } from \"./types/Part\";\nimport { tapLookupResources } from \"./util-hooks/tapLookupResources\";\nimport { tapApi } from \"../utils/tap-store\";\nimport {\n ThreadAssistantMessagePart,\n ThreadUserMessagePart,\n Attachment,\n ThreadMessage,\n} from \"../types\";\nimport { NoOpComposerClient } from \"./NoOpComposerClient\";\n\nconst ThreadMessagePartClient = resource(\n ({ part }: { part: ThreadAssistantMessagePart | ThreadUserMessagePart }) => {\n const state = tapMemo<MessagePartClientState>(() => {\n return {\n ...part,\n status: { type: \"complete\" },\n };\n }, [part]);\n\n return tapApi<MessagePartClientApi>(\n {\n getState: () => state,\n addToolResult: () => {\n throw new Error(\"Not supported\");\n },\n resumeToolCall: () => {\n throw new Error(\"Not supported\");\n },\n },\n {\n key:\n state.type === \"tool-call\"\n ? \"toolCallId-\" + state.toolCallId\n : undefined,\n },\n );\n },\n);\nconst ThreadMessageAttachmentClient = resource(\n ({ attachment }: { attachment: Attachment }) => {\n return tapApi<AttachmentClientApi>(\n {\n getState: () => attachment,\n remove: () => {\n throw new Error(\"Not supported\");\n },\n },\n {\n key: attachment.id,\n },\n );\n },\n);\nexport type ThreadMessageClientProps = {\n message: ThreadMessage;\n isLast?: boolean;\n branchNumber?: number;\n branchCount?: number;\n};\nexport const ThreadMessageClient = resource(\n ({\n message,\n isLast = true,\n branchNumber = 1,\n branchCount = 1,\n }: ThreadMessageClientProps) => {\n const [isCopiedState, setIsCopied] = tapState(false);\n const [isHoveringState, setIsHovering] = tapState(false);\n\n const parts = tapLookupResources(\n message.content.map((_, idx) =>\n ThreadMessagePartClient({ part: message.content[idx]! }, { key: idx }),\n ),\n );\n\n const attachments = tapLookupResources(\n message.attachments?.map((_, idx) =>\n ThreadMessageAttachmentClient(\n { attachment: message.attachments![idx]! },\n { key: idx },\n ),\n ) ?? [],\n );\n\n const composerState = tapInlineResource(\n NoOpComposerClient({ type: \"edit\" }),\n );\n\n const state = tapMemo<MessageClientState>(() => {\n return {\n ...message,\n parts: parts.state,\n composer: composerState.state,\n parentId: null,\n isLast,\n branchNumber,\n branchCount,\n speech: undefined,\n submittedFeedback: message.metadata.submittedFeedback,\n isCopied: isCopiedState,\n isHovering: isHoveringState,\n };\n }, [message, isCopiedState, isHoveringState, isLast]);\n\n return tapApi<MessageClientApi>({\n getState: () => state,\n composer: composerState.api,\n part: (selector) => {\n if (\"index\" in selector) {\n return parts.api({ index: selector.index });\n } else {\n return parts.api({ key: \"toolCallId-\" + selector.toolCallId });\n }\n },\n attachment: (selector) => {\n if (\"id\" in selector) {\n return attachments.api({ key: selector.id });\n } else {\n return attachments.api(selector);\n }\n },\n reload: () => {\n throw new Error(\"Not supported in ThreadMessageProvider\");\n },\n speak: () => {\n throw new Error(\"Not supported in ThreadMessageProvider\");\n },\n stopSpeaking: () => {\n throw new Error(\"Not supported in ThreadMessageProvider\");\n },\n submitFeedback: () => {\n throw new Error(\"Not supported in ThreadMessageProvider\");\n },\n switchToBranch: () => {\n throw new Error(\"Not supported in ThreadMessageProvider\");\n },\n getCopyText: () => {\n return message.content\n .map((part) => {\n if (\"text\" in part && typeof part.text === \"string\") {\n return part.text;\n }\n return \"\";\n })\n .join(\"\\n\");\n },\n setIsCopied,\n setIsHovering,\n });\n },\n);\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/client/ThreadMessageClient.tsx"],"sourcesContent":["\"use client\";\nimport {\n resource,\n tapMemo,\n tapState,\n tapInlineResource,\n} from \"@assistant-ui/tap\";\nimport { AttachmentClientApi } from \"./types/Attachment\";\nimport { MessageClientState, MessageClientApi } from \"./types/Message\";\nimport { MessagePartClientState, MessagePartClientApi } from \"./types/Part\";\nimport { tapLookupResources } from \"./util-hooks/tapLookupResources\";\nimport { tapApi } from \"../utils/tap-store\";\nimport {\n ThreadAssistantMessagePart,\n ThreadUserMessagePart,\n Attachment,\n ThreadMessage,\n} from \"../types\";\nimport { NoOpComposerClient } from \"./NoOpComposerClient\";\n\nconst ThreadMessagePartClient = resource(\n ({ part }: { part: ThreadAssistantMessagePart | ThreadUserMessagePart }) => {\n const state = tapMemo<MessagePartClientState>(() => {\n return {\n ...part,\n status: { type: \"complete\" },\n };\n }, [part]);\n\n return tapApi<MessagePartClientApi>(\n {\n getState: () => state,\n addToolResult: () => {\n throw new Error(\"Not supported\");\n },\n resumeToolCall: () => {\n throw new Error(\"Not supported\");\n },\n },\n {\n key:\n state.type === \"tool-call\"\n ? \"toolCallId-\" + state.toolCallId\n : undefined,\n },\n );\n },\n);\nconst ThreadMessageAttachmentClient = resource(\n ({ attachment }: { attachment: Attachment }) => {\n return tapApi<AttachmentClientApi>(\n {\n getState: () => attachment,\n remove: () => {\n throw new Error(\"Not supported\");\n },\n },\n {\n key: attachment.id,\n },\n );\n },\n);\nexport type ThreadMessageClientProps = {\n message: ThreadMessage;\n index: number;\n isLast?: boolean;\n branchNumber?: number;\n branchCount?: number;\n};\nexport const ThreadMessageClient = resource(\n ({\n message,\n index,\n isLast = true,\n branchNumber = 1,\n branchCount = 1,\n }: ThreadMessageClientProps) => {\n const [isCopiedState, setIsCopied] = tapState(false);\n const [isHoveringState, setIsHovering] = tapState(false);\n\n const parts = tapLookupResources(\n message.content.map((_, idx) =>\n ThreadMessagePartClient({ part: message.content[idx]! }, { key: idx }),\n ),\n );\n\n const attachments = tapLookupResources(\n message.attachments?.map((_, idx) =>\n ThreadMessageAttachmentClient(\n { attachment: message.attachments![idx]! },\n { key: idx },\n ),\n ) ?? [],\n );\n\n const composerState = tapInlineResource(\n NoOpComposerClient({ type: \"edit\" }),\n );\n\n const state = tapMemo<MessageClientState>(() => {\n return {\n ...message,\n parts: parts.state,\n composer: composerState.state,\n parentId: null,\n index,\n isLast,\n branchNumber,\n branchCount,\n speech: undefined,\n submittedFeedback: message.metadata.submittedFeedback,\n isCopied: isCopiedState,\n isHovering: isHoveringState,\n };\n }, [message, index, isCopiedState, isHoveringState, isLast]);\n\n return tapApi<MessageClientApi>({\n getState: () => state,\n composer: composerState.api,\n part: (selector) => {\n if (\"index\" in selector) {\n return parts.api({ index: selector.index });\n } else {\n return parts.api({ key: \"toolCallId-\" + selector.toolCallId });\n }\n },\n attachment: (selector) => {\n if (\"id\" in selector) {\n return attachments.api({ key: selector.id });\n } else {\n return attachments.api(selector);\n }\n },\n reload: () => {\n throw new Error(\"Not supported in ThreadMessageProvider\");\n },\n speak: () => {\n throw new Error(\"Not supported in ThreadMessageProvider\");\n },\n stopSpeaking: () => {\n throw new Error(\"Not supported in ThreadMessageProvider\");\n },\n submitFeedback: () => {\n throw new Error(\"Not supported in ThreadMessageProvider\");\n },\n switchToBranch: () => {\n throw new Error(\"Not supported in ThreadMessageProvider\");\n },\n getCopyText: () => {\n return message.content\n .map((part) => {\n if (\"text\" in part && typeof part.text === \"string\") {\n return part.text;\n }\n return \"\";\n })\n .join(\"\\n\");\n },\n setIsCopied,\n setIsHovering,\n });\n },\n);\n"],"mappings":"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","names":[]}
@@ -21,6 +21,8 @@ export type MessageClientState = ThreadMessage & {
21
21
  readonly parts: readonly MessagePartClientState[];
22
22
  readonly isCopied: boolean;
23
23
  readonly isHovering: boolean;
24
+ /** The position of this message in the thread (0 for first message) */
25
+ readonly index: number;
24
26
  };
25
27
  export type MessageClientApi = {
26
28
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Message.d.ts","sourceRoot":"","sources":["../../../src/client/types/Message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,QAAQ,CAAC;AAEtE,OAAO,EACL,WAAW,EACX,iBAAiB,EAClB,MAAM,2DAA2D,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG;IAC/C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IACzC;;OAEG;IACH,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAE1D,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAElD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IACH,QAAQ,IAAI,kBAAkB,CAAC;IAE/B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IAErC,MAAM,CAAC,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,SAAS,CAAA;KAAE,GAAG,IAAI,CAAC;IACjD;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;IACd;;OAEG;IACH,YAAY,IAAI,IAAI,CAAC;IACrB,cAAc,CAAC,QAAQ,EAAE;QAAE,IAAI,EAAE,UAAU,GAAG,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;IAClE,cAAc,CAAC,OAAO,EAAE;QACtB,QAAQ,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;QAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI,CAAC;IACT,WAAW,IAAI,MAAM,CAAC;IAEtB,IAAI,EAAE,CACJ,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,KACjD,oBAAoB,CAAC;IAC1B,UAAU,CAAC,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,mBAAmB,CAAC;IAE9E,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CAIrC,CAAC"}
1
+ {"version":3,"file":"Message.d.ts","sourceRoot":"","sources":["../../../src/client/types/Message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,QAAQ,CAAC;AAEtE,OAAO,EACL,WAAW,EACX,iBAAiB,EAClB,MAAM,2DAA2D,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG;IAC/C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IACzC;;OAEG;IACH,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAE1D,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAElD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAE7B,uEAAuE;IACvE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IACH,QAAQ,IAAI,kBAAkB,CAAC;IAE/B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IAErC,MAAM,CAAC,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,SAAS,CAAA;KAAE,GAAG,IAAI,CAAC;IACjD;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;IACd;;OAEG;IACH,YAAY,IAAI,IAAI,CAAC;IACrB,cAAc,CAAC,QAAQ,EAAE;QAAE,IAAI,EAAE,UAAU,GAAG,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;IAClE,cAAc,CAAC,OAAO,EAAE;QACtB,QAAQ,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;QAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI,CAAC;IACT,WAAW,IAAI,MAAM,CAAC;IAEtB,IAAI,EAAE,CACJ,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,KACjD,oBAAoB,CAAC;IAC1B,UAAU,CAAC,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,mBAAmB,CAAC;IAE9E,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CAIrC,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { Unsubscribe } from "@assistant-ui/tap";
1
+ import type { Unsubscribe } from "../../types";
2
2
  import type { ModelContextProvider } from "../../model-context/ModelContextTypes";
3
3
  export type ModelContextState = {};
4
4
  export type ModelContextApi = ModelContextProvider & {
@@ -1 +1 @@
1
- {"version":3,"file":"ModelContext.d.ts","sourceRoot":"","sources":["../../../src/client/types/ModelContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAGlF,MAAM,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEnC,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG;IACnD,QAAQ,IAAI,iBAAiB,CAAC;IAC9B,QAAQ,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,WAAW,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC9B,CAAC"}
1
+ {"version":3,"file":"ModelContext.d.ts","sourceRoot":"","sources":["../../../src/client/types/ModelContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAGlF,MAAM,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEnC,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG;IACnD,QAAQ,IAAI,iBAAiB,CAAC;IAC9B,QAAQ,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,WAAW,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC9B,CAAC"}
@@ -1,5 +1,4 @@
1
- import { Unsubscribe } from "@assistant-ui/tap";
2
- import { ToolCallMessagePartComponent } from "../../types";
1
+ import { ToolCallMessagePartComponent, Unsubscribe } from "../../types";
3
2
  export type ToolsState = {
4
3
  tools: Record<string, ToolCallMessagePartComponent[]>;
5
4
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Tools.d.ts","sourceRoot":"","sources":["../../../src/client/types/Tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,4BAA4B,EAAE,CAAC,CAAC;CACvD,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,IAAI,UAAU,CAAC;IAEvB,SAAS,CACP,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,4BAA4B,GACnC,WAAW,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC9B,CAAC"}
1
+ {"version":3,"file":"Tools.d.ts","sourceRoot":"","sources":["../../../src/client/types/Tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAExE,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,4BAA4B,EAAE,CAAC,CAAC;CACvD,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,IAAI,UAAU,CAAC;IAEvB,SAAS,CACP,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,4BAA4B,GACnC,WAAW,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC9B,CAAC"}
@@ -1,3 +1,7 @@
1
1
  import type { FC, PropsWithChildren } from "react";
2
- export declare const ThreadViewportProvider: FC<PropsWithChildren>;
2
+ import { type ThreadViewportStoreOptions } from "../stores/ThreadViewport";
3
+ export type ThreadViewportProviderProps = PropsWithChildren<{
4
+ options?: ThreadViewportStoreOptions;
5
+ }>;
6
+ export declare const ThreadPrimitiveViewportProvider: FC<ThreadViewportProviderProps>;
3
7
  //# sourceMappingURL=ThreadViewportProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadViewportProvider.d.ts","sourceRoot":"","sources":["../../../src/context/providers/ThreadViewportProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAgCnD,eAAO,MAAM,sBAAsB,EAAE,EAAE,CAAC,iBAAiB,CAcxD,CAAC"}
1
+ {"version":3,"file":"ThreadViewportProvider.d.ts","sourceRoot":"","sources":["../../../src/context/providers/ThreadViewportProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,EAEL,KAAK,0BAA0B,EAChC,MAAM,0BAA0B,CAAC;AAQlC,MAAM,MAAM,2BAA2B,GAAG,iBAAiB,CAAC;IAC1D,OAAO,CAAC,EAAE,0BAA0B,CAAC;CACtC,CAAC,CAAC;AAqCH,eAAO,MAAM,+BAA+B,EAAE,EAAE,CAC9C,2BAA2B,CAe5B,CAAC"}
@@ -2,16 +2,18 @@
2
2
 
3
3
  // src/context/providers/ThreadViewportProvider.tsx
4
4
  import { useEffect, useState } from "react";
5
- import { makeThreadViewportStore } from "../stores/ThreadViewport.js";
5
+ import {
6
+ makeThreadViewportStore
7
+ } from "../stores/ThreadViewport.js";
6
8
  import {
7
9
  ThreadViewportContext,
8
10
  useThreadViewportStore
9
11
  } from "../react/ThreadViewportContext.js";
10
12
  import { writableStore } from "../ReadonlyStore.js";
11
13
  import { jsx } from "react/jsx-runtime";
12
- var useThreadViewportStoreValue = () => {
14
+ var useThreadViewportStoreValue = (options) => {
13
15
  const outerViewport = useThreadViewportStore({ optional: true });
14
- const [store] = useState(() => makeThreadViewportStore());
16
+ const [store] = useState(() => makeThreadViewportStore(options));
15
17
  useEffect(() => {
16
18
  return outerViewport?.getState().onScrollToBottom(() => {
17
19
  store.getState().scrollToBottom();
@@ -25,10 +27,19 @@ var useThreadViewportStoreValue = () => {
25
27
  }
26
28
  });
27
29
  }, [store, outerViewport]);
30
+ useEffect(() => {
31
+ const nextState = {
32
+ turnAnchor: options.turnAnchor ?? "bottom"
33
+ };
34
+ const currentState = store.getState();
35
+ if (currentState.turnAnchor !== nextState.turnAnchor) {
36
+ writableStore(store).setState(nextState);
37
+ }
38
+ }, [store, options.turnAnchor]);
28
39
  return store;
29
40
  };
30
- var ThreadViewportProvider = ({ children }) => {
31
- const useThreadViewport = useThreadViewportStoreValue();
41
+ var ThreadPrimitiveViewportProvider = ({ children, options = {} }) => {
42
+ const useThreadViewport = useThreadViewportStoreValue(options);
32
43
  const [context] = useState(() => {
33
44
  return {
34
45
  useThreadViewport
@@ -37,6 +48,6 @@ var ThreadViewportProvider = ({ children }) => {
37
48
  return /* @__PURE__ */ jsx(ThreadViewportContext.Provider, { value: context, children });
38
49
  };
39
50
  export {
40
- ThreadViewportProvider
51
+ ThreadPrimitiveViewportProvider
41
52
  };
42
53
  //# sourceMappingURL=ThreadViewportProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/context/providers/ThreadViewportProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport type { FC, PropsWithChildren } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { makeThreadViewportStore } from \"../stores/ThreadViewport\";\nimport {\n ThreadViewportContext,\n ThreadViewportContextValue,\n useThreadViewportStore,\n} from \"../react/ThreadViewportContext\";\nimport { writableStore } from \"../ReadonlyStore\";\n\nconst useThreadViewportStoreValue = () => {\n const outerViewport = useThreadViewportStore({ optional: true });\n const [store] = useState(() => makeThreadViewportStore());\n\n useEffect(() => {\n return outerViewport?.getState().onScrollToBottom(() => {\n store.getState().scrollToBottom();\n });\n }, [outerViewport, store]);\n\n useEffect(() => {\n if (!outerViewport) return;\n return store.subscribe((state) => {\n if (outerViewport.getState().isAtBottom !== state.isAtBottom) {\n writableStore(outerViewport).setState({ isAtBottom: state.isAtBottom });\n }\n });\n }, [store, outerViewport]);\n\n return store;\n};\n\nexport const ThreadViewportProvider: FC<PropsWithChildren> = ({ children }) => {\n const useThreadViewport = useThreadViewportStoreValue();\n\n const [context] = useState<ThreadViewportContextValue>(() => {\n return {\n useThreadViewport,\n };\n });\n\n return (\n <ThreadViewportContext.Provider value={context}>\n {children}\n </ThreadViewportContext.Provider>\n );\n};\n"],"mappings":";;;AAGA,SAAS,WAAW,gBAAgB;AACpC,SAAS,+BAA+B;AACxC;AAAA,EACE;AAAA,EAEA;AAAA,OACK;AACP,SAAS,qBAAqB;AAkC1B;AAhCJ,IAAM,8BAA8B,MAAM;AACxC,QAAM,gBAAgB,uBAAuB,EAAE,UAAU,KAAK,CAAC;AAC/D,QAAM,CAAC,KAAK,IAAI,SAAS,MAAM,wBAAwB,CAAC;AAExD,YAAU,MAAM;AACd,WAAO,eAAe,SAAS,EAAE,iBAAiB,MAAM;AACtD,YAAM,SAAS,EAAE,eAAe;AAAA,IAClC,CAAC;AAAA,EACH,GAAG,CAAC,eAAe,KAAK,CAAC;AAEzB,YAAU,MAAM;AACd,QAAI,CAAC,cAAe;AACpB,WAAO,MAAM,UAAU,CAAC,UAAU;AAChC,UAAI,cAAc,SAAS,EAAE,eAAe,MAAM,YAAY;AAC5D,sBAAc,aAAa,EAAE,SAAS,EAAE,YAAY,MAAM,WAAW,CAAC;AAAA,MACxE;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,OAAO,aAAa,CAAC;AAEzB,SAAO;AACT;AAEO,IAAM,yBAAgD,CAAC,EAAE,SAAS,MAAM;AAC7E,QAAM,oBAAoB,4BAA4B;AAEtD,QAAM,CAAC,OAAO,IAAI,SAAqC,MAAM;AAC3D,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF,CAAC;AAED,SACE,oBAAC,sBAAsB,UAAtB,EAA+B,OAAO,SACpC,UACH;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/context/providers/ThreadViewportProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport type { FC, PropsWithChildren } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport {\n makeThreadViewportStore,\n type ThreadViewportStoreOptions,\n} from \"../stores/ThreadViewport\";\nimport {\n ThreadViewportContext,\n ThreadViewportContextValue,\n useThreadViewportStore,\n} from \"../react/ThreadViewportContext\";\nimport { writableStore } from \"../ReadonlyStore\";\n\nexport type ThreadViewportProviderProps = PropsWithChildren<{\n options?: ThreadViewportStoreOptions;\n}>;\n\nconst useThreadViewportStoreValue = (options: ThreadViewportStoreOptions) => {\n const outerViewport = useThreadViewportStore({ optional: true });\n const [store] = useState(() => makeThreadViewportStore(options));\n\n // Forward scrollToBottom from outer viewport to inner viewport\n useEffect(() => {\n return outerViewport?.getState().onScrollToBottom(() => {\n store.getState().scrollToBottom();\n });\n }, [outerViewport, store]);\n\n useEffect(() => {\n if (!outerViewport) return;\n return store.subscribe((state) => {\n if (outerViewport.getState().isAtBottom !== state.isAtBottom) {\n writableStore(outerViewport).setState({ isAtBottom: state.isAtBottom });\n }\n });\n }, [store, outerViewport]);\n\n // Sync options to store when they change\n useEffect(() => {\n const nextState = {\n turnAnchor: options.turnAnchor ?? \"bottom\",\n };\n\n const currentState = store.getState();\n if (currentState.turnAnchor !== nextState.turnAnchor) {\n writableStore(store).setState(nextState);\n }\n }, [store, options.turnAnchor]);\n\n return store;\n};\n\nexport const ThreadPrimitiveViewportProvider: FC<\n ThreadViewportProviderProps\n> = ({ children, options = {} }) => {\n const useThreadViewport = useThreadViewportStoreValue(options);\n\n const [context] = useState<ThreadViewportContextValue>(() => {\n return {\n useThreadViewport,\n };\n });\n\n return (\n <ThreadViewportContext.Provider value={context}>\n {children}\n </ThreadViewportContext.Provider>\n );\n};\n"],"mappings":";;;AAGA,SAAS,WAAW,gBAAgB;AACpC;AAAA,EACE;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EAEA;AAAA,OACK;AACP,SAAS,qBAAqB;AAqD1B;AA/CJ,IAAM,8BAA8B,CAAC,YAAwC;AAC3E,QAAM,gBAAgB,uBAAuB,EAAE,UAAU,KAAK,CAAC;AAC/D,QAAM,CAAC,KAAK,IAAI,SAAS,MAAM,wBAAwB,OAAO,CAAC;AAG/D,YAAU,MAAM;AACd,WAAO,eAAe,SAAS,EAAE,iBAAiB,MAAM;AACtD,YAAM,SAAS,EAAE,eAAe;AAAA,IAClC,CAAC;AAAA,EACH,GAAG,CAAC,eAAe,KAAK,CAAC;AAEzB,YAAU,MAAM;AACd,QAAI,CAAC,cAAe;AACpB,WAAO,MAAM,UAAU,CAAC,UAAU;AAChC,UAAI,cAAc,SAAS,EAAE,eAAe,MAAM,YAAY;AAC5D,sBAAc,aAAa,EAAE,SAAS,EAAE,YAAY,MAAM,WAAW,CAAC;AAAA,MACxE;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,OAAO,aAAa,CAAC;AAGzB,YAAU,MAAM;AACd,UAAM,YAAY;AAAA,MAChB,YAAY,QAAQ,cAAc;AAAA,IACpC;AAEA,UAAM,eAAe,MAAM,SAAS;AACpC,QAAI,aAAa,eAAe,UAAU,YAAY;AACpD,oBAAc,KAAK,EAAE,SAAS,SAAS;AAAA,IACzC;AAAA,EACF,GAAG,CAAC,OAAO,QAAQ,UAAU,CAAC;AAE9B,SAAO;AACT;AAEO,IAAM,kCAET,CAAC,EAAE,UAAU,UAAU,CAAC,EAAE,MAAM;AAClC,QAAM,oBAAoB,4BAA4B,OAAO;AAE7D,QAAM,CAAC,OAAO,IAAI,SAAqC,MAAM;AAC3D,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF,CAAC;AAED,SACE,oBAAC,sBAAsB,UAAtB,EAA+B,OAAO,SACpC,UACH;AAEJ;","names":[]}
@@ -5,7 +5,7 @@ import { MessagePartClientApi, MessagePartClientState } from "../../client/types
5
5
  import { ThreadClientApi, ThreadClientState } from "../../client/types/Thread";
6
6
  import { ComposerClientApi, ComposerClientState } from "../../client/types/Composer";
7
7
  import { AttachmentClientApi, AttachmentClientState } from "../../client/types/Attachment";
8
- import { Unsubscribe } from "@assistant-ui/tap";
8
+ import { Unsubscribe } from "../../types";
9
9
  import { AssistantEvent, AssistantEventCallback, AssistantEventSelector } from "../../types/EventTypes";
10
10
  import { ThreadListClientApi, ThreadListClientState } from "../../client/types/ThreadList";
11
11
  import { AssistantClientProps } from "../../client/AssistantClient";
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantApiContext.d.ts","sourceRoot":"","sources":["../../../src/context/react/AssistantApiContext.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AssistantApiContext.d.ts","sourceRoot":"","sources":["../../../src/context/react/AssistantApiContext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,EAAE,EACF,iBAAiB,EAIlB,MAAM,OAAO,CAAC;AAGf,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EAC1B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EAEvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,oBAAoB,EAErB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EACL,eAAe,EACf,gBAAgB,EACjB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAEL,kBAAkB,EACnB,MAAM,sCAAsC,CAAC;AAE9C,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAE3B,QAAQ,CAAC,cAAc,EAAE,yBAAyB,CAAC;IACnD,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAC3B,IAAI,EACJ,KAAK,SAAS;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,GAAG,CAAA;CAAE,IACjD,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;CAAE,CAAC,CAAC;AAG5E,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC9B,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EACD;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,GACnD;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAChB;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CAChC,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACzB,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC9B,CAAC;AAEF,KAAK,WAAW,GACZ;IACE,MAAM,EAAE,QAAQ,CAAC;IACjB,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACzC,GACD;IACE,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC9B,CAAC;AAEN,KAAK,QAAQ,GAAG;IACd,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CACjE,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,MAAM,EAAE,SAAS,GAAG,UAAU,CAAC;IAC/B,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,iBAAiB,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;IAC7D,KAAK,EAAE,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC9C,YAAY,EAAE,iBAAiB,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;IACnE,cAAc,EAAE,iBAAiB,CAC/B,uBAAuB,EACvB,kBAAkB,CACnB,CAAC;IACF,MAAM,EAAE,iBAAiB,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IACvD,QAAQ,EAAE,iBAAiB,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;IAC7D,OAAO,EAAE,iBAAiB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;IAC1D,IAAI,EAAE,iBAAiB,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;IACxD,UAAU,EAAE,iBAAiB,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;IAEnE,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW,CAAC;IAC7C,SAAS,IAAI,IAAI,CAAC;IAElB,EAAE,CAAC,MAAM,SAAS,cAAc,EAC9B,KAAK,EAAE,sBAAsB,CAAC,MAAM,CAAC,EACrC,QAAQ,EAAE,sBAAsB,CAAC,MAAM,CAAC,GACvC,WAAW,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,IAAI,EACJ,KAAK,SAAS;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,GAAG,CAAA;CAAE,EAEzC,QAAQ;IACN,GAAG,EAAE,MAAM,IAAI,CAAC;CACjB,GAAG,CAAC,KAAK,GAAG;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;CAAE,CAAC,KAC3D,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAK/B,CAAC;AAyFF,eAAO,MAAM,mBAAmB,QAAO,YAEtC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,uBAAuB,GAClC,QAAQ,kBAAkB,KACzB,YAIF,CAAC;AAQF,wBAAgB,eAAe,IAAI,YAAY,CAAC;AAChD,wBAAgB,eAAe,CAAC,MAAM,EAAE,oBAAoB,GAAG,YAAY,CAAC;AA0C5E,eAAO,MAAM,SAAS,GACpB,KAAK,YAAY,EACjB,MAAM,OAAO,CAAC,YAAY,CAAC,KAC1B,YAYF,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,EAAE,CAChC,iBAAiB,CAAC;IAAE,GAAG,EAAE,YAAY,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAYpE,CAAC"}
@@ -11,7 +11,6 @@ import { useResource } from "@assistant-ui/tap/react";
11
11
  import {
12
12
  normalizeEventSelector
13
13
  } from "../../types/EventTypes.js";
14
- import { ThreadViewportProvider } from "../providers/ThreadViewportProvider.js";
15
14
  import { DevToolsProviderApi } from "../../devtools/DevToolsHooks.js";
16
15
  import {
17
16
  useAssistantClient
@@ -167,7 +166,7 @@ var AssistantProvider = ({ api, children, devToolsVisible = true }) => {
167
166
  if (!devToolsVisible || !api.subscribe) return void 0;
168
167
  return DevToolsProviderApi.register(api);
169
168
  }, [api, devToolsVisible]);
170
- return /* @__PURE__ */ jsx(AssistantApiContext.Provider, { value: api, children: /* @__PURE__ */ jsx(ThreadViewportProvider, { children }) });
169
+ return /* @__PURE__ */ jsx(AssistantApiContext.Provider, { value: api, children });
171
170
  };
172
171
  export {
173
172
  AssistantProvider,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/context/react/AssistantApiContext.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n FC,\n PropsWithChildren,\n useContext,\n useMemo,\n useEffect,\n} from \"react\";\nimport { useResource } from \"@assistant-ui/tap/react\";\n\nimport {\n MessageClientApi,\n MessageClientState,\n} from \"../../client/types/Message\";\nimport {\n ThreadListItemClientApi,\n ThreadListItemClientState,\n} from \"../../client/types/ThreadListItem\";\nimport {\n MessagePartClientApi,\n MessagePartClientState,\n} from \"../../client/types/Part\";\nimport { ThreadClientApi, ThreadClientState } from \"../../client/types/Thread\";\nimport {\n ComposerClientApi,\n ComposerClientState,\n} from \"../../client/types/Composer\";\nimport {\n AttachmentClientApi,\n AttachmentClientState,\n} from \"../../client/types/Attachment\";\nimport { Unsubscribe } from \"@assistant-ui/tap\";\nimport {\n AssistantEvent,\n AssistantEventCallback,\n AssistantEventSelector,\n normalizeEventSelector,\n} from \"../../types/EventTypes\";\nimport {\n ThreadListClientApi,\n ThreadListClientState,\n} from \"../../client/types/ThreadList\";\nimport { ThreadViewportProvider } from \"../providers/ThreadViewportProvider\";\nimport { DevToolsProviderApi } from \"../../devtools/DevToolsHooks\";\nimport {\n AssistantClientProps,\n useAssistantClient,\n} from \"../../client/AssistantClient\";\nimport { ToolsApi, ToolsMeta, ToolsState } from \"../../client/types/Tools\";\nimport {\n ModelContextApi,\n ModelContextMeta,\n} from \"../../client/types/ModelContext\";\nimport {\n DerivedScopes,\n DerivedScopesInput,\n} from \"../../utils/tap-store/derived-scopes\";\n\nexport type AssistantState = {\n readonly threads: ThreadListClientState;\n readonly tools: ToolsState;\n\n readonly threadListItem: ThreadListItemClientState;\n readonly thread: ThreadClientState;\n readonly composer: ComposerClientState;\n readonly message: MessageClientState;\n readonly part: MessagePartClientState;\n readonly attachment: AttachmentClientState;\n};\n\nexport type AssistantApiField<\n TApi,\n TMeta extends { source: string | null; query: any },\n> = (() => TApi) & (TMeta | { source: null; query: Record<string, never> });\n\n// Meta types for each API method\ntype ThreadsMeta = {\n source: \"root\";\n query: Record<string, never>;\n};\n\ntype ThreadListItemMeta = {\n source: \"threads\";\n query:\n | { type: \"index\"; index: number; archived: boolean }\n | { type: \"main\" }\n | { type: \"id\"; id: string };\n};\n\ntype ThreadMeta = {\n source: \"threads\";\n query: { type: \"main\" };\n};\n\ntype ComposerMeta = {\n source: \"message\" | \"thread\";\n query: Record<string, never>;\n};\n\ntype MessageMeta =\n | {\n source: \"thread\";\n query: { type: \"index\"; index: number };\n }\n | {\n source: \"root\";\n query: Record<string, never>;\n };\n\ntype PartMeta = {\n source: \"message\" | \"root\";\n query: { type: \"index\"; index: number } | Record<string, never>;\n};\n\ntype AttachmentMeta = {\n source: \"message\" | \"composer\";\n query: { type: \"index\"; index: number };\n};\n\nexport type AssistantApi = {\n threads: AssistantApiField<ThreadListClientApi, ThreadsMeta>;\n tools: AssistantApiField<ToolsApi, ToolsMeta>;\n modelContext: AssistantApiField<ModelContextApi, ModelContextMeta>;\n threadListItem: AssistantApiField<\n ThreadListItemClientApi,\n ThreadListItemMeta\n >;\n thread: AssistantApiField<ThreadClientApi, ThreadMeta>;\n composer: AssistantApiField<ComposerClientApi, ComposerMeta>;\n message: AssistantApiField<MessageClientApi, MessageMeta>;\n part: AssistantApiField<MessagePartClientApi, PartMeta>;\n attachment: AssistantApiField<AttachmentClientApi, AttachmentMeta>;\n\n subscribe(listener: () => void): Unsubscribe;\n flushSync(): void;\n\n on<TEvent extends AssistantEvent>(\n event: AssistantEventSelector<TEvent>,\n callback: AssistantEventCallback<TEvent>,\n ): Unsubscribe;\n};\n\nexport const createAssistantApiField = <\n TApi,\n TMeta extends { source: any; query: any },\n>(\n config: {\n get: () => TApi;\n } & (TMeta | { source: null; query: Record<string, never> }),\n): AssistantApiField<TApi, TMeta> => {\n const fn = config.get as AssistantApiField<TApi, TMeta>;\n fn.source = config.source;\n fn.query = config.query;\n return fn;\n};\n\nconst NO_OP_FN = () => () => {};\n\nconst AssistantApiContext = createContext<AssistantApi>({\n threads: createAssistantApiField({\n source: null,\n query: {},\n get: () => {\n throw new Error(\"Threads is only available inside <AssistantProvider />\");\n },\n }),\n tools: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\"Tools is only available inside <AssistantProvider />\");\n },\n }),\n modelContext: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"ModelContext is only available inside <AssistantProvider />\",\n );\n },\n }),\n threadListItem: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"ThreadListItem is only available inside <AssistantProvider />\",\n );\n },\n }),\n thread: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\"Thread is only available inside <AssistantProvider />\");\n },\n }),\n composer: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"Composer is only available inside <AssistantProvider />\",\n );\n },\n }),\n message: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"Message is only available inside <ThreadPrimitive.Messages />\",\n );\n },\n }),\n part: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"Part is only available inside <MessagePrimitive.Parts />\",\n );\n },\n }),\n attachment: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"Attachment is only available inside <MessagePrimitive.Attachments /> or <ComposerPrimitive.Attachments />\",\n );\n },\n }),\n\n subscribe: NO_OP_FN,\n flushSync: NO_OP_FN,\n on: (selector) => {\n const { scope } = normalizeEventSelector(selector);\n throw new Error(`Event scope is not available in this component: ${scope}`);\n },\n});\n\nexport const useAssistantApiImpl = (): AssistantApi => {\n return useContext(AssistantApiContext);\n};\n\n/**\n * Hook to extend the current AssistantApi with additional derived scope fields and special callbacks.\n * This merges the derived fields with the existing API from context.\n * Fields are automatically memoized based on source and query changes.\n * Special callbacks (on, subscribe, flushSync) use the useEffectEvent pattern to always access latest values.\n *\n * @param scopes - Record of field names to DerivedScope resource elements, plus optional special callbacks\n * @returns The merged AssistantApi\n *\n * @example\n * ```tsx\n * const api = useExtendedAssistantApi({\n * message: DerivedScope({\n * source: \"root\",\n * query: {},\n * get: () => messageApi,\n * }),\n * on: (selector, callback) => {\n * // Custom event filtering logic\n * },\n * });\n * ```\n */\nexport const useExtendedAssistantApi = (\n scopes: DerivedScopesInput,\n): AssistantApi => {\n const baseApi = useAssistantApiImpl();\n const partialApi = useResource(DerivedScopes(scopes));\n return useMemo(() => extendApi(baseApi, partialApi), [baseApi, partialApi]);\n};\n\nconst useExtendedAssistantApiImpl = (\n config: AssistantClientProps,\n): AssistantApi => {\n return useAssistantClient(config);\n};\n\nexport function useAssistantApi(): AssistantApi;\nexport function useAssistantApi(config: AssistantClientProps): AssistantApi;\nexport function useAssistantApi(config?: AssistantClientProps): AssistantApi {\n if (config) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useExtendedAssistantApiImpl(config);\n } else {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useAssistantApiImpl();\n }\n}\n\nconst mergeFns = <TArgs extends Array<unknown>>(\n fn1: (...args: TArgs) => void,\n fn2: (...args: TArgs) => void,\n) => {\n if (fn1 === NO_OP_FN) return fn2;\n if (fn2 === NO_OP_FN) return fn1;\n\n return (...args: TArgs) => {\n fn1(...args);\n fn2(...args);\n };\n};\n\nconst mergeFnsWithUnsubscribe = <TArgs extends Array<unknown>>(\n fn1: (...args: TArgs) => Unsubscribe,\n fn2: (...args: TArgs) => Unsubscribe,\n) => {\n if (fn1 === NO_OP_FN) return fn2;\n if (fn2 === NO_OP_FN) return fn1;\n\n return (...args: TArgs) => {\n const unsubscribe1 = fn1(...args);\n const unsubscribe2 = fn2(...args);\n\n return () => {\n unsubscribe1();\n unsubscribe2();\n };\n };\n};\n\nexport const extendApi = (\n api: AssistantApi,\n api2: Partial<AssistantApi>,\n): AssistantApi => {\n const api2Subscribe = api2.subscribe;\n const api2FlushSync = api2.flushSync;\n return {\n ...api,\n ...api2,\n subscribe: mergeFnsWithUnsubscribe(\n api.subscribe,\n api2Subscribe ?? NO_OP_FN,\n ),\n flushSync: mergeFns(api.flushSync, api2FlushSync ?? NO_OP_FN),\n };\n};\n\nexport const AssistantProvider: FC<\n PropsWithChildren<{ api: AssistantApi; devToolsVisible?: boolean }>\n> = ({ api, children, devToolsVisible = true }) => {\n useEffect(() => {\n if (!devToolsVisible || !api.subscribe) return undefined;\n return DevToolsProviderApi.register(api);\n }, [api, devToolsVisible]);\n\n return (\n <AssistantApiContext.Provider value={api}>\n {/* TODO temporarily allow accessing viewport state from outside the viewport */}\n {/* TODO figure out if this behavior should be deprecated, since it is quite hacky */}\n <ThreadViewportProvider>{children}</ThreadViewportProvider>\n </AssistantApiContext.Provider>\n );\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/context/react/AssistantApiContext.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n FC,\n PropsWithChildren,\n useContext,\n useMemo,\n useEffect,\n} from \"react\";\nimport { useResource } from \"@assistant-ui/tap/react\";\n\nimport {\n MessageClientApi,\n MessageClientState,\n} from \"../../client/types/Message\";\nimport {\n ThreadListItemClientApi,\n ThreadListItemClientState,\n} from \"../../client/types/ThreadListItem\";\nimport {\n MessagePartClientApi,\n MessagePartClientState,\n} from \"../../client/types/Part\";\nimport { ThreadClientApi, ThreadClientState } from \"../../client/types/Thread\";\nimport {\n ComposerClientApi,\n ComposerClientState,\n} from \"../../client/types/Composer\";\nimport {\n AttachmentClientApi,\n AttachmentClientState,\n} from \"../../client/types/Attachment\";\nimport { Unsubscribe } from \"../../types\";\nimport {\n AssistantEvent,\n AssistantEventCallback,\n AssistantEventSelector,\n normalizeEventSelector,\n} from \"../../types/EventTypes\";\nimport {\n ThreadListClientApi,\n ThreadListClientState,\n} from \"../../client/types/ThreadList\";\nimport { DevToolsProviderApi } from \"../../devtools/DevToolsHooks\";\nimport {\n AssistantClientProps,\n useAssistantClient,\n} from \"../../client/AssistantClient\";\nimport { ToolsApi, ToolsMeta, ToolsState } from \"../../client/types/Tools\";\nimport {\n ModelContextApi,\n ModelContextMeta,\n} from \"../../client/types/ModelContext\";\nimport {\n DerivedScopes,\n DerivedScopesInput,\n} from \"../../utils/tap-store/derived-scopes\";\n\nexport type AssistantState = {\n readonly threads: ThreadListClientState;\n readonly tools: ToolsState;\n\n readonly threadListItem: ThreadListItemClientState;\n readonly thread: ThreadClientState;\n readonly composer: ComposerClientState;\n readonly message: MessageClientState;\n readonly part: MessagePartClientState;\n readonly attachment: AttachmentClientState;\n};\n\nexport type AssistantApiField<\n TApi,\n TMeta extends { source: string | null; query: any },\n> = (() => TApi) & (TMeta | { source: null; query: Record<string, never> });\n\n// Meta types for each API method\ntype ThreadsMeta = {\n source: \"root\";\n query: Record<string, never>;\n};\n\ntype ThreadListItemMeta = {\n source: \"threads\";\n query:\n | { type: \"index\"; index: number; archived: boolean }\n | { type: \"main\" }\n | { type: \"id\"; id: string };\n};\n\ntype ThreadMeta = {\n source: \"threads\";\n query: { type: \"main\" };\n};\n\ntype ComposerMeta = {\n source: \"message\" | \"thread\";\n query: Record<string, never>;\n};\n\ntype MessageMeta =\n | {\n source: \"thread\";\n query: { type: \"index\"; index: number };\n }\n | {\n source: \"root\";\n query: Record<string, never>;\n };\n\ntype PartMeta = {\n source: \"message\" | \"root\";\n query: { type: \"index\"; index: number } | Record<string, never>;\n};\n\ntype AttachmentMeta = {\n source: \"message\" | \"composer\";\n query: { type: \"index\"; index: number };\n};\n\nexport type AssistantApi = {\n threads: AssistantApiField<ThreadListClientApi, ThreadsMeta>;\n tools: AssistantApiField<ToolsApi, ToolsMeta>;\n modelContext: AssistantApiField<ModelContextApi, ModelContextMeta>;\n threadListItem: AssistantApiField<\n ThreadListItemClientApi,\n ThreadListItemMeta\n >;\n thread: AssistantApiField<ThreadClientApi, ThreadMeta>;\n composer: AssistantApiField<ComposerClientApi, ComposerMeta>;\n message: AssistantApiField<MessageClientApi, MessageMeta>;\n part: AssistantApiField<MessagePartClientApi, PartMeta>;\n attachment: AssistantApiField<AttachmentClientApi, AttachmentMeta>;\n\n subscribe(listener: () => void): Unsubscribe;\n flushSync(): void;\n\n on<TEvent extends AssistantEvent>(\n event: AssistantEventSelector<TEvent>,\n callback: AssistantEventCallback<TEvent>,\n ): Unsubscribe;\n};\n\nexport const createAssistantApiField = <\n TApi,\n TMeta extends { source: any; query: any },\n>(\n config: {\n get: () => TApi;\n } & (TMeta | { source: null; query: Record<string, never> }),\n): AssistantApiField<TApi, TMeta> => {\n const fn = config.get as AssistantApiField<TApi, TMeta>;\n fn.source = config.source;\n fn.query = config.query;\n return fn;\n};\n\nconst NO_OP_FN = () => () => {};\n\nconst AssistantApiContext = createContext<AssistantApi>({\n threads: createAssistantApiField({\n source: null,\n query: {},\n get: () => {\n throw new Error(\"Threads is only available inside <AssistantProvider />\");\n },\n }),\n tools: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\"Tools is only available inside <AssistantProvider />\");\n },\n }),\n modelContext: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"ModelContext is only available inside <AssistantProvider />\",\n );\n },\n }),\n threadListItem: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"ThreadListItem is only available inside <AssistantProvider />\",\n );\n },\n }),\n thread: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\"Thread is only available inside <AssistantProvider />\");\n },\n }),\n composer: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"Composer is only available inside <AssistantProvider />\",\n );\n },\n }),\n message: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"Message is only available inside <ThreadPrimitive.Messages />\",\n );\n },\n }),\n part: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"Part is only available inside <MessagePrimitive.Parts />\",\n );\n },\n }),\n attachment: createAssistantApiField({\n source: null,\n query: {},\n get: (): never => {\n throw new Error(\n \"Attachment is only available inside <MessagePrimitive.Attachments /> or <ComposerPrimitive.Attachments />\",\n );\n },\n }),\n\n subscribe: NO_OP_FN,\n flushSync: NO_OP_FN,\n on: (selector) => {\n const { scope } = normalizeEventSelector(selector);\n throw new Error(`Event scope is not available in this component: ${scope}`);\n },\n});\n\nexport const useAssistantApiImpl = (): AssistantApi => {\n return useContext(AssistantApiContext);\n};\n\n/**\n * Hook to extend the current AssistantApi with additional derived scope fields and special callbacks.\n * This merges the derived fields with the existing API from context.\n * Fields are automatically memoized based on source and query changes.\n * Special callbacks (on, subscribe, flushSync) use the useEffectEvent pattern to always access latest values.\n *\n * @param scopes - Record of field names to DerivedScope resource elements, plus optional special callbacks\n * @returns The merged AssistantApi\n *\n * @example\n * ```tsx\n * const api = useExtendedAssistantApi({\n * message: DerivedScope({\n * source: \"root\",\n * query: {},\n * get: () => messageApi,\n * }),\n * on: (selector, callback) => {\n * // Custom event filtering logic\n * },\n * });\n * ```\n */\nexport const useExtendedAssistantApi = (\n scopes: DerivedScopesInput,\n): AssistantApi => {\n const baseApi = useAssistantApiImpl();\n const partialApi = useResource(DerivedScopes(scopes));\n return useMemo(() => extendApi(baseApi, partialApi), [baseApi, partialApi]);\n};\n\nconst useExtendedAssistantApiImpl = (\n config: AssistantClientProps,\n): AssistantApi => {\n return useAssistantClient(config);\n};\n\nexport function useAssistantApi(): AssistantApi;\nexport function useAssistantApi(config: AssistantClientProps): AssistantApi;\nexport function useAssistantApi(config?: AssistantClientProps): AssistantApi {\n if (config) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useExtendedAssistantApiImpl(config);\n } else {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useAssistantApiImpl();\n }\n}\n\nconst mergeFns = <TArgs extends Array<unknown>>(\n fn1: (...args: TArgs) => void,\n fn2: (...args: TArgs) => void,\n) => {\n if (fn1 === NO_OP_FN) return fn2;\n if (fn2 === NO_OP_FN) return fn1;\n\n return (...args: TArgs) => {\n fn1(...args);\n fn2(...args);\n };\n};\n\nconst mergeFnsWithUnsubscribe = <TArgs extends Array<unknown>>(\n fn1: (...args: TArgs) => Unsubscribe,\n fn2: (...args: TArgs) => Unsubscribe,\n) => {\n if (fn1 === NO_OP_FN) return fn2;\n if (fn2 === NO_OP_FN) return fn1;\n\n return (...args: TArgs) => {\n const unsubscribe1 = fn1(...args);\n const unsubscribe2 = fn2(...args);\n\n return () => {\n unsubscribe1();\n unsubscribe2();\n };\n };\n};\n\nexport const extendApi = (\n api: AssistantApi,\n api2: Partial<AssistantApi>,\n): AssistantApi => {\n const api2Subscribe = api2.subscribe;\n const api2FlushSync = api2.flushSync;\n return {\n ...api,\n ...api2,\n subscribe: mergeFnsWithUnsubscribe(\n api.subscribe,\n api2Subscribe ?? NO_OP_FN,\n ),\n flushSync: mergeFns(api.flushSync, api2FlushSync ?? NO_OP_FN),\n };\n};\n\nexport const AssistantProvider: FC<\n PropsWithChildren<{ api: AssistantApi; devToolsVisible?: boolean }>\n> = ({ api, children, devToolsVisible = true }) => {\n useEffect(() => {\n if (!devToolsVisible || !api.subscribe) return undefined;\n return DevToolsProviderApi.register(api);\n }, [api, devToolsVisible]);\n\n return (\n <AssistantApiContext.Provider value={api}>\n {children}\n </AssistantApiContext.Provider>\n );\n};\n"],"mappings":"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","names":[]}
@@ -1,8 +1,38 @@
1
1
  import type { Unsubscribe } from "../../types/Unsubscribe";
2
+ export type SizeHandle = {
3
+ /** Update the height */
4
+ setHeight: (height: number) => void;
5
+ /** Unregister this handle */
6
+ unregister: Unsubscribe;
7
+ };
2
8
  export type ThreadViewportState = {
3
9
  readonly isAtBottom: boolean;
4
- readonly scrollToBottom: () => void;
5
- readonly onScrollToBottom: (callback: () => void) => Unsubscribe;
10
+ readonly scrollToBottom: (config?: {
11
+ behavior?: ScrollBehavior | undefined;
12
+ }) => void;
13
+ readonly onScrollToBottom: (callback: ({ behavior }: {
14
+ behavior: ScrollBehavior;
15
+ }) => void) => Unsubscribe;
16
+ /** Controls scroll anchoring: "top" anchors user messages at top, "bottom" is classic behavior */
17
+ readonly turnAnchor: "top" | "bottom";
18
+ /** Raw height values from registered elements */
19
+ readonly height: {
20
+ /** Total viewport height */
21
+ readonly viewport: number;
22
+ /** Total content inset height (footer, anchor message, etc.) */
23
+ readonly inset: number;
24
+ /** Height of the anchor user message (full height) */
25
+ readonly userMessage: number;
26
+ };
27
+ /** Register a viewport and get a handle to update its height */
28
+ readonly registerViewport: () => SizeHandle;
29
+ /** Register a content inset (footer, anchor message, etc.) and get a handle to update its height */
30
+ readonly registerContentInset: () => SizeHandle;
31
+ /** Register the anchor user message height */
32
+ readonly registerUserMessageHeight: () => SizeHandle;
33
+ };
34
+ export type ThreadViewportStoreOptions = {
35
+ turnAnchor?: "top" | "bottom" | undefined;
6
36
  };
7
- export declare const makeThreadViewportStore: () => import("zustand").UseBoundStore<import("zustand").StoreApi<ThreadViewportState>>;
37
+ export declare const makeThreadViewportStore: (options?: ThreadViewportStoreOptions) => import("zustand").UseBoundStore<import("zustand").StoreApi<ThreadViewportState>>;
8
38
  //# sourceMappingURL=ThreadViewport.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadViewport.d.ts","sourceRoot":"","sources":["../../../src/context/stores/ThreadViewport.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,IAAI,CAAC;IACpC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,WAAW,CAAC;CAClE,CAAC;AAEF,eAAO,MAAM,uBAAuB,wFAiBnC,CAAC"}
1
+ {"version":3,"file":"ThreadViewport.d.ts","sourceRoot":"","sources":["../../../src/context/stores/ThreadViewport.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,MAAM,UAAU,GAAG;IACvB,wBAAwB;IACxB,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,6BAA6B;IAC7B,UAAU,EAAE,WAAW,CAAC;CACzB,CAAC;AAwCF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE;QACjC,QAAQ,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;KACvC,KAAK,IAAI,CAAC;IACX,QAAQ,CAAC,gBAAgB,EAAE,CACzB,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE;QAAE,QAAQ,EAAE,cAAc,CAAA;KAAE,KAAK,IAAI,KAC3D,WAAW,CAAC;IAEjB,kGAAkG;IAClG,QAAQ,CAAC,UAAU,EAAE,KAAK,GAAG,QAAQ,CAAC;IAEtC,iDAAiD;IACjD,QAAQ,CAAC,MAAM,EAAE;QACf,4BAA4B;QAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,gEAAgE;QAChE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,sDAAsD;QACtD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;KAC9B,CAAC;IAEF,gEAAgE;IAChE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,UAAU,CAAC;IAE5C,oGAAoG;IACpG,QAAQ,CAAC,oBAAoB,EAAE,MAAM,UAAU,CAAC;IAEhD,8CAA8C;IAC9C,QAAQ,CAAC,yBAAyB,EAAE,MAAM,UAAU,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,UAAU,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;CAC3C,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,UAAS,0BAA+B,qFA2DzC,CAAC"}
@@ -2,13 +2,65 @@
2
2
 
3
3
  // src/context/stores/ThreadViewport.tsx
4
4
  import { create } from "zustand";
5
- var makeThreadViewportStore = () => {
5
+ var createSizeRegistry = (onChange) => {
6
+ const entries = /* @__PURE__ */ new Map();
7
+ const recalculate = () => {
8
+ let total = 0;
9
+ for (const height of entries.values()) {
10
+ total += height;
11
+ }
12
+ onChange(total);
13
+ };
14
+ return {
15
+ register: () => {
16
+ const id = Symbol();
17
+ entries.set(id, 0);
18
+ return {
19
+ setHeight: (height) => {
20
+ if (entries.get(id) !== height) {
21
+ entries.set(id, height);
22
+ recalculate();
23
+ }
24
+ },
25
+ unregister: () => {
26
+ entries.delete(id);
27
+ recalculate();
28
+ }
29
+ };
30
+ }
31
+ };
32
+ };
33
+ var makeThreadViewportStore = (options = {}) => {
6
34
  const scrollToBottomListeners = /* @__PURE__ */ new Set();
7
- return create(() => ({
35
+ const viewportRegistry = createSizeRegistry((total) => {
36
+ store.setState({
37
+ height: {
38
+ ...store.getState().height,
39
+ viewport: total
40
+ }
41
+ });
42
+ });
43
+ const insetRegistry = createSizeRegistry((total) => {
44
+ store.setState({
45
+ height: {
46
+ ...store.getState().height,
47
+ inset: total
48
+ }
49
+ });
50
+ });
51
+ const userMessageRegistry = createSizeRegistry((total) => {
52
+ store.setState({
53
+ height: {
54
+ ...store.getState().height,
55
+ userMessage: total
56
+ }
57
+ });
58
+ });
59
+ const store = create(() => ({
8
60
  isAtBottom: true,
9
- scrollToBottom: () => {
61
+ scrollToBottom: ({ behavior = "auto" } = {}) => {
10
62
  for (const listener of scrollToBottomListeners) {
11
- listener();
63
+ listener({ behavior });
12
64
  }
13
65
  },
14
66
  onScrollToBottom: (callback) => {
@@ -16,8 +68,18 @@ var makeThreadViewportStore = () => {
16
68
  return () => {
17
69
  scrollToBottomListeners.delete(callback);
18
70
  };
19
- }
71
+ },
72
+ turnAnchor: options.turnAnchor ?? "bottom",
73
+ height: {
74
+ viewport: 0,
75
+ inset: 0,
76
+ userMessage: 0
77
+ },
78
+ registerViewport: viewportRegistry.register,
79
+ registerContentInset: insetRegistry.register,
80
+ registerUserMessageHeight: userMessageRegistry.register
20
81
  }));
82
+ return store;
21
83
  };
22
84
  export {
23
85
  makeThreadViewportStore
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/context/stores/ThreadViewport.tsx"],"sourcesContent":["\"use client\";\n\nimport { create } from \"zustand\";\nimport type { Unsubscribe } from \"../../types/Unsubscribe\";\n\nexport type ThreadViewportState = {\n readonly isAtBottom: boolean;\n readonly scrollToBottom: () => void;\n readonly onScrollToBottom: (callback: () => void) => Unsubscribe;\n};\n\nexport const makeThreadViewportStore = () => {\n const scrollToBottomListeners = new Set<() => void>();\n\n return create<ThreadViewportState>(() => ({\n isAtBottom: true,\n scrollToBottom: () => {\n for (const listener of scrollToBottomListeners) {\n listener();\n }\n },\n onScrollToBottom: (callback) => {\n scrollToBottomListeners.add(callback);\n return () => {\n scrollToBottomListeners.delete(callback);\n };\n },\n }));\n};\n"],"mappings":";;;AAEA,SAAS,cAAc;AAShB,IAAM,0BAA0B,MAAM;AAC3C,QAAM,0BAA0B,oBAAI,IAAgB;AAEpD,SAAO,OAA4B,OAAO;AAAA,IACxC,YAAY;AAAA,IACZ,gBAAgB,MAAM;AACpB,iBAAW,YAAY,yBAAyB;AAC9C,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,kBAAkB,CAAC,aAAa;AAC9B,8BAAwB,IAAI,QAAQ;AACpC,aAAO,MAAM;AACX,gCAAwB,OAAO,QAAQ;AAAA,MACzC;AAAA,IACF;AAAA,EACF,EAAE;AACJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/context/stores/ThreadViewport.tsx"],"sourcesContent":["\"use client\";\n\nimport { create } from \"zustand\";\nimport type { Unsubscribe } from \"../../types/Unsubscribe\";\n\nexport type SizeHandle = {\n /** Update the height */\n setHeight: (height: number) => void;\n /** Unregister this handle */\n unregister: Unsubscribe;\n};\n\ntype SizeRegistry = {\n register: () => SizeHandle;\n};\n\nconst createSizeRegistry = (\n onChange: (total: number) => void,\n): SizeRegistry => {\n const entries = new Map<symbol, number>();\n\n const recalculate = () => {\n let total = 0;\n for (const height of entries.values()) {\n total += height;\n }\n onChange(total);\n };\n\n return {\n register: () => {\n const id = Symbol();\n entries.set(id, 0);\n\n return {\n setHeight: (height: number) => {\n if (entries.get(id) !== height) {\n entries.set(id, height);\n recalculate();\n }\n },\n unregister: () => {\n entries.delete(id);\n recalculate();\n },\n };\n },\n };\n};\n\nexport type ThreadViewportState = {\n readonly isAtBottom: boolean;\n readonly scrollToBottom: (config?: {\n behavior?: ScrollBehavior | undefined;\n }) => void;\n readonly onScrollToBottom: (\n callback: ({ behavior }: { behavior: ScrollBehavior }) => void,\n ) => Unsubscribe;\n\n /** Controls scroll anchoring: \"top\" anchors user messages at top, \"bottom\" is classic behavior */\n readonly turnAnchor: \"top\" | \"bottom\";\n\n /** Raw height values from registered elements */\n readonly height: {\n /** Total viewport height */\n readonly viewport: number;\n /** Total content inset height (footer, anchor message, etc.) */\n readonly inset: number;\n /** Height of the anchor user message (full height) */\n readonly userMessage: number;\n };\n\n /** Register a viewport and get a handle to update its height */\n readonly registerViewport: () => SizeHandle;\n\n /** Register a content inset (footer, anchor message, etc.) and get a handle to update its height */\n readonly registerContentInset: () => SizeHandle;\n\n /** Register the anchor user message height */\n readonly registerUserMessageHeight: () => SizeHandle;\n};\n\nexport type ThreadViewportStoreOptions = {\n turnAnchor?: \"top\" | \"bottom\" | undefined;\n};\n\nexport const makeThreadViewportStore = (\n options: ThreadViewportStoreOptions = {},\n) => {\n const scrollToBottomListeners = new Set<\n (config: { behavior: ScrollBehavior }) => void\n >();\n\n const viewportRegistry = createSizeRegistry((total) => {\n store.setState({\n height: {\n ...store.getState().height,\n viewport: total,\n },\n });\n });\n const insetRegistry = createSizeRegistry((total) => {\n store.setState({\n height: {\n ...store.getState().height,\n inset: total,\n },\n });\n });\n const userMessageRegistry = createSizeRegistry((total) => {\n store.setState({\n height: {\n ...store.getState().height,\n userMessage: total,\n },\n });\n });\n\n const store = create<ThreadViewportState>(() => ({\n isAtBottom: true,\n scrollToBottom: ({ behavior = \"auto\" } = {}) => {\n for (const listener of scrollToBottomListeners) {\n listener({ behavior });\n }\n },\n onScrollToBottom: (callback) => {\n scrollToBottomListeners.add(callback);\n return () => {\n scrollToBottomListeners.delete(callback);\n };\n },\n\n turnAnchor: options.turnAnchor ?? \"bottom\",\n\n height: {\n viewport: 0,\n inset: 0,\n userMessage: 0,\n },\n\n registerViewport: viewportRegistry.register,\n registerContentInset: insetRegistry.register,\n registerUserMessageHeight: userMessageRegistry.register,\n }));\n\n return store;\n};\n"],"mappings":";;;AAEA,SAAS,cAAc;AAcvB,IAAM,qBAAqB,CACzB,aACiB;AACjB,QAAM,UAAU,oBAAI,IAAoB;AAExC,QAAM,cAAc,MAAM;AACxB,QAAI,QAAQ;AACZ,eAAW,UAAU,QAAQ,OAAO,GAAG;AACrC,eAAS;AAAA,IACX;AACA,aAAS,KAAK;AAAA,EAChB;AAEA,SAAO;AAAA,IACL,UAAU,MAAM;AACd,YAAM,KAAK,OAAO;AAClB,cAAQ,IAAI,IAAI,CAAC;AAEjB,aAAO;AAAA,QACL,WAAW,CAAC,WAAmB;AAC7B,cAAI,QAAQ,IAAI,EAAE,MAAM,QAAQ;AAC9B,oBAAQ,IAAI,IAAI,MAAM;AACtB,wBAAY;AAAA,UACd;AAAA,QACF;AAAA,QACA,YAAY,MAAM;AAChB,kBAAQ,OAAO,EAAE;AACjB,sBAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAsCO,IAAM,0BAA0B,CACrC,UAAsC,CAAC,MACpC;AACH,QAAM,0BAA0B,oBAAI,IAElC;AAEF,QAAM,mBAAmB,mBAAmB,CAAC,UAAU;AACrD,UAAM,SAAS;AAAA,MACb,QAAQ;AAAA,QACN,GAAG,MAAM,SAAS,EAAE;AAAA,QACpB,UAAU;AAAA,MACZ;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACD,QAAM,gBAAgB,mBAAmB,CAAC,UAAU;AAClD,UAAM,SAAS;AAAA,MACb,QAAQ;AAAA,QACN,GAAG,MAAM,SAAS,EAAE;AAAA,QACpB,OAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACD,QAAM,sBAAsB,mBAAmB,CAAC,UAAU;AACxD,UAAM,SAAS;AAAA,MACb,QAAQ;AAAA,QACN,GAAG,MAAM,SAAS,EAAE;AAAA,QACpB,aAAa;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,QAAM,QAAQ,OAA4B,OAAO;AAAA,IAC/C,YAAY;AAAA,IACZ,gBAAgB,CAAC,EAAE,WAAW,OAAO,IAAI,CAAC,MAAM;AAC9C,iBAAW,YAAY,yBAAyB;AAC9C,iBAAS,EAAE,SAAS,CAAC;AAAA,MACvB;AAAA,IACF;AAAA,IACA,kBAAkB,CAAC,aAAa;AAC9B,8BAAwB,IAAI,QAAQ;AACpC,aAAO,MAAM;AACX,gCAAwB,OAAO,QAAQ;AAAA,MACzC;AAAA,IACF;AAAA,IAEA,YAAY,QAAQ,cAAc;AAAA,IAElC,QAAQ;AAAA,MACN,UAAU;AAAA,MACV,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IAEA,kBAAkB,iBAAiB;AAAA,IACnC,sBAAsB,cAAc;AAAA,IACpC,2BAA2B,oBAAoB;AAAA,EACjD,EAAE;AAEF,SAAO;AACT;","names":[]}
@@ -1,5 +1,5 @@
1
1
  import { AssistantApi } from "../context/react/AssistantApiContext";
2
- import { Unsubscribe } from "@assistant-ui/tap";
2
+ import { Unsubscribe } from "../types";
3
3
  export interface EventLog {
4
4
  time: Date;
5
5
  event: string;
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolsHooks.d.ts","sourceRoot":"","sources":["../../src/devtools/DevToolsHooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf;AAED,UAAU,gBAAgB;IACxB,GAAG,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3B,IAAI,EAAE,QAAQ,EAAE,CAAC;CAClB;AAED,UAAU,YAAY;IACpB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC;CACzC;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,8BAA8B,CAAC,EAAE,YAAY,CAAC;KAC/C;CACF;AAgCD,qBAAa,aAAa;IACxB,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW;IAQnD,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAS1C,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAI/C,OAAO,CAAC,MAAM,CAAC,eAAe;CAI/B;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAO;IAErD,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,WAAW;IAuDxD,OAAO,CAAC,MAAM,CAAC,eAAe;CAI/B"}
1
+ {"version":3,"file":"DevToolsHooks.d.ts","sourceRoot":"","sources":["../../src/devtools/DevToolsHooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf;AAED,UAAU,gBAAgB;IACxB,GAAG,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3B,IAAI,EAAE,QAAQ,EAAE,CAAC;CAClB;AAED,UAAU,YAAY;IACpB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC;CACzC;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,8BAA8B,CAAC,EAAE,YAAY,CAAC;KAC/C;CACF;AAgCD,qBAAa,aAAa;IACxB,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW;IAQnD,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAS1C,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAI/C,OAAO,CAAC,MAAM,CAAC,eAAe;CAI/B;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAO;IAErD,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,WAAW;IAuDxD,OAAO,CAAC,MAAM,CAAC,eAAe;CAI/B"}