@assistant-ui/core 0.3.18 → 0.3.19

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 (274) hide show
  1. package/dist/adapters/speech.d.ts.map +1 -1
  2. package/dist/adapters/speech.js +13 -3
  3. package/dist/adapters/speech.js.map +1 -1
  4. package/dist/adapters/thread-history.d.ts +4 -0
  5. package/dist/adapters/thread-history.d.ts.map +1 -1
  6. package/dist/index.d.ts +2 -2
  7. package/dist/index.js.map +1 -1
  8. package/dist/internal.d.ts +1 -1
  9. package/dist/model-context/frame/host.d.ts.map +1 -1
  10. package/dist/model-context/frame/host.js +26 -11
  11. package/dist/model-context/frame/host.js.map +1 -1
  12. package/dist/model-context/interactable-composer-metadata.js +11 -9
  13. package/dist/model-context/interactable-composer-metadata.js.map +1 -1
  14. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  15. package/dist/react/adapters/LocalStorageThreadListAdapter.js +45 -7
  16. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  17. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  18. package/dist/react/client/DataRenderers.js +20 -15
  19. package/dist/react/client/DataRenderers.js.map +1 -1
  20. package/dist/react/client/Interactables.d.ts.map +1 -1
  21. package/dist/react/client/Interactables.js +11 -5
  22. package/dist/react/client/Interactables.js.map +1 -1
  23. package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
  24. package/dist/react/client/RemoteThreadList.js +3 -2
  25. package/dist/react/client/RemoteThreadList.js.map +1 -1
  26. package/dist/react/client/interactable-model-context.d.ts.map +1 -1
  27. package/dist/react/client/interactable-model-context.js +3 -2
  28. package/dist/react/client/interactable-model-context.js.map +1 -1
  29. package/dist/react/index.d.ts +2 -2
  30. package/dist/react/index.js +2 -2
  31. package/dist/react/interactables-legacy/useAssistantInteractable.d.ts.map +1 -1
  32. package/dist/react/interactables-legacy/useAssistantInteractable.js +3 -0
  33. package/dist/react/interactables-legacy/useAssistantInteractable.js.map +1 -1
  34. package/dist/react/model-context/useInteractable.d.ts.map +1 -1
  35. package/dist/react/model-context/useInteractable.js +4 -1
  36. package/dist/react/model-context/useInteractable.js.map +1 -1
  37. package/dist/react/model-context/useInteractableVersions.js +1 -1
  38. package/dist/react/primitives/message/MessageGroupedParts.d.ts +11 -2
  39. package/dist/react/primitives/message/MessageGroupedParts.d.ts.map +1 -1
  40. package/dist/react/primitives/message/MessageGroupedParts.js +3 -2
  41. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  42. package/dist/react/primitives/part/PartMessages.d.ts +1 -0
  43. package/dist/react/primitives/part/PartMessages.d.ts.map +1 -1
  44. package/dist/react/primitives/part/PartMessages.js +1 -0
  45. package/dist/react/primitives/part/PartMessages.js.map +1 -1
  46. package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
  47. package/dist/react/primitives/thread/ThreadMessages.js +6 -5
  48. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  49. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  50. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +2 -1
  51. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  52. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +2 -24
  53. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  54. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +135 -374
  55. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  56. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +1 -0
  57. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
  58. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +22 -2
  59. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  60. package/dist/react/runtimes/cloud/auiV0.d.ts +40 -15
  61. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  62. package/dist/react/runtimes/cloud/auiV0.js +62 -15
  63. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  64. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts +2 -1
  65. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts.map +1 -1
  66. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js +4 -0
  67. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js.map +1 -1
  68. package/dist/react/runtimes/cloud/sdkIdentity.d.ts +6 -0
  69. package/dist/react/runtimes/cloud/sdkIdentity.d.ts.map +1 -0
  70. package/dist/react/runtimes/cloud/sdkIdentity.js +9 -0
  71. package/dist/react/runtimes/cloud/sdkIdentity.js.map +1 -0
  72. package/dist/react/runtimes/external-message-converter.d.ts +12 -2
  73. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  74. package/dist/react/runtimes/external-message-converter.js +26 -61
  75. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  76. package/dist/react/runtimes/useRemoteThreadListRuntime.js +1 -1
  77. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  78. package/dist/react/utils/groupParts.d.ts +6 -1
  79. package/dist/react/utils/groupParts.d.ts.map +1 -1
  80. package/dist/react/utils/groupParts.js +6 -0
  81. package/dist/react/utils/groupParts.js.map +1 -1
  82. package/dist/react/utils/useJSONEqual.d.ts +3 -1
  83. package/dist/react/utils/useJSONEqual.d.ts.map +1 -1
  84. package/dist/react/utils/useJSONEqual.js +6 -1
  85. package/dist/react/utils/useJSONEqual.js.map +1 -1
  86. package/dist/react/utils/useJSONSchemaDependency.d.ts +7 -0
  87. package/dist/react/utils/useJSONSchemaDependency.d.ts.map +1 -0
  88. package/dist/react/utils/useJSONSchemaDependency.js +20 -0
  89. package/dist/react/utils/useJSONSchemaDependency.js.map +1 -0
  90. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  91. package/dist/runtime/api/thread-runtime.js +2 -5
  92. package/dist/runtime/api/thread-runtime.js.map +1 -1
  93. package/dist/runtime/base/base-composer-runtime-core.d.ts +1 -0
  94. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  95. package/dist/runtime/base/base-composer-runtime-core.js +46 -10
  96. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  97. package/dist/runtime/base/base-thread-runtime-core.d.ts +2 -0
  98. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  99. package/dist/runtime/base/base-thread-runtime-core.js +155 -64
  100. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  101. package/dist/runtime/interfaces/thread-runtime-core.d.ts +6 -0
  102. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  103. package/dist/runtime/queue/message-queue.d.ts +5 -0
  104. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  105. package/dist/runtime/queue/message-queue.js +61 -6
  106. package/dist/runtime/queue/message-queue.js.map +1 -1
  107. package/dist/runtime/utils/auto-status.d.ts +6 -2
  108. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  109. package/dist/runtime/utils/auto-status.js +12 -4
  110. package/dist/runtime/utils/auto-status.js.map +1 -1
  111. package/dist/runtime/utils/external-message-conversion.d.ts +16 -4
  112. package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -1
  113. package/dist/runtime/utils/external-message-conversion.js +48 -12
  114. package/dist/runtime/utils/external-message-conversion.js.map +1 -1
  115. package/dist/runtime/utils/message-repository.js +3 -3
  116. package/dist/runtime/utils/message-repository.js.map +1 -1
  117. package/dist/runtime/utils/thread-message-like.d.ts +2 -1
  118. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  119. package/dist/runtime/utils/thread-message-like.js +4 -2
  120. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  121. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  122. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +8 -1
  123. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  124. package/dist/runtimes/internal.d.ts +1 -1
  125. package/dist/runtimes/local/local-thread-runtime-core.d.ts +1 -1
  126. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  127. package/dist/runtimes/local/local-thread-runtime-core.js +4 -1
  128. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  129. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  130. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +2 -1
  131. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  132. package/dist/store/clients/external-thread.d.ts.map +1 -1
  133. package/dist/store/clients/external-thread.js +241 -200
  134. package/dist/store/clients/external-thread.js.map +1 -1
  135. package/dist/store/clients/thread-tasks.d.ts +13 -0
  136. package/dist/store/clients/thread-tasks.d.ts.map +1 -0
  137. package/dist/store/clients/thread-tasks.js +69 -0
  138. package/dist/store/clients/thread-tasks.js.map +1 -0
  139. package/dist/store/index.d.ts +3 -2
  140. package/dist/store/index.js +3 -3
  141. package/dist/store/primitive-predicates.d.ts.map +1 -1
  142. package/dist/store/primitive-predicates.js +4 -4
  143. package/dist/store/primitive-predicates.js.map +1 -1
  144. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  145. package/dist/store/runtime-clients/thread-runtime-client.js +176 -128
  146. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  147. package/dist/store/scope-registration.d.ts +2 -0
  148. package/dist/store/scope-registration.d.ts.map +1 -1
  149. package/dist/store/scopes/task.d.ts +36 -0
  150. package/dist/store/scopes/task.d.ts.map +1 -0
  151. package/dist/store/scopes/task.js +0 -0
  152. package/dist/store/scopes/thread.d.ts +20 -0
  153. package/dist/store/scopes/thread.d.ts.map +1 -1
  154. package/dist/subscribable/subscribable.d.ts +2 -1
  155. package/dist/subscribable/subscribable.d.ts.map +1 -1
  156. package/dist/subscribable/subscribable.js +23 -15
  157. package/dist/subscribable/subscribable.js.map +1 -1
  158. package/dist/types/index.d.ts +2 -2
  159. package/dist/types/message.d.ts +8 -1
  160. package/dist/types/message.d.ts.map +1 -1
  161. package/dist/types/message.js.map +1 -1
  162. package/dist/utils/abortable-iterable.d.ts.map +1 -1
  163. package/dist/utils/abortable-iterable.js +30 -14
  164. package/dist/utils/abortable-iterable.js.map +1 -1
  165. package/dist/utils/getGroupStatus.d.ts +18 -2
  166. package/dist/utils/getGroupStatus.d.ts.map +1 -1
  167. package/dist/utils/getGroupStatus.js +32 -7
  168. package/dist/utils/getGroupStatus.js.map +1 -1
  169. package/dist/utils/wire-media.d.ts.map +1 -1
  170. package/dist/utils/wire-media.js +2 -2
  171. package/dist/utils/wire-media.js.map +1 -1
  172. package/package.json +6 -6
  173. package/src/adapters/speech.test.ts +236 -0
  174. package/src/adapters/speech.ts +17 -10
  175. package/src/adapters/thread-history.ts +3 -0
  176. package/src/index.ts +1 -0
  177. package/src/model-context/frame/host.test.ts +113 -1
  178. package/src/model-context/frame/host.ts +39 -12
  179. package/src/model-context/interactable-composer-metadata.test.ts +30 -0
  180. package/src/model-context/interactable-composer-metadata.ts +10 -10
  181. package/src/react/adapters/LocalStorageThreadListAdapter.test.ts +244 -0
  182. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +104 -7
  183. package/src/react/client/DataRenderers.test.tsx +45 -0
  184. package/src/react/client/DataRenderers.ts +13 -9
  185. package/src/react/client/Interactables.test.ts +44 -1
  186. package/src/react/client/Interactables.ts +7 -1
  187. package/src/react/client/RemoteThreadList.test.ts +41 -1
  188. package/src/react/client/RemoteThreadList.ts +15 -2
  189. package/src/react/client/interactable-model-context.test.ts +44 -0
  190. package/src/react/client/interactable-model-context.ts +3 -2
  191. package/src/react/index.ts +5 -1
  192. package/src/react/interactables-legacy/useAssistantInteractable.test.tsx +132 -0
  193. package/src/react/interactables-legacy/useAssistantInteractable.ts +10 -1
  194. package/src/react/model-context/useInteractable.test.tsx +177 -0
  195. package/src/react/model-context/useInteractable.ts +3 -0
  196. package/src/react/primitive-hooks/useActionBarCopy.test.ts +0 -1
  197. package/src/react/primitive-hooks/useSuggestionTrigger.test.ts +0 -1
  198. package/src/react/primitives/message/MessageGroupedParts.test.tsx +96 -0
  199. package/src/react/primitives/message/MessageGroupedParts.tsx +15 -4
  200. package/src/react/primitives/part/PartMessages.test.tsx +104 -1
  201. package/src/react/primitives/part/PartMessages.tsx +1 -0
  202. package/src/react/primitives/thread/ThreadMessages.test.tsx +142 -0
  203. package/src/react/primitives/thread/ThreadMessages.tsx +8 -5
  204. package/src/react/providers/ReadonlyThreadProvider.test.tsx +56 -0
  205. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +7 -1
  206. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.ts +20 -14
  207. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +221 -1
  208. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +166 -512
  209. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.test.ts +77 -0
  210. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +27 -1
  211. package/src/react/runtimes/cloud/auiV0.ts +160 -25
  212. package/src/react/runtimes/cloud/createCloudThreadListAdapter.test.ts +21 -0
  213. package/src/react/runtimes/cloud/createCloudThreadListAdapter.ts +7 -1
  214. package/src/react/runtimes/cloud/sdkIdentity.ts +9 -0
  215. package/src/react/runtimes/cloud/useCloudThreadListAdapter.test.tsx +18 -4
  216. package/src/react/runtimes/external-message-converter.test.ts +136 -1
  217. package/src/react/runtimes/external-message-converter.ts +39 -93
  218. package/src/react/runtimes/useRemoteThreadListRuntime.ts +1 -1
  219. package/src/react/utils/groupParts.ts +12 -1
  220. package/src/react/utils/useJSONEqual.ts +9 -0
  221. package/src/react/utils/useJSONSchemaDependency.ts +22 -0
  222. package/src/runtime/api/thread-runtime.test.ts +58 -0
  223. package/src/runtime/api/thread-runtime.ts +2 -4
  224. package/src/runtime/base/base-composer-runtime-core.ts +69 -16
  225. package/src/runtime/base/base-thread-runtime-core.test.ts +1008 -1
  226. package/src/runtime/base/base-thread-runtime-core.ts +222 -83
  227. package/src/runtime/interfaces/thread-runtime-core.ts +6 -0
  228. package/src/runtime/queue/message-queue.ts +68 -6
  229. package/src/runtime/utils/auto-status.test.ts +112 -1
  230. package/src/runtime/utils/auto-status.ts +31 -5
  231. package/src/runtime/utils/external-message-conversion.test.ts +134 -0
  232. package/src/runtime/utils/external-message-conversion.ts +122 -31
  233. package/src/runtime/utils/message-repository.test.ts +49 -0
  234. package/src/runtime/utils/message-repository.ts +3 -3
  235. package/src/runtime/utils/thread-message-like.test.ts +52 -0
  236. package/src/runtime/utils/thread-message-like.ts +4 -0
  237. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +31 -1
  238. package/src/runtimes/local/local-thread-runtime-core.test.ts +21 -0
  239. package/src/runtimes/local/local-thread-runtime-core.ts +11 -1
  240. package/src/runtimes/tool-invocations/EDGE_CASES.md +2 -6
  241. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +133 -0
  242. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +10 -6
  243. package/src/store/clients/external-thread.ts +19 -1
  244. package/src/store/clients/thread-tasks.test.ts +274 -0
  245. package/src/store/clients/thread-tasks.ts +138 -0
  246. package/src/store/index.ts +8 -0
  247. package/src/store/primitive-predicates.test.ts +48 -5
  248. package/src/store/primitive-predicates.ts +7 -2
  249. package/src/store/runtime-clients/thread-runtime-client.ts +31 -1
  250. package/src/store/scope-registration.ts +2 -0
  251. package/src/store/scopes/task.ts +34 -0
  252. package/src/store/scopes/thread.ts +16 -0
  253. package/src/store/thread-tasks.test.tsx +209 -0
  254. package/src/subscribable/subscribable.test.ts +156 -1
  255. package/src/subscribable/subscribable.ts +25 -15
  256. package/src/tests/MessageRepository.test.ts +1 -5
  257. package/src/tests/auiV0Encode.test.ts +300 -0
  258. package/src/tests/base-composer-runtime-core-send.test.ts +51 -0
  259. package/src/tests/base-composer-runtime-core.test.ts +314 -2
  260. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +151 -0
  261. package/src/tests/external-thread-attachments.test.tsx +69 -0
  262. package/src/tests/external-thread-parity.test.tsx +34 -0
  263. package/src/tests/groupParts.test.ts +71 -0
  264. package/src/tests/message-queue.test.ts +253 -0
  265. package/src/tests/remote-thread-list-reactive-threadId.test.ts +51 -0
  266. package/src/tests/useRemoteThreadListRuntime-controlled.test.tsx +43 -0
  267. package/src/types/index.ts +1 -0
  268. package/src/types/message.ts +8 -0
  269. package/src/utils/abortable-iterable.test.ts +115 -0
  270. package/src/utils/abortable-iterable.ts +34 -23
  271. package/src/utils/getGroupStatus.test.ts +70 -4
  272. package/src/utils/getGroupStatus.ts +35 -12
  273. package/src/utils/wire-media.test.ts +10 -0
  274. package/src/utils/wire-media.ts +6 -2
@@ -7,11 +7,11 @@
7
7
  const composerSendDisabled = (s) => !s.composer.canSend || s.thread.isRunning && !s.thread.capabilities.queue;
8
8
  const composerCancelDisabled = (s) => !s.composer.canCancel;
9
9
  const composerInputDisabled = (s) => s.thread.isDisabled || s.composer.dictation?.inputDisabled === true;
10
- const actionBarEditDisabled = (s) => s.composer.isEditing;
11
- const actionBarReloadDisabled = (s) => s.thread.isRunning || s.thread.isDisabled || s.message.role !== "assistant";
10
+ const actionBarEditDisabled = (s) => s.composer.isEditing || s.optional.thread?.capabilities.edit === false;
11
+ const actionBarReloadDisabled = (s) => s.thread.isRunning || s.thread.isDisabled || s.message.role !== "assistant" || !s.thread.capabilities.reload;
12
12
  const actionBarCopyDisabled = (s) => !((s.message.role !== "assistant" || s.message.status?.type !== "running") && s.message.parts.some((part) => part.type === "text" && part.text.length > 0));
13
- const branchPickerPreviousDisabled = (s) => s.message.branchNumber <= 1 || s.thread.isRunning && !s.thread.capabilities.switchBranchDuringRun;
14
- const branchPickerNextDisabled = (s) => s.message.branchNumber >= s.message.branchCount || s.thread.isRunning && !s.thread.capabilities.switchBranchDuringRun;
13
+ const branchPickerPreviousDisabled = (s) => s.message.branchNumber <= 1 || !s.thread.capabilities.switchToBranch || s.thread.isRunning && !s.thread.capabilities.switchBranchDuringRun;
14
+ const branchPickerNextDisabled = (s) => s.message.branchNumber >= s.message.branchCount || !s.thread.capabilities.switchToBranch || s.thread.isRunning && !s.thread.capabilities.switchBranchDuringRun;
15
15
  const suggestionTriggerDisabled = (s, send) => s.thread.isDisabled || send && s.thread.isRunning && !s.thread.capabilities.queue;
16
16
  const messageErrorText = (s) => {
17
17
  if (s.message.status?.type !== "incomplete" || s.message.status.reason !== "error") return;
@@ -1 +1 @@
1
- {"version":3,"file":"primitive-predicates.js","names":["ReadonlyJSONArray","ReadonlyJSONObject","AssistantState","composerSendDisabled","s","composer","canSend","thread","isRunning","capabilities","queue","composerCancelDisabled","canCancel","composerInputDisabled","isDisabled","dictation","inputDisabled","actionBarEditDisabled","isEditing","actionBarReloadDisabled","message","role","actionBarCopyDisabled","status","type","parts","some","part","text","length","branchPickerPreviousDisabled","branchNumber","switchBranchDuringRun","branchPickerNextDisabled","branchCount","suggestionTriggerDisabled","send","messageErrorText","reason","undefined","error","threadListLoadMoreDisabled","threads","hasMore","isLoading","isLoadingMore"],"sources":["../../src/store/primitive-predicates.ts"],"sourcesContent":["import type {\n ReadonlyJSONArray,\n ReadonlyJSONObject,\n} from \"assistant-stream/utils\";\nimport type { AssistantState } from \"@assistant-ui/store\";\n\n/**\n * Disabled predicates shared by every binding's primitive layer. Each binding\n * consumes these as state selectors so the disabled semantics of a primitive\n * cannot drift between frameworks.\n */\n\nexport const composerSendDisabled = (s: AssistantState): boolean =>\n !s.composer.canSend || (s.thread.isRunning && !s.thread.capabilities.queue);\n\nexport const composerCancelDisabled = (s: AssistantState): boolean =>\n !s.composer.canCancel;\n\nexport const composerInputDisabled = (s: AssistantState): boolean =>\n s.thread.isDisabled || s.composer.dictation?.inputDisabled === true;\n\nexport const actionBarEditDisabled = (s: AssistantState): boolean =>\n s.composer.isEditing;\n\nexport const actionBarReloadDisabled = (s: AssistantState): boolean =>\n s.thread.isRunning || s.thread.isDisabled || s.message.role !== \"assistant\";\n\nexport const actionBarCopyDisabled = (s: AssistantState): boolean =>\n !(\n (s.message.role !== \"assistant\" || s.message.status?.type !== \"running\") &&\n s.message.parts.some((part) => part.type === \"text\" && part.text.length > 0)\n );\n\nexport const branchPickerPreviousDisabled = (s: AssistantState): boolean =>\n s.message.branchNumber <= 1 ||\n (s.thread.isRunning && !s.thread.capabilities.switchBranchDuringRun);\n\nexport const branchPickerNextDisabled = (s: AssistantState): boolean =>\n s.message.branchNumber >= s.message.branchCount ||\n (s.thread.isRunning && !s.thread.capabilities.switchBranchDuringRun);\n\nexport const suggestionTriggerDisabled = (\n s: AssistantState,\n send: boolean,\n): boolean =>\n s.thread.isDisabled ||\n (send && s.thread.isRunning && !s.thread.capabilities.queue);\n\nexport const messageErrorText = (\n s: AssistantState,\n):\n | string\n | number\n | boolean\n | ReadonlyJSONObject\n | ReadonlyJSONArray\n | undefined => {\n if (\n s.message.status?.type !== \"incomplete\" ||\n s.message.status.reason !== \"error\"\n ) {\n return undefined;\n }\n const error = s.message.status.error;\n if (typeof error === \"string\") return error;\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof error.message === \"string\"\n ) {\n return error.message;\n }\n return error ?? \"An error occurred\";\n};\n\nexport const threadListLoadMoreDisabled = (s: AssistantState): boolean =>\n !s.threads.hasMore || s.threads.isLoading || s.threads.isLoadingMore;\n"],"mappings":";;;;;;AAYA,MAAaG,wBAAwBC,MACnC,CAACA,EAAEC,SAASC,WAAYF,EAAEG,OAAOC,aAAa,CAACJ,EAAEG,OAAOE,aAAaC;AAEvE,MAAaC,0BAA0BP,MACrC,CAACA,EAAEC,SAASO;AAEd,MAAaC,yBAAyBT,MACpCA,EAAEG,OAAOO,cAAcV,EAAEC,SAASU,WAAWC,kBAAkB;AAEjE,MAAaC,yBAAyBb,MACpCA,EAAEC,SAASa;AAEb,MAAaC,2BAA2Bf,MACtCA,EAAEG,OAAOC,aAAaJ,EAAEG,OAAOO,cAAcV,EAAEgB,QAAQC,SAAS;AAElE,MAAaC,yBAAyBlB,MACpC,GACGA,EAAEgB,QAAQC,SAAS,eAAejB,EAAEgB,QAAQG,QAAQC,SAAS,cAC9DpB,EAAEgB,QAAQK,MAAMC,MAAMC,SAASA,KAAKH,SAAS,UAAUG,KAAKC,KAAKC,SAAS,CAAC;AAG/E,MAAaC,gCAAgC1B,MAC3CA,EAAEgB,QAAQW,gBAAgB,KACzB3B,EAAEG,OAAOC,aAAa,CAACJ,EAAEG,OAAOE,aAAauB;AAEhD,MAAaC,4BAA4B7B,MACvCA,EAAEgB,QAAQW,gBAAgB3B,EAAEgB,QAAQc,eACnC9B,EAAEG,OAAOC,aAAa,CAACJ,EAAEG,OAAOE,aAAauB;AAEhD,MAAaG,6BACX/B,GACAgC,SAEAhC,EAAEG,OAAOO,cACRsB,QAAQhC,EAAEG,OAAOC,aAAa,CAACJ,EAAEG,OAAOE,aAAaC;AAExD,MAAa2B,oBACXjC,MAOe;CACf,IACEA,EAAEgB,QAAQG,QAAQC,SAAS,gBAC3BpB,EAAEgB,QAAQG,OAAOe,WAAW,SAE5B;CAEF,MAAME,QAAQpC,EAAEgB,QAAQG,OAAOiB;CAC/B,IAAI,OAAOA,UAAU,UAAU,OAAOA;CACtC,IACE,OAAOA,UAAU,YACjBA,UAAU,QACV,aAAaA,SACb,OAAOA,MAAMpB,YAAY,UAEzB,OAAOoB,MAAMpB;CAEf,OAAOoB,SAAS;AAClB;AAEA,MAAaC,8BAA8BrC,MACzC,CAACA,EAAEsC,QAAQC,WAAWvC,EAAEsC,QAAQE,aAAaxC,EAAEsC,QAAQG"}
1
+ {"version":3,"file":"primitive-predicates.js","names":["ReadonlyJSONArray","ReadonlyJSONObject","AssistantState","composerSendDisabled","s","composer","canSend","thread","isRunning","capabilities","queue","composerCancelDisabled","canCancel","composerInputDisabled","isDisabled","dictation","inputDisabled","actionBarEditDisabled","isEditing","optional","edit","actionBarReloadDisabled","message","role","reload","actionBarCopyDisabled","status","type","parts","some","part","text","length","branchPickerPreviousDisabled","branchNumber","switchToBranch","switchBranchDuringRun","branchPickerNextDisabled","branchCount","suggestionTriggerDisabled","send","messageErrorText","reason","undefined","error","threadListLoadMoreDisabled","threads","hasMore","isLoading","isLoadingMore"],"sources":["../../src/store/primitive-predicates.ts"],"sourcesContent":["import type {\n ReadonlyJSONArray,\n ReadonlyJSONObject,\n} from \"assistant-stream/utils\";\nimport type { AssistantState } from \"@assistant-ui/store\";\n\n/**\n * Disabled predicates shared by every binding's primitive layer. Each binding\n * consumes these as state selectors so the disabled semantics of a primitive\n * cannot drift between frameworks.\n */\n\nexport const composerSendDisabled = (s: AssistantState): boolean =>\n !s.composer.canSend || (s.thread.isRunning && !s.thread.capabilities.queue);\n\nexport const composerCancelDisabled = (s: AssistantState): boolean =>\n !s.composer.canCancel;\n\nexport const composerInputDisabled = (s: AssistantState): boolean =>\n s.thread.isDisabled || s.composer.dictation?.inputDisabled === true;\n\nexport const actionBarEditDisabled = (s: AssistantState): boolean =>\n s.composer.isEditing || s.optional.thread?.capabilities.edit === false;\n\nexport const actionBarReloadDisabled = (s: AssistantState): boolean =>\n s.thread.isRunning ||\n s.thread.isDisabled ||\n s.message.role !== \"assistant\" ||\n !s.thread.capabilities.reload;\n\nexport const actionBarCopyDisabled = (s: AssistantState): boolean =>\n !(\n (s.message.role !== \"assistant\" || s.message.status?.type !== \"running\") &&\n s.message.parts.some((part) => part.type === \"text\" && part.text.length > 0)\n );\n\nexport const branchPickerPreviousDisabled = (s: AssistantState): boolean =>\n s.message.branchNumber <= 1 ||\n !s.thread.capabilities.switchToBranch ||\n (s.thread.isRunning && !s.thread.capabilities.switchBranchDuringRun);\n\nexport const branchPickerNextDisabled = (s: AssistantState): boolean =>\n s.message.branchNumber >= s.message.branchCount ||\n !s.thread.capabilities.switchToBranch ||\n (s.thread.isRunning && !s.thread.capabilities.switchBranchDuringRun);\n\nexport const suggestionTriggerDisabled = (\n s: AssistantState,\n send: boolean,\n): boolean =>\n s.thread.isDisabled ||\n (send && s.thread.isRunning && !s.thread.capabilities.queue);\n\nexport const messageErrorText = (\n s: AssistantState,\n):\n | string\n | number\n | boolean\n | ReadonlyJSONObject\n | ReadonlyJSONArray\n | undefined => {\n if (\n s.message.status?.type !== \"incomplete\" ||\n s.message.status.reason !== \"error\"\n ) {\n return undefined;\n }\n const error = s.message.status.error;\n if (typeof error === \"string\") return error;\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof error.message === \"string\"\n ) {\n return error.message;\n }\n return error ?? \"An error occurred\";\n};\n\nexport const threadListLoadMoreDisabled = (s: AssistantState): boolean =>\n !s.threads.hasMore || s.threads.isLoading || s.threads.isLoadingMore;\n"],"mappings":";;;;;;AAYA,MAAaG,wBAAwBC,MACnC,CAACA,EAAEC,SAASC,WAAYF,EAAEG,OAAOC,aAAa,CAACJ,EAAEG,OAAOE,aAAaC;AAEvE,MAAaC,0BAA0BP,MACrC,CAACA,EAAEC,SAASO;AAEd,MAAaC,yBAAyBT,MACpCA,EAAEG,OAAOO,cAAcV,EAAEC,SAASU,WAAWC,kBAAkB;AAEjE,MAAaC,yBAAyBb,MACpCA,EAAEC,SAASa,aAAad,EAAEe,SAASZ,QAAQE,aAAaW,SAAS;AAEnE,MAAaC,2BAA2BjB,MACtCA,EAAEG,OAAOC,aACTJ,EAAEG,OAAOO,cACTV,EAAEkB,QAAQC,SAAS,eACnB,CAACnB,EAAEG,OAAOE,aAAae;AAEzB,MAAaC,yBAAyBrB,MACpC,GACGA,EAAEkB,QAAQC,SAAS,eAAenB,EAAEkB,QAAQI,QAAQC,SAAS,cAC9DvB,EAAEkB,QAAQM,MAAMC,MAAMC,SAASA,KAAKH,SAAS,UAAUG,KAAKC,KAAKC,SAAS,CAAC;AAG/E,MAAaC,gCAAgC7B,MAC3CA,EAAEkB,QAAQY,gBAAgB,KAC1B,CAAC9B,EAAEG,OAAOE,aAAa0B,kBACtB/B,EAAEG,OAAOC,aAAa,CAACJ,EAAEG,OAAOE,aAAa2B;AAEhD,MAAaC,4BAA4BjC,MACvCA,EAAEkB,QAAQY,gBAAgB9B,EAAEkB,QAAQgB,eACpC,CAAClC,EAAEG,OAAOE,aAAa0B,kBACtB/B,EAAEG,OAAOC,aAAa,CAACJ,EAAEG,OAAOE,aAAa2B;AAEhD,MAAaG,6BACXnC,GACAoC,SAEApC,EAAEG,OAAOO,cACR0B,QAAQpC,EAAEG,OAAOC,aAAa,CAACJ,EAAEG,OAAOE,aAAaC;AAExD,MAAa+B,oBACXrC,MAOe;CACf,IACEA,EAAEkB,QAAQI,QAAQC,SAAS,gBAC3BvB,EAAEkB,QAAQI,OAAOgB,WAAW,SAE5B;CAEF,MAAME,QAAQxC,EAAEkB,QAAQI,OAAOkB;CAC/B,IAAI,OAAOA,UAAU,UAAU,OAAOA;CACtC,IACE,OAAOA,UAAU,YACjBA,UAAU,QACV,aAAaA,SACb,OAAOA,MAAMtB,YAAY,UAEzB,OAAOsB,MAAMtB;CAEf,OAAOsB,SAAS;AAClB;AAEA,MAAaC,8BAA8BzC,MACzC,CAACA,EAAE0C,QAAQC,WAAW3C,EAAE0C,QAAQE,aAAa5C,EAAE0C,QAAQG"}
@@ -1 +1 @@
1
- {"version":3,"file":"thread-runtime-client.d.ts","names":[],"sources":["../../../src/store/runtime-clients/thread-runtime-client.ts"],"mappings":";;;cAgMa,0CAAY,SAAA;EAjJd,SAAA"}
1
+ {"version":3,"file":"thread-runtime-client.d.ts","names":[],"sources":["../../../src/store/runtime-clients/thread-runtime-client.ts"],"mappings":";;;cA8Na,0CAAY,SAAA;EA1Kd,SAAA"}
@@ -3,6 +3,7 @@ import { ComposerClient } from "./composer-runtime-client.js";
3
3
  import { liveRef } from "./liveRef.js";
4
4
  import { MessageClient } from "./message-runtime-client.js";
5
5
  import { ThreadSuggestions } from "../clients/suggestions.js";
6
+ import { TaskClient, createTaskDeriver, getTaskKey } from "../clients/thread-tasks.js";
6
7
  import { useAssistantEmit, useClientLookup, useClientResource } from "@assistant-ui/store/client";
7
8
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
8
9
  import { useEffect } from "@assistant-ui/tap/react-shim";
@@ -35,7 +36,7 @@ const useMessageClientById = (t0) => {
35
36
  };
36
37
  const MessageClientById = resource(useMessageClientById);
37
38
  const useThreadClient = (t0) => {
38
- const $ = c(83);
39
+ const $ = c(93);
39
40
  const { runtime } = t0;
40
41
  const runtimeState = useSubscribable(runtime);
41
42
  const emit = useAssistantEmit();
@@ -56,6 +57,13 @@ const useThreadClient = (t0) => {
56
57
  });
57
58
  unsubscribers.push(unsubscribe);
58
59
  }
60
+ unsubscribers.push(runtime.unstable_on("toolApprovalAnswered", (payload) => {
61
+ const threadId_0 = runtime.getState()?.threadId || "unknown";
62
+ emit("thread.toolApprovalAnswered", {
63
+ threadId: threadId_0,
64
+ ...payload
65
+ });
66
+ }));
59
67
  return () => {
60
68
  for (const unsub of unsubscribers) unsub();
61
69
  };
@@ -115,10 +123,30 @@ const useThreadClient = (t0) => {
115
123
  } else t7 = $[16];
116
124
  const suggestions = useClientResource(t7);
117
125
  let t8;
118
- if ($[17] !== runtime || $[18] !== runtimeState.messages || $[19] !== runtimeState.threadId || $[20] !== threadIdRef) {
119
- let t9;
120
- if ($[22] !== runtime || $[23] !== runtimeState.threadId || $[24] !== threadIdRef) {
121
- t9 = (m) => withKey(m.id, MessageClientById({
126
+ if ($[17] === Symbol.for("react.memo_cache_sentinel")) {
127
+ t8 = createTaskDeriver();
128
+ $[17] = t8;
129
+ } else t8 = $[17];
130
+ const taskDeriver = t8;
131
+ let t9;
132
+ if ($[18] !== runtimeState.messages) {
133
+ t9 = taskDeriver(runtimeState.messages);
134
+ $[18] = runtimeState.messages;
135
+ $[19] = t9;
136
+ } else t9 = $[19];
137
+ const tasks = t9;
138
+ let t10;
139
+ if ($[20] !== tasks) {
140
+ t10 = tasks.map(_temp);
141
+ $[20] = tasks;
142
+ $[21] = t10;
143
+ } else t10 = $[21];
144
+ const taskClients = useClientLookup(t10);
145
+ let t11;
146
+ if ($[22] !== runtime || $[23] !== runtimeState.messages || $[24] !== runtimeState.threadId || $[25] !== threadIdRef) {
147
+ let t12;
148
+ if ($[27] !== runtime || $[28] !== runtimeState.threadId || $[29] !== threadIdRef) {
149
+ t12 = (m) => withKey(m.id, MessageClientById({
122
150
  runtime,
123
151
  id: m.id,
124
152
  threadIdRef,
@@ -129,24 +157,24 @@ const useThreadClient = (t0) => {
129
157
  threadIdRef,
130
158
  runtimeState.threadId
131
159
  ]);
132
- $[22] = runtime;
133
- $[23] = runtimeState.threadId;
134
- $[24] = threadIdRef;
135
- $[25] = t9;
136
- } else t9 = $[25];
137
- t8 = runtimeState.messages.map(t9);
138
- $[17] = runtime;
139
- $[18] = runtimeState.messages;
140
- $[19] = runtimeState.threadId;
141
- $[20] = threadIdRef;
142
- $[21] = t8;
143
- } else t8 = $[21];
144
- const messages = useClientLookup(t8);
145
- const t9 = messages.state.length === 0 && !runtimeState.isLoading;
146
- let t10;
147
- if ($[26] !== composer.state || $[27] !== messages.state || $[28] !== runtimeState.capabilities || $[29] !== runtimeState.extras || $[30] !== runtimeState.isDisabled || $[31] !== runtimeState.isLoading || $[32] !== runtimeState.isRunning || $[33] !== runtimeState.speech || $[34] !== runtimeState.state || $[35] !== runtimeState.suggestions || $[36] !== runtimeState.voice || $[37] !== t9) {
148
- t10 = {
149
- isEmpty: t9,
160
+ $[27] = runtime;
161
+ $[28] = runtimeState.threadId;
162
+ $[29] = threadIdRef;
163
+ $[30] = t12;
164
+ } else t12 = $[30];
165
+ t11 = runtimeState.messages.map(t12);
166
+ $[22] = runtime;
167
+ $[23] = runtimeState.messages;
168
+ $[24] = runtimeState.threadId;
169
+ $[25] = threadIdRef;
170
+ $[26] = t11;
171
+ } else t11 = $[26];
172
+ const messages = useClientLookup(t11);
173
+ const t12 = messages.state.length === 0 && !runtimeState.isLoading;
174
+ let t13;
175
+ if ($[31] !== composer.state || $[32] !== messages.state || $[33] !== runtimeState.capabilities || $[34] !== runtimeState.extras || $[35] !== runtimeState.isDisabled || $[36] !== runtimeState.isLoading || $[37] !== runtimeState.isRunning || $[38] !== runtimeState.speech || $[39] !== runtimeState.state || $[40] !== runtimeState.suggestions || $[41] !== runtimeState.voice || $[42] !== t12 || $[43] !== tasks) {
176
+ t13 = {
177
+ isEmpty: t12,
150
178
  isDisabled: runtimeState.isDisabled,
151
179
  isLoading: runtimeState.isLoading,
152
180
  isRunning: runtimeState.isRunning,
@@ -157,50 +185,65 @@ const useThreadClient = (t0) => {
157
185
  speech: runtimeState.speech,
158
186
  voice: runtimeState.voice,
159
187
  composer: composer.state,
160
- messages: messages.state
188
+ messages: messages.state,
189
+ tasks
161
190
  };
162
- $[26] = composer.state;
163
- $[27] = messages.state;
164
- $[28] = runtimeState.capabilities;
165
- $[29] = runtimeState.extras;
166
- $[30] = runtimeState.isDisabled;
167
- $[31] = runtimeState.isLoading;
168
- $[32] = runtimeState.isRunning;
169
- $[33] = runtimeState.speech;
170
- $[34] = runtimeState.state;
171
- $[35] = runtimeState.suggestions;
172
- $[36] = runtimeState.voice;
173
- $[37] = t9;
174
- $[38] = t10;
175
- } else t10 = $[38];
176
- const state = t10;
177
- let t11;
178
- if ($[39] !== state) {
179
- t11 = () => state;
180
- $[39] = state;
181
- $[40] = t11;
182
- } else t11 = $[40];
183
- let t12;
184
- if ($[41] !== composer.methods) {
185
- t12 = () => composer.methods;
186
- $[41] = composer.methods;
191
+ $[31] = composer.state;
192
+ $[32] = messages.state;
193
+ $[33] = runtimeState.capabilities;
194
+ $[34] = runtimeState.extras;
195
+ $[35] = runtimeState.isDisabled;
196
+ $[36] = runtimeState.isLoading;
197
+ $[37] = runtimeState.isRunning;
198
+ $[38] = runtimeState.speech;
199
+ $[39] = runtimeState.state;
200
+ $[40] = runtimeState.suggestions;
201
+ $[41] = runtimeState.voice;
187
202
  $[42] = t12;
188
- } else t12 = $[42];
189
- let t13;
190
- if ($[43] !== suggestions) {
191
- t13 = () => suggestions.methods;
192
- $[43] = suggestions;
203
+ $[43] = tasks;
193
204
  $[44] = t13;
194
205
  } else t13 = $[44];
206
+ const state = t13;
195
207
  let t14;
196
- if ($[45] !== emit || $[46] !== isSuggestion || $[47] !== runtime) {
197
- t14 = (message) => {
208
+ if ($[45] !== state) {
209
+ t14 = () => state;
210
+ $[45] = state;
211
+ $[46] = t14;
212
+ } else t14 = $[46];
213
+ let t15;
214
+ if ($[47] !== composer.methods) {
215
+ t15 = () => composer.methods;
216
+ $[47] = composer.methods;
217
+ $[48] = t15;
218
+ } else t15 = $[48];
219
+ let t16;
220
+ if ($[49] !== suggestions) {
221
+ t16 = () => suggestions.methods;
222
+ $[49] = suggestions;
223
+ $[50] = t16;
224
+ } else t16 = $[50];
225
+ let t17;
226
+ if ($[51] !== taskClients || $[52] !== tasks) {
227
+ t17 = (selector) => {
228
+ if ("id" in selector) {
229
+ const task_0 = tasks.find((candidate) => candidate.id === selector.id);
230
+ return taskClients.get({ key: task_0 ? getTaskKey(task_0) : selector.id });
231
+ }
232
+ return taskClients.get(selector);
233
+ };
234
+ $[51] = taskClients;
235
+ $[52] = tasks;
236
+ $[53] = t17;
237
+ } else t17 = $[53];
238
+ let t18;
239
+ if ($[54] !== emit || $[55] !== isSuggestion || $[56] !== runtime) {
240
+ t18 = (message) => {
198
241
  const appended = typeof message === "string" ? { content: [{
199
242
  type: "text",
200
243
  text: message
201
244
  }] } : message;
202
245
  if ((appended.role ?? "user") === "user") {
203
- const text_0 = appended.content.map(_temp).join("");
246
+ const text_0 = appended.content.map(_temp2).join("");
204
247
  emit("composer.send", {
205
248
  threadId: runtime.getState().threadId,
206
249
  chars: text_0.length,
@@ -210,101 +253,106 @@ const useThreadClient = (t0) => {
210
253
  }
211
254
  runtime.append(message);
212
255
  };
213
- $[45] = emit;
214
- $[46] = isSuggestion;
215
- $[47] = runtime;
216
- $[48] = t14;
217
- } else t14 = $[48];
218
- let t15;
219
- if ($[49] !== emitThreadEvent || $[50] !== runtime || $[51] !== runtimeState.isRunning) {
220
- t15 = () => {
256
+ $[54] = emit;
257
+ $[55] = isSuggestion;
258
+ $[56] = runtime;
259
+ $[57] = t18;
260
+ } else t18 = $[57];
261
+ let t19;
262
+ if ($[58] !== emitThreadEvent || $[59] !== runtime || $[60] !== runtimeState.isRunning) {
263
+ t19 = () => {
221
264
  if (runtimeState.isRunning) emitThreadEvent("thread.cancelRun");
222
265
  runtime.cancelRun();
223
266
  };
224
- $[49] = emitThreadEvent;
225
- $[50] = runtime;
226
- $[51] = runtimeState.isRunning;
227
- $[52] = t15;
228
- } else t15 = $[52];
229
- let t16;
230
- if ($[53] !== emitThreadEvent || $[54] !== runtime) {
231
- t16 = () => {
267
+ $[58] = emitThreadEvent;
268
+ $[59] = runtime;
269
+ $[60] = runtimeState.isRunning;
270
+ $[61] = t19;
271
+ } else t19 = $[61];
272
+ let t20;
273
+ if ($[62] !== emitThreadEvent || $[63] !== runtime) {
274
+ t20 = () => {
232
275
  runtime.connectVoice();
233
276
  emitThreadEvent("thread.voiceStarted");
234
277
  };
235
- $[53] = emitThreadEvent;
236
- $[54] = runtime;
237
- $[55] = t16;
238
- } else t16 = $[55];
239
- let t17;
240
- if ($[56] !== messages) {
241
- t17 = (selector) => {
242
- if ("id" in selector) return messages.get({ key: selector.id });
243
- else return messages.get(selector);
278
+ $[62] = emitThreadEvent;
279
+ $[63] = runtime;
280
+ $[64] = t20;
281
+ } else t20 = $[64];
282
+ let t21;
283
+ if ($[65] !== messages) {
284
+ t21 = (selector_0) => {
285
+ if ("id" in selector_0) return messages.get({ key: selector_0.id });
286
+ else return messages.get(selector_0);
244
287
  };
245
- $[56] = messages;
246
- $[57] = t17;
247
- } else t17 = $[57];
248
- let t18;
249
- if ($[58] !== runtime) {
250
- t18 = () => runtime;
251
- $[58] = runtime;
252
- $[59] = t18;
253
- } else t18 = $[59];
254
- let t19;
255
- if ($[60] !== runtime.deleteMessage || $[61] !== runtime.disconnectVoice || $[62] !== runtime.export || $[63] !== runtime.getModelContext || $[64] !== runtime.getVoiceVolume || $[65] !== runtime.import || $[66] !== runtime.importExternalState || $[67] !== runtime.muteVoice || $[68] !== runtime.reset || $[69] !== runtime.resumeRun || $[70] !== runtime.startRun || $[71] !== runtime.stopSpeaking || $[72] !== runtime.subscribeVoiceVolume || $[73] !== runtime.unmuteVoice || $[74] !== t11 || $[75] !== t12 || $[76] !== t13 || $[77] !== t14 || $[78] !== t15 || $[79] !== t16 || $[80] !== t17 || $[81] !== t18) {
256
- t19 = {
257
- getState: t11,
258
- composer: t12,
259
- suggestions: t13,
260
- append: t14,
288
+ $[65] = messages;
289
+ $[66] = t21;
290
+ } else t21 = $[66];
291
+ let t22;
292
+ if ($[67] !== runtime) {
293
+ t22 = () => runtime;
294
+ $[67] = runtime;
295
+ $[68] = t22;
296
+ } else t22 = $[68];
297
+ let t23;
298
+ if ($[69] !== runtime.deleteMessage || $[70] !== runtime.disconnectVoice || $[71] !== runtime.export || $[72] !== runtime.getModelContext || $[73] !== runtime.getVoiceVolume || $[74] !== runtime.import || $[75] !== runtime.importExternalState || $[76] !== runtime.muteVoice || $[77] !== runtime.reset || $[78] !== runtime.resumeRun || $[79] !== runtime.startRun || $[80] !== runtime.stopSpeaking || $[81] !== runtime.subscribeVoiceVolume || $[82] !== runtime.unmuteVoice || $[83] !== t14 || $[84] !== t15 || $[85] !== t16 || $[86] !== t17 || $[87] !== t18 || $[88] !== t19 || $[89] !== t20 || $[90] !== t21 || $[91] !== t22) {
299
+ t23 = {
300
+ getState: t14,
301
+ composer: t15,
302
+ suggestions: t16,
303
+ task: t17,
304
+ append: t18,
261
305
  deleteMessage: runtime.deleteMessage,
262
306
  startRun: runtime.startRun,
263
307
  resumeRun: runtime.resumeRun,
264
308
  importExternalState: runtime.importExternalState,
265
- cancelRun: t15,
309
+ cancelRun: t19,
266
310
  getModelContext: runtime.getModelContext,
267
311
  export: runtime.export,
268
312
  import: runtime.import,
269
313
  reset: runtime.reset,
270
314
  stopSpeaking: runtime.stopSpeaking,
271
- connectVoice: t16,
315
+ connectVoice: t20,
272
316
  disconnectVoice: runtime.disconnectVoice,
273
317
  getVoiceVolume: runtime.getVoiceVolume,
274
318
  subscribeVoiceVolume: runtime.subscribeVoiceVolume,
275
319
  muteVoice: runtime.muteVoice,
276
320
  unmuteVoice: runtime.unmuteVoice,
277
- message: t17,
278
- __internal_getRuntime: t18
321
+ message: t21,
322
+ __internal_getRuntime: t22
279
323
  };
280
- $[60] = runtime.deleteMessage;
281
- $[61] = runtime.disconnectVoice;
282
- $[62] = runtime.export;
283
- $[63] = runtime.getModelContext;
284
- $[64] = runtime.getVoiceVolume;
285
- $[65] = runtime.import;
286
- $[66] = runtime.importExternalState;
287
- $[67] = runtime.muteVoice;
288
- $[68] = runtime.reset;
289
- $[69] = runtime.resumeRun;
290
- $[70] = runtime.startRun;
291
- $[71] = runtime.stopSpeaking;
292
- $[72] = runtime.subscribeVoiceVolume;
293
- $[73] = runtime.unmuteVoice;
294
- $[74] = t11;
295
- $[75] = t12;
296
- $[76] = t13;
297
- $[77] = t14;
298
- $[78] = t15;
299
- $[79] = t16;
300
- $[80] = t17;
301
- $[81] = t18;
302
- $[82] = t19;
303
- } else t19 = $[82];
304
- return t19;
324
+ $[69] = runtime.deleteMessage;
325
+ $[70] = runtime.disconnectVoice;
326
+ $[71] = runtime.export;
327
+ $[72] = runtime.getModelContext;
328
+ $[73] = runtime.getVoiceVolume;
329
+ $[74] = runtime.import;
330
+ $[75] = runtime.importExternalState;
331
+ $[76] = runtime.muteVoice;
332
+ $[77] = runtime.reset;
333
+ $[78] = runtime.resumeRun;
334
+ $[79] = runtime.startRun;
335
+ $[80] = runtime.stopSpeaking;
336
+ $[81] = runtime.subscribeVoiceVolume;
337
+ $[82] = runtime.unmuteVoice;
338
+ $[83] = t14;
339
+ $[84] = t15;
340
+ $[85] = t16;
341
+ $[86] = t17;
342
+ $[87] = t18;
343
+ $[88] = t19;
344
+ $[89] = t20;
345
+ $[90] = t21;
346
+ $[91] = t22;
347
+ $[92] = t23;
348
+ } else t23 = $[92];
349
+ return t23;
305
350
  };
306
351
  const ThreadClient = resource(useThreadClient);
307
- function _temp(part) {
352
+ function _temp(task) {
353
+ return withKey(getTaskKey(task), TaskClient({ task }), [task]);
354
+ }
355
+ function _temp2(part) {
308
356
  return part.type === "text" ? part.text : "";
309
357
  }
310
358
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"thread-runtime-client.js","names":["Unsubscribe","ThreadRuntimeEventType","CreateAppendMessage","ThreadRuntime","useMemo","useEffect","useCallback","RefObject","useResource","resource","withKey","liveRef","ClientOutput","useAssistantEmit","useClientLookup","useClientResource","ComposerClient","MessageClient","ThreadSuggestions","useSubscribable","ThreadState","useMessageClientById","t0","$","_c","runtime","id","threadIdRef","threadId","t1","getMessageById","messageRuntime","t2","MessageClientById","useThreadClient","runtimeState","emit","unsubscribers","threadEvents","event","unsubscribe","unstable_on","getState","push","unsub","t3","t4","event_0","emitThreadEvent","t5","text","suggestions","some","suggestion","prompt","isSuggestion","t6","composer","t7","t8","messages","t9","m","map","state","length","isLoading","t10","capabilities","extras","isDisabled","isRunning","speech","voice","isEmpty","t11","t12","methods","t13","t14","message","appended","content","type","role","text_0","_temp","join","chars","attachments","undefined","append","t15","cancelRun","t16","connectVoice","t17","selector","get","key","t18","t19","deleteMessage","disconnectVoice","export","getModelContext","getVoiceVolume","import","importExternalState","muteVoice","reset","resumeRun","startRun","stopSpeaking","subscribeVoiceVolume","unmuteVoice","__internal_getRuntime","ThreadClient","part"],"sources":["../../../src/store/runtime-clients/thread-runtime-client.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { ThreadRuntimeEventType } from \"../../runtime/interfaces/thread-runtime-core\";\nimport type {\n CreateAppendMessage,\n ThreadRuntime,\n} from \"../../runtime/api/thread-runtime\";\nimport { useMemo, useEffect, useCallback, type RefObject } from \"react\";\nimport { useResource, resource, withKey } from \"@assistant-ui/tap\";\nimport { liveRef } from \"./liveRef\";\nimport type { ClientOutput } from \"@assistant-ui/store\";\nimport {\n useAssistantEmit,\n useClientLookup,\n useClientResource,\n} from \"@assistant-ui/store/client\";\nimport { ComposerClient } from \"./composer-runtime-client\";\nimport { MessageClient } from \"./message-runtime-client\";\nimport { ThreadSuggestions } from \"../clients/suggestions\";\nimport { useSubscribable } from \"./useSubscribable\";\nimport type { ThreadState } from \"../scopes/thread\";\n\nconst useMessageClientById = ({\n runtime,\n id,\n threadIdRef,\n threadId,\n}: {\n runtime: ThreadRuntime;\n id: string;\n threadIdRef: RefObject<string>;\n threadId: string;\n}) => {\n const messageRuntime = useMemo(\n () => runtime.getMessageById(id),\n [runtime, id],\n );\n\n return useResource(\n MessageClient({ runtime: messageRuntime, threadIdRef, threadId }),\n );\n};\n\nconst MessageClientById = resource(useMessageClientById);\n\nconst useThreadClient = ({\n runtime,\n}: {\n runtime: ThreadRuntime;\n}): ClientOutput<\"thread\"> => {\n const runtimeState = useSubscribable(runtime);\n const emit = useAssistantEmit();\n\n useEffect(() => {\n const unsubscribers: Unsubscribe[] = [];\n\n const threadEvents: ThreadRuntimeEventType[] = [\n \"runStart\",\n \"runEnd\",\n \"initialize\",\n \"modelContextUpdate\",\n ];\n\n for (const event of threadEvents) {\n const unsubscribe = runtime.unstable_on(event, () => {\n const threadId = runtime.getState()?.threadId || \"unknown\";\n emit(`thread.${event}`, {\n threadId,\n });\n });\n unsubscribers.push(unsubscribe);\n }\n\n return () => {\n for (const unsub of unsubscribers) unsub();\n };\n }, [runtime, emit]);\n\n const threadIdRef = useMemo(\n () => liveRef(() => runtime.getState()!.threadId),\n [runtime],\n );\n const emitThreadEvent = (\n event: \"thread.cancelRun\" | \"thread.voiceStarted\",\n ) => {\n emit(event, { threadId: runtime.getState()!.threadId });\n };\n const isSuggestion = useCallback(\n (text: string) =>\n runtime\n .getState()!\n .suggestions.some((suggestion) => suggestion.prompt === text),\n [runtime],\n );\n\n const composer = useClientResource(\n ComposerClient({\n runtime: runtime.composer,\n threadIdRef,\n isSuggestion,\n }),\n );\n const suggestions = useClientResource(\n ThreadSuggestions(runtimeState.suggestions),\n );\n const messages = useClientLookup(\n runtimeState.messages.map((m) =>\n withKey(\n m.id,\n MessageClientById({\n runtime,\n id: m.id,\n threadIdRef,\n threadId: runtimeState.threadId,\n }),\n [runtime, m.id, threadIdRef, runtimeState.threadId],\n ),\n ),\n );\n\n const state = useMemo<ThreadState>(() => {\n return {\n isEmpty: messages.state.length === 0 && !runtimeState.isLoading,\n isDisabled: runtimeState.isDisabled,\n isLoading: runtimeState.isLoading,\n isRunning: runtimeState.isRunning,\n capabilities: runtimeState.capabilities,\n state: runtimeState.state,\n suggestions: runtimeState.suggestions,\n extras: runtimeState.extras,\n speech: runtimeState.speech,\n voice: runtimeState.voice,\n\n composer: composer.state,\n messages: messages.state,\n };\n }, [runtimeState, messages, composer.state]);\n\n return {\n getState: () => state,\n composer: () => composer.methods,\n suggestions: () => suggestions.methods,\n append: (message) => {\n const appended: Exclude<CreateAppendMessage, string> =\n typeof message === \"string\"\n ? { content: [{ type: \"text\", text: message }] }\n : message;\n if ((appended.role ?? \"user\") === \"user\") {\n const text = appended.content\n .map((part) => (part.type === \"text\" ? part.text : \"\"))\n .join(\"\");\n emit(\"composer.send\", {\n threadId: runtime.getState()!.threadId,\n chars: text.length,\n attachments: appended.attachments?.length ?? 0,\n ...(isSuggestion(text) ? { suggestion: true } : undefined),\n });\n }\n runtime.append(message);\n },\n deleteMessage: runtime.deleteMessage,\n startRun: runtime.startRun,\n resumeRun: runtime.resumeRun,\n importExternalState: runtime.importExternalState,\n cancelRun: () => {\n if (runtimeState.isRunning) emitThreadEvent(\"thread.cancelRun\");\n runtime.cancelRun();\n },\n getModelContext: runtime.getModelContext,\n export: runtime.export,\n import: runtime.import,\n reset: runtime.reset,\n stopSpeaking: runtime.stopSpeaking,\n connectVoice: () => {\n runtime.connectVoice();\n emitThreadEvent(\"thread.voiceStarted\");\n },\n disconnectVoice: runtime.disconnectVoice,\n getVoiceVolume: runtime.getVoiceVolume,\n subscribeVoiceVolume: runtime.subscribeVoiceVolume,\n muteVoice: runtime.muteVoice,\n unmuteVoice: runtime.unmuteVoice,\n message: (selector) => {\n if (\"id\" in selector) {\n return messages.get({ key: selector.id });\n } else {\n return messages.get(selector);\n }\n },\n __internal_getRuntime: () => runtime,\n };\n};\n\nexport const ThreadClient = resource(useThreadClient);\n"],"mappings":"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"}
1
+ {"version":3,"file":"thread-runtime-client.js","names":["Unsubscribe","ThreadRuntimeEventType","CreateAppendMessage","ThreadRuntime","useMemo","useEffect","useCallback","RefObject","useResource","resource","withKey","liveRef","ClientOutput","useAssistantEmit","useClientLookup","useClientResource","ComposerClient","MessageClient","ThreadSuggestions","createTaskDeriver","getTaskKey","TaskClient","useSubscribable","ThreadState","useMessageClientById","t0","$","_c","runtime","id","threadIdRef","threadId","t1","getMessageById","messageRuntime","t2","MessageClientById","useThreadClient","runtimeState","emit","unsubscribers","threadEvents","event","unsubscribe","unstable_on","getState","push","payload","threadId_0","unsub","t3","t4","event_0","emitThreadEvent","t5","text","suggestions","some","suggestion","prompt","isSuggestion","t6","composer","t7","t8","Symbol","for","taskDeriver","t9","messages","tasks","t10","map","_temp","taskClients","t11","t12","m","state","length","isLoading","t13","capabilities","extras","isDisabled","isRunning","speech","voice","isEmpty","t14","t15","methods","t16","t17","selector","task_0","find","candidate","get","key","task","t18","message","appended","content","type","role","text_0","_temp2","join","chars","attachments","undefined","append","t19","cancelRun","t20","connectVoice","t21","selector_0","t22","t23","deleteMessage","disconnectVoice","export","getModelContext","getVoiceVolume","import","importExternalState","muteVoice","reset","resumeRun","startRun","stopSpeaking","subscribeVoiceVolume","unmuteVoice","__internal_getRuntime","ThreadClient","part"],"sources":["../../../src/store/runtime-clients/thread-runtime-client.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { ThreadRuntimeEventType } from \"../../runtime/interfaces/thread-runtime-core\";\nimport type {\n CreateAppendMessage,\n ThreadRuntime,\n} from \"../../runtime/api/thread-runtime\";\nimport { useMemo, useEffect, useCallback, type RefObject } from \"react\";\nimport { useResource, resource, withKey } from \"@assistant-ui/tap\";\nimport { liveRef } from \"./liveRef\";\nimport type { ClientOutput } from \"@assistant-ui/store\";\nimport {\n useAssistantEmit,\n useClientLookup,\n useClientResource,\n} from \"@assistant-ui/store/client\";\nimport { ComposerClient } from \"./composer-runtime-client\";\nimport { MessageClient } from \"./message-runtime-client\";\nimport { ThreadSuggestions } from \"../clients/suggestions\";\nimport {\n createTaskDeriver,\n getTaskKey,\n TaskClient,\n} from \"../clients/thread-tasks\";\nimport { useSubscribable } from \"./useSubscribable\";\nimport type { ThreadState } from \"../scopes/thread\";\n\nconst useMessageClientById = ({\n runtime,\n id,\n threadIdRef,\n threadId,\n}: {\n runtime: ThreadRuntime;\n id: string;\n threadIdRef: RefObject<string>;\n threadId: string;\n}) => {\n const messageRuntime = useMemo(\n () => runtime.getMessageById(id),\n [runtime, id],\n );\n\n return useResource(\n MessageClient({ runtime: messageRuntime, threadIdRef, threadId }),\n );\n};\n\nconst MessageClientById = resource(useMessageClientById);\n\nconst useThreadClient = ({\n runtime,\n}: {\n runtime: ThreadRuntime;\n}): ClientOutput<\"thread\"> => {\n const runtimeState = useSubscribable(runtime);\n const emit = useAssistantEmit();\n\n useEffect(() => {\n const unsubscribers: Unsubscribe[] = [];\n\n const threadEvents: ThreadRuntimeEventType[] = [\n \"runStart\",\n \"runEnd\",\n \"initialize\",\n \"modelContextUpdate\",\n ];\n\n for (const event of threadEvents) {\n const unsubscribe = runtime.unstable_on(event, () => {\n const threadId = runtime.getState()?.threadId || \"unknown\";\n emit(`thread.${event}`, {\n threadId,\n });\n });\n unsubscribers.push(unsubscribe);\n }\n\n unsubscribers.push(\n runtime.unstable_on(\"toolApprovalAnswered\", (payload) => {\n const threadId = runtime.getState()?.threadId || \"unknown\";\n emit(\"thread.toolApprovalAnswered\", { threadId, ...payload });\n }),\n );\n\n return () => {\n for (const unsub of unsubscribers) unsub();\n };\n }, [runtime, emit]);\n\n const threadIdRef = useMemo(\n () => liveRef(() => runtime.getState()!.threadId),\n [runtime],\n );\n const emitThreadEvent = (\n event: \"thread.cancelRun\" | \"thread.voiceStarted\",\n ) => {\n emit(event, { threadId: runtime.getState()!.threadId });\n };\n const isSuggestion = useCallback(\n (text: string) =>\n runtime\n .getState()!\n .suggestions.some((suggestion) => suggestion.prompt === text),\n [runtime],\n );\n\n const composer = useClientResource(\n ComposerClient({\n runtime: runtime.composer,\n threadIdRef,\n isSuggestion,\n }),\n );\n const suggestions = useClientResource(\n ThreadSuggestions(runtimeState.suggestions),\n );\n const taskDeriver = useMemo(() => createTaskDeriver(), []);\n const tasks = useMemo(\n () => taskDeriver(runtimeState.messages),\n [taskDeriver, runtimeState.messages],\n );\n const taskClients = useClientLookup(\n tasks.map((task) =>\n withKey(getTaskKey(task), TaskClient({ task }), [task]),\n ),\n );\n const messages = useClientLookup(\n runtimeState.messages.map((m) =>\n withKey(\n m.id,\n MessageClientById({\n runtime,\n id: m.id,\n threadIdRef,\n threadId: runtimeState.threadId,\n }),\n [runtime, m.id, threadIdRef, runtimeState.threadId],\n ),\n ),\n );\n\n const state = useMemo<ThreadState>(() => {\n return {\n isEmpty: messages.state.length === 0 && !runtimeState.isLoading,\n isDisabled: runtimeState.isDisabled,\n isLoading: runtimeState.isLoading,\n isRunning: runtimeState.isRunning,\n capabilities: runtimeState.capabilities,\n state: runtimeState.state,\n suggestions: runtimeState.suggestions,\n extras: runtimeState.extras,\n speech: runtimeState.speech,\n voice: runtimeState.voice,\n\n composer: composer.state,\n messages: messages.state,\n tasks,\n };\n }, [runtimeState, messages, composer.state, tasks]);\n\n return {\n getState: () => state,\n composer: () => composer.methods,\n suggestions: () => suggestions.methods,\n task: (selector) => {\n if (\"id\" in selector) {\n const task = tasks.find((candidate) => candidate.id === selector.id);\n return taskClients.get({ key: task ? getTaskKey(task) : selector.id });\n }\n return taskClients.get(selector);\n },\n append: (message) => {\n const appended: Exclude<CreateAppendMessage, string> =\n typeof message === \"string\"\n ? { content: [{ type: \"text\", text: message }] }\n : message;\n if ((appended.role ?? \"user\") === \"user\") {\n const text = appended.content\n .map((part) => (part.type === \"text\" ? part.text : \"\"))\n .join(\"\");\n emit(\"composer.send\", {\n threadId: runtime.getState()!.threadId,\n chars: text.length,\n attachments: appended.attachments?.length ?? 0,\n ...(isSuggestion(text) ? { suggestion: true } : undefined),\n });\n }\n runtime.append(message);\n },\n deleteMessage: runtime.deleteMessage,\n startRun: runtime.startRun,\n resumeRun: runtime.resumeRun,\n importExternalState: runtime.importExternalState,\n cancelRun: () => {\n if (runtimeState.isRunning) emitThreadEvent(\"thread.cancelRun\");\n runtime.cancelRun();\n },\n getModelContext: runtime.getModelContext,\n export: runtime.export,\n import: runtime.import,\n reset: runtime.reset,\n stopSpeaking: runtime.stopSpeaking,\n connectVoice: () => {\n runtime.connectVoice();\n emitThreadEvent(\"thread.voiceStarted\");\n },\n disconnectVoice: runtime.disconnectVoice,\n getVoiceVolume: runtime.getVoiceVolume,\n subscribeVoiceVolume: runtime.subscribeVoiceVolume,\n muteVoice: runtime.muteVoice,\n unmuteVoice: runtime.unmuteVoice,\n message: (selector) => {\n if (\"id\" in selector) {\n return messages.get({ key: selector.id });\n } else {\n return messages.get(selector);\n }\n },\n __internal_getRuntime: () => runtime,\n };\n};\n\nexport const ThreadClient = resource(useThreadClient);\n"],"mappings":"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"}
@@ -6,6 +6,7 @@ import { PartClientSchema } from "./scopes/part.js";
6
6
  import { MessageClientSchema } from "./scopes/message.js";
7
7
  import { SuggestionClientSchema } from "./scopes/suggestion.js";
8
8
  import { SuggestionsClientSchema } from "./scopes/suggestions.js";
9
+ import { TaskClientSchema } from "./scopes/task.js";
9
10
  import { ThreadClientSchema } from "./scopes/thread.js";
10
11
  import { ThreadsClientSchema } from "./scopes/threads.js";
11
12
  import { ModelContextClientSchema } from "./scopes/model-context.js";
@@ -25,6 +26,7 @@ declare module "@assistant-ui/store" {
25
26
  suggestion: SuggestionClientSchema;
26
27
  chainOfThought: ChainOfThoughtClientSchema;
27
28
  queueItem: QueueItemClientSchema;
29
+ task: TaskClientSchema;
28
30
  }
29
31
  }
30
32
  //# sourceMappingURL=scope-registration.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scope-registration.d.ts","names":[],"sources":["../../src/store/scope-registration.ts"],"mappings":";;;;;;;;;;;;;;YAcY;IACR,SAAS;IACT,gBAAgB;IAChB,QAAQ;IACR,SAAS;IACT,MAAM;IACN,UAAU;IACV,YAAY;IACZ,cAAc;IACd,aAAa;IACb,YAAY;IACZ,gBAAgB;IAChB,WAAW"}
1
+ {"version":3,"file":"scope-registration.d.ts","names":[],"sources":["../../src/store/scope-registration.ts"],"mappings":";;;;;;;;;;;;;;;YAeY;IACR,SAAS;IACT,gBAAgB;IAChB,QAAQ;IACR,SAAS;IACT,MAAM;IACN,UAAU;IACV,YAAY;IACZ,cAAc;IACd,aAAa;IACb,YAAY;IACZ,gBAAgB;IAChB,WAAW;IACX,MAAM"}
@@ -0,0 +1,36 @@
1
+ import { ThreadMessage, ToolCallMessagePart, ToolCallMessagePartStatus } from "../../types/message.js";
2
+ //#region src/store/scopes/task.d.ts
3
+ /** A tool call that carries a nested conversation, read as one unit of child work; `id` is its toolCallId. */
4
+ type TaskState = {
5
+ readonly id: string;
6
+ readonly toolName: string;
7
+ readonly args: ToolCallMessagePart["args"];
8
+ readonly result?: ToolCallMessagePart["result"];
9
+ readonly isError?: boolean;
10
+ readonly status: ToolCallMessagePartStatus;
11
+ readonly timing?: ToolCallMessagePart["timing"];
12
+ readonly messageId: string;
13
+ readonly parentTaskId: string | null;
14
+ readonly depth: number;
15
+ readonly messages: readonly ThreadMessage[];
16
+ };
17
+ type TaskMethods = {
18
+ getState(): TaskState;
19
+ };
20
+ type TaskMeta = {
21
+ source: "thread";
22
+ query: {
23
+ type: "index";
24
+ index: number;
25
+ } | {
26
+ type: "id";
27
+ id: string;
28
+ };
29
+ };
30
+ type TaskClientSchema = {
31
+ methods: TaskMethods;
32
+ meta: TaskMeta;
33
+ };
34
+ //#endregion
35
+ export { TaskClientSchema, TaskMeta, TaskMethods, TaskState };
36
+ //# sourceMappingURL=task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.d.ts","names":[],"sources":["../../../src/store/scopes/task.ts"],"mappings":";;;KAOY;WACD;WACA;WACA,MAAM;WACN,SAAS;WACT;WACA,QAAQ;WACR,SAAS;WACT;WACA;WACA;WACA,mBAAmB;;KAGlB;EACV,YAAY;;KAGF;EACV;EACA;IAAS;IAAe;;IAAoB;IAAY;;;KAG9C;EACV,SAAS;EACT,MAAM"}
File without changes
@@ -6,6 +6,7 @@ import { RuntimeCapabilities, SpeechState, ThreadSuggestion, VoiceSessionState }
6
6
  import { ComposerMethods, ComposerState } from "./composer.js";
7
7
  import { MessageMethods, MessageState } from "./message.js";
8
8
  import { SuggestionsMethods } from "./suggestions.js";
9
+ import { TaskMethods, TaskState } from "./task.js";
9
10
  import { CreateAppendMessage, CreateResumeRunConfig, CreateStartRunConfig, ThreadRuntime } from "../../runtime/api/thread-runtime.js";
10
11
  import { ReadonlyJSONValue } from "assistant-stream/utils";
11
12
  //#region src/store/scopes/thread.d.ts
@@ -34,6 +35,10 @@ type ThreadState = {
34
35
  * The messages in the currently selected branch of the thread.
35
36
  */
36
37
  readonly messages: readonly MessageState[];
38
+ /**
39
+ * Child work derived from the thread's tool calls: every tool call that carries a nested conversation, in document order with nested tasks after their parent. The array keeps its identity while no task changed.
40
+ */
41
+ readonly tasks: readonly TaskState[];
37
42
  /**
38
43
  * The thread state.
39
44
  * @deprecated This feature is experimental
@@ -65,6 +70,14 @@ type ThreadMethods = {
65
70
  * The suggestions shown for this thread.
66
71
  */
67
72
  suggestions(): SuggestionsMethods;
73
+ /**
74
+ * Access a task by index or toolCallId; an id resolves the first task with that toolCallId in document order.
75
+ */
76
+ task(selector: {
77
+ index: number;
78
+ } | {
79
+ id: string;
80
+ }): TaskMethods;
68
81
  /**
69
82
  * Append a new message to the thread.
70
83
  *
@@ -137,6 +150,13 @@ type ThreadMeta = {
137
150
  };
138
151
  };
139
152
  type ThreadEvents = {
153
+ "thread.toolApprovalAnswered": {
154
+ threadId: string;
155
+ messageId: string;
156
+ toolCallId: string;
157
+ toolName: string;
158
+ approved: boolean;
159
+ };
140
160
  /**
141
161
  * A run started on this thread. Also observable as `isRunning` flipping to
142
162
  * `true` in thread state.
@@ -1 +1 @@
1
- {"version":3,"file":"thread.d.ts","names":[],"sources":["../../../src/store/scopes/thread.ts"],"mappings":";;;;;;;;;;;KAqBY;;;;WAID;;;;WAIA;;;;WAIA;;;;WAIA;;;;WAIA,cAAc;;;;WAId,mBAAmB;;;;;WAKnB,OAAO;;;;WAIP,sBAAsB;;;;WAItB;;WAEA,QAAQ;WACR,OAAO;WACP,UAAU;;KAGT;;;;EAIV,YAAY;;;;EAIZ,YAAY;;;;EAIZ,eAAe;;;;;;;;;;;;;;;;;EAiBf,OAAO,SAAS;EAChB,cAAc,2BAA2B;;;;;EAKzC,SAAS,QAAQ;;;;;EAKjB,UAAU,QAAQ;EAClB;;;;;;;;;;;;EAYA,2BAA2B;EAC3B,mBAAmB;EACnB,UAAU;EACV,OAAO,YAAY;;;;;EAKnB,MAAM,2BAA2B;EACjC,oBAAoB;EACpB,QAAQ;IAAY;;IAAiB;MAAkB;;EAEvD;EACA;EACA;EACA;EACA,qBAAqB,uBAAuB;EAC5C;EACA;EACA,0BAA0B;;KAGhB;EACV;EACA;IAAS;;;KAGC;;;;;EAKV;IAAqB;;;;;;;EAMrB;IAAmB;;;EAEnB;IAAsB;;;EAEtB;IAAyB;;;;;;;EAMzB;IAAuB;;;;;;EAKvB;IAA+B;;;KAGrB;EACV,SAAS;EACT,MAAM;EACN,QAAQ"}
1
+ {"version":3,"file":"thread.d.ts","names":[],"sources":["../../../src/store/scopes/thread.ts"],"mappings":";;;;;;;;;;;;KAsBY;;;;WAID;;;;WAIA;;;;WAIA;;;;WAIA;;;;WAIA,cAAc;;;;WAId,mBAAmB;;;;WAInB,gBAAgB;;;;;WAKhB,OAAO;;;;WAIP,sBAAsB;;;;WAItB;;WAEA,QAAQ;WACR,OAAO;WACP,UAAU;;KAGT;;;;EAIV,YAAY;;;;EAIZ,YAAY;;;;EAIZ,eAAe;;;;EAIf,KAAK;IAAY;;IAAoB;MAAe;;;;;;;;;;;;;;;;;EAiBpD,OAAO,SAAS;EAChB,cAAc,2BAA2B;;;;;EAKzC,SAAS,QAAQ;;;;;EAKjB,UAAU,QAAQ;EAClB;;;;;;;;;;;;EAYA,2BAA2B;EAC3B,mBAAmB;EACnB,UAAU;EACV,OAAO,YAAY;;;;;EAKnB,MAAM,2BAA2B;EACjC,oBAAoB;EACpB,QAAQ;IAAY;;IAAiB;MAAkB;;EAEvD;EACA;EACA;EACA;EACA,qBAAqB,uBAAuB;EAC5C;EACA;EACA,0BAA0B;;KAGhB;EACV;EACA;IAAS;;;KAGC;EACV;IACE;IACA;IACA;IACA;IACA;;;;;;EAMF;IAAqB;;;;;;;EAMrB;IAAmB;;;EAEnB;IAAsB;;;EAEtB;IAAyB;;;;;;;EAMzB;IAAuB;;;;;;EAKvB;IAA+B;;;KAGrB;EACV,SAAS;EACT,MAAM;EACN,QAAQ"}