Skip to content

fix(opencode): expand Error properties in logs for better diagnostics#12809

Open
Haoping-Xiao wants to merge 1 commit intoanomalyco:devfrom
Haoping-Xiao:feat-logging
Open

fix(opencode): expand Error properties in logs for better diagnostics#12809
Haoping-Xiao wants to merge 1 commit intoanomalyco:devfrom
Haoping-Xiao:feat-logging

Conversation

@Haoping-Xiao
Copy link
Copy Markdown

@Haoping-Xiao Haoping-Xiao commented Feb 9, 2026

Fixes #12808

What

Error logs previously only printed e.message, losing structured context like providerID, modelID, url, statusCode, cause chain, and stack traces.

Changes

  • formatError in log.ts now expands all own properties of an Error via Object.getOwnPropertyNames, recursing into nested Errors (e.g. cause)
  • build calls formatError when a value is an instanceof Error, emitting each property as a separate key=value pair
  • Updated unhandledRejection/uncaughtException handlers in index.ts, worker.ts, thread.ts to pass the full error object instead of e.message
  • Updated MCP error logging to pass e instead of e.message
  • Fixed a copy-paste bug: fetchResourcesForClient logged "failed to get prompts" instead of "failed to get resources"

Backward compatible

Callers that still pass e.message (a string) work exactly as before. Only callers that pass an Error object get richer output.

Verification

  • bun run typecheck passes
  • Before: ERROR ... e=ProviderModelNotFoundError rejection
  • After: ERROR ... name=ProviderModelNotFoundError message=ProviderModelNotFoundError data={"providerID":"openai","modelID":"gpt-5-turbo"} stack=... rejection

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Feb 9, 2026

The following comment was made by an LLM, it may be inaccurate:

No duplicate PRs found

@Haoping-Xiao
Copy link
Copy Markdown
Author

with this fix:

before:

ERROR 2026-02-07T09:58:35 +30ms service=default e=Unable to connect. Is the computer able to access the url? rejection

after:

ERROR 2026-02-07T11:00:47 +1ms service=default e={"code":"ConnectionRefused","path":"https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep-14.1.1-x86_64-pc-windows-msvc.zip","errno":0} rejection

before:

ERROR 2026-02-07T08:42:43 +5ms service=default e=ProviderModelNotFoundError rejection

after:

ERROR 2026-02-09T08:30:56 +11ms service=default message=ProviderModelNotFoundError data={"providerID":"not-exist","modelID":"","suggestions":[]} name=ProviderModelNotFoundError originalLine=105031 originalColumn=46 line=1092 column=17 sourceURL=src/provider/provider.ts stack=ProviderModelNotFoundError: ProviderModelNotFoundError
at getModel (src/provider/provider.ts:1092:17)
at processTicksAndRejections (native:7:39) rejection

@Haoping-Xiao
Copy link
Copy Markdown
Author

@rekram1-node could you please help review this PR? I believe it will help reduce many unnecessary issues. Please let me know if you have any suggestions—I’ll be happy to contribute.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Unhandled error logs lack diagnostic details, making it hard for users to self-diagnose

1 participant