@assistant-ui/core 0.2.23 → 0.3.0

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 (193) hide show
  1. package/dist/react/adapters/LocalStorageThreadListAdapter.js +2 -2
  2. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  3. package/dist/react/client/Tools.d.ts.map +1 -1
  4. package/dist/react/client/Tools.js +40 -55
  5. package/dist/react/client/Tools.js.map +1 -1
  6. package/dist/react/interactables-legacy/useAssistantInteractable.js +1 -1
  7. package/dist/react/interactables-legacy/useAssistantInteractable.js.map +1 -1
  8. package/dist/react/interactables-legacy/useInteractableState.js +3 -3
  9. package/dist/react/interactables-legacy/useInteractableState.js.map +1 -1
  10. package/dist/react/model-context/useAssistantContext.js +1 -1
  11. package/dist/react/model-context/useAssistantContext.js.map +1 -1
  12. package/dist/react/model-context/useAssistantDataUI.js +1 -1
  13. package/dist/react/model-context/useAssistantDataUI.js.map +1 -1
  14. package/dist/react/model-context/useAssistantInstructions.js +1 -1
  15. package/dist/react/model-context/useAssistantInstructions.js.map +1 -1
  16. package/dist/react/model-context/useAssistantTool.js +29 -25
  17. package/dist/react/model-context/useAssistantTool.js.map +1 -1
  18. package/dist/react/model-context/useAssistantToolUI.js +1 -1
  19. package/dist/react/model-context/useAssistantToolUI.js.map +1 -1
  20. package/dist/react/model-context/useAuiToolOverrides.js +1 -1
  21. package/dist/react/model-context/useAuiToolOverrides.js.map +1 -1
  22. package/dist/react/model-context/useInteractable.js +1 -1
  23. package/dist/react/model-context/useInteractable.js.map +1 -1
  24. package/dist/react/model-context/useInteractableState.js +2 -2
  25. package/dist/react/model-context/useInteractableState.js.map +1 -1
  26. package/dist/react/primitive-hooks/useActionBarCopy.js +3 -3
  27. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  28. package/dist/react/primitive-hooks/useActionBarEdit.js +1 -1
  29. package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
  30. package/dist/react/primitive-hooks/useActionBarFeedback.js +2 -2
  31. package/dist/react/primitive-hooks/useActionBarFeedback.js.map +1 -1
  32. package/dist/react/primitive-hooks/useActionBarReload.js +1 -1
  33. package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
  34. package/dist/react/primitive-hooks/useActionBarSpeak.js +1 -1
  35. package/dist/react/primitive-hooks/useActionBarSpeak.js.map +1 -1
  36. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js +1 -1
  37. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js.map +1 -1
  38. package/dist/react/primitive-hooks/useBranchPickerNext.js +1 -1
  39. package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
  40. package/dist/react/primitive-hooks/useBranchPickerPrevious.js +1 -1
  41. package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
  42. package/dist/react/primitive-hooks/useComposerAddAttachment.js +1 -1
  43. package/dist/react/primitive-hooks/useComposerAddAttachment.js.map +1 -1
  44. package/dist/react/primitive-hooks/useComposerCancel.js +1 -1
  45. package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
  46. package/dist/react/primitive-hooks/useComposerDictate.js +1 -1
  47. package/dist/react/primitive-hooks/useComposerDictate.js.map +1 -1
  48. package/dist/react/primitive-hooks/useComposerSend.js +1 -1
  49. package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
  50. package/dist/react/primitive-hooks/useEditComposerCancel.js +1 -1
  51. package/dist/react/primitive-hooks/useEditComposerCancel.js.map +1 -1
  52. package/dist/react/primitive-hooks/useEditComposerSend.js +1 -1
  53. package/dist/react/primitive-hooks/useEditComposerSend.js.map +1 -1
  54. package/dist/react/primitive-hooks/useMessageBranching.js +2 -2
  55. package/dist/react/primitive-hooks/useMessageBranching.js.map +1 -1
  56. package/dist/react/primitive-hooks/useMessageReload.js +1 -1
  57. package/dist/react/primitive-hooks/useMessageReload.js.map +1 -1
  58. package/dist/react/primitive-hooks/useSuggestionTrigger.js +7 -7
  59. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  60. package/dist/react/primitive-hooks/useThreadListItemArchive.js +1 -1
  61. package/dist/react/primitive-hooks/useThreadListItemArchive.js.map +1 -1
  62. package/dist/react/primitive-hooks/useThreadListItemDelete.js +1 -1
  63. package/dist/react/primitive-hooks/useThreadListItemDelete.js.map +1 -1
  64. package/dist/react/primitive-hooks/useThreadListItemTrigger.js +1 -1
  65. package/dist/react/primitive-hooks/useThreadListItemTrigger.js.map +1 -1
  66. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js +1 -1
  67. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js.map +1 -1
  68. package/dist/react/primitive-hooks/useThreadListLoadMore.js +1 -1
  69. package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
  70. package/dist/react/primitive-hooks/useThreadListNew.js +1 -1
  71. package/dist/react/primitive-hooks/useThreadListNew.js.map +1 -1
  72. package/dist/react/primitive-hooks/useVoice.js +5 -13
  73. package/dist/react/primitive-hooks/useVoice.js.map +1 -1
  74. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js +1 -1
  75. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js.map +1 -1
  76. package/dist/react/primitives/composer/ComposerAttachments.js +1 -1
  77. package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
  78. package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
  79. package/dist/react/primitives/composer/ComposerQueue.js +1 -1
  80. package/dist/react/primitives/composer/ComposerQueue.js.map +1 -1
  81. package/dist/react/primitives/message/MessageAttachments.d.ts.map +1 -1
  82. package/dist/react/primitives/message/MessageAttachments.js +1 -1
  83. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  84. package/dist/react/primitives/message/MessageParts.js +84 -122
  85. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  86. package/dist/react/primitives/thread/ThreadMessages.js +1 -1
  87. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  88. package/dist/react/primitives/thread/ThreadSuggestions.js +1 -1
  89. package/dist/react/primitives/thread/ThreadSuggestions.js.map +1 -1
  90. package/dist/react/primitives/threadList/ThreadListItems.js +1 -1
  91. package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
  92. package/dist/react/providers/AttachmentByIndexProvider.js +2 -2
  93. package/dist/react/providers/AttachmentByIndexProvider.js.map +1 -1
  94. package/dist/react/providers/ChainOfThoughtByIndicesProvider.js +1 -1
  95. package/dist/react/providers/ChainOfThoughtByIndicesProvider.js.map +1 -1
  96. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts.map +1 -1
  97. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js +30 -18
  98. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js.map +1 -1
  99. package/dist/react/providers/MessageByIdProvider.js +2 -2
  100. package/dist/react/providers/MessageByIdProvider.js.map +1 -1
  101. package/dist/react/providers/MessageByIndexProvider.js +2 -2
  102. package/dist/react/providers/MessageByIndexProvider.js.map +1 -1
  103. package/dist/react/providers/PartByIndexProvider.d.ts.map +1 -1
  104. package/dist/react/providers/PartByIndexProvider.js +30 -18
  105. package/dist/react/providers/PartByIndexProvider.js.map +1 -1
  106. package/dist/react/providers/QueueItemByIndexProvider.js +1 -1
  107. package/dist/react/providers/QueueItemByIndexProvider.js.map +1 -1
  108. package/dist/react/providers/ReadonlyThreadProvider.js +1 -1
  109. package/dist/react/providers/ReadonlyThreadProvider.js.map +1 -1
  110. package/dist/react/providers/SuggestionByIndexProvider.js +1 -1
  111. package/dist/react/providers/SuggestionByIndexProvider.js.map +1 -1
  112. package/dist/react/providers/ThreadListItemByIndexProvider.js +1 -1
  113. package/dist/react/providers/ThreadListItemByIndexProvider.js.map +1 -1
  114. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +3 -3
  115. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  116. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  117. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +32 -20
  118. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  119. package/dist/react/runtimes/createRuntimeExtras.js +1 -1
  120. package/dist/react/runtimes/createRuntimeExtras.js.map +1 -1
  121. package/dist/react/types/scopes/tools.d.ts +0 -6
  122. package/dist/react/types/scopes/tools.d.ts.map +1 -1
  123. package/dist/react/utils/groupParts.d.ts +1 -3
  124. package/dist/react/utils/groupParts.d.ts.map +1 -1
  125. package/dist/react/utils/groupParts.js +1 -3
  126. package/dist/react/utils/groupParts.js.map +1 -1
  127. package/dist/store/clients/runtime-adapter.js +3 -3
  128. package/dist/store/clients/runtime-adapter.js.map +1 -1
  129. package/package.json +5 -5
  130. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +2 -2
  131. package/src/react/client/Tools.ts +0 -7
  132. package/src/react/interactables-legacy/useAssistantInteractable.ts +1 -1
  133. package/src/react/interactables-legacy/useInteractableState.ts +3 -3
  134. package/src/react/model-context/useAssistantContext.ts +1 -1
  135. package/src/react/model-context/useAssistantDataUI.ts +1 -1
  136. package/src/react/model-context/useAssistantInstructions.ts +1 -1
  137. package/src/react/model-context/useAssistantTool.ts +2 -2
  138. package/src/react/model-context/useAssistantToolUI.ts +1 -1
  139. package/src/react/model-context/useAuiToolOverrides.ts +1 -1
  140. package/src/react/model-context/useInteractable.ts +1 -1
  141. package/src/react/model-context/useInteractableState.ts +2 -2
  142. package/src/react/primitive-hooks/useActionBarCopy.test.ts +2 -2
  143. package/src/react/primitive-hooks/useActionBarCopy.ts +3 -3
  144. package/src/react/primitive-hooks/useActionBarEdit.ts +1 -1
  145. package/src/react/primitive-hooks/useActionBarFeedback.ts +2 -2
  146. package/src/react/primitive-hooks/useActionBarReload.ts +1 -1
  147. package/src/react/primitive-hooks/useActionBarSpeak.ts +1 -1
  148. package/src/react/primitive-hooks/useActionBarStopSpeaking.ts +1 -1
  149. package/src/react/primitive-hooks/useBranchPickerNext.ts +1 -1
  150. package/src/react/primitive-hooks/useBranchPickerPrevious.ts +1 -1
  151. package/src/react/primitive-hooks/useComposerAddAttachment.ts +1 -1
  152. package/src/react/primitive-hooks/useComposerCancel.ts +1 -1
  153. package/src/react/primitive-hooks/useComposerDictate.ts +1 -1
  154. package/src/react/primitive-hooks/useComposerSend.ts +1 -1
  155. package/src/react/primitive-hooks/useEditComposerCancel.ts +1 -1
  156. package/src/react/primitive-hooks/useEditComposerSend.ts +1 -1
  157. package/src/react/primitive-hooks/useMessageBranching.ts +2 -2
  158. package/src/react/primitive-hooks/useMessageReload.ts +1 -1
  159. package/src/react/primitive-hooks/useSuggestionTrigger.ts +9 -9
  160. package/src/react/primitive-hooks/useThreadListItemArchive.ts +1 -1
  161. package/src/react/primitive-hooks/useThreadListItemDelete.ts +1 -1
  162. package/src/react/primitive-hooks/useThreadListItemTrigger.ts +1 -1
  163. package/src/react/primitive-hooks/useThreadListItemUnarchive.ts +1 -1
  164. package/src/react/primitive-hooks/useThreadListLoadMore.ts +1 -1
  165. package/src/react/primitive-hooks/useThreadListNew.ts +1 -1
  166. package/src/react/primitive-hooks/useVoice.ts +5 -5
  167. package/src/react/primitives/chainOfThought/ChainOfThoughtParts.tsx +1 -1
  168. package/src/react/primitives/composer/ComposerAttachments.tsx +1 -1
  169. package/src/react/primitives/composer/ComposerQueue.tsx +1 -3
  170. package/src/react/primitives/message/MessageAttachments.tsx +1 -3
  171. package/src/react/primitives/message/MessageParts.tsx +9 -9
  172. package/src/react/primitives/thread/ThreadMessages.tsx +1 -1
  173. package/src/react/primitives/thread/ThreadSuggestions.tsx +1 -1
  174. package/src/react/primitives/threadList/ThreadListItems.tsx +1 -1
  175. package/src/react/providers/AttachmentByIndexProvider.tsx +2 -2
  176. package/src/react/providers/ChainOfThoughtByIndicesProvider.tsx +1 -1
  177. package/src/react/providers/ChainOfThoughtPartByIndexProvider.tsx +2 -19
  178. package/src/react/providers/MessageByIdProvider.tsx +2 -2
  179. package/src/react/providers/MessageByIndexProvider.tsx +2 -2
  180. package/src/react/providers/PartByIndexProvider.tsx +2 -16
  181. package/src/react/providers/QueueItemByIndexProvider.tsx +1 -1
  182. package/src/react/providers/ReadonlyThreadProvider.tsx +1 -1
  183. package/src/react/providers/SuggestionByIndexProvider.tsx +1 -1
  184. package/src/react/providers/ThreadListItemByIndexProvider.tsx +1 -1
  185. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +3 -3
  186. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +32 -7
  187. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +26 -16
  188. package/src/react/runtimes/createRuntimeExtras.test.ts +1 -1
  189. package/src/react/runtimes/createRuntimeExtras.ts +1 -1
  190. package/src/react/types/scopes/tools.ts +0 -6
  191. package/src/react/utils/groupParts.ts +1 -7
  192. package/src/store/clients/runtime-adapter.ts +3 -3
  193. package/src/tests/groupParts.test.ts +3 -48
@@ -157,13 +157,13 @@ var AsyncStorageHistoryAdapter = class {
157
157
  return `${this.prefix}messages:${remoteId}`;
158
158
  }
159
159
  async load() {
160
- const remoteId = this.aui.threadListItem().getState().remoteId;
160
+ const remoteId = this.aui.threadListItem.getState().remoteId;
161
161
  if (!remoteId) return { messages: [] };
162
162
  const raw = await this.storage.getItem(this._messagesKey(remoteId));
163
163
  return parseStoredMessageRepository(raw);
164
164
  }
165
165
  async append(item) {
166
- const { remoteId } = await this.aui.threadListItem().initialize();
166
+ const { remoteId } = await this.aui.threadListItem.initialize();
167
167
  const key = this._messagesKey(remoteId);
168
168
  await this.mutationQueue.run(key, async () => {
169
169
  const raw = await this.storage.getItem(key);
@@ -1 +1 @@
1
- {"version":3,"file":"LocalStorageThreadListAdapter.js","names":["AssistantStream","createAssistantStream","FC","PropsWithChildren","useMemo","useAui","RemoteThreadInitializeResponse","RemoteThreadListAdapter","RemoteThreadListResponse","RemoteThreadMetadata","ThreadHistoryAdapter","ThreadMessage","RunConfig","ExportedMessageRepository","ExportedMessageRepositoryItem","RuntimeAdapterProvider","TitleGenerationAdapter","AsyncStorageLike","getItem","key","Promise","setItem","value","removeItem","KeyedMutationQueue","tails","Map","run","mutation","T","previous","get","result","then","tail","undefined","set","delete","mutationQueues","WeakMap","getMutationQueue","storage","queue","LocalStorageAdapterOptions","prefix","titleGenerator","StoredThreadMetadata","remoteId","externalId","status","title","custom","Record","StoredSystemMessage","Extract","role","StoredUserMessage","StoredAssistantMessage","isRecord","Array","isArray","parseJSON","raw","JSON","parse","parseStoredThread","parseDate","Date","Number","isNaN","getTime","date","isMessageRole","parseStoredThreadMessage","id","content","createdAt","metadata","type","submittedFeedback","submittedFeedbackType","unstable_state","unstable_annotations","unstable_data","steps","timing","NonNullable","isOptimistic","attachments","length","parseStoredThreadMetadata","parsed","flatMap","item","thread","parseStoredMessageRepositoryItem","message","parentId","runConfig","parseStoredMessageRepository","messages","candidateMessages","parsedItem","acceptedIds","Set","has","add","headId","some","AsyncStorageHistoryAdapter","aui","ReturnType","mutationQueue","constructor","_messagesKey","load","threadListItem","getState","append","initialize","repo","idx","findIndex","m","push","stringify","createHistoryProvider","Provider","t0","$","_c","children","t1","history","t2","adapters","t3","createLocalStorageAdapter","options","threadsKey","messagesKey","threadId","loadThreadMetadata","saveThreadMetadata","threads","updateThreadMetadata","update","find","adapter","unstable_Provider","list","map","t","unshift","rename","newTitle","updateCustom","archive","unarchive","filtered","filter","fetch","Error","generateTitle","controller","appendText"],"sources":["../../../src/react/adapters/LocalStorageThreadListAdapter.tsx"],"sourcesContent":["import { type AssistantStream, createAssistantStream } from \"assistant-stream\";\nimport { type FC, type PropsWithChildren, useMemo } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type {\n RemoteThreadInitializeResponse,\n RemoteThreadListAdapter,\n RemoteThreadListResponse,\n RemoteThreadMetadata,\n ThreadHistoryAdapter,\n ThreadMessage,\n RunConfig,\n} from \"../../index\";\nimport type {\n ExportedMessageRepository,\n ExportedMessageRepositoryItem,\n} from \"../../internal\";\nimport { RuntimeAdapterProvider } from \"../runtimes/RuntimeAdapterProvider\";\nimport type { TitleGenerationAdapter } from \"./TitleGenerationAdapter\";\n\nexport type AsyncStorageLike = {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\nclass KeyedMutationQueue {\n private readonly tails = new Map<string, Promise<void>>();\n\n run<T>(key: string, mutation: () => Promise<T>): Promise<T> {\n const previous = this.tails.get(key);\n const result = previous ? previous.then(mutation) : mutation();\n const tail = result.then(\n () => undefined,\n () => undefined,\n );\n\n this.tails.set(key, tail);\n void tail.then(() => {\n if (this.tails.get(key) === tail) this.tails.delete(key);\n });\n\n return result;\n }\n}\n\nconst mutationQueues = new WeakMap<AsyncStorageLike, KeyedMutationQueue>();\n\nconst getMutationQueue = (storage: AsyncStorageLike): KeyedMutationQueue => {\n let queue = mutationQueues.get(storage);\n if (!queue) {\n queue = new KeyedMutationQueue();\n mutationQueues.set(storage, queue);\n }\n return queue;\n};\n\ntype LocalStorageAdapterOptions = {\n storage: AsyncStorageLike;\n prefix?: string | undefined;\n titleGenerator?: TitleGenerationAdapter | undefined;\n};\n\ntype StoredThreadMetadata = {\n remoteId: string;\n externalId?: string;\n status: \"regular\" | \"archived\";\n title?: string;\n custom?: Record<string, unknown> | undefined;\n};\n\ntype StoredSystemMessage = Extract<ThreadMessage, { role: \"system\" }>;\ntype StoredUserMessage = Extract<ThreadMessage, { role: \"user\" }>;\ntype StoredAssistantMessage = Extract<ThreadMessage, { role: \"assistant\" }>;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst parseJSON = (raw: string | null): unknown => {\n if (!raw) return undefined;\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n return undefined;\n }\n};\n\nconst parseStoredThread = (value: unknown): StoredThreadMetadata | null => {\n if (!isRecord(value) || typeof value.remoteId !== \"string\") return null;\n\n const status = value.status ?? \"regular\";\n if (status !== \"regular\" && status !== \"archived\") return null;\n\n return {\n remoteId: value.remoteId,\n status,\n ...(typeof value.externalId === \"string\"\n ? { externalId: value.externalId }\n : undefined),\n ...(typeof value.title === \"string\" ? { title: value.title } : undefined),\n ...(isRecord(value.custom) ? { custom: value.custom } : undefined),\n };\n};\n\nconst parseDate = (value: unknown): Date | null => {\n if (value instanceof Date && !Number.isNaN(value.getTime())) return value;\n if (typeof value !== \"string\" && typeof value !== \"number\") return null;\n\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n};\n\nconst isMessageRole = (value: unknown): value is ThreadMessage[\"role\"] =>\n value === \"system\" || value === \"user\" || value === \"assistant\";\n\nconst parseStoredThreadMessage = (value: unknown): ThreadMessage | null => {\n if (!isRecord(value) || typeof value.id !== \"string\") return null;\n if (!isMessageRole(value.role)) return null;\n if (!Array.isArray(value.content)) return null;\n\n const createdAt = parseDate(value.createdAt);\n if (!createdAt) return null;\n\n const metadata = value.metadata;\n if (!isRecord(metadata) || !isRecord(metadata.custom)) return null;\n\n if (value.role === \"assistant\") {\n const status = value.status;\n if (!isRecord(status) || typeof status.type !== \"string\") return null;\n\n const submittedFeedback = isRecord(metadata.submittedFeedback)\n ? metadata.submittedFeedback\n : undefined;\n const submittedFeedbackType = submittedFeedback?.type;\n\n return {\n id: value.id,\n role: \"assistant\",\n content: value.content as StoredAssistantMessage[\"content\"],\n status: status as StoredAssistantMessage[\"status\"],\n createdAt,\n metadata: {\n unstable_state: (metadata.unstable_state ??\n null) as StoredAssistantMessage[\"metadata\"][\"unstable_state\"],\n unstable_annotations: Array.isArray(metadata.unstable_annotations)\n ? (metadata.unstable_annotations as StoredAssistantMessage[\"metadata\"][\"unstable_annotations\"])\n : [],\n unstable_data: Array.isArray(metadata.unstable_data)\n ? (metadata.unstable_data as StoredAssistantMessage[\"metadata\"][\"unstable_data\"])\n : [],\n steps: Array.isArray(metadata.steps)\n ? (metadata.steps as StoredAssistantMessage[\"metadata\"][\"steps\"])\n : [],\n ...(submittedFeedbackType === \"positive\" ||\n submittedFeedbackType === \"negative\"\n ? {\n submittedFeedback: {\n type: submittedFeedbackType,\n },\n }\n : undefined),\n ...(metadata.timing !== undefined\n ? {\n timing: metadata.timing as NonNullable<\n StoredAssistantMessage[\"metadata\"][\"timing\"]\n >,\n }\n : undefined),\n ...(metadata.isOptimistic === true\n ? { isOptimistic: true }\n : undefined),\n custom: metadata.custom,\n },\n };\n }\n\n if (value.role === \"user\") {\n return {\n id: value.id,\n role: \"user\",\n content: value.content as StoredUserMessage[\"content\"],\n attachments: Array.isArray(value.attachments)\n ? (value.attachments as StoredUserMessage[\"attachments\"])\n : [],\n createdAt,\n metadata: {\n custom: metadata.custom,\n },\n };\n }\n\n if (value.content.length !== 1) return null;\n\n return {\n id: value.id,\n role: \"system\",\n content: [value.content[0] as StoredSystemMessage[\"content\"][0]],\n createdAt,\n metadata: {\n custom: metadata.custom,\n },\n };\n};\n\nexport const parseStoredThreadMetadata = (\n raw: string | null,\n): StoredThreadMetadata[] => {\n const parsed = parseJSON(raw);\n if (!Array.isArray(parsed)) return [];\n\n return parsed.flatMap((item) => {\n const thread = parseStoredThread(item);\n return thread ? [thread] : [];\n });\n};\n\nconst parseStoredMessageRepositoryItem = (\n value: unknown,\n): ExportedMessageRepositoryItem | null => {\n if (!isRecord(value)) return null;\n\n const message = parseStoredThreadMessage(value.message);\n if (!message) return null;\n\n const parentId = value.parentId;\n if (\n parentId !== undefined &&\n parentId !== null &&\n typeof parentId !== \"string\"\n ) {\n return null;\n }\n\n return {\n message,\n parentId: parentId ?? null,\n ...(isRecord(value.runConfig)\n ? { runConfig: value.runConfig as RunConfig }\n : undefined),\n };\n};\n\nexport const parseStoredMessageRepository = (\n raw: string | null,\n): ExportedMessageRepository => {\n const parsed = parseJSON(raw);\n if (!isRecord(parsed) || !Array.isArray(parsed.messages)) {\n return { messages: [] };\n }\n\n const candidateMessages = parsed.messages.flatMap((item) => {\n const parsedItem = parseStoredMessageRepositoryItem(item);\n return parsedItem ? [parsedItem] : [];\n });\n\n const acceptedIds = new Set<string>();\n const messages = candidateMessages.flatMap((item) => {\n if (acceptedIds.has(item.message.id)) return [];\n if (item.parentId !== null && !acceptedIds.has(item.parentId)) return [];\n\n acceptedIds.add(item.message.id);\n return [item];\n });\n\n const headId =\n parsed.headId === null ||\n (typeof parsed.headId === \"string\" &&\n messages.some((item) => item.message.id === parsed.headId))\n ? parsed.headId\n : undefined;\n\n return {\n ...(headId !== undefined ? { headId } : undefined),\n messages,\n };\n};\n\nclass AsyncStorageHistoryAdapter implements ThreadHistoryAdapter {\n private storage: AsyncStorageLike;\n private aui: ReturnType<typeof useAui>;\n private prefix: string;\n private mutationQueue: KeyedMutationQueue;\n\n constructor(\n storage: AsyncStorageLike,\n aui: ReturnType<typeof useAui>,\n prefix: string,\n mutationQueue: KeyedMutationQueue,\n ) {\n this.storage = storage;\n this.aui = aui;\n this.prefix = prefix;\n this.mutationQueue = mutationQueue;\n }\n\n private _messagesKey(remoteId: string) {\n return `${this.prefix}messages:${remoteId}`;\n }\n\n async load(): Promise<ExportedMessageRepository> {\n const remoteId = this.aui.threadListItem().getState().remoteId;\n if (!remoteId) return { messages: [] };\n\n const raw = await this.storage.getItem(this._messagesKey(remoteId));\n return parseStoredMessageRepository(raw);\n }\n\n async append(item: ExportedMessageRepositoryItem): Promise<void> {\n const { remoteId } = await this.aui.threadListItem().initialize();\n\n const key = this._messagesKey(remoteId);\n await this.mutationQueue.run(key, async () => {\n const raw = await this.storage.getItem(key);\n const repo = parseStoredMessageRepository(raw);\n\n const idx = repo.messages.findIndex(\n (m) => m.message.id === item.message.id,\n );\n if (idx >= 0) {\n repo.messages[idx] = item;\n } else {\n repo.messages.push(item);\n }\n repo.headId = item.message.id;\n\n await this.storage.setItem(key, JSON.stringify(repo));\n });\n }\n}\n\nconst createHistoryProvider = (\n storage: AsyncStorageLike,\n prefix: string,\n mutationQueue: KeyedMutationQueue,\n): FC<PropsWithChildren> => {\n const Provider: FC<PropsWithChildren> = ({ children }) => {\n const aui = useAui();\n const history = useMemo(\n () => new AsyncStorageHistoryAdapter(storage, aui, prefix, mutationQueue),\n [aui],\n );\n const adapters = useMemo(() => ({ history }), [history]);\n\n return (\n <RuntimeAdapterProvider adapters={adapters}>\n {children}\n </RuntimeAdapterProvider>\n );\n };\n return Provider;\n};\n\nexport const createLocalStorageAdapter = (\n options: LocalStorageAdapterOptions,\n): RemoteThreadListAdapter => {\n const { storage, prefix = \"@assistant-ui:\", titleGenerator } = options;\n\n const threadsKey = `${prefix}threads`;\n const messagesKey = (threadId: string) => `${prefix}messages:${threadId}`;\n const mutationQueue = getMutationQueue(storage);\n\n const loadThreadMetadata = async (): Promise<StoredThreadMetadata[]> => {\n const raw = await storage.getItem(threadsKey);\n return parseStoredThreadMetadata(raw);\n };\n\n const saveThreadMetadata = async (\n threads: StoredThreadMetadata[],\n ): Promise<void> => {\n await storage.setItem(threadsKey, JSON.stringify(threads));\n };\n\n const updateThreadMetadata = async (\n remoteId: string,\n update: (thread: StoredThreadMetadata) => void,\n ): Promise<void> => {\n await mutationQueue.run(threadsKey, async () => {\n const threads = await loadThreadMetadata();\n const thread = threads.find((item) => item.remoteId === remoteId);\n if (thread) {\n update(thread);\n await saveThreadMetadata(threads);\n }\n });\n };\n\n const adapter: RemoteThreadListAdapter = {\n unstable_Provider: createHistoryProvider(storage, prefix, mutationQueue),\n\n async list(): Promise<RemoteThreadListResponse> {\n const threads = await loadThreadMetadata();\n return {\n threads: threads.map((t) => ({\n remoteId: t.remoteId,\n externalId: t.externalId,\n status: t.status,\n title: t.title,\n custom: t.custom,\n })),\n };\n },\n\n async initialize(\n threadId: string,\n ): Promise<RemoteThreadInitializeResponse> {\n const remoteId = threadId;\n return mutationQueue.run(threadsKey, async () => {\n const threads = await loadThreadMetadata();\n\n // Only add if not already present\n if (!threads.some((t) => t.remoteId === remoteId)) {\n threads.unshift({\n remoteId,\n status: \"regular\",\n });\n await saveThreadMetadata(threads);\n }\n\n return { remoteId, externalId: undefined };\n });\n },\n\n async rename(remoteId: string, newTitle: string): Promise<void> {\n await updateThreadMetadata(remoteId, (thread) => {\n thread.title = newTitle;\n });\n },\n\n async updateCustom(\n remoteId: string,\n custom: Record<string, unknown> | undefined,\n ): Promise<void> {\n await updateThreadMetadata(remoteId, (thread) => {\n thread.custom = custom;\n });\n },\n\n async archive(remoteId: string): Promise<void> {\n await updateThreadMetadata(remoteId, (thread) => {\n thread.status = \"archived\";\n });\n },\n\n async unarchive(remoteId: string): Promise<void> {\n await updateThreadMetadata(remoteId, (thread) => {\n thread.status = \"regular\";\n });\n },\n\n async delete(remoteId: string): Promise<void> {\n await mutationQueue.run(threadsKey, async () => {\n const threads = await loadThreadMetadata();\n const filtered = threads.filter((t) => t.remoteId !== remoteId);\n await saveThreadMetadata(filtered);\n });\n const key = messagesKey(remoteId);\n await mutationQueue.run(key, () => storage.removeItem(key));\n },\n\n async fetch(threadId: string): Promise<RemoteThreadMetadata> {\n const threads = await loadThreadMetadata();\n const thread = threads.find((t) => t.remoteId === threadId);\n if (!thread)\n throw new Error(\n `Stored thread \"${threadId}\" not found while fetching thread metadata.`,\n );\n return {\n remoteId: thread.remoteId,\n externalId: thread.externalId,\n status: thread.status,\n title: thread.title,\n custom: thread.custom,\n };\n },\n\n async generateTitle(\n remoteId: string,\n messages: readonly ThreadMessage[],\n ): Promise<AssistantStream> {\n if (titleGenerator) {\n const title = await titleGenerator.generateTitle(messages);\n\n // Update the stored title\n await updateThreadMetadata(remoteId, (thread) => {\n thread.title = title;\n });\n\n // Return a stream with a single text part\n return createAssistantStream((controller) => {\n controller.appendText(title);\n });\n }\n\n // No title generator — return empty stream\n return createAssistantStream(() => {});\n },\n };\n\n return adapter;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"LocalStorageThreadListAdapter.js","names":["AssistantStream","createAssistantStream","FC","PropsWithChildren","useMemo","useAui","RemoteThreadInitializeResponse","RemoteThreadListAdapter","RemoteThreadListResponse","RemoteThreadMetadata","ThreadHistoryAdapter","ThreadMessage","RunConfig","ExportedMessageRepository","ExportedMessageRepositoryItem","RuntimeAdapterProvider","TitleGenerationAdapter","AsyncStorageLike","getItem","key","Promise","setItem","value","removeItem","KeyedMutationQueue","tails","Map","run","mutation","T","previous","get","result","then","tail","undefined","set","delete","mutationQueues","WeakMap","getMutationQueue","storage","queue","LocalStorageAdapterOptions","prefix","titleGenerator","StoredThreadMetadata","remoteId","externalId","status","title","custom","Record","StoredSystemMessage","Extract","role","StoredUserMessage","StoredAssistantMessage","isRecord","Array","isArray","parseJSON","raw","JSON","parse","parseStoredThread","parseDate","Date","Number","isNaN","getTime","date","isMessageRole","parseStoredThreadMessage","id","content","createdAt","metadata","type","submittedFeedback","submittedFeedbackType","unstable_state","unstable_annotations","unstable_data","steps","timing","NonNullable","isOptimistic","attachments","length","parseStoredThreadMetadata","parsed","flatMap","item","thread","parseStoredMessageRepositoryItem","message","parentId","runConfig","parseStoredMessageRepository","messages","candidateMessages","parsedItem","acceptedIds","Set","has","add","headId","some","AsyncStorageHistoryAdapter","aui","ReturnType","mutationQueue","constructor","_messagesKey","load","threadListItem","getState","append","initialize","repo","idx","findIndex","m","push","stringify","createHistoryProvider","Provider","t0","$","_c","children","t1","history","t2","adapters","t3","createLocalStorageAdapter","options","threadsKey","messagesKey","threadId","loadThreadMetadata","saveThreadMetadata","threads","updateThreadMetadata","update","find","adapter","unstable_Provider","list","map","t","unshift","rename","newTitle","updateCustom","archive","unarchive","filtered","filter","fetch","Error","generateTitle","controller","appendText"],"sources":["../../../src/react/adapters/LocalStorageThreadListAdapter.tsx"],"sourcesContent":["import { type AssistantStream, createAssistantStream } from \"assistant-stream\";\nimport { type FC, type PropsWithChildren, useMemo } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type {\n RemoteThreadInitializeResponse,\n RemoteThreadListAdapter,\n RemoteThreadListResponse,\n RemoteThreadMetadata,\n ThreadHistoryAdapter,\n ThreadMessage,\n RunConfig,\n} from \"../../index\";\nimport type {\n ExportedMessageRepository,\n ExportedMessageRepositoryItem,\n} from \"../../internal\";\nimport { RuntimeAdapterProvider } from \"../runtimes/RuntimeAdapterProvider\";\nimport type { TitleGenerationAdapter } from \"./TitleGenerationAdapter\";\n\nexport type AsyncStorageLike = {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\nclass KeyedMutationQueue {\n private readonly tails = new Map<string, Promise<void>>();\n\n run<T>(key: string, mutation: () => Promise<T>): Promise<T> {\n const previous = this.tails.get(key);\n const result = previous ? previous.then(mutation) : mutation();\n const tail = result.then(\n () => undefined,\n () => undefined,\n );\n\n this.tails.set(key, tail);\n void tail.then(() => {\n if (this.tails.get(key) === tail) this.tails.delete(key);\n });\n\n return result;\n }\n}\n\nconst mutationQueues = new WeakMap<AsyncStorageLike, KeyedMutationQueue>();\n\nconst getMutationQueue = (storage: AsyncStorageLike): KeyedMutationQueue => {\n let queue = mutationQueues.get(storage);\n if (!queue) {\n queue = new KeyedMutationQueue();\n mutationQueues.set(storage, queue);\n }\n return queue;\n};\n\ntype LocalStorageAdapterOptions = {\n storage: AsyncStorageLike;\n prefix?: string | undefined;\n titleGenerator?: TitleGenerationAdapter | undefined;\n};\n\ntype StoredThreadMetadata = {\n remoteId: string;\n externalId?: string;\n status: \"regular\" | \"archived\";\n title?: string;\n custom?: Record<string, unknown> | undefined;\n};\n\ntype StoredSystemMessage = Extract<ThreadMessage, { role: \"system\" }>;\ntype StoredUserMessage = Extract<ThreadMessage, { role: \"user\" }>;\ntype StoredAssistantMessage = Extract<ThreadMessage, { role: \"assistant\" }>;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst parseJSON = (raw: string | null): unknown => {\n if (!raw) return undefined;\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n return undefined;\n }\n};\n\nconst parseStoredThread = (value: unknown): StoredThreadMetadata | null => {\n if (!isRecord(value) || typeof value.remoteId !== \"string\") return null;\n\n const status = value.status ?? \"regular\";\n if (status !== \"regular\" && status !== \"archived\") return null;\n\n return {\n remoteId: value.remoteId,\n status,\n ...(typeof value.externalId === \"string\"\n ? { externalId: value.externalId }\n : undefined),\n ...(typeof value.title === \"string\" ? { title: value.title } : undefined),\n ...(isRecord(value.custom) ? { custom: value.custom } : undefined),\n };\n};\n\nconst parseDate = (value: unknown): Date | null => {\n if (value instanceof Date && !Number.isNaN(value.getTime())) return value;\n if (typeof value !== \"string\" && typeof value !== \"number\") return null;\n\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n};\n\nconst isMessageRole = (value: unknown): value is ThreadMessage[\"role\"] =>\n value === \"system\" || value === \"user\" || value === \"assistant\";\n\nconst parseStoredThreadMessage = (value: unknown): ThreadMessage | null => {\n if (!isRecord(value) || typeof value.id !== \"string\") return null;\n if (!isMessageRole(value.role)) return null;\n if (!Array.isArray(value.content)) return null;\n\n const createdAt = parseDate(value.createdAt);\n if (!createdAt) return null;\n\n const metadata = value.metadata;\n if (!isRecord(metadata) || !isRecord(metadata.custom)) return null;\n\n if (value.role === \"assistant\") {\n const status = value.status;\n if (!isRecord(status) || typeof status.type !== \"string\") return null;\n\n const submittedFeedback = isRecord(metadata.submittedFeedback)\n ? metadata.submittedFeedback\n : undefined;\n const submittedFeedbackType = submittedFeedback?.type;\n\n return {\n id: value.id,\n role: \"assistant\",\n content: value.content as StoredAssistantMessage[\"content\"],\n status: status as StoredAssistantMessage[\"status\"],\n createdAt,\n metadata: {\n unstable_state: (metadata.unstable_state ??\n null) as StoredAssistantMessage[\"metadata\"][\"unstable_state\"],\n unstable_annotations: Array.isArray(metadata.unstable_annotations)\n ? (metadata.unstable_annotations as StoredAssistantMessage[\"metadata\"][\"unstable_annotations\"])\n : [],\n unstable_data: Array.isArray(metadata.unstable_data)\n ? (metadata.unstable_data as StoredAssistantMessage[\"metadata\"][\"unstable_data\"])\n : [],\n steps: Array.isArray(metadata.steps)\n ? (metadata.steps as StoredAssistantMessage[\"metadata\"][\"steps\"])\n : [],\n ...(submittedFeedbackType === \"positive\" ||\n submittedFeedbackType === \"negative\"\n ? {\n submittedFeedback: {\n type: submittedFeedbackType,\n },\n }\n : undefined),\n ...(metadata.timing !== undefined\n ? {\n timing: metadata.timing as NonNullable<\n StoredAssistantMessage[\"metadata\"][\"timing\"]\n >,\n }\n : undefined),\n ...(metadata.isOptimistic === true\n ? { isOptimistic: true }\n : undefined),\n custom: metadata.custom,\n },\n };\n }\n\n if (value.role === \"user\") {\n return {\n id: value.id,\n role: \"user\",\n content: value.content as StoredUserMessage[\"content\"],\n attachments: Array.isArray(value.attachments)\n ? (value.attachments as StoredUserMessage[\"attachments\"])\n : [],\n createdAt,\n metadata: {\n custom: metadata.custom,\n },\n };\n }\n\n if (value.content.length !== 1) return null;\n\n return {\n id: value.id,\n role: \"system\",\n content: [value.content[0] as StoredSystemMessage[\"content\"][0]],\n createdAt,\n metadata: {\n custom: metadata.custom,\n },\n };\n};\n\nexport const parseStoredThreadMetadata = (\n raw: string | null,\n): StoredThreadMetadata[] => {\n const parsed = parseJSON(raw);\n if (!Array.isArray(parsed)) return [];\n\n return parsed.flatMap((item) => {\n const thread = parseStoredThread(item);\n return thread ? [thread] : [];\n });\n};\n\nconst parseStoredMessageRepositoryItem = (\n value: unknown,\n): ExportedMessageRepositoryItem | null => {\n if (!isRecord(value)) return null;\n\n const message = parseStoredThreadMessage(value.message);\n if (!message) return null;\n\n const parentId = value.parentId;\n if (\n parentId !== undefined &&\n parentId !== null &&\n typeof parentId !== \"string\"\n ) {\n return null;\n }\n\n return {\n message,\n parentId: parentId ?? null,\n ...(isRecord(value.runConfig)\n ? { runConfig: value.runConfig as RunConfig }\n : undefined),\n };\n};\n\nexport const parseStoredMessageRepository = (\n raw: string | null,\n): ExportedMessageRepository => {\n const parsed = parseJSON(raw);\n if (!isRecord(parsed) || !Array.isArray(parsed.messages)) {\n return { messages: [] };\n }\n\n const candidateMessages = parsed.messages.flatMap((item) => {\n const parsedItem = parseStoredMessageRepositoryItem(item);\n return parsedItem ? [parsedItem] : [];\n });\n\n const acceptedIds = new Set<string>();\n const messages = candidateMessages.flatMap((item) => {\n if (acceptedIds.has(item.message.id)) return [];\n if (item.parentId !== null && !acceptedIds.has(item.parentId)) return [];\n\n acceptedIds.add(item.message.id);\n return [item];\n });\n\n const headId =\n parsed.headId === null ||\n (typeof parsed.headId === \"string\" &&\n messages.some((item) => item.message.id === parsed.headId))\n ? parsed.headId\n : undefined;\n\n return {\n ...(headId !== undefined ? { headId } : undefined),\n messages,\n };\n};\n\nclass AsyncStorageHistoryAdapter implements ThreadHistoryAdapter {\n private storage: AsyncStorageLike;\n private aui: ReturnType<typeof useAui>;\n private prefix: string;\n private mutationQueue: KeyedMutationQueue;\n\n constructor(\n storage: AsyncStorageLike,\n aui: ReturnType<typeof useAui>,\n prefix: string,\n mutationQueue: KeyedMutationQueue,\n ) {\n this.storage = storage;\n this.aui = aui;\n this.prefix = prefix;\n this.mutationQueue = mutationQueue;\n }\n\n private _messagesKey(remoteId: string) {\n return `${this.prefix}messages:${remoteId}`;\n }\n\n async load(): Promise<ExportedMessageRepository> {\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return { messages: [] };\n\n const raw = await this.storage.getItem(this._messagesKey(remoteId));\n return parseStoredMessageRepository(raw);\n }\n\n async append(item: ExportedMessageRepositoryItem): Promise<void> {\n const { remoteId } = await this.aui.threadListItem.initialize();\n\n const key = this._messagesKey(remoteId);\n await this.mutationQueue.run(key, async () => {\n const raw = await this.storage.getItem(key);\n const repo = parseStoredMessageRepository(raw);\n\n const idx = repo.messages.findIndex(\n (m) => m.message.id === item.message.id,\n );\n if (idx >= 0) {\n repo.messages[idx] = item;\n } else {\n repo.messages.push(item);\n }\n repo.headId = item.message.id;\n\n await this.storage.setItem(key, JSON.stringify(repo));\n });\n }\n}\n\nconst createHistoryProvider = (\n storage: AsyncStorageLike,\n prefix: string,\n mutationQueue: KeyedMutationQueue,\n): FC<PropsWithChildren> => {\n const Provider: FC<PropsWithChildren> = ({ children }) => {\n const aui = useAui();\n const history = useMemo(\n () => new AsyncStorageHistoryAdapter(storage, aui, prefix, mutationQueue),\n [aui],\n );\n const adapters = useMemo(() => ({ history }), [history]);\n\n return (\n <RuntimeAdapterProvider adapters={adapters}>\n {children}\n </RuntimeAdapterProvider>\n );\n };\n return Provider;\n};\n\nexport const createLocalStorageAdapter = (\n options: LocalStorageAdapterOptions,\n): RemoteThreadListAdapter => {\n const { storage, prefix = \"@assistant-ui:\", titleGenerator } = options;\n\n const threadsKey = `${prefix}threads`;\n const messagesKey = (threadId: string) => `${prefix}messages:${threadId}`;\n const mutationQueue = getMutationQueue(storage);\n\n const loadThreadMetadata = async (): Promise<StoredThreadMetadata[]> => {\n const raw = await storage.getItem(threadsKey);\n return parseStoredThreadMetadata(raw);\n };\n\n const saveThreadMetadata = async (\n threads: StoredThreadMetadata[],\n ): Promise<void> => {\n await storage.setItem(threadsKey, JSON.stringify(threads));\n };\n\n const updateThreadMetadata = async (\n remoteId: string,\n update: (thread: StoredThreadMetadata) => void,\n ): Promise<void> => {\n await mutationQueue.run(threadsKey, async () => {\n const threads = await loadThreadMetadata();\n const thread = threads.find((item) => item.remoteId === remoteId);\n if (thread) {\n update(thread);\n await saveThreadMetadata(threads);\n }\n });\n };\n\n const adapter: RemoteThreadListAdapter = {\n unstable_Provider: createHistoryProvider(storage, prefix, mutationQueue),\n\n async list(): Promise<RemoteThreadListResponse> {\n const threads = await loadThreadMetadata();\n return {\n threads: threads.map((t) => ({\n remoteId: t.remoteId,\n externalId: t.externalId,\n status: t.status,\n title: t.title,\n custom: t.custom,\n })),\n };\n },\n\n async initialize(\n threadId: string,\n ): Promise<RemoteThreadInitializeResponse> {\n const remoteId = threadId;\n return mutationQueue.run(threadsKey, async () => {\n const threads = await loadThreadMetadata();\n\n // Only add if not already present\n if (!threads.some((t) => t.remoteId === remoteId)) {\n threads.unshift({\n remoteId,\n status: \"regular\",\n });\n await saveThreadMetadata(threads);\n }\n\n return { remoteId, externalId: undefined };\n });\n },\n\n async rename(remoteId: string, newTitle: string): Promise<void> {\n await updateThreadMetadata(remoteId, (thread) => {\n thread.title = newTitle;\n });\n },\n\n async updateCustom(\n remoteId: string,\n custom: Record<string, unknown> | undefined,\n ): Promise<void> {\n await updateThreadMetadata(remoteId, (thread) => {\n thread.custom = custom;\n });\n },\n\n async archive(remoteId: string): Promise<void> {\n await updateThreadMetadata(remoteId, (thread) => {\n thread.status = \"archived\";\n });\n },\n\n async unarchive(remoteId: string): Promise<void> {\n await updateThreadMetadata(remoteId, (thread) => {\n thread.status = \"regular\";\n });\n },\n\n async delete(remoteId: string): Promise<void> {\n await mutationQueue.run(threadsKey, async () => {\n const threads = await loadThreadMetadata();\n const filtered = threads.filter((t) => t.remoteId !== remoteId);\n await saveThreadMetadata(filtered);\n });\n const key = messagesKey(remoteId);\n await mutationQueue.run(key, () => storage.removeItem(key));\n },\n\n async fetch(threadId: string): Promise<RemoteThreadMetadata> {\n const threads = await loadThreadMetadata();\n const thread = threads.find((t) => t.remoteId === threadId);\n if (!thread)\n throw new Error(\n `Stored thread \"${threadId}\" not found while fetching thread metadata.`,\n );\n return {\n remoteId: thread.remoteId,\n externalId: thread.externalId,\n status: thread.status,\n title: thread.title,\n custom: thread.custom,\n };\n },\n\n async generateTitle(\n remoteId: string,\n messages: readonly ThreadMessage[],\n ): Promise<AssistantStream> {\n if (titleGenerator) {\n const title = await titleGenerator.generateTitle(messages);\n\n // Update the stored title\n await updateThreadMetadata(remoteId, (thread) => {\n thread.title = title;\n });\n\n // Return a stream with a single text part\n return createAssistantStream((controller) => {\n controller.appendText(title);\n });\n }\n\n // No title generator — return empty stream\n return createAssistantStream(() => {});\n },\n };\n\n return adapter;\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Tools.d.ts","names":[],"sources":["../../../src/react/client/Tools.ts"],"mappings":";;;;;cA6Ja,mCAAK,SAAA;;EAxHN,UAAA;;EAED,SAAA,gBAAgB"}
1
+ {"version":3,"file":"Tools.d.ts","names":[],"sources":["../../../src/react/client/Tools.ts"],"mappings":";;;;;cAsJa,mCAAK,SAAA;;EAjHN,UAAA;;EAED,SAAA,gBAAgB"}
@@ -14,7 +14,7 @@ import { resource, useResources, withKey } from "@assistant-ui/tap";
14
14
  * message rendering.
15
15
  */
16
16
  const useTools = (t0) => {
17
- const $ = c(15);
17
+ const $ = c(12);
18
18
  const { toolkit, mcpApp } = t0;
19
19
  let t1;
20
20
  if ($[0] !== mcpApp) {
@@ -25,28 +25,20 @@ const useTools = (t0) => {
25
25
  const mcpAppOutput = useResources(t1)[0];
26
26
  const [toolUIs, setToolUIs] = useState(_temp);
27
27
  let t2;
28
- if ($[2] !== toolUIs) {
29
- t2 = Object.fromEntries(Object.entries(toolUIs).map(_temp3));
30
- $[2] = toolUIs;
31
- $[3] = t2;
32
- } else t2 = $[3];
33
- let t3;
34
- if ($[4] !== mcpAppOutput || $[5] !== t2 || $[6] !== toolUIs) {
35
- t3 = {
28
+ if ($[2] !== mcpAppOutput || $[3] !== toolUIs) {
29
+ t2 = {
36
30
  toolUIs,
37
- mcpApp: mcpAppOutput,
38
- tools: t2
31
+ mcpApp: mcpAppOutput
39
32
  };
40
- $[4] = mcpAppOutput;
41
- $[5] = t2;
42
- $[6] = toolUIs;
43
- $[7] = t3;
44
- } else t3 = $[7];
45
- const state = t3;
33
+ $[2] = mcpAppOutput;
34
+ $[3] = toolUIs;
35
+ $[4] = t2;
36
+ } else t2 = $[4];
37
+ const state = t2;
46
38
  const clientRef = useAssistantClientRef();
47
- let t4;
48
- if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
49
- t4 = (toolName, render, options) => {
39
+ let t3;
40
+ if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
41
+ t3 = (toolName, render, options) => {
50
42
  const registration = {
51
43
  render,
52
44
  standalone: options?.standalone ?? false
@@ -57,7 +49,7 @@ const useTools = (t0) => {
57
49
  }));
58
50
  return () => {
59
51
  setToolUIs((prev_0) => {
60
- const next = prev_0[toolName]?.filter((r_0) => r_0 !== registration) ?? [];
52
+ const next = prev_0[toolName]?.filter((r) => r !== registration) ?? [];
61
53
  if (next.length > 0) return {
62
54
  ...prev_0,
63
55
  [toolName]: next
@@ -68,13 +60,13 @@ const useTools = (t0) => {
68
60
  });
69
61
  };
70
62
  };
71
- $[8] = t4;
72
- } else t4 = $[8];
73
- const setToolUI = t4;
63
+ $[5] = t3;
64
+ } else t3 = $[5];
65
+ const setToolUI = t3;
66
+ let t4;
74
67
  let t5;
75
- let t6;
76
- if ($[9] !== clientRef || $[10] !== toolkit) {
77
- t5 = () => {
68
+ if ($[6] !== clientRef || $[7] !== toolkit) {
69
+ t4 = () => {
78
70
  if (!toolkit) return;
79
71
  const unsubscribes = [];
80
72
  for (const [toolName_0, tool] of Object.entries(toolkit)) {
@@ -83,36 +75,36 @@ const useTools = (t0) => {
83
75
  const render_0 = toolRender ?? (toolRenderText ? makeToolCallTextComponent(toolRenderText) : void 0);
84
76
  if (render_0) unsubscribes.push(setToolUI(toolName_0, render_0, { standalone: isStandaloneToolDisplay(tool) }));
85
77
  }
86
- const toolsWithoutRender = Object.entries(toolkit).reduce(_temp4, {});
78
+ const toolsWithoutRender = Object.entries(toolkit).reduce(_temp2, {});
87
79
  unsubscribes.push(clientRef.current.modelContext().register({ getModelContext: () => ({ tools: toolsWithoutRender }) }));
88
80
  return () => {
89
- unsubscribes.forEach(_temp5);
81
+ unsubscribes.forEach(_temp3);
90
82
  };
91
83
  };
92
- t6 = [
84
+ t5 = [
93
85
  toolkit,
94
86
  setToolUI,
95
87
  clientRef
96
88
  ];
97
- $[9] = clientRef;
98
- $[10] = toolkit;
99
- $[11] = t5;
100
- $[12] = t6;
89
+ $[6] = clientRef;
90
+ $[7] = toolkit;
91
+ $[8] = t4;
92
+ $[9] = t5;
101
93
  } else {
102
- t5 = $[11];
103
- t6 = $[12];
94
+ t4 = $[8];
95
+ t5 = $[9];
104
96
  }
105
- useEffect(t5, t6);
106
- let t7;
107
- if ($[13] !== state) {
108
- t7 = {
97
+ useEffect(t4, t5);
98
+ let t6;
99
+ if ($[10] !== state) {
100
+ t6 = {
109
101
  getState: () => state,
110
102
  setToolUI
111
103
  };
112
- $[13] = state;
113
- $[14] = t7;
114
- } else t7 = $[14];
115
- return t7;
104
+ $[10] = state;
105
+ $[11] = t6;
106
+ } else t6 = $[11];
107
+ return t6;
116
108
  };
117
109
  const Tools = resource(useTools);
118
110
  attachTransformScopes(useTools, (scopes, parent) => {
@@ -121,21 +113,14 @@ attachTransformScopes(useTools, (scopes, parent) => {
121
113
  function _temp() {
122
114
  return {};
123
115
  }
124
- function _temp2(r) {
125
- return r.render;
126
- }
127
- function _temp3(t0) {
128
- const [name, regs] = t0;
129
- return [name, regs.map(_temp2)];
130
- }
131
- function _temp4(acc, t0) {
132
- const [name_0, tool_0] = t0;
116
+ function _temp2(acc, t0) {
117
+ const [name, tool_0] = t0;
133
118
  if (tool_0.type === "mcp") return acc;
134
119
  const { display: _display, render: _render, renderText: _renderText, ...rest_0 } = tool_0;
135
- acc[name_0] = rest_0;
120
+ acc[name] = rest_0;
136
121
  return acc;
137
122
  }
138
- function _temp5(fn) {
123
+ function _temp3(fn) {
139
124
  return fn();
140
125
  }
141
126
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"Tools.js","names":["useState","useEffect","useCallback","useMemo","useResources","resource","withKey","ResourceElement","useAssistantClientRef","ClientOutput","attachTransformScopes","McpAppResourceOutput","ToolsState","Tool","isStandaloneToolDisplay","makeToolCallTextComponent","Toolkit","ToolCallMessagePartComponent","ModelContext","useTools","t0","$","_c","toolkit","mcpApp","t1","mcpAppOutputs","mcpAppOutput","toolUIs","setToolUIs","_temp","t2","Object","fromEntries","entries","map","_temp3","t3","tools","state","clientRef","t4","Symbol","for","toolName","render","options","registration","standalone","prev","prev_0","next","filter","r_0","r","length","rest","setToolUI","t5","t6","unsubscribes","toolName_0","tool","toolRender","undefined","toolRenderText","renderText","render_0","push","toolsWithoutRender","reduce","_temp4","Record","modelContextProvider","getModelContext","current","modelContext","register","forEach","_temp5","t7","getState","Tools","scopes","parent","source","_temp2","name","regs","acc","name_0","tool_0","type","display","_display","_render","_renderText","rest_0","fn"],"sources":["../../../src/react/client/Tools.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useMemo } from \"react\";\nimport {\n useResources,\n resource,\n withKey,\n type ResourceElement,\n} from \"@assistant-ui/tap\";\nimport {\n useAssistantClientRef,\n type ClientOutput,\n attachTransformScopes,\n} from \"@assistant-ui/store\";\nimport type { McpAppResourceOutput, ToolsState } from \"../types/scopes/tools\";\nimport type { Tool } from \"assistant-stream\";\nimport {\n isStandaloneToolDisplay,\n makeToolCallTextComponent,\n type Toolkit,\n} from \"../model-context/toolbox\";\nimport type { ToolCallMessagePartComponent } from \"../types/MessagePartComponentTypes\";\nimport { ModelContext } from \"../../store\";\n\nexport type { McpAppResourceOutput };\n\n/**\n * Registers tools with model context and installs tool-call renderers.\n *\n * Mount this resource near an assistant subtree when you want to expose a\n * group of tools declaratively. Tool definitions are registered with model\n * context, while each tool renderer is registered with the tools scope for\n * message rendering.\n */\nconst useTools = ({\n toolkit,\n mcpApp,\n}: {\n /** Tools to expose to the model and optional renderers to install. */\n toolkit?: Toolkit;\n /** Optional MCP app resource whose tools should be merged into context. */\n mcpApp?: ResourceElement<McpAppResourceOutput> | undefined;\n}): ClientOutput<\"tools\"> => {\n const mcpAppOutputs = useResources(mcpApp ? [withKey(\"mcpApp\", mcpApp)] : []);\n const mcpAppOutput = mcpAppOutputs[0];\n\n const [toolUIs, setToolUIs] = useState<ToolsState[\"toolUIs\"]>(() => ({}));\n\n const state = useMemo(\n (): ToolsState => ({\n toolUIs,\n mcpApp: mcpAppOutput,\n // Deprecated component-only view, derived from `toolUIs`. Removed in v0.15.\n tools: Object.fromEntries(\n Object.entries(toolUIs).map(([name, regs]) => [\n name,\n regs.map((r) => r.render),\n ]),\n ),\n }),\n [toolUIs, mcpAppOutput],\n );\n\n const clientRef = useAssistantClientRef();\n\n const setToolUI = useCallback(\n (\n toolName: string,\n render: ToolCallMessagePartComponent,\n options?: { standalone?: boolean },\n ) => {\n // One registration object per call; identity is the removal key, so\n // the per-name list stays correctly ref-counted across re-registers.\n const registration = {\n render,\n standalone: options?.standalone ?? false,\n };\n\n setToolUIs((prev) => ({\n ...prev,\n [toolName]: [...(prev[toolName] ?? []), registration],\n }));\n\n return () => {\n setToolUIs((prev) => {\n const next = prev[toolName]?.filter((r) => r !== registration) ?? [];\n if (next.length > 0) return { ...prev, [toolName]: next };\n // Drop the key entirely so repeatedly mounted/unmounted tools\n // don't leave empty arrays accumulating across a long session.\n const rest = { ...prev };\n delete rest[toolName];\n return rest;\n });\n };\n },\n [],\n );\n\n useEffect(() => {\n if (!toolkit) return;\n const unsubscribes: (() => void)[] = [];\n\n // Register tool UIs (exclude symbols)\n for (const [toolName, tool] of Object.entries(toolkit)) {\n const toolRender = \"render\" in tool ? tool.render : undefined;\n const toolRenderText = \"renderText\" in tool ? tool.renderText : undefined;\n const render =\n toolRender ??\n (toolRenderText\n ? makeToolCallTextComponent(toolRenderText)\n : undefined);\n if (render) {\n unsubscribes.push(\n setToolUI(toolName, render, {\n standalone: isStandaloneToolDisplay(tool),\n }),\n );\n }\n }\n\n // Register tools with model context (exclude symbols). `render`,\n // `renderText`, and `display` are client-only presentation concerns and\n // never reach the model.\n const toolsWithoutRender = Object.entries(toolkit).reduce(\n (acc, [name, tool]) => {\n if (tool.type === \"mcp\") return acc;\n const {\n display: _display,\n render: _render,\n renderText: _renderText,\n ...rest\n } = tool as typeof tool & { renderText?: unknown };\n acc[name] = rest as Tool<any, any>;\n return acc;\n },\n {} as Record<string, Tool<any, any>>,\n );\n\n const modelContextProvider = {\n getModelContext: () => ({\n tools: toolsWithoutRender,\n }),\n };\n\n unsubscribes.push(\n clientRef.current!.modelContext().register(modelContextProvider),\n );\n\n return () => {\n unsubscribes.forEach((fn) => fn());\n };\n }, [toolkit, setToolUI, clientRef]);\n\n return {\n getState: () => state,\n setToolUI,\n };\n};\n\nexport const Tools = resource(useTools);\n\nattachTransformScopes(useTools, (scopes, parent) => {\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"Tools.js","names":["useState","useEffect","useCallback","useMemo","useResources","resource","withKey","ResourceElement","useAssistantClientRef","ClientOutput","attachTransformScopes","McpAppResourceOutput","ToolsState","Tool","isStandaloneToolDisplay","makeToolCallTextComponent","Toolkit","ToolCallMessagePartComponent","ModelContext","useTools","t0","$","_c","toolkit","mcpApp","t1","mcpAppOutputs","mcpAppOutput","toolUIs","setToolUIs","_temp","t2","state","clientRef","t3","Symbol","for","toolName","render","options","registration","standalone","prev","prev_0","next","filter","r","length","rest","setToolUI","t4","t5","unsubscribes","toolName_0","tool","Object","entries","toolRender","undefined","toolRenderText","renderText","render_0","push","toolsWithoutRender","reduce","_temp2","Record","modelContextProvider","getModelContext","tools","current","modelContext","register","forEach","_temp3","t6","getState","Tools","scopes","parent","source","acc","name","tool_0","type","display","_display","_render","_renderText","rest_0","fn"],"sources":["../../../src/react/client/Tools.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useMemo } from \"react\";\nimport {\n useResources,\n resource,\n withKey,\n type ResourceElement,\n} from \"@assistant-ui/tap\";\nimport {\n useAssistantClientRef,\n type ClientOutput,\n attachTransformScopes,\n} from \"@assistant-ui/store\";\nimport type { McpAppResourceOutput, ToolsState } from \"../types/scopes/tools\";\nimport type { Tool } from \"assistant-stream\";\nimport {\n isStandaloneToolDisplay,\n makeToolCallTextComponent,\n type Toolkit,\n} from \"../model-context/toolbox\";\nimport type { ToolCallMessagePartComponent } from \"../types/MessagePartComponentTypes\";\nimport { ModelContext } from \"../../store\";\n\nexport type { McpAppResourceOutput };\n\n/**\n * Registers tools with model context and installs tool-call renderers.\n *\n * Mount this resource near an assistant subtree when you want to expose a\n * group of tools declaratively. Tool definitions are registered with model\n * context, while each tool renderer is registered with the tools scope for\n * message rendering.\n */\nconst useTools = ({\n toolkit,\n mcpApp,\n}: {\n /** Tools to expose to the model and optional renderers to install. */\n toolkit?: Toolkit;\n /** Optional MCP app resource whose tools should be merged into context. */\n mcpApp?: ResourceElement<McpAppResourceOutput> | undefined;\n}): ClientOutput<\"tools\"> => {\n const mcpAppOutputs = useResources(mcpApp ? [withKey(\"mcpApp\", mcpApp)] : []);\n const mcpAppOutput = mcpAppOutputs[0];\n\n const [toolUIs, setToolUIs] = useState<ToolsState[\"toolUIs\"]>(() => ({}));\n\n const state = useMemo(\n (): ToolsState => ({\n toolUIs,\n mcpApp: mcpAppOutput,\n }),\n [toolUIs, mcpAppOutput],\n );\n\n const clientRef = useAssistantClientRef();\n\n const setToolUI = useCallback(\n (\n toolName: string,\n render: ToolCallMessagePartComponent,\n options?: { standalone?: boolean },\n ) => {\n // One registration object per call; identity is the removal key, so\n // the per-name list stays correctly ref-counted across re-registers.\n const registration = {\n render,\n standalone: options?.standalone ?? false,\n };\n\n setToolUIs((prev) => ({\n ...prev,\n [toolName]: [...(prev[toolName] ?? []), registration],\n }));\n\n return () => {\n setToolUIs((prev) => {\n const next = prev[toolName]?.filter((r) => r !== registration) ?? [];\n if (next.length > 0) return { ...prev, [toolName]: next };\n // Drop the key entirely so repeatedly mounted/unmounted tools\n // don't leave empty arrays accumulating across a long session.\n const rest = { ...prev };\n delete rest[toolName];\n return rest;\n });\n };\n },\n [],\n );\n\n useEffect(() => {\n if (!toolkit) return;\n const unsubscribes: (() => void)[] = [];\n\n // Register tool UIs (exclude symbols)\n for (const [toolName, tool] of Object.entries(toolkit)) {\n const toolRender = \"render\" in tool ? tool.render : undefined;\n const toolRenderText = \"renderText\" in tool ? tool.renderText : undefined;\n const render =\n toolRender ??\n (toolRenderText\n ? makeToolCallTextComponent(toolRenderText)\n : undefined);\n if (render) {\n unsubscribes.push(\n setToolUI(toolName, render, {\n standalone: isStandaloneToolDisplay(tool),\n }),\n );\n }\n }\n\n // Register tools with model context (exclude symbols). `render`,\n // `renderText`, and `display` are client-only presentation concerns and\n // never reach the model.\n const toolsWithoutRender = Object.entries(toolkit).reduce(\n (acc, [name, tool]) => {\n if (tool.type === \"mcp\") return acc;\n const {\n display: _display,\n render: _render,\n renderText: _renderText,\n ...rest\n } = tool as typeof tool & { renderText?: unknown };\n acc[name] = rest as Tool<any, any>;\n return acc;\n },\n {} as Record<string, Tool<any, any>>,\n );\n\n const modelContextProvider = {\n getModelContext: () => ({\n tools: toolsWithoutRender,\n }),\n };\n\n unsubscribes.push(\n clientRef.current!.modelContext().register(modelContextProvider),\n );\n\n return () => {\n unsubscribes.forEach((fn) => fn());\n };\n }, [toolkit, setToolUI, clientRef]);\n\n return {\n getState: () => state,\n setToolUI,\n };\n};\n\nexport const Tools = resource(useTools);\n\nattachTransformScopes(useTools, (scopes, parent) => {\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n});\n"],"mappings":"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"}
@@ -22,7 +22,7 @@ const useAssistantInteractable = (name, config) => {
22
22
  const initialStateRef = useRef(config.initialState);
23
23
  initialStateRef.current = config.initialState;
24
24
  useEffect(() => {
25
- return aui.interactables().register({
25
+ return aui.interactables.register({
26
26
  id,
27
27
  name,
28
28
  description: config.description,
@@ -1 +1 @@
1
- {"version":3,"file":"useAssistantInteractable.js","names":["useEffect","useId","useRef","useAui","InteractableStateSchema","AssistantInteractableProps","description","stateSchema","initialState","id","selected","useAssistantInteractable","name","config","aui","autoId","replace","stateSchemaRef","current","initialStateRef","interactables","register"],"sources":["../../../src/react/interactables-legacy/useAssistantInteractable.ts"],"sourcesContent":["import { useEffect, useId, useRef } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type { InteractableStateSchema } from \"./scopes\";\n\n/**\n * @deprecated Since 2026-06-14 — migrate to the Unstable / Experimental API.\n * Scheduled for removal on/after 2026-09-14. See\n * {@link https://www.assistant-ui.com/docs/tools/interactables#migrating-from-the-previous-api | Interactables migration guide}.\n */\nexport type AssistantInteractableProps = {\n description: string;\n stateSchema: InteractableStateSchema;\n initialState: unknown;\n id?: string;\n selected?: boolean;\n};\n\n/**\n * @deprecated Since 2026-06-14 — migrate to the Unstable / Experimental API.\n * Scheduled for removal on/after 2026-09-14. See\n * {@link https://www.assistant-ui.com/docs/tools/interactables#migrating-from-the-previous-api | Interactables migration guide}.\n *\n * Registers an interactable with the AI assistant.\n *\n * This hook handles registration only. To read and write the interactable's\n * state, use {@link useInteractableState} with the returned id.\n *\n * @returns The interactable instance id.\n */\nexport const useAssistantInteractable = (\n name: string,\n config: AssistantInteractableProps,\n): string => {\n const aui = useAui();\n\n const autoId = useId().replace(/[^a-zA-Z0-9]/g, \"\");\n const id = config.id ?? autoId;\n\n const stateSchemaRef = useRef(config.stateSchema);\n stateSchemaRef.current = config.stateSchema;\n const initialStateRef = useRef(config.initialState);\n initialStateRef.current = config.initialState;\n\n useEffect(() => {\n return aui.interactables().register({\n id,\n name,\n description: config.description,\n stateSchema: stateSchemaRef.current,\n initialState: initialStateRef.current,\n selected: config.selected,\n });\n }, [aui, id, name, config.description, config.selected]);\n\n return id;\n};\n"],"mappings":";;;;;;;;;;;;;;;AA6BA,MAAaW,4BACXC,MACAC,WACW;CACX,MAAMC,MAAMX,OAAO;CAEnB,MAAMY,SAASd,MAAM,CAAC,CAACe,QAAQ,iBAAiB,EAAE;CAClD,MAAMP,KAAKI,OAAOJ,MAAMM;CAExB,MAAME,iBAAiBf,OAAOW,OAAON,WAAW;CAChDU,eAAeC,UAAUL,OAAON;CAChC,MAAMY,kBAAkBjB,OAAOW,OAAOL,YAAY;CAClDW,gBAAgBD,UAAUL,OAAOL;CAEjCR,gBAAgB;EACd,OAAOc,IAAIM,cAAc,CAAC,CAACC,SAAS;GAClCZ;GACAG;GACAN,aAAaO,OAAOP;GACpBC,aAAaU,eAAeC;GAC5BV,cAAcW,gBAAgBD;GAC9BR,UAAUG,OAAOH;EACnB,CAAC;CACH,GAAG;EAACI;EAAKL;EAAIG;EAAMC,OAAOP;EAAaO,OAAOH;CAAQ,CAAC;CAEvD,OAAOD;AACT"}
1
+ {"version":3,"file":"useAssistantInteractable.js","names":["useEffect","useId","useRef","useAui","InteractableStateSchema","AssistantInteractableProps","description","stateSchema","initialState","id","selected","useAssistantInteractable","name","config","aui","autoId","replace","stateSchemaRef","current","initialStateRef","interactables","register"],"sources":["../../../src/react/interactables-legacy/useAssistantInteractable.ts"],"sourcesContent":["import { useEffect, useId, useRef } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type { InteractableStateSchema } from \"./scopes\";\n\n/**\n * @deprecated Since 2026-06-14 — migrate to the Unstable / Experimental API.\n * Scheduled for removal on/after 2026-09-14. See\n * {@link https://www.assistant-ui.com/docs/tools/interactables#migrating-from-the-previous-api | Interactables migration guide}.\n */\nexport type AssistantInteractableProps = {\n description: string;\n stateSchema: InteractableStateSchema;\n initialState: unknown;\n id?: string;\n selected?: boolean;\n};\n\n/**\n * @deprecated Since 2026-06-14 — migrate to the Unstable / Experimental API.\n * Scheduled for removal on/after 2026-09-14. See\n * {@link https://www.assistant-ui.com/docs/tools/interactables#migrating-from-the-previous-api | Interactables migration guide}.\n *\n * Registers an interactable with the AI assistant.\n *\n * This hook handles registration only. To read and write the interactable's\n * state, use {@link useInteractableState} with the returned id.\n *\n * @returns The interactable instance id.\n */\nexport const useAssistantInteractable = (\n name: string,\n config: AssistantInteractableProps,\n): string => {\n const aui = useAui();\n\n const autoId = useId().replace(/[^a-zA-Z0-9]/g, \"\");\n const id = config.id ?? autoId;\n\n const stateSchemaRef = useRef(config.stateSchema);\n stateSchemaRef.current = config.stateSchema;\n const initialStateRef = useRef(config.initialState);\n initialStateRef.current = config.initialState;\n\n useEffect(() => {\n return aui.interactables.register({\n id,\n name,\n description: config.description,\n stateSchema: stateSchemaRef.current,\n initialState: initialStateRef.current,\n selected: config.selected,\n });\n }, [aui, id, name, config.description, config.selected]);\n\n return id;\n};\n"],"mappings":";;;;;;;;;;;;;;;AA6BA,MAAaW,4BACXC,MACAC,WACW;CACX,MAAMC,MAAMX,OAAO;CAEnB,MAAMY,SAASd,MAAM,CAAC,CAACe,QAAQ,iBAAiB,EAAE;CAClD,MAAMP,KAAKI,OAAOJ,MAAMM;CAExB,MAAME,iBAAiBf,OAAOW,OAAON,WAAW;CAChDU,eAAeC,UAAUL,OAAON;CAChC,MAAMY,kBAAkBjB,OAAOW,OAAOL,YAAY;CAClDW,gBAAgBD,UAAUL,OAAOL;CAEjCR,gBAAgB;EACd,OAAOc,IAAIM,cAAcC,SAAS;GAChCZ;GACAG;GACAN,aAAaO,OAAOP;GACpBC,aAAaU,eAAeC;GAC5BV,cAAcW,gBAAgBD;GAC9BR,UAAUG,OAAOH;EACnB,CAAC;CACH,GAAG;EAACI;EAAKL;EAAIG;EAAMC,OAAOP;EAAaO,OAAOH;CAAQ,CAAC;CAEvD,OAAOD;AACT"}
@@ -25,7 +25,7 @@ const useInteractableState = (id, fallback) => {
25
25
  let t1;
26
26
  if ($[2] !== aui || $[3] !== id) {
27
27
  t1 = (updater) => {
28
- aui.interactables().setState(id, (prev) => {
28
+ aui.interactables.setState(id, (prev) => {
29
29
  if (typeof updater === "function") return updater(prev);
30
30
  return updater;
31
31
  });
@@ -38,7 +38,7 @@ const useInteractableState = (id, fallback) => {
38
38
  let t2;
39
39
  if ($[5] !== aui || $[6] !== id) {
40
40
  t2 = (selected) => {
41
- aui.interactables().setSelected(id, selected);
41
+ aui.interactables.setSelected(id, selected);
42
42
  };
43
43
  $[5] = aui;
44
44
  $[6] = id;
@@ -47,7 +47,7 @@ const useInteractableState = (id, fallback) => {
47
47
  const setSelected = t2;
48
48
  let t3;
49
49
  if ($[8] !== aui) {
50
- t3 = () => aui.interactables().flush();
50
+ t3 = () => aui.interactables.flush();
51
51
  $[8] = aui;
52
52
  $[9] = t3;
53
53
  } else t3 = $[9];
@@ -1 +1 @@
1
- {"version":3,"file":"useInteractableState.js","names":["useCallback","useAui","useAuiState","StateUpdater","TState","prev","useInteractableState","id","fallback","$","_c","aui","state","s","interactables","definitions","t0","s_0","persistence","persistenceStatus","t1","updater","setState","t2","selected","setSelected","t3","flush","t4","isPending","t5","error","t6","t7"],"sources":["../../../src/react/interactables-legacy/useInteractableState.ts"],"sourcesContent":["import { useCallback } from \"react\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\n\ntype StateUpdater<TState> = TState | ((prev: TState) => TState);\n\n/**\n * Reads and writes the state of a registered interactable.\n *\n * Pair with {@link useAssistantInteractable} which handles registration.\n *\n * @deprecated Since 2026-06-14 — migrate to the Unstable / Experimental API.\n * Scheduled for removal on/after 2026-09-14. See\n * {@link https://www.assistant-ui.com/docs/tools/interactables#migrating-from-the-previous-api | Interactables migration guide}.\n */\nexport const useInteractableState = <TState>(\n id: string,\n fallback: TState,\n): [\n TState,\n {\n setState: (updater: StateUpdater<TState>) => void;\n setSelected: (selected: boolean) => void;\n isPending: boolean;\n error: unknown;\n flush: () => Promise<void>;\n },\n] => {\n const aui = useAui();\n\n const state =\n (useAuiState((s) => s.interactables.definitions[id]?.state) as TState) ??\n (fallback as TState);\n\n const persistenceStatus = useAuiState((s) => s.interactables.persistence[id]);\n\n const setState = useCallback(\n (updater: StateUpdater<TState>) => {\n aui.interactables().setState(id, (prev) => {\n if (typeof updater === \"function\") {\n return (updater as (prev: TState) => TState)(prev as TState);\n }\n return updater;\n });\n },\n [aui, id],\n );\n\n const setSelected = useCallback(\n (selected: boolean) => {\n aui.interactables().setSelected(id, selected);\n },\n [aui, id],\n );\n\n const flush = useCallback(() => aui.interactables().flush(), [aui]);\n\n return [\n state,\n {\n setState,\n setSelected,\n isPending: persistenceStatus?.isPending ?? false,\n error: persistenceStatus?.error,\n flush,\n },\n ];\n};\n"],"mappings":";;;;;;;;;;;;;AAcA,MAAaM,wBAAuBC,IAAAC,aAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAalC,MAAAC,MAAYV,OAAO;CAEnB,MAAAW,QACGV,aAAYW,MAAOA,EAACC,cAAcC,YAAaR,GAAU,EAAAK,KAAA,KACzDJ;CAAoB,IAAAQ;CAAA,IAAAP,EAAA,OAAAF,IAAA;EAEeS,MAAAC,QAAOJ,IAACC,cAAcI,YAAaX;EAAGE,EAAA,KAAAF;EAAAE,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CAA5E,MAAAU,oBAA0BjB,YAAYc,EAAsC;CAAE,IAAAI;CAAA,IAAAX,EAAA,OAAAE,OAAAF,EAAA,OAAAF,IAAA;EAG5Ea,MAAAC,YAAA;GACEV,IAAGG,cAAe,CAAC,CAAAQ,SAAUf,KAAIF,SAAA;IAC/B,IAAI,OAAOgB,YAAY,YAAU,OACvBA,QAAqChB,IAAc;IAC5D,OACMgB;GAAO,CACf;EAAC;EACHZ,EAAA,KAAAE;EAAAF,EAAA,KAAAF;EAAAE,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CARH,MAAAa,WAAiBF;CAUf,IAAAG;CAAA,IAAAd,EAAA,OAAAE,OAAAF,EAAA,OAAAF,IAAA;EAGAgB,MAAAC,aAAA;GACEb,IAAGG,cAAe,CAAC,CAAAW,YAAalB,IAAIiB,QAAQ;EAAC;EAC9Cf,EAAA,KAAAE;EAAAF,EAAA,KAAAF;EAAAE,EAAA,KAAAc;CAAA,OAAAA,KAAAd,EAAA;CAHH,MAAAgB,cAAoBF;CAKlB,IAAAG;CAAA,IAAAjB,EAAA,OAAAE,KAAA;EAEwBe,WAAMf,IAAGG,cAAe,CAAC,CAAAa,MAAO;EAAClB,EAAA,KAAAE;EAAAF,EAAA,KAAAiB;CAAA,OAAAA,KAAAjB,EAAA;CAA3D,MAAAkB,QAAcD;CAOC,MAAAE,KAAAT,mBAAiBU,aAAjB;CACJ,MAAAC,KAAAX,mBAAiBY;CAAO,IAAAC;CAAA,IAAAvB,EAAA,QAAAkB,SAAAlB,EAAA,QAAAgB,eAAAhB,EAAA,QAAAa,YAAAb,EAAA,QAAAmB,MAAAnB,EAAA,QAAAqB,IAAA;EAJjCE,KAAA;GAAAV;GAAAG;GAAAI,WAGaD;GAAqCG,OACzCD;GAAwBH;EAEjC;EAAClB,EAAA,MAAAkB;EAAAlB,EAAA,MAAAgB;EAAAhB,EAAA,MAAAa;EAAAb,EAAA,MAAAmB;EAAAnB,EAAA,MAAAqB;EAAArB,EAAA,MAAAuB;CAAA,OAAAA,KAAAvB,EAAA;CAAA,IAAAwB;CAAA,IAAAxB,EAAA,QAAAG,SAAAH,EAAA,QAAAuB,IAAA;EARIC,KAAA,CACLrB,OACAoB,EAMC;EACFvB,EAAA,MAAAG;EAAAH,EAAA,MAAAuB;EAAAvB,EAAA,MAAAwB;CAAA,OAAAA,KAAAxB,EAAA;CAAA,OATMwB;AASN"}
1
+ {"version":3,"file":"useInteractableState.js","names":["useCallback","useAui","useAuiState","StateUpdater","TState","prev","useInteractableState","id","fallback","$","_c","aui","state","s","interactables","definitions","t0","s_0","persistence","persistenceStatus","t1","updater","setState","t2","selected","setSelected","t3","flush","t4","isPending","t5","error","t6","t7"],"sources":["../../../src/react/interactables-legacy/useInteractableState.ts"],"sourcesContent":["import { useCallback } from \"react\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\n\ntype StateUpdater<TState> = TState | ((prev: TState) => TState);\n\n/**\n * Reads and writes the state of a registered interactable.\n *\n * Pair with {@link useAssistantInteractable} which handles registration.\n *\n * @deprecated Since 2026-06-14 — migrate to the Unstable / Experimental API.\n * Scheduled for removal on/after 2026-09-14. See\n * {@link https://www.assistant-ui.com/docs/tools/interactables#migrating-from-the-previous-api | Interactables migration guide}.\n */\nexport const useInteractableState = <TState>(\n id: string,\n fallback: TState,\n): [\n TState,\n {\n setState: (updater: StateUpdater<TState>) => void;\n setSelected: (selected: boolean) => void;\n isPending: boolean;\n error: unknown;\n flush: () => Promise<void>;\n },\n] => {\n const aui = useAui();\n\n const state =\n (useAuiState((s) => s.interactables.definitions[id]?.state) as TState) ??\n (fallback as TState);\n\n const persistenceStatus = useAuiState((s) => s.interactables.persistence[id]);\n\n const setState = useCallback(\n (updater: StateUpdater<TState>) => {\n aui.interactables.setState(id, (prev) => {\n if (typeof updater === \"function\") {\n return (updater as (prev: TState) => TState)(prev as TState);\n }\n return updater;\n });\n },\n [aui, id],\n );\n\n const setSelected = useCallback(\n (selected: boolean) => {\n aui.interactables.setSelected(id, selected);\n },\n [aui, id],\n );\n\n const flush = useCallback(() => aui.interactables.flush(), [aui]);\n\n return [\n state,\n {\n setState,\n setSelected,\n isPending: persistenceStatus?.isPending ?? false,\n error: persistenceStatus?.error,\n flush,\n },\n ];\n};\n"],"mappings":";;;;;;;;;;;;;AAcA,MAAaM,wBAAuBC,IAAAC,aAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAalC,MAAAC,MAAYV,OAAO;CAEnB,MAAAW,QACGV,aAAYW,MAAOA,EAACC,cAAcC,YAAaR,GAAU,EAAAK,KAAA,KACzDJ;CAAoB,IAAAQ;CAAA,IAAAP,EAAA,OAAAF,IAAA;EAEeS,MAAAC,QAAOJ,IAACC,cAAcI,YAAaX;EAAGE,EAAA,KAAAF;EAAAE,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CAA5E,MAAAU,oBAA0BjB,YAAYc,EAAsC;CAAE,IAAAI;CAAA,IAAAX,EAAA,OAAAE,OAAAF,EAAA,OAAAF,IAAA;EAG5Ea,MAAAC,YAAA;GACEV,IAAGG,cAAcQ,SAAUf,KAAIF,SAAA;IAC7B,IAAI,OAAOgB,YAAY,YAAU,OACvBA,QAAqChB,IAAc;IAC5D,OACMgB;GAAO,CACf;EAAC;EACHZ,EAAA,KAAAE;EAAAF,EAAA,KAAAF;EAAAE,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CARH,MAAAa,WAAiBF;CAUf,IAAAG;CAAA,IAAAd,EAAA,OAAAE,OAAAF,EAAA,OAAAF,IAAA;EAGAgB,MAAAC,aAAA;GACEb,IAAGG,cAAcW,YAAalB,IAAIiB,QAAQ;EAAC;EAC5Cf,EAAA,KAAAE;EAAAF,EAAA,KAAAF;EAAAE,EAAA,KAAAc;CAAA,OAAAA,KAAAd,EAAA;CAHH,MAAAgB,cAAoBF;CAKlB,IAAAG;CAAA,IAAAjB,EAAA,OAAAE,KAAA;EAEwBe,WAAMf,IAAGG,cAAca,MAAO;EAAClB,EAAA,KAAAE;EAAAF,EAAA,KAAAiB;CAAA,OAAAA,KAAAjB,EAAA;CAAzD,MAAAkB,QAAcD;CAOC,MAAAE,KAAAT,mBAAiBU,aAAjB;CACJ,MAAAC,KAAAX,mBAAiBY;CAAO,IAAAC;CAAA,IAAAvB,EAAA,QAAAkB,SAAAlB,EAAA,QAAAgB,eAAAhB,EAAA,QAAAa,YAAAb,EAAA,QAAAmB,MAAAnB,EAAA,QAAAqB,IAAA;EAJjCE,KAAA;GAAAV;GAAAG;GAAAI,WAGaD;GAAqCG,OACzCD;GAAwBH;EAEjC;EAAClB,EAAA,MAAAkB;EAAAlB,EAAA,MAAAgB;EAAAhB,EAAA,MAAAa;EAAAb,EAAA,MAAAmB;EAAAnB,EAAA,MAAAqB;EAAArB,EAAA,MAAAuB;CAAA,OAAAA,KAAAvB,EAAA;CAAA,IAAAwB;CAAA,IAAAxB,EAAA,QAAAG,SAAAH,EAAA,QAAAuB,IAAA;EARIC,KAAA,CACLrB,OACAoB,EAMC;EACFvB,EAAA,MAAAG;EAAAH,EAAA,MAAAuB;EAAAvB,EAAA,MAAAwB;CAAA,OAAAA,KAAAxB,EAAA;CAAA,OATMwB;AASN"}
@@ -8,7 +8,7 @@ const useAssistantContext = (config) => {
8
8
  getContextRef.current = getContext;
9
9
  useEffect(() => {
10
10
  if (disabled) return;
11
- return aui.modelContext().register({ getModelContext: () => ({ system: getContextRef.current() }) });
11
+ return aui.modelContext.register({ getModelContext: () => ({ system: getContextRef.current() }) });
12
12
  }, [aui, disabled]);
13
13
  };
14
14
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"useAssistantContext.js","names":["useEffect","useRef","useAui","AssistantContextConfig","useAssistantContext","config","getContext","disabled","aui","getContextRef","current","modelContext","register","getModelContext","system"],"sources":["../../../src/react/model-context/useAssistantContext.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type { AssistantContextConfig } from \"../..\";\n\nexport type { AssistantContextConfig };\n\nexport const useAssistantContext = (config: AssistantContextConfig) => {\n const { getContext, disabled = false } = config;\n const aui = useAui();\n const getContextRef = useRef(getContext);\n getContextRef.current = getContext;\n\n useEffect(() => {\n if (disabled) return;\n\n return aui.modelContext().register({\n getModelContext: () => ({\n system: getContextRef.current(),\n }),\n });\n }, [aui, disabled]);\n};\n"],"mappings":";;;AAMA,MAAaI,uBAAuBC,WAAmC;CACrE,MAAM,EAAEC,YAAYC,WAAW,UAAUF;CACzC,MAAMG,MAAMN,OAAO;CACnB,MAAMO,gBAAgBR,OAAOK,UAAU;CACvCG,cAAcC,UAAUJ;CAExBN,gBAAgB;EACd,IAAIO,UAAU;EAEd,OAAOC,IAAIG,aAAa,CAAC,CAACC,SAAS,EACjCC,wBAAwB,EACtBC,QAAQL,cAAcC,QAAQ,EAChC,GACF,CAAC;CACH,GAAG,CAACF,KAAKD,QAAQ,CAAC;AACpB"}
1
+ {"version":3,"file":"useAssistantContext.js","names":["useEffect","useRef","useAui","AssistantContextConfig","useAssistantContext","config","getContext","disabled","aui","getContextRef","current","modelContext","register","getModelContext","system"],"sources":["../../../src/react/model-context/useAssistantContext.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type { AssistantContextConfig } from \"../..\";\n\nexport type { AssistantContextConfig };\n\nexport const useAssistantContext = (config: AssistantContextConfig) => {\n const { getContext, disabled = false } = config;\n const aui = useAui();\n const getContextRef = useRef(getContext);\n getContextRef.current = getContext;\n\n useEffect(() => {\n if (disabled) return;\n\n return aui.modelContext.register({\n getModelContext: () => ({\n system: getContextRef.current(),\n }),\n });\n }, [aui, disabled]);\n};\n"],"mappings":";;;AAMA,MAAaI,uBAAuBC,WAAmC;CACrE,MAAM,EAAEC,YAAYC,WAAW,UAAUF;CACzC,MAAMG,MAAMN,OAAO;CACnB,MAAMO,gBAAgBR,OAAOK,UAAU;CACvCG,cAAcC,UAAUJ;CAExBN,gBAAgB;EACd,IAAIO,UAAU;EAEd,OAAOC,IAAIG,aAAaC,SAAS,EAC/BC,wBAAwB,EACtBC,QAAQL,cAAcC,QAAQ,EAChC,GACF,CAAC;CACH,GAAG,CAACF,KAAKD,QAAQ,CAAC;AACpB"}
@@ -15,7 +15,7 @@ const useAssistantDataUI = (dataUI) => {
15
15
  if ($[0] !== aui || $[1] !== dataUI) {
16
16
  t0 = () => {
17
17
  if (!dataUI?.name || !dataUI?.render) return;
18
- return aui.dataRenderers().setDataUI(dataUI.name, dataUI.render);
18
+ return aui.dataRenderers.setDataUI(dataUI.name, dataUI.render);
19
19
  };
20
20
  $[0] = aui;
21
21
  $[1] = dataUI;
@@ -1 +1 @@
1
- {"version":3,"file":"useAssistantDataUI.js","names":["useEffect","useAui","DataMessagePartComponent","AssistantDataUIProps","name","render","T","useAssistantDataUI","dataUI","$","_c","aui","t0","dataRenderers","setDataUI","t1","t2","t3"],"sources":["../../../src/react/model-context/useAssistantDataUI.ts"],"sourcesContent":["import { useEffect } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type { DataMessagePartComponent } from \"../types/MessagePartComponentTypes\";\n\n/** Props used to register a renderer for `data` message parts. */\nexport type AssistantDataUIProps<T = any> = {\n /** Data part name this renderer handles. */\n name: string;\n /** Component rendered for matching data message parts. */\n render: DataMessagePartComponent<T>;\n};\n\n/**\n * Registers a renderer for named `data` message parts while the component is\n * mounted.\n *\n * @param dataUI - Data renderer registration, or `null` to skip registration.\n */\nexport const useAssistantDataUI = (dataUI: AssistantDataUIProps | null) => {\n const aui = useAui();\n useEffect(() => {\n if (!dataUI?.name || !dataUI?.render) return undefined;\n return aui.dataRenderers().setDataUI(dataUI.name, dataUI.render);\n }, [aui, dataUI?.name, dataUI?.render]);\n};\n"],"mappings":";;;;;;;;;;AAkBA,MAAaO,sBAAqBC,WAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAChC,MAAAC,MAAYV,OAAO;CAAE,IAAAW;CAAA,IAAAH,EAAA,OAAAE,OAAAF,EAAA,OAAAD,QAAA;EACXI,WAAA;GACR,IAAI,CAACJ,QAAMJ,QAAP,CAAkBI,QAAMH,QAAQ;GAAmB,OAChDM,IAAGE,cAAe,CAAC,CAAAC,UAAWN,OAAMJ,MAAOI,OAAMH,MAAO;EAAC;EACjEI,EAAA,KAAAE;EAAAF,EAAA,KAAAD;EAAAC,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAQ,MAAAM,KAAAP,QAAMJ;CAAQ,MAAAY,KAAAR,QAAMH;CAAQ,IAAAY;CAAA,IAAAR,EAAA,OAAAE,OAAAF,EAAA,OAAAM,MAAAN,EAAA,OAAAO,IAAA;EAAlCC,KAAA;GAACN;GAAKI;GAAcC;EAAc;EAACP,EAAA,KAAAE;EAAAF,EAAA,KAAAM;EAAAN,EAAA,KAAAO;EAAAP,EAAA,KAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAHtCT,UAAUY,IAGPK,EAAmC;AAAC"}
1
+ {"version":3,"file":"useAssistantDataUI.js","names":["useEffect","useAui","DataMessagePartComponent","AssistantDataUIProps","name","render","T","useAssistantDataUI","dataUI","$","_c","aui","t0","dataRenderers","setDataUI","t1","t2","t3"],"sources":["../../../src/react/model-context/useAssistantDataUI.ts"],"sourcesContent":["import { useEffect } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type { DataMessagePartComponent } from \"../types/MessagePartComponentTypes\";\n\n/** Props used to register a renderer for `data` message parts. */\nexport type AssistantDataUIProps<T = any> = {\n /** Data part name this renderer handles. */\n name: string;\n /** Component rendered for matching data message parts. */\n render: DataMessagePartComponent<T>;\n};\n\n/**\n * Registers a renderer for named `data` message parts while the component is\n * mounted.\n *\n * @param dataUI - Data renderer registration, or `null` to skip registration.\n */\nexport const useAssistantDataUI = (dataUI: AssistantDataUIProps | null) => {\n const aui = useAui();\n useEffect(() => {\n if (!dataUI?.name || !dataUI?.render) return undefined;\n return aui.dataRenderers.setDataUI(dataUI.name, dataUI.render);\n }, [aui, dataUI?.name, dataUI?.render]);\n};\n"],"mappings":";;;;;;;;;;AAkBA,MAAaO,sBAAqBC,WAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAChC,MAAAC,MAAYV,OAAO;CAAE,IAAAW;CAAA,IAAAH,EAAA,OAAAE,OAAAF,EAAA,OAAAD,QAAA;EACXI,WAAA;GACR,IAAI,CAACJ,QAAMJ,QAAP,CAAkBI,QAAMH,QAAQ;GAAmB,OAChDM,IAAGE,cAAcC,UAAWN,OAAMJ,MAAOI,OAAMH,MAAO;EAAC;EAC/DI,EAAA,KAAAE;EAAAF,EAAA,KAAAD;EAAAC,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAQ,MAAAM,KAAAP,QAAMJ;CAAQ,MAAAY,KAAAR,QAAMH;CAAQ,IAAAY;CAAA,IAAAR,EAAA,OAAAE,OAAAF,EAAA,OAAAM,MAAAN,EAAA,OAAAO,IAAA;EAAlCC,KAAA;GAACN;GAAKI;GAAcC;EAAc;EAACP,EAAA,KAAAE;EAAAF,EAAA,KAAAM;EAAAN,EAAA,KAAAO;EAAAP,EAAA,KAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAHtCT,UAAUY,IAGPK,EAAmC;AAAC"}
@@ -23,7 +23,7 @@ const useAssistantInstructions = (config) => {
23
23
  t2 = () => {
24
24
  if (disabled) return;
25
25
  const config_0 = { system: instruction };
26
- return aui.modelContext().register({ getModelContext: () => config_0 });
26
+ return aui.modelContext.register({ getModelContext: () => config_0 });
27
27
  };
28
28
  t3 = [
29
29
  aui,
@@ -1 +1 @@
1
- {"version":3,"file":"useAssistantInstructions.js","names":["useEffect","useAui","AssistantInstructionsConfig","getInstructions","instruction","useAssistantInstructions","config","$","_c","t0","disabled","t1","undefined","aui","t2","t3","config_0","system","modelContext","register","getModelContext"],"sources":["../../../src/react/model-context/useAssistantInstructions.ts"],"sourcesContent":["import { useEffect } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type { AssistantInstructionsConfig } from \"../..\";\n\nexport type { AssistantInstructionsConfig };\n\nconst getInstructions = (\n instruction: string | AssistantInstructionsConfig,\n): AssistantInstructionsConfig => {\n if (typeof instruction === \"string\") return { instruction };\n return instruction;\n};\n\nexport const useAssistantInstructions = (\n config: string | AssistantInstructionsConfig,\n) => {\n const { instruction, disabled = false } = getInstructions(config);\n const aui = useAui();\n\n useEffect(() => {\n if (disabled) return;\n\n const config = {\n system: instruction,\n };\n return aui.modelContext().register({\n getModelContext: () => config,\n });\n }, [aui, instruction, disabled]);\n};\n"],"mappings":";;;;AAMA,MAAMG,mBACJC,gBACgC;CAChC,IAAI,OAAOA,gBAAgB,UAAU,OAAO,EAAEA,YAAY;CAC1D,OAAOA;AACT;AAEA,MAAaC,4BAA2BC,WAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAA,IAAAC;CAAA,IAAAF,EAAA,OAAAD,QAAA;EAGIG,KAAAN,gBAAgBG,MAAM;EAACC,EAAA,KAAAD;EAAAC,EAAA,KAAAE;CAAA,OAAAA,KAAAF,EAAA;CAAjE,MAAA,EAAAH,aAAAM,UAAAC,OAA0CF;CAArB,MAAAC,WAAAC,OAAAC,KAAAA,IAAA,QAAAD;CACrB,MAAAE,MAAYZ,OAAO;CAAE,IAAAa;CAAA,IAAAC;CAAA,IAAAR,EAAA,OAAAM,OAAAN,EAAA,OAAAG,YAAAH,EAAA,OAAAH,aAAA;EAEXU,WAAA;GACR,IAAIJ,UAAQ;GAEZ,MAAAM,WAAe,EAAAC,QACLb,YACV;GAAE,OACKS,IAAGK,aAAc,CAAC,CAAAC,SAAU,EAAAC,uBACVd,SACzB,CAAC;EAAC;EACDS,KAAA;GAACF;GAAKT;GAAaM;EAAQ;EAACH,EAAA,KAAAM;EAAAN,EAAA,KAAAG;EAAAH,EAAA,KAAAH;EAAAG,EAAA,KAAAO;EAAAP,EAAA,KAAAQ;CAAA,OAAA;EAAAD,KAAAP,EAAA;EAAAQ,KAAAR,EAAA;CAAA;CAT/BP,UAAUc,IASPC,EAA4B;AAAC"}
1
+ {"version":3,"file":"useAssistantInstructions.js","names":["useEffect","useAui","AssistantInstructionsConfig","getInstructions","instruction","useAssistantInstructions","config","$","_c","t0","disabled","t1","undefined","aui","t2","t3","config_0","system","modelContext","register","getModelContext"],"sources":["../../../src/react/model-context/useAssistantInstructions.ts"],"sourcesContent":["import { useEffect } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type { AssistantInstructionsConfig } from \"../..\";\n\nexport type { AssistantInstructionsConfig };\n\nconst getInstructions = (\n instruction: string | AssistantInstructionsConfig,\n): AssistantInstructionsConfig => {\n if (typeof instruction === \"string\") return { instruction };\n return instruction;\n};\n\nexport const useAssistantInstructions = (\n config: string | AssistantInstructionsConfig,\n) => {\n const { instruction, disabled = false } = getInstructions(config);\n const aui = useAui();\n\n useEffect(() => {\n if (disabled) return;\n\n const config = {\n system: instruction,\n };\n return aui.modelContext.register({\n getModelContext: () => config,\n });\n }, [aui, instruction, disabled]);\n};\n"],"mappings":";;;;AAMA,MAAMG,mBACJC,gBACgC;CAChC,IAAI,OAAOA,gBAAgB,UAAU,OAAO,EAAEA,YAAY;CAC1D,OAAOA;AACT;AAEA,MAAaC,4BAA2BC,WAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAA,IAAAC;CAAA,IAAAF,EAAA,OAAAD,QAAA;EAGIG,KAAAN,gBAAgBG,MAAM;EAACC,EAAA,KAAAD;EAAAC,EAAA,KAAAE;CAAA,OAAAA,KAAAF,EAAA;CAAjE,MAAA,EAAAH,aAAAM,UAAAC,OAA0CF;CAArB,MAAAC,WAAAC,OAAAC,KAAAA,IAAA,QAAAD;CACrB,MAAAE,MAAYZ,OAAO;CAAE,IAAAa;CAAA,IAAAC;CAAA,IAAAR,EAAA,OAAAM,OAAAN,EAAA,OAAAG,YAAAH,EAAA,OAAAH,aAAA;EAEXU,WAAA;GACR,IAAIJ,UAAQ;GAEZ,MAAAM,WAAe,EAAAC,QACLb,YACV;GAAE,OACKS,IAAGK,aAAaC,SAAU,EAAAC,uBACRd,SACzB,CAAC;EAAC;EACDS,KAAA;GAACF;GAAKT;GAAaM;EAAQ;EAACH,EAAA,KAAAM;EAAAN,EAAA,KAAAG;EAAAH,EAAA,KAAAH;EAAAG,EAAA,KAAAO;EAAAP,EAAA,KAAAQ;CAAA,OAAA;EAAAD,KAAAP,EAAA;EAAAQ,KAAAR,EAAA;CAAA;CAT/BP,UAAUc,IASPC,EAA4B;AAAC"}
@@ -38,7 +38,7 @@ import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
38
38
  * ```
39
39
  */
40
40
  const useAssistantTool = (tool) => {
41
- const $ = c(14);
41
+ const $ = c(20);
42
42
  const aui = useAui();
43
43
  let t0;
44
44
  if ($[0] !== tool) {
@@ -56,46 +56,50 @@ const useAssistantTool = (tool) => {
56
56
  const renderTextComponent = t1;
57
57
  const render = tool.render ?? renderTextComponent;
58
58
  let t2;
59
- let t3;
60
- if ($[4] !== aui || $[5] !== render || $[6] !== standalone || $[7] !== tool.toolName) {
59
+ if ($[4] !== aui.tools || $[5] !== render || $[6] !== standalone || $[7] !== tool.toolName) {
61
60
  t2 = () => {
62
61
  if (!render) return;
63
- return aui.tools().setToolUI(tool.toolName, render, { standalone });
62
+ return aui.tools.setToolUI(tool.toolName, render, { standalone });
64
63
  };
64
+ $[4] = aui.tools;
65
+ $[5] = render;
66
+ $[6] = standalone;
67
+ $[7] = tool.toolName;
68
+ $[8] = t2;
69
+ } else t2 = $[8];
70
+ let t3;
71
+ if ($[9] !== aui || $[10] !== render || $[11] !== standalone || $[12] !== tool.toolName) {
65
72
  t3 = [
66
73
  aui,
67
74
  tool.toolName,
68
75
  render,
69
76
  standalone
70
77
  ];
71
- $[4] = aui;
72
- $[5] = render;
73
- $[6] = standalone;
74
- $[7] = tool.toolName;
75
- $[8] = t2;
76
- $[9] = t3;
77
- } else {
78
- t2 = $[8];
79
- t3 = $[9];
80
- }
78
+ $[9] = aui;
79
+ $[10] = render;
80
+ $[11] = standalone;
81
+ $[12] = tool.toolName;
82
+ $[13] = t3;
83
+ } else t3 = $[13];
81
84
  useEffect(t2, t3);
82
85
  let t4;
83
- let t5;
84
- if ($[10] !== aui || $[11] !== tool) {
86
+ if ($[14] !== aui.modelContext || $[15] !== tool) {
85
87
  t4 = () => {
86
88
  const { toolName, render: render_0, renderText, display, ...rest } = tool;
87
89
  const context = { tools: { [toolName]: rest } };
88
- return aui.modelContext().register({ getModelContext: () => context });
90
+ return aui.modelContext.register({ getModelContext: () => context });
89
91
  };
92
+ $[14] = aui.modelContext;
93
+ $[15] = tool;
94
+ $[16] = t4;
95
+ } else t4 = $[16];
96
+ let t5;
97
+ if ($[17] !== aui || $[18] !== tool) {
90
98
  t5 = [aui, tool];
91
- $[10] = aui;
92
- $[11] = tool;
93
- $[12] = t4;
94
- $[13] = t5;
95
- } else {
96
- t4 = $[12];
97
- t5 = $[13];
98
- }
99
+ $[17] = aui;
100
+ $[18] = tool;
101
+ $[19] = t5;
102
+ } else t5 = $[19];
99
103
  useEffect(t4, t5);
100
104
  };
101
105
  //#endregion