@assistant-ui/core 0.2.12 → 0.2.14

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 (212) hide show
  1. package/dist/adapters/thread-history.d.ts +3 -1
  2. package/dist/adapters/thread-history.d.ts.map +1 -1
  3. package/dist/index.d.ts +2 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/react/AssistantProvider.js +6 -1
  6. package/dist/react/AssistantProvider.js.map +1 -1
  7. package/dist/react/RuntimeAdapter.d.ts +1 -1
  8. package/dist/react/RuntimeAdapter.d.ts.map +1 -1
  9. package/dist/react/RuntimeAdapter.js +16 -6
  10. package/dist/react/RuntimeAdapter.js.map +1 -1
  11. package/dist/react/client/DataRenderers.d.ts +1 -8
  12. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  13. package/dist/react/client/DataRenderers.js +3 -2
  14. package/dist/react/client/DataRenderers.js.map +1 -1
  15. package/dist/react/client/Interactables.d.ts +1 -1
  16. package/dist/react/client/Interactables.d.ts.map +1 -1
  17. package/dist/react/client/Interactables.js +4 -3
  18. package/dist/react/client/Interactables.js.map +1 -1
  19. package/dist/react/client/Tools.d.ts +2 -13
  20. package/dist/react/client/Tools.d.ts.map +1 -1
  21. package/dist/react/client/Tools.js +4 -3
  22. package/dist/react/client/Tools.js.map +1 -1
  23. package/dist/react/primitives/message/MessageGroupedParts.d.ts +3 -2
  24. package/dist/react/primitives/message/MessageGroupedParts.d.ts.map +1 -1
  25. package/dist/react/primitives/message/MessageGroupedParts.js +4 -4
  26. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  27. package/dist/react/primitives/message/MessageParts.d.ts +28 -1
  28. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  29. package/dist/react/primitives/message/MessageParts.js +43 -9
  30. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  31. package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
  32. package/dist/react/providers/TextMessagePartProvider.js +3 -2
  33. package/dist/react/providers/TextMessagePartProvider.js.map +1 -1
  34. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +2 -0
  35. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  36. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +2 -0
  37. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  38. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +1 -0
  39. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  40. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  41. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +6 -0
  42. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  43. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  44. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +2 -0
  45. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  46. package/dist/react/utils/groupParts.d.ts +13 -1
  47. package/dist/react/utils/groupParts.d.ts.map +1 -1
  48. package/dist/react/utils/groupParts.js +17 -5
  49. package/dist/react/utils/groupParts.js.map +1 -1
  50. package/dist/runtime/api/bindings.d.ts +1 -0
  51. package/dist/runtime/api/bindings.d.ts.map +1 -1
  52. package/dist/runtime/api/message-runtime.d.ts +2 -0
  53. package/dist/runtime/api/message-runtime.d.ts.map +1 -1
  54. package/dist/runtime/api/message-runtime.js +5 -0
  55. package/dist/runtime/api/message-runtime.js.map +1 -1
  56. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  57. package/dist/runtime/api/thread-list-runtime.js +1 -0
  58. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  59. package/dist/runtime/api/thread-runtime.d.ts +3 -0
  60. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  61. package/dist/runtime/api/thread-runtime.js +4 -0
  62. package/dist/runtime/api/thread-runtime.js.map +1 -1
  63. package/dist/runtime/base/base-thread-runtime-core.d.ts +1 -0
  64. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  65. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  66. package/dist/runtime/branch/external-thread-branch-adapter.d.ts +30 -0
  67. package/dist/runtime/branch/external-thread-branch-adapter.d.ts.map +1 -0
  68. package/dist/runtime/branch/external-thread-branch-adapter.js +0 -0
  69. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +1 -0
  70. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  71. package/dist/runtime/interfaces/thread-runtime-core.d.ts +2 -0
  72. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  73. package/dist/runtimes/external-store/external-store-adapter.d.ts +1 -0
  74. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  75. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +1 -0
  76. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  77. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +13 -0
  78. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  79. package/dist/runtimes/local/local-runtime-options.d.ts +1 -1
  80. package/dist/runtimes/local/local-thread-runtime-core.d.ts +8 -1
  81. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  82. package/dist/runtimes/local/local-thread-runtime-core.js +63 -5
  83. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  84. package/dist/runtimes/local/should-continue.js +4 -2
  85. package/dist/runtimes/local/should-continue.js.map +1 -1
  86. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +2 -0
  87. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  88. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +4 -0
  89. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  90. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
  91. package/dist/runtimes/remote-thread-list/empty-thread-core.js +4 -0
  92. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  93. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +1 -0
  94. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  95. package/dist/runtimes/remote-thread-list/remote-thread-state.js +1 -0
  96. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  97. package/dist/runtimes/remote-thread-list/types.d.ts +1 -0
  98. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  99. package/dist/store/clients/chain-of-thought-client.d.ts +2 -7
  100. package/dist/store/clients/chain-of-thought-client.d.ts.map +1 -1
  101. package/dist/store/clients/chain-of-thought-client.js +3 -2
  102. package/dist/store/clients/chain-of-thought-client.js.map +1 -1
  103. package/dist/store/clients/model-context-client.d.ts +1 -1
  104. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  105. package/dist/store/clients/model-context-client.js +3 -2
  106. package/dist/store/clients/model-context-client.js.map +1 -1
  107. package/dist/store/clients/no-op-composer-client.d.ts +2 -4
  108. package/dist/store/clients/no-op-composer-client.d.ts.map +1 -1
  109. package/dist/store/clients/no-op-composer-client.js +3 -2
  110. package/dist/store/clients/no-op-composer-client.js.map +1 -1
  111. package/dist/store/clients/runtime-adapter.d.ts +1 -3
  112. package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
  113. package/dist/store/clients/runtime-adapter.js +2 -15
  114. package/dist/store/clients/runtime-adapter.js.map +1 -1
  115. package/dist/store/clients/suggestions.d.ts +1 -4
  116. package/dist/store/clients/suggestions.d.ts.map +1 -1
  117. package/dist/store/clients/suggestions.js +6 -4
  118. package/dist/store/clients/suggestions.js.map +1 -1
  119. package/dist/store/clients/thread-message-client.d.ts +1 -1
  120. package/dist/store/clients/thread-message-client.d.ts.map +1 -1
  121. package/dist/store/clients/thread-message-client.js +14 -10
  122. package/dist/store/clients/thread-message-client.js.map +1 -1
  123. package/dist/store/internal.d.ts +2 -2
  124. package/dist/store/internal.js +2 -2
  125. package/dist/store/runtime-clients/attachment-runtime-client.d.ts +2 -4
  126. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  127. package/dist/store/runtime-clients/attachment-runtime-client.js +3 -2
  128. package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -1
  129. package/dist/store/runtime-clients/composer-runtime-client.d.ts +2 -10
  130. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  131. package/dist/store/runtime-clients/composer-runtime-client.js +9 -6
  132. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  133. package/dist/store/runtime-clients/message-part-runtime-client.d.ts +2 -4
  134. package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
  135. package/dist/store/runtime-clients/message-part-runtime-client.js +3 -2
  136. package/dist/store/runtime-clients/message-part-runtime-client.js.map +1 -1
  137. package/dist/store/runtime-clients/message-runtime-client.d.ts +2 -7
  138. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  139. package/dist/store/runtime-clients/message-runtime-client.js +10 -6
  140. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  141. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts +2 -4
  142. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  143. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +3 -2
  144. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  145. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts +2 -5
  146. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  147. package/dist/store/runtime-clients/thread-list-runtime-client.js +6 -4
  148. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  149. package/dist/store/runtime-clients/thread-runtime-client.d.ts +2 -4
  150. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  151. package/dist/store/runtime-clients/thread-runtime-client.js +7 -4
  152. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  153. package/dist/store/scopes/message.d.ts +1 -0
  154. package/dist/store/scopes/message.d.ts.map +1 -1
  155. package/dist/store/scopes/thread-list-item.d.ts +1 -0
  156. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  157. package/dist/store/scopes/thread.d.ts +1 -0
  158. package/dist/store/scopes/thread.d.ts.map +1 -1
  159. package/package.json +4 -4
  160. package/src/adapters/thread-history.ts +2 -0
  161. package/src/index.ts +1 -0
  162. package/src/react/AssistantProvider.tsx +3 -1
  163. package/src/react/RuntimeAdapter.ts +25 -8
  164. package/src/react/client/DataRenderers.ts +42 -45
  165. package/src/react/client/Interactables.ts +261 -261
  166. package/src/react/client/Tools.ts +6 -4
  167. package/src/react/primitives/message/MessageGroupedParts.tsx +19 -7
  168. package/src/react/primitives/message/MessageParts.tsx +64 -13
  169. package/src/react/providers/TextMessagePartProvider.tsx +5 -3
  170. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +1 -0
  171. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +11 -0
  172. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +6 -0
  173. package/src/react/utils/groupParts.ts +27 -0
  174. package/src/runtime/api/bindings.ts +1 -0
  175. package/src/runtime/api/message-runtime.ts +7 -0
  176. package/src/runtime/api/thread-list-runtime.ts +1 -0
  177. package/src/runtime/api/thread-runtime.ts +7 -0
  178. package/src/runtime/base/base-thread-runtime-core.ts +1 -0
  179. package/src/runtime/branch/external-thread-branch-adapter.ts +26 -0
  180. package/src/runtime/interfaces/thread-list-runtime-core.ts +1 -0
  181. package/src/runtime/interfaces/thread-runtime-core.ts +2 -0
  182. package/src/runtimes/external-store/external-store-adapter.ts +1 -0
  183. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +24 -0
  184. package/src/runtimes/local/local-runtime-options.ts +1 -1
  185. package/src/runtimes/local/local-thread-runtime-core.test.ts +311 -0
  186. package/src/runtimes/local/local-thread-runtime-core.ts +104 -7
  187. package/src/runtimes/local/should-continue.ts +23 -13
  188. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +5 -0
  189. package/src/runtimes/remote-thread-list/empty-thread-core.ts +5 -0
  190. package/src/runtimes/remote-thread-list/remote-thread-state.ts +2 -0
  191. package/src/runtimes/remote-thread-list/types.ts +1 -0
  192. package/src/store/clients/chain-of-thought-client.ts +5 -3
  193. package/src/store/clients/model-context-client.test.ts +5 -4
  194. package/src/store/clients/model-context-client.ts +21 -21
  195. package/src/store/clients/no-op-composer-client.ts +5 -3
  196. package/src/store/clients/runtime-adapter.ts +0 -24
  197. package/src/store/clients/suggestions.ts +9 -18
  198. package/src/store/clients/thread-message-client.ts +29 -26
  199. package/src/store/internal.ts +1 -4
  200. package/src/store/runtime-clients/attachment-runtime-client.ts +14 -14
  201. package/src/store/runtime-clients/composer-runtime-client.ts +30 -24
  202. package/src/store/runtime-clients/message-part-runtime-client.ts +5 -3
  203. package/src/store/runtime-clients/message-runtime-client.ts +26 -19
  204. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +5 -3
  205. package/src/store/runtime-clients/thread-list-runtime-client.ts +10 -6
  206. package/src/store/runtime-clients/thread-runtime-client.ts +11 -6
  207. package/src/store/scopes/message.ts +1 -0
  208. package/src/store/scopes/thread-list-item.ts +1 -0
  209. package/src/store/scopes/thread.ts +1 -0
  210. package/src/tests/external-store-thread-runtime-core.test.ts +57 -0
  211. package/src/tests/groupMessageParts.test.ts +84 -0
  212. package/src/tests/groupParts.test.ts +55 -0
@@ -1 +1 @@
1
- {"version":3,"file":"thread-list-runtime.js","names":[],"sources":["../../../src/runtime/api/thread-list-runtime.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport {\n LazyMemoizeSubject,\n NestedSubscriptionSubject,\n} from \"../../subscribable/subscribable\";\nimport {\n SKIP_UPDATE,\n ShallowMemoizeSubject,\n} from \"../../subscribable/subscribable\";\nimport type { ThreadListRuntimeCore } from \"../interfaces/thread-list-runtime-core\";\nimport {\n type ThreadListItemRuntime,\n ThreadListItemRuntimeImpl,\n type ThreadListItemState,\n} from \"./thread-list-item-runtime\";\nimport {\n type ThreadListItemRuntimeBinding,\n type ThreadRuntime,\n type ThreadRuntimeCoreBinding,\n ThreadRuntimeImpl,\n} from \"./thread-runtime\";\n\nconst RESOLVED_PROMISE = Promise.resolve();\n\nexport type ThreadListState = {\n readonly mainThreadId: string;\n readonly newThreadId: string | undefined;\n readonly threadIds: readonly string[];\n readonly archivedThreadIds: readonly string[];\n readonly isLoading: boolean;\n readonly isLoadingMore: boolean;\n readonly hasMore: boolean;\n readonly threadItems: Readonly<\n Record<string, Omit<ThreadListItemState, \"isMain\" | \"threadId\">>\n >;\n};\n\nexport type ThreadListRuntime = {\n getState(): ThreadListState;\n\n subscribe(callback: () => void): Unsubscribe;\n\n readonly main: ThreadRuntime;\n getById(threadId: string): ThreadRuntime;\n\n readonly mainItem: ThreadListItemRuntime;\n getItemById(threadId: string): ThreadListItemRuntime;\n getItemByIndex(idx: number): ThreadListItemRuntime;\n getArchivedItemByIndex(idx: number): ThreadListItemRuntime;\n\n switchToThread(\n threadId: string,\n options?: { unarchive?: boolean },\n ): Promise<void>;\n switchToNewThread(): Promise<void>;\n\n getLoadThreadsPromise(): Promise<void>;\n reload(): Promise<void>;\n loadMore(): Promise<void>;\n};\n\nconst getThreadListState = (\n threadList: ThreadListRuntimeCore,\n): ThreadListState => {\n return {\n mainThreadId: threadList.mainThreadId,\n newThreadId: threadList.newThreadId,\n threadIds: threadList.threadIds,\n archivedThreadIds: threadList.archivedThreadIds,\n isLoading: threadList.isLoading,\n isLoadingMore: threadList.isLoadingMore ?? false,\n hasMore: threadList.hasMore ?? false,\n threadItems: threadList.threadItems,\n };\n};\n\nconst getThreadListItemState = (\n threadList: ThreadListRuntimeCore,\n threadId: string | undefined,\n): ThreadListItemState | SKIP_UPDATE => {\n if (threadId === undefined) return SKIP_UPDATE;\n\n const threadData = threadList.getItemById(threadId);\n if (!threadData) return SKIP_UPDATE;\n return {\n id: threadData.id,\n remoteId: threadData.remoteId,\n externalId: threadData.externalId,\n title: threadData.title,\n status: threadData.status,\n custom: threadData.custom,\n isMain: threadData.id === threadList.mainThreadId,\n };\n};\n\nexport type ThreadListRuntimeCoreBinding = ThreadListRuntimeCore;\n\nexport class ThreadListRuntimeImpl implements ThreadListRuntime {\n private _getState;\n constructor(\n private _core: ThreadListRuntimeCoreBinding,\n private _runtimeFactory: new (\n binding: ThreadRuntimeCoreBinding,\n threadListItemBinding: ThreadListItemRuntimeBinding,\n ) => ThreadRuntime = ThreadRuntimeImpl,\n ) {\n const stateBinding = new LazyMemoizeSubject({\n path: {},\n getState: () => getThreadListState(_core),\n subscribe: (callback) => _core.subscribe(callback),\n });\n\n this._getState = stateBinding.getState.bind(stateBinding);\n\n this._mainThreadListItemRuntime = new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `threadItems[main]`,\n threadSelector: { type: \"main\" },\n },\n getState: () => {\n return getThreadListItemState(this._core, this._core.mainThreadId);\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n\n this.main = new _runtimeFactory(\n new NestedSubscriptionSubject({\n path: {\n ref: \"threads.main\",\n threadSelector: { type: \"main\" },\n },\n getState: () => _core.getMainThreadRuntimeCore(),\n subscribe: (callback) => _core.subscribe(callback),\n }),\n this._mainThreadListItemRuntime,\n );\n\n this.__internal_bindMethods();\n }\n\n protected __internal_bindMethods() {\n this.switchToThread = this.switchToThread.bind(this);\n this.switchToNewThread = this.switchToNewThread.bind(this);\n this.getLoadThreadsPromise = this.getLoadThreadsPromise.bind(this);\n this.reload = this.reload.bind(this);\n this.loadMore = this.loadMore.bind(this);\n this.getState = this.getState.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.getById = this.getById.bind(this);\n this.getItemById = this.getItemById.bind(this);\n this.getItemByIndex = this.getItemByIndex.bind(this);\n this.getArchivedItemByIndex = this.getArchivedItemByIndex.bind(this);\n }\n\n public switchToThread(\n threadId: string,\n options?: { unarchive?: boolean },\n ): Promise<void> {\n return this._core.switchToThread(threadId, options);\n }\n\n public switchToNewThread(): Promise<void> {\n return this._core.switchToNewThread();\n }\n\n public getLoadThreadsPromise(): Promise<void> {\n return this._core.getLoadThreadsPromise();\n }\n\n public reload(): Promise<void> {\n return this._core.reload?.() ?? RESOLVED_PROMISE;\n }\n\n public loadMore(): Promise<void> {\n return this._core.loadMore?.() ?? RESOLVED_PROMISE;\n }\n\n public getState(): ThreadListState {\n return this._getState();\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n return this._core.subscribe(callback);\n }\n\n private _mainThreadListItemRuntime;\n\n public readonly main: ThreadRuntime;\n\n public get mainItem() {\n return this._mainThreadListItemRuntime;\n }\n\n public getById(threadId: string) {\n return new this._runtimeFactory(\n new NestedSubscriptionSubject({\n path: {\n ref: `threads[threadId=${JSON.stringify(threadId)}]`,\n threadSelector: { type: \"threadId\", threadId },\n },\n getState: () => this._core.getThreadRuntimeCore(threadId),\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this.mainItem,\n );\n }\n\n public getItemByIndex(idx: number) {\n return new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `threadItems[${idx}]`,\n threadSelector: { type: \"index\", index: idx },\n },\n getState: () => {\n return getThreadListItemState(this._core, this._core.threadIds[idx]);\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n }\n\n public getArchivedItemByIndex(idx: number) {\n return new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `archivedThreadItems[${idx}]`,\n threadSelector: { type: \"archiveIndex\", index: idx },\n },\n getState: () => {\n return getThreadListItemState(\n this._core,\n this._core.archivedThreadIds[idx],\n );\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n }\n\n public getItemById(threadId: string) {\n return new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `threadItems[threadId=${threadId}]`,\n threadSelector: { type: \"threadId\", threadId },\n },\n getState: () => {\n return getThreadListItemState(this._core, threadId);\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"thread-list-runtime.js","names":[],"sources":["../../../src/runtime/api/thread-list-runtime.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport {\n LazyMemoizeSubject,\n NestedSubscriptionSubject,\n} from \"../../subscribable/subscribable\";\nimport {\n SKIP_UPDATE,\n ShallowMemoizeSubject,\n} from \"../../subscribable/subscribable\";\nimport type { ThreadListRuntimeCore } from \"../interfaces/thread-list-runtime-core\";\nimport {\n type ThreadListItemRuntime,\n ThreadListItemRuntimeImpl,\n type ThreadListItemState,\n} from \"./thread-list-item-runtime\";\nimport {\n type ThreadListItemRuntimeBinding,\n type ThreadRuntime,\n type ThreadRuntimeCoreBinding,\n ThreadRuntimeImpl,\n} from \"./thread-runtime\";\n\nconst RESOLVED_PROMISE = Promise.resolve();\n\nexport type ThreadListState = {\n readonly mainThreadId: string;\n readonly newThreadId: string | undefined;\n readonly threadIds: readonly string[];\n readonly archivedThreadIds: readonly string[];\n readonly isLoading: boolean;\n readonly isLoadingMore: boolean;\n readonly hasMore: boolean;\n readonly threadItems: Readonly<\n Record<string, Omit<ThreadListItemState, \"isMain\" | \"threadId\">>\n >;\n};\n\nexport type ThreadListRuntime = {\n getState(): ThreadListState;\n\n subscribe(callback: () => void): Unsubscribe;\n\n readonly main: ThreadRuntime;\n getById(threadId: string): ThreadRuntime;\n\n readonly mainItem: ThreadListItemRuntime;\n getItemById(threadId: string): ThreadListItemRuntime;\n getItemByIndex(idx: number): ThreadListItemRuntime;\n getArchivedItemByIndex(idx: number): ThreadListItemRuntime;\n\n switchToThread(\n threadId: string,\n options?: { unarchive?: boolean },\n ): Promise<void>;\n switchToNewThread(): Promise<void>;\n\n getLoadThreadsPromise(): Promise<void>;\n reload(): Promise<void>;\n loadMore(): Promise<void>;\n};\n\nconst getThreadListState = (\n threadList: ThreadListRuntimeCore,\n): ThreadListState => {\n return {\n mainThreadId: threadList.mainThreadId,\n newThreadId: threadList.newThreadId,\n threadIds: threadList.threadIds,\n archivedThreadIds: threadList.archivedThreadIds,\n isLoading: threadList.isLoading,\n isLoadingMore: threadList.isLoadingMore ?? false,\n hasMore: threadList.hasMore ?? false,\n threadItems: threadList.threadItems,\n };\n};\n\nconst getThreadListItemState = (\n threadList: ThreadListRuntimeCore,\n threadId: string | undefined,\n): ThreadListItemState | SKIP_UPDATE => {\n if (threadId === undefined) return SKIP_UPDATE;\n\n const threadData = threadList.getItemById(threadId);\n if (!threadData) return SKIP_UPDATE;\n return {\n id: threadData.id,\n remoteId: threadData.remoteId,\n externalId: threadData.externalId,\n title: threadData.title,\n status: threadData.status,\n lastMessageAt: threadData.lastMessageAt,\n custom: threadData.custom,\n isMain: threadData.id === threadList.mainThreadId,\n };\n};\n\nexport type ThreadListRuntimeCoreBinding = ThreadListRuntimeCore;\n\nexport class ThreadListRuntimeImpl implements ThreadListRuntime {\n private _getState;\n constructor(\n private _core: ThreadListRuntimeCoreBinding,\n private _runtimeFactory: new (\n binding: ThreadRuntimeCoreBinding,\n threadListItemBinding: ThreadListItemRuntimeBinding,\n ) => ThreadRuntime = ThreadRuntimeImpl,\n ) {\n const stateBinding = new LazyMemoizeSubject({\n path: {},\n getState: () => getThreadListState(_core),\n subscribe: (callback) => _core.subscribe(callback),\n });\n\n this._getState = stateBinding.getState.bind(stateBinding);\n\n this._mainThreadListItemRuntime = new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `threadItems[main]`,\n threadSelector: { type: \"main\" },\n },\n getState: () => {\n return getThreadListItemState(this._core, this._core.mainThreadId);\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n\n this.main = new _runtimeFactory(\n new NestedSubscriptionSubject({\n path: {\n ref: \"threads.main\",\n threadSelector: { type: \"main\" },\n },\n getState: () => _core.getMainThreadRuntimeCore(),\n subscribe: (callback) => _core.subscribe(callback),\n }),\n this._mainThreadListItemRuntime,\n );\n\n this.__internal_bindMethods();\n }\n\n protected __internal_bindMethods() {\n this.switchToThread = this.switchToThread.bind(this);\n this.switchToNewThread = this.switchToNewThread.bind(this);\n this.getLoadThreadsPromise = this.getLoadThreadsPromise.bind(this);\n this.reload = this.reload.bind(this);\n this.loadMore = this.loadMore.bind(this);\n this.getState = this.getState.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.getById = this.getById.bind(this);\n this.getItemById = this.getItemById.bind(this);\n this.getItemByIndex = this.getItemByIndex.bind(this);\n this.getArchivedItemByIndex = this.getArchivedItemByIndex.bind(this);\n }\n\n public switchToThread(\n threadId: string,\n options?: { unarchive?: boolean },\n ): Promise<void> {\n return this._core.switchToThread(threadId, options);\n }\n\n public switchToNewThread(): Promise<void> {\n return this._core.switchToNewThread();\n }\n\n public getLoadThreadsPromise(): Promise<void> {\n return this._core.getLoadThreadsPromise();\n }\n\n public reload(): Promise<void> {\n return this._core.reload?.() ?? RESOLVED_PROMISE;\n }\n\n public loadMore(): Promise<void> {\n return this._core.loadMore?.() ?? RESOLVED_PROMISE;\n }\n\n public getState(): ThreadListState {\n return this._getState();\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n return this._core.subscribe(callback);\n }\n\n private _mainThreadListItemRuntime;\n\n public readonly main: ThreadRuntime;\n\n public get mainItem() {\n return this._mainThreadListItemRuntime;\n }\n\n public getById(threadId: string) {\n return new this._runtimeFactory(\n new NestedSubscriptionSubject({\n path: {\n ref: `threads[threadId=${JSON.stringify(threadId)}]`,\n threadSelector: { type: \"threadId\", threadId },\n },\n getState: () => this._core.getThreadRuntimeCore(threadId),\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this.mainItem,\n );\n }\n\n public getItemByIndex(idx: number) {\n return new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `threadItems[${idx}]`,\n threadSelector: { type: \"index\", index: idx },\n },\n getState: () => {\n return getThreadListItemState(this._core, this._core.threadIds[idx]);\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n }\n\n public getArchivedItemByIndex(idx: number) {\n return new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `archivedThreadItems[${idx}]`,\n threadSelector: { type: \"archiveIndex\", index: idx },\n },\n getState: () => {\n return getThreadListItemState(\n this._core,\n this._core.archivedThreadIds[idx],\n );\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n }\n\n public getItemById(threadId: string) {\n return new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `threadItems[threadId=${threadId}]`,\n threadSelector: { type: \"threadId\", threadId },\n },\n getState: () => {\n return getThreadListItemState(this._core, threadId);\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n }\n}\n"],"mappings":"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"}
@@ -123,6 +123,7 @@ type ThreadRuntime = {
123
123
  * ```
124
124
  */
125
125
  append(message: CreateAppendMessage): void;
126
+ deleteMessage(messageId: string): void | Promise<void>;
126
127
  /**
127
128
  * Start a new run with the given configuration.
128
129
  * @param config The configuration for starting the run
@@ -185,6 +186,7 @@ declare class ThreadRuntimeImpl implements ThreadRuntime {
185
186
  getBranches: (messageId: string) => readonly string[];
186
187
  switchToBranch: (branchId: string) => void;
187
188
  append: (message: AppendMessage) => void;
189
+ deleteMessage: (messageId: string) => void | Promise<void>;
188
190
  startRun: (config: StartRunConfig) => void;
189
191
  resumeRun: (config: ResumeRunConfig) => void;
190
192
  cancelRun: () => void;
@@ -266,6 +268,7 @@ declare class ThreadRuntimeImpl implements ThreadRuntime {
266
268
  readonly composer: ThreadComposerRuntimeImpl;
267
269
  getState(): ThreadState;
268
270
  append(message: CreateAppendMessage): void;
271
+ deleteMessage(messageId: string): void | Promise<void>;
269
272
  subscribe(callback: () => void): Unsubscribe;
270
273
  getModelContext(): ModelContext;
271
274
  startRun(config: CreateStartRunConfig): void;
@@ -1 +1 @@
1
- {"version":3,"file":"thread-runtime.d.ts","names":[],"sources":["../../../src/runtime/api/thread-runtime.ts"],"mappings":"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"}
1
+ {"version":3,"file":"thread-runtime.d.ts","names":[],"sources":["../../../src/runtime/api/thread-runtime.ts"],"mappings":"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"}
@@ -102,6 +102,7 @@ var ThreadRuntimeImpl = class {
102
102
  }
103
103
  __internal_bindMethods() {
104
104
  this.append = this.append.bind(this);
105
+ this.deleteMessage = this.deleteMessage.bind(this);
105
106
  this.resumeRun = this.resumeRun.bind(this);
106
107
  this.importExternalState = this.importExternalState.bind(this);
107
108
  this.exportExternalState = this.exportExternalState.bind(this);
@@ -131,6 +132,9 @@ var ThreadRuntimeImpl = class {
131
132
  append(message) {
132
133
  this._threadBinding.getState().append(toAppendMessage(this._threadBinding.getState().messages, message));
133
134
  }
135
+ deleteMessage(messageId) {
136
+ return this._threadBinding.getState().deleteMessage(messageId);
137
+ }
134
138
  subscribe(callback) {
135
139
  return this._threadBinding.subscribe(callback);
136
140
  }
@@ -1 +1 @@
1
- {"version":3,"file":"thread-runtime.js","names":[],"sources":["../../../src/runtime/api/thread-runtime.ts"],"sourcesContent":["import type {\n ThreadSuggestion,\n RuntimeCapabilities,\n ThreadRuntimeCore,\n SpeechState,\n VoiceSessionState,\n ThreadRuntimeEventCallback,\n ThreadRuntimeEventType,\n StartRunConfig,\n ResumeRunConfig,\n} from \"../interfaces/thread-runtime-core\";\nimport type { ExportedMessageRepository } from \"../utils/message-repository\";\nimport type { ThreadMessageLike } from \"../utils/thread-message-like\";\nimport {\n type MessageRuntime,\n MessageRuntimeImpl,\n type MessageState,\n} from \"./message-runtime\";\nimport { NestedSubscriptionSubject } from \"../../subscribable/subscribable\";\nimport {\n ShallowMemoizeSubject,\n SKIP_UPDATE,\n} from \"../../subscribable/subscribable\";\nimport type { SubscribableWithState } from \"../../subscribable/subscribable\";\nimport {\n type ThreadComposerRuntime,\n ThreadComposerRuntimeImpl,\n} from \"./composer-runtime\";\nimport type {\n MessageRuntimePath,\n ThreadListItemRuntimePath,\n ThreadRuntimePath,\n} from \"./paths\";\nimport type { ThreadListItemState } from \"./bindings\";\nimport type { AppendMessage, ThreadMessage } from \"../../types/message\";\nimport type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { RunConfig } from \"../../types/message\";\nimport { EventSubscriptionSubject } from \"../../subscribable/subscribable\";\nimport { symbolInnerMessage } from \"../utils/external-store-message\";\nimport type { ModelContext } from \"../../model-context/types\";\nimport type {\n ChatModelRunOptions,\n ChatModelRunResult,\n} from \"../utils/chat-model-adapter\";\nimport type { ReadonlyJSONValue } from \"assistant-stream/utils\";\n\nexport type CreateStartRunConfig = {\n parentId: string | null;\n sourceId?: string | null | undefined;\n runConfig?: RunConfig | undefined;\n};\n\nexport type CreateResumeRunConfig = CreateStartRunConfig & {\n stream?: (\n options: ChatModelRunOptions,\n ) => AsyncGenerator<ChatModelRunResult, void, unknown>;\n};\n\nconst toResumeRunConfig = (message: CreateResumeRunConfig): ResumeRunConfig => {\n return {\n parentId: message.parentId ?? null,\n sourceId: message.sourceId ?? null,\n runConfig: message.runConfig ?? {},\n ...(message.stream ? { stream: message.stream } : {}),\n };\n};\n\nconst toStartRunConfig = (message: CreateStartRunConfig): StartRunConfig => {\n return {\n parentId: message.parentId ?? null,\n sourceId: message.sourceId ?? null,\n runConfig: message.runConfig ?? {},\n };\n};\n\nexport type CreateAppendMessage =\n | string\n | {\n parentId?: string | null | undefined;\n sourceId?: string | null | undefined;\n role?: AppendMessage[\"role\"] | undefined;\n content: AppendMessage[\"content\"];\n attachments?: AppendMessage[\"attachments\"] | undefined;\n metadata?: AppendMessage[\"metadata\"] | undefined;\n createdAt?: Date | undefined;\n runConfig?: AppendMessage[\"runConfig\"] | undefined;\n startRun?: boolean | undefined;\n };\n\nconst toAppendMessage = (\n messages: readonly ThreadMessage[],\n message: CreateAppendMessage,\n): AppendMessage => {\n if (typeof message === \"string\") {\n return {\n createdAt: new Date(),\n parentId: messages.at(-1)?.id ?? null,\n sourceId: null,\n runConfig: {},\n role: \"user\",\n content: [{ type: \"text\", text: message }],\n attachments: [],\n metadata: { custom: {} },\n };\n }\n\n return {\n createdAt: message.createdAt ?? new Date(),\n parentId: message.parentId ?? messages.at(-1)?.id ?? null,\n sourceId: message.sourceId ?? null,\n role: message.role ?? \"user\",\n content: message.content,\n attachments: message.attachments ?? [],\n metadata: message.metadata ?? { custom: {} },\n runConfig: message.runConfig ?? {},\n startRun: message.startRun,\n } as AppendMessage;\n};\n\nexport type ThreadRuntimeCoreBinding = SubscribableWithState<\n ThreadRuntimeCore,\n ThreadRuntimePath\n> & {\n outerSubscribe(callback: () => void): Unsubscribe;\n};\n\nexport type ThreadListItemRuntimeBinding = SubscribableWithState<\n ThreadListItemState,\n ThreadListItemRuntimePath\n>;\n\nexport type ThreadState = {\n /**\n * The thread ID.\n * @deprecated This field is deprecated and will be removed in 0.12.0. Use `useThreadListItem().id` instead.\n */\n readonly threadId: string;\n\n /**\n * The thread metadata.\n *\n * @deprecated Use `useThreadListItem()` instead. This field is deprecated and will be removed in 0.12.0.\n */\n readonly metadata: ThreadListItemState;\n\n /**\n * Whether the thread is disabled. Disabled threads cannot receive new messages.\n */\n readonly isDisabled: boolean;\n\n /**\n * Whether the thread is loading its history.\n */\n readonly isLoading: boolean;\n\n /**\n * Whether the thread is running. A thread is considered running when there is an active stream connection to the backend.\n */\n readonly isRunning: boolean;\n\n /**\n * The capabilities of the thread, such as whether the thread supports editing, branch switching, etc.\n */\n readonly capabilities: RuntimeCapabilities;\n\n /**\n * The messages in the currently selected branch of the thread.\n */\n readonly messages: readonly ThreadMessage[];\n\n /**\n * The thread state.\n *\n * @deprecated This feature is experimental\n */\n readonly state: ReadonlyJSONValue;\n\n /**\n * Follow up message suggestions to show the user.\n */\n readonly suggestions: readonly ThreadSuggestion[];\n\n /**\n * Custom extra information provided by the runtime.\n */\n readonly extras: unknown;\n\n /**\n * @deprecated This API is still under active development and might change without notice.\n */\n readonly speech: SpeechState | undefined;\n\n readonly voice: VoiceSessionState | undefined;\n};\n\nexport const getThreadState = (\n runtime: ThreadRuntimeCore,\n threadListItemState: ThreadListItemState,\n): ThreadState => {\n const lastMessage = runtime.messages.at(-1);\n return Object.freeze({\n threadId: threadListItemState.id,\n metadata: threadListItemState,\n capabilities: runtime.capabilities,\n isDisabled: runtime.isDisabled,\n isLoading: runtime.isLoading,\n isRunning:\n runtime.isRunning ??\n (lastMessage?.role !== \"assistant\"\n ? false\n : lastMessage.status.type === \"running\"),\n messages: runtime.messages,\n state: runtime.state,\n suggestions: runtime.suggestions,\n extras: runtime.extras,\n speech: runtime.speech,\n voice: runtime.voice,\n });\n};\n\nexport type ThreadRuntime = {\n /**\n * The selector for the thread runtime.\n */\n readonly path: ThreadRuntimePath;\n\n /**\n * The thread composer runtime.\n */\n readonly composer: ThreadComposerRuntime;\n\n /**\n * Gets a snapshot of the thread state.\n */\n getState(): ThreadState;\n\n /**\n * Append a new message to the thread.\n *\n * @example ```ts\n * // append a new user message with the text \"Hello, world!\"\n * threadRuntime.append(\"Hello, world!\");\n * ```\n *\n * @example ```ts\n * // append a new assistant message with the text \"Hello, world!\"\n * threadRuntime.append({\n * role: \"assistant\",\n * content: [{ type: \"text\", text: \"Hello, world!\" }],\n * });\n * ```\n */\n append(message: CreateAppendMessage): void;\n\n /**\n * Start a new run with the given configuration.\n * @param config The configuration for starting the run\n */\n startRun(config: CreateStartRunConfig): void;\n\n /**\n * Resume a run with the given configuration.\n * @param config The configuration for resuming the run\n **/\n resumeRun(config: CreateResumeRunConfig): void;\n\n /**\n * Export the thread state in the external store format.\n * For AI SDK runtimes, this returns the AI SDK message format.\n * For other runtimes, this may return different formats or throw an error.\n * @returns The thread state in the external format (typed as any)\n */\n exportExternalState(): any;\n\n /**\n * Import thread state from the external store format.\n * For AI SDK runtimes, this accepts AI SDK messages.\n * For other runtimes, this may accept different formats or throw an error.\n * @param state The thread state in the external format (typed as any)\n */\n importExternalState(state: any): void;\n\n subscribe(callback: () => void): Unsubscribe;\n cancelRun(): void;\n getModelContext(): ModelContext;\n\n export(): ExportedMessageRepository;\n import(repository: ExportedMessageRepository): void;\n\n /**\n * Reset the thread with optional initial messages.\n *\n * @param initialMessages - Optional array of initial messages to populate the thread\n */\n reset(initialMessages?: readonly ThreadMessageLike[]): void;\n\n getMessageByIndex(idx: number): MessageRuntime;\n getMessageById(messageId: string): MessageRuntime;\n\n /**\n * @deprecated This API is still under active development and might change without notice.\n */\n stopSpeaking(): void;\n\n connectVoice(): void;\n disconnectVoice(): void;\n getVoiceVolume(): number;\n subscribeVoiceVolume(callback: () => void): Unsubscribe;\n muteVoice(): void;\n unmuteVoice(): void;\n\n unstable_on<E extends ThreadRuntimeEventType>(\n event: E,\n callback: ThreadRuntimeEventCallback<E>,\n ): Unsubscribe;\n};\n\nexport class ThreadRuntimeImpl implements ThreadRuntime {\n public get path() {\n return this._threadBinding.path;\n }\n\n public get __internal_threadBinding() {\n return this._threadBinding;\n }\n\n private readonly _threadBinding: ThreadRuntimeCoreBinding & {\n getStateState(): ThreadState;\n };\n\n constructor(\n threadBinding: ThreadRuntimeCoreBinding,\n threadListItemBinding: ThreadListItemRuntimeBinding,\n ) {\n const stateBinding = new ShallowMemoizeSubject({\n path: threadBinding.path,\n getState: () =>\n getThreadState(\n threadBinding.getState(),\n threadListItemBinding.getState(),\n ),\n subscribe: (callback) => {\n const sub1 = threadBinding.subscribe(callback);\n const sub2 = threadListItemBinding.subscribe(callback);\n return () => {\n sub1();\n sub2();\n };\n },\n });\n\n this._threadBinding = {\n path: threadBinding.path,\n getState: () => threadBinding.getState(),\n getStateState: () => stateBinding.getState(),\n outerSubscribe: (callback) => threadBinding.outerSubscribe(callback),\n subscribe: (callback) => threadBinding.subscribe(callback),\n };\n\n this.composer = new ThreadComposerRuntimeImpl(\n new NestedSubscriptionSubject({\n path: {\n ...this.path,\n ref: `${this.path.ref}.composer`,\n composerSource: \"thread\",\n },\n getState: () => this._threadBinding.getState().composer,\n subscribe: (callback) => this._threadBinding.subscribe(callback),\n }),\n );\n\n this.__internal_bindMethods();\n }\n\n protected __internal_bindMethods() {\n this.append = this.append.bind(this);\n this.resumeRun = this.resumeRun.bind(this);\n this.importExternalState = this.importExternalState.bind(this);\n this.exportExternalState = this.exportExternalState.bind(this);\n this.startRun = this.startRun.bind(this);\n this.cancelRun = this.cancelRun.bind(this);\n this.stopSpeaking = this.stopSpeaking.bind(this);\n this.connectVoice = this.connectVoice.bind(this);\n this.disconnectVoice = this.disconnectVoice.bind(this);\n this.muteVoice = this.muteVoice.bind(this);\n this.unmuteVoice = this.unmuteVoice.bind(this);\n this.getVoiceVolume = this.getVoiceVolume.bind(this);\n this.subscribeVoiceVolume = this.subscribeVoiceVolume.bind(this);\n this.export = this.export.bind(this);\n this.import = this.import.bind(this);\n this.reset = this.reset.bind(this);\n this.getMessageByIndex = this.getMessageByIndex.bind(this);\n this.getMessageById = this.getMessageById.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.unstable_on = this.unstable_on.bind(this);\n this.getModelContext = this.getModelContext.bind(this);\n this.getState = this.getState.bind(this);\n }\n\n public readonly composer;\n\n public getState() {\n return this._threadBinding.getStateState();\n }\n\n public append(message: CreateAppendMessage) {\n this._threadBinding\n .getState()\n .append(\n toAppendMessage(this._threadBinding.getState().messages, message),\n );\n }\n\n public subscribe(callback: () => void) {\n return this._threadBinding.subscribe(callback);\n }\n\n public getModelContext() {\n return this._threadBinding.getState().getModelContext();\n }\n\n public startRun(config: CreateStartRunConfig) {\n return this._threadBinding.getState().startRun(toStartRunConfig(config));\n }\n\n public resumeRun(config: CreateResumeRunConfig) {\n return this._threadBinding.getState().resumeRun(toResumeRunConfig(config));\n }\n\n public exportExternalState() {\n return this._threadBinding.getState().exportExternalState();\n }\n\n public importExternalState(state: any) {\n this._threadBinding.getState().importExternalState(state);\n }\n\n public cancelRun() {\n this._threadBinding.getState().cancelRun();\n }\n\n public stopSpeaking() {\n return this._threadBinding.getState().stopSpeaking();\n }\n\n public connectVoice() {\n this._threadBinding.getState().connectVoice();\n }\n\n public disconnectVoice() {\n this._threadBinding.getState().disconnectVoice();\n }\n\n public getVoiceVolume() {\n return this._threadBinding.getState().getVoiceVolume();\n }\n\n public subscribeVoiceVolume(callback: () => void) {\n return this._threadBinding.getState().subscribeVoiceVolume(callback);\n }\n\n public muteVoice() {\n this._threadBinding.getState().muteVoice();\n }\n\n public unmuteVoice() {\n this._threadBinding.getState().unmuteVoice();\n }\n\n public export() {\n return this._threadBinding.getState().export();\n }\n\n public import(data: ExportedMessageRepository) {\n this._threadBinding.getState().import(data);\n }\n\n public reset(initialMessages?: readonly ThreadMessageLike[]) {\n this._threadBinding.getState().reset(initialMessages);\n }\n\n public getMessageByIndex(idx: number) {\n if (idx < 0) throw new Error(\"Message index must be >= 0\");\n\n return this._getMessageRuntime(\n {\n ...this.path,\n ref: `${this.path.ref}.messages[${idx}]`,\n messageSelector: { type: \"index\", index: idx },\n },\n () => {\n const messages = this._threadBinding.getState().messages;\n const message = messages[idx];\n if (!message) return undefined;\n return {\n message,\n parentId: messages[idx - 1]?.id ?? null,\n index: idx,\n };\n },\n );\n }\n\n public getMessageById(messageId: string) {\n return this._getMessageRuntime(\n {\n ...this.path,\n ref: `${this.path.ref}.messages[messageId=${JSON.stringify(messageId)}]`,\n messageSelector: { type: \"messageId\", messageId: messageId },\n },\n () => this._threadBinding.getState().getMessageById(messageId),\n );\n }\n\n private _getMessageRuntime(\n path: MessageRuntimePath,\n callback: () =>\n | { parentId: string | null; message: ThreadMessage; index: number }\n | undefined,\n ) {\n return new MessageRuntimeImpl(\n new ShallowMemoizeSubject({\n path,\n getState: () => {\n const { message, parentId, index } = callback() ?? {};\n\n const { messages, speech: speechState } =\n this._threadBinding.getState();\n\n if (!message || parentId === undefined || index === undefined)\n return SKIP_UPDATE;\n\n const thread = this._threadBinding.getState();\n\n const branches = thread.getBranches(message.id);\n\n return {\n ...message,\n ...{ [symbolInnerMessage]: (message as any)[symbolInnerMessage] },\n\n index,\n isLast: messages.at(-1)?.id === message.id,\n parentId,\n\n branchNumber: branches.indexOf(message.id) + 1,\n branchCount: branches.length,\n\n speech:\n speechState?.messageId === message.id ? speechState : undefined,\n } satisfies MessageState;\n },\n subscribe: (callback) => this._threadBinding.subscribe(callback),\n }),\n this._threadBinding,\n );\n }\n\n private _eventSubscriptionSubjects = new Map<\n string,\n EventSubscriptionSubject<ThreadRuntimeEventType>\n >();\n\n public unstable_on<E extends ThreadRuntimeEventType>(\n event: E,\n callback: ThreadRuntimeEventCallback<E>,\n ): Unsubscribe {\n let subject = this._eventSubscriptionSubjects.get(event);\n if (!subject) {\n subject = new EventSubscriptionSubject<ThreadRuntimeEventType>({\n event,\n binding: this._threadBinding,\n });\n this._eventSubscriptionSubjects.set(event, subject);\n }\n return subject.subscribe(callback as (payload?: unknown) => void);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"thread-runtime.js","names":[],"sources":["../../../src/runtime/api/thread-runtime.ts"],"sourcesContent":["import type {\n ThreadSuggestion,\n RuntimeCapabilities,\n ThreadRuntimeCore,\n SpeechState,\n VoiceSessionState,\n ThreadRuntimeEventCallback,\n ThreadRuntimeEventType,\n StartRunConfig,\n ResumeRunConfig,\n} from \"../interfaces/thread-runtime-core\";\nimport type { ExportedMessageRepository } from \"../utils/message-repository\";\nimport type { ThreadMessageLike } from \"../utils/thread-message-like\";\nimport {\n type MessageRuntime,\n MessageRuntimeImpl,\n type MessageState,\n} from \"./message-runtime\";\nimport { NestedSubscriptionSubject } from \"../../subscribable/subscribable\";\nimport {\n ShallowMemoizeSubject,\n SKIP_UPDATE,\n} from \"../../subscribable/subscribable\";\nimport type { SubscribableWithState } from \"../../subscribable/subscribable\";\nimport {\n type ThreadComposerRuntime,\n ThreadComposerRuntimeImpl,\n} from \"./composer-runtime\";\nimport type {\n MessageRuntimePath,\n ThreadListItemRuntimePath,\n ThreadRuntimePath,\n} from \"./paths\";\nimport type { ThreadListItemState } from \"./bindings\";\nimport type { AppendMessage, ThreadMessage } from \"../../types/message\";\nimport type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { RunConfig } from \"../../types/message\";\nimport { EventSubscriptionSubject } from \"../../subscribable/subscribable\";\nimport { symbolInnerMessage } from \"../utils/external-store-message\";\nimport type { ModelContext } from \"../../model-context/types\";\nimport type {\n ChatModelRunOptions,\n ChatModelRunResult,\n} from \"../utils/chat-model-adapter\";\nimport type { ReadonlyJSONValue } from \"assistant-stream/utils\";\n\nexport type CreateStartRunConfig = {\n parentId: string | null;\n sourceId?: string | null | undefined;\n runConfig?: RunConfig | undefined;\n};\n\nexport type CreateResumeRunConfig = CreateStartRunConfig & {\n stream?: (\n options: ChatModelRunOptions,\n ) => AsyncGenerator<ChatModelRunResult, void, unknown>;\n};\n\nconst toResumeRunConfig = (message: CreateResumeRunConfig): ResumeRunConfig => {\n return {\n parentId: message.parentId ?? null,\n sourceId: message.sourceId ?? null,\n runConfig: message.runConfig ?? {},\n ...(message.stream ? { stream: message.stream } : {}),\n };\n};\n\nconst toStartRunConfig = (message: CreateStartRunConfig): StartRunConfig => {\n return {\n parentId: message.parentId ?? null,\n sourceId: message.sourceId ?? null,\n runConfig: message.runConfig ?? {},\n };\n};\n\nexport type CreateAppendMessage =\n | string\n | {\n parentId?: string | null | undefined;\n sourceId?: string | null | undefined;\n role?: AppendMessage[\"role\"] | undefined;\n content: AppendMessage[\"content\"];\n attachments?: AppendMessage[\"attachments\"] | undefined;\n metadata?: AppendMessage[\"metadata\"] | undefined;\n createdAt?: Date | undefined;\n runConfig?: AppendMessage[\"runConfig\"] | undefined;\n startRun?: boolean | undefined;\n };\n\nconst toAppendMessage = (\n messages: readonly ThreadMessage[],\n message: CreateAppendMessage,\n): AppendMessage => {\n if (typeof message === \"string\") {\n return {\n createdAt: new Date(),\n parentId: messages.at(-1)?.id ?? null,\n sourceId: null,\n runConfig: {},\n role: \"user\",\n content: [{ type: \"text\", text: message }],\n attachments: [],\n metadata: { custom: {} },\n };\n }\n\n return {\n createdAt: message.createdAt ?? new Date(),\n parentId: message.parentId ?? messages.at(-1)?.id ?? null,\n sourceId: message.sourceId ?? null,\n role: message.role ?? \"user\",\n content: message.content,\n attachments: message.attachments ?? [],\n metadata: message.metadata ?? { custom: {} },\n runConfig: message.runConfig ?? {},\n startRun: message.startRun,\n } as AppendMessage;\n};\n\nexport type ThreadRuntimeCoreBinding = SubscribableWithState<\n ThreadRuntimeCore,\n ThreadRuntimePath\n> & {\n outerSubscribe(callback: () => void): Unsubscribe;\n};\n\nexport type ThreadListItemRuntimeBinding = SubscribableWithState<\n ThreadListItemState,\n ThreadListItemRuntimePath\n>;\n\nexport type ThreadState = {\n /**\n * The thread ID.\n * @deprecated This field is deprecated and will be removed in 0.12.0. Use `useThreadListItem().id` instead.\n */\n readonly threadId: string;\n\n /**\n * The thread metadata.\n *\n * @deprecated Use `useThreadListItem()` instead. This field is deprecated and will be removed in 0.12.0.\n */\n readonly metadata: ThreadListItemState;\n\n /**\n * Whether the thread is disabled. Disabled threads cannot receive new messages.\n */\n readonly isDisabled: boolean;\n\n /**\n * Whether the thread is loading its history.\n */\n readonly isLoading: boolean;\n\n /**\n * Whether the thread is running. A thread is considered running when there is an active stream connection to the backend.\n */\n readonly isRunning: boolean;\n\n /**\n * The capabilities of the thread, such as whether the thread supports editing, branch switching, etc.\n */\n readonly capabilities: RuntimeCapabilities;\n\n /**\n * The messages in the currently selected branch of the thread.\n */\n readonly messages: readonly ThreadMessage[];\n\n /**\n * The thread state.\n *\n * @deprecated This feature is experimental\n */\n readonly state: ReadonlyJSONValue;\n\n /**\n * Follow up message suggestions to show the user.\n */\n readonly suggestions: readonly ThreadSuggestion[];\n\n /**\n * Custom extra information provided by the runtime.\n */\n readonly extras: unknown;\n\n /**\n * @deprecated This API is still under active development and might change without notice.\n */\n readonly speech: SpeechState | undefined;\n\n readonly voice: VoiceSessionState | undefined;\n};\n\nexport const getThreadState = (\n runtime: ThreadRuntimeCore,\n threadListItemState: ThreadListItemState,\n): ThreadState => {\n const lastMessage = runtime.messages.at(-1);\n return Object.freeze({\n threadId: threadListItemState.id,\n metadata: threadListItemState,\n capabilities: runtime.capabilities,\n isDisabled: runtime.isDisabled,\n isLoading: runtime.isLoading,\n isRunning:\n runtime.isRunning ??\n (lastMessage?.role !== \"assistant\"\n ? false\n : lastMessage.status.type === \"running\"),\n messages: runtime.messages,\n state: runtime.state,\n suggestions: runtime.suggestions,\n extras: runtime.extras,\n speech: runtime.speech,\n voice: runtime.voice,\n });\n};\n\nexport type ThreadRuntime = {\n /**\n * The selector for the thread runtime.\n */\n readonly path: ThreadRuntimePath;\n\n /**\n * The thread composer runtime.\n */\n readonly composer: ThreadComposerRuntime;\n\n /**\n * Gets a snapshot of the thread state.\n */\n getState(): ThreadState;\n\n /**\n * Append a new message to the thread.\n *\n * @example ```ts\n * // append a new user message with the text \"Hello, world!\"\n * threadRuntime.append(\"Hello, world!\");\n * ```\n *\n * @example ```ts\n * // append a new assistant message with the text \"Hello, world!\"\n * threadRuntime.append({\n * role: \"assistant\",\n * content: [{ type: \"text\", text: \"Hello, world!\" }],\n * });\n * ```\n */\n append(message: CreateAppendMessage): void;\n\n deleteMessage(messageId: string): void | Promise<void>;\n\n /**\n * Start a new run with the given configuration.\n * @param config The configuration for starting the run\n */\n startRun(config: CreateStartRunConfig): void;\n\n /**\n * Resume a run with the given configuration.\n * @param config The configuration for resuming the run\n **/\n resumeRun(config: CreateResumeRunConfig): void;\n\n /**\n * Export the thread state in the external store format.\n * For AI SDK runtimes, this returns the AI SDK message format.\n * For other runtimes, this may return different formats or throw an error.\n * @returns The thread state in the external format (typed as any)\n */\n exportExternalState(): any;\n\n /**\n * Import thread state from the external store format.\n * For AI SDK runtimes, this accepts AI SDK messages.\n * For other runtimes, this may accept different formats or throw an error.\n * @param state The thread state in the external format (typed as any)\n */\n importExternalState(state: any): void;\n\n subscribe(callback: () => void): Unsubscribe;\n cancelRun(): void;\n getModelContext(): ModelContext;\n\n export(): ExportedMessageRepository;\n import(repository: ExportedMessageRepository): void;\n\n /**\n * Reset the thread with optional initial messages.\n *\n * @param initialMessages - Optional array of initial messages to populate the thread\n */\n reset(initialMessages?: readonly ThreadMessageLike[]): void;\n\n getMessageByIndex(idx: number): MessageRuntime;\n getMessageById(messageId: string): MessageRuntime;\n\n /**\n * @deprecated This API is still under active development and might change without notice.\n */\n stopSpeaking(): void;\n\n connectVoice(): void;\n disconnectVoice(): void;\n getVoiceVolume(): number;\n subscribeVoiceVolume(callback: () => void): Unsubscribe;\n muteVoice(): void;\n unmuteVoice(): void;\n\n unstable_on<E extends ThreadRuntimeEventType>(\n event: E,\n callback: ThreadRuntimeEventCallback<E>,\n ): Unsubscribe;\n};\n\nexport class ThreadRuntimeImpl implements ThreadRuntime {\n public get path() {\n return this._threadBinding.path;\n }\n\n public get __internal_threadBinding() {\n return this._threadBinding;\n }\n\n private readonly _threadBinding: ThreadRuntimeCoreBinding & {\n getStateState(): ThreadState;\n };\n\n constructor(\n threadBinding: ThreadRuntimeCoreBinding,\n threadListItemBinding: ThreadListItemRuntimeBinding,\n ) {\n const stateBinding = new ShallowMemoizeSubject({\n path: threadBinding.path,\n getState: () =>\n getThreadState(\n threadBinding.getState(),\n threadListItemBinding.getState(),\n ),\n subscribe: (callback) => {\n const sub1 = threadBinding.subscribe(callback);\n const sub2 = threadListItemBinding.subscribe(callback);\n return () => {\n sub1();\n sub2();\n };\n },\n });\n\n this._threadBinding = {\n path: threadBinding.path,\n getState: () => threadBinding.getState(),\n getStateState: () => stateBinding.getState(),\n outerSubscribe: (callback) => threadBinding.outerSubscribe(callback),\n subscribe: (callback) => threadBinding.subscribe(callback),\n };\n\n this.composer = new ThreadComposerRuntimeImpl(\n new NestedSubscriptionSubject({\n path: {\n ...this.path,\n ref: `${this.path.ref}.composer`,\n composerSource: \"thread\",\n },\n getState: () => this._threadBinding.getState().composer,\n subscribe: (callback) => this._threadBinding.subscribe(callback),\n }),\n );\n\n this.__internal_bindMethods();\n }\n\n protected __internal_bindMethods() {\n this.append = this.append.bind(this);\n this.deleteMessage = this.deleteMessage.bind(this);\n this.resumeRun = this.resumeRun.bind(this);\n this.importExternalState = this.importExternalState.bind(this);\n this.exportExternalState = this.exportExternalState.bind(this);\n this.startRun = this.startRun.bind(this);\n this.cancelRun = this.cancelRun.bind(this);\n this.stopSpeaking = this.stopSpeaking.bind(this);\n this.connectVoice = this.connectVoice.bind(this);\n this.disconnectVoice = this.disconnectVoice.bind(this);\n this.muteVoice = this.muteVoice.bind(this);\n this.unmuteVoice = this.unmuteVoice.bind(this);\n this.getVoiceVolume = this.getVoiceVolume.bind(this);\n this.subscribeVoiceVolume = this.subscribeVoiceVolume.bind(this);\n this.export = this.export.bind(this);\n this.import = this.import.bind(this);\n this.reset = this.reset.bind(this);\n this.getMessageByIndex = this.getMessageByIndex.bind(this);\n this.getMessageById = this.getMessageById.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.unstable_on = this.unstable_on.bind(this);\n this.getModelContext = this.getModelContext.bind(this);\n this.getState = this.getState.bind(this);\n }\n\n public readonly composer;\n\n public getState() {\n return this._threadBinding.getStateState();\n }\n\n public append(message: CreateAppendMessage) {\n this._threadBinding\n .getState()\n .append(\n toAppendMessage(this._threadBinding.getState().messages, message),\n );\n }\n\n public deleteMessage(messageId: string) {\n return this._threadBinding.getState().deleteMessage(messageId);\n }\n\n public subscribe(callback: () => void) {\n return this._threadBinding.subscribe(callback);\n }\n\n public getModelContext() {\n return this._threadBinding.getState().getModelContext();\n }\n\n public startRun(config: CreateStartRunConfig) {\n return this._threadBinding.getState().startRun(toStartRunConfig(config));\n }\n\n public resumeRun(config: CreateResumeRunConfig) {\n return this._threadBinding.getState().resumeRun(toResumeRunConfig(config));\n }\n\n public exportExternalState() {\n return this._threadBinding.getState().exportExternalState();\n }\n\n public importExternalState(state: any) {\n this._threadBinding.getState().importExternalState(state);\n }\n\n public cancelRun() {\n this._threadBinding.getState().cancelRun();\n }\n\n public stopSpeaking() {\n return this._threadBinding.getState().stopSpeaking();\n }\n\n public connectVoice() {\n this._threadBinding.getState().connectVoice();\n }\n\n public disconnectVoice() {\n this._threadBinding.getState().disconnectVoice();\n }\n\n public getVoiceVolume() {\n return this._threadBinding.getState().getVoiceVolume();\n }\n\n public subscribeVoiceVolume(callback: () => void) {\n return this._threadBinding.getState().subscribeVoiceVolume(callback);\n }\n\n public muteVoice() {\n this._threadBinding.getState().muteVoice();\n }\n\n public unmuteVoice() {\n this._threadBinding.getState().unmuteVoice();\n }\n\n public export() {\n return this._threadBinding.getState().export();\n }\n\n public import(data: ExportedMessageRepository) {\n this._threadBinding.getState().import(data);\n }\n\n public reset(initialMessages?: readonly ThreadMessageLike[]) {\n this._threadBinding.getState().reset(initialMessages);\n }\n\n public getMessageByIndex(idx: number) {\n if (idx < 0) throw new Error(\"Message index must be >= 0\");\n\n return this._getMessageRuntime(\n {\n ...this.path,\n ref: `${this.path.ref}.messages[${idx}]`,\n messageSelector: { type: \"index\", index: idx },\n },\n () => {\n const messages = this._threadBinding.getState().messages;\n const message = messages[idx];\n if (!message) return undefined;\n return {\n message,\n parentId: messages[idx - 1]?.id ?? null,\n index: idx,\n };\n },\n );\n }\n\n public getMessageById(messageId: string) {\n return this._getMessageRuntime(\n {\n ...this.path,\n ref: `${this.path.ref}.messages[messageId=${JSON.stringify(messageId)}]`,\n messageSelector: { type: \"messageId\", messageId: messageId },\n },\n () => this._threadBinding.getState().getMessageById(messageId),\n );\n }\n\n private _getMessageRuntime(\n path: MessageRuntimePath,\n callback: () =>\n | { parentId: string | null; message: ThreadMessage; index: number }\n | undefined,\n ) {\n return new MessageRuntimeImpl(\n new ShallowMemoizeSubject({\n path,\n getState: () => {\n const { message, parentId, index } = callback() ?? {};\n\n const { messages, speech: speechState } =\n this._threadBinding.getState();\n\n if (!message || parentId === undefined || index === undefined)\n return SKIP_UPDATE;\n\n const thread = this._threadBinding.getState();\n\n const branches = thread.getBranches(message.id);\n\n return {\n ...message,\n ...{ [symbolInnerMessage]: (message as any)[symbolInnerMessage] },\n\n index,\n isLast: messages.at(-1)?.id === message.id,\n parentId,\n\n branchNumber: branches.indexOf(message.id) + 1,\n branchCount: branches.length,\n\n speech:\n speechState?.messageId === message.id ? speechState : undefined,\n } satisfies MessageState;\n },\n subscribe: (callback) => this._threadBinding.subscribe(callback),\n }),\n this._threadBinding,\n );\n }\n\n private _eventSubscriptionSubjects = new Map<\n string,\n EventSubscriptionSubject<ThreadRuntimeEventType>\n >();\n\n public unstable_on<E extends ThreadRuntimeEventType>(\n event: E,\n callback: ThreadRuntimeEventCallback<E>,\n ): Unsubscribe {\n let subject = this._eventSubscriptionSubjects.get(event);\n if (!subject) {\n subject = new EventSubscriptionSubject<ThreadRuntimeEventType>({\n event,\n binding: this._threadBinding,\n });\n this._eventSubscriptionSubjects.set(event, subject);\n }\n return subject.subscribe(callback as (payload?: unknown) => void);\n }\n}\n"],"mappings":"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"}
@@ -30,6 +30,7 @@ declare abstract class BaseThreadRuntimeCore implements ThreadRuntimeCore {
30
30
  abstract get extras(): unknown;
31
31
  abstract get capabilities(): RuntimeCapabilities;
32
32
  abstract append(message: AppendMessage): void;
33
+ abstract deleteMessage(messageId: string): void | Promise<void>;
33
34
  abstract startRun(config: StartRunConfig): void;
34
35
  abstract resumeRun(config: ResumeRunConfig): void;
35
36
  abstract addToolResult(options: AddToolResultOptions): void;
@@ -1 +1 @@
1
- {"version":3,"file":"base-thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtime/base/base-thread-runtime-core.ts"],"mappings":";;;;;;;;;;;;;KAqCK,kBAAA;EACH,MAAA,GAAS,sBAAA;EACT,QAAA,GAAW,eAAA;EACX,WAAA,GAAc,iBAAA;EACd,KAAA,GAAQ,oBAAA;AAAA;AAAA,uBAGY,qBAAA,YAAiC,iBAAA;EAAA,iBAqExB,gBAAA;EAAA,QApErB,cAAA;EAAA,QACA,cAAA;EAAA,mBAEW,UAAA,EAAU,iBAAA;EAAA,aACT,QAAA,IAAY,kBAAA;EAAA,aACZ,UAAA;EAAA,aACA,cAAA;EAAA,aACA,SAAA;EAAA,aACA,WAAA,aAAwB,gBAAA;EAAA,aACxB,MAAA;EAAA,aAEA,YAAA,IAAgB,mBAAA;EAAA,SACpB,MAAA,CAAO,OAAA,EAAS,aAAA;EAAA,SAChB,QAAA,CAAS,MAAA,EAAQ,cAAA;EAAA,SACjB,SAAA,CAAU,MAAA,EAAQ,eAAA;EAAA,SAClB,aAAA,CAAc,OAAA,EAAS,oBAAA;EAAA,SACvB,cAAA,CAAe,OAAA,EAAS,qBAAA;EAAA,SACxB,qBAAA,CACd,OAAA,EAAS,4BAAA;EAAA,SAEK,SAAA;EAAA,SACA,mBAAA;EAAA,SACA,mBAAA,CAAoB,KAAA;EAAA,UAE1B,cAAA,EAAgB,aAAA;EAAA,UAChB,gBAAA;EAAA,QACF,qBAAA;EAAA,QACA,sBAAA;EAAA,QACA,iBAAA;EAAA,UAEE,uBAAA;EAAA,UAKA,gBAAA,aAA6B,aAAA;EAAA,IAI5B,QAAA,aAAqB,aAAA;EAAA,IAgBrB,KAAA,iEAAK,kBAAA,oCAAA,iBAAA;EAAA,SAWA,QAAA,EAAQ,gCAAA;cAEK,gBAAA,EAAkB,oBAAA;EAExC,eAAA,IAF4D,YAAA;EAAA,QAM3D,cAAA;EACD,eAAA,CAAgB,SAAA,WAAiB,8BAAA;EAGjC,SAAA,CAAU,SAAA;EAeV,cAAA,CAAe,SAAA;;;;;EAsBf,WAAA,CAAY,SAAA;EAOZ,cAAA,CAAe,QAAA;EAAA,UAKZ,kBAAA;EAIH,uBAAA,WAAkC,sBAAA,EACvC,KAAA,EAAO,CAAA,EACP,OAAA,EAAS,yBAAA,CAA0B,CAAA;EAQ9B,SAAA,CAAU,QAAA,eAAuB,WAAA;EAKjC,cAAA;IAAiB,SAAA;IAAW;EAAA,GAAQ,qBAAA;EAAA,QAqBnC,aAAA;EACD,MAAA,EAAQ,WAAA;EAER,KAAA,CAAM,SAAA;EA8BN,YAAA;EAAA,QAMC,aAAA;EAAA,QACA,YAAA;EACD,KAAA,EAAO,iBAAA;EAAA,QAEN,YAAA;EAAA,QACA,uBAAA;EAED,cAAA;EAEA,oBAAA,GAAwB,QAAA,iBAAuB,WAAA;EAK/C,YAAA;EAAA,QA+DC,oBAAA;EAAA,QAEA,sBAAA;EAAA,QA8DA,4BAAA;EAaD,eAAA;EAeA,SAAA;EAUA,WAAA;EAAA,UAUG,iBAAA;EAOH,MAAA,IAAM,yBAAA;EAIN,MAAA,CAAO,IAAA,EAAM,yBAAA;EAOb,KAAA,CAAM,eAAA,YAA2B,iBAAA;EAAA,QAIhC,iBAAA;EAKD,WAAA,WAAsB,sBAAA,EAC3B,KAAA,EAAO,CAAA,EACP,QAAA,EAAU,0BAAA,CAA2B,CAAA,IAAE,WAAA;AAAA"}
1
+ {"version":3,"file":"base-thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtime/base/base-thread-runtime-core.ts"],"mappings":";;;;;;;;;;;;;KAqCK,kBAAA;EACH,MAAA,GAAS,sBAAA;EACT,QAAA,GAAW,eAAA;EACX,WAAA,GAAc,iBAAA;EACd,KAAA,GAAQ,oBAAA;AAAA;AAAA,uBAGY,qBAAA,YAAiC,iBAAA;EAAA,iBAsExB,gBAAA;EAAA,QArErB,cAAA;EAAA,QACA,cAAA;EAAA,mBAEW,UAAA,EAAU,iBAAA;EAAA,aACT,QAAA,IAAY,kBAAA;EAAA,aACZ,UAAA;EAAA,aACA,cAAA;EAAA,aACA,SAAA;EAAA,aACA,WAAA,aAAwB,gBAAA;EAAA,aACxB,MAAA;EAAA,aAEA,YAAA,IAAgB,mBAAA;EAAA,SACpB,MAAA,CAAO,OAAA,EAAS,aAAA;EAAA,SAChB,aAAA,CAAc,SAAA,kBAA2B,OAAA;EAAA,SACzC,QAAA,CAAS,MAAA,EAAQ,cAAA;EAAA,SACjB,SAAA,CAAU,MAAA,EAAQ,eAAA;EAAA,SAClB,aAAA,CAAc,OAAA,EAAS,oBAAA;EAAA,SACvB,cAAA,CAAe,OAAA,EAAS,qBAAA;EAAA,SACxB,qBAAA,CACd,OAAA,EAAS,4BAAA;EAAA,SAEK,SAAA;EAAA,SACA,mBAAA;EAAA,SACA,mBAAA,CAAoB,KAAA;EAAA,UAE1B,cAAA,EAAgB,aAAA;EAAA,UAChB,gBAAA;EAAA,QACF,qBAAA;EAAA,QACA,sBAAA;EAAA,QACA,iBAAA;EAAA,UAEE,uBAAA;EAAA,UAKA,gBAAA,aAA6B,aAAA;EAAA,IAI5B,QAAA,aAAqB,aAAA;EAAA,IAgBrB,KAAA,iEAAK,kBAAA,oCAAA,iBAAA;EAAA,SAWA,QAAA,EAAQ,gCAAA;cAEK,gBAAA,EAAkB,oBAAA;EAExC,eAAA,IAF4D,YAAA;EAAA,QAM3D,cAAA;EACD,eAAA,CAAgB,SAAA,WAAiB,8BAAA;EAGjC,SAAA,CAAU,SAAA;EAeV,cAAA,CAAe,SAAA;;;;;EAsBf,WAAA,CAAY,SAAA;EAOZ,cAAA,CAAe,QAAA;EAAA,UAKZ,kBAAA;EAIH,uBAAA,WAAkC,sBAAA,EACvC,KAAA,EAAO,CAAA,EACP,OAAA,EAAS,yBAAA,CAA0B,CAAA;EAQ9B,SAAA,CAAU,QAAA,eAAuB,WAAA;EAKjC,cAAA;IAAiB,SAAA;IAAW;EAAA,GAAQ,qBAAA;EAAA,QAqBnC,aAAA;EACD,MAAA,EAAQ,WAAA;EAER,KAAA,CAAM,SAAA;EA8BN,YAAA;EAAA,QAMC,aAAA;EAAA,QACA,YAAA;EACD,KAAA,EAAO,iBAAA;EAAA,QAEN,YAAA;EAAA,QACA,uBAAA;EAED,cAAA;EAEA,oBAAA,GAAwB,QAAA,iBAAuB,WAAA;EAK/C,YAAA;EAAA,QA+DC,oBAAA;EAAA,QAEA,sBAAA;EAAA,QA8DA,4BAAA;EAaD,eAAA;EAeA,SAAA;EAUA,WAAA;EAAA,UAUG,iBAAA;EAOH,MAAA,IAAM,yBAAA;EAIN,MAAA,CAAO,IAAA,EAAM,yBAAA;EAOb,KAAA,CAAM,eAAA,YAA2B,iBAAA;EAAA,QAIhC,iBAAA;EAKD,WAAA,WAAsB,sBAAA,EAC3B,KAAA,EAAO,CAAA,EACP,QAAA,EAAU,0BAAA,CAA2B,CAAA,IAAE,WAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"base-thread-runtime-core.js","names":[],"sources":["../../../src/runtime/base/base-thread-runtime-core.ts"],"sourcesContent":["import type {\n AppendMessage,\n ThreadAssistantMessage,\n ThreadMessage,\n} from \"../../types/message\";\nimport type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport { getThreadMessageText } from \"../../utils/text\";\nimport { generateId } from \"../../utils/id\";\nimport {\n ExportedMessageRepository,\n MessageRepository,\n} from \"../utils/message-repository\";\nimport { DefaultThreadComposerRuntimeCore } from \"./default-thread-composer-runtime-core\";\nimport type {\n AddToolResultOptions,\n ResumeToolCallOptions,\n RespondToToolApprovalOptions,\n ThreadSuggestion,\n SubmitFeedbackOptions,\n ThreadRuntimeCore,\n SpeechState,\n VoiceSessionState,\n RuntimeCapabilities,\n ThreadRuntimeEventCallback,\n ThreadRuntimeEventPayload,\n ThreadRuntimeEventType,\n StartRunConfig,\n ResumeRunConfig,\n} from \"../interfaces/thread-runtime-core\";\nimport { DefaultEditComposerRuntimeCore } from \"./default-edit-composer-runtime-core\";\nimport type { SpeechSynthesisAdapter } from \"../../adapters/speech\";\nimport type { FeedbackAdapter } from \"../../adapters/feedback\";\nimport type { AttachmentAdapter } from \"../../adapters/attachment\";\nimport type { RealtimeVoiceAdapter } from \"../../adapters/voice\";\nimport type { ThreadMessageLike } from \"../utils/thread-message-like\";\n\ntype BaseThreadAdapters = {\n speech?: SpeechSynthesisAdapter | undefined;\n feedback?: FeedbackAdapter | undefined;\n attachments?: AttachmentAdapter | undefined;\n voice?: RealtimeVoiceAdapter | undefined;\n};\n\nexport abstract class BaseThreadRuntimeCore implements ThreadRuntimeCore {\n private _subscriptions = new Set<() => void>();\n private _isInitialized = false;\n\n protected readonly repository = new MessageRepository();\n public abstract get adapters(): BaseThreadAdapters | undefined;\n public abstract get isDisabled(): boolean;\n public abstract get isSendDisabled(): boolean;\n public abstract get isLoading(): boolean;\n public abstract get suggestions(): readonly ThreadSuggestion[];\n public abstract get extras(): unknown;\n\n public abstract get capabilities(): RuntimeCapabilities;\n public abstract append(message: AppendMessage): void;\n public abstract startRun(config: StartRunConfig): void;\n public abstract resumeRun(config: ResumeRunConfig): void;\n public abstract addToolResult(options: AddToolResultOptions): void;\n public abstract resumeToolCall(options: ResumeToolCallOptions): void;\n public abstract respondToToolApproval(\n options: RespondToToolApprovalOptions,\n ): void;\n public abstract cancelRun(): void;\n public abstract exportExternalState(): any;\n public abstract importExternalState(state: any): void;\n\n protected _voiceMessages: ThreadMessage[] = [];\n protected _voiceGeneration = 0;\n private _cachedMergedMessages: readonly ThreadMessage[] | null = null;\n private _cachedVoiceGeneration = -1;\n private _cachedMergedBase: readonly ThreadMessage[] | null = null;\n\n protected _markVoiceMessagesDirty() {\n this._voiceGeneration++;\n this._cachedMergedMessages = null;\n }\n\n protected _getBaseMessages(): readonly ThreadMessage[] {\n return this.repository.getMessages();\n }\n\n public get messages(): readonly ThreadMessage[] {\n if (this._voiceMessages.length === 0) {\n return this._getBaseMessages();\n }\n const base = this._getBaseMessages();\n if (\n this._cachedVoiceGeneration !== this._voiceGeneration ||\n this._cachedMergedBase !== base\n ) {\n this._cachedMergedMessages = [...base, ...this._voiceMessages];\n this._cachedVoiceGeneration = this._voiceGeneration;\n this._cachedMergedBase = base;\n }\n return this._cachedMergedMessages!;\n }\n\n public get state() {\n let mostRecentAssistantMessage: (typeof this.messages)[number] | undefined;\n for (const message of this.messages) {\n if (message.role === \"assistant\") {\n mostRecentAssistantMessage = message;\n }\n }\n\n return mostRecentAssistantMessage?.metadata.unstable_state ?? null;\n }\n\n public readonly composer = new DefaultThreadComposerRuntimeCore(this);\n\n constructor(private readonly _contextProvider: ModelContextProvider) {}\n\n public getModelContext() {\n return this._contextProvider.getModelContext();\n }\n\n private _editComposers = new Map<string, DefaultEditComposerRuntimeCore>();\n public getEditComposer(messageId: string) {\n return this._editComposers.get(messageId);\n }\n public beginEdit(messageId: string) {\n if (this._editComposers.has(messageId))\n throw new Error(\"Edit already in progress\");\n\n this._editComposers.set(\n messageId,\n new DefaultEditComposerRuntimeCore(\n this,\n () => this._editComposers.delete(messageId),\n this.repository.getMessage(messageId),\n ),\n );\n this._notifySubscribers();\n }\n\n public getMessageById(messageId: string) {\n try {\n return this.repository.getMessage(messageId);\n } catch {\n // Check voice messages\n const baseMessages = this.repository.getMessages();\n const voiceIdx = this._voiceMessages.findIndex((m) => m.id === messageId);\n if (voiceIdx !== -1) {\n const parentId =\n voiceIdx > 0\n ? this._voiceMessages[voiceIdx - 1]!.id\n : (baseMessages.at(-1)?.id ?? null);\n return {\n parentId,\n message: this._voiceMessages[voiceIdx]!,\n index: baseMessages.length + voiceIdx,\n };\n }\n return undefined;\n }\n }\n\n public getBranches(messageId: string): string[] {\n if (this._voiceMessages.some((m) => m.id === messageId)) {\n return [];\n }\n return this.repository.getBranches(messageId);\n }\n\n public switchToBranch(branchId: string): void {\n this.repository.switchToBranch(branchId);\n this._notifySubscribers();\n }\n\n protected _notifySubscribers() {\n for (const callback of this._subscriptions) callback();\n }\n\n public _notifyEventSubscribers<E extends ThreadRuntimeEventType>(\n event: E,\n payload: ThreadRuntimeEventPayload[E],\n ) {\n const subscribers = this._eventSubscribers.get(event);\n if (!subscribers) return;\n\n for (const callback of subscribers) callback(payload);\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n public submitFeedback({ messageId, type }: SubmitFeedbackOptions) {\n const adapter = this.adapters?.feedback;\n if (!adapter) throw new Error(\"Feedback adapter not configured\");\n\n const { message, parentId } = this.repository.getMessage(messageId);\n adapter.submit({ message, type });\n\n if (message.role === \"assistant\") {\n const updatedMessage: ThreadMessage = {\n ...message,\n metadata: {\n ...message.metadata,\n submittedFeedback: { type },\n },\n };\n this.repository.addOrUpdateMessage(parentId, updatedMessage);\n }\n\n this._notifySubscribers();\n }\n\n private _stopSpeaking: Unsubscribe | undefined;\n public speech: SpeechState | undefined;\n\n public speak(messageId: string) {\n const adapter = this.adapters?.speech;\n if (!adapter) throw new Error(\"Speech adapter not configured\");\n\n const { message } = this.repository.getMessage(messageId);\n\n this._stopSpeaking?.();\n\n const utterance = adapter.speak(getThreadMessageText(message));\n const unsub = utterance.subscribe(() => {\n if (utterance.status.type === \"ended\") {\n this._stopSpeaking = undefined;\n this.speech = undefined;\n } else {\n this.speech = { messageId, status: utterance.status };\n }\n this._notifySubscribers();\n });\n\n this.speech = { messageId, status: utterance.status };\n this._notifySubscribers();\n\n this._stopSpeaking = () => {\n utterance.cancel();\n unsub();\n this.speech = undefined;\n this._stopSpeaking = undefined;\n };\n }\n\n public stopSpeaking() {\n if (!this._stopSpeaking) throw new Error(\"No message is being spoken\");\n this._stopSpeaking();\n this._notifySubscribers();\n }\n\n private _voiceSession: RealtimeVoiceAdapter.Session | undefined;\n private _voiceUnsubs: Array<() => void> = [];\n public voice: VoiceSessionState | undefined;\n\n private _voiceVolume = 0;\n private _voiceVolumeSubscribers = new Set<() => void>();\n\n public getVoiceVolume = () => this._voiceVolume;\n\n public subscribeVoiceVolume = (callback: () => void): Unsubscribe => {\n this._voiceVolumeSubscribers.add(callback);\n return () => this._voiceVolumeSubscribers.delete(callback);\n };\n\n public connectVoice() {\n const adapter = this.adapters?.voice;\n if (!adapter) throw new Error(\"Voice adapter not configured\");\n\n this.disconnectVoice();\n\n const session = adapter.connect({});\n this._voiceSession = session;\n const unsubs: Array<() => void> = [];\n\n let currentMode: RealtimeVoiceAdapter.Mode = \"listening\";\n\n this.voice = {\n status: session.status,\n isMuted: session.isMuted,\n mode: currentMode,\n };\n this._voiceVolume = 0;\n this._notifySubscribers();\n\n unsubs.push(\n session.onStatusChange((status) => {\n if (status.type === \"ended\") {\n this._finishVoiceAssistantMessage();\n this._voiceSession = undefined;\n this.voice = undefined;\n } else {\n this.voice = {\n status,\n isMuted: session.isMuted,\n mode: currentMode,\n };\n }\n this._notifySubscribers();\n }),\n );\n\n unsubs.push(\n session.onModeChange((mode) => {\n currentMode = mode;\n if (this.voice) {\n this.voice = { ...this.voice, mode };\n this._notifySubscribers();\n }\n }),\n );\n\n unsubs.push(\n session.onVolumeChange((volume) => {\n this._voiceVolume = volume;\n for (const cb of this._voiceVolumeSubscribers) cb();\n }),\n );\n\n unsubs.push(\n session.onTranscript((transcript) => {\n this._handleVoiceTranscript(transcript);\n }),\n );\n\n this._voiceUnsubs = unsubs;\n }\n\n private _currentAssistantMsg: ThreadAssistantMessage | null = null;\n\n private _handleVoiceTranscript(\n transcript: RealtimeVoiceAdapter.TranscriptItem,\n ) {\n this.ensureInitialized();\n\n if (transcript.role === \"user\") {\n this._finishVoiceAssistantMessage();\n this._currentAssistantMsg = null;\n\n if (transcript.isFinal) {\n this._voiceMessages.push({\n id: generateId(),\n role: \"user\",\n content: [{ type: \"text\", text: transcript.text }],\n metadata: { custom: {} },\n createdAt: new Date(),\n status: { type: \"complete\", reason: \"unknown\" },\n attachments: [],\n });\n this._markVoiceMessagesDirty();\n this._notifySubscribers();\n }\n } else {\n if (!this._currentAssistantMsg) {\n this._currentAssistantMsg = {\n id: generateId(),\n role: \"assistant\",\n content: [{ type: \"text\", text: transcript.text }],\n metadata: {\n unstable_state: this.state,\n unstable_annotations: [],\n unstable_data: [],\n steps: [],\n custom: {},\n },\n status: { type: \"running\" },\n createdAt: new Date(),\n };\n this._voiceMessages.push(this._currentAssistantMsg);\n } else {\n const idx = this._voiceMessages.indexOf(this._currentAssistantMsg);\n if (idx === -1) return;\n const updated: ThreadAssistantMessage = {\n ...this._currentAssistantMsg,\n content: [{ type: \"text\", text: transcript.text }],\n ...(transcript.isFinal\n ? { status: { type: \"complete\", reason: \"stop\" } }\n : {}),\n };\n this._voiceMessages[idx] = updated;\n this._currentAssistantMsg = updated;\n }\n\n if (transcript.isFinal) {\n this._currentAssistantMsg = null;\n }\n\n this._markVoiceMessagesDirty();\n this._notifySubscribers();\n }\n }\n\n private _finishVoiceAssistantMessage() {\n const last = this._voiceMessages.at(-1);\n if (last?.role === \"assistant\" && last.status.type === \"running\") {\n const idx = this._voiceMessages.length - 1;\n this._voiceMessages[idx] = {\n ...(last as ThreadAssistantMessage),\n status: { type: \"complete\", reason: \"stop\" },\n };\n this._markVoiceMessagesDirty();\n this._notifySubscribers();\n }\n }\n\n public disconnectVoice() {\n this._finishVoiceAssistantMessage();\n this._currentAssistantMsg = null;\n for (const unsub of this._voiceUnsubs) unsub();\n this._voiceUnsubs = [];\n this._voiceSession?.disconnect();\n this._voiceSession = undefined;\n this.voice = undefined;\n this._voiceVolume = 0;\n for (const cb of this._voiceVolumeSubscribers) cb();\n this._voiceMessages = [];\n this._markVoiceMessagesDirty();\n this._notifySubscribers();\n }\n\n public muteVoice() {\n if (!this._voiceSession) throw new Error(\"No active voice session\");\n this._voiceSession.mute();\n this.voice = {\n ...this.voice!,\n isMuted: true,\n };\n this._notifySubscribers();\n }\n\n public unmuteVoice() {\n if (!this._voiceSession) throw new Error(\"No active voice session\");\n this._voiceSession.unmute();\n this.voice = {\n ...this.voice!,\n isMuted: false,\n };\n this._notifySubscribers();\n }\n\n protected ensureInitialized() {\n if (!this._isInitialized) {\n this._isInitialized = true;\n this._notifyEventSubscribers(\"initialize\", {});\n }\n }\n\n public export() {\n return this.repository.export();\n }\n\n public import(data: ExportedMessageRepository) {\n this.ensureInitialized();\n this.repository.clear();\n this.repository.import(data);\n this._notifySubscribers();\n }\n\n public reset(initialMessages?: readonly ThreadMessageLike[]) {\n this.import(ExportedMessageRepository.fromArray(initialMessages ?? []));\n }\n\n private _eventSubscribers = new Map<\n ThreadRuntimeEventType,\n Set<(payload?: unknown) => void>\n >();\n\n public unstable_on<E extends ThreadRuntimeEventType>(\n event: E,\n callback: ThreadRuntimeEventCallback<E>,\n ) {\n const wrapped = callback as (payload?: unknown) => void;\n if (event === \"modelContextUpdate\") {\n // provider.subscribe is `() => void`; pump the typed empty payload to the user callback.\n return this._contextProvider.subscribe?.(() => wrapped({})) ?? (() => {});\n }\n\n let subscribers = this._eventSubscribers.get(event);\n if (!subscribers) {\n subscribers = new Set();\n this._eventSubscribers.set(event, subscribers);\n }\n subscribers.add(wrapped);\n\n // `initialize` latches: replay it (deferred) to subscribers that attach\n // after the thread already initialized, mirroring a BehaviorSubject.\n if (event === \"initialize\" && this._isInitialized) {\n queueMicrotask(() => {\n if (subscribers.has(wrapped)) wrapped({});\n });\n }\n\n return () => {\n this._eventSubscribers.get(event)?.delete(wrapped);\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"base-thread-runtime-core.js","names":[],"sources":["../../../src/runtime/base/base-thread-runtime-core.ts"],"sourcesContent":["import type {\n AppendMessage,\n ThreadAssistantMessage,\n ThreadMessage,\n} from \"../../types/message\";\nimport type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport { getThreadMessageText } from \"../../utils/text\";\nimport { generateId } from \"../../utils/id\";\nimport {\n ExportedMessageRepository,\n MessageRepository,\n} from \"../utils/message-repository\";\nimport { DefaultThreadComposerRuntimeCore } from \"./default-thread-composer-runtime-core\";\nimport type {\n AddToolResultOptions,\n ResumeToolCallOptions,\n RespondToToolApprovalOptions,\n ThreadSuggestion,\n SubmitFeedbackOptions,\n ThreadRuntimeCore,\n SpeechState,\n VoiceSessionState,\n RuntimeCapabilities,\n ThreadRuntimeEventCallback,\n ThreadRuntimeEventPayload,\n ThreadRuntimeEventType,\n StartRunConfig,\n ResumeRunConfig,\n} from \"../interfaces/thread-runtime-core\";\nimport { DefaultEditComposerRuntimeCore } from \"./default-edit-composer-runtime-core\";\nimport type { SpeechSynthesisAdapter } from \"../../adapters/speech\";\nimport type { FeedbackAdapter } from \"../../adapters/feedback\";\nimport type { AttachmentAdapter } from \"../../adapters/attachment\";\nimport type { RealtimeVoiceAdapter } from \"../../adapters/voice\";\nimport type { ThreadMessageLike } from \"../utils/thread-message-like\";\n\ntype BaseThreadAdapters = {\n speech?: SpeechSynthesisAdapter | undefined;\n feedback?: FeedbackAdapter | undefined;\n attachments?: AttachmentAdapter | undefined;\n voice?: RealtimeVoiceAdapter | undefined;\n};\n\nexport abstract class BaseThreadRuntimeCore implements ThreadRuntimeCore {\n private _subscriptions = new Set<() => void>();\n private _isInitialized = false;\n\n protected readonly repository = new MessageRepository();\n public abstract get adapters(): BaseThreadAdapters | undefined;\n public abstract get isDisabled(): boolean;\n public abstract get isSendDisabled(): boolean;\n public abstract get isLoading(): boolean;\n public abstract get suggestions(): readonly ThreadSuggestion[];\n public abstract get extras(): unknown;\n\n public abstract get capabilities(): RuntimeCapabilities;\n public abstract append(message: AppendMessage): void;\n public abstract deleteMessage(messageId: string): void | Promise<void>;\n public abstract startRun(config: StartRunConfig): void;\n public abstract resumeRun(config: ResumeRunConfig): void;\n public abstract addToolResult(options: AddToolResultOptions): void;\n public abstract resumeToolCall(options: ResumeToolCallOptions): void;\n public abstract respondToToolApproval(\n options: RespondToToolApprovalOptions,\n ): void;\n public abstract cancelRun(): void;\n public abstract exportExternalState(): any;\n public abstract importExternalState(state: any): void;\n\n protected _voiceMessages: ThreadMessage[] = [];\n protected _voiceGeneration = 0;\n private _cachedMergedMessages: readonly ThreadMessage[] | null = null;\n private _cachedVoiceGeneration = -1;\n private _cachedMergedBase: readonly ThreadMessage[] | null = null;\n\n protected _markVoiceMessagesDirty() {\n this._voiceGeneration++;\n this._cachedMergedMessages = null;\n }\n\n protected _getBaseMessages(): readonly ThreadMessage[] {\n return this.repository.getMessages();\n }\n\n public get messages(): readonly ThreadMessage[] {\n if (this._voiceMessages.length === 0) {\n return this._getBaseMessages();\n }\n const base = this._getBaseMessages();\n if (\n this._cachedVoiceGeneration !== this._voiceGeneration ||\n this._cachedMergedBase !== base\n ) {\n this._cachedMergedMessages = [...base, ...this._voiceMessages];\n this._cachedVoiceGeneration = this._voiceGeneration;\n this._cachedMergedBase = base;\n }\n return this._cachedMergedMessages!;\n }\n\n public get state() {\n let mostRecentAssistantMessage: (typeof this.messages)[number] | undefined;\n for (const message of this.messages) {\n if (message.role === \"assistant\") {\n mostRecentAssistantMessage = message;\n }\n }\n\n return mostRecentAssistantMessage?.metadata.unstable_state ?? null;\n }\n\n public readonly composer = new DefaultThreadComposerRuntimeCore(this);\n\n constructor(private readonly _contextProvider: ModelContextProvider) {}\n\n public getModelContext() {\n return this._contextProvider.getModelContext();\n }\n\n private _editComposers = new Map<string, DefaultEditComposerRuntimeCore>();\n public getEditComposer(messageId: string) {\n return this._editComposers.get(messageId);\n }\n public beginEdit(messageId: string) {\n if (this._editComposers.has(messageId))\n throw new Error(\"Edit already in progress\");\n\n this._editComposers.set(\n messageId,\n new DefaultEditComposerRuntimeCore(\n this,\n () => this._editComposers.delete(messageId),\n this.repository.getMessage(messageId),\n ),\n );\n this._notifySubscribers();\n }\n\n public getMessageById(messageId: string) {\n try {\n return this.repository.getMessage(messageId);\n } catch {\n // Check voice messages\n const baseMessages = this.repository.getMessages();\n const voiceIdx = this._voiceMessages.findIndex((m) => m.id === messageId);\n if (voiceIdx !== -1) {\n const parentId =\n voiceIdx > 0\n ? this._voiceMessages[voiceIdx - 1]!.id\n : (baseMessages.at(-1)?.id ?? null);\n return {\n parentId,\n message: this._voiceMessages[voiceIdx]!,\n index: baseMessages.length + voiceIdx,\n };\n }\n return undefined;\n }\n }\n\n public getBranches(messageId: string): string[] {\n if (this._voiceMessages.some((m) => m.id === messageId)) {\n return [];\n }\n return this.repository.getBranches(messageId);\n }\n\n public switchToBranch(branchId: string): void {\n this.repository.switchToBranch(branchId);\n this._notifySubscribers();\n }\n\n protected _notifySubscribers() {\n for (const callback of this._subscriptions) callback();\n }\n\n public _notifyEventSubscribers<E extends ThreadRuntimeEventType>(\n event: E,\n payload: ThreadRuntimeEventPayload[E],\n ) {\n const subscribers = this._eventSubscribers.get(event);\n if (!subscribers) return;\n\n for (const callback of subscribers) callback(payload);\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n public submitFeedback({ messageId, type }: SubmitFeedbackOptions) {\n const adapter = this.adapters?.feedback;\n if (!adapter) throw new Error(\"Feedback adapter not configured\");\n\n const { message, parentId } = this.repository.getMessage(messageId);\n adapter.submit({ message, type });\n\n if (message.role === \"assistant\") {\n const updatedMessage: ThreadMessage = {\n ...message,\n metadata: {\n ...message.metadata,\n submittedFeedback: { type },\n },\n };\n this.repository.addOrUpdateMessage(parentId, updatedMessage);\n }\n\n this._notifySubscribers();\n }\n\n private _stopSpeaking: Unsubscribe | undefined;\n public speech: SpeechState | undefined;\n\n public speak(messageId: string) {\n const adapter = this.adapters?.speech;\n if (!adapter) throw new Error(\"Speech adapter not configured\");\n\n const { message } = this.repository.getMessage(messageId);\n\n this._stopSpeaking?.();\n\n const utterance = adapter.speak(getThreadMessageText(message));\n const unsub = utterance.subscribe(() => {\n if (utterance.status.type === \"ended\") {\n this._stopSpeaking = undefined;\n this.speech = undefined;\n } else {\n this.speech = { messageId, status: utterance.status };\n }\n this._notifySubscribers();\n });\n\n this.speech = { messageId, status: utterance.status };\n this._notifySubscribers();\n\n this._stopSpeaking = () => {\n utterance.cancel();\n unsub();\n this.speech = undefined;\n this._stopSpeaking = undefined;\n };\n }\n\n public stopSpeaking() {\n if (!this._stopSpeaking) throw new Error(\"No message is being spoken\");\n this._stopSpeaking();\n this._notifySubscribers();\n }\n\n private _voiceSession: RealtimeVoiceAdapter.Session | undefined;\n private _voiceUnsubs: Array<() => void> = [];\n public voice: VoiceSessionState | undefined;\n\n private _voiceVolume = 0;\n private _voiceVolumeSubscribers = new Set<() => void>();\n\n public getVoiceVolume = () => this._voiceVolume;\n\n public subscribeVoiceVolume = (callback: () => void): Unsubscribe => {\n this._voiceVolumeSubscribers.add(callback);\n return () => this._voiceVolumeSubscribers.delete(callback);\n };\n\n public connectVoice() {\n const adapter = this.adapters?.voice;\n if (!adapter) throw new Error(\"Voice adapter not configured\");\n\n this.disconnectVoice();\n\n const session = adapter.connect({});\n this._voiceSession = session;\n const unsubs: Array<() => void> = [];\n\n let currentMode: RealtimeVoiceAdapter.Mode = \"listening\";\n\n this.voice = {\n status: session.status,\n isMuted: session.isMuted,\n mode: currentMode,\n };\n this._voiceVolume = 0;\n this._notifySubscribers();\n\n unsubs.push(\n session.onStatusChange((status) => {\n if (status.type === \"ended\") {\n this._finishVoiceAssistantMessage();\n this._voiceSession = undefined;\n this.voice = undefined;\n } else {\n this.voice = {\n status,\n isMuted: session.isMuted,\n mode: currentMode,\n };\n }\n this._notifySubscribers();\n }),\n );\n\n unsubs.push(\n session.onModeChange((mode) => {\n currentMode = mode;\n if (this.voice) {\n this.voice = { ...this.voice, mode };\n this._notifySubscribers();\n }\n }),\n );\n\n unsubs.push(\n session.onVolumeChange((volume) => {\n this._voiceVolume = volume;\n for (const cb of this._voiceVolumeSubscribers) cb();\n }),\n );\n\n unsubs.push(\n session.onTranscript((transcript) => {\n this._handleVoiceTranscript(transcript);\n }),\n );\n\n this._voiceUnsubs = unsubs;\n }\n\n private _currentAssistantMsg: ThreadAssistantMessage | null = null;\n\n private _handleVoiceTranscript(\n transcript: RealtimeVoiceAdapter.TranscriptItem,\n ) {\n this.ensureInitialized();\n\n if (transcript.role === \"user\") {\n this._finishVoiceAssistantMessage();\n this._currentAssistantMsg = null;\n\n if (transcript.isFinal) {\n this._voiceMessages.push({\n id: generateId(),\n role: \"user\",\n content: [{ type: \"text\", text: transcript.text }],\n metadata: { custom: {} },\n createdAt: new Date(),\n status: { type: \"complete\", reason: \"unknown\" },\n attachments: [],\n });\n this._markVoiceMessagesDirty();\n this._notifySubscribers();\n }\n } else {\n if (!this._currentAssistantMsg) {\n this._currentAssistantMsg = {\n id: generateId(),\n role: \"assistant\",\n content: [{ type: \"text\", text: transcript.text }],\n metadata: {\n unstable_state: this.state,\n unstable_annotations: [],\n unstable_data: [],\n steps: [],\n custom: {},\n },\n status: { type: \"running\" },\n createdAt: new Date(),\n };\n this._voiceMessages.push(this._currentAssistantMsg);\n } else {\n const idx = this._voiceMessages.indexOf(this._currentAssistantMsg);\n if (idx === -1) return;\n const updated: ThreadAssistantMessage = {\n ...this._currentAssistantMsg,\n content: [{ type: \"text\", text: transcript.text }],\n ...(transcript.isFinal\n ? { status: { type: \"complete\", reason: \"stop\" } }\n : {}),\n };\n this._voiceMessages[idx] = updated;\n this._currentAssistantMsg = updated;\n }\n\n if (transcript.isFinal) {\n this._currentAssistantMsg = null;\n }\n\n this._markVoiceMessagesDirty();\n this._notifySubscribers();\n }\n }\n\n private _finishVoiceAssistantMessage() {\n const last = this._voiceMessages.at(-1);\n if (last?.role === \"assistant\" && last.status.type === \"running\") {\n const idx = this._voiceMessages.length - 1;\n this._voiceMessages[idx] = {\n ...(last as ThreadAssistantMessage),\n status: { type: \"complete\", reason: \"stop\" },\n };\n this._markVoiceMessagesDirty();\n this._notifySubscribers();\n }\n }\n\n public disconnectVoice() {\n this._finishVoiceAssistantMessage();\n this._currentAssistantMsg = null;\n for (const unsub of this._voiceUnsubs) unsub();\n this._voiceUnsubs = [];\n this._voiceSession?.disconnect();\n this._voiceSession = undefined;\n this.voice = undefined;\n this._voiceVolume = 0;\n for (const cb of this._voiceVolumeSubscribers) cb();\n this._voiceMessages = [];\n this._markVoiceMessagesDirty();\n this._notifySubscribers();\n }\n\n public muteVoice() {\n if (!this._voiceSession) throw new Error(\"No active voice session\");\n this._voiceSession.mute();\n this.voice = {\n ...this.voice!,\n isMuted: true,\n };\n this._notifySubscribers();\n }\n\n public unmuteVoice() {\n if (!this._voiceSession) throw new Error(\"No active voice session\");\n this._voiceSession.unmute();\n this.voice = {\n ...this.voice!,\n isMuted: false,\n };\n this._notifySubscribers();\n }\n\n protected ensureInitialized() {\n if (!this._isInitialized) {\n this._isInitialized = true;\n this._notifyEventSubscribers(\"initialize\", {});\n }\n }\n\n public export() {\n return this.repository.export();\n }\n\n public import(data: ExportedMessageRepository) {\n this.ensureInitialized();\n this.repository.clear();\n this.repository.import(data);\n this._notifySubscribers();\n }\n\n public reset(initialMessages?: readonly ThreadMessageLike[]) {\n this.import(ExportedMessageRepository.fromArray(initialMessages ?? []));\n }\n\n private _eventSubscribers = new Map<\n ThreadRuntimeEventType,\n Set<(payload?: unknown) => void>\n >();\n\n public unstable_on<E extends ThreadRuntimeEventType>(\n event: E,\n callback: ThreadRuntimeEventCallback<E>,\n ) {\n const wrapped = callback as (payload?: unknown) => void;\n if (event === \"modelContextUpdate\") {\n // provider.subscribe is `() => void`; pump the typed empty payload to the user callback.\n return this._contextProvider.subscribe?.(() => wrapped({})) ?? (() => {});\n }\n\n let subscribers = this._eventSubscribers.get(event);\n if (!subscribers) {\n subscribers = new Set();\n this._eventSubscribers.set(event, subscribers);\n }\n subscribers.add(wrapped);\n\n // `initialize` latches: replay it (deferred) to subscribers that attach\n // after the thread already initialized, mirroring a BehaviorSubject.\n if (event === \"initialize\" && this._isInitialized) {\n queueMicrotask(() => {\n if (subscribers.has(wrapped)) wrapped({});\n });\n }\n\n return () => {\n this._eventSubscribers.get(event)?.delete(wrapped);\n };\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ //#region src/runtime/branch/external-thread-branch-adapter.d.ts
2
+ /**
3
+ * The branch surface a runtime exposes so the branch picker can navigate
4
+ * between sibling variants of a message. Read during render; recreate the
5
+ * adapter object when branch data changes.
6
+ *
7
+ * Editing a message creates a branch only if the `onEdit` handler creates a
8
+ * sibling and `getBranches` reports it. Note that `ExternalThread`'s edit
9
+ * payload carries the edited message's own id as both `parentId` and
10
+ * `sourceId`.
11
+ */
12
+ type ExternalThreadBranchAdapter = {
13
+ /**
14
+ * Returns the sibling branch ids for a message in display order, including
15
+ * the message's own id. Return an empty array for messages without
16
+ * alternative branches.
17
+ */
18
+ getBranches: (messageId: string) => readonly string[];
19
+ /**
20
+ * Makes the given branch the visible one. The runtime is expected to swap
21
+ * the `messages` array to the selected branch. May be invoked
22
+ * programmatically while a run is in progress; pending queue items are not
23
+ * cleared, and reconciling them with the new branch is the runtime's
24
+ * responsibility.
25
+ */
26
+ switchToBranch: (branchId: string) => void;
27
+ };
28
+ //#endregion
29
+ export { ExternalThreadBranchAdapter };
30
+ //# sourceMappingURL=external-thread-branch-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-thread-branch-adapter.d.ts","names":[],"sources":["../../../src/runtime/branch/external-thread-branch-adapter.ts"],"mappings":";;AAUA;;;;;;;;;KAAY,2BAAA;;;;;;EAMV,WAAA,GAAc,SAAA;;;;;;;;EAQd,cAAA,GAAiB,QAAA;AAAA"}
@@ -9,6 +9,7 @@ type ThreadListItemCoreState = {
9
9
  readonly externalId: string | undefined;
10
10
  readonly status: ThreadListItemStatus;
11
11
  readonly title?: string | undefined;
12
+ readonly lastMessageAt?: Date | undefined;
12
13
  readonly custom?: Record<string, unknown> | undefined;
13
14
  readonly runtime?: ThreadRuntimeCore | undefined;
14
15
  };
@@ -1 +1 @@
1
- {"version":3,"file":"thread-list-runtime-core.d.ts","names":[],"sources":["../../../src/runtime/interfaces/thread-list-runtime-core.ts"],"mappings":";;;;KAGY,oBAAA;AAAA,KAEA,uBAAA;EAAA,SACD,EAAA;EAAA,SACA,QAAA;EAAA,SACA,UAAA;EAAA,SAEA,MAAA,EAAQ,oBAAA;EAAA,SACR,KAAA;EAAA,SACA,MAAA,GAAS,MAAA;EAAA,SAET,OAAA,GAAU,iBAAA;AAAA;AAAA,KAGT,qBAAA;EAAA,SACD,SAAA;EAAA,SACA,aAAA;EAAA,SACA,OAAA;EACT,YAAA;EACA,WAAA;EAEA,SAAA;EACA,iBAAA;EAAA,SAES,WAAA,EAAa,QAAA,CAAS,MAAA,SAAe,uBAAA;EAE9C,wBAAA,IAA4B,iBAAA;EAC5B,oBAAA,CAAqB,QAAA,WAAmB,iBAAA;EAExC,WAAA,CAAY,QAAA,WAAmB,uBAAA;EAE/B,cAAA,CACE,QAAA,UACA,OAAA;IAAY,SAAA;EAAA,IACX,OAAA;EACH,iBAAA,IAAqB,OAAA;EAErB,qBAAA,IAAyB,OAAA;EACzB,MAAA,KAAW,OAAA;EACX,QAAA,KAAa,OAAA;EAEb,MAAA,CAAO,QAAA,WAAmB,OAAA;EAC1B,MAAA,CAAO,QAAA,UAAkB,QAAA,WAAmB,OAAA;EAC5C,YAAA,EACE,QAAA,UACA,MAAA,EAAQ,MAAA,gCACP,OAAA;EACH,OAAA,CAAQ,QAAA,WAAmB,OAAA;EAC3B,SAAA,CAAU,QAAA,WAAmB,OAAA;EAC7B,MAAA,CAAO,QAAA,WAAmB,OAAA;EAE1B,UAAA,CACE,QAAA,WACC,OAAA;IAAU,QAAA;IAAkB,UAAA;EAAA;EAC/B,aAAA,CAAc,QAAA,WAAmB,OAAA;EAEjC,SAAA,CAAU,QAAA,eAAuB,WAAA;AAAA"}
1
+ {"version":3,"file":"thread-list-runtime-core.d.ts","names":[],"sources":["../../../src/runtime/interfaces/thread-list-runtime-core.ts"],"mappings":";;;;KAGY,oBAAA;AAAA,KAEA,uBAAA;EAAA,SACD,EAAA;EAAA,SACA,QAAA;EAAA,SACA,UAAA;EAAA,SAEA,MAAA,EAAQ,oBAAA;EAAA,SACR,KAAA;EAAA,SACA,aAAA,GAAgB,IAAA;EAAA,SAChB,MAAA,GAAS,MAAA;EAAA,SAET,OAAA,GAAU,iBAAA;AAAA;AAAA,KAGT,qBAAA;EAAA,SACD,SAAA;EAAA,SACA,aAAA;EAAA,SACA,OAAA;EACT,YAAA;EACA,WAAA;EAEA,SAAA;EACA,iBAAA;EAAA,SAES,WAAA,EAAa,QAAA,CAAS,MAAA,SAAe,uBAAA;EAE9C,wBAAA,IAA4B,iBAAA;EAC5B,oBAAA,CAAqB,QAAA,WAAmB,iBAAA;EAExC,WAAA,CAAY,QAAA,WAAmB,uBAAA;EAE/B,cAAA,CACE,QAAA,UACA,OAAA;IAAY,SAAA;EAAA,IACX,OAAA;EACH,iBAAA,IAAqB,OAAA;EAErB,qBAAA,IAAyB,OAAA;EACzB,MAAA,KAAW,OAAA;EACX,QAAA,KAAa,OAAA;EAEb,MAAA,CAAO,QAAA,WAAmB,OAAA;EAC1B,MAAA,CAAO,QAAA,UAAkB,QAAA,WAAmB,OAAA;EAC5C,YAAA,EACE,QAAA,UACA,MAAA,EAAQ,MAAA,gCACP,OAAA;EACH,OAAA,CAAQ,QAAA,WAAmB,OAAA;EAC3B,SAAA,CAAU,QAAA,WAAmB,OAAA;EAC7B,MAAA,CAAO,QAAA,WAAmB,OAAA;EAE1B,UAAA,CACE,QAAA,WACC,OAAA;IAAU,QAAA;IAAkB,UAAA;EAAA;EAC/B,aAAA,CAAc,QAAA,WAAmB,OAAA;EAEjC,SAAA,CAAU,QAAA,eAAuB,WAAA;AAAA"}
@@ -17,6 +17,7 @@ type RuntimeCapabilities = {
17
17
  readonly switchBranchDuringRun: boolean;
18
18
  readonly edit: boolean;
19
19
  readonly reload: boolean;
20
+ readonly delete: boolean;
20
21
  readonly cancel: boolean;
21
22
  readonly unstable_copy: boolean;
22
23
  readonly speech: boolean;
@@ -118,6 +119,7 @@ type ThreadRuntimeCore = Readonly<{
118
119
  getBranches: (messageId: string) => readonly string[];
119
120
  switchToBranch: (branchId: string) => void;
120
121
  append: (message: AppendMessage) => void;
122
+ deleteMessage: (messageId: string) => void | Promise<void>;
121
123
  startRun: (config: StartRunConfig) => void;
122
124
  resumeRun: (config: ResumeRunConfig) => void;
123
125
  cancelRun: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtime/interfaces/thread-runtime-core.ts"],"mappings":"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"}
1
+ {"version":3,"file":"thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtime/interfaces/thread-runtime-core.ts"],"mappings":"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"}
@@ -84,6 +84,7 @@ type ExternalStoreAdapterBase<T> = {
84
84
  onNew: (message: AppendMessage) => Promise<void>; /** Opt in to message queuing. Typically produced by `createMessageQueue`. */
85
85
  queue?: ExternalThreadQueueAdapter | undefined;
86
86
  onEdit?: ((message: AppendMessage) => Promise<void>) | undefined;
87
+ onDelete?: ((messageId: string) => Promise<void> | void) | undefined;
87
88
  onReload?: ((parentId: string | null, config: StartRunConfig) => Promise<void>) | undefined;
88
89
  onResume?: ((config: ResumeRunConfig) => Promise<void>) | undefined;
89
90
  onCancel?: (() => Promise<void>) | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"external-store-adapter.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-adapter.ts"],"mappings":";;;;;;;;;;;;;KAqBY,uBAAA;EACV,MAAA,EAAQ,MAAA;EACR,EAAA;EACA,QAAA;EACA,UAAA;EACA,KAAA;EACA,MAAA,GAAS,MAAM;AAAA;AAAA,KAGL,8BAAA;EAPV;;;EAWA,QAAA;EACA,SAAA;EACA,OAAA,YAAmB,uBAAA;EACnB,eAAA,YAA2B,uBAAA;EAVZ;AAGjB;;EAWE,mBAAA,UAA6B,OAAA;EALV;;;EASnB,gBAAA,KAAqB,QAAA,aAAqB,OAAA;EAC1C,QAAA,IACE,QAAA,UACA,QAAA,cACI,OAAA;EACN,cAAA,KAEM,QAAA,UACA,MAAA,EAAQ,MAAA,kCACL,OAAA;EAET,SAAA,KAAc,QAAA,aAAqB,OAAA;EACnC,WAAA,KAAgB,QAAA,aAAqB,OAAA;EACrC,QAAA,KAAa,QAAA,aAAqB,OAAA;AAAA;AAAA,KAGxB,6BAAA,OACV,OAAA,EAAS,CAAA,EACT,GAAA,aACG,iBAAiB;AAAA,KAEjB,oCAAA;EACH,cAAA,EAAgB,6BAA6B,CAAC,CAAA;AAAA;AAAA,KAG3C,wBAAA;EAlCgB;;;;;;EAyCnB,UAAA;EAhC0C;;;;;;;;EAyC1C,cAAA;EAhCS;;;;;;;;EAyCT,SAAA;EACA,SAAA;EACA,QAAA,YAAoB,CAAA;EACpB,iBAAA,GAAoB,yBAAA;EACpB,WAAA,YAAuB,gBAAA;EACvB,KAAA,GAAQ,iBAAA;EACR,MAAA;EAEA,WAAA,KAAgB,QAAA,WAAmB,CAAA;EACnC,QAAA,KAAa,QAAA,WAAmB,aAAA;EAChC,qBAAA;EACA,mBAAA,KAAwB,KAAA;EACxB,KAAA,GAAQ,OAAA,EAAS,aAAA,KAAkB,OAAA,QA3ChC;EA6CH,KAAA,GAAQ,0BAAA;EACR,MAAA,KAAW,OAAA,EAAS,aAAA,KAAkB,OAAA;EACtC,QAAA,KACM,QAAA,iBAAyB,MAAA,EAAQ,cAAA,KAAmB,OAAA;EAE1D,QAAA,KAAa,MAAA,EAAQ,eAAA,KAAoB,OAAA;EACzC,QAAA,UAAkB,OAAA;EAClB,eAAA,KACM,OAAA,EAAS,oBAAA,KAAyB,OAAA;EAExC,gBAAA,KACM,OAAA;IAAW,UAAA;IAAoB,OAAA;EAAA;EAErC,uBAAA,KACM,OAAA,EAAS,4BAAA,KAAiC,OAAA;EAEhD,cAAA,GAAiB,6BAAA,CAA8B,CAAA;EAC/C,QAAA;IAEM,WAAA,GAAc,iBAAA;IACd,MAAA,GAAS,sBAAA;IACT,SAAA,GAAY,gBAAA;IACZ,KAAA,GAAQ,oBAAA;IACR,QAAA,GAAW,eAAA;IAhCT;;;IAoCF,UAAA,GAAa,8BAAA;EAAA;EAGnB,qBAAA;IAEM,IAAA;EAAA;EA7BiC;;;;;;;;;;;;;;;;;;;EAmDvC,8BAAA;EAWsB;;;;;;;;;EADtB,eAAA,KACM,QAAA,EAAU,MAAA,SAAe,mBAAA;AAAA;AAAA,KAIrB,oBAAA,KAAyB,aAAA,IACnC,wBAAA,CAAyB,CAAA,KACtB,CAAA,SAAU,aAAA,YAEP,oCAAA,CAAqC,CAAA"}
1
+ {"version":3,"file":"external-store-adapter.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-adapter.ts"],"mappings":";;;;;;;;;;;;;KAqBY,uBAAA;EACV,MAAA,EAAQ,MAAA;EACR,EAAA;EACA,QAAA;EACA,UAAA;EACA,KAAA;EACA,MAAA,GAAS,MAAM;AAAA;AAAA,KAGL,8BAAA;EAPV;;;EAWA,QAAA;EACA,SAAA;EACA,OAAA,YAAmB,uBAAA;EACnB,eAAA,YAA2B,uBAAA;EAVZ;AAGjB;;EAWE,mBAAA,UAA6B,OAAA;EALV;;;EASnB,gBAAA,KAAqB,QAAA,aAAqB,OAAA;EAC1C,QAAA,IACE,QAAA,UACA,QAAA,cACI,OAAA;EACN,cAAA,KAEM,QAAA,UACA,MAAA,EAAQ,MAAA,kCACL,OAAA;EAET,SAAA,KAAc,QAAA,aAAqB,OAAA;EACnC,WAAA,KAAgB,QAAA,aAAqB,OAAA;EACrC,QAAA,KAAa,QAAA,aAAqB,OAAA;AAAA;AAAA,KAGxB,6BAAA,OACV,OAAA,EAAS,CAAA,EACT,GAAA,aACG,iBAAiB;AAAA,KAEjB,oCAAA;EACH,cAAA,EAAgB,6BAA6B,CAAC,CAAA;AAAA;AAAA,KAG3C,wBAAA;EAlCgB;;;;;;EAyCnB,UAAA;EAhC0C;;;;;;;;EAyC1C,cAAA;EAhCS;;;;;;;;EAyCT,SAAA;EACA,SAAA;EACA,QAAA,YAAoB,CAAA;EACpB,iBAAA,GAAoB,yBAAA;EACpB,WAAA,YAAuB,gBAAA;EACvB,KAAA,GAAQ,iBAAA;EACR,MAAA;EAEA,WAAA,KAAgB,QAAA,WAAmB,CAAA;EACnC,QAAA,KAAa,QAAA,WAAmB,aAAA;EAChC,qBAAA;EACA,mBAAA,KAAwB,KAAA;EACxB,KAAA,GAAQ,OAAA,EAAS,aAAA,KAAkB,OAAA,QA3ChC;EA6CH,KAAA,GAAQ,0BAAA;EACR,MAAA,KAAW,OAAA,EAAS,aAAA,KAAkB,OAAA;EACtC,QAAA,KAAa,SAAA,aAAsB,OAAA;EACnC,QAAA,KACM,QAAA,iBAAyB,MAAA,EAAQ,cAAA,KAAmB,OAAA;EAE1D,QAAA,KAAa,MAAA,EAAQ,eAAA,KAAoB,OAAA;EACzC,QAAA,UAAkB,OAAA;EAClB,eAAA,KACM,OAAA,EAAS,oBAAA,KAAyB,OAAA;EAExC,gBAAA,KACM,OAAA;IAAW,UAAA;IAAoB,OAAA;EAAA;EAErC,uBAAA,KACM,OAAA,EAAS,4BAAA,KAAiC,OAAA;EAEhD,cAAA,GAAiB,6BAAA,CAA8B,CAAA;EAC/C,QAAA;IAEM,WAAA,GAAc,iBAAA;IACd,MAAA,GAAS,sBAAA;IACT,SAAA,GAAY,gBAAA;IACZ,KAAA,GAAQ,oBAAA;IACR,QAAA,GAAW,eAAA;IA9BkB;;;IAkC7B,UAAA,GAAa,8BAAA;EAAA;EAGnB,qBAAA;IAEM,IAAA;EAAA;EA7BiC;;;;;;;;;;;;;;;;;;;EAmDvC,8BAAA;EAWsB;;;;;;;;;EADtB,eAAA,KACM,QAAA,EAAU,MAAA,SAAe,mBAAA;AAAA;AAAA,KAIrB,oBAAA,KAAyB,aAAA,IACnC,wBAAA,CAAyB,CAAA,KACtB,CAAA,SAAU,aAAA,YAEP,oCAAA,CAAqC,CAAA"}
@@ -64,6 +64,7 @@ declare class ExternalStoreThreadRuntimeCore extends BaseThreadRuntimeCore imple
64
64
  private _findMessageIdForToolCall;
65
65
  switchToBranch(branchId: string): void;
66
66
  append(message: AppendMessage): Promise<void>;
67
+ deleteMessage(messageId: string): Promise<void>;
67
68
  getQueueItems(): readonly QueueItemState[];
68
69
  steerQueueItem(queueItemId: string): void;
69
70
  removeQueueItem(queueItemId: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"external-store-thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-runtime-core.ts"],"mappings":";;;;;;;;;;;;;cA+Ca,kBAAA,GACX,SAAA,WACA,QAAA,WAAmB,aAAa;AAAA,cAKrB,8BAAA,SACH,qBAAA,YACG,iBAAA;EAAA,QAEH,aAAA;EAAA,IAeG,YAAA,IAAY,mBAAA;EAAA,QAIf,SAAA;EACD,UAAA;EACA,cAAA;EAAA,IACI,SAAA;EAAA,IAIA,SAAA;EAAA,UAIQ,gBAAA,aAA6B,aAAA;EAAA,IAI5B,KAAA,iEAAK,kBAAA,oCAAA,iBAAA;EAAA,IAId,QAAA;kBARkD,iBAAA;;;;;;;EAYtD,WAAA,WAAsB,gBAAA;EACtB,MAAA;EAAA,QAEC,UAAA;EAAA,QAEA,MAAA;;;;;UAMA,gBAAA;EAEQ,SAAA,CAAU,SAAA;cAQxB,eAAA,EAAiB,oBAAA,EACjB,KAAA,EAAO,oBAAA;EAMF,qBAAA,CAAsB,KAAA,EAAO,oBAAA;EAAA;;;;;;EAAA,QA2J5B,qBAAA;EAsKyC;;;;EAAA,QAnGzC,oBAAA;EAAA,QACA,yBAAA;EAxSA;;;;;;EAAA,QAgTA,yBAAA;EAmBQ,cAAA,CAAe,QAAA;EAalB,MAAA,CAAO,OAAA,EAAS,aAAA,GAAgB,OAAA;EA8BtC,aAAA,aA9B6C,cAAA;EAoC7C,cAAA,CAAe,WAAA;EAIf,eAAA,CAAgB,WAAA;EAIV,QAAA,CAAS,MAAA,EAAQ,cAAA,GAAiB,OAAA;EAclC,SAAA,CAAU,MAAA,EAAQ,eAAA,GAAkB,OAAA;EAO1C,mBAAA;EAOA,mBAAA,CAAoB,KAAA;EAmBpB,SAAA;EA0CA,aAAA,CAAc,OAAA,EAAS,oBAAA;EAMvB,cAAA,CAAe,OAAA,EAAS,qBAAA;EAoBxB,qBAAA,CAAsB,OAAA,EAAS,4BAAA;EAMtB,KAAA,CAAM,eAAA,YAA2B,iBAAA;EAMjC,MAAA,CAAO,IAAA,EAAM,yBAAA;EAAA,QAQrB,cAAA;AAAA"}
1
+ {"version":3,"file":"external-store-thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-runtime-core.ts"],"mappings":";;;;;;;;;;;;;cA+Ca,kBAAA,GACX,SAAA,WACA,QAAA,WAAmB,aAAa;AAAA,cAKrB,8BAAA,SACH,qBAAA,YACG,iBAAA;EAAA,QAEH,aAAA;EAAA,IAgBG,YAAA,IAAY,mBAAA;EAAA,QAIf,SAAA;EACD,UAAA;EACA,cAAA;EAAA,IACI,SAAA;EAAA,IAIA,SAAA;EAAA,UAIQ,gBAAA,aAA6B,aAAA;EAAA,IAI5B,KAAA,iEAAK,kBAAA,oCAAA,iBAAA;EAAA,IAId,QAAA;kBARkD,iBAAA;;;;;;;EAYtD,WAAA,WAAsB,gBAAA;EACtB,MAAA;EAAA,QAEC,UAAA;EAAA,QAEA,MAAA;;;;;UAMA,gBAAA;EAEQ,SAAA,CAAU,SAAA;cAQxB,eAAA,EAAiB,oBAAA,EACjB,KAAA,EAAO,oBAAA;EAMF,qBAAA,CAAsB,KAAA,EAAO,oBAAA;EAAA;;;;;;EAAA,QA8J5B,qBAAA;EA0LuB;;;;EAAA,QAvHvB,oBAAA;EAAA,QACA,yBAAA;EAuOqB;;;;;;EAAA,QA/NrB,yBAAA;EAmBQ,cAAA,CAAe,QAAA;EAalB,MAAA,CAAO,OAAA,EAAS,aAAA,GAAgB,OAAA;EA8BhC,aAAA,CAAc,SAAA,WAAoB,OAAA;EAoBxC,aAAA,aApB+C,cAAA;EA0B/C,cAAA,CAAe,WAAA;EAIf,eAAA,CAAgB,WAAA;EAIV,QAAA,CAAS,MAAA,EAAQ,cAAA,GAAiB,OAAA;EAclC,SAAA,CAAU,MAAA,EAAQ,eAAA,GAAkB,OAAA;EAO1C,mBAAA;EAOA,mBAAA,CAAoB,KAAA;EAmBpB,SAAA;EA0CA,aAAA,CAAc,OAAA,EAAS,oBAAA;EAMvB,cAAA,CAAe,OAAA,EAAS,qBAAA;EAoBxB,qBAAA,CAAsB,OAAA,EAAS,4BAAA;EAMtB,KAAA,CAAM,eAAA,YAA2B,iBAAA;EAMjC,MAAA,CAAO,IAAA,EAAM,yBAAA;EAAA,QAQrB,cAAA;AAAA"}
@@ -24,6 +24,7 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
24
24
  switchToBranch: false,
25
25
  switchBranchDuringRun: false,
26
26
  edit: false,
27
+ delete: false,
27
28
  reload: false,
28
29
  cancel: false,
29
30
  unstable_copy: false,
@@ -86,6 +87,7 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
86
87
  switchToBranch: this._store.setMessages !== void 0,
87
88
  switchBranchDuringRun: false,
88
89
  edit: this._store.onEdit !== void 0,
90
+ delete: this._store.onDelete !== void 0 || this._store.setMessages !== void 0,
89
91
  reload: this._store.onReload !== void 0,
90
92
  cancel: this._store.onCancel !== void 0,
91
93
  speech: this._store.adapters?.speech !== void 0,
@@ -237,6 +239,17 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
237
239
  await this._store.onEdit(message);
238
240
  } else await this._store.onNew(message);
239
241
  }
242
+ async deleteMessage(messageId) {
243
+ if (this._store.onDelete) {
244
+ await this._store.onDelete(messageId);
245
+ return;
246
+ }
247
+ if (!this._store.setMessages) throw new Error("Runtime does not support deleting messages.");
248
+ if (this._store.isRunning) await this._toolInvocations?.abort();
249
+ const messages = this.repository.getMessages();
250
+ if (messages.findIndex((m) => m.id === messageId) === -1) throw new Error("Message not found.");
251
+ this.updateMessages(messages.filter((message) => message.id !== messageId));
252
+ }
240
253
  getQueueItems() {
241
254
  return this._store?.queue?.items ?? EMPTY_QUEUE_ITEMS;
242
255
  }