@snoglobe/helios 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +222 -0
- package/dist/app.d.ts +9 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +289 -0
- package/dist/app.js.map +1 -0
- package/dist/core/agent-loop.d.ts +16 -0
- package/dist/core/agent-loop.d.ts.map +1 -0
- package/dist/core/agent-loop.js +64 -0
- package/dist/core/agent-loop.js.map +1 -0
- package/dist/core/monitor.d.ts +15 -0
- package/dist/core/monitor.d.ts.map +1 -0
- package/dist/core/monitor.js +40 -0
- package/dist/core/monitor.js.map +1 -0
- package/dist/core/orchestrator.d.ts +51 -0
- package/dist/core/orchestrator.d.ts.map +1 -0
- package/dist/core/orchestrator.js +235 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/state-machine.d.ts +19 -0
- package/dist/core/state-machine.d.ts.map +1 -0
- package/dist/core/state-machine.js +42 -0
- package/dist/core/state-machine.js.map +1 -0
- package/dist/core/stickies.d.ts +20 -0
- package/dist/core/stickies.d.ts.map +1 -0
- package/dist/core/stickies.js +41 -0
- package/dist/core/stickies.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/context-gate.d.ts +49 -0
- package/dist/memory/context-gate.d.ts.map +1 -0
- package/dist/memory/context-gate.js +109 -0
- package/dist/memory/context-gate.js.map +1 -0
- package/dist/memory/experiment-tracker.d.ts +21 -0
- package/dist/memory/experiment-tracker.d.ts.map +1 -0
- package/dist/memory/experiment-tracker.js +117 -0
- package/dist/memory/experiment-tracker.js.map +1 -0
- package/dist/memory/memory-store.d.ts +37 -0
- package/dist/memory/memory-store.d.ts.map +1 -0
- package/dist/memory/memory-store.js +150 -0
- package/dist/memory/memory-store.js.map +1 -0
- package/dist/memory/token-estimator.d.ts +7 -0
- package/dist/memory/token-estimator.d.ts.map +1 -0
- package/dist/memory/token-estimator.js +30 -0
- package/dist/memory/token-estimator.js.map +1 -0
- package/dist/metrics/analyzer.d.ts +15 -0
- package/dist/metrics/analyzer.d.ts.map +1 -0
- package/dist/metrics/analyzer.js +67 -0
- package/dist/metrics/analyzer.js.map +1 -0
- package/dist/metrics/collector.d.ts +23 -0
- package/dist/metrics/collector.d.ts.map +1 -0
- package/dist/metrics/collector.js +60 -0
- package/dist/metrics/collector.js.map +1 -0
- package/dist/metrics/parser.d.ts +21 -0
- package/dist/metrics/parser.d.ts.map +1 -0
- package/dist/metrics/parser.js +43 -0
- package/dist/metrics/parser.js.map +1 -0
- package/dist/metrics/parsers/csv.d.ts +8 -0
- package/dist/metrics/parsers/csv.d.ts.map +1 -0
- package/dist/metrics/parsers/csv.js +37 -0
- package/dist/metrics/parsers/csv.js.map +1 -0
- package/dist/metrics/parsers/json.d.ts +8 -0
- package/dist/metrics/parsers/json.d.ts.map +1 -0
- package/dist/metrics/parsers/json.js +42 -0
- package/dist/metrics/parsers/json.js.map +1 -0
- package/dist/metrics/parsers/stdout.d.ts +3 -0
- package/dist/metrics/parsers/stdout.d.ts.map +1 -0
- package/dist/metrics/parsers/stdout.js +79 -0
- package/dist/metrics/parsers/stdout.js.map +1 -0
- package/dist/metrics/parsers/tensorboard.d.ts +16 -0
- package/dist/metrics/parsers/tensorboard.d.ts.map +1 -0
- package/dist/metrics/parsers/tensorboard.js +22 -0
- package/dist/metrics/parsers/tensorboard.js.map +1 -0
- package/dist/metrics/store.d.ts +33 -0
- package/dist/metrics/store.d.ts.map +1 -0
- package/dist/metrics/store.js +141 -0
- package/dist/metrics/store.js.map +1 -0
- package/dist/providers/auth/auth-manager.d.ts +22 -0
- package/dist/providers/auth/auth-manager.d.ts.map +1 -0
- package/dist/providers/auth/auth-manager.js +77 -0
- package/dist/providers/auth/auth-manager.js.map +1 -0
- package/dist/providers/auth/token-store.d.ts +14 -0
- package/dist/providers/auth/token-store.d.ts.map +1 -0
- package/dist/providers/auth/token-store.js +55 -0
- package/dist/providers/auth/token-store.js.map +1 -0
- package/dist/providers/claude/provider.d.ts +46 -0
- package/dist/providers/claude/provider.d.ts.map +1 -0
- package/dist/providers/claude/provider.js +606 -0
- package/dist/providers/claude/provider.js.map +1 -0
- package/dist/providers/openai/callback-server.d.ts +11 -0
- package/dist/providers/openai/callback-server.d.ts.map +1 -0
- package/dist/providers/openai/callback-server.js +58 -0
- package/dist/providers/openai/callback-server.js.map +1 -0
- package/dist/providers/openai/oauth.d.ts +16 -0
- package/dist/providers/openai/oauth.d.ts.map +1 -0
- package/dist/providers/openai/oauth.js +110 -0
- package/dist/providers/openai/oauth.js.map +1 -0
- package/dist/providers/openai/provider.d.ts +29 -0
- package/dist/providers/openai/provider.d.ts.map +1 -0
- package/dist/providers/openai/provider.js +363 -0
- package/dist/providers/openai/provider.js.map +1 -0
- package/dist/providers/retry.d.ts +6 -0
- package/dist/providers/retry.d.ts.map +1 -0
- package/dist/providers/retry.js +13 -0
- package/dist/providers/retry.js.map +1 -0
- package/dist/providers/sse.d.ts +6 -0
- package/dist/providers/sse.d.ts.map +1 -0
- package/dist/providers/sse.js +35 -0
- package/dist/providers/sse.js.map +1 -0
- package/dist/providers/types.d.ts +102 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +11 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/remote/config.d.ts +14 -0
- package/dist/remote/config.d.ts.map +1 -0
- package/dist/remote/config.js +81 -0
- package/dist/remote/config.js.map +1 -0
- package/dist/remote/connection-pool.d.ts +26 -0
- package/dist/remote/connection-pool.d.ts.map +1 -0
- package/dist/remote/connection-pool.js +268 -0
- package/dist/remote/connection-pool.js.map +1 -0
- package/dist/remote/executor.d.ts +23 -0
- package/dist/remote/executor.d.ts.map +1 -0
- package/dist/remote/executor.js +53 -0
- package/dist/remote/executor.js.map +1 -0
- package/dist/remote/file-sync.d.ts +19 -0
- package/dist/remote/file-sync.d.ts.map +1 -0
- package/dist/remote/file-sync.js +44 -0
- package/dist/remote/file-sync.js.map +1 -0
- package/dist/remote/types.d.ts +33 -0
- package/dist/remote/types.d.ts.map +1 -0
- package/dist/remote/types.js +2 -0
- package/dist/remote/types.js.map +1 -0
- package/dist/scheduler/sleep-manager.d.ts +33 -0
- package/dist/scheduler/sleep-manager.d.ts.map +1 -0
- package/dist/scheduler/sleep-manager.js +132 -0
- package/dist/scheduler/sleep-manager.js.map +1 -0
- package/dist/scheduler/ssh-batcher.d.ts +23 -0
- package/dist/scheduler/ssh-batcher.d.ts.map +1 -0
- package/dist/scheduler/ssh-batcher.js +98 -0
- package/dist/scheduler/ssh-batcher.js.map +1 -0
- package/dist/scheduler/state-store.d.ts +8 -0
- package/dist/scheduler/state-store.d.ts.map +1 -0
- package/dist/scheduler/state-store.js +48 -0
- package/dist/scheduler/state-store.js.map +1 -0
- package/dist/scheduler/trigger-scheduler.d.ts +24 -0
- package/dist/scheduler/trigger-scheduler.d.ts.map +1 -0
- package/dist/scheduler/trigger-scheduler.js +142 -0
- package/dist/scheduler/trigger-scheduler.js.map +1 -0
- package/dist/scheduler/triggers/file.d.ts +4 -0
- package/dist/scheduler/triggers/file.d.ts.map +1 -0
- package/dist/scheduler/triggers/file.js +39 -0
- package/dist/scheduler/triggers/file.js.map +1 -0
- package/dist/scheduler/triggers/metric.d.ts +4 -0
- package/dist/scheduler/triggers/metric.d.ts.map +1 -0
- package/dist/scheduler/triggers/metric.js +74 -0
- package/dist/scheduler/triggers/metric.js.map +1 -0
- package/dist/scheduler/triggers/process-exit.d.ts +4 -0
- package/dist/scheduler/triggers/process-exit.d.ts.map +1 -0
- package/dist/scheduler/triggers/process-exit.js +13 -0
- package/dist/scheduler/triggers/process-exit.js.map +1 -0
- package/dist/scheduler/triggers/resource.d.ts +4 -0
- package/dist/scheduler/triggers/resource.d.ts.map +1 -0
- package/dist/scheduler/triggers/resource.js +54 -0
- package/dist/scheduler/triggers/resource.js.map +1 -0
- package/dist/scheduler/triggers/timer.d.ts +3 -0
- package/dist/scheduler/triggers/timer.d.ts.map +1 -0
- package/dist/scheduler/triggers/timer.js +4 -0
- package/dist/scheduler/triggers/timer.js.map +1 -0
- package/dist/scheduler/triggers/types.d.ts +95 -0
- package/dist/scheduler/triggers/types.d.ts.map +1 -0
- package/dist/scheduler/triggers/types.js +11 -0
- package/dist/scheduler/triggers/types.js.map +1 -0
- package/dist/store/database.d.ts +5 -0
- package/dist/store/database.d.ts.map +1 -0
- package/dist/store/database.js +29 -0
- package/dist/store/database.js.map +1 -0
- package/dist/store/migrations.d.ts +3 -0
- package/dist/store/migrations.d.ts.map +1 -0
- package/dist/store/migrations.js +124 -0
- package/dist/store/migrations.js.map +1 -0
- package/dist/store/preferences.d.ts +7 -0
- package/dist/store/preferences.d.ts.map +1 -0
- package/dist/store/preferences.js +26 -0
- package/dist/store/preferences.js.map +1 -0
- package/dist/store/session-store.d.ts +29 -0
- package/dist/store/session-store.d.ts.map +1 -0
- package/dist/store/session-store.js +103 -0
- package/dist/store/session-store.js.map +1 -0
- package/dist/tools/clear-metrics.d.ts +5 -0
- package/dist/tools/clear-metrics.d.ts.map +1 -0
- package/dist/tools/clear-metrics.js +27 -0
- package/dist/tools/clear-metrics.js.map +1 -0
- package/dist/tools/compare-runs.d.ts +4 -0
- package/dist/tools/compare-runs.d.ts.map +1 -0
- package/dist/tools/compare-runs.js +77 -0
- package/dist/tools/compare-runs.js.map +1 -0
- package/dist/tools/consult.d.ts +3 -0
- package/dist/tools/consult.d.ts.map +1 -0
- package/dist/tools/consult.js +62 -0
- package/dist/tools/consult.js.map +1 -0
- package/dist/tools/file-ops.d.ts +6 -0
- package/dist/tools/file-ops.d.ts.map +1 -0
- package/dist/tools/file-ops.js +158 -0
- package/dist/tools/file-ops.js.map +1 -0
- package/dist/tools/kill-task.d.ts +6 -0
- package/dist/tools/kill-task.d.ts.map +1 -0
- package/dist/tools/kill-task.js +55 -0
- package/dist/tools/kill-task.js.map +1 -0
- package/dist/tools/list-machines.d.ts +4 -0
- package/dist/tools/list-machines.d.ts.map +1 -0
- package/dist/tools/list-machines.js +24 -0
- package/dist/tools/list-machines.js.map +1 -0
- package/dist/tools/memory-tools.d.ts +8 -0
- package/dist/tools/memory-tools.d.ts.map +1 -0
- package/dist/tools/memory-tools.js +122 -0
- package/dist/tools/memory-tools.js.map +1 -0
- package/dist/tools/metrics-query.d.ts +4 -0
- package/dist/tools/metrics-query.d.ts.map +1 -0
- package/dist/tools/metrics-query.js +69 -0
- package/dist/tools/metrics-query.js.map +1 -0
- package/dist/tools/monitor.d.ts +5 -0
- package/dist/tools/monitor.d.ts.map +1 -0
- package/dist/tools/monitor.js +64 -0
- package/dist/tools/monitor.js.map +1 -0
- package/dist/tools/remote-exec.d.ts +6 -0
- package/dist/tools/remote-exec.d.ts.map +1 -0
- package/dist/tools/remote-exec.js +98 -0
- package/dist/tools/remote-exec.js.map +1 -0
- package/dist/tools/remote-sync.d.ts +5 -0
- package/dist/tools/remote-sync.d.ts.map +1 -0
- package/dist/tools/remote-sync.js +57 -0
- package/dist/tools/remote-sync.js.map +1 -0
- package/dist/tools/show-metrics.d.ts +4 -0
- package/dist/tools/show-metrics.d.ts.map +1 -0
- package/dist/tools/show-metrics.js +69 -0
- package/dist/tools/show-metrics.js.map +1 -0
- package/dist/tools/sleep.d.ts +4 -0
- package/dist/tools/sleep.d.ts.map +1 -0
- package/dist/tools/sleep.js +116 -0
- package/dist/tools/sleep.js.map +1 -0
- package/dist/tools/task-output.d.ts +5 -0
- package/dist/tools/task-output.d.ts.map +1 -0
- package/dist/tools/task-output.js +51 -0
- package/dist/tools/task-output.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +3 -0
- package/dist/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/web-fetch.js +112 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/ui/commands.d.ts +7 -0
- package/dist/ui/commands.d.ts.map +1 -0
- package/dist/ui/commands.js +21 -0
- package/dist/ui/commands.js.map +1 -0
- package/dist/ui/components/gradient-edge.d.ts +7 -0
- package/dist/ui/components/gradient-edge.d.ts.map +1 -0
- package/dist/ui/components/gradient-edge.js +33 -0
- package/dist/ui/components/gradient-edge.js.map +1 -0
- package/dist/ui/components/input-bar.d.ts +8 -0
- package/dist/ui/components/input-bar.d.ts.map +1 -0
- package/dist/ui/components/input-bar.js +139 -0
- package/dist/ui/components/input-bar.js.map +1 -0
- package/dist/ui/components/key-hint-rule.d.ts +2 -0
- package/dist/ui/components/key-hint-rule.d.ts.map +1 -0
- package/dist/ui/components/key-hint-rule.js +19 -0
- package/dist/ui/components/key-hint-rule.js.map +1 -0
- package/dist/ui/components/overlay-header.d.ts +6 -0
- package/dist/ui/components/overlay-header.d.ts.map +1 -0
- package/dist/ui/components/overlay-header.js +10 -0
- package/dist/ui/components/overlay-header.js.map +1 -0
- package/dist/ui/components/status-bar.d.ts +11 -0
- package/dist/ui/components/status-bar.d.ts.map +1 -0
- package/dist/ui/components/status-bar.js +55 -0
- package/dist/ui/components/status-bar.js.map +1 -0
- package/dist/ui/format.d.ts +12 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/format.js +36 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/layout.d.ts +48 -0
- package/dist/ui/layout.d.ts.map +1 -0
- package/dist/ui/layout.js +857 -0
- package/dist/ui/layout.js.map +1 -0
- package/dist/ui/markdown.d.ts +7 -0
- package/dist/ui/markdown.d.ts.map +1 -0
- package/dist/ui/markdown.js +67 -0
- package/dist/ui/markdown.js.map +1 -0
- package/dist/ui/mouse-filter.d.ts +21 -0
- package/dist/ui/mouse-filter.d.ts.map +1 -0
- package/dist/ui/mouse-filter.js +66 -0
- package/dist/ui/mouse-filter.js.map +1 -0
- package/dist/ui/overlays/metrics-overlay.d.ts +11 -0
- package/dist/ui/overlays/metrics-overlay.d.ts.map +1 -0
- package/dist/ui/overlays/metrics-overlay.js +86 -0
- package/dist/ui/overlays/metrics-overlay.js.map +1 -0
- package/dist/ui/overlays/task-overlay.d.ts +12 -0
- package/dist/ui/overlays/task-overlay.d.ts.map +1 -0
- package/dist/ui/overlays/task-overlay.js +77 -0
- package/dist/ui/overlays/task-overlay.js.map +1 -0
- package/dist/ui/panels/conversation.d.ts +8 -0
- package/dist/ui/panels/conversation.d.ts.map +1 -0
- package/dist/ui/panels/conversation.js +216 -0
- package/dist/ui/panels/conversation.js.map +1 -0
- package/dist/ui/panels/metrics-dashboard.d.ts +8 -0
- package/dist/ui/panels/metrics-dashboard.d.ts.map +1 -0
- package/dist/ui/panels/metrics-dashboard.js +56 -0
- package/dist/ui/panels/metrics-dashboard.js.map +1 -0
- package/dist/ui/panels/sleep-panel.d.ts +7 -0
- package/dist/ui/panels/sleep-panel.d.ts.map +1 -0
- package/dist/ui/panels/sleep-panel.js +48 -0
- package/dist/ui/panels/sleep-panel.js.map +1 -0
- package/dist/ui/panels/sticky-notes.d.ts +8 -0
- package/dist/ui/panels/sticky-notes.d.ts.map +1 -0
- package/dist/ui/panels/sticky-notes.js +49 -0
- package/dist/ui/panels/sticky-notes.js.map +1 -0
- package/dist/ui/panels/task-list.d.ts +8 -0
- package/dist/ui/panels/task-list.d.ts.map +1 -0
- package/dist/ui/panels/task-list.js +39 -0
- package/dist/ui/panels/task-list.js.map +1 -0
- package/dist/ui/theme.d.ts +25 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +50 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/version.d.ts +9 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +62 -0
- package/dist/version.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
export function createReadFileTool(pool) {
|
|
2
|
+
return {
|
|
3
|
+
name: "read_file",
|
|
4
|
+
description: "Read a file's contents. Use this to inspect training scripts, configs, logs, or any text file.",
|
|
5
|
+
parameters: {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
machine_id: {
|
|
9
|
+
type: "string",
|
|
10
|
+
description: 'Machine to read from (use "local" for this machine)',
|
|
11
|
+
},
|
|
12
|
+
path: {
|
|
13
|
+
type: "string",
|
|
14
|
+
description: "Absolute path to the file",
|
|
15
|
+
},
|
|
16
|
+
offset: {
|
|
17
|
+
type: "number",
|
|
18
|
+
description: "Line number to start from (1-indexed, default: 1)",
|
|
19
|
+
},
|
|
20
|
+
limit: {
|
|
21
|
+
type: "number",
|
|
22
|
+
description: "Max lines to return (default: 200)",
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
required: ["machine_id", "path"],
|
|
26
|
+
},
|
|
27
|
+
execute: async (args) => {
|
|
28
|
+
const machineId = args.machine_id;
|
|
29
|
+
const path = args.path;
|
|
30
|
+
const offset = args.offset ?? 1;
|
|
31
|
+
const limit = args.limit ?? 200;
|
|
32
|
+
const end = offset + limit - 1;
|
|
33
|
+
const result = await pool.exec(machineId, `sed -n '${offset},${end}p' ${shellQuote(path)}`);
|
|
34
|
+
if (result.exitCode !== 0) {
|
|
35
|
+
return JSON.stringify({ error: result.stderr.trim() || `exit code ${result.exitCode}` });
|
|
36
|
+
}
|
|
37
|
+
// Count total lines for context
|
|
38
|
+
const wcResult = await pool.exec(machineId, `wc -l < ${shellQuote(path)}`);
|
|
39
|
+
const totalLines = parseInt(wcResult.stdout.trim(), 10) || 0;
|
|
40
|
+
return JSON.stringify({
|
|
41
|
+
content: result.stdout,
|
|
42
|
+
lines: { from: offset, to: Math.min(end, totalLines), total: totalLines },
|
|
43
|
+
});
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function createWriteFileTool(pool) {
|
|
48
|
+
return {
|
|
49
|
+
name: "write_file",
|
|
50
|
+
description: "Create or overwrite a file. Use this to write training scripts, configs, or data files.",
|
|
51
|
+
parameters: {
|
|
52
|
+
type: "object",
|
|
53
|
+
properties: {
|
|
54
|
+
machine_id: {
|
|
55
|
+
type: "string",
|
|
56
|
+
description: 'Machine to write to (use "local" for this machine)',
|
|
57
|
+
},
|
|
58
|
+
path: {
|
|
59
|
+
type: "string",
|
|
60
|
+
description: "Absolute path for the file",
|
|
61
|
+
},
|
|
62
|
+
content: {
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "Full file content to write",
|
|
65
|
+
},
|
|
66
|
+
append: {
|
|
67
|
+
type: "boolean",
|
|
68
|
+
description: "Append instead of overwrite (default: false)",
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
required: ["machine_id", "path", "content"],
|
|
72
|
+
},
|
|
73
|
+
execute: async (args) => {
|
|
74
|
+
const machineId = args.machine_id;
|
|
75
|
+
const path = args.path;
|
|
76
|
+
const content = args.content;
|
|
77
|
+
const append = args.append ?? false;
|
|
78
|
+
// Ensure parent directory exists
|
|
79
|
+
const dir = path.replace(/\/[^/]+$/, "");
|
|
80
|
+
if (dir && dir !== path) {
|
|
81
|
+
await pool.exec(machineId, `mkdir -p ${shellQuote(dir)}`);
|
|
82
|
+
}
|
|
83
|
+
const op = append ? ">>" : ">";
|
|
84
|
+
// Use heredoc to handle multi-line content safely
|
|
85
|
+
// Heredoc implicitly adds a trailing newline, so strip one from content to avoid doubling
|
|
86
|
+
const body = content.endsWith("\n") ? content.slice(0, -1) : content;
|
|
87
|
+
const heredocTag = "_HELIOS_EOF_" + Math.random().toString(36).slice(2, 8);
|
|
88
|
+
const result = await pool.exec(machineId, `cat ${op} ${shellQuote(path)} <<'${heredocTag}'\n${body}\n${heredocTag}`);
|
|
89
|
+
if (result.exitCode !== 0) {
|
|
90
|
+
return JSON.stringify({ error: result.stderr.trim() || `exit code ${result.exitCode}` });
|
|
91
|
+
}
|
|
92
|
+
const wcResult = await pool.exec(machineId, `wc -l < ${shellQuote(path)}`);
|
|
93
|
+
const totalLines = parseInt(wcResult.stdout.trim(), 10) || 0;
|
|
94
|
+
return JSON.stringify({ written: path, lines: totalLines });
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
export function createPatchFileTool(pool) {
|
|
99
|
+
return {
|
|
100
|
+
name: "patch_file",
|
|
101
|
+
description: "Edit a file by replacing a specific string with new content. Read the file first to see the exact text to match.",
|
|
102
|
+
parameters: {
|
|
103
|
+
type: "object",
|
|
104
|
+
properties: {
|
|
105
|
+
machine_id: {
|
|
106
|
+
type: "string",
|
|
107
|
+
description: 'Machine where the file lives (use "local" for this machine)',
|
|
108
|
+
},
|
|
109
|
+
path: {
|
|
110
|
+
type: "string",
|
|
111
|
+
description: "Absolute path to the file",
|
|
112
|
+
},
|
|
113
|
+
old_string: {
|
|
114
|
+
type: "string",
|
|
115
|
+
description: "Exact text to find and replace (must appear exactly once in the file)",
|
|
116
|
+
},
|
|
117
|
+
new_string: {
|
|
118
|
+
type: "string",
|
|
119
|
+
description: "Replacement text",
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
required: ["machine_id", "path", "old_string", "new_string"],
|
|
123
|
+
},
|
|
124
|
+
execute: async (args) => {
|
|
125
|
+
const machineId = args.machine_id;
|
|
126
|
+
const path = args.path;
|
|
127
|
+
const oldStr = args.old_string;
|
|
128
|
+
const newStr = args.new_string;
|
|
129
|
+
// Read current file
|
|
130
|
+
const readResult = await pool.exec(machineId, `cat ${shellQuote(path)}`);
|
|
131
|
+
if (readResult.exitCode !== 0) {
|
|
132
|
+
return JSON.stringify({ error: readResult.stderr.trim() || "Failed to read file" });
|
|
133
|
+
}
|
|
134
|
+
const content = readResult.stdout;
|
|
135
|
+
const count = content.split(oldStr).length - 1;
|
|
136
|
+
if (count === 0) {
|
|
137
|
+
return JSON.stringify({ error: "old_string not found in file" });
|
|
138
|
+
}
|
|
139
|
+
if (count > 1) {
|
|
140
|
+
return JSON.stringify({ error: `old_string found ${count} times — must be unique. Include more surrounding context.` });
|
|
141
|
+
}
|
|
142
|
+
const patched = content.replace(oldStr, newStr);
|
|
143
|
+
// Write back using heredoc
|
|
144
|
+
// Strip trailing newline since heredoc adds one implicitly
|
|
145
|
+
const body = patched.endsWith("\n") ? patched.slice(0, -1) : patched;
|
|
146
|
+
const heredocTag = "_HELIOS_EOF_" + Math.random().toString(36).slice(2, 8);
|
|
147
|
+
const writeResult = await pool.exec(machineId, `cat > ${shellQuote(path)} <<'${heredocTag}'\n${body}\n${heredocTag}`);
|
|
148
|
+
if (writeResult.exitCode !== 0) {
|
|
149
|
+
return JSON.stringify({ error: writeResult.stderr.trim() || "Failed to write file" });
|
|
150
|
+
}
|
|
151
|
+
return JSON.stringify({ patched: path });
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
function shellQuote(s) {
|
|
156
|
+
return "'" + s.replace(/'/g, "'\\''") + "'";
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=file-ops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-ops.js","sourceRoot":"","sources":["../../src/tools/file-ops.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ToolDefinition } from "../providers/types.js";
|
|
2
|
+
import type { RemoteExecutor } from "../remote/executor.js";
|
|
3
|
+
import type { ConnectionPool } from "../remote/connection-pool.js";
|
|
4
|
+
import type { MetricCollector } from "../metrics/collector.js";
|
|
5
|
+
export declare function createKillTaskTool(executor: RemoteExecutor, pool: ConnectionPool, metricCollector?: MetricCollector): ToolDefinition;
|
|
6
|
+
//# sourceMappingURL=kill-task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kill-task.d.ts","sourceRoot":"","sources":["../../src/tools/kill-task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,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;AAE/D,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,cAAc,EACpB,eAAe,CAAC,EAAE,eAAe,GAChC,cAAc,CA4DhB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export function createKillTaskTool(executor, pool, metricCollector) {
|
|
2
|
+
return {
|
|
3
|
+
name: "kill_task",
|
|
4
|
+
description: "Kill a running background process. Use this to abort diverging training, stuck processes, or experiments you want to discard.",
|
|
5
|
+
parameters: {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
machine_id: {
|
|
9
|
+
type: "string",
|
|
10
|
+
description: 'Machine the process is running on (e.g. "local")',
|
|
11
|
+
},
|
|
12
|
+
pid: {
|
|
13
|
+
type: "number",
|
|
14
|
+
description: "PID of the process to kill",
|
|
15
|
+
},
|
|
16
|
+
signal: {
|
|
17
|
+
type: "string",
|
|
18
|
+
description: "Signal to send (default: TERM). Use KILL for unresponsive processes.",
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
required: ["machine_id", "pid"],
|
|
22
|
+
},
|
|
23
|
+
execute: async (args) => {
|
|
24
|
+
const machineId = args.machine_id;
|
|
25
|
+
const pid = args.pid;
|
|
26
|
+
const signal = args.signal ?? "TERM";
|
|
27
|
+
const taskKey = `${machineId}:${pid}`;
|
|
28
|
+
const running = await executor.isRunning(machineId, pid);
|
|
29
|
+
if (!running) {
|
|
30
|
+
// Final metric collection before cleanup
|
|
31
|
+
if (metricCollector) {
|
|
32
|
+
await metricCollector.collectAll().catch(() => { });
|
|
33
|
+
metricCollector.removeSource(taskKey);
|
|
34
|
+
}
|
|
35
|
+
executor.removeBackgroundProcess(taskKey);
|
|
36
|
+
return JSON.stringify({ status: "already_exited", pid });
|
|
37
|
+
}
|
|
38
|
+
const result = await pool.exec(machineId, `kill -${signal} ${pid}`);
|
|
39
|
+
if (result.exitCode !== 0) {
|
|
40
|
+
return JSON.stringify({
|
|
41
|
+
error: result.stderr.trim() || `kill failed with exit code ${result.exitCode}`,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
// Brief wait for the process to flush output, then final collection
|
|
45
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
46
|
+
if (metricCollector) {
|
|
47
|
+
await metricCollector.collectAll().catch(() => { });
|
|
48
|
+
metricCollector.removeSource(taskKey);
|
|
49
|
+
}
|
|
50
|
+
executor.removeBackgroundProcess(taskKey);
|
|
51
|
+
return JSON.stringify({ status: "killed", pid, signal });
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=kill-task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kill-task.js","sourceRoot":"","sources":["../../src/tools/kill-task.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,kBAAkB,CAChC,QAAwB,EACxB,IAAoB,EACpB,eAAiC;IAEjC,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,WAAW,EACT,+HAA+H;QACjI,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kDAAkD;iBAChE;gBACD,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,4BAA4B;iBAC1C;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,sEAAsE;iBACpF;aACF;YACD,QAAQ,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC;SAChC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACtB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAoB,CAAC;YAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAa,CAAC;YAC/B,MAAM,MAAM,GAAI,IAAI,CAAC,MAAiB,IAAI,MAAM,CAAC;YAEjD,MAAM,OAAO,GAAG,GAAG,SAAS,IAAI,GAAG,EAAE,CAAC;YAEtC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YACzD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,yCAAyC;gBACzC,IAAI,eAAe,EAAE,CAAC;oBACpB,MAAM,eAAe,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;oBACnD,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACxC,CAAC;gBACD,QAAQ,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;gBAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;YAC3D,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;YAEpE,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,IAAI,CAAC,SAAS,CAAC;oBACpB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,8BAA8B,MAAM,CAAC,QAAQ,EAAE;iBAC/E,CAAC,CAAC;YACL,CAAC;YAED,oEAAoE;YACpE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAC7C,IAAI,eAAe,EAAE,CAAC;gBACpB,MAAM,eAAe,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACnD,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACxC,CAAC;YAED,QAAQ,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3D,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-machines.d.ts","sourceRoot":"","sources":["../../src/tools/list-machines.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,cAAc,GACnB,cAAc,CAuBhB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export function createListMachinesTool(pool) {
|
|
2
|
+
return {
|
|
3
|
+
name: "list_machines",
|
|
4
|
+
description: "List all configured remote machines and their connection status.",
|
|
5
|
+
parameters: {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {},
|
|
8
|
+
},
|
|
9
|
+
execute: async () => {
|
|
10
|
+
const statuses = pool.getAllStatuses();
|
|
11
|
+
return JSON.stringify({
|
|
12
|
+
machines: statuses.map((s) => ({
|
|
13
|
+
id: s.machineId,
|
|
14
|
+
connected: s.connected,
|
|
15
|
+
last_connected: s.lastConnectedAt
|
|
16
|
+
? new Date(s.lastConnectedAt).toISOString()
|
|
17
|
+
: null,
|
|
18
|
+
error: s.error ?? null,
|
|
19
|
+
})),
|
|
20
|
+
});
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=list-machines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-machines.js","sourceRoot":"","sources":["../../src/tools/list-machines.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,sBAAsB,CACpC,IAAoB;IAEpB,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,kEAAkE;QACpE,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;QACD,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC,SAAS,CAAC;gBACpB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC7B,EAAE,EAAE,CAAC,CAAC,SAAS;oBACf,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,cAAc,EAAE,CAAC,CAAC,eAAe;wBAC/B,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE;wBAC3C,CAAC,CAAC,IAAI;oBACR,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI;iBACvB,CAAC,CAAC;aACJ,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ToolDefinition } from "../providers/types.js";
|
|
2
|
+
import type { MemoryStore } from "../memory/memory-store.js";
|
|
3
|
+
export declare function createMemoryLsTool(memory: MemoryStore): ToolDefinition;
|
|
4
|
+
export declare function createMemoryReadTool(memory: MemoryStore): ToolDefinition;
|
|
5
|
+
export declare function createMemoryWriteTool(memory: MemoryStore): ToolDefinition;
|
|
6
|
+
export declare function createMemoryRmTool(memory: MemoryStore): ToolDefinition;
|
|
7
|
+
export declare function createMemoryTools(memory: MemoryStore): ToolDefinition[];
|
|
8
|
+
//# sourceMappingURL=memory-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-tools.d.ts","sourceRoot":"","sources":["../../src/tools/memory-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc,CAgCtE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc,CAgCxE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc,CAkCzE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc,CAqBtE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc,EAAE,CAOvE"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
export function createMemoryLsTool(memory) {
|
|
2
|
+
return {
|
|
3
|
+
name: "memory_ls",
|
|
4
|
+
description: "List children of a memory directory. Shows path + gist for each child. " +
|
|
5
|
+
"This is the index — scan it to see what you have stored and decide what to read.",
|
|
6
|
+
parameters: {
|
|
7
|
+
type: "object",
|
|
8
|
+
properties: {
|
|
9
|
+
path: {
|
|
10
|
+
type: "string",
|
|
11
|
+
description: 'Directory path to list (default: "/")',
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
execute: async (args) => {
|
|
16
|
+
const path = args.path ?? "/";
|
|
17
|
+
const nodes = memory.ls(path);
|
|
18
|
+
if (nodes.length === 0) {
|
|
19
|
+
return JSON.stringify({ path, children: [], note: "Empty directory" });
|
|
20
|
+
}
|
|
21
|
+
const children = nodes.map((n) => ({
|
|
22
|
+
path: n.path,
|
|
23
|
+
gist: n.gist,
|
|
24
|
+
type: n.isDir ? "dir" : "file",
|
|
25
|
+
}));
|
|
26
|
+
return JSON.stringify({ path, children });
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function createMemoryReadTool(memory) {
|
|
31
|
+
return {
|
|
32
|
+
name: "memory_read",
|
|
33
|
+
description: "Read the full content of a memory node. Use memory_ls first to find what you need, then read specific nodes.",
|
|
34
|
+
parameters: {
|
|
35
|
+
type: "object",
|
|
36
|
+
properties: {
|
|
37
|
+
path: {
|
|
38
|
+
type: "string",
|
|
39
|
+
description: "Path of the node to read",
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
required: ["path"],
|
|
43
|
+
},
|
|
44
|
+
execute: async (args) => {
|
|
45
|
+
const path = args.path;
|
|
46
|
+
const node = memory.read(path);
|
|
47
|
+
if (!node) {
|
|
48
|
+
return JSON.stringify({ error: `Not found: ${path}` });
|
|
49
|
+
}
|
|
50
|
+
return JSON.stringify({
|
|
51
|
+
path: node.path,
|
|
52
|
+
gist: node.gist,
|
|
53
|
+
content: node.content,
|
|
54
|
+
type: node.isDir ? "dir" : "file",
|
|
55
|
+
updated_at: node.updatedAt,
|
|
56
|
+
});
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export function createMemoryWriteTool(memory) {
|
|
61
|
+
return {
|
|
62
|
+
name: "memory_write",
|
|
63
|
+
description: "Write or update a memory node. Parent directories are auto-created. " +
|
|
64
|
+
"Use this to store observations, hypotheses, decisions, experiment notes — anything worth remembering. " +
|
|
65
|
+
"The gist should be a short label (what this IS), the content is the full detail.",
|
|
66
|
+
parameters: {
|
|
67
|
+
type: "object",
|
|
68
|
+
properties: {
|
|
69
|
+
path: {
|
|
70
|
+
type: "string",
|
|
71
|
+
description: 'Path for the node (e.g. "/observations/lr-warmup-helps")',
|
|
72
|
+
},
|
|
73
|
+
gist: {
|
|
74
|
+
type: "string",
|
|
75
|
+
description: "Short label/summary (the key in the KV pair, shown in tree listings)",
|
|
76
|
+
},
|
|
77
|
+
content: {
|
|
78
|
+
type: "string",
|
|
79
|
+
description: "Full content (the value). Omit to create a directory.",
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
required: ["path", "gist"],
|
|
83
|
+
},
|
|
84
|
+
execute: async (args) => {
|
|
85
|
+
const path = args.path;
|
|
86
|
+
const gist = args.gist;
|
|
87
|
+
const content = args.content;
|
|
88
|
+
memory.write(path, gist, content);
|
|
89
|
+
return JSON.stringify({ ok: true, path, gist });
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export function createMemoryRmTool(memory) {
|
|
94
|
+
return {
|
|
95
|
+
name: "memory_rm",
|
|
96
|
+
description: "Remove a memory node (and all children if it's a directory). Use this to clean up discarded experiments or outdated observations.",
|
|
97
|
+
parameters: {
|
|
98
|
+
type: "object",
|
|
99
|
+
properties: {
|
|
100
|
+
path: {
|
|
101
|
+
type: "string",
|
|
102
|
+
description: "Path to remove",
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
required: ["path"],
|
|
106
|
+
},
|
|
107
|
+
execute: async (args) => {
|
|
108
|
+
const path = args.path;
|
|
109
|
+
const removed = memory.rm(path);
|
|
110
|
+
return JSON.stringify({ ok: true, path, removed_count: removed });
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
export function createMemoryTools(memory) {
|
|
115
|
+
return [
|
|
116
|
+
createMemoryLsTool(memory),
|
|
117
|
+
createMemoryReadTool(memory),
|
|
118
|
+
createMemoryWriteTool(memory),
|
|
119
|
+
createMemoryRmTool(memory),
|
|
120
|
+
];
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=memory-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-tools.js","sourceRoot":"","sources":["../../src/tools/memory-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics-query.d.ts","sourceRoot":"","sources":["../../src/tools/metrics-query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,WAAW,GACjB,cAAc,CA0EhB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { analyzeMetric } from "../metrics/analyzer.js";
|
|
2
|
+
export function createMetricsQueryTool(store) {
|
|
3
|
+
return {
|
|
4
|
+
name: "metrics_query",
|
|
5
|
+
description: "Query collected training metrics. Can get latest values, time series, or trend analysis.",
|
|
6
|
+
parameters: {
|
|
7
|
+
type: "object",
|
|
8
|
+
properties: {
|
|
9
|
+
task_id: {
|
|
10
|
+
type: "string",
|
|
11
|
+
description: "ID of the task to query metrics for",
|
|
12
|
+
},
|
|
13
|
+
metric_name: {
|
|
14
|
+
type: "string",
|
|
15
|
+
description: "Name of the metric (e.g., 'loss', 'accuracy'). Omit to list all available metrics.",
|
|
16
|
+
},
|
|
17
|
+
mode: {
|
|
18
|
+
type: "string",
|
|
19
|
+
enum: ["latest", "series", "analyze", "list"],
|
|
20
|
+
description: "Query mode: 'latest' for most recent value, 'series' for time series, 'analyze' for trend analysis, 'list' for available metric names",
|
|
21
|
+
},
|
|
22
|
+
limit: {
|
|
23
|
+
type: "number",
|
|
24
|
+
description: "Max number of data points for series mode",
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
required: ["task_id"],
|
|
28
|
+
},
|
|
29
|
+
execute: async (args) => {
|
|
30
|
+
const taskId = args.task_id;
|
|
31
|
+
const metricName = args.metric_name;
|
|
32
|
+
const mode = args.mode ?? "latest";
|
|
33
|
+
const limit = args.limit ?? 100;
|
|
34
|
+
if (mode === "list" || !metricName) {
|
|
35
|
+
const names = store.getMetricNames(taskId);
|
|
36
|
+
return JSON.stringify({ metrics: names });
|
|
37
|
+
}
|
|
38
|
+
switch (mode) {
|
|
39
|
+
case "latest": {
|
|
40
|
+
const point = store.getLatest(taskId, metricName);
|
|
41
|
+
return JSON.stringify(point ?? { error: "No data" });
|
|
42
|
+
}
|
|
43
|
+
case "series": {
|
|
44
|
+
const points = store.getSeries(taskId, metricName, limit);
|
|
45
|
+
return JSON.stringify({
|
|
46
|
+
metric: metricName,
|
|
47
|
+
count: points.length,
|
|
48
|
+
values: points.map((p) => ({
|
|
49
|
+
value: p.value,
|
|
50
|
+
step: p.step,
|
|
51
|
+
timestamp: p.timestamp,
|
|
52
|
+
})),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
case "analyze": {
|
|
56
|
+
const points = store.getSeries(taskId, metricName, 100);
|
|
57
|
+
const analysis = analyzeMetric(points);
|
|
58
|
+
return JSON.stringify({
|
|
59
|
+
metric: metricName,
|
|
60
|
+
...analysis,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
default:
|
|
64
|
+
return JSON.stringify({ error: `Unknown mode: ${mode}` });
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=metrics-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics-query.js","sourceRoot":"","sources":["../../src/tools/metrics-query.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,MAAM,UAAU,sBAAsB,CACpC,KAAkB;IAElB,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,0FAA0F;QAC5F,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qCAAqC;iBACnD;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,oFAAoF;iBACvF;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC;oBAC7C,WAAW,EACT,uIAAuI;iBAC1I;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2CAA2C;iBACzD;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACtB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAiB,CAAC;YACtC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAiC,CAAC;YAC1D,MAAM,IAAI,GAAI,IAAI,CAAC,IAAe,IAAI,QAAQ,CAAC;YAC/C,MAAM,KAAK,GAAI,IAAI,CAAC,KAAgB,IAAI,GAAG,CAAC;YAE5C,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;gBACnC,MAAM,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;gBAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5C,CAAC;YAED,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;oBAClD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;gBACvD,CAAC;gBAED,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;oBAC1D,OAAO,IAAI,CAAC,SAAS,CAAC;wBACpB,MAAM,EAAE,UAAU;wBAClB,KAAK,EAAE,MAAM,CAAC,MAAM;wBACpB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BACzB,KAAK,EAAE,CAAC,CAAC,KAAK;4BACd,IAAI,EAAE,CAAC,CAAC,IAAI;4BACZ,SAAS,EAAE,CAAC,CAAC,SAAS;yBACvB,CAAC,CAAC;qBACJ,CAAC,CAAC;gBACL,CAAC;gBAED,KAAK,SAAS,CAAC,CAAC,CAAC;oBACf,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;oBACxD,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;oBACvC,OAAO,IAAI,CAAC,SAAS,CAAC;wBACpB,MAAM,EAAE,UAAU;wBAClB,GAAG,QAAQ;qBACZ,CAAC,CAAC;gBACL,CAAC;gBAED;oBACE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ToolDefinition } from "../providers/types.js";
|
|
2
|
+
import type { MonitorManager } from "../core/monitor.js";
|
|
3
|
+
export declare function createStartMonitorTool(monitor: MonitorManager): ToolDefinition;
|
|
4
|
+
export declare function createStopMonitorTool(monitor: MonitorManager): ToolDefinition;
|
|
5
|
+
//# sourceMappingURL=monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../src/tools/monitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,cAAc,GACtB,cAAc,CAgDhB;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,cAAc,GACtB,cAAc,CAiBhB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export function createStartMonitorTool(monitor) {
|
|
2
|
+
return {
|
|
3
|
+
name: "start_monitor",
|
|
4
|
+
description: `Start a monitoring loop that periodically re-invokes you with a status update. Use this after launching a background task so you get called back to check on progress without needing to sleep/wake repeatedly.
|
|
5
|
+
|
|
6
|
+
When the monitor fires, you receive a message with:
|
|
7
|
+
- Elapsed time since monitoring started
|
|
8
|
+
- Current task statuses (running/completed/failed)
|
|
9
|
+
- Latest metric values
|
|
10
|
+
- Your original goal
|
|
11
|
+
|
|
12
|
+
You can then take actions (check output, adjust params, launch new runs) and your response ends. The monitor will call you again at the next interval.
|
|
13
|
+
|
|
14
|
+
Calling start_monitor again replaces the current monitor — use this to adjust the interval as conditions change. Match the interval to what you're waiting for: 1-2m for short runs, 5-10m for long ones. If nothing is changing, increase the interval to save context.
|
|
15
|
+
|
|
16
|
+
Call stop_monitor when the goal is complete or you no longer need periodic checks.
|
|
17
|
+
|
|
18
|
+
IMPORTANT: After calling start_monitor, you can continue doing other things in the same turn (unlike sleep). The monitor runs in the background.`,
|
|
19
|
+
parameters: {
|
|
20
|
+
type: "object",
|
|
21
|
+
properties: {
|
|
22
|
+
interval_minutes: {
|
|
23
|
+
type: "number",
|
|
24
|
+
description: "How often to check (in minutes). Default: 2",
|
|
25
|
+
},
|
|
26
|
+
goal: {
|
|
27
|
+
type: "string",
|
|
28
|
+
description: "What you are monitoring for. This is included in each status update to remind you of the objective.",
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
required: ["goal"],
|
|
32
|
+
},
|
|
33
|
+
execute: async (args) => {
|
|
34
|
+
const intervalMin = args.interval_minutes ?? 2;
|
|
35
|
+
const goal = args.goal;
|
|
36
|
+
const intervalMs = intervalMin * 60 * 1000;
|
|
37
|
+
const config = monitor.start(intervalMs, goal);
|
|
38
|
+
return JSON.stringify({
|
|
39
|
+
status: "monitoring",
|
|
40
|
+
interval_minutes: intervalMin,
|
|
41
|
+
goal,
|
|
42
|
+
started_at: new Date(config.startedAt).toISOString(),
|
|
43
|
+
});
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function createStopMonitorTool(monitor) {
|
|
48
|
+
return {
|
|
49
|
+
name: "stop_monitor",
|
|
50
|
+
description: "Stop the active monitoring loop. Call this when the objective is complete or you no longer need periodic check-ins.",
|
|
51
|
+
parameters: {
|
|
52
|
+
type: "object",
|
|
53
|
+
properties: {},
|
|
54
|
+
},
|
|
55
|
+
execute: async () => {
|
|
56
|
+
if (!monitor.isActive) {
|
|
57
|
+
return JSON.stringify({ status: "no_active_monitor" });
|
|
58
|
+
}
|
|
59
|
+
monitor.stop();
|
|
60
|
+
return JSON.stringify({ status: "stopped" });
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/tools/monitor.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,sBAAsB,CACpC,OAAuB;IAEvB,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE;;;;;;;;;;;;;;iJAcgI;QAC7I,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,gBAAgB,EAAE;oBAChB,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,6CAA6C;iBAC3D;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,qGAAqG;iBACxG;aACF;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACtB,MAAM,WAAW,GAAI,IAAI,CAAC,gBAA2B,IAAI,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAc,CAAC;YACjC,MAAM,UAAU,GAAG,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC;YAE3C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAE/C,OAAO,IAAI,CAAC,SAAS,CAAC;gBACpB,MAAM,EAAE,YAAY;gBACpB,gBAAgB,EAAE,WAAW;gBAC7B,IAAI;gBACJ,UAAU,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;aACrD,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,OAAuB;IAEvB,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,WAAW,EACT,qHAAqH;QACvH,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;QACD,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC;YACzD,CAAC;YACD,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/C,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ToolDefinition } from "../providers/types.js";
|
|
2
|
+
import type { RemoteExecutor } from "../remote/executor.js";
|
|
3
|
+
import type { MetricCollector } from "../metrics/collector.js";
|
|
4
|
+
export declare function createRemoteExecTool(executor: RemoteExecutor): ToolDefinition;
|
|
5
|
+
export declare function createRemoteExecBackgroundTool(executor: RemoteExecutor, metricCollector?: MetricCollector): ToolDefinition;
|
|
6
|
+
//# sourceMappingURL=remote-exec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-exec.d.ts","sourceRoot":"","sources":["../../src/tools/remote-exec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,cAAc,GACvB,cAAc,CAsChB;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,cAAc,EACxB,eAAe,CAAC,EAAE,eAAe,GAChC,cAAc,CAuEhB"}
|