palmier 1.1.22 → 1.1.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/DISCLAIMER.md +4 -2
  2. package/README.md +2 -19
  3. package/dist/agents/agent-instructions.md +0 -5
  4. package/dist/agents/agent.d.ts +3 -12
  5. package/dist/agents/agent.js +0 -2
  6. package/dist/agents/aider.js +2 -7
  7. package/dist/agents/claude.js +2 -12
  8. package/dist/agents/cline.js +2 -7
  9. package/dist/agents/codex.js +2 -4
  10. package/dist/agents/copilot.js +2 -10
  11. package/dist/agents/cursor.js +2 -7
  12. package/dist/agents/deepagents.js +2 -7
  13. package/dist/agents/droid.js +2 -7
  14. package/dist/agents/goose.js +2 -4
  15. package/dist/agents/grok.js +2 -7
  16. package/dist/agents/hermes.js +2 -7
  17. package/dist/agents/kimi.js +2 -6
  18. package/dist/agents/kiro.js +2 -7
  19. package/dist/agents/openclaw.js +1 -1
  20. package/dist/agents/opencode.js +2 -7
  21. package/dist/agents/qoder.js +2 -7
  22. package/dist/agents/qwen.js +2 -4
  23. package/dist/agents/shared-prompt.d.ts +0 -1
  24. package/dist/agents/shared-prompt.js +1 -8
  25. package/dist/agents/wizard.js +0 -2
  26. package/dist/commands/run.d.ts +1 -2
  27. package/dist/commands/run.js +97 -180
  28. package/dist/index.js +0 -22
  29. package/dist/password-store.d.ts +1 -3
  30. package/dist/password-store.js +1 -7
  31. package/dist/pending-requests.d.ts +3 -5
  32. package/dist/pwa/assets/index-CXiDfnsf.js +117 -0
  33. package/dist/pwa/assets/index-DWgTuvMe.css +1 -0
  34. package/dist/pwa/assets/{web-DQDmufih.js → web-BIh8c8oo.js} +1 -1
  35. package/dist/pwa/assets/{web-ew6AFUex.js → web-DTphq1C9.js} +1 -1
  36. package/dist/pwa/assets/{web-Dp5Zj6HJ.js → web-durUDXGk.js} +1 -1
  37. package/dist/pwa/index.html +2 -2
  38. package/dist/rpc-handler.js +1 -11
  39. package/dist/transports/http-transport.js +0 -37
  40. package/dist/types.d.ts +2 -10
  41. package/package.json +1 -1
  42. package/dist/commands/passwords.d.ts +0 -3
  43. package/dist/commands/passwords.js +0 -25
  44. package/dist/pwa/assets/index-ByB7B0d2.css +0 -1
  45. package/dist/pwa/assets/index-rqAuAC0q.js +0 -121
package/DISCLAIMER.md CHANGED
@@ -10,7 +10,7 @@ Palmier spawns third-party AI agent CLIs (such as Claude Code, Codex CLI, GitHub
10
10
  - **Execute arbitrary shell commands** with your user permissions
11
11
  - **Make network requests** and interact with external services
12
12
 
13
- AI agents may produce unexpected, incorrect, or harmful outputs. **You are solely responsible for reviewing and approving all actions taken by AI agents on your system.** The authors of Palmier have no control over the behavior of third-party AI agents and accept no liability for their actions.
13
+ AI agents may produce unexpected, incorrect, or harmful outputs. **You are solely responsible for all actions taken by AI agents on your system, including actions taken without per-action approval.** The authors of Palmier have no control over the behavior of third-party AI agents and accept no liability for their actions.
14
14
 
15
15
  ## Agent CLI Installation
16
16
 
@@ -20,10 +20,12 @@ Agent CLIs that Palmier installed (those carrying a Palmier-managed version stam
20
20
 
21
21
  ## Unattended and Scheduled Execution
22
22
 
23
+ Palmier runs agents with tool approvals bypassed whenever the agent CLI supports it. Agents can act without asking first.
24
+
23
25
  Tasks can be configured to run on schedules (cron) or in response to events without active supervision. You should:
24
26
 
25
27
  - Use the **confirmation** feature for sensitive tasks
26
- - Restrict **permissions** granted to agents to the minimum necessary
28
+ - Limit what the **host's user account** can access, for example by using a dedicated account, container or VM
27
29
  - Regularly review **task history and results**
28
30
  - Maintain **backups** of any important data in directories where agents operate
29
31
 
package/README.md CHANGED
@@ -13,7 +13,7 @@ The control surface is bidirectional:
13
13
  * **Phone → agents:** start ad-hoc sessions, register schedule- or event-triggered tasks, inspect session output, and respond to agent input/confirmation requests.
14
14
  * **Agents → phone:** agents can read device state (location, calendar, contacts, notifications, SMS, battery) and trigger actions (push notifications, full-screen alarms, SMS, email, contact/calendar writes, ringer mode).
15
15
 
16
- Capability access is opt-in per device: each capability is gated behind an Android permission and a per-host toggle. An optional yolo mode auto-approves agent input/confirmation requests.
16
+ Capability access is opt-in per device: each capability is gated behind an Android permission and a per-host toggle. Agents always run in yolo mode (all tool calls auto-approved) when their CLI supports it.
17
17
 
18
18
  ## Quick Start
19
19
 
@@ -158,21 +158,7 @@ Revoking the linked device also clears the host's linked-device record; device c
158
158
 
159
159
  Palmier can store website passwords and PINs like a browser's password manager so agents can sign in to sites without ever seeing the credentials. When an agent driving a browser (via the `playwright-cli` skill) reaches a login or PIN field, it calls the `fill-password` tool with the page URL, the username, and the field's element ref. Palmier matches the saved secret by **origin**, fills it directly into the live browser session, and presses Enter to submit the form in the same step — so the plaintext secret sits on the page for as little time as possible and never enters the agent's context. If nothing is saved for that `(origin, username)`, Palmier prompts you in the app with a masked dialog. The dialog has a "Save for next time" checkbox (on by default): leave it checked to store the secret for reuse, or uncheck it to fill it just this once without saving. Either way it is filled into the page. The plaintext secret is never returned to the agent and is never written to task history.
160
160
 
161
- Saved passwords and PINs are encrypted at rest with AES-256-GCM under a host-local key, both stored in `~/.config/palmier/` (`passwords.enc` and `password-key`). Manage them from the app via **Manage saved passwords** in the side panel (lists origin and username only, with per-entry delete), or from the host CLI:
162
-
163
- ```bash
164
- # List saved passwords (origin and username only — never the password)
165
- palmier passwords list
166
-
167
- # Delete a specific saved password
168
- palmier passwords delete https://example.com alice
169
-
170
- # Delete every saved password for an origin
171
- palmier passwords delete https://example.com
172
-
173
- # Delete all saved passwords
174
- palmier passwords clear
175
- ```
161
+ Saved passwords and PINs are encrypted at rest with AES-256-GCM under a host-local key, both stored in `~/.config/palmier/` (`passwords.enc` and `password-key`). Manage them from the app via **Manage saved passwords** in the side panel (lists origin and username only, with per-entry delete).
176
162
 
177
163
  ### The `init` Command
178
164
 
@@ -229,9 +215,6 @@ The default network interface is detected once during `palmier init` and saved t
229
215
  | `palmier clients list` | List active client tokens |
230
216
  | `palmier clients revoke <token>` | Revoke a specific client token |
231
217
  | `palmier clients revoke-all` | Revoke all client tokens |
232
- | `palmier passwords list` | List saved passwords (origin and username only) |
233
- | `palmier passwords delete <origin> [username]` | Delete a saved password (omit username to delete all for the origin) |
234
- | `palmier passwords clear` | Delete all saved passwords |
235
218
  | `palmier info` | Show host connection info (address, mode) |
236
219
  | `palmier serve` | Run the persistent RPC handler (default command) |
237
220
  | `palmier restart` | Restart the palmier serve daemon |
@@ -22,11 +22,6 @@ On the line right before that marker, in the same final message, print the model
22
22
 
23
23
  Do this at the end of every response, including responses to follow-up messages.
24
24
 
25
- ## Permissions
26
-
27
- Whenever a tool you are trying to use is denied or you lack the required permissions, print each required permission on its own line to stdout using this exact format:
28
- [PALMIER_PERMISSION] <tool_name> | <description>
29
-
30
25
  ## Browsers
31
26
 
32
27
  Whenever the task needs a browser, launch it with the Playwright CLI (`playwright-cli open`). Do not use any other browser tool, automation library, or launch method.
@@ -1,4 +1,4 @@
1
- import type { ParsedTask, RequiredPermission } from "../types.js";
1
+ import type { ParsedTask } from "../types.js";
2
2
  export interface CommandLine {
3
3
  args: string[];
4
4
  /** If provided, the string is written to the process's stdin and then the pipe is closed. */
@@ -25,11 +25,6 @@ export interface AgentTool {
25
25
  * can sign in before configuration continues. Leave undefined for agents that auth on
26
26
  * first run with no separate command. */
27
27
  authArgs?: string[];
28
- /** Whether this agent supports permission overrides (e.g. --allowedTools).
29
- * When falsy, the permissions section is omitted from agent instructions. */
30
- supportsPermissions?: boolean;
31
- /** Whether this agent supports yolo mode (auto-approve all tools). */
32
- supportsYolo?: boolean;
33
28
  /** When true, the run loop persists the agent's stderr output only if the invocation fails. */
34
29
  suppressStdErr?: boolean;
35
30
  /** Matches the model name (capture group 1) in the banner the CLI prints on stderr.
@@ -40,10 +35,8 @@ export interface AgentTool {
40
35
  * Surfaced next to the agent in the installer. */
41
36
  freeUsage?: string;
42
37
  /** Return the command and args used to run a task. If followupPrompt is provided, use it instead of the task's prompt,
43
- * and treat it as a continuation of the original run (reuse the same session, etc).
44
- * extraPermissions: pass an array of RequiredPermission for transient permissions granted for this run only,
45
- * or pass `"yolo"` to enable yolo mode (auto-approve all tools, skip permission instructions). */
46
- getTaskRunCommandLine(task: ParsedTask, followupPrompt?: string, extraPermissions?: RequiredPermission[] | "yolo"): CommandLine;
38
+ * and treat it as a continuation of the original run (reuse the same session, etc). */
39
+ getTaskRunCommandLine(task: ParsedTask, followupPrompt?: string): CommandLine;
47
40
  }
48
41
  export declare function getPromptCommandLine(agent: AgentTool, prompt: string): CommandLine;
49
42
  export declare function probeAgent(agent: AgentTool): Promise<boolean>;
@@ -55,8 +48,6 @@ export declare function getNpmInstalledVersion(npmPackage: string): string | nul
55
48
  export interface DetectedAgent {
56
49
  key: string;
57
50
  label: string;
58
- supportsPermissions?: boolean;
59
- supportsYolo?: boolean;
60
51
  npmPackage?: string;
61
52
  /** Runtime marker for "managed by Palmier" — present iff Palmier installed/manages this agent. */
62
53
  version?: string;
@@ -120,8 +120,6 @@ export async function detectAgents(previous, newlyInstalled) {
120
120
  detected.push({
121
121
  key,
122
122
  label: agent.label,
123
- supportsPermissions: agent.supportsPermissions,
124
- supportsYolo: agent.supportsYolo,
125
123
  ...(agent.npmPackage ? { npmPackage: agent.npmPackage } : {}),
126
124
  ...(version ? { version } : {}),
127
125
  });
@@ -4,14 +4,9 @@ export const aiderAgent = {
4
4
  command: "aider",
5
5
  promptArgs: ["--message"],
6
6
  probeArg: "--version",
7
- supportsYolo: true,
8
- getTaskRunCommandLine(task, followupPrompt, extraPermissions) {
9
- const yolo = extraPermissions === "yolo";
7
+ getTaskRunCommandLine(task, followupPrompt) {
10
8
  const prompt = followupPrompt ?? getAgentInstructions(task);
11
- const args = [];
12
- if (yolo) {
13
- args.push("--yes-always");
14
- }
9
+ const args = ["--yes-always"];
15
10
  args.push("--message", prompt);
16
11
  return { args };
17
12
  },
@@ -5,21 +5,11 @@ export const claudeAgent = {
5
5
  promptArgs: ["-p"],
6
6
  probeArg: "--version",
7
7
  authArgs: ["auth", "login"],
8
- supportsPermissions: true,
9
- supportsYolo: true,
10
8
  npmPackage: "@anthropic-ai/claude-code",
11
9
  freeUsage: "Free with Claude Pro",
12
- getTaskRunCommandLine(task, followupPrompt, extraPermissions) {
13
- const yolo = extraPermissions === "yolo";
10
+ getTaskRunCommandLine(task, followupPrompt) {
14
11
  const prompt = followupPrompt ?? getAgentInstructions(task);
15
- const args = ["--permission-mode", yolo ? "bypassPermissions" : "acceptEdits", "-p"];
16
- if (!yolo) {
17
- args.push("--allowedTools", "WebFetch", "Skill(playwright-cli:*)", "Bash(curl:*)", "Bash(wget:*)", "Bash(playwright:*)", "Bash(playwright-cli:*)");
18
- const allPerms = [...(task.frontmatter.permissions ?? []), ...(extraPermissions ?? [])];
19
- for (const p of allPerms) {
20
- args.push(p.name);
21
- }
22
- }
12
+ const args = ["--permission-mode", "bypassPermissions", "-p"];
23
13
  if (followupPrompt) {
24
14
  args.push("-c");
25
15
  }
@@ -4,15 +4,10 @@ export const clineAgent = {
4
4
  command: "cline",
5
5
  promptArgs: ["--yolo", "-p"],
6
6
  probeArg: "--version",
7
- supportsYolo: true,
8
7
  npmPackage: "cline",
9
- getTaskRunCommandLine(task, followupPrompt, extraPermissions) {
10
- const yolo = extraPermissions === "yolo";
8
+ getTaskRunCommandLine(task, followupPrompt) {
11
9
  const prompt = followupPrompt ?? getAgentInstructions(task);
12
- const args = [];
13
- if (yolo) {
14
- args.push("--yolo");
15
- }
10
+ const args = ["--yolo"];
16
11
  args.push(prompt);
17
12
  return { args };
18
13
  },
@@ -5,15 +5,13 @@ export const codexAgent = {
5
5
  promptArgs: ["exec", "--skip-git-repo-check"],
6
6
  probeArg: "--version",
7
7
  authArgs: ["login"],
8
- supportsYolo: true,
9
8
  suppressStdErr: true,
10
9
  stderrModelPattern: /^model: (.+)$/m,
11
10
  npmPackage: "@openai/codex",
12
11
  freeUsage: "Free Tier",
13
- getTaskRunCommandLine(task, followupPrompt, extraPermissions) {
14
- const yolo = extraPermissions === "yolo";
12
+ getTaskRunCommandLine(task, followupPrompt) {
15
13
  const prompt = followupPrompt ?? getAgentInstructions(task);
16
- const args = ["exec", "--skip-git-repo-check", "--sandbox", yolo ? "danger-full-access" : "workspace-write"];
14
+ const args = ["exec", "--skip-git-repo-check", "--sandbox", "danger-full-access"];
17
15
  if (followupPrompt) {
18
16
  args.push("resume", "--last");
19
17
  }
@@ -5,21 +5,13 @@ export const copilotAgent = {
5
5
  promptArgs: ["-p"],
6
6
  probeArg: "-v",
7
7
  authArgs: ["login"],
8
- supportsYolo: true,
9
8
  suppressStdErr: true,
10
9
  npmPackage: "@github/copilot",
11
10
  freeUsage: "Free Tier",
12
- getTaskRunCommandLine(task, followupPrompt, extraPermissions) {
13
- const yolo = extraPermissions === "yolo";
11
+ getTaskRunCommandLine(task, followupPrompt) {
14
12
  const prompt = followupPrompt ?? getAgentInstructions(task);
15
13
  const args = ["-p", prompt];
16
- if (yolo) {
17
- args.push("--yolo");
18
- }
19
- else {
20
- const allPerms = [...(task.frontmatter.permissions ?? []), ...(extraPermissions ?? [])];
21
- args.push(`--allow-tool=${["web_fetch", ...allPerms.map((p) => p.name)].join(",")}`);
22
- }
14
+ args.push("--yolo");
23
15
  if (followupPrompt) {
24
16
  args.push("--continue");
25
17
  }
@@ -4,14 +4,9 @@ export const cursorAgent = {
4
4
  command: "cursor",
5
5
  promptArgs: ["-p"],
6
6
  probeArg: "--version",
7
- supportsYolo: true,
8
- getTaskRunCommandLine(task, followupPrompt, extraPermissions) {
9
- const yolo = extraPermissions === "yolo";
7
+ getTaskRunCommandLine(task, followupPrompt) {
10
8
  const prompt = followupPrompt ?? getAgentInstructions(task);
11
- const args = [];
12
- if (yolo) {
13
- args.push("--force");
14
- }
9
+ const args = ["--force"];
15
10
  if (followupPrompt) {
16
11
  args.push("--continue");
17
12
  }
@@ -4,14 +4,9 @@ export const deepAgentsAgent = {
4
4
  command: "deepagents",
5
5
  promptArgs: ["--non-interactive"],
6
6
  probeArg: "--version",
7
- supportsYolo: true,
8
- getTaskRunCommandLine(task, followupPrompt, extraPermissions) {
9
- const yolo = extraPermissions === "yolo";
7
+ getTaskRunCommandLine(task, followupPrompt) {
10
8
  const prompt = followupPrompt ?? getAgentInstructions(task);
11
- const args = [];
12
- if (yolo) {
13
- args.push("--auto-approve");
14
- }
9
+ const args = ["--auto-approve"];
15
10
  if (followupPrompt) {
16
11
  args.push("--resume");
17
12
  }
@@ -4,15 +4,10 @@ export const droidAgent = {
4
4
  command: "droid",
5
5
  promptArgs: ["exec"],
6
6
  probeArg: "--version",
7
- supportsYolo: true,
8
7
  npmPackage: "@factory/cli",
9
- getTaskRunCommandLine(task, followupPrompt, extraPermissions) {
10
- const yolo = extraPermissions === "yolo";
8
+ getTaskRunCommandLine(task, followupPrompt) {
11
9
  const prompt = followupPrompt ?? getAgentInstructions(task);
12
- const args = ["exec", "--session-id", task.frontmatter.id];
13
- if (yolo) {
14
- args.push("--skip-permissions-unsafe");
15
- }
10
+ const args = ["exec", "--session-id", task.frontmatter.id, "--skip-permissions-unsafe"];
16
11
  args.push(prompt);
17
12
  return { args };
18
13
  },
@@ -4,15 +4,13 @@ export const gooseAgent = {
4
4
  command: "goose",
5
5
  promptArgs: ["run", "--text"],
6
6
  probeArg: "--version",
7
- supportsYolo: true,
8
- getTaskRunCommandLine(task, followupPrompt, extraPermissions) {
9
- const yolo = extraPermissions === "yolo";
7
+ getTaskRunCommandLine(task, followupPrompt) {
10
8
  const prompt = followupPrompt ?? getAgentInstructions(task);
11
9
  const args = ["run"];
12
10
  if (followupPrompt) {
13
11
  args.push("--resume");
14
12
  }
15
13
  args.push("--text", prompt);
16
- return { args, ...(yolo ? { env: { GOOSE_MODE: "auto" } } : {}) };
14
+ return { args, env: { GOOSE_MODE: "auto" } };
17
15
  },
18
16
  };
@@ -5,16 +5,11 @@ export const grokAgent = {
5
5
  promptArgs: ["-p"],
6
6
  probeArg: "--version",
7
7
  authArgs: ["login"],
8
- supportsYolo: true,
9
8
  npmPackage: "@xai-official/grok",
10
9
  freeUsage: "Free Tier",
11
- getTaskRunCommandLine(task, followupPrompt, extraPermissions) {
12
- const yolo = extraPermissions === "yolo";
10
+ getTaskRunCommandLine(task, followupPrompt) {
13
11
  const prompt = followupPrompt ?? getAgentInstructions(task);
14
- const args = [];
15
- if (yolo) {
16
- args.push("--always-approve");
17
- }
12
+ const args = ["--always-approve"];
18
13
  if (followupPrompt) {
19
14
  args.push("-c");
20
15
  }
@@ -4,14 +4,9 @@ export const hermesAgent = {
4
4
  command: "hermes",
5
5
  promptArgs: ["chat", "-q"],
6
6
  probeArg: "--version",
7
- supportsYolo: true,
8
- getTaskRunCommandLine(task, followupPrompt, extraPermissions) {
9
- const yolo = extraPermissions === "yolo";
7
+ getTaskRunCommandLine(task, followupPrompt) {
10
8
  const prompt = followupPrompt ?? getAgentInstructions(task);
11
- const args = ["chat"];
12
- if (yolo) {
13
- args.push("--trust-all-tools");
14
- }
9
+ const args = ["chat", "--trust-all-tools"];
15
10
  if (followupPrompt) {
16
11
  args.push("--continue");
17
12
  }
@@ -4,19 +4,15 @@ export const kimiAgent = {
4
4
  command: "kimi",
5
5
  promptArgs: ["-p"],
6
6
  probeArg: "--version",
7
- supportsYolo: false,
8
7
  suppressStdErr: true,
9
8
  npmPackage: "@moonshot-ai/kimi-code",
10
- getTaskRunCommandLine(task, followupPrompt, extraPermissions) {
11
- const yolo = extraPermissions === "yolo";
9
+ getTaskRunCommandLine(task, followupPrompt) {
12
10
  const prompt = followupPrompt ?? getAgentInstructions(task);
13
11
  const args = [];
14
- if (yolo) {
15
- args.push("--yolo");
16
- }
17
12
  if (followupPrompt) {
18
13
  args.push("--continue");
19
14
  }
15
+ // Print mode (-p) already implies yolo.
20
16
  args.push("-p", prompt);
21
17
  return { args };
22
18
  },
@@ -4,14 +4,9 @@ export const kiroAgent = {
4
4
  command: "kiro-cli",
5
5
  promptArgs: ["--no-interactive"],
6
6
  probeArg: "--version",
7
- supportsYolo: true,
8
- getTaskRunCommandLine(task, followupPrompt, extraPermissions) {
9
- const yolo = extraPermissions === "yolo";
7
+ getTaskRunCommandLine(task, followupPrompt) {
10
8
  const prompt = followupPrompt ?? getAgentInstructions(task);
11
- const args = [];
12
- if (yolo) {
13
- args.push("--trust-all-tools");
14
- }
9
+ const args = ["--trust-all-tools"];
15
10
  if (followupPrompt) {
16
11
  args.push("--resume");
17
12
  }
@@ -5,7 +5,7 @@ export const openClawAgent = {
5
5
  promptArgs: ["agent", "--local", "--agent", "main", "--message"],
6
6
  probeArg: "--version",
7
7
  npmPackage: "openclaw",
8
- getTaskRunCommandLine(task, followupPrompt, extraPermissions) {
8
+ getTaskRunCommandLine(task, followupPrompt) {
9
9
  const prompt = followupPrompt ?? getAgentInstructions(task);
10
10
  // OpenClaw does not support stdin as prompt.
11
11
  const args = ["agent", "--local", "--session-id", task.frontmatter.id, "--message", prompt];
@@ -4,15 +4,10 @@ export const openCodeAgent = {
4
4
  command: "opencode",
5
5
  promptArgs: ["run"],
6
6
  probeArg: "--version",
7
- supportsYolo: true,
8
7
  npmPackage: "opencode-ai",
9
- getTaskRunCommandLine(task, followupPrompt, extraPermissions) {
10
- const yolo = extraPermissions === "yolo";
8
+ getTaskRunCommandLine(task, followupPrompt) {
11
9
  const prompt = followupPrompt ?? getAgentInstructions(task);
12
- const args = ["run"];
13
- if (yolo) {
14
- args.push("--dangerously-skip-permissions");
15
- }
10
+ const args = ["run", "--dangerously-skip-permissions"];
16
11
  if (followupPrompt) {
17
12
  args.push("--continue");
18
13
  }
@@ -5,16 +5,11 @@ export const qoderAgent = {
5
5
  promptArgs: ["-p"],
6
6
  probeArg: "--version",
7
7
  authArgs: ["login"],
8
- supportsYolo: true,
9
8
  npmPackage: "@qoder-ai/qodercli",
10
9
  freeUsage: "Free Tier",
11
- getTaskRunCommandLine(task, followupPrompt, extraPermissions) {
12
- const yolo = extraPermissions === "yolo";
10
+ getTaskRunCommandLine(task, followupPrompt) {
13
11
  const prompt = followupPrompt ?? getAgentInstructions(task);
14
- const args = [];
15
- if (yolo) {
16
- args.push("--yolo");
17
- }
12
+ const args = ["--yolo"];
18
13
  if (followupPrompt) {
19
14
  args.push("-c");
20
15
  }
@@ -5,12 +5,10 @@ export const qwenAgent = {
5
5
  promptArgs: ["-p"],
6
6
  probeArg: "--version",
7
7
  authArgs: ["auth", "qwen-oauth"],
8
- supportsYolo: true,
9
8
  npmPackage: "@qwen-code/qwen-code",
10
- getTaskRunCommandLine(task, followupPrompt, extraPermissions) {
11
- const yolo = extraPermissions === "yolo";
9
+ getTaskRunCommandLine(task, followupPrompt) {
12
10
  const prompt = followupPrompt ?? getAgentInstructions(task);
13
- const args = ["--approval-mode", yolo ? "yolo" : "auto-edit"];
11
+ const args = ["--approval-mode", "yolo"];
14
12
  if (followupPrompt) {
15
13
  args.push("-c");
16
14
  }
@@ -2,5 +2,4 @@ import type { ParsedTask } from "../types.js";
2
2
  export declare function getAgentInstructions(task: ParsedTask): string;
3
3
  export declare const TASK_SUCCESS_MARKER = "[PALMIER_TASK_SUCCESS]";
4
4
  export declare const TASK_FAILURE_MARKER = "[PALMIER_TASK_FAILURE]";
5
- export declare const TASK_PERMISSION_PREFIX = "[PALMIER_PERMISSION]";
6
5
  export declare const AGENT_MODEL_PREFIX = "[PALMIER_AGENT_MODEL]";
@@ -3,22 +3,15 @@ import * as path from "path";
3
3
  import { fileURLToPath } from "url";
4
4
  import { loadConfig } from "../config.js";
5
5
  import { generateEndpointDocs } from "../agent-tools.js";
6
- import { getAgent } from "./agent.js";
7
6
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
7
  const AGENT_INSTRUCTIONS_TEMPLATE = fs.readFileSync(path.join(__dirname, "agent-instructions.md"), "utf-8");
9
8
  export function getAgentInstructions(task) {
10
9
  const port = loadConfig().httpPort ?? 7256;
11
10
  const taskDescription = task.frontmatter.user_prompt;
12
- let instructions = AGENT_INSTRUCTIONS_TEMPLATE
11
+ return AGENT_INSTRUCTIONS_TEMPLATE
13
12
  .replace(/\{\{ENDPOINT_DOCS\}\}/g, generateEndpointDocs(port, task.frontmatter.id))
14
13
  .replace(/\{\{TASK_DESCRIPTION\}\}/g, taskDescription);
15
- const agent = getAgent(task.frontmatter.agent);
16
- if (!agent.supportsPermissions || !!task.frontmatter.yolo_mode) {
17
- instructions = instructions.replace(/## Permissions\r?\n[\s\S]*?(?=## |\r?\n---)/m, "");
18
- }
19
- return instructions;
20
14
  }
21
15
  export const TASK_SUCCESS_MARKER = "[PALMIER_TASK_SUCCESS]";
22
16
  export const TASK_FAILURE_MARKER = "[PALMIER_TASK_FAILURE]";
23
- export const TASK_PERMISSION_PREFIX = "[PALMIER_PERMISSION]";
24
17
  export const AGENT_MODEL_PREFIX = "[PALMIER_AGENT_MODEL]";
@@ -60,8 +60,6 @@ export async function pickAndInstallAgent(current, options = {}) {
60
60
  const record = {
61
61
  key: choice.key,
62
62
  label: choice.label,
63
- ...(tool.supportsPermissions ? { supportsPermissions: true } : {}),
64
- ...(tool.supportsYolo ? { supportsYolo: true } : {}),
65
63
  npmPackage: choice.npmPackage,
66
64
  ...(version ? { version } : {}),
67
65
  };
@@ -1,10 +1,9 @@
1
1
  import type { AgentTool } from "../agents/agent.js";
2
- import type { TaskRunningState, RequiredPermission } from "../types.js";
2
+ import type { TaskRunningState } from "../types.js";
3
3
  export declare function stripPalmierMarkers(output: string): string;
4
4
  export declare function runCommand(taskId: string): Promise<void>;
5
5
  /** Only links to files that exist count, so example links echoed from the prompt are ignored. */
6
6
  export declare function listLinkedTaskFiles(taskDir: string, runId: string, output: string): string[];
7
- export declare function parsePermissions(output: string): RequiredPermission[];
8
7
  export declare function parseAgentModel(output: string): string | undefined;
9
8
  /** Returns a function that accumulates stderr chunks and yields the model once the CLI banner reveals it. */
10
9
  export declare function createCliModelCapture(agent: AgentTool): (stderrChunk: string) => string | undefined;