@assistant-ui/core 0.2.5 → 0.2.7

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 (140) hide show
  1. package/dist/index.d.ts +4 -2
  2. package/dist/index.js +6 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/internal/duplicate-detection.d.ts +5 -0
  5. package/dist/internal/duplicate-detection.d.ts.map +1 -0
  6. package/dist/internal/duplicate-detection.js +11 -0
  7. package/dist/internal/duplicate-detection.js.map +1 -0
  8. package/dist/react/AssistantProvider.d.ts.map +1 -1
  9. package/dist/react/AssistantProvider.js.map +1 -1
  10. package/dist/react/index.d.ts +3 -2
  11. package/dist/react/index.js +2 -2
  12. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js.map +1 -1
  13. package/dist/react/primitives/message/MessageGroupedParts.d.ts +25 -21
  14. package/dist/react/primitives/message/MessageGroupedParts.d.ts.map +1 -1
  15. package/dist/react/primitives/message/MessageGroupedParts.js +6 -7
  16. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  17. package/dist/react/primitives/message/MessageParts.d.ts +2 -1
  18. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  19. package/dist/react/primitives/message/MessageParts.js +9 -4
  20. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  21. package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
  22. package/dist/react/providers/TextMessagePartProvider.js +3 -0
  23. package/dist/react/providers/TextMessagePartProvider.js.map +1 -1
  24. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +3 -1
  25. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  26. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +3 -1
  27. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  28. package/dist/react/runtimes/external-message-converter.d.ts +1 -1
  29. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  30. package/dist/react/runtimes/external-message-converter.js +7 -3
  31. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  32. package/dist/react/types/MessagePartComponentTypes.d.ts +8 -0
  33. package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
  34. package/dist/react/utils/groupParts.d.ts +40 -12
  35. package/dist/react/utils/groupParts.d.ts.map +1 -1
  36. package/dist/react/utils/groupParts.js +51 -9
  37. package/dist/react/utils/groupParts.js.map +1 -1
  38. package/dist/runtime/api/attachment-runtime.d.ts.map +1 -1
  39. package/dist/runtime/api/attachment-runtime.js.map +1 -1
  40. package/dist/runtime/api/message-part-runtime.d.ts +8 -0
  41. package/dist/runtime/api/message-part-runtime.d.ts.map +1 -1
  42. package/dist/runtime/api/message-part-runtime.js +13 -0
  43. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  44. package/dist/runtime/api/thread-runtime.d.ts +2 -1
  45. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  46. package/dist/runtime/base/base-thread-runtime-core.d.ts +2 -1
  47. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  48. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  49. package/dist/runtime/interfaces/thread-runtime-core.d.ts +15 -1
  50. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  51. package/dist/runtime/utils/thread-message-like.d.ts +10 -0
  52. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  53. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  54. package/dist/runtimes/external-store/external-store-adapter.d.ts +33 -1
  55. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  56. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  57. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  58. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +27 -1
  59. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  60. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +98 -3
  61. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  62. package/dist/runtimes/local/local-thread-runtime-core.d.ts +2 -1
  63. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  64. package/dist/runtimes/local/local-thread-runtime-core.js +3 -0
  65. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  66. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +1 -0
  67. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  68. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +3 -0
  69. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  70. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
  71. package/dist/runtimes/remote-thread-list/empty-thread-core.js +3 -0
  72. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  73. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +168 -0
  74. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -0
  75. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +449 -0
  76. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -0
  77. package/dist/store/clients/thread-message-client.d.ts.map +1 -1
  78. package/dist/store/clients/thread-message-client.js +3 -0
  79. package/dist/store/clients/thread-message-client.js.map +1 -1
  80. package/dist/store/runtime-clients/message-part-runtime-client.js +1 -0
  81. package/dist/store/runtime-clients/message-part-runtime-client.js.map +1 -1
  82. package/dist/store/scopes/part.d.ts +7 -0
  83. package/dist/store/scopes/part.d.ts.map +1 -1
  84. package/dist/subscribable/subscribable.d.ts.map +1 -1
  85. package/dist/subscribable/subscribable.js.map +1 -1
  86. package/dist/types/message.d.ts +6 -0
  87. package/dist/types/message.d.ts.map +1 -1
  88. package/dist/types/message.js.map +1 -1
  89. package/package.json +4 -4
  90. package/src/adapters/index.ts +1 -4
  91. package/src/index.ts +11 -0
  92. package/src/internal/duplicate-detection.ts +26 -0
  93. package/src/react/AssistantProvider.tsx +2 -3
  94. package/src/react/index.ts +2 -6
  95. package/src/react/primitives/chainOfThought/ChainOfThoughtParts.tsx +1 -2
  96. package/src/react/primitives/message/MessageAttachments.test.tsx +1 -1
  97. package/src/react/primitives/message/MessageGroupedParts.tsx +38 -31
  98. package/src/react/primitives/message/MessageParts.tsx +14 -1
  99. package/src/react/providers/TextMessagePartProvider.tsx +3 -0
  100. package/src/react/runtimes/external-message-converter.ts +26 -13
  101. package/src/react/types/MessagePartComponentTypes.ts +8 -0
  102. package/src/react/utils/groupParts.ts +67 -22
  103. package/src/runtime/api/attachment-runtime.ts +1 -2
  104. package/src/runtime/api/message-part-runtime.ts +26 -0
  105. package/src/runtime/base/base-thread-runtime-core.ts +4 -0
  106. package/src/runtime/interfaces/thread-runtime-core.ts +15 -0
  107. package/src/runtime/internal.ts +1 -4
  108. package/src/runtime/utils/thread-message-like.ts +7 -0
  109. package/src/runtimes/external-store/external-store-adapter.ts +37 -0
  110. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +1 -3
  111. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +168 -4
  112. package/src/runtimes/local/local-thread-runtime-core.ts +5 -0
  113. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +4 -0
  114. package/src/runtimes/remote-thread-list/empty-thread-core.ts +4 -0
  115. package/src/runtimes/tool-invocations/EDGE_CASES.md +194 -0
  116. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +1054 -0
  117. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +783 -0
  118. package/src/store/clients/thread-message-client.ts +3 -0
  119. package/src/store/runtime-clients/message-part-runtime-client.ts +2 -0
  120. package/src/store/scopes/part.ts +4 -0
  121. package/src/subscribable/subscribable.ts +3 -3
  122. package/src/tests/OptimisticState-delete-crash.test.ts +2 -0
  123. package/src/tests/OptimisticState-list-race.test.ts +2 -0
  124. package/src/tests/RemoteThreadListThreadListRuntimeCore-loadMore.test.ts +5 -5
  125. package/src/tests/auiV0Encode.test.ts +1 -1
  126. package/src/tests/composer-can-send.test.ts +8 -4
  127. package/src/tests/duplicate-detection.test.ts +34 -0
  128. package/src/tests/external-store-thread-list-runtime-core.test.ts +1 -1
  129. package/src/tests/external-store-thread-runtime-core.test.ts +7 -6
  130. package/src/tests/groupParts.test.ts +118 -32
  131. package/src/tests/no-unsafe-process-env.test.ts +1 -0
  132. package/src/tests/remote-thread-list-isLoading.test.ts +2 -0
  133. package/src/tests/thread-message-like.test.ts +4 -1
  134. package/src/types/index.ts +1 -4
  135. package/src/types/message.ts +7 -0
  136. package/dist/react/runtimes/useToolInvocations.d.ts +0 -53
  137. package/dist/react/runtimes/useToolInvocations.d.ts.map +0 -1
  138. package/dist/react/runtimes/useToolInvocations.js +0 -380
  139. package/dist/react/runtimes/useToolInvocations.js.map +0 -1
  140. package/src/react/runtimes/useToolInvocations.ts +0 -694
@@ -5,7 +5,8 @@ import { DictationAdapter, SpeechSynthesisAdapter } from "../../adapters/speech.
5
5
  import { RealtimeVoiceAdapter } from "../../adapters/voice.js";
6
6
  import { ThreadMessageLike } from "../../runtime/utils/thread-message-like.js";
7
7
  import { ExportedMessageRepository } from "../../runtime/utils/message-repository.js";
8
- import { AddToolResultOptions, ResumeRunConfig, StartRunConfig, ThreadSuggestion } from "../../runtime/interfaces/thread-runtime-core.js";
8
+ import { AddToolResultOptions, RespondToToolApprovalOptions, ResumeRunConfig, StartRunConfig, ThreadSuggestion } from "../../runtime/interfaces/thread-runtime-core.js";
9
+ import { ToolExecutionStatus } from "../tool-invocations/ToolInvocationTracker.js";
9
10
  import { ReadonlyJSONValue } from "assistant-stream/utils";
10
11
 
11
12
  //#region src/runtimes/external-store/external-store-adapter.d.ts
@@ -87,6 +88,7 @@ type ExternalStoreAdapterBase<T> = {
87
88
  toolCallId: string;
88
89
  payload: unknown;
89
90
  }) => void) | undefined;
91
+ onRespondToToolApproval?: ((options: RespondToToolApprovalOptions) => Promise<void> | void) | undefined;
90
92
  convertMessage?: ExternalStoreMessageConverter<T> | undefined;
91
93
  adapters?: {
92
94
  attachments?: AttachmentAdapter | undefined;
@@ -102,6 +104,36 @@ type ExternalStoreAdapterBase<T> = {
102
104
  unstable_capabilities?: {
103
105
  copy?: boolean | undefined;
104
106
  } | undefined;
107
+ /**
108
+ * Opt in to the built-in client-side tool-invocations pipeline
109
+ * (`streamCall` / `execute` / tool-status tracking) for this thread.
110
+ *
111
+ * Defaults to `false` — the runtime does *not* drive client-side tool
112
+ * callbacks on its own. Set to `true` to have the runtime construct a
113
+ * `ToolInvocationTracker` and feed every snapshot through it, so tool
114
+ * callbacks fire automatically for tool-call parts in `messages`.
115
+ *
116
+ * Opt-in by default because most external-store runtimes either run
117
+ * tools entirely server-side, or already wire their own client-side
118
+ * dispatch path. Enabling the embedded tracker on top of an existing
119
+ * dispatch path would cause tool callbacks to run twice.
120
+ *
121
+ * When enabled, client-side tool results (from `execute()` returning,
122
+ * or from `streamCall` resolving) flow back through
123
+ * `adapter.onAddToolResult` like any other tool result, with
124
+ * `modelContent` populated when present.
125
+ */
126
+ unstable_enableToolInvocations?: boolean | undefined;
127
+ /**
128
+ * Receives the current per-tool-call execution status map whenever it
129
+ * changes. Only invoked when `unstable_enableToolInvocations` is `true`
130
+ * — the runtime maintains the map via the embedded tracker.
131
+ *
132
+ * Wire this into local React state and feed it into the converter's
133
+ * `metadata.toolStatuses` so the UI can render `executing` spinners
134
+ * and human-input prompts.
135
+ */
136
+ setToolStatuses?: ((statuses: Record<string, ToolExecutionStatus>) => void) | undefined;
105
137
  };
106
138
  type ExternalStoreAdapter<T = ThreadMessage> = ExternalStoreAdapterBase<T> & (T extends ThreadMessage ? object : ExternalStoreMessageConverterAdapter<T>);
107
139
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"external-store-adapter.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-adapter.ts"],"mappings":";;;;;;;;;;;KAkBY,uBAAA;EACV,MAAA,EAAQ,MAAM;EACd,EAAA;EACA,QAAA;EACA,UAAA;EACA,KAAA;AAAA;AAAA,KAGU,8BAAA;EAPF;;;EAWR,QAAA;EACA,SAAA;EACA,OAAA,YAAmB,uBAAA;EACnB,eAAA,YAA2B,uBAAA;EAPjB;;;EAWV,mBAAA,UAA6B,OAAA;EAJF;;;EAQ3B,gBAAA,KAAqB,QAAA,aAAqB,OAAA;EAC1C,QAAA,IACE,QAAA,UACA,QAAA,cACI,OAAA;EACN,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;EA3BwB;;;;;;EAkC3B,UAAA;EAxBE;;;;;;;;EAiCF,cAAA;EA5BA;;;;AAAyC;AAG3C;;;EAkCE,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;EACnC,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,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;IApBkB;;;IAwB7B,UAAA,GAAa,8BAAA;EAAA;EAGnB,qBAAA;IAEM,IAAA;EAAA;AAAA;AAAA,KAKI,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":";;;;;;;;;;;;KAoBY,uBAAA;EACV,MAAA,EAAQ,MAAM;EACd,EAAA;EACA,QAAA;EACA,UAAA;EACA,KAAA;AAAA;AAAA,KAGU,8BAAA;EAPF;;;EAWR,QAAA;EACA,SAAA;EACA,OAAA,YAAmB,uBAAA;EACnB,eAAA,YAA2B,uBAAA;EAPjB;;;EAWV,mBAAA,UAA6B,OAAA;EAJF;;;EAQ3B,gBAAA,KAAqB,QAAA,aAAqB,OAAA;EAC1C,QAAA,IACE,QAAA,UACA,QAAA,cACI,OAAA;EACN,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;EA3BwB;;;;;;EAkC3B,UAAA;EAxBE;;;;;;;;EAiCF,cAAA;EA5BA;;;;AAAyC;AAG3C;;;EAkCE,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;EACnC,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;IAtBG;;;IA0Bd,UAAA,GAAa,8BAAA;EAAA;EAGnB,qBAAA;IAEM,IAAA;EAAA;EAxBkC;;;;;;;;;;;;;;;;;;;EA8CxC,8BAAA;EAhEA;;;;;;;;;EA0EA,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 +1 @@
1
- {"version":3,"file":"external-store-thread-list-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-list-runtime-core.ts"],"mappings":";;;;;;KAQY,0BAAA,SAAmC,8BAA8B;AAAA,cAgBhE,kCAAA,YACA,qBAAA;EAAA,QAyCD,aAAA;EAAA,QAvCF,aAAA;EAAA,QACA,QAAA;EAAA,QACA,gBAAA;EAAA,QACA,WAAA;EAAA,QAEA,OAAA;EAAA,IAEG,SAAA,CAAA;EAAA,IAIA,WAAA,CAAA;EAAA,IAIA,SAAA,CAAA;EAAA,IAIA,iBAAA,CAAA;EAAA,IAIA,WAAA,CAAA,GAAW,QAAA,CAAA,MAAA,SAAA,uBAAA;EAIf,qBAAA,CAAA,GAAqB,OAAA;EAAA,QAIpB,WAAA;EAAA,IAEG,YAAA,CAAA;cAKT,OAAA,EAAS,8BAAA,cACD,aAAA,EAAe,0BAAA;EAKlB,wBAAA,CAAA,GAAwB,8BAAA;EAIxB,oBAAA,CAAA;EAIA,WAAA,CAAY,QAAA,WAAgB,uBAAA;EAI5B,qBAAA,CACL,OAAA,EAAS,8BAAA,EACT,WAAA;EAqFW,cAAA,CACX,QAAA,UACA,QAAA;IAAa,SAAA;EAAA,IACZ,OAAA;EAUU,iBAAA,CAAA,GAAqB,OAAA;EAUrB,MAAA,CAAO,QAAA,UAAkB,QAAA,WAAmB,OAAA;EAQ5C,MAAA,CAAA,GAAU,OAAA;EAIV,OAAA,CAAQ,QAAA,WAAmB,OAAA;EAQ3B,SAAA,CAAU,QAAA,WAAmB,OAAA;EAQ7B,MAAA,CAAO,QAAA,WAAmB,OAAA;EAQhC,UAAA,CACL,QAAA,WACC,OAAA;IAAU,QAAA;IAAkB,UAAA;EAAA;EAIxB,aAAA,CAAA;EAAA,QAIC,cAAA;EAED,SAAA,CAAU,QAAA,eAAuB,WAAA;EAAA,QAKhC,kBAAA;AAAA"}
1
+ {"version":3,"file":"external-store-thread-list-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-list-runtime-core.ts"],"mappings":";;;;;;KAQY,0BAAA,SAAmC,8BAA8B;AAAA,cAgBhE,kCAAA,YAA8C,qBAAA;EAAA,QAwC/C,aAAA;EAAA,QAvCF,aAAA;EAAA,QACA,QAAA;EAAA,QACA,gBAAA;EAAA,QACA,WAAA;EAAA,QAEA,OAAA;EAAA,IAEG,SAAA,CAAA;EAAA,IAIA,WAAA,CAAA;EAAA,IAIA,SAAA,CAAA;EAAA,IAIA,iBAAA,CAAA;EAAA,IAIA,WAAA,CAAA,GAAW,QAAA,CAAA,MAAA,SAAA,uBAAA;EAIf,qBAAA,CAAA,GAAqB,OAAA;EAAA,QAIpB,WAAA;EAAA,IAEG,YAAA,CAAA;cAKT,OAAA,EAAS,8BAAA,cACD,aAAA,EAAe,0BAAA;EAKlB,wBAAA,CAAA,GAAwB,8BAAA;EAIxB,oBAAA,CAAA;EAIA,WAAA,CAAY,QAAA,WAAgB,uBAAA;EAI5B,qBAAA,CACL,OAAA,EAAS,8BAAA,EACT,WAAA;EAqFW,cAAA,CACX,QAAA,UACA,QAAA;IAAa,SAAA;EAAA,IACZ,OAAA;EAUU,iBAAA,CAAA,GAAqB,OAAA;EAUrB,MAAA,CAAO,QAAA,UAAkB,QAAA,WAAmB,OAAA;EAQ5C,MAAA,CAAA,GAAU,OAAA;EAIV,OAAA,CAAQ,QAAA,WAAmB,OAAA;EAQ3B,SAAA,CAAU,QAAA,WAAmB,OAAA;EAQ7B,MAAA,CAAO,QAAA,WAAmB,OAAA;EAQhC,UAAA,CACL,QAAA,WACC,OAAA;IAAU,QAAA;IAAkB,UAAA;EAAA;EAIxB,aAAA,CAAA;EAAA,QAIC,cAAA;EAED,SAAA,CAAU,QAAA,eAAuB,WAAA;EAAA,QAKhC,kBAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"external-store-thread-list-runtime-core.js","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-list-runtime-core.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { ExternalStoreThreadRuntimeCore } from \"./external-store-thread-runtime-core\";\nimport type {\n ThreadListItemCoreState,\n ThreadListRuntimeCore,\n} from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport type { ExternalStoreThreadListAdapter } from \"./external-store-adapter\";\n\nexport type ExternalStoreThreadFactory = () => ExternalStoreThreadRuntimeCore;\n\nconst EMPTY_ARRAY = Object.freeze([]);\nconst DEFAULT_THREAD_ID = \"DEFAULT_THREAD_ID\";\nconst DEFAULT_THREADS = Object.freeze([DEFAULT_THREAD_ID]);\nconst DEFAULT_THREAD = Object.freeze({\n id: DEFAULT_THREAD_ID,\n remoteId: undefined,\n externalId: undefined,\n status: \"regular\",\n});\nconst RESOLVED_PROMISE = Promise.resolve();\nconst DEFAULT_THREAD_DATA = Object.freeze({\n [DEFAULT_THREAD_ID]: DEFAULT_THREAD,\n});\n\nexport class ExternalStoreThreadListRuntimeCore\n implements ThreadListRuntimeCore\n{\n private _mainThreadId: string = DEFAULT_THREAD_ID;\n private _threads: readonly string[] = DEFAULT_THREADS;\n private _archivedThreads: readonly string[] = EMPTY_ARRAY;\n private _threadData: Readonly<Record<string, ThreadListItemCoreState>> =\n DEFAULT_THREAD_DATA;\n private adapter: ExternalStoreThreadListAdapter = {};\n\n public get isLoading() {\n return this.adapter.isLoading ?? false;\n }\n\n public get newThreadId() {\n return undefined;\n }\n\n public get threadIds() {\n return this._threads;\n }\n\n public get archivedThreadIds() {\n return this._archivedThreads;\n }\n\n public get threadItems() {\n return this._threadData;\n }\n\n public getLoadThreadsPromise() {\n return RESOLVED_PROMISE;\n }\n\n private _mainThread!: ExternalStoreThreadRuntimeCore;\n\n public get mainThreadId() {\n return this._mainThreadId;\n }\n\n constructor(\n adapter: ExternalStoreThreadListAdapter = {},\n private threadFactory: ExternalStoreThreadFactory,\n ) {\n this.__internal_setAdapter(adapter, true);\n }\n\n public getMainThreadRuntimeCore() {\n return this._mainThread;\n }\n\n public getThreadRuntimeCore(): never {\n throw new Error(\"Method not implemented.\");\n }\n\n public getItemById(threadId: string) {\n return this._threadData[threadId];\n }\n\n public __internal_setAdapter(\n adapter: ExternalStoreThreadListAdapter,\n initialLoad = false,\n ) {\n const previousAdapter = this.adapter;\n this.adapter = adapter;\n\n const newThreadId = adapter.threadId ?? DEFAULT_THREAD_ID;\n const newThreads = adapter.threads ?? EMPTY_ARRAY;\n const newArchivedThreads = adapter.archivedThreads ?? EMPTY_ARRAY;\n\n const previousThreadId = previousAdapter.threadId ?? DEFAULT_THREAD_ID;\n const previousThreads = previousAdapter.threads ?? EMPTY_ARRAY;\n const previousArchivedThreads =\n previousAdapter.archivedThreads ?? EMPTY_ARRAY;\n\n if (\n !initialLoad &&\n previousThreadId === newThreadId &&\n previousThreads === newThreads &&\n previousArchivedThreads === newArchivedThreads\n ) {\n return;\n }\n\n if (\n previousThreads !== newThreads ||\n previousArchivedThreads !== newArchivedThreads ||\n previousThreadId !== newThreadId\n ) {\n this._threadData = {\n ...DEFAULT_THREAD_DATA,\n ...Object.fromEntries(\n adapter.threads?.map((t) => [\n t.id,\n {\n ...t,\n remoteId: t.remoteId,\n externalId: t.externalId,\n status: \"regular\",\n },\n ]) ?? [],\n ),\n ...Object.fromEntries(\n adapter.archivedThreads?.map((t) => [\n t.id,\n {\n ...t,\n remoteId: t.remoteId,\n externalId: t.externalId,\n status: \"archived\",\n },\n ]) ?? [],\n ),\n };\n }\n\n if (previousThreads !== newThreads) {\n this._threads = this.adapter.threads?.map((t) => t.id) ?? EMPTY_ARRAY;\n }\n\n if (previousArchivedThreads !== newArchivedThreads) {\n this._archivedThreads =\n this.adapter.archivedThreads?.map((t) => t.id) ?? EMPTY_ARRAY;\n }\n\n // `initialLoad ||`: `_mainThread!` must be assigned on construction.\n if (initialLoad || previousThreadId !== newThreadId) {\n this._mainThreadId = newThreadId;\n this._mainThread = this.threadFactory();\n }\n\n if (!this._threadData[this._mainThreadId]) {\n this._threadData = {\n ...this._threadData,\n [this._mainThreadId]: {\n id: this._mainThreadId,\n remoteId: undefined,\n externalId: undefined,\n status: \"regular\",\n },\n };\n }\n\n this._notifySubscribers();\n }\n\n public async switchToThread(\n threadId: string,\n _options?: { unarchive?: boolean },\n ): Promise<void> {\n if (this._mainThreadId === threadId) return;\n const onSwitchToThread = this.adapter.onSwitchToThread;\n if (!onSwitchToThread)\n throw new Error(\n \"External store adapter does not support switching to thread\",\n );\n await onSwitchToThread(threadId);\n }\n\n public async switchToNewThread(): Promise<void> {\n const onSwitchToNewThread = this.adapter.onSwitchToNewThread;\n if (!onSwitchToNewThread)\n throw new Error(\n \"External store adapter does not support switching to new thread\",\n );\n\n await onSwitchToNewThread();\n }\n\n public async rename(threadId: string, newTitle: string): Promise<void> {\n const onRename = this.adapter.onRename;\n if (!onRename)\n throw new Error(\"External store adapter does not support renaming\");\n\n await onRename(threadId, newTitle);\n }\n\n public async detach(): Promise<void> {\n // no-op\n }\n\n public async archive(threadId: string): Promise<void> {\n const onArchive = this.adapter.onArchive;\n if (!onArchive)\n throw new Error(\"External store adapter does not support archiving\");\n\n await onArchive(threadId);\n }\n\n public async unarchive(threadId: string): Promise<void> {\n const onUnarchive = this.adapter.onUnarchive;\n if (!onUnarchive)\n throw new Error(\"External store adapter does not support unarchiving\");\n\n await onUnarchive(threadId);\n }\n\n public async delete(threadId: string): Promise<void> {\n const onDelete = this.adapter.onDelete;\n if (!onDelete)\n throw new Error(\"External store adapter does not support deleting\");\n\n await onDelete(threadId);\n }\n\n public initialize(\n threadId: string,\n ): Promise<{ remoteId: string; externalId: string | undefined }> {\n return Promise.resolve({ remoteId: threadId, externalId: undefined });\n }\n\n public generateTitle(): never {\n throw new Error(\"Method not implemented.\");\n }\n\n private _subscriptions = new Set<() => void>();\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n private _notifySubscribers() {\n for (const callback of this._subscriptions) callback();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"external-store-thread-list-runtime-core.js","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-list-runtime-core.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { ExternalStoreThreadRuntimeCore } from \"./external-store-thread-runtime-core\";\nimport type {\n ThreadListItemCoreState,\n ThreadListRuntimeCore,\n} from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport type { ExternalStoreThreadListAdapter } from \"./external-store-adapter\";\n\nexport type ExternalStoreThreadFactory = () => ExternalStoreThreadRuntimeCore;\n\nconst EMPTY_ARRAY = Object.freeze([]);\nconst DEFAULT_THREAD_ID = \"DEFAULT_THREAD_ID\";\nconst DEFAULT_THREADS = Object.freeze([DEFAULT_THREAD_ID]);\nconst DEFAULT_THREAD = Object.freeze({\n id: DEFAULT_THREAD_ID,\n remoteId: undefined,\n externalId: undefined,\n status: \"regular\",\n});\nconst RESOLVED_PROMISE = Promise.resolve();\nconst DEFAULT_THREAD_DATA = Object.freeze({\n [DEFAULT_THREAD_ID]: DEFAULT_THREAD,\n});\n\nexport class ExternalStoreThreadListRuntimeCore implements ThreadListRuntimeCore {\n private _mainThreadId: string = DEFAULT_THREAD_ID;\n private _threads: readonly string[] = DEFAULT_THREADS;\n private _archivedThreads: readonly string[] = EMPTY_ARRAY;\n private _threadData: Readonly<Record<string, ThreadListItemCoreState>> =\n DEFAULT_THREAD_DATA;\n private adapter: ExternalStoreThreadListAdapter = {};\n\n public get isLoading() {\n return this.adapter.isLoading ?? false;\n }\n\n public get newThreadId() {\n return undefined;\n }\n\n public get threadIds() {\n return this._threads;\n }\n\n public get archivedThreadIds() {\n return this._archivedThreads;\n }\n\n public get threadItems() {\n return this._threadData;\n }\n\n public getLoadThreadsPromise() {\n return RESOLVED_PROMISE;\n }\n\n private _mainThread!: ExternalStoreThreadRuntimeCore;\n\n public get mainThreadId() {\n return this._mainThreadId;\n }\n\n constructor(\n adapter: ExternalStoreThreadListAdapter = {},\n private threadFactory: ExternalStoreThreadFactory,\n ) {\n this.__internal_setAdapter(adapter, true);\n }\n\n public getMainThreadRuntimeCore() {\n return this._mainThread;\n }\n\n public getThreadRuntimeCore(): never {\n throw new Error(\"Method not implemented.\");\n }\n\n public getItemById(threadId: string) {\n return this._threadData[threadId];\n }\n\n public __internal_setAdapter(\n adapter: ExternalStoreThreadListAdapter,\n initialLoad = false,\n ) {\n const previousAdapter = this.adapter;\n this.adapter = adapter;\n\n const newThreadId = adapter.threadId ?? DEFAULT_THREAD_ID;\n const newThreads = adapter.threads ?? EMPTY_ARRAY;\n const newArchivedThreads = adapter.archivedThreads ?? EMPTY_ARRAY;\n\n const previousThreadId = previousAdapter.threadId ?? DEFAULT_THREAD_ID;\n const previousThreads = previousAdapter.threads ?? EMPTY_ARRAY;\n const previousArchivedThreads =\n previousAdapter.archivedThreads ?? EMPTY_ARRAY;\n\n if (\n !initialLoad &&\n previousThreadId === newThreadId &&\n previousThreads === newThreads &&\n previousArchivedThreads === newArchivedThreads\n ) {\n return;\n }\n\n if (\n previousThreads !== newThreads ||\n previousArchivedThreads !== newArchivedThreads ||\n previousThreadId !== newThreadId\n ) {\n this._threadData = {\n ...DEFAULT_THREAD_DATA,\n ...Object.fromEntries(\n adapter.threads?.map((t) => [\n t.id,\n {\n ...t,\n remoteId: t.remoteId,\n externalId: t.externalId,\n status: \"regular\",\n },\n ]) ?? [],\n ),\n ...Object.fromEntries(\n adapter.archivedThreads?.map((t) => [\n t.id,\n {\n ...t,\n remoteId: t.remoteId,\n externalId: t.externalId,\n status: \"archived\",\n },\n ]) ?? [],\n ),\n };\n }\n\n if (previousThreads !== newThreads) {\n this._threads = this.adapter.threads?.map((t) => t.id) ?? EMPTY_ARRAY;\n }\n\n if (previousArchivedThreads !== newArchivedThreads) {\n this._archivedThreads =\n this.adapter.archivedThreads?.map((t) => t.id) ?? EMPTY_ARRAY;\n }\n\n // `initialLoad ||`: `_mainThread!` must be assigned on construction.\n if (initialLoad || previousThreadId !== newThreadId) {\n this._mainThreadId = newThreadId;\n this._mainThread = this.threadFactory();\n }\n\n if (!this._threadData[this._mainThreadId]) {\n this._threadData = {\n ...this._threadData,\n [this._mainThreadId]: {\n id: this._mainThreadId,\n remoteId: undefined,\n externalId: undefined,\n status: \"regular\",\n },\n };\n }\n\n this._notifySubscribers();\n }\n\n public async switchToThread(\n threadId: string,\n _options?: { unarchive?: boolean },\n ): Promise<void> {\n if (this._mainThreadId === threadId) return;\n const onSwitchToThread = this.adapter.onSwitchToThread;\n if (!onSwitchToThread)\n throw new Error(\n \"External store adapter does not support switching to thread\",\n );\n await onSwitchToThread(threadId);\n }\n\n public async switchToNewThread(): Promise<void> {\n const onSwitchToNewThread = this.adapter.onSwitchToNewThread;\n if (!onSwitchToNewThread)\n throw new Error(\n \"External store adapter does not support switching to new thread\",\n );\n\n await onSwitchToNewThread();\n }\n\n public async rename(threadId: string, newTitle: string): Promise<void> {\n const onRename = this.adapter.onRename;\n if (!onRename)\n throw new Error(\"External store adapter does not support renaming\");\n\n await onRename(threadId, newTitle);\n }\n\n public async detach(): Promise<void> {\n // no-op\n }\n\n public async archive(threadId: string): Promise<void> {\n const onArchive = this.adapter.onArchive;\n if (!onArchive)\n throw new Error(\"External store adapter does not support archiving\");\n\n await onArchive(threadId);\n }\n\n public async unarchive(threadId: string): Promise<void> {\n const onUnarchive = this.adapter.onUnarchive;\n if (!onUnarchive)\n throw new Error(\"External store adapter does not support unarchiving\");\n\n await onUnarchive(threadId);\n }\n\n public async delete(threadId: string): Promise<void> {\n const onDelete = this.adapter.onDelete;\n if (!onDelete)\n throw new Error(\"External store adapter does not support deleting\");\n\n await onDelete(threadId);\n }\n\n public initialize(\n threadId: string,\n ): Promise<{ remoteId: string; externalId: string | undefined }> {\n return Promise.resolve({ remoteId: threadId, externalId: undefined });\n }\n\n public generateTitle(): never {\n throw new Error(\"Method not implemented.\");\n }\n\n private _subscriptions = new Set<() => void>();\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n private _notifySubscribers() {\n for (const callback of this._subscriptions) callback();\n }\n}\n"],"mappings":"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"}
@@ -6,7 +6,7 @@ import { RealtimeVoiceAdapter } from "../../adapters/voice.js";
6
6
  import { ModelContextProvider } from "../../model-context/types.js";
7
7
  import { ThreadMessageLike } from "../../runtime/utils/thread-message-like.js";
8
8
  import { ExportedMessageRepository } from "../../runtime/utils/message-repository.js";
9
- import { AddToolResultOptions, ResumeRunConfig, ResumeToolCallOptions, RuntimeCapabilities, StartRunConfig, ThreadRuntimeCore, ThreadSuggestion } from "../../runtime/interfaces/thread-runtime-core.js";
9
+ import { AddToolResultOptions, RespondToToolApprovalOptions, ResumeRunConfig, ResumeToolCallOptions, RuntimeCapabilities, StartRunConfig, ThreadRuntimeCore, ThreadSuggestion } from "../../runtime/interfaces/thread-runtime-core.js";
10
10
  import { BaseThreadRuntimeCore } from "../../runtime/base/base-thread-runtime-core.js";
11
11
  import { ExternalStoreAdapter, ExternalStoreThreadListAdapter } from "./external-store-adapter.js";
12
12
  //#region src/runtimes/external-store/external-store-thread-runtime-core.d.ts
@@ -35,9 +35,34 @@ declare class ExternalStoreThreadRuntimeCore extends BaseThreadRuntimeCore imple
35
35
  extras: unknown;
36
36
  private _converter;
37
37
  private _store;
38
+ /**
39
+ * Client-side tool-invocations pipeline. Constructed lazily on first
40
+ * snapshot — only when `adapter.unstable_enableToolInvocations === true`.
41
+ */
42
+ private _toolInvocations;
38
43
  beginEdit(messageId: string): void;
39
44
  constructor(contextProvider: ModelContextProvider, store: ExternalStoreAdapter<any>);
40
45
  __internal_setAdapter(store: ExternalStoreAdapter<any>): void;
46
+ /**
47
+ * Feed the current message snapshot into the tool-invocations tracker.
48
+ * Opt-in via `adapter.unstable_enableToolInvocations: true`. The tracker
49
+ * itself is fail-silent — see ToolInvocationTracker for the
50
+ * state-transition contract.
51
+ */
52
+ private _driveToolInvocations;
53
+ /**
54
+ * Lookup table from `toolCallId` to the owning assistant message's `id`,
55
+ * rebuilt lazily when `_messages` changes (see `_messagesForToolCallIndex`).
56
+ */
57
+ private _toolCallToMessageId;
58
+ private _messagesForToolCallIndex;
59
+ /**
60
+ * Look up the assistant message that owns a tool-call part. Lazily builds
61
+ * (and caches) a `toolCallId → messageId` map keyed off the current
62
+ * `_messages` reference, so onResult dispatches stay O(1) instead of
63
+ * walking the full thread on every result.
64
+ */
65
+ private _findMessageIdForToolCall;
41
66
  switchToBranch(branchId: string): void;
42
67
  append(message: AppendMessage): Promise<void>;
43
68
  startRun(config: StartRunConfig): Promise<void>;
@@ -47,6 +72,7 @@ declare class ExternalStoreThreadRuntimeCore extends BaseThreadRuntimeCore imple
47
72
  cancelRun(): void;
48
73
  addToolResult(options: AddToolResultOptions): void;
49
74
  resumeToolCall(options: ResumeToolCallOptions): void;
75
+ respondToToolApproval(options: RespondToToolApprovalOptions): void;
50
76
  reset(initialMessages?: readonly ThreadMessageLike[]): void;
51
77
  import(data: ExportedMessageRepository): void;
52
78
  private updateMessages;
@@ -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":";;;;;;;;;;;;cA2Ca,kBAAA,GACX,SAAA,WACA,QAAA,WAAmB,aAAa;AAAA,cAKrB,8BAAA,SACH,qBAAA,YACG,iBAAA;EAAA,QAEH,sBAAA;EAAA,QACA,qBAAA;EAAA,QAEA,aAAA;EAAA,IAeG,YAAA,CAAA,GAAY,mBAAA;EAAA,QAIf,SAAA;EACD,UAAA;EACA,cAAA;EAAA,IACI,SAAA,CAAA;EAAA,IAIA,SAAA,CAAA;EAAA,UAIQ,gBAAA,CAAA,YAA6B,aAAA;EAAA,IAI5B,KAAA,CAAA,gEAAK,kBAAA,oCAAA,iBAAA;EAAA,IAId,QAAA,CAAA;kBARkD,iBAAA;;;;;;;EAYtD,WAAA,WAAsB,gBAAA;EACtB,MAAA;EAAA,QAEC,UAAA;EAAA,QAEA,MAAA;EAEQ,SAAA,CAAU,SAAA;cAQxB,eAAA,EAAiB,oBAAA,EACjB,KAAA,EAAO,oBAAA;EAMF,qBAAA,CAAsB,KAAA,EAAO,oBAAA;EA4JpB,cAAA,CAAe,QAAA;EAalB,MAAA,CAAO,OAAA,EAAS,aAAA,GAAgB,OAAA;EAUhC,QAAA,CAAS,MAAA,EAAQ,cAAA,GAAiB,OAAA;EAOlC,SAAA,CAAU,MAAA,EAAQ,eAAA,GAAkB,OAAA;EAO1C,mBAAA,CAAA;EAOA,mBAAA,CAAoB,KAAA;EAOpB,SAAA,CAAA;EAkCA,aAAA,CAAc,OAAA,EAAS,oBAAA;EAMvB,cAAA,CAAe,OAAA,EAAS,qBAAA;EAMf,KAAA,CAAM,eAAA,YAA2B,iBAAA;EAOjC,MAAA,CAAO,IAAA,EAAM,yBAAA;EAAA,QAWrB,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":";;;;;;;;;;;;cA6Ca,kBAAA,GACX,SAAA,WACA,QAAA,WAAmB,aAAa;AAAA,cAKrB,8BAAA,SACH,qBAAA,YACG,iBAAA;EAAA,QAEH,sBAAA;EAAA,QACA,qBAAA;EAAA,QAEA,aAAA;EAAA,IAeG,YAAA,CAAA,GAAY,mBAAA;EAAA,QAIf,SAAA;EACD,UAAA;EACA,cAAA;EAAA,IACI,SAAA,CAAA;EAAA,IAIA,SAAA,CAAA;EAAA,UAIQ,gBAAA,CAAA,YAA6B,aAAA;EAAA,IAI5B,KAAA,CAAA,gEAAK,kBAAA,oCAAA,iBAAA;EAAA,IAId,QAAA,CAAA;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;EAqSW;;;;;;EAAA,QAhIvC,qBAAA;EA2PqB;;;;EAAA,QAxLrB,oBAAA;EAAA,QACA,yBAAA;EApTG;;;;;;EAAA,QA4TH,yBAAA;EAmBQ,cAAA,CAAe,QAAA;EAalB,MAAA,CAAO,OAAA,EAAS,aAAA,GAAgB,OAAA;EAoBhC,QAAA,CAAS,MAAA,EAAQ,cAAA,GAAiB,OAAA;EAYlC,SAAA,CAAU,MAAA,EAAQ,eAAA,GAAkB,OAAA;EAO1C,mBAAA,CAAA;EAOA,mBAAA,CAAoB,KAAA;EAmBpB,SAAA,CAAA;EAuCA,aAAA,CAAc,OAAA,EAAS,oBAAA;EAMvB,cAAA,CAAe,OAAA,EAAS,qBAAA;EAoBxB,qBAAA,CAAsB,OAAA,EAAS,4BAAA;EAMtB,KAAA,CAAM,eAAA,YAA2B,iBAAA;EAOjC,MAAA,CAAO,IAAA,EAAM,yBAAA;EAAA,QAWrB,cAAA;AAAA"}
@@ -5,6 +5,7 @@ import { ExportedMessageRepository, MessageRepository } from "../../runtime/util
5
5
  import { getThreadMessageText } from "../../utils/text.js";
6
6
  import { BaseThreadRuntimeCore } from "../../runtime/base/base-thread-runtime-core.js";
7
7
  import { ThreadMessageConverter } from "./thread-message-converter.js";
8
+ import { ToolInvocationTracker } from "../tool-invocations/ToolInvocationTracker.js";
8
9
  //#region src/runtimes/external-store/external-store-thread-runtime-core.ts
9
10
  const EMPTY_ARRAY = Object.freeze([]);
10
11
  const shallowEqual = (a, b) => {
@@ -58,6 +59,11 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
58
59
  extras = void 0;
59
60
  _converter = new ThreadMessageConverter();
60
61
  _store;
62
+ /**
63
+ * Client-side tool-invocations pipeline. Constructed lazily on first
64
+ * snapshot — only when `adapter.unstable_enableToolInvocations === true`.
65
+ */
66
+ _toolInvocations = null;
61
67
  beginEdit(messageId) {
62
68
  if (!this._store.onEdit) throw new Error("Runtime does not support editing.");
63
69
  super.beginEdit(messageId);
@@ -140,8 +146,82 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
140
146
  });
141
147
  this.repository.resetHead(this._assistantOptimisticId ?? messages.at(-1)?.id ?? null);
142
148
  this._messages = this.repository.getMessages();
149
+ this._driveToolInvocations();
143
150
  this._notifySubscribers();
144
151
  }
152
+ /**
153
+ * Feed the current message snapshot into the tool-invocations tracker.
154
+ * Opt-in via `adapter.unstable_enableToolInvocations: true`. The tracker
155
+ * itself is fail-silent — see ToolInvocationTracker for the
156
+ * state-transition contract.
157
+ */
158
+ _driveToolInvocations() {
159
+ if (!this._store.unstable_enableToolInvocations) {
160
+ if (this._toolInvocations) {
161
+ this._toolInvocations.reset();
162
+ this._toolInvocations = null;
163
+ this._store.setToolStatuses?.({});
164
+ }
165
+ return;
166
+ }
167
+ if (!this._toolInvocations) this._toolInvocations = new ToolInvocationTracker(() => this.getModelContext().tools, {
168
+ onResult: (command) => {
169
+ try {
170
+ const messageId = this._findMessageIdForToolCall(command.toolCallId);
171
+ if (messageId === void 0) return;
172
+ this._store.onAddToolResult?.({
173
+ messageId,
174
+ toolCallId: command.toolCallId,
175
+ toolName: command.toolName,
176
+ result: command.result,
177
+ isError: command.isError,
178
+ ...command.artifact !== void 0 && { artifact: command.artifact },
179
+ ...command.modelContent !== void 0 && { modelContent: command.modelContent }
180
+ });
181
+ } catch (err) {
182
+ console.error("[ExternalStoreThreadRuntimeCore] onAddToolResult dispatch failed", err);
183
+ }
184
+ },
185
+ onStatusesChange: (statuses) => {
186
+ this._store.setToolStatuses?.(Object.fromEntries(statuses));
187
+ }
188
+ });
189
+ this._toolInvocations.setState({
190
+ messages: this._messages,
191
+ isRunning: this._store.isRunning ?? false,
192
+ ...this._store.isLoading !== void 0 && { isLoading: this._store.isLoading }
193
+ });
194
+ }
195
+ /**
196
+ * Lookup table from `toolCallId` to the owning assistant message's `id`,
197
+ * rebuilt lazily when `_messages` changes (see `_messagesForToolCallIndex`).
198
+ */
199
+ _toolCallToMessageId = /* @__PURE__ */ new Map();
200
+ _messagesForToolCallIndex = null;
201
+ /**
202
+ * Look up the assistant message that owns a tool-call part. Lazily builds
203
+ * (and caches) a `toolCallId → messageId` map keyed off the current
204
+ * `_messages` reference, so onResult dispatches stay O(1) instead of
205
+ * walking the full thread on every result.
206
+ */
207
+ _findMessageIdForToolCall(toolCallId) {
208
+ if (this._messagesForToolCallIndex !== this._messages) {
209
+ this._toolCallToMessageId.clear();
210
+ const visit = (messages) => {
211
+ for (const message of messages) {
212
+ if (!Array.isArray(message.content)) continue;
213
+ for (const part of message.content) {
214
+ if (!part || part.type !== "tool-call") continue;
215
+ this._toolCallToMessageId.set(part.toolCallId, message.id);
216
+ if (part.messages) visit(part.messages);
217
+ }
218
+ }
219
+ };
220
+ visit(this._messages);
221
+ this._messagesForToolCallIndex = this._messages;
222
+ }
223
+ return this._toolCallToMessageId.get(toolCallId);
224
+ }
145
225
  switchToBranch(branchId) {
146
226
  if (!this._store.setMessages) throw new Error("Runtime does not support switching branches.");
147
227
  if (this._store.isRunning) return;
@@ -149,6 +229,7 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
149
229
  this.updateMessages(this.repository.getMessages());
150
230
  }
151
231
  async append(message) {
232
+ if (message.startRun ?? message.role === "user") await this._toolInvocations?.abort();
152
233
  if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {
153
234
  if (!this._store.onEdit) throw new Error("Runtime does not support editing messages.");
154
235
  await this._store.onEdit(message);
@@ -156,6 +237,7 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
156
237
  }
157
238
  async startRun(config) {
158
239
  if (!this._store.onReload) throw new Error("Runtime does not support reloading messages.");
240
+ await this._toolInvocations?.abort();
159
241
  await this._store.onReload(config.parentId, config);
160
242
  }
161
243
  async resumeRun(config) {
@@ -168,10 +250,15 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
168
250
  }
169
251
  importExternalState(state) {
170
252
  if (!this._store.onLoadExternalState) throw new Error("Runtime does not support importing external states.");
253
+ if (this._toolInvocations) {
254
+ this._toolInvocations.reset();
255
+ this._store.setToolStatuses?.({});
256
+ }
171
257
  this._store.onLoadExternalState(state);
172
258
  }
173
259
  cancelRun() {
174
260
  if (!this._store.onCancel) throw new Error("Runtime does not support cancelling runs.");
261
+ this._toolInvocations?.abort();
175
262
  this._store.onCancel();
176
263
  if (this._assistantOptimisticId) {
177
264
  this.repository.deleteMessage(this._assistantOptimisticId);
@@ -190,12 +277,20 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
190
277
  }, 0);
191
278
  }
192
279
  addToolResult(options) {
193
- if (!this._store.onAddToolResult && !this._store.onAddToolResult) throw new Error("Runtime does not support tool results.");
280
+ if (!this._store.onAddToolResult) throw new Error("Runtime does not support tool results.");
194
281
  this._store.onAddToolResult?.(options);
195
282
  }
196
283
  resumeToolCall(options) {
197
- if (!this._store.onResumeToolCall) throw new Error("Runtime does not support resuming tool calls.");
198
- this._store.onResumeToolCall(options);
284
+ if (this._toolInvocations?.resume(options.toolCallId, options.payload) ?? false) return;
285
+ if (this._store.onResumeToolCall) {
286
+ this._store.onResumeToolCall(options);
287
+ return;
288
+ }
289
+ throw new Error(`Tool call ${options.toolCallId} is not waiting for resume.`);
290
+ }
291
+ respondToToolApproval(options) {
292
+ if (!this._store.onRespondToToolApproval) throw new Error("Runtime does not support tool approvals.");
293
+ this._store.onRespondToToolApproval(options);
199
294
  }
200
295
  reset(initialMessages) {
201
296
  this._lastSyncedMessageIds = /* @__PURE__ */ new Set();
@@ -1 +1 @@
1
- {"version":3,"file":"external-store-thread-runtime-core.js","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-runtime-core.ts"],"sourcesContent":["import type { AppendMessage, ThreadMessage } from \"../../types/message\";\nimport type {\n AddToolResultOptions,\n ResumeRunConfig,\n ResumeToolCallOptions,\n StartRunConfig,\n ThreadSuggestion,\n} from \"../../runtime/interfaces/thread-runtime-core\";\n\nimport type { ExternalStoreAdapter } from \"./external-store-adapter\";\nimport {\n getExternalStoreMessages,\n bindExternalStoreMessage,\n} from \"../../runtime/utils/external-store-message\";\nimport { ThreadMessageConverter } from \"./thread-message-converter\";\nimport { getAutoStatus, isAutoStatus } from \"../../runtime/utils/auto-status\";\nimport {\n fromThreadMessageLike,\n type ThreadMessageLike,\n} from \"../../runtime/utils/thread-message-like\";\nimport { getThreadMessageText } from \"../../utils/text\";\nimport type {\n RuntimeCapabilities,\n ThreadRuntimeCore,\n} from \"../../runtime/interfaces/thread-runtime-core\";\nimport { BaseThreadRuntimeCore } from \"../../runtime/base/base-thread-runtime-core\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport {\n ExportedMessageRepository,\n MessageRepository,\n} from \"../../runtime/utils/message-repository\";\n\nconst EMPTY_ARRAY: readonly ThreadSuggestion[] = Object.freeze([]);\n\nconst shallowEqual = (a: object, b: object): boolean => {\n const aKeys = Object.keys(a);\n if (aKeys.length !== Object.keys(b).length) return false;\n for (const key of aKeys) {\n if ((a as any)[key] !== (b as any)[key]) return false;\n }\n return true;\n};\n\nexport const hasUpcomingMessage = (\n isRunning: boolean,\n messages: readonly ThreadMessage[],\n) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nexport class ExternalStoreThreadRuntimeCore\n extends BaseThreadRuntimeCore\n implements ThreadRuntimeCore\n{\n private _assistantOptimisticId: string | null = null;\n private _lastSyncedMessageIds = new Set<string>();\n\n private _capabilities: RuntimeCapabilities = {\n switchToBranch: false,\n switchBranchDuringRun: false,\n edit: false,\n reload: false,\n cancel: false,\n unstable_copy: false,\n speech: false,\n dictation: false,\n voice: false,\n attachments: false,\n feedback: false,\n queue: false,\n };\n\n public get capabilities() {\n return this._capabilities;\n }\n\n private _messages!: readonly ThreadMessage[];\n public isDisabled!: boolean;\n public isSendDisabled!: boolean;\n public get isLoading() {\n return this._store.isLoading ?? false;\n }\n // Unlike `isLoading`: pass `undefined` through to preserve the `getThreadState` fallback.\n public get isRunning(): boolean | undefined {\n return this._store.isRunning;\n }\n\n protected override _getBaseMessages(): readonly ThreadMessage[] {\n return this._messages;\n }\n\n public override get state() {\n return this._store.state ?? super.state;\n }\n\n public get adapters() {\n return this._store.adapters;\n }\n\n public suggestions: readonly ThreadSuggestion[] = [];\n public extras: unknown = undefined;\n\n private _converter = new ThreadMessageConverter();\n\n private _store!: ExternalStoreAdapter<any>;\n\n public override beginEdit(messageId: string) {\n if (!this._store.onEdit)\n throw new Error(\"Runtime does not support editing.\");\n\n super.beginEdit(messageId);\n }\n\n constructor(\n contextProvider: ModelContextProvider,\n store: ExternalStoreAdapter<any>,\n ) {\n super(contextProvider);\n this.__internal_setAdapter(store);\n }\n\n public __internal_setAdapter(store: ExternalStoreAdapter<any>) {\n if (this._store === store) return;\n\n const isRunning = store.isRunning ?? false;\n this.isDisabled = store.isDisabled ?? false;\n this.isSendDisabled = store.isSendDisabled ?? false;\n\n const oldStore = this._store as ExternalStoreAdapter<any> | undefined;\n this._store = store;\n if (this.extras !== store.extras) {\n this.extras = store.extras;\n }\n\n const newSuggestions = store.suggestions ?? EMPTY_ARRAY;\n if (!shallowEqual(this.suggestions, newSuggestions)) {\n this.suggestions = newSuggestions;\n }\n\n const newCapabilities: RuntimeCapabilities = {\n switchToBranch: this._store.setMessages !== undefined,\n switchBranchDuringRun: false,\n edit: this._store.onEdit !== undefined,\n reload: this._store.onReload !== undefined,\n cancel: this._store.onCancel !== undefined,\n speech: this._store.adapters?.speech !== undefined,\n dictation: this._store.adapters?.dictation !== undefined,\n voice: this._store.adapters?.voice !== undefined,\n unstable_copy: this._store.unstable_capabilities?.copy !== false,\n attachments: !!this._store.adapters?.attachments,\n feedback: !!this._store.adapters?.feedback,\n queue: false,\n };\n if (!shallowEqual(this._capabilities, newCapabilities)) {\n this._capabilities = newCapabilities;\n }\n\n let messages: readonly ThreadMessage[];\n\n if (store.messageRepository) {\n // Handle messageRepository\n if (\n oldStore &&\n oldStore.isRunning === store.isRunning &&\n oldStore.messageRepository === store.messageRepository\n ) {\n this._notifySubscribers();\n return;\n }\n\n // Clear and import the message repository\n this.repository.clear();\n this._assistantOptimisticId = null;\n this._lastSyncedMessageIds = new Set();\n this.repository.import(store.messageRepository);\n\n messages = this.repository.getMessages();\n } else if (store.messages) {\n // Handle messages array\n\n if (oldStore) {\n // flush the converter cache when the convertMessage prop changes\n if (oldStore.convertMessage !== store.convertMessage) {\n this._converter = new ThreadMessageConverter();\n } else if (\n oldStore.isRunning === store.isRunning &&\n oldStore.messages === store.messages\n ) {\n this._notifySubscribers();\n // no conversion update\n return;\n }\n }\n\n messages = !store.convertMessage\n ? store.messages\n : this._converter.convertMessages(store.messages, (cache, m, idx) => {\n if (!store.convertMessage) return m;\n\n const isLast = idx === (store.messages?.length ?? 0) - 1;\n const autoStatus = getAutoStatus(\n isLast,\n isRunning,\n false,\n false,\n undefined,\n );\n\n if (\n cache &&\n (cache.role !== \"assistant\" ||\n !isAutoStatus(cache.status) ||\n cache.status === autoStatus)\n )\n return cache;\n\n const messageLike = store.convertMessage(m, idx);\n const newMessage = fromThreadMessageLike(\n messageLike,\n idx.toString(),\n autoStatus,\n );\n bindExternalStoreMessage(newMessage, m);\n return newMessage;\n });\n\n const nextIds = new Set(messages.map((m) => m.id));\n for (const prevId of this._lastSyncedMessageIds) {\n if (!nextIds.has(prevId)) this.repository.deleteMessage(prevId);\n }\n this._lastSyncedMessageIds = nextIds;\n\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i]!;\n const parent = messages[i - 1];\n this.repository.addOrUpdateMessage(parent?.id ?? null, message);\n }\n } else {\n throw new Error(\n \"ExternalStoreAdapter must provide either 'messages' or 'messageRepository'\",\n );\n }\n\n // Common logic for both paths\n if (messages.length > 0) this.ensureInitialized();\n\n if ((oldStore?.isRunning ?? false) !== (store.isRunning ?? false)) {\n if (store.isRunning) {\n this._notifyEventSubscribers(\"runStart\", {});\n } else {\n this._notifyEventSubscribers(\"runEnd\", {});\n }\n }\n\n if (this._assistantOptimisticId) {\n this.repository.deleteMessage(this._assistantOptimisticId);\n this._assistantOptimisticId = null;\n }\n\n if (hasUpcomingMessage(isRunning, messages)) {\n this._assistantOptimisticId = this.repository.appendOptimisticMessage(\n messages.at(-1)?.id ?? null,\n {\n role: \"assistant\",\n content: [],\n },\n );\n }\n\n this.repository.resetHead(\n this._assistantOptimisticId ?? messages.at(-1)?.id ?? null,\n );\n\n this._messages = this.repository.getMessages();\n this._notifySubscribers();\n }\n\n public override switchToBranch(branchId: string): void {\n if (!this._store.setMessages)\n throw new Error(\"Runtime does not support switching branches.\");\n\n // Silently ignore branch switches while running\n if (this._store.isRunning) {\n return;\n }\n\n this.repository.switchToBranch(branchId);\n this.updateMessages(this.repository.getMessages());\n }\n\n public async append(message: AppendMessage): Promise<void> {\n if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {\n if (!this._store.onEdit)\n throw new Error(\"Runtime does not support editing messages.\");\n await this._store.onEdit(message);\n } else {\n await this._store.onNew(message);\n }\n }\n\n public async startRun(config: StartRunConfig): Promise<void> {\n if (!this._store.onReload)\n throw new Error(\"Runtime does not support reloading messages.\");\n\n await this._store.onReload(config.parentId, config);\n }\n\n public async resumeRun(config: ResumeRunConfig): Promise<void> {\n if (!this._store.onResume)\n throw new Error(\"Runtime does not support resuming runs.\");\n\n await this._store.onResume(config);\n }\n\n public exportExternalState(): any {\n if (!this._store.onExportExternalState)\n throw new Error(\"Runtime does not support exporting external states.\");\n\n return this._store.onExportExternalState();\n }\n\n public importExternalState(state: any): void {\n if (!this._store.onLoadExternalState)\n throw new Error(\"Runtime does not support importing external states.\");\n\n this._store.onLoadExternalState(state);\n }\n\n public cancelRun(): void {\n if (!this._store.onCancel)\n throw new Error(\"Runtime does not support cancelling runs.\");\n\n this._store.onCancel();\n\n if (this._assistantOptimisticId) {\n this.repository.deleteMessage(this._assistantOptimisticId);\n this._assistantOptimisticId = null;\n }\n\n let messages = this.repository.getMessages();\n const previousMessage = messages[messages.length - 1];\n if (\n previousMessage?.role === \"user\" &&\n previousMessage.id === messages.at(-1)?.id // ensure the previous message is a leaf node\n ) {\n this.repository.deleteMessage(previousMessage.id);\n this._lastSyncedMessageIds.delete(previousMessage.id);\n if (!this.composer.text.trim()) {\n this.composer.setText(getThreadMessageText(previousMessage));\n }\n\n messages = this.repository.getMessages();\n } else {\n this._notifySubscribers();\n }\n\n // resync messages (for reloading, to restore the previous branch)\n setTimeout(() => {\n this.updateMessages(messages);\n }, 0);\n }\n\n public addToolResult(options: AddToolResultOptions) {\n if (!this._store.onAddToolResult && !this._store.onAddToolResult)\n throw new Error(\"Runtime does not support tool results.\");\n this._store.onAddToolResult?.(options);\n }\n\n public resumeToolCall(options: ResumeToolCallOptions) {\n if (!this._store.onResumeToolCall)\n throw new Error(\"Runtime does not support resuming tool calls.\");\n this._store.onResumeToolCall(options);\n }\n\n public override reset(initialMessages?: readonly ThreadMessageLike[]) {\n this._lastSyncedMessageIds = new Set();\n const repo = new MessageRepository();\n repo.import(ExportedMessageRepository.fromArray(initialMessages ?? []));\n this.updateMessages(repo.getMessages());\n }\n\n public override import(data: ExportedMessageRepository) {\n this._assistantOptimisticId = null;\n this._lastSyncedMessageIds = new Set();\n\n super.import(data);\n\n if (this._store.onImport) {\n this._store.onImport(this.repository.getMessages());\n }\n }\n\n private updateMessages = (messages: readonly ThreadMessage[]) => {\n const hasConverter = this._store.convertMessage !== undefined;\n if (hasConverter) {\n this._store.setMessages?.(messages.flatMap(getExternalStoreMessages));\n } else {\n // TODO mark this as readonly in v0.12.0\n this._store.setMessages?.(messages as ThreadMessage[]);\n }\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"external-store-thread-runtime-core.js","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-runtime-core.ts"],"sourcesContent":["import type { AppendMessage, ThreadMessage } from \"../../types/message\";\nimport type {\n AddToolResultOptions,\n ResumeRunConfig,\n ResumeToolCallOptions,\n RespondToToolApprovalOptions,\n StartRunConfig,\n ThreadSuggestion,\n} from \"../../runtime/interfaces/thread-runtime-core\";\n\nimport type { ExternalStoreAdapter } from \"./external-store-adapter\";\nimport {\n getExternalStoreMessages,\n bindExternalStoreMessage,\n} from \"../../runtime/utils/external-store-message\";\nimport { ThreadMessageConverter } from \"./thread-message-converter\";\nimport { getAutoStatus, isAutoStatus } from \"../../runtime/utils/auto-status\";\nimport {\n fromThreadMessageLike,\n type ThreadMessageLike,\n} from \"../../runtime/utils/thread-message-like\";\nimport { getThreadMessageText } from \"../../utils/text\";\nimport type {\n RuntimeCapabilities,\n ThreadRuntimeCore,\n} from \"../../runtime/interfaces/thread-runtime-core\";\nimport { BaseThreadRuntimeCore } from \"../../runtime/base/base-thread-runtime-core\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport {\n ExportedMessageRepository,\n MessageRepository,\n} from \"../../runtime/utils/message-repository\";\nimport { ToolInvocationTracker } from \"../tool-invocations/ToolInvocationTracker\";\n\nconst EMPTY_ARRAY: readonly ThreadSuggestion[] = Object.freeze([]);\n\nconst shallowEqual = (a: object, b: object): boolean => {\n const aKeys = Object.keys(a);\n if (aKeys.length !== Object.keys(b).length) return false;\n for (const key of aKeys) {\n if ((a as any)[key] !== (b as any)[key]) return false;\n }\n return true;\n};\n\nexport const hasUpcomingMessage = (\n isRunning: boolean,\n messages: readonly ThreadMessage[],\n) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nexport class ExternalStoreThreadRuntimeCore\n extends BaseThreadRuntimeCore\n implements ThreadRuntimeCore\n{\n private _assistantOptimisticId: string | null = null;\n private _lastSyncedMessageIds = new Set<string>();\n\n private _capabilities: RuntimeCapabilities = {\n switchToBranch: false,\n switchBranchDuringRun: false,\n edit: false,\n reload: false,\n cancel: false,\n unstable_copy: false,\n speech: false,\n dictation: false,\n voice: false,\n attachments: false,\n feedback: false,\n queue: false,\n };\n\n public get capabilities() {\n return this._capabilities;\n }\n\n private _messages!: readonly ThreadMessage[];\n public isDisabled!: boolean;\n public isSendDisabled!: boolean;\n public get isLoading() {\n return this._store.isLoading ?? false;\n }\n // Unlike `isLoading`: pass `undefined` through to preserve the `getThreadState` fallback.\n public get isRunning(): boolean | undefined {\n return this._store.isRunning;\n }\n\n protected override _getBaseMessages(): readonly ThreadMessage[] {\n return this._messages;\n }\n\n public override get state() {\n return this._store.state ?? super.state;\n }\n\n public get adapters() {\n return this._store.adapters;\n }\n\n public suggestions: readonly ThreadSuggestion[] = [];\n public extras: unknown = undefined;\n\n private _converter = new ThreadMessageConverter();\n\n private _store!: ExternalStoreAdapter<any>;\n\n /**\n * Client-side tool-invocations pipeline. Constructed lazily on first\n * snapshot — only when `adapter.unstable_enableToolInvocations === true`.\n */\n private _toolInvocations: ToolInvocationTracker | null = null;\n\n public override beginEdit(messageId: string) {\n if (!this._store.onEdit)\n throw new Error(\"Runtime does not support editing.\");\n\n super.beginEdit(messageId);\n }\n\n constructor(\n contextProvider: ModelContextProvider,\n store: ExternalStoreAdapter<any>,\n ) {\n super(contextProvider);\n this.__internal_setAdapter(store);\n }\n\n public __internal_setAdapter(store: ExternalStoreAdapter<any>) {\n if (this._store === store) return;\n\n const isRunning = store.isRunning ?? false;\n this.isDisabled = store.isDisabled ?? false;\n this.isSendDisabled = store.isSendDisabled ?? false;\n\n const oldStore = this._store as ExternalStoreAdapter<any> | undefined;\n this._store = store;\n if (this.extras !== store.extras) {\n this.extras = store.extras;\n }\n\n const newSuggestions = store.suggestions ?? EMPTY_ARRAY;\n if (!shallowEqual(this.suggestions, newSuggestions)) {\n this.suggestions = newSuggestions;\n }\n\n const newCapabilities: RuntimeCapabilities = {\n switchToBranch: this._store.setMessages !== undefined,\n switchBranchDuringRun: false,\n edit: this._store.onEdit !== undefined,\n reload: this._store.onReload !== undefined,\n cancel: this._store.onCancel !== undefined,\n speech: this._store.adapters?.speech !== undefined,\n dictation: this._store.adapters?.dictation !== undefined,\n voice: this._store.adapters?.voice !== undefined,\n unstable_copy: this._store.unstable_capabilities?.copy !== false,\n attachments: !!this._store.adapters?.attachments,\n feedback: !!this._store.adapters?.feedback,\n queue: false,\n };\n if (!shallowEqual(this._capabilities, newCapabilities)) {\n this._capabilities = newCapabilities;\n }\n\n let messages: readonly ThreadMessage[];\n\n if (store.messageRepository) {\n // Handle messageRepository\n if (\n oldStore &&\n oldStore.isRunning === store.isRunning &&\n oldStore.messageRepository === store.messageRepository\n ) {\n this._notifySubscribers();\n return;\n }\n\n // Clear and import the message repository\n this.repository.clear();\n this._assistantOptimisticId = null;\n this._lastSyncedMessageIds = new Set();\n this.repository.import(store.messageRepository);\n\n messages = this.repository.getMessages();\n } else if (store.messages) {\n // Handle messages array\n\n if (oldStore) {\n // flush the converter cache when the convertMessage prop changes\n if (oldStore.convertMessage !== store.convertMessage) {\n this._converter = new ThreadMessageConverter();\n } else if (\n oldStore.isRunning === store.isRunning &&\n oldStore.messages === store.messages\n ) {\n this._notifySubscribers();\n // no conversion update\n return;\n }\n }\n\n messages = !store.convertMessage\n ? store.messages\n : this._converter.convertMessages(store.messages, (cache, m, idx) => {\n if (!store.convertMessage) return m;\n\n const isLast = idx === (store.messages?.length ?? 0) - 1;\n const autoStatus = getAutoStatus(\n isLast,\n isRunning,\n false,\n false,\n undefined,\n );\n\n if (\n cache &&\n (cache.role !== \"assistant\" ||\n !isAutoStatus(cache.status) ||\n cache.status === autoStatus)\n )\n return cache;\n\n const messageLike = store.convertMessage(m, idx);\n const newMessage = fromThreadMessageLike(\n messageLike,\n idx.toString(),\n autoStatus,\n );\n bindExternalStoreMessage(newMessage, m);\n return newMessage;\n });\n\n const nextIds = new Set(messages.map((m) => m.id));\n for (const prevId of this._lastSyncedMessageIds) {\n if (!nextIds.has(prevId)) this.repository.deleteMessage(prevId);\n }\n this._lastSyncedMessageIds = nextIds;\n\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i]!;\n const parent = messages[i - 1];\n this.repository.addOrUpdateMessage(parent?.id ?? null, message);\n }\n } else {\n throw new Error(\n \"ExternalStoreAdapter must provide either 'messages' or 'messageRepository'\",\n );\n }\n\n // Common logic for both paths\n if (messages.length > 0) this.ensureInitialized();\n\n if ((oldStore?.isRunning ?? false) !== (store.isRunning ?? false)) {\n if (store.isRunning) {\n this._notifyEventSubscribers(\"runStart\", {});\n } else {\n this._notifyEventSubscribers(\"runEnd\", {});\n }\n }\n\n if (this._assistantOptimisticId) {\n this.repository.deleteMessage(this._assistantOptimisticId);\n this._assistantOptimisticId = null;\n }\n\n if (hasUpcomingMessage(isRunning, messages)) {\n this._assistantOptimisticId = this.repository.appendOptimisticMessage(\n messages.at(-1)?.id ?? null,\n {\n role: \"assistant\",\n content: [],\n },\n );\n }\n\n this.repository.resetHead(\n this._assistantOptimisticId ?? messages.at(-1)?.id ?? null,\n );\n\n this._messages = this.repository.getMessages();\n\n this._driveToolInvocations();\n\n this._notifySubscribers();\n }\n\n /**\n * Feed the current message snapshot into the tool-invocations tracker.\n * Opt-in via `adapter.unstable_enableToolInvocations: true`. The tracker\n * itself is fail-silent — see ToolInvocationTracker for the\n * state-transition contract.\n */\n private _driveToolInvocations(): void {\n if (!this._store.unstable_enableToolInvocations) {\n // Adapter did not opt in (default). If a tracker was previously\n // constructed (e.g. the adapter just toggled the flag off via a\n // dynamic swap), drop it so subsequent snapshots are no-ops.\n if (this._toolInvocations) {\n this._toolInvocations.reset();\n this._toolInvocations = null;\n this._store.setToolStatuses?.({});\n }\n return;\n }\n\n if (!this._toolInvocations) {\n this._toolInvocations = new ToolInvocationTracker(\n () => this.getModelContext().tools,\n {\n onResult: (command) => {\n try {\n const messageId = this._findMessageIdForToolCall(\n command.toolCallId,\n );\n if (messageId === undefined) {\n // The tool call no longer exists in the snapshot (e.g.\n // rolled back). Drop the result.\n return;\n }\n this._store.onAddToolResult?.({\n messageId,\n toolCallId: command.toolCallId,\n toolName: command.toolName,\n result: command.result,\n isError: command.isError,\n ...(command.artifact !== undefined && {\n artifact: command.artifact,\n }),\n ...(command.modelContent !== undefined && {\n modelContent: command.modelContent,\n }),\n });\n } catch (err) {\n console.error(\n \"[ExternalStoreThreadRuntimeCore] onAddToolResult dispatch failed\",\n err,\n );\n }\n },\n onStatusesChange: (statuses) => {\n this._store.setToolStatuses?.(Object.fromEntries(statuses));\n },\n },\n );\n }\n\n this._toolInvocations.setState({\n messages: this._messages,\n isRunning: this._store.isRunning ?? false,\n ...(this._store.isLoading !== undefined && {\n isLoading: this._store.isLoading,\n }),\n });\n }\n\n /**\n * Lookup table from `toolCallId` to the owning assistant message's `id`,\n * rebuilt lazily when `_messages` changes (see `_messagesForToolCallIndex`).\n */\n private _toolCallToMessageId = new Map<string, string>();\n private _messagesForToolCallIndex: readonly ThreadMessage[] | null = null;\n\n /**\n * Look up the assistant message that owns a tool-call part. Lazily builds\n * (and caches) a `toolCallId → messageId` map keyed off the current\n * `_messages` reference, so onResult dispatches stay O(1) instead of\n * walking the full thread on every result.\n */\n private _findMessageIdForToolCall(toolCallId: string): string | undefined {\n if (this._messagesForToolCallIndex !== this._messages) {\n this._toolCallToMessageId.clear();\n const visit = (messages: readonly ThreadMessage[]): void => {\n for (const message of messages) {\n if (!Array.isArray(message.content)) continue;\n for (const part of message.content) {\n if (!part || part.type !== \"tool-call\") continue;\n this._toolCallToMessageId.set(part.toolCallId, message.id);\n if (part.messages) visit(part.messages);\n }\n }\n };\n visit(this._messages);\n this._messagesForToolCallIndex = this._messages;\n }\n return this._toolCallToMessageId.get(toolCallId);\n }\n\n public override switchToBranch(branchId: string): void {\n if (!this._store.setMessages)\n throw new Error(\"Runtime does not support switching branches.\");\n\n // Silently ignore branch switches while running\n if (this._store.isRunning) {\n return;\n }\n\n this.repository.switchToBranch(branchId);\n this.updateMessages(this.repository.getMessages());\n }\n\n public async append(message: AppendMessage): Promise<void> {\n // Auto-abort in-flight client-side tool executions when a new run is\n // about to start. Without this, a tool that finishes after the new turn\n // begins would feed a stale result into `onAddToolResult`, racing with\n // the new turn the user just initiated. `startRun` defaults to true for\n // user messages — matches the satellites' historical opt-in cancel\n // behavior, which is now built in.\n if (message.startRun ?? message.role === \"user\") {\n await this._toolInvocations?.abort();\n }\n\n if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {\n if (!this._store.onEdit)\n throw new Error(\"Runtime does not support editing messages.\");\n await this._store.onEdit(message);\n } else {\n await this._store.onNew(message);\n }\n }\n\n public async startRun(config: StartRunConfig): Promise<void> {\n if (!this._store.onReload)\n throw new Error(\"Runtime does not support reloading messages.\");\n\n // Auto-abort in-flight client-side tool executions when a run reloads;\n // any results that land afterward would target a turn that no longer\n // exists. See `append` above for full rationale.\n await this._toolInvocations?.abort();\n\n await this._store.onReload(config.parentId, config);\n }\n\n public async resumeRun(config: ResumeRunConfig): Promise<void> {\n if (!this._store.onResume)\n throw new Error(\"Runtime does not support resuming runs.\");\n\n await this._store.onResume(config);\n }\n\n public exportExternalState(): any {\n if (!this._store.onExportExternalState)\n throw new Error(\"Runtime does not support exporting external states.\");\n\n return this._store.onExportExternalState();\n }\n\n public importExternalState(state: any): void {\n if (!this._store.onLoadExternalState)\n throw new Error(\"Runtime does not support importing external states.\");\n\n // Re-arm the tracker so the next adapter snapshot (containing the\n // imported state) is treated as historical — no streamCall/execute\n // fires for the loaded tool calls. The adapter is expected to update\n // its messages in response to onLoadExternalState; that update flows\n // back here via __internal_setAdapter. We only clear adapter-side\n // tool statuses when the tracker is the source of truth — otherwise\n // we'd wipe statuses the adapter is managing on its own.\n if (this._toolInvocations) {\n this._toolInvocations.reset();\n this._store.setToolStatuses?.({});\n }\n\n this._store.onLoadExternalState(state);\n }\n\n public cancelRun(): void {\n if (!this._store.onCancel)\n throw new Error(\"Runtime does not support cancelling runs.\");\n\n // Abort any in-flight client-side tool executions. Fire-and-forget —\n // the abort resolves once executions settle, but we don't gate the\n // cancel on it.\n void this._toolInvocations?.abort();\n\n this._store.onCancel();\n\n if (this._assistantOptimisticId) {\n this.repository.deleteMessage(this._assistantOptimisticId);\n this._assistantOptimisticId = null;\n }\n\n let messages = this.repository.getMessages();\n const previousMessage = messages[messages.length - 1];\n if (\n previousMessage?.role === \"user\" &&\n previousMessage.id === messages.at(-1)?.id // ensure the previous message is a leaf node\n ) {\n this.repository.deleteMessage(previousMessage.id);\n this._lastSyncedMessageIds.delete(previousMessage.id);\n if (!this.composer.text.trim()) {\n this.composer.setText(getThreadMessageText(previousMessage));\n }\n\n messages = this.repository.getMessages();\n } else {\n this._notifySubscribers();\n }\n\n // resync messages (for reloading, to restore the previous branch)\n setTimeout(() => {\n this.updateMessages(messages);\n }, 0);\n }\n\n public addToolResult(options: AddToolResultOptions) {\n if (!this._store.onAddToolResult)\n throw new Error(\"Runtime does not support tool results.\");\n this._store.onAddToolResult?.(options);\n }\n\n public resumeToolCall(options: ResumeToolCallOptions) {\n // Tracker owns its own human-input handlers — let it resume in-process\n // tool calls without round-tripping through the adapter. Falls back to\n // the adapter's onResumeToolCall (if any) for tool calls the tracker\n // doesn't know about.\n const handled =\n this._toolInvocations?.resume(options.toolCallId, options.payload) ??\n false;\n if (handled) return;\n\n if (this._store.onResumeToolCall) {\n this._store.onResumeToolCall(options);\n return;\n }\n\n throw new Error(\n `Tool call ${options.toolCallId} is not waiting for resume.`,\n );\n }\n\n public respondToToolApproval(options: RespondToToolApprovalOptions) {\n if (!this._store.onRespondToToolApproval)\n throw new Error(\"Runtime does not support tool approvals.\");\n this._store.onRespondToToolApproval(options);\n }\n\n public override reset(initialMessages?: readonly ThreadMessageLike[]) {\n this._lastSyncedMessageIds = new Set();\n const repo = new MessageRepository();\n repo.import(ExportedMessageRepository.fromArray(initialMessages ?? []));\n this.updateMessages(repo.getMessages());\n }\n\n public override import(data: ExportedMessageRepository) {\n this._assistantOptimisticId = null;\n this._lastSyncedMessageIds = new Set();\n\n super.import(data);\n\n if (this._store.onImport) {\n this._store.onImport(this.repository.getMessages());\n }\n }\n\n private updateMessages = (messages: readonly ThreadMessage[]) => {\n const hasConverter = this._store.convertMessage !== undefined;\n if (hasConverter) {\n this._store.setMessages?.(messages.flatMap(getExternalStoreMessages));\n } else {\n // TODO mark this as readonly in v0.12.0\n this._store.setMessages?.(messages as ThreadMessage[]);\n }\n };\n}\n"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { DictationAdapter, SpeechSynthesisAdapter } from "../../adapters/speech.
5
5
  import { RealtimeVoiceAdapter } from "../../adapters/voice.js";
6
6
  import { ModelContextProvider } from "../../model-context/types.js";
7
7
  import { ChatModelAdapter } from "../../runtime/utils/chat-model-adapter.js";
8
- import { AddToolResultOptions, ResumeRunConfig, ResumeToolCallOptions, StartRunConfig, ThreadRuntimeCore, ThreadSuggestion } from "../../runtime/interfaces/thread-runtime-core.js";
8
+ import { AddToolResultOptions, RespondToToolApprovalOptions, ResumeRunConfig, ResumeToolCallOptions, StartRunConfig, ThreadRuntimeCore, ThreadSuggestion } from "../../runtime/interfaces/thread-runtime-core.js";
9
9
  import { SuggestionAdapter } from "../../adapters/suggestion.js";
10
10
  import { ThreadHistoryAdapter } from "../../adapters/thread-history.js";
11
11
  import { BaseThreadRuntimeCore } from "../../runtime/base/base-thread-runtime-core.js";
@@ -77,6 +77,7 @@ declare class LocalThreadRuntimeCore extends BaseThreadRuntimeCore implements Th
77
77
  artifact
78
78
  }: AddToolResultOptions): void;
79
79
  resumeToolCall(_options: ResumeToolCallOptions): void;
80
+ respondToToolApproval(_options: RespondToToolApprovalOptions): void;
80
81
  }
81
82
  //#endregion
82
83
  export { LocalThreadRuntimeCore };
@@ -1 +1 @@
1
- {"version":3,"file":"local-thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/local/local-thread-runtime-core.ts"],"mappings":";;;;;;;;;;;;;cAkCa,sBAAA,SACH,qBAAA,YACG,iBAAA;EAAA,SAEK,YAAA;;;;;;;;;;;;;;UAeR,eAAA;EAAA,SAEQ,UAAA;EAAA,SACA,cAAA;EAAA,QAER,UAAA;EAAA,IACG,SAAA,CAAA;EAAA,QAIH,YAAA;EAAA,QACA,sBAAA;EAAA,IACG,WAAA,CAAA,YAAwB,gBAAA;EAAA,IAIxB,QAAA,CAAA;;;;;;;;;;cAKT,eAAA,EAAiB,oBAAA,EACjB,OAAA,EAAS,uBAAA;EAAA,QAMH,QAAA;EAAA,QAEA,cAAA;EAAA,QAEA,YAAA;EAED,yBAAA,CAA0B,WAAA;EAAA,QAIzB,qBAAA;EAED,kCAAA,CACL,UAAA,QAAkB,OAAA;EAAA,IAKT,MAAA,CAAA;EAIJ,qBAAA,CAAsB,OAAA,EAAS,uBAAA;EAAA,QAwC9B,YAAA;EACD,eAAA,CAAA,GAAe,OAAA;EAuCT,MAAA,CAAO,OAAA,EAAS,aAAA,GAAgB,OAAA;EAgCtC,SAAA,CAAA;IAAY,MAAA;IAAA,GAAW;EAAA,GAAe,eAAA,GAAkB,OAAA;EAMxD,mBAAA,CAAA;EAIA,mBAAA,CAAA;EAIM,QAAA,CAAA;IACT,QAAA;IAAU;EAAA,GAAa,cAAA,EACzB,WAAA,GAAc,gBAAA,UACb,OAAA;EAAA,QAkEW,gBAAA;EAgLP,MAAA,CAAA;EAMA,SAAA,CAAA;EAMA,aAAA,CAAA;IACL,SAAA;IACA,UAAA;IACA,MAAA;IACA,OAAA;IACA;EAAA,GACC,oBAAA;EA0CI,cAAA,CAAe,QAAA,EAAU,qBAAA;AAAA"}
1
+ {"version":3,"file":"local-thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/local/local-thread-runtime-core.ts"],"mappings":";;;;;;;;;;;;;cAmCa,sBAAA,SACH,qBAAA,YACG,iBAAA;EAAA,SAEK,YAAA;;;;;;;;;;;;;;UAeR,eAAA;EAAA,SAEQ,UAAA;EAAA,SACA,cAAA;EAAA,QAER,UAAA;EAAA,IACG,SAAA,CAAA;EAAA,QAIH,YAAA;EAAA,QACA,sBAAA;EAAA,IACG,WAAA,CAAA,YAAwB,gBAAA;EAAA,IAIxB,QAAA,CAAA;;;;;;;;;;cAKT,eAAA,EAAiB,oBAAA,EACjB,OAAA,EAAS,uBAAA;EAAA,QAMH,QAAA;EAAA,QAEA,cAAA;EAAA,QAEA,YAAA;EAED,yBAAA,CAA0B,WAAA;EAAA,QAIzB,qBAAA;EAED,kCAAA,CACL,UAAA,QAAkB,OAAA;EAAA,IAKT,MAAA,CAAA;EAIJ,qBAAA,CAAsB,OAAA,EAAS,uBAAA;EAAA,QAwC9B,YAAA;EACD,eAAA,CAAA,GAAe,OAAA;EAuCT,MAAA,CAAO,OAAA,EAAS,aAAA,GAAgB,OAAA;EAgCtC,SAAA,CAAA;IAAY,MAAA;IAAA,GAAW;EAAA,GAAe,eAAA,GAAkB,OAAA;EAMxD,mBAAA,CAAA;EAIA,mBAAA,CAAA;EAIM,QAAA,CAAA;IACT,QAAA;IAAU;EAAA,GAAa,cAAA,EACzB,WAAA,GAAc,gBAAA,UACb,OAAA;EAAA,QAkEW,gBAAA;EAgLP,MAAA,CAAA;EAMA,SAAA,CAAA;EAMA,aAAA,CAAA;IACL,SAAA;IACA,UAAA;IACA,MAAA;IACA,OAAA;IACA;EAAA,GACC,oBAAA;EA0CI,cAAA,CAAe,QAAA,EAAU,qBAAA;EAIzB,qBAAA,CAAsB,QAAA,EAAU,4BAAA;AAAA"}
@@ -338,6 +338,9 @@ var LocalThreadRuntimeCore = class extends BaseThreadRuntimeCore {
338
338
  resumeToolCall(_options) {
339
339
  throw new Error("Local runtime does not support resuming tool calls.");
340
340
  }
341
+ respondToToolApproval(_options) {
342
+ throw new Error("Local runtime does not support tool approvals.");
343
+ }
341
344
  };
342
345
  //#endregion
343
346
  export { LocalThreadRuntimeCore };
@@ -1 +1 @@
1
- {"version":3,"file":"local-thread-runtime-core.js","names":[],"sources":["../../../src/runtimes/local/local-thread-runtime-core.ts"],"sourcesContent":["import { fromThreadMessageLike } from \"../../runtime/utils/thread-message-like\";\nimport { generateId } from \"../../utils/id\";\nimport type {\n ChatModelAdapter,\n ChatModelRunResult,\n} from \"../../runtime/utils/chat-model-adapter\";\nimport { shouldContinue } from \"./should-continue\";\nimport type { LocalRuntimeOptionsBase } from \"./local-runtime-options\";\nimport type {\n AddToolResultOptions,\n ResumeToolCallOptions,\n ThreadSuggestion,\n ThreadRuntimeCore,\n StartRunConfig,\n ResumeRunConfig,\n} from \"../../runtime/interfaces/thread-runtime-core\";\nimport { BaseThreadRuntimeCore } from \"../../runtime/base/base-thread-runtime-core\";\nimport type {\n AppendMessage,\n ThreadAssistantMessage,\n} from \"../../types/message\";\nimport type { RunConfig } from \"../../types/message\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\n\nclass AbortError extends Error {\n override name = \"AbortError\";\n detach: boolean;\n\n constructor(detach: boolean, message?: string) {\n super(message);\n this.detach = detach;\n }\n}\n\nexport class LocalThreadRuntimeCore\n extends BaseThreadRuntimeCore\n implements ThreadRuntimeCore\n{\n public readonly capabilities = {\n switchToBranch: true,\n switchBranchDuringRun: true,\n edit: true,\n reload: true,\n cancel: true,\n unstable_copy: true,\n speech: false,\n dictation: false,\n voice: false,\n attachments: false,\n feedback: false,\n queue: false,\n };\n\n private abortController: AbortController | null = null;\n\n public readonly isDisabled = false;\n public readonly isSendDisabled = false;\n\n private _isLoading = false;\n public get isLoading() {\n return this._isLoading;\n }\n\n private _suggestions: readonly ThreadSuggestion[] = [];\n private _suggestionsController: AbortController | null = null;\n public get suggestions(): readonly ThreadSuggestion[] {\n return this._suggestions;\n }\n\n public get adapters() {\n return this._options.adapters;\n }\n\n constructor(\n contextProvider: ModelContextProvider,\n options: LocalRuntimeOptionsBase,\n ) {\n super(contextProvider);\n this.__internal_setOptions(options);\n }\n\n private _options!: LocalRuntimeOptionsBase;\n\n private _lastRunConfig: RunConfig = {};\n\n private _getThreadId?: () => string | undefined;\n\n public __internal_setGetThreadId(getThreadId: () => string | undefined) {\n this._getThreadId = getThreadId;\n }\n\n private _getInitializePromise?: () => Promise<unknown> | undefined;\n\n public __internal_setGetInitializePromise(\n getPromise: () => Promise<unknown> | undefined,\n ) {\n this._getInitializePromise = getPromise;\n }\n\n public get extras() {\n return undefined;\n }\n\n public __internal_setOptions(options: LocalRuntimeOptionsBase) {\n if (this._options === options) return;\n\n this._options = options;\n\n let hasUpdates = false;\n\n const canSpeak = options.adapters?.speech !== undefined;\n if (this.capabilities.speech !== canSpeak) {\n this.capabilities.speech = canSpeak;\n hasUpdates = true;\n }\n\n const canDictate = options.adapters?.dictation !== undefined;\n if (this.capabilities.dictation !== canDictate) {\n this.capabilities.dictation = canDictate;\n hasUpdates = true;\n }\n\n const canVoice = options.adapters?.voice !== undefined;\n if (this.capabilities.voice !== canVoice) {\n this.capabilities.voice = canVoice;\n hasUpdates = true;\n }\n\n const canAttach = options.adapters?.attachments !== undefined;\n if (this.capabilities.attachments !== canAttach) {\n this.capabilities.attachments = canAttach;\n hasUpdates = true;\n }\n\n const canFeedback = options.adapters?.feedback !== undefined;\n if (this.capabilities.feedback !== canFeedback) {\n this.capabilities.feedback = canFeedback;\n hasUpdates = true;\n }\n\n if (hasUpdates) this._notifySubscribers();\n }\n\n private _loadPromise: Promise<void> | undefined;\n public __internal_load() {\n if (this._loadPromise) return this._loadPromise;\n\n const promise = this.adapters.history?.load() ?? Promise.resolve(null);\n\n this._isLoading = true;\n this._notifySubscribers();\n\n this._loadPromise = promise\n .then((repo) => {\n if (!repo) return;\n this.repository.import(repo);\n if (repo.messages.length > 0) {\n this.ensureInitialized();\n }\n this._notifySubscribers();\n\n const resume = this.adapters.history?.resume?.bind(\n this.adapters.history,\n );\n if (repo.unstable_resume && resume) {\n this.startRun(\n {\n parentId: this.repository.headId,\n sourceId: this.repository.headId,\n runConfig: this._lastRunConfig,\n },\n resume,\n ).catch(() => {});\n }\n })\n .finally(() => {\n this._isLoading = false;\n this._notifySubscribers();\n });\n\n return this._loadPromise;\n }\n\n public async append(message: AppendMessage): Promise<void> {\n this.ensureInitialized();\n\n const initPromise = this._getInitializePromise?.();\n if (initPromise) {\n await initPromise;\n }\n\n const newMessage = fromThreadMessageLike(message, generateId(), {\n type: \"complete\",\n reason: \"unknown\",\n });\n this.repository.addOrUpdateMessage(message.parentId, newMessage);\n this._options.adapters.history?.append({\n parentId: message.parentId,\n message: newMessage,\n ...(message.runConfig !== undefined && { runConfig: message.runConfig }),\n });\n\n const startRun = message.startRun ?? message.role === \"user\";\n if (startRun) {\n await this.startRun({\n parentId: newMessage.id,\n sourceId: message.sourceId,\n runConfig: message.runConfig ?? {},\n });\n } else {\n this.repository.resetHead(newMessage.id);\n this._notifySubscribers();\n }\n }\n\n public resumeRun({ stream, ...startConfig }: ResumeRunConfig): Promise<void> {\n if (!stream)\n throw new Error(\"You must pass a stream parameter to resume runs.\");\n return this.startRun(startConfig, stream);\n }\n\n public exportExternalState(): any {\n throw new Error(\"Runtime does not support exporting external states.\");\n }\n\n public importExternalState(): void {\n throw new Error(\"Runtime does not support importing external states.\");\n }\n\n public async startRun(\n { parentId, runConfig }: StartRunConfig,\n runCallback?: ChatModelAdapter[\"run\"],\n ): Promise<void> {\n this.ensureInitialized();\n\n // add assistant message\n const id = generateId();\n let message: ThreadAssistantMessage = {\n id,\n role: \"assistant\",\n status: { type: \"running\" },\n content: [],\n metadata: {\n unstable_state: this.state,\n unstable_annotations: [],\n unstable_data: [],\n steps: [],\n custom: {},\n },\n createdAt: new Date(),\n };\n\n this._notifyEventSubscribers(\"runStart\", {});\n\n try {\n this._suggestions = [];\n this._suggestionsController?.abort();\n this._suggestionsController = null;\n this._notifySubscribers();\n\n do {\n message = await this.performRoundtrip(\n parentId,\n message,\n runConfig,\n runCallback,\n );\n runCallback = undefined;\n } while (shouldContinue(message, this._options.unstable_humanToolNames));\n } finally {\n this._notifyEventSubscribers(\"runEnd\", {});\n }\n\n this._suggestionsController = new AbortController();\n const signal = this._suggestionsController.signal;\n if (\n this.adapters.suggestion &&\n message.status?.type !== \"requires-action\"\n ) {\n const promiseOrGenerator = this.adapters.suggestion?.generate({\n messages: this.messages,\n });\n\n if (Symbol.asyncIterator in promiseOrGenerator) {\n for await (const r of promiseOrGenerator) {\n if (signal.aborted) break;\n this._suggestions = r;\n this._notifySubscribers();\n }\n } else {\n const result = await promiseOrGenerator;\n if (signal.aborted) return;\n this._suggestions = result;\n this._notifySubscribers();\n }\n }\n }\n\n private async performRoundtrip(\n parentId: string | null,\n message: ThreadAssistantMessage,\n runConfig: RunConfig | undefined,\n runCallback?: ChatModelAdapter[\"run\"],\n ) {\n const messages = parentId ? this.repository.getMessages(parentId) : [];\n\n // abort existing run\n this.abortController?.abort();\n this.abortController = new AbortController();\n\n const initialContent = message.content;\n const initialAnnotations = message.metadata?.unstable_annotations;\n const initialData = message.metadata?.unstable_data;\n const initialSteps = message.metadata?.steps;\n const initialCustom = message.metadata?.custom;\n const updateMessage = (m: Partial<ChatModelRunResult>) => {\n const newSteps = m.metadata?.steps;\n const steps = newSteps\n ? [...(initialSteps ?? []), ...newSteps]\n : undefined;\n\n const newAnnotations = m.metadata?.unstable_annotations;\n const newData = m.metadata?.unstable_data;\n const annotations = newAnnotations\n ? [...(initialAnnotations ?? []), ...newAnnotations]\n : undefined;\n const data = newData ? [...(initialData ?? []), ...newData] : undefined;\n\n message = {\n ...message,\n ...(m.content\n ? { content: [...initialContent, ...(m.content ?? [])] }\n : undefined),\n status: m.status ?? message.status,\n ...(m.metadata\n ? {\n metadata: {\n ...message.metadata,\n ...(m.metadata.unstable_state\n ? { unstable_state: m.metadata.unstable_state }\n : undefined),\n ...(annotations\n ? { unstable_annotations: annotations }\n : undefined),\n ...(data ? { unstable_data: data } : undefined),\n ...(steps ? { steps } : undefined),\n ...(m.metadata?.timing\n ? { timing: m.metadata.timing }\n : undefined),\n ...(m.metadata?.custom\n ? {\n custom: {\n ...(initialCustom ?? {}),\n ...m.metadata.custom,\n },\n }\n : undefined),\n },\n }\n : undefined),\n };\n this.repository.addOrUpdateMessage(parentId, message);\n this._notifySubscribers();\n };\n\n const maxSteps = this._options.maxSteps ?? 2;\n\n const steps = message.metadata?.steps?.length ?? 0;\n if (steps >= maxSteps) {\n // reached max tool steps\n updateMessage({\n status: {\n type: \"incomplete\",\n reason: \"tool-calls\",\n },\n });\n return message;\n } else {\n updateMessage({\n status: {\n type: \"running\",\n },\n });\n\n // Switch to the new message branch right after adding it for the first time\n this.repository.resetHead(message.id);\n this._notifySubscribers();\n }\n\n try {\n this._lastRunConfig = runConfig ?? {};\n const context = this.getModelContext();\n\n runCallback =\n runCallback ??\n this.adapters.chatModel.run.bind(this.adapters.chatModel);\n\n const abortSignal = this.abortController.signal;\n const threadId = this._getThreadId?.();\n const promiseOrGenerator = runCallback({\n messages,\n runConfig: this._lastRunConfig,\n abortSignal,\n context,\n unstable_assistantMessageId: message.id,\n unstable_threadId: threadId,\n unstable_parentId: parentId,\n unstable_getMessage() {\n return message;\n },\n });\n\n // handle async iterator for streaming results\n if (Symbol.asyncIterator in promiseOrGenerator) {\n for await (const r of promiseOrGenerator) {\n if (abortSignal.aborted) {\n updateMessage({\n status: { type: \"incomplete\", reason: \"cancelled\" },\n });\n break;\n }\n\n updateMessage(r);\n }\n } else {\n updateMessage(await promiseOrGenerator);\n }\n\n if (message.status.type === \"running\") {\n updateMessage({\n status: { type: \"complete\", reason: \"unknown\" },\n });\n }\n } catch (e) {\n // TODO this should be handled by the run result stream\n if (e instanceof AbortError) {\n updateMessage({\n status: { type: \"incomplete\", reason: \"cancelled\" },\n });\n } else if (e instanceof Error && e.name === \"AbortError\") {\n updateMessage({\n status: { type: \"incomplete\", reason: \"cancelled\" },\n });\n } else {\n updateMessage({\n status: {\n type: \"incomplete\",\n reason: \"error\",\n error:\n e instanceof Error\n ? e.message\n : `[${typeof e}] ${new String(e).toString()}`,\n },\n });\n\n throw e;\n }\n } finally {\n this.abortController = null;\n\n if (\n message.status.type === \"complete\" ||\n message.status.type === \"incomplete\"\n ) {\n await this._options.adapters.history?.append({\n parentId,\n message: message,\n runConfig: this._lastRunConfig,\n });\n }\n }\n return message;\n }\n\n public detach() {\n const error = new AbortError(true);\n this.abortController?.abort(error);\n this.abortController = null;\n }\n\n public cancelRun() {\n const error = new AbortError(false);\n this.abortController?.abort(error);\n this.abortController = null;\n }\n\n public addToolResult({\n messageId,\n toolCallId,\n result,\n isError,\n artifact,\n }: AddToolResultOptions) {\n const messageData = this.repository.getMessage(messageId);\n const { parentId } = messageData;\n let { message } = messageData;\n\n if (message.role !== \"assistant\")\n throw new Error(\"Tried to add tool result to non-assistant message\");\n\n let added = false;\n let found = false;\n const newContent = message.content.map((c) => {\n if (c.type !== \"tool-call\") return c;\n if (c.toolCallId !== toolCallId) return c;\n found = true;\n if (!c.result) added = true;\n return {\n ...c,\n result,\n artifact,\n isError,\n };\n });\n\n if (!found)\n throw new Error(\"Tried to add tool result to non-existing tool call\");\n\n message = {\n ...message,\n content: newContent,\n };\n this.repository.addOrUpdateMessage(parentId, message);\n\n if (\n added &&\n shouldContinue(message, this._options.unstable_humanToolNames)\n ) {\n this.performRoundtrip(parentId, message, this._lastRunConfig).catch(\n () => {},\n );\n }\n }\n\n public resumeToolCall(_options: ResumeToolCallOptions) {\n throw new Error(\"Local runtime does not support resuming tool calls.\");\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"local-thread-runtime-core.js","names":[],"sources":["../../../src/runtimes/local/local-thread-runtime-core.ts"],"sourcesContent":["import { fromThreadMessageLike } from \"../../runtime/utils/thread-message-like\";\nimport { generateId } from \"../../utils/id\";\nimport type {\n ChatModelAdapter,\n ChatModelRunResult,\n} from \"../../runtime/utils/chat-model-adapter\";\nimport { shouldContinue } from \"./should-continue\";\nimport type { LocalRuntimeOptionsBase } from \"./local-runtime-options\";\nimport type {\n AddToolResultOptions,\n ResumeToolCallOptions,\n RespondToToolApprovalOptions,\n ThreadSuggestion,\n ThreadRuntimeCore,\n StartRunConfig,\n ResumeRunConfig,\n} from \"../../runtime/interfaces/thread-runtime-core\";\nimport { BaseThreadRuntimeCore } from \"../../runtime/base/base-thread-runtime-core\";\nimport type {\n AppendMessage,\n ThreadAssistantMessage,\n} from \"../../types/message\";\nimport type { RunConfig } from \"../../types/message\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\n\nclass AbortError extends Error {\n override name = \"AbortError\";\n detach: boolean;\n\n constructor(detach: boolean, message?: string) {\n super(message);\n this.detach = detach;\n }\n}\n\nexport class LocalThreadRuntimeCore\n extends BaseThreadRuntimeCore\n implements ThreadRuntimeCore\n{\n public readonly capabilities = {\n switchToBranch: true,\n switchBranchDuringRun: true,\n edit: true,\n reload: true,\n cancel: true,\n unstable_copy: true,\n speech: false,\n dictation: false,\n voice: false,\n attachments: false,\n feedback: false,\n queue: false,\n };\n\n private abortController: AbortController | null = null;\n\n public readonly isDisabled = false;\n public readonly isSendDisabled = false;\n\n private _isLoading = false;\n public get isLoading() {\n return this._isLoading;\n }\n\n private _suggestions: readonly ThreadSuggestion[] = [];\n private _suggestionsController: AbortController | null = null;\n public get suggestions(): readonly ThreadSuggestion[] {\n return this._suggestions;\n }\n\n public get adapters() {\n return this._options.adapters;\n }\n\n constructor(\n contextProvider: ModelContextProvider,\n options: LocalRuntimeOptionsBase,\n ) {\n super(contextProvider);\n this.__internal_setOptions(options);\n }\n\n private _options!: LocalRuntimeOptionsBase;\n\n private _lastRunConfig: RunConfig = {};\n\n private _getThreadId?: () => string | undefined;\n\n public __internal_setGetThreadId(getThreadId: () => string | undefined) {\n this._getThreadId = getThreadId;\n }\n\n private _getInitializePromise?: () => Promise<unknown> | undefined;\n\n public __internal_setGetInitializePromise(\n getPromise: () => Promise<unknown> | undefined,\n ) {\n this._getInitializePromise = getPromise;\n }\n\n public get extras() {\n return undefined;\n }\n\n public __internal_setOptions(options: LocalRuntimeOptionsBase) {\n if (this._options === options) return;\n\n this._options = options;\n\n let hasUpdates = false;\n\n const canSpeak = options.adapters?.speech !== undefined;\n if (this.capabilities.speech !== canSpeak) {\n this.capabilities.speech = canSpeak;\n hasUpdates = true;\n }\n\n const canDictate = options.adapters?.dictation !== undefined;\n if (this.capabilities.dictation !== canDictate) {\n this.capabilities.dictation = canDictate;\n hasUpdates = true;\n }\n\n const canVoice = options.adapters?.voice !== undefined;\n if (this.capabilities.voice !== canVoice) {\n this.capabilities.voice = canVoice;\n hasUpdates = true;\n }\n\n const canAttach = options.adapters?.attachments !== undefined;\n if (this.capabilities.attachments !== canAttach) {\n this.capabilities.attachments = canAttach;\n hasUpdates = true;\n }\n\n const canFeedback = options.adapters?.feedback !== undefined;\n if (this.capabilities.feedback !== canFeedback) {\n this.capabilities.feedback = canFeedback;\n hasUpdates = true;\n }\n\n if (hasUpdates) this._notifySubscribers();\n }\n\n private _loadPromise: Promise<void> | undefined;\n public __internal_load() {\n if (this._loadPromise) return this._loadPromise;\n\n const promise = this.adapters.history?.load() ?? Promise.resolve(null);\n\n this._isLoading = true;\n this._notifySubscribers();\n\n this._loadPromise = promise\n .then((repo) => {\n if (!repo) return;\n this.repository.import(repo);\n if (repo.messages.length > 0) {\n this.ensureInitialized();\n }\n this._notifySubscribers();\n\n const resume = this.adapters.history?.resume?.bind(\n this.adapters.history,\n );\n if (repo.unstable_resume && resume) {\n this.startRun(\n {\n parentId: this.repository.headId,\n sourceId: this.repository.headId,\n runConfig: this._lastRunConfig,\n },\n resume,\n ).catch(() => {});\n }\n })\n .finally(() => {\n this._isLoading = false;\n this._notifySubscribers();\n });\n\n return this._loadPromise;\n }\n\n public async append(message: AppendMessage): Promise<void> {\n this.ensureInitialized();\n\n const initPromise = this._getInitializePromise?.();\n if (initPromise) {\n await initPromise;\n }\n\n const newMessage = fromThreadMessageLike(message, generateId(), {\n type: \"complete\",\n reason: \"unknown\",\n });\n this.repository.addOrUpdateMessage(message.parentId, newMessage);\n this._options.adapters.history?.append({\n parentId: message.parentId,\n message: newMessage,\n ...(message.runConfig !== undefined && { runConfig: message.runConfig }),\n });\n\n const startRun = message.startRun ?? message.role === \"user\";\n if (startRun) {\n await this.startRun({\n parentId: newMessage.id,\n sourceId: message.sourceId,\n runConfig: message.runConfig ?? {},\n });\n } else {\n this.repository.resetHead(newMessage.id);\n this._notifySubscribers();\n }\n }\n\n public resumeRun({ stream, ...startConfig }: ResumeRunConfig): Promise<void> {\n if (!stream)\n throw new Error(\"You must pass a stream parameter to resume runs.\");\n return this.startRun(startConfig, stream);\n }\n\n public exportExternalState(): any {\n throw new Error(\"Runtime does not support exporting external states.\");\n }\n\n public importExternalState(): void {\n throw new Error(\"Runtime does not support importing external states.\");\n }\n\n public async startRun(\n { parentId, runConfig }: StartRunConfig,\n runCallback?: ChatModelAdapter[\"run\"],\n ): Promise<void> {\n this.ensureInitialized();\n\n // add assistant message\n const id = generateId();\n let message: ThreadAssistantMessage = {\n id,\n role: \"assistant\",\n status: { type: \"running\" },\n content: [],\n metadata: {\n unstable_state: this.state,\n unstable_annotations: [],\n unstable_data: [],\n steps: [],\n custom: {},\n },\n createdAt: new Date(),\n };\n\n this._notifyEventSubscribers(\"runStart\", {});\n\n try {\n this._suggestions = [];\n this._suggestionsController?.abort();\n this._suggestionsController = null;\n this._notifySubscribers();\n\n do {\n message = await this.performRoundtrip(\n parentId,\n message,\n runConfig,\n runCallback,\n );\n runCallback = undefined;\n } while (shouldContinue(message, this._options.unstable_humanToolNames));\n } finally {\n this._notifyEventSubscribers(\"runEnd\", {});\n }\n\n this._suggestionsController = new AbortController();\n const signal = this._suggestionsController.signal;\n if (\n this.adapters.suggestion &&\n message.status?.type !== \"requires-action\"\n ) {\n const promiseOrGenerator = this.adapters.suggestion?.generate({\n messages: this.messages,\n });\n\n if (Symbol.asyncIterator in promiseOrGenerator) {\n for await (const r of promiseOrGenerator) {\n if (signal.aborted) break;\n this._suggestions = r;\n this._notifySubscribers();\n }\n } else {\n const result = await promiseOrGenerator;\n if (signal.aborted) return;\n this._suggestions = result;\n this._notifySubscribers();\n }\n }\n }\n\n private async performRoundtrip(\n parentId: string | null,\n message: ThreadAssistantMessage,\n runConfig: RunConfig | undefined,\n runCallback?: ChatModelAdapter[\"run\"],\n ) {\n const messages = parentId ? this.repository.getMessages(parentId) : [];\n\n // abort existing run\n this.abortController?.abort();\n this.abortController = new AbortController();\n\n const initialContent = message.content;\n const initialAnnotations = message.metadata?.unstable_annotations;\n const initialData = message.metadata?.unstable_data;\n const initialSteps = message.metadata?.steps;\n const initialCustom = message.metadata?.custom;\n const updateMessage = (m: Partial<ChatModelRunResult>) => {\n const newSteps = m.metadata?.steps;\n const steps = newSteps\n ? [...(initialSteps ?? []), ...newSteps]\n : undefined;\n\n const newAnnotations = m.metadata?.unstable_annotations;\n const newData = m.metadata?.unstable_data;\n const annotations = newAnnotations\n ? [...(initialAnnotations ?? []), ...newAnnotations]\n : undefined;\n const data = newData ? [...(initialData ?? []), ...newData] : undefined;\n\n message = {\n ...message,\n ...(m.content\n ? { content: [...initialContent, ...(m.content ?? [])] }\n : undefined),\n status: m.status ?? message.status,\n ...(m.metadata\n ? {\n metadata: {\n ...message.metadata,\n ...(m.metadata.unstable_state\n ? { unstable_state: m.metadata.unstable_state }\n : undefined),\n ...(annotations\n ? { unstable_annotations: annotations }\n : undefined),\n ...(data ? { unstable_data: data } : undefined),\n ...(steps ? { steps } : undefined),\n ...(m.metadata?.timing\n ? { timing: m.metadata.timing }\n : undefined),\n ...(m.metadata?.custom\n ? {\n custom: {\n ...(initialCustom ?? {}),\n ...m.metadata.custom,\n },\n }\n : undefined),\n },\n }\n : undefined),\n };\n this.repository.addOrUpdateMessage(parentId, message);\n this._notifySubscribers();\n };\n\n const maxSteps = this._options.maxSteps ?? 2;\n\n const steps = message.metadata?.steps?.length ?? 0;\n if (steps >= maxSteps) {\n // reached max tool steps\n updateMessage({\n status: {\n type: \"incomplete\",\n reason: \"tool-calls\",\n },\n });\n return message;\n } else {\n updateMessage({\n status: {\n type: \"running\",\n },\n });\n\n // Switch to the new message branch right after adding it for the first time\n this.repository.resetHead(message.id);\n this._notifySubscribers();\n }\n\n try {\n this._lastRunConfig = runConfig ?? {};\n const context = this.getModelContext();\n\n runCallback =\n runCallback ??\n this.adapters.chatModel.run.bind(this.adapters.chatModel);\n\n const abortSignal = this.abortController.signal;\n const threadId = this._getThreadId?.();\n const promiseOrGenerator = runCallback({\n messages,\n runConfig: this._lastRunConfig,\n abortSignal,\n context,\n unstable_assistantMessageId: message.id,\n unstable_threadId: threadId,\n unstable_parentId: parentId,\n unstable_getMessage() {\n return message;\n },\n });\n\n // handle async iterator for streaming results\n if (Symbol.asyncIterator in promiseOrGenerator) {\n for await (const r of promiseOrGenerator) {\n if (abortSignal.aborted) {\n updateMessage({\n status: { type: \"incomplete\", reason: \"cancelled\" },\n });\n break;\n }\n\n updateMessage(r);\n }\n } else {\n updateMessage(await promiseOrGenerator);\n }\n\n if (message.status.type === \"running\") {\n updateMessage({\n status: { type: \"complete\", reason: \"unknown\" },\n });\n }\n } catch (e) {\n // TODO this should be handled by the run result stream\n if (e instanceof AbortError) {\n updateMessage({\n status: { type: \"incomplete\", reason: \"cancelled\" },\n });\n } else if (e instanceof Error && e.name === \"AbortError\") {\n updateMessage({\n status: { type: \"incomplete\", reason: \"cancelled\" },\n });\n } else {\n updateMessage({\n status: {\n type: \"incomplete\",\n reason: \"error\",\n error:\n e instanceof Error\n ? e.message\n : `[${typeof e}] ${new String(e).toString()}`,\n },\n });\n\n throw e;\n }\n } finally {\n this.abortController = null;\n\n if (\n message.status.type === \"complete\" ||\n message.status.type === \"incomplete\"\n ) {\n await this._options.adapters.history?.append({\n parentId,\n message: message,\n runConfig: this._lastRunConfig,\n });\n }\n }\n return message;\n }\n\n public detach() {\n const error = new AbortError(true);\n this.abortController?.abort(error);\n this.abortController = null;\n }\n\n public cancelRun() {\n const error = new AbortError(false);\n this.abortController?.abort(error);\n this.abortController = null;\n }\n\n public addToolResult({\n messageId,\n toolCallId,\n result,\n isError,\n artifact,\n }: AddToolResultOptions) {\n const messageData = this.repository.getMessage(messageId);\n const { parentId } = messageData;\n let { message } = messageData;\n\n if (message.role !== \"assistant\")\n throw new Error(\"Tried to add tool result to non-assistant message\");\n\n let added = false;\n let found = false;\n const newContent = message.content.map((c) => {\n if (c.type !== \"tool-call\") return c;\n if (c.toolCallId !== toolCallId) return c;\n found = true;\n if (!c.result) added = true;\n return {\n ...c,\n result,\n artifact,\n isError,\n };\n });\n\n if (!found)\n throw new Error(\"Tried to add tool result to non-existing tool call\");\n\n message = {\n ...message,\n content: newContent,\n };\n this.repository.addOrUpdateMessage(parentId, message);\n\n if (\n added &&\n shouldContinue(message, this._options.unstable_humanToolNames)\n ) {\n this.performRoundtrip(parentId, message, this._lastRunConfig).catch(\n () => {},\n );\n }\n }\n\n public resumeToolCall(_options: ResumeToolCallOptions) {\n throw new Error(\"Local runtime does not support resuming tool calls.\");\n }\n\n public respondToToolApproval(_options: RespondToToolApprovalOptions) {\n throw new Error(\"Local runtime does not support tool approvals.\");\n }\n}\n"],"mappings":";;;;;AAyBA,IAAM,aAAN,cAAyB,MAAM;CAC7B,OAAgB;CAChB;CAEA,YAAY,QAAiB,SAAkB;EAC7C,MAAM,OAAO;EACb,KAAK,SAAS;CAChB;AACF;AAEA,IAAa,yBAAb,cACU,sBAEV;CACE,eAA+B;EAC7B,gBAAgB;EAChB,uBAAuB;EACvB,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,eAAe;EACf,QAAQ;EACR,WAAW;EACX,OAAO;EACP,aAAa;EACb,UAAU;EACV,OAAO;CACT;CAEA,kBAAkD;CAElD,aAA6B;CAC7B,iBAAiC;CAEjC,aAAqB;CACrB,IAAW,YAAY;EACrB,OAAO,KAAK;CACd;CAEA,eAAoD,CAAC;CACrD,yBAAyD;CACzD,IAAW,cAA2C;EACpD,OAAO,KAAK;CACd;CAEA,IAAW,WAAW;EACpB,OAAO,KAAK,SAAS;CACvB;CAEA,YACE,iBACA,SACA;EACA,MAAM,eAAe;EACrB,KAAK,sBAAsB,OAAO;CACpC;CAEA;CAEA,iBAAoC,CAAC;CAErC;CAEA,0BAAiC,aAAuC;EACtE,KAAK,eAAe;CACtB;CAEA;CAEA,mCACE,YACA;EACA,KAAK,wBAAwB;CAC/B;CAEA,IAAW,SAAS,CAEpB;CAEA,sBAA6B,SAAkC;EAC7D,IAAI,KAAK,aAAa,SAAS;EAE/B,KAAK,WAAW;EAEhB,IAAI,aAAa;EAEjB,MAAM,WAAW,QAAQ,UAAU,WAAW,KAAA;EAC9C,IAAI,KAAK,aAAa,WAAW,UAAU;GACzC,KAAK,aAAa,SAAS;GAC3B,aAAa;EACf;EAEA,MAAM,aAAa,QAAQ,UAAU,cAAc,KAAA;EACnD,IAAI,KAAK,aAAa,cAAc,YAAY;GAC9C,KAAK,aAAa,YAAY;GAC9B,aAAa;EACf;EAEA,MAAM,WAAW,QAAQ,UAAU,UAAU,KAAA;EAC7C,IAAI,KAAK,aAAa,UAAU,UAAU;GACxC,KAAK,aAAa,QAAQ;GAC1B,aAAa;EACf;EAEA,MAAM,YAAY,QAAQ,UAAU,gBAAgB,KAAA;EACpD,IAAI,KAAK,aAAa,gBAAgB,WAAW;GAC/C,KAAK,aAAa,cAAc;GAChC,aAAa;EACf;EAEA,MAAM,cAAc,QAAQ,UAAU,aAAa,KAAA;EACnD,IAAI,KAAK,aAAa,aAAa,aAAa;GAC9C,KAAK,aAAa,WAAW;GAC7B,aAAa;EACf;EAEA,IAAI,YAAY,KAAK,mBAAmB;CAC1C;CAEA;CACA,kBAAyB;EACvB,IAAI,KAAK,cAAc,OAAO,KAAK;EAEnC,MAAM,UAAU,KAAK,SAAS,SAAS,KAAK,KAAK,QAAQ,QAAQ,IAAI;EAErE,KAAK,aAAa;EAClB,KAAK,mBAAmB;EAExB,KAAK,eAAe,QACjB,MAAM,SAAS;GACd,IAAI,CAAC,MAAM;GACX,KAAK,WAAW,OAAO,IAAI;GAC3B,IAAI,KAAK,SAAS,SAAS,GACzB,KAAK,kBAAkB;GAEzB,KAAK,mBAAmB;GAExB,MAAM,SAAS,KAAK,SAAS,SAAS,QAAQ,KAC5C,KAAK,SAAS,OAChB;GACA,IAAI,KAAK,mBAAmB,QAC1B,KAAK,SACH;IACE,UAAU,KAAK,WAAW;IAC1B,UAAU,KAAK,WAAW;IAC1B,WAAW,KAAK;GAClB,GACA,MACF,EAAE,YAAY,CAAC,CAAC;EAEpB,CAAC,EACA,cAAc;GACb,KAAK,aAAa;GAClB,KAAK,mBAAmB;EAC1B,CAAC;EAEH,OAAO,KAAK;CACd;CAEA,MAAa,OAAO,SAAuC;EACzD,KAAK,kBAAkB;EAEvB,MAAM,cAAc,KAAK,wBAAwB;EACjD,IAAI,aACF,MAAM;EAGR,MAAM,aAAa,sBAAsB,SAAS,WAAW,GAAG;GAC9D,MAAM;GACN,QAAQ;EACV,CAAC;EACD,KAAK,WAAW,mBAAmB,QAAQ,UAAU,UAAU;EAC/D,KAAK,SAAS,SAAS,SAAS,OAAO;GACrC,UAAU,QAAQ;GAClB,SAAS;GACT,GAAI,QAAQ,cAAc,KAAA,KAAa,EAAE,WAAW,QAAQ,UAAU;EACxE,CAAC;EAGD,IADiB,QAAQ,YAAY,QAAQ,SAAS,QAEpD,MAAM,KAAK,SAAS;GAClB,UAAU,WAAW;GACrB,UAAU,QAAQ;GAClB,WAAW,QAAQ,aAAa,CAAC;EACnC,CAAC;OACI;GACL,KAAK,WAAW,UAAU,WAAW,EAAE;GACvC,KAAK,mBAAmB;EAC1B;CACF;CAEA,UAAiB,EAAE,QAAQ,GAAG,eAA+C;EAC3E,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,kDAAkD;EACpE,OAAO,KAAK,SAAS,aAAa,MAAM;CAC1C;CAEA,sBAAkC;EAChC,MAAM,IAAI,MAAM,qDAAqD;CACvE;CAEA,sBAAmC;EACjC,MAAM,IAAI,MAAM,qDAAqD;CACvE;CAEA,MAAa,SACX,EAAE,UAAU,aACZ,aACe;EACf,KAAK,kBAAkB;EAIvB,IAAI,UAAkC;GACpC,IAFS,WAER;GACD,MAAM;GACN,QAAQ,EAAE,MAAM,UAAU;GAC1B,SAAS,CAAC;GACV,UAAU;IACR,gBAAgB,KAAK;IACrB,sBAAsB,CAAC;IACvB,eAAe,CAAC;IAChB,OAAO,CAAC;IACR,QAAQ,CAAC;GACX;GACA,2BAAW,IAAI,KAAK;EACtB;EAEA,KAAK,wBAAwB,YAAY,CAAC,CAAC;EAE3C,IAAI;GACF,KAAK,eAAe,CAAC;GACrB,KAAK,wBAAwB,MAAM;GACnC,KAAK,yBAAyB;GAC9B,KAAK,mBAAmB;GAExB,GAAG;IACD,UAAU,MAAM,KAAK,iBACnB,UACA,SACA,WACA,WACF;IACA,cAAc,KAAA;GAChB,SAAS,eAAe,SAAS,KAAK,SAAS,uBAAuB;EACxE,UAAU;GACR,KAAK,wBAAwB,UAAU,CAAC,CAAC;EAC3C;EAEA,KAAK,yBAAyB,IAAI,gBAAgB;EAClD,MAAM,SAAS,KAAK,uBAAuB;EAC3C,IACE,KAAK,SAAS,cACd,QAAQ,QAAQ,SAAS,mBACzB;GACA,MAAM,qBAAqB,KAAK,SAAS,YAAY,SAAS,EAC5D,UAAU,KAAK,SACjB,CAAC;GAED,IAAI,OAAO,iBAAiB,oBAC1B,WAAW,MAAM,KAAK,oBAAoB;IACxC,IAAI,OAAO,SAAS;IACpB,KAAK,eAAe;IACpB,KAAK,mBAAmB;GAC1B;QACK;IACL,MAAM,SAAS,MAAM;IACrB,IAAI,OAAO,SAAS;IACpB,KAAK,eAAe;IACpB,KAAK,mBAAmB;GAC1B;EACF;CACF;CAEA,MAAc,iBACZ,UACA,SACA,WACA,aACA;EACA,MAAM,WAAW,WAAW,KAAK,WAAW,YAAY,QAAQ,IAAI,CAAC;EAGrE,KAAK,iBAAiB,MAAM;EAC5B,KAAK,kBAAkB,IAAI,gBAAgB;EAE3C,MAAM,iBAAiB,QAAQ;EAC/B,MAAM,qBAAqB,QAAQ,UAAU;EAC7C,MAAM,cAAc,QAAQ,UAAU;EACtC,MAAM,eAAe,QAAQ,UAAU;EACvC,MAAM,gBAAgB,QAAQ,UAAU;EACxC,MAAM,iBAAiB,MAAmC;GACxD,MAAM,WAAW,EAAE,UAAU;GAC7B,MAAM,QAAQ,WACV,CAAC,GAAI,gBAAgB,CAAC,GAAI,GAAG,QAAQ,IACrC,KAAA;GAEJ,MAAM,iBAAiB,EAAE,UAAU;GACnC,MAAM,UAAU,EAAE,UAAU;GAC5B,MAAM,cAAc,iBAChB,CAAC,GAAI,sBAAsB,CAAC,GAAI,GAAG,cAAc,IACjD,KAAA;GACJ,MAAM,OAAO,UAAU,CAAC,GAAI,eAAe,CAAC,GAAI,GAAG,OAAO,IAAI,KAAA;GAE9D,UAAU;IACR,GAAG;IACH,GAAI,EAAE,UACF,EAAE,SAAS,CAAC,GAAG,gBAAgB,GAAI,EAAE,WAAW,CAAC,CAAE,EAAE,IACrD,KAAA;IACJ,QAAQ,EAAE,UAAU,QAAQ;IAC5B,GAAI,EAAE,WACF,EACE,UAAU;KACR,GAAG,QAAQ;KACX,GAAI,EAAE,SAAS,iBACX,EAAE,gBAAgB,EAAE,SAAS,eAAe,IAC5C,KAAA;KACJ,GAAI,cACA,EAAE,sBAAsB,YAAY,IACpC,KAAA;KACJ,GAAI,OAAO,EAAE,eAAe,KAAK,IAAI,KAAA;KACrC,GAAI,QAAQ,EAAE,MAAM,IAAI,KAAA;KACxB,GAAI,EAAE,UAAU,SACZ,EAAE,QAAQ,EAAE,SAAS,OAAO,IAC5B,KAAA;KACJ,GAAI,EAAE,UAAU,SACZ,EACE,QAAQ;MACN,GAAI,iBAAiB,CAAC;MACtB,GAAG,EAAE,SAAS;KAChB,EACF,IACA,KAAA;IACN,EACF,IACA,KAAA;GACN;GACA,KAAK,WAAW,mBAAmB,UAAU,OAAO;GACpD,KAAK,mBAAmB;EAC1B;EAEA,MAAM,WAAW,KAAK,SAAS,YAAY;EAG3C,KADc,QAAQ,UAAU,OAAO,UAAU,MACpC,UAAU;GAErB,cAAc,EACZ,QAAQ;IACN,MAAM;IACN,QAAQ;GACV,EACF,CAAC;GACD,OAAO;EACT,OAAO;GACL,cAAc,EACZ,QAAQ,EACN,MAAM,UACR,EACF,CAAC;GAGD,KAAK,WAAW,UAAU,QAAQ,EAAE;GACpC,KAAK,mBAAmB;EAC1B;EAEA,IAAI;GACF,KAAK,iBAAiB,aAAa,CAAC;GACpC,MAAM,UAAU,KAAK,gBAAgB;GAErC,cACE,eACA,KAAK,SAAS,UAAU,IAAI,KAAK,KAAK,SAAS,SAAS;GAE1D,MAAM,cAAc,KAAK,gBAAgB;GACzC,MAAM,WAAW,KAAK,eAAe;GACrC,MAAM,qBAAqB,YAAY;IACrC;IACA,WAAW,KAAK;IAChB;IACA;IACA,6BAA6B,QAAQ;IACrC,mBAAmB;IACnB,mBAAmB;IACnB,sBAAsB;KACpB,OAAO;IACT;GACF,CAAC;GAGD,IAAI,OAAO,iBAAiB,oBAC1B,WAAW,MAAM,KAAK,oBAAoB;IACxC,IAAI,YAAY,SAAS;KACvB,cAAc,EACZ,QAAQ;MAAE,MAAM;MAAc,QAAQ;KAAY,EACpD,CAAC;KACD;IACF;IAEA,cAAc,CAAC;GACjB;QAEA,cAAc,MAAM,kBAAkB;GAGxC,IAAI,QAAQ,OAAO,SAAS,WAC1B,cAAc,EACZ,QAAQ;IAAE,MAAM;IAAY,QAAQ;GAAU,EAChD,CAAC;EAEL,SAAS,GAAG;GAEV,IAAI,aAAa,YACf,cAAc,EACZ,QAAQ;IAAE,MAAM;IAAc,QAAQ;GAAY,EACpD,CAAC;QACI,IAAI,aAAa,SAAS,EAAE,SAAS,cAC1C,cAAc,EACZ,QAAQ;IAAE,MAAM;IAAc,QAAQ;GAAY,EACpD,CAAC;QACI;IACL,cAAc,EACZ,QAAQ;KACN,MAAM;KACN,QAAQ;KACR,OACE,aAAa,QACT,EAAE,UACF,IAAI,OAAO,EAAE,IAAI,IAAI,OAAO,CAAC,EAAE,SAAS;IAChD,EACF,CAAC;IAED,MAAM;GACR;EACF,UAAU;GACR,KAAK,kBAAkB;GAEvB,IACE,QAAQ,OAAO,SAAS,cACxB,QAAQ,OAAO,SAAS,cAExB,MAAM,KAAK,SAAS,SAAS,SAAS,OAAO;IAC3C;IACS;IACT,WAAW,KAAK;GAClB,CAAC;EAEL;EACA,OAAO;CACT;CAEA,SAAgB;EACd,MAAM,QAAQ,IAAI,WAAW,IAAI;EACjC,KAAK,iBAAiB,MAAM,KAAK;EACjC,KAAK,kBAAkB;CACzB;CAEA,YAAmB;EACjB,MAAM,QAAQ,IAAI,WAAW,KAAK;EAClC,KAAK,iBAAiB,MAAM,KAAK;EACjC,KAAK,kBAAkB;CACzB;CAEA,cAAqB,EACnB,WACA,YACA,QACA,SACA,YACuB;EACvB,MAAM,cAAc,KAAK,WAAW,WAAW,SAAS;EACxD,MAAM,EAAE,aAAa;EACrB,IAAI,EAAE,YAAY;EAElB,IAAI,QAAQ,SAAS,aACnB,MAAM,IAAI,MAAM,mDAAmD;EAErE,IAAI,QAAQ;EACZ,IAAI,QAAQ;EACZ,MAAM,aAAa,QAAQ,QAAQ,KAAK,MAAM;GAC5C,IAAI,EAAE,SAAS,aAAa,OAAO;GACnC,IAAI,EAAE,eAAe,YAAY,OAAO;GACxC,QAAQ;GACR,IAAI,CAAC,EAAE,QAAQ,QAAQ;GACvB,OAAO;IACL,GAAG;IACH;IACA;IACA;GACF;EACF,CAAC;EAED,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,oDAAoD;EAEtE,UAAU;GACR,GAAG;GACH,SAAS;EACX;EACA,KAAK,WAAW,mBAAmB,UAAU,OAAO;EAEpD,IACE,SACA,eAAe,SAAS,KAAK,SAAS,uBAAuB,GAE7D,KAAK,iBAAiB,UAAU,SAAS,KAAK,cAAc,EAAE,YACtD,CAAC,CACT;CAEJ;CAEA,eAAsB,UAAiC;EACrD,MAAM,IAAI,MAAM,qDAAqD;CACvE;CAEA,sBAA6B,UAAwC;EACnE,MAAM,IAAI,MAAM,gDAAgD;CAClE;AACF"}
@@ -21,6 +21,7 @@ declare class ReadonlyThreadRuntimeCore extends BaseSubscribable implements Thre
21
21
  cancelRun(): void;
22
22
  addToolResult(): void;
23
23
  resumeToolCall(): void;
24
+ respondToToolApproval(): void;
24
25
  speak(): void;
25
26
  stopSpeaking(): void;
26
27
  connectVoice(): void;