@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.
- package/dist/acp/entry.d.ts +7 -0
- package/dist/acp/entry.d.ts.map +1 -0
- package/dist/acp/entry.js +46 -0
- package/dist/acp/entry.js.map +1 -0
- package/dist/acp/server.d.ts +57 -0
- package/dist/acp/server.d.ts.map +1 -0
- package/dist/acp/server.js +434 -0
- package/dist/acp/server.js.map +1 -0
- package/dist/acp/transport.d.ts +31 -0
- package/dist/acp/transport.d.ts.map +1 -0
- package/dist/acp/transport.js +116 -0
- package/dist/acp/transport.js.map +1 -0
- package/dist/acp/types.d.ts +213 -0
- package/dist/acp/types.d.ts.map +1 -0
- package/dist/acp/types.js +3 -0
- package/dist/acp/types.js.map +1 -0
- package/dist/app.d.ts +8 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +51 -281
- package/dist/app.js.map +1 -1
- package/dist/bootstrap.d.ts +3 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +26 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/cli/auth.d.ts +20 -0
- package/dist/cli/auth.d.ts.map +1 -0
- package/dist/cli/auth.js +62 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/doctor.d.ts +9 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +368 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/env.d.ts +13 -0
- package/dist/cli/env.d.ts.map +1 -0
- package/dist/cli/env.js +16 -0
- package/dist/cli/env.js.map +1 -0
- package/dist/cli/export.d.ts +11 -0
- package/dist/cli/export.d.ts.map +1 -0
- package/dist/cli/export.js +103 -0
- package/dist/cli/export.js.map +1 -0
- package/dist/cli/index.d.ts +22 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +71 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init-cmd.d.ts +11 -0
- package/dist/cli/init-cmd.d.ts.map +1 -0
- package/dist/cli/init-cmd.js +37 -0
- package/dist/cli/init-cmd.js.map +1 -0
- package/dist/cli/kill.d.ts +8 -0
- package/dist/cli/kill.d.ts.map +1 -0
- package/dist/cli/kill.js +46 -0
- package/dist/cli/kill.js.map +1 -0
- package/dist/cli/options.d.ts +18 -0
- package/dist/cli/options.d.ts.map +1 -0
- package/dist/cli/options.js +24 -0
- package/dist/cli/options.js.map +1 -0
- package/dist/cli/replay.d.ts +9 -0
- package/dist/cli/replay.d.ts.map +1 -0
- package/dist/cli/replay.js +65 -0
- package/dist/cli/replay.js.map +1 -0
- package/dist/cli/report.d.ts +11 -0
- package/dist/cli/report.d.ts.map +1 -0
- package/dist/cli/report.js +70 -0
- package/dist/cli/report.js.map +1 -0
- package/dist/cli/run.d.ts +17 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +120 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/search.d.ts +9 -0
- package/dist/cli/search.d.ts.map +1 -0
- package/dist/cli/search.js +52 -0
- package/dist/cli/search.js.map +1 -0
- package/dist/cli/sessions.d.ts +8 -0
- package/dist/cli/sessions.d.ts.map +1 -0
- package/dist/cli/sessions.js +38 -0
- package/dist/cli/sessions.js.map +1 -0
- package/dist/cli/watch.d.ts +8 -0
- package/dist/cli/watch.d.ts.map +1 -0
- package/dist/cli/watch.js +81 -0
- package/dist/cli/watch.js.map +1 -0
- package/dist/config/project.d.ts +63 -0
- package/dist/config/project.d.ts.map +1 -0
- package/dist/config/project.js +112 -0
- package/dist/config/project.js.map +1 -0
- package/dist/core/orchestrator.d.ts +4 -2
- package/dist/core/orchestrator.d.ts.map +1 -1
- package/dist/core/orchestrator.js +8 -3
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/core/task-poller.d.ts +43 -0
- package/dist/core/task-poller.d.ts.map +1 -0
- package/dist/core/task-poller.js +98 -0
- package/dist/core/task-poller.js.map +1 -0
- package/dist/experiments/branching.d.ts +38 -0
- package/dist/experiments/branching.d.ts.map +1 -0
- package/dist/experiments/branching.js +80 -0
- package/dist/experiments/branching.js.map +1 -0
- package/dist/hub/client.d.ts +70 -0
- package/dist/hub/client.d.ts.map +1 -0
- package/dist/hub/client.js +140 -0
- package/dist/hub/client.js.map +1 -0
- package/dist/hub/config.d.ts +9 -0
- package/dist/hub/config.d.ts.map +1 -0
- package/dist/hub/config.js +38 -0
- package/dist/hub/config.js.map +1 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.js +25 -3
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +44 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +384 -0
- package/dist/init.js.map +1 -0
- package/dist/memory/context-gate.d.ts.map +1 -1
- package/dist/memory/context-gate.js +1 -1
- package/dist/memory/context-gate.js.map +1 -1
- package/dist/memory/experiment-tracker.d.ts.map +1 -1
- package/dist/memory/experiment-tracker.js +2 -6
- package/dist/memory/experiment-tracker.js.map +1 -1
- package/dist/memory/memory-store.d.ts.map +1 -1
- package/dist/memory/memory-store.js +16 -20
- package/dist/memory/memory-store.js.map +1 -1
- package/dist/metrics/collector.d.ts.map +1 -1
- package/dist/metrics/collector.js +7 -7
- package/dist/metrics/collector.js.map +1 -1
- package/dist/metrics/resources.d.ts +44 -0
- package/dist/metrics/resources.d.ts.map +1 -0
- package/dist/metrics/resources.js +382 -0
- package/dist/metrics/resources.js.map +1 -0
- package/dist/metrics/store.d.ts +10 -2
- package/dist/metrics/store.d.ts.map +1 -1
- package/dist/metrics/store.js +91 -27
- package/dist/metrics/store.js.map +1 -1
- package/dist/notifications/index.d.ts +2 -0
- package/dist/notifications/index.d.ts.map +1 -0
- package/dist/notifications/index.js +2 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/notifications/notifier.d.ts +36 -0
- package/dist/notifications/notifier.d.ts.map +1 -0
- package/dist/notifications/notifier.js +102 -0
- package/dist/notifications/notifier.js.map +1 -0
- package/dist/paths.d.ts +3 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +5 -0
- package/dist/paths.js.map +1 -0
- package/dist/providers/claude/provider.d.ts +7 -3
- package/dist/providers/claude/provider.d.ts.map +1 -1
- package/dist/providers/claude/provider.js +48 -8
- package/dist/providers/claude/provider.js.map +1 -1
- package/dist/providers/openai/callback-server.d.ts +6 -1
- package/dist/providers/openai/callback-server.d.ts.map +1 -1
- package/dist/providers/openai/callback-server.js +44 -20
- package/dist/providers/openai/callback-server.js.map +1 -1
- package/dist/providers/openai/oauth.d.ts +4 -0
- package/dist/providers/openai/oauth.d.ts.map +1 -1
- package/dist/providers/openai/oauth.js +34 -14
- package/dist/providers/openai/oauth.js.map +1 -1
- package/dist/providers/openai/provider.d.ts +6 -3
- package/dist/providers/openai/provider.d.ts.map +1 -1
- package/dist/providers/openai/provider.js +35 -9
- package/dist/providers/openai/provider.js.map +1 -1
- package/dist/providers/types.d.ts +9 -1
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js.map +1 -1
- package/dist/remote/config.d.ts.map +1 -1
- package/dist/remote/config.js +4 -8
- package/dist/remote/config.js.map +1 -1
- package/dist/remote/connection-pool.d.ts.map +1 -1
- package/dist/remote/connection-pool.js +9 -5
- package/dist/remote/connection-pool.js.map +1 -1
- package/dist/store/database.d.ts.map +1 -1
- package/dist/store/database.js +2 -2
- package/dist/store/database.js.map +1 -1
- package/dist/store/migrations.d.ts.map +1 -1
- package/dist/store/migrations.js +27 -0
- package/dist/store/migrations.js.map +1 -1
- package/dist/store/preferences.js +2 -2
- package/dist/store/preferences.js.map +1 -1
- package/dist/store/session-store.d.ts +6 -0
- package/dist/store/session-store.d.ts.map +1 -1
- package/dist/store/session-store.js +20 -5
- package/dist/store/session-store.js.map +1 -1
- package/dist/tools/env-snapshot.d.ts +5 -0
- package/dist/tools/env-snapshot.d.ts.map +1 -0
- package/dist/tools/env-snapshot.js +174 -0
- package/dist/tools/env-snapshot.js.map +1 -0
- package/dist/tools/experiment-branch.d.ts +7 -0
- package/dist/tools/experiment-branch.d.ts.map +1 -0
- package/dist/tools/experiment-branch.js +167 -0
- package/dist/tools/experiment-branch.js.map +1 -0
- package/dist/tools/file-ops.d.ts.map +1 -1
- package/dist/tools/file-ops.js +1 -3
- package/dist/tools/file-ops.js.map +1 -1
- package/dist/tools/hub.d.ts +5 -0
- package/dist/tools/hub.d.ts.map +1 -0
- package/dist/tools/hub.js +298 -0
- package/dist/tools/hub.js.map +1 -0
- package/dist/tools/sweep.d.ts +6 -0
- package/dist/tools/sweep.d.ts.map +1 -0
- package/dist/tools/sweep.js +153 -0
- package/dist/tools/sweep.js.map +1 -0
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +2 -1
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/writeup.d.ts +11 -0
- package/dist/tools/writeup.d.ts.map +1 -0
- package/dist/tools/writeup.js +102 -0
- package/dist/tools/writeup.js.map +1 -0
- package/dist/ui/commands.d.ts +36 -0
- package/dist/ui/commands.d.ts.map +1 -1
- package/dist/ui/commands.js +495 -1
- package/dist/ui/commands.js.map +1 -1
- package/dist/ui/components/input-bar.js.map +1 -1
- package/dist/ui/components/overlay-header.d.ts.map +1 -1
- package/dist/ui/components/overlay-header.js.map +1 -1
- package/dist/ui/components/status-bar.js +1 -1
- package/dist/ui/components/status-bar.js.map +1 -1
- package/dist/ui/format.d.ts +4 -0
- package/dist/ui/format.d.ts.map +1 -1
- package/dist/ui/format.js +16 -0
- package/dist/ui/format.js.map +1 -1
- package/dist/ui/layout.d.ts +7 -42
- package/dist/ui/layout.d.ts.map +1 -1
- package/dist/ui/layout.js +71 -543
- package/dist/ui/layout.js.map +1 -1
- package/dist/ui/overlays/metrics-overlay.js.map +1 -1
- package/dist/ui/overlays/task-overlay.d.ts +1 -1
- package/dist/ui/overlays/task-overlay.d.ts.map +1 -1
- package/dist/ui/overlays/task-overlay.js.map +1 -1
- package/dist/ui/panels/conversation.d.ts +1 -1
- package/dist/ui/panels/conversation.d.ts.map +1 -1
- package/dist/ui/panels/conversation.js +1 -2
- package/dist/ui/panels/conversation.js.map +1 -1
- package/dist/ui/panels/metrics-dashboard.d.ts.map +1 -1
- package/dist/ui/panels/metrics-dashboard.js.map +1 -1
- package/dist/ui/panels/sleep-panel.js.map +1 -1
- package/dist/ui/panels/sticky-notes.d.ts.map +1 -1
- package/dist/ui/panels/sticky-notes.js.map +1 -1
- package/dist/ui/panels/task-list.d.ts +4 -2
- package/dist/ui/panels/task-list.d.ts.map +1 -1
- package/dist/ui/panels/task-list.js +41 -9
- package/dist/ui/panels/task-list.js.map +1 -1
- package/dist/ui/theme.d.ts.map +1 -1
- package/dist/ui/theme.js.map +1 -1
- package/dist/ui/types.d.ts +22 -0
- package/dist/ui/types.d.ts.map +1 -0
- package/dist/ui/types.js +2 -0
- package/dist/ui/types.js.map +1 -0
- 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"}
|
package/dist/cli/env.js
ADDED
|
@@ -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
|