Stop computer bash commands on the computer itself
The sandbox ignores sandbox_execute_bash's timeout and runs every call in one shared shell session, so a command that never ended (a network read without a timeout, a prompt) kept running after the call gave up, and every later command on that computer, from any run, timed out behind it. Each command now runs in its own bash under coreutils timeout (at most ComputerCommandMaxSeconds, below McpToolTimeoutMs), reading no input, and says when it was stopped. Replies' env list says where each key comes from and that workspace, computer and install-wide envs reach every bot there, so bots stop telling users a workspace's keys must be set per bot. The computer prompt says installed programs may be gone after a restart. An empty open-only task list says closed tasks aren't shown, and update_task says when a status was already set. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
@@ -16,6 +16,18 @@ describe("composeEnvsNote", () => {
|
||||
expect(note).toContain("Don't ask the user for them");
|
||||
});
|
||||
|
||||
test("says where each env comes from", () => {
|
||||
const note = composeEnvsNote({
|
||||
on_computer: [{ key: "DB_PASSWORD", description: "Production database", paradigm: "workspace" }],
|
||||
tools_only: [{ key: "TOKEN", description: "", paradigm: "user" }],
|
||||
has_computer: true,
|
||||
});
|
||||
|
||||
expect(note).toContain("- DB_PASSWORD (this workspace's, every bot in it has it): Production database");
|
||||
expect(note).toContain("- TOKEN (this user's own, for you)");
|
||||
expect(note).toContain("never needs setting again per bot");
|
||||
});
|
||||
|
||||
test("never mentions values", () => {
|
||||
const note = composeEnvsNote({ on_computer: [{ key: "K", description: "d" }], tools_only: [], has_computer: true });
|
||||
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
type Env = { key: string; description: string };
|
||||
import type { EnvParadigm } from "@/src/dict/env-dict";
|
||||
|
||||
type Env = { key: string; description: string; paradigm?: EnvParadigm };
|
||||
|
||||
type Params = {
|
||||
/**
|
||||
@@ -16,21 +18,39 @@ type Params = {
|
||||
};
|
||||
|
||||
/**
|
||||
* Added to a chat reply so the bot knows which envs it already has (keys
|
||||
* and descriptions, never values). Without it a reply can't tell, asks the
|
||||
* user for keys that are set (`request_secret`), or "checks" them with
|
||||
* `show_secret` or a shell where they aren't loaded.
|
||||
* Where an env comes from, as the bot is told: who else has it.
|
||||
*/
|
||||
const EnvSources: Record<EnvParadigm, string> = {
|
||||
general: "install-wide, every bot has it",
|
||||
workspace: "this workspace's, every bot in it has it",
|
||||
computer: "this computer's, every bot on it has it",
|
||||
bot: "yours, for every user",
|
||||
user: "this user's own, for you",
|
||||
};
|
||||
|
||||
/**
|
||||
* Added to a chat reply so the bot knows which envs it already has (keys,
|
||||
* descriptions and where each comes from, never values). Without it a
|
||||
* reply can't tell, asks the user for keys that are set
|
||||
* (`request_secret`), "checks" them with `show_secret` or a shell where
|
||||
* they aren't loaded, or tells the user a workspace's keys must be set
|
||||
* again for every bot.
|
||||
*/
|
||||
export default function composeEnvsNote({ on_computer, tools_only, has_computer }: Params) {
|
||||
const list = (envs: Env[]) =>
|
||||
envs.map((env) => `- ${env.key}${env.description ? `: ${env.description}` : ""}`).join("\n");
|
||||
envs
|
||||
.map(
|
||||
(env) =>
|
||||
`- ${env.key}${env.paradigm ? ` (${EnvSources[env.paradigm]})` : ""}${env.description ? `: ${env.description}` : ""}`,
|
||||
)
|
||||
.join("\n");
|
||||
|
||||
if (!on_computer.length && !tools_only.length) {
|
||||
return `# Your envs\n\nNo envs are set for you here. If you need a secret, ask for it with request_secret.`;
|
||||
}
|
||||
|
||||
return [
|
||||
`# Your envs\n\nThese are already set for you here (keys and descriptions; you never see values). Don't ask the user for them, and don't call show_secret or run printenv to check them: this list is the check.`,
|
||||
`# Your envs\n\nThese are already set for you here (keys and descriptions; you never see values). Don't ask the user for them, and don't call show_secret or run printenv to check them: this list is the check. A workspace, computer or install-wide env reaches every bot there the same way, so it never needs setting again per bot.`,
|
||||
on_computer.length
|
||||
? `On your computer, as $KEY in a task's shell and code (start_task; search_computers doesn't load them):\n${list(on_computer)}`
|
||||
: "",
|
||||
|
||||
Reference in New Issue
Block a user