@snoglobe/helios 0.3.6 → 0.4.1

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 (352) hide show
  1. package/dist/__tests__/db-helper.d.ts +8 -0
  2. package/dist/__tests__/db-helper.d.ts.map +1 -0
  3. package/dist/__tests__/db-helper.js +15 -0
  4. package/dist/__tests__/db-helper.js.map +1 -0
  5. package/dist/cli/replay.d.ts.map +1 -1
  6. package/dist/cli/replay.js +2 -3
  7. package/dist/cli/replay.js.map +1 -1
  8. package/dist/cli/sessions.d.ts.map +1 -1
  9. package/dist/cli/sessions.js +2 -1
  10. package/dist/cli/sessions.js.map +1 -1
  11. package/dist/config/project.test.d.ts +2 -0
  12. package/dist/config/project.test.d.ts.map +1 -0
  13. package/dist/config/project.test.js +219 -0
  14. package/dist/config/project.test.js.map +1 -0
  15. package/dist/core/orchestrator-integration.test.d.ts +2 -0
  16. package/dist/core/orchestrator-integration.test.d.ts.map +1 -0
  17. package/dist/core/orchestrator-integration.test.js +674 -0
  18. package/dist/core/orchestrator-integration.test.js.map +1 -0
  19. package/dist/core/orchestrator.d.ts +1 -0
  20. package/dist/core/orchestrator.d.ts.map +1 -1
  21. package/dist/core/orchestrator.js +129 -37
  22. package/dist/core/orchestrator.js.map +1 -1
  23. package/dist/core/orchestrator.test.d.ts +2 -0
  24. package/dist/core/orchestrator.test.d.ts.map +1 -0
  25. package/dist/core/orchestrator.test.js +982 -0
  26. package/dist/core/orchestrator.test.js.map +1 -0
  27. package/dist/core/state-machine.d.ts.map +1 -1
  28. package/dist/core/state-machine.js +3 -0
  29. package/dist/core/state-machine.js.map +1 -1
  30. package/dist/core/state-machine.test.d.ts +2 -0
  31. package/dist/core/state-machine.test.d.ts.map +1 -0
  32. package/dist/core/state-machine.test.js +95 -0
  33. package/dist/core/state-machine.test.js.map +1 -0
  34. package/dist/core/stickies.d.ts.map +1 -1
  35. package/dist/core/stickies.js +3 -0
  36. package/dist/core/stickies.js.map +1 -1
  37. package/dist/core/stickies.test.d.ts +2 -0
  38. package/dist/core/stickies.test.d.ts.map +1 -0
  39. package/dist/core/stickies.test.js +63 -0
  40. package/dist/core/stickies.test.js.map +1 -0
  41. package/dist/core/task-poller.d.ts +2 -1
  42. package/dist/core/task-poller.d.ts.map +1 -1
  43. package/dist/core/task-poller.js +25 -3
  44. package/dist/core/task-poller.js.map +1 -1
  45. package/dist/init.d.ts +2 -0
  46. package/dist/init.d.ts.map +1 -1
  47. package/dist/init.js +42 -7
  48. package/dist/init.js.map +1 -1
  49. package/dist/memory/context-gate.d.ts.map +1 -1
  50. package/dist/memory/context-gate.js +2 -1
  51. package/dist/memory/context-gate.js.map +1 -1
  52. package/dist/memory/context-gate.test.d.ts +2 -0
  53. package/dist/memory/context-gate.test.d.ts.map +1 -0
  54. package/dist/memory/context-gate.test.js +318 -0
  55. package/dist/memory/context-gate.test.js.map +1 -0
  56. package/dist/memory/experiment-tracker.test.d.ts +2 -0
  57. package/dist/memory/experiment-tracker.test.d.ts.map +1 -0
  58. package/dist/memory/experiment-tracker.test.js +325 -0
  59. package/dist/memory/experiment-tracker.test.js.map +1 -0
  60. package/dist/memory/global-memory.d.ts +0 -1
  61. package/dist/memory/global-memory.d.ts.map +1 -1
  62. package/dist/memory/global-memory.js +0 -14
  63. package/dist/memory/global-memory.js.map +1 -1
  64. package/dist/memory/memory-store.d.ts +2 -0
  65. package/dist/memory/memory-store.d.ts.map +1 -1
  66. package/dist/memory/memory-store.js +35 -28
  67. package/dist/memory/memory-store.js.map +1 -1
  68. package/dist/memory/memory-store.test.d.ts +2 -0
  69. package/dist/memory/memory-store.test.d.ts.map +1 -0
  70. package/dist/memory/memory-store.test.js +144 -0
  71. package/dist/memory/memory-store.test.js.map +1 -0
  72. package/dist/memory/token-estimator.test.d.ts +2 -0
  73. package/dist/memory/token-estimator.test.d.ts.map +1 -0
  74. package/dist/memory/token-estimator.test.js +42 -0
  75. package/dist/memory/token-estimator.test.js.map +1 -0
  76. package/dist/metrics/analyzer.test.d.ts +2 -0
  77. package/dist/metrics/analyzer.test.d.ts.map +1 -0
  78. package/dist/metrics/analyzer.test.js +65 -0
  79. package/dist/metrics/analyzer.test.js.map +1 -0
  80. package/dist/metrics/parser.test.d.ts +2 -0
  81. package/dist/metrics/parser.test.d.ts.map +1 -0
  82. package/dist/metrics/parser.test.js +106 -0
  83. package/dist/metrics/parser.test.js.map +1 -0
  84. package/dist/metrics/store.d.ts +2 -0
  85. package/dist/metrics/store.d.ts.map +1 -1
  86. package/dist/metrics/store.js +26 -50
  87. package/dist/metrics/store.js.map +1 -1
  88. package/dist/metrics/store.test.d.ts +2 -0
  89. package/dist/metrics/store.test.d.ts.map +1 -0
  90. package/dist/metrics/store.test.js +148 -0
  91. package/dist/metrics/store.test.js.map +1 -0
  92. package/dist/paths.js +5 -5
  93. package/dist/paths.js.map +1 -1
  94. package/dist/providers/auth/auth-manager.d.ts +1 -0
  95. package/dist/providers/auth/auth-manager.d.ts.map +1 -1
  96. package/dist/providers/auth/auth-manager.js +8 -1
  97. package/dist/providers/auth/auth-manager.js.map +1 -1
  98. package/dist/providers/auth/auth-manager.test.d.ts +2 -0
  99. package/dist/providers/auth/auth-manager.test.d.ts.map +1 -0
  100. package/dist/providers/auth/auth-manager.test.js +364 -0
  101. package/dist/providers/auth/auth-manager.test.js.map +1 -0
  102. package/dist/providers/auth/token-store.js +2 -2
  103. package/dist/providers/auth/token-store.js.map +1 -1
  104. package/dist/providers/claude/history.test.d.ts +2 -0
  105. package/dist/providers/claude/history.test.d.ts.map +1 -0
  106. package/dist/providers/claude/history.test.js +757 -0
  107. package/dist/providers/claude/history.test.js.map +1 -0
  108. package/dist/providers/claude/provider.d.ts +2 -1
  109. package/dist/providers/claude/provider.d.ts.map +1 -1
  110. package/dist/providers/claude/provider.js +87 -25
  111. package/dist/providers/claude/provider.js.map +1 -1
  112. package/dist/providers/claude/provider.test.d.ts +2 -0
  113. package/dist/providers/claude/provider.test.d.ts.map +1 -0
  114. package/dist/providers/claude/provider.test.js +1168 -0
  115. package/dist/providers/claude/provider.test.js.map +1 -0
  116. package/dist/providers/openai/history.test.d.ts +2 -0
  117. package/dist/providers/openai/history.test.d.ts.map +1 -0
  118. package/dist/providers/openai/history.test.js +657 -0
  119. package/dist/providers/openai/history.test.js.map +1 -0
  120. package/dist/providers/openai/provider.d.ts +2 -1
  121. package/dist/providers/openai/provider.d.ts.map +1 -1
  122. package/dist/providers/openai/provider.js +75 -22
  123. package/dist/providers/openai/provider.js.map +1 -1
  124. package/dist/providers/openai/provider.test.d.ts +2 -0
  125. package/dist/providers/openai/provider.test.d.ts.map +1 -0
  126. package/dist/providers/openai/provider.test.js +1093 -0
  127. package/dist/providers/openai/provider.test.js.map +1 -0
  128. package/dist/providers/retry.test.d.ts +2 -0
  129. package/dist/providers/retry.test.d.ts.map +1 -0
  130. package/dist/providers/retry.test.js +194 -0
  131. package/dist/providers/retry.test.js.map +1 -0
  132. package/dist/providers/sse.d.ts +1 -0
  133. package/dist/providers/sse.d.ts.map +1 -1
  134. package/dist/providers/sse.js +29 -20
  135. package/dist/providers/sse.js.map +1 -1
  136. package/dist/providers/sse.test.d.ts +2 -0
  137. package/dist/providers/sse.test.d.ts.map +1 -0
  138. package/dist/providers/sse.test.js +79 -0
  139. package/dist/providers/sse.test.js.map +1 -0
  140. package/dist/providers/types.d.ts +3 -0
  141. package/dist/providers/types.d.ts.map +1 -1
  142. package/dist/providers/types.js.map +1 -1
  143. package/dist/providers/types.test.d.ts +2 -0
  144. package/dist/providers/types.test.d.ts.map +1 -0
  145. package/dist/providers/types.test.js +112 -0
  146. package/dist/providers/types.test.js.map +1 -0
  147. package/dist/remote/connection-pool.d.ts.map +1 -1
  148. package/dist/remote/connection-pool.js +24 -3
  149. package/dist/remote/connection-pool.js.map +1 -1
  150. package/dist/remote/file-sync.d.ts.map +1 -1
  151. package/dist/remote/file-sync.js +4 -3
  152. package/dist/remote/file-sync.js.map +1 -1
  153. package/dist/scheduler/sleep-manager.d.ts.map +1 -1
  154. package/dist/scheduler/sleep-manager.js +9 -2
  155. package/dist/scheduler/sleep-manager.js.map +1 -1
  156. package/dist/scheduler/sleep-manager.test.d.ts +2 -0
  157. package/dist/scheduler/sleep-manager.test.d.ts.map +1 -0
  158. package/dist/scheduler/sleep-manager.test.js +491 -0
  159. package/dist/scheduler/sleep-manager.test.js.map +1 -0
  160. package/dist/scheduler/ssh-batcher.d.ts.map +1 -1
  161. package/dist/scheduler/ssh-batcher.js +6 -4
  162. package/dist/scheduler/ssh-batcher.js.map +1 -1
  163. package/dist/scheduler/ssh-batcher.test.d.ts +2 -0
  164. package/dist/scheduler/ssh-batcher.test.d.ts.map +1 -0
  165. package/dist/scheduler/ssh-batcher.test.js +76 -0
  166. package/dist/scheduler/ssh-batcher.test.js.map +1 -0
  167. package/dist/scheduler/state-store.d.ts.map +1 -1
  168. package/dist/scheduler/state-store.js +1 -2
  169. package/dist/scheduler/state-store.js.map +1 -1
  170. package/dist/scheduler/trigger-scheduler.d.ts.map +1 -1
  171. package/dist/scheduler/trigger-scheduler.js +59 -36
  172. package/dist/scheduler/trigger-scheduler.js.map +1 -1
  173. package/dist/scheduler/trigger-scheduler.test.d.ts +2 -0
  174. package/dist/scheduler/trigger-scheduler.test.d.ts.map +1 -0
  175. package/dist/scheduler/trigger-scheduler.test.js +483 -0
  176. package/dist/scheduler/trigger-scheduler.test.js.map +1 -0
  177. package/dist/scheduler/triggers/file.d.ts.map +1 -1
  178. package/dist/scheduler/triggers/file.js +12 -3
  179. package/dist/scheduler/triggers/file.js.map +1 -1
  180. package/dist/scheduler/triggers/file.test.d.ts +2 -0
  181. package/dist/scheduler/triggers/file.test.d.ts.map +1 -0
  182. package/dist/scheduler/triggers/file.test.js +294 -0
  183. package/dist/scheduler/triggers/file.test.js.map +1 -0
  184. package/dist/scheduler/triggers/metric.d.ts +3 -1
  185. package/dist/scheduler/triggers/metric.d.ts.map +1 -1
  186. package/dist/scheduler/triggers/metric.js +12 -8
  187. package/dist/scheduler/triggers/metric.js.map +1 -1
  188. package/dist/scheduler/triggers/metric.test.d.ts +2 -0
  189. package/dist/scheduler/triggers/metric.test.d.ts.map +1 -0
  190. package/dist/scheduler/triggers/metric.test.js +533 -0
  191. package/dist/scheduler/triggers/metric.test.js.map +1 -0
  192. package/dist/scheduler/triggers/process-exit.d.ts.map +1 -1
  193. package/dist/scheduler/triggers/process-exit.js +2 -1
  194. package/dist/scheduler/triggers/process-exit.js.map +1 -1
  195. package/dist/scheduler/triggers/process-exit.test.d.ts +2 -0
  196. package/dist/scheduler/triggers/process-exit.test.d.ts.map +1 -0
  197. package/dist/scheduler/triggers/process-exit.test.js +118 -0
  198. package/dist/scheduler/triggers/process-exit.test.js.map +1 -0
  199. package/dist/scheduler/triggers/resource.d.ts.map +1 -1
  200. package/dist/scheduler/triggers/resource.js +2 -10
  201. package/dist/scheduler/triggers/resource.js.map +1 -1
  202. package/dist/scheduler/triggers/resource.test.d.ts +2 -0
  203. package/dist/scheduler/triggers/resource.test.d.ts.map +1 -0
  204. package/dist/scheduler/triggers/resource.test.js +225 -0
  205. package/dist/scheduler/triggers/resource.test.js.map +1 -0
  206. package/dist/scheduler/triggers/timer.test.d.ts +2 -0
  207. package/dist/scheduler/triggers/timer.test.d.ts.map +1 -0
  208. package/dist/scheduler/triggers/timer.test.js +56 -0
  209. package/dist/scheduler/triggers/timer.test.js.map +1 -0
  210. package/dist/scheduler/triggers/types.d.ts +4 -2
  211. package/dist/scheduler/triggers/types.d.ts.map +1 -1
  212. package/dist/scheduler/triggers/types.js +0 -1
  213. package/dist/scheduler/triggers/types.js.map +1 -1
  214. package/dist/skills/executor.d.ts.map +1 -1
  215. package/dist/skills/executor.js +13 -15
  216. package/dist/skills/executor.js.map +1 -1
  217. package/dist/store/database.d.ts +5 -0
  218. package/dist/store/database.d.ts.map +1 -1
  219. package/dist/store/database.js +17 -1
  220. package/dist/store/database.js.map +1 -1
  221. package/dist/store/migrations.d.ts.map +1 -1
  222. package/dist/store/migrations.js +7 -0
  223. package/dist/store/migrations.js.map +1 -1
  224. package/dist/store/migrations.test.d.ts +2 -0
  225. package/dist/store/migrations.test.d.ts.map +1 -0
  226. package/dist/store/migrations.test.js +278 -0
  227. package/dist/store/migrations.test.js.map +1 -0
  228. package/dist/store/session-store-edge.test.d.ts +2 -0
  229. package/dist/store/session-store-edge.test.d.ts.map +1 -0
  230. package/dist/store/session-store-edge.test.js +522 -0
  231. package/dist/store/session-store-edge.test.js.map +1 -0
  232. package/dist/store/session-store.d.ts +28 -1
  233. package/dist/store/session-store.d.ts.map +1 -1
  234. package/dist/store/session-store.js +62 -26
  235. package/dist/store/session-store.js.map +1 -1
  236. package/dist/store/session-store.test.d.ts +2 -0
  237. package/dist/store/session-store.test.d.ts.map +1 -0
  238. package/dist/store/session-store.test.js +125 -0
  239. package/dist/store/session-store.test.js.map +1 -0
  240. package/dist/subagent/executor.d.ts +24 -0
  241. package/dist/subagent/executor.d.ts.map +1 -0
  242. package/dist/subagent/executor.js +140 -0
  243. package/dist/subagent/executor.js.map +1 -0
  244. package/dist/subagent/manager.d.ts +20 -0
  245. package/dist/subagent/manager.d.ts.map +1 -0
  246. package/dist/subagent/manager.js +100 -0
  247. package/dist/subagent/manager.js.map +1 -0
  248. package/dist/subagent/scoped-memory.d.ts +28 -0
  249. package/dist/subagent/scoped-memory.d.ts.map +1 -0
  250. package/dist/subagent/scoped-memory.js +122 -0
  251. package/dist/subagent/scoped-memory.js.map +1 -0
  252. package/dist/subagent/types.d.ts +27 -0
  253. package/dist/subagent/types.d.ts.map +1 -0
  254. package/dist/subagent/types.js +2 -0
  255. package/dist/subagent/types.js.map +1 -0
  256. package/dist/tools/file-ops.d.ts.map +1 -1
  257. package/dist/tools/file-ops.js +23 -13
  258. package/dist/tools/file-ops.js.map +1 -1
  259. package/dist/tools/file-ops.test.d.ts +2 -0
  260. package/dist/tools/file-ops.test.d.ts.map +1 -0
  261. package/dist/tools/file-ops.test.js +656 -0
  262. package/dist/tools/file-ops.test.js.map +1 -0
  263. package/dist/tools/memory-tools.test.d.ts +2 -0
  264. package/dist/tools/memory-tools.test.d.ts.map +1 -0
  265. package/dist/tools/memory-tools.test.js +273 -0
  266. package/dist/tools/memory-tools.test.js.map +1 -0
  267. package/dist/tools/sleep.d.ts.map +1 -1
  268. package/dist/tools/sleep.js +19 -7
  269. package/dist/tools/sleep.js.map +1 -1
  270. package/dist/tools/subagent.d.ts +10 -0
  271. package/dist/tools/subagent.d.ts.map +1 -0
  272. package/dist/tools/subagent.js +164 -0
  273. package/dist/tools/subagent.js.map +1 -0
  274. package/dist/tools/task-output.d.ts.map +1 -1
  275. package/dist/tools/task-output.js +13 -2
  276. package/dist/tools/task-output.js.map +1 -1
  277. package/dist/ui/components/input-bar.d.ts +1 -1
  278. package/dist/ui/components/input-bar.d.ts.map +1 -1
  279. package/dist/ui/components/input-bar.js +3 -3
  280. package/dist/ui/components/input-bar.js.map +1 -1
  281. package/dist/ui/components/input-bar.test.d.ts +2 -0
  282. package/dist/ui/components/input-bar.test.d.ts.map +1 -0
  283. package/dist/ui/components/input-bar.test.js +380 -0
  284. package/dist/ui/components/input-bar.test.js.map +1 -0
  285. package/dist/ui/components/key-hint-rule.d.ts +2 -1
  286. package/dist/ui/components/key-hint-rule.d.ts.map +1 -1
  287. package/dist/ui/components/key-hint-rule.js +3 -3
  288. package/dist/ui/components/key-hint-rule.js.map +1 -1
  289. package/dist/ui/components/status-bar.d.ts +1 -1
  290. package/dist/ui/components/status-bar.d.ts.map +1 -1
  291. package/dist/ui/components/status-bar.js +11 -10
  292. package/dist/ui/components/status-bar.js.map +1 -1
  293. package/dist/ui/components/status-bar.test.d.ts +2 -0
  294. package/dist/ui/components/status-bar.test.d.ts.map +1 -0
  295. package/dist/ui/components/status-bar.test.js +206 -0
  296. package/dist/ui/components/status-bar.test.js.map +1 -0
  297. package/dist/ui/format.d.ts +9 -0
  298. package/dist/ui/format.d.ts.map +1 -1
  299. package/dist/ui/format.js +21 -0
  300. package/dist/ui/format.js.map +1 -1
  301. package/dist/ui/format.test.d.ts +2 -0
  302. package/dist/ui/format.test.d.ts.map +1 -0
  303. package/dist/ui/format.test.js +122 -0
  304. package/dist/ui/format.test.js.map +1 -0
  305. package/dist/ui/layout.d.ts.map +1 -1
  306. package/dist/ui/layout.js +123 -16
  307. package/dist/ui/layout.js.map +1 -1
  308. package/dist/ui/markdown.test.d.ts +2 -0
  309. package/dist/ui/markdown.test.d.ts.map +1 -0
  310. package/dist/ui/markdown.test.js +133 -0
  311. package/dist/ui/markdown.test.js.map +1 -0
  312. package/dist/ui/mouse-filter.test.d.ts +2 -0
  313. package/dist/ui/mouse-filter.test.d.ts.map +1 -0
  314. package/dist/ui/mouse-filter.test.js +231 -0
  315. package/dist/ui/mouse-filter.test.js.map +1 -0
  316. package/dist/ui/overlays/metrics-overlay.test.d.ts +2 -0
  317. package/dist/ui/overlays/metrics-overlay.test.d.ts.map +1 -0
  318. package/dist/ui/overlays/metrics-overlay.test.js +248 -0
  319. package/dist/ui/overlays/metrics-overlay.test.js.map +1 -0
  320. package/dist/ui/overlays/task-overlay.test.d.ts +2 -0
  321. package/dist/ui/overlays/task-overlay.test.d.ts.map +1 -0
  322. package/dist/ui/overlays/task-overlay.test.js +238 -0
  323. package/dist/ui/overlays/task-overlay.test.js.map +1 -0
  324. package/dist/ui/panels/conversation.d.ts.map +1 -1
  325. package/dist/ui/panels/conversation.js +60 -5
  326. package/dist/ui/panels/conversation.js.map +1 -1
  327. package/dist/ui/panels/conversation.test.d.ts +2 -0
  328. package/dist/ui/panels/conversation.test.d.ts.map +1 -0
  329. package/dist/ui/panels/conversation.test.js +381 -0
  330. package/dist/ui/panels/conversation.test.js.map +1 -0
  331. package/dist/ui/panels/metrics-dashboard.test.d.ts +2 -0
  332. package/dist/ui/panels/metrics-dashboard.test.d.ts.map +1 -0
  333. package/dist/ui/panels/metrics-dashboard.test.js +191 -0
  334. package/dist/ui/panels/metrics-dashboard.test.js.map +1 -0
  335. package/dist/ui/panels/sleep-panel.test.d.ts +2 -0
  336. package/dist/ui/panels/sleep-panel.test.d.ts.map +1 -0
  337. package/dist/ui/panels/sleep-panel.test.js +376 -0
  338. package/dist/ui/panels/sleep-panel.test.js.map +1 -0
  339. package/dist/ui/panels/task-list.d.ts.map +1 -1
  340. package/dist/ui/panels/task-list.js +5 -6
  341. package/dist/ui/panels/task-list.js.map +1 -1
  342. package/dist/ui/panels/task-list.test.d.ts +2 -0
  343. package/dist/ui/panels/task-list.test.d.ts.map +1 -0
  344. package/dist/ui/panels/task-list.test.js +210 -0
  345. package/dist/ui/panels/task-list.test.js.map +1 -0
  346. package/dist/ui/theme.test.d.ts +2 -0
  347. package/dist/ui/theme.test.d.ts.map +1 -0
  348. package/dist/ui/theme.test.js +159 -0
  349. package/dist/ui/theme.test.js.map +1 -0
  350. package/dist/ui/types.d.ts +3 -0
  351. package/dist/ui/types.d.ts.map +1 -1
  352. package/package.json +6 -2
@@ -0,0 +1,231 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import { PassThrough } from "node:stream";
3
+ import { createMouseFilter } from "./mouse-filter.js";
4
+ function makeFakeStdin() {
5
+ const pt = new PassThrough();
6
+ pt.isTTY = true;
7
+ pt.setRawMode = vi.fn().mockReturnValue(pt);
8
+ pt.ref = vi.fn().mockReturnValue(pt);
9
+ pt.unref = vi.fn().mockReturnValue(pt);
10
+ return pt;
11
+ }
12
+ /** Collect all output from the filteredStdin into a buffer. */
13
+ function collectOutput(stream) {
14
+ return new Promise((resolve) => {
15
+ const chunks = [];
16
+ stream.on("data", (chunk) => chunks.push(Buffer.from(chunk)));
17
+ // Use a short timeout to collect — streams are synchronous in tests
18
+ setTimeout(() => resolve(Buffer.concat(chunks).toString()), 50);
19
+ });
20
+ }
21
+ /** Push data into the fake stdin and wait a tick for processing. */
22
+ function pushData(stdin, data) {
23
+ return new Promise((resolve) => {
24
+ stdin.write(data, () => {
25
+ // Give the transform a tick to process
26
+ setTimeout(resolve, 20);
27
+ });
28
+ });
29
+ }
30
+ describe("createMouseFilter", () => {
31
+ let stdin;
32
+ beforeEach(() => {
33
+ stdin = makeFakeStdin();
34
+ });
35
+ describe("data filtering", () => {
36
+ it("passes non-mouse data through unchanged", async () => {
37
+ const { filteredStdin } = createMouseFilter(stdin);
38
+ const output = collectOutput(filteredStdin);
39
+ await pushData(stdin, "hello world");
40
+ const result = await output;
41
+ expect(result).toBe("hello world");
42
+ });
43
+ it("passes regular escape sequences through", async () => {
44
+ const { filteredStdin } = createMouseFilter(stdin);
45
+ const output = collectOutput(filteredStdin);
46
+ // Arrow key escape sequence (not mouse)
47
+ await pushData(stdin, "\x1b[A");
48
+ const result = await output;
49
+ expect(result).toBe("\x1b[A");
50
+ });
51
+ it("strips SGR mouse press sequences", async () => {
52
+ const { filteredStdin } = createMouseFilter(stdin);
53
+ const output = collectOutput(filteredStdin);
54
+ // SGR mouse: button 0, x=10, y=20, press (M)
55
+ await pushData(stdin, "\x1b[<0;10;20M");
56
+ const result = await output;
57
+ expect(result).toBe("");
58
+ });
59
+ it("strips SGR mouse release sequences", async () => {
60
+ const { filteredStdin } = createMouseFilter(stdin);
61
+ const output = collectOutput(filteredStdin);
62
+ // SGR mouse: button 0, x=10, y=20, release (m)
63
+ await pushData(stdin, "\x1b[<0;10;20m");
64
+ const result = await output;
65
+ expect(result).toBe("");
66
+ });
67
+ it("outputs only text from mixed data with mouse events", async () => {
68
+ const { filteredStdin } = createMouseFilter(stdin);
69
+ const output = collectOutput(filteredStdin);
70
+ // Text, mouse event, more text
71
+ await pushData(stdin, "before\x1b[<0;10;20Mafter");
72
+ const result = await output;
73
+ expect(result).toBe("beforeafter");
74
+ });
75
+ it("strips multiple mouse sequences from mixed data", async () => {
76
+ const { filteredStdin } = createMouseFilter(stdin);
77
+ const output = collectOutput(filteredStdin);
78
+ await pushData(stdin, "a\x1b[<0;1;1Mb\x1b[<0;2;2mc");
79
+ const result = await output;
80
+ expect(result).toBe("abc");
81
+ });
82
+ it("handles empty chunks correctly", async () => {
83
+ const { filteredStdin } = createMouseFilter(stdin);
84
+ const output = collectOutput(filteredStdin);
85
+ await pushData(stdin, "");
86
+ const result = await output;
87
+ // Empty string write may or may not produce output
88
+ expect(typeof result).toBe("string");
89
+ });
90
+ it("handles chunks with only mouse sequences (no text output)", async () => {
91
+ const { filteredStdin } = createMouseFilter(stdin);
92
+ const output = collectOutput(filteredStdin);
93
+ await pushData(stdin, "\x1b[<64;10;20M\x1b[<65;10;20M");
94
+ const result = await output;
95
+ expect(result).toBe("");
96
+ });
97
+ });
98
+ describe("mouse event emission", () => {
99
+ it("emits scroll_up for button 64", async () => {
100
+ const { filteredStdin, mouseEmitter } = createMouseFilter(stdin);
101
+ const events = [];
102
+ mouseEmitter.on("mouse", (e) => events.push(e));
103
+ // Drain filteredStdin to prevent backpressure
104
+ filteredStdin.on("data", () => { });
105
+ await pushData(stdin, "\x1b[<64;15;25M");
106
+ expect(events).toHaveLength(1);
107
+ expect(events[0].type).toBe("scroll_up");
108
+ expect(events[0].x).toBe(15);
109
+ expect(events[0].y).toBe(25);
110
+ expect(events[0].button).toBe(64);
111
+ });
112
+ it("emits scroll_down for button 65", async () => {
113
+ const { filteredStdin, mouseEmitter } = createMouseFilter(stdin);
114
+ const events = [];
115
+ mouseEmitter.on("mouse", (e) => events.push(e));
116
+ filteredStdin.on("data", () => { });
117
+ await pushData(stdin, "\x1b[<65;5;10M");
118
+ expect(events).toHaveLength(1);
119
+ expect(events[0].type).toBe("scroll_down");
120
+ expect(events[0].x).toBe(5);
121
+ expect(events[0].y).toBe(10);
122
+ expect(events[0].button).toBe(65);
123
+ });
124
+ it("emits click for regular button press", async () => {
125
+ const { filteredStdin, mouseEmitter } = createMouseFilter(stdin);
126
+ const events = [];
127
+ mouseEmitter.on("mouse", (e) => events.push(e));
128
+ filteredStdin.on("data", () => { });
129
+ // button 0, press (M)
130
+ await pushData(stdin, "\x1b[<0;10;20M");
131
+ expect(events).toHaveLength(1);
132
+ expect(events[0].type).toBe("click");
133
+ expect(events[0].button).toBe(0);
134
+ });
135
+ it("emits release for button release", async () => {
136
+ const { filteredStdin, mouseEmitter } = createMouseFilter(stdin);
137
+ const events = [];
138
+ mouseEmitter.on("mouse", (e) => events.push(e));
139
+ filteredStdin.on("data", () => { });
140
+ // button 0, release (m)
141
+ await pushData(stdin, "\x1b[<0;10;20m");
142
+ expect(events).toHaveLength(1);
143
+ expect(events[0].type).toBe("release");
144
+ expect(events[0].button).toBe(0);
145
+ });
146
+ it("emits move for buttons 32-63", async () => {
147
+ const { filteredStdin, mouseEmitter } = createMouseFilter(stdin);
148
+ const events = [];
149
+ mouseEmitter.on("mouse", (e) => events.push(e));
150
+ filteredStdin.on("data", () => { });
151
+ // button 32 = mouse move
152
+ await pushData(stdin, "\x1b[<32;10;20M");
153
+ expect(events).toHaveLength(1);
154
+ expect(events[0].type).toBe("move");
155
+ expect(events[0].button).toBe(32);
156
+ });
157
+ it("does not emit scroll for regular button events", async () => {
158
+ const { filteredStdin, mouseEmitter } = createMouseFilter(stdin);
159
+ const events = [];
160
+ mouseEmitter.on("mouse", (e) => events.push(e));
161
+ filteredStdin.on("data", () => { });
162
+ // button 0 press and release
163
+ await pushData(stdin, "\x1b[<0;10;20M\x1b[<0;10;20m");
164
+ expect(events).toHaveLength(2);
165
+ for (const e of events) {
166
+ expect(e.type).not.toBe("scroll_up");
167
+ expect(e.type).not.toBe("scroll_down");
168
+ }
169
+ });
170
+ it("parses correct coordinates from mouse events", async () => {
171
+ const { filteredStdin, mouseEmitter } = createMouseFilter(stdin);
172
+ const events = [];
173
+ mouseEmitter.on("mouse", (e) => events.push(e));
174
+ filteredStdin.on("data", () => { });
175
+ await pushData(stdin, "\x1b[<0;123;456M");
176
+ expect(events).toHaveLength(1);
177
+ expect(events[0].x).toBe(123);
178
+ expect(events[0].y).toBe(456);
179
+ });
180
+ it("emits multiple events for multiple mouse sequences in one chunk", async () => {
181
+ const { filteredStdin, mouseEmitter } = createMouseFilter(stdin);
182
+ const events = [];
183
+ mouseEmitter.on("mouse", (e) => events.push(e));
184
+ filteredStdin.on("data", () => { });
185
+ await pushData(stdin, "\x1b[<64;1;1M\x1b[<64;1;1M\x1b[<64;1;1M");
186
+ expect(events).toHaveLength(3);
187
+ for (const e of events) {
188
+ expect(e.type).toBe("scroll_up");
189
+ }
190
+ });
191
+ it("does not emit events for non-mouse data", async () => {
192
+ const { filteredStdin, mouseEmitter } = createMouseFilter(stdin);
193
+ const events = [];
194
+ mouseEmitter.on("mouse", (e) => events.push(e));
195
+ filteredStdin.on("data", () => { });
196
+ await pushData(stdin, "just some text\x1b[Aarrow key");
197
+ expect(events).toHaveLength(0);
198
+ });
199
+ });
200
+ describe("TTY proxying", () => {
201
+ it("copies isTTY from source stdin", () => {
202
+ const { filteredStdin } = createMouseFilter(stdin);
203
+ expect(filteredStdin.isTTY).toBe(true);
204
+ });
205
+ it("proxies setRawMode to the source stdin", () => {
206
+ const { filteredStdin } = createMouseFilter(stdin);
207
+ const result = filteredStdin.setRawMode(true);
208
+ expect(stdin.setRawMode).toHaveBeenCalledWith(true);
209
+ expect(result).toBe(filteredStdin);
210
+ });
211
+ it("proxies setEncoding to the source stdin", () => {
212
+ const { filteredStdin } = createMouseFilter(stdin);
213
+ const setEncodingSpy = vi.spyOn(stdin, "setEncoding");
214
+ filteredStdin.setEncoding("utf8");
215
+ expect(setEncodingSpy).toHaveBeenCalledWith("utf8");
216
+ });
217
+ it("proxies ref to the source stdin", () => {
218
+ const { filteredStdin } = createMouseFilter(stdin);
219
+ const result = filteredStdin.ref();
220
+ expect(stdin.ref).toHaveBeenCalled();
221
+ expect(result).toBe(filteredStdin);
222
+ });
223
+ it("proxies unref to the source stdin", () => {
224
+ const { filteredStdin } = createMouseFilter(stdin);
225
+ const result = filteredStdin.unref();
226
+ expect(stdin.unref).toHaveBeenCalled();
227
+ expect(result).toBe(filteredStdin);
228
+ });
229
+ });
230
+ });
231
+ //# sourceMappingURL=mouse-filter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mouse-filter.test.js","sourceRoot":"","sources":["../../src/ui/mouse-filter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=metrics-overlay.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-overlay.test.d.ts","sourceRoot":"","sources":["../../../src/ui/overlays/metrics-overlay.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,248 @@
1
+ import { describe, it, expect } from "vitest";
2
+ /**
3
+ * Pure-logic tests for MetricsOverlay.
4
+ *
5
+ * We replicate the selection clamping, navigation bounds,
6
+ * empty-state handling, rendering helpers, and chart downsampling.
7
+ */
8
+ // ─── Selection Logic (from useInput + useEffect) ────────
9
+ function selectionUp(current, entriesLength) {
10
+ if (entriesLength === 0)
11
+ return current;
12
+ return Math.max(0, current - 1);
13
+ }
14
+ function selectionDown(current, entriesLength) {
15
+ if (entriesLength === 0)
16
+ return current;
17
+ return Math.min(entriesLength - 1, current + 1);
18
+ }
19
+ function clampSelection(selectedIndex, entriesLength) {
20
+ if (entriesLength === 0)
21
+ return selectedIndex;
22
+ if (selectedIndex >= entriesLength)
23
+ return entriesLength - 1;
24
+ return selectedIndex;
25
+ }
26
+ // ─── Body Height Calculation ────────────────────────────
27
+ function bodyHeight(height) {
28
+ return height - 1;
29
+ }
30
+ // ─── Chart Width Calculation ────────────────────────────
31
+ function chartWidth(width) {
32
+ return Math.max(20, width - 16);
33
+ }
34
+ // ─── Spark Width Calculation ────────────────────────────
35
+ function sparkWidth(width, nameLength) {
36
+ return Math.max(10, width - nameLength - 4);
37
+ }
38
+ // ─── Chart Downsampling Logic ───────────────────────────
39
+ function downsample(values, width) {
40
+ if (values.length <= width)
41
+ return values;
42
+ const step = values.length / width;
43
+ const sampled = [];
44
+ for (let i = 0; i < width; i++) {
45
+ sampled.push(values[Math.floor(i * step)]);
46
+ }
47
+ return sampled;
48
+ }
49
+ // ─── Trend Icons ────────────────────────────────────────
50
+ const TREND_ICONS = {
51
+ decreasing: "↓",
52
+ increasing: "↑",
53
+ plateau: "→",
54
+ unstable: "~",
55
+ insufficient_data: "?",
56
+ };
57
+ function trendIcon(trend) {
58
+ return TREND_ICONS[trend] ?? "?";
59
+ }
60
+ // ─── Metric Stats Logic ─────────────────────────────────
61
+ function metricStats(values) {
62
+ if (values.length === 0)
63
+ return { latest: null, min: null, max: null };
64
+ return {
65
+ latest: values[values.length - 1],
66
+ min: Math.min(...values),
67
+ max: Math.max(...values),
68
+ };
69
+ }
70
+ // ─── Tests ──────────────────────────────────────────────
71
+ describe("MetricsOverlay — selection navigation", () => {
72
+ it("up from 0 stays at 0", () => {
73
+ expect(selectionUp(0, 5)).toBe(0);
74
+ });
75
+ it("up decrements by 1", () => {
76
+ expect(selectionUp(3, 5)).toBe(2);
77
+ });
78
+ it("down increments by 1", () => {
79
+ expect(selectionDown(0, 5)).toBe(1);
80
+ });
81
+ it("down from last entry stays at last", () => {
82
+ expect(selectionDown(4, 5)).toBe(4);
83
+ });
84
+ it("up with empty entries returns current", () => {
85
+ expect(selectionUp(0, 0)).toBe(0);
86
+ });
87
+ it("down with empty entries returns current", () => {
88
+ expect(selectionDown(0, 0)).toBe(0);
89
+ });
90
+ it("up from 1 goes to 0", () => {
91
+ expect(selectionUp(1, 3)).toBe(0);
92
+ });
93
+ it("down with single entry stays at 0", () => {
94
+ expect(selectionDown(0, 1)).toBe(0);
95
+ });
96
+ });
97
+ describe("MetricsOverlay — selection clamping", () => {
98
+ it("clamps index when entries shrink", () => {
99
+ expect(clampSelection(5, 3)).toBe(2);
100
+ });
101
+ it("does not clamp valid index", () => {
102
+ expect(clampSelection(1, 3)).toBe(1);
103
+ });
104
+ it("clamps to 0 for single entry", () => {
105
+ expect(clampSelection(5, 1)).toBe(0);
106
+ });
107
+ it("returns current for empty entries (no clamping)", () => {
108
+ // The component only clamps when entries.length > 0
109
+ expect(clampSelection(3, 0)).toBe(3);
110
+ });
111
+ it("exact boundary: index == length clamps to length - 1", () => {
112
+ expect(clampSelection(3, 3)).toBe(2);
113
+ });
114
+ it("index 0 with entries stays at 0", () => {
115
+ expect(clampSelection(0, 5)).toBe(0);
116
+ });
117
+ });
118
+ describe("MetricsOverlay — empty metrics map", () => {
119
+ it("entries array from empty map is empty", () => {
120
+ const map = new Map();
121
+ const entries = Array.from(map.entries());
122
+ expect(entries).toEqual([]);
123
+ expect(entries.length).toBe(0);
124
+ });
125
+ it("selection navigation is no-op with empty entries", () => {
126
+ expect(selectionUp(0, 0)).toBe(0);
127
+ expect(selectionDown(0, 0)).toBe(0);
128
+ });
129
+ });
130
+ describe("MetricsOverlay — body and chart dimensions", () => {
131
+ it("body height = height - 1 (for header)", () => {
132
+ expect(bodyHeight(40)).toBe(39);
133
+ expect(bodyHeight(1)).toBe(0);
134
+ expect(bodyHeight(0)).toBe(-1);
135
+ });
136
+ it("chart width has minimum of 20", () => {
137
+ expect(chartWidth(30)).toBe(20);
138
+ expect(chartWidth(36)).toBe(20);
139
+ expect(chartWidth(37)).toBe(21);
140
+ });
141
+ it("chart width subtracts 16 for labels and padding", () => {
142
+ expect(chartWidth(100)).toBe(84);
143
+ expect(chartWidth(80)).toBe(64);
144
+ });
145
+ it("spark width has minimum of 10", () => {
146
+ expect(sparkWidth(20, 15)).toBe(10);
147
+ expect(sparkWidth(10, 5)).toBe(10);
148
+ });
149
+ it("spark width adjusts for metric name length", () => {
150
+ expect(sparkWidth(80, 5)).toBe(71);
151
+ expect(sparkWidth(80, 20)).toBe(56);
152
+ });
153
+ });
154
+ describe("MetricsOverlay — chart downsampling", () => {
155
+ it("returns values unchanged when fewer than width", () => {
156
+ const values = [1, 2, 3, 4, 5];
157
+ expect(downsample(values, 10)).toEqual(values);
158
+ });
159
+ it("returns values unchanged when exactly width", () => {
160
+ const values = [1, 2, 3, 4, 5];
161
+ expect(downsample(values, 5)).toEqual(values);
162
+ });
163
+ it("downsamples to target width", () => {
164
+ const values = Array.from({ length: 100 }, (_, i) => i);
165
+ const sampled = downsample(values, 10);
166
+ expect(sampled.length).toBe(10);
167
+ // First sample should be index 0
168
+ expect(sampled[0]).toBe(0);
169
+ // Second sample: floor(1 * 10) = 10
170
+ expect(sampled[1]).toBe(10);
171
+ });
172
+ it("preserves first value", () => {
173
+ const values = [42, 1, 2, 3, 4, 5, 6, 7, 8, 9];
174
+ const sampled = downsample(values, 3);
175
+ expect(sampled[0]).toBe(42);
176
+ });
177
+ it("handles single-value arrays", () => {
178
+ expect(downsample([5], 1)).toEqual([5]);
179
+ });
180
+ it("handles empty arrays", () => {
181
+ expect(downsample([], 10)).toEqual([]);
182
+ });
183
+ });
184
+ describe("MetricsOverlay — trend icons", () => {
185
+ it("maps known trends to icons", () => {
186
+ expect(trendIcon("decreasing")).toBe("↓");
187
+ expect(trendIcon("increasing")).toBe("↑");
188
+ expect(trendIcon("plateau")).toBe("→");
189
+ expect(trendIcon("unstable")).toBe("~");
190
+ expect(trendIcon("insufficient_data")).toBe("?");
191
+ });
192
+ it("returns ? for unknown trends", () => {
193
+ expect(trendIcon("unknown_trend")).toBe("?");
194
+ expect(trendIcon("")).toBe("?");
195
+ });
196
+ });
197
+ describe("MetricsOverlay — metric stats computation", () => {
198
+ it("computes latest, min, max for normal values", () => {
199
+ const stats = metricStats([3, 1, 4, 1, 5, 9, 2, 6]);
200
+ expect(stats.latest).toBe(6);
201
+ expect(stats.min).toBe(1);
202
+ expect(stats.max).toBe(9);
203
+ });
204
+ it("returns null for empty array", () => {
205
+ const stats = metricStats([]);
206
+ expect(stats.latest).toBeNull();
207
+ expect(stats.min).toBeNull();
208
+ expect(stats.max).toBeNull();
209
+ });
210
+ it("handles single value", () => {
211
+ const stats = metricStats([42]);
212
+ expect(stats.latest).toBe(42);
213
+ expect(stats.min).toBe(42);
214
+ expect(stats.max).toBe(42);
215
+ });
216
+ it("handles negative values", () => {
217
+ const stats = metricStats([-5, -2, -8, -1]);
218
+ expect(stats.latest).toBe(-1);
219
+ expect(stats.min).toBe(-8);
220
+ expect(stats.max).toBe(-1);
221
+ });
222
+ it("handles identical values", () => {
223
+ const stats = metricStats([7, 7, 7]);
224
+ expect(stats.min).toBe(7);
225
+ expect(stats.max).toBe(7);
226
+ });
227
+ });
228
+ describe("MetricsOverlay — entries ordering from Map", () => {
229
+ it("preserves insertion order", () => {
230
+ const map = new Map();
231
+ map.set("loss", [0.5, 0.4]);
232
+ map.set("accuracy", [0.8, 0.9]);
233
+ map.set("lr", [0.001]);
234
+ const entries = Array.from(map.entries());
235
+ expect(entries.map(([name]) => name)).toEqual(["loss", "accuracy", "lr"]);
236
+ });
237
+ it("selected entry determined by index into entries array", () => {
238
+ const map = new Map();
239
+ map.set("loss", [0.5]);
240
+ map.set("accuracy", [0.9]);
241
+ const entries = Array.from(map.entries());
242
+ const selectedIndex = 1;
243
+ const [name, values] = entries[selectedIndex];
244
+ expect(name).toBe("accuracy");
245
+ expect(values).toEqual([0.9]);
246
+ });
247
+ });
248
+ //# sourceMappingURL=metrics-overlay.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-overlay.test.js","sourceRoot":"","sources":["../../../src/ui/overlays/metrics-overlay.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=task-overlay.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-overlay.test.d.ts","sourceRoot":"","sources":["../../../src/ui/overlays/task-overlay.test.ts"],"names":[],"mappings":""}