From 3de7d63ea9223a03bf62ae23b517b106e92abddb Mon Sep 17 00:00:00 2001
From: dotta
Date: Fri, 20 Mar 2026 06:27:52 -0500
Subject: [PATCH 1/6] fix: use standard toggle component for permission
controls
Replace the button ("Enabled"/"Disabled") for "Can create new agents" and
the custom oversized switch for "Can assign tasks" with the same toggle
style (h-5 w-9, bg-green-600/bg-muted) used throughout Run Policy.
Co-Authored-By: Paperclip
---
ui/src/pages/AgentDetail.tsx | 31 +++++++++++++++++++------------
1 file changed, 19 insertions(+), 12 deletions(-)
diff --git a/ui/src/pages/AgentDetail.tsx b/ui/src/pages/AgentDetail.tsx
index 3e238e5e..37ac5cf5 100644
--- a/ui/src/pages/AgentDetail.tsx
+++ b/ui/src/pages/AgentDetail.tsx
@@ -1434,10 +1434,14 @@ function ConfigurationTab({
Lets this agent create or hire agents and implicitly assign tasks.
+
+ Waiting for {devServer.activeRunCount} live run{devServer.activeRunCount === 1 ? "" : "s"} to finish
+
+ ) : devServer.autoRestartEnabled ? (
+
+
+ Auto-restart will trigger when the instance is idle
+
+ ) : (
+
+
+ Restart `pnpm dev:once` after the active work is safe to interrupt
+
+ )}
+
+
+
+ );
+}
diff --git a/ui/src/components/Layout.tsx b/ui/src/components/Layout.tsx
index 8bae6920..8761b71c 100644
--- a/ui/src/components/Layout.tsx
+++ b/ui/src/components/Layout.tsx
@@ -15,6 +15,7 @@ import { NewAgentDialog } from "./NewAgentDialog";
import { ToastViewport } from "./ToastViewport";
import { MobileBottomNav } from "./MobileBottomNav";
import { WorktreeBanner } from "./WorktreeBanner";
+import { DevRestartBanner } from "./DevRestartBanner";
import { useDialog } from "../context/DialogContext";
import { usePanel } from "../context/PanelContext";
import { useCompany } from "../context/CompanyContext";
@@ -78,6 +79,11 @@ export function Layout() {
queryKey: queryKeys.health,
queryFn: () => healthApi.get(),
retry: false,
+ refetchInterval: (query) => {
+ const data = query.state.data as { devServer?: { enabled?: boolean } } | undefined;
+ return data?.devServer?.enabled ? 2000 : false;
+ },
+ refetchIntervalInBackground: true,
});
useEffect(() => {
@@ -266,6 +272,7 @@ export function Layout() {
Skip to Main Content
+
{isMobile && sidebarOpen && (
);
}
From 0f4a5716eac5f6de9082fc23d6b1682c351ee3a9 Mon Sep 17 00:00:00 2001
From: dotta
Date: Fri, 20 Mar 2026 08:49:46 -0500
Subject: [PATCH 5/6] docs: clarify quickstart npx usage
---
docs/start/quickstart.md | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/docs/start/quickstart.md b/docs/start/quickstart.md
index 9488b3c7..1ad30fcd 100644
--- a/docs/start/quickstart.md
+++ b/docs/start/quickstart.md
@@ -13,9 +13,19 @@ npx paperclipai onboard --yes
This walks you through setup, configures your environment, and gets Paperclip running.
+To start Paperclip again later:
+
+```sh
+npx paperclipai run
+```
+
+> **Note:** If you used `npx` for setup, always use `npx paperclipai` to run commands. The `pnpm paperclipai` form only works inside a cloned copy of the Paperclip repository (see Local Development below).
+
## Local Development
-Prerequisites: Node.js 20+ and pnpm 9+.
+For contributors working on Paperclip itself. Prerequisites: Node.js 20+ and pnpm 9+.
+
+Clone the repository, then:
```sh
pnpm install
@@ -26,7 +36,7 @@ This starts the API server and UI at [http://localhost:3100](http://localhost:31
No external database required — Paperclip uses an embedded PostgreSQL instance by default.
-## One-Command Bootstrap
+When working from the cloned repo, you can also use:
```sh
pnpm paperclipai run
From 360a7fc17b3c2d286769c57ab0494efc4b28f0dc Mon Sep 17 00:00:00 2001
From: dotta
Date: Fri, 20 Mar 2026 13:18:29 -0500
Subject: [PATCH 6/6] fix: address greptile follow-up feedback
---
scripts/dev-runner.mjs | 13 ++++++++++---
ui/src/components/DevRestartBanner.tsx | 2 +-
ui/src/pages/InstanceExperimentalSettings.tsx | 2 +-
ui/src/pages/InstanceGeneralSettings.tsx | 4 +++-
4 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/scripts/dev-runner.mjs b/scripts/dev-runner.mjs
index 3df034e0..a0910430 100644
--- a/scripts/dev-runner.mjs
+++ b/scripts/dev-runner.mjs
@@ -488,19 +488,26 @@ async function maybeAutoRestartChild() {
if (mode !== "dev" || restartInFlight || !child) return;
if (dirtyPaths.size === 0 && pendingMigrations.length === 0) return;
+ restartInFlight = true;
let health;
try {
health = await getDevHealthPayload();
} catch {
+ restartInFlight = false;
return;
}
const devServer = health?.devServer;
- if (!devServer?.enabled || devServer.autoRestartEnabled !== true) return;
- if ((devServer.activeRunCount ?? 0) > 0) return;
+ if (!devServer?.enabled || devServer.autoRestartEnabled !== true) {
+ restartInFlight = false;
+ return;
+ }
+ if ((devServer.activeRunCount ?? 0) > 0) {
+ restartInFlight = false;
+ return;
+ }
try {
- restartInFlight = true;
await maybePreflightMigrations({
autoApply: true,
interactive: false,
diff --git a/ui/src/components/DevRestartBanner.tsx b/ui/src/components/DevRestartBanner.tsx
index 5f8ba8a0..2ff666d9 100644
--- a/ui/src/components/DevRestartBanner.tsx
+++ b/ui/src/components/DevRestartBanner.tsx
@@ -79,7 +79,7 @@ export function DevRestartBanner({ devServer }: { devServer?: DevServerHealthSta
) : (
- Restart `pnpm dev:once` after the active work is safe to interrupt
+ Restart pnpm dev:once after the active work is safe to interrupt
)}
diff --git a/ui/src/pages/InstanceExperimentalSettings.tsx b/ui/src/pages/InstanceExperimentalSettings.tsx
index 236d4544..07728a63 100644
--- a/ui/src/pages/InstanceExperimentalSettings.tsx
+++ b/ui/src/pages/InstanceExperimentalSettings.tsx
@@ -76,7 +76,7 @@ export function InstanceExperimentalSettings() {
-
Enabled Isolated Workspaces
+
Enable Isolated Workspaces
Show execution workspace controls in project configuration and allow isolated workspace behavior for new
and existing issue runs.
diff --git a/ui/src/pages/InstanceGeneralSettings.tsx b/ui/src/pages/InstanceGeneralSettings.tsx
index 9720c98f..4f0d1cae 100644
--- a/ui/src/pages/InstanceGeneralSettings.tsx
+++ b/ui/src/pages/InstanceGeneralSettings.tsx
@@ -74,7 +74,9 @@ export function InstanceGeneralSettings() {
Censor username in logs
- Hide the username segment in home-directory paths and similar log output. This is off by default.
+ Hide the username segment in home-directory paths and similar operator-visible log output. Standalone
+ username mentions outside of paths are not yet masked in the live transcript view. This is off by
+ default.