@visorcraft/idlehands 1.1.17 → 1.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/agent/formatting.js +30 -13
- package/dist/agent/formatting.js.map +1 -1
- package/dist/agent/review-artifact.js +12 -8
- package/dist/agent/review-artifact.js.map +1 -1
- package/dist/agent/tool-calls.js +57 -20
- package/dist/agent/tool-calls.js.map +1 -1
- package/dist/agent/tool-loop-detection.js +310 -0
- package/dist/agent/tool-loop-detection.js.map +1 -0
- package/dist/agent/tool-loop-guard.js +235 -0
- package/dist/agent/tool-loop-guard.js.map +1 -0
- package/dist/agent.js +442 -141
- package/dist/agent.js.map +1 -1
- package/dist/anton/controller.js +46 -30
- package/dist/anton/controller.js.map +1 -1
- package/dist/anton/lock.js +5 -1
- package/dist/anton/lock.js.map +1 -1
- package/dist/anton/parser.js +18 -19
- package/dist/anton/parser.js.map +1 -1
- package/dist/anton/prompt.js +42 -11
- package/dist/anton/prompt.js.map +1 -1
- package/dist/anton/reporter.js.map +1 -1
- package/dist/anton/session.js.map +1 -1
- package/dist/anton/verifier.js +3 -5
- package/dist/anton/verifier.js.map +1 -1
- package/dist/bench/compare.js +53 -20
- package/dist/bench/compare.js.map +1 -1
- package/dist/bench/openclaw.js +4 -4
- package/dist/bench/openclaw.js.map +1 -1
- package/dist/bench/report.js +11 -3
- package/dist/bench/report.js.map +1 -1
- package/dist/bench/runner.js +20 -14
- package/dist/bench/runner.js.map +1 -1
- package/dist/bot/commands.js +65 -31
- package/dist/bot/commands.js.map +1 -1
- package/dist/bot/confirm-discord.js +32 -9
- package/dist/bot/confirm-discord.js.map +1 -1
- package/dist/bot/confirm-telegram.js +26 -10
- package/dist/bot/confirm-telegram.js.map +1 -1
- package/dist/bot/dir-guard.js +18 -3
- package/dist/bot/dir-guard.js.map +1 -1
- package/dist/bot/discord-routing.js +28 -4
- package/dist/bot/discord-routing.js.map +1 -1
- package/dist/bot/discord-streaming.js +3 -3
- package/dist/bot/discord-streaming.js.map +1 -1
- package/dist/bot/discord.js +82 -37
- package/dist/bot/discord.js.map +1 -1
- package/dist/bot/escalation.js +124 -0
- package/dist/bot/escalation.js.map +1 -0
- package/dist/bot/format.js +2 -5
- package/dist/bot/format.js.map +1 -1
- package/dist/bot/session-manager.js +17 -6
- package/dist/bot/session-manager.js.map +1 -1
- package/dist/bot/telegram.js +88 -28
- package/dist/bot/telegram.js.map +1 -1
- package/dist/cli/agent-turn.js +10 -4
- package/dist/cli/agent-turn.js.map +1 -1
- package/dist/cli/args.js +51 -9
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/bot.js +19 -9
- package/dist/cli/bot.js.map +1 -1
- package/dist/cli/build-repl-context.js +60 -26
- package/dist/cli/build-repl-context.js.map +1 -1
- package/dist/cli/command-registry.js.map +1 -1
- package/dist/cli/commands/anton.js +5 -3
- package/dist/cli/commands/anton.js.map +1 -1
- package/dist/cli/commands/editing.js +27 -12
- package/dist/cli/commands/editing.js.map +1 -1
- package/dist/cli/commands/model.js +16 -7
- package/dist/cli/commands/model.js.map +1 -1
- package/dist/cli/commands/project.js +52 -17
- package/dist/cli/commands/project.js.map +1 -1
- package/dist/cli/commands/runtime.js +1 -1
- package/dist/cli/commands/runtime.js.map +1 -1
- package/dist/cli/commands/secrets.js +279 -0
- package/dist/cli/commands/secrets.js.map +1 -0
- package/dist/cli/commands/session.js +49 -1
- package/dist/cli/commands/session.js.map +1 -1
- package/dist/cli/commands/tools.js +3 -1
- package/dist/cli/commands/tools.js.map +1 -1
- package/dist/cli/commands/trifecta.js +1 -1
- package/dist/cli/commands/trifecta.js.map +1 -1
- package/dist/cli/commands/tui.js.map +1 -1
- package/dist/cli/init.js +50 -16
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/input.js +25 -7
- package/dist/cli/input.js.map +1 -1
- package/dist/cli/oneshot.js +31 -19
- package/dist/cli/oneshot.js.map +1 -1
- package/dist/cli/repl-dispatch.js +10 -6
- package/dist/cli/repl-dispatch.js.map +1 -1
- package/dist/cli/runtime-cmds.js +110 -46
- package/dist/cli/runtime-cmds.js.map +1 -1
- package/dist/cli/service.js +3 -3
- package/dist/cli/service.js.map +1 -1
- package/dist/cli/session-state.js +12 -5
- package/dist/cli/session-state.js.map +1 -1
- package/dist/cli/setup.js +86 -33
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/shell.js +4 -4
- package/dist/cli/shell.js.map +1 -1
- package/dist/cli/status.js +56 -12
- package/dist/cli/status.js.map +1 -1
- package/dist/client.js +40 -21
- package/dist/client.js.map +1 -1
- package/dist/commands.js +1 -1
- package/dist/commands.js.map +1 -1
- package/dist/config.js +171 -15
- package/dist/config.js.map +1 -1
- package/dist/confirm/auto.js.map +1 -1
- package/dist/confirm/headless.js +13 -2
- package/dist/confirm/headless.js.map +1 -1
- package/dist/confirm/terminal.js +1 -5
- package/dist/confirm/terminal.js.map +1 -1
- package/dist/context.js +9 -3
- package/dist/context.js.map +1 -1
- package/dist/git.js +56 -61
- package/dist/git.js.map +1 -1
- package/dist/harnesses.js +137 -37
- package/dist/harnesses.js.map +1 -1
- package/dist/history.js +12 -4
- package/dist/history.js.map +1 -1
- package/dist/hooks/index.js +2 -2
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/loader.js +6 -5
- package/dist/hooks/loader.js.map +1 -1
- package/dist/hooks/manager.js.map +1 -1
- package/dist/hooks/plugins/example-console.js.map +1 -1
- package/dist/hooks/scaffold.js +8 -6
- package/dist/hooks/scaffold.js.map +1 -1
- package/dist/index.js +120 -66
- package/dist/index.js.map +1 -1
- package/dist/indexer.js +6 -18
- package/dist/indexer.js.map +1 -1
- package/dist/jsonrpc.js.map +1 -1
- package/dist/lens.js +38 -16
- package/dist/lens.js.map +1 -1
- package/dist/lsp.js +60 -24
- package/dist/lsp.js.map +1 -1
- package/dist/markdown.js +6 -6
- package/dist/markdown.js.map +1 -1
- package/dist/mcp.js +15 -6
- package/dist/mcp.js.map +1 -1
- package/dist/model-customization.js +7 -3
- package/dist/model-customization.js.map +1 -1
- package/dist/progress/message-edit-scheduler.js +15 -3
- package/dist/progress/message-edit-scheduler.js.map +1 -1
- package/dist/progress/progress-message-renderer.js.map +1 -1
- package/dist/progress/progress-presenter.js +3 -3
- package/dist/progress/progress-presenter.js.map +1 -1
- package/dist/progress/serialize-telegram.js.map +1 -1
- package/dist/progress/tool-summary.js +3 -1
- package/dist/progress/tool-summary.js.map +1 -1
- package/dist/progress/turn-progress.js +3 -1
- package/dist/progress/turn-progress.js.map +1 -1
- package/dist/recovery.js +11 -3
- package/dist/recovery.js.map +1 -1
- package/dist/replay.js +9 -3
- package/dist/replay.js.map +1 -1
- package/dist/replay_cli.js +5 -3
- package/dist/replay_cli.js.map +1 -1
- package/dist/runtime/executor.js +66 -20
- package/dist/runtime/executor.js.map +1 -1
- package/dist/runtime/health.js.map +1 -1
- package/dist/runtime/host-runner.js +103 -0
- package/dist/runtime/host-runner.js.map +1 -0
- package/dist/runtime/planner.js +3 -1
- package/dist/runtime/planner.js.map +1 -1
- package/dist/runtime/secrets.js +102 -0
- package/dist/runtime/secrets.js.map +1 -0
- package/dist/runtime/store.js +95 -19
- package/dist/runtime/store.js.map +1 -1
- package/dist/safety.js +38 -21
- package/dist/safety.js.map +1 -1
- package/dist/spinner.js +7 -8
- package/dist/spinner.js.map +1 -1
- package/dist/sys/context.js +3 -3
- package/dist/sys/context.js.map +1 -1
- package/dist/term.js +1 -1
- package/dist/term.js.map +1 -1
- package/dist/themes.js +11 -5
- package/dist/themes.js.map +1 -1
- package/dist/tools/tool-error.js +2 -5
- package/dist/tools/tool-error.js.map +1 -1
- package/dist/tools.js +69 -34
- package/dist/tools.js.map +1 -1
- package/dist/tui/branch-picker.js +9 -3
- package/dist/tui/branch-picker.js.map +1 -1
- package/dist/tui/command-handler.js +88 -36
- package/dist/tui/command-handler.js.map +1 -1
- package/dist/tui/confirm.js.map +1 -1
- package/dist/tui/controller.js +234 -117
- package/dist/tui/controller.js.map +1 -1
- package/dist/tui/event-bridge.js.map +1 -1
- package/dist/tui/keymap.js +93 -71
- package/dist/tui/keymap.js.map +1 -1
- package/dist/tui/layout.js +9 -1
- package/dist/tui/layout.js.map +1 -1
- package/dist/tui/render.js +17 -5
- package/dist/tui/render.js.map +1 -1
- package/dist/tui/screen.js.map +1 -1
- package/dist/tui/state.js +129 -63
- package/dist/tui/state.js.map +1 -1
- package/dist/tui/theme.js +12 -3
- package/dist/tui/theme.js.map +1 -1
- package/dist/upgrade.js +28 -15
- package/dist/upgrade.js.map +1 -1
- package/dist/utils.js +8 -5
- package/dist/utils.js.map +1 -1
- package/dist/vault.js +48 -12
- package/dist/vault.js.map +1 -1
- package/dist/vim.js.map +1 -1
- package/package.json +11 -2
package/dist/cli/oneshot.js
CHANGED
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { spawnSync } from 'node:child_process';
|
|
8
8
|
import { createSession } from '../agent.js';
|
|
9
|
-
import { expandAtFileRefs, expandPromptImages } from './input.js';
|
|
10
|
-
import { friendlyError, normalizeOutputFormat } from './args.js';
|
|
11
9
|
import { banner, err as errFmt } from '../term.js';
|
|
12
10
|
import { projectDir } from '../utils.js';
|
|
11
|
+
import { friendlyError, normalizeOutputFormat } from './args.js';
|
|
12
|
+
import { expandAtFileRefs, expandPromptImages } from './input.js';
|
|
13
13
|
/**
|
|
14
14
|
* Runs a single instruction against the agent and exits the process.
|
|
15
15
|
*/
|
|
@@ -46,7 +46,7 @@ export async function runOneShot(opts) {
|
|
|
46
46
|
const diffOnly = !!config.diff_only;
|
|
47
47
|
const shouldFailOnError = config.fail_on_error !== false;
|
|
48
48
|
let diffOnlyEnabled = false;
|
|
49
|
-
const runGit = (command, timeoutMs = 10_000) => spawnSync('bash', ['-
|
|
49
|
+
const runGit = (command, timeoutMs = 10_000) => spawnSync('bash', ['-c', command], {
|
|
50
50
|
cwd: oneShotCwd,
|
|
51
51
|
encoding: 'utf8',
|
|
52
52
|
timeout: timeoutMs,
|
|
@@ -63,7 +63,10 @@ export async function runOneShot(opts) {
|
|
|
63
63
|
};
|
|
64
64
|
if (diffOnly) {
|
|
65
65
|
const inside = runGit('git rev-parse --is-inside-work-tree');
|
|
66
|
-
if (inside.status !== 0 ||
|
|
66
|
+
if (inside.status !== 0 ||
|
|
67
|
+
!String(inside.stdout || '')
|
|
68
|
+
.trim()
|
|
69
|
+
.startsWith('true')) {
|
|
67
70
|
console.error('--diff-only requires running inside a git repository.');
|
|
68
71
|
process.exit(2);
|
|
69
72
|
}
|
|
@@ -104,23 +107,32 @@ export async function runOneShot(opts) {
|
|
|
104
107
|
const { CliSpinner } = await import('../spinner.js');
|
|
105
108
|
spinner = new CliSpinner({ styler: S, verbose: config.verbose });
|
|
106
109
|
spinner.start();
|
|
107
|
-
const uiMode = config.verbose ? 'verbose' :
|
|
108
|
-
oneShotHooks =
|
|
109
|
-
|
|
110
|
-
onToolCall: (e) => spinner.onToolCall(e),
|
|
111
|
-
onToolResult: (e) => spinner.onToolResult(e),
|
|
112
|
-
}
|
|
113
|
-
: uiMode === 'quiet'
|
|
110
|
+
const uiMode = config.verbose ? 'verbose' : config.quiet ? 'quiet' : 'normal';
|
|
111
|
+
oneShotHooks =
|
|
112
|
+
uiMode === 'verbose'
|
|
114
113
|
? {
|
|
115
|
-
onToken: (t) => { spinner.onFirstDelta(); partialAssistant += t; process.stdout.write(t); },
|
|
116
|
-
onFirstDelta: () => spinner.onFirstDelta(),
|
|
117
|
-
}
|
|
118
|
-
: {
|
|
119
|
-
onToken: (t) => { spinner.onFirstDelta(); partialAssistant += t; process.stdout.write(t); },
|
|
120
|
-
onFirstDelta: () => spinner.onFirstDelta(),
|
|
121
114
|
onToolCall: (e) => spinner.onToolCall(e),
|
|
122
115
|
onToolResult: (e) => spinner.onToolResult(e),
|
|
123
|
-
}
|
|
116
|
+
}
|
|
117
|
+
: uiMode === 'quiet'
|
|
118
|
+
? {
|
|
119
|
+
onToken: (t) => {
|
|
120
|
+
spinner.onFirstDelta();
|
|
121
|
+
partialAssistant += t;
|
|
122
|
+
process.stdout.write(t);
|
|
123
|
+
},
|
|
124
|
+
onFirstDelta: () => spinner.onFirstDelta(),
|
|
125
|
+
}
|
|
126
|
+
: {
|
|
127
|
+
onToken: (t) => {
|
|
128
|
+
spinner.onFirstDelta();
|
|
129
|
+
partialAssistant += t;
|
|
130
|
+
process.stdout.write(t);
|
|
131
|
+
},
|
|
132
|
+
onFirstDelta: () => spinner.onFirstDelta(),
|
|
133
|
+
onToolCall: (e) => spinner.onToolCall(e),
|
|
134
|
+
onToolResult: (e) => spinner.onToolResult(e),
|
|
135
|
+
};
|
|
124
136
|
}
|
|
125
137
|
else {
|
|
126
138
|
oneShotHooks = {
|
|
@@ -248,7 +260,7 @@ export async function runOneShot(opts) {
|
|
|
248
260
|
});
|
|
249
261
|
flushJsonArray();
|
|
250
262
|
}
|
|
251
|
-
process.exit(
|
|
263
|
+
process.exit(shouldFailOnError || !cleaned ? 1 : 0);
|
|
252
264
|
}
|
|
253
265
|
}
|
|
254
266
|
//# sourceMappingURL=oneshot.js.map
|
package/dist/cli/oneshot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oneshot.js","sourceRoot":"","sources":["../../src/cli/oneshot.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"oneshot.js","sourceRoot":"","sources":["../../src/cli/oneshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { runDirectShellCommand } from './shell.js';
|
|
2
|
-
import { splitTokens } from './command-utils.js';
|
|
3
|
-
import { findCommand } from './command-registry.js';
|
|
4
1
|
import { expandArgs } from '../commands.js';
|
|
5
|
-
import { projectDir } from '../utils.js';
|
|
6
2
|
import { warn as warnFmt, err as errFmt } from '../term.js';
|
|
3
|
+
import { projectDir } from '../utils.js';
|
|
4
|
+
import { findCommand } from './command-registry.js';
|
|
5
|
+
import { splitTokens } from './command-utils.js';
|
|
6
|
+
import { runDirectShellCommand } from './shell.js';
|
|
7
7
|
/**
|
|
8
8
|
* Handle REPL pre-turn dispatch:
|
|
9
9
|
* - direct shell execution
|
|
@@ -30,8 +30,12 @@ export async function runReplPreTurn(opts) {
|
|
|
30
30
|
command,
|
|
31
31
|
cwd: projectDir(config),
|
|
32
32
|
timeoutSec,
|
|
33
|
-
onStart: (proc) => {
|
|
34
|
-
|
|
33
|
+
onStart: (proc) => {
|
|
34
|
+
ctx.activeShellProc = proc;
|
|
35
|
+
},
|
|
36
|
+
onStop: () => {
|
|
37
|
+
ctx.activeShellProc = null;
|
|
38
|
+
},
|
|
35
39
|
});
|
|
36
40
|
if (result.timedOut)
|
|
37
41
|
console.log(warnFmt(`[shell] killed after ${timeoutSec}s timeout`, S));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repl-dispatch.js","sourceRoot":"","sources":["../../src/cli/repl-dispatch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"repl-dispatch.js","sourceRoot":"","sources":["../../src/cli/repl-dispatch.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/runtime-cmds.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
1
2
|
import path from 'node:path';
|
|
2
|
-
import readline from 'node:readline/promises';
|
|
3
3
|
import { stdin as input, stdout as output } from 'node:process';
|
|
4
|
-
import
|
|
4
|
+
import readline from 'node:readline/promises';
|
|
5
5
|
import { probeModelsEndpoint, waitForModelsReady } from '../runtime/health.js';
|
|
6
6
|
import { loadRuntimes, saveRuntimes, validateRuntimes, redactConfig, bootstrapRuntimes, interpolateTemplate, } from '../runtime/store.js';
|
|
7
|
+
import { HostCommandRunner } from '../runtime/host-runner.js';
|
|
7
8
|
import { configDir, shellEscape } from '../utils.js';
|
|
8
9
|
import { firstToken } from './command-utils.js';
|
|
9
10
|
function runtimesFilePath() {
|
|
@@ -26,7 +27,7 @@ async function ask(rl, prompt, fallback = '') {
|
|
|
26
27
|
return ans || fallback;
|
|
27
28
|
}
|
|
28
29
|
function runLocalCommand(command, timeoutSec = 5) {
|
|
29
|
-
const p = spawnSync('bash', ['-
|
|
30
|
+
const p = spawnSync('bash', ['-c', command], { encoding: 'utf8', timeout: timeoutSec * 1000 });
|
|
30
31
|
return {
|
|
31
32
|
ok: p.status === 0,
|
|
32
33
|
code: p.status,
|
|
@@ -34,21 +35,9 @@ function runLocalCommand(command, timeoutSec = 5) {
|
|
|
34
35
|
stderr: p.stderr ?? '',
|
|
35
36
|
};
|
|
36
37
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const target = `${host.connection.user ? `${host.connection.user}@` : ''}${host.connection.host ?? ''}`;
|
|
41
|
-
const sshParts = [
|
|
42
|
-
'ssh',
|
|
43
|
-
'-o', 'BatchMode=yes',
|
|
44
|
-
'-o', `ConnectTimeout=${timeoutSec}`,
|
|
45
|
-
];
|
|
46
|
-
if (host.connection.port)
|
|
47
|
-
sshParts.push('-p', String(host.connection.port));
|
|
48
|
-
if (host.connection.key_path)
|
|
49
|
-
sshParts.push('-i', shellEscape(host.connection.key_path));
|
|
50
|
-
sshParts.push(shellEscape(target), '--', 'bash', '-lc', shellEscape(command));
|
|
51
|
-
return runLocalCommand(sshParts.join(' '), timeoutSec + 1);
|
|
38
|
+
const hostCommandRunner = new HostCommandRunner();
|
|
39
|
+
async function runHostCommand(host, command, timeoutSec = 5) {
|
|
40
|
+
return await hostCommandRunner.runOnHost(host, command, timeoutSec);
|
|
52
41
|
}
|
|
53
42
|
function usage(kind) {
|
|
54
43
|
console.log(`Usage:\n idlehands ${kind}\n idlehands ${kind} show <id>\n idlehands ${kind} add\n idlehands ${kind} edit <id>\n idlehands ${kind} remove <id>\n idlehands ${kind} validate\n idlehands ${kind} test <id>\n idlehands ${kind} doctor`);
|
|
@@ -89,7 +78,9 @@ export async function runHostsSubcommand(args, _config) {
|
|
|
89
78
|
id: await ask(rl, 'Host id (e.g. local-main)'),
|
|
90
79
|
display_name: await ask(rl, 'Display name'),
|
|
91
80
|
enabled: (await ask(rl, 'Enabled (y/n)', 'y')).toLowerCase().startsWith('y'),
|
|
92
|
-
transport: (
|
|
81
|
+
transport: (await ask(rl, 'Transport (local/ssh)', 'local')).toLowerCase() === 'ssh'
|
|
82
|
+
? 'ssh'
|
|
83
|
+
: 'local',
|
|
93
84
|
connection: {
|
|
94
85
|
host: undefined,
|
|
95
86
|
port: undefined,
|
|
@@ -98,12 +89,18 @@ export async function runHostsSubcommand(args, _config) {
|
|
|
98
89
|
password: undefined,
|
|
99
90
|
},
|
|
100
91
|
capabilities: {
|
|
101
|
-
gpu: (await ask(rl, 'GPU tags (comma-separated)', ''))
|
|
92
|
+
gpu: (await ask(rl, 'GPU tags (comma-separated)', ''))
|
|
93
|
+
.split(',')
|
|
94
|
+
.map((s) => s.trim())
|
|
95
|
+
.filter(Boolean),
|
|
102
96
|
vram_gb: (() => {
|
|
103
97
|
const raw = args['vram-gb'] ?? undefined;
|
|
104
98
|
return raw == null ? undefined : Number(raw);
|
|
105
99
|
})(),
|
|
106
|
-
backends: (await ask(rl, 'Supported backends (comma-separated)', ''))
|
|
100
|
+
backends: (await ask(rl, 'Supported backends (comma-separated)', ''))
|
|
101
|
+
.split(',')
|
|
102
|
+
.map((s) => s.trim())
|
|
103
|
+
.filter(Boolean),
|
|
107
104
|
},
|
|
108
105
|
health: {
|
|
109
106
|
check_cmd: await ask(rl, 'Health check command', 'true'),
|
|
@@ -200,7 +197,7 @@ export async function runHostsSubcommand(args, _config) {
|
|
|
200
197
|
source: '',
|
|
201
198
|
port: '',
|
|
202
199
|
});
|
|
203
|
-
const res = runHostCommand(host, command, host.health.timeout_sec ?? 5);
|
|
200
|
+
const res = await runHostCommand(host, command, host.health.timeout_sec ?? 5);
|
|
204
201
|
console.log(`[${host.id}] ${res.ok ? 'OK' : 'FAIL'} (exit=${res.code ?? -1})`);
|
|
205
202
|
if (res.stdout.trim())
|
|
206
203
|
console.log(res.stdout.trim());
|
|
@@ -220,7 +217,7 @@ export async function runHostsSubcommand(args, _config) {
|
|
|
220
217
|
problems.push(`[${host.id}] ssh host is missing`);
|
|
221
218
|
continue;
|
|
222
219
|
}
|
|
223
|
-
const ping = runHostCommand(host, 'echo ok', 5);
|
|
220
|
+
const ping = await runHostCommand(host, 'echo ok', 5);
|
|
224
221
|
if (!ping.ok)
|
|
225
222
|
problems.push(`[${host.id}] ssh unreachable (${ping.code ?? -1})`);
|
|
226
223
|
}
|
|
@@ -288,7 +285,12 @@ export async function runBackendsSubcommand(args, _config) {
|
|
|
288
285
|
type: (await ask(rl, 'Type (vulkan|rocm|cuda|metal|cpu|custom)', 'custom')),
|
|
289
286
|
host_filters: (() => {
|
|
290
287
|
const raw = (args.hosts ?? '').toString();
|
|
291
|
-
return raw
|
|
288
|
+
return raw
|
|
289
|
+
? raw
|
|
290
|
+
.split(',')
|
|
291
|
+
.map((s) => s.trim())
|
|
292
|
+
.filter(Boolean)
|
|
293
|
+
: 'any';
|
|
292
294
|
})(),
|
|
293
295
|
apply_cmd: await ask(rl, 'Apply command (optional)', ''),
|
|
294
296
|
verify_cmd: await ask(rl, 'Verify command (optional)', ''),
|
|
@@ -297,7 +299,13 @@ export async function runBackendsSubcommand(args, _config) {
|
|
|
297
299
|
args: undefined,
|
|
298
300
|
};
|
|
299
301
|
const filters = await ask(rl, 'Host filters (any or comma-separated ids)', 'any');
|
|
300
|
-
backend.host_filters =
|
|
302
|
+
backend.host_filters =
|
|
303
|
+
filters === 'any'
|
|
304
|
+
? 'any'
|
|
305
|
+
: filters
|
|
306
|
+
.split(',')
|
|
307
|
+
.map((s) => s.trim())
|
|
308
|
+
.filter(Boolean);
|
|
301
309
|
if (!backend.apply_cmd)
|
|
302
310
|
backend.apply_cmd = null;
|
|
303
311
|
if (!backend.verify_cmd)
|
|
@@ -370,8 +378,14 @@ export async function runBackendsSubcommand(args, _config) {
|
|
|
370
378
|
const cmdText = interpolateTemplate(backend.verify_cmd, {
|
|
371
379
|
backend_id: backend.id,
|
|
372
380
|
backend_args: (backend.args ?? []).join(' '),
|
|
373
|
-
backend_env: Object.entries(backend.env ?? {})
|
|
374
|
-
|
|
381
|
+
backend_env: Object.entries(backend.env ?? {})
|
|
382
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
383
|
+
.join(' '),
|
|
384
|
+
host: '',
|
|
385
|
+
host_id: '',
|
|
386
|
+
model_id: '',
|
|
387
|
+
source: '',
|
|
388
|
+
port: '',
|
|
375
389
|
});
|
|
376
390
|
const res = runLocalCommand(cmdText, 8);
|
|
377
391
|
console.log(`[${backend.id}] ${res.ok ? 'OK' : 'FAIL'} (exit=${res.code ?? -1})`);
|
|
@@ -459,7 +473,9 @@ export async function runModelsSubcommand(args, _config) {
|
|
|
459
473
|
const rpcBackendName = `rocm-rpc-${rpcAddr.replace(/[:.]/g, '-')}`;
|
|
460
474
|
let existingBackend = runtimes.backends.find((b) => b.type === 'rocm' && b.args?.some((a) => a === rpcAddr));
|
|
461
475
|
if (!existingBackend) {
|
|
462
|
-
const createBackend = (await ask(rl, `Create RPC backend '${rpcBackendName}'? (y/n)`, 'y'))
|
|
476
|
+
const createBackend = (await ask(rl, `Create RPC backend '${rpcBackendName}'? (y/n)`, 'y'))
|
|
477
|
+
.toLowerCase()
|
|
478
|
+
.startsWith('y');
|
|
463
479
|
if (createBackend) {
|
|
464
480
|
existingBackend = {
|
|
465
481
|
id: rpcBackendName,
|
|
@@ -471,7 +487,18 @@ export async function runModelsSubcommand(args, _config) {
|
|
|
471
487
|
verify_cmd: 'rocminfo >/dev/null 2>&1',
|
|
472
488
|
rollback_cmd: null,
|
|
473
489
|
env: { ROCBLAS_USE_HIPBLASLT: '1' },
|
|
474
|
-
args: [
|
|
490
|
+
args: [
|
|
491
|
+
'-ngl',
|
|
492
|
+
'99',
|
|
493
|
+
'-fa',
|
|
494
|
+
'on',
|
|
495
|
+
'--rpc',
|
|
496
|
+
rpcAddr,
|
|
497
|
+
'-ts',
|
|
498
|
+
tsRatio,
|
|
499
|
+
'-dio',
|
|
500
|
+
'--no-warmup',
|
|
501
|
+
],
|
|
475
502
|
};
|
|
476
503
|
runtimes.backends.push(existingBackend);
|
|
477
504
|
console.log(` Created RPC backend: ${rpcBackendName}`);
|
|
@@ -485,7 +512,8 @@ export async function runModelsSubcommand(args, _config) {
|
|
|
485
512
|
rpcProbeTimeout = Number(await ask(rl, 'Probe timeout sec (large RPC models need 300-7200)', '3600'));
|
|
486
513
|
rpcProbeInterval = Number(await ask(rl, 'Probe interval ms', '5000'));
|
|
487
514
|
// Default start_cmd with -dio baked in (backend_args already includes it from the RPC backend)
|
|
488
|
-
startCmdDefault =
|
|
515
|
+
startCmdDefault =
|
|
516
|
+
'nohup env {backend_env} llama-server -m {source} --port {port} --ctx-size 4096 {backend_args} --host 0.0.0.0 > /tmp/llama-server.log 2>&1 &';
|
|
489
517
|
}
|
|
490
518
|
const model = {
|
|
491
519
|
id: modelId,
|
|
@@ -517,8 +545,20 @@ export async function runModelsSubcommand(args, _config) {
|
|
|
517
545
|
else {
|
|
518
546
|
const hp = await ask(rl, 'Host policy (any or comma-separated ids)', 'any');
|
|
519
547
|
const bp = await ask(rl, 'Backend policy (any or comma-separated ids)', 'any');
|
|
520
|
-
model.host_policy =
|
|
521
|
-
|
|
548
|
+
model.host_policy =
|
|
549
|
+
hp === 'any'
|
|
550
|
+
? 'any'
|
|
551
|
+
: hp
|
|
552
|
+
.split(',')
|
|
553
|
+
.map((s) => s.trim())
|
|
554
|
+
.filter(Boolean);
|
|
555
|
+
model.backend_policy =
|
|
556
|
+
bp === 'any'
|
|
557
|
+
? 'any'
|
|
558
|
+
: bp
|
|
559
|
+
.split(',')
|
|
560
|
+
.map((s) => s.trim())
|
|
561
|
+
.filter(Boolean);
|
|
522
562
|
}
|
|
523
563
|
await saveRuntimes({ ...runtimes, models: [...runtimes.models, model] });
|
|
524
564
|
console.log(`Added model: ${model.id}`);
|
|
@@ -581,16 +621,22 @@ export async function runModelsSubcommand(args, _config) {
|
|
|
581
621
|
throw new Error(`model not found: ${id}`);
|
|
582
622
|
const host = model.host_policy === 'any'
|
|
583
623
|
? runtimes.hosts.find((h) => h.enabled)
|
|
584
|
-
: model.host_policy
|
|
624
|
+
: model.host_policy
|
|
625
|
+
.map((hid) => runtimes.hosts.find((h) => h.id === hid && h.enabled))
|
|
626
|
+
.find(Boolean);
|
|
585
627
|
if (!host)
|
|
586
628
|
throw new Error(`no eligible host for model: ${model.id}`);
|
|
587
629
|
const backend = model.backend_policy === 'any'
|
|
588
630
|
? runtimes.backends.find((b) => b.enabled)
|
|
589
|
-
: model.backend_policy
|
|
631
|
+
: model.backend_policy
|
|
632
|
+
.map((bid) => runtimes.backends.find((b) => b.id === bid && b.enabled))
|
|
633
|
+
.find(Boolean);
|
|
590
634
|
const port = model.runtime_defaults?.port ?? 8080;
|
|
591
635
|
const backendArgs = backend?.args?.map((a) => shellEscape(a)).join(' ') ?? '';
|
|
592
636
|
const backendEnv = backend?.env
|
|
593
|
-
? Object.entries(backend.env)
|
|
637
|
+
? Object.entries(backend.env)
|
|
638
|
+
.map(([k, v]) => `${k}=${shellEscape(String(v))}`)
|
|
639
|
+
.join(' ')
|
|
594
640
|
: '';
|
|
595
641
|
const cmdText = interpolateTemplate(model.launch.probe_cmd, {
|
|
596
642
|
model_id: model.id,
|
|
@@ -602,7 +648,7 @@ export async function runModelsSubcommand(args, _config) {
|
|
|
602
648
|
host: host.connection.host ?? host.id,
|
|
603
649
|
host_id: host.id,
|
|
604
650
|
});
|
|
605
|
-
const res = runHostCommand(host, cmdText, model.launch.probe_timeout_sec ?? 60);
|
|
651
|
+
const res = await runHostCommand(host, cmdText, model.launch.probe_timeout_sec ?? 60);
|
|
606
652
|
console.log(`[${model.id}] host=${host.id} ${res.ok ? 'OK' : 'FAIL'} (exit=${res.code ?? -1})`);
|
|
607
653
|
if (res.stdout.trim())
|
|
608
654
|
console.log(res.stdout.trim());
|
|
@@ -702,7 +748,7 @@ async function applyDynamicProbeDefaults(result, rtConfig, runOnHost) {
|
|
|
702
748
|
return;
|
|
703
749
|
const d = deriveProbeDefaultsFromSizeGiB(sizeGiB);
|
|
704
750
|
for (const step of result.steps) {
|
|
705
|
-
if (step.kind !==
|
|
751
|
+
if (step.kind !== 'probe_health')
|
|
706
752
|
continue;
|
|
707
753
|
if (!hasExplicitTimeout)
|
|
708
754
|
step.timeout_sec = d.timeoutSec;
|
|
@@ -798,7 +844,11 @@ export async function runSelectSubcommand(args, _config) {
|
|
|
798
844
|
else if (status === 'error') {
|
|
799
845
|
process.stdout.write(' ✗\n');
|
|
800
846
|
if (detail) {
|
|
801
|
-
for (const line of detail
|
|
847
|
+
for (const line of detail
|
|
848
|
+
.split('\n')
|
|
849
|
+
.map((l) => l.trim())
|
|
850
|
+
.filter(Boolean)
|
|
851
|
+
.slice(0, 6)) {
|
|
802
852
|
process.stdout.write(` ${line}\n`);
|
|
803
853
|
}
|
|
804
854
|
}
|
|
@@ -825,7 +875,7 @@ export async function runSelectSubcommand(args, _config) {
|
|
|
825
875
|
const readyChecks = [];
|
|
826
876
|
let readyOk = true;
|
|
827
877
|
if (execResult.ok && waitReady) {
|
|
828
|
-
const timeoutSec = waitTimeoutSec ??
|
|
878
|
+
const timeoutSec = waitTimeoutSec ?? executedPlan.model.launch.probe_timeout_sec ?? 60;
|
|
829
879
|
for (const resolvedHost of executedPlan.hosts) {
|
|
830
880
|
const hostCfg = rtConfig.hosts.find((h) => h.id === resolvedHost.id);
|
|
831
881
|
if (!hostCfg)
|
|
@@ -925,7 +975,10 @@ export async function runHealthSubcommand(args, _config) {
|
|
|
925
975
|
return ports;
|
|
926
976
|
}
|
|
927
977
|
if (trimmed.includes(',')) {
|
|
928
|
-
const parts = trimmed
|
|
978
|
+
const parts = trimmed
|
|
979
|
+
.split(',')
|
|
980
|
+
.map((s) => s.trim())
|
|
981
|
+
.filter(Boolean);
|
|
929
982
|
const ports = parts.map(Number).filter((p) => Number.isFinite(p) && p >= 1 && p <= 65535);
|
|
930
983
|
return ports.length > 0 ? ports : null;
|
|
931
984
|
}
|
|
@@ -992,13 +1045,15 @@ export async function runHealthSubcommand(args, _config) {
|
|
|
992
1045
|
? enabledHosts
|
|
993
1046
|
: enabledHosts.filter((h) => model.host_policy.includes(h.id));
|
|
994
1047
|
const backend = model.backend_policy === 'any'
|
|
995
|
-
? enabledBackends[0] ?? null
|
|
996
|
-
: enabledBackends.find((b) => model.backend_policy.includes(b.id)) ?? null;
|
|
1048
|
+
? (enabledBackends[0] ?? null)
|
|
1049
|
+
: (enabledBackends.find((b) => model.backend_policy.includes(b.id)) ?? null);
|
|
997
1050
|
for (const host of targetHosts) {
|
|
998
1051
|
const port = String(model.runtime_defaults?.port ?? 8080);
|
|
999
1052
|
const backendArgs = backend?.args?.map((a) => shellEscape(a)).join(' ') ?? '';
|
|
1000
1053
|
const backendEnv = backend?.env
|
|
1001
|
-
? Object.entries(backend.env)
|
|
1054
|
+
? Object.entries(backend.env)
|
|
1055
|
+
.map(([k, v]) => `${k}=${shellEscape(String(v))}`)
|
|
1056
|
+
.join(' ')
|
|
1002
1057
|
: '';
|
|
1003
1058
|
const vars = {
|
|
1004
1059
|
source: model.source,
|
|
@@ -1063,7 +1118,10 @@ export async function runHealthSubcommand(args, _config) {
|
|
|
1063
1118
|
if (!jsonOut)
|
|
1064
1119
|
console.log(`\n${BOLD}Discovered Servers (/v1/models + /health)${RESET}`);
|
|
1065
1120
|
for (const host of enabledHosts) {
|
|
1066
|
-
const hostEntry = {
|
|
1121
|
+
const hostEntry = {
|
|
1122
|
+
hostId: host.id,
|
|
1123
|
+
services: [],
|
|
1124
|
+
};
|
|
1067
1125
|
if (!jsonOut)
|
|
1068
1126
|
console.log(` ${host.id}:`);
|
|
1069
1127
|
for (const port of candidatePorts) {
|
|
@@ -1079,10 +1137,16 @@ export async function runHealthSubcommand(args, _config) {
|
|
|
1079
1137
|
exitCode: probe.exitCode,
|
|
1080
1138
|
});
|
|
1081
1139
|
if (!jsonOut) {
|
|
1082
|
-
const icon = probe.status === 'ready'
|
|
1140
|
+
const icon = probe.status === 'ready'
|
|
1141
|
+
? `${GREEN}✓${RESET}`
|
|
1142
|
+
: probe.status === 'loading'
|
|
1143
|
+
? `${YELLOW}~${RESET}`
|
|
1144
|
+
: `${DIM}?${RESET}`;
|
|
1083
1145
|
const extras = probe.modelIds.filter((id) => !configuredModelIds.has(id));
|
|
1084
1146
|
const idsText = probe.modelIds.length ? ` models=${probe.modelIds.join(', ')}` : '';
|
|
1085
|
-
const extrasText = extras.length
|
|
1147
|
+
const extrasText = extras.length
|
|
1148
|
+
? ` ${YELLOW}(extra/unconfigured: ${extras.join(', ')})${RESET}`
|
|
1149
|
+
: '';
|
|
1086
1150
|
const httpText = probe.httpCode != null ? ` http=${probe.httpCode}` : '';
|
|
1087
1151
|
console.log(` ${icon} :${port} ${probe.status}${httpText}${idsText}${extrasText}`);
|
|
1088
1152
|
}
|