feat: workspace fence toggle (workspaceFence pref + one-click off in error surfaces)
- New persisted built-in pref workspaceFence (default true) under the files card's secondary settings modal; host reads it per request via the settings seam (fenceEnabledOf — absent/malformed stays ON). - ensureWorkspacePath/ensureWorkspaceWritePath gain a fence param: disarmed skips the containment assert but keeps realpath resolution; wired through fs.tree/fs.read/fs.write, the media + html routes, and the upload path (writeWorkspaceUpload fence input). - Editor load failures and file-tree level errors show the localized reason plus a one-click global off (FenceErrorNotice) that flips the pref, adopts it into the store, and auto-retries the failed operation (reloadSeq / retryDir) — the raw wire text is never shown. - GitView's two client-side pre-checks (hidden open action + no-op defense) respect the pref; store threaded through TreePanel/FileTree. - i18n: 4 new keys across all 21 dictionaries; tests: fence-off route coverage, prefs parsing, schema default, editor toggles list; docs: guide §8/§8.1 + plans/2026-08-29 design record.
This commit is contained in:
@@ -21,6 +21,22 @@ export class SidebarApiError extends Error {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether a wire failure is the workspace fence refusing a path outside the
|
||||
* session workspace (the host message reads `path "..." is outside
|
||||
* workspace`). The request-trust fence answers code `forbidden` with the
|
||||
* bare message 'forbidden', so the message fragment — not the code alone —
|
||||
* identifies this case.
|
||||
*/
|
||||
export function isOutsideWorkspaceError(error: unknown): boolean {
|
||||
return error instanceof SidebarApiError && isOutsideWorkspaceMessage(error.message)
|
||||
}
|
||||
|
||||
/** Message-level variant for surfaces that stored the raw text (file-tree level errors). */
|
||||
export function isOutsideWorkspaceMessage(message: string): boolean {
|
||||
return message.includes('outside workspace')
|
||||
}
|
||||
|
||||
/** Explorer row (host fs-tree shape). */
|
||||
export interface FsEntry {
|
||||
name: string
|
||||
|
||||
Reference in New Issue
Block a user