{"record":{"id":"0d23e19182bd1dd9","repo":"different-ai/openwork","slug":"message","errorCode":null,"errorMessage":"${message}","messagePattern":"\\$\\{message\\}","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"apps/app/src/react-app/domains/settings/state/extensions-store.ts","lineNumber":1536,"sourceCode":"\n    if (root !== skillsRoot) skillsLoaded = false;\n    if (!optionsOverride?.force && skillsLoaded) return;\n    if (refreshSkillsInFlight) return;\n\n    refreshSkillsInFlight = true;\n    refreshSkillsAborted = false;\n    try {\n      setStateField(\"skillsStatus\", null);\n      const rawClient = client as unknown as { _client?: { get: (input: { url: string }) => Promise<unknown> } };\n      if (!rawClient._client) throw new Error(\"OpenCode client unavailable.\");\n      const result = await rawClient._client.get({ url: \"/skill\" }) as {\n        data?: Array<{ name: string; description: string; location: string }>;\n        error?: unknown;\n      };\n      if (result?.data === undefined) {\n        const err = result?.error;\n        const message = err instanceof Error ? err.message : typeof err === \"string\" ? err : t(\"skills.failed_to_load\");\n        throw new Error(message);\n      }\n      if (refreshSkillsAborted) return;\n      const next: SkillCard[] = Array.isArray(result.data)\n        ? result.data.map((entry) => ({\n            name: entry.name,\n            description: entry.description,\n            path: formatSkillPath(entry.location),\n          }))\n        : [];\n      mutateState((current) => ({\n        ...current,\n        skills: next,\n        skillsStatus: next.length ? null : t(\"skills.no_skills_found\"),\n        skillsContextKey: getWorkspaceContextKey(),\n      }));\n      skillsLoaded = true;\n      skillsRoot = root;\n    } catch (error) {","sourceCodeStart":1518,"sourceCodeEnd":1554,"githubUrl":"https://github.com/different-ai/openwork/blob/2b7df46e8ae1517d64c896c7793d2d52ec845669/apps/app/src/react-app/domains/settings/state/extensions-store.ts#L1518-L1554","documentation":"After the raw /skill request, refreshSkills checks result.data; when data is undefined it takes the error from the response payload and rethrows it as an Error. The message is the server/transport error text, or the localized 'failed to load skills' fallback when the payload error is neither an Error nor a string.","triggerScenarios":"The _client.get({url:'/skill'}) call resolves (does not reject) with an object whose data is undefined — e.g. the HTTP response carries { error: ... } from a failing OpenCode server, or error is absent/null so the localized skills.failed_to_load message is thrown.","commonSituations":"OpenCode server returning an error page/JSON for /skill (server restarting, permission problem); a proxy or cache returning non-standard payloads; SDK wrapping network failures into resolved {error} responses.","solutions":["Check OpenCode server health/logs for why GET /skill returned an error and fix the server-side cause.","Inspect the thrown message: if it is the generic 'failed to load' fallback, log the raw result.error to recover the real cause.","Retry the refresh — transient server restarts commonly produce this; refreshSkills already clears skillsStatus on entry so a re-run is safe.","Verify auth/workspace state: some servers reject /skill when the session is invalid; re-authenticate."],"exampleFix":"// before\nawait store.refreshSkills({ force: true });\n// after\ntry {\n  await store.refreshSkills({ force: true });\n} catch (e) {\n  logger.warn('skills refresh failed', e); // message here is result.error text or fallback\n  scheduleRetry(() => store.refreshSkills({ force: true }));\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":"function hasSkillData(r: unknown): r is { data: Array<{ name: string; description: string; location: string }> } {\n  return !!r && typeof r === \"object\" && Array.isArray((r as { data?: unknown }).data);\n}","tryCatchPattern":"try {\n  await store.refreshSkills({ force: true });\n} catch (e) {\n  const msg = e instanceof Error ? e.message : 'failed to load skills';\n  logger.warn('GET /skill failed:', msg); // keep raw result.error for diagnosis\n  setSkillsError(msg);\n}","preventionTips":["Log the raw response error, not just the thrown message","Retry transient /skill failures with backoff","Monitor OpenCode server health","Check auth/session state when /skill errors repeatedly"],"tags":["network","skills","error-propagation"],"backgroundTag":"request-failed","analyzedSha":"2b7df46e8ae1517d64c896c7793d2d52ec845669","analyzedAt":"2026-09-01T07:59:23.713Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}