Commit Graph

2531 Commits

Author SHA1 Message Date
Mohamed Boudra
4d6a154f6e Fix Unistyles theme splits 2026-04-18 15:06:42 +07:00
Mohamed Boudra
5c3cc99d8c refactor(app): restructure settings with modular section navigation 2026-04-18 14:21:40 +07:00
github-actions[bot]
63a46acaf1 fix: update lockfile signatures and Nix hash 2026-04-17 11:34:00 +00:00
Mohamed Boudra
aac780ddf7 Merge remote-tracking branch 'origin/main' into dev
# Conflicts:
#	nix/package.nix
2026-04-17 16:16:04 +07:00
Mohamed Boudra
49d5426059 fix(app): swap github icon for external link on hover in checks row 2026-04-17 15:54:40 +07:00
Mohamed Boudra
d6585f7c3a fix(server): harden worktree archive with parallel teardown
Fan out agent close + terminal kill concurrently with Promise.allSettled
so one failure never leaves the worktree half-dead. Await real PTY exit
with SIGHUP→SIGKILL escalation before rm to avoid EBUSY races. Tolerate
missing repoRoot and retry directory removal with backoff. Purge stale
client workspace layout/tab state after successful archive.
2026-04-17 15:50:48 +07:00
Mohamed Boudra
ed2dc08443 fix(app): hide attachment remove X until hover on desktop
Keep the button visible on native and compact breakpoints so touch users
can still remove attachments without hover.
2026-04-17 15:46:58 +07:00
Mohamed Boudra
4b82ca77c8 fix(server): route list_provider_models through the snapshot manager
The legacy list_provider_models_request handler was calling
providerRegistry[p].fetchModels() directly, so every client call spawned
the provider fresh (e.g. repeated copilot ENOENT errors). Old clients
still send this RPC.

Route it through ProviderSnapshotManager so simultaneous calls dedupe
through the in-flight warmUps map, cached entries (ready / error /
unavailable) are served without spawning, and at most one spawn occurs
per cwd per TTL window regardless of client count. Direct-fetch path
kept only as a fallback for the null-manager case (tests).
2026-04-17 15:20:09 +07:00
Mohamed Boudra
07d10f55f9 fix(app): stop spawning providers per client by warming the snapshot store
The workspace screen was prefetching per-provider model lists via
`useProviderModels`, which fanned out N parallel
`list_provider_models_request`s that bypassed `ProviderSnapshotManager`
and spawned each provider fresh on every call (e.g. repeated copilot
ENOENT errors). The return value was never consumed.

Replace it with `useProvidersSnapshot(serverId, workspaceDirectory)` so
warmup goes through the shared, deduped, TTL-cached snapshot path that
consumers already read from.
2026-04-17 15:05:28 +07:00
Mohamed Boudra
13bfdd8cc1 fix(app): land on agent tab after creating a workspace
Workspace creation landed on the setup tab because openTab implicitly
focused the tab it opened, and the setup auto-open effect ran after
the setup dialog's navigation, stomping on the agent tab's focus.

Split the store API into explicit openTabFocused and openTabInBackground
so every caller declares intent. The setup auto-open effect now opens in
background and no longer steals focus; user-intent call sites (sidebar,
kebab menus, file explorer, terminal creation, prepareWorkspaceTab)
use openTabFocused and drop the redundant paired focusTab call.
2026-04-17 14:45:22 +07:00
Mohamed Boudra
9a8b01a738 fix(app): unstick iOS image picker and land reusable Maestro primitives
On iOS, tapping "+" → "Add image" in the Composer left an invisible
backdrop trapping touches after the native photo picker dismissed. Root
cause: the dropdown menu's onSelect fired while the RN Modal was still
completing UIKit dismissal, so PHPicker presented over a dismissing
Modal that never cleanly released.

DropdownMenu now defers the selected item's onSelect until Modal
onDismiss (UIKit-level completion) plus a short buffer on iOS, then
invokes it. Same DropdownMenu instance — no per-call opt-in.

Along the way, the Maestro repro surfaced a controlled-TextInput
character-drop race: fast inputText on a controlled input drops
characters mid-type. Direct-host and pair-link inputs are now
ref-backed uncontrolled inputs with stable testIDs.

New reusable E2E primitives under packages/app/maestro/:
- flows/land-in-chat.yaml — clearState + direct connect to
  127.0.0.1:6767, lands in the composer. Compose on this for any
  composer-level fixture.
- image-picker-repro.yaml — regression for the zombie-backdrop bug.

docs/MOBILE_TESTING.md gains the patterns: reach-the-composer via
land-in-chat, uncontrolled inputs for Maestro-typed fields, and the
dropdown → native-presenter dismissal timing on iOS.

Existing relay-pairing and relay-then-direct fixtures updated to use
stable testIDs instead of ambiguous text / point-based taps.
2026-04-17 14:07:15 +07:00
Mohamed Boudra
adf2f5921f fix(app): unblock host index redirect on native by dropping window.location read
`window` exists on React Native (aliased to `global`) but `window.location` is
undefined, so reading `window.location.pathname` threw and killed the redirect
effect — leaving the host index route stuck rendering null (blank screen).
Use the `pathname` from `usePathname()` directly, restoring the pre-refactor
behavior that worked on both web and native.
2026-04-17 11:42:35 +07:00
Mohamed Boudra
3838a8b969 feat(app): unify composer attachments with pill + lightbox redesign
Images and GitHub issues/PRs now live in one draft-store list (ComposerAttachment union) with cwd persisted on the draft. Paperclip becomes a + drop-up menu; queue button removed. Each pill uses a shared AttachmentPill wrapper with a corner-X that mirrors the auto-update toast spec. Pill body opens the attachment: GitHub via openExternalUrl, images via a new fullscreen AttachmentLightbox. GitHub picker auto-closes on select.
2026-04-17 11:36:08 +07:00
Mohamed Boudra
11524dc349 fix(server): make paseo worktree archive idempotent after partial teardown
If a first archive attempt removed git's admin dir but failed to clean the
working tree (e.g. due to file churn during setup), retrying the archive
failed the ownership gate with "Worktree is not a Paseo-owned worktree"
because isPaseoOwnedWorktreeCwd required the worktree to still appear in
git worktree list.

- isPaseoOwnedWorktreeCwd now decides ownership by path shape
  ($PASEO_HOME/worktrees/<hash>/<slug>[/...]) and treats git as
  best-effort for resolving repoRoot.
- deletePaseoWorktree tolerates a missing admin dir: it skips teardown
  when the tree is absent, swallows a failing git worktree remove so
  the rmSync fallback always runs, and follows up with git worktree
  prune to clear stale admin refs.
- Relabel the post-creation setup failure log as
  "Background worktree setup failed" since the worktree itself already
  exists at that point.
2026-04-16 23:05:41 +07:00
Mohamed Boudra
a001c72726 fix(server): expand ~ in file-explorer scoped paths
Assistant markdown images with ~-prefixed paths hit ENOENT because
path.resolve doesn't expand ~, leaving paths like
workspaceRoot/~/rest-of-path that never resolve. Reuse the existing
resolvePathFromBase helper so tilde paths inside the workspace load
instead of getting stuck on the image spinner; the sandbox check still
rejects tilde paths that resolve outside the workspace.
2026-04-16 22:43:07 +07:00
github-actions[bot]
8344296789 fix: update lockfile signatures and Nix hash 2026-04-16 15:12:47 +00:00
Mohamed Boudra
40f8a8414a chore(release): cut 0.1.59 v0.1.59 2026-04-16 22:10:49 +07:00
Mohamed Boudra
9386901896 docs: add 0.1.59 changelog entry for Opus 4.7 2026-04-16 21:58:00 +07:00
Mohamed Boudra
6390f8d995 Merge branch 'main' of github.com:getpaseo/paseo into dev 2026-04-16 21:53:12 +07:00
Mohamed Boudra
daefa8fb7f feat(server): add Opus 4.7 to claude provider with xhigh effort
Adds claude-opus-4-7 and claude-opus-4-7[1m] alongside the existing 4.6
entries (4.6 stays default). Opus 4.7 introduces a new "xhigh" effort
level between high and max; the option only surfaces on 4.7 models.

The SDK 0.2.71 effort union doesn't yet include xhigh, so the value is
cast at the assignment site.
2026-04-16 21:52:40 +07:00
Mohamed Boudra
981b94fa56 fix(app): balance composer right-side button spacing
Tightens transparent icon gaps to 4px and gives filled action buttons
(send, interrupt) a 4px left margin so they sit 8px from neighbors.
Shrinks context-window meter SVG from 20 to 16 to match the visual
weight of surrounding icons.
2026-04-16 20:30:16 +07:00
Mohamed Boudra
827092a246 fix(app): avoid infinite render loop in FilePanel zustand selector
The selector returned a freshly constructed authority object each call, so
useSyncExternalStore saw a new reference every render and force-rerendered,
producing a maximum update depth crash. Select the specific workspace
descriptor (stable reference) and derive the authority via useMemo.
2026-04-16 20:18:56 +07:00
Mohamed Boudra
213767e3d5 Merge remote-tracking branch 'origin/dev' into dev 2026-04-16 19:51:18 +07:00
Mohamed Boudra
6ffffc38a0 fix(app): update route test expectations for b64_ workspace ID prefix
The opaque-workspace-identifier refactor (e6044264) added a `b64_` prefix
to base64-encoded workspace IDs in route builders. Two app tests still
expected the unprefixed form and failed in CI.
2026-04-16 19:51:00 +07:00
github-actions[bot]
270c12d524 fix: update lockfile signatures and Nix hash 2026-04-16 12:49:20 +00:00
Mohamed Boudra
53ed34bacf Merge remote-tracking branch 'origin/dev' into dev
# Conflicts:
#	nix/package.nix
2026-04-16 19:48:03 +07:00
Mohamed Boudra
e6bf64aed8 fix(server): drop stale snapshot mutation ownership assertions
Session.unarchiveAgentState(id) and the direct agentManager.unarchiveSnapshotByHandle
delegation were removed when main's 86bb5cc8 + a11c246b refactors moved unarchive
through the shared mcp-shared helper. Remove the now-dead test assertions so the
suite reflects the real ownership boundary.
2026-04-16 19:46:20 +07:00
Mohamed Boudra
a5582e0ee0 Merge remote-tracking branch 'origin/main' into dev
# Conflicts:
#	packages/server/src/server/session.ts
2026-04-16 19:37:29 +07:00
github-actions[bot]
754f1facb6 fix: update lockfile signatures and Nix hash 2026-04-16 12:18:57 +00:00
Mohamed Boudra
727aa0cdac chore(release): cut 0.1.58 v0.1.58 2026-04-16 19:17:37 +07:00
Mohamed Boudra
a387eaf26a docs: trim 0.1.58 changelog and add scannable-bullets guidance
Split the OpenCode reliability bullet into four per-PR entries, shorten
the Windows and provider-models bullets, and drop low-signal qualifiers.
Add a "Changelog conciseness" section to the release playbook so the
next agent knows bullets must be scannable in one glance.
2026-04-16 19:16:42 +07:00
Mohamed Boudra
a11c246bdc fix(server): share send-prompt path between MCP and Session
Extract `unarchiveAgentState` and `sendPromptToAgent` into `mcp-shared`
so every surface (app/WS, MCP, CLI-through-MCP) runs the same sequence:
unarchive → ensureAgentLoaded → optional mode change → recordUserMessage
→ startAgentRun. MCP `send_agent_prompt` previously skipped unarchive and
cold-agent rehydration, so sending to an archived agent over MCP left it
hidden from `paseo ls` and failed entirely when the agent wasn't already
in memory. Session now delegates to the shared function and its private
`unarchiveAgentState` is gone.
2026-04-16 18:58:31 +07:00
Mohamed Boudra
2e95003154 fix(server): include stderr in claude auth status diagnostic
Some status output (e.g. "Not logged in") goes to stderr. Capture both
stdout and stderr, including when the command exits non-zero, so the
diagnostic surfaces the full picture.
2026-04-16 18:54:56 +07:00
Mohamed Boudra
1b4483615a fix(server): surface raw claude auth status in diagnostic
Return stdout verbatim instead of parsing JSON fields. Parser was fragile
to upstream schema changes and added no value — users can read the raw
output directly.
2026-04-16 18:52:28 +07:00
Mohamed Boudra
4d0fe57a7a fix(server): stop detecting Windows PowerShell shims 2026-04-16 18:36:06 +07:00
Mohamed Boudra
84db0cecd7 docs: expand Windows entry and rename header to 0.1.58 2026-04-16 18:29:41 +07:00
Mohamed Boudra
14ac6984f3 fix(server): extend refresh_providers_snapshot timeout to 60s
Provider snapshot refresh was timing out at 5s for providers that need
longer to enumerate models/auth. Bump to 60s.
2026-04-16 18:29:40 +07:00
Mohamed Boudra
b6147e39ab feat(server): show Claude auth status in provider diagnostic
Runs `claude auth status` and surfaces the parsed result (auth method,
subscription, email/org) in the Claude Code provider diagnostic panel.
2026-04-16 18:29:38 +07:00
Mohamed Boudra
a2b743a6d3 fix(server): emit valid MCP list_agents payloads
Explicit `undefined` keys on optional snapshot fields were converted
to `null` by `ensureValidJson`, failing `AgentSnapshotPayloadSchema`
validation on the wire. Stop writing those keys so they remain absent,
which is what `.optional()` expects.

Also adds a test that parses `list_agents` output through the schema
to catch this class of bug.
2026-04-16 18:29:34 +07:00
Mohamed Boudra
7442323ca2 fix(server): preserve JSON args for Windows PowerShell shims 2026-04-16 18:04:17 +07:00
Mohamed Boudra
086b3098b1 fix(server): support Windows PowerShell shims in shared launcher 2026-04-16 17:58:12 +07:00
Mohamed Boudra
e0f82e7ad0 test(server): reproduce Windows ps1 shim launch gap 2026-04-16 17:52:44 +07:00
Mohamed Boudra
9cee1d8196 fix(server): restore .cmd shell routing for Windows EINVAL 2026-04-16 17:05:08 +07:00
Mohamed Boudra
c2a8e56d33 test(server): reproduce Windows EINVAL for .cmd shim with shell:false 2026-04-16 17:00:01 +07:00
Mohamed Boudra
de33dfd034 fix(server): share Windows launch handling across providers 2026-04-16 16:44:24 +07:00
Mohamed Boudra
917c2f56f4 test(server): reproduce Windows spawn EINVAL with cmd shim + spaces + JSON args 2026-04-16 16:37:17 +07:00
github-actions[bot]
a3822ca299 fix: update lockfile signatures and Nix hash 2026-04-16 09:17:53 +00:00
Mohamed Boudra
41fd45588f chore(release): cut 0.1.57 v0.1.57 2026-04-16 16:16:30 +07:00
Mohamed Boudra
54b8126deb docs: add 0.1.57 changelog 2026-04-16 16:15:38 +07:00
github-actions[bot]
e70fa2dc84 fix: update lockfile signatures and Nix hash 2026-04-16 08:53:56 +00:00