@snoglobe/helios 0.1.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 (327) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +222 -0
  3. package/dist/app.d.ts +9 -0
  4. package/dist/app.d.ts.map +1 -0
  5. package/dist/app.js +289 -0
  6. package/dist/app.js.map +1 -0
  7. package/dist/core/agent-loop.d.ts +16 -0
  8. package/dist/core/agent-loop.d.ts.map +1 -0
  9. package/dist/core/agent-loop.js +64 -0
  10. package/dist/core/agent-loop.js.map +1 -0
  11. package/dist/core/monitor.d.ts +15 -0
  12. package/dist/core/monitor.d.ts.map +1 -0
  13. package/dist/core/monitor.js +40 -0
  14. package/dist/core/monitor.js.map +1 -0
  15. package/dist/core/orchestrator.d.ts +51 -0
  16. package/dist/core/orchestrator.d.ts.map +1 -0
  17. package/dist/core/orchestrator.js +235 -0
  18. package/dist/core/orchestrator.js.map +1 -0
  19. package/dist/core/state-machine.d.ts +19 -0
  20. package/dist/core/state-machine.d.ts.map +1 -0
  21. package/dist/core/state-machine.js +42 -0
  22. package/dist/core/state-machine.js.map +1 -0
  23. package/dist/core/stickies.d.ts +20 -0
  24. package/dist/core/stickies.d.ts.map +1 -0
  25. package/dist/core/stickies.js +41 -0
  26. package/dist/core/stickies.js.map +1 -0
  27. package/dist/index.d.ts +3 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +68 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/memory/context-gate.d.ts +49 -0
  32. package/dist/memory/context-gate.d.ts.map +1 -0
  33. package/dist/memory/context-gate.js +109 -0
  34. package/dist/memory/context-gate.js.map +1 -0
  35. package/dist/memory/experiment-tracker.d.ts +21 -0
  36. package/dist/memory/experiment-tracker.d.ts.map +1 -0
  37. package/dist/memory/experiment-tracker.js +117 -0
  38. package/dist/memory/experiment-tracker.js.map +1 -0
  39. package/dist/memory/memory-store.d.ts +37 -0
  40. package/dist/memory/memory-store.d.ts.map +1 -0
  41. package/dist/memory/memory-store.js +150 -0
  42. package/dist/memory/memory-store.js.map +1 -0
  43. package/dist/memory/token-estimator.d.ts +7 -0
  44. package/dist/memory/token-estimator.d.ts.map +1 -0
  45. package/dist/memory/token-estimator.js +30 -0
  46. package/dist/memory/token-estimator.js.map +1 -0
  47. package/dist/metrics/analyzer.d.ts +15 -0
  48. package/dist/metrics/analyzer.d.ts.map +1 -0
  49. package/dist/metrics/analyzer.js +67 -0
  50. package/dist/metrics/analyzer.js.map +1 -0
  51. package/dist/metrics/collector.d.ts +23 -0
  52. package/dist/metrics/collector.d.ts.map +1 -0
  53. package/dist/metrics/collector.js +60 -0
  54. package/dist/metrics/collector.js.map +1 -0
  55. package/dist/metrics/parser.d.ts +21 -0
  56. package/dist/metrics/parser.d.ts.map +1 -0
  57. package/dist/metrics/parser.js +43 -0
  58. package/dist/metrics/parser.js.map +1 -0
  59. package/dist/metrics/parsers/csv.d.ts +8 -0
  60. package/dist/metrics/parsers/csv.d.ts.map +1 -0
  61. package/dist/metrics/parsers/csv.js +37 -0
  62. package/dist/metrics/parsers/csv.js.map +1 -0
  63. package/dist/metrics/parsers/json.d.ts +8 -0
  64. package/dist/metrics/parsers/json.d.ts.map +1 -0
  65. package/dist/metrics/parsers/json.js +42 -0
  66. package/dist/metrics/parsers/json.js.map +1 -0
  67. package/dist/metrics/parsers/stdout.d.ts +3 -0
  68. package/dist/metrics/parsers/stdout.d.ts.map +1 -0
  69. package/dist/metrics/parsers/stdout.js +79 -0
  70. package/dist/metrics/parsers/stdout.js.map +1 -0
  71. package/dist/metrics/parsers/tensorboard.d.ts +16 -0
  72. package/dist/metrics/parsers/tensorboard.d.ts.map +1 -0
  73. package/dist/metrics/parsers/tensorboard.js +22 -0
  74. package/dist/metrics/parsers/tensorboard.js.map +1 -0
  75. package/dist/metrics/store.d.ts +33 -0
  76. package/dist/metrics/store.d.ts.map +1 -0
  77. package/dist/metrics/store.js +141 -0
  78. package/dist/metrics/store.js.map +1 -0
  79. package/dist/providers/auth/auth-manager.d.ts +22 -0
  80. package/dist/providers/auth/auth-manager.d.ts.map +1 -0
  81. package/dist/providers/auth/auth-manager.js +77 -0
  82. package/dist/providers/auth/auth-manager.js.map +1 -0
  83. package/dist/providers/auth/token-store.d.ts +14 -0
  84. package/dist/providers/auth/token-store.d.ts.map +1 -0
  85. package/dist/providers/auth/token-store.js +55 -0
  86. package/dist/providers/auth/token-store.js.map +1 -0
  87. package/dist/providers/claude/provider.d.ts +46 -0
  88. package/dist/providers/claude/provider.d.ts.map +1 -0
  89. package/dist/providers/claude/provider.js +606 -0
  90. package/dist/providers/claude/provider.js.map +1 -0
  91. package/dist/providers/openai/callback-server.d.ts +11 -0
  92. package/dist/providers/openai/callback-server.d.ts.map +1 -0
  93. package/dist/providers/openai/callback-server.js +58 -0
  94. package/dist/providers/openai/callback-server.js.map +1 -0
  95. package/dist/providers/openai/oauth.d.ts +16 -0
  96. package/dist/providers/openai/oauth.d.ts.map +1 -0
  97. package/dist/providers/openai/oauth.js +110 -0
  98. package/dist/providers/openai/oauth.js.map +1 -0
  99. package/dist/providers/openai/provider.d.ts +29 -0
  100. package/dist/providers/openai/provider.d.ts.map +1 -0
  101. package/dist/providers/openai/provider.js +363 -0
  102. package/dist/providers/openai/provider.js.map +1 -0
  103. package/dist/providers/retry.d.ts +6 -0
  104. package/dist/providers/retry.d.ts.map +1 -0
  105. package/dist/providers/retry.js +13 -0
  106. package/dist/providers/retry.js.map +1 -0
  107. package/dist/providers/sse.d.ts +6 -0
  108. package/dist/providers/sse.d.ts.map +1 -0
  109. package/dist/providers/sse.js +35 -0
  110. package/dist/providers/sse.js.map +1 -0
  111. package/dist/providers/types.d.ts +102 -0
  112. package/dist/providers/types.d.ts.map +1 -0
  113. package/dist/providers/types.js +11 -0
  114. package/dist/providers/types.js.map +1 -0
  115. package/dist/remote/config.d.ts +14 -0
  116. package/dist/remote/config.d.ts.map +1 -0
  117. package/dist/remote/config.js +81 -0
  118. package/dist/remote/config.js.map +1 -0
  119. package/dist/remote/connection-pool.d.ts +26 -0
  120. package/dist/remote/connection-pool.d.ts.map +1 -0
  121. package/dist/remote/connection-pool.js +268 -0
  122. package/dist/remote/connection-pool.js.map +1 -0
  123. package/dist/remote/executor.d.ts +23 -0
  124. package/dist/remote/executor.d.ts.map +1 -0
  125. package/dist/remote/executor.js +53 -0
  126. package/dist/remote/executor.js.map +1 -0
  127. package/dist/remote/file-sync.d.ts +19 -0
  128. package/dist/remote/file-sync.d.ts.map +1 -0
  129. package/dist/remote/file-sync.js +44 -0
  130. package/dist/remote/file-sync.js.map +1 -0
  131. package/dist/remote/types.d.ts +33 -0
  132. package/dist/remote/types.d.ts.map +1 -0
  133. package/dist/remote/types.js +2 -0
  134. package/dist/remote/types.js.map +1 -0
  135. package/dist/scheduler/sleep-manager.d.ts +33 -0
  136. package/dist/scheduler/sleep-manager.d.ts.map +1 -0
  137. package/dist/scheduler/sleep-manager.js +132 -0
  138. package/dist/scheduler/sleep-manager.js.map +1 -0
  139. package/dist/scheduler/ssh-batcher.d.ts +23 -0
  140. package/dist/scheduler/ssh-batcher.d.ts.map +1 -0
  141. package/dist/scheduler/ssh-batcher.js +98 -0
  142. package/dist/scheduler/ssh-batcher.js.map +1 -0
  143. package/dist/scheduler/state-store.d.ts +8 -0
  144. package/dist/scheduler/state-store.d.ts.map +1 -0
  145. package/dist/scheduler/state-store.js +48 -0
  146. package/dist/scheduler/state-store.js.map +1 -0
  147. package/dist/scheduler/trigger-scheduler.d.ts +24 -0
  148. package/dist/scheduler/trigger-scheduler.d.ts.map +1 -0
  149. package/dist/scheduler/trigger-scheduler.js +142 -0
  150. package/dist/scheduler/trigger-scheduler.js.map +1 -0
  151. package/dist/scheduler/triggers/file.d.ts +4 -0
  152. package/dist/scheduler/triggers/file.d.ts.map +1 -0
  153. package/dist/scheduler/triggers/file.js +39 -0
  154. package/dist/scheduler/triggers/file.js.map +1 -0
  155. package/dist/scheduler/triggers/metric.d.ts +4 -0
  156. package/dist/scheduler/triggers/metric.d.ts.map +1 -0
  157. package/dist/scheduler/triggers/metric.js +74 -0
  158. package/dist/scheduler/triggers/metric.js.map +1 -0
  159. package/dist/scheduler/triggers/process-exit.d.ts +4 -0
  160. package/dist/scheduler/triggers/process-exit.d.ts.map +1 -0
  161. package/dist/scheduler/triggers/process-exit.js +13 -0
  162. package/dist/scheduler/triggers/process-exit.js.map +1 -0
  163. package/dist/scheduler/triggers/resource.d.ts +4 -0
  164. package/dist/scheduler/triggers/resource.d.ts.map +1 -0
  165. package/dist/scheduler/triggers/resource.js +54 -0
  166. package/dist/scheduler/triggers/resource.js.map +1 -0
  167. package/dist/scheduler/triggers/timer.d.ts +3 -0
  168. package/dist/scheduler/triggers/timer.d.ts.map +1 -0
  169. package/dist/scheduler/triggers/timer.js +4 -0
  170. package/dist/scheduler/triggers/timer.js.map +1 -0
  171. package/dist/scheduler/triggers/types.d.ts +95 -0
  172. package/dist/scheduler/triggers/types.d.ts.map +1 -0
  173. package/dist/scheduler/triggers/types.js +11 -0
  174. package/dist/scheduler/triggers/types.js.map +1 -0
  175. package/dist/store/database.d.ts +5 -0
  176. package/dist/store/database.d.ts.map +1 -0
  177. package/dist/store/database.js +29 -0
  178. package/dist/store/database.js.map +1 -0
  179. package/dist/store/migrations.d.ts +3 -0
  180. package/dist/store/migrations.d.ts.map +1 -0
  181. package/dist/store/migrations.js +124 -0
  182. package/dist/store/migrations.js.map +1 -0
  183. package/dist/store/preferences.d.ts +7 -0
  184. package/dist/store/preferences.d.ts.map +1 -0
  185. package/dist/store/preferences.js +26 -0
  186. package/dist/store/preferences.js.map +1 -0
  187. package/dist/store/session-store.d.ts +29 -0
  188. package/dist/store/session-store.d.ts.map +1 -0
  189. package/dist/store/session-store.js +103 -0
  190. package/dist/store/session-store.js.map +1 -0
  191. package/dist/tools/clear-metrics.d.ts +5 -0
  192. package/dist/tools/clear-metrics.d.ts.map +1 -0
  193. package/dist/tools/clear-metrics.js +27 -0
  194. package/dist/tools/clear-metrics.js.map +1 -0
  195. package/dist/tools/compare-runs.d.ts +4 -0
  196. package/dist/tools/compare-runs.d.ts.map +1 -0
  197. package/dist/tools/compare-runs.js +77 -0
  198. package/dist/tools/compare-runs.js.map +1 -0
  199. package/dist/tools/consult.d.ts +3 -0
  200. package/dist/tools/consult.d.ts.map +1 -0
  201. package/dist/tools/consult.js +62 -0
  202. package/dist/tools/consult.js.map +1 -0
  203. package/dist/tools/file-ops.d.ts +6 -0
  204. package/dist/tools/file-ops.d.ts.map +1 -0
  205. package/dist/tools/file-ops.js +158 -0
  206. package/dist/tools/file-ops.js.map +1 -0
  207. package/dist/tools/kill-task.d.ts +6 -0
  208. package/dist/tools/kill-task.d.ts.map +1 -0
  209. package/dist/tools/kill-task.js +55 -0
  210. package/dist/tools/kill-task.js.map +1 -0
  211. package/dist/tools/list-machines.d.ts +4 -0
  212. package/dist/tools/list-machines.d.ts.map +1 -0
  213. package/dist/tools/list-machines.js +24 -0
  214. package/dist/tools/list-machines.js.map +1 -0
  215. package/dist/tools/memory-tools.d.ts +8 -0
  216. package/dist/tools/memory-tools.d.ts.map +1 -0
  217. package/dist/tools/memory-tools.js +122 -0
  218. package/dist/tools/memory-tools.js.map +1 -0
  219. package/dist/tools/metrics-query.d.ts +4 -0
  220. package/dist/tools/metrics-query.d.ts.map +1 -0
  221. package/dist/tools/metrics-query.js +69 -0
  222. package/dist/tools/metrics-query.js.map +1 -0
  223. package/dist/tools/monitor.d.ts +5 -0
  224. package/dist/tools/monitor.d.ts.map +1 -0
  225. package/dist/tools/monitor.js +64 -0
  226. package/dist/tools/monitor.js.map +1 -0
  227. package/dist/tools/remote-exec.d.ts +6 -0
  228. package/dist/tools/remote-exec.d.ts.map +1 -0
  229. package/dist/tools/remote-exec.js +98 -0
  230. package/dist/tools/remote-exec.js.map +1 -0
  231. package/dist/tools/remote-sync.d.ts +5 -0
  232. package/dist/tools/remote-sync.d.ts.map +1 -0
  233. package/dist/tools/remote-sync.js +57 -0
  234. package/dist/tools/remote-sync.js.map +1 -0
  235. package/dist/tools/show-metrics.d.ts +4 -0
  236. package/dist/tools/show-metrics.d.ts.map +1 -0
  237. package/dist/tools/show-metrics.js +69 -0
  238. package/dist/tools/show-metrics.js.map +1 -0
  239. package/dist/tools/sleep.d.ts +4 -0
  240. package/dist/tools/sleep.d.ts.map +1 -0
  241. package/dist/tools/sleep.js +116 -0
  242. package/dist/tools/sleep.js.map +1 -0
  243. package/dist/tools/task-output.d.ts +5 -0
  244. package/dist/tools/task-output.d.ts.map +1 -0
  245. package/dist/tools/task-output.js +51 -0
  246. package/dist/tools/task-output.js.map +1 -0
  247. package/dist/tools/web-fetch.d.ts +3 -0
  248. package/dist/tools/web-fetch.d.ts.map +1 -0
  249. package/dist/tools/web-fetch.js +112 -0
  250. package/dist/tools/web-fetch.js.map +1 -0
  251. package/dist/ui/commands.d.ts +7 -0
  252. package/dist/ui/commands.d.ts.map +1 -0
  253. package/dist/ui/commands.js +21 -0
  254. package/dist/ui/commands.js.map +1 -0
  255. package/dist/ui/components/gradient-edge.d.ts +7 -0
  256. package/dist/ui/components/gradient-edge.d.ts.map +1 -0
  257. package/dist/ui/components/gradient-edge.js +33 -0
  258. package/dist/ui/components/gradient-edge.js.map +1 -0
  259. package/dist/ui/components/input-bar.d.ts +8 -0
  260. package/dist/ui/components/input-bar.d.ts.map +1 -0
  261. package/dist/ui/components/input-bar.js +139 -0
  262. package/dist/ui/components/input-bar.js.map +1 -0
  263. package/dist/ui/components/key-hint-rule.d.ts +2 -0
  264. package/dist/ui/components/key-hint-rule.d.ts.map +1 -0
  265. package/dist/ui/components/key-hint-rule.js +19 -0
  266. package/dist/ui/components/key-hint-rule.js.map +1 -0
  267. package/dist/ui/components/overlay-header.d.ts +6 -0
  268. package/dist/ui/components/overlay-header.d.ts.map +1 -0
  269. package/dist/ui/components/overlay-header.js +10 -0
  270. package/dist/ui/components/overlay-header.js.map +1 -0
  271. package/dist/ui/components/status-bar.d.ts +11 -0
  272. package/dist/ui/components/status-bar.d.ts.map +1 -0
  273. package/dist/ui/components/status-bar.js +55 -0
  274. package/dist/ui/components/status-bar.js.map +1 -0
  275. package/dist/ui/format.d.ts +12 -0
  276. package/dist/ui/format.d.ts.map +1 -0
  277. package/dist/ui/format.js +36 -0
  278. package/dist/ui/format.js.map +1 -0
  279. package/dist/ui/layout.d.ts +48 -0
  280. package/dist/ui/layout.d.ts.map +1 -0
  281. package/dist/ui/layout.js +857 -0
  282. package/dist/ui/layout.js.map +1 -0
  283. package/dist/ui/markdown.d.ts +7 -0
  284. package/dist/ui/markdown.d.ts.map +1 -0
  285. package/dist/ui/markdown.js +67 -0
  286. package/dist/ui/markdown.js.map +1 -0
  287. package/dist/ui/mouse-filter.d.ts +21 -0
  288. package/dist/ui/mouse-filter.d.ts.map +1 -0
  289. package/dist/ui/mouse-filter.js +66 -0
  290. package/dist/ui/mouse-filter.js.map +1 -0
  291. package/dist/ui/overlays/metrics-overlay.d.ts +11 -0
  292. package/dist/ui/overlays/metrics-overlay.d.ts.map +1 -0
  293. package/dist/ui/overlays/metrics-overlay.js +86 -0
  294. package/dist/ui/overlays/metrics-overlay.js.map +1 -0
  295. package/dist/ui/overlays/task-overlay.d.ts +12 -0
  296. package/dist/ui/overlays/task-overlay.d.ts.map +1 -0
  297. package/dist/ui/overlays/task-overlay.js +77 -0
  298. package/dist/ui/overlays/task-overlay.js.map +1 -0
  299. package/dist/ui/panels/conversation.d.ts +8 -0
  300. package/dist/ui/panels/conversation.d.ts.map +1 -0
  301. package/dist/ui/panels/conversation.js +216 -0
  302. package/dist/ui/panels/conversation.js.map +1 -0
  303. package/dist/ui/panels/metrics-dashboard.d.ts +8 -0
  304. package/dist/ui/panels/metrics-dashboard.d.ts.map +1 -0
  305. package/dist/ui/panels/metrics-dashboard.js +56 -0
  306. package/dist/ui/panels/metrics-dashboard.js.map +1 -0
  307. package/dist/ui/panels/sleep-panel.d.ts +7 -0
  308. package/dist/ui/panels/sleep-panel.d.ts.map +1 -0
  309. package/dist/ui/panels/sleep-panel.js +48 -0
  310. package/dist/ui/panels/sleep-panel.js.map +1 -0
  311. package/dist/ui/panels/sticky-notes.d.ts +8 -0
  312. package/dist/ui/panels/sticky-notes.d.ts.map +1 -0
  313. package/dist/ui/panels/sticky-notes.js +49 -0
  314. package/dist/ui/panels/sticky-notes.js.map +1 -0
  315. package/dist/ui/panels/task-list.d.ts +8 -0
  316. package/dist/ui/panels/task-list.d.ts.map +1 -0
  317. package/dist/ui/panels/task-list.js +39 -0
  318. package/dist/ui/panels/task-list.js.map +1 -0
  319. package/dist/ui/theme.d.ts +25 -0
  320. package/dist/ui/theme.d.ts.map +1 -0
  321. package/dist/ui/theme.js +50 -0
  322. package/dist/ui/theme.js.map +1 -0
  323. package/dist/version.d.ts +9 -0
  324. package/dist/version.d.ts.map +1 -0
  325. package/dist/version.js +62 -0
  326. package/dist/version.js.map +1 -0
  327. package/package.json +59 -0
package/dist/app.js ADDED
@@ -0,0 +1,289 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useState } from "react";
3
+ import { Box, Text } from "ink";
4
+ import { Layout } from "./ui/layout.js";
5
+ import { Orchestrator } from "./core/orchestrator.js";
6
+ import { ClaudeProvider } from "./providers/claude/provider.js";
7
+ import { OpenAIProvider } from "./providers/openai/provider.js";
8
+ import { AuthManager } from "./providers/auth/auth-manager.js";
9
+ import { OpenAIOAuth } from "./providers/openai/oauth.js";
10
+ import { ConnectionPool } from "./remote/connection-pool.js";
11
+ import { RemoteExecutor } from "./remote/executor.js";
12
+ import { FileSync } from "./remote/file-sync.js";
13
+ import { TriggerScheduler } from "./scheduler/trigger-scheduler.js";
14
+ import { SleepManager } from "./scheduler/sleep-manager.js";
15
+ import { MetricStore } from "./metrics/store.js";
16
+ import { MetricCollector } from "./metrics/collector.js";
17
+ import { createRemoteExecTool, createRemoteExecBackgroundTool, } from "./tools/remote-exec.js";
18
+ import { createUploadTool, createDownloadTool, } from "./tools/remote-sync.js";
19
+ import { createSleepTool } from "./tools/sleep.js";
20
+ import { createListMachinesTool } from "./tools/list-machines.js";
21
+ import { createTaskOutputTool } from "./tools/task-output.js";
22
+ import { createCompareRunsTool } from "./tools/compare-runs.js";
23
+ import { createShowMetricsTool } from "./tools/show-metrics.js";
24
+ import { createClearMetricsTool } from "./tools/clear-metrics.js";
25
+ import { createKillTaskTool } from "./tools/kill-task.js";
26
+ import { createReadFileTool, createWriteFileTool, createPatchFileTool } from "./tools/file-ops.js";
27
+ import { createWebFetchTool } from "./tools/web-fetch.js";
28
+ import { createStartMonitorTool, createStopMonitorTool } from "./tools/monitor.js";
29
+ import { createConsultTool } from "./tools/consult.js";
30
+ import { MonitorManager } from "./core/monitor.js";
31
+ import { loadMachines } from "./remote/config.js";
32
+ import { loadPreferences } from "./store/preferences.js";
33
+ import { MemoryStore } from "./memory/memory-store.js";
34
+ import { ContextGate } from "./memory/context-gate.js";
35
+ import { ExperimentTracker } from "./memory/experiment-tracker.js";
36
+ import { createMemoryTools } from "./tools/memory-tools.js";
37
+ import { StickyManager } from "./core/stickies.js";
38
+ const SYSTEM_PROMPT = `You are Helios, an autonomous ML research agent. You help researchers design, run, and monitor machine learning experiments on local and remote machines.
39
+
40
+ ## Machines
41
+ - "local" is always available — it runs commands on the user's machine directly (no SSH).
42
+ - Remote machines are added by the user via /machine add. Use list_machines to see what's available.
43
+ - Prefer remote machines for heavy compute (training, GPU workloads). Use "local" for lightweight tasks or when no remote machines are configured.
44
+
45
+ ## Capabilities
46
+ - Execute quick commands locally or remotely (remote_exec) — ONLY for short commands like ls, cat, pip install, git clone
47
+ - Launch and monitor training runs (remote_exec_background) — ALL training, evaluation, and long-running processes
48
+ - Track metrics like loss, accuracy, rewards (show_metrics)
49
+ - Transfer files between local and remote machines (remote_upload, remote_download)
50
+ - Read, write, and edit files on any machine (read_file, write_file, patch_file)
51
+ - Fetch web pages, documentation, and papers (web_fetch)
52
+ - Clear metrics from discarded runs (clear_metrics)
53
+ - Sleep and set triggers to wake on conditions (sleep)
54
+ - List configured machines (list_machines)
55
+ - Consult the other AI provider for a second opinion (consult)
56
+
57
+ ## MANDATORY: Use remote_exec_background for ALL Runs
58
+ **EVERY training run, evaluation, benchmark, or process that takes more than a few seconds MUST use remote_exec_background.** Never use remote_exec for these — it blocks, produces no dashboard output, and breaks the entire monitoring pipeline.
59
+
60
+ remote_exec_background:
61
+ - Returns a pid and log_path
62
+ - Automatically appears in the TASKS panel
63
+ - Stdout/stderr is captured — Helios parses it for live metrics in the dashboard
64
+ - **DO NOT redirect stdout in your command** (no > file, no tee, no logging to file). Redirecting stdout breaks metric collection.
65
+ - To check output, use task_output — do NOT manually tail or cat the log file.
66
+
67
+ remote_exec is ONLY for quick one-shot commands (installing packages, checking files, git operations).
68
+
69
+ ## Metric Tracking
70
+ When calling remote_exec_background, pass **metric_names** or **metric_patterns** to enable live dashboard charts:
71
+
72
+ - **metric_names**: List of names to parse in key=value or key: value format from stdout.
73
+ Example: metric_names=["loss", "acc", "lr"] matches "loss=0.234 acc=0.95 lr=1e-4"
74
+ - **metric_patterns**: Map of name → regex with one capture group for the numeric value.
75
+ Example: metric_patterns={"loss": "Loss:\\\\s*([\\\\d.e+-]+)"} matches "Loss: 0.234"
76
+
77
+ If neither is provided, no metrics will be tracked. ALWAYS specify metrics when launching a training run.
78
+
79
+ Training scripts MUST print metrics to stdout (one line per step/epoch). Do not redirect stdout.
80
+
81
+ Use **clear_metrics** to wipe stale data when discarding a failed run before starting a new one.
82
+
83
+ ## Viewing Task Output
84
+ Use task_output to check on running tasks:
85
+ - task_output(machine_id, pid) — shows recent stdout/stderr
86
+ - task_output(machine_id, pid, lines=100) — show more lines
87
+ This is the preferred way to check task progress. Do not use remote_exec to manually tail logs.
88
+
89
+ ## Monitoring Loop — PREFERRED APPROACH
90
+ After launching a background task, use **start_monitor** to set up periodic check-ins:
91
+ - start_monitor(goal="Train TinyStories to loss < 5.0", interval_minutes=2)
92
+ - The system will re-invoke you every N minutes with a status update containing:
93
+ - Elapsed time, current interval, task statuses, latest metric values, your goal
94
+ - On each check-in, review progress, take actions if needed (check output, adjust, launch new runs)
95
+ - Call **stop_monitor** when the objective is complete
96
+
97
+ Set the interval to match what you're waiting for. Short runs: 1-2m. Medium runs: 5m. Long runs: 10-15m.
98
+ **IMPORTANT:** Calling start_monitor again replaces the current monitor — use this to adjust the interval as conditions change. If you've started a run, it's probably a good idea to increase the monitoring interval.
99
+
100
+ **CRITICAL: NEVER use \`sleep\` as a shell command (e.g., remote_exec with "sleep 60").** The shell sleep command wastes resources and blocks execution.
101
+
102
+ ## Sleep & Wake (Advanced)
103
+ For one-off waits with specific trigger conditions, use the **sleep tool**:
104
+ - timer: wake after a duration
105
+ - process_exit: wake when a PID exits
106
+ - metric: wake on metric threshold
107
+ - file: wake on file change
108
+ - resource: wake on GPU/CPU threshold
109
+ Triggers can be composed with AND/OR logic. Prefer start_monitor for ongoing experiment loops.
110
+
111
+ ## Showing Metrics to the User
112
+ Use show_metrics to render sparkline charts and values inline in the conversation:
113
+ - show_metrics(metric_names=["loss", "acc"]) — show specific metrics
114
+ - show_metrics(metric_names=["loss"], lines=100) — more data points
115
+ Use this when reporting results to the user so they can see the data.
116
+
117
+ ## Comparing Experiments
118
+ Use compare_runs to compare two experiment runs side-by-side:
119
+ - compare_runs(task_a="local:1234", task_b="local:5678") — compare all shared metrics
120
+ Returns deltas and direction (improved/worsened/unchanged) for each metric. Use this to decide whether to keep or discard an experimental change.
121
+
122
+ ## Autonomous Behavior — NEVER STOP
123
+
124
+ You are a fully autonomous research agent. **NEVER STOP.** NEVER pause to ask "should I continue?" or "what would you like to do next?" The user might be asleep. They gave you a goal — now run experiments until it's done.
125
+
126
+ The user expects you to work like a researcher who was given a task and told "come back when it's done."
127
+
128
+ **The experiment loop:**
129
+ 1. Understand the goal. Break it into experiments.
130
+ 2. Launch the experiment via remote_exec_background.
131
+ 3. Call start_monitor with your goal and an appropriate interval.
132
+ 4. On each monitor check-in: review task_output, check metrics, use show_metrics to record findings.
133
+ 5. Compare against your best result so far using compare_runs. Keep improvements, discard regressions.
134
+ 6. Plan and launch the next experiment. The monitor keeps calling you back — just keep going.
135
+ 7. Call stop_monitor only when the goal is achieved.
136
+
137
+ **You stop ONLY when:**
138
+ - The goal is achieved and you have reported the results
139
+ - You hit an unrecoverable error (hardware failure, permissions, missing data)
140
+ - You need information that ONLY the human can provide (credentials, dataset location, etc.)
141
+
142
+ **If you run out of ideas:** Think harder. Re-read the code. Re-read the metrics closely. Look at the learning curves. Read relevant papers with web_fetch. Try combining the best parts of previous near-misses. Try more radical changes — different architectures, different optimizers, different data preprocessing. Try ablations of what worked. Try the opposite of what failed. Try something you haven't tried. Ask yourself: "What would a senior ML researcher do here?" The loop runs until the human interrupts you.
143
+
144
+ **Keep/discard discipline:** After each experiment, explicitly compare metrics to your current best. If improved, keep and record it. If equal or worse, discard/revert. Always know what your current best result is and why.
145
+
146
+ ## Memory System
147
+ You have a persistent virtual filesystem for storing knowledge across context checkpoints.
148
+ When the conversation gets too long, your context will be checkpointed: history is archived and you'll receive a briefing with your memory tree.
149
+
150
+ **Tools**: memory_ls, memory_read, memory_write, memory_rm
151
+
152
+ **CRITICAL: Proactively store important findings as you work.** Don't wait for a checkpoint — write to memory as you go:
153
+ - Store the goal at /goal
154
+ - Store your current best result at /best
155
+ - Store observations at /observations/<name>
156
+ - Store hypotheses at /hypotheses/<name>
157
+ - Store decisions at /decisions/<name>
158
+ - Experiments are auto-tracked at /experiments/ when you use remote_exec_background
159
+
160
+ After a checkpoint, you'll see a tree listing of all your stored knowledge. Use memory_read(path) to retrieve details, and memory_ls to explore.
161
+
162
+ **The gist is the key**: When listing nodes, you see path + gist. Make gists informative enough that you can decide whether to read the full content.
163
+
164
+ ## Consulting the Other Provider
165
+ Use **consult** if you find yourself stuck. It sends a question to the other AI (Claude if you're OpenAI, OpenAI if you're Claude) and returns their response. Good for getting a second opinion on experiment design, debugging, or when you've exhausted your own ideas.
166
+
167
+ ## Approach
168
+ - Think step-by-step about experiment design
169
+ - Monitor for common issues: loss divergence, NaN, OOM, dead GPUs
170
+ - Proactively suggest improvements based on observed metrics
171
+ - Be concise in responses but thorough in analysis
172
+ - Always check exit codes and stderr for errors when executing commands`;
173
+ export function App({ defaultProvider, claudeMode, mouseEmitter }) {
174
+ // CLI arg takes priority, then saved preference, then "claude"
175
+ const prefs = loadPreferences();
176
+ const initialProvider = defaultProvider ?? prefs.lastProvider ?? "claude";
177
+ const initialClaudeMode = claudeMode ?? prefs.claudeAuthMode;
178
+ const [orchestrator, setOrchestrator] = useState(null);
179
+ const [sleepManager, setSleepManager] = useState(null);
180
+ const [connectionPool, setConnectionPool] = useState(null);
181
+ const [executor, setExecutor] = useState(null);
182
+ const [metricCollector, setMetricCollector] = useState(null);
183
+ const [metricStore, setMetricStore] = useState(null);
184
+ const [monitorManager, setMonitorManager] = useState(null);
185
+ const [experimentTracker, setExperimentTracker] = useState(null);
186
+ const [memoryStoreState, setMemoryStoreState] = useState(null);
187
+ const [stickyManager, setStickyManager] = useState(null);
188
+ useEffect(() => {
189
+ // Auth
190
+ const authManager = new AuthManager();
191
+ // Register refresh handlers
192
+ const openaiOAuth = new OpenAIOAuth(authManager);
193
+ authManager.registerRefreshHandler("openai", (rt) => openaiOAuth.refresh(rt));
194
+ // Providers
195
+ const claudeProvider = new ClaudeProvider(authManager, initialClaudeMode);
196
+ const openaiProvider = new OpenAIProvider(authManager);
197
+ // Remote
198
+ const connPool = new ConnectionPool();
199
+ // Load machines from config and auto-connect
200
+ const machines = loadMachines();
201
+ for (const machine of machines) {
202
+ connPool.addMachine(machine);
203
+ connPool.connect(machine.id).catch((err) => {
204
+ console.error(`[helios] Failed to connect to ${machine.id} (${machine.host}:${machine.port}): ${err instanceof Error ? err.message : String(err)}`);
205
+ });
206
+ }
207
+ const executor = new RemoteExecutor(connPool);
208
+ const fileSync = new FileSync();
209
+ for (const machine of machines) {
210
+ fileSync.addMachine(machine);
211
+ }
212
+ // Metrics — fresh slate each conversation
213
+ const metricStore = new MetricStore();
214
+ metricStore.clear();
215
+ const metricCollector = new MetricCollector(connPool, metricStore);
216
+ // Memory system — uses a placeholder session ID, updated when session starts
217
+ const memoryStore = new MemoryStore("pending");
218
+ const contextGate = new ContextGate(memoryStore);
219
+ contextGate.setExecutor(executor);
220
+ contextGate.setMetricStore(metricStore);
221
+ const expTracker = new ExperimentTracker(memoryStore);
222
+ // Stickies
223
+ const stickies = new StickyManager();
224
+ // Orchestrator
225
+ const orch = new Orchestrator({
226
+ defaultProvider: initialProvider,
227
+ systemPrompt: SYSTEM_PROMPT,
228
+ });
229
+ orch.setContextGate(contextGate);
230
+ orch.setStickyManager(stickies);
231
+ orch.registerProvider(claudeProvider);
232
+ orch.registerProvider(openaiProvider);
233
+ // Register tools
234
+ orch.registerTools([
235
+ createRemoteExecTool(executor),
236
+ createRemoteExecBackgroundTool(executor, metricCollector),
237
+ createUploadTool(fileSync),
238
+ createDownloadTool(fileSync),
239
+ createListMachinesTool(connPool),
240
+ createTaskOutputTool(executor, connPool),
241
+ createShowMetricsTool(metricStore),
242
+ createCompareRunsTool(metricStore),
243
+ createClearMetricsTool(metricStore, metricCollector),
244
+ createKillTaskTool(executor, connPool, metricCollector),
245
+ createReadFileTool(connPool),
246
+ createWriteFileTool(connPool),
247
+ createPatchFileTool(connPool),
248
+ createWebFetchTool(),
249
+ ...createMemoryTools(memoryStore),
250
+ createConsultTool(() => orch.currentProvider?.name ?? null, (name) => orch.getProvider(name)),
251
+ ]);
252
+ // Scheduler
253
+ const triggerScheduler = new TriggerScheduler(connPool);
254
+ const sleepMgr = new SleepManager(triggerScheduler, orch);
255
+ sleepMgr.setExecutor(executor);
256
+ sleepMgr.setConnectionPool(connPool);
257
+ sleepMgr.setMetricStore(metricStore);
258
+ // Register sleep tool
259
+ orch.registerTool(createSleepTool(sleepMgr));
260
+ // Monitor
261
+ const monitorMgr = new MonitorManager();
262
+ orch.registerTools([
263
+ createStartMonitorTool(monitorMgr),
264
+ createStopMonitorTool(monitorMgr),
265
+ ]);
266
+ // Eagerly activate the default provider so the status bar shows provider/model immediately
267
+ orch.switchProvider(initialProvider).catch(() => { });
268
+ setOrchestrator(orch);
269
+ setSleepManager(sleepMgr);
270
+ setConnectionPool(connPool);
271
+ setExecutor(executor);
272
+ setMetricCollector(metricCollector);
273
+ setMetricStore(metricStore);
274
+ setMonitorManager(monitorMgr);
275
+ setExperimentTracker(expTracker);
276
+ setMemoryStoreState(memoryStore);
277
+ setStickyManager(stickies);
278
+ return () => {
279
+ monitorMgr.stop();
280
+ triggerScheduler.stopAll();
281
+ connPool.disconnectAll();
282
+ };
283
+ }, [initialProvider]);
284
+ if (!orchestrator || !sleepManager || !connectionPool || !executor || !metricStore || !metricCollector || !monitorManager || !experimentTracker || !memoryStoreState || !stickyManager) {
285
+ return (_jsx(Box, { padding: 1, children: _jsx(Text, { color: "yellow", children: "Starting Helios..." }) }));
286
+ }
287
+ return (_jsx(Layout, { orchestrator: orchestrator, sleepManager: sleepManager, connectionPool: connectionPool, executor: executor, metricStore: metricStore, metricCollector: metricCollector, monitorManager: monitorManager, experimentTracker: experimentTracker, memoryStore: memoryStoreState, stickyManager: stickyManager, mouseEmitter: mouseEmitter }));
288
+ }
289
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { AgentEvent, ToolDefinition, ToolCallEvent } from "../providers/types.js";
2
+ /**
3
+ * Processes tool calls from the agent loop.
4
+ * Given a stream of AgentEvents, intercepts tool_call events,
5
+ * executes the tool, and yields the result.
6
+ */
7
+ export declare function processToolCalls(events: AsyncGenerator<AgentEvent>, tools: ToolDefinition[]): AsyncGenerator<AgentEvent>;
8
+ /**
9
+ * Collects all text from a stream of AgentEvents.
10
+ */
11
+ export declare function collectText(events: AsyncGenerator<AgentEvent>): Promise<string>;
12
+ /**
13
+ * Extracts tool calls from a stream of AgentEvents.
14
+ */
15
+ export declare function collectToolCalls(events: AsyncGenerator<AgentEvent>): Promise<ToolCallEvent[]>;
16
+ //# sourceMappingURL=agent-loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../../src/core/agent-loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,aAAa,EACd,MAAM,uBAAuB,CAAC;AAE/B;;;;GAIG;AACH,wBAAuB,gBAAgB,CACrC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,EAClC,KAAK,EAAE,cAAc,EAAE,GACtB,cAAc,CAAC,UAAU,CAAC,CAmC5B;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GACjC,OAAO,CAAC,aAAa,EAAE,CAAC,CAQ1B"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Processes tool calls from the agent loop.
3
+ * Given a stream of AgentEvents, intercepts tool_call events,
4
+ * executes the tool, and yields the result.
5
+ */
6
+ export async function* processToolCalls(events, tools) {
7
+ const toolMap = new Map(tools.map((t) => [t.name, t]));
8
+ for await (const event of events) {
9
+ yield event;
10
+ if (event.type === "tool_call") {
11
+ const tool = toolMap.get(event.name);
12
+ if (!tool) {
13
+ yield {
14
+ type: "tool_result",
15
+ callId: event.id,
16
+ result: `Unknown tool: ${event.name}`,
17
+ isError: true,
18
+ };
19
+ continue;
20
+ }
21
+ try {
22
+ const result = await tool.execute(event.args);
23
+ yield {
24
+ type: "tool_result",
25
+ callId: event.id,
26
+ result,
27
+ };
28
+ }
29
+ catch (err) {
30
+ yield {
31
+ type: "tool_result",
32
+ callId: event.id,
33
+ result: `Tool error: ${err instanceof Error ? err.message : String(err)}`,
34
+ isError: true,
35
+ };
36
+ }
37
+ }
38
+ }
39
+ }
40
+ /**
41
+ * Collects all text from a stream of AgentEvents.
42
+ */
43
+ export async function collectText(events) {
44
+ let text = "";
45
+ for await (const event of events) {
46
+ if (event.type === "text" && event.delta) {
47
+ text += event.delta;
48
+ }
49
+ }
50
+ return text;
51
+ }
52
+ /**
53
+ * Extracts tool calls from a stream of AgentEvents.
54
+ */
55
+ export async function collectToolCalls(events) {
56
+ const calls = [];
57
+ for await (const event of events) {
58
+ if (event.type === "tool_call") {
59
+ calls.push(event);
60
+ }
61
+ }
62
+ return calls;
63
+ }
64
+ //# sourceMappingURL=agent-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-loop.js","sourceRoot":"","sources":["../../src/core/agent-loop.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,gBAAgB,CACrC,MAAkC,EAClC,KAAuB;IAEvB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,MAAM,KAAK,CAAC;QAEZ,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM;oBACJ,IAAI,EAAE,aAAa;oBACnB,MAAM,EAAE,KAAK,CAAC,EAAE;oBAChB,MAAM,EAAE,iBAAiB,KAAK,CAAC,IAAI,EAAE;oBACrC,OAAO,EAAE,IAAI;iBACd,CAAC;gBACF,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9C,MAAM;oBACJ,IAAI,EAAE,aAAa;oBACnB,MAAM,EAAE,KAAK,CAAC,EAAE;oBAChB,MAAM;iBACP,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM;oBACJ,IAAI,EAAE,aAAa;oBACnB,MAAM,EAAE,KAAK,CAAC,EAAE;oBAChB,MAAM,EAAE,eAAe,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;oBACzE,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAkC;IAElC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACzC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAkC;IAElC,MAAM,KAAK,GAAoB,EAAE,CAAC;IAClC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { EventEmitter } from "node:events";
2
+ export interface MonitorConfig {
3
+ intervalMs: number;
4
+ goal: string;
5
+ startedAt: number;
6
+ }
7
+ export declare class MonitorManager extends EventEmitter {
8
+ private config;
9
+ private timer;
10
+ get isActive(): boolean;
11
+ get currentConfig(): MonitorConfig | null;
12
+ start(intervalMs: number, goal: string): MonitorConfig;
13
+ stop(): void;
14
+ }
15
+ //# sourceMappingURL=monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../src/core/monitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,KAAK,CAA+C;IAE5D,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,aAAa,IAAI,aAAa,GAAG,IAAI,CAExC;IAED,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa;IAqBtD,IAAI,IAAI,IAAI;CAWb"}
@@ -0,0 +1,40 @@
1
+ import { EventEmitter } from "node:events";
2
+ export class MonitorManager extends EventEmitter {
3
+ config = null;
4
+ timer = null;
5
+ get isActive() {
6
+ return this.config !== null;
7
+ }
8
+ get currentConfig() {
9
+ return this.config;
10
+ }
11
+ start(intervalMs, goal) {
12
+ if (this.config) {
13
+ this.stop();
14
+ }
15
+ this.config = {
16
+ intervalMs,
17
+ goal,
18
+ startedAt: Date.now(),
19
+ };
20
+ this.timer = setInterval(() => {
21
+ if (this.config) {
22
+ this.emit("tick", this.config);
23
+ }
24
+ }, intervalMs);
25
+ this.emit("started", this.config);
26
+ return this.config;
27
+ }
28
+ stop() {
29
+ if (this.timer) {
30
+ clearInterval(this.timer);
31
+ this.timer = null;
32
+ }
33
+ const was = this.config;
34
+ this.config = null;
35
+ if (was) {
36
+ this.emit("stopped", was);
37
+ }
38
+ }
39
+ }
40
+ //# sourceMappingURL=monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/core/monitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C,MAAM,OAAO,cAAe,SAAQ,YAAY;IACtC,MAAM,GAAyB,IAAI,CAAC;IACpC,KAAK,GAA0C,IAAI,CAAC;IAE5D,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC;IAC9B,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,UAAkB,EAAE,IAAY;QACpC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;QAED,IAAI,CAAC,MAAM,GAAG;YACZ,UAAU;YACV,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC5B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACjC,CAAC;QACH,CAAC,EAAE,UAAU,CAAC,CAAC;QAEf,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,51 @@
1
+ import type { ModelProvider, ModelInfo, ToolDefinition, Session, SessionConfig, AgentEvent, ReasoningEffort } from "../providers/types.js";
2
+ import { AgentStateMachine } from "./state-machine.js";
3
+ import { SessionStore } from "../store/session-store.js";
4
+ import type { ContextGate } from "../memory/context-gate.js";
5
+ import type { StickyManager } from "./stickies.js";
6
+ export interface OrchestratorConfig {
7
+ defaultProvider: "claude" | "openai";
8
+ systemPrompt: string;
9
+ }
10
+ export declare class Orchestrator {
11
+ private providers;
12
+ private activeProvider;
13
+ private activeSession;
14
+ private tools;
15
+ private _totalCostUsd;
16
+ private _lastInputTokens;
17
+ private _contextGate;
18
+ private _stickyManager;
19
+ readonly stateMachine: AgentStateMachine;
20
+ readonly sessionStore: SessionStore;
21
+ readonly config: OrchestratorConfig;
22
+ constructor(config: OrchestratorConfig);
23
+ registerProvider(provider: ModelProvider): void;
24
+ registerTool(tool: ToolDefinition): void;
25
+ registerTools(tools: ToolDefinition[]): void;
26
+ setContextGate(gate: ContextGate): void;
27
+ get contextGate(): ContextGate | null;
28
+ setStickyManager(manager: StickyManager): void;
29
+ getTools(): ToolDefinition[];
30
+ getProvider(name?: string): ModelProvider | null;
31
+ switchProvider(name: "claude" | "openai"): Promise<void>;
32
+ ensureSession(): Promise<Session>;
33
+ startSession(config?: Partial<SessionConfig>): Promise<Session>;
34
+ resumeSession(sessionId: string): Promise<Session>;
35
+ send(message: string): AsyncGenerator<AgentEvent>;
36
+ interrupt(): void;
37
+ get currentSession(): Session | null;
38
+ get currentProvider(): ModelProvider | null;
39
+ get currentState(): import("./state-machine.js").AgentState;
40
+ get totalCostUsd(): number;
41
+ get currentModel(): string | null;
42
+ setModel(model: string): Promise<void>;
43
+ fetchModels(): Promise<ModelInfo[]>;
44
+ get reasoningEffort(): ReasoningEffort | null;
45
+ setReasoningEffort(effort: ReasoningEffort): Promise<void>;
46
+ /** Last input token count reported by the provider (for context budget tracking). */
47
+ get lastInputTokens(): number;
48
+ private maybeCheckpoint;
49
+ private generateCheckpointGist;
50
+ }
51
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,cAAc,EACd,OAAO,EACP,aAAa,EACb,UAAU,EACV,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,aAAa,CAAwB;IAC7C,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,cAAc,CAA8B;IACpD,QAAQ,CAAC,YAAY,oBAA2B;IAChD,QAAQ,CAAC,YAAY,eAAsB;IAC3C,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;gBAExB,MAAM,EAAE,kBAAkB;IAItC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAI/C,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAIxC,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IAI5C,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAIvC,IAAI,WAAW,IAAI,WAAW,GAAG,IAAI,CAEpC;IAED,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAI9C,QAAQ,IAAI,cAAc,EAAE;IAI5B,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAK1C,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBxD,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAKjC,YAAY,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IA0B/D,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqBjD,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC;IAqDxD,SAAS,IAAI,IAAI;IAMjB,IAAI,cAAc,IAAI,OAAO,GAAG,IAAI,CAEnC;IAED,IAAI,eAAe,IAAI,aAAa,GAAG,IAAI,CAE1C;IAED,IAAI,YAAY,4CAEf;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,YAAY,IAAI,MAAM,GAAG,IAAI,CAEhC;IAEK,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYtC,WAAW,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAWzC,IAAI,eAAe,IAAI,eAAe,GAAG,IAAI,CAE5C;IAEK,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhE,qFAAqF;IACrF,IAAI,eAAe,IAAI,MAAM,CAE5B;YAEc,eAAe;YAwBhB,sBAAsB;CAiBrC"}