fix: restore tsc build and plugin install tests

This commit is contained in:
Peter Steinberger
2026-01-31 07:51:26 +00:00
parent c4feb7a457
commit a42e1c82d9
26 changed files with 90 additions and 86 deletions

View File

@@ -1083,10 +1083,11 @@ export function createExecTool(
timeoutMs: DEFAULT_APPROVAL_TIMEOUT_MS,
},
);
decision =
const decisionValue =
decisionResult && typeof decisionResult === "object"
? (decisionResult.decision ?? null)
: null;
? (decisionResult as { decision?: unknown }).decision
: undefined;
decision = typeof decisionValue === "string" ? decisionValue : null;
} catch {
emitExecSystemEvent(
`Exec denied (node=${nodeId} id=${approvalId}, approval-request-failed): ${commandText}`,
@@ -1177,28 +1178,32 @@ export function createExecTool(
}
const startedAt = Date.now();
const raw = await callGatewayTool<{
payload: {
exitCode: number;
success?: string;
stdout?: string;
stderr?: string;
error?: string;
};
}>("node.invoke", { timeoutMs: invokeTimeoutMs }, buildInvokeParams(false, null));
const payload = raw?.payload ?? {};
const raw = await callGatewayTool(
"node.invoke",
{ timeoutMs: invokeTimeoutMs },
buildInvokeParams(false, null),
);
const payload =
raw && typeof raw === "object" ? (raw as { payload?: unknown }).payload : undefined;
const payloadObj =
payload && typeof payload === "object" ? (payload as Record<string, unknown>) : {};
const stdout = typeof payloadObj.stdout === "string" ? payloadObj.stdout : "";
const stderr = typeof payloadObj.stderr === "string" ? payloadObj.stderr : "";
const errorText = typeof payloadObj.error === "string" ? payloadObj.error : "";
const success = typeof payloadObj.success === "boolean" ? payloadObj.success : false;
const exitCode = typeof payloadObj.exitCode === "number" ? payloadObj.exitCode : null;
return {
content: [
{
type: "text",
text: payload.stdout || payload.stderr || payload.error || "",
text: stdout || stderr || errorText || "",
},
],
details: {
status: payload.success ? "completed" : "failed",
exitCode: payload.exitCode ?? null,
status: success ? "completed" : "failed",
exitCode,
durationMs: Date.now() - startedAt,
aggregated: [payload.stdout, payload.stderr, payload.error].filter(Boolean).join("\n"),
aggregated: [stdout, stderr, errorText].filter(Boolean).join("\n"),
cwd: workdir,
} satisfies ExecToolDetails,
};
@@ -1261,10 +1266,11 @@ export function createExecTool(
timeoutMs: DEFAULT_APPROVAL_TIMEOUT_MS,
},
);
decision =
const decisionValue =
decisionResult && typeof decisionResult === "object"
? (decisionResult.decision ?? null)
: null;
? (decisionResult as { decision?: unknown }).decision
: undefined;
decision = typeof decisionValue === "string" ? decisionValue : null;
} catch {
emitExecSystemEvent(
`Exec denied (gateway id=${approvalId}, approval-request-failed): ${commandText}`,

View File

@@ -361,7 +361,7 @@ async function mapWithConcurrency<T, R>(
opts?: { onProgress?: (completed: number, total: number) => void },
): Promise<R[]> {
const limit = Math.max(1, Math.floor(concurrency));
const results: R[] = Array.from({ length: items.length });
const results: R[] = Array.from({ length: items.length }, () => undefined as R);
let nextIndex = 0;
let completed = 0;

View File

@@ -869,7 +869,7 @@ export async function runEmbeddedAttempt(
const lastAssistant = messagesSnapshot
.slice()
.toReversed()
.find((m) => m?.role === "assistant");
.find((m) => m.role === "assistant");
const toolMetasNormalized = toolMetas
.filter(

View File

@@ -1,5 +1,5 @@
import type { OpenClawConfig } from "../config/config.js";
import { SkillsInstallPreferences } from "./skills/types.js";
import type { SkillsInstallPreferences } from "./skills/types.js";
export {
hasBinary,
@@ -38,7 +38,7 @@ export function resolveSkillsInstallPreferences(config?: OpenClawConfig): Skills
const preferBrew = raw?.preferBrew ?? true;
const managerRaw = typeof raw?.nodeManager === "string" ? raw.nodeManager.trim() : "";
const manager = managerRaw.toLowerCase();
const nodeManager =
const nodeManager: SkillsInstallPreferences["nodeManager"] =
manager === "pnpm" || manager === "yarn" || manager === "bun" || manager === "npm"
? manager
: "npm";

View File

@@ -382,10 +382,11 @@ export async function runSubagentAnnounceFlow(params: {
},
timeoutMs: waitMs + 2000,
});
const waitError = typeof wait?.error === "string" ? wait.error : undefined;
if (wait?.status === "timeout") {
outcome = { status: "timeout" };
} else if (wait?.status === "error") {
outcome = { status: "error", error: wait.error };
outcome = { status: "error", error: waitError };
} else if (wait?.status === "ok") {
outcome = { status: "ok" };
}

View File

@@ -355,8 +355,9 @@ async function waitForSubagentCompletion(runId: string, waitTimeoutMs: number) {
entry.endedAt = Date.now();
mutated = true;
}
const waitError = typeof wait.error === "string" ? wait.error : undefined;
entry.outcome =
wait.status === "error" ? { status: "error", error: wait.error } : { status: "ok" };
wait.status === "error" ? { status: "error", error: waitError } : { status: "ok" };
mutated = true;
if (mutated) {
persistSubagentRuns();

View File

@@ -149,10 +149,10 @@ async function callBrowserProxy(params: {
(typeof payload?.payloadJSON === "string" && payload.payloadJSON
? (JSON.parse(payload.payloadJSON) as BrowserProxyResult)
: null);
if (!parsed || typeof parsed !== "object") {
if (!parsed || typeof parsed !== "object" || !("result" in parsed)) {
throw new Error("browser proxy failed");
}
return parsed;
return parsed as BrowserProxyResult;
}
async function persistProxyFiles(files: BrowserProxyFile[] | undefined) {

View File

@@ -26,7 +26,7 @@ export function resolveGatewayOptions(opts?: GatewayCallOptions) {
return { url, token, timeoutMs };
}
export async function callGatewayTool<T = unknown>(
export async function callGatewayTool<T = Record<string, unknown>>(
method: string,
opts: GatewayCallOptions,
params?: unknown,