diff --git a/codersdk/toolsdk/bash.go b/codersdk/toolsdk/bash.go index 0df5f69aa71c9..e45ca6a49e29a 100644 --- a/codersdk/toolsdk/bash.go +++ b/codersdk/toolsdk/bash.go @@ -79,13 +79,12 @@ Examples: } // Wait for agent to be ready - err = cliui.Agent(ctx, nil, workspaceAgent.ID, cliui.AgentOptions{ + if err := cliui.Agent(ctx, io.Discard, workspaceAgent.ID, cliui.AgentOptions{ FetchInterval: 0, Fetch: deps.coderClient.WorkspaceAgent, FetchLogs: deps.coderClient.WorkspaceAgentLogsAfter, Wait: true, // Always wait for startup scripts - }) - if err != nil { + }); err != nil { return WorkspaceBashResult{}, xerrors.Errorf("agent not ready: %w", err) } diff --git a/codersdk/toolsdk/toolsdk.go b/codersdk/toolsdk/toolsdk.go index 6ef310f510369..670b5af145786 100644 --- a/codersdk/toolsdk/toolsdk.go +++ b/codersdk/toolsdk/toolsdk.go @@ -6,12 +6,14 @@ import ( "context" "encoding/json" "io" + "runtime/debug" "github.com/google/uuid" "golang.org/x/xerrors" "github.com/coder/aisdk-go" + "github.com/coder/coder/v2/buildinfo" "github.com/coder/coder/v2/codersdk" ) @@ -122,7 +124,14 @@ func WithRecover(h GenericHandlerFunc) GenericHandlerFunc { return func(ctx context.Context, deps Deps, args json.RawMessage) (ret json.RawMessage, err error) { defer func() { if r := recover(); r != nil { - err = xerrors.Errorf("tool handler panic: %v", r) + if buildinfo.IsDev() { + // Capture stack trace in dev builds + stack := debug.Stack() + err = xerrors.Errorf("tool handler panic: %v\nstack trace:\n%s", r, stack) + } else { + // Simple error message in production builds + err = xerrors.Errorf("tool handler panic: %v", r) + } } }() return h(ctx, deps, args)