Commit Graph

3865 Commits

Author SHA1 Message Date
Mohamed Boudra
8338bb59d9 test(projects): assert legacy placement identity 2026-07-29 11:39:34 +00:00
Mohamed Boudra
8c89592bb3 fix(projects): preserve legacy placement identity 2026-07-29 11:28:32 +00:00
Mohamed Boudra
ad0939dfbb fix(projects): preserve conservative identity boundaries 2026-07-29 11:13:07 +00:00
Mohamed Boudra
7b9787a75d fix(projects): resolve legacy mutation aliases 2026-07-29 10:59:01 +00:00
Mohamed Boudra
7e43d90aa5 fix(projects): retain absolute scp users 2026-07-29 10:45:23 +00:00
Mohamed Boudra
1f467fa43e test(app): model persisted project keys 2026-07-29 10:36:06 +00:00
Mohamed Boudra
fef479e749 fix(projects): scope legacy paths to hosts 2026-07-29 10:20:55 +00:00
Mohamed Boudra
1ff152edcd fix(projects): retain archived reference errors 2026-07-29 10:09:43 +00:00
Mohamed Boudra
0060c88399 fix(projects): harden project reference identity 2026-07-29 09:55:37 +00:00
Mohamed Boudra
30a6122deb fix(projects): preserve project key compatibility
Resolve legacy workspace project references at the daemon boundary while keeping projectKey as the cross-host identity. Complete generic SSH normalization without collapsing distinct repositories.
2026-07-29 09:42:05 +00:00
Mohamed Boudra
5ae7ca7004 test(projects): assert host-scoped project keys 2026-07-29 09:26:18 +00:00
Mohamed Boudra
471a7431f2 fix(projects): prevent project key collisions
Preserve platform path semantics and generic remote transports in cross-host keys, and compare legacy checkout roots using filesystem equivalence before materializing ownership.
2026-07-29 09:16:01 +00:00
Mohamed Boudra
649592fe73 fix(projects): restore project key as grouping identity
Random host-local project IDs had replaced the persisted cross-host value carried by projectKey. Keep projectId for routing while reconciliation owns and persists projectKey for grouping.
2026-07-29 09:12:08 +00:00
Mohamed Boudra
39e5006882 fix(projects): harden grouping identity and routing 2026-07-29 07:40:36 +00:00
Mohamed Boudra
f054e403a6 fix(projects): preserve exact placement identity 2026-07-29 02:48:30 +00:00
Mohamed Boudra
3e66464b2e test(projects): expect framed settings route 2026-07-29 02:33:01 +00:00
Mohamed Boudra
8f2599d424 fix(projects): harden grouped project routing 2026-07-29 02:26:21 +00:00
Mohamed Boudra
1dc03e565f test(projects): use grouped identity in UI specs 2026-07-29 02:13:13 +00:00
Mohamed Boudra
8140d8508e fix(projects): separate identity from presentation 2026-07-29 01:40:55 +00:00
Mohamed Boudra
afbd527c8d fix(projects): preserve SSH URL path semantics 2026-07-29 01:20:04 +00:00
Mohamed Boudra
29d3b2f76c fix(projects): keep settings on routed host 2026-07-29 01:06:29 +00:00
Mohamed Boudra
a924d51e4c fix(projects): model SCP remote semantics 2026-07-29 00:59:35 +00:00
Mohamed Boudra
d853df73a4 fix(projects): preserve remote path semantics 2026-07-29 00:43:52 +00:00
Mohamed Boudra
a3188a7699 fix(projects): preserve host-scoped actions 2026-07-29 00:28:36 +00:00
Mohamed Boudra
f154531825 fix(projects): harden host and remote identity 2026-07-29 00:13:45 +00:00
Mohamed Boudra
e849518c76 fix(projects): normalize default remote ports 2026-07-29 00:02:16 +00:00
Mohamed Boudra
5928dc08d9 fix(projects): stabilize settings and path identity 2026-07-28 23:50:49 +00:00
Mohamed Boudra
26452a4f01 fix(projects): reconcile grouped custom names 2026-07-28 23:33:50 +00:00
Mohamed Boudra
34500f30cf fix(projects): preserve symlinked bootstrap roots 2026-07-28 23:23:39 +00:00
Mohamed Boudra
95ceb238ee fix(projects): isolate legacy host identity 2026-07-28 23:11:50 +00:00
Mohamed Boudra
6544ca7419 fix(projects): preserve selected project identity 2026-07-28 22:57:45 +00:00
Mohamed Boudra
ec08367d93 fix(projects): stabilize legacy subproject grouping 2026-07-28 22:40:04 +00:00
Mohamed Boudra
07bb8eeaa6 fix(projects): close grouped routing gaps 2026-07-28 22:30:45 +00:00
Mohamed Boudra
d3d59749b0 fix(projects): preserve selected host identity 2026-07-28 22:18:48 +00:00
Mohamed Boudra
8f89aee756 test(app): update project host shape contract 2026-07-28 22:05:24 +00:00
Mohamed Boudra
b7ee191245 fix(projects): strengthen grouping identity 2026-07-28 21:59:01 +00:00
Mohamed Boudra
b92d142fce fix(projects): preserve host-local project identity 2026-07-28 21:40:42 +00:00
Mohamed Boudra
9e86b13b1f fix(projects): keep ambiguous clones separate
A shared remote can identify a project across hosts, but it cannot distinguish two independent clones on one host. Treat those keys as ambiguous so host-local project IDs remain separate.
2026-07-28 21:21:29 +00:00
Mohamed Boudra
47e095270a fix(projects): restore cross-host grouping
Random host-local project IDs replaced the remote-derived value that had also served as grouping identity. Persist a separate opaque group key and let normal boot reconciliation backfill older records without a migration.
2026-07-28 21:19:07 +00:00
Jason@HND
f0d7eeb98c fix(quota): restore Grok Settings usage for current CLI auth/billing (#2353)
* fix(quota): restore Grok Settings usage for current CLI auth/billing

Grok CLI no longer stores a top-level access_token or usage.creditUsage.
Read nested auth key tokens and config.used.val so Settings → Usage
shows monthly credits again. Keep legacy shapes and env tokens working.

Fixes #2352

* fix(quota): make Grok auth-file tests work on Windows

Inject homeDir into GrokQuotaProvider like Kimi so nested
~/.grok/auth.json tests do not depend on os.homedir() which
ignores $HOME on Windows (USERPROFILE).
2026-07-28 18:49:21 +08:00
Mohamed Boudra
f91a984348 fix(claude): show a single 1M-context Opus 5 model (#2497) 2026-07-28 18:18:21 +08:00
Michael Wu
cbbf6c1684 Carry local files and shared state into new worktrees (#2419)
* feat(server): support symlink worktree includes

* refactor(server): simplify worktree include handling

* fix(server): constrain worktree include traversal

* fix(server): clean up failed worktree branches

* fix(server): skip missing worktree include entries

* fix(server): make worktree includes best effort

* fix(server): skip failed worktree includes

* fix(server): harden worktree include planning

* fix(server): preserve reused worktree result shape

Materialization reports describe one creation attempt, not durable worktree identity. Carry them beside the worktree so newly created and reused results keep the same stable shape.

* fix(server): harden worktree include boundaries

Replace directory snapshots exactly, keep canonical Git metadata protected, report recovery skips, and only roll back branches owned before worktree creation.

* fix(server): follow safe include aliases

Traverse canonical in-checkout directory links during glob planning and treat coded revalidation failures as per-entry skips.

* fix(server): make include preflight race safe

Create fetched checkout refs atomically, retain overlapping copy entries for independent fallback, and protect the full managed-worktree base.

* fix(server): preserve staged recovery state

Validate completed directory snapshots, retain backups after failed restoration, and derive atomic ref guards from the repository object ID width.

* fix(server): preserve partial include progress

Keep safe glob matches, enforce recursive-directory types, validate staged roots, and retain OID guards through rollback.

---------

Co-authored-by: Mohamed Boudra <boudra.moha@gmail.com>
2026-07-28 03:18:40 +02:00
Kamil
89c2fac3c6 Open project and workspace folders from the sidebar (#2491)
* feat(app): open project folder from project context menu (#2487)

* refactor(app): give file manager action a home

---------

Co-authored-by: Mohamed Boudra <boudra.moha@gmail.com>
2026-07-28 00:48:29 +02:00
Saravjeet 'Aman' Singh
f8dd0fc2e0 Switch projects from New Workspace with ⌘P/Ctrl+P (#2110)
* feat(app): add ⌘P shortcut to switch project on New Workspace screen

Opens the existing project picker with its search focused so the project
can be switched from the keyboard (type + Enter) instead of clicking the
badge and then the project.

Wires a new "workspace.project.pick" action through the standard keyboard
pipeline (binding -> route passthrough -> dispatcher), handled by a
screen-scoped handler on the New Workspace screen that is only registered
while the screen is mounted and there are projects to pick. Because
preventDefault only fires when a handler handles the key, ⌘P/Ctrl+P still
triggers native print everywhere else. Adds a Settings -> Shortcuts help
row (rebindable) and the "Switch project" label across all locales.

* test(app): cover project picker shortcut

---------

Co-authored-by: Mohamed Boudra <boudra.moha@gmail.com>
2026-07-28 00:32:41 +02:00
Dmitry Sinev
b55acfc60f fix(omp): accept nullable model context windows (#2406) 2026-07-28 00:28:30 +02:00
Derek Perez
5bd317205c fix(omp): expose injected Paseo tools directly (#2418) 2026-07-27 23:44:25 +02:00
维她命@
1c8fabd293 fix(server): discover Codex project skills from cwd (#2423) 2026-07-27 22:12:22 +02:00
Matt Cowger
717f195f0c fix(app): render HTML in PR comments (#2432) 2026-07-28 04:01:43 +08:00
Li Mu Zhi
869edcbf11 fix(forge): preserve non-default port in forge web URLs (#2478)
"Open in browser" links for a self-hosted forge served on a non-standard
port (e.g. Forgejo/Gitea on :60443) dropped the port, producing
https://host/owner/repo/... instead of https://host:60443/owner/repo/...,
which 404s or hits the wrong service.

parseGitRemoteLocation discarded parsed.port (GitRemoteLocation had no
port field), and buildForgeBranchTreeUrl / buildForgeBlobUrl rebuilt the
origin from the portless host. Preserve the port on GitRemoteLocation and
reattach it in the web-URL builders, only for self-hosted http(s) origins
(an SSH port isn't the web port; a canonicalized cloud host uses the
default port). Host-identity matching (forge detection, cloud-host checks)
stays port-agnostic.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-28 04:00:46 +08:00
Mohamed Boudra
fa1198c2be Stop completed turns from appearing stuck (#2484)
* fix(app): stop completed turns from appearing stuck

Turn activity was inferred from a user-message row flag, so a stale duplicate row could keep the working footer active after the turn ended. Track submission lifecycle separately and route every send path through the shared submission flow.

* fix(app): guard pending message identity

* test(app): measure submission layout independent of scroll

* fix(app): keep submitted messages consistent through reconnects

Track each in-flight send until its own RPC establishes acceptance, and keep canonical timeline placement authoritative. Restore legacy cached rewind IDs during cache deserialization.

* fix(app): close canonical submission races

* test(app): cover canonical submission races in browser

* fix(app): keep replacement submissions authoritative

Keep current pending rows out of legacy cache migration and leave ambiguous terminal lifecycle events to the daemon snapshot. This prevents fabricated rewind identities and stale completion events from marking replacement turns idle.

* fix(app): keep submitted messages stable across sync

Give submission transport and canonical timeline ingestion separate authority. Preserve every unresolved local send across replacement, reconcile provider identity once, and bridge RPC acceptance to authoritative running state without deriving lifecycle from timeline rows.

* fix(app): settle submissions in either acknowledgement order

Complete submission transactions when RPC and provider acknowledgement arrive in either order. Cache only transaction-owned local rows as transient data, preserve canonical ID-less prompts, and invalidate ambiguous legacy display caches instead of inventing provider identity.

* fix(app): keep agent visible during history handoff

Running and terminal updates could clear create continuity before the initial authoritative timeline arrived, leaving a streaming agent behind the loading screen. End the handoff only when authoritative history is applied.

* fix(app): settle attachment-only submissions

Canonical providers can acknowledge image-only prompts with empty text. Reconcile those events by client identity without rendering a blank canonical row.

* fix(agent): settle out-of-band message submissions

Accepted commands that do not allocate a foreground turn previously had no canonical user acknowledgement. Record the command before its handler runs so submission state and reconnect history converge through the normal timeline producer.

* fix(app): settle out-of-band submissions compatibly

* fix(app): preserve canonical prompt order

* test(app): keep workspace status check timing-independent

The workspace-status scenario asserted footer settlement before initial agent creation had necessarily completed. The dedicated draft-handoff coverage owns that lifecycle contract.
2026-07-27 21:27:10 +02:00