@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
@@ -0,0 +1,235 @@
1
+ import { AgentStateMachine } from "./state-machine.js";
2
+ import { SessionStore } from "../store/session-store.js";
3
+ import { savePreferences } from "../store/preferences.js";
4
+ export class Orchestrator {
5
+ providers = new Map();
6
+ activeProvider = null;
7
+ activeSession = null;
8
+ tools = [];
9
+ _totalCostUsd = 0;
10
+ _lastInputTokens = 0;
11
+ _contextGate = null;
12
+ _stickyManager = null;
13
+ stateMachine = new AgentStateMachine();
14
+ sessionStore = new SessionStore();
15
+ config;
16
+ constructor(config) {
17
+ this.config = config;
18
+ }
19
+ registerProvider(provider) {
20
+ this.providers.set(provider.name, provider);
21
+ }
22
+ registerTool(tool) {
23
+ this.tools.push(tool);
24
+ }
25
+ registerTools(tools) {
26
+ this.tools.push(...tools);
27
+ }
28
+ setContextGate(gate) {
29
+ this._contextGate = gate;
30
+ }
31
+ get contextGate() {
32
+ return this._contextGate;
33
+ }
34
+ setStickyManager(manager) {
35
+ this._stickyManager = manager;
36
+ }
37
+ getTools() {
38
+ return this.tools;
39
+ }
40
+ getProvider(name) {
41
+ if (name)
42
+ return this.providers.get(name) ?? null;
43
+ return this.activeProvider;
44
+ }
45
+ async switchProvider(name) {
46
+ const provider = this.providers.get(name);
47
+ if (!provider)
48
+ throw new Error(`Provider "${name}" not registered`);
49
+ // Clean up old session before switching
50
+ if (this.activeSession && this.activeProvider) {
51
+ await this.activeProvider.closeSession(this.activeSession).catch(() => { });
52
+ this.activeSession = null;
53
+ }
54
+ await provider.authenticate();
55
+ this.activeProvider = provider;
56
+ savePreferences({ lastProvider: name });
57
+ }
58
+ async ensureSession() {
59
+ if (this.activeSession)
60
+ return this.activeSession;
61
+ return this.startSession();
62
+ }
63
+ async startSession(config) {
64
+ if (!this.activeProvider) {
65
+ await this.switchProvider(this.config.defaultProvider);
66
+ }
67
+ const sessionConfig = {
68
+ systemPrompt: this.config.systemPrompt,
69
+ ...config,
70
+ };
71
+ const session = await this.activeProvider.createSession(sessionConfig);
72
+ this.activeSession = session;
73
+ // Bind memory store to this session
74
+ if (this._contextGate) {
75
+ this._contextGate.onSessionStart(session.id);
76
+ }
77
+ if (this.stateMachine.state === "idle") {
78
+ this.stateMachine.transition("active", "Session started");
79
+ }
80
+ return session;
81
+ }
82
+ async resumeSession(sessionId) {
83
+ const stored = this.sessionStore.getSession(sessionId);
84
+ if (!stored)
85
+ throw new Error(`Session "${sessionId}" not found`);
86
+ // Ensure the correct provider is active
87
+ const providerName = stored.providerId;
88
+ if (!this.activeProvider || this.activeProvider.name !== providerName) {
89
+ await this.switchProvider(providerName);
90
+ }
91
+ // Ask the provider to resume its side (re-hydrate conversation history etc.)
92
+ const session = await this.activeProvider.resumeSession(stored.id);
93
+ this.activeSession = session;
94
+ if (this.stateMachine.state === "idle") {
95
+ this.stateMachine.transition("active", "Session resumed");
96
+ }
97
+ return session;
98
+ }
99
+ async *send(message) {
100
+ if (!this.activeProvider) {
101
+ await this.switchProvider(this.config.defaultProvider);
102
+ }
103
+ const session = await this.ensureSession();
104
+ this.sessionStore.updateLastActive(session.id);
105
+ this.sessionStore.addMessage(session.id, "user", message);
106
+ // Prepend sticky notes to the message so the model always sees them
107
+ let augmentedMessage = message;
108
+ if (this._stickyManager) {
109
+ const stickies = this._stickyManager.formatForModel();
110
+ if (stickies) {
111
+ augmentedMessage = stickies + "\n\n---\n\n" + message;
112
+ }
113
+ }
114
+ let fullResponse = "";
115
+ for await (const event of this.activeProvider.send(session, augmentedMessage, this.tools)) {
116
+ if (event.type === "text" && event.delta) {
117
+ fullResponse += event.delta;
118
+ }
119
+ if (event.type === "done") {
120
+ if (event.usage?.costUsd) {
121
+ this._totalCostUsd += event.usage.costUsd;
122
+ }
123
+ if (event.usage?.inputTokens) {
124
+ this._lastInputTokens = event.usage.inputTokens;
125
+ }
126
+ }
127
+ yield event;
128
+ }
129
+ // Check if context window is filling up — trigger checkpoint if needed
130
+ yield* this.maybeCheckpoint(session);
131
+ if (fullResponse) {
132
+ this.sessionStore.addMessage(session.id, "assistant", fullResponse);
133
+ }
134
+ }
135
+ interrupt() {
136
+ if (this.activeProvider && this.activeSession) {
137
+ this.activeProvider.interrupt(this.activeSession);
138
+ }
139
+ }
140
+ get currentSession() {
141
+ return this.activeSession;
142
+ }
143
+ get currentProvider() {
144
+ return this.activeProvider;
145
+ }
146
+ get currentState() {
147
+ return this.stateMachine.state;
148
+ }
149
+ get totalCostUsd() {
150
+ return this._totalCostUsd;
151
+ }
152
+ get currentModel() {
153
+ return this.activeProvider?.currentModel ?? null;
154
+ }
155
+ async setModel(model) {
156
+ if (!this.activeProvider) {
157
+ await this.switchProvider(this.config.defaultProvider);
158
+ }
159
+ this.activeProvider.currentModel = model;
160
+ // Reset session so next message uses the new model
161
+ if (this.activeSession) {
162
+ await this.activeProvider.closeSession(this.activeSession);
163
+ this.activeSession = null;
164
+ }
165
+ }
166
+ async fetchModels() {
167
+ if (!this.activeProvider) {
168
+ await this.switchProvider(this.config.defaultProvider);
169
+ }
170
+ if (this.activeProvider.fetchModels) {
171
+ return this.activeProvider.fetchModels();
172
+ }
173
+ // Return current model as the only option
174
+ return [{ id: this.activeProvider.currentModel, name: this.activeProvider.currentModel }];
175
+ }
176
+ get reasoningEffort() {
177
+ return this.activeProvider?.reasoningEffort ?? null;
178
+ }
179
+ async setReasoningEffort(effort) {
180
+ if (!this.activeProvider) {
181
+ await this.switchProvider(this.config.defaultProvider);
182
+ }
183
+ this.activeProvider.reasoningEffort = effort;
184
+ }
185
+ /** Last input token count reported by the provider (for context budget tracking). */
186
+ get lastInputTokens() {
187
+ return this._lastInputTokens;
188
+ }
189
+ async *maybeCheckpoint(session) {
190
+ if (!this._contextGate || !this.activeProvider)
191
+ return;
192
+ const model = this.activeProvider.currentModel;
193
+ const threshold = this._contextGate.checkThreshold(model, this._lastInputTokens);
194
+ if (!threshold)
195
+ return;
196
+ // Ask the model to write a gist of the conversation before we wipe it
197
+ const gist = await this.generateCheckpointGist(session);
198
+ // Save gist to memory and build briefing
199
+ const briefing = this._contextGate.performCheckpointWithGist(gist);
200
+ // Reset provider history with the briefing
201
+ this.activeProvider.resetHistory(session, briefing);
202
+ this._lastInputTokens = 0;
203
+ yield {
204
+ type: "text",
205
+ text: "\n\n---\n*[Context checkpoint — conversation archived, continuing from memory]*\n\n",
206
+ delta: "\n\n---\n*[Context checkpoint — conversation archived, continuing from memory]*\n\n",
207
+ };
208
+ }
209
+ async generateCheckpointGist(session) {
210
+ const provider = this.activeProvider;
211
+ let gist = "";
212
+ try {
213
+ for await (const event of provider.send(session, CHECKPOINT_GIST_PROMPT, [])) {
214
+ if (event.type === "text" && event.delta) {
215
+ gist += event.delta;
216
+ }
217
+ }
218
+ }
219
+ catch {
220
+ // If gist generation fails, continue with empty gist
221
+ gist = "(gist generation failed)";
222
+ }
223
+ return gist;
224
+ }
225
+ }
226
+ const CHECKPOINT_GIST_PROMPT = `SYSTEM: Your conversation context is about to be archived because it's getting too long. You'll be resumed with your memory tree and this gist.
227
+
228
+ Write a concise gist covering:
229
+ 1. **Goal**: What you're trying to achieve
230
+ 2. **Status**: Where you are right now — what's running, what just finished, what the latest results are
231
+ 3. **Plan**: What you were about to do next, and why
232
+ 4. **Key context**: Anything critical that isn't already in your memory tree (observations not yet saved, hunches, dead ends to avoid)
233
+
234
+ Be direct and dense. This is a note to yourself.`;
235
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export type AgentState = "idle" | "active" | "sleeping" | "waiting" | "error";
2
+ export interface StateTransition {
3
+ from: AgentState;
4
+ to: AgentState;
5
+ reason: string;
6
+ timestamp: number;
7
+ }
8
+ type StateListener = (state: AgentState, transition: StateTransition) => void;
9
+ export declare class AgentStateMachine {
10
+ private _state;
11
+ private _history;
12
+ private _listeners;
13
+ get state(): AgentState;
14
+ get history(): readonly StateTransition[];
15
+ transition(to: AgentState, reason: string): void;
16
+ onTransition(listener: StateListener): () => void;
17
+ }
18
+ export {};
19
+ //# sourceMappingURL=state-machine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-machine.d.ts","sourceRoot":"","sources":["../../src/core/state-machine.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;AAE9E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,UAAU,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,KAAK,aAAa,GAAG,CACnB,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,eAAe,KACxB,IAAI,CAAC;AAUV,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,UAAU,CAAuB;IAEzC,IAAI,KAAK,IAAI,UAAU,CAEtB;IAED,IAAI,OAAO,IAAI,SAAS,eAAe,EAAE,CAExC;IAED,UAAU,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAuBhD,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI;CAMlD"}
@@ -0,0 +1,42 @@
1
+ const VALID_TRANSITIONS = {
2
+ idle: ["active"],
3
+ active: ["idle", "sleeping", "waiting", "error"],
4
+ sleeping: ["active", "error"],
5
+ waiting: ["active", "error"],
6
+ error: ["idle", "active"],
7
+ };
8
+ export class AgentStateMachine {
9
+ _state = "idle";
10
+ _history = [];
11
+ _listeners = [];
12
+ get state() {
13
+ return this._state;
14
+ }
15
+ get history() {
16
+ return this._history;
17
+ }
18
+ transition(to, reason) {
19
+ const valid = VALID_TRANSITIONS[this._state];
20
+ if (!valid.includes(to)) {
21
+ throw new Error(`Invalid state transition: ${this._state} → ${to}`);
22
+ }
23
+ const transition = {
24
+ from: this._state,
25
+ to,
26
+ reason,
27
+ timestamp: Date.now(),
28
+ };
29
+ this._state = to;
30
+ this._history.push(transition);
31
+ for (const listener of this._listeners) {
32
+ listener(to, transition);
33
+ }
34
+ }
35
+ onTransition(listener) {
36
+ this._listeners.push(listener);
37
+ return () => {
38
+ this._listeners = this._listeners.filter((l) => l !== listener);
39
+ };
40
+ }
41
+ }
42
+ //# sourceMappingURL=state-machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-machine.js","sourceRoot":"","sources":["../../src/core/state-machine.ts"],"names":[],"mappings":"AAcA,MAAM,iBAAiB,GAAqC;IAC1D,IAAI,EAAE,CAAC,QAAQ,CAAC;IAChB,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC;IAChD,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC7B,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC5B,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;CAC1B,CAAC;AAEF,MAAM,OAAO,iBAAiB;IACpB,MAAM,GAAe,MAAM,CAAC;IAC5B,QAAQ,GAAsB,EAAE,CAAC;IACjC,UAAU,GAAoB,EAAE,CAAC;IAEzC,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,UAAU,CAAC,EAAc,EAAE,MAAc;QACvC,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,6BAA6B,IAAI,CAAC,MAAM,MAAM,EAAE,EAAE,CACnD,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAoB;YAClC,IAAI,EAAE,IAAI,CAAC,MAAM;YACjB,EAAE;YACF,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE/B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,YAAY,CAAC,QAAuB;QAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QAClE,CAAC,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ export interface StickyNote {
2
+ num: number;
3
+ text: string;
4
+ createdAt: number;
5
+ }
6
+ /**
7
+ * Manages sticky notes — persistent reminders injected into every model turn.
8
+ * Notes are numbered starting from 1.
9
+ */
10
+ export declare class StickyManager {
11
+ private notes;
12
+ private nextNum;
13
+ add(text: string): StickyNote;
14
+ remove(num: number): boolean;
15
+ list(): StickyNote[];
16
+ count(): number;
17
+ /** Format sticky notes for injection into the model's context. */
18
+ formatForModel(): string | null;
19
+ }
20
+ //# sourceMappingURL=stickies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stickies.d.ts","sourceRoot":"","sources":["../../src/core/stickies.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,OAAO,CAAK;IAEpB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IAU7B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAO5B,IAAI,IAAI,UAAU,EAAE;IAIpB,KAAK,IAAI,MAAM;IAIf,kEAAkE;IAClE,cAAc,IAAI,MAAM,GAAG,IAAI;CAYhC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Manages sticky notes — persistent reminders injected into every model turn.
3
+ * Notes are numbered starting from 1.
4
+ */
5
+ export class StickyManager {
6
+ notes = [];
7
+ nextNum = 1;
8
+ add(text) {
9
+ const note = {
10
+ num: this.nextNum++,
11
+ text,
12
+ createdAt: Date.now(),
13
+ };
14
+ this.notes.push(note);
15
+ return note;
16
+ }
17
+ remove(num) {
18
+ const idx = this.notes.findIndex((n) => n.num === num);
19
+ if (idx === -1)
20
+ return false;
21
+ this.notes.splice(idx, 1);
22
+ return true;
23
+ }
24
+ list() {
25
+ return [...this.notes];
26
+ }
27
+ count() {
28
+ return this.notes.length;
29
+ }
30
+ /** Format sticky notes for injection into the model's context. */
31
+ formatForModel() {
32
+ if (this.notes.length === 0)
33
+ return null;
34
+ const lines = this.notes.map((n) => ` [${n.num}] ${n.text}`);
35
+ return [
36
+ "⚠️ STICKY NOTES — The user has pinned the following reminders. Keep these at the forefront of your thinking at ALL times:",
37
+ ...lines,
38
+ ].join("\n");
39
+ }
40
+ }
41
+ //# sourceMappingURL=stickies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stickies.js","sourceRoot":"","sources":["../../src/core/stickies.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,MAAM,OAAO,aAAa;IAChB,KAAK,GAAiB,EAAE,CAAC;IACzB,OAAO,GAAG,CAAC,CAAC;IAEpB,GAAG,CAAC,IAAY;QACd,MAAM,IAAI,GAAe;YACvB,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE;YACnB,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QACvD,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,kEAAkE;IAClE,cAAc;QACZ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAC1B,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAChC,CAAC;QAEF,OAAO;YACL,2HAA2H;YAC3H,GAAG,KAAK;SACT,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env node
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { withFullScreen } from "fullscreen-ink";
4
+ import { App } from "./app.js";
5
+ import { createMouseFilter } from "./ui/mouse-filter.js";
6
+ import { VERSION } from "./version.js";
7
+ // Parse CLI args
8
+ const args = process.argv.slice(2);
9
+ let providerArg;
10
+ let claudeModeArg;
11
+ for (let i = 0; i < args.length; i++) {
12
+ const arg = args[i];
13
+ if ((arg === "--provider" || arg === "-p") && args[i + 1]) {
14
+ const p = args[i + 1];
15
+ if (p === "claude" || p === "openai") {
16
+ providerArg = p;
17
+ }
18
+ else {
19
+ console.error(`Unknown provider: ${p}. Use "claude" or "openai".`);
20
+ process.exit(1);
21
+ }
22
+ i++;
23
+ }
24
+ else if (arg === "--claude-mode" && args[i + 1]) {
25
+ const m = args[i + 1];
26
+ if (m === "cli" || m === "api") {
27
+ claudeModeArg = m;
28
+ }
29
+ else {
30
+ console.error(`Unknown claude mode: ${m}. Use "cli" or "api".`);
31
+ process.exit(1);
32
+ }
33
+ i++;
34
+ }
35
+ else if (arg === "--version" || arg === "-v" || arg === "-V") {
36
+ console.log(`helios ${VERSION}`);
37
+ process.exit(0);
38
+ }
39
+ else if (arg === "--help" || arg === "-h") {
40
+ console.log(`
41
+ Helios ${VERSION} - Autonomous ML Research Agent
42
+
43
+ Usage: helios [options]
44
+
45
+ Options:
46
+ -p, --provider <claude|openai> Model provider (default: claude)
47
+ --claude-mode <cli|api> Force Claude auth mode (cli = Agent SDK, api = API key)
48
+ -v, --version Show version
49
+ -h, --help Show this help
50
+
51
+ Environment:
52
+ ANTHROPIC_API_KEY Claude API key (for Claude provider with API key auth)
53
+
54
+ Auth:
55
+ Claude: Install \`claude\` CLI and run \`claude login\`, or set ANTHROPIC_API_KEY
56
+ OpenAI: OAuth login via ChatGPT Plus/Pro on first run
57
+ `);
58
+ process.exit(0);
59
+ }
60
+ }
61
+ // Filter mouse escape sequences from stdin before Ink sees them
62
+ const { filteredStdin, mouseEmitter } = createMouseFilter(process.stdin);
63
+ // fullscreen-ink handles alternate screen buffer + cursor hiding
64
+ const { start, waitUntilExit } = withFullScreen(_jsx(App, { defaultProvider: providerArg, claudeMode: claudeModeArg, mouseEmitter: mouseEmitter }), { exitOnCtrlC: false, stdin: filteredStdin });
65
+ await start();
66
+ await waitUntilExit();
67
+ process.exit(0);
68
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":";;AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,iBAAiB;AACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,IAAI,WAA4C,CAAC;AACjD,IAAI,aAAwC,CAAC;AAE7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,CAAC,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC1D,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;YACrC,WAAW,GAAG,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,6BAA6B,CAAC,CAAC;YACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,CAAC,EAAE,CAAC;IACN,CAAC;SAAM,IAAI,GAAG,KAAK,eAAe,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;YAC/B,aAAa,GAAG,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,uBAAuB,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,CAAC,EAAE,CAAC;IACN,CAAC;SAAM,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;SAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC;SACP,OAAO;;;;;;;;;;;;;;;;CAgBf,CAAC,CAAC;QACC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,gEAAgE;AAChE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEzE,iEAAiE;AACjE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,cAAc,CAC7C,KAAC,GAAG,IAAC,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,GAAI,EAC5F,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,aAAoB,EAAE,CACpD,CAAC;AAEF,MAAM,KAAK,EAAE,CAAC;AACd,MAAM,aAAa,EAAE,CAAC;AACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { MemoryStore } from "./memory-store.js";
2
+ import type { RemoteExecutor } from "../remote/executor.js";
3
+ import type { MetricStore } from "../metrics/store.js";
4
+ export interface ContextGateConfig {
5
+ /** Override checkpoint threshold (for testing). */
6
+ thresholdOverride?: number;
7
+ }
8
+ /**
9
+ * ContextGate monitors token usage and triggers checkpoints when
10
+ * the context window is filling up.
11
+ *
12
+ * Uses actual input_tokens from the API response (reported in DoneEvent.usage)
13
+ * rather than re-estimating from history text.
14
+ *
15
+ * On checkpoint:
16
+ * 1. Save active tasks + latest metrics to memory
17
+ * 2. Build a briefing from the memory tree
18
+ * 3. Orchestrator resets provider history with the briefing
19
+ */
20
+ export declare class ContextGate {
21
+ private memory;
22
+ private executor;
23
+ private metricStore;
24
+ private config;
25
+ constructor(memory: MemoryStore, config?: ContextGateConfig);
26
+ /** Update the memory store's session ID when a new session starts. */
27
+ onSessionStart(sessionId: string): void;
28
+ setExecutor(executor: RemoteExecutor): void;
29
+ setMetricStore(store: MetricStore): void;
30
+ /**
31
+ * Check if actual input token count exceeds checkpoint threshold.
32
+ * Called by Orchestrator after each send() completes.
33
+ */
34
+ checkThreshold(model: string, inputTokens: number): boolean;
35
+ /**
36
+ * Perform a checkpoint with a model-generated gist.
37
+ * Saves active state + gist to memory, returns the briefing.
38
+ */
39
+ performCheckpointWithGist(gist: string): string;
40
+ /**
41
+ * Perform a checkpoint without a gist (fallback).
42
+ */
43
+ performCheckpointFromOrchestrator(): string;
44
+ private saveActiveTasks;
45
+ /** Build a checkpoint briefing string from the memory tree + optional gist. */
46
+ buildBriefing(gist: string | null): string;
47
+ private getLatestMetrics;
48
+ }
49
+ //# sourceMappingURL=context-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-gate.d.ts","sourceRoot":"","sources":["../../src/memory/context-gate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,MAAM,CAAoB;gBAEtB,MAAM,EAAE,WAAW,EAAE,MAAM,GAAE,iBAAsB;IAK/D,sEAAsE;IACtE,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIvC,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAI3C,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAIxC;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAO3D;;;OAGG;IACH,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAc/C;;OAEG;IACH,iCAAiC,IAAI,MAAM;IAK3C,OAAO,CAAC,eAAe;IAuBvB,+EAA+E;IAC/E,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IA2B1C,OAAO,CAAC,gBAAgB;CAiBzB"}
@@ -0,0 +1,109 @@
1
+ import { getCheckpointThreshold } from "./token-estimator.js";
2
+ /**
3
+ * ContextGate monitors token usage and triggers checkpoints when
4
+ * the context window is filling up.
5
+ *
6
+ * Uses actual input_tokens from the API response (reported in DoneEvent.usage)
7
+ * rather than re-estimating from history text.
8
+ *
9
+ * On checkpoint:
10
+ * 1. Save active tasks + latest metrics to memory
11
+ * 2. Build a briefing from the memory tree
12
+ * 3. Orchestrator resets provider history with the briefing
13
+ */
14
+ export class ContextGate {
15
+ memory;
16
+ executor = null;
17
+ metricStore = null;
18
+ config;
19
+ constructor(memory, config = {}) {
20
+ this.memory = memory;
21
+ this.config = config;
22
+ }
23
+ /** Update the memory store's session ID when a new session starts. */
24
+ onSessionStart(sessionId) {
25
+ this.memory.setSession(sessionId);
26
+ }
27
+ setExecutor(executor) {
28
+ this.executor = executor;
29
+ }
30
+ setMetricStore(store) {
31
+ this.metricStore = store;
32
+ }
33
+ /**
34
+ * Check if actual input token count exceeds checkpoint threshold.
35
+ * Called by Orchestrator after each send() completes.
36
+ */
37
+ checkThreshold(model, inputTokens) {
38
+ if (inputTokens === 0)
39
+ return false;
40
+ const threshold = this.config.thresholdOverride ?? getCheckpointThreshold(model);
41
+ return inputTokens >= threshold;
42
+ }
43
+ /**
44
+ * Perform a checkpoint with a model-generated gist.
45
+ * Saves active state + gist to memory, returns the briefing.
46
+ */
47
+ performCheckpointWithGist(gist) {
48
+ // Save the model's gist
49
+ this.memory.write("/context/gist", "Model-generated summary of conversation before checkpoint", gist);
50
+ // Save active tasks to /context/active-tasks
51
+ this.saveActiveTasks();
52
+ return this.buildBriefing(gist);
53
+ }
54
+ /**
55
+ * Perform a checkpoint without a gist (fallback).
56
+ */
57
+ performCheckpointFromOrchestrator() {
58
+ this.saveActiveTasks();
59
+ return this.buildBriefing(null);
60
+ }
61
+ saveActiveTasks() {
62
+ if (!this.executor)
63
+ return;
64
+ const tasks = this.executor.getBackgroundProcesses();
65
+ if (tasks.length === 0)
66
+ return;
67
+ const taskLines = tasks.map((t) => {
68
+ const latestMetrics = this.getLatestMetrics(t.machineId, t.pid);
69
+ return [
70
+ `${t.machineId}:${t.pid} — ${t.command.slice(0, 80)}`,
71
+ latestMetrics ? ` metrics: ${latestMetrics}` : null,
72
+ ]
73
+ .filter(Boolean)
74
+ .join("\n");
75
+ });
76
+ this.memory.write("/context/active-tasks", `${tasks.length} running task(s)`, taskLines.join("\n\n"));
77
+ }
78
+ /** Build a checkpoint briefing string from the memory tree + optional gist. */
79
+ buildBriefing(gist) {
80
+ const tree = this.memory.formatTree("/");
81
+ const parts = [
82
+ "=== CONTEXT CHECKPOINT ===",
83
+ "You are Helios, continuing an autonomous ML research session.",
84
+ "Your previous conversation has been archived.",
85
+ ];
86
+ if (gist) {
87
+ parts.push("\n## Your gist (written by you before the checkpoint):\n", gist);
88
+ }
89
+ parts.push("\n## Memory tree:\n", tree, "\nUse memory_read(path) for details on any item above.", "Use memory_write to store new findings as you work.", "Continue working toward your goal.");
90
+ return parts.join("\n");
91
+ }
92
+ getLatestMetrics(machineId, pid) {
93
+ if (!this.metricStore)
94
+ return null;
95
+ const taskId = `${machineId}:${pid}`;
96
+ const names = this.metricStore.getMetricNames(taskId);
97
+ if (names.length === 0)
98
+ return null;
99
+ const parts = [];
100
+ for (const name of names.slice(0, 5)) {
101
+ const series = this.metricStore.getSeries(taskId, name, 1);
102
+ if (series.length > 0) {
103
+ parts.push(`${name}=${series[0].value}`);
104
+ }
105
+ }
106
+ return parts.length > 0 ? parts.join(", ") : null;
107
+ }
108
+ }
109
+ //# sourceMappingURL=context-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-gate.js","sourceRoot":"","sources":["../../src/memory/context-gate.ts"],"names":[],"mappings":"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"}