


























@@ -61,6 +61,13 @@ function createSession() {
6161};
6262}
636364+function requireRecord(value: unknown, label: string): Record<string, unknown> {
65+if (!value || typeof value !== "object") {
66+throw new Error(`expected ${label}`);
67+}
68+return value as Record<string, unknown>;
69+}
70+6471function createBackendSandboxConfig(params?: { binds?: string[]; target?: string }): SandboxConfig {
6572return {
6673mode: "all",
@@ -170,17 +177,17 @@ describe("ssh sandbox backend", () => {
170177actualConfigLabel: "peter@example.com:2222",
171178configLabelMatch: true,
172179});
173-expect(sshMocks.createSshSandboxSessionFromSettings).toHaveBeenCalledWith(
174-expect.objectContaining({
175-target: "peter@example.com:2222",
176-workspaceRoot: "/remote/openclaw",
177-}),
180+const sessionSettings = requireRecord(
181+sshMocks.createSshSandboxSessionFromSettings.mock.calls[0]?.[0],
182+"ssh session settings",
178183);
179-expect(sshMocks.runSshSandboxCommand).toHaveBeenCalledWith(
180-expect.objectContaining({
181-remoteCommand: expect.stringContaining("/remote/openclaw/openclaw-ssh-agent-worker"),
182-}),
184+expect(sessionSettings.target).toBe("peter@example.com:2222");
185+expect(sessionSettings.workspaceRoot).toBe("/remote/openclaw");
186+const commandParams = requireRecord(
187+sshMocks.runSshSandboxCommand.mock.calls[0]?.[0],
188+"ssh run command params",
183189);
190+expect(commandParams.remoteCommand).toContain("/remote/openclaw/openclaw-ssh-agent-worker");
184191});
185192186193it("removes runtimes by deleting the remote scope root", async () => {
@@ -198,12 +205,12 @@ describe("ssh sandbox backend", () => {
198205config: createConfig(),
199206});
200207201-expect(sshMocks.runSshSandboxCommand).toHaveBeenCalledWith(
202-expect.objectContaining({
203-allowFailure: true,
204-remoteCommand: expect.stringContaining('rm -rf -- "$1"'),
205-}),
208+const commandParams = requireRecord(
209+sshMocks.runSshSandboxCommand.mock.calls[0]?.[0],
210+"ssh run command params",
206211);
212+expect(commandParams.allowFailure).toBe(true);
213+expect(commandParams.remoteCommand).toContain('rm -rf -- "$1"');
207214});
208215209216it("creates a remote-canonical backend that seeds once and reuses ssh exec", async () => {
@@ -277,25 +284,27 @@ describe("ssh sandbox backend", () => {
277284usePty: false,
278285});
279286280-expect(execSpec.argv).toEqual(
281-expect.arrayContaining(["ssh", "-F", createSession().configPath, "-T", createSession().host]),
282-);
287+expect(execSpec.argv.slice(0, 5)).toEqual([
288+"ssh",
289+"-F",
290+createSession().configPath,
291+"-T",
292+createSession().host,
293+]);
283294expect(execSpec.argv.at(-1)).toContain("/remote/openclaw/openclaw-ssh-agent-worker");
284295expect(sshMocks.uploadDirectoryToSshTarget).toHaveBeenCalledTimes(2);
285-expect(sshMocks.uploadDirectoryToSshTarget).toHaveBeenNthCalledWith(
286-1,
287-expect.objectContaining({
288-localDir: "/tmp/workspace",
289-remoteDir: expect.stringContaining("/workspace"),
290-}),
296+const workspaceUploadParams = requireRecord(
297+sshMocks.uploadDirectoryToSshTarget.mock.calls[0]?.[0],
298+"workspace upload params",
291299);
292-expect(sshMocks.uploadDirectoryToSshTarget).toHaveBeenNthCalledWith(
293-2,
294-expect.objectContaining({
295-localDir: "/tmp/agent",
296-remoteDir: expect.stringContaining("/agent"),
297-}),
300+expect(workspaceUploadParams.localDir).toBe("/tmp/workspace");
301+expect(workspaceUploadParams.remoteDir).toContain("/workspace");
302+const agentUploadParams = requireRecord(
303+sshMocks.uploadDirectoryToSshTarget.mock.calls[1]?.[0],
304+"agent upload params",
298305);
306+expect(agentUploadParams.localDir).toBe("/tmp/agent");
307+expect(agentUploadParams.remoteDir).toContain("/agent");
299308300309await backend.finalizeExec?.({
301310status: "completed",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。