stablyai/orca · error · Error

Concrete Linear workspace ID is required

Error message

Concrete Linear workspace ID is required

What it means

Thrown by normalizeConcreteWorkspaceId when the Linear workspaceId is missing, blank, or the sentinel value 'all'. Some Linear IPC operations require a single concrete workspace because they query workspace-scoped resources (a specific project, custom view, or issue list) that cannot be resolved across all workspaces. The 'all' sentinel is valid for listing operations but not for single-resource fetches.

Source

Thrown at src/main/ipc/linear.ts:49

  LinearIssueUpdate,
  LinearWorkspaceSelection
} from '../../shared/types'

const VALID_FILTERS = new Set<LinearListFilter>(['assigned', 'created', 'all', 'completed'])

function normalizeWorkspaceId(value: unknown): string | undefined {
  return typeof value === 'string' && value.trim() ? value.trim() : undefined
}

function normalizeWorkspaceSelection(value: unknown): LinearWorkspaceSelection | undefined {
  const workspaceId = normalizeWorkspaceId(value)
  return workspaceId as LinearWorkspaceSelection | undefined
}

function normalizeConcreteWorkspaceId(value: unknown): string {
  const workspaceId = normalizeWorkspaceId(value)
  if (!workspaceId || workspaceId === 'all') {
    throw new Error('Concrete Linear workspace ID is required')
  }
  return workspaceId
}

function normalizeCustomViewModel(value: unknown): LinearCustomViewModel {
  if (value !== 'issue' && value !== 'project') {
    throw new Error('Custom view model is required')
  }
  return value
}

function normalizeIdList(value: unknown, fieldName: string): string[] | undefined {
  if (value === undefined) {
    return undefined
  }
  if (
    !Array.isArray(value) ||
    !value.every((id): id is string => typeof id === 'string' && Boolean(id.trim()))

View on GitHub (pinned to 1136503c6a)

Solutions

  1. Pass a specific Linear workspace UUID/string, not 'all' and not empty.
  2. In the UI, disable single-resource actions when the workspace picker is set to 'All workspaces', or auto-select the first workspace.
  3. Ensure the workspace selection state is threaded through to every IPC call site that needs a concrete ID.

Example fix

// before
await ipc.call('linear:getProject', { id, workspaceId: selectedWorkspace }) // selectedWorkspace === 'all'

// after
if (selectedWorkspace === 'all') throw new Error('Select a single workspace first')
await ipc.call('linear:getProject', { id, workspaceId: selectedWorkspace })
Defensive patterns

Strategy: type-guard

Validate before calling

if (typeof workspaceId !== 'string' || !workspaceId.trim() || workspaceId === 'all') {
  throw new Error('Select a single Linear workspace')
}

Type guard

function isConcreteWorkspaceId(value: unknown): value is string {
  return typeof value === 'string' && value.trim().length > 0 && value !== 'all'
}

Prevention

When it happens

Trigger: Calling a Linear IPC method that internally uses normalizeConcreteWorkspaceId (e.g. linear:getProject, linear:listProjectIssues, linear:getCustomView) without a workspaceId, with an empty string, or with the value 'all'. The renderer omits workspaceId assuming a default, or passes the multi-workspace 'all' selection from a workspace picker.

Common situations: User selected 'All workspaces' in the UI picker but invoked a single-resource action. workspaceId was not propagated from the parent component. A new Linear account with workspace selection state defaulting to 'all'.

Related errors


AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12). Data as JSON: /api/errors/dc1114ad4f0758bc. Report an issue: GitHub.