diff --git a/.gitignore b/.gitignore
index f2bf502..1be2f5c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -48,3 +48,8 @@ apps/web/dist/
# OS
.DS_Store
Thumbs.db
+
+# Local runtime state
+.atl/
+.pi/
+swap-pane
diff --git a/apps/web/src/components/app-shell.tsx b/apps/web/src/components/app-shell.tsx
index fd2a02f..8d88626 100644
--- a/apps/web/src/components/app-shell.tsx
+++ b/apps/web/src/components/app-shell.tsx
@@ -16,8 +16,11 @@ const NAV_ITEMS: { to: string; label: string; icon: IconName }[] = [
{ to: "/settings", label: "Settings", icon: "settings" }
];
+const ACTIVE_STATUSES = ["running", "building", "pending"];
+
const SessionItem = ({ session }: { session: Session }) => {
const isRunning = session.status === "running";
+ const displayName = session.display_name || session.tool_type_name || "Unnamed Session";
return (
{
target={session.url ? "_blank" : undefined}
rel={session.url ? "noopener noreferrer" : undefined}
className="nav-item session-item"
- title={`${session.display_name} (${session.status})`}
+ title={`${displayName} (${session.status})`}
>
- {session.display_name}
+ {displayName}
);
};
@@ -101,13 +104,15 @@ export const AppShell = () => {
);
})}
- {sessions.length > 0 && (
+ {sessions.filter((s) => ACTIVE_STATUSES.includes(s.status)).length > 0 && (
<>
Live sessions
- {sessions.map((session) => (
-
- ))}
+ {sessions
+ .filter((s) => ACTIVE_STATUSES.includes(s.status))
+ .map((session) => (
+
+ ))}
>
)}
diff --git a/apps/web/src/components/instance-list.tsx b/apps/web/src/components/instance-list.tsx
index d9ec05a..8079e20 100644
--- a/apps/web/src/components/instance-list.tsx
+++ b/apps/web/src/components/instance-list.tsx
@@ -194,7 +194,7 @@ export const InstanceList = ({ projectId, repoId, toolTypes }: InstanceListProps
{instances.map((instance) => (
-
{instance.display_name}
+
{instance.display_name || instance.tool_type_name || "Unnamed Instance"}
= ({
// Resize observer for container-level resize detection
let resizeTimeout: ReturnType | null = null;
- const resizeObserver = new ResizeObserver(() => {
+ let lastWidth = 0;
+ let lastHeight = 0;
+ const resizeObserver = new ResizeObserver((entries) => {
if (resizeTimeout) {
clearTimeout(resizeTimeout);
}
+ const entry = entries[0];
+ if (!entry) return;
+ const { width, height } = entry.contentRect;
resizeTimeout = setTimeout(() => {
resizeTimeout = null;
+ // Guard against internal xterm DOM changes that don't affect container size
+ if (
+ Math.abs(width - lastWidth) < 1 &&
+ Math.abs(height - lastHeight) < 1
+ ) {
+ return;
+ }
+ lastWidth = width;
+ lastHeight = height;
const prevCols = term.cols;
const prevRows = term.rows;
fitAddon.fit();
diff --git a/apps/web/src/pages/sessions.tsx b/apps/web/src/pages/sessions.tsx
index a548d19..72b8e41 100644
--- a/apps/web/src/pages/sessions.tsx
+++ b/apps/web/src/pages/sessions.tsx
@@ -266,7 +266,7 @@ export const SessionsPage = () => {
Last Session
-
{lastSession.display_name}
+
{lastSession.display_name || lastSession.tool_type_name || "Unnamed Session"}
{lastSession.tool_type_name} · {lastSession.project_name} · {lastSession.repository_name}
@@ -316,7 +316,7 @@ export const SessionsPage = () => {
{activeSessions.map((session) => (
-
{session.display_name}
+
{session.display_name || session.tool_type_name || "Unnamed Session"}
{session.tool_type_name} · {session.project_name}
@@ -445,7 +445,7 @@ export const SessionsPage = () => {
{recentSessions.map((session) => (
- {session.display_name}
+ {session.display_name || session.tool_type_name || "Unnamed Session"}
{session.tool_type_name} · {session.project_name}
diff --git a/apps/web/src/styles.css b/apps/web/src/styles.css
index a03aaf4..b2ba341 100644
--- a/apps/web/src/styles.css
+++ b/apps/web/src/styles.css
@@ -2748,11 +2748,6 @@ a.nav-item,
.terminal-container {
flex: 1;
min-height: 0;
- padding: 0.25rem;
-}
-
-.terminal-container .xterm {
- height: 100%;
}
.terminal-container .xterm-viewport {