From 30b871e8d2321fd37721a1c0065f2792f050e64e Mon Sep 17 00:00:00 2001 From: Slava Goltser Date: Wed, 22 Jul 2026 16:09:45 -0400 Subject: [PATCH] feat(omp): add write approval mode (#2228) Expose OMP write approval mode in the provider manifest and launch configuration. --- packages/protocol/src/provider-manifest.ts | 7 +++++++ .../src/server/agent/providers/omp/agent.test.ts | 13 +++++++++++++ .../server/agent/providers/omp/provider-config.ts | 5 +++++ .../server/src/server/daemon-e2e/agent-configs.ts | 1 + 4 files changed, 26 insertions(+) diff --git a/packages/protocol/src/provider-manifest.ts b/packages/protocol/src/provider-manifest.ts index b3e388faa..0e98efcb5 100644 --- a/packages/protocol/src/provider-manifest.ts +++ b/packages/protocol/src/provider-manifest.ts @@ -151,6 +151,13 @@ export const OMP_MODES: AgentProviderModeDefinition[] = [ colorTier: "dangerous", isUnattended: true, }, + { + id: "write", + label: "Write Approval", + description: "Launches OMP with write approval mode — reads are free, writes require approval.", + icon: "ShieldAlert", + colorTier: "moderate", + }, { id: "ask", label: "Always Ask", diff --git a/packages/server/src/server/agent/providers/omp/agent.test.ts b/packages/server/src/server/agent/providers/omp/agent.test.ts index d21ee0c0d..69b2d8ff3 100644 --- a/packages/server/src/server/agent/providers/omp/agent.test.ts +++ b/packages/server/src/server/agent/providers/omp/agent.test.ts @@ -74,6 +74,18 @@ describe("OMP agent client and session", () => { expect(omp.launchConfiguration().argv).toEqual(expect.arrayContaining(["--thinking", "max"])); }); + test("launches with write approval mode", async () => { + const omp = new OmpHarness(); + await omp.start({ modeId: "write" }); + + expect(omp.launchConfiguration()).toEqual({ + cwd: "/tmp/paseo-omp-agent-test", + protocolMode: "rpc-ui", + modeId: "write", + argv: ["omp", "--mode", "rpc-ui", "--approval-mode", "write", "--thinking", "medium"], + }); + }); + test("streams a prompt through completion", async () => { const omp = new OmpHarness(); await omp.start(); @@ -282,6 +294,7 @@ describe("OMP agent client and session", () => { await expect(omp.availableModes()).resolves.toEqual([ expect.objectContaining({ id: "full" }), + expect.objectContaining({ id: "write" }), expect.objectContaining({ id: "ask" }), ]); await expect(omp.commands()).resolves.toEqual( diff --git a/packages/server/src/server/agent/providers/omp/provider-config.ts b/packages/server/src/server/agent/providers/omp/provider-config.ts index 115ec8005..cd384f914 100644 --- a/packages/server/src/server/agent/providers/omp/provider-config.ts +++ b/packages/server/src/server/agent/providers/omp/provider-config.ts @@ -39,6 +39,11 @@ export function resolveOmpLaunchMode( switch (modeId ?? DEFAULT_OMP_MODE_ID) { case "full": return { modeId: "full", extraArgs: ["--approval-mode", "yolo", ...modelRoleArgs] }; + case "write": + return { + modeId: "write", + extraArgs: ["--approval-mode", "write", ...modelRoleArgs], + }; case "ask": return { modeId: "ask", diff --git a/packages/server/src/server/daemon-e2e/agent-configs.ts b/packages/server/src/server/daemon-e2e/agent-configs.ts index f728c1da7..720a62182 100644 --- a/packages/server/src/server/daemon-e2e/agent-configs.ts +++ b/packages/server/src/server/daemon-e2e/agent-configs.ts @@ -62,6 +62,7 @@ export const agentConfigs = { thinkingOptionId: "medium", modes: { full: "full", // launches omp with yolo approval mode + write: "write", // launches omp with write approval mode ask: "ask", // launches omp with always-ask approval mode }, },