@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,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `helios sessions` — list recent sessions.
|
|
3
|
+
*/
|
|
4
|
+
import { Effect } from "effect";
|
|
5
|
+
import { Command, Options } from "@effect/cli";
|
|
6
|
+
const limit = Options.integer("limit").pipe(Options.withAlias("n"), Options.withDescription("Number of sessions to show"), Options.withDefault(20));
|
|
7
|
+
export const sessions = Command.make("sessions", { limit }, ({ limit }) => Effect.promise(async () => {
|
|
8
|
+
const { SessionStore } = await import("../store/session-store.js");
|
|
9
|
+
const store = new SessionStore(process.env.AGENTHUB_AGENT ?? "");
|
|
10
|
+
const summaries = store.listSessionSummaries(limit);
|
|
11
|
+
if (summaries.length === 0) {
|
|
12
|
+
console.log("No sessions found.");
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const pad = (s, n) => s.padEnd(n);
|
|
16
|
+
const formatDate = (ts) => new Date(ts).toLocaleString();
|
|
17
|
+
const formatCost = (c) => c > 0 ? `$${c.toFixed(4)}` : "—";
|
|
18
|
+
console.log(pad("ID", 24) +
|
|
19
|
+
pad("Provider", 10) +
|
|
20
|
+
pad("Msgs", 6) +
|
|
21
|
+
pad("Cost", 10) +
|
|
22
|
+
pad("Last Active", 24) +
|
|
23
|
+
"First Message");
|
|
24
|
+
console.log("─".repeat(110));
|
|
25
|
+
for (const s of summaries) {
|
|
26
|
+
console.log(pad(s.id, 24) +
|
|
27
|
+
pad(s.provider, 10) +
|
|
28
|
+
pad(String(s.messageCount), 6) +
|
|
29
|
+
pad(formatCost(s.costUsd), 10) +
|
|
30
|
+
pad(formatDate(s.lastActiveAt), 24) +
|
|
31
|
+
(s.firstUserMessage ?? "(no messages)").split("\n")[0].slice(0, 60));
|
|
32
|
+
}
|
|
33
|
+
const totalCost = summaries.reduce((sum, s) => sum + s.costUsd, 0);
|
|
34
|
+
if (totalCost > 0) {
|
|
35
|
+
console.log(`\nTotal cost across ${summaries.length} sessions: $${totalCost.toFixed(4)}`);
|
|
36
|
+
}
|
|
37
|
+
}));
|
|
38
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/cli/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `helios watch <machine:pid>` — stream a running task's output + metrics.
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from "@effect/cli";
|
|
5
|
+
export declare const watch: Command.Command<"watch", never, never, {
|
|
6
|
+
readonly target: string;
|
|
7
|
+
}>;
|
|
8
|
+
//# sourceMappingURL=watch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/cli/watch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,OAAO,EAAQ,MAAM,aAAa,CAAC;AAM5C,eAAO,MAAM,KAAK;;EA6FjB,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `helios watch <machine:pid>` — stream a running task's output + metrics.
|
|
3
|
+
*/
|
|
4
|
+
import { Effect } from "effect";
|
|
5
|
+
import { Command, Args } from "@effect/cli";
|
|
6
|
+
const target = Args.text({ name: "machine:pid" }).pipe(Args.withDescription("Task to watch, e.g. 'local:12345'"));
|
|
7
|
+
export const watch = Command.make("watch", { target }, ({ target }) => Effect.promise(async () => {
|
|
8
|
+
const [machineId, pidStr] = target.split(":");
|
|
9
|
+
const pid = parseInt(pidStr, 10);
|
|
10
|
+
if (!machineId || isNaN(pid)) {
|
|
11
|
+
console.error("Usage: helios watch <machine_id:pid>");
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
const { createRuntime } = await import("../init.js");
|
|
15
|
+
const runtime = await createRuntime();
|
|
16
|
+
const { connectionPool, metricStore, executor } = runtime;
|
|
17
|
+
// Find the background process to get its log path
|
|
18
|
+
const proc = executor.getBackgroundProcess(machineId, pid);
|
|
19
|
+
// Check if process is running
|
|
20
|
+
const running = await connectionPool.isProcessRunning(machineId, pid);
|
|
21
|
+
if (!running && !proc) {
|
|
22
|
+
console.error(`Process ${machineId}:${pid} is not running and has no log.`);
|
|
23
|
+
runtime.cleanup();
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
const taskKey = `${machineId}:${pid}`;
|
|
27
|
+
console.log(`Watching ${taskKey}${running ? " (running)" : " (finished)"}...\n`);
|
|
28
|
+
// Track how many lines we've already printed using wc -l
|
|
29
|
+
let printedLines = 0;
|
|
30
|
+
const pollInterval = 2000;
|
|
31
|
+
const tick = async () => {
|
|
32
|
+
try {
|
|
33
|
+
// Get new lines since last poll using tail -n +offset
|
|
34
|
+
if (proc?.logPath) {
|
|
35
|
+
const result = await connectionPool.exec(machineId, `tail -n +${printedLines + 1} ${proc.logPath} 2>/dev/null`);
|
|
36
|
+
const output = result.stdout;
|
|
37
|
+
if (output) {
|
|
38
|
+
const lines = output.split("\n");
|
|
39
|
+
// tail output ends with trailing newline → last element is empty
|
|
40
|
+
const newLines = lines.filter((l, i) => l || i < lines.length - 1);
|
|
41
|
+
for (const line of newLines) {
|
|
42
|
+
process.stdout.write(line + "\n");
|
|
43
|
+
}
|
|
44
|
+
printedLines += newLines.length;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Show latest metrics
|
|
48
|
+
const latest = metricStore.getLatestAll(taskKey);
|
|
49
|
+
const metricEntries = Object.entries(latest);
|
|
50
|
+
if (metricEntries.length > 0) {
|
|
51
|
+
const metricLine = metricEntries
|
|
52
|
+
.map(([name, value]) => `${name}=${typeof value === "number" ? value.toPrecision(4) : value}`)
|
|
53
|
+
.join(" ");
|
|
54
|
+
process.stdout.write(`\x1b[36m[metrics] ${metricLine}\x1b[0m\n`);
|
|
55
|
+
}
|
|
56
|
+
// Check if still running
|
|
57
|
+
const stillRunning = await connectionPool.isProcessRunning(machineId, pid);
|
|
58
|
+
if (!stillRunning) {
|
|
59
|
+
console.log("\nProcess exited.");
|
|
60
|
+
runtime.cleanup();
|
|
61
|
+
process.exit(0);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// Resilient — keep watching even if one poll fails
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
// Initial tick
|
|
69
|
+
await tick();
|
|
70
|
+
// Set up polling
|
|
71
|
+
const timer = setInterval(tick, pollInterval);
|
|
72
|
+
// Clean exit on Ctrl+C
|
|
73
|
+
process.on("SIGINT", () => {
|
|
74
|
+
clearInterval(timer);
|
|
75
|
+
runtime.cleanup();
|
|
76
|
+
process.exit(0);
|
|
77
|
+
});
|
|
78
|
+
// Keep alive
|
|
79
|
+
await new Promise(() => { });
|
|
80
|
+
}));
|
|
81
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/cli/watch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export interface ProjectConfig {
|
|
2
|
+
/** Default provider for this project */
|
|
3
|
+
provider?: "claude" | "openai";
|
|
4
|
+
/** Default model */
|
|
5
|
+
model?: string;
|
|
6
|
+
/** Default machine to run experiments on */
|
|
7
|
+
defaultMachine?: string;
|
|
8
|
+
/** Metric names the agent should always track */
|
|
9
|
+
metricNames?: string[];
|
|
10
|
+
/** Metric regex patterns: name -> regex with one capture group */
|
|
11
|
+
metricPatterns?: Record<string, string>;
|
|
12
|
+
/** Project-specific system prompt addendum -- appended to the base prompt */
|
|
13
|
+
instructions?: string;
|
|
14
|
+
/** Notification config */
|
|
15
|
+
notifications?: {
|
|
16
|
+
channels: Array<{
|
|
17
|
+
type: "desktop";
|
|
18
|
+
} | {
|
|
19
|
+
type: "webhook";
|
|
20
|
+
url: string;
|
|
21
|
+
method?: "GET" | "POST";
|
|
22
|
+
headers?: Record<string, string>;
|
|
23
|
+
} | {
|
|
24
|
+
type: "command";
|
|
25
|
+
command: string;
|
|
26
|
+
}>;
|
|
27
|
+
events?: string[];
|
|
28
|
+
};
|
|
29
|
+
/** Working directory for experiments (relative to project root) */
|
|
30
|
+
experimentDir?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Walk up from `process.cwd()` looking for `helios.json`.
|
|
34
|
+
* Returns the full path to the config file, or null if not found.
|
|
35
|
+
*/
|
|
36
|
+
export declare function findProjectConfigPath(): string | null;
|
|
37
|
+
/**
|
|
38
|
+
* Walk up from `process.cwd()` looking for `helios.json`.
|
|
39
|
+
* If found, parse and return it. If not found or parse fails, return null.
|
|
40
|
+
*/
|
|
41
|
+
export declare function findProjectConfig(): ProjectConfig | null;
|
|
42
|
+
/**
|
|
43
|
+
* Same walk-up logic as `findProjectConfig` but returns the directory
|
|
44
|
+
* containing `helios.json`, or null.
|
|
45
|
+
*/
|
|
46
|
+
export declare function findProjectRoot(): string | null;
|
|
47
|
+
/**
|
|
48
|
+
* Write `helios.json` to the given directory with pretty-printed JSON.
|
|
49
|
+
*/
|
|
50
|
+
export declare function writeProjectConfig(dir: string, config: ProjectConfig): void;
|
|
51
|
+
/**
|
|
52
|
+
* Merge project-level config with global user preferences.
|
|
53
|
+
* Project config takes precedence over global prefs.
|
|
54
|
+
*/
|
|
55
|
+
export declare function mergeWithGlobalPrefs(projectConfig: ProjectConfig | null, globalPrefs: {
|
|
56
|
+
lastProvider?: string;
|
|
57
|
+
claudeAuthMode?: string;
|
|
58
|
+
}): {
|
|
59
|
+
provider?: "claude" | "openai";
|
|
60
|
+
claudeMode?: "cli" | "api";
|
|
61
|
+
model?: string;
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/config/project.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC/B,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,aAAa,CAAC,EAAE;QACd,QAAQ,EAAE,KAAK,CACX;YAAE,IAAI,EAAE,SAAS,CAAA;SAAE,GACnB;YAAE,IAAI,EAAE,SAAS,CAAC;YAAC,GAAG,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;SAAE,GAC3F;YAAE,IAAI,EAAE,SAAS,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CACvC,CAAC;QACF,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA2CD;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,IAAI,CAMrD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,GAAG,IAAI,CAWxD;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAQ/C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAG3E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,aAAa,GAAG,IAAI,EACnC,WAAW,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAAC,UAAU,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAqBhF"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { dirname, join, resolve } from "node:path";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Constants
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
const CONFIG_FILENAME = "helios.json";
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Internal helpers
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
/**
|
|
13
|
+
* Walk up from `startDir` looking for `helios.json`.
|
|
14
|
+
* Returns the full path to the config file, or null if not found.
|
|
15
|
+
* Stops at the filesystem root or the user's home directory.
|
|
16
|
+
*/
|
|
17
|
+
function walkUp(startDir) {
|
|
18
|
+
const home = homedir();
|
|
19
|
+
let dir = resolve(startDir);
|
|
20
|
+
while (true) {
|
|
21
|
+
const candidate = join(dir, CONFIG_FILENAME);
|
|
22
|
+
if (existsSync(candidate)) {
|
|
23
|
+
return candidate;
|
|
24
|
+
}
|
|
25
|
+
// Stop if we've reached home or filesystem root
|
|
26
|
+
if (dir === home)
|
|
27
|
+
break;
|
|
28
|
+
const parent = dirname(dir);
|
|
29
|
+
if (parent === dir)
|
|
30
|
+
break; // filesystem root — dirname('/') === '/'
|
|
31
|
+
dir = parent;
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
// Public API
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
/**
|
|
39
|
+
* Walk up from `process.cwd()` looking for `helios.json`.
|
|
40
|
+
* Returns the full path to the config file, or null if not found.
|
|
41
|
+
*/
|
|
42
|
+
export function findProjectConfigPath() {
|
|
43
|
+
try {
|
|
44
|
+
return walkUp(process.cwd());
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Walk up from `process.cwd()` looking for `helios.json`.
|
|
52
|
+
* If found, parse and return it. If not found or parse fails, return null.
|
|
53
|
+
*/
|
|
54
|
+
export function findProjectConfig() {
|
|
55
|
+
try {
|
|
56
|
+
const configPath = walkUp(process.cwd());
|
|
57
|
+
if (!configPath)
|
|
58
|
+
return null;
|
|
59
|
+
const raw = readFileSync(configPath, "utf-8");
|
|
60
|
+
const parsed = JSON.parse(raw);
|
|
61
|
+
return parsed;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Same walk-up logic as `findProjectConfig` but returns the directory
|
|
69
|
+
* containing `helios.json`, or null.
|
|
70
|
+
*/
|
|
71
|
+
export function findProjectRoot() {
|
|
72
|
+
try {
|
|
73
|
+
const configPath = walkUp(process.cwd());
|
|
74
|
+
if (!configPath)
|
|
75
|
+
return null;
|
|
76
|
+
return dirname(configPath);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Write `helios.json` to the given directory with pretty-printed JSON.
|
|
84
|
+
*/
|
|
85
|
+
export function writeProjectConfig(dir, config) {
|
|
86
|
+
const target = join(resolve(dir), CONFIG_FILENAME);
|
|
87
|
+
writeFileSync(target, JSON.stringify(config, null, 2) + "\n", "utf-8");
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Merge project-level config with global user preferences.
|
|
91
|
+
* Project config takes precedence over global prefs.
|
|
92
|
+
*/
|
|
93
|
+
export function mergeWithGlobalPrefs(projectConfig, globalPrefs) {
|
|
94
|
+
const result = {};
|
|
95
|
+
// Provider — project config wins, then global prefs
|
|
96
|
+
if (projectConfig?.provider) {
|
|
97
|
+
result.provider = projectConfig.provider;
|
|
98
|
+
}
|
|
99
|
+
else if (globalPrefs.lastProvider === "claude" || globalPrefs.lastProvider === "openai") {
|
|
100
|
+
result.provider = globalPrefs.lastProvider;
|
|
101
|
+
}
|
|
102
|
+
// Claude auth mode — derive from global prefs (project config doesn't specify this)
|
|
103
|
+
if (globalPrefs.claudeAuthMode === "cli" || globalPrefs.claudeAuthMode === "api") {
|
|
104
|
+
result.claudeMode = globalPrefs.claudeAuthMode;
|
|
105
|
+
}
|
|
106
|
+
// Model — only project config carries this
|
|
107
|
+
if (projectConfig?.model) {
|
|
108
|
+
result.model = projectConfig.model;
|
|
109
|
+
}
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/config/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ModelProvider, ModelInfo, ToolDefinition, Session, SessionConfig, AgentEvent, ReasoningEffort } from "../providers/types.js";
|
|
1
|
+
import type { ModelProvider, ModelInfo, ToolDefinition, Session, SessionConfig, AgentEvent, ReasoningEffort, Attachment } from "../providers/types.js";
|
|
2
2
|
import { AgentStateMachine } from "./state-machine.js";
|
|
3
3
|
import { SessionStore } from "../store/session-store.js";
|
|
4
4
|
import type { ContextGate } from "../memory/context-gate.js";
|
|
@@ -6,6 +6,8 @@ import type { StickyManager } from "./stickies.js";
|
|
|
6
6
|
export interface OrchestratorConfig {
|
|
7
7
|
defaultProvider: "claude" | "openai";
|
|
8
8
|
systemPrompt: string;
|
|
9
|
+
agentId?: string;
|
|
10
|
+
sessionStore?: SessionStore;
|
|
9
11
|
}
|
|
10
12
|
export declare class Orchestrator {
|
|
11
13
|
private providers;
|
|
@@ -32,7 +34,7 @@ export declare class Orchestrator {
|
|
|
32
34
|
ensureSession(): Promise<Session>;
|
|
33
35
|
startSession(config?: Partial<SessionConfig>): Promise<Session>;
|
|
34
36
|
resumeSession(sessionId: string): Promise<Session>;
|
|
35
|
-
send(message: string): AsyncGenerator<AgentEvent>;
|
|
37
|
+
send(message: string, attachments?: Attachment[]): AsyncGenerator<AgentEvent>;
|
|
36
38
|
interrupt(): void;
|
|
37
39
|
get currentSession(): Session | null;
|
|
38
40
|
get currentProvider(): ModelProvider | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,cAAc,EACd,OAAO,EACP,aAAa,EACb,UAAU,EACV,eAAe,
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,cAAc,EACd,OAAO,EACP,aAAa,EACb,UAAU,EACV,eAAe,EACf,UAAU,EACX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,aAAa,CAAwB;IAC7C,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,cAAc,CAA8B;IACpD,QAAQ,CAAC,YAAY,oBAA2B;IAChD,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;gBAExB,MAAM,EAAE,kBAAkB;IAKtC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAI/C,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAIxC,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IAI5C,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAIvC,IAAI,WAAW,IAAI,WAAW,GAAG,IAAI,CAEpC;IAED,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAI9C,QAAQ,IAAI,cAAc,EAAE;IAI5B,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAK1C,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBxD,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAKjC,YAAY,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IA0B/D,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqBjD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC;IA+DpF,SAAS,IAAI,IAAI;IAMjB,IAAI,cAAc,IAAI,OAAO,GAAG,IAAI,CAEnC;IAED,IAAI,eAAe,IAAI,aAAa,GAAG,IAAI,CAE1C;IAED,IAAI,YAAY,4CAEf;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,YAAY,IAAI,MAAM,GAAG,IAAI,CAEhC;IAEK,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYtC,WAAW,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAWzC,IAAI,eAAe,IAAI,eAAe,GAAG,IAAI,CAE5C;IAEK,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhE,qFAAqF;IACrF,IAAI,eAAe,IAAI,MAAM,CAE5B;YAEc,eAAe;YAwBhB,sBAAsB;CAiBrC"}
|
|
@@ -11,10 +11,11 @@ export class Orchestrator {
|
|
|
11
11
|
_contextGate = null;
|
|
12
12
|
_stickyManager = null;
|
|
13
13
|
stateMachine = new AgentStateMachine();
|
|
14
|
-
sessionStore
|
|
14
|
+
sessionStore;
|
|
15
15
|
config;
|
|
16
16
|
constructor(config) {
|
|
17
17
|
this.config = config;
|
|
18
|
+
this.sessionStore = config.sessionStore ?? new SessionStore(config.agentId ?? "");
|
|
18
19
|
}
|
|
19
20
|
registerProvider(provider) {
|
|
20
21
|
this.providers.set(provider.name, provider);
|
|
@@ -96,7 +97,7 @@ export class Orchestrator {
|
|
|
96
97
|
}
|
|
97
98
|
return session;
|
|
98
99
|
}
|
|
99
|
-
async *send(message) {
|
|
100
|
+
async *send(message, attachments) {
|
|
100
101
|
if (!this.activeProvider) {
|
|
101
102
|
await this.switchProvider(this.config.defaultProvider);
|
|
102
103
|
}
|
|
@@ -112,7 +113,7 @@ export class Orchestrator {
|
|
|
112
113
|
}
|
|
113
114
|
}
|
|
114
115
|
let fullResponse = "";
|
|
115
|
-
for await (const event of this.activeProvider.send(session, augmentedMessage, this.tools)) {
|
|
116
|
+
for await (const event of this.activeProvider.send(session, augmentedMessage, this.tools, attachments)) {
|
|
116
117
|
if (event.type === "text" && event.delta) {
|
|
117
118
|
fullResponse += event.delta;
|
|
118
119
|
}
|
|
@@ -123,6 +124,10 @@ export class Orchestrator {
|
|
|
123
124
|
if (event.usage?.inputTokens) {
|
|
124
125
|
this._lastInputTokens = event.usage.inputTokens;
|
|
125
126
|
}
|
|
127
|
+
// Persist cost to session
|
|
128
|
+
if (event.usage && session) {
|
|
129
|
+
this.sessionStore.addCost(session.id, event.usage.costUsd ?? 0, event.usage.inputTokens ?? 0, event.usage.outputTokens ?? 0);
|
|
130
|
+
}
|
|
126
131
|
}
|
|
127
132
|
yield event;
|
|
128
133
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared task polling loop used by both TUI and ACP modes.
|
|
3
|
+
* Polls background processes, detects completion, collects final metrics,
|
|
4
|
+
* updates experiment tracker, and fires notifications.
|
|
5
|
+
*/
|
|
6
|
+
import type { RemoteExecutor } from "../remote/executor.js";
|
|
7
|
+
import type { ConnectionPool } from "../remote/connection-pool.js";
|
|
8
|
+
import type { MetricCollector } from "../metrics/collector.js";
|
|
9
|
+
import type { MetricStore } from "../metrics/store.js";
|
|
10
|
+
import type { ExperimentTracker } from "../memory/experiment-tracker.js";
|
|
11
|
+
import type { Notifier } from "../notifications/notifier.js";
|
|
12
|
+
import type { BackgroundProcess } from "../remote/types.js";
|
|
13
|
+
import type { MonitorConfig } from "./monitor.js";
|
|
14
|
+
export interface TaskStatus {
|
|
15
|
+
proc: BackgroundProcess;
|
|
16
|
+
running: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface TaskPollResult {
|
|
19
|
+
statuses: TaskStatus[];
|
|
20
|
+
finished: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface TaskPollerDeps {
|
|
23
|
+
executor: RemoteExecutor;
|
|
24
|
+
connectionPool: ConnectionPool;
|
|
25
|
+
metricCollector: MetricCollector;
|
|
26
|
+
metricStore: MetricStore;
|
|
27
|
+
experimentTracker: ExperimentTracker;
|
|
28
|
+
notifier: Notifier | null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Check all background processes and return their statuses.
|
|
32
|
+
*/
|
|
33
|
+
export declare function pollTaskStatuses(executor: RemoteExecutor): Promise<TaskPollResult>;
|
|
34
|
+
/**
|
|
35
|
+
* Handle finished tasks: get exit codes, update experiment tracker,
|
|
36
|
+
* send notifications, and clean up.
|
|
37
|
+
*/
|
|
38
|
+
export declare function handleFinishedTasks(finished: string[], deps: TaskPollerDeps): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Build the monitor tick status message from live task/metric state.
|
|
41
|
+
*/
|
|
42
|
+
export declare function buildMonitorMessage(config: MonitorConfig, executor: RemoteExecutor, metricStore: MetricStore): string;
|
|
43
|
+
//# sourceMappingURL=task-poller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-poller.d.ts","sourceRoot":"","sources":["../../src/core/task-poller.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,iBAAiB,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAmBxF;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAAE,EAClB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CA+Cf;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,WAAW,GACvB,MAAM,CA2BR"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared task polling loop used by both TUI and ACP modes.
|
|
3
|
+
* Polls background processes, detects completion, collects final metrics,
|
|
4
|
+
* updates experiment tracker, and fires notifications.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Check all background processes and return their statuses.
|
|
8
|
+
*/
|
|
9
|
+
export async function pollTaskStatuses(executor) {
|
|
10
|
+
const procs = executor.getBackgroundProcesses();
|
|
11
|
+
const statuses = await Promise.all(procs.map(async (proc) => {
|
|
12
|
+
try {
|
|
13
|
+
const running = await executor.isRunning(proc.machineId, proc.pid);
|
|
14
|
+
return { proc, running };
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return { proc, running: true }; // Transient error — assume still running
|
|
18
|
+
}
|
|
19
|
+
}));
|
|
20
|
+
const finished = [];
|
|
21
|
+
for (const { proc, running } of statuses) {
|
|
22
|
+
if (!running)
|
|
23
|
+
finished.push(`${proc.machineId}:${proc.pid}`);
|
|
24
|
+
}
|
|
25
|
+
return { statuses, finished };
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Handle finished tasks: get exit codes, update experiment tracker,
|
|
29
|
+
* send notifications, and clean up.
|
|
30
|
+
*/
|
|
31
|
+
export async function handleFinishedTasks(finished, deps) {
|
|
32
|
+
const { executor, connectionPool, metricCollector, metricStore, experimentTracker, notifier } = deps;
|
|
33
|
+
// Collect final metrics before cleanup
|
|
34
|
+
if (finished.length > 0) {
|
|
35
|
+
await metricCollector.collectAll().catch(() => { });
|
|
36
|
+
}
|
|
37
|
+
await Promise.all(finished.map(async (key) => {
|
|
38
|
+
const [machineId, pidStr] = key.split(":");
|
|
39
|
+
const pid = parseInt(pidStr, 10);
|
|
40
|
+
let exitCode = 0;
|
|
41
|
+
try {
|
|
42
|
+
// Read exit code from the .exit file written by the launch wrapper
|
|
43
|
+
const proc = executor.getBackgroundProcesses().find((p) => p.machineId === machineId && p.pid === pid);
|
|
44
|
+
if (proc?.logPath) {
|
|
45
|
+
const result = await connectionPool.exec(machineId, `cat ${proc.logPath}.exit 2>/dev/null`);
|
|
46
|
+
const parsed = parseInt(result.stdout.trim(), 10);
|
|
47
|
+
if (!isNaN(parsed))
|
|
48
|
+
exitCode = parsed;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch { /* default to 0 */ }
|
|
52
|
+
const metrics = metricStore.getLatestAll(key);
|
|
53
|
+
experimentTracker.updateExperiment(machineId, pid, exitCode, Object.keys(metrics).length > 0 ? metrics : undefined);
|
|
54
|
+
if (notifier) {
|
|
55
|
+
const event = exitCode === 0 ? "task_complete" : "task_failed";
|
|
56
|
+
notifier.notifyAll({
|
|
57
|
+
event,
|
|
58
|
+
title: exitCode === 0 ? "Task completed" : "Task failed",
|
|
59
|
+
body: `${key} exited with code ${exitCode}`,
|
|
60
|
+
machineId,
|
|
61
|
+
pid,
|
|
62
|
+
metrics: Object.keys(metrics).length > 0 ? metrics : undefined,
|
|
63
|
+
timestamp: Date.now(),
|
|
64
|
+
}).catch(() => { });
|
|
65
|
+
}
|
|
66
|
+
metricCollector.removeSource(key);
|
|
67
|
+
executor.removeBackgroundProcess(key);
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Build the monitor tick status message from live task/metric state.
|
|
72
|
+
*/
|
|
73
|
+
export function buildMonitorMessage(config, executor, metricStore) {
|
|
74
|
+
const elapsedMin = Math.round((Date.now() - config.startedAt) / 60_000);
|
|
75
|
+
const intervalMin = Math.round(config.intervalMs / 60_000);
|
|
76
|
+
const parts = [
|
|
77
|
+
`[Monitor check — ${elapsedMin}m elapsed, interval ${intervalMin}m]`,
|
|
78
|
+
`Goal: ${config.goal}`,
|
|
79
|
+
];
|
|
80
|
+
const procs = executor.getBackgroundProcesses();
|
|
81
|
+
if (procs.length > 0) {
|
|
82
|
+
parts.push("Tasks:");
|
|
83
|
+
for (const p of procs) {
|
|
84
|
+
const short = p.command.length > 50 ? p.command.slice(0, 47) + "..." : p.command;
|
|
85
|
+
parts.push(` ◆ ${p.machineId}:${p.pid} running — ${short}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const latestMetrics = metricStore.getLatestPerMetric();
|
|
89
|
+
const metricNames = Object.keys(latestMetrics);
|
|
90
|
+
if (metricNames.length > 0) {
|
|
91
|
+
parts.push("Metrics:");
|
|
92
|
+
for (const name of metricNames) {
|
|
93
|
+
parts.push(` ${name}: ${latestMetrics[name]}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return parts.join("\n");
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=task-poller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-poller.js","sourceRoot":"","sources":["../../src/core/task-poller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Experiment branching — auto-create git branches per experiment.
|
|
3
|
+
* Creates a branch when an experiment starts, commits results when it finishes.
|
|
4
|
+
*/
|
|
5
|
+
import type { RemoteExecutor } from "../remote/executor.js";
|
|
6
|
+
export interface ExperimentBranch {
|
|
7
|
+
machineId: string;
|
|
8
|
+
repoPath: string;
|
|
9
|
+
branchName: string;
|
|
10
|
+
originalBranch: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class ExperimentBrancher {
|
|
13
|
+
private executor;
|
|
14
|
+
private branches;
|
|
15
|
+
constructor(executor: RemoteExecutor);
|
|
16
|
+
/**
|
|
17
|
+
* Create a new git branch for an experiment.
|
|
18
|
+
* Returns the branch name, or null if not in a git repo.
|
|
19
|
+
*/
|
|
20
|
+
createBranch(machineId: string, repoPath: string, experimentName: string): Promise<string | null>;
|
|
21
|
+
/**
|
|
22
|
+
* Commit current changes on an experiment branch with a message.
|
|
23
|
+
*/
|
|
24
|
+
commitResults(machineId: string, repoPath: string, branchName: string, message: string): Promise<boolean>;
|
|
25
|
+
/**
|
|
26
|
+
* Switch back to the original branch after an experiment.
|
|
27
|
+
*/
|
|
28
|
+
returnToOriginal(machineId: string, branchName: string): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Get diff between two experiment branches.
|
|
31
|
+
*/
|
|
32
|
+
diff(machineId: string, repoPath: string, branchA: string, branchB: string): Promise<string>;
|
|
33
|
+
/**
|
|
34
|
+
* List all helios experiment branches in a repo.
|
|
35
|
+
*/
|
|
36
|
+
listBranches(machineId: string, repoPath: string): Promise<string[]>;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=branching.d.ts.map
|