{"record":{"id":"45a4d8a2e5bbf515","repo":"different-ai/openwork","slug":"openwork-server-unavailable-connect-to-remove-ski","errorCode":null,"errorMessage":"OpenWork server unavailable. Connect to remove skills.","messagePattern":"OpenWork server unavailable\\. Connect to remove skills\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"apps/app/src/react-app/domains/settings/state/extensions-store.ts","lineNumber":700,"sourceCode":"    const isLocalWorkspace = options.workspaceType() === \"local\";\n    const root = options.selectedWorkspaceRoot().trim();\n    const { openworkSnapshot, openworkClient, openworkWorkspaceId, hasOpenworkTarget } =\n      await resolveWorkspaceServerTarget();\n    const canUseOpenworkServer =\n      hasOpenworkTarget &&\n      openworkSnapshot.openworkServerCapabilities?.skills?.write !== false;\n\n    if (canUseOpenworkServer && openworkClient && openworkWorkspaceId) {\n      await openworkClient.deleteSkill(openworkWorkspaceId, name);\n      return;\n    }\n\n    if (hasOpenworkTarget) {\n      throw new Error(\"OpenWork server cannot remove skills for this workspace.\");\n    }\n\n    if (isRemoteWorkspace) {\n      throw new Error(\"OpenWork server unavailable. Connect to remove skills.\");\n    }\n\n    if (!isDesktopRuntime()) {\n      throw new Error(t(\"skills.desktop_required\"));\n    }\n\n    if (!isLocalWorkspace || !root) {\n      throw new Error(t(\"skills.pick_workspace_first\"));\n    }\n\n    const result = (await uninstallSkillCommand(root, name)) as { ok: boolean; stderr?: string; stdout?: string };\n    if (!result.ok) {\n      throw new Error(result.stderr || result.stdout || t(\"skills.uninstall_failed\"));\n    }\n  };\n\n  const slugifyConfigObjectName = (title: string, fallback: string) => {\n    const slug = slugifyOpencodeSkillName(title || fallback);","sourceCodeStart":682,"sourceCodeEnd":718,"githubUrl":"https://github.com/different-ai/openwork/blob/2b7df46e8ae1517d64c896c7793d2d52ec845669/apps/app/src/react-app/domains/settings/state/extensions-store.ts#L682-L718","documentation":"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.","triggerScenarios":"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.","commonSituations":"Disconnected/signed-out session while browsing a remote workspace; server URL misconfigured; VPN/network down; workspace migrated and old target removed from config.","solutions":["Connect to the OpenWork server (sign in) and retry the skill removal.","Check network/VPN connectivity to the server hosting the remote workspace.","Verify the workspace's server configuration in .opencode/openwork.json is correct.","If the server was decommissioned, re-point the workspace to the new server before managing skills."],"exampleFix":"// before\nif (isRemoteWorkspace) {\n  throw new Error(\"OpenWork server unavailable. Connect to remove skills.\");\n}\n// after\nif (isRemoteWorkspace) {\n  const connected = await promptServerConnection();\n  if (!connected) throw new Error(\"OpenWork server unavailable. Connect to remove skills.\");\n  return removeSkill(name); // retry with server client available\n}","handlingStrategy":"try-catch","validationCode":"if (isRemoteWorkspace && !canUseOpenworkServer) {\n  // prompt 'connect to server' before allowing any skill management\n  return;\n}","typeGuard":null,"tryCatchPattern":"try {\n  await removeSkill(name);\n} catch (err) {\n  if (err.message.includes(\"Connect to remove skills\")) openServerConnectDialog();\n  else throw err;\n}","preventionTips":["Require an active server connection before showing remote skill lists with delete affordances","Verify the workspace's openwork.json target configuration on workspace open","Detect offline state and disable destructive remote actions with an explanatory tooltip"],"tags":["skills","remote-workspace","server-connection","network"],"backgroundTag":"server-unavailable","analyzedSha":"2b7df46e8ae1517d64c896c7793d2d52ec845669","analyzedAt":"2026-09-01T07:59:23.713Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}