perf(agent): lazy load embedded agent cli path

This commit is contained in:
Peter Steinberger
2026-05-29 15:19:45 +01:00
parent 239523668e
commit 854be10e65
4 changed files with 37 additions and 32 deletions

View File

@@ -12,7 +12,6 @@ const mocks = vi.hoisted(() => ({
agentsSetIdentityCommandMock: vi.fn(),
agentsUnbindCommandMock: vi.fn(),
setVerboseMock: vi.fn(),
createDefaultDepsMock: vi.fn(() => ({ deps: true })),
runtime: {
log: vi.fn(),
error: vi.fn(),
@@ -29,7 +28,6 @@ const agentsListCommandMock = mocks.agentsListCommandMock;
const agentsSetIdentityCommandMock = mocks.agentsSetIdentityCommandMock;
const agentsUnbindCommandMock = mocks.agentsUnbindCommandMock;
const setVerboseMock = mocks.setVerboseMock;
const createDefaultDepsMock = mocks.createDefaultDepsMock;
const runtime = mocks.runtime;
vi.mock("../../commands/agent-via-gateway.js", () => ({
@@ -62,10 +60,6 @@ vi.mock("../../global-state.js", () => ({
setVerbose: mocks.setVerboseMock,
}));
vi.mock("../deps.js", () => ({
createDefaultDeps: mocks.createDefaultDepsMock,
}));
vi.mock("../../runtime.js", () => ({
defaultRuntime: mocks.runtime,
}));
@@ -88,7 +82,6 @@ describe("registerAgentCommands", () => {
agentsListCommandMock.mockResolvedValue(undefined);
agentsSetIdentityCommandMock.mockResolvedValue(undefined);
agentsUnbindCommandMock.mockResolvedValue(undefined);
createDefaultDepsMock.mockReturnValue({ deps: true });
});
function commandCall(mock: { mock: { calls: unknown[][] } }, index = 0): unknown[] {
@@ -99,17 +92,16 @@ describe("registerAgentCommands", () => {
return call;
}
it("runs agent command with deps and verbose enabled for --verbose on", async () => {
it("runs agent command with verbose enabled for --verbose on", async () => {
await runCli(["agent", "--message", "hi", "--verbose", "ON", "--json"]);
expect(setVerboseMock).toHaveBeenCalledWith(true);
expect(createDefaultDepsMock).toHaveBeenCalledTimes(1);
const [options, callRuntime, deps] = commandCall(agentCliCommandMock);
expect((options as { message?: string }).message).toBe("hi");
expect((options as { verbose?: string }).verbose).toBe("ON");
expect((options as { json?: boolean }).json).toBe(true);
expect(callRuntime).toBe(runtime);
expect(deps).toEqual({ deps: true });
expect(deps).toBeUndefined();
});
it("runs agent command with verbose disabled for --verbose off", async () => {
@@ -120,7 +112,7 @@ describe("registerAgentCommands", () => {
expect((options as { message?: string }).message).toBe("hi");
expect((options as { verbose?: string }).verbose).toBe("off");
expect(callRuntime).toBe(runtime);
expect(deps).toEqual({ deps: true });
expect(deps).toBeUndefined();
});
it("accepts a model override for one-shot agent runs", async () => {
@@ -131,7 +123,7 @@ describe("registerAgentCommands", () => {
expect((options as { agent?: string }).agent).toBe("ops");
expect((options as { model?: string }).model).toBe("openai/gpt-5.4");
expect(callRuntime).toBe(runtime);
expect(deps).toEqual({ deps: true });
expect(deps).toBeUndefined();
});
it("forwards an explicit session key to the agent command", async () => {
@@ -141,7 +133,7 @@ describe("registerAgentCommands", () => {
expect((options as { message?: string }).message).toBe("hi");
expect((options as { sessionKey?: string }).sessionKey).toBe("agent:ops:incident-42");
expect(callRuntime).toBe(runtime);
expect(deps).toEqual({ deps: true });
expect(deps).toBeUndefined();
});
it("runs agents add and computes hasFlags based on explicit options", async () => {

View File

@@ -14,7 +14,6 @@ type AgentsBindModule = typeof import("../../commands/agents.commands.bind.js");
type AgentsDeleteModule = typeof import("../../commands/agents.commands.delete.js");
type AgentsIdentityModule = typeof import("../../commands/agents.commands.identity.js");
type AgentsListModule = typeof import("../../commands/agents.commands.list.js");
type CliDepsModule = typeof import("../deps.js");
type GlobalStateModule = typeof import("../../global-state.js");
async function loadAgentCliCommand(): Promise<AgentViaGatewayModule["agentCliCommand"]> {
@@ -51,10 +50,6 @@ async function loadAgentsListCommand(): Promise<AgentsListModule["agentsListComm
return (await import("../../commands/agents.commands.list.js")).agentsListCommand;
}
async function loadCreateDefaultDeps(): Promise<CliDepsModule["createDefaultDeps"]> {
return (await import("../deps.js")).createDefaultDeps;
}
async function loadSetVerbose(): Promise<GlobalStateModule["setVerbose"]> {
return (await import("../../global-state.js")).setVerbose;
}
@@ -130,11 +125,8 @@ ${theme.muted("Docs:")} ${formatDocsLink("/cli/agent", "docs.openclaw.ai/cli/age
await runCommandWithRuntime(defaultRuntime, async () => {
const setVerbose = await loadSetVerbose();
setVerbose(verboseLevel === "on");
// Build default deps (keeps parity with other commands; future-proofing).
const createDefaultDeps = await loadCreateDefaultDeps();
const deps = createDefaultDeps();
const agentCliCommand = await loadAgentCliCommand();
await agentCliCommand(opts, defaultRuntime, deps);
await agentCliCommand(opts, defaultRuntime);
});
});