@qduc/term2 0.1.6 → 0.1.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 (300) hide show
  1. package/dist/agent.lite-mode.test.d.ts +2 -0
  2. package/dist/agent.lite-mode.test.d.ts.map +1 -0
  3. package/dist/agent.lite-mode.test.js +39 -0
  4. package/dist/agent.lite-mode.test.js.map +1 -0
  5. package/dist/components/TextInput.d.ts.map +1 -1
  6. package/dist/components/TextInput.js +2 -1
  7. package/dist/components/TextInput.js.map +1 -1
  8. package/dist/components/TextInput.test.js.map +1 -1
  9. package/dist/debug_ask_mentor.d.ts +2 -0
  10. package/dist/debug_ask_mentor.d.ts.map +1 -0
  11. package/dist/debug_ask_mentor.js +73 -0
  12. package/dist/debug_ask_mentor.js.map +1 -0
  13. package/dist/lib/openai-agent-client.d.ts.map +1 -1
  14. package/dist/lib/openai-agent-client.js +2 -1
  15. package/dist/lib/openai-agent-client.js.map +1 -1
  16. package/dist/lib/openai-strict-tool-schema.d.ts +10 -0
  17. package/dist/lib/openai-strict-tool-schema.d.ts.map +1 -0
  18. package/dist/lib/openai-strict-tool-schema.js +39 -0
  19. package/dist/lib/openai-strict-tool-schema.js.map +1 -0
  20. package/dist/lib/openai-strict-tool-schema.test.d.ts +2 -0
  21. package/dist/lib/openai-strict-tool-schema.test.d.ts.map +1 -0
  22. package/dist/lib/openai-strict-tool-schema.test.js +26 -0
  23. package/dist/lib/openai-strict-tool-schema.test.js.map +1 -0
  24. package/dist/modes/companion/command-index.d.ts +26 -0
  25. package/dist/modes/companion/command-index.d.ts.map +1 -0
  26. package/dist/modes/companion/command-index.js +50 -0
  27. package/dist/modes/companion/command-index.js.map +1 -0
  28. package/dist/modes/companion/command-index.test.d.ts +2 -0
  29. package/dist/modes/companion/command-index.test.d.ts.map +1 -0
  30. package/dist/modes/companion/command-index.test.js +86 -0
  31. package/dist/modes/companion/command-index.test.js.map +1 -0
  32. package/dist/modes/companion/companion-app.d.ts +12 -0
  33. package/dist/modes/companion/companion-app.d.ts.map +1 -0
  34. package/dist/modes/companion/companion-app.js +297 -0
  35. package/dist/modes/companion/companion-app.js.map +1 -0
  36. package/dist/modes/companion/companion-session.d.ts +63 -0
  37. package/dist/modes/companion/companion-session.d.ts.map +1 -0
  38. package/dist/modes/companion/companion-session.js +146 -0
  39. package/dist/modes/companion/companion-session.js.map +1 -0
  40. package/dist/modes/companion/companion-session.test.d.ts +2 -0
  41. package/dist/modes/companion/companion-session.test.d.ts.map +1 -0
  42. package/dist/modes/companion/companion-session.test.js +28 -0
  43. package/dist/modes/companion/companion-session.test.js.map +1 -0
  44. package/dist/modes/companion/components/status-bar.d.ts +13 -0
  45. package/dist/modes/companion/components/status-bar.d.ts.map +1 -0
  46. package/dist/modes/companion/components/status-bar.js +26 -0
  47. package/dist/modes/companion/components/status-bar.js.map +1 -0
  48. package/dist/modes/companion/context-buffer.d.ts +65 -0
  49. package/dist/modes/companion/context-buffer.d.ts.map +1 -0
  50. package/dist/modes/companion/context-buffer.js +156 -0
  51. package/dist/modes/companion/context-buffer.js.map +1 -0
  52. package/dist/modes/companion/context-buffer.test.d.ts +2 -0
  53. package/dist/modes/companion/context-buffer.test.d.ts.map +1 -0
  54. package/dist/modes/companion/context-buffer.test.js +154 -0
  55. package/dist/modes/companion/context-buffer.test.js.map +1 -0
  56. package/dist/modes/companion/event-detector.d.ts +46 -0
  57. package/dist/modes/companion/event-detector.d.ts.map +1 -0
  58. package/dist/modes/companion/event-detector.js +169 -0
  59. package/dist/modes/companion/event-detector.js.map +1 -0
  60. package/dist/modes/companion/event-detector.test.d.ts +2 -0
  61. package/dist/modes/companion/event-detector.test.d.ts.map +1 -0
  62. package/dist/modes/companion/event-detector.test.js +121 -0
  63. package/dist/modes/companion/event-detector.test.js.map +1 -0
  64. package/dist/modes/companion/index.d.ts +33 -0
  65. package/dist/modes/companion/index.d.ts.map +1 -0
  66. package/dist/modes/companion/index.js +21 -0
  67. package/dist/modes/companion/index.js.map +1 -0
  68. package/dist/modes/companion/input-key-mapper.d.ts +3 -0
  69. package/dist/modes/companion/input-key-mapper.d.ts.map +1 -0
  70. package/dist/modes/companion/input-key-mapper.js +31 -0
  71. package/dist/modes/companion/input-key-mapper.js.map +1 -0
  72. package/dist/modes/companion/input-key-mapper.test.d.ts +2 -0
  73. package/dist/modes/companion/input-key-mapper.test.d.ts.map +1 -0
  74. package/dist/modes/companion/input-key-mapper.test.js +26 -0
  75. package/dist/modes/companion/input-key-mapper.test.js.map +1 -0
  76. package/dist/modes/companion/input-parser.d.ts +53 -0
  77. package/dist/modes/companion/input-parser.d.ts.map +1 -0
  78. package/dist/modes/companion/input-parser.js +114 -0
  79. package/dist/modes/companion/input-parser.js.map +1 -0
  80. package/dist/modes/companion/input-parser.test.d.ts +2 -0
  81. package/dist/modes/companion/input-parser.test.d.ts.map +1 -0
  82. package/dist/modes/companion/input-parser.test.js +123 -0
  83. package/dist/modes/companion/input-parser.test.js.map +1 -0
  84. package/dist/modes/companion/mode-manager.d.ts +41 -0
  85. package/dist/modes/companion/mode-manager.d.ts.map +1 -0
  86. package/dist/modes/companion/mode-manager.js +56 -0
  87. package/dist/modes/companion/mode-manager.js.map +1 -0
  88. package/dist/modes/companion/mode-manager.test.d.ts +2 -0
  89. package/dist/modes/companion/mode-manager.test.d.ts.map +1 -0
  90. package/dist/modes/companion/mode-manager.test.js +65 -0
  91. package/dist/modes/companion/mode-manager.test.js.map +1 -0
  92. package/dist/modes/companion/output-classifier.d.ts +15 -0
  93. package/dist/modes/companion/output-classifier.d.ts.map +1 -0
  94. package/dist/modes/companion/output-classifier.js +77 -0
  95. package/dist/modes/companion/output-classifier.js.map +1 -0
  96. package/dist/modes/companion/output-classifier.test.d.ts +2 -0
  97. package/dist/modes/companion/output-classifier.test.d.ts.map +1 -0
  98. package/dist/modes/companion/output-classifier.test.js +133 -0
  99. package/dist/modes/companion/output-classifier.test.js.map +1 -0
  100. package/dist/modes/companion/pty-wrapper.d.ts +46 -0
  101. package/dist/modes/companion/pty-wrapper.d.ts.map +1 -0
  102. package/dist/modes/companion/pty-wrapper.js +143 -0
  103. package/dist/modes/companion/pty-wrapper.js.map +1 -0
  104. package/dist/modes/companion/safety-classifier.d.ts +31 -0
  105. package/dist/modes/companion/safety-classifier.d.ts.map +1 -0
  106. package/dist/modes/companion/safety-classifier.js +140 -0
  107. package/dist/modes/companion/safety-classifier.js.map +1 -0
  108. package/dist/modes/companion/safety-classifier.test.d.ts +2 -0
  109. package/dist/modes/companion/safety-classifier.test.d.ts.map +1 -0
  110. package/dist/modes/companion/safety-classifier.test.js +151 -0
  111. package/dist/modes/companion/safety-classifier.test.js.map +1 -0
  112. package/dist/modes/companion/summarizer.d.ts +24 -0
  113. package/dist/modes/companion/summarizer.d.ts.map +1 -0
  114. package/dist/modes/companion/summarizer.js +132 -0
  115. package/dist/modes/companion/summarizer.js.map +1 -0
  116. package/dist/modes/companion/terminal-history.d.ts +27 -0
  117. package/dist/modes/companion/terminal-history.d.ts.map +1 -0
  118. package/dist/modes/companion/terminal-history.js +142 -0
  119. package/dist/modes/companion/terminal-history.js.map +1 -0
  120. package/dist/prompts/simple-mentor.md +8 -0
  121. package/dist/providers/github-copilot/model.d.ts.map +1 -1
  122. package/dist/providers/github-copilot/model.js +25 -108
  123. package/dist/providers/github-copilot/model.js.map +1 -1
  124. package/dist/providers/github-copilot/model.test.d.ts +2 -0
  125. package/dist/providers/github-copilot/model.test.d.ts.map +1 -0
  126. package/dist/providers/github-copilot/model.test.js +63 -0
  127. package/dist/providers/github-copilot/model.test.js.map +1 -0
  128. package/dist/providers/github-copilot/provider.d.ts +0 -5
  129. package/dist/providers/github-copilot/provider.d.ts.map +1 -1
  130. package/dist/providers/github-copilot/provider.js +2 -7
  131. package/dist/providers/github-copilot/provider.js.map +1 -1
  132. package/dist/providers/openai-compatible/model.js +3 -3
  133. package/dist/providers/openai-compatible/model.js.map +1 -1
  134. package/dist/providers/openai-compatible/reasoning-content.test.js +70 -0
  135. package/dist/providers/openai-compatible/reasoning-content.test.js.map +1 -1
  136. package/dist/providers/openrouter/model.js +3 -3
  137. package/dist/providers/openrouter/model.js.map +1 -1
  138. package/dist/providers/openrouter/utils.d.ts +1 -0
  139. package/dist/providers/openrouter/utils.d.ts.map +1 -1
  140. package/dist/providers/openrouter/utils.js +3 -0
  141. package/dist/providers/openrouter/utils.js.map +1 -1
  142. package/dist/providers/openrouter.test.js +64 -0
  143. package/dist/providers/openrouter.test.js.map +1 -1
  144. package/dist/services/check_mock.d.ts +2 -0
  145. package/dist/services/check_mock.d.ts.map +1 -0
  146. package/dist/services/check_mock.js +22 -0
  147. package/dist/services/check_mock.js.map +1 -0
  148. package/dist/services/conversation-service.test.d.ts +2 -0
  149. package/dist/services/conversation-service.test.d.ts.map +1 -0
  150. package/dist/services/conversation-service.test.js +149 -183
  151. package/dist/services/conversation-service.test.js.map +1 -0
  152. package/dist/tools/ask-mentor.d.ts +1 -1
  153. package/dist/tools/ask-mentor.js +1 -1
  154. package/dist/tools/ask-mentor.js.map +1 -1
  155. package/dist/tools/ask-mentor.test.js +9 -3
  156. package/dist/tools/ask-mentor.test.js.map +1 -1
  157. package/dist/tools/find-files.d.ts +2 -2
  158. package/dist/tools/find-files.d.ts.map +1 -1
  159. package/dist/tools/find-files.js +2 -4
  160. package/dist/tools/find-files.js.map +1 -1
  161. package/dist/tools/find-files.test.js +7 -19
  162. package/dist/tools/find-files.test.js.map +1 -1
  163. package/dist/tools/grep.d.ts +1 -1
  164. package/dist/tools/grep.d.ts.map +1 -1
  165. package/dist/tools/grep.js +1 -5
  166. package/dist/tools/grep.js.map +1 -1
  167. package/dist/tools/read-file.d.ts +2 -2
  168. package/dist/tools/read-file.d.ts.map +1 -1
  169. package/dist/tools/read-file.js +2 -4
  170. package/dist/tools/read-file.js.map +1 -1
  171. package/dist/tools/read-file.test.js +7 -13
  172. package/dist/tools/read-file.test.js.map +1 -1
  173. package/dist/tools/search-replace.d.ts +1 -1
  174. package/dist/tools/search-replace.d.ts.map +1 -1
  175. package/dist/tools/search-replace.js +1 -0
  176. package/dist/tools/search-replace.js.map +1 -1
  177. package/dist/tools/search.d.ts +4 -4
  178. package/dist/tools/search.d.ts.map +1 -1
  179. package/dist/tools/search.js +5 -14
  180. package/dist/tools/search.js.map +1 -1
  181. package/dist/tools/shell.d.ts +2 -2
  182. package/dist/tools/shell.d.ts.map +1 -1
  183. package/dist/tools/shell.js +2 -4
  184. package/dist/tools/shell.js.map +1 -1
  185. package/dist/tools/tool-parameter-schema.test.d.ts +2 -0
  186. package/dist/tools/tool-parameter-schema.test.d.ts.map +1 -0
  187. package/dist/tools/tool-parameter-schema.test.js +88 -0
  188. package/dist/tools/tool-parameter-schema.test.js.map +1 -0
  189. package/dist/tools/web-fetch.d.ts +3 -3
  190. package/dist/tools/web-fetch.d.ts.map +1 -1
  191. package/dist/tools/web-fetch.js +3 -2
  192. package/dist/tools/web-fetch.js.map +1 -1
  193. package/dist/utils/command-safety.d.ts.map +1 -1
  194. package/dist/utils/command-safety.devnull.test.d.ts +2 -0
  195. package/dist/utils/command-safety.devnull.test.d.ts.map +1 -0
  196. package/dist/utils/command-safety.devnull.test.js +13 -0
  197. package/dist/utils/command-safety.devnull.test.js.map +1 -0
  198. package/dist/utils/command-safety.js +10 -364
  199. package/dist/utils/command-safety.js.map +1 -1
  200. package/dist/utils/extract-command-messages.test.d.ts +2 -0
  201. package/dist/utils/extract-command-messages.test.d.ts.map +1 -0
  202. package/dist/utils/extract-command-messages.test.js +58 -51
  203. package/dist/utils/extract-command-messages.test.js.map +1 -0
  204. package/package.json +1 -1
  205. package/dist/app.model-command-feedback.test.d.ts +0 -2
  206. package/dist/app.model-command-feedback.test.d.ts.map +0 -1
  207. package/dist/app.model-command-feedback.test.js +0 -19
  208. package/dist/app.model-command-feedback.test.js.map +0 -1
  209. package/dist/components/MentorMode.test.d.ts +0 -2
  210. package/dist/components/MentorMode.test.d.ts.map +0 -1
  211. package/dist/components/MentorMode.test.js.map +0 -1
  212. package/dist/components/StatusBar.test.d.ts +0 -2
  213. package/dist/components/StatusBar.test.d.ts.map +0 -1
  214. package/dist/components/StatusBar.test.js +0 -19
  215. package/dist/components/StatusBar.test.js.map +0 -1
  216. package/dist/debug-schema.d.ts +0 -2
  217. package/dist/debug-schema.d.ts.map +0 -1
  218. package/dist/debug-schema.js +0 -22
  219. package/dist/debug-schema.js.map +0 -1
  220. package/dist/hooks/use-model-selection.test.d.ts +0 -2
  221. package/dist/hooks/use-model-selection.test.d.ts.map +0 -1
  222. package/dist/hooks/use-model-selection.test.js +0 -28
  223. package/dist/hooks/use-model-selection.test.js.map +0 -1
  224. package/dist/hooks/use-path-completion.test.d.ts +0 -2
  225. package/dist/hooks/use-path-completion.test.d.ts.map +0 -1
  226. package/dist/hooks/use-path-completion.test.js +0 -29
  227. package/dist/hooks/use-path-completion.test.js.map +0 -1
  228. package/dist/lib/mentor-client.d.ts +0 -41
  229. package/dist/lib/mentor-client.d.ts.map +0 -1
  230. package/dist/lib/mentor-client.js +0 -146
  231. package/dist/lib/mentor-client.js.map +0 -1
  232. package/dist/lib/mentor-client.test.d.ts +0 -2
  233. package/dist/lib/mentor-client.test.d.ts.map +0 -1
  234. package/dist/lib/mentor-client.test.js +0 -440
  235. package/dist/lib/mentor-client.test.js.map +0 -1
  236. package/dist/lib/retry-strategy.d.ts +0 -43
  237. package/dist/lib/retry-strategy.d.ts.map +0 -1
  238. package/dist/lib/retry-strategy.js +0 -93
  239. package/dist/lib/retry-strategy.js.map +0 -1
  240. package/dist/lib/retry-strategy.test.d.ts +0 -2
  241. package/dist/lib/retry-strategy.test.d.ts.map +0 -1
  242. package/dist/lib/retry-strategy.test.js +0 -200
  243. package/dist/lib/retry-strategy.test.js.map +0 -1
  244. package/dist/prompts/default.md.bak +0 -77
  245. package/dist/providers/github-copilot/model-direct.d.ts +0 -34
  246. package/dist/providers/github-copilot/model-direct.d.ts.map +0 -1
  247. package/dist/providers/github-copilot/model-direct.js +0 -443
  248. package/dist/providers/github-copilot/model-direct.js.map +0 -1
  249. package/dist/providers/openrouter/merge-messages.test.d.ts +0 -2
  250. package/dist/providers/openrouter/merge-messages.test.d.ts.map +0 -1
  251. package/dist/providers/openrouter/merge-messages.test.js +0 -83
  252. package/dist/providers/openrouter/merge-messages.test.js.map +0 -1
  253. package/dist/providers/openrouter.history.test.d.ts +0 -2
  254. package/dist/providers/openrouter.history.test.d.ts.map +0 -1
  255. package/dist/providers/openrouter.history.test.js +0 -533
  256. package/dist/providers/openrouter.history.test.js.map +0 -1
  257. package/dist/reproduce_issue.test.d.ts +0 -2
  258. package/dist/reproduce_issue.test.d.ts.map +0 -1
  259. package/dist/reproduce_issue.test.js +0 -31
  260. package/dist/reproduce_issue.test.js.map +0 -1
  261. package/dist/services/conversation-result-builder.d.ts +0 -41
  262. package/dist/services/conversation-result-builder.d.ts.map +0 -1
  263. package/dist/services/conversation-result-builder.js +0 -110
  264. package/dist/services/conversation-result-builder.js.map +0 -1
  265. package/dist/services/conversation-result-builder.test.d.ts +0 -2
  266. package/dist/services/conversation-result-builder.test.d.ts.map +0 -1
  267. package/dist/services/conversation-result-builder.test.js +0 -76
  268. package/dist/services/conversation-result-builder.test.js.map +0 -1
  269. package/dist/services/conversation-session.usage.test.d.ts +0 -2
  270. package/dist/services/conversation-session.usage.test.d.ts.map +0 -1
  271. package/dist/services/conversation-session.usage.test.js +0 -59
  272. package/dist/services/conversation-session.usage.test.js.map +0 -1
  273. package/dist/services/stream-event-processor.d.ts +0 -32
  274. package/dist/services/stream-event-processor.d.ts.map +0 -1
  275. package/dist/services/stream-event-processor.js +0 -344
  276. package/dist/services/stream-event-processor.js.map +0 -1
  277. package/dist/services/stream-event-processor.test.d.ts +0 -2
  278. package/dist/services/stream-event-processor.test.d.ts.map +0 -1
  279. package/dist/services/stream-event-processor.test.js +0 -117
  280. package/dist/services/stream-event-processor.test.js.map +0 -1
  281. package/dist/test-search-tool.d.ts +0 -2
  282. package/dist/test-search-tool.d.ts.map +0 -1
  283. package/dist/test-search-tool.js +0 -36
  284. package/dist/test-search-tool.js.map +0 -1
  285. package/dist/types/messages.d.ts +0 -29
  286. package/dist/types/messages.d.ts.map +0 -1
  287. package/dist/types/messages.js +0 -2
  288. package/dist/types/messages.js.map +0 -1
  289. package/dist/utils/extract-command-messages.repro.test.d.ts +0 -2
  290. package/dist/utils/extract-command-messages.repro.test.d.ts.map +0 -1
  291. package/dist/utils/extract-command-messages.repro.test.js +0 -31
  292. package/dist/utils/extract-command-messages.repro.test.js.map +0 -1
  293. package/dist/utils/message-utils.d.ts +0 -17
  294. package/dist/utils/message-utils.d.ts.map +0 -1
  295. package/dist/utils/message-utils.js +0 -52
  296. package/dist/utils/message-utils.js.map +0 -1
  297. package/dist/utils/message-utils.test.d.ts +0 -2
  298. package/dist/utils/message-utils.test.d.ts.map +0 -1
  299. package/dist/utils/message-utils.test.js +0 -48
  300. package/dist/utils/message-utils.test.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=input-parser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-parser.test.d.ts","sourceRoot":"","sources":["../../../source/modes/companion/input-parser.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,123 @@
1
+ import test from 'ava';
2
+ import { parseCompanionInput, isShellPrompt, extractCommandFromPromptLine, CommandOutputBuffer, } from './input-parser.js';
3
+ // parseCompanionInput tests
4
+ test('parseCompanionInput detects ?? query with content', t => {
5
+ const result = parseCompanionInput('?? why did this fail');
6
+ t.is(result.type, 'query');
7
+ t.is(result.content, 'why did this fail');
8
+ });
9
+ test('parseCompanionInput detects bare ?? query', t => {
10
+ const result = parseCompanionInput('??');
11
+ t.is(result.type, 'query');
12
+ t.is(result.content, '');
13
+ });
14
+ test('parseCompanionInput detects ?? with extra spaces', t => {
15
+ const result = parseCompanionInput('?? how do I fix this ');
16
+ t.is(result.type, 'query');
17
+ t.is(result.content, 'how do I fix this');
18
+ });
19
+ test('parseCompanionInput detects !auto command', t => {
20
+ const result = parseCompanionInput('!auto fix the tests');
21
+ t.is(result.type, 'auto');
22
+ t.is(result.content, 'fix the tests');
23
+ });
24
+ test('parseCompanionInput detects bare !auto', t => {
25
+ const result = parseCompanionInput('!auto');
26
+ t.is(result.type, 'auto');
27
+ t.is(result.content, '');
28
+ });
29
+ test('parseCompanionInput returns normal for regular input', t => {
30
+ const result = parseCompanionInput('npm test');
31
+ t.is(result.type, 'normal');
32
+ t.is(result.content, 'npm test');
33
+ });
34
+ test('parseCompanionInput handles whitespace-only input', t => {
35
+ const result = parseCompanionInput(' ');
36
+ t.is(result.type, 'normal');
37
+ t.is(result.content, '');
38
+ });
39
+ test('parseCompanionInput does not detect ?? in middle of string', t => {
40
+ const result = parseCompanionInput('echo "?? test"');
41
+ t.is(result.type, 'normal');
42
+ t.is(result.content, 'echo "?? test"');
43
+ });
44
+ // isShellPrompt tests
45
+ test('isShellPrompt detects bash prompt ending with $', t => {
46
+ t.true(isShellPrompt('user@host:~/project$ '));
47
+ t.true(isShellPrompt('$ '));
48
+ t.true(isShellPrompt('[~/project]$ '));
49
+ });
50
+ test('isShellPrompt detects zsh prompt ending with %', t => {
51
+ t.true(isShellPrompt('% '));
52
+ t.true(isShellPrompt('user@host % '));
53
+ });
54
+ test('isShellPrompt detects prompt ending with >', t => {
55
+ t.true(isShellPrompt('> '));
56
+ t.true(isShellPrompt('PS1> '));
57
+ });
58
+ test('isShellPrompt detects oh-my-zsh prompt', t => {
59
+ t.true(isShellPrompt('❯ '));
60
+ t.true(isShellPrompt('~/project ❯ '));
61
+ });
62
+ test('isShellPrompt returns false for regular output', t => {
63
+ t.false(isShellPrompt('npm test'));
64
+ t.false(isShellPrompt('error: file not found'));
65
+ t.false(isShellPrompt(''));
66
+ });
67
+ // extractCommandFromPromptLine tests
68
+ test('extractCommandFromPromptLine extracts command after $', t => {
69
+ const result = extractCommandFromPromptLine('user@host:~$ npm test');
70
+ t.is(result, 'npm test');
71
+ });
72
+ test('extractCommandFromPromptLine extracts command after %', t => {
73
+ const result = extractCommandFromPromptLine('% git status');
74
+ t.is(result, 'git status');
75
+ });
76
+ test('extractCommandFromPromptLine returns null for prompt only', t => {
77
+ const result = extractCommandFromPromptLine('user@host:~$ ');
78
+ t.is(result, null);
79
+ });
80
+ test('extractCommandFromPromptLine returns null for non-prompt line', t => {
81
+ const result = extractCommandFromPromptLine('npm test output');
82
+ t.is(result, null);
83
+ });
84
+ // CommandOutputBuffer tests
85
+ test('CommandOutputBuffer starts not waiting for output', t => {
86
+ const buffer = new CommandOutputBuffer();
87
+ t.false(buffer.isWaitingForOutput);
88
+ });
89
+ test('CommandOutputBuffer tracks current command', t => {
90
+ const buffer = new CommandOutputBuffer();
91
+ buffer.startCommand('npm test');
92
+ t.true(buffer.isWaitingForOutput);
93
+ });
94
+ test('CommandOutputBuffer returns null when no command boundary', t => {
95
+ const buffer = new CommandOutputBuffer();
96
+ buffer.startCommand('npm test');
97
+ const result = buffer.processData('test output\nmore output');
98
+ t.is(result, null);
99
+ });
100
+ test('CommandOutputBuffer detects command completion', t => {
101
+ const buffer = new CommandOutputBuffer();
102
+ buffer.startCommand('npm test');
103
+ buffer.processData('PASS test.js\n');
104
+ const result = buffer.processData('user@host:~$ ');
105
+ t.not(result, null);
106
+ t.is(result?.command, 'npm test');
107
+ t.true(result?.output.includes('PASS test.js'));
108
+ });
109
+ test('CommandOutputBuffer resets after command completion', t => {
110
+ const buffer = new CommandOutputBuffer();
111
+ buffer.startCommand('npm test');
112
+ buffer.processData('output\nuser@host:~$ ');
113
+ t.false(buffer.isWaitingForOutput);
114
+ });
115
+ test('CommandOutputBuffer.clear resets state', t => {
116
+ const buffer = new CommandOutputBuffer();
117
+ buffer.startCommand('npm test');
118
+ buffer.processData('output');
119
+ buffer.clear();
120
+ t.false(buffer.isWaitingForOutput);
121
+ t.is(buffer.promptLine, '');
122
+ });
123
+ //# sourceMappingURL=input-parser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-parser.test.js","sourceRoot":"","sources":["../../../source/modes/companion/input-parser.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { EventEmitter } from 'events';
2
+ export type CompanionMode = 'watch' | 'auto';
3
+ export interface ModeManagerEvents {
4
+ modeChange: (mode: CompanionMode, previousMode: CompanionMode) => void;
5
+ }
6
+ /**
7
+ * Mode manager for companion mode.
8
+ * Handles transitions between Watch and Auto modes.
9
+ */
10
+ export declare class ModeManager extends EventEmitter {
11
+ #private;
12
+ /**
13
+ * Get the current mode.
14
+ */
15
+ get mode(): CompanionMode;
16
+ /**
17
+ * Check if in watch mode.
18
+ */
19
+ get isWatchMode(): boolean;
20
+ /**
21
+ * Check if in auto mode.
22
+ */
23
+ get isAutoMode(): boolean;
24
+ /**
25
+ * Set the mode.
26
+ */
27
+ setMode(mode: CompanionMode): void;
28
+ /**
29
+ * Enter watch mode.
30
+ */
31
+ enterWatchMode(): void;
32
+ /**
33
+ * Enter auto mode.
34
+ */
35
+ enterAutoMode(): void;
36
+ /**
37
+ * Reset to default mode (watch).
38
+ */
39
+ reset(): void;
40
+ }
41
+ //# sourceMappingURL=mode-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-manager.d.ts","sourceRoot":"","sources":["../../../source/modes/companion/mode-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,QAAQ,CAAC;AAEpC,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC;AAE7C,MAAM,WAAW,iBAAiB;IAC9B,UAAU,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,KAAK,IAAI,CAAC;CAC1E;AAED;;;GAGG;AACH,qBAAa,WAAY,SAAQ,YAAY;;IAGzC;;OAEG;IACH,IAAI,IAAI,IAAI,aAAa,CAExB;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAUlC;;OAEG;IACH,cAAc,IAAI,IAAI;IAItB;;OAEG;IACH,aAAa,IAAI,IAAI;IAIrB;;OAEG;IACH,KAAK,IAAI,IAAI;CAGhB"}
@@ -0,0 +1,56 @@
1
+ import { EventEmitter } from 'events';
2
+ /**
3
+ * Mode manager for companion mode.
4
+ * Handles transitions between Watch and Auto modes.
5
+ */
6
+ export class ModeManager extends EventEmitter {
7
+ #currentMode = 'watch';
8
+ /**
9
+ * Get the current mode.
10
+ */
11
+ get mode() {
12
+ return this.#currentMode;
13
+ }
14
+ /**
15
+ * Check if in watch mode.
16
+ */
17
+ get isWatchMode() {
18
+ return this.#currentMode === 'watch';
19
+ }
20
+ /**
21
+ * Check if in auto mode.
22
+ */
23
+ get isAutoMode() {
24
+ return this.#currentMode === 'auto';
25
+ }
26
+ /**
27
+ * Set the mode.
28
+ */
29
+ setMode(mode) {
30
+ if (mode === this.#currentMode) {
31
+ return;
32
+ }
33
+ const previousMode = this.#currentMode;
34
+ this.#currentMode = mode;
35
+ this.emit('modeChange', mode, previousMode);
36
+ }
37
+ /**
38
+ * Enter watch mode.
39
+ */
40
+ enterWatchMode() {
41
+ this.setMode('watch');
42
+ }
43
+ /**
44
+ * Enter auto mode.
45
+ */
46
+ enterAutoMode() {
47
+ this.setMode('auto');
48
+ }
49
+ /**
50
+ * Reset to default mode (watch).
51
+ */
52
+ reset() {
53
+ this.#currentMode = 'watch';
54
+ }
55
+ }
56
+ //# sourceMappingURL=mode-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-manager.js","sourceRoot":"","sources":["../../../source/modes/companion/mode-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,QAAQ,CAAC;AAQpC;;;GAGG;AACH,MAAM,OAAO,WAAY,SAAQ,YAAY;IACzC,YAAY,GAAkB,OAAO,CAAC;IAEtC;;OAEG;IACH,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,IAAI,WAAW;QACX,OAAO,IAAI,CAAC,YAAY,KAAK,OAAO,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,YAAY,KAAK,MAAM,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,IAAmB;QACvB,IAAI,IAAI,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;YAC7B,OAAO;QACX,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,cAAc;QACV,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,aAAa;QACT,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK;QACD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;IAChC,CAAC;CACJ"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mode-manager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-manager.test.d.ts","sourceRoot":"","sources":["../../../source/modes/companion/mode-manager.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ import test from 'ava';
2
+ import { ModeManager } from './mode-manager.js';
3
+ test('starts in watch mode by default', t => {
4
+ const manager = new ModeManager();
5
+ t.is(manager.mode, 'watch');
6
+ t.true(manager.isWatchMode);
7
+ t.false(manager.isAutoMode);
8
+ });
9
+ test('setMode changes the current mode', t => {
10
+ const manager = new ModeManager();
11
+ manager.setMode('auto');
12
+ t.is(manager.mode, 'auto');
13
+ t.false(manager.isWatchMode);
14
+ t.true(manager.isAutoMode);
15
+ });
16
+ test('enterWatchMode sets mode to watch', t => {
17
+ const manager = new ModeManager();
18
+ manager.setMode('auto');
19
+ manager.enterWatchMode();
20
+ t.is(manager.mode, 'watch');
21
+ });
22
+ test('enterAutoMode sets mode to auto', t => {
23
+ const manager = new ModeManager();
24
+ manager.enterAutoMode();
25
+ t.is(manager.mode, 'auto');
26
+ });
27
+ test('emits modeChange event on mode change', t => {
28
+ const manager = new ModeManager();
29
+ const events = [];
30
+ manager.on('modeChange', (mode, previousMode) => {
31
+ events.push({ mode, previousMode });
32
+ });
33
+ manager.setMode('auto');
34
+ manager.setMode('watch');
35
+ t.is(events.length, 2);
36
+ t.deepEqual(events[0], { mode: 'auto', previousMode: 'watch' });
37
+ t.deepEqual(events[1], { mode: 'watch', previousMode: 'auto' });
38
+ });
39
+ test('does not emit modeChange when mode is the same', t => {
40
+ const manager = new ModeManager();
41
+ let eventCount = 0;
42
+ manager.on('modeChange', () => {
43
+ eventCount++;
44
+ });
45
+ manager.setMode('watch'); // Same as current
46
+ t.is(eventCount, 0);
47
+ });
48
+ test('reset returns to watch mode', t => {
49
+ const manager = new ModeManager();
50
+ manager.setMode('auto');
51
+ manager.reset();
52
+ t.is(manager.mode, 'watch');
53
+ });
54
+ test('reset does not emit event', t => {
55
+ const manager = new ModeManager();
56
+ let eventCount = 0;
57
+ manager.setMode('auto');
58
+ manager.on('modeChange', () => {
59
+ eventCount++;
60
+ });
61
+ manager.reset();
62
+ // reset() directly sets the mode without emitting
63
+ t.is(eventCount, 0);
64
+ });
65
+ //# sourceMappingURL=mode-manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-manager.test.js","sourceRoot":"","sources":["../../../source/modes/companion/mode-manager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { CommandEntry } from './context-buffer.js';
2
+ export type OutputType = 'test_results' | 'build_output' | 'git_output' | 'npm_output' | 'error_output' | 'general';
3
+ /**
4
+ * Classify the type of command output for better summarization.
5
+ */
6
+ export declare function classifyOutputType(entry: CommandEntry): OutputType;
7
+ /**
8
+ * Check if output should be summarized (vs returned as-is).
9
+ */
10
+ export declare function shouldSummarize(entry: CommandEntry): boolean;
11
+ /**
12
+ * Get summarization prompt for the output type.
13
+ */
14
+ export declare function getSummarizationPrompt(outputType: OutputType): string;
15
+ //# sourceMappingURL=output-classifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-classifier.d.ts","sourceRoot":"","sources":["../../../source/modes/companion/output-classifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AAEtD,MAAM,MAAM,UAAU,GAChB,cAAc,GACd,cAAc,GACd,YAAY,GACZ,YAAY,GACZ,cAAc,GACd,SAAS,CAAC;AAEhB;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,UAAU,CAqClE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAe5D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAmCrE"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Classify the type of command output for better summarization.
3
+ */
4
+ export function classifyOutputType(entry) {
5
+ const cmd = entry.command.toLowerCase().trim();
6
+ // Test commands
7
+ if (/^(npm test|yarn test|pnpm test|jest|vitest|ava|mocha|pytest|go test|cargo test)/.test(cmd)) {
8
+ return 'test_results';
9
+ }
10
+ // Build commands
11
+ if (/^(npm run build|yarn build|pnpm build|tsc|webpack|vite build|cargo build|go build|make)/.test(cmd)) {
12
+ return 'build_output';
13
+ }
14
+ // Git commands
15
+ if (/^git\s/.test(cmd)) {
16
+ return 'git_output';
17
+ }
18
+ // NPM commands
19
+ if (/^(npm|yarn|pnpm)\s/.test(cmd)) {
20
+ return 'npm_output';
21
+ }
22
+ // Error indication
23
+ if (entry.exitCode !== 0) {
24
+ return 'error_output';
25
+ }
26
+ return 'general';
27
+ }
28
+ /**
29
+ * Check if output should be summarized (vs returned as-is).
30
+ */
31
+ export function shouldSummarize(entry) {
32
+ // Small output: return as-is
33
+ if (entry.outputLines < 50) {
34
+ return false;
35
+ }
36
+ // Known simple commands: return as-is
37
+ const simpleCommands = /^(cd|pwd|echo|which|true|false|ls|cat|head|tail|wc|date|whoami|hostname)(\s|$)/;
38
+ if (simpleCommands.test(entry.command.toLowerCase())) {
39
+ return false;
40
+ }
41
+ // Everything else: summarize
42
+ return true;
43
+ }
44
+ /**
45
+ * Get summarization prompt for the output type.
46
+ */
47
+ export function getSummarizationPrompt(outputType) {
48
+ const prompts = {
49
+ test_results: `Summarize test results:
50
+ - Total passed/failed/skipped
51
+ - Names of failing tests
52
+ - First error message for each failure
53
+ - Key stack trace lines (file:line only)`,
54
+ build_output: `Summarize build output:
55
+ - Success or failure
56
+ - Error messages with file:line references
57
+ - Warning count (if any)`,
58
+ git_output: `Summarize git output:
59
+ - Operation performed
60
+ - Files affected (count or list if few)
61
+ - Any conflicts or errors`,
62
+ npm_output: `Summarize npm/package manager output:
63
+ - Operation (install/add/remove)
64
+ - Packages affected
65
+ - Any warnings or errors`,
66
+ error_output: `Extract only errors and warnings:
67
+ - Error messages with context
68
+ - File:line references
69
+ - Omit successful operations`,
70
+ general: `Summarize concisely in under 100 words:
71
+ - Success or failure
72
+ - Key results or errors
73
+ - Actionable next steps (if any)`,
74
+ };
75
+ return prompts[outputType];
76
+ }
77
+ //# sourceMappingURL=output-classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-classifier.js","sourceRoot":"","sources":["../../../source/modes/companion/output-classifier.ts"],"names":[],"mappings":"AAUA;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAmB;IAClD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAE/C,gBAAgB;IAChB,IACI,iFAAiF,CAAC,IAAI,CAClF,GAAG,CACN,EACH,CAAC;QACC,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED,iBAAiB;IACjB,IACI,yFAAyF,CAAC,IAAI,CAC1F,GAAG,CACN,EACH,CAAC;QACC,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED,eAAe;IACf,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,YAAY,CAAC;IACxB,CAAC;IAED,eAAe;IACf,IAAI,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO,YAAY,CAAC;IACxB,CAAC;IAED,mBAAmB;IACnB,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAmB;IAC/C,6BAA6B;IAC7B,IAAI,KAAK,CAAC,WAAW,GAAG,EAAE,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,sCAAsC;IACtC,MAAM,cAAc,GAChB,gFAAgF,CAAC;IACrF,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QACnD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,6BAA6B;IAC7B,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAAsB;IACzD,MAAM,OAAO,GAA+B;QACxC,YAAY,EAAE;;;;yCAImB;QAEjC,YAAY,EAAE;;;yBAGG;QAEjB,UAAU,EAAE;;;0BAGM;QAElB,UAAU,EAAE;;;yBAGK;QAEjB,YAAY,EAAE;;;6BAGO;QAErB,OAAO,EAAE;;;iCAGgB;KAC5B,CAAC;IAEF,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=output-classifier.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-classifier.test.d.ts","sourceRoot":"","sources":["../../../source/modes/companion/output-classifier.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,133 @@
1
+ import test from 'ava';
2
+ import { classifyOutputType, shouldSummarize, getSummarizationPrompt, } from './output-classifier.js';
3
+ // Helper to create a test entry
4
+ function createEntry(command, output = '', exitCode = 0) {
5
+ return {
6
+ command,
7
+ output,
8
+ exitCode,
9
+ timestamp: Date.now(),
10
+ outputLines: output.split('\n').length,
11
+ };
12
+ }
13
+ // classifyOutputType tests
14
+ test('classifies npm test as test_results', t => {
15
+ const entry = createEntry('npm test', 'PASS');
16
+ t.is(classifyOutputType(entry), 'test_results');
17
+ });
18
+ test('classifies yarn test as test_results', t => {
19
+ const entry = createEntry('yarn test', 'PASS');
20
+ t.is(classifyOutputType(entry), 'test_results');
21
+ });
22
+ test('classifies jest as test_results', t => {
23
+ const entry = createEntry('jest --coverage', 'PASS');
24
+ t.is(classifyOutputType(entry), 'test_results');
25
+ });
26
+ test('classifies vitest as test_results', t => {
27
+ const entry = createEntry('vitest run', 'PASS');
28
+ t.is(classifyOutputType(entry), 'test_results');
29
+ });
30
+ test('classifies ava as test_results', t => {
31
+ const entry = createEntry('ava', 'PASS');
32
+ t.is(classifyOutputType(entry), 'test_results');
33
+ });
34
+ test('classifies npm run build as build_output', t => {
35
+ const entry = createEntry('npm run build', 'Building...');
36
+ t.is(classifyOutputType(entry), 'build_output');
37
+ });
38
+ test('classifies tsc as build_output', t => {
39
+ const entry = createEntry('tsc', 'Compiling...');
40
+ t.is(classifyOutputType(entry), 'build_output');
41
+ });
42
+ test('classifies webpack as build_output', t => {
43
+ const entry = createEntry('webpack --mode production', 'Building...');
44
+ t.is(classifyOutputType(entry), 'build_output');
45
+ });
46
+ test('classifies git commands as git_output', t => {
47
+ const entry = createEntry('git status', 'On branch main');
48
+ t.is(classifyOutputType(entry), 'git_output');
49
+ });
50
+ test('classifies git diff as git_output', t => {
51
+ const entry = createEntry('git diff HEAD~1', '+new line');
52
+ t.is(classifyOutputType(entry), 'git_output');
53
+ });
54
+ test('classifies npm install as npm_output', t => {
55
+ const entry = createEntry('npm install lodash', 'installed');
56
+ t.is(classifyOutputType(entry), 'npm_output');
57
+ });
58
+ test('classifies yarn add as npm_output', t => {
59
+ const entry = createEntry('yarn add lodash', 'installed');
60
+ t.is(classifyOutputType(entry), 'npm_output');
61
+ });
62
+ test('classifies pnpm as npm_output', t => {
63
+ const entry = createEntry('pnpm install', 'installed');
64
+ t.is(classifyOutputType(entry), 'npm_output');
65
+ });
66
+ test('classifies failed command as error_output', t => {
67
+ const entry = createEntry('unknown', 'error', 1);
68
+ t.is(classifyOutputType(entry), 'error_output');
69
+ });
70
+ test('classifies unknown success as general', t => {
71
+ const entry = createEntry('echo hello', 'hello', 0);
72
+ t.is(classifyOutputType(entry), 'general');
73
+ });
74
+ test('classification is case insensitive', t => {
75
+ const entry = createEntry('NPM TEST', 'PASS');
76
+ t.is(classifyOutputType(entry), 'test_results');
77
+ });
78
+ // shouldSummarize tests
79
+ test('shouldSummarize returns false for small output', t => {
80
+ const entry = createEntry('cmd', 'small output', 0);
81
+ t.false(shouldSummarize(entry));
82
+ });
83
+ test('shouldSummarize returns false for simple commands', t => {
84
+ const entry = createEntry('cd /path', '\n'.repeat(100), 0);
85
+ entry.outputLines = 100;
86
+ t.false(shouldSummarize(entry));
87
+ });
88
+ test('shouldSummarize returns false for pwd', t => {
89
+ const entry = createEntry('pwd', '\n'.repeat(100), 0);
90
+ entry.outputLines = 100;
91
+ t.false(shouldSummarize(entry));
92
+ });
93
+ test('shouldSummarize returns false for echo', t => {
94
+ const entry = createEntry('echo hello', '\n'.repeat(100), 0);
95
+ entry.outputLines = 100;
96
+ t.false(shouldSummarize(entry));
97
+ });
98
+ test('shouldSummarize returns true for large output', t => {
99
+ const entry = createEntry('npm test', '\n'.repeat(100), 0);
100
+ entry.outputLines = 100;
101
+ t.true(shouldSummarize(entry));
102
+ });
103
+ test('shouldSummarize threshold is 50 lines', t => {
104
+ const entry49 = createEntry('npm test', '\n'.repeat(49), 0);
105
+ entry49.outputLines = 49;
106
+ const entry50 = createEntry('npm test', '\n'.repeat(50), 0);
107
+ entry50.outputLines = 50;
108
+ t.false(shouldSummarize(entry49));
109
+ t.true(shouldSummarize(entry50));
110
+ });
111
+ // getSummarizationPrompt tests
112
+ test('getSummarizationPrompt returns prompt for test_results', t => {
113
+ const prompt = getSummarizationPrompt('test_results');
114
+ t.true(prompt.includes('test results'));
115
+ });
116
+ test('getSummarizationPrompt returns prompt for build_output', t => {
117
+ const prompt = getSummarizationPrompt('build_output');
118
+ t.true(prompt.includes('build'));
119
+ });
120
+ test('getSummarizationPrompt returns prompt for git_output', t => {
121
+ const prompt = getSummarizationPrompt('git_output');
122
+ t.true(prompt.includes('git'));
123
+ });
124
+ test('getSummarizationPrompt returns prompt for error_output', t => {
125
+ const prompt = getSummarizationPrompt('error_output');
126
+ t.true(prompt.includes('error'));
127
+ });
128
+ test('getSummarizationPrompt returns prompt for general', t => {
129
+ const prompt = getSummarizationPrompt('general');
130
+ t.truthy(prompt);
131
+ t.true(prompt.includes('Summarize'));
132
+ });
133
+ //# sourceMappingURL=output-classifier.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-classifier.test.js","sourceRoot":"","sources":["../../../source/modes/companion/output-classifier.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { EventEmitter } from 'events';
2
+ import type { ILoggingService } from '../../services/service-interfaces.js';
3
+ export interface PTYWrapperOptions {
4
+ logger: ILoggingService;
5
+ shell?: string;
6
+ cwd?: string;
7
+ env?: NodeJS.ProcessEnv;
8
+ }
9
+ export interface PTYWrapperEvents {
10
+ output: (data: string) => void;
11
+ exit: (exitCode: number, signal?: number) => void;
12
+ error: (error: Error) => void;
13
+ }
14
+ /**
15
+ * PTY Wrapper for companion mode.
16
+ * Spawns user's shell in a PTY, intercepting I/O for context building.
17
+ */
18
+ export declare class PTYWrapper extends EventEmitter {
19
+ #private;
20
+ constructor(options: PTYWrapperOptions);
21
+ /**
22
+ * Start the PTY with the user's shell.
23
+ */
24
+ start(): void;
25
+ /**
26
+ * Write data to the PTY.
27
+ */
28
+ write(data: string): void;
29
+ /**
30
+ * Resize the PTY.
31
+ */
32
+ resize(cols: number, rows: number): void;
33
+ /**
34
+ * Stop the PTY.
35
+ */
36
+ stop(): void;
37
+ /**
38
+ * Check if PTY is running.
39
+ */
40
+ get isRunning(): boolean;
41
+ /**
42
+ * Get the PTY process ID.
43
+ */
44
+ get pid(): number | undefined;
45
+ }
46
+ //# sourceMappingURL=pty-wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty-wrapper.d.ts","sourceRoot":"","sources":["../../../source/modes/companion/pty-wrapper.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAC,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,sCAAsC,CAAC;AAE1E,MAAM,WAAW,iBAAiB;IAC9B,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACjC;AAID;;;GAGG;AACH,qBAAa,UAAW,SAAQ,YAAY;;gBAS5B,OAAO,EAAE,iBAAiB;IAQtC;;OAEG;IACH,KAAK,IAAI,IAAI;IA4Db;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQzB;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQxC;;OAEG;IACH,IAAI,IAAI,IAAI;IAUZ;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;OAEG;IACH,IAAI,GAAG,IAAI,MAAM,GAAG,SAAS,CAE5B;CA0BJ"}