feat(opencode): enhance TUI Thread Init & RPC error handling #7737
+60
−8
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
What does this PR do?
Closes #7693
When starting the TUI,
thread.tscreates a worker and calls client.call("subscribe", { directory: cwd }). This triggersrpc.subscribein the worker, which calls Instance.provide() → InstanceBootstrap() → Plugin.init() → Config.get() → Config.state() → loadAgent().If loadAgent() throws an error due to a bad markdown:
Previously: Rpc.listen had no try/catch, so the error became an unhandled rejection caught only by the worker's process.on("uncaughtException"). No response was ever sent back. The client's promise from client.call() was never resolved or rejected, so it hung forever.
With PR: Rpc.listen catches the error, serializes it, and sends an rpc.error message back. The client receives this, rejects the promise, and the error propagates up to the catch block in index.ts where FormatError() displays it to the user.
How did you verify your code works?
Tested it with an agent MD file similar to the one the user had an error with in #7693 just adding an invalid trailing comma. Now the error is logged and the TUI is exited, rather than hanging previously. Ideally this should fix any other error that gets thrown on startup.