@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
@@ -1,156 +1,190 @@
1
1
  import test from 'ava';
2
- import { ConversationService } from './conversation-service.js';
2
+ import { ConversationService } from '../../dist/services/conversation-service.js';
3
3
  class MockStream {
4
- constructor(events) {
5
- this.events = events;
6
- this.completed = Promise.resolve();
7
- this.lastResponseId = 'resp_test';
8
- this.interruptions = [];
9
- this.state = {};
10
- this.newItems = [];
11
- this.history = [];
12
- this.finalOutput = '';
13
- }
14
- async *[Symbol.asyncIterator]() {
15
- for (const event of this.events) {
16
- yield event;
17
- }
4
+ constructor(events) {
5
+ this.events = events;
6
+ this.completed = Promise.resolve();
7
+ this.lastResponseId = 'resp_test';
8
+ this.interruptions = [];
9
+ this.state = {};
10
+ this.newItems = [];
11
+ this.history = [];
12
+ this.finalOutput = '';
13
+ }
14
+ async *[Symbol.asyncIterator]() {
15
+ for (const event of this.events) {
16
+ yield event;
18
17
  }
18
+ }
19
19
  }
20
- test('emits live text chunks for response.output_text.delta events', async (t) => {
21
- t.plan(3);
22
- const events = [
23
- { type: 'response.output_text.delta', delta: 'Hello' },
24
- { type: 'response.output_text.delta', delta: ' world' },
25
- ];
26
- const mockClient = {
27
- async startStream() {
28
- return new MockStream(events);
29
- },
30
- };
31
- const chunks = [];
32
- const service = new ConversationService({ agentClient: mockClient });
33
- const result = await service.sendMessage('hi', {
34
- onTextChunk(full, chunk) {
35
- chunks.push({ full, chunk });
36
- },
37
- });
38
- t.deepEqual(chunks, [
39
- { full: 'Hello', chunk: 'Hello' },
40
- { full: 'Hello world', chunk: ' world' },
41
- ]);
42
- t.is(result.type, 'response');
43
- t.is(result.finalText, 'Hello world');
44
- });
45
- test('passes previous response ids into subsequent runs', async (t) => {
46
- const streams = [new MockStream([]), new MockStream([])];
47
- streams[0].lastResponseId = 'resp-1';
48
- streams[0].finalOutput = 'First run done.';
49
- streams[1].lastResponseId = 'resp-2';
50
- streams[1].finalOutput = 'Second run done.';
51
- const startCalls = [];
52
- const mockClient = {
53
- async startStream(text, options) {
54
- const index = startCalls.length;
55
- startCalls.push({ text, options });
56
- return streams[index];
57
- },
58
- };
59
- const service = new ConversationService({ agentClient: mockClient });
60
- await service.sendMessage('first');
61
- const secondResult = await service.sendMessage('second');
62
- t.deepEqual(startCalls, [
63
- { text: 'first', options: { previousResponseId: null } },
64
- { text: 'second', options: { previousResponseId: 'resp-1' } },
65
- ]);
66
- t.is(secondResult.type, 'response');
67
- t.is(secondResult.finalText, 'Second run done.');
20
+ test('emits live text chunks for response.output_text.delta events', async t => {
21
+ t.plan(3);
22
+ const events = [{
23
+ type: 'response.output_text.delta',
24
+ delta: 'Hello'
25
+ }, {
26
+ type: 'response.output_text.delta',
27
+ delta: ' world'
28
+ }];
29
+ const mockClient = {
30
+ async startStream() {
31
+ return new MockStream(events);
32
+ }
33
+ };
34
+ const chunks = [];
35
+ const service = new ConversationService({
36
+ agentClient: mockClient
37
+ });
38
+ const result = await service.sendMessage('hi', {
39
+ onTextChunk(full, chunk) {
40
+ chunks.push({
41
+ full,
42
+ chunk
43
+ });
44
+ }
45
+ });
46
+ t.deepEqual(chunks, [{
47
+ full: 'Hello',
48
+ chunk: 'Hello'
49
+ }, {
50
+ full: 'Hello world',
51
+ chunk: ' world'
52
+ }]);
53
+ t.is(result.type, 'response');
54
+ t.is(result.finalText, 'Hello world');
68
55
  });
69
- test('emits approval interruptions and resumes after approval', async (t) => {
70
- const interruption = {
71
- name: 'bash',
72
- agent: { name: 'CLI Agent' },
73
- arguments: JSON.stringify({ command: 'echo hi' }),
74
- };
75
- const initialStream = new MockStream([]);
76
- initialStream.interruptions = [interruption];
77
- initialStream.state = {
78
- approveCalls: [],
79
- rejectCalls: [],
80
- approve(arg) {
81
- this.approveCalls.push(arg);
82
- },
83
- reject(arg) {
84
- this.rejectCalls.push(arg);
85
- },
86
- };
87
- const continuationStream = new MockStream([
88
- { type: 'response.output_text.delta', delta: 'Approved run' },
89
- ]);
90
- continuationStream.finalOutput = 'Approved run';
91
- const mockClient = {
92
- async startStream() {
93
- return initialStream;
94
- },
95
- async continueRunStream(state) {
96
- t.is(state, initialStream.state);
97
- return continuationStream;
98
- },
99
- };
100
- const service = new ConversationService({ agentClient: mockClient });
101
- const approvalResult = await service.sendMessage('run command');
102
- t.is(approvalResult.type, 'approval_required');
103
- t.is(approvalResult.approval.toolName, 'bash');
104
- t.is(approvalResult.approval.argumentsText, 'echo hi');
105
- const finalResult = await service.handleApprovalDecision('y');
106
- t.truthy(finalResult);
107
- t.is(finalResult.type, 'response');
108
- t.is(finalResult.finalText, 'Approved run');
109
- t.deepEqual(initialStream.state.approveCalls, [interruption]);
110
- t.deepEqual(initialStream.state.rejectCalls, []);
56
+ test('passes previous response ids into subsequent runs', async t => {
57
+ const streams = [new MockStream([]), new MockStream([])];
58
+ streams[0].lastResponseId = 'resp-1';
59
+ streams[0].finalOutput = 'First run done.';
60
+ streams[1].lastResponseId = 'resp-2';
61
+ streams[1].finalOutput = 'Second run done.';
62
+ const startCalls = [];
63
+ const mockClient = {
64
+ async startStream(text, options) {
65
+ const index = startCalls.length;
66
+ startCalls.push({
67
+ text,
68
+ options
69
+ });
70
+ return streams[index];
71
+ }
72
+ };
73
+ const service = new ConversationService({
74
+ agentClient: mockClient
75
+ });
76
+ await service.sendMessage('first');
77
+ const secondResult = await service.sendMessage('second');
78
+ t.deepEqual(startCalls, [{
79
+ text: 'first',
80
+ options: {
81
+ previousResponseId: null
82
+ }
83
+ }, {
84
+ text: 'second',
85
+ options: {
86
+ previousResponseId: 'resp-1'
87
+ }
88
+ }]);
89
+ t.is(secondResult.type, 'response');
90
+ t.is(secondResult.finalText, 'Second run done.');
111
91
  });
112
- test('dedupes command messages emitted live from run events', async (t) => {
113
- const commandPayload = JSON.stringify({
114
- command: 'ls',
115
- stdout: 'file.txt',
116
- success: true,
117
- });
118
- const rawItem = {
119
- id: 'call-123',
120
- type: 'function_call_result',
121
- name: 'bash',
122
- arguments: JSON.stringify({ command: 'ls' }),
123
- };
124
- const commandItem = {
125
- type: 'tool_call_output_item',
126
- name: 'bash',
127
- output: commandPayload,
128
- rawItem,
129
- };
130
- const events = [{ type: 'run_item_stream_event', item: commandItem }];
131
- const stream = new MockStream(events);
132
- stream.newItems = [commandItem];
133
- const emitted = [];
134
- const mockClient = {
135
- async startStream() {
136
- return stream;
137
- },
138
- };
139
- const service = new ConversationService({ agentClient: mockClient });
140
- const result = await service.sendMessage('run bash', {
141
- onCommandMessage(message) {
142
- emitted.push(message);
143
- },
144
- });
145
- t.deepEqual(emitted, [
146
- {
147
- id: 'call-123',
148
- sender: 'command',
149
- command: 'ls',
150
- output: 'file.txt',
151
- success: true,
152
- },
153
- ]);
154
- t.deepEqual(result.commandMessages, []);
92
+ test('emits approval interruptions and resumes after approval', async t => {
93
+ const interruption = {
94
+ name: 'bash',
95
+ agent: {
96
+ name: 'CLI Agent'
97
+ },
98
+ arguments: JSON.stringify({
99
+ command: 'echo hi'
100
+ })
101
+ };
102
+ const initialStream = new MockStream([]);
103
+ initialStream.interruptions = [interruption];
104
+ initialStream.state = {
105
+ approveCalls: [],
106
+ rejectCalls: [],
107
+ approve(arg) {
108
+ this.approveCalls.push(arg);
109
+ },
110
+ reject(arg) {
111
+ this.rejectCalls.push(arg);
112
+ }
113
+ };
114
+ const continuationStream = new MockStream([{
115
+ type: 'response.output_text.delta',
116
+ delta: 'Approved run'
117
+ }]);
118
+ continuationStream.finalOutput = 'Approved run';
119
+ const mockClient = {
120
+ async startStream() {
121
+ return initialStream;
122
+ },
123
+ async continueRunStream(state) {
124
+ t.is(state, initialStream.state);
125
+ return continuationStream;
126
+ }
127
+ };
128
+ const service = new ConversationService({
129
+ agentClient: mockClient
130
+ });
131
+ const approvalResult = await service.sendMessage('run command');
132
+ t.is(approvalResult.type, 'approval_required');
133
+ t.is(approvalResult.approval.toolName, 'bash');
134
+ t.is(approvalResult.approval.argumentsText, 'echo hi');
135
+ const finalResult = await service.handleApprovalDecision('y');
136
+ t.truthy(finalResult);
137
+ t.is(finalResult.type, 'response');
138
+ t.is(finalResult.finalText, 'Approved run');
139
+ t.deepEqual(initialStream.state.approveCalls, [interruption]);
140
+ t.deepEqual(initialStream.state.rejectCalls, []);
155
141
  });
156
- //# sourceMappingURL=conversation-service.test.js.map
142
+ test('dedupes command messages emitted live from run events', async t => {
143
+ const commandPayload = JSON.stringify({
144
+ command: 'ls',
145
+ stdout: 'file.txt',
146
+ success: true
147
+ });
148
+ const rawItem = {
149
+ id: 'call-123',
150
+ type: 'function_call_result',
151
+ name: 'bash',
152
+ arguments: JSON.stringify({
153
+ command: 'ls'
154
+ })
155
+ };
156
+ const commandItem = {
157
+ type: 'tool_call_output_item',
158
+ name: 'bash',
159
+ output: commandPayload,
160
+ rawItem
161
+ };
162
+ const events = [{
163
+ type: 'run_item_stream_event',
164
+ item: commandItem
165
+ }];
166
+ const stream = new MockStream(events);
167
+ stream.newItems = [commandItem];
168
+ const emitted = [];
169
+ const mockClient = {
170
+ async startStream() {
171
+ return stream;
172
+ }
173
+ };
174
+ const service = new ConversationService({
175
+ agentClient: mockClient
176
+ });
177
+ const result = await service.sendMessage('run bash', {
178
+ onCommandMessage(message) {
179
+ emitted.push(message);
180
+ }
181
+ });
182
+ t.deepEqual(emitted, [{
183
+ id: 'call-123',
184
+ sender: 'command',
185
+ command: 'ls',
186
+ output: 'file.txt',
187
+ success: true
188
+ }]);
189
+ t.deepEqual(result.commandMessages, []);
190
+ });
@@ -2,26 +2,9 @@ import type { OpenAIAgentClient } from '../lib/openai-agent-client.js';
2
2
  import type { ILoggingService } from './service-interfaces.js';
3
3
  import type { ConversationEvent } from './conversation-events.js';
4
4
  import type { CommandMessage } from '../tools/types.js';
5
- import { type NormalizedUsage } from '../utils/token-usage.js';
5
+ import type { ConversationTerminal, ReasoningEffortSetting } from '../contracts/conversation.js';
6
6
  export type { CommandMessage };
7
- interface ApprovalResult {
8
- type: 'approval_required';
9
- approval: {
10
- agentName: string;
11
- toolName: string;
12
- argumentsText: string;
13
- rawInterruption: any;
14
- callId?: string;
15
- };
16
- }
17
- interface ResponseResult {
18
- type: 'response';
19
- commandMessages: CommandMessage[];
20
- finalText: string;
21
- reasoningText?: string;
22
- usage?: NormalizedUsage;
23
- }
24
- export type ConversationResult = ApprovalResult | ResponseResult;
7
+ export type ConversationResult = ConversationTerminal;
25
8
  export declare class ConversationSession {
26
9
  #private;
27
10
  readonly id: string;
@@ -33,10 +16,7 @@ export declare class ConversationSession {
33
16
  private textDeltaCount;
34
17
  private reasoningDeltaCount;
35
18
  private toolCallArgumentsById;
36
- private lastEventType;
37
- private eventTypeCount;
38
19
  private emittedInvalidToolCallPackets;
39
- private flushStreamEventLog;
40
20
  constructor(id: string, { agentClient, deps }: {
41
21
  agentClient: OpenAIAgentClient;
42
22
  deps: {
@@ -45,8 +25,8 @@ export declare class ConversationSession {
45
25
  });
46
26
  reset(): void;
47
27
  setModel(model: string): void;
48
- setReasoningEffort(effort: any): void;
49
- setTemperature(temperature: any): void;
28
+ setReasoningEffort(effort: ReasoningEffortSetting): void;
29
+ setTemperature(temperature?: number): void;
50
30
  setProvider(provider: string): void;
51
31
  setRetryCallback(callback: () => void): void;
52
32
  addShellContext(historyText: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-session.d.ts","sourceRoot":"","sources":["../../source/services/conversation-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conversation-session.d.ts","sourceRoot":"","sources":["../../source/services/conversation-session.ts"],"names":[],"mappings":"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"}