Gate lobster plugin tool in sandboxed contexts
This commit is contained in:
@@ -3,5 +3,11 @@ import type { ClawdbotPluginApi } from "../../src/plugins/types.js";
|
|||||||
import { createLobsterTool } from "./src/lobster-tool.js";
|
import { createLobsterTool } from "./src/lobster-tool.js";
|
||||||
|
|
||||||
export default function register(api: ClawdbotPluginApi) {
|
export default function register(api: ClawdbotPluginApi) {
|
||||||
api.registerTool(createLobsterTool(api), { optional: true });
|
api.registerTool(
|
||||||
|
(ctx) => {
|
||||||
|
if (ctx.sandboxed) return null;
|
||||||
|
return createLobsterTool(api);
|
||||||
|
},
|
||||||
|
{ optional: true },
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import path from "node:path";
|
|||||||
|
|
||||||
import { describe, expect, it } from "vitest";
|
import { describe, expect, it } from "vitest";
|
||||||
|
|
||||||
import type { ClawdbotPluginApi } from "../../../src/plugins/types.js";
|
import type { ClawdbotPluginApi, ClawdbotPluginToolContext } from "../../../src/plugins/types.js";
|
||||||
import { createLobsterTool } from "./lobster-tool.js";
|
import { createLobsterTool } from "./lobster-tool.js";
|
||||||
|
|
||||||
async function writeFakeLobster(params: {
|
async function writeFakeLobster(params: {
|
||||||
@@ -39,6 +39,20 @@ function fakeApi(): ClawdbotPluginApi {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function fakeCtx(overrides: Partial<ClawdbotPluginToolContext> = {}): ClawdbotPluginToolContext {
|
||||||
|
return {
|
||||||
|
config: {} as any,
|
||||||
|
workspaceDir: "/tmp",
|
||||||
|
agentDir: "/tmp",
|
||||||
|
agentId: "main",
|
||||||
|
sessionKey: "main",
|
||||||
|
messageChannel: undefined,
|
||||||
|
agentAccountId: undefined,
|
||||||
|
sandboxed: false,
|
||||||
|
...overrides,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
describe("lobster plugin tool", () => {
|
describe("lobster plugin tool", () => {
|
||||||
it("runs lobster and returns parsed envelope in details", async () => {
|
it("runs lobster and returns parsed envelope in details", async () => {
|
||||||
const fake = await writeFakeLobster({
|
const fake = await writeFakeLobster({
|
||||||
@@ -84,4 +98,15 @@ describe("lobster plugin tool", () => {
|
|||||||
}),
|
}),
|
||||||
).rejects.toThrow(/invalid JSON/);
|
).rejects.toThrow(/invalid JSON/);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("can be gated off in sandboxed contexts", async () => {
|
||||||
|
const api = fakeApi();
|
||||||
|
const factoryTool = (ctx: ClawdbotPluginToolContext) => {
|
||||||
|
if (ctx.sandboxed) return null;
|
||||||
|
return createLobsterTool(api);
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(factoryTool(fakeCtx({ sandboxed: true }))).toBeNull();
|
||||||
|
expect(factoryTool(fakeCtx({ sandboxed: false }))?.name).toBe("lobster");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user