palmier 0.9.33 → 0.9.35

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.
package/DISCLAIMER.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## AI Agent Execution
6
6
 
7
- Palmier spawns third-party AI agent CLIs (such as Claude Code, Gemini CLI, Codex CLI, GitHub Copilot, and others) that can:
7
+ Palmier spawns third-party AI agent CLIs (such as Claude Code, Codex CLI, GitHub Copilot, and others) that can:
8
8
 
9
9
  - **Read, create, modify, and delete files** on your machine
10
10
  - **Execute arbitrary shell commands** with your user permissions
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  **Website:** [palmier.me](https://www.palmier.me) | **Web App:** [app.palmier.me](https://app.palmier.me) | **Android App:** [caihongxu/palmier-android](https://github.com/caihongxu/palmier-android)
8
8
 
9
- Palmier installs, manages, and runs AI agent CLIs (Claude Code, Gemini CLI, Codex, etc.) on your machine using your existing AI subscriptions, and exposes them to your phone through a mobile-friendly PWA and an Android app. It runs as a background daemon and is agent-agnostic — adding support for a new CLI is a config change, not a code change.
9
+ Palmier installs, manages, and runs AI agent CLIs (Claude Code, Codex, GitHub Copilot, etc.) on your machine using your existing AI subscriptions, and exposes them to your phone through a mobile-friendly PWA and an Android app. It runs as a background daemon and is agent-agnostic — adding support for a new CLI is a config change, not a code change.
10
10
 
11
11
  The control surface is bidirectional:
12
12
 
@@ -33,7 +33,7 @@ Capability access is opt-in per device: each capability is gated behind an Andro
33
33
  ```bash
34
34
  npm install -g palmier && palmier init
35
35
  ```
36
- The wizard creates `~/palmier` as the task storage directory, detects existing agent CLIs or offers to install supported ones ([Claude Code](https://docs.anthropic.com/en/docs/claude-code), [Gemini CLI](https://github.com/google-gemini/gemini-cli), [Codex CLI](https://github.com/openai/codex), [GitHub Copilot](https://github.com/github/gh-copilot), [OpenClaw](https://openclaw.ai/), or [others](https://www.palmier.me/agents)), configures access, installs the background daemon, and starts pairing.
36
+ The wizard creates `~/palmier` as the task storage directory, detects existing agent CLIs or offers to install supported ones ([Claude Code](https://docs.anthropic.com/en/docs/claude-code), [Codex CLI](https://github.com/openai/codex), [GitHub Copilot](https://github.com/github/gh-copilot), [OpenClaw](https://openclaw.ai/), or [others](https://www.palmier.me/agents)), configures access, installs the background daemon, and starts pairing.
37
37
  2. Open `http://localhost:7256` to access the app locally — no pairing needed.
38
38
  3. To access from other devices, enter the pairing code shown after init into the [PWA](https://app.palmier.me) or the [Android app](https://github.com/caihongxu/palmier-android/releases/latest/download/palmier.apk).
39
39
 
@@ -18,6 +18,10 @@ When you are done, output exactly one of these markers as the very last line on
18
18
  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:
19
19
  [PALMIER_PERMISSION] <tool_name> | <description>
20
20
 
21
+ ## Browsers
22
+
23
+ When the user asks you to open a browser, launch it in headed mode (visible UI), not headless.
24
+
21
25
  ## HTTP Endpoints
22
26
 
23
27
  {{ENDPOINT_DOCS}}
@@ -1,7 +1,6 @@
1
1
  import { execSync } from "child_process";
2
2
  import { SHELL } from "../platform/index.js";
3
3
  import { claudeAgent } from "./claude.js";
4
- import { geminiAgent } from "./gemini.js";
5
4
  import { codexAgent } from "./codex.js";
6
5
  import { droidAgent } from "./droid.js";
7
6
  import { openClawAgent } from "./openclaw.js";
@@ -56,7 +55,6 @@ export function getNpmInstalledVersion(npmPackage) {
56
55
  }
57
56
  const agentRegistry = {
58
57
  claude: claudeAgent,
59
- gemini: geminiAgent,
60
58
  codex: codexAgent,
61
59
  openclaw: openClawAgent,
62
60
  copilot: copilotAgent,
@@ -73,7 +71,7 @@ const agentRegistry = {
73
71
  qoder: qoderAgent,
74
72
  hermes: hermesAgent,
75
73
  };
76
- const TIER_ONE_ORDER = ["claude", "gemini", "codex", "copilot"];
74
+ const TIER_ONE_ORDER = ["claude", "codex", "copilot"];
77
75
  export function listInstallableAgents() {
78
76
  const out = [];
79
77
  for (const [key, agent] of Object.entries(agentRegistry)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "palmier",
3
- "version": "0.9.33",
3
+ "version": "0.9.35",
4
4
  "description": "Palmier host CLI - provisions, executes tasks, and serves NATS RPC",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Hongxu Cai",
@@ -1,3 +0,0 @@
1
- import type { AgentTool } from "./agent.js";
2
- export declare function renderPolicyToml(allowedTools: string[]): string;
3
- export declare const geminiAgent: AgentTool;
@@ -1,49 +0,0 @@
1
- import { getAgentInstructions } from "./shared-prompt.js";
2
- export function renderPolicyToml(allowedTools) {
3
- const list = allowedTools.map((t) => JSON.stringify(t)).join(", ");
4
- return [
5
- "# Generated by Palmier — do not edit.",
6
- "[[rule]]",
7
- `toolName = [${list}]`,
8
- `decision = "allow"`,
9
- "priority = 100",
10
- "",
11
- "[[rule]]",
12
- `toolName = "*"`,
13
- `decision = "deny"`,
14
- "priority = 1",
15
- "",
16
- ].join("\n");
17
- }
18
- export const geminiAgent = {
19
- label: "Gemini CLI",
20
- command: "gemini",
21
- promptArgs: ["--prompt"],
22
- probeArg: "--version",
23
- supportsPermissions: true,
24
- supportsYolo: true,
25
- npmPackage: "@google/gemini-cli",
26
- freeUsage: "Free Tier",
27
- getTaskRunCommandLine(task, followupPrompt, extraPermissions) {
28
- const yolo = extraPermissions === "yolo";
29
- const prompt = followupPrompt ?? getAgentInstructions(task);
30
- const args = ["--approval-mode", yolo ? "yolo" : "auto_edit"];
31
- const files = [];
32
- if (!yolo) {
33
- const tools = ["run_shell_command(curl)", "web_fetch"];
34
- const allPerms = [...(task.frontmatter.permissions ?? []), ...(extraPermissions ?? [])];
35
- for (const p of allPerms) {
36
- tools.push(p.name);
37
- }
38
- const policyPath = "gemini-policy.toml";
39
- files.push({ path: policyPath, content: renderPolicyToml(tools) });
40
- args.push("--admin-policy", policyPath);
41
- }
42
- if (followupPrompt) {
43
- args.push("--resume");
44
- }
45
- // Read prompt from stdin to avoid command-line length limits.
46
- args.push("--prompt", "-");
47
- return { args, stdin: prompt, ...(files.length > 0 ? { files } : {}) };
48
- },
49
- };