@snoglobe/helios 0.3.5 → 0.4.0

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 (331) 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/config/project.test.d.ts +2 -0
  6. package/dist/config/project.test.d.ts.map +1 -0
  7. package/dist/config/project.test.js +219 -0
  8. package/dist/config/project.test.js.map +1 -0
  9. package/dist/core/orchestrator-integration.test.d.ts +2 -0
  10. package/dist/core/orchestrator-integration.test.d.ts.map +1 -0
  11. package/dist/core/orchestrator-integration.test.js +674 -0
  12. package/dist/core/orchestrator-integration.test.js.map +1 -0
  13. package/dist/core/orchestrator.d.ts +3 -1
  14. package/dist/core/orchestrator.d.ts.map +1 -1
  15. package/dist/core/orchestrator.js +98 -53
  16. package/dist/core/orchestrator.js.map +1 -1
  17. package/dist/core/orchestrator.test.d.ts +2 -0
  18. package/dist/core/orchestrator.test.d.ts.map +1 -0
  19. package/dist/core/orchestrator.test.js +982 -0
  20. package/dist/core/orchestrator.test.js.map +1 -0
  21. package/dist/core/state-machine.d.ts.map +1 -1
  22. package/dist/core/state-machine.js +3 -0
  23. package/dist/core/state-machine.js.map +1 -1
  24. package/dist/core/state-machine.test.d.ts +2 -0
  25. package/dist/core/state-machine.test.d.ts.map +1 -0
  26. package/dist/core/state-machine.test.js +95 -0
  27. package/dist/core/state-machine.test.js.map +1 -0
  28. package/dist/core/stickies.d.ts.map +1 -1
  29. package/dist/core/stickies.js +3 -0
  30. package/dist/core/stickies.js.map +1 -1
  31. package/dist/core/stickies.test.d.ts +2 -0
  32. package/dist/core/stickies.test.d.ts.map +1 -0
  33. package/dist/core/stickies.test.js +63 -0
  34. package/dist/core/stickies.test.js.map +1 -0
  35. package/dist/core/task-poller.d.ts.map +1 -1
  36. package/dist/core/task-poller.js +2 -1
  37. package/dist/core/task-poller.js.map +1 -1
  38. package/dist/init.d.ts +2 -0
  39. package/dist/init.d.ts.map +1 -1
  40. package/dist/init.js +19 -0
  41. package/dist/init.js.map +1 -1
  42. package/dist/memory/context-gate.test.d.ts +2 -0
  43. package/dist/memory/context-gate.test.d.ts.map +1 -0
  44. package/dist/memory/context-gate.test.js +318 -0
  45. package/dist/memory/context-gate.test.js.map +1 -0
  46. package/dist/memory/experiment-tracker.test.d.ts +2 -0
  47. package/dist/memory/experiment-tracker.test.d.ts.map +1 -0
  48. package/dist/memory/experiment-tracker.test.js +325 -0
  49. package/dist/memory/experiment-tracker.test.js.map +1 -0
  50. package/dist/memory/memory-store.d.ts +2 -0
  51. package/dist/memory/memory-store.d.ts.map +1 -1
  52. package/dist/memory/memory-store.js +35 -28
  53. package/dist/memory/memory-store.js.map +1 -1
  54. package/dist/memory/memory-store.test.d.ts +2 -0
  55. package/dist/memory/memory-store.test.d.ts.map +1 -0
  56. package/dist/memory/memory-store.test.js +144 -0
  57. package/dist/memory/memory-store.test.js.map +1 -0
  58. package/dist/memory/token-estimator.test.d.ts +2 -0
  59. package/dist/memory/token-estimator.test.d.ts.map +1 -0
  60. package/dist/memory/token-estimator.test.js +42 -0
  61. package/dist/memory/token-estimator.test.js.map +1 -0
  62. package/dist/metrics/analyzer.test.d.ts +2 -0
  63. package/dist/metrics/analyzer.test.d.ts.map +1 -0
  64. package/dist/metrics/analyzer.test.js +65 -0
  65. package/dist/metrics/analyzer.test.js.map +1 -0
  66. package/dist/metrics/parser.test.d.ts +2 -0
  67. package/dist/metrics/parser.test.d.ts.map +1 -0
  68. package/dist/metrics/parser.test.js +106 -0
  69. package/dist/metrics/parser.test.js.map +1 -0
  70. package/dist/metrics/store.d.ts +2 -0
  71. package/dist/metrics/store.d.ts.map +1 -1
  72. package/dist/metrics/store.js +26 -50
  73. package/dist/metrics/store.js.map +1 -1
  74. package/dist/metrics/store.test.d.ts +2 -0
  75. package/dist/metrics/store.test.d.ts.map +1 -0
  76. package/dist/metrics/store.test.js +148 -0
  77. package/dist/metrics/store.test.js.map +1 -0
  78. package/dist/paths.js +5 -5
  79. package/dist/paths.js.map +1 -1
  80. package/dist/providers/auth/auth-manager.d.ts +1 -0
  81. package/dist/providers/auth/auth-manager.d.ts.map +1 -1
  82. package/dist/providers/auth/auth-manager.js +8 -1
  83. package/dist/providers/auth/auth-manager.js.map +1 -1
  84. package/dist/providers/auth/auth-manager.test.d.ts +2 -0
  85. package/dist/providers/auth/auth-manager.test.d.ts.map +1 -0
  86. package/dist/providers/auth/auth-manager.test.js +364 -0
  87. package/dist/providers/auth/auth-manager.test.js.map +1 -0
  88. package/dist/providers/auth/token-store.js +2 -2
  89. package/dist/providers/auth/token-store.js.map +1 -1
  90. package/dist/providers/claude/history.test.d.ts +2 -0
  91. package/dist/providers/claude/history.test.d.ts.map +1 -0
  92. package/dist/providers/claude/history.test.js +755 -0
  93. package/dist/providers/claude/history.test.js.map +1 -0
  94. package/dist/providers/claude/provider.d.ts +4 -2
  95. package/dist/providers/claude/provider.d.ts.map +1 -1
  96. package/dist/providers/claude/provider.js +44 -22
  97. package/dist/providers/claude/provider.js.map +1 -1
  98. package/dist/providers/claude/provider.test.d.ts +2 -0
  99. package/dist/providers/claude/provider.test.d.ts.map +1 -0
  100. package/dist/providers/claude/provider.test.js +1167 -0
  101. package/dist/providers/claude/provider.test.js.map +1 -0
  102. package/dist/providers/openai/history.test.d.ts +2 -0
  103. package/dist/providers/openai/history.test.d.ts.map +1 -0
  104. package/dist/providers/openai/history.test.js +655 -0
  105. package/dist/providers/openai/history.test.js.map +1 -0
  106. package/dist/providers/openai/provider.d.ts +3 -2
  107. package/dist/providers/openai/provider.d.ts.map +1 -1
  108. package/dist/providers/openai/provider.js +18 -11
  109. package/dist/providers/openai/provider.js.map +1 -1
  110. package/dist/providers/openai/provider.test.d.ts +2 -0
  111. package/dist/providers/openai/provider.test.d.ts.map +1 -0
  112. package/dist/providers/openai/provider.test.js +1089 -0
  113. package/dist/providers/openai/provider.test.js.map +1 -0
  114. package/dist/providers/retry.test.d.ts +2 -0
  115. package/dist/providers/retry.test.d.ts.map +1 -0
  116. package/dist/providers/retry.test.js +194 -0
  117. package/dist/providers/retry.test.js.map +1 -0
  118. package/dist/providers/sse.d.ts +1 -0
  119. package/dist/providers/sse.d.ts.map +1 -1
  120. package/dist/providers/sse.js +29 -20
  121. package/dist/providers/sse.js.map +1 -1
  122. package/dist/providers/sse.test.d.ts +2 -0
  123. package/dist/providers/sse.test.d.ts.map +1 -0
  124. package/dist/providers/sse.test.js +79 -0
  125. package/dist/providers/sse.test.js.map +1 -0
  126. package/dist/providers/types.d.ts +1 -1
  127. package/dist/providers/types.d.ts.map +1 -1
  128. package/dist/providers/types.test.d.ts +2 -0
  129. package/dist/providers/types.test.d.ts.map +1 -0
  130. package/dist/providers/types.test.js +112 -0
  131. package/dist/providers/types.test.js.map +1 -0
  132. package/dist/remote/connection-pool.d.ts.map +1 -1
  133. package/dist/remote/connection-pool.js +24 -3
  134. package/dist/remote/connection-pool.js.map +1 -1
  135. package/dist/remote/file-sync.d.ts.map +1 -1
  136. package/dist/remote/file-sync.js +4 -3
  137. package/dist/remote/file-sync.js.map +1 -1
  138. package/dist/scheduler/sleep-manager.d.ts.map +1 -1
  139. package/dist/scheduler/sleep-manager.js +8 -1
  140. package/dist/scheduler/sleep-manager.js.map +1 -1
  141. package/dist/scheduler/sleep-manager.test.d.ts +2 -0
  142. package/dist/scheduler/sleep-manager.test.d.ts.map +1 -0
  143. package/dist/scheduler/sleep-manager.test.js +491 -0
  144. package/dist/scheduler/sleep-manager.test.js.map +1 -0
  145. package/dist/scheduler/ssh-batcher.d.ts.map +1 -1
  146. package/dist/scheduler/ssh-batcher.js +6 -4
  147. package/dist/scheduler/ssh-batcher.js.map +1 -1
  148. package/dist/scheduler/ssh-batcher.test.d.ts +2 -0
  149. package/dist/scheduler/ssh-batcher.test.d.ts.map +1 -0
  150. package/dist/scheduler/ssh-batcher.test.js +76 -0
  151. package/dist/scheduler/ssh-batcher.test.js.map +1 -0
  152. package/dist/scheduler/state-store.d.ts.map +1 -1
  153. package/dist/scheduler/state-store.js +1 -2
  154. package/dist/scheduler/state-store.js.map +1 -1
  155. package/dist/scheduler/trigger-scheduler.d.ts.map +1 -1
  156. package/dist/scheduler/trigger-scheduler.js +59 -36
  157. package/dist/scheduler/trigger-scheduler.js.map +1 -1
  158. package/dist/scheduler/trigger-scheduler.test.d.ts +2 -0
  159. package/dist/scheduler/trigger-scheduler.test.d.ts.map +1 -0
  160. package/dist/scheduler/trigger-scheduler.test.js +483 -0
  161. package/dist/scheduler/trigger-scheduler.test.js.map +1 -0
  162. package/dist/scheduler/triggers/file.d.ts.map +1 -1
  163. package/dist/scheduler/triggers/file.js +12 -3
  164. package/dist/scheduler/triggers/file.js.map +1 -1
  165. package/dist/scheduler/triggers/file.test.d.ts +2 -0
  166. package/dist/scheduler/triggers/file.test.d.ts.map +1 -0
  167. package/dist/scheduler/triggers/file.test.js +294 -0
  168. package/dist/scheduler/triggers/file.test.js.map +1 -0
  169. package/dist/scheduler/triggers/metric.d.ts +3 -1
  170. package/dist/scheduler/triggers/metric.d.ts.map +1 -1
  171. package/dist/scheduler/triggers/metric.js +12 -8
  172. package/dist/scheduler/triggers/metric.js.map +1 -1
  173. package/dist/scheduler/triggers/metric.test.d.ts +2 -0
  174. package/dist/scheduler/triggers/metric.test.d.ts.map +1 -0
  175. package/dist/scheduler/triggers/metric.test.js +533 -0
  176. package/dist/scheduler/triggers/metric.test.js.map +1 -0
  177. package/dist/scheduler/triggers/process-exit.d.ts.map +1 -1
  178. package/dist/scheduler/triggers/process-exit.js +2 -1
  179. package/dist/scheduler/triggers/process-exit.js.map +1 -1
  180. package/dist/scheduler/triggers/process-exit.test.d.ts +2 -0
  181. package/dist/scheduler/triggers/process-exit.test.d.ts.map +1 -0
  182. package/dist/scheduler/triggers/process-exit.test.js +118 -0
  183. package/dist/scheduler/triggers/process-exit.test.js.map +1 -0
  184. package/dist/scheduler/triggers/resource.d.ts.map +1 -1
  185. package/dist/scheduler/triggers/resource.js +2 -10
  186. package/dist/scheduler/triggers/resource.js.map +1 -1
  187. package/dist/scheduler/triggers/resource.test.d.ts +2 -0
  188. package/dist/scheduler/triggers/resource.test.d.ts.map +1 -0
  189. package/dist/scheduler/triggers/resource.test.js +225 -0
  190. package/dist/scheduler/triggers/resource.test.js.map +1 -0
  191. package/dist/scheduler/triggers/timer.test.d.ts +2 -0
  192. package/dist/scheduler/triggers/timer.test.d.ts.map +1 -0
  193. package/dist/scheduler/triggers/timer.test.js +56 -0
  194. package/dist/scheduler/triggers/timer.test.js.map +1 -0
  195. package/dist/scheduler/triggers/types.d.ts +4 -2
  196. package/dist/scheduler/triggers/types.d.ts.map +1 -1
  197. package/dist/scheduler/triggers/types.js +0 -1
  198. package/dist/scheduler/triggers/types.js.map +1 -1
  199. package/dist/skills/executor.d.ts.map +1 -1
  200. package/dist/skills/executor.js +13 -15
  201. package/dist/skills/executor.js.map +1 -1
  202. package/dist/store/database.d.ts +5 -0
  203. package/dist/store/database.d.ts.map +1 -1
  204. package/dist/store/database.js +17 -1
  205. package/dist/store/database.js.map +1 -1
  206. package/dist/store/migrations.test.d.ts +2 -0
  207. package/dist/store/migrations.test.d.ts.map +1 -0
  208. package/dist/store/migrations.test.js +278 -0
  209. package/dist/store/migrations.test.js.map +1 -0
  210. package/dist/store/session-store-edge.test.d.ts +2 -0
  211. package/dist/store/session-store-edge.test.d.ts.map +1 -0
  212. package/dist/store/session-store-edge.test.js +522 -0
  213. package/dist/store/session-store-edge.test.js.map +1 -0
  214. package/dist/store/session-store.d.ts +7 -0
  215. package/dist/store/session-store.d.ts.map +1 -1
  216. package/dist/store/session-store.js +27 -22
  217. package/dist/store/session-store.js.map +1 -1
  218. package/dist/store/session-store.test.d.ts +2 -0
  219. package/dist/store/session-store.test.d.ts.map +1 -0
  220. package/dist/store/session-store.test.js +125 -0
  221. package/dist/store/session-store.test.js.map +1 -0
  222. package/dist/subagent/executor.d.ts +21 -0
  223. package/dist/subagent/executor.d.ts.map +1 -0
  224. package/dist/subagent/executor.js +136 -0
  225. package/dist/subagent/executor.js.map +1 -0
  226. package/dist/subagent/manager.d.ts +20 -0
  227. package/dist/subagent/manager.d.ts.map +1 -0
  228. package/dist/subagent/manager.js +98 -0
  229. package/dist/subagent/manager.js.map +1 -0
  230. package/dist/subagent/scoped-memory.d.ts +28 -0
  231. package/dist/subagent/scoped-memory.d.ts.map +1 -0
  232. package/dist/subagent/scoped-memory.js +122 -0
  233. package/dist/subagent/scoped-memory.js.map +1 -0
  234. package/dist/subagent/types.d.ts +27 -0
  235. package/dist/subagent/types.d.ts.map +1 -0
  236. package/dist/subagent/types.js +2 -0
  237. package/dist/subagent/types.js.map +1 -0
  238. package/dist/tools/file-ops.d.ts.map +1 -1
  239. package/dist/tools/file-ops.js +23 -13
  240. package/dist/tools/file-ops.js.map +1 -1
  241. package/dist/tools/file-ops.test.d.ts +2 -0
  242. package/dist/tools/file-ops.test.d.ts.map +1 -0
  243. package/dist/tools/file-ops.test.js +656 -0
  244. package/dist/tools/file-ops.test.js.map +1 -0
  245. package/dist/tools/memory-tools.test.d.ts +2 -0
  246. package/dist/tools/memory-tools.test.d.ts.map +1 -0
  247. package/dist/tools/memory-tools.test.js +273 -0
  248. package/dist/tools/memory-tools.test.js.map +1 -0
  249. package/dist/tools/subagent.d.ts +10 -0
  250. package/dist/tools/subagent.d.ts.map +1 -0
  251. package/dist/tools/subagent.js +164 -0
  252. package/dist/tools/subagent.js.map +1 -0
  253. package/dist/tools/task-output.d.ts.map +1 -1
  254. package/dist/tools/task-output.js +13 -2
  255. package/dist/tools/task-output.js.map +1 -1
  256. package/dist/ui/components/input-bar.d.ts +1 -1
  257. package/dist/ui/components/input-bar.d.ts.map +1 -1
  258. package/dist/ui/components/input-bar.js +3 -3
  259. package/dist/ui/components/input-bar.js.map +1 -1
  260. package/dist/ui/components/input-bar.test.d.ts +2 -0
  261. package/dist/ui/components/input-bar.test.d.ts.map +1 -0
  262. package/dist/ui/components/input-bar.test.js +380 -0
  263. package/dist/ui/components/input-bar.test.js.map +1 -0
  264. package/dist/ui/components/key-hint-rule.d.ts +2 -1
  265. package/dist/ui/components/key-hint-rule.d.ts.map +1 -1
  266. package/dist/ui/components/key-hint-rule.js +3 -3
  267. package/dist/ui/components/key-hint-rule.js.map +1 -1
  268. package/dist/ui/components/status-bar.d.ts +1 -1
  269. package/dist/ui/components/status-bar.d.ts.map +1 -1
  270. package/dist/ui/components/status-bar.js +11 -10
  271. package/dist/ui/components/status-bar.js.map +1 -1
  272. package/dist/ui/components/status-bar.test.d.ts +2 -0
  273. package/dist/ui/components/status-bar.test.d.ts.map +1 -0
  274. package/dist/ui/components/status-bar.test.js +206 -0
  275. package/dist/ui/components/status-bar.test.js.map +1 -0
  276. package/dist/ui/format.d.ts +9 -0
  277. package/dist/ui/format.d.ts.map +1 -1
  278. package/dist/ui/format.js +21 -0
  279. package/dist/ui/format.js.map +1 -1
  280. package/dist/ui/format.test.d.ts +2 -0
  281. package/dist/ui/format.test.d.ts.map +1 -0
  282. package/dist/ui/format.test.js +122 -0
  283. package/dist/ui/format.test.js.map +1 -0
  284. package/dist/ui/layout.d.ts.map +1 -1
  285. package/dist/ui/layout.js +74 -12
  286. package/dist/ui/layout.js.map +1 -1
  287. package/dist/ui/markdown.test.d.ts +2 -0
  288. package/dist/ui/markdown.test.d.ts.map +1 -0
  289. package/dist/ui/markdown.test.js +133 -0
  290. package/dist/ui/markdown.test.js.map +1 -0
  291. package/dist/ui/mouse-filter.test.d.ts +2 -0
  292. package/dist/ui/mouse-filter.test.d.ts.map +1 -0
  293. package/dist/ui/mouse-filter.test.js +231 -0
  294. package/dist/ui/mouse-filter.test.js.map +1 -0
  295. package/dist/ui/overlays/metrics-overlay.test.d.ts +2 -0
  296. package/dist/ui/overlays/metrics-overlay.test.d.ts.map +1 -0
  297. package/dist/ui/overlays/metrics-overlay.test.js +248 -0
  298. package/dist/ui/overlays/metrics-overlay.test.js.map +1 -0
  299. package/dist/ui/overlays/task-overlay.test.d.ts +2 -0
  300. package/dist/ui/overlays/task-overlay.test.d.ts.map +1 -0
  301. package/dist/ui/overlays/task-overlay.test.js +238 -0
  302. package/dist/ui/overlays/task-overlay.test.js.map +1 -0
  303. package/dist/ui/panels/conversation.d.ts.map +1 -1
  304. package/dist/ui/panels/conversation.js +60 -5
  305. package/dist/ui/panels/conversation.js.map +1 -1
  306. package/dist/ui/panels/conversation.test.d.ts +2 -0
  307. package/dist/ui/panels/conversation.test.d.ts.map +1 -0
  308. package/dist/ui/panels/conversation.test.js +381 -0
  309. package/dist/ui/panels/conversation.test.js.map +1 -0
  310. package/dist/ui/panels/metrics-dashboard.test.d.ts +2 -0
  311. package/dist/ui/panels/metrics-dashboard.test.d.ts.map +1 -0
  312. package/dist/ui/panels/metrics-dashboard.test.js +191 -0
  313. package/dist/ui/panels/metrics-dashboard.test.js.map +1 -0
  314. package/dist/ui/panels/sleep-panel.test.d.ts +2 -0
  315. package/dist/ui/panels/sleep-panel.test.d.ts.map +1 -0
  316. package/dist/ui/panels/sleep-panel.test.js +376 -0
  317. package/dist/ui/panels/sleep-panel.test.js.map +1 -0
  318. package/dist/ui/panels/task-list.d.ts.map +1 -1
  319. package/dist/ui/panels/task-list.js +3 -2
  320. package/dist/ui/panels/task-list.js.map +1 -1
  321. package/dist/ui/panels/task-list.test.d.ts +2 -0
  322. package/dist/ui/panels/task-list.test.d.ts.map +1 -0
  323. package/dist/ui/panels/task-list.test.js +210 -0
  324. package/dist/ui/panels/task-list.test.js.map +1 -0
  325. package/dist/ui/theme.test.d.ts +2 -0
  326. package/dist/ui/theme.test.d.ts.map +1 -0
  327. package/dist/ui/theme.test.js +159 -0
  328. package/dist/ui/theme.test.js.map +1 -0
  329. package/dist/ui/types.d.ts +3 -0
  330. package/dist/ui/types.d.ts.map +1 -1
  331. package/package.json +6 -2
@@ -0,0 +1,533 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { evaluateMetric } from "./metric.js";
3
+ function mockPool(responses) {
4
+ return {
5
+ exec: vi.fn(async (_machineId, command) => {
6
+ if (responses) {
7
+ for (const [key, value] of responses) {
8
+ if (command.includes(key))
9
+ return value;
10
+ }
11
+ }
12
+ return { stdout: "", stderr: "", exitCode: 0 };
13
+ }),
14
+ isProcessRunning: vi.fn().mockResolvedValue(false),
15
+ getMachineIds: vi.fn().mockReturnValue(["local"]),
16
+ };
17
+ }
18
+ function metricCondition(overrides) {
19
+ return {
20
+ kind: "metric",
21
+ machineId: "local",
22
+ field: "loss",
23
+ comparator: "<",
24
+ threshold: 0.5,
25
+ ...overrides,
26
+ };
27
+ }
28
+ describe("evaluateMetric", () => {
29
+ describe("json_file source", () => {
30
+ it("reads JSON file and extracts field", async () => {
31
+ const responses = new Map([
32
+ [
33
+ "cat",
34
+ {
35
+ stdout: JSON.stringify({ loss: 0.3, accuracy: 0.95 }),
36
+ stderr: "",
37
+ exitCode: 0,
38
+ },
39
+ ],
40
+ ]);
41
+ const pool = mockPool(responses);
42
+ const result = await evaluateMetric(metricCondition({
43
+ source: { type: "json_file", path: "/tmp/metrics.json" },
44
+ field: "loss",
45
+ comparator: "<",
46
+ threshold: 0.5,
47
+ }), pool);
48
+ expect(result).toBe(true);
49
+ });
50
+ it("handles nested field paths (dot notation)", async () => {
51
+ const responses = new Map([
52
+ [
53
+ "cat",
54
+ {
55
+ stdout: JSON.stringify({ train: { loss: 0.2 } }),
56
+ stderr: "",
57
+ exitCode: 0,
58
+ },
59
+ ],
60
+ ]);
61
+ const pool = mockPool(responses);
62
+ const result = await evaluateMetric(metricCondition({
63
+ source: { type: "json_file", path: "/tmp/metrics.json" },
64
+ field: "train.loss",
65
+ comparator: "<",
66
+ threshold: 0.5,
67
+ }), pool);
68
+ expect(result).toBe(true);
69
+ });
70
+ it("returns false when field not found", async () => {
71
+ const responses = new Map([
72
+ [
73
+ "cat",
74
+ {
75
+ stdout: JSON.stringify({ accuracy: 0.95 }),
76
+ stderr: "",
77
+ exitCode: 0,
78
+ },
79
+ ],
80
+ ]);
81
+ const pool = mockPool(responses);
82
+ const result = await evaluateMetric(metricCondition({
83
+ source: { type: "json_file", path: "/tmp/metrics.json" },
84
+ field: "loss",
85
+ comparator: "<",
86
+ threshold: 0.5,
87
+ }), pool);
88
+ expect(result).toBe(false);
89
+ });
90
+ it("returns false when file read fails", async () => {
91
+ const responses = new Map([
92
+ ["cat", { stdout: "", stderr: "No such file", exitCode: 1 }],
93
+ ]);
94
+ const pool = mockPool(responses);
95
+ const result = await evaluateMetric(metricCondition({
96
+ source: { type: "json_file", path: "/tmp/missing.json" },
97
+ }), pool);
98
+ expect(result).toBe(false);
99
+ });
100
+ it("returns false when JSON parse fails", async () => {
101
+ const responses = new Map([
102
+ ["cat", { stdout: "not valid json{{{", stderr: "", exitCode: 0 }],
103
+ ]);
104
+ const pool = mockPool(responses);
105
+ const result = await evaluateMetric(metricCondition({
106
+ source: { type: "json_file", path: "/tmp/bad.json" },
107
+ }), pool);
108
+ expect(result).toBe(false);
109
+ });
110
+ it("returns false when extracted field is not a number", async () => {
111
+ const responses = new Map([
112
+ [
113
+ "cat",
114
+ {
115
+ stdout: JSON.stringify({ loss: "not a number" }),
116
+ stderr: "",
117
+ exitCode: 0,
118
+ },
119
+ ],
120
+ ]);
121
+ const pool = mockPool(responses);
122
+ const result = await evaluateMetric(metricCondition({
123
+ source: { type: "json_file", path: "/tmp/metrics.json" },
124
+ field: "loss",
125
+ comparator: "<",
126
+ threshold: 0.5,
127
+ }), pool);
128
+ expect(result).toBe(false);
129
+ });
130
+ it("handles deeply nested field paths", async () => {
131
+ const responses = new Map([
132
+ [
133
+ "cat",
134
+ {
135
+ stdout: JSON.stringify({ a: { b: { c: { d: 42 } } } }),
136
+ stderr: "",
137
+ exitCode: 0,
138
+ },
139
+ ],
140
+ ]);
141
+ const pool = mockPool(responses);
142
+ const result = await evaluateMetric(metricCondition({
143
+ source: { type: "json_file", path: "/tmp/deep.json" },
144
+ field: "a.b.c.d",
145
+ comparator: ">",
146
+ threshold: 10,
147
+ }), pool);
148
+ expect(result).toBe(true);
149
+ });
150
+ it("returns false when nested path hits null", async () => {
151
+ const responses = new Map([
152
+ [
153
+ "cat",
154
+ {
155
+ stdout: JSON.stringify({ a: null }),
156
+ stderr: "",
157
+ exitCode: 0,
158
+ },
159
+ ],
160
+ ]);
161
+ const pool = mockPool(responses);
162
+ const result = await evaluateMetric(metricCondition({
163
+ source: { type: "json_file", path: "/tmp/null.json" },
164
+ field: "a.b",
165
+ comparator: "<",
166
+ threshold: 1,
167
+ }), pool);
168
+ expect(result).toBe(false);
169
+ });
170
+ });
171
+ describe("csv_file source", () => {
172
+ it("reads last line and header to extract field", async () => {
173
+ const pool = mockPool();
174
+ // Single SSH call returns header + last line
175
+ pool.exec.mockResolvedValueOnce({
176
+ stdout: "loss,accuracy,epoch\n0.3,0.95,100\n",
177
+ stderr: "",
178
+ exitCode: 0,
179
+ });
180
+ const result = await evaluateMetric(metricCondition({
181
+ source: { type: "csv_file", path: "/tmp/metrics.csv" },
182
+ field: "loss",
183
+ comparator: "<",
184
+ threshold: 0.5,
185
+ }), pool);
186
+ expect(result).toBe(true);
187
+ });
188
+ it("returns false when field not in header", async () => {
189
+ const pool = mockPool();
190
+ pool.exec.mockResolvedValueOnce({
191
+ stdout: "accuracy,epoch,lr\n0.3,0.95,100\n",
192
+ stderr: "",
193
+ exitCode: 0,
194
+ });
195
+ const result = await evaluateMetric(metricCondition({
196
+ source: { type: "csv_file", path: "/tmp/metrics.csv" },
197
+ field: "loss",
198
+ comparator: "<",
199
+ threshold: 0.5,
200
+ }), pool);
201
+ expect(result).toBe(false);
202
+ });
203
+ it("returns false when file read fails", async () => {
204
+ const pool = mockPool();
205
+ pool.exec.mockResolvedValueOnce({
206
+ stdout: "",
207
+ stderr: "No such file",
208
+ exitCode: 1,
209
+ });
210
+ const result = await evaluateMetric(metricCondition({
211
+ source: { type: "csv_file", path: "/tmp/missing.csv" },
212
+ }), pool);
213
+ expect(result).toBe(false);
214
+ });
215
+ it("returns false when tail output is empty", async () => {
216
+ const pool = mockPool();
217
+ pool.exec.mockResolvedValueOnce({
218
+ stdout: "",
219
+ stderr: "",
220
+ exitCode: 0,
221
+ });
222
+ const result = await evaluateMetric(metricCondition({
223
+ source: { type: "csv_file", path: "/tmp/empty.csv" },
224
+ }), pool);
225
+ expect(result).toBe(false);
226
+ });
227
+ });
228
+ describe("command source", () => {
229
+ it("executes command and parses numeric output", async () => {
230
+ const pool = mockPool();
231
+ pool.exec.mockResolvedValueOnce({
232
+ stdout: "0.25\n",
233
+ stderr: "",
234
+ exitCode: 0,
235
+ });
236
+ const result = await evaluateMetric(metricCondition({
237
+ source: { type: "command", command: "echo 0.25" },
238
+ field: "value",
239
+ comparator: "<",
240
+ threshold: 0.5,
241
+ }), pool);
242
+ expect(result).toBe(true);
243
+ });
244
+ it("returns false on non-zero exit code", async () => {
245
+ const pool = mockPool();
246
+ pool.exec.mockResolvedValueOnce({
247
+ stdout: "0.25",
248
+ stderr: "error",
249
+ exitCode: 1,
250
+ });
251
+ const result = await evaluateMetric(metricCondition({
252
+ source: { type: "command", command: "failing-cmd" },
253
+ }), pool);
254
+ expect(result).toBe(false);
255
+ });
256
+ it("returns false on non-numeric output", async () => {
257
+ const pool = mockPool();
258
+ pool.exec.mockResolvedValueOnce({
259
+ stdout: "not a number\n",
260
+ stderr: "",
261
+ exitCode: 0,
262
+ });
263
+ const result = await evaluateMetric(metricCondition({
264
+ source: { type: "command", command: "echo foo" },
265
+ }), pool);
266
+ expect(result).toBe(false);
267
+ });
268
+ it("passes command directly to pool.exec", async () => {
269
+ const pool = mockPool();
270
+ pool.exec.mockResolvedValueOnce({
271
+ stdout: "42\n",
272
+ stderr: "",
273
+ exitCode: 0,
274
+ });
275
+ await evaluateMetric(metricCondition({
276
+ source: { type: "command", command: "python get_loss.py" },
277
+ comparator: ">",
278
+ threshold: 10,
279
+ }), pool);
280
+ expect(pool.exec).toHaveBeenCalledWith("local", "python get_loss.py");
281
+ });
282
+ });
283
+ describe("tensorboard source", () => {
284
+ it("returns false (not supported inline)", async () => {
285
+ const pool = mockPool();
286
+ const result = await evaluateMetric(metricCondition({
287
+ source: { type: "tensorboard", logdir: "/tmp/logs" },
288
+ }), pool);
289
+ expect(result).toBe(false);
290
+ });
291
+ });
292
+ describe("comparators", () => {
293
+ const jsonSource = {
294
+ type: "json_file",
295
+ path: "/tmp/metrics.json",
296
+ };
297
+ function poolWithValue(value) {
298
+ return mockPool(new Map([
299
+ [
300
+ "cat",
301
+ {
302
+ stdout: JSON.stringify({ loss: value }),
303
+ stderr: "",
304
+ exitCode: 0,
305
+ },
306
+ ],
307
+ ]));
308
+ }
309
+ it("< returns true when value is less than threshold", async () => {
310
+ const result = await evaluateMetric(metricCondition({
311
+ source: jsonSource,
312
+ field: "loss",
313
+ comparator: "<",
314
+ threshold: 0.5,
315
+ }), poolWithValue(0.3));
316
+ expect(result).toBe(true);
317
+ });
318
+ it("< returns false when value equals threshold", async () => {
319
+ const result = await evaluateMetric(metricCondition({
320
+ source: jsonSource,
321
+ field: "loss",
322
+ comparator: "<",
323
+ threshold: 0.5,
324
+ }), poolWithValue(0.5));
325
+ expect(result).toBe(false);
326
+ });
327
+ it("< returns false when value exceeds threshold", async () => {
328
+ const result = await evaluateMetric(metricCondition({
329
+ source: jsonSource,
330
+ field: "loss",
331
+ comparator: "<",
332
+ threshold: 0.5,
333
+ }), poolWithValue(0.7));
334
+ expect(result).toBe(false);
335
+ });
336
+ it("> returns true when value exceeds threshold", async () => {
337
+ const result = await evaluateMetric(metricCondition({
338
+ source: jsonSource,
339
+ field: "loss",
340
+ comparator: ">",
341
+ threshold: 0.5,
342
+ }), poolWithValue(0.7));
343
+ expect(result).toBe(true);
344
+ });
345
+ it("> returns false when value equals threshold", async () => {
346
+ const result = await evaluateMetric(metricCondition({
347
+ source: jsonSource,
348
+ field: "loss",
349
+ comparator: ">",
350
+ threshold: 0.5,
351
+ }), poolWithValue(0.5));
352
+ expect(result).toBe(false);
353
+ });
354
+ it("> returns false when value is less than threshold", async () => {
355
+ const result = await evaluateMetric(metricCondition({
356
+ source: jsonSource,
357
+ field: "loss",
358
+ comparator: ">",
359
+ threshold: 0.5,
360
+ }), poolWithValue(0.3));
361
+ expect(result).toBe(false);
362
+ });
363
+ it("<= returns true when value is less than threshold", async () => {
364
+ const result = await evaluateMetric(metricCondition({
365
+ source: jsonSource,
366
+ field: "loss",
367
+ comparator: "<=",
368
+ threshold: 0.5,
369
+ }), poolWithValue(0.3));
370
+ expect(result).toBe(true);
371
+ });
372
+ it("<= returns true when value equals threshold", async () => {
373
+ const result = await evaluateMetric(metricCondition({
374
+ source: jsonSource,
375
+ field: "loss",
376
+ comparator: "<=",
377
+ threshold: 0.5,
378
+ }), poolWithValue(0.5));
379
+ expect(result).toBe(true);
380
+ });
381
+ it("<= returns false when value exceeds threshold", async () => {
382
+ const result = await evaluateMetric(metricCondition({
383
+ source: jsonSource,
384
+ field: "loss",
385
+ comparator: "<=",
386
+ threshold: 0.5,
387
+ }), poolWithValue(0.7));
388
+ expect(result).toBe(false);
389
+ });
390
+ it(">= returns true when value exceeds threshold", async () => {
391
+ const result = await evaluateMetric(metricCondition({
392
+ source: jsonSource,
393
+ field: "loss",
394
+ comparator: ">=",
395
+ threshold: 0.5,
396
+ }), poolWithValue(0.7));
397
+ expect(result).toBe(true);
398
+ });
399
+ it(">= returns true when value equals threshold", async () => {
400
+ const result = await evaluateMetric(metricCondition({
401
+ source: jsonSource,
402
+ field: "loss",
403
+ comparator: ">=",
404
+ threshold: 0.5,
405
+ }), poolWithValue(0.5));
406
+ expect(result).toBe(true);
407
+ });
408
+ it(">= returns false when value is less than threshold", async () => {
409
+ const result = await evaluateMetric(metricCondition({
410
+ source: jsonSource,
411
+ field: "loss",
412
+ comparator: ">=",
413
+ threshold: 0.5,
414
+ }), poolWithValue(0.3));
415
+ expect(result).toBe(false);
416
+ });
417
+ it("== returns true when value equals threshold", async () => {
418
+ const result = await evaluateMetric(metricCondition({
419
+ source: jsonSource,
420
+ field: "loss",
421
+ comparator: "==",
422
+ threshold: 0.5,
423
+ }), poolWithValue(0.5));
424
+ expect(result).toBe(true);
425
+ });
426
+ it("== returns false when value differs from threshold", async () => {
427
+ const result = await evaluateMetric(metricCondition({
428
+ source: jsonSource,
429
+ field: "loss",
430
+ comparator: "==",
431
+ threshold: 0.5,
432
+ }), poolWithValue(0.3));
433
+ expect(result).toBe(false);
434
+ });
435
+ it("!= returns true when value differs from threshold", async () => {
436
+ const result = await evaluateMetric(metricCondition({
437
+ source: jsonSource,
438
+ field: "loss",
439
+ comparator: "!=",
440
+ threshold: 0.5,
441
+ }), poolWithValue(0.3));
442
+ expect(result).toBe(true);
443
+ });
444
+ it("!= returns false when value equals threshold", async () => {
445
+ const result = await evaluateMetric(metricCondition({
446
+ source: jsonSource,
447
+ field: "loss",
448
+ comparator: "!=",
449
+ threshold: 0.5,
450
+ }), poolWithValue(0.5));
451
+ expect(result).toBe(false);
452
+ });
453
+ });
454
+ describe("extractField helper (tested via evaluateMetric)", () => {
455
+ it("extracts top-level field", async () => {
456
+ const pool = mockPool(new Map([
457
+ [
458
+ "cat",
459
+ {
460
+ stdout: JSON.stringify({ loss: 0.1 }),
461
+ stderr: "",
462
+ exitCode: 0,
463
+ },
464
+ ],
465
+ ]));
466
+ const result = await evaluateMetric(metricCondition({
467
+ source: { type: "json_file", path: "/tmp/m.json" },
468
+ field: "loss",
469
+ comparator: "<",
470
+ threshold: 1,
471
+ }), pool);
472
+ expect(result).toBe(true);
473
+ });
474
+ it("extracts nested field", async () => {
475
+ const pool = mockPool(new Map([
476
+ [
477
+ "cat",
478
+ {
479
+ stdout: JSON.stringify({ train: { metrics: { loss: 0.1 } } }),
480
+ stderr: "",
481
+ exitCode: 0,
482
+ },
483
+ ],
484
+ ]));
485
+ const result = await evaluateMetric(metricCondition({
486
+ source: { type: "json_file", path: "/tmp/m.json" },
487
+ field: "train.metrics.loss",
488
+ comparator: "<",
489
+ threshold: 1,
490
+ }), pool);
491
+ expect(result).toBe(true);
492
+ });
493
+ it("returns null for missing field (metric eval returns false)", async () => {
494
+ const pool = mockPool(new Map([
495
+ [
496
+ "cat",
497
+ {
498
+ stdout: JSON.stringify({ accuracy: 0.9 }),
499
+ stderr: "",
500
+ exitCode: 0,
501
+ },
502
+ ],
503
+ ]));
504
+ const result = await evaluateMetric(metricCondition({
505
+ source: { type: "json_file", path: "/tmp/m.json" },
506
+ field: "nonexistent",
507
+ comparator: "<",
508
+ threshold: 1,
509
+ }), pool);
510
+ expect(result).toBe(false);
511
+ });
512
+ it("returns null for non-numeric value (metric eval returns false)", async () => {
513
+ const pool = mockPool(new Map([
514
+ [
515
+ "cat",
516
+ {
517
+ stdout: JSON.stringify({ loss: "high" }),
518
+ stderr: "",
519
+ exitCode: 0,
520
+ },
521
+ ],
522
+ ]));
523
+ const result = await evaluateMetric(metricCondition({
524
+ source: { type: "json_file", path: "/tmp/m.json" },
525
+ field: "loss",
526
+ comparator: "<",
527
+ threshold: 1,
528
+ }), pool);
529
+ expect(result).toBe(false);
530
+ });
531
+ });
532
+ });
533
+ //# sourceMappingURL=metric.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metric.test.js","sourceRoot":"","sources":["../../../src/scheduler/triggers/metric.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"process-exit.d.ts","sourceRoot":"","sources":["../../../src/scheduler/triggers/process-exit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,oBAAoB,EAC/B,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,OAAO,CAAC,CAmBlB"}
1
+ {"version":3,"file":"process-exit.d.ts","sourceRoot":"","sources":["../../../src/scheduler/triggers/process-exit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGtE,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,oBAAoB,EAC/B,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,OAAO,CAAC,CAmBlB"}
@@ -1,10 +1,11 @@
1
+ import { shellQuote } from "../../ui/format.js";
1
2
  export async function evaluateProcessExit(condition, pool) {
2
3
  if (condition.pid) {
3
4
  const running = await pool.isProcessRunning(condition.machineId, condition.pid);
4
5
  return !running;
5
6
  }
6
7
  if (condition.processPattern) {
7
- const result = await pool.exec(condition.machineId, `pgrep -f "${condition.processPattern}" | head -1`);
8
+ const result = await pool.exec(condition.machineId, `pgrep -f ${shellQuote(condition.processPattern)} | head -1`);
8
9
  // If no process found, it has exited
9
10
  return result.stdout.trim() === "";
10
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"process-exit.js","sourceRoot":"","sources":["../../../src/scheduler/triggers/process-exit.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAA+B,EAC/B,IAAoB;IAEpB,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CACzC,SAAS,CAAC,SAAS,EACnB,SAAS,CAAC,GAAG,CACd,CAAC;QACF,OAAO,CAAC,OAAO,CAAC;IAClB,CAAC;IAED,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAC5B,SAAS,CAAC,SAAS,EACnB,aAAa,SAAS,CAAC,cAAc,aAAa,CACnD,CAAC;QACF,qCAAqC;QACrC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"process-exit.js","sourceRoot":"","sources":["../../../src/scheduler/triggers/process-exit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAA+B,EAC/B,IAAoB;IAEpB,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CACzC,SAAS,CAAC,SAAS,EACnB,SAAS,CAAC,GAAG,CACd,CAAC;QACF,OAAO,CAAC,OAAO,CAAC;IAClB,CAAC;IAED,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAC5B,SAAS,CAAC,SAAS,EACnB,YAAY,UAAU,CAAC,SAAS,CAAC,cAAc,CAAC,YAAY,CAC7D,CAAC;QACF,qCAAqC;QACrC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=process-exit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-exit.test.d.ts","sourceRoot":"","sources":["../../../src/scheduler/triggers/process-exit.test.ts"],"names":[],"mappings":""}