Compare commits

...

1 Commits

Author SHA1 Message Date
diegosouzapw d07a5f0df7 fix(cli-tools): increase kilocode healthcheck timeout from 4s to 15s
Build Electron Desktop App / Validate version (push) Failing after 35s
Build Electron Desktop App / Build Electron (macos-arm64) (push) Has been skipped
Build Electron Desktop App / Build Electron (linux) (push) Has been skipped
Build Electron Desktop App / Build Electron (macos-intel) (push) Has been skipped
Build Electron Desktop App / Build Electron (windows) (push) Has been skipped
Build Electron Desktop App / Create Release (push) Has been skipped
kilocode renders ASCII logo banner on startup causing false healthcheck_failed
timeouts on cold-start or low-resource environments (VPS, CI, dashboard)
2026-03-12 16:34:39 -03:00
3 changed files with 29 additions and 6 deletions
+6
View File
@@ -1,5 +1,11 @@
# Changelog
## [2.3.11] - 2026-03-12
### Fixed
- **KiloCode healthcheck**: Increase `healthcheckTimeoutMs` from 4000ms to 15000ms — kilocode renders an ASCII logo banner on startup causing false `healthcheck_failed` on slow/cold-start environments
## [2.3.10] - 2026-03-12
### Fixed
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "omniroute",
"version": "2.3.10",
"version": "2.3.11",
"description": "Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.",
"type": "module",
"bin": {
+22 -5
View File
@@ -73,7 +73,10 @@ const CLI_TOOLS: Record<string, any> = {
defaultCommand: "kilocode",
envBinKey: "CLI_KILO_BIN",
requiresBinary: true,
healthcheckTimeoutMs: 4000,
// kilocode renders an ASCII logo banner on startup which can take >4s
// on cold-start or low-resource environments (VPS, CI). Increase timeout
// to avoid false healthcheck_failed results.
healthcheckTimeoutMs: 15000,
paths: {
auth: ".local/share/kilo/auth.json",
},
@@ -95,7 +98,11 @@ const parseBoolean = (value: unknown, defaultValue = true) => {
return !FALSE_VALUES.has(String(value).trim().toLowerCase());
};
const runProcess = (command: string, args: string[], { env, timeoutMs = 3000 }: { env?: Record<string, string | undefined>; timeoutMs?: number } = {}): Promise<any> =>
const runProcess = (
command: string,
args: string[],
{ env, timeoutMs = 3000 }: { env?: Record<string, string | undefined>; timeoutMs?: number } = {}
): Promise<any> =>
new Promise((resolve) => {
let stdout = "";
let stderr = "";
@@ -231,7 +238,10 @@ const locateCommand = async (command: string, env: Record<string, string | undef
return { installed: !!first, commandPath: first, reason: first ? null : "not_found" };
};
const locateCommandCandidate = async (commands: string[], env: Record<string, string | undefined>) => {
const locateCommandCandidate = async (
commands: string[],
env: Record<string, string | undefined>
) => {
if (!Array.isArray(commands) || commands.length === 0) {
return { command: null, installed: false, commandPath: null, reason: "missing_command" };
}
@@ -246,7 +256,11 @@ const locateCommandCandidate = async (commands: string[], env: Record<string, st
return { command: commands[0], installed: false, commandPath: null, reason: "not_found" };
};
const checkRunnable = async (commandPath: string, env: Record<string, string | undefined>, timeoutMs = 4000) => {
const checkRunnable = async (
commandPath: string,
env: Record<string, string | undefined>,
timeoutMs = 4000
) => {
for (const args of [["--version"], ["-v"]]) {
const result = await runProcess(commandPath, args, { env, timeoutMs });
if (result.ok) {
@@ -272,7 +286,10 @@ export const getCliConfigPaths = (toolId: string) => {
if (!tool) return null;
const home = getCliConfigHome();
return Object.fromEntries(
Object.entries(tool.paths).map(([key, relativePath]) => [key, path.join(home, relativePath as string)])
Object.entries(tool.paths).map(([key, relativePath]) => [
key,
path.join(home, relativePath as string),
])
);
};