@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,381 @@
1
+ import { describe, it, expect } from "vitest";
2
+ // ── Local copies of internal helpers (not exported from conversation.tsx) ─────
3
+ function parseResult(tool) {
4
+ if (!tool.result)
5
+ return null;
6
+ try {
7
+ return JSON.parse(tool.result);
8
+ }
9
+ catch {
10
+ return null;
11
+ }
12
+ }
13
+ function trimOutput(text, maxLines) {
14
+ const lines = text.trimEnd().split("\n");
15
+ if (lines.length <= maxLines)
16
+ return text.trimEnd();
17
+ const kept = lines.slice(-maxLines);
18
+ return `… ${lines.length - maxLines} lines hidden …\n${kept.join("\n")}`;
19
+ }
20
+ // ── parseResult ──────────────────────────────────────────────────────
21
+ describe("parseResult", () => {
22
+ const makeTool = (result) => ({
23
+ callId: "c1",
24
+ name: "test",
25
+ args: {},
26
+ result,
27
+ });
28
+ it("parses valid JSON string into an object", () => {
29
+ const tool = makeTool(JSON.stringify({ stdout: "hello", exit_code: 0 }));
30
+ expect(parseResult(tool)).toEqual({ stdout: "hello", exit_code: 0 });
31
+ });
32
+ it("returns null for invalid JSON", () => {
33
+ const tool = makeTool("not json at all {{{");
34
+ expect(parseResult(tool)).toBeNull();
35
+ });
36
+ it("returns null when result is undefined", () => {
37
+ const tool = makeTool(undefined);
38
+ expect(parseResult(tool)).toBeNull();
39
+ });
40
+ it("returns null for empty string (invalid JSON)", () => {
41
+ const tool = makeTool("");
42
+ expect(parseResult(tool)).toBeNull();
43
+ });
44
+ it("parses nested objects correctly", () => {
45
+ const nested = { a: { b: { c: 42 } }, d: "value" };
46
+ const tool = makeTool(JSON.stringify(nested));
47
+ expect(parseResult(tool)).toEqual(nested);
48
+ });
49
+ it("parses arrays in JSON", () => {
50
+ const arr = [1, 2, { x: true }];
51
+ const tool = makeTool(JSON.stringify(arr));
52
+ // JSON.parse returns the array, but typed as Record<string, unknown>
53
+ expect(parseResult(tool)).toEqual(arr);
54
+ });
55
+ it("parses JSON with numeric string result", () => {
56
+ // JSON.parse("42") returns 42, which is not Record<string,unknown>
57
+ // but the function doesn't guard the return type beyond JSON.parse
58
+ const tool = makeTool("42");
59
+ expect(parseResult(tool)).toBe(42);
60
+ });
61
+ it("parses JSON with null literal", () => {
62
+ const tool = makeTool("null");
63
+ // JSON.parse("null") returns null
64
+ expect(parseResult(tool)).toBeNull();
65
+ });
66
+ it("parses JSON boolean literal", () => {
67
+ const tool = makeTool("true");
68
+ expect(parseResult(tool)).toBe(true);
69
+ });
70
+ });
71
+ // ── trimOutput ───────────────────────────────────────────────────────
72
+ describe("trimOutput", () => {
73
+ it("returns text unchanged when fewer lines than max", () => {
74
+ const text = "line 1\nline 2\nline 3";
75
+ expect(trimOutput(text, 5)).toBe("line 1\nline 2\nline 3");
76
+ });
77
+ it("returns text unchanged when exactly maxLines", () => {
78
+ const text = "a\nb\nc";
79
+ expect(trimOutput(text, 3)).toBe("a\nb\nc");
80
+ });
81
+ it("truncates and shows hidden count when exceeding maxLines", () => {
82
+ const text = "line 1\nline 2\nline 3\nline 4\nline 5";
83
+ const result = trimOutput(text, 3);
84
+ expect(result).toBe("… 2 lines hidden …\nline 3\nline 4\nline 5");
85
+ });
86
+ it("handles single line text", () => {
87
+ expect(trimOutput("hello", 5)).toBe("hello");
88
+ expect(trimOutput("hello", 1)).toBe("hello");
89
+ });
90
+ it("handles empty text", () => {
91
+ // "".trimEnd() is "", "".split("\n") is [""], length 1
92
+ expect(trimOutput("", 1)).toBe("");
93
+ expect(trimOutput("", 5)).toBe("");
94
+ });
95
+ it("trims trailing whitespace", () => {
96
+ const text = "line 1\nline 2 \n";
97
+ expect(trimOutput(text, 5)).toBe("line 1\nline 2");
98
+ });
99
+ it("trims trailing newlines", () => {
100
+ const text = "line 1\nline 2\n\n\n";
101
+ // trimEnd removes trailing newlines, so "line 1\nline 2" -> 2 lines
102
+ expect(trimOutput(text, 5)).toBe("line 1\nline 2");
103
+ });
104
+ it("handles maxLines of 1", () => {
105
+ const text = "line 1\nline 2\nline 3";
106
+ const result = trimOutput(text, 1);
107
+ expect(result).toBe("… 2 lines hidden …\nline 3");
108
+ });
109
+ it("handles large text with small maxLines", () => {
110
+ const lines = Array.from({ length: 100 }, (_, i) => `line ${i + 1}`);
111
+ const text = lines.join("\n");
112
+ const result = trimOutput(text, 5);
113
+ expect(result).toContain("… 95 lines hidden …");
114
+ expect(result).toContain("line 96");
115
+ expect(result).toContain("line 97");
116
+ expect(result).toContain("line 98");
117
+ expect(result).toContain("line 99");
118
+ expect(result).toContain("line 100");
119
+ // Should NOT contain early lines
120
+ expect(result).not.toContain("line 1\n");
121
+ });
122
+ it("keeps the last N lines (tail behavior)", () => {
123
+ const text = "first\nsecond\nthird\nfourth\nfifth";
124
+ const result = trimOutput(text, 2);
125
+ expect(result).toBe("… 3 lines hidden …\nfourth\nfifth");
126
+ });
127
+ });
128
+ // ── Tool display routing logic ───────────────────────────────────────
129
+ describe("ToolCallBlock routing", () => {
130
+ // Since we can't render components, verify the routing table matches expectations
131
+ const TOOL_ROUTE_MAP = {
132
+ remote_exec: "ExecDisplay",
133
+ remote_exec_background: "ExecBackgroundDisplay",
134
+ remote_upload: "FileSyncDisplay",
135
+ remote_download: "FileSyncDisplay",
136
+ sleep: "SleepDisplay",
137
+ start_monitor: "MonitorDisplay",
138
+ stop_monitor: "MonitorStopDisplay",
139
+ task_output: "TaskOutputDisplay",
140
+ list_machines: "ListMachinesDisplay",
141
+ show_metrics: "ShowMetricsDisplay",
142
+ compare_runs: "CompareRunsDisplay",
143
+ };
144
+ const KNOWN_TOOL_NAMES = Object.keys(TOOL_ROUTE_MAP);
145
+ it("has 11 explicitly routed tool names", () => {
146
+ expect(KNOWN_TOOL_NAMES).toHaveLength(11);
147
+ });
148
+ it("routes remote_upload and remote_download to the same display", () => {
149
+ expect(TOOL_ROUTE_MAP.remote_upload).toBe(TOOL_ROUTE_MAP.remote_download);
150
+ });
151
+ it("all expected tool names are present in routing", () => {
152
+ const expected = [
153
+ "remote_exec",
154
+ "remote_exec_background",
155
+ "remote_upload",
156
+ "remote_download",
157
+ "sleep",
158
+ "start_monitor",
159
+ "stop_monitor",
160
+ "task_output",
161
+ "list_machines",
162
+ "show_metrics",
163
+ "compare_runs",
164
+ ];
165
+ for (const name of expected) {
166
+ expect(TOOL_ROUTE_MAP).toHaveProperty(name);
167
+ }
168
+ });
169
+ it("unknown tool names would fall through to GenericToolDisplay", () => {
170
+ const unknownTools = ["write_file", "search", "my_custom_tool", ""];
171
+ for (const name of unknownTools) {
172
+ expect(KNOWN_TOOL_NAMES).not.toContain(name);
173
+ }
174
+ });
175
+ });
176
+ // ── Message role routing ─────────────────────────────────────────────
177
+ describe("MessageLine role routing", () => {
178
+ // Test the role routing logic pattern from the switch statement
179
+ const VALID_ROLES = ["user", "assistant", "tool", "error", "system"];
180
+ it("recognizes all 5 valid roles", () => {
181
+ expect(VALID_ROLES).toHaveLength(5);
182
+ });
183
+ it("user messages render with content", () => {
184
+ const msg = { id: 1, role: "user", content: "run training" };
185
+ expect(msg.role).toBe("user");
186
+ expect(msg.content).toBeTruthy();
187
+ // user branch always renders (no null return)
188
+ });
189
+ it("assistant messages render with content", () => {
190
+ const msg = { id: 2, role: "assistant", content: "Sure, starting..." };
191
+ expect(msg.role).toBe("assistant");
192
+ // assistant branch delegates to AssistantMessage
193
+ });
194
+ it("tool messages with tool data render ToolCallBlock", () => {
195
+ const tool = {
196
+ callId: "c1",
197
+ name: "remote_exec",
198
+ args: { command: "ls" },
199
+ result: '{"stdout":"file.txt","exit_code":0}',
200
+ };
201
+ const msg = { id: 3, role: "tool", content: "", tool };
202
+ expect(msg.role).toBe("tool");
203
+ expect(msg.tool).toBeDefined();
204
+ // tool branch with tool data renders <ToolCallBlock />
205
+ });
206
+ it("tool messages without tool data render null", () => {
207
+ const msg = { id: 4, role: "tool", content: "" };
208
+ expect(msg.role).toBe("tool");
209
+ expect(msg.tool).toBeUndefined();
210
+ // tool branch without tool data returns null
211
+ });
212
+ it("error messages display content", () => {
213
+ const msg = { id: 5, role: "error", content: "Connection lost" };
214
+ expect(msg.role).toBe("error");
215
+ expect(msg.content).toBeTruthy();
216
+ });
217
+ it("system messages display content", () => {
218
+ const msg = { id: 6, role: "system", content: "Session resumed" };
219
+ expect(msg.role).toBe("system");
220
+ expect(msg.content).toBeTruthy();
221
+ });
222
+ it("unknown roles fall through to default (plain text)", () => {
223
+ // The type restricts roles, but default case handles unexpected values
224
+ const msg = { id: 7, role: "unknown", content: "fallback" };
225
+ expect(msg.content).toBe("fallback");
226
+ // default branch renders plain <Text>{content}</Text>
227
+ });
228
+ });
229
+ // ── Markdown throttling constant ─────────────────────────────────────
230
+ describe("markdown throttle", () => {
231
+ const MD_THROTTLE_MS = 150;
232
+ it("throttle constant is 150ms", () => {
233
+ expect(MD_THROTTLE_MS).toBe(150);
234
+ });
235
+ it("throttle is positive and reasonable for UI rendering", () => {
236
+ expect(MD_THROTTLE_MS).toBeGreaterThan(0);
237
+ expect(MD_THROTTLE_MS).toBeLessThanOrEqual(1000);
238
+ });
239
+ });
240
+ // ── PulsingIndicator frames ──────────────────────────────────────────
241
+ describe("PulsingIndicator frames", () => {
242
+ const PULSE_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
243
+ it("has 10 animation frames", () => {
244
+ expect(PULSE_FRAMES).toHaveLength(10);
245
+ });
246
+ it("all frames are single braille characters", () => {
247
+ for (const frame of PULSE_FRAMES) {
248
+ expect(frame).toHaveLength(1);
249
+ // Braille patterns are in U+2800..U+28FF
250
+ const code = frame.codePointAt(0);
251
+ expect(code).toBeGreaterThanOrEqual(0x2800);
252
+ expect(code).toBeLessThanOrEqual(0x28ff);
253
+ }
254
+ });
255
+ it("frame cycling wraps correctly via modulo", () => {
256
+ const frame = (n) => PULSE_FRAMES[n % PULSE_FRAMES.length];
257
+ expect(frame(0)).toBe("⠋");
258
+ expect(frame(9)).toBe("⠏");
259
+ expect(frame(10)).toBe("⠋"); // wraps
260
+ expect(frame(25)).toBe("⠴"); // 25 % 10 = 5
261
+ });
262
+ });
263
+ // ── GenericToolDisplay arg formatting ────────────────────────────────
264
+ describe("GenericToolDisplay arg formatting pattern", () => {
265
+ // Replicating the inline arg formatting logic from GenericToolDisplay
266
+ function formatArgs(args) {
267
+ return Object.entries(args)
268
+ .map(([k, v]) => {
269
+ const val = typeof v === "string" ? v : JSON.stringify(v);
270
+ return `${k}: ${val}`;
271
+ })
272
+ .join(" ");
273
+ }
274
+ it("formats string args directly", () => {
275
+ expect(formatArgs({ path: "/tmp/data" })).toBe("path: /tmp/data");
276
+ });
277
+ it("JSON-stringifies non-string args", () => {
278
+ expect(formatArgs({ count: 5 })).toBe("count: 5");
279
+ expect(formatArgs({ verbose: true })).toBe("verbose: true");
280
+ expect(formatArgs({ items: [1, 2] })).toBe("items: [1,2]");
281
+ });
282
+ it("joins multiple args with double space", () => {
283
+ const result = formatArgs({ a: "x", b: "y" });
284
+ expect(result).toBe("a: x b: y");
285
+ });
286
+ it("handles empty args", () => {
287
+ expect(formatArgs({})).toBe("");
288
+ });
289
+ });
290
+ // ── ExecDisplay parseResult integration ──────────────────────────────
291
+ describe("ExecDisplay result extraction pattern", () => {
292
+ it("extracts stdout, stderr, exit_code from parsed result", () => {
293
+ const tool = {
294
+ callId: "c1",
295
+ name: "remote_exec",
296
+ args: { machine_id: "gpu-1", command: "nvidia-smi" },
297
+ result: JSON.stringify({ stdout: "GPU 0: A100", stderr: "", exit_code: 0 }),
298
+ };
299
+ const result = parseResult(tool);
300
+ expect(result).not.toBeNull();
301
+ expect(result.stdout).toBe("GPU 0: A100");
302
+ expect(result.stderr).toBe("");
303
+ expect(result.exit_code).toBe(0);
304
+ });
305
+ it("handles missing result (running state)", () => {
306
+ const tool = {
307
+ callId: "c2",
308
+ name: "remote_exec",
309
+ args: { machine_id: "gpu-1", command: "python train.py" },
310
+ };
311
+ expect(parseResult(tool)).toBeNull();
312
+ });
313
+ it("falls back gracefully on non-JSON result", () => {
314
+ const tool = {
315
+ callId: "c3",
316
+ name: "remote_exec",
317
+ args: { machine_id: "gpu-1", command: "echo hi" },
318
+ result: "raw output without json wrapper",
319
+ };
320
+ expect(parseResult(tool)).toBeNull();
321
+ });
322
+ it("extracts machine_id and command from args with fallback", () => {
323
+ const tool = { callId: "c4", name: "remote_exec", args: {} };
324
+ const machine = tool.args.machine_id ?? "?";
325
+ const command = tool.args.command ?? "";
326
+ expect(machine).toBe("?");
327
+ expect(command).toBe("");
328
+ });
329
+ });
330
+ // ── CompareRunsDisplay direction helpers ──────────────────────────────
331
+ describe("CompareRunsDisplay direction helpers", () => {
332
+ // Replicate the inline helpers
333
+ function dirIcon(d) {
334
+ switch (d) {
335
+ case "decreased": return "\u2193";
336
+ case "increased": return "\u2191";
337
+ case "unchanged": return "\u2192";
338
+ default: return "?";
339
+ }
340
+ }
341
+ it("maps direction strings to correct icons", () => {
342
+ expect(dirIcon("decreased")).toBe("↓");
343
+ expect(dirIcon("increased")).toBe("↑");
344
+ expect(dirIcon("unchanged")).toBe("→");
345
+ expect(dirIcon("something_else")).toBe("?");
346
+ });
347
+ });
348
+ // ── ShowMetricsDisplay trend helpers ─────────────────────────────────
349
+ describe("ShowMetricsDisplay trend helpers", () => {
350
+ function trendIcon(trend) {
351
+ switch (trend) {
352
+ case "decreasing": return "\u2193";
353
+ case "increasing": return "\u2191";
354
+ case "plateau": return "\u2192";
355
+ case "unstable": return "~";
356
+ default: return "?";
357
+ }
358
+ }
359
+ it("maps trend strings to correct icons", () => {
360
+ expect(trendIcon("decreasing")).toBe("↓");
361
+ expect(trendIcon("increasing")).toBe("↑");
362
+ expect(trendIcon("plateau")).toBe("→");
363
+ expect(trendIcon("unstable")).toBe("~");
364
+ expect(trendIcon("unknown")).toBe("?");
365
+ });
366
+ });
367
+ // ── fmtVal (formatMetricValue wrapper) ───────────────────────────────
368
+ describe("fmtVal null handling", () => {
369
+ // Replicate the local wrapper from conversation.tsx
370
+ // fmtVal delegates to formatMetricValue, but handles null with em dash
371
+ const fmtVal = (v) => v === null ? "\u2014" : String(v);
372
+ it("returns em dash for null", () => {
373
+ expect(fmtVal(null)).toBe("\u2014");
374
+ });
375
+ it("returns value string for numbers", () => {
376
+ expect(fmtVal(0)).toBe("0");
377
+ expect(fmtVal(42)).toBe("42");
378
+ expect(fmtVal(-1)).toBe("-1");
379
+ });
380
+ });
381
+ //# sourceMappingURL=conversation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.test.js","sourceRoot":"","sources":["../../../src/ui/panels/conversation.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=metrics-dashboard.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-dashboard.test.d.ts","sourceRoot":"","sources":["../../../src/ui/panels/metrics-dashboard.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,191 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { sparkline } from "./metrics-dashboard.js";
3
+ import { nameHash, METRIC_COLORS } from "../theme.js";
4
+ // Block characters used in sparkline, for reference:
5
+ // ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ (indices 0-7)
6
+ const BLOCKS = ["\u2581", "\u2582", "\u2583", "\u2584", "\u2585", "\u2586", "\u2587", "\u2588"];
7
+ describe("sparkline", () => {
8
+ it("returns empty string for empty array", () => {
9
+ expect(sparkline([])).toBe("");
10
+ expect(sparkline([], 10)).toBe("");
11
+ });
12
+ it("returns single block character for single value", () => {
13
+ const result = sparkline([5]);
14
+ expect(result).toHaveLength(1);
15
+ expect(BLOCKS).toContain(result);
16
+ });
17
+ it("single value maps to first block (min === max, range forced to 1)", () => {
18
+ // When min === max, range = 1, so (v - min) / range = 0 => index 0
19
+ const result = sparkline([42]);
20
+ expect(result).toBe(BLOCKS[0]);
21
+ });
22
+ it("all same values produce all same characters", () => {
23
+ const result = sparkline([5, 5, 5, 5, 5], 5);
24
+ expect(result).toHaveLength(5);
25
+ // All chars should be identical
26
+ const chars = [...result];
27
+ expect(new Set(chars).size).toBe(1);
28
+ // When all same, min === max, range = 1, (v - min)/range = 0 => index 0
29
+ expect(chars[0]).toBe(BLOCKS[0]);
30
+ });
31
+ it("increasing values produce ascending block characters", () => {
32
+ const values = [0, 1, 2, 3, 4, 5, 6, 7];
33
+ const result = sparkline(values, 8);
34
+ expect(result).toHaveLength(8);
35
+ // First char should be lowest block, last should be highest
36
+ expect(result[0]).toBe(BLOCKS[0]);
37
+ expect(result[result.length - 1]).toBe(BLOCKS[7]);
38
+ // Each character should be >= the previous one
39
+ for (let i = 1; i < result.length; i++) {
40
+ expect(BLOCKS.indexOf(result[i])).toBeGreaterThanOrEqual(BLOCKS.indexOf(result[i - 1]));
41
+ }
42
+ });
43
+ it("decreasing values produce descending block characters", () => {
44
+ const values = [7, 6, 5, 4, 3, 2, 1, 0];
45
+ const result = sparkline(values, 8);
46
+ expect(result).toHaveLength(8);
47
+ expect(result[0]).toBe(BLOCKS[7]);
48
+ expect(result[result.length - 1]).toBe(BLOCKS[0]);
49
+ // Each character should be <= the previous one
50
+ for (let i = 1; i < result.length; i++) {
51
+ expect(BLOCKS.indexOf(result[i])).toBeLessThanOrEqual(BLOCKS.indexOf(result[i - 1]));
52
+ }
53
+ });
54
+ it("values with wide range normalize correctly", () => {
55
+ const values = [0, 1000000];
56
+ const result = sparkline(values, 2);
57
+ expect(result).toHaveLength(2);
58
+ expect(result[0]).toBe(BLOCKS[0]); // min value
59
+ expect(result[1]).toBe(BLOCKS[7]); // max value
60
+ });
61
+ it("width parameter controls output length by sampling", () => {
62
+ // 20 values, width = 5 -> step = floor(20/5) = 4, samples at indices 0,4,8,12,16
63
+ const values = Array.from({ length: 20 }, (_, i) => i);
64
+ const result = sparkline(values, 5);
65
+ expect(result.length).toBeLessThanOrEqual(5);
66
+ });
67
+ it("width larger than values length produces output of values.length", () => {
68
+ // 3 values, width = 100 -> step = max(1, floor(3/100)) = 1
69
+ // Iterates i=0,1,2, all sampled, length = 3 <= 100 so no truncation
70
+ const values = [1, 2, 3];
71
+ const result = sparkline(values, 100);
72
+ expect(result).toHaveLength(3);
73
+ });
74
+ it("default width is 40", () => {
75
+ // 80 values, default width 40 -> step = floor(80/40) = 2
76
+ const values = Array.from({ length: 80 }, (_, i) => i);
77
+ const result = sparkline(values);
78
+ expect(result.length).toBeLessThanOrEqual(40);
79
+ });
80
+ it("handles negative values", () => {
81
+ const values = [-10, -5, 0, 5, 10];
82
+ const result = sparkline(values, 5);
83
+ expect(result).toHaveLength(5);
84
+ // -10 is min -> lowest block, 10 is max -> highest block
85
+ expect(result[0]).toBe(BLOCKS[0]);
86
+ expect(result[result.length - 1]).toBe(BLOCKS[7]);
87
+ });
88
+ it("handles all negative values", () => {
89
+ const values = [-100, -50, -10];
90
+ const result = sparkline(values, 3);
91
+ expect(result).toHaveLength(3);
92
+ expect(result[0]).toBe(BLOCKS[0]); // most negative = min
93
+ expect(result[2]).toBe(BLOCKS[7]); // least negative = max
94
+ });
95
+ it("handles very large values", () => {
96
+ const values = [1e15, 2e15, 3e15];
97
+ const result = sparkline(values, 3);
98
+ expect(result).toHaveLength(3);
99
+ expect(result[0]).toBe(BLOCKS[0]);
100
+ expect(result[2]).toBe(BLOCKS[7]);
101
+ });
102
+ it("handles mix of positive and zero values", () => {
103
+ const values = [0, 0, 5, 10, 0];
104
+ const result = sparkline(values, 5);
105
+ expect(result).toHaveLength(5);
106
+ // 0 is min, 10 is max
107
+ expect(result[0]).toBe(BLOCKS[0]); // 0 -> min
108
+ expect(result[3]).toBe(BLOCKS[7]); // 10 -> max
109
+ });
110
+ it("all zero values produce flat line", () => {
111
+ const values = [0, 0, 0, 0];
112
+ const result = sparkline(values, 4);
113
+ expect(result).toHaveLength(4);
114
+ const chars = [...result];
115
+ // All the same character (min === max => range = 1, all map to index 0)
116
+ expect(new Set(chars).size).toBe(1);
117
+ expect(chars[0]).toBe(BLOCKS[0]);
118
+ });
119
+ it("two values produce correct min/max blocks", () => {
120
+ const result = sparkline([0, 100], 2);
121
+ expect(result).toBe(BLOCKS[0] + BLOCKS[7]);
122
+ });
123
+ it("correctly samples when values exceed width", () => {
124
+ // 10 values, width 5 -> step = 2, samples at i=0,2,4,6,8
125
+ const values = [0, 99, 10, 99, 20, 99, 30, 99, 40, 99];
126
+ const result = sparkline(values, 5);
127
+ // Sampled values: 0, 10, 20, 30, 40 (even indices)
128
+ expect(result).toHaveLength(5);
129
+ // Should be ascending since sampled even-index values are ascending
130
+ for (let i = 1; i < result.length; i++) {
131
+ expect(BLOCKS.indexOf(result[i])).toBeGreaterThanOrEqual(BLOCKS.indexOf(result[i - 1]));
132
+ }
133
+ });
134
+ it("values exactly at block boundaries", () => {
135
+ // With 8 blocks and values 0..7, each maps to exactly one block index
136
+ const values = [0, 1, 2, 3, 4, 5, 6, 7];
137
+ const result = sparkline(values, 8);
138
+ for (let i = 0; i < 8; i++) {
139
+ expect(result[i]).toBe(BLOCKS[i]);
140
+ }
141
+ });
142
+ });
143
+ describe("nameHash", () => {
144
+ it("returns a non-negative number", () => {
145
+ expect(nameHash("loss")).toBeGreaterThanOrEqual(0);
146
+ expect(nameHash("accuracy")).toBeGreaterThanOrEqual(0);
147
+ expect(nameHash("")).toBeGreaterThanOrEqual(0);
148
+ });
149
+ it("returns 0 for empty string", () => {
150
+ expect(nameHash("")).toBe(0);
151
+ });
152
+ it("returns consistent values for the same string", () => {
153
+ const h1 = nameHash("train/loss");
154
+ const h2 = nameHash("train/loss");
155
+ expect(h1).toBe(h2);
156
+ });
157
+ it("returns different values for different strings", () => {
158
+ const h1 = nameHash("loss");
159
+ const h2 = nameHash("accuracy");
160
+ expect(h1).not.toBe(h2);
161
+ });
162
+ it("produces valid index into METRIC_COLORS", () => {
163
+ const testNames = ["loss", "accuracy", "lr", "epoch", "val_loss", "f1"];
164
+ for (const name of testNames) {
165
+ const idx = nameHash(name) % METRIC_COLORS.length;
166
+ expect(idx).toBeGreaterThanOrEqual(0);
167
+ expect(idx).toBeLessThan(METRIC_COLORS.length);
168
+ expect(METRIC_COLORS[idx]).toBeDefined();
169
+ }
170
+ });
171
+ it("distributes across multiple color indices", () => {
172
+ const names = [
173
+ "loss", "accuracy", "lr", "epoch", "val_loss", "f1",
174
+ "precision", "recall", "train_loss", "val_accuracy",
175
+ "grad_norm", "throughput", "latency", "memory_used",
176
+ ];
177
+ const indices = new Set(names.map((n) => nameHash(n) % METRIC_COLORS.length));
178
+ // With 14 names and 10 colors, we should hit at least a few different indices
179
+ expect(indices.size).toBeGreaterThanOrEqual(3);
180
+ });
181
+ it("handles special characters", () => {
182
+ expect(nameHash("train/loss")).toBeGreaterThanOrEqual(0);
183
+ expect(nameHash("metric.name")).toBeGreaterThanOrEqual(0);
184
+ expect(nameHash("a-b-c")).toBeGreaterThanOrEqual(0);
185
+ });
186
+ it("handles unicode strings", () => {
187
+ expect(nameHash("\u00e9poch")).toBeGreaterThanOrEqual(0);
188
+ expect(nameHash("\u2603")).toBeGreaterThanOrEqual(0);
189
+ });
190
+ });
191
+ //# sourceMappingURL=metrics-dashboard.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-dashboard.test.js","sourceRoot":"","sources":["../../../src/ui/panels/metrics-dashboard.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sleep-panel.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep-panel.test.d.ts","sourceRoot":"","sources":["../../../src/ui/panels/sleep-panel.test.ts"],"names":[],"mappings":""}