From 051868c74cf45d2ba322d9991acc75fbf6c903fb Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Sun, 22 Mar 2026 15:45:47 +0700 Subject: [PATCH] fix(app): remove terminal padding and fetch catch-up timeline on mobile resume --- docs/PRODUCT.md | 74 +++++++++++++++++++ .../app/src/components/terminal-emulator.tsx | 6 +- packages/app/src/contexts/session-context.tsx | 21 +++++- 3 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 docs/PRODUCT.md diff --git a/docs/PRODUCT.md b/docs/PRODUCT.md new file mode 100644 index 000000000..eae9d40ce --- /dev/null +++ b/docs/PRODUCT.md @@ -0,0 +1,74 @@ +# Product + +What Paseo is, who it's for, and where it's going. + +## What is Paseo + +Paseo is a next-generation development environment built around agents. One interface to run, monitor, and interact with coding agents across desktop, mobile, terminal, and web. + +The development workflow is shifting from manually editing files to orchestrating agents that do the editing. Paseo is built for that workflow. + +## Core philosophy + +Freedom and flexibility. Every design decision follows from this: + +- **Multi-provider** — Use any coding agent harness. Pick the right model for each job, switch freely as the landscape shifts. No vendor-lock in. +- **Cross-device** — Desktop, mobile, web, CLI. Start work at your desk, check progress from your phone, script from the terminal. +- **Self-hosted** — The daemon runs on your machine. Your code, your keys, your environment. No inference markup, no cloud dependency. +- **Respectful** - No telemetry, no forced cloud, no forced accounts +- **Open source** — AGPL-3.0. Users can inspect, fork, and contribute. +- **BYOK** — Bring your own keys. Use your subsidized plans and first-party provider pricing. Paseo adds zero cost on top. + +## How it works + +### Projects and workspaces + +Projects are grouped in the sidebar, detected automatically from your filesystem and tagged by git remote when available. + +Each project opens as a workspace. For git projects, the default workspace is the main checkout. Users can create additional workspaces, which are isolated copies (git worktrees) where agents work without affecting main. + +### Inside a workspace + +A workspace is a flexible canvas: +- Launch multiple agents side by side in split panes +- Open terminals alongside agents +- Mix and match providers within the same workspace + +### The daemon + +Paseo is a client-server system. The daemon (Node.js) runs on your machine, manages agent processes, and streams output in real time over WebSocket. Clients connect to the daemon — locally or remotely. + +This architecture means: +- The daemon can run on any machine: laptop, VM, remote server +- Multiple clients can connect simultaneously +- Agents keep running when you close the app + +## Target user + +Anyone who builds software: + +- Care about owning their tools and their data +- Use multiple AI providers and want to switch freely +- Run agents on real tasks across real projects +- Want to work from multiple devices + +## What compounds over time + +- **Trust** — Showing up daily, shipping in public, being open source. Earned slowly, lost quickly. +- **Community contributions** — Code, packaging, skills, agent configs. Contributors become advocates. +- **Ecosystem** — Skills, integrations, shared configs. Community-built content that makes the platform more valuable. + +## Strategic bets + +1. **Models commoditize.** Value moves to the orchestration layer. The best model changes monthly — the workflow layer stays. +2. **Multi-provider wins.** No single provider stays on top. Developers want the best model for each task. +3. **The daemon as infrastructure.** Server/client architecture enables deployment anywhere. +4. **Open source outlasts funding.** Open source communities are resilient. Contributors become advocates. + +## Current state (March 2026) + +- Desktop (Electron), mobile (iOS/Android), web, CLI +- Providers: Claude Code (Agent SDK), Codex (app-server), OpenCode +- Daily releases +- Community contributions starting (packaging, bug fixes) +- Key UX: split panes, keybinding customization, workspace model diff --git a/packages/app/src/components/terminal-emulator.tsx b/packages/app/src/components/terminal-emulator.tsx index e82f45848..6ce999ed7 100644 --- a/packages/app/src/components/terminal-emulator.tsx +++ b/packages/app/src/components/terminal-emulator.tsx @@ -617,9 +617,9 @@ export default function TerminalEmulator({ height: "100%", overflow: "hidden", overscrollBehavior: "none", - paddingTop: 8, - paddingBottom: 8, - paddingLeft: 8, + paddingTop: 0, + paddingBottom: 0, + paddingLeft: 0, paddingRight: 0, }} /> diff --git a/packages/app/src/contexts/session-context.tsx b/packages/app/src/contexts/session-context.tsx index 86e711ce0..b9d139ec7 100644 --- a/packages/app/src/contexts/session-context.tsx +++ b/packages/app/src/contexts/session-context.tsx @@ -516,12 +516,31 @@ function SessionProviderInternal({ children, serverId, client }: SessionProvider const handleAppResumed = useCallback( (awayMs: number) => { scheduleAuthoritativeRevalidation(); + + if (Platform.OS !== "web") { + const session = useSessionStore.getState().sessions[serverId]; + const agentId = session?.focusedAgentId; + const cursor = agentId ? session?.agentTimelineCursor.get(agentId) : undefined; + if (agentId && cursor) { + void client + .fetchAgentTimeline(agentId, { + direction: "after", + cursor: { epoch: cursor.epoch, seq: cursor.endSeq }, + limit: 0, + projection: "canonical", + }) + .catch((error) => { + console.warn("[Session] failed to fetch catch-up timeline on resume", agentId, error); + }); + } + } + if (awayMs < HISTORY_STALE_AFTER_MS) { return; } bumpHistorySyncGeneration(serverId); }, - [bumpHistorySyncGeneration, scheduleAuthoritativeRevalidation, serverId], + [bumpHistorySyncGeneration, client, scheduleAuthoritativeRevalidation, serverId], ); // Client activity tracking (heartbeat, push token registration)