fix(workspace-state): stop resync loop on non-git folders and allow retry for degraded watcher
Gate git refresh on .git presence so file churn in non-git workspaces no longer produces endless resync_hint events, and silently log tree/git refresh errors during watch flushing instead of flagging requires_resync, which turned transient failures into self-reinforcing loops. Degrade gracefully when the filesystem watcher fails to attach (e.g. permission denied, inotify quota): keep the initial snapshot, surface a degraded flag, and expose a store-level restart that the banner uses to retry attachment after the root cause is fixed. Propagate is_git_repo through the snapshot so the git log and changes tabs render a dedicated "Not a Git repository" empty state instead of raw git stderr with a useless retry button. Stop polling get_git_branch from the title bar once it returns null and re-arm on visibility change. Add translations for the new banner, empty-state, and retry keys across all ten locales.
This commit is contained in:
@@ -46,6 +46,14 @@ export function extractAppCommandError(error: unknown): AppCommandError | null {
|
||||
}
|
||||
}
|
||||
|
||||
export function isNotAGitRepoError(error: unknown): boolean {
|
||||
const appError = extractAppCommandError(error)
|
||||
const candidates = [appError?.detail, appError?.message]
|
||||
return candidates.some(
|
||||
(text) => typeof text === "string" && /not a git repository/i.test(text)
|
||||
)
|
||||
}
|
||||
|
||||
export function toErrorMessage(error: unknown): string {
|
||||
const appError = extractAppCommandError(error)
|
||||
if (appError) {
|
||||
|
||||
@@ -897,6 +897,8 @@ export interface WorkspaceSnapshotResponse {
|
||||
tree_snapshot: FileTreeNode[] | null
|
||||
git_snapshot: WorkspaceGitEntry[] | null
|
||||
deltas: WorkspaceDeltaEnvelope[]
|
||||
degraded: boolean
|
||||
is_git_repo: boolean
|
||||
}
|
||||
|
||||
export interface GitLogResult {
|
||||
|
||||
Reference in New Issue
Block a user