@qduc/term2 0.1.7 → 0.1.8

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 (322) hide show
  1. package/dist/app.model-command-feedback.test.d.ts +2 -0
  2. package/dist/app.model-command-feedback.test.d.ts.map +1 -0
  3. package/dist/app.model-command-feedback.test.js +19 -0
  4. package/dist/app.model-command-feedback.test.js.map +1 -0
  5. package/dist/cli.js +5 -0
  6. package/dist/cli.js.map +1 -1
  7. package/dist/components/BottomArea.d.ts +1 -8
  8. package/dist/components/BottomArea.d.ts.map +1 -1
  9. package/dist/components/BottomArea.js.map +1 -1
  10. package/dist/components/InputBox.d.ts +6 -0
  11. package/dist/components/InputBox.d.ts.map +1 -1
  12. package/dist/components/InputBox.js +25 -3
  13. package/dist/components/InputBox.js.map +1 -1
  14. package/dist/components/InputBox.test.js +10 -1
  15. package/dist/components/InputBox.test.js.map +1 -1
  16. package/dist/components/MentorMode.test.d.ts +2 -0
  17. package/dist/components/MentorMode.test.d.ts.map +1 -0
  18. package/dist/components/MentorMode.test.js.map +1 -0
  19. package/dist/components/StatusBar.test.d.ts +2 -0
  20. package/dist/components/StatusBar.test.d.ts.map +1 -0
  21. package/dist/components/StatusBar.test.js +19 -0
  22. package/dist/components/StatusBar.test.js.map +1 -0
  23. package/dist/components/TextInput.d.ts.map +1 -1
  24. package/dist/components/TextInput.js +1 -2
  25. package/dist/components/TextInput.js.map +1 -1
  26. package/dist/components/TextInput.test.js.map +1 -1
  27. package/dist/contracts/conversation.d.ts +27 -0
  28. package/dist/contracts/conversation.d.ts.map +1 -0
  29. package/dist/contracts/conversation.js +2 -0
  30. package/dist/contracts/conversation.js.map +1 -0
  31. package/dist/debug-schema.d.ts +2 -0
  32. package/dist/debug-schema.d.ts.map +1 -0
  33. package/dist/debug-schema.js +22 -0
  34. package/dist/debug-schema.js.map +1 -0
  35. package/dist/hooks/use-conversation.d.ts +3 -14
  36. package/dist/hooks/use-conversation.d.ts.map +1 -1
  37. package/dist/hooks/use-conversation.js +15 -87
  38. package/dist/hooks/use-conversation.js.map +1 -1
  39. package/dist/hooks/use-model-selection.test.d.ts +2 -0
  40. package/dist/hooks/use-model-selection.test.d.ts.map +1 -0
  41. package/dist/hooks/use-model-selection.test.js +28 -0
  42. package/dist/hooks/use-model-selection.test.js.map +1 -0
  43. package/dist/hooks/use-path-completion.test.d.ts +2 -0
  44. package/dist/hooks/use-path-completion.test.d.ts.map +1 -0
  45. package/dist/hooks/use-path-completion.test.js +29 -0
  46. package/dist/hooks/use-path-completion.test.js.map +1 -0
  47. package/dist/lib/mentor-client.d.ts +41 -0
  48. package/dist/lib/mentor-client.d.ts.map +1 -0
  49. package/dist/lib/mentor-client.js +146 -0
  50. package/dist/lib/mentor-client.js.map +1 -0
  51. package/dist/lib/mentor-client.test.d.ts +2 -0
  52. package/dist/lib/mentor-client.test.d.ts.map +1 -0
  53. package/dist/lib/mentor-client.test.js +440 -0
  54. package/dist/lib/mentor-client.test.js.map +1 -0
  55. package/dist/lib/retry-strategy.d.ts +43 -0
  56. package/dist/lib/retry-strategy.d.ts.map +1 -0
  57. package/dist/lib/retry-strategy.js +93 -0
  58. package/dist/lib/retry-strategy.js.map +1 -0
  59. package/dist/lib/retry-strategy.test.d.ts +2 -0
  60. package/dist/lib/retry-strategy.test.d.ts.map +1 -0
  61. package/dist/lib/retry-strategy.test.js +200 -0
  62. package/dist/lib/retry-strategy.test.js.map +1 -0
  63. package/dist/lib/tool-invoke.d.ts +13 -0
  64. package/dist/lib/tool-invoke.d.ts.map +1 -1
  65. package/dist/lib/tool-invoke.js +61 -3
  66. package/dist/lib/tool-invoke.js.map +1 -1
  67. package/dist/lib/tool-invoke.test.js +139 -1
  68. package/dist/lib/tool-invoke.test.js.map +1 -1
  69. package/dist/prompts/default.md.bak +77 -0
  70. package/dist/prompts/simple-mentor.md +0 -8
  71. package/dist/prompts/simple.md +4 -0
  72. package/dist/providers/github-copilot/model-direct.d.ts +34 -0
  73. package/dist/providers/github-copilot/model-direct.d.ts.map +1 -0
  74. package/dist/providers/github-copilot/model-direct.js +443 -0
  75. package/dist/providers/github-copilot/model-direct.js.map +1 -0
  76. package/dist/providers/github-copilot/model.d.ts.map +1 -1
  77. package/dist/providers/github-copilot/model.js +108 -25
  78. package/dist/providers/github-copilot/model.js.map +1 -1
  79. package/dist/providers/github-copilot/provider.d.ts +5 -0
  80. package/dist/providers/github-copilot/provider.d.ts.map +1 -1
  81. package/dist/providers/github-copilot/provider.js +7 -2
  82. package/dist/providers/github-copilot/provider.js.map +1 -1
  83. package/dist/providers/openrouter/merge-messages.test.d.ts +2 -0
  84. package/dist/providers/openrouter/merge-messages.test.d.ts.map +1 -0
  85. package/dist/providers/openrouter/merge-messages.test.js +83 -0
  86. package/dist/providers/openrouter/merge-messages.test.js.map +1 -0
  87. package/dist/providers/openrouter.history.test.d.ts +2 -0
  88. package/dist/providers/openrouter.history.test.d.ts.map +1 -0
  89. package/dist/providers/openrouter.history.test.js +533 -0
  90. package/dist/providers/openrouter.history.test.js.map +1 -0
  91. package/dist/reproduce_issue.test.d.ts +2 -0
  92. package/dist/reproduce_issue.test.d.ts.map +1 -0
  93. package/dist/reproduce_issue.test.js +31 -0
  94. package/dist/reproduce_issue.test.js.map +1 -0
  95. package/dist/services/approval-presentation-policy.d.ts +17 -0
  96. package/dist/services/approval-presentation-policy.d.ts.map +1 -0
  97. package/dist/services/approval-presentation-policy.js +44 -0
  98. package/dist/services/approval-presentation-policy.js.map +1 -0
  99. package/dist/services/approval-presentation-policy.test.d.ts +2 -0
  100. package/dist/services/approval-presentation-policy.test.d.ts.map +1 -0
  101. package/dist/services/approval-presentation-policy.test.js +74 -0
  102. package/dist/services/approval-presentation-policy.test.js.map +1 -0
  103. package/dist/services/approval-state.d.ts +4 -4
  104. package/dist/services/approval-state.d.ts.map +1 -1
  105. package/dist/services/conversation-events.d.ts +12 -9
  106. package/dist/services/conversation-events.d.ts.map +1 -1
  107. package/dist/services/conversation-result-builder.d.ts +41 -0
  108. package/dist/services/conversation-result-builder.d.ts.map +1 -0
  109. package/dist/services/conversation-result-builder.js +110 -0
  110. package/dist/services/conversation-result-builder.js.map +1 -0
  111. package/dist/services/conversation-result-builder.test.d.ts +2 -0
  112. package/dist/services/conversation-result-builder.test.d.ts.map +1 -0
  113. package/dist/services/conversation-result-builder.test.js +76 -0
  114. package/dist/services/conversation-result-builder.test.js.map +1 -0
  115. package/dist/services/conversation-service.d.ts +7 -5
  116. package/dist/services/conversation-service.d.ts.map +1 -1
  117. package/dist/services/conversation-service.js +1 -1
  118. package/dist/services/conversation-service.js.map +1 -1
  119. package/dist/services/conversation-service.test.js +183 -149
  120. package/dist/services/conversation-session.d.ts +4 -24
  121. package/dist/services/conversation-session.d.ts.map +1 -1
  122. package/dist/services/conversation-session.js +172 -229
  123. package/dist/services/conversation-session.js.map +1 -1
  124. package/dist/services/conversation-session.usage.test.d.ts +2 -0
  125. package/dist/services/conversation-session.usage.test.d.ts.map +1 -0
  126. package/dist/services/conversation-session.usage.test.js +59 -0
  127. package/dist/services/conversation-session.usage.test.js.map +1 -0
  128. package/dist/services/conversation-store.d.ts +6 -0
  129. package/dist/services/conversation-store.d.ts.map +1 -1
  130. package/dist/services/conversation-store.js +13 -0
  131. package/dist/services/conversation-store.js.map +1 -1
  132. package/dist/services/stream-event-processor.d.ts +32 -0
  133. package/dist/services/stream-event-processor.d.ts.map +1 -0
  134. package/dist/services/stream-event-processor.js +344 -0
  135. package/dist/services/stream-event-processor.js.map +1 -0
  136. package/dist/services/stream-event-processor.test.d.ts +2 -0
  137. package/dist/services/stream-event-processor.test.d.ts.map +1 -0
  138. package/dist/services/stream-event-processor.test.js +117 -0
  139. package/dist/services/stream-event-processor.test.js.map +1 -0
  140. package/dist/test-search-tool.d.ts +2 -0
  141. package/dist/test-search-tool.d.ts.map +1 -0
  142. package/dist/test-search-tool.js +36 -0
  143. package/dist/test-search-tool.js.map +1 -0
  144. package/dist/tools/read-file.test.js +15 -0
  145. package/dist/tools/read-file.test.js.map +1 -1
  146. package/dist/tools/search-replace.d.ts.map +1 -1
  147. package/dist/tools/search-replace.js +157 -1
  148. package/dist/tools/search-replace.js.map +1 -1
  149. package/dist/tools/search-replace.test.js +177 -0
  150. package/dist/tools/search-replace.test.js.map +1 -1
  151. package/dist/tools/tool-capabilities.d.ts +6 -0
  152. package/dist/tools/tool-capabilities.d.ts.map +1 -0
  153. package/dist/tools/tool-capabilities.js +17 -0
  154. package/dist/tools/tool-capabilities.js.map +1 -0
  155. package/dist/tools/types.d.ts +4 -2
  156. package/dist/tools/types.d.ts.map +1 -1
  157. package/dist/tools/utils.d.ts.map +1 -1
  158. package/dist/tools/utils.js +4 -1
  159. package/dist/tools/utils.js.map +1 -1
  160. package/dist/tools/utils.test.d.ts +2 -0
  161. package/dist/tools/utils.test.d.ts.map +1 -0
  162. package/dist/tools/utils.test.js +26 -0
  163. package/dist/tools/utils.test.js.map +1 -0
  164. package/dist/types/messages.d.ts +29 -0
  165. package/dist/types/messages.d.ts.map +1 -0
  166. package/dist/types/messages.js +2 -0
  167. package/dist/types/messages.js.map +1 -0
  168. package/dist/utils/command-safety.d.ts.map +1 -1
  169. package/dist/utils/command-safety.js +364 -10
  170. package/dist/utils/command-safety.js.map +1 -1
  171. package/dist/utils/conversation-event-handler.d.ts +16 -10
  172. package/dist/utils/conversation-event-handler.d.ts.map +1 -1
  173. package/dist/utils/conversation-event-handler.js +4 -0
  174. package/dist/utils/conversation-event-handler.js.map +1 -1
  175. package/dist/utils/extract-command-messages.repro.test.d.ts +2 -0
  176. package/dist/utils/extract-command-messages.repro.test.d.ts.map +1 -0
  177. package/dist/utils/extract-command-messages.repro.test.js +31 -0
  178. package/dist/utils/extract-command-messages.repro.test.js.map +1 -0
  179. package/dist/utils/extract-command-messages.test.js +51 -58
  180. package/dist/utils/message-utils.d.ts +17 -0
  181. package/dist/utils/message-utils.d.ts.map +1 -0
  182. package/dist/utils/message-utils.js +52 -0
  183. package/dist/utils/message-utils.js.map +1 -0
  184. package/dist/utils/message-utils.test.d.ts +2 -0
  185. package/dist/utils/message-utils.test.d.ts.map +1 -0
  186. package/dist/utils/message-utils.test.js +48 -0
  187. package/dist/utils/message-utils.test.js.map +1 -0
  188. package/dist/utils/streaming-session-factory.d.ts +9 -9
  189. package/dist/utils/streaming-session-factory.d.ts.map +1 -1
  190. package/dist/utils/streaming-session-factory.js +7 -2
  191. package/dist/utils/streaming-session-factory.js.map +1 -1
  192. package/dist/utils/synchronized-output.d.ts +35 -0
  193. package/dist/utils/synchronized-output.d.ts.map +1 -0
  194. package/dist/utils/synchronized-output.js +66 -0
  195. package/dist/utils/synchronized-output.js.map +1 -0
  196. package/dist/utils/synchronized-output.test.d.ts +2 -0
  197. package/dist/utils/synchronized-output.test.d.ts.map +1 -0
  198. package/dist/utils/synchronized-output.test.js +70 -0
  199. package/dist/utils/synchronized-output.test.js.map +1 -0
  200. package/package.json +1 -1
  201. package/dist/agent.lite-mode.test.d.ts +0 -2
  202. package/dist/agent.lite-mode.test.d.ts.map +0 -1
  203. package/dist/agent.lite-mode.test.js +0 -39
  204. package/dist/agent.lite-mode.test.js.map +0 -1
  205. package/dist/debug_ask_mentor.d.ts +0 -2
  206. package/dist/debug_ask_mentor.d.ts.map +0 -1
  207. package/dist/debug_ask_mentor.js +0 -73
  208. package/dist/debug_ask_mentor.js.map +0 -1
  209. package/dist/modes/companion/command-index.d.ts +0 -26
  210. package/dist/modes/companion/command-index.d.ts.map +0 -1
  211. package/dist/modes/companion/command-index.js +0 -50
  212. package/dist/modes/companion/command-index.js.map +0 -1
  213. package/dist/modes/companion/command-index.test.d.ts +0 -2
  214. package/dist/modes/companion/command-index.test.d.ts.map +0 -1
  215. package/dist/modes/companion/command-index.test.js +0 -86
  216. package/dist/modes/companion/command-index.test.js.map +0 -1
  217. package/dist/modes/companion/companion-app.d.ts +0 -12
  218. package/dist/modes/companion/companion-app.d.ts.map +0 -1
  219. package/dist/modes/companion/companion-app.js +0 -297
  220. package/dist/modes/companion/companion-app.js.map +0 -1
  221. package/dist/modes/companion/companion-session.d.ts +0 -63
  222. package/dist/modes/companion/companion-session.d.ts.map +0 -1
  223. package/dist/modes/companion/companion-session.js +0 -146
  224. package/dist/modes/companion/companion-session.js.map +0 -1
  225. package/dist/modes/companion/companion-session.test.d.ts +0 -2
  226. package/dist/modes/companion/companion-session.test.d.ts.map +0 -1
  227. package/dist/modes/companion/companion-session.test.js +0 -28
  228. package/dist/modes/companion/companion-session.test.js.map +0 -1
  229. package/dist/modes/companion/components/status-bar.d.ts +0 -13
  230. package/dist/modes/companion/components/status-bar.d.ts.map +0 -1
  231. package/dist/modes/companion/components/status-bar.js +0 -26
  232. package/dist/modes/companion/components/status-bar.js.map +0 -1
  233. package/dist/modes/companion/context-buffer.d.ts +0 -65
  234. package/dist/modes/companion/context-buffer.d.ts.map +0 -1
  235. package/dist/modes/companion/context-buffer.js +0 -156
  236. package/dist/modes/companion/context-buffer.js.map +0 -1
  237. package/dist/modes/companion/context-buffer.test.d.ts +0 -2
  238. package/dist/modes/companion/context-buffer.test.d.ts.map +0 -1
  239. package/dist/modes/companion/context-buffer.test.js +0 -154
  240. package/dist/modes/companion/context-buffer.test.js.map +0 -1
  241. package/dist/modes/companion/event-detector.d.ts +0 -46
  242. package/dist/modes/companion/event-detector.d.ts.map +0 -1
  243. package/dist/modes/companion/event-detector.js +0 -169
  244. package/dist/modes/companion/event-detector.js.map +0 -1
  245. package/dist/modes/companion/event-detector.test.d.ts +0 -2
  246. package/dist/modes/companion/event-detector.test.d.ts.map +0 -1
  247. package/dist/modes/companion/event-detector.test.js +0 -121
  248. package/dist/modes/companion/event-detector.test.js.map +0 -1
  249. package/dist/modes/companion/index.d.ts +0 -33
  250. package/dist/modes/companion/index.d.ts.map +0 -1
  251. package/dist/modes/companion/index.js +0 -21
  252. package/dist/modes/companion/index.js.map +0 -1
  253. package/dist/modes/companion/input-key-mapper.d.ts +0 -3
  254. package/dist/modes/companion/input-key-mapper.d.ts.map +0 -1
  255. package/dist/modes/companion/input-key-mapper.js +0 -31
  256. package/dist/modes/companion/input-key-mapper.js.map +0 -1
  257. package/dist/modes/companion/input-key-mapper.test.d.ts +0 -2
  258. package/dist/modes/companion/input-key-mapper.test.d.ts.map +0 -1
  259. package/dist/modes/companion/input-key-mapper.test.js +0 -26
  260. package/dist/modes/companion/input-key-mapper.test.js.map +0 -1
  261. package/dist/modes/companion/input-parser.d.ts +0 -53
  262. package/dist/modes/companion/input-parser.d.ts.map +0 -1
  263. package/dist/modes/companion/input-parser.js +0 -114
  264. package/dist/modes/companion/input-parser.js.map +0 -1
  265. package/dist/modes/companion/input-parser.test.d.ts +0 -2
  266. package/dist/modes/companion/input-parser.test.d.ts.map +0 -1
  267. package/dist/modes/companion/input-parser.test.js +0 -123
  268. package/dist/modes/companion/input-parser.test.js.map +0 -1
  269. package/dist/modes/companion/mode-manager.d.ts +0 -41
  270. package/dist/modes/companion/mode-manager.d.ts.map +0 -1
  271. package/dist/modes/companion/mode-manager.js +0 -56
  272. package/dist/modes/companion/mode-manager.js.map +0 -1
  273. package/dist/modes/companion/mode-manager.test.d.ts +0 -2
  274. package/dist/modes/companion/mode-manager.test.d.ts.map +0 -1
  275. package/dist/modes/companion/mode-manager.test.js +0 -65
  276. package/dist/modes/companion/mode-manager.test.js.map +0 -1
  277. package/dist/modes/companion/output-classifier.d.ts +0 -15
  278. package/dist/modes/companion/output-classifier.d.ts.map +0 -1
  279. package/dist/modes/companion/output-classifier.js +0 -77
  280. package/dist/modes/companion/output-classifier.js.map +0 -1
  281. package/dist/modes/companion/output-classifier.test.d.ts +0 -2
  282. package/dist/modes/companion/output-classifier.test.d.ts.map +0 -1
  283. package/dist/modes/companion/output-classifier.test.js +0 -133
  284. package/dist/modes/companion/output-classifier.test.js.map +0 -1
  285. package/dist/modes/companion/pty-wrapper.d.ts +0 -46
  286. package/dist/modes/companion/pty-wrapper.d.ts.map +0 -1
  287. package/dist/modes/companion/pty-wrapper.js +0 -143
  288. package/dist/modes/companion/pty-wrapper.js.map +0 -1
  289. package/dist/modes/companion/safety-classifier.d.ts +0 -31
  290. package/dist/modes/companion/safety-classifier.d.ts.map +0 -1
  291. package/dist/modes/companion/safety-classifier.js +0 -140
  292. package/dist/modes/companion/safety-classifier.js.map +0 -1
  293. package/dist/modes/companion/safety-classifier.test.d.ts +0 -2
  294. package/dist/modes/companion/safety-classifier.test.d.ts.map +0 -1
  295. package/dist/modes/companion/safety-classifier.test.js +0 -151
  296. package/dist/modes/companion/safety-classifier.test.js.map +0 -1
  297. package/dist/modes/companion/summarizer.d.ts +0 -24
  298. package/dist/modes/companion/summarizer.d.ts.map +0 -1
  299. package/dist/modes/companion/summarizer.js +0 -132
  300. package/dist/modes/companion/summarizer.js.map +0 -1
  301. package/dist/modes/companion/terminal-history.d.ts +0 -27
  302. package/dist/modes/companion/terminal-history.d.ts.map +0 -1
  303. package/dist/modes/companion/terminal-history.js +0 -142
  304. package/dist/modes/companion/terminal-history.js.map +0 -1
  305. package/dist/providers/github-copilot/model.test.d.ts +0 -2
  306. package/dist/providers/github-copilot/model.test.d.ts.map +0 -1
  307. package/dist/providers/github-copilot/model.test.js +0 -63
  308. package/dist/providers/github-copilot/model.test.js.map +0 -1
  309. package/dist/services/check_mock.d.ts +0 -2
  310. package/dist/services/check_mock.d.ts.map +0 -1
  311. package/dist/services/check_mock.js +0 -22
  312. package/dist/services/check_mock.js.map +0 -1
  313. package/dist/services/conversation-service.test.d.ts +0 -2
  314. package/dist/services/conversation-service.test.d.ts.map +0 -1
  315. package/dist/services/conversation-service.test.js.map +0 -1
  316. package/dist/utils/command-safety.devnull.test.d.ts +0 -2
  317. package/dist/utils/command-safety.devnull.test.d.ts.map +0 -1
  318. package/dist/utils/command-safety.devnull.test.js +0 -13
  319. package/dist/utils/command-safety.devnull.test.js.map +0 -1
  320. package/dist/utils/extract-command-messages.test.d.ts +0 -2
  321. package/dist/utils/extract-command-messages.test.d.ts.map +0 -1
  322. package/dist/utils/extract-command-messages.test.js.map +0 -1
@@ -18,11 +18,13 @@ export interface SystemMessage {
18
18
  sender: 'system';
19
19
  text: string;
20
20
  }
21
- /**
22
- * Dependencies injected into the event handler factory.
23
- * Uses `any` for React setState compatibility - internal utility.
24
- */
25
- export interface ConversationEventHandlerDeps<CommandMessageT extends CommandMessage = CommandMessage> {
21
+ export type UIMessage = {
22
+ id: string | number;
23
+ sender: string;
24
+ callId?: string;
25
+ status?: string;
26
+ };
27
+ export interface ConversationEventHandlerDeps<MessageT extends UIMessage = UIMessage, CommandMessageT extends CommandMessage = CommandMessage> {
26
28
  liveResponseUpdater: {
27
29
  push: (text: string) => void;
28
30
  cancel: () => void;
@@ -33,10 +35,14 @@ export interface ConversationEventHandlerDeps<CommandMessageT extends CommandMes
33
35
  cancel: () => void;
34
36
  flush: () => void;
35
37
  };
36
- appendMessages: (messages: any[]) => void;
37
- setMessages: (updater: (prev: any[]) => any[]) => void;
38
- setLiveResponse: (response: any) => void;
39
- trimMessages: (messages: any[]) => any[];
38
+ appendMessages: (messages: MessageT[]) => void;
39
+ setMessages: (updater: (prev: MessageT[]) => MessageT[]) => void;
40
+ setLiveResponse: (response: {
41
+ id: number;
42
+ sender: 'bot';
43
+ text: string;
44
+ } | null) => void;
45
+ trimMessages: (messages: MessageT[]) => MessageT[];
40
46
  annotateCommandMessage: (msg: CommandMessageT) => CommandMessageT;
41
47
  }
42
48
  /**
@@ -47,5 +53,5 @@ export interface ConversationEventHandlerDeps<CommandMessageT extends CommandMes
47
53
  * @param state - Mutable streaming state object
48
54
  * @returns Event handler function
49
55
  */
50
- export declare function createConversationEventHandler<CommandMessageT extends CommandMessage = CommandMessage>(deps: ConversationEventHandlerDeps<CommandMessageT>, state: StreamingState): (event: ConversationEvent) => void;
56
+ export declare function createConversationEventHandler<MessageT extends UIMessage = UIMessage, CommandMessageT extends CommandMessage = CommandMessage>(deps: ConversationEventHandlerDeps<MessageT, CommandMessageT>, state: StreamingState): (event: ConversationEvent) => void;
51
57
  //# sourceMappingURL=conversation-event-handler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-event-handler.d.ts","sourceRoot":"","sources":["../../source/utils/conversation-event-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAyC,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAErG;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,QAAQ,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,MAAM,WAAW,4BAA4B,CAAC,eAAe,SAAS,cAAc,GAAG,cAAc;IACnG,mBAAmB,EAAE;QACnB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QAC7B,MAAM,EAAE,MAAM,IAAI,CAAC;QACnB,KAAK,EAAE,MAAM,IAAI,CAAC;KACnB,CAAC;IACF,gBAAgB,EAAE;QAChB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QAC7B,MAAM,EAAE,MAAM,IAAI,CAAC;QACnB,KAAK,EAAE,MAAM,IAAI,CAAC;KACnB,CAAC;IACF,cAAc,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IAC1C,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,IAAI,CAAC;IACvD,eAAe,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,CAAC;IACzC,YAAY,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,CAAC;IACzC,sBAAsB,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,eAAe,CAAC;CACnE;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAAC,eAAe,SAAS,cAAc,GAAG,cAAc,EACpG,IAAI,EAAE,4BAA4B,CAAC,eAAe,CAAC,EACnD,KAAK,EAAE,cAAc,GACpB,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CA6IpC"}
1
+ {"version":3,"file":"conversation-event-handler.d.ts","sourceRoot":"","sources":["../../source/utils/conversation-event-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAyC,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAErG;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,QAAQ,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,WAAW,4BAA4B,CAC3C,QAAQ,SAAS,SAAS,GAAG,SAAS,EACtC,eAAe,SAAS,cAAc,GAAG,cAAc;IAEvD,mBAAmB,EAAE;QACnB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QAC7B,MAAM,EAAE,MAAM,IAAI,CAAC;QACnB,KAAK,EAAE,MAAM,IAAI,CAAC;KACnB,CAAC;IACF,gBAAgB,EAAE;QAChB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QAC7B,MAAM,EAAE,MAAM,IAAI,CAAC;QACnB,KAAK,EAAE,MAAM,IAAI,CAAC;KACnB,CAAC;IACF,cAAc,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;IAC/C,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,IAAI,CAAC;IACjE,eAAe,EAAE,CAAC,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IACxF,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,CAAC;IACnD,sBAAsB,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,eAAe,CAAC;CACnE;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,SAAS,SAAS,GAAG,SAAS,EACtC,eAAe,SAAS,cAAc,GAAG,cAAc,EAEvD,IAAI,EAAE,4BAA4B,CAAC,QAAQ,EAAE,eAAe,CAAC,EAC7D,KAAK,EAAE,cAAc,GACpB,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAkJpC"}
@@ -119,6 +119,10 @@ export function createConversationEventHandler(deps, state) {
119
119
  setMessages((prev) => [...prev, systemMessage]);
120
120
  return;
121
121
  }
122
+ case 'usage_update':
123
+ // Usage updates are handled separately in streaming-session-factory.ts
124
+ // This case exists for exhaustiveness and to document the event flow
125
+ return;
122
126
  default:
123
127
  // Ignore unknown events (approval_required, final, error handled elsewhere)
124
128
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-event-handler.js","sourceRoot":"","sources":["../../source/utils/conversation-event-handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conversation-event-handler.js","sourceRoot":"","sources":["../../source/utils/conversation-event-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=extract-command-messages.repro.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-command-messages.repro.test.d.ts","sourceRoot":"","sources":["../../source/utils/extract-command-messages.repro.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,31 @@
1
+ import test from 'ava';
2
+ import { extractCommandMessages } from './extract-command-messages.js';
3
+ test('extractCommandMessages handles tool_call_id', t => {
4
+ const historyItem = {
5
+ role: 'tool',
6
+ tool_call_id: 'call_123',
7
+ content: JSON.stringify({ output: [{ success: false, error: 'failed' }] }),
8
+ name: 'shell' // OpenAI messages don't always have name on tool output, but let's assume it might be there or inferred
9
+ };
10
+ // normalizeToolItem requires name.
11
+ // In OpenAI history, the tool name is associated with the tool_call, not the tool output.
12
+ // But extractCommandMessages seems to expect name on the item.
13
+ // Let's see what normalizeToolItem expects.
14
+ // const toolName = rawItem?.name ?? item.name;
15
+ // If the history item doesn't have name, it returns null.
16
+ // So result.history must contain items that have name.
17
+ const item = {
18
+ type: 'function_call_result', // or tool_call_output_item
19
+ name: 'shell',
20
+ tool_call_id: 'call_123',
21
+ output: JSON.stringify({ output: [{ success: false, error: 'failed' }] })
22
+ };
23
+ const messages = extractCommandMessages([item]);
24
+ t.is(messages.length, 1);
25
+ // The ID should be derived from tool_call_id if possible
26
+ // But currently it checks id, callId.
27
+ // If tool_call_id is present but ignored, it uses timestamp-index.
28
+ const id = messages[0].id;
29
+ t.true(id.includes('call_123'), `ID ${id} should include call_123`);
30
+ });
31
+ //# sourceMappingURL=extract-command-messages.repro.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-command-messages.repro.test.js","sourceRoot":"","sources":["../../source/utils/extract-command-messages.repro.test.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAC,sBAAsB,EAAC,MAAM,+BAA+B,CAAC;AAErE,IAAI,CAAC,6CAA6C,EAAE,CAAC,CAAC,EAAE;IACpD,MAAM,WAAW,GAAG;QAChB,IAAI,EAAE,MAAM;QACZ,YAAY,EAAE,UAAU;QACxB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,EAAC,MAAM,EAAE,CAAC,EAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAC,CAAC,EAAC,CAAC;QACtE,IAAI,EAAE,OAAO,CAAC,wGAAwG;KACzH,CAAC;IAEF,mCAAmC;IACnC,0FAA0F;IAC1F,+DAA+D;IAE/D,4CAA4C;IAC5C,+CAA+C;IAE/C,0DAA0D;IAE1D,uDAAuD;IAEvD,MAAM,IAAI,GAAG;QACT,IAAI,EAAE,sBAAsB,EAAE,2BAA2B;QACzD,IAAI,EAAE,OAAO;QACb,YAAY,EAAE,UAAU;QACxB,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAC,MAAM,EAAE,CAAC,EAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAC,CAAC,EAAC,CAAC;KACxE,CAAC;IAEF,MAAM,QAAQ,GAAG,sBAAsB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhD,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACzB,yDAAyD;IACzD,sCAAsC;IAEtC,mEAAmE;IACnE,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1B,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,0BAA0B,CAAC,CAAC;AACxE,CAAC,CAAC,CAAC"}
@@ -1,64 +1,57 @@
1
1
  import test from 'ava';
2
- import { extractCommandMessages } from './extract-command-messages.js';
2
+ import { extractCommandMessages } from '../../dist/utils/extract-command-messages.js';
3
3
  const withStubbedNow = value => {
4
- const realNow = Date.now;
5
- Date.now = () => value;
6
- return () => {
7
- Date.now = realNow;
8
- };
4
+ const realNow = Date.now;
5
+ Date.now = () => value;
6
+ return () => {
7
+ Date.now = realNow;
8
+ };
9
9
  };
10
10
  test('extracts bash command results from tool call output items', t => {
11
- const restore = withStubbedNow(1700000000000);
12
- try {
13
- const items = [
14
- {
15
- type: 'tool_call_output_item',
16
- output: '{"command":"date","output":"Mon Nov 24","success":true}',
17
- rawItem: {
18
- type: 'function_call_result',
19
- name: 'bash',
20
- },
21
- },
22
- ];
23
- const messages = extractCommandMessages(items);
24
- t.is(messages.length, 1);
25
- t.deepEqual(messages[0], {
26
- id: '1700000000000-0',
27
- sender: 'command',
28
- command: 'date',
29
- output: 'Mon Nov 24',
30
- success: true,
31
- });
32
- }
33
- finally {
34
- restore();
35
- }
11
+ const restore = withStubbedNow(1700000000000);
12
+ try {
13
+ const items = [{
14
+ type: 'tool_call_output_item',
15
+ output: '{"command":"date","output":"Mon Nov 24","success":true}',
16
+ rawItem: {
17
+ type: 'function_call_result',
18
+ name: 'bash'
19
+ }
20
+ }];
21
+ const messages = extractCommandMessages(items);
22
+ t.is(messages.length, 1);
23
+ t.deepEqual(messages[0], {
24
+ id: '1700000000000-0',
25
+ sender: 'command',
26
+ command: 'date',
27
+ output: 'Mon Nov 24',
28
+ success: true
29
+ });
30
+ } finally {
31
+ restore();
32
+ }
36
33
  });
37
34
  test('extracts commands from history function_call_result items', t => {
38
- const restore = withStubbedNow(1700000000100);
39
- try {
40
- const items = [
41
- {
42
- type: 'function_call_result',
43
- name: 'bash',
44
- output: {
45
- type: 'text',
46
- text: '{"command":"ls","output":"agent.js\\napp.js","success":false}',
47
- },
48
- },
49
- ];
50
- const messages = extractCommandMessages(items);
51
- t.is(messages.length, 1);
52
- t.deepEqual(messages[0], {
53
- id: '1700000000100-0',
54
- sender: 'command',
55
- command: 'ls',
56
- output: 'agent.js\napp.js',
57
- success: false,
58
- });
59
- }
60
- finally {
61
- restore();
62
- }
63
- });
64
- //# sourceMappingURL=extract-command-messages.test.js.map
35
+ const restore = withStubbedNow(1700000000100);
36
+ try {
37
+ const items = [{
38
+ type: 'function_call_result',
39
+ name: 'bash',
40
+ output: {
41
+ type: 'text',
42
+ text: '{"command":"ls","output":"agent.js\\napp.js","success":false}'
43
+ }
44
+ }];
45
+ const messages = extractCommandMessages(items);
46
+ t.is(messages.length, 1);
47
+ t.deepEqual(messages[0], {
48
+ id: '1700000000100-0',
49
+ sender: 'command',
50
+ command: 'ls',
51
+ output: 'agent.js\napp.js',
52
+ success: false
53
+ });
54
+ } finally {
55
+ restore();
56
+ }
57
+ });
@@ -0,0 +1,17 @@
1
+ type MessageLike = {
2
+ id?: string | number;
3
+ sender?: string;
4
+ text?: string;
5
+ status?: string;
6
+ command?: string;
7
+ output?: string;
8
+ success?: boolean;
9
+ failureReason?: string;
10
+ toolName?: string;
11
+ toolArgs?: unknown;
12
+ isApprovalRejection?: boolean;
13
+ hadApproval?: boolean;
14
+ };
15
+ export declare const areMessageListsEqual: (prev: MessageLike[] | undefined, next: MessageLike[] | undefined) => boolean;
16
+ export {};
17
+ //# sourceMappingURL=message-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-utils.d.ts","sourceRoot":"","sources":["../../source/utils/message-utils.ts"],"names":[],"mappings":"AAAA,KAAK,WAAW,GAAG;IACf,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAuCF,eAAO,MAAM,oBAAoB,GAC7B,MAAM,WAAW,EAAE,GAAG,SAAS,EAC/B,MAAM,WAAW,EAAE,GAAG,SAAS,KAChC,OAiBF,CAAC"}
@@ -0,0 +1,52 @@
1
+ const serializeValue = (value) => {
2
+ if (value == null)
3
+ return '';
4
+ if (typeof value === 'string')
5
+ return value;
6
+ if (typeof value === 'number' || typeof value === 'boolean') {
7
+ return String(value);
8
+ }
9
+ try {
10
+ return JSON.stringify(value);
11
+ }
12
+ catch {
13
+ return String(value);
14
+ }
15
+ };
16
+ const buildMessageSignature = (message) => {
17
+ const base = `${serializeValue(message.id)}|${serializeValue(message.sender)}`;
18
+ if (message.sender === 'command') {
19
+ return [
20
+ base,
21
+ serializeValue(message.status),
22
+ serializeValue(message.command),
23
+ serializeValue(message.output),
24
+ serializeValue(message.success),
25
+ serializeValue(message.failureReason),
26
+ serializeValue(message.toolName),
27
+ serializeValue(message.toolArgs),
28
+ serializeValue(message.isApprovalRejection),
29
+ serializeValue(message.hadApproval),
30
+ ].join('|');
31
+ }
32
+ return `${base}|${serializeValue(message.text)}`;
33
+ };
34
+ export const areMessageListsEqual = (prev, next) => {
35
+ if (prev === next)
36
+ return true;
37
+ if (!prev || !next)
38
+ return false;
39
+ if (prev.length !== next.length)
40
+ return false;
41
+ for (let index = 0; index < prev.length; index += 1) {
42
+ const prevMessage = prev[index];
43
+ const nextMessage = next[index];
44
+ if (prevMessage === nextMessage)
45
+ continue;
46
+ if (buildMessageSignature(prevMessage) !== buildMessageSignature(nextMessage)) {
47
+ return false;
48
+ }
49
+ }
50
+ return true;
51
+ };
52
+ //# sourceMappingURL=message-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-utils.js","sourceRoot":"","sources":["../../source/utils/message-utils.ts"],"names":[],"mappings":"AAeA,MAAM,cAAc,GAAG,CAAC,KAAc,EAAU,EAAE;IAC9C,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,OAAoB,EAAU,EAAE;IAC3D,MAAM,IAAI,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,cAAc,CACxD,OAAO,CAAC,MAAM,CACjB,EAAE,CAAC;IAEJ,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO;YACH,IAAI;YACJ,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC;YAC9B,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC;YAC/B,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC;YAC9B,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC;YAC/B,cAAc,CAAC,OAAO,CAAC,aAAa,CAAC;YACrC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC;YAChC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC;YAChC,cAAc,CAAC,OAAO,CAAC,mBAAmB,CAAC;YAC3C,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC;SACtC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;IAED,OAAO,GAAG,IAAI,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;AACrD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAChC,IAA+B,EAC/B,IAA+B,EACxB,EAAE;IACT,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACjC,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAE9C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAClD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAEhC,IAAI,WAAW,KAAK,WAAW;YAAE,SAAS;QAE1C,IAAI,qBAAqB,CAAC,WAAW,CAAC,KAAK,qBAAqB,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5E,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=message-utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-utils.test.d.ts","sourceRoot":"","sources":["../../source/utils/message-utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
1
+ import test from 'ava';
2
+ import { areMessageListsEqual } from './message-utils.js';
3
+ test('areMessageListsEqual returns true for same content with new array refs', t => {
4
+ const messagesA = [{ id: 1, sender: 'bot', text: 'Hello' }];
5
+ const messagesB = [{ id: 1, sender: 'bot', text: 'Hello' }];
6
+ t.true(areMessageListsEqual(messagesA, messagesB));
7
+ });
8
+ test('areMessageListsEqual returns false when text changes', t => {
9
+ const messagesA = [{ id: 1, sender: 'bot', text: 'Hello' }];
10
+ const messagesB = [{ id: 1, sender: 'bot', text: 'Hello!' }];
11
+ t.false(areMessageListsEqual(messagesA, messagesB));
12
+ });
13
+ test('areMessageListsEqual returns false when command output changes', t => {
14
+ const messagesA = [
15
+ {
16
+ id: 'cmd-1',
17
+ sender: 'command',
18
+ status: 'completed',
19
+ command: 'ls',
20
+ output: 'file-a',
21
+ success: true,
22
+ toolName: 'shell',
23
+ toolArgs: { command: 'ls' },
24
+ },
25
+ ];
26
+ const messagesB = [
27
+ {
28
+ id: 'cmd-1',
29
+ sender: 'command',
30
+ status: 'completed',
31
+ command: 'ls',
32
+ output: 'file-a\nfile-b',
33
+ success: true,
34
+ toolName: 'shell',
35
+ toolArgs: { command: 'ls' },
36
+ },
37
+ ];
38
+ t.false(areMessageListsEqual(messagesA, messagesB));
39
+ });
40
+ test('areMessageListsEqual returns false when length differs', t => {
41
+ const messagesA = [{ id: 1, sender: 'bot', text: 'Hello' }];
42
+ const messagesB = [
43
+ { id: 1, sender: 'bot', text: 'Hello' },
44
+ { id: 2, sender: 'bot', text: 'World' },
45
+ ];
46
+ t.false(areMessageListsEqual(messagesA, messagesB));
47
+ });
48
+ //# sourceMappingURL=message-utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-utils.test.js","sourceRoot":"","sources":["../../source/utils/message-utils.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAC,oBAAoB,EAAC,MAAM,oBAAoB,CAAC;AAExD,IAAI,CAAC,wEAAwE,EAAE,CAAC,CAAC,EAAE;IAC/E,MAAM,SAAS,GAAG,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC,CAAC,CAAC;IAE1D,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,CAAC,CAAC,EAAE;IAC7D,MAAM,SAAS,GAAG,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAC,CAAC,CAAC;IAE3D,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gEAAgE,EAAE,CAAC,CAAC,EAAE;IACvE,MAAM,SAAS,GAAG;QACd;YACI,EAAE,EAAE,OAAO;YACX,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,WAAW;YACnB,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC;SAC5B;KACJ,CAAC;IACF,MAAM,SAAS,GAAG;QACd;YACI,EAAE,EAAE,OAAO;YACX,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,WAAW;YACnB,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,gBAAgB;YACxB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC;SAC5B;KACJ,CAAC;IAEF,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wDAAwD,EAAE,CAAC,CAAC,EAAE;IAC/D,MAAM,SAAS,GAAG,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG;QACd,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC;QACrC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC;KACxC,CAAC;IAEF,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC"}
@@ -4,19 +4,19 @@
4
4
  */
5
5
  import type { ConversationEvent } from '../services/conversation-events.js';
6
6
  import type { ILoggingService } from '../services/service-interfaces.js';
7
- import { createConversationEventHandler, type ConversationEventHandlerDeps } from './conversation-event-handler.js';
7
+ import { createConversationEventHandler, type ConversationEventHandlerDeps, type UIMessage } from './conversation-event-handler.js';
8
8
  import { type StreamingState } from './conversation-utils.js';
9
9
  import { createStreamingUpdateCoordinator } from './streaming-updater.js';
10
10
  import type { NormalizedUsage } from './token-usage.js';
11
- export interface StreamingSessionFactoryDeps {
12
- appendMessages: ConversationEventHandlerDeps['appendMessages'];
13
- setMessages: ConversationEventHandlerDeps['setMessages'];
14
- setLiveResponse: ConversationEventHandlerDeps['setLiveResponse'];
15
- trimMessages: ConversationEventHandlerDeps['trimMessages'];
16
- annotateCommandMessage: ConversationEventHandlerDeps['annotateCommandMessage'];
11
+ export interface StreamingSessionFactoryDeps<MessageT extends UIMessage = UIMessage> {
12
+ appendMessages: ConversationEventHandlerDeps<MessageT>['appendMessages'];
13
+ setMessages: ConversationEventHandlerDeps<MessageT>['setMessages'];
14
+ setLiveResponse: ConversationEventHandlerDeps<MessageT>['setLiveResponse'];
15
+ trimMessages: ConversationEventHandlerDeps<MessageT>['trimMessages'];
16
+ annotateCommandMessage: ConversationEventHandlerDeps<MessageT>['annotateCommandMessage'];
17
17
  loggingService: ILoggingService;
18
18
  setLastUsage: (usage: NormalizedUsage) => void;
19
- createLiveResponseUpdater: (liveMessageId: number) => ConversationEventHandlerDeps['liveResponseUpdater'];
19
+ createLiveResponseUpdater: (liveMessageId: number) => ConversationEventHandlerDeps<MessageT>['liveResponseUpdater'];
20
20
  reasoningThrottleMs: number;
21
21
  now?: () => number;
22
22
  createStreamingState?: () => StreamingState;
@@ -29,5 +29,5 @@ export interface StreamingSession {
29
29
  streamingState: StreamingState;
30
30
  applyConversationEvent: (event: ConversationEvent) => void;
31
31
  }
32
- export declare function createStreamingSession(deps: StreamingSessionFactoryDeps, label: string): StreamingSession;
32
+ export declare function createStreamingSession<MessageT extends UIMessage = UIMessage>(deps: StreamingSessionFactoryDeps<MessageT>, label: string): StreamingSession;
33
33
  //# sourceMappingURL=streaming-session-factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"streaming-session-factory.d.ts","sourceRoot":"","sources":["../../source/utils/streaming-session-factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,8BAA8B,EAAE,KAAK,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AACpH,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACpF,OAAO,EAAE,gCAAgC,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,WAAW,2BAA2B;IAC1C,cAAc,EAAE,4BAA4B,CAAC,gBAAgB,CAAC,CAAC;IAC/D,WAAW,EAAE,4BAA4B,CAAC,aAAa,CAAC,CAAC;IACzD,eAAe,EAAE,4BAA4B,CAAC,iBAAiB,CAAC,CAAC;IACjE,YAAY,EAAE,4BAA4B,CAAC,cAAc,CAAC,CAAC;IAC3D,sBAAsB,EAAE,4BAA4B,CAAC,wBAAwB,CAAC,CAAC;IAC/E,cAAc,EAAE,eAAe,CAAC;IAChC,YAAY,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC/C,yBAAyB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,4BAA4B,CAAC,qBAAqB,CAAC,CAAC;IAC1G,mBAAmB,EAAE,MAAM,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,MAAM,cAAc,CAAC;IAC5C,gCAAgC,CAAC,EAAE,OAAO,gCAAgC,CAAC;IAC3E,8BAA8B,CAAC,EAAE,OAAO,8BAA8B,CAAC;CACxE;AAED,MAAM,WAAW,gBAAgB;IAC/B,mBAAmB,EAAE,4BAA4B,CAAC,qBAAqB,CAAC,CAAC;IACzE,gBAAgB,EAAE,4BAA4B,CAAC,kBAAkB,CAAC,CAAC;IACnE,cAAc,EAAE,cAAc,CAAC;IAC/B,sBAAsB,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAC5D;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,2BAA2B,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CA0EzG"}
1
+ {"version":3,"file":"streaming-session-factory.d.ts","sourceRoot":"","sources":["../../source/utils/streaming-session-factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EACL,8BAA8B,EAC9B,KAAK,4BAA4B,EACjC,KAAK,SAAS,EACf,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACpF,OAAO,EAAE,gCAAgC,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,WAAW,2BAA2B,CAAC,QAAQ,SAAS,SAAS,GAAG,SAAS;IACjF,cAAc,EAAE,4BAA4B,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CAAC,CAAC;IACzE,WAAW,EAAE,4BAA4B,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,CAAC;IACnE,eAAe,EAAE,4BAA4B,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC3E,YAAY,EAAE,4BAA4B,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC;IACrE,sBAAsB,EAAE,4BAA4B,CAAC,QAAQ,CAAC,CAAC,wBAAwB,CAAC,CAAC;IACzF,cAAc,EAAE,eAAe,CAAC;IAChC,YAAY,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC/C,yBAAyB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,4BAA4B,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC;IACpH,mBAAmB,EAAE,MAAM,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,MAAM,cAAc,CAAC;IAC5C,gCAAgC,CAAC,EAAE,OAAO,gCAAgC,CAAC;IAC3E,8BAA8B,CAAC,EAAE,OAAO,8BAA8B,CAAC;CACxE;AAED,MAAM,WAAW,gBAAgB;IAC/B,mBAAmB,EAAE,4BAA4B,CAAC,qBAAqB,CAAC,CAAC;IACzE,gBAAgB,EAAE,4BAA4B,CAAC,kBAAkB,CAAC,CAAC;IACnE,cAAc,EAAE,cAAc,CAAC;IAC/B,sBAAsB,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAC5D;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,SAAS,SAAS,GAAG,SAAS,EAC3E,IAAI,EAAE,2BAA2B,CAAC,QAAQ,CAAC,EAC3C,KAAK,EAAE,MAAM,GACZ,gBAAgB,CA8ElB"}
@@ -2,7 +2,7 @@
2
2
  * Factory for creating streaming session helpers.
3
3
  * Extracted from use-conversation.ts to enable testing.
4
4
  */
5
- import { createConversationEventHandler } from './conversation-event-handler.js';
5
+ import { createConversationEventHandler, } from './conversation-event-handler.js';
6
6
  import { createStreamingState } from './conversation-utils.js';
7
7
  import { createStreamingUpdateCoordinator } from './streaming-updater.js';
8
8
  export function createStreamingSession(deps, label) {
@@ -54,7 +54,12 @@ export function createStreamingSession(deps, label) {
54
54
  annotateCommandMessage: deps.annotateCommandMessage,
55
55
  }, streamingState);
56
56
  const applyConversationEvent = (event) => {
57
- if (event.type === 'final') {
57
+ if (event.type === 'usage_update') {
58
+ // Emit usage updates in real-time during streaming
59
+ deps.loggingService.debug(`UI received streaming usage (${label})`, { usage: event.usage });
60
+ deps.setLastUsage(event.usage);
61
+ }
62
+ else if (event.type === 'final') {
58
63
  if (event.usage) {
59
64
  deps.loggingService.debug(`UI received final usage (${label})`, { usage: event.usage });
60
65
  deps.setLastUsage(event.usage);
@@ -1 +1 @@
1
- {"version":3,"file":"streaming-session-factory.js","sourceRoot":"","sources":["../../source/utils/streaming-session-factory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"streaming-session-factory.js","sourceRoot":"","sources":["../../source/utils/streaming-session-factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Synchronized Output wrapper for terminal rendering.
3
+ *
4
+ * Wraps stdout.write() calls with DEC Mode 2026 escape sequences
5
+ * (\x1b[?2026h to begin, \x1b[?2026l to end) so that terminal
6
+ * emulators which support it (iTerm2, WezTerm, foot, etc.) will
7
+ * buffer the entire update and render it as a single atomic frame.
8
+ *
9
+ * This eliminates the flickering that occurs in iTerm2 because Ink's
10
+ * incremental renderer issues multiple ANSI cursor-movement + erase
11
+ * sequences per render cycle; without synchronized output the terminal
12
+ * may render intermediate states (partially erased content) between
13
+ * individual write() calls.
14
+ *
15
+ * Terminals that do NOT support mode 2026 will silently ignore the
16
+ * escape sequences, so this is safe to enable unconditionally.
17
+ *
18
+ * Reference: https://gist.github.com/christianparpart/d8a62cc1ab659194571cd32e76cfd588
19
+ */
20
+ /**
21
+ * Check if the terminal likely supports synchronized output.
22
+ * iTerm2, WezTerm, foot, and many modern terminals support it.
23
+ * We enable it broadly since unsupported terminals just ignore the sequences.
24
+ */
25
+ export declare function isSynchronizedOutputSupported(): boolean;
26
+ /**
27
+ * Wraps a stdout write so the content is emitted inside a synchronized
28
+ * output block (DEC Mode 2026). The wrapper preserves the original
29
+ * `write()` signature and injects begin/end markers around each call.
30
+ *
31
+ * Usage:
32
+ * patchStdoutForSynchronizedOutput(process.stdout);
33
+ */
34
+ export declare function patchStdoutForSynchronizedOutput(stream: NodeJS.WriteStream): void;
35
+ //# sourceMappingURL=synchronized-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synchronized-output.d.ts","sourceRoot":"","sources":["../../source/utils/synchronized-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH;;;;GAIG;AACH,wBAAgB,6BAA6B,IAAI,OAAO,CAIvD;AAED;;;;;;;GAOG;AACH,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,GAAG,IAAI,CAgCjF"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Synchronized Output wrapper for terminal rendering.
3
+ *
4
+ * Wraps stdout.write() calls with DEC Mode 2026 escape sequences
5
+ * (\x1b[?2026h to begin, \x1b[?2026l to end) so that terminal
6
+ * emulators which support it (iTerm2, WezTerm, foot, etc.) will
7
+ * buffer the entire update and render it as a single atomic frame.
8
+ *
9
+ * This eliminates the flickering that occurs in iTerm2 because Ink's
10
+ * incremental renderer issues multiple ANSI cursor-movement + erase
11
+ * sequences per render cycle; without synchronized output the terminal
12
+ * may render intermediate states (partially erased content) between
13
+ * individual write() calls.
14
+ *
15
+ * Terminals that do NOT support mode 2026 will silently ignore the
16
+ * escape sequences, so this is safe to enable unconditionally.
17
+ *
18
+ * Reference: https://gist.github.com/christianparpart/d8a62cc1ab659194571cd32e76cfd588
19
+ */
20
+ const SYNC_START = '\x1b[?2026h';
21
+ const SYNC_END = '\x1b[?2026l';
22
+ /**
23
+ * Check if the terminal likely supports synchronized output.
24
+ * iTerm2, WezTerm, foot, and many modern terminals support it.
25
+ * We enable it broadly since unsupported terminals just ignore the sequences.
26
+ */
27
+ export function isSynchronizedOutputSupported() {
28
+ // Always return true — unsupported terminals silently ignore mode 2026.
29
+ // This keeps the logic simple and avoids false negatives.
30
+ return true;
31
+ }
32
+ /**
33
+ * Wraps a stdout write so the content is emitted inside a synchronized
34
+ * output block (DEC Mode 2026). The wrapper preserves the original
35
+ * `write()` signature and injects begin/end markers around each call.
36
+ *
37
+ * Usage:
38
+ * patchStdoutForSynchronizedOutput(process.stdout);
39
+ */
40
+ export function patchStdoutForSynchronizedOutput(stream) {
41
+ if (!isSynchronizedOutputSupported()) {
42
+ return;
43
+ }
44
+ const originalWrite = stream.write.bind(stream);
45
+ // Track nesting to avoid double-wrapping when Ink's own clear/write
46
+ // sequences trigger multiple write calls synchronously.
47
+ let syncing = false;
48
+ stream.write = function (chunk, encodingOrCallback, callback) {
49
+ // Avoid double-wrapping and only wrap string data (ANSI sequences).
50
+ // Binary data or nested calls pass through unchanged.
51
+ if (syncing || typeof chunk !== 'string') {
52
+ return originalWrite(chunk, encodingOrCallback, callback);
53
+ }
54
+ syncing = true;
55
+ try {
56
+ // Prefix the payload with the sync-start marker and suffix with
57
+ // sync-end, all in a single write to minimise I/O calls.
58
+ const wrapped = SYNC_START + chunk + SYNC_END;
59
+ return originalWrite(wrapped, encodingOrCallback, callback);
60
+ }
61
+ finally {
62
+ syncing = false;
63
+ }
64
+ };
65
+ }
66
+ //# sourceMappingURL=synchronized-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synchronized-output.js","sourceRoot":"","sources":["../../source/utils/synchronized-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,UAAU,GAAG,aAAa,CAAC;AACjC,MAAM,QAAQ,GAAG,aAAa,CAAC;AAE/B;;;;GAIG;AACH,MAAM,UAAU,6BAA6B;IAC3C,wEAAwE;IACxE,0DAA0D;IAC1D,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gCAAgC,CAAC,MAA0B;IACzE,IAAI,CAAC,6BAA6B,EAAE,EAAE,CAAC;QACrC,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAwB,CAAC;IAEvE,oEAAoE;IACpE,wDAAwD;IACxD,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,CAAC,KAAK,GAAG,UACb,KAAU,EACV,kBAAsE,EACtE,QAAyC;QAEzC,oEAAoE;QACpE,sDAAsD;QACtD,IAAI,OAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACzC,OAAO,aAAa,CAAC,KAAK,EAAE,kBAAyB,EAAE,QAAQ,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,GAAG,IAAI,CAAC;QACf,IAAI,CAAC;YACH,gEAAgE;YAChE,yDAAyD;YACzD,MAAM,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,QAAQ,CAAC;YAC9C,OAAO,aAAa,CAAC,OAAO,EAAE,kBAAyB,EAAE,QAAQ,CAAC,CAAC;QACrE,CAAC;gBAAS,CAAC;YACT,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;IACH,CAAwB,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=synchronized-output.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synchronized-output.test.d.ts","sourceRoot":"","sources":["../../source/utils/synchronized-output.test.ts"],"names":[],"mappings":""}