different-ai/openwork · error

OpenWork server unavailable. Connect to remove skills.

Error message

OpenWork server unavailable. Connect to remove skills.

What it means

For skill removal on a remote workspace with no OpenWork server target or client, the store refuses: remote skills live on the server, so a local delete would silently fail to remove them. It throws directing the user to connect to the OpenWork server first.

Source

Thrown at apps/app/src/react-app/domains/settings/state/extensions-store.ts:700

    const isLocalWorkspace = options.workspaceType() === "local";
    const root = options.selectedWorkspaceRoot().trim();
    const { openworkSnapshot, openworkClient, openworkWorkspaceId, hasOpenworkTarget } =
      await resolveWorkspaceServerTarget();
    const canUseOpenworkServer =
      hasOpenworkTarget &&
      openworkSnapshot.openworkServerCapabilities?.skills?.write !== false;

    if (canUseOpenworkServer && openworkClient && openworkWorkspaceId) {
      await openworkClient.deleteSkill(openworkWorkspaceId, name);
      return;
    }

    if (hasOpenworkTarget) {
      throw new Error("OpenWork server cannot remove skills for this workspace.");
    }

    if (isRemoteWorkspace) {
      throw new Error("OpenWork server unavailable. Connect to remove skills.");
    }

    if (!isDesktopRuntime()) {
      throw new Error(t("skills.desktop_required"));
    }

    if (!isLocalWorkspace || !root) {
      throw new Error(t("skills.pick_workspace_first"));
    }

    const result = (await uninstallSkillCommand(root, name)) as { ok: boolean; stderr?: string; stdout?: string };
    if (!result.ok) {
      throw new Error(result.stderr || result.stdout || t("skills.uninstall_failed"));
    }
  };

  const slugifyConfigObjectName = (title: string, fallback: string) => {
    const slug = slugifyOpencodeSkillName(title || fallback);

View on GitHub (pinned to 2b7df46e8a)

Solutions

  1. Connect to the OpenWork server (sign in) and retry the skill removal.
  2. Check network/VPN connectivity to the server hosting the remote workspace.
  3. Verify the workspace's server configuration in .opencode/openwork.json is correct.
  4. If the server was decommissioned, re-point the workspace to the new server before managing skills.

Example fix

// before
if (isRemoteWorkspace) {
  throw new Error("OpenWork server unavailable. Connect to remove skills.");
}
// after
if (isRemoteWorkspace) {
  const connected = await promptServerConnection();
  if (!connected) throw new Error("OpenWork server unavailable. Connect to remove skills.");
  return removeSkill(name); // retry with server client available
}
Defensive patterns

Strategy: try-catch

Validate before calling

if (isRemoteWorkspace && !canUseOpenworkServer) {
  // prompt 'connect to server' before allowing any skill management
  return;
}

Try / catch

try {
  await removeSkill(name);
} catch (err) {
  if (err.message.includes("Connect to remove skills")) openServerConnectDialog();
  else throw err;
}

Prevention

When it happens

Trigger: Attempting to remove a skill while connected to a remote workspace where canUseOpenworkServer is false and hasOpenworkTarget is false — i.e. no usable server client for the remote workspace.

Common situations: Disconnected/signed-out session while browsing a remote workspace; server URL misconfigured; VPN/network down; workspace migrated and old target removed from config.

Related errors


AI-assisted analysis of different-ai/openwork@2b7df46e8a (2026-09-01). Data as JSON: /api/errors/45a4d8a2e5bbf515. Report an issue: GitHub.