diff --git a/packages/web/src/app/globals.css b/packages/web/src/app/globals.css
index 38a300e88..8bb4b4016 100644
--- a/packages/web/src/app/globals.css
+++ b/packages/web/src/app/globals.css
@@ -5817,7 +5817,8 @@ html.light .xterm .xterm-viewport:hover::-webkit-scrollbar-thumb:active {
/* -- Kanban board: stack columns vertically -- */
.kanban-board {
- grid-template-columns: minmax(0, 1fr);
+ display: flex;
+ flex-direction: column;
height: auto;
min-height: auto;
overflow-x: visible;
diff --git a/packages/web/src/app/manifest.test.ts b/packages/web/src/app/manifest.test.ts
index bd6e7e62f..de9f09808 100644
--- a/packages/web/src/app/manifest.test.ts
+++ b/packages/web/src/app/manifest.test.ts
@@ -12,13 +12,17 @@ describe("app manifest", () => {
name: "ao | Agent Orchestrator",
short_name: "ao",
start_url: "/",
+ scope: "/",
display: "standalone",
+ orientation: "portrait-primary",
background_color: "#121110",
theme_color: "#121110",
icons: [
{ src: "/apple-icon", sizes: "180x180", type: "image/png" },
{ src: "/icon-192", sizes: "192x192", type: "image/png", purpose: "any" },
+ { src: "/icon-192", sizes: "192x192", type: "image/png", purpose: "maskable" },
{ src: "/icon-512", sizes: "512x512", type: "image/png", purpose: "any" },
+ { src: "/icon-512", sizes: "512x512", type: "image/png", purpose: "maskable" },
],
});
});
diff --git a/packages/web/src/app/manifest.ts b/packages/web/src/app/manifest.ts
index 6977692da..2138c2d92 100644
--- a/packages/web/src/app/manifest.ts
+++ b/packages/web/src/app/manifest.ts
@@ -8,13 +8,17 @@ export default function manifest(): MetadataRoute.Manifest {
short_name: "ao",
description: "Dashboard for managing parallel AI coding agents",
start_url: "/",
+ scope: "/",
display: "standalone",
+ orientation: "portrait-primary",
background_color: "#121110",
theme_color: "#121110",
icons: [
{ src: "/apple-icon", sizes: "180x180", type: "image/png" },
{ src: "/icon-192", sizes: "192x192", type: "image/png", purpose: "any" },
+ { src: "/icon-192", sizes: "192x192", type: "image/png", purpose: "maskable" },
{ src: "/icon-512", sizes: "512x512", type: "image/png", purpose: "any" },
+ { src: "/icon-512", sizes: "512x512", type: "image/png", purpose: "maskable" },
],
};
}
diff --git a/packages/web/src/components/Dashboard.tsx b/packages/web/src/components/Dashboard.tsx
index f9dd25245..2e5a3eade 100644
--- a/packages/web/src/components/Dashboard.tsx
+++ b/packages/web/src/components/Dashboard.tsx
@@ -25,6 +25,7 @@ import { ConnectionBar } from "./ConnectionBar";
import { CopyDebugBundleButton } from "./CopyDebugBundleButton";
import { SidebarContext } from "./workspace/SidebarContext";
import { projectDashboardPath, projectSessionPath } from "@/lib/routes";
+import { BottomSheet } from "./BottomSheet";
interface DashboardProps {
initialSessions: DashboardSession[];
@@ -121,7 +122,7 @@ function DoneCard({
) : null}
{formatRelativeTimeCompact(session.lastActivityAt)}
- {canRestore ? (
+ {canRestore && !isMerged ? (