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.

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.

Appendix: 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)