@snoglobe/helios 0.1.0 → 0.2.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 (247) hide show
  1. package/dist/acp/entry.d.ts +7 -0
  2. package/dist/acp/entry.d.ts.map +1 -0
  3. package/dist/acp/entry.js +46 -0
  4. package/dist/acp/entry.js.map +1 -0
  5. package/dist/acp/server.d.ts +57 -0
  6. package/dist/acp/server.d.ts.map +1 -0
  7. package/dist/acp/server.js +434 -0
  8. package/dist/acp/server.js.map +1 -0
  9. package/dist/acp/transport.d.ts +31 -0
  10. package/dist/acp/transport.d.ts.map +1 -0
  11. package/dist/acp/transport.js +116 -0
  12. package/dist/acp/transport.js.map +1 -0
  13. package/dist/acp/types.d.ts +213 -0
  14. package/dist/acp/types.d.ts.map +1 -0
  15. package/dist/acp/types.js +3 -0
  16. package/dist/acp/types.js.map +1 -0
  17. package/dist/app.d.ts +8 -1
  18. package/dist/app.d.ts.map +1 -1
  19. package/dist/app.js +51 -281
  20. package/dist/app.js.map +1 -1
  21. package/dist/bootstrap.d.ts +3 -0
  22. package/dist/bootstrap.d.ts.map +1 -0
  23. package/dist/bootstrap.js +26 -0
  24. package/dist/bootstrap.js.map +1 -0
  25. package/dist/cli/auth.d.ts +20 -0
  26. package/dist/cli/auth.d.ts.map +1 -0
  27. package/dist/cli/auth.js +62 -0
  28. package/dist/cli/auth.js.map +1 -0
  29. package/dist/cli/doctor.d.ts +9 -0
  30. package/dist/cli/doctor.d.ts.map +1 -0
  31. package/dist/cli/doctor.js +368 -0
  32. package/dist/cli/doctor.js.map +1 -0
  33. package/dist/cli/env.d.ts +13 -0
  34. package/dist/cli/env.d.ts.map +1 -0
  35. package/dist/cli/env.js +16 -0
  36. package/dist/cli/env.js.map +1 -0
  37. package/dist/cli/export.d.ts +11 -0
  38. package/dist/cli/export.d.ts.map +1 -0
  39. package/dist/cli/export.js +103 -0
  40. package/dist/cli/export.js.map +1 -0
  41. package/dist/cli/index.d.ts +22 -0
  42. package/dist/cli/index.d.ts.map +1 -0
  43. package/dist/cli/index.js +71 -0
  44. package/dist/cli/index.js.map +1 -0
  45. package/dist/cli/init-cmd.d.ts +11 -0
  46. package/dist/cli/init-cmd.d.ts.map +1 -0
  47. package/dist/cli/init-cmd.js +37 -0
  48. package/dist/cli/init-cmd.js.map +1 -0
  49. package/dist/cli/kill.d.ts +8 -0
  50. package/dist/cli/kill.d.ts.map +1 -0
  51. package/dist/cli/kill.js +46 -0
  52. package/dist/cli/kill.js.map +1 -0
  53. package/dist/cli/options.d.ts +18 -0
  54. package/dist/cli/options.d.ts.map +1 -0
  55. package/dist/cli/options.js +24 -0
  56. package/dist/cli/options.js.map +1 -0
  57. package/dist/cli/replay.d.ts +9 -0
  58. package/dist/cli/replay.d.ts.map +1 -0
  59. package/dist/cli/replay.js +65 -0
  60. package/dist/cli/replay.js.map +1 -0
  61. package/dist/cli/report.d.ts +11 -0
  62. package/dist/cli/report.d.ts.map +1 -0
  63. package/dist/cli/report.js +70 -0
  64. package/dist/cli/report.js.map +1 -0
  65. package/dist/cli/run.d.ts +17 -0
  66. package/dist/cli/run.d.ts.map +1 -0
  67. package/dist/cli/run.js +120 -0
  68. package/dist/cli/run.js.map +1 -0
  69. package/dist/cli/search.d.ts +9 -0
  70. package/dist/cli/search.d.ts.map +1 -0
  71. package/dist/cli/search.js +52 -0
  72. package/dist/cli/search.js.map +1 -0
  73. package/dist/cli/sessions.d.ts +8 -0
  74. package/dist/cli/sessions.d.ts.map +1 -0
  75. package/dist/cli/sessions.js +38 -0
  76. package/dist/cli/sessions.js.map +1 -0
  77. package/dist/cli/watch.d.ts +8 -0
  78. package/dist/cli/watch.d.ts.map +1 -0
  79. package/dist/cli/watch.js +81 -0
  80. package/dist/cli/watch.js.map +1 -0
  81. package/dist/config/project.d.ts +63 -0
  82. package/dist/config/project.d.ts.map +1 -0
  83. package/dist/config/project.js +112 -0
  84. package/dist/config/project.js.map +1 -0
  85. package/dist/core/orchestrator.d.ts +4 -2
  86. package/dist/core/orchestrator.d.ts.map +1 -1
  87. package/dist/core/orchestrator.js +8 -3
  88. package/dist/core/orchestrator.js.map +1 -1
  89. package/dist/core/task-poller.d.ts +43 -0
  90. package/dist/core/task-poller.d.ts.map +1 -0
  91. package/dist/core/task-poller.js +98 -0
  92. package/dist/core/task-poller.js.map +1 -0
  93. package/dist/experiments/branching.d.ts +38 -0
  94. package/dist/experiments/branching.d.ts.map +1 -0
  95. package/dist/experiments/branching.js +80 -0
  96. package/dist/experiments/branching.js.map +1 -0
  97. package/dist/hub/client.d.ts +70 -0
  98. package/dist/hub/client.d.ts.map +1 -0
  99. package/dist/hub/client.js +140 -0
  100. package/dist/hub/client.js.map +1 -0
  101. package/dist/hub/config.d.ts +9 -0
  102. package/dist/hub/config.d.ts.map +1 -0
  103. package/dist/hub/config.js +38 -0
  104. package/dist/hub/config.js.map +1 -0
  105. package/dist/index.d.ts +0 -1
  106. package/dist/index.js +25 -3
  107. package/dist/index.js.map +1 -1
  108. package/dist/init.d.ts +44 -0
  109. package/dist/init.d.ts.map +1 -0
  110. package/dist/init.js +384 -0
  111. package/dist/init.js.map +1 -0
  112. package/dist/memory/context-gate.d.ts.map +1 -1
  113. package/dist/memory/context-gate.js +1 -1
  114. package/dist/memory/context-gate.js.map +1 -1
  115. package/dist/memory/experiment-tracker.d.ts.map +1 -1
  116. package/dist/memory/experiment-tracker.js +2 -6
  117. package/dist/memory/experiment-tracker.js.map +1 -1
  118. package/dist/memory/memory-store.d.ts.map +1 -1
  119. package/dist/memory/memory-store.js +16 -20
  120. package/dist/memory/memory-store.js.map +1 -1
  121. package/dist/metrics/collector.d.ts.map +1 -1
  122. package/dist/metrics/collector.js +7 -7
  123. package/dist/metrics/collector.js.map +1 -1
  124. package/dist/metrics/resources.d.ts +44 -0
  125. package/dist/metrics/resources.d.ts.map +1 -0
  126. package/dist/metrics/resources.js +382 -0
  127. package/dist/metrics/resources.js.map +1 -0
  128. package/dist/metrics/store.d.ts +10 -2
  129. package/dist/metrics/store.d.ts.map +1 -1
  130. package/dist/metrics/store.js +91 -27
  131. package/dist/metrics/store.js.map +1 -1
  132. package/dist/notifications/index.d.ts +2 -0
  133. package/dist/notifications/index.d.ts.map +1 -0
  134. package/dist/notifications/index.js +2 -0
  135. package/dist/notifications/index.js.map +1 -0
  136. package/dist/notifications/notifier.d.ts +36 -0
  137. package/dist/notifications/notifier.d.ts.map +1 -0
  138. package/dist/notifications/notifier.js +102 -0
  139. package/dist/notifications/notifier.js.map +1 -0
  140. package/dist/paths.d.ts +3 -0
  141. package/dist/paths.d.ts.map +1 -0
  142. package/dist/paths.js +5 -0
  143. package/dist/paths.js.map +1 -0
  144. package/dist/providers/claude/provider.d.ts +7 -3
  145. package/dist/providers/claude/provider.d.ts.map +1 -1
  146. package/dist/providers/claude/provider.js +48 -8
  147. package/dist/providers/claude/provider.js.map +1 -1
  148. package/dist/providers/openai/callback-server.d.ts +6 -1
  149. package/dist/providers/openai/callback-server.d.ts.map +1 -1
  150. package/dist/providers/openai/callback-server.js +44 -20
  151. package/dist/providers/openai/callback-server.js.map +1 -1
  152. package/dist/providers/openai/oauth.d.ts +4 -0
  153. package/dist/providers/openai/oauth.d.ts.map +1 -1
  154. package/dist/providers/openai/oauth.js +34 -14
  155. package/dist/providers/openai/oauth.js.map +1 -1
  156. package/dist/providers/openai/provider.d.ts +6 -3
  157. package/dist/providers/openai/provider.d.ts.map +1 -1
  158. package/dist/providers/openai/provider.js +35 -9
  159. package/dist/providers/openai/provider.js.map +1 -1
  160. package/dist/providers/types.d.ts +9 -1
  161. package/dist/providers/types.d.ts.map +1 -1
  162. package/dist/providers/types.js.map +1 -1
  163. package/dist/remote/config.d.ts.map +1 -1
  164. package/dist/remote/config.js +4 -8
  165. package/dist/remote/config.js.map +1 -1
  166. package/dist/remote/connection-pool.d.ts.map +1 -1
  167. package/dist/remote/connection-pool.js +9 -5
  168. package/dist/remote/connection-pool.js.map +1 -1
  169. package/dist/store/database.d.ts.map +1 -1
  170. package/dist/store/database.js +2 -2
  171. package/dist/store/database.js.map +1 -1
  172. package/dist/store/migrations.d.ts.map +1 -1
  173. package/dist/store/migrations.js +27 -0
  174. package/dist/store/migrations.js.map +1 -1
  175. package/dist/store/preferences.js +2 -2
  176. package/dist/store/preferences.js.map +1 -1
  177. package/dist/store/session-store.d.ts +6 -0
  178. package/dist/store/session-store.d.ts.map +1 -1
  179. package/dist/store/session-store.js +20 -5
  180. package/dist/store/session-store.js.map +1 -1
  181. package/dist/tools/env-snapshot.d.ts +5 -0
  182. package/dist/tools/env-snapshot.d.ts.map +1 -0
  183. package/dist/tools/env-snapshot.js +174 -0
  184. package/dist/tools/env-snapshot.js.map +1 -0
  185. package/dist/tools/experiment-branch.d.ts +7 -0
  186. package/dist/tools/experiment-branch.d.ts.map +1 -0
  187. package/dist/tools/experiment-branch.js +167 -0
  188. package/dist/tools/experiment-branch.js.map +1 -0
  189. package/dist/tools/file-ops.d.ts.map +1 -1
  190. package/dist/tools/file-ops.js +1 -3
  191. package/dist/tools/file-ops.js.map +1 -1
  192. package/dist/tools/hub.d.ts +5 -0
  193. package/dist/tools/hub.d.ts.map +1 -0
  194. package/dist/tools/hub.js +298 -0
  195. package/dist/tools/hub.js.map +1 -0
  196. package/dist/tools/sweep.d.ts +6 -0
  197. package/dist/tools/sweep.d.ts.map +1 -0
  198. package/dist/tools/sweep.js +153 -0
  199. package/dist/tools/sweep.js.map +1 -0
  200. package/dist/tools/web-fetch.d.ts.map +1 -1
  201. package/dist/tools/web-fetch.js +2 -1
  202. package/dist/tools/web-fetch.js.map +1 -1
  203. package/dist/tools/writeup.d.ts +11 -0
  204. package/dist/tools/writeup.d.ts.map +1 -0
  205. package/dist/tools/writeup.js +102 -0
  206. package/dist/tools/writeup.js.map +1 -0
  207. package/dist/ui/commands.d.ts +36 -0
  208. package/dist/ui/commands.d.ts.map +1 -1
  209. package/dist/ui/commands.js +495 -1
  210. package/dist/ui/commands.js.map +1 -1
  211. package/dist/ui/components/input-bar.js.map +1 -1
  212. package/dist/ui/components/overlay-header.d.ts.map +1 -1
  213. package/dist/ui/components/overlay-header.js.map +1 -1
  214. package/dist/ui/components/status-bar.js +1 -1
  215. package/dist/ui/components/status-bar.js.map +1 -1
  216. package/dist/ui/format.d.ts +4 -0
  217. package/dist/ui/format.d.ts.map +1 -1
  218. package/dist/ui/format.js +16 -0
  219. package/dist/ui/format.js.map +1 -1
  220. package/dist/ui/layout.d.ts +7 -42
  221. package/dist/ui/layout.d.ts.map +1 -1
  222. package/dist/ui/layout.js +71 -543
  223. package/dist/ui/layout.js.map +1 -1
  224. package/dist/ui/overlays/metrics-overlay.js.map +1 -1
  225. package/dist/ui/overlays/task-overlay.d.ts +1 -1
  226. package/dist/ui/overlays/task-overlay.d.ts.map +1 -1
  227. package/dist/ui/overlays/task-overlay.js.map +1 -1
  228. package/dist/ui/panels/conversation.d.ts +1 -1
  229. package/dist/ui/panels/conversation.d.ts.map +1 -1
  230. package/dist/ui/panels/conversation.js +1 -2
  231. package/dist/ui/panels/conversation.js.map +1 -1
  232. package/dist/ui/panels/metrics-dashboard.d.ts.map +1 -1
  233. package/dist/ui/panels/metrics-dashboard.js.map +1 -1
  234. package/dist/ui/panels/sleep-panel.js.map +1 -1
  235. package/dist/ui/panels/sticky-notes.d.ts.map +1 -1
  236. package/dist/ui/panels/sticky-notes.js.map +1 -1
  237. package/dist/ui/panels/task-list.d.ts +4 -2
  238. package/dist/ui/panels/task-list.d.ts.map +1 -1
  239. package/dist/ui/panels/task-list.js +41 -9
  240. package/dist/ui/panels/task-list.js.map +1 -1
  241. package/dist/ui/theme.d.ts.map +1 -1
  242. package/dist/ui/theme.js.map +1 -1
  243. package/dist/ui/types.d.ts +22 -0
  244. package/dist/ui/types.d.ts.map +1 -0
  245. package/dist/ui/types.js +2 -0
  246. package/dist/ui/types.js.map +1 -0
  247. package/package.json +19 -6
@@ -0,0 +1,368 @@
1
+ /**
2
+ * `helios doctor` — diagnose the full Helios setup.
3
+ *
4
+ * Checks auth, machines, storage, project config, and dependencies,
5
+ * printing a clear report with pass/fail/warn indicators.
6
+ */
7
+ import { Effect } from "effect";
8
+ import { Command } from "@effect/cli";
9
+ import { exec as cpExec } from "node:child_process";
10
+ import { existsSync, statSync } from "node:fs";
11
+ import { join } from "node:path";
12
+ import { formatBytes, formatError } from "../ui/format.js";
13
+ // ── Formatting helpers ──────────────────────────────────
14
+ const PASS = "\x1b[32m\u2713\x1b[0m";
15
+ const FAIL = "\x1b[31m\u2717\x1b[0m";
16
+ const WARN = "\x1b[33m\u26A0\x1b[0m";
17
+ const DIM = "\x1b[2m";
18
+ const RESET = "\x1b[0m";
19
+ const BOLD = "\x1b[1m";
20
+ function heading(label) {
21
+ console.log(`\n ${BOLD}${label}${RESET}`);
22
+ }
23
+ function pass(msg) {
24
+ console.log(` ${PASS} ${msg}`);
25
+ }
26
+ function fail(msg) {
27
+ console.log(` ${FAIL} ${msg}`);
28
+ }
29
+ function warn(msg) {
30
+ console.log(` ${WARN} ${msg}`);
31
+ }
32
+ function detail(msg) {
33
+ console.log(` ${DIM}${msg}${RESET}`);
34
+ }
35
+ /** Run a shell command and return stdout/stderr/exitCode. Never throws. */
36
+ function sh(command, timeoutMs = 10_000) {
37
+ return new Promise((resolve) => {
38
+ cpExec(command, { timeout: timeoutMs, shell: "/bin/bash" }, (err, stdout, stderr) => {
39
+ let exitCode = 0;
40
+ if (err) {
41
+ exitCode = typeof err.code === "number" ? err.code : 1;
42
+ }
43
+ resolve({ stdout: stdout ?? "", stderr: stderr ?? "", exitCode });
44
+ });
45
+ });
46
+ }
47
+ // ── Section: Auth ───────────────────────────────────────
48
+ async function checkAuth() {
49
+ heading("Auth");
50
+ try {
51
+ const { AuthManager } = await import("../providers/auth/auth-manager.js");
52
+ const authManager = new AuthManager();
53
+ // Claude
54
+ try {
55
+ const claudeAuth = authManager.isAuthenticated("claude");
56
+ if (claudeAuth) {
57
+ const creds = authManager.tokenStore.get("claude");
58
+ const method = creds?.method === "oauth" ? "OAuth" : "API key";
59
+ pass(`Claude: authenticated (${method})`);
60
+ }
61
+ else {
62
+ fail("Claude: not authenticated");
63
+ }
64
+ }
65
+ catch (e) {
66
+ fail(`Claude: error checking auth (${formatError(e)})`);
67
+ }
68
+ // OpenAI
69
+ try {
70
+ const openaiAuth = authManager.isAuthenticated("openai");
71
+ if (openaiAuth) {
72
+ const creds = authManager.tokenStore.get("openai");
73
+ const method = creds?.method === "oauth" ? "OAuth" : "API key";
74
+ const expired = authManager.tokenStore.isExpired("openai");
75
+ if (expired) {
76
+ warn(`OpenAI: authenticated (${method}, token expired — will attempt refresh)`);
77
+ }
78
+ else {
79
+ pass(`OpenAI: authenticated (${method})`);
80
+ }
81
+ }
82
+ else {
83
+ fail("OpenAI: not authenticated");
84
+ }
85
+ }
86
+ catch (e) {
87
+ fail(`OpenAI: error checking auth (${formatError(e)})`);
88
+ }
89
+ }
90
+ catch (e) {
91
+ fail(`Could not load auth system (${formatError(e)})`);
92
+ }
93
+ }
94
+ // ── Section: Machines ───────────────────────────────────
95
+ async function checkMachines() {
96
+ heading("Machines");
97
+ try {
98
+ const { ConnectionPool } = await import("../remote/connection-pool.js");
99
+ const { loadMachines } = await import("../remote/config.js");
100
+ const pool = new ConnectionPool();
101
+ const machines = loadMachines();
102
+ // Add configured machines
103
+ for (const machine of machines) {
104
+ pool.addMachine(machine);
105
+ }
106
+ // Always check local first
107
+ const ids = ["local", ...machines.map((m) => m.id)];
108
+ for (const id of ids) {
109
+ if (id === "local") {
110
+ // Local is always connected
111
+ pass("local: connected");
112
+ await checkMachineDetails(pool, id);
113
+ }
114
+ else {
115
+ // Try to connect to remote machines
116
+ try {
117
+ await pool.connect(id);
118
+ const status = pool.getStatus(id);
119
+ if (status.connected) {
120
+ pass(`${id}: connected`);
121
+ await checkMachineDetails(pool, id);
122
+ }
123
+ else {
124
+ fail(`${id}: not connected${status.error ? ` (${status.error})` : ""}`);
125
+ }
126
+ }
127
+ catch (e) {
128
+ fail(`${id}: connection failed (${formatError(e)})`);
129
+ }
130
+ }
131
+ }
132
+ // Cleanup remote connections
133
+ pool.disconnectAll();
134
+ }
135
+ catch (e) {
136
+ fail(`Could not load machine config (${formatError(e)})`);
137
+ }
138
+ }
139
+ async function checkMachineDetails(pool, id) {
140
+ // Detect if the machine is macOS
141
+ const isMac = id === "local"
142
+ ? process.platform === "darwin"
143
+ : await pool.exec(id, "uname -s 2>/dev/null").then((r) => r.exitCode === 0 && r.stdout.trim().toLowerCase() === "darwin", () => false);
144
+ // Run GPU, Python, CUDA checks in parallel
145
+ const gpuCmd = isMac
146
+ ? "system_profiler SPDisplaysDataType 2>/dev/null"
147
+ : "nvidia-smi --query-gpu=name,memory.total,utilization.gpu,temperature.gpu --format=csv,noheader,nounits 2>/dev/null";
148
+ const [gpuResult, pyResult, cudaResult] = await Promise.all([
149
+ pool.exec(id, gpuCmd).catch(() => null),
150
+ pool.exec(id, "python3 --version 2>/dev/null || python --version 2>/dev/null").catch(() => null),
151
+ isMac ? null : pool.exec(id, "nvcc --version 2>/dev/null | grep -i release").catch(() => null),
152
+ ]);
153
+ // GPU info
154
+ let gpuFound = false;
155
+ if (gpuResult && gpuResult.exitCode === 0 && gpuResult.stdout.trim()) {
156
+ if (isMac) {
157
+ gpuFound = parseMacGpu(gpuResult.stdout);
158
+ }
159
+ else {
160
+ gpuFound = parseNvidiaGpu(gpuResult.stdout);
161
+ }
162
+ }
163
+ if (!gpuFound) {
164
+ detail("GPU: none detected");
165
+ }
166
+ // Python version
167
+ if (pyResult && pyResult.exitCode === 0 && pyResult.stdout.trim()) {
168
+ const ver = pyResult.stdout.trim().replace(/^Python\s+/i, "");
169
+ detail(`Python: ${ver}`);
170
+ }
171
+ else {
172
+ detail("Python: not found");
173
+ }
174
+ // CUDA version (only relevant for NVIDIA machines)
175
+ if (cudaResult && cudaResult.exitCode === 0 && cudaResult.stdout.trim()) {
176
+ const match = cudaResult.stdout.match(/release\s+([\d.]+)/i);
177
+ if (match) {
178
+ detail(`CUDA: ${match[1]}`);
179
+ }
180
+ }
181
+ }
182
+ /** Parse nvidia-smi CSV output and print GPU details. Returns true if any GPUs found. */
183
+ function parseNvidiaGpu(stdout) {
184
+ let found = false;
185
+ for (const line of stdout.trim().split("\n")) {
186
+ const parts = line.split(",").map((s) => s.trim());
187
+ if (parts.length >= 4) {
188
+ const [name, memMb, utilPct, tempC] = parts;
189
+ const memGb = (parseInt(memMb, 10) / 1024).toFixed(0);
190
+ detail(`GPU: ${name} (${memGb}GB), util ${utilPct}%, temp ${tempC}\u00B0C`);
191
+ found = true;
192
+ }
193
+ else if (parts.length >= 2) {
194
+ const [name, memMb] = parts;
195
+ const memGb = (parseInt(memMb, 10) / 1024).toFixed(0);
196
+ detail(`GPU: ${name} (${memGb}GB)`);
197
+ found = true;
198
+ }
199
+ }
200
+ return found;
201
+ }
202
+ /** Parse macOS system_profiler SPDisplaysDataType output. Returns true if any GPUs found. */
203
+ function parseMacGpu(stdout) {
204
+ let found = false;
205
+ const blocks = stdout.split(/(?=Chipset Model:)/);
206
+ for (const block of blocks) {
207
+ const nameMatch = block.match(/Chipset Model:\s*(.+)/);
208
+ if (!nameMatch)
209
+ continue;
210
+ const name = nameMatch[1].trim();
211
+ const parts = [name];
212
+ // VRAM (discrete GPUs, Intel Macs with AMD)
213
+ const vramMatch = block.match(/VRAM.*?:\s*(\d+)\s*(MB|GB)/i);
214
+ if (vramMatch) {
215
+ const vram = vramMatch[2].toUpperCase() === "GB"
216
+ ? `${vramMatch[1]}GB`
217
+ : `${(parseInt(vramMatch[1], 10) / 1024).toFixed(0)}GB`;
218
+ parts.push(vram);
219
+ }
220
+ // Metal support
221
+ const metalMatch = block.match(/Metal.*?:\s*(.+)/i);
222
+ if (metalMatch) {
223
+ parts.push(`Metal: ${metalMatch[1].trim()}`);
224
+ }
225
+ detail(`GPU: ${parts.join(", ")}`);
226
+ found = true;
227
+ }
228
+ return found;
229
+ }
230
+ // ── Section: Storage ────────────────────────────────────
231
+ async function checkStorage() {
232
+ heading("Storage");
233
+ try {
234
+ const { HELIOS_DIR } = await import("../paths.js");
235
+ const dbPath = join(HELIOS_DIR, "helios.db");
236
+ // Database check
237
+ if (existsSync(dbPath)) {
238
+ try {
239
+ const stats = statSync(dbPath);
240
+ const sizeStr = formatBytes(stats.size);
241
+ // Count sessions with a lightweight query
242
+ let sessionCount = null;
243
+ try {
244
+ const { getDb } = await import("../store/database.js");
245
+ const db = getDb();
246
+ const agentId = process.env.AGENTHUB_AGENT ?? "";
247
+ const row = db.prepare("SELECT COUNT(*) AS cnt FROM sessions WHERE agent_id = ?").get(agentId);
248
+ sessionCount = row?.cnt ?? null;
249
+ }
250
+ catch {
251
+ // Database may be locked or corrupted
252
+ }
253
+ const sessionInfo = sessionCount !== null ? `, ${sessionCount} session${sessionCount !== 1 ? "s" : ""}` : "";
254
+ pass(`Database: ${dbPath} (${sizeStr}${sessionInfo})`);
255
+ }
256
+ catch (e) {
257
+ warn(`Database: exists at ${dbPath} but could not stat (${formatError(e)})`);
258
+ }
259
+ }
260
+ else {
261
+ warn(`Database: not found at ${dbPath} (will be created on first run)`);
262
+ }
263
+ // Disk space
264
+ try {
265
+ const dfResult = await sh(`df -h "${HELIOS_DIR}" 2>/dev/null | tail -1`);
266
+ if (dfResult.exitCode === 0 && dfResult.stdout.trim()) {
267
+ const parts = dfResult.stdout.trim().split(/\s+/);
268
+ if (parts.length >= 5) {
269
+ const size = parts[1];
270
+ const used = parts[2];
271
+ const avail = parts[3];
272
+ const pct = parts[4];
273
+ pass(`Disk: ${used} used / ${size} total (${pct}), ${avail} available`);
274
+ }
275
+ else {
276
+ warn("Disk: could not parse df output");
277
+ }
278
+ }
279
+ else {
280
+ warn("Disk: could not check disk space");
281
+ }
282
+ }
283
+ catch {
284
+ warn("Disk: could not check disk space");
285
+ }
286
+ }
287
+ catch (e) {
288
+ fail(`Could not load paths (${formatError(e)})`);
289
+ }
290
+ }
291
+ // ── Section: Project ────────────────────────────────────
292
+ async function checkProject() {
293
+ heading("Project");
294
+ try {
295
+ const { findProjectConfigPath, findProjectConfig } = await import("../config/project.js");
296
+ const configPath = findProjectConfigPath();
297
+ if (configPath) {
298
+ const config = findProjectConfig();
299
+ if (config) {
300
+ pass(`helios.json found at ${configPath}`);
301
+ const parts = [];
302
+ if (config.provider)
303
+ parts.push(`Provider: ${config.provider}`);
304
+ if (config.model)
305
+ parts.push(`Model: ${config.model}`);
306
+ if (config.metricNames?.length)
307
+ parts.push(`Metrics: ${config.metricNames.join(", ")}`);
308
+ if (config.defaultMachine)
309
+ parts.push(`Machine: ${config.defaultMachine}`);
310
+ if (parts.length > 0) {
311
+ detail(parts.join(", "));
312
+ }
313
+ if (config.instructions) {
314
+ detail(`Custom instructions: ${config.instructions.length} chars`);
315
+ }
316
+ if (config.notifications) {
317
+ detail(`Notifications: ${config.notifications.channels.length} channel(s) configured`);
318
+ }
319
+ }
320
+ else {
321
+ warn(`helios.json found at ${configPath} but could not parse`);
322
+ }
323
+ }
324
+ else {
325
+ fail("helios.json not found (searched up from cwd)");
326
+ }
327
+ }
328
+ catch (e) {
329
+ fail(`Error checking project config (${formatError(e)})`);
330
+ }
331
+ }
332
+ // ── Section: Dependencies ───────────────────────────────
333
+ async function checkDependencies() {
334
+ heading("Dependencies");
335
+ const deps = ["ssh", "rsync", "git"];
336
+ // Check all dependencies in parallel
337
+ const results = await Promise.all(deps.map(async (dep) => {
338
+ try {
339
+ const result = await sh(`which ${dep} 2>/dev/null`);
340
+ return { dep, found: result.exitCode === 0 && !!result.stdout.trim() };
341
+ }
342
+ catch {
343
+ return { dep, found: false, error: true };
344
+ }
345
+ }));
346
+ for (const { dep, found, error } of results) {
347
+ if (error) {
348
+ fail(`${dep}: could not check`);
349
+ }
350
+ else if (found) {
351
+ pass(`${dep}: available`);
352
+ }
353
+ else {
354
+ fail(`${dep}: not found`);
355
+ }
356
+ }
357
+ }
358
+ // ── Command ─────────────────────────────────────────────
359
+ export const doctor = Command.make("doctor", {}, () => Effect.promise(async () => {
360
+ console.log("\nhelios doctor\n");
361
+ await checkAuth();
362
+ await checkMachines();
363
+ await checkStorage();
364
+ await checkProject();
365
+ await checkDependencies();
366
+ console.log(""); // trailing newline
367
+ }));
368
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Set environment variables from CLI options BEFORE any module imports
3
+ * that read env vars at load time (paths.ts, hub/config.ts, etc.).
4
+ */
5
+ import { Option } from "effect";
6
+ export interface EnvOptions {
7
+ home: Option.Option<string>;
8
+ hubUrl: Option.Option<string>;
9
+ hubKey: Option.Option<string>;
10
+ agent: Option.Option<string>;
11
+ }
12
+ export declare function applyEnv(opts: EnvOptions): void;
13
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/cli/env.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;CAC9B;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAK/C"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Set environment variables from CLI options BEFORE any module imports
3
+ * that read env vars at load time (paths.ts, hub/config.ts, etc.).
4
+ */
5
+ import { Option } from "effect";
6
+ export function applyEnv(opts) {
7
+ if (Option.isSome(opts.home))
8
+ process.env.HELIOS_HOME = opts.home.value;
9
+ if (Option.isSome(opts.hubUrl))
10
+ process.env.AGENTHUB_URL = opts.hubUrl.value;
11
+ if (Option.isSome(opts.hubKey))
12
+ process.env.AGENTHUB_KEY = opts.hubKey.value;
13
+ if (Option.isSome(opts.agent))
14
+ process.env.AGENTHUB_AGENT = opts.agent.value;
15
+ }
16
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/cli/env.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAShC,MAAM,UAAU,QAAQ,CAAC,IAAgB;IACvC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IACxE,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC7E,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC7E,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AAC/E,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `helios export` — export metrics and session data to CSV or JSON.
3
+ */
4
+ import { Option } from "effect";
5
+ import { Command } from "@effect/cli";
6
+ export declare const exportCmd: Command.Command<"export", never, never, {
7
+ readonly sessionId: Option.Option<string>;
8
+ readonly format: "json" | "csv";
9
+ readonly what: "messages" | "metrics" | "sessions";
10
+ }>;
11
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/cli/export.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,OAAO,EAAiB,MAAM,aAAa,CAAC;AA6BrD,eAAO,MAAM,SAAS;;;;EAsBrB,CAAC"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * `helios export` — export metrics and session data to CSV or JSON.
3
+ */
4
+ import { Effect, Option } from "effect";
5
+ import { Command, Args, Options } from "@effect/cli";
6
+ const sessionId = Args.text({ name: "session-id" }).pipe(Args.withDescription("Session to export (default: all)"), Args.optional);
7
+ const format = Options.choice("format", ["csv", "json"]).pipe(Options.withAlias("f"), Options.withDescription("Output format"), Options.withDefault("csv"));
8
+ const what = Options.choice("what", ["metrics", "messages", "sessions"]).pipe(Options.withAlias("w"), Options.withDescription("What to export"), Options.withDefault("metrics"));
9
+ /** Escape a value for safe CSV output. */
10
+ function csvField(v) {
11
+ if (v == null)
12
+ return "";
13
+ const s = String(v);
14
+ if (s.includes(",") || s.includes('"') || s.includes("\n")) {
15
+ return `"${s.replace(/"/g, '""')}"`;
16
+ }
17
+ return s;
18
+ }
19
+ export const exportCmd = Command.make("export", { sessionId, format, what }, ({ sessionId: sessionIdOpt, format, what }) => Effect.promise(async () => {
20
+ const { getDb } = await import("../store/database.js");
21
+ const db = getDb();
22
+ const agentId = process.env.AGENTHUB_AGENT ?? "";
23
+ const targetSession = Option.getOrUndefined(sessionIdOpt);
24
+ switch (what) {
25
+ case "metrics":
26
+ exportMetrics(db, agentId, targetSession, format);
27
+ break;
28
+ case "messages":
29
+ exportMessages(db, agentId, targetSession, format);
30
+ break;
31
+ case "sessions":
32
+ exportSessions(db, agentId, format);
33
+ break;
34
+ }
35
+ }));
36
+ function exportMetrics(db, agentId, sessionId, format) {
37
+ const query = `SELECT task_id, metric_name, value, step, timestamp FROM metrics WHERE agent_id = ? ORDER BY timestamp ASC`;
38
+ const params = [agentId];
39
+ if (sessionId) {
40
+ process.stderr.write("Note: session filter is not supported for metrics export (metrics are keyed by task, not session). Exporting all metrics.\n");
41
+ }
42
+ const rows = db.prepare(query).all(...params);
43
+ if (rows.length === 0) {
44
+ process.stderr.write("No metrics found.\n");
45
+ return;
46
+ }
47
+ if (format === "json") {
48
+ console.log(JSON.stringify(rows, null, 2));
49
+ }
50
+ else {
51
+ console.log("task_id,metric_name,value,step,timestamp");
52
+ for (const r of rows) {
53
+ console.log(`${csvField(r.task_id)},${csvField(r.metric_name)},${r.value},${csvField(r.step)},${r.timestamp}`);
54
+ }
55
+ }
56
+ }
57
+ function exportMessages(db, agentId, sessionId, format) {
58
+ let query;
59
+ let params;
60
+ if (sessionId) {
61
+ query = `SELECT session_id, role, content, timestamp FROM messages WHERE session_id = ? ORDER BY timestamp ASC`;
62
+ params = [sessionId];
63
+ }
64
+ else {
65
+ query = `SELECT m.session_id, m.role, m.content, m.timestamp
66
+ FROM messages m JOIN sessions s ON s.id = m.session_id
67
+ WHERE s.agent_id = ? ORDER BY m.timestamp ASC`;
68
+ params = [agentId];
69
+ }
70
+ const rows = db.prepare(query).all(...params);
71
+ if (rows.length === 0) {
72
+ process.stderr.write("No messages found.\n");
73
+ return;
74
+ }
75
+ if (format === "json") {
76
+ console.log(JSON.stringify(rows, null, 2));
77
+ }
78
+ else {
79
+ console.log("session_id,role,timestamp,content");
80
+ for (const r of rows) {
81
+ // Escape CSV: wrap in quotes, double internal quotes
82
+ console.log(`${csvField(r.session_id)},${csvField(r.role)},${r.timestamp},${csvField(r.content)}`);
83
+ }
84
+ }
85
+ }
86
+ function exportSessions(db, agentId, format) {
87
+ const rows = db.prepare(`SELECT id, provider, model, status, created_at, last_active_at, cost_usd, input_tokens, output_tokens
88
+ FROM sessions WHERE agent_id = ? ORDER BY last_active_at DESC`).all(agentId);
89
+ if (rows.length === 0) {
90
+ process.stderr.write("No sessions found.\n");
91
+ return;
92
+ }
93
+ if (format === "json") {
94
+ console.log(JSON.stringify(rows, null, 2));
95
+ }
96
+ else {
97
+ console.log("id,provider,model,status,created_at,last_active_at,cost_usd,input_tokens,output_tokens");
98
+ for (const r of rows) {
99
+ console.log(`${csvField(r.id)},${csvField(r.provider)},${csvField(r.model)},${csvField(r.status)},${r.created_at},${r.last_active_at},${r.cost_usd},${r.input_tokens},${r.output_tokens}`);
100
+ }
101
+ }
102
+ }
103
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/cli/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Helios CLI — built with @effect/cli.
3
+ *
4
+ * Usage:
5
+ * helios Interactive TUI
6
+ * helios "prompt" TUI with initial prompt
7
+ * helios -p "prompt" Print response and exit
8
+ * helios -c Continue most recent session
9
+ * helios -r <session-id> Resume specific session
10
+ * helios auth login|logout|status Auth management
11
+ * helios sessions List recent sessions
12
+ * helios watch <machine:pid> Stream task output + metrics
13
+ * helios replay <session-id> Replay a past session
14
+ * helios report [session-id] Generate experiment writeup
15
+ * helios init Initialize project config
16
+ * helios doctor Diagnose setup
17
+ * helios search "query" Search session histories
18
+ * helios export [session-id] Export data to CSV/JSON
19
+ * helios kill <machine:pid> Kill a running task
20
+ */
21
+ export {};
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Helios CLI — built with @effect/cli.
3
+ *
4
+ * Usage:
5
+ * helios Interactive TUI
6
+ * helios "prompt" TUI with initial prompt
7
+ * helios -p "prompt" Print response and exit
8
+ * helios -c Continue most recent session
9
+ * helios -r <session-id> Resume specific session
10
+ * helios auth login|logout|status Auth management
11
+ * helios sessions List recent sessions
12
+ * helios watch <machine:pid> Stream task output + metrics
13
+ * helios replay <session-id> Replay a past session
14
+ * helios report [session-id] Generate experiment writeup
15
+ * helios init Initialize project config
16
+ * helios doctor Diagnose setup
17
+ * helios search "query" Search session histories
18
+ * helios export [session-id] Export data to CSV/JSON
19
+ * helios kill <machine:pid> Kill a running task
20
+ */
21
+ import { Command } from "@effect/cli";
22
+ import { NodeContext, NodeRuntime } from "@effect/platform-node";
23
+ import { Effect } from "effect";
24
+ import { VERSION } from "../version.js";
25
+ import { provider, claudeMode, model, continueSession, resumeSession, print, headless, home, hubUrl, hubKey, agent, files, prompt, } from "./options.js";
26
+ import { applyEnv } from "./env.js";
27
+ import { run } from "./run.js";
28
+ import { auth } from "./auth.js";
29
+ import { sessions } from "./sessions.js";
30
+ import { watch } from "./watch.js";
31
+ import { replay } from "./replay.js";
32
+ import { report } from "./report.js";
33
+ import { initCmd } from "./init-cmd.js";
34
+ import { doctor } from "./doctor.js";
35
+ import { search } from "./search.js";
36
+ import { exportCmd } from "./export.js";
37
+ import { kill } from "./kill.js";
38
+ // ── Root command ─────────────────────────────────────────
39
+ const helios = Command.make("helios", {
40
+ provider, claudeMode, model,
41
+ continueSession, resumeSession,
42
+ print, headless,
43
+ home, hubUrl, hubKey, agent,
44
+ files, prompt,
45
+ }, (opts) => Effect.gen(function* () {
46
+ // Set env vars before any runtime imports
47
+ applyEnv({
48
+ home: opts.home,
49
+ hubUrl: opts.hubUrl,
50
+ hubKey: opts.hubKey,
51
+ agent: opts.agent,
52
+ });
53
+ yield* run({
54
+ provider: opts.provider,
55
+ claudeMode: opts.claudeMode,
56
+ model: opts.model,
57
+ continueSession: opts.continueSession,
58
+ resumeSession: opts.resumeSession,
59
+ print: opts.print,
60
+ headless: opts.headless,
61
+ files: opts.files,
62
+ prompt: opts.prompt,
63
+ });
64
+ })).pipe(Command.withSubcommands([auth, sessions, watch, replay, report, initCmd, doctor, search, exportCmd, kill]));
65
+ // ── Launch ───────────────────────────────────────────────
66
+ const cli = Command.run(helios, {
67
+ name: "helios",
68
+ version: `v${VERSION}`,
69
+ });
70
+ cli(process.argv).pipe(Effect.provide(NodeContext.layer), NodeRuntime.runMain);
71
+ //# sourceMappingURL=index.js.map